Commit cd99758ba3bde64347a8ece381cbae2fb5c745b2

Authored by Mark Brown
Committed by Samuel Ortiz
1 parent 4492c4c3ff

mfd: Convert wm831x to irq_domain

The modern idiom is to use irq_domain to allocate interrupts. This is
useful partly to allow further infrastructure to be based on the domains
and partly because it makes it much easier to allocate virtual interrupts
to devices as we don't need to allocate a contiguous range of interrupt
numbers.

Convert the wm831x driver over to this infrastructure, using a legacy
IRQ mapping if an irq_base is specified in platform data and otherwise
using a linear mapping, always registering the interrupts even if they
won't ever be used. Only boards which need to use the GPIOs as
interrupts should need to use an irq_base.

This means that we can't use the MFD irq_base management since the
unless we're using an explicit irq_base from platform data we can't rely
on a linear mapping of interrupts.  Instead we need to map things via
the irq_domain - provide a conveniencem function wm831x_irq() to save a
small amount of typing when doing so. Looking at this I couldn't clearly
see anything the MFD core could do to make this nicer.

Since we're not supporting device tree yet there's no meaningful
advantage if we don't do this conversion in one, the fact that the
interrupt resources are used for repeated IP blocks makes accessor
functions for the irq_domain more trouble to do than they're worth.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

Showing 13 changed files with 131 additions and 84 deletions Side-by-side Diff

drivers/gpio/gpio-wm831x.c
... ... @@ -102,10 +102,8 @@
102 102 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip);
103 103 struct wm831x *wm831x = wm831x_gpio->wm831x;
104 104  
105   - if (!wm831x->irq_base)
106   - return -EINVAL;
107   -
108   - return wm831x->irq_base + WM831X_IRQ_GPIO_1 + offset;
  105 + return irq_create_mapping(wm831x->irq_domain,
  106 + WM831X_IRQ_GPIO_1 + offset);
109 107 }
110 108  
111 109 static int wm831x_gpio_set_debounce(struct gpio_chip *chip, unsigned offset,
drivers/input/misc/wm831x-on.c
... ... @@ -73,7 +73,7 @@
73 73 {
74 74 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
75 75 struct wm831x_on *wm831x_on;
76   - int irq = platform_get_irq(pdev, 0);
  76 + int irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));
77 77 int ret;
78 78  
79 79 wm831x_on = kzalloc(sizeof(struct wm831x_on), GFP_KERNEL);
drivers/input/touchscreen/wm831x-ts.c
... ... @@ -260,15 +260,16 @@
260 260 * If we have a direct IRQ use it, otherwise use the interrupt
261 261 * from the WM831x IRQ controller.
262 262 */
  263 + wm831x_ts->data_irq = wm831x_irq(wm831x,
  264 + platform_get_irq_byname(pdev,
  265 + "TCHDATA"));
263 266 if (pdata && pdata->data_irq)
264 267 wm831x_ts->data_irq = pdata->data_irq;
265   - else
266   - wm831x_ts->data_irq = platform_get_irq_byname(pdev, "TCHDATA");
267 268  
  269 + wm831x_ts->pd_irq = wm831x_irq(wm831x,
  270 + platform_get_irq_byname(pdev, "TCHPD"));
268 271 if (pdata && pdata->pd_irq)
269 272 wm831x_ts->pd_irq = pdata->pd_irq;
270   - else
271   - wm831x_ts->pd_irq = platform_get_irq_byname(pdev, "TCHPD");
272 273  
273 274 if (pdata)
274 275 wm831x_ts->pressure = pdata->pressure;
... ... @@ -496,6 +496,7 @@
496 496 select MFD_CORE
497 497 select MFD_WM831X
498 498 select REGMAP_I2C
  499 + select IRQ_DOMAIN
499 500 depends on I2C=y && GENERIC_HARDIRQS
500 501 help
501 502 Support for the Wolfson Microelecronics WM831x and WM832x PMICs
... ... @@ -508,6 +509,7 @@
508 509 select MFD_CORE
509 510 select MFD_WM831X
510 511 select REGMAP_SPI
  512 + select IRQ_DOMAIN
511 513 depends on SPI_MASTER && GENERIC_HARDIRQS
512 514 help
513 515 Support for the Wolfson Microelecronics WM831x and WM832x PMICs
drivers/mfd/wm831x-auxadc.c
... ... @@ -280,11 +280,11 @@
280 280 mutex_init(&wm831x->auxadc_lock);
281 281 INIT_LIST_HEAD(&wm831x->auxadc_pending);
282 282  
283   - if (wm831x->irq && wm831x->irq_base) {
  283 + if (wm831x->irq) {
284 284 wm831x->auxadc_read = wm831x_auxadc_read_irq;
285 285  
286   - ret = request_threaded_irq(wm831x->irq_base +
287   - WM831X_IRQ_AUXADC_DATA,
  286 + ret = request_threaded_irq(wm831x_irq(wm831x,
  287 + WM831X_IRQ_AUXADC_DATA),
288 288 NULL, wm831x_auxadc_irq, 0,
289 289 "auxadc", wm831x);
290 290 if (ret < 0) {
drivers/mfd/wm831x-core.c
... ... @@ -1813,27 +1813,27 @@
1813 1813 case WM8310:
1814 1814 ret = mfd_add_devices(wm831x->dev, wm831x_num,
1815 1815 wm8310_devs, ARRAY_SIZE(wm8310_devs),
1816   - NULL, wm831x->irq_base);
  1816 + NULL, 0);
1817 1817 break;
1818 1818  
1819 1819 case WM8311:
1820 1820 ret = mfd_add_devices(wm831x->dev, wm831x_num,
1821 1821 wm8311_devs, ARRAY_SIZE(wm8311_devs),
1822   - NULL, wm831x->irq_base);
  1822 + NULL, 0);
1823 1823 if (!pdata || !pdata->disable_touch)
1824 1824 mfd_add_devices(wm831x->dev, wm831x_num,
1825 1825 touch_devs, ARRAY_SIZE(touch_devs),
1826   - NULL, wm831x->irq_base);
  1826 + NULL, 0);
1827 1827 break;
1828 1828  
1829 1829 case WM8312:
1830 1830 ret = mfd_add_devices(wm831x->dev, wm831x_num,
1831 1831 wm8312_devs, ARRAY_SIZE(wm8312_devs),
1832   - NULL, wm831x->irq_base);
  1832 + NULL, 0);
1833 1833 if (!pdata || !pdata->disable_touch)
1834 1834 mfd_add_devices(wm831x->dev, wm831x_num,
1835 1835 touch_devs, ARRAY_SIZE(touch_devs),
1836   - NULL, wm831x->irq_base);
  1836 + NULL, 0);
1837 1837 break;
1838 1838  
1839 1839 case WM8320:
... ... @@ -1842,7 +1842,7 @@
1842 1842 case WM8326:
1843 1843 ret = mfd_add_devices(wm831x->dev, wm831x_num,
1844 1844 wm8320_devs, ARRAY_SIZE(wm8320_devs),
1845   - NULL, wm831x->irq_base);
  1845 + NULL, 0);
1846 1846 break;
1847 1847  
1848 1848 default:
... ... @@ -1867,7 +1867,7 @@
1867 1867 if (ret & WM831X_XTAL_ENA) {
1868 1868 ret = mfd_add_devices(wm831x->dev, wm831x_num,
1869 1869 rtc_devs, ARRAY_SIZE(rtc_devs),
1870   - NULL, wm831x->irq_base);
  1870 + NULL, 0);
1871 1871 if (ret != 0) {
1872 1872 dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
1873 1873 goto err_irq;
... ... @@ -1880,7 +1880,7 @@
1880 1880 /* Treat errors as non-critical */
1881 1881 ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
1882 1882 ARRAY_SIZE(backlight_devs), NULL,
1883   - wm831x->irq_base);
  1883 + 0);
1884 1884 if (ret < 0)
1885 1885 dev_err(wm831x->dev, "Failed to add backlight: %d\n",
1886 1886 ret);
... ... @@ -1909,8 +1909,7 @@
1909 1909 {
1910 1910 wm831x_otp_exit(wm831x);
1911 1911 mfd_remove_devices(wm831x->dev);
1912   - if (wm831x->irq_base)
1913   - free_irq(wm831x->irq_base + WM831X_IRQ_AUXADC_DATA, wm831x);
  1912 + free_irq(wm831x_irq(wm831x, WM831X_IRQ_AUXADC_DATA), wm831x);
1914 1913 wm831x_irq_exit(wm831x);
1915 1914 }
1916 1915  
drivers/mfd/wm831x-irq.c
... ... @@ -18,6 +18,7 @@
18 18 #include <linux/irq.h>
19 19 #include <linux/mfd/core.h>
20 20 #include <linux/interrupt.h>
  21 +#include <linux/irqdomain.h>
21 22  
22 23 #include <linux/mfd/wm831x/core.h>
23 24 #include <linux/mfd/wm831x/pdata.h>
... ... @@ -328,7 +329,7 @@
328 329 static inline struct wm831x_irq_data *irq_to_wm831x_irq(struct wm831x *wm831x,
329 330 int irq)
330 331 {
331   - return &wm831x_irqs[irq - wm831x->irq_base];
  332 + return &wm831x_irqs[irq];
332 333 }
333 334  
334 335 static void wm831x_irq_lock(struct irq_data *data)
... ... @@ -374,7 +375,7 @@
374 375 {
375 376 struct wm831x *wm831x = irq_data_get_irq_chip_data(data);
376 377 struct wm831x_irq_data *irq_data = irq_to_wm831x_irq(wm831x,
377   - data->irq);
  378 + data->hwirq);
378 379  
379 380 wm831x->irq_masks_cur[irq_data->reg - 1] &= ~irq_data->mask;
380 381 }
... ... @@ -383,7 +384,7 @@
383 384 {
384 385 struct wm831x *wm831x = irq_data_get_irq_chip_data(data);
385 386 struct wm831x_irq_data *irq_data = irq_to_wm831x_irq(wm831x,
386   - data->irq);
  387 + data->hwirq);
387 388  
388 389 wm831x->irq_masks_cur[irq_data->reg - 1] |= irq_data->mask;
389 390 }
... ... @@ -393,7 +394,7 @@
393 394 struct wm831x *wm831x = irq_data_get_irq_chip_data(data);
394 395 int irq;
395 396  
396   - irq = data->irq - wm831x->irq_base;
  397 + irq = data->hwirq;
397 398  
398 399 if (irq < WM831X_IRQ_GPIO_1 || irq > WM831X_IRQ_GPIO_11) {
399 400 /* Ignore internal-only IRQs */
400 401  
... ... @@ -469,9 +470,11 @@
469 470 * descriptors.
470 471 */
471 472 if (primary & WM831X_TCHPD_INT)
472   - handle_nested_irq(wm831x->irq_base + WM831X_IRQ_TCHPD);
  473 + handle_nested_irq(irq_find_mapping(wm831x->irq_domain,
  474 + WM831X_IRQ_TCHPD));
473 475 if (primary & WM831X_TCHDATA_INT)
474   - handle_nested_irq(wm831x->irq_base + WM831X_IRQ_TCHDATA);
  476 + handle_nested_irq(irq_find_mapping(wm831x->irq_domain,
  477 + WM831X_IRQ_TCHDATA));
475 478 primary &= ~(WM831X_TCHDATA_EINT | WM831X_TCHPD_EINT);
476 479  
477 480 for (i = 0; i < ARRAY_SIZE(wm831x_irqs); i++) {
... ... @@ -507,7 +510,8 @@
507 510 }
508 511  
509 512 if (*status & wm831x_irqs[i].mask)
510   - handle_nested_irq(wm831x->irq_base + i);
  513 + handle_nested_irq(irq_find_mapping(wm831x->irq_domain,
  514 + i));
511 515  
512 516 /* Simulate an edge triggered IRQ by polling the input
513 517 * status. This is sucky but improves interoperability.
... ... @@ -516,7 +520,8 @@
516 520 wm831x->gpio_level[i - WM831X_IRQ_GPIO_1]) {
517 521 ret = wm831x_reg_read(wm831x, WM831X_GPIO_LEVEL);
518 522 while (ret & 1 << (i - WM831X_IRQ_GPIO_1)) {
519   - handle_nested_irq(wm831x->irq_base + i);
  523 + handle_nested_irq(irq_find_mapping(wm831x->irq_domain,
  524 + i));
520 525 ret = wm831x_reg_read(wm831x,
521 526 WM831X_GPIO_LEVEL);
522 527 }
523 528  
... ... @@ -527,10 +532,34 @@
527 532 return IRQ_HANDLED;
528 533 }
529 534  
  535 +static int wm831x_irq_map(struct irq_domain *h, unsigned int virq,
  536 + irq_hw_number_t hw)
  537 +{
  538 + irq_set_chip_data(virq, h->host_data);
  539 + irq_set_chip_and_handler(virq, &wm831x_irq_chip, handle_edge_irq);
  540 + irq_set_nested_thread(virq, 1);
  541 +
  542 + /* ARM needs us to explicitly flag the IRQ as valid
  543 + * and will set them noprobe when we do so. */
  544 +#ifdef CONFIG_ARM
  545 + set_irq_flags(virq, IRQF_VALID);
  546 +#else
  547 + irq_set_noprobe(virq);
  548 +#endif
  549 +
  550 + return 0;
  551 +}
  552 +
  553 +static struct irq_domain_ops wm831x_irq_domain_ops = {
  554 + .map = wm831x_irq_map,
  555 + .xlate = irq_domain_xlate_twocell,
  556 +};
  557 +
530 558 int wm831x_irq_init(struct wm831x *wm831x, int irq)
531 559 {
532 560 struct wm831x_pdata *pdata = wm831x->dev->platform_data;
533   - int i, cur_irq, ret;
  561 + struct irq_domain *domain;
  562 + int i, ret, irq_base;
534 563  
535 564 mutex_init(&wm831x->irq_lock);
536 565  
537 566  
538 567  
... ... @@ -543,18 +572,33 @@
543 572 }
544 573  
545 574 /* Try to dynamically allocate IRQs if no base is specified */
546   - if (!pdata || !pdata->irq_base)
547   - wm831x->irq_base = -1;
  575 + if (pdata && pdata->irq_base) {
  576 + irq_base = irq_alloc_descs(pdata->irq_base, 0,
  577 + WM831X_NUM_IRQS, 0);
  578 + if (irq_base < 0) {
  579 + dev_warn(wm831x->dev, "Failed to allocate IRQs: %d\n",
  580 + irq_base);
  581 + irq_base = 0;
  582 + }
  583 + } else {
  584 + irq_base = 0;
  585 + }
  586 +
  587 + if (irq_base)
  588 + domain = irq_domain_add_legacy(wm831x->dev->of_node,
  589 + ARRAY_SIZE(wm831x_irqs),
  590 + irq_base, 0,
  591 + &wm831x_irq_domain_ops,
  592 + wm831x);
548 593 else
549   - wm831x->irq_base = pdata->irq_base;
  594 + domain = irq_domain_add_linear(wm831x->dev->of_node,
  595 + ARRAY_SIZE(wm831x_irqs),
  596 + &wm831x_irq_domain_ops,
  597 + wm831x);
550 598  
551   - wm831x->irq_base = irq_alloc_descs(wm831x->irq_base, 0,
552   - WM831X_NUM_IRQS, 0);
553   - if (wm831x->irq_base < 0) {
554   - dev_warn(wm831x->dev, "Failed to allocate IRQs: %d\n",
555   - wm831x->irq_base);
556   - wm831x->irq_base = 0;
557   - return 0;
  599 + if (!domain) {
  600 + dev_warn(wm831x->dev, "Failed to allocate IRQ domain\n");
  601 + return -EINVAL;
558 602 }
559 603  
560 604 if (pdata && pdata->irq_cmos)
... ... @@ -566,24 +610,7 @@
566 610 WM831X_IRQ_OD, i);
567 611  
568 612 wm831x->irq = irq;
569   -
570   - /* Register them with genirq */
571   - for (cur_irq = wm831x->irq_base;
572   - cur_irq < ARRAY_SIZE(wm831x_irqs) + wm831x->irq_base;
573   - cur_irq++) {
574   - irq_set_chip_data(cur_irq, wm831x);
575   - irq_set_chip_and_handler(cur_irq, &wm831x_irq_chip,
576   - handle_edge_irq);
577   - irq_set_nested_thread(cur_irq, 1);
578   -
579   - /* ARM needs us to explicitly flag the IRQ as valid
580   - * and will set them noprobe when we do so. */
581   -#ifdef CONFIG_ARM
582   - set_irq_flags(cur_irq, IRQF_VALID);
583   -#else
584   - irq_set_noprobe(cur_irq);
585   -#endif
586   - }
  613 + wm831x->irq_domain = domain;
587 614  
588 615 if (irq) {
589 616 /* Try to flag /IRQ as a wake source; there are a number of
drivers/power/wm831x_power.c
... ... @@ -565,7 +565,7 @@
565 565 goto err_usb;
566 566 }
567 567  
568   - irq = platform_get_irq_byname(pdev, "SYSLO");
  568 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "SYSLO"));
569 569 ret = request_threaded_irq(irq, NULL, wm831x_syslo_irq,
570 570 IRQF_TRIGGER_RISING, "System power low",
571 571 power);
... ... @@ -575,7 +575,7 @@
575 575 goto err_battery;
576 576 }
577 577  
578   - irq = platform_get_irq_byname(pdev, "PWR SRC");
  578 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "PWR SRC"));
579 579 ret = request_threaded_irq(irq, NULL, wm831x_pwr_src_irq,
580 580 IRQF_TRIGGER_RISING, "Power source",
581 581 power);
... ... @@ -586,7 +586,9 @@
586 586 }
587 587  
588 588 for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) {
589   - irq = platform_get_irq_byname(pdev, wm831x_bat_irqs[i]);
  589 + irq = wm831x_irq(wm831x,
  590 + platform_get_irq_byname(pdev,
  591 + wm831x_bat_irqs[i]));
590 592 ret = request_threaded_irq(irq, NULL, wm831x_bat_irq,
591 593 IRQF_TRIGGER_RISING,
592 594 wm831x_bat_irqs[i],
593 595  
... ... @@ -606,10 +608,10 @@
606 608 irq = platform_get_irq_byname(pdev, wm831x_bat_irqs[i]);
607 609 free_irq(irq, power);
608 610 }
609   - irq = platform_get_irq_byname(pdev, "PWR SRC");
  611 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "PWR SRC"));
610 612 free_irq(irq, power);
611 613 err_syslo:
612   - irq = platform_get_irq_byname(pdev, "SYSLO");
  614 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "SYSLO"));
613 615 free_irq(irq, power);
614 616 err_battery:
615 617 if (power->have_battery)
616 618  
617 619  
618 620  
... ... @@ -626,17 +628,20 @@
626 628 static __devexit int wm831x_power_remove(struct platform_device *pdev)
627 629 {
628 630 struct wm831x_power *wm831x_power = platform_get_drvdata(pdev);
  631 + struct wm831x *wm831x = wm831x_power->wm831x;
629 632 int irq, i;
630 633  
631 634 for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) {
632   - irq = platform_get_irq_byname(pdev, wm831x_bat_irqs[i]);
  635 + irq = wm831x_irq(wm831x,
  636 + platform_get_irq_byname(pdev,
  637 + wm831x_bat_irqs[i]));
633 638 free_irq(irq, wm831x_power);
634 639 }
635 640  
636   - irq = platform_get_irq_byname(pdev, "PWR SRC");
  641 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "PWR SRC"));
637 642 free_irq(irq, wm831x_power);
638 643  
639   - irq = platform_get_irq_byname(pdev, "SYSLO");
  644 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "SYSLO"));
640 645 free_irq(irq, wm831x_power);
641 646  
642 647 if (wm831x_power->have_battery)
drivers/regulator/wm831x-dcdc.c
... ... @@ -565,7 +565,7 @@
565 565 goto err;
566 566 }
567 567  
568   - irq = platform_get_irq_byname(pdev, "UV");
  568 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
569 569 ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
570 570 IRQF_TRIGGER_RISING, dcdc->name, dcdc);
571 571 if (ret != 0) {
... ... @@ -574,7 +574,7 @@
574 574 goto err_regulator;
575 575 }
576 576  
577   - irq = platform_get_irq_byname(pdev, "HC");
  577 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC"));
578 578 ret = request_threaded_irq(irq, NULL, wm831x_dcdc_oc_irq,
579 579 IRQF_TRIGGER_RISING, dcdc->name, dcdc);
580 580 if (ret != 0) {
... ... @@ -588,7 +588,8 @@
588 588 return 0;
589 589  
590 590 err_uv:
591   - free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
  591 + free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
  592 + dcdc);
592 593 err_regulator:
593 594 regulator_unregister(dcdc->regulator);
594 595 err:
595 596  
... ... @@ -600,11 +601,14 @@
600 601 static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
601 602 {
602 603 struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  604 + struct wm831x *wm831x = dcdc->wm831x;
603 605  
604 606 platform_set_drvdata(pdev, NULL);
605 607  
606   - free_irq(platform_get_irq_byname(pdev, "HC"), dcdc);
607   - free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
  608 + free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC")),
  609 + dcdc);
  610 + free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
  611 + dcdc);
608 612 regulator_unregister(dcdc->regulator);
609 613 if (dcdc->dvs_gpio)
610 614 gpio_free(dcdc->dvs_gpio);
... ... @@ -758,7 +762,7 @@
758 762 goto err;
759 763 }
760 764  
761   - irq = platform_get_irq_byname(pdev, "UV");
  765 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
762 766 ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
763 767 IRQF_TRIGGER_RISING, dcdc->name, dcdc);
764 768 if (ret != 0) {
... ... @@ -783,7 +787,8 @@
783 787  
784 788 platform_set_drvdata(pdev, NULL);
785 789  
786   - free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
  790 + free_irq(wm831x_irq(dcdc->wm831x, platform_get_irq_byname(pdev, "UV")),
  791 + dcdc);
787 792 regulator_unregister(dcdc->regulator);
788 793  
789 794 return 0;
... ... @@ -883,7 +888,7 @@
883 888 goto err;
884 889 }
885 890  
886   - irq = platform_get_irq_byname(pdev, "UV");
  891 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
887 892 ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
888 893 IRQF_TRIGGER_RISING, dcdc->name,
889 894 dcdc);
... ... @@ -910,7 +915,8 @@
910 915  
911 916 platform_set_drvdata(pdev, NULL);
912 917  
913   - free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
  918 + free_irq(wm831x_irq(dcdc->wm831x, platform_get_irq_byname(pdev, "UV")),
  919 + dcdc);
914 920 regulator_unregister(dcdc->regulator);
915 921 kfree(dcdc);
916 922  
drivers/regulator/wm831x-isink.c
... ... @@ -198,7 +198,7 @@
198 198 goto err;
199 199 }
200 200  
201   - irq = platform_get_irq(pdev, 0);
  201 + irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));
202 202 ret = request_threaded_irq(irq, NULL, wm831x_isink_irq,
203 203 IRQF_TRIGGER_RISING, isink->name, isink);
204 204 if (ret != 0) {
... ... @@ -223,7 +223,7 @@
223 223  
224 224 platform_set_drvdata(pdev, NULL);
225 225  
226   - free_irq(platform_get_irq(pdev, 0), isink);
  226 + free_irq(wm831x_irq(isink->wm831x, platform_get_irq(pdev, 0)), isink);
227 227  
228 228 regulator_unregister(isink->regulator);
229 229  
drivers/regulator/wm831x-ldo.c
... ... @@ -359,7 +359,7 @@
359 359 goto err;
360 360 }
361 361  
362   - irq = platform_get_irq_byname(pdev, "UV");
  362 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
363 363 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
364 364 IRQF_TRIGGER_RISING, ldo->name,
365 365 ldo);
... ... @@ -385,7 +385,8 @@
385 385  
386 386 platform_set_drvdata(pdev, NULL);
387 387  
388   - free_irq(platform_get_irq_byname(pdev, "UV"), ldo);
  388 + free_irq(wm831x_irq(ldo->wm831x,
  389 + platform_get_irq_byname(pdev, "UV")), ldo);
389 390 regulator_unregister(ldo->regulator);
390 391  
391 392 return 0;
... ... @@ -624,7 +625,7 @@
624 625 goto err;
625 626 }
626 627  
627   - irq = platform_get_irq_byname(pdev, "UV");
  628 + irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
628 629 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
629 630 IRQF_TRIGGER_RISING, ldo->name, ldo);
630 631 if (ret != 0) {
... ... @@ -647,7 +648,8 @@
647 648 {
648 649 struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
649 650  
650   - free_irq(platform_get_irq_byname(pdev, "UV"), ldo);
  651 + free_irq(wm831x_irq(ldo->wm831x, platform_get_irq_byname(pdev, "UV")),
  652 + ldo);
651 653 regulator_unregister(ldo->regulator);
652 654  
653 655 return 0;
drivers/rtc/rtc-wm831x.c
... ... @@ -396,7 +396,7 @@
396 396 {
397 397 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
398 398 struct wm831x_rtc *wm831x_rtc;
399   - int alm_irq = platform_get_irq_byname(pdev, "ALM");
  399 + int alm_irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "ALM"));
400 400 int ret = 0;
401 401  
402 402 wm831x_rtc = devm_kzalloc(&pdev->dev, sizeof(*wm831x_rtc), GFP_KERNEL);
include/linux/mfd/wm831x/core.h
... ... @@ -17,6 +17,7 @@
17 17  
18 18 #include <linux/completion.h>
19 19 #include <linux/interrupt.h>
  20 +#include <linux/irqdomain.h>
20 21 #include <linux/list.h>
21 22 #include <linux/regmap.h>
22 23  
... ... @@ -338,6 +339,7 @@
338 339 #define WM831X_FLL_CLK_SRC_WIDTH 2 /* FLL_CLK_SRC - [1:0] */
339 340  
340 341 struct regulator_dev;
  342 +struct irq_domain;
341 343  
342 344 #define WM831X_NUM_IRQ_REGS 5
343 345 #define WM831X_NUM_GPIO_REGS 16
... ... @@ -367,7 +369,7 @@
367 369  
368 370 int irq; /* Our chip IRQ */
369 371 struct mutex irq_lock;
370   - int irq_base;
  372 + struct irq_domain *irq_domain;
371 373 int irq_masks_cur[WM831X_NUM_IRQ_REGS]; /* Currently active value */
372 374 int irq_masks_cache[WM831X_NUM_IRQ_REGS]; /* Cached hardware value */
373 375  
... ... @@ -416,6 +418,11 @@
416 418 int wm831x_irq_init(struct wm831x *wm831x, int irq);
417 419 void wm831x_irq_exit(struct wm831x *wm831x);
418 420 void wm831x_auxadc_init(struct wm831x *wm831x);
  421 +
  422 +static inline int wm831x_irq(struct wm831x *wm831x, int irq)
  423 +{
  424 + return irq_create_mapping(wm831x->irq_domain, irq);
  425 +}
419 426  
420 427 extern struct regmap_config wm831x_regmap_config;
421 428