Enabling the MPC8xxx GPIO driver with MPC512x GPIO extension breaks touch screen support on this board since the GPIO interrupt will be mapped to 8xxx GPIO irq host resulting in a not requestable interrupt in the touch screen driver. Fix it by mapping the touch interrupt on 8xxx GPIO irq host.
Signed-off-by: Anatolij Gustschin <ag...@denx.de> --- arch/powerpc/platforms/512x/pdm360ng.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/platforms/512x/pdm360ng.c b/arch/powerpc/platforms/512x/pdm360ng.c index 0575e85..558eb9e 100644 --- a/arch/powerpc/platforms/512x/pdm360ng.c +++ b/arch/powerpc/platforms/512x/pdm360ng.c @@ -27,6 +27,7 @@ #include <linux/spi/ads7846.h> #include <linux/spi/spi.h> #include <linux/notifier.h> +#include <asm/gpio.h> static void *pdm360ng_gpio_base; @@ -50,7 +51,7 @@ static struct ads7846_platform_data pdm360ng_ads7846_pdata = { .irq_flags = IRQF_TRIGGER_LOW, }; -static int __init pdm360ng_penirq_init(void) +static int pdm360ng_penirq_init(void) { struct device_node *np; @@ -73,6 +74,9 @@ static int __init pdm360ng_penirq_init(void) return 0; } +#define GPIO_NR(x) (ARCH_NR_GPIOS - 32 + (x)) +#define PENDOWN_GPIO GPIO_NR(25) + static int pdm360ng_touchscreen_notifier_call(struct notifier_block *nb, unsigned long event, void *__dev) { @@ -80,7 +84,24 @@ static int pdm360ng_touchscreen_notifier_call(struct notifier_block *nb, if ((event == BUS_NOTIFY_ADD_DEVICE) && of_device_is_compatible(dev->of_node, "ti,ads7846")) { + struct spi_device *spi = to_spi_device(dev); + int gpio = PENDOWN_GPIO; + dev->platform_data = &pdm360ng_ads7846_pdata; + if (pdm360ng_penirq_init()) + return NOTIFY_DONE; + + if (gpio_request_one(gpio, GPIOF_IN, "ads7845_pen_down") < 0) { + pr_err("Failed to request GPIO %d for " + "ads7845 pen down IRQ\n", gpio); + return NOTIFY_DONE; + } + spi->irq = gpio_to_irq(gpio); + if (spi->irq < 0) { + pr_err("Can't map GPIO IRQ\n"); + gpio_free(gpio); + return NOTIFY_DONE; + } return NOTIFY_OK; } return NOTIFY_DONE; @@ -92,9 +113,6 @@ static struct notifier_block pdm360ng_touchscreen_nb = { static void __init pdm360ng_touchscreen_init(void) { - if (pdm360ng_penirq_init()) - return; - bus_register_notifier(&spi_bus_type, &pdm360ng_touchscreen_nb); } #else -- 1.7.0.4 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev