aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-davinci.c
diff options
context:
space:
mode:
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 }