Skip to contentSkip to conversation

gpio: pca953x: fix error handling path in probe() call

PATCH Applied Mark Brown 2 participants 2 messages Mar 30, 2011 – Mar 31, 2011 GPIO

lore
Share & tools
lore

Mark Brown

author
#0 lore raw

PATCH 1/1 gpio: pca953x: fix error handling path in probe() call

From: Ben Dooks <[email protected]>

If the device fails to respond, then the error path tries to remove an interrupt that never got registered, which causes an backtrace from the interrupt handling code.

Fix this by ensuring that the cleanup path has two labels and use the correct path as needed.

fixes the following error:

WARNING: at kernel/irq/manage.c:908 __free_irq+0x80/0x160()

Trying to free already-free IRQ 0

---
 drivers/gpio/pca953x.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/gpio/pca953x.c +3 -2
index 583e925..7630ab7 100644
@@ -558,7 +558,7 @@ static int __devinit pca953x_probe(struct i2c_client *client,
 
 	ret = gpiochip_add(&chip->gpio_chip);
 	if (ret)
-		goto out_failed;
+		goto out_failed_irq;
 
 	if (pdata->setup) {
 		ret = pdata->setup(client, chip->gpio_chip.base,
@@ -570,8 +570,9 @@ static int __devinit pca953x_probe(struct i2c_client *client,
 	i2c_set_clientdata(client, chip);
 	return 0;
 
-out_failed:
+out_failed_irq:
 	pca953x_irq_teardown(chip);
+out_failed:
 	kfree(chip->dyn_pdata);
 	kfree(chip);
 	return ret;
Signature · 1 line
1.7.4.1
Applied
#1 lore raw
Quoted 9 lines · Mark Brown

From: Ben Dooks <[email protected]>

If the device fails to respond, then the error path tries to remove an interrupt that never got registered, which causes an backtrace from the interrupt handling code.

Fix this by ensuring that the cleanup path has two labels and use the correct path as needed.

Quoted 7 lines

fixes the following error:

WARNING: at kernel/irq/manage.c:908 __free_irq+0x80/0x160()

Trying to free already-free IRQ 0

Applied, thanks.

g.

Quoted 31 lines
---
 drivers/gpio/pca953x.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/gpio/pca953x.c +3 -2
index 583e925..7630ab7 100644
@@ -558,7 +558,7 @@ static int __devinit pca953x_probe(struct i2c_client *client,
 
 	ret = gpiochip_add(&chip->gpio_chip);
 	if (ret)
-		goto out_failed;
+		goto out_failed_irq;
 
 	if (pdata->setup) {
 		ret = pdata->setup(client, chip->gpio_chip.base,
@@ -570,8 +570,9 @@ static int __devinit pca953x_probe(struct i2c_client *client,
 	i2c_set_clientdata(client, chip);
 	return 0;
 
-out_failed:
+out_failed_irq:
 	pca953x_irq_teardown(chip);
+out_failed:
 	kfree(chip->dyn_pdata);
 	kfree(chip);
 	return ret;
Signature · 1 line
1.7.4.1