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 <ota...@ossystems.com.br> > --- > > 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 <ma...@denx.de> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot