aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-core.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:08 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:08 +0000
commitc95790dd1ffef578b3e31d835e1352a863ce181a (patch)
treeee1261ef8d9051df936176928f1b19fb3d5618ac /drivers/mfd/glamo/glamo-core.c
parent0b258865193e8f207f8728cd021752e82b56f4fa (diff)
fix-glamo-probe-fail-bail.patch
Backout from failed probe was quite broken. Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers/mfd/glamo/glamo-core.c')
-rw-r--r--drivers/mfd/glamo/glamo-core.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
index e24759ef2e8..91c0148f124 100644
--- a/drivers/mfd/glamo/glamo-core.c
+++ b/drivers/mfd/glamo/glamo-core.c
@@ -1123,7 +1123,7 @@ static int __init glamo_probe(struct platform_device *pdev)
if (!glamo->mem || !glamo->pdata) {
dev_err(&pdev->dev, "platform device with no MEM/PDATA ?\n");
rc = -ENOENT;
- goto out_free;
+ goto bail_free;
}
init_resume_dependency_list(&glamo->resume_dependency);
@@ -1142,7 +1142,7 @@ static int __init glamo_probe(struct platform_device *pdev)
glamo->base = ioremap(glamo->mem->start, 0x4000 /*GLAMO_REGOFS_VIDCAP*/);
if (!glamo->base) {
dev_err(&pdev->dev, "failed to ioremap() memory region\n");
- goto out_free;
+ goto bail_free;
}
for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
@@ -1151,16 +1151,6 @@ static int __init glamo_probe(struct platform_device *pdev)
set_irq_flags(irq, IRQF_VALID);
}
- if (glamo->pdata->glamo_irq_is_wired &&
- !glamo->pdata->glamo_irq_is_wired()) {
- set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler);
- set_irq_type(glamo->irq, IRQT_FALLING);
- dev_info(&pdev->dev, "Glamo interrupt registered\n");
- glamo->irq_works = 1;
- } else {
- dev_err(&pdev->dev, "Glamo interrupt not used\n");
- glamo->irq_works = 0;
- }
/* bring MCI specific stuff over from our MFD platform data */
glamo_mci_def_pdata.glamo_set_mci_power =
glamo->pdata->glamo_set_mci_power;
@@ -1217,22 +1207,33 @@ static int __init glamo_probe(struct platform_device *pdev)
GLAMO_REGOFS_VIDCAP, "glamo-core");
if (!glamo->mem) {
dev_err(&pdev->dev, "failed to request memory region\n");
- goto out_free;
+ goto bail_iounmap;
}
if (!glamo_supported(glamo)) {
dev_err(&pdev->dev, "This Glamo is not supported\n");
- goto out_free;
+ goto bail_release_mem;
}
rc = sysfs_create_group(&pdev->dev.kobj, &glamo_attr_group);
if (rc < 0) {
dev_err(&pdev->dev, "cannot create sysfs group\n");
- goto out_free;
+ goto bail_release_mem;
}
platform_set_drvdata(pdev, glamo);
+ if (glamo->pdata->glamo_irq_is_wired &&
+ !glamo->pdata->glamo_irq_is_wired()) {
+ set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler);
+ set_irq_type(glamo->irq, IRQT_FALLING);
+ dev_info(&pdev->dev, "Glamo interrupt registered\n");
+ glamo->irq_works = 1;
+ } else {
+ dev_err(&pdev->dev, "Glamo interrupt not used\n");
+ glamo->irq_works = 0;
+ }
+
dev_dbg(&glamo->pdev->dev, "running init script\n");
glamo_run_script(glamo, glamo_init_script,
ARRAY_SIZE(glamo_init_script), 1);
@@ -1243,9 +1244,15 @@ static int __init glamo_probe(struct platform_device *pdev)
return 0;
-out_free:
+bail_release_mem:
+ release_mem_region(glamo->mem->start, GLAMO_REGOFS_VIDCAP);
+bail_iounmap:
+ iounmap(glamo->base);
+bail_free:
+ platform_set_drvdata(pdev, NULL);
glamo_handle = NULL;
kfree(glamo);
+
return rc;
}