Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a8a43c4 authored by Sonic Zhang's avatar Sonic Zhang Committed by Chris Ball
Browse files

mmc: bfin_sdh: Reset SD controller when resume from power saving mode.



Without reset, SD controller may stay in disable mode, SD card can't
be detected when resume from power saving mode.

Signed-off-by: default avatarSonic Zhang <sonic.zhang@analog.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent c5e4a2e4
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -505,6 +505,23 @@ static irqreturn_t sdh_stat_irq(int irq, void *devid)
	return IRQ_RETVAL(handled);
}

static void sdh_reset(void)
{
#if defined(CONFIG_BF54x)
	/* Secure Digital Host shares DMA with Nand controller */
	bfin_write_DMAC1_PERIMUX(bfin_read_DMAC1_PERIMUX() | 0x1);
#endif

	bfin_write_SDH_CFG(bfin_read_SDH_CFG() | CLKS_EN);
	SSYNC();

	/* Disable card inserting detection pin. set MMC_CAP_NEEDS_POLL, and
	 * mmc stack will do the detection.
	 */
	bfin_write_SDH_CFG((bfin_read_SDH_CFG() & 0x1F) | (PUP_SDDAT | PUP_SDDAT3));
	SSYNC();
}

static int __devinit sdh_probe(struct platform_device *pdev)
{
	struct mmc_host *mmc;
@@ -581,19 +598,8 @@ static int __devinit sdh_probe(struct platform_device *pdev)
		dev_err(&pdev->dev, "unable to request peripheral pins\n");
		goto out4;
	}
#if defined(CONFIG_BF54x)
	/* Secure Digital Host shares DMA with Nand controller */
	bfin_write_DMAC1_PERIMUX(bfin_read_DMAC1_PERIMUX() | 0x1);
#endif

	bfin_write_SDH_CFG(bfin_read_SDH_CFG() | CLKS_EN);
	SSYNC();

	/* Disable card inserting detection pin. set MMC_CAP_NEEDS_POLL, and
	 * mmc stack will do the detection.
	 */
	bfin_write_SDH_CFG((bfin_read_SDH_CFG() & 0x1F) | (PUP_SDDAT | PUP_SDDAT3));
	SSYNC();
	sdh_reset();

	mmc_add_host(mmc);
	return 0;
@@ -660,10 +666,7 @@ static int sdh_resume(struct platform_device *dev)
		return ret;
	}

#if defined(CONFIG_BF54x)
	/* Secure Digital Host shares DMA with Nand controller */
	bfin_write_DMAC1_PERIMUX(bfin_read_DMAC1_PERIMUX() | 0x1);
#endif
	sdh_reset();

	if (mmc)
		ret = mmc_resume_host(mmc);