diff options
Diffstat (limited to 'drivers/gpio/gpio-stmpe.c')
| -rw-r--r-- | drivers/gpio/gpio-stmpe.c | 41 | 
1 files changed, 25 insertions, 16 deletions
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c index 87a68a896ab..094c5c4fd7f 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)  	struct stmpe_gpio_platform_data *pdata;  	struct stmpe_gpio *stmpe_gpio;  	int ret; -	int irq; +	int irq = 0;  	pdata = stmpe->pdata->gpio;  	irq = platform_get_irq(pdev, 0); -	if (irq < 0) -		return irq;  	stmpe_gpio = kzalloc(sizeof(struct stmpe_gpio), GFP_KERNEL);  	if (!stmpe_gpio) @@ -330,21 +328,28 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)  	stmpe_gpio->chip.dev = &pdev->dev;  	stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1; -	stmpe_gpio->irq_base = stmpe->irq_base + STMPE_INT_GPIO(0); +	if (irq >= 0) +		stmpe_gpio->irq_base = stmpe->irq_base + STMPE_INT_GPIO(0); +	else +		dev_info(&pdev->dev, +			"device configured in no-irq mode; " +			"irqs are not available\n");  	ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO);  	if (ret)  		goto out_free; -	ret = stmpe_gpio_irq_init(stmpe_gpio); -	if (ret) -		goto out_disable; +	if (irq >= 0) { +		ret = stmpe_gpio_irq_init(stmpe_gpio); +		if (ret) +			goto out_disable; -	ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT, -				   "stmpe-gpio", stmpe_gpio); -	if (ret) { -		dev_err(&pdev->dev, "unable to get irq: %d\n", ret); -		goto out_removeirq; +		ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, +				IRQF_ONESHOT, "stmpe-gpio", stmpe_gpio); +		if (ret) { +			dev_err(&pdev->dev, "unable to get irq: %d\n", ret); +			goto out_removeirq; +		}  	}  	ret = gpiochip_add(&stmpe_gpio->chip); @@ -361,9 +366,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)  	return 0;  out_freeirq: -	free_irq(irq, stmpe_gpio); +	if (irq >= 0) +		free_irq(irq, stmpe_gpio);  out_removeirq: -	stmpe_gpio_irq_remove(stmpe_gpio); +	if (irq >= 0) +		stmpe_gpio_irq_remove(stmpe_gpio);  out_disable:  	stmpe_disable(stmpe, STMPE_BLOCK_GPIO);  out_free: @@ -391,8 +398,10 @@ static int __devexit stmpe_gpio_remove(struct platform_device *pdev)  	stmpe_disable(stmpe, STMPE_BLOCK_GPIO); -	free_irq(irq, stmpe_gpio); -	stmpe_gpio_irq_remove(stmpe_gpio); +	if (irq >= 0) { +		free_irq(irq, stmpe_gpio); +		stmpe_gpio_irq_remove(stmpe_gpio); +	}  	platform_set_drvdata(pdev, NULL);  	kfree(stmpe_gpio);  |