Skip to content

Commit b5cf3fd

Browse files
KeerthyjLinus Walleij
authored andcommitted
gpio: davinci: Redesign driver to accommodate ngpios in one gpio chip
The Davinci GPIO driver is implemented to work with one monolithic Davinci GPIO platform device which may have up to Y(144) gpios. The Davinci GPIO driver instantiates number of GPIO chips with max 32 gpio pins per each during initialization and one IRQ domain. So, the current GPIO's opjects structure is: <platform device> Davinci GPIO controller |- <gpio0_chip0> ------| ... |--- irq_domain (hwirq [0..143]) |- <gpio0_chipN> ------| Current driver creates one chip for every 32 GPIOs in a controller. This was a limitation earlier now there is no need for that. Hence redesigning the driver to create one gpio chip for all the ngpio in the controller. |- <gpio0_chip0> ------|--- irq_domain (hwirq [0..143]). The previous discussion on this can be found here: https://www.spinics.net/lists/linux-omap/msg132869.html Signed-off-by: Keerthy <j-keerthy@ti.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
1 parent 53d333a commit b5cf3fd

File tree

2 files changed

+83
-56
lines changed

2 files changed

+83
-56
lines changed

drivers/gpio/gpio-davinci.c

Lines changed: 73 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,13 @@ static inline int __davinci_direction(struct gpio_chip *chip,
6363
unsigned offset, bool out, int value)
6464
{
6565
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
66-
struct davinci_gpio_regs __iomem *g = d->regs;
66+
struct davinci_gpio_regs __iomem *g;
6767
unsigned long flags;
6868
u32 temp;
69-
u32 mask = 1 << offset;
69+
int bank = offset / 32;
70+
u32 mask = __gpio_mask(offset);
7071

72+
g = d->regs[bank];
7173
spin_lock_irqsave(&d->lock, flags);
7274
temp = readl_relaxed(&g->dir);
7375
if (out) {
@@ -103,9 +105,12 @@ davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
103105
static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
104106
{
105107
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
106-
struct davinci_gpio_regs __iomem *g = d->regs;
108+
struct davinci_gpio_regs __iomem *g;
109+
int bank = offset / 32;
107110

108-
return !!((1 << offset) & readl_relaxed(&g->in_data));
111+
g = d->regs[bank];
112+
113+
return !!(__gpio_mask(offset) & readl_relaxed(&g->in_data));
109114
}
110115

111116
/*
@@ -115,9 +120,13 @@ static void
115120
davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
116121
{
117122
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
118-
struct davinci_gpio_regs __iomem *g = d->regs;
123+
struct davinci_gpio_regs __iomem *g;
124+
int bank = offset / 32;
119125

120-
writel_relaxed((1 << offset), value ? &g->set_data : &g->clr_data);
126+
g = d->regs[bank];
127+
128+
writel_relaxed(__gpio_mask(offset),
129+
value ? &g->set_data : &g->clr_data);
121130
}
122131

123132
static struct davinci_gpio_platform_data *
@@ -165,7 +174,7 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
165174
if (gpiospec->args[0] > pdata->ngpio)
166175
return -EINVAL;
167176

168-
if (gc != &chips[gpiospec->args[0] / 32].chip)
177+
if (gc != &chips->chip)
169178
return -EINVAL;
170179

171180
if (flags)
@@ -177,11 +186,11 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
177186

178187
static int davinci_gpio_probe(struct platform_device *pdev)
179188
{
180-
int i, base;
189+
static int ctrl_num;
190+
int gpio, bank;
181191
unsigned ngpio, nbank;
182192
struct davinci_gpio_controller *chips;
183193
struct davinci_gpio_platform_data *pdata;
184-
struct davinci_gpio_regs __iomem *regs;
185194
struct device *dev = &pdev->dev;
186195
struct resource *res;
187196
char label[MAX_LABEL_SIZE];
@@ -220,38 +229,30 @@ static int davinci_gpio_probe(struct platform_device *pdev)
220229
if (IS_ERR(gpio_base))
221230
return PTR_ERR(gpio_base);
222231

223-
for (i = 0, base = 0; base < ngpio; i++, base += 32) {
224-
snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", i);
225-
chips[i].chip.label = devm_kstrdup(dev, label, GFP_KERNEL);
226-
if (!chips[i].chip.label)
232+
snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++);
233+
chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL);
234+
if (!chips->chip.label)
227235
return -ENOMEM;
228236

229-
chips[i].chip.direction_input = davinci_direction_in;
230-
chips[i].chip.get = davinci_gpio_get;
231-
chips[i].chip.direction_output = davinci_direction_out;
232-
chips[i].chip.set = davinci_gpio_set;
237+
chips->chip.direction_input = davinci_direction_in;
238+
chips->chip.get = davinci_gpio_get;
239+
chips->chip.direction_output = davinci_direction_out;
240+
chips->chip.set = davinci_gpio_set;
233241

234-
chips[i].chip.base = base;
235-
chips[i].chip.ngpio = ngpio - base;
236-
if (chips[i].chip.ngpio > 32)
237-
chips[i].chip.ngpio = 32;
242+
chips->chip.ngpio = ngpio;
238243

239244
#ifdef CONFIG_OF_GPIO
240-
chips[i].chip.of_gpio_n_cells = 2;
241-
chips[i].chip.of_xlate = davinci_gpio_of_xlate;
242-
chips[i].chip.parent = dev;
243-
chips[i].chip.of_node = dev->of_node;
245+
chips->chip.of_gpio_n_cells = 2;
246+
chips->chip.of_xlate = davinci_gpio_of_xlate;
247+
chips->chip.parent = dev;
248+
chips->chip.of_node = dev->of_node;
244249
#endif
245-
spin_lock_init(&chips[i].lock);
246-
247-
regs = gpio_base + offset_array[i];
248-
if (!regs)
249-
return -ENXIO;
250-
chips[i].regs = regs;
250+
spin_lock_init(&chips->lock);
251251

252-
gpiochip_add_data(&chips[i].chip, &chips[i]);
253-
}
252+
for (gpio = 0, bank = 0; gpio < ngpio; gpio += 32, bank++)
253+
chips->regs[bank] = gpio_base + offset_array[bank];
254254

255+
gpiochip_add_data(&chips->chip, chips);
255256
platform_set_drvdata(pdev, chips);
256257
davinci_gpio_irq_setup(pdev);
257258
return 0;
@@ -312,23 +313,27 @@ static struct irq_chip gpio_irqchip = {
312313

313314
static void gpio_irq_handler(struct irq_desc *desc)
314315
{
315-
unsigned int irq = irq_desc_get_irq(desc);
316316
struct davinci_gpio_regs __iomem *g;
317317
u32 mask = 0xffff;
318+
int bank_num;
318319
struct davinci_gpio_controller *d;
320+
struct davinci_gpio_irq_data *irqdata;
319321

320-
d = (struct davinci_gpio_controller *)irq_desc_get_handler_data(desc);
321-
g = (struct davinci_gpio_regs __iomem *)d->regs;
322+
irqdata = (struct davinci_gpio_irq_data *)irq_desc_get_handler_data(desc);
323+
bank_num = irqdata->bank_num;
324+
g = irqdata->regs;
325+
d = irqdata->chip;
322326

323327
/* we only care about one bank */
324-
if (irq & 1)
328+
if ((bank_num % 2) == 1)
325329
mask <<= 16;
326330

327331
/* temporarily mask (level sensitive) parent IRQ */
328332
chained_irq_enter(irq_desc_get_chip(desc), desc);
329333
while (1) {
330334
u32 status;
331335
int bit;
336+
irq_hw_number_t hw_irq;
332337

333338
/* ack any irqs */
334339
status = readl_relaxed(&g->intstat) & mask;
@@ -341,9 +346,13 @@ static void gpio_irq_handler(struct irq_desc *desc)
341346
while (status) {
342347
bit = __ffs(status);
343348
status &= ~BIT(bit);
349+
/* Max number of gpios per controller is 144 so
350+
* hw_irq will be in [0..143]
351+
*/
352+
hw_irq = (bank_num / 2) * 32 + bit;
353+
344354
generic_handle_irq(
345-
irq_find_mapping(d->irq_domain,
346-
d->chip.base + bit));
355+
irq_find_mapping(d->irq_domain, hw_irq));
347356
}
348357
}
349358
chained_irq_exit(irq_desc_get_chip(desc), desc);
@@ -355,7 +364,7 @@ static int gpio_to_irq_banked(struct gpio_chip *chip, unsigned offset)
355364
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
356365

357366
if (d->irq_domain)
358-
return irq_create_mapping(d->irq_domain, d->chip.base + offset);
367+
return irq_create_mapping(d->irq_domain, offset);
359368
else
360369
return -ENXIO;
361370
}
@@ -369,7 +378,7 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset)
369378
* can provide direct-mapped IRQs to AINTC (up to 32 GPIOs).
370379
*/
371380
if (offset < d->gpio_unbanked)
372-
return d->gpio_irq + offset;
381+
return d->base_irq + offset;
373382
else
374383
return -ENODEV;
375384
}
@@ -382,7 +391,7 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger)
382391

383392
d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data);
384393
g = (struct davinci_gpio_regs __iomem *)d->regs;
385-
mask = __gpio_mask(data->irq - d->gpio_irq);
394+
mask = __gpio_mask(data->irq - d->base_irq);
386395

387396
if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
388397
return -EINVAL;
@@ -401,7 +410,7 @@ davinci_gpio_irq_map(struct irq_domain *d, unsigned int irq,
401410
{
402411
struct davinci_gpio_controller *chips =
403412
(struct davinci_gpio_controller *)d->host_data;
404-
struct davinci_gpio_regs __iomem *g = chips[hw / 32].regs;
413+
struct davinci_gpio_regs __iomem *g = chips->regs[hw / 32];
405414

406415
irq_set_chip_and_handler_name(irq, &gpio_irqchip, handle_simple_irq,
407416
"davinci_gpio");
@@ -459,6 +468,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
459468
struct irq_domain *irq_domain = NULL;
460469
const struct of_device_id *match;
461470
struct irq_chip *irq_chip;
471+
struct davinci_gpio_irq_data *irqdata;
462472
gpio_get_irq_chip_cb_t gpio_get_irq_chip;
463473

464474
/*
@@ -514,10 +524,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
514524
* IRQs, while the others use banked IRQs, would need some setup
515525
* tweaks to recognize hardware which can do that.
516526
*/
517-
for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 32) {
518-
chips[bank].chip.to_irq = gpio_to_irq_banked;
519-
chips[bank].irq_domain = irq_domain;
520-
}
527+
chips->chip.to_irq = gpio_to_irq_banked;
528+
chips->irq_domain = irq_domain;
521529

522530
/*
523531
* AINTC can handle direct/unbanked IRQs for GPIOs, with the GPIO
@@ -526,9 +534,9 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
526534
*/
527535
if (pdata->gpio_unbanked) {
528536
/* pass "bank 0" GPIO IRQs to AINTC */
529-
chips[0].chip.to_irq = gpio_to_irq_unbanked;
530-
chips[0].gpio_irq = bank_irq;
531-
chips[0].gpio_unbanked = pdata->gpio_unbanked;
537+
chips->chip.to_irq = gpio_to_irq_unbanked;
538+
chips->base_irq = bank_irq;
539+
chips->gpio_unbanked = pdata->gpio_unbanked;
532540
binten = GENMASK(pdata->gpio_unbanked / 16, 0);
533541

534542
/* AINTC handles mask/unmask; GPIO handles triggering */
@@ -538,14 +546,14 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
538546
irq_chip->irq_set_type = gpio_irq_type_unbanked;
539547

540548
/* default trigger: both edges */
541-
g = chips[0].regs;
549+
g = chips->regs[0];
542550
writel_relaxed(~0, &g->set_falling);
543551
writel_relaxed(~0, &g->set_rising);
544552

545553
/* set the direct IRQs up to use that irqchip */
546554
for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) {
547555
irq_set_chip(irq, irq_chip);
548-
irq_set_handler_data(irq, &chips[gpio / 32]);
556+
irq_set_handler_data(irq, chips);
549557
irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH);
550558
}
551559

@@ -561,7 +569,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
561569
* There are register sets for 32 GPIOs. 2 banks of 16
562570
* GPIOs are covered by each set of registers hence divide by 2
563571
*/
564-
g = chips[bank / 2].regs;
572+
g = chips->regs[bank / 2];
565573
writel_relaxed(~0, &g->clr_falling);
566574
writel_relaxed(~0, &g->clr_rising);
567575

@@ -570,8 +578,19 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
570578
* gpio irqs. Pass the irq bank's corresponding controller to
571579
* the chained irq handler.
572580
*/
581+
irqdata = devm_kzalloc(&pdev->dev,
582+
sizeof(struct
583+
davinci_gpio_irq_data),
584+
GFP_KERNEL);
585+
if (!irqdata)
586+
return -ENOMEM;
587+
588+
irqdata->regs = g;
589+
irqdata->bank_num = bank;
590+
irqdata->chip = chips;
591+
573592
irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler,
574-
&chips[gpio / 32]);
593+
irqdata);
575594

576595
binten |= BIT(bank);
577596
}

include/linux/platform_data/gpio-davinci.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,27 @@
2121

2222
#include <asm-generic/gpio.h>
2323

24+
#define MAX_REGS_BANKS 5
25+
2426
struct davinci_gpio_platform_data {
2527
u32 ngpio;
2628
u32 gpio_unbanked;
2729
};
2830

31+
struct davinci_gpio_irq_data {
32+
void __iomem *regs;
33+
struct davinci_gpio_controller *chip;
34+
int bank_num;
35+
};
36+
2937
struct davinci_gpio_controller {
3038
struct gpio_chip chip;
3139
struct irq_domain *irq_domain;
3240
/* Serialize access to GPIO registers */
3341
spinlock_t lock;
34-
void __iomem *regs;
42+
void __iomem *regs[MAX_REGS_BANKS];
3543
int gpio_unbanked;
36-
unsigned gpio_irq;
44+
unsigned int base_irq;
3745
};
3846

3947
/*

0 commit comments

Comments
 (0)