From 24c577fc94f076372542f03999612cebe4475268 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Wed, 19 Nov 2008 17:11:10 +0000 Subject: 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 --- drivers/mfd/glamo/glamo-core.c | 88 +++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 35 deletions(-) (limited to 'drivers/mfd/glamo/glamo-core.c') 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); -- cgit v1.2.3