From 79c998b34f432a512fbe5038697fad68e6662998 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 10 Oct 2009 20:37:42 +0200 Subject: glamo-mci: Reset if engine is stalled. --- drivers/mfd/glamo/glamo-mci.c | 45 ++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 22 deletions(-) (limited to 'drivers') diff --git a/drivers/mfd/glamo/glamo-mci.c b/drivers/mfd/glamo/glamo-mci.c index a173bbaaea3..948e380700c 100644 --- a/drivers/mfd/glamo/glamo-mci.c +++ b/drivers/mfd/glamo/glamo-mci.c @@ -140,6 +140,22 @@ static void glamo_reg_set_bit_mask(struct glamo_mci_host *glamo, glamo_reg_write(glamo, reg, tmp); } +static void glamo_mci_reset(struct glamo_mci_host *host) +{ + glamo_engine_reset(host->core, GLAMO_ENGINE_MMC); + + glamo_reg_write(host, GLAMO_REG_MMC_WDATADS1, + (uint16_t)(host->data_mem->start)); + glamo_reg_write(host, GLAMO_REG_MMC_WDATADS2, + (uint16_t)(host->data_mem->start >> 16)); + + glamo_reg_write(host, GLAMO_REG_MMC_RDATADS1, + (uint16_t)(host->data_mem->start)); + glamo_reg_write(host, GLAMO_REG_MMC_RDATADS2, + (uint16_t)(host->data_mem->start >> 16)); + +} + static void glamo_mci_clock_disable(struct glamo_mci_host *host) { if (host->clk_enabled) { @@ -229,8 +245,10 @@ static int glamo_mci_wait_idle(struct glamo_mci_host *host, status = glamo_reg_read(host, GLAMO_REG_MMC_RB_STAT1); } while (!(status & GLAMO_STAT1_MMC_IDLE) && jiffies < timeout); - if (jiffies >= timeout) + if (jiffies >= timeout) { + glamo_mci_reset(host); return -ETIMEDOUT; + } return 0; } @@ -880,17 +898,8 @@ static int glamo_mci_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mmc); glamo_engine_enable(host->core, GLAMO_ENGINE_MMC); - glamo_engine_reset(host->core, GLAMO_ENGINE_MMC); - - glamo_reg_write(host, GLAMO_REG_MMC_WDATADS1, - (uint16_t)(host->data_mem->start)); - glamo_reg_write(host, GLAMO_REG_MMC_WDATADS2, - (uint16_t)(host->data_mem->start >> 16)); - - glamo_reg_write(host, GLAMO_REG_MMC_RDATADS1, - (uint16_t)(host->data_mem->start)); - glamo_reg_write(host, GLAMO_REG_MMC_RDATADS2, - (uint16_t)(host->data_mem->start >> 16)); + glamo_mci_reset(host); + glamo_engine_disable(host->core, GLAMO_ENGINE_MMC); setup_timer(&host->disable_timer, glamo_mci_disable_timer, (unsigned long)host); @@ -970,18 +979,10 @@ static int glamo_mci_resume(struct device *dev) struct glamo_mci_host *host = mmc_priv(mmc); int ret; - glamo_engine_enable(host->core, GLAMO_ENGINE_MMC); - glamo_engine_reset(host->core, GLAMO_ENGINE_MMC); - glamo_reg_write(host, GLAMO_REG_MMC_WDATADS1, - (uint16_t)(host->data_mem->start)); - glamo_reg_write(host, GLAMO_REG_MMC_WDATADS2, - (uint16_t)(host->data_mem->start >> 16)); + glamo_engine_enable(host->core, GLAMO_ENGINE_MMC); + glamo_mci_reset(host); - glamo_reg_write(host, GLAMO_REG_MMC_RDATADS1, - (uint16_t)(host->data_mem->start)); - glamo_reg_write(host, GLAMO_REG_MMC_RDATADS2, - (uint16_t)(host->data_mem->start >> 16)); mdelay(5); ret = mmc_resume_host(host->mmc); -- cgit v1.2.3 From ad17897d779977ba1207726cc47e90654bffb332 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 10 Oct 2009 20:55:08 +0200 Subject: glamo-core: Properly initalize irq_base --- drivers/mfd/glamo/glamo-core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index d35d177ff5c..90a193fe21b 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -912,13 +912,20 @@ static int __devinit glamo_probe(struct platform_device *pdev) spin_lock_init(&glamo->lock); glamo->pdev = pdev; - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); glamo->irq = platform_get_irq(pdev, 0); + glamo->irq_base = platform_get_irq(pdev, 1); glamo->pdata = pdev->dev.platform_data; if (glamo->irq < 0) { + ret = glamo->irq; dev_err(&pdev->dev, "Failed to get platform irq: %d\n", ret); + goto err_free; + } + + if (glamo->irq_base < 0) { ret = glamo->irq; + dev_err(&pdev->dev, "Failed to get glamo irq base: %d\n", ret); goto err_free; } -- cgit v1.2.3 From 65b142d43c184f45f57876cbcb9b3d1c62027875 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 10 Oct 2009 22:07:23 +0200 Subject: glamo: Fix checkpatch issuses. --- drivers/mfd/glamo/glamo-core.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index 90a193fe21b..b15f0fc0974 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -901,7 +901,7 @@ static int __devinit glamo_supported(struct glamo_core *glamo) static int __devinit glamo_probe(struct platform_device *pdev) { - int ret = 0, irq; + int ret = 0, irq, irq_base; struct glamo_core *glamo; struct resource *mem; @@ -914,7 +914,7 @@ static int __devinit glamo_probe(struct platform_device *pdev) glamo->pdev = pdev; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); glamo->irq = platform_get_irq(pdev, 0); - glamo->irq_base = platform_get_irq(pdev, 1); + glamo->irq_base = irq_base = platform_get_irq(pdev, 1); glamo->pdata = pdev->dev.platform_data; if (glamo->irq < 0) { @@ -923,7 +923,7 @@ static int __devinit glamo_probe(struct platform_device *pdev) goto err_free; } - if (glamo->irq_base < 0) { + if (irq_base < 0) { ret = glamo->irq; dev_err(&pdev->dev, "Failed to get glamo irq base: %d\n", ret); goto err_free; @@ -980,8 +980,9 @@ static int __devinit glamo_probe(struct platform_device *pdev) /* * finally set the mfd interrupts up */ - for (irq = glamo->irq_base; irq < glamo->irq_base + GLAMO_NR_IRQS; ++irq) { - set_irq_chip_and_handler(irq, &glamo_irq_chip, handle_level_irq); + for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { + set_irq_chip_and_handler(irq, &glamo_irq_chip, + handle_level_irq); set_irq_flags(irq, IRQF_VALID); set_irq_chip_data(irq, glamo); } @@ -1010,7 +1011,7 @@ err_free_irqs: set_irq_chained_handler(glamo->irq, NULL); set_irq_chip_data(glamo->irq, NULL); - for (irq = glamo->irq_base; irq < glamo->irq_base + GLAMO_NR_IRQS; ++irq) { + for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { set_irq_flags(irq, 0); set_irq_chip(irq, NULL); set_irq_chip_data(irq, NULL); @@ -1030,6 +1031,7 @@ static int __devexit glamo_remove(struct platform_device *pdev) { struct glamo_core *glamo = platform_get_drvdata(pdev); int irq; + int irq_base = glamo->irq_base; mfd_remove_devices(&pdev->dev); @@ -1037,7 +1039,7 @@ static int __devexit glamo_remove(struct platform_device *pdev) set_irq_chained_handler(glamo->irq, NULL); set_irq_chip_data(glamo->irq, NULL); - for (irq = glamo->irq_base; irq < glamo->irq_base + GLAMO_NR_IRQS; ++irq) { + for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { set_irq_flags(irq, 0); set_irq_chip(irq, NULL); set_irq_chip_data(irq, NULL); -- cgit v1.2.3 From e4f3a9b77064267d5f15f0ed3054c61931410cf2 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 10 Oct 2009 22:38:36 +0200 Subject: glamo: Use set_irq_data instead of set_irq_chip_data for the demux handler Also fixup order in which the irq handler and it's data are initalized. --- drivers/mfd/glamo/glamo-core.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers') diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index b15f0fc0974..d70c27f5b64 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -310,7 +310,7 @@ static struct irq_chip glamo_irq_chip = { static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc) { - struct glamo_core *glamo = get_irq_desc_chip_data(desc); + struct glamo_core *glamo = get_irq_desc_data(desc); desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); if (unlikely(desc->status & IRQ_INPROGRESS)) { @@ -981,15 +981,15 @@ static int __devinit glamo_probe(struct platform_device *pdev) * finally set the mfd interrupts up */ for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { - set_irq_chip_and_handler(irq, &glamo_irq_chip, - handle_level_irq); set_irq_flags(irq, IRQF_VALID); set_irq_chip_data(irq, glamo); + set_irq_chip_and_handler(irq, &glamo_irq_chip, + handle_level_irq); } - set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler); set_irq_type(glamo->irq, IRQ_TYPE_EDGE_FALLING); - set_irq_chip_data(glamo->irq, glamo); + set_irq_data(glamo->irq, glamo); + set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler); glamo->irq_works = 1; ret = mfd_add_devices(&pdev->dev, pdev->id, glamo_cells, @@ -1012,8 +1012,8 @@ err_free_irqs: set_irq_chip_data(glamo->irq, NULL); for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { - set_irq_flags(irq, 0); set_irq_chip(irq, NULL); + set_irq_flags(irq, 0); set_irq_chip_data(irq, NULL); } err_iounmap: -- cgit v1.2.3 From dda793e722a5db08345dbf642c7590c7eb61ab67 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 10 Oct 2009 22:46:02 +0200 Subject: glamo-core: Use set_irq_flags on ARM only. set_irq_{no,}prove everywhere else Although there will probably never any other platform using the glamo... --- drivers/mfd/glamo/glamo-core.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'drivers') diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index d70c27f5b64..e0e39409595 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -981,7 +981,11 @@ static int __devinit glamo_probe(struct platform_device *pdev) * finally set the mfd interrupts up */ for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { +#ifdef CONFIG_ARM set_irq_flags(irq, IRQF_VALID); +#else + set_irq_noprobe(irq); +#endif set_irq_chip_data(irq, glamo); set_irq_chip_and_handler(irq, &glamo_irq_chip, handle_level_irq); @@ -1013,7 +1017,11 @@ err_free_irqs: for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { set_irq_chip(irq, NULL); +#ifdef CONFIG_ARM set_irq_flags(irq, 0); +#else + set_irq_probe(irq); +#endif set_irq_chip_data(irq, NULL); } err_iounmap: @@ -1040,7 +1048,11 @@ static int __devexit glamo_remove(struct platform_device *pdev) set_irq_chip_data(glamo->irq, NULL); for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) { +#ifdef CONFIG_ARM set_irq_flags(irq, 0); +#else + set_irq_noprobe(); +#endif set_irq_chip(irq, NULL); set_irq_chip_data(irq, NULL); } -- cgit v1.2.3