Skip to content

Commit 6567954

Browse files
brglnsekhar
authored andcommitted
ARM: davinci: cp-intc: use the new-style config structure
Modify the cp-intc driver to take all its configuration from the new config structure. Stop referencing davinci_soc_info in any way. Move the declaration for davinci_cp_intc_init() to irq-davinci-cp-intc.h and make it take the new config structure as parameter. Convert all users to the new version. Also: since the two da8xx SoCs default all irq priorities to 7, just drop the priority configuration at all and hardcode the channels to 7. It will simplify the driver code and make our lives easier when it comes to device-tree support. Reviewed-by: David Lechner <david@lechnology.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
1 parent 3b5d1c5 commit 6567954

File tree

5 files changed

+50
-56
lines changed

5 files changed

+50
-56
lines changed

arch/arm/mach-davinci/cp_intc.c

Lines changed: 46 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
#include <linux/init.h>
1414
#include <linux/irq.h>
1515
#include <linux/irqchip.h>
16+
#include <linux/irqchip/irq-davinci-cp-intc.h>
1617
#include <linux/irqdomain.h>
1718
#include <linux/io.h>
1819
#include <linux/of.h>
1920
#include <linux/of_address.h>
2021
#include <linux/of_irq.h>
2122

2223
#include <asm/exception.h>
23-
#include <mach/common.h>
2424

2525
#define DAVINCI_CP_INTC_CTRL 0x04
2626
#define DAVINCI_CP_INTC_HOST_CTRL 0x0c
@@ -158,22 +158,15 @@ static const struct irq_domain_ops davinci_cp_intc_irq_domain_ops = {
158158
.xlate = irq_domain_xlate_onetwocell,
159159
};
160160

161-
static int __init davinci_cp_intc_of_init(struct device_node *node,
162-
struct device_node *parent)
161+
static int __init
162+
davinci_cp_intc_do_init(const struct davinci_cp_intc_config *config,
163+
struct device_node *node)
163164
{
164-
u32 num_irq = davinci_soc_info.intc_irq_num;
165-
u8 *irq_prio = davinci_soc_info.intc_irq_prios;
166-
unsigned num_reg = BITS_TO_LONGS(num_irq);
167-
int i, irq_base;
168-
169-
if (node) {
170-
davinci_cp_intc_base = of_iomap(node, 0);
171-
if (of_property_read_u32(node, "ti,intc-size", &num_irq))
172-
pr_warn("unable to get intc-size, default to %d\n",
173-
num_irq);
174-
} else {
175-
davinci_cp_intc_base = ioremap(davinci_soc_info.intc_base, SZ_8K);
176-
}
165+
unsigned int num_regs = BITS_TO_LONGS(config->num_irqs);
166+
int offset, irq_base;
167+
168+
davinci_cp_intc_base = ioremap(config->reg.start,
169+
resource_size(&config->reg));
177170
if (WARN_ON(!davinci_cp_intc_base))
178171
return -EINVAL;
179172

@@ -183,59 +176,37 @@ static int __init davinci_cp_intc_of_init(struct device_node *node,
183176
davinci_cp_intc_write(0, DAVINCI_CP_INTC_HOST_ENABLE(0));
184177

185178
/* Disable system interrupts */
186-
for (i = 0; i < num_reg; i++)
187-
davinci_cp_intc_write(~0, DAVINCI_CP_INTC_SYS_ENABLE_CLR(i));
179+
for (offset = 0; offset < num_regs; offset++)
180+
davinci_cp_intc_write(~0,
181+
DAVINCI_CP_INTC_SYS_ENABLE_CLR(offset));
188182

189183
/* Set to normal mode, no nesting, no priority hold */
190184
davinci_cp_intc_write(0, DAVINCI_CP_INTC_CTRL);
191185
davinci_cp_intc_write(0, DAVINCI_CP_INTC_HOST_CTRL);
192186

193187
/* Clear system interrupt status */
194-
for (i = 0; i < num_reg; i++)
195-
davinci_cp_intc_write(~0, DAVINCI_CP_INTC_SYS_STAT_CLR(i));
188+
for (offset = 0; offset < num_regs; offset++)
189+
davinci_cp_intc_write(~0,
190+
DAVINCI_CP_INTC_SYS_STAT_CLR(offset));
196191

197192
/* Enable nIRQ (what about nFIQ?) */
198193
davinci_cp_intc_write(1, DAVINCI_CP_INTC_HOST_ENABLE_IDX_SET);
199194

200-
/*
201-
* Priority is determined by host channel: lower channel number has
202-
* higher priority i.e. channel 0 has highest priority and channel 31
203-
* had the lowest priority.
204-
*/
205-
num_reg = (num_irq + 3) >> 2; /* 4 channels per register */
206-
if (irq_prio) {
207-
unsigned j, k;
208-
u32 val;
209-
210-
for (k = i = 0; i < num_reg; i++) {
211-
for (val = j = 0; j < 4; j++, k++) {
212-
val >>= 8;
213-
if (k < num_irq)
214-
val |= irq_prio[k] << 24;
215-
}
216-
217-
davinci_cp_intc_write(val, DAVINCI_CP_INTC_CHAN_MAP(i));
218-
}
219-
} else {
220-
/*
221-
* Default everything to channel 15 if priority not specified.
222-
* Note that channel 0-1 are mapped to nFIQ and channels 2-31
223-
* are mapped to nIRQ.
224-
*/
225-
for (i = 0; i < num_reg; i++)
226-
davinci_cp_intc_write(0x0f0f0f0f,
227-
DAVINCI_CP_INTC_CHAN_MAP(i));
228-
}
195+
/* Default all priorities to channel 7. */
196+
num_regs = (config->num_irqs + 3) >> 2; /* 4 channels per register */
197+
for (offset = 0; offset < num_regs; offset++)
198+
davinci_cp_intc_write(0x07070707,
199+
DAVINCI_CP_INTC_CHAN_MAP(offset));
229200

230-
irq_base = irq_alloc_descs(-1, 0, num_irq, 0);
201+
irq_base = irq_alloc_descs(-1, 0, config->num_irqs, 0);
231202
if (irq_base < 0) {
232203
pr_warn("Couldn't allocate IRQ numbers\n");
233204
irq_base = 0;
234205
}
235206

236207
/* create a legacy host */
237208
davinci_cp_intc_irq_domain = irq_domain_add_legacy(
238-
node, num_irq, irq_base, 0,
209+
node, config->num_irqs, irq_base, 0,
239210
&davinci_cp_intc_irq_domain_ops, NULL);
240211

241212
if (!davinci_cp_intc_irq_domain) {
@@ -251,9 +222,31 @@ static int __init davinci_cp_intc_of_init(struct device_node *node,
251222
return 0;
252223
}
253224

254-
void __init davinci_cp_intc_init(void)
225+
int __init davinci_cp_intc_init(const struct davinci_cp_intc_config *config)
255226
{
256-
davinci_cp_intc_of_init(NULL, NULL);
227+
return davinci_cp_intc_do_init(config, NULL);
257228
}
258229

230+
static int __init davinci_cp_intc_of_init(struct device_node *node,
231+
struct device_node *parent)
232+
{
233+
struct davinci_cp_intc_config config = { };
234+
int ret;
235+
236+
ret = of_address_to_resource(node, 0, &config.reg);
237+
if (ret) {
238+
pr_err("%s: unable to get the register range from device-tree\n",
239+
__func__);
240+
return ret;
241+
}
242+
243+
ret = of_property_read_u32(node, "ti,intc-size", &config.num_irqs);
244+
if (ret) {
245+
pr_err("%s: unable to read the 'ti,intc-size' property\n",
246+
__func__);
247+
return ret;
248+
}
249+
250+
return davinci_cp_intc_do_init(&config, node);
251+
}
259252
IRQCHIP_DECLARE(cp_intc, "ti,cp-intc", davinci_cp_intc_of_init);

arch/arm/mach-davinci/da830.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ static const struct davinci_cp_intc_config da830_cp_intc_config = {
833833

834834
void __init da830_init_irq(void)
835835
{
836-
davinci_cp_intc_init();
836+
davinci_cp_intc_init(&da830_cp_intc_config);
837837
}
838838

839839
void __init da830_init_time(void)

arch/arm/mach-davinci/da850.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ static const struct davinci_cp_intc_config da850_cp_intc_config = {
771771

772772
void __init da850_init_irq(void)
773773
{
774-
davinci_cp_intc_init();
774+
davinci_cp_intc_init(&da850_cp_intc_config);
775775
}
776776

777777
void __init da850_init_time(void)

arch/arm/mach-davinci/include/mach/common.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#define DAVINCI_INTC_START NR_IRQS
2323
#define DAVINCI_INTC_IRQ(_irqnum) (DAVINCI_INTC_START + (_irqnum))
2424

25-
void davinci_cp_intc_init(void);
2625
void davinci_timer_init(struct clk *clk);
2726

2827
struct davinci_timer_instance {

include/linux/irqchip/irq-davinci-cp-intc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ struct davinci_cp_intc_config {
2020
unsigned int num_irqs;
2121
};
2222

23+
int davinci_cp_intc_init(const struct davinci_cp_intc_config *config);
24+
2325
#endif /* _LINUX_IRQ_DAVINCI_CP_INTC_ */

0 commit comments

Comments
 (0)