Skip to content

Commit 99c221d

Browse files
Magnus DammKAGA-KOKO
authored andcommitted
irqchip/renesas-irqc: Move over to nested generic chip
Convert the IRQC driver to rely on GENERIC_IRQ_CHIP and set IRQ_GC_INIT_NESTED_LOCK to enable nested locking. Signed-off-by: Magnus Damm <damm+renesas@opensource.se> Cc: jason@lakedaemon.net Cc: geert+renesas@glider.be Cc: horms@verge.net.au Cc: Magnus Damm <magnus.damm@gmail.com> Link: http://lkml.kernel.org/r/20150928094237.32552.83434.sendpatchset@little-apple Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1 parent e7dbe2d commit 99c221d

File tree

2 files changed

+31
-56
lines changed

2 files changed

+31
-56
lines changed

drivers/irqchip/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ config RENESAS_INTC_IRQPIN
123123

124124
config RENESAS_IRQC
125125
bool
126+
select GENERIC_IRQ_CHIP
126127
select IRQ_DOMAIN
127128

128129
config ST_IRQCHIP

drivers/irqchip/irq-renesas-irqc.c

Lines changed: 30 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,20 @@ struct irqc_priv {
6262
struct irqc_irq irq[IRQC_IRQ_MAX];
6363
unsigned int number_of_irqs;
6464
struct platform_device *pdev;
65-
struct irq_chip irq_chip;
65+
struct irq_chip_generic *gc;
6666
struct irq_domain *irq_domain;
6767
struct clk *clk;
6868
};
6969

70-
static void irqc_dbg(struct irqc_irq *i, char *str)
71-
{
72-
dev_dbg(&i->p->pdev->dev, "%s (%d:%d)\n",
73-
str, i->requested_irq, i->hw_irq);
74-
}
75-
76-
static void irqc_irq_enable(struct irq_data *d)
70+
static struct irqc_priv *irq_data_to_priv(struct irq_data *data)
7771
{
78-
struct irqc_priv *p = irq_data_get_irq_chip_data(d);
79-
int hw_irq = irqd_to_hwirq(d);
80-
81-
irqc_dbg(&p->irq[hw_irq], "enable");
82-
iowrite32(BIT(hw_irq), p->cpu_int_base + IRQC_EN_SET);
72+
return data->domain->host_data;
8373
}
8474

85-
static void irqc_irq_disable(struct irq_data *d)
75+
static void irqc_dbg(struct irqc_irq *i, char *str)
8676
{
87-
struct irqc_priv *p = irq_data_get_irq_chip_data(d);
88-
int hw_irq = irqd_to_hwirq(d);
89-
90-
irqc_dbg(&p->irq[hw_irq], "disable");
91-
iowrite32(BIT(hw_irq), p->cpu_int_base + IRQC_EN_STS);
77+
dev_dbg(&i->p->pdev->dev, "%s (%d:%d)\n",
78+
str, i->requested_irq, i->hw_irq);
9279
}
9380

9481
static unsigned char irqc_sense[IRQ_TYPE_SENSE_MASK + 1] = {
@@ -101,7 +88,7 @@ static unsigned char irqc_sense[IRQ_TYPE_SENSE_MASK + 1] = {
10188

10289
static int irqc_irq_set_type(struct irq_data *d, unsigned int type)
10390
{
104-
struct irqc_priv *p = irq_data_get_irq_chip_data(d);
91+
struct irqc_priv *p = irq_data_to_priv(d);
10592
int hw_irq = irqd_to_hwirq(d);
10693
unsigned char value = irqc_sense[type & IRQ_TYPE_SENSE_MASK];
10794
u32 tmp;
@@ -120,7 +107,7 @@ static int irqc_irq_set_type(struct irq_data *d, unsigned int type)
120107

121108
static int irqc_irq_set_wake(struct irq_data *d, unsigned int on)
122109
{
123-
struct irqc_priv *p = irq_data_get_irq_chip_data(d);
110+
struct irqc_priv *p = irq_data_to_priv(d);
124111
int hw_irq = irqd_to_hwirq(d);
125112

126113
irq_set_irq_wake(p->irq[hw_irq].requested_irq, on);
@@ -153,35 +140,11 @@ static irqreturn_t irqc_irq_handler(int irq, void *dev_id)
153140
return IRQ_NONE;
154141
}
155142

156-
/*
157-
* This lock class tells lockdep that IRQC irqs are in a different
158-
* category than their parents, so it won't report false recursion.
159-
*/
160-
static struct lock_class_key irqc_irq_lock_class;
161-
162-
static int irqc_irq_domain_map(struct irq_domain *h, unsigned int virq,
163-
irq_hw_number_t hw)
164-
{
165-
struct irqc_priv *p = h->host_data;
166-
167-
irqc_dbg(&p->irq[hw], "map");
168-
irq_set_chip_data(virq, h->host_data);
169-
irq_set_lockdep_class(virq, &irqc_irq_lock_class);
170-
irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq);
171-
return 0;
172-
}
173-
174-
static const struct irq_domain_ops irqc_irq_domain_ops = {
175-
.map = irqc_irq_domain_map,
176-
.xlate = irq_domain_xlate_twocell,
177-
};
178-
179143
static int irqc_probe(struct platform_device *pdev)
180144
{
181145
struct irqc_priv *p;
182146
struct resource *io;
183147
struct resource *irq;
184-
struct irq_chip *irq_chip;
185148
const char *name = dev_name(&pdev->dev);
186149
int ret;
187150
int k;
@@ -241,40 +204,51 @@ static int irqc_probe(struct platform_device *pdev)
241204

242205
p->cpu_int_base = p->iomem + IRQC_INT_CPU_BASE(0); /* SYS-SPI */
243206

244-
irq_chip = &p->irq_chip;
245-
irq_chip->name = name;
246-
irq_chip->irq_mask = irqc_irq_disable;
247-
irq_chip->irq_unmask = irqc_irq_enable;
248-
irq_chip->irq_set_type = irqc_irq_set_type;
249-
irq_chip->irq_set_wake = irqc_irq_set_wake;
250-
irq_chip->flags = IRQCHIP_MASK_ON_SUSPEND;
251-
252207
p->irq_domain = irq_domain_add_linear(pdev->dev.of_node,
253208
p->number_of_irqs,
254-
&irqc_irq_domain_ops, p);
209+
&irq_generic_chip_ops, p);
255210
if (!p->irq_domain) {
256211
ret = -ENXIO;
257212
dev_err(&pdev->dev, "cannot initialize irq domain\n");
258213
goto err2;
259214
}
260215

216+
ret = irq_alloc_domain_generic_chips(p->irq_domain, p->number_of_irqs,
217+
1, name, handle_level_irq,
218+
0, 0, IRQ_GC_INIT_NESTED_LOCK);
219+
if (ret) {
220+
dev_err(&pdev->dev, "cannot allocate generic chip\n");
221+
goto err3;
222+
}
223+
224+
p->gc = irq_get_domain_generic_chip(p->irq_domain, 0);
225+
p->gc->reg_base = p->cpu_int_base;
226+
p->gc->chip_types[0].regs.enable = IRQC_EN_SET;
227+
p->gc->chip_types[0].regs.disable = IRQC_EN_STS;
228+
p->gc->chip_types[0].chip.irq_mask = irq_gc_mask_disable_reg;
229+
p->gc->chip_types[0].chip.irq_unmask = irq_gc_unmask_enable_reg;
230+
p->gc->chip_types[0].chip.irq_set_type = irqc_irq_set_type;
231+
p->gc->chip_types[0].chip.irq_set_wake = irqc_irq_set_wake;
232+
p->gc->chip_types[0].chip.flags = IRQCHIP_MASK_ON_SUSPEND;
233+
261234
/* request interrupts one by one */
262235
for (k = 0; k < p->number_of_irqs; k++) {
263236
if (request_irq(p->irq[k].requested_irq, irqc_irq_handler,
264237
0, name, &p->irq[k])) {
265238
dev_err(&pdev->dev, "failed to request IRQ\n");
266239
ret = -ENOENT;
267-
goto err3;
240+
goto err4;
268241
}
269242
}
270243

271244
dev_info(&pdev->dev, "driving %d irqs\n", p->number_of_irqs);
272245

273246
return 0;
274-
err3:
247+
err4:
275248
while (--k >= 0)
276249
free_irq(p->irq[k].requested_irq, &p->irq[k]);
277250

251+
err3:
278252
irq_domain_remove(p->irq_domain);
279253
err2:
280254
iounmap(p->iomem);

0 commit comments

Comments
 (0)