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

Commit 6b98757e authored by Shinobu Uehara's avatar Shinobu Uehara Committed by Ulf Hansson
Browse files

mmc: tmio: add TMIO_MMC_SDIO_STATUS_QUIRK



Renesas R-Car SDHI should set reserved bits
on CTL_SDIO_STATUS register when writing.
This patch adds new TMIO_MMC_SDIO_STATUS_QUIRK flags
for this purpose

[Kuninori Morimoto: tidyuped for upstreaming
                    enabled this flags for all SH-Mobile/R-Car]

Tested-by: default avatarNguyen Xuan Nui <nx-nui@jinso.co.jp>
Tested-by: default avatarHiep Cao Minh <cm-hiep@jinso.co.jp>
Signed-off-by: default avatarShinobu Uehara <shinobu.uehara.xc@renesas.com>
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent b8d11962
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -230,6 +230,11 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
	 */
	 */
	mmc_data->flags |= TMIO_MMC_HAVE_CMD12_CTRL;
	mmc_data->flags |= TMIO_MMC_HAVE_CMD12_CTRL;


	/*
	 * All SDHI need SDIO_INFO1 reserved bit
	 */
	mmc_data->flags |= TMIO_MMC_SDIO_STATUS_QUIRK;

	if (of_id && of_id->data) {
	if (of_id && of_id->data) {
		const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
		const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
		mmc_data->flags |= of_data->tmio_flags;
		mmc_data->flags |= of_data->tmio_flags;
+6 −1
Original line number Original line Diff line number Diff line
@@ -665,6 +665,7 @@ irqreturn_t tmio_mmc_sdio_irq(int irq, void *devid)
	struct mmc_host *mmc = host->mmc;
	struct mmc_host *mmc = host->mmc;
	struct tmio_mmc_data *pdata = host->pdata;
	struct tmio_mmc_data *pdata = host->pdata;
	unsigned int ireg, status;
	unsigned int ireg, status;
	unsigned int sdio_status;


	if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
	if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
		return IRQ_HANDLED;
		return IRQ_HANDLED;
@@ -672,7 +673,11 @@ irqreturn_t tmio_mmc_sdio_irq(int irq, void *devid)
	status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
	status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
	ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask;
	ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask;


	sd_ctrl_write16(host, CTL_SDIO_STATUS, status & ~TMIO_SDIO_MASK_ALL);
	sdio_status = status & ~TMIO_SDIO_MASK_ALL;
	if (pdata->flags & TMIO_MMC_SDIO_STATUS_QUIRK)
		sdio_status |= 6;

	sd_ctrl_write16(host, CTL_SDIO_STATUS, sdio_status);


	if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
	if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
		mmc_signal_sdio_irq(mmc);
		mmc_signal_sdio_irq(mmc);
+5 −0
Original line number Original line Diff line number Diff line
@@ -89,6 +89,11 @@
 */
 */
#define TMIO_MMC_HAVE_CMD12_CTRL	(1 << 7)
#define TMIO_MMC_HAVE_CMD12_CTRL	(1 << 7)


/*
 * Some controllers needs to set 1 on SDIO status reserved bits
 */
#define TMIO_MMC_SDIO_STATUS_QUIRK	(1 << 8)

int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);