[PATCH] powerpc/5121: pdm360ng: fix touch irq if 8xxx gpio driver is enabled

Grant Likely grant.likely at secretlab.ca
Thu Sep 16 12:38:23 EST 2010


On Wed, Sep 15, 2010 at 10:12:57PM +0200, Anatolij Gustschin wrote:
> 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.

This looks wrong to me.  The touchscreen code should not go mucking
about in the GPIO controller registers; that is the job of the gpio
driver.  What is the reason that the touch interrupt isn't
requestable?  It looks like the 8xxx gpio driver is designed to hand
out a separate virq number for each gpio pin (I've not had time to dig
into details, so you'll need to educate me on the problem details)

g.

> 
> Signed-off-by: Anatolij Gustschin <agust at 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
> 


More information about the Linuxppc-dev mailing list