From b8e9cf0b28173fc25dae9f3ac44de6fc4e9fc385 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Mon, 16 Aug 2010 17:14:44 +0200 Subject: gpio: Add bitmask to block requests to unavailable stmpe GPIOs GPIOs on these controller are multi-functional. If you decided to use some of them e.g. as input channels for the ADC, you surely don't want those pins to be reassigned as simple GPIOs (which may be triggered even from userspace via 'export'). Same for the touchscreen controller pins. Since knowledge about the hardware is needed to decide which GPIOs to reserve, let this bitmask be inside platform_data and provide some defines to assist potential users. Signed-off-by: Wolfram Sang Acked-by: Rabin Vincent Cc: Linus Walleij Signed-off-by: Samuel Ortiz --- drivers/gpio/stmpe-gpio.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'drivers/gpio/stmpe-gpio.c') diff --git a/drivers/gpio/stmpe-gpio.c b/drivers/gpio/stmpe-gpio.c index 4e1f1b9d5e67..65b996083918 100644 --- a/drivers/gpio/stmpe-gpio.c +++ b/drivers/gpio/stmpe-gpio.c @@ -30,6 +30,7 @@ struct stmpe_gpio { struct mutex irq_lock; int irq_base; + unsigned norequest_mask; /* Caches of interrupt control registers for bus_lock */ u8 regs[CACHE_NR_REGS][CACHE_NR_BANKS]; @@ -103,6 +104,9 @@ static int stmpe_gpio_request(struct gpio_chip *chip, unsigned offset) struct stmpe_gpio *stmpe_gpio = to_stmpe_gpio(chip); struct stmpe *stmpe = stmpe_gpio->stmpe; + if (stmpe_gpio->norequest_mask & (1 << offset)) + return -EINVAL; + return stmpe_set_altfunc(stmpe, 1 << offset, STMPE_BLOCK_GPIO); } @@ -302,6 +306,7 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) stmpe_gpio->dev = &pdev->dev; stmpe_gpio->stmpe = stmpe; + stmpe_gpio->norequest_mask = pdata ? pdata->norequest_mask : 0; stmpe_gpio->chip = template_chip; stmpe_gpio->chip.ngpio = stmpe->num_gpios; -- cgit v1.2.2 From f4ebcab36088d45a5e8889e9b63d77e01c808076 Mon Sep 17 00:00:00 2001 From: Virupax Sadashivpetimath Date: Tue, 31 Aug 2010 10:04:56 +0530 Subject: gpio: Handle stmpe-gpio platform data with no gpio base This patch removes the requirement that gpio base be supplied in platform data. Signed-off-by: Virupax Sadashivpetimath Acked-by: Linus Walleij Acked-by: Wolfram Sang Signed-off-by: Samuel Ortiz --- drivers/gpio/stmpe-gpio.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'drivers/gpio/stmpe-gpio.c') diff --git a/drivers/gpio/stmpe-gpio.c b/drivers/gpio/stmpe-gpio.c index 65b996083918..932759db1ac2 100644 --- a/drivers/gpio/stmpe-gpio.c +++ b/drivers/gpio/stmpe-gpio.c @@ -291,8 +291,6 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) int irq; pdata = stmpe->pdata->gpio; - if (!pdata) - return -ENODEV; irq = platform_get_irq(pdev, 0); if (irq < 0) -- cgit v1.2.2 From 02bf07492341d94e29890082201dd69dbf406570 Mon Sep 17 00:00:00 2001 From: Vasiliy Kulikov Date: Sun, 12 Sep 2010 22:57:19 +0400 Subject: gpio: Fix stmpe error path Free allocated memory. Call stmpe_disable() if it was enabled. Signed-off-by: Vasiliy Kulikov Acked-by: Wolfram Sang Acked-by: Rabin Vincent Signed-off-by: Samuel Ortiz --- drivers/gpio/stmpe-gpio.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'drivers/gpio/stmpe-gpio.c') diff --git a/drivers/gpio/stmpe-gpio.c b/drivers/gpio/stmpe-gpio.c index 932759db1ac2..7c9e6a052c45 100644 --- a/drivers/gpio/stmpe-gpio.c +++ b/drivers/gpio/stmpe-gpio.c @@ -315,11 +315,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO); if (ret) - return ret; + goto out_free; ret = stmpe_gpio_irq_init(stmpe_gpio); if (ret) - goto out_free; + goto out_disable; ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT, "stmpe-gpio", stmpe_gpio); @@ -345,6 +345,8 @@ out_freeirq: free_irq(irq, stmpe_gpio); out_removeirq: stmpe_gpio_irq_remove(stmpe_gpio); +out_disable: + stmpe_disable(stmpe, STMPE_BLOCK_GPIO); out_free: kfree(stmpe_gpio); return ret; -- cgit v1.2.2