aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorChris Blair <chris.blair@stericsson.com>2012-01-26 16:17:15 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2012-03-06 12:46:38 -0500
commit38040c858cbd4c06080e7d1e79e9ff4c74c33d2c (patch)
tree12d6a0ca7cf6cfbd2781c11d685e9aeb152c1d83 /drivers/gpio
parente31f9b826486c48f20e4f1066aa3e23e111c3a4e (diff)
gpio: Support no-irq stmpe mode
Adds support for boards which have an STMPE GPIO device without the interrupt pin connected. This means that no interrupt can be received but the GPIO pins can still be driven and read. Cc: Grant Likely <grant.likely@secretlab.ca> Acked-by: Viresh Kumar <viresh.kumar@st.com> Tested-by: Michel Jaouen <michel.jaouen@stericsson.com> Signed-off-by: Chris Blair <chris.blair@stericsson.com> Acked-by: Viresh Kumar <viresh.kumar@st.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-stmpe.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
index 87a68a896abf..094c5c4fd7f2 100644
--- a/drivers/gpio/gpio-stmpe.c
+++ b/drivers/gpio/gpio-stmpe.c
@@ -307,13 +307,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
307 struct stmpe_gpio_platform_data *pdata; 307 struct stmpe_gpio_platform_data *pdata;
308 struct stmpe_gpio *stmpe_gpio; 308 struct stmpe_gpio *stmpe_gpio;
309 int ret; 309 int ret;
310 int irq; 310 int irq = 0;
311 311
312 pdata = stmpe->pdata->gpio; 312 pdata = stmpe->pdata->gpio;
313 313
314 irq = platform_get_irq(pdev, 0); 314 irq = platform_get_irq(pdev, 0);
315 if (irq < 0)
316 return irq;
317 315
318 stmpe_gpio = kzalloc(sizeof(struct stmpe_gpio), GFP_KERNEL); 316 stmpe_gpio = kzalloc(sizeof(struct stmpe_gpio), GFP_KERNEL);
319 if (!stmpe_gpio) 317 if (!stmpe_gpio)
@@ -330,21 +328,28 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
330 stmpe_gpio->chip.dev = &pdev->dev; 328 stmpe_gpio->chip.dev = &pdev->dev;
331 stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1; 329 stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1;
332 330
333 stmpe_gpio->irq_base = stmpe->irq_base + STMPE_INT_GPIO(0); 331 if (irq >= 0)
332 stmpe_gpio->irq_base = stmpe->irq_base + STMPE_INT_GPIO(0);
333 else
334 dev_info(&pdev->dev,
335 "device configured in no-irq mode; "
336 "irqs are not available\n");
334 337
335 ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO); 338 ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO);
336 if (ret) 339 if (ret)
337 goto out_free; 340 goto out_free;
338 341
339 ret = stmpe_gpio_irq_init(stmpe_gpio); 342 if (irq >= 0) {
340 if (ret) 343 ret = stmpe_gpio_irq_init(stmpe_gpio);
341 goto out_disable; 344 if (ret)
345 goto out_disable;
342 346
343 ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT, 347 ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq,
344 "stmpe-gpio", stmpe_gpio); 348 IRQF_ONESHOT, "stmpe-gpio", stmpe_gpio);
345 if (ret) { 349 if (ret) {
346 dev_err(&pdev->dev, "unable to get irq: %d\n", ret); 350 dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
347 goto out_removeirq; 351 goto out_removeirq;
352 }
348 } 353 }
349 354
350 ret = gpiochip_add(&stmpe_gpio->chip); 355 ret = gpiochip_add(&stmpe_gpio->chip);
@@ -361,9 +366,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
361 return 0; 366 return 0;
362 367
363out_freeirq: 368out_freeirq:
364 free_irq(irq, stmpe_gpio); 369 if (irq >= 0)
370 free_irq(irq, stmpe_gpio);
365out_removeirq: 371out_removeirq:
366 stmpe_gpio_irq_remove(stmpe_gpio); 372 if (irq >= 0)
373 stmpe_gpio_irq_remove(stmpe_gpio);
367out_disable: 374out_disable:
368 stmpe_disable(stmpe, STMPE_BLOCK_GPIO); 375 stmpe_disable(stmpe, STMPE_BLOCK_GPIO);
369out_free: 376out_free:
@@ -391,8 +398,10 @@ static int __devexit stmpe_gpio_remove(struct platform_device *pdev)
391 398
392 stmpe_disable(stmpe, STMPE_BLOCK_GPIO); 399 stmpe_disable(stmpe, STMPE_BLOCK_GPIO);
393 400
394 free_irq(irq, stmpe_gpio); 401 if (irq >= 0) {
395 stmpe_gpio_irq_remove(stmpe_gpio); 402 free_irq(irq, stmpe_gpio);
403 stmpe_gpio_irq_remove(stmpe_gpio);
404 }
396 platform_set_drvdata(pdev, NULL); 405 platform_set_drvdata(pdev, NULL);
397 kfree(stmpe_gpio); 406 kfree(stmpe_gpio);
398 407