aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-core.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:10 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:10 +0000
commit24c577fc94f076372542f03999612cebe4475268 (patch)
tree07c9c980ca294785489b67814e090dafd1aade94 /drivers/mfd/glamo/glamo-core.c
parent4df5166222fe1cef9afaaecd541c4340a0a7409b (diff)
fix-glamo-reparenting-panic-sd-boot.patch
We panic on SD boot now we changed Glamo order, because it didn't succeed to bring up mmcblk0p1. But, if you do loglevel=8 then it works OK. So we are racing with something... 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.c88
1 files changed, 53 insertions, 35 deletions
diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
index 91c0148f124..498ac42c6e0 100644
--- a/drivers/mfd/glamo/glamo-core.c
+++ b/drivers/mfd/glamo/glamo-core.c
@@ -1007,7 +1007,7 @@ static int glamo_supported(struct glamo_core *glamo)
return 0;
}
- dev_info(&glamo->pdev->dev, "Detected Glamo core %04x Revision %04x "
+ dev_dbg(&glamo->pdev->dev, "Detected Glamo core %04x Revision %04x "
"(%uHz CPU / %uHz Memory)\n", dev_id, rev_id,
glamo_pll_rate(glamo, GLAMO_PLL1),
glamo_pll_rate(glamo, GLAMO_PLL2));
@@ -1145,12 +1145,54 @@ static int __init glamo_probe(struct platform_device *pdev)
goto bail_free;
}
+ platform_set_drvdata(pdev, glamo);
+
+/*
+ * finally set the mfd interrupts up
+ * can't do them earlier or sibling probes blow up
+ */
+
for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
set_irq_chip(irq, &glamo_irq_chip);
set_irq_handler(irq, handle_level_irq);
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;
+ }
+
+
+ /* confirm it isn't insane version */
+ if (!glamo_supported(glamo)) {
+ dev_err(&pdev->dev, "This Glamo is not supported\n");
+ goto bail_irq;
+ }
+
+ /* sysfs */
+ rc = sysfs_create_group(&pdev->dev.kobj, &glamo_attr_group);
+ if (rc < 0) {
+ dev_err(&pdev->dev, "cannot create sysfs group\n");
+ goto bail_irq;
+ }
+
+ /* init the chip with canned register set */
+
+ dev_dbg(&glamo->pdev->dev, "running init script\n");
+ glamo_run_script(glamo, glamo_init_script,
+ ARRAY_SIZE(glamo_init_script), 1);
+
+ dev_info(&glamo->pdev->dev, "Glamo core PLL1: %uHz, PLL2: %uHz\n",
+ glamo_pll_rate(glamo, GLAMO_PLL1),
+ glamo_pll_rate(glamo, GLAMO_PLL2));
+
/* bring MCI specific stuff over from our MFD platform data */
glamo_mci_def_pdata.glamo_set_mci_power =
glamo->pdata->glamo_set_mci_power;
@@ -1163,6 +1205,8 @@ static int __init glamo_probe(struct platform_device *pdev)
glamo_mci_def_pdata.mci_all_dependencies_resumed =
glamo->pdata->mci_all_dependencies_resumed;
+ /* start creating the siblings */
+
glamo_2d_dev.dev.parent = &pdev->dev;
mangle_mem_resources(glamo_2d_dev.resource,
glamo_2d_dev.num_resources, glamo->mem);
@@ -1207,46 +1251,20 @@ 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 bail_iounmap;
+ goto bail_irq;
}
- if (!glamo_supported(glamo)) {
- dev_err(&pdev->dev, "This Glamo is not supported\n");
- 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 bail_release_mem;
- }
+ return 0;
- platform_set_drvdata(pdev, glamo);
+bail_irq:
+ disable_irq(glamo->irq);
+ set_irq_chained_handler(glamo->irq, NULL);
- 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;
+ for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
+ set_irq_flags(irq, 0);
+ set_irq_chip(irq, NULL);
}
- dev_dbg(&glamo->pdev->dev, "running init script\n");
- glamo_run_script(glamo, glamo_init_script,
- ARRAY_SIZE(glamo_init_script), 1);
-
- dev_info(&glamo->pdev->dev, "Glamo core now %uHz CPU / %uHz Memory)\n",
- glamo_pll_rate(glamo, GLAMO_PLL1),
- glamo_pll_rate(glamo, GLAMO_PLL2));
-
- return 0;
-
-bail_release_mem:
- release_mem_region(glamo->mem->start, GLAMO_REGOFS_VIDCAP);
-bail_iounmap:
iounmap(glamo->base);
bail_free:
platform_set_drvdata(pdev, NULL);