diff options
Diffstat (limited to 'drivers/gpio/stmpe-gpio.c')
-rw-r--r-- | drivers/gpio/stmpe-gpio.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpio/stmpe-gpio.c b/drivers/gpio/stmpe-gpio.c index 4e1f1b9d5e67..7c9e6a052c45 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 | ||
@@ -287,8 +291,6 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) | |||
287 | int irq; | 291 | int irq; |
288 | 292 | ||
289 | pdata = stmpe->pdata->gpio; | 293 | pdata = stmpe->pdata->gpio; |
290 | if (!pdata) | ||
291 | return -ENODEV; | ||
292 | 294 | ||
293 | irq = platform_get_irq(pdev, 0); | 295 | irq = platform_get_irq(pdev, 0); |
294 | if (irq < 0) | 296 | if (irq < 0) |
@@ -302,6 +304,7 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) | |||
302 | 304 | ||
303 | stmpe_gpio->dev = &pdev->dev; | 305 | stmpe_gpio->dev = &pdev->dev; |
304 | stmpe_gpio->stmpe = stmpe; | 306 | stmpe_gpio->stmpe = stmpe; |
307 | stmpe_gpio->norequest_mask = pdata ? pdata->norequest_mask : 0; | ||
305 | 308 | ||
306 | stmpe_gpio->chip = template_chip; | 309 | stmpe_gpio->chip = template_chip; |
307 | stmpe_gpio->chip.ngpio = stmpe->num_gpios; | 310 | stmpe_gpio->chip.ngpio = stmpe->num_gpios; |
@@ -312,11 +315,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev) | |||
312 | 315 | ||
313 | ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO); | 316 | ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO); |
314 | if (ret) | 317 | if (ret) |
315 | return ret; | 318 | goto out_free; |
316 | 319 | ||
317 | ret = stmpe_gpio_irq_init(stmpe_gpio); | 320 | ret = stmpe_gpio_irq_init(stmpe_gpio); |
318 | if (ret) | 321 | if (ret) |
319 | goto out_free; | 322 | goto out_disable; |
320 | 323 | ||
321 | ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT, | 324 | ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT, |
322 | "stmpe-gpio", stmpe_gpio); | 325 | "stmpe-gpio", stmpe_gpio); |
@@ -342,6 +345,8 @@ out_freeirq: | |||
342 | free_irq(irq, stmpe_gpio); | 345 | free_irq(irq, stmpe_gpio); |
343 | out_removeirq: | 346 | out_removeirq: |
344 | stmpe_gpio_irq_remove(stmpe_gpio); | 347 | stmpe_gpio_irq_remove(stmpe_gpio); |
348 | out_disable: | ||
349 | stmpe_disable(stmpe, STMPE_BLOCK_GPIO); | ||
345 | out_free: | 350 | out_free: |
346 | kfree(stmpe_gpio); | 351 | kfree(stmpe_gpio); |
347 | return ret; | 352 | return ret; |