On 07/22/2017 06:22 AM, Marek Vasut wrote: > The command handling in this driver is awful, esp. because the driver > depends on command numbers to determine whether this is APPCMD or not. > Also, handling of command RSP response types is totally wrong. > > This patch at least plucks out some of the custom command encoding and > fixes the APPCMD handling. The RSP handling still needs work, yet that > might not be needed as it turns out the uniphier-sd.c driver is in much > better shape and supports the same IP, so we might be able to just drop > this driver in favor of the uniphier one. > > Signed-off-by: Marek Vasut <marek.vasut+rene...@gmail.com> > Cc: Hiroyuki Yokoyama <hiroyuki.yokoyama...@renesas.com> > Cc: Nobuhiro Iwamatsu <iwama...@nigauri.org> > Cc: Jaehoon Chung <jh80.ch...@samsung.com> > Reviewed-by: Nobuhiro Iwamatsu <iwama...@nigauri.org>
Applied to u-boot-mmc. Sorry for late! Best Regards, Jaehoon Chung > --- > arch/arm/mach-rmobile/include/mach/sh_sdhi.h | 5 -- > drivers/mmc/sh_sdhi.c | 103 > ++++++++++++++------------- > 2 files changed, 55 insertions(+), 53 deletions(-) > > diff --git a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h > b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h > index 1fb0648b12..00a135faa1 100644 > --- a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h > +++ b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h > @@ -49,11 +49,6 @@ > > /* SDHI CMD VALUE */ > #define CMD_MASK 0x0000ffff > -#define SDHI_APP 0x0040 > -#define SDHI_MMC_SEND_OP_COND 0x0701 > -#define SDHI_SD_APP_SEND_SCR 0x0073 > -#define SDHI_SD_SWITCH 0x1C06 > -#define SDHI_MMC_SEND_EXT_CSD 0x1C08 > > /* SDHI_PORTSEL */ > #define USE_1PORT (1 << 8) /* 1 port */ > diff --git a/drivers/mmc/sh_sdhi.c b/drivers/mmc/sh_sdhi.c > index fd710399b6..3c5616e507 100644 > --- a/drivers/mmc/sh_sdhi.c > +++ b/drivers/mmc/sh_sdhi.c > @@ -31,6 +31,7 @@ struct sh_sdhi_host { > unsigned char wait_int; > unsigned char sd_error; > unsigned char detect_waiting; > + unsigned char app_cmd; > }; > > static inline void sh_sdhi_writeq(struct sh_sdhi_host *host, int reg, u64 > val) > @@ -475,65 +476,64 @@ static void sh_sdhi_get_response(struct sh_sdhi_host > *host, struct mmc_cmd *cmd) > static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host, > struct mmc_data *data, unsigned short opc) > { > - switch (opc) { > - case SD_CMD_APP_SEND_OP_COND: > - case SD_CMD_APP_SEND_SCR: > - opc |= SDHI_APP; > - break; > - case SD_CMD_APP_SET_BUS_WIDTH: > - /* SD_APP_SET_BUS_WIDTH*/ > + if (host->app_cmd) { > if (!data) > - opc |= SDHI_APP; > - else /* SD_SWITCH */ > - opc = SDHI_SD_SWITCH; > - break; > - case MMC_CMD_SEND_OP_COND: > - opc = SDHI_MMC_SEND_OP_COND; > - break; > + host->app_cmd = 0; > + return opc | BIT(6); > + } > + > + switch (opc) { > + case MMC_CMD_SWITCH: > + return opc | (data ? 0x1c00 : 0x40); > case MMC_CMD_SEND_EXT_CSD: > - if (data) > - opc = SDHI_MMC_SEND_EXT_CSD; > - break; > + return opc | (data ? 0x1c00 : 0); > + case MMC_CMD_SEND_OP_COND: > + return opc | 0x0700; > + case MMC_CMD_APP_CMD: > + host->app_cmd = 1; > default: > - break; > + return opc; > } > - return opc; > } > > static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host, > struct mmc_data *data, unsigned short opc) > { > - unsigned short ret; > - > - switch (opc) { > - case MMC_CMD_READ_MULTIPLE_BLOCK: > - ret = sh_sdhi_multi_read(host, data); > - break; > - case MMC_CMD_WRITE_MULTIPLE_BLOCK: > - ret = sh_sdhi_multi_write(host, data); > - break; > - case MMC_CMD_WRITE_SINGLE_BLOCK: > - ret = sh_sdhi_single_write(host, data); > - break; > - case MMC_CMD_READ_SINGLE_BLOCK: > - case SDHI_SD_APP_SEND_SCR: > - case SDHI_SD_SWITCH: /* SD_SWITCH */ > - case SDHI_MMC_SEND_EXT_CSD: > - ret = sh_sdhi_single_read(host, data); > - break; > - default: > - printf(DRIVER_NAME": SD: NOT SUPPORT CMD = d'%04d\n", opc); > - ret = -EINVAL; > - break; > + if (host->app_cmd) { > + host->app_cmd = 0; > + switch (opc) { > + case SD_CMD_APP_SEND_SCR: > + case SD_CMD_APP_SD_STATUS: > + return sh_sdhi_single_read(host, data); > + default: > + printf(DRIVER_NAME": SD: NOT SUPPORT APP CMD = > d'%04d\n", > + opc); > + return -EINVAL; > + } > + } else { > + switch (opc) { > + case MMC_CMD_WRITE_MULTIPLE_BLOCK: > + return sh_sdhi_multi_write(host, data); > + case MMC_CMD_READ_MULTIPLE_BLOCK: > + return sh_sdhi_multi_read(host, data); > + case MMC_CMD_WRITE_SINGLE_BLOCK: > + return sh_sdhi_single_write(host, data); > + case MMC_CMD_READ_SINGLE_BLOCK: > + case MMC_CMD_SWITCH: > + case MMC_CMD_SEND_EXT_CSD:; > + return sh_sdhi_single_read(host, data); > + default: > + printf(DRIVER_NAME": SD: NOT SUPPORT CMD = d'%04d\n", > opc); > + return -EINVAL; > + } > } > - return ret; > } > > static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, > struct mmc_data *data, struct mmc_cmd *cmd) > { > long time; > - unsigned short opc = cmd->cmdidx; > + unsigned short shcmd, opc = cmd->cmdidx; > int ret = 0; > unsigned long timeout; > > @@ -561,7 +561,8 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, > } > sh_sdhi_writew(host, SDHI_SIZE, data->blocksize); > } > - opc = sh_sdhi_set_cmd(host, data, opc); > + > + shcmd = sh_sdhi_set_cmd(host, data, opc); > > /* > * U-Boot cannot use interrupt. > @@ -592,11 +593,12 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, > INFO2M_RESP_TIMEOUT | INFO2M_ILA) & > sh_sdhi_readw(host, SDHI_INFO2_MASK)); > > - sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(opc & CMD_MASK)); > - > + sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(shcmd & CMD_MASK)); > time = sh_sdhi_wait_interrupt_flag(host); > - if (!time) > + if (!time) { > + host->app_cmd = 0; > return sh_sdhi_error_manage(host); > + } > > if (host->sd_error) { > switch (cmd->cmdidx) { > @@ -614,15 +616,20 @@ static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, > } > host->sd_error = 0; > host->wait_int = 0; > + host->app_cmd = 0; > return ret; > } > - if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END) > + > + if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END) { > + host->app_cmd = 0; > return -EINVAL; > + } > > if (host->wait_int) { > sh_sdhi_get_response(host, cmd); > host->wait_int = 0; > } > + > if (data) > ret = sh_sdhi_data_trans(host, data, opc); > > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot