diff options
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
-rw-r--r-- | drivers/gpio/gpio-davinci.c | 127 |
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) | |||
103 | static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset) | 105 | static 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 | |||
115 | davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | 120 | davinci_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 | ||
123 | static struct davinci_gpio_platform_data * | 132 | static 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 | ||
178 | static int davinci_gpio_probe(struct platform_device *pdev) | 187 | static 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 | ||
313 | static void gpio_irq_handler(struct irq_desc *desc) | 314 | static 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 | } |