aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-davinci.c
diff options
context:
space:
mode:
authorKeerthy <j-keerthy@ti.com>2017-01-12 23:20:12 -0500
committerLinus Walleij <linus.walleij@linaro.org>2017-01-26 04:00:21 -0500
commitb5cf3fd827d2e11355c126b44ea625650ebf4d39 (patch)
treeea1b09015291512b2e8e36590f60a727a7ed2575 /drivers/gpio/gpio-davinci.c
parent53d333ac93911dab22d12a78b0a6414f9afb0117 (diff)
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>
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
-rw-r--r--drivers/gpio/gpio-davinci.c127
1 files changed, 73 insertions, 54 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c
index bb47de3daafa..446df4ece915 100644
--- a/drivers/gpio/gpio-davinci.c
+++ b/drivers/gpio/gpio-davinci.c
@@ -63,11 +63,13 @@ static inline int __davinci_direction(struct gpio_chip *chip,
63 unsigned offset, bool out, int value) 63 unsigned offset, bool out, int value)
64{ 64{
65 struct davinci_gpio_controller *d = gpiochip_get_data(chip); 65 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;
67 unsigned long flags; 67 unsigned long flags;
68 u32 temp; 68 u32 temp;
69 u32 mask = 1 << offset; 69 int bank = offset / 32;
70 u32 mask = __gpio_mask(offset);
70 71
72 g = d->regs[bank];
71 spin_lock_irqsave(&d->lock, flags); 73 spin_lock_irqsave(&d->lock, flags);
72 temp = readl_relaxed(&g->dir); 74 temp = readl_relaxed(&g->dir);
73 if (out) { 75 if (out) {
@@ -103,9 +105,12 @@ davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
103static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset) 105static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
104{ 106{
105 struct davinci_gpio_controller *d = gpiochip_get_data(chip); 107 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;
107 110
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));
109} 114}
110 115
111/* 116/*
@@ -115,9 +120,13 @@ static void
115davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value) 120davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
116{ 121{
117 struct davinci_gpio_controller *d = gpiochip_get_data(chip); 122 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;
119 125
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);
121} 130}
122 131
123static struct davinci_gpio_platform_data * 132static struct davinci_gpio_platform_data *
@@ -165,7 +174,7 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
165 if (gpiospec->args[0] > pdata->ngpio) 174 if (gpiospec->args[0] > pdata->ngpio)
166 return -EINVAL; 175 return -EINVAL;
167 176
168 if (gc != &chips[gpiospec->args[0] / 32].chip) 177 if (gc != &chips->chip)
169 return -EINVAL; 178 return -EINVAL;
170 179
171 if (flags) 180 if (flags)
@@ -177,11 +186,11 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
177 186
178static int davinci_gpio_probe(struct platform_device *pdev) 187static int davinci_gpio_probe(struct platform_device *pdev)
179{ 188{
180 int i, base; 189 static int ctrl_num;
190 int gpio, bank;
181 unsigned ngpio, nbank; 191 unsigned ngpio, nbank;
182 struct davinci_gpio_controller *chips; 192 struct davinci_gpio_controller *chips;
183 struct davinci_gpio_platform_data *pdata; 193 struct davinci_gpio_platform_data *pdata;
184 struct davinci_gpio_regs __iomem *regs;
185 struct device *dev = &pdev->dev; 194 struct device *dev = &pdev->dev;
186 struct resource *res; 195 struct resource *res;
187 char label[MAX_LABEL_SIZE]; 196 char label[MAX_LABEL_SIZE];
@@ -220,38 +229,30 @@ static int davinci_gpio_probe(struct platform_device *pdev)
220 if (IS_ERR(gpio_base)) 229 if (IS_ERR(gpio_base))
221 return PTR_ERR(gpio_base); 230 return PTR_ERR(gpio_base);
222 231
223 for (i = 0, base = 0; base < ngpio; i++, base += 32) { 232 snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++);
224 snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", i); 233 chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL);
225 chips[i].chip.label = devm_kstrdup(dev, label, GFP_KERNEL); 234 if (!chips->chip.label)
226 if (!chips[i].chip.label)
227 return -ENOMEM; 235 return -ENOMEM;
228 236
229 chips[i].chip.direction_input = davinci_direction_in; 237 chips->chip.direction_input = davinci_direction_in;
230 chips[i].chip.get = davinci_gpio_get; 238 chips->chip.get = davinci_gpio_get;
231 chips[i].chip.direction_output = davinci_direction_out; 239 chips->chip.direction_output = davinci_direction_out;
232 chips[i].chip.set = davinci_gpio_set; 240 chips->chip.set = davinci_gpio_set;
233 241
234 chips[i].chip.base = base; 242 chips->chip.ngpio = ngpio;
235 chips[i].chip.ngpio = ngpio - base;
236 if (chips[i].chip.ngpio > 32)
237 chips[i].chip.ngpio = 32;
238 243
239#ifdef CONFIG_OF_GPIO 244#ifdef CONFIG_OF_GPIO
240 chips[i].chip.of_gpio_n_cells = 2; 245 chips->chip.of_gpio_n_cells = 2;
241 chips[i].chip.of_xlate = davinci_gpio_of_xlate; 246 chips->chip.of_xlate = davinci_gpio_of_xlate;
242 chips[i].chip.parent = dev; 247 chips->chip.parent = dev;
243 chips[i].chip.of_node = dev->of_node; 248 chips->chip.of_node = dev->of_node;
244#endif 249#endif
245 spin_lock_init(&chips[i].lock); 250 spin_lock_init(&chips->lock);
246
247 regs = gpio_base + offset_array[i];
248 if (!regs)
249 return -ENXIO;
250 chips[i].regs = regs;
251 251
252 gpiochip_add_data(&chips[i].chip, &chips[i]); 252 for (gpio = 0, bank = 0; gpio < ngpio; gpio += 32, bank++)
253 } 253 chips->regs[bank] = gpio_base + offset_array[bank];
254 254
255 gpiochip_add_data(&chips->chip, chips);
255 platform_set_drvdata(pdev, chips); 256 platform_set_drvdata(pdev, chips);
256 davinci_gpio_irq_setup(pdev); 257 davinci_gpio_irq_setup(pdev);
257 return 0; 258 return 0;
@@ -312,16 +313,19 @@ static struct irq_chip gpio_irqchip = {
312 313
313static void gpio_irq_handler(struct irq_desc *desc) 314static void gpio_irq_handler(struct irq_desc *desc)
314{ 315{
315 unsigned int irq = irq_desc_get_irq(desc);
316 struct davinci_gpio_regs __iomem *g; 316 struct davinci_gpio_regs __iomem *g;
317 u32 mask = 0xffff; 317 u32 mask = 0xffff;
318 int bank_num;
318 struct davinci_gpio_controller *d; 319 struct davinci_gpio_controller *d;
320 struct davinci_gpio_irq_data *irqdata;
319 321
320 d = (struct davinci_gpio_controller *)irq_desc_get_handler_data(desc); 322 irqdata = (struct davinci_gpio_irq_data *)irq_desc_get_handler_data(desc);
321 g = (struct davinci_gpio_regs __iomem *)d->regs; 323 bank_num = irqdata->bank_num;
324 g = irqdata->regs;
325 d = irqdata->chip;
322 326
323 /* we only care about one bank */ 327 /* we only care about one bank */
324 if (irq & 1) 328 if ((bank_num % 2) == 1)
325 mask <<= 16; 329 mask <<= 16;
326 330
327 /* temporarily mask (level sensitive) parent IRQ */ 331 /* temporarily mask (level sensitive) parent IRQ */
@@ -329,6 +333,7 @@ static void gpio_irq_handler(struct irq_desc *desc)
329 while (1) { 333 while (1) {
330 u32 status; 334 u32 status;
331 int bit; 335 int bit;
336 irq_hw_number_t hw_irq;
332 337
333 /* ack any irqs */ 338 /* ack any irqs */
334 status = readl_relaxed(&g->intstat) & mask; 339 status = readl_relaxed(&g->intstat) & mask;
@@ -341,9 +346,13 @@ static void gpio_irq_handler(struct irq_desc *desc)
341 while (status) { 346 while (status) {
342 bit = __ffs(status); 347 bit = __ffs(status);
343 status &= ~BIT(bit); 348 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
344 generic_handle_irq( 354 generic_handle_irq(
345 irq_find_mapping(d->irq_domain, 355 irq_find_mapping(d->irq_domain, hw_irq));
346 d->chip.base + bit));
347 } 356 }
348 } 357 }
349 chained_irq_exit(irq_desc_get_chip(desc), desc); 358 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)
355 struct davinci_gpio_controller *d = gpiochip_get_data(chip); 364 struct davinci_gpio_controller *d = gpiochip_get_data(chip);
356 365
357 if (d->irq_domain) 366 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);
359 else 368 else
360 return -ENXIO; 369 return -ENXIO;
361} 370}
@@ -369,7 +378,7 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset)
369 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs). 378 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs).
370 */ 379 */
371 if (offset < d->gpio_unbanked) 380 if (offset < d->gpio_unbanked)
372 return d->gpio_irq + offset; 381 return d->base_irq + offset;
373 else 382 else
374 return -ENODEV; 383 return -ENODEV;
375} 384}
@@ -382,7 +391,7 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger)
382 391
383 d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data); 392 d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data);
384 g = (struct davinci_gpio_regs __iomem *)d->regs; 393 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);
386 395
387 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) 396 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
388 return -EINVAL; 397 return -EINVAL;
@@ -401,7 +410,7 @@ davinci_gpio_irq_map(struct irq_domain *d, unsigned int irq,
401{ 410{
402 struct davinci_gpio_controller *chips = 411 struct davinci_gpio_controller *chips =
403 (struct davinci_gpio_controller *)d->host_data; 412 (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];
405 414
406 irq_set_chip_and_handler_name(irq, &gpio_irqchip, handle_simple_irq, 415 irq_set_chip_and_handler_name(irq, &gpio_irqchip, handle_simple_irq,
407 "davinci_gpio"); 416 "davinci_gpio");
@@ -459,6 +468,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
459 struct irq_domain *irq_domain = NULL; 468 struct irq_domain *irq_domain = NULL;
460 const struct of_device_id *match; 469 const struct of_device_id *match;
461 struct irq_chip *irq_chip; 470 struct irq_chip *irq_chip;
471 struct davinci_gpio_irq_data *irqdata;
462 gpio_get_irq_chip_cb_t gpio_get_irq_chip; 472 gpio_get_irq_chip_cb_t gpio_get_irq_chip;
463 473
464 /* 474 /*
@@ -514,10 +524,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
514 * IRQs, while the others use banked IRQs, would need some setup 524 * IRQs, while the others use banked IRQs, would need some setup
515 * tweaks to recognize hardware which can do that. 525 * tweaks to recognize hardware which can do that.
516 */ 526 */
517 for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 32) { 527 chips->chip.to_irq = gpio_to_irq_banked;
518 chips[bank].chip.to_irq = gpio_to_irq_banked; 528 chips->irq_domain = irq_domain;
519 chips[bank].irq_domain = irq_domain;
520 }
521 529
522 /* 530 /*
523 * AINTC can handle direct/unbanked IRQs for GPIOs, with the GPIO 531 * 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)
526 */ 534 */
527 if (pdata->gpio_unbanked) { 535 if (pdata->gpio_unbanked) {
528 /* pass "bank 0" GPIO IRQs to AINTC */ 536 /* pass "bank 0" GPIO IRQs to AINTC */
529 chips[0].chip.to_irq = gpio_to_irq_unbanked; 537 chips->chip.to_irq = gpio_to_irq_unbanked;
530 chips[0].gpio_irq = bank_irq; 538 chips->base_irq = bank_irq;
531 chips[0].gpio_unbanked = pdata->gpio_unbanked; 539 chips->gpio_unbanked = pdata->gpio_unbanked;
532 binten = GENMASK(pdata->gpio_unbanked / 16, 0); 540 binten = GENMASK(pdata->gpio_unbanked / 16, 0);
533 541
534 /* AINTC handles mask/unmask; GPIO handles triggering */ 542 /* AINTC handles mask/unmask; GPIO handles triggering */
@@ -538,14 +546,14 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
538 irq_chip->irq_set_type = gpio_irq_type_unbanked; 546 irq_chip->irq_set_type = gpio_irq_type_unbanked;
539 547
540 /* default trigger: both edges */ 548 /* default trigger: both edges */
541 g = chips[0].regs; 549 g = chips->regs[0];
542 writel_relaxed(~0, &g->set_falling); 550 writel_relaxed(~0, &g->set_falling);
543 writel_relaxed(~0, &g->set_rising); 551 writel_relaxed(~0, &g->set_rising);
544 552
545 /* set the direct IRQs up to use that irqchip */ 553 /* set the direct IRQs up to use that irqchip */
546 for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) { 554 for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) {
547 irq_set_chip(irq, irq_chip); 555 irq_set_chip(irq, irq_chip);
548 irq_set_handler_data(irq, &chips[gpio / 32]); 556 irq_set_handler_data(irq, chips);
549 irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); 557 irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH);
550 } 558 }
551 559
@@ -561,7 +569,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
561 * There are register sets for 32 GPIOs. 2 banks of 16 569 * There are register sets for 32 GPIOs. 2 banks of 16
562 * GPIOs are covered by each set of registers hence divide by 2 570 * GPIOs are covered by each set of registers hence divide by 2
563 */ 571 */
564 g = chips[bank / 2].regs; 572 g = chips->regs[bank / 2];
565 writel_relaxed(~0, &g->clr_falling); 573 writel_relaxed(~0, &g->clr_falling);
566 writel_relaxed(~0, &g->clr_rising); 574 writel_relaxed(~0, &g->clr_rising);
567 575
@@ -570,8 +578,19 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
570 * gpio irqs. Pass the irq bank's corresponding controller to 578 * gpio irqs. Pass the irq bank's corresponding controller to
571 * the chained irq handler. 579 * the chained irq handler.
572 */ 580 */
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
573 irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler, 592 irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler,
574 &chips[gpio / 32]); 593 irqdata);
575 594
576 binten |= BIT(bank); 595 binten |= BIT(bank);
577 } 596 }