From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Tue, 17 Feb 2015 20:41:44 +0100 Subject: [U-Boot] [PATCH v2 1/4] mmc: fsl_esdhc: Add CMD11 support to switch to 1.8V In-Reply-To: <1424176966-24749-1-git-send-email-otavio@ossystems.com.br> References: <1424176966-24749-1-git-send-email-otavio@ossystems.com.br> Message-ID: <201502172041.44596.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Tuesday, February 17, 2015 at 01:42:43 PM, Otavio Salvador wrote: > This adds support to switch to 1.8V in case CMD11 succeeds. > > Signed-off-by: Otavio Salvador > --- > > Changes in v2: > - Fixed split string (Marek) > > drivers/mmc/fsl_esdhc.c | 29 ++++++++++++++++++++++------- > include/fsl_esdhc.h | 2 ++ > include/mmc.h | 1 + > 3 files changed, 25 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c > index c55eb28..6a3e147 100644 > --- a/drivers/mmc/fsl_esdhc.c > +++ b/drivers/mmc/fsl_esdhc.c > @@ -54,19 +54,21 @@ struct fsl_esdhc { > uint fevt; /* Force event register */ > uint admaes; /* ADMA error status register */ > uint adsaddr; /* ADMA system address register */ > - char reserved2[160]; /* reserved */ > + char reserved2[100]; /* reserved */ > + uint vendorspec; /* Vendor Specific register */ > + char reserved3[59]; /* reserved */ > uint hostver; /* Host controller version register */ > - char reserved3[4]; /* reserved */ > - uint dmaerraddr; /* DMA error address register */ > char reserved4[4]; /* reserved */ > - uint dmaerrattr; /* DMA error attribute register */ > + uint dmaerraddr; /* DMA error address register */ > char reserved5[4]; /* reserved */ > + uint dmaerrattr; /* DMA error attribute register */ > + char reserved6[4]; /* reserved */ > uint hostcapblt2; /* Host controller capabilities register 2 */ > - char reserved6[8]; /* reserved */ > + char reserved7[8]; /* reserved */ > uint tcr; /* Tuning control register */ > - char reserved7[28]; /* reserved */ > + char reserved8[28]; /* reserved */ > uint sddirctl; /* SD direction control register */ > - char reserved8[712]; /* reserved */ > + char reserved9[712]; /* reserved */ > uint scr; /* eSDHC control register */ > }; > > @@ -341,6 +343,15 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, > struct mmc_data *data) goto out; > } > > + /* Switch voltage to 1.8V if CMD11 succeeded */ > + if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V) { > + esdhc_setbits32(®s->vendorspec, ESDHC_VENDORSPEC_VSELECT); > + > + printf("Run CMD11 1.8V switch\n"); > + /* Sleep for 5 ms - max time for card to switch to 1.8V */ > + udelay(5000); > + } > + > /* Workaround for ESDHC errata ENGcm03648 */ > if (!data && (cmd->resp_type & MMC_RSP_BUSY)) { > int timeout = 2500; > @@ -413,6 +424,10 @@ out: > while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTD)) > ; This endless loop could use fixing ... anyone ? > } > + > + /* If this was CMD11, then notify that power cycle is needed */ > + if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V) > + printf("CMD11 to switch to 1.8V mode failed, card requires power > cycle.\n"); } > > esdhc_write32(®s->irqstat, -1); Reviewed-by: Marek Vasut