From: Paul Fertser <fercerpav@gmail.com>
To: Samuel Ortiz <sameo@linux.intel.com>
Cc: linux-kernel@vger.kernel.org,
Nelson Castillo <arhuaco@freaks-unidos.net>,
Lars-Peter Clausen <lars@metafoo.de>,
Paul Fertser <fercerpav@gmail.com>
Subject: [PATCH 5/7] mfd: pcf50633: Cleanup pcf50633_probe error handling
Date: Wed, 14 Oct 2009 02:12:34 +0400 [thread overview]
Message-ID: <1255471956-29201-5-git-send-email-fercerpav@gmail.com> (raw)
In-Reply-To: <1255471956-29201-4-git-send-email-fercerpav@gmail.com>
From: Lars-Peter Clausen <lars@metafoo.de>
Currently the child devices were not freed if the irq could not be requested.
This patch restructures the function, that in case of an error all previously
allocated resources are freed.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
---
drivers/mfd/pcf50633-core.c | 47 +++++++++++++++++++++++++-----------------
1 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/drivers/mfd/pcf50633-core.c b/drivers/mfd/pcf50633-core.c
index 69cdbdc..2e7f903 100644
--- a/drivers/mfd/pcf50633-core.c
+++ b/drivers/mfd/pcf50633-core.c
@@ -553,9 +553,14 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
{
struct pcf50633 *pcf;
struct pcf50633_platform_data *pdata = client->dev.platform_data;
- int i, ret = 0;
+ int i, ret;
int version, variant;
+ if (!client->irq) {
+ dev_err(&client->dev, "Missing IRQ\n");
+ return -ENOENT;
+ }
+
pcf = kzalloc(sizeof(*pcf), GFP_KERNEL);
if (!pcf)
return -ENOMEM;
@@ -570,6 +575,12 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
pcf->irq = client->irq;
pcf->work_queue = create_singlethread_workqueue("pcf50633");
+ if (!pcf->work_queue) {
+ dev_err(&client->dev, "Failed to alloc workqueue\n");
+ ret = -ENOMEM;
+ goto err_free;
+ }
+
INIT_WORK(&pcf->irq_work, pcf50633_irq_worker);
version = pcf50633_reg_read(pcf, 0);
@@ -577,7 +588,7 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
if (version < 0 || variant < 0) {
dev_err(pcf->dev, "Unable to probe pcf50633\n");
ret = -ENODEV;
- goto err;
+ goto err_destroy_workqueue;
}
dev_info(pcf->dev, "Probed device version %d variant %d\n",
@@ -591,6 +602,14 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
pcf50633_reg_write(pcf, PCF50633_REG_INT4M, 0x00);
pcf50633_reg_write(pcf, PCF50633_REG_INT5M, 0x00);
+ ret = request_irq(client->irq, pcf50633_irq,
+ IRQF_TRIGGER_LOW, "pcf50633", pcf);
+
+ if (ret) {
+ dev_err(pcf->dev, "Failed to request IRQ %d\n", ret);
+ goto err_destroy_workqueue;
+ }
+
/* Create sub devices */
pcf50633_client_dev_register(pcf, "pcf50633-input",
&pcf->input_pdev);
@@ -606,7 +625,7 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
pdev = platform_device_alloc("pcf50633-regltr", i);
if (!pdev) {
- dev_err(pcf->dev, "Cannot create regulator\n");
+ dev_err(pcf->dev, "Cannot create regulator %d\n", i);
continue;
}
@@ -618,35 +637,25 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
platform_device_add(pdev);
}
- if (client->irq) {
- ret = request_irq(client->irq, pcf50633_irq,
- IRQF_TRIGGER_LOW, "pcf50633", pcf);
-
- if (ret) {
- dev_err(pcf->dev, "Failed to request IRQ %d\n", ret);
- goto err;
- }
- } else {
- dev_err(pcf->dev, "No IRQ configured\n");
- goto err;
- }
-
if (enable_irq_wake(client->irq) < 0)
- dev_err(pcf->dev, "IRQ %u cannot be enabled as wake-up source"
+ dev_info(pcf->dev, "IRQ %u cannot be enabled as wake-up source"
"in this hardware revision", client->irq);
ret = sysfs_create_group(&client->dev.kobj, &pcf_attr_group);
if (ret)
- dev_err(pcf->dev, "error creating sysfs entries\n");
+ dev_info(pcf->dev, "Failed to create sysfs entries\n");
if (pdata->probe_done)
pdata->probe_done(pcf);
return 0;
-err:
+err_destroy_workqueue:
destroy_workqueue(pcf->work_queue);
+err_free:
+ i2c_set_clientdata(client, NULL);
kfree(pcf);
+
return ret;
}
--
1.6.0.6
next prev parent reply other threads:[~2009-10-13 22:14 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-13 22:12 [PATCH 1/7] mfd: pcf50633 disable unnecessary shutdown on lowsys Paul Fertser
2009-10-13 22:12 ` [PATCH 2/7] mfd: pcf50633: make suspend/resume belong to i2c_driver Paul Fertser
2009-10-13 22:12 ` [PATCH 3/7] mfd: pcf50633: move messages to appropriate log levels Paul Fertser
2009-10-13 22:12 ` [PATCH 4/7] mfd: pcf50633: Fix memleak in pcf50633_client_dev_register Paul Fertser
2009-10-13 22:12 ` Paul Fertser [this message]
2009-10-13 22:12 ` [PATCH 6/7] mfd: pcf50633: Use platform_device_add_data to set regulator platform data Paul Fertser
2009-10-13 22:12 ` [PATCH 7/7] mfd: pcf50633: Fix pcf50633-regulator drvdata usage Paul Fertser
2009-10-19 15:08 ` [PATCH 5/7] mfd: pcf50633: Cleanup pcf50633_probe error handling Samuel Ortiz
2009-10-19 23:09 ` Paul Fertser
2009-10-20 9:23 ` Samuel Ortiz
2009-10-19 15:38 ` [PATCH 1/7] mfd: pcf50633 disable unnecessary shutdown on lowsys Samuel Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1255471956-29201-5-git-send-email-fercerpav@gmail.com \
--to=fercerpav@gmail.com \
--cc=arhuaco@freaks-unidos.net \
--cc=lars@metafoo.de \
--cc=linux-kernel@vger.kernel.org \
--cc=sameo@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®