aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2013-10-03 00:39:40 -0400
committerTony Lindgren <tony@atomide.com>2013-10-10 18:30:47 -0400
commitdc7743aa3c49fabbc6dc9edbcf7df74d776ac32e (patch)
tree1b1d6a7f26fd1d899c5ee043bc255fdb4e8f7ddb
parent3e6cee1786a13cb2308609b5f8c020e1754e37cf (diff)
pinctrl: single: Add support for auxdata
For omaps, we still have dependencies to the legacy code for handling the PRM (Power Reset Management) interrupts, and also for reconfiguring the io wake-up chain after changes. Let's pass the PRM interrupt and the rearm functions via auxdata. Then when at some point we have a proper PRM driver, we can get the interrupt via device tree and set up the rearm function as exported function in the PRM driver. By using auxdata we can remove a dependency to the wake-up events for converting omap3 to be device tree only. Cc: Peter Ujfalusi <peter.ujfalusi@ti.com> Cc: Grygorii Strashko <grygorii.strashko@ti.com> Cc: Prakash Manjunathappa <prakash.pm@ti.com> Cc: Roger Quadros <rogerq@ti.com> Cc: Haojian Zhuang <haojian.zhuang@gmail.com> Cc: linux-kernel@vger.kernel.org Reviewed-by: Kevin Hilman <khilman@linaro.org> Tested-by: Kevin Hilman <khilman@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--drivers/pinctrl/pinctrl-single.c23
-rw-r--r--include/linux/platform_data/pinctrl-single.h12
2 files changed, 35 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index dad65df36f4b..c2aada71c915 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -28,6 +28,8 @@
28#include <linux/pinctrl/pinmux.h> 28#include <linux/pinctrl/pinmux.h>
29#include <linux/pinctrl/pinconf-generic.h> 29#include <linux/pinctrl/pinconf-generic.h>
30 30
31#include <linux/platform_data/pinctrl-single.h>
32
31#include "core.h" 33#include "core.h"
32#include "pinconf.h" 34#include "pinconf.h"
33 35
@@ -159,12 +161,14 @@ struct pcs_name {
159 * @irq: optional interrupt for the controller 161 * @irq: optional interrupt for the controller
160 * @irq_enable_mask: optional SoC specific interrupt enable mask 162 * @irq_enable_mask: optional SoC specific interrupt enable mask
161 * @irq_status_mask: optional SoC specific interrupt status mask 163 * @irq_status_mask: optional SoC specific interrupt status mask
164 * @rearm: optional SoC specific wake-up rearm function
162 */ 165 */
163struct pcs_soc_data { 166struct pcs_soc_data {
164 unsigned flags; 167 unsigned flags;
165 int irq; 168 int irq;
166 unsigned irq_enable_mask; 169 unsigned irq_enable_mask;
167 unsigned irq_status_mask; 170 unsigned irq_status_mask;
171 void (*rearm)(void);
168}; 172};
169 173
170/** 174/**
@@ -1622,6 +1626,8 @@ static void pcs_irq_unmask(struct irq_data *d)
1622 struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d); 1626 struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
1623 1627
1624 pcs_irq_set(pcs_soc, d->irq, true); 1628 pcs_irq_set(pcs_soc, d->irq, true);
1629 if (pcs_soc->rearm)
1630 pcs_soc->rearm();
1625} 1631}
1626 1632
1627/** 1633/**
@@ -1672,6 +1678,11 @@ static int pcs_irq_handle(struct pcs_soc_data *pcs_soc)
1672 } 1678 }
1673 } 1679 }
1674 1680
1681 /*
1682 * For debugging on omaps, you may want to call pcs_soc->rearm()
1683 * here to see wake-up interrupts during runtime also.
1684 */
1685
1675 return count; 1686 return count;
1676} 1687}
1677 1688
@@ -1835,6 +1846,7 @@ static int pcs_probe(struct platform_device *pdev)
1835{ 1846{
1836 struct device_node *np = pdev->dev.of_node; 1847 struct device_node *np = pdev->dev.of_node;
1837 const struct of_device_id *match; 1848 const struct of_device_id *match;
1849 struct pcs_pdata *pdata;
1838 struct resource *res; 1850 struct resource *res;
1839 struct pcs_device *pcs; 1851 struct pcs_device *pcs;
1840 const struct pcs_soc_data *soc; 1852 const struct pcs_soc_data *soc;
@@ -1949,6 +1961,17 @@ static int pcs_probe(struct platform_device *pdev)
1949 if (pcs->socdata.irq) 1961 if (pcs->socdata.irq)
1950 pcs->flags |= PCS_FEAT_IRQ; 1962 pcs->flags |= PCS_FEAT_IRQ;
1951 1963
1964 /* We still need auxdata for some omaps for PRM interrupts */
1965 pdata = dev_get_platdata(&pdev->dev);
1966 if (pdata) {
1967 if (pdata->rearm)
1968 pcs->socdata.rearm = pdata->rearm;
1969 if (pdata->irq) {
1970 pcs->socdata.irq = pdata->irq;
1971 pcs->flags |= PCS_FEAT_IRQ;
1972 }
1973 }
1974
1952 if (PCS_HAS_IRQ) { 1975 if (PCS_HAS_IRQ) {
1953 ret = pcs_irq_init_chained_handler(pcs, np); 1976 ret = pcs_irq_init_chained_handler(pcs, np);
1954 if (ret < 0) 1977 if (ret < 0)
diff --git a/include/linux/platform_data/pinctrl-single.h b/include/linux/platform_data/pinctrl-single.h
new file mode 100644
index 000000000000..72eacda9b360
--- /dev/null
+++ b/include/linux/platform_data/pinctrl-single.h
@@ -0,0 +1,12 @@
1/**
2 * irq: optional wake-up interrupt
3 * rearm: optional soc specific rearm function
4 *
5 * Note that the irq and rearm setup should come from device
6 * tree except for omap where there are still some dependencies
7 * to the legacy PRM code.
8 */
9struct pcs_pdata {
10 int irq;
11 void (*rearm)(void);
12};