aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/stmpe-gpio.c
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2010-08-16 11:14:44 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2010-10-28 18:28:43 -0400
commitb8e9cf0b28173fc25dae9f3ac44de6fc4e9fc385 (patch)
tree1164b9fab57ef5a81304efe48932c4a6db62049d /drivers/gpio/stmpe-gpio.c
parent8c96aefbe79becf940d27cd8ad2c5aba48322162 (diff)
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 <w.sang@pengutronix.de> Acked-by: Rabin Vincent <rabin.vincent@stericsson.com> Cc: Linus Walleij <linus.walleij@stericsson.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/gpio/stmpe-gpio.c')
-rw-r--r--drivers/gpio/stmpe-gpio.c5
1 files changed, 5 insertions, 0 deletions
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 {
30 struct mutex irq_lock; 30 struct mutex irq_lock;
31 31
32 int irq_base; 32 int irq_base;
33 unsigned norequest_mask;
33 34
34 /* Caches of interrupt control registers for bus_lock */ 35 /* Caches of interrupt control registers for bus_lock */
35 u8 regs[CACHE_NR_REGS][CACHE_NR_BANKS]; 36 u8 regs[CACHE_NR_REGS][CACHE_NR_BANKS];
@@ -103,6 +104,9 @@ static int stmpe_gpio_request(struct gpio_chip *chip, unsigned offset)
103 struct stmpe_gpio *stmpe_gpio = to_stmpe_gpio(chip); 104 struct stmpe_gpio *stmpe_gpio = to_stmpe_gpio(chip);
104 struct stmpe *stmpe = stmpe_gpio->stmpe; 105 struct stmpe *stmpe = stmpe_gpio->stmpe;
105 106
107 if (stmpe_gpio->norequest_mask & (1 << offset))
108 return -EINVAL;
109
106 return stmpe_set_altfunc(stmpe, 1 << offset, STMPE_BLOCK_GPIO); 110 return stmpe_set_altfunc(stmpe, 1 << offset, STMPE_BLOCK_GPIO);
107} 111}
108 112
@@ -302,6 +306,7 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
302 306
303 stmpe_gpio->dev = &pdev->dev; 307 stmpe_gpio->dev = &pdev->dev;
304 stmpe_gpio->stmpe = stmpe; 308 stmpe_gpio->stmpe = stmpe;
309 stmpe_gpio->norequest_mask = pdata ? pdata->norequest_mask : 0;
305 310
306 stmpe_gpio->chip = template_chip; 311 stmpe_gpio->chip = template_chip;
307 stmpe_gpio->chip.ngpio = stmpe->num_gpios; 312 stmpe_gpio->chip.ngpio = stmpe->num_gpios;