On Thu, May 5, 2011 at 2:49 AM, Arindam Nath <arindam.nath@xxxxxxx> wrote: > eMMC chips do not use CMD11 when changing voltage. Add extra > argument to call to indicate if CMD11 needs to be sent. mmc_set_signal_voltage or start_signal_voltage_switch may not support emmc, not only cmd11, but also start_signal_voltage_switch is wrote according to sd phys spec. JESD84-A441 A8.1 describes how to support dual voltage of emmc, however it only support to 1.8v. Still not find emmc card which could support 1.2v. > > Signed-off-by: Philip Rakity <prakity@xxxxxxxxxxx> > Reviewed-by: Arindam Nath <arindam.nath@xxxxxxx> > --- > drivers/mmc/core/core.c | 4 ++-- > drivers/mmc/core/core.h | 3 ++- > drivers/mmc/core/sd.c | 4 ++-- > 3 files changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 78a9b51..74b4409 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -942,7 +942,7 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) > return ocr; > } > > -int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage) > +int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, int cmd11) > { > struct mmc_command cmd; > int err = 0; > @@ -953,7 +953,7 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage) > * Send CMD11 only if the request is to switch the card to > * 1.8V signalling. > */ > - if (signal_voltage == MMC_SIGNAL_VOLTAGE_180) { > + if ((signal_voltage != MMC_SIGNAL_VOLTAGE_330) && cmd11) { > memset(&cmd, 0, sizeof(struct mmc_command)); > > cmd.opcode = SD_SWITCH_VOLTAGE; > diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h > index 93f3397..3c11e17 100644 > --- a/drivers/mmc/core/core.h > +++ b/drivers/mmc/core/core.h > @@ -41,7 +41,8 @@ void mmc_set_bus_width(struct mmc_host *host, unsigned int width); > void mmc_set_bus_width_ddr(struct mmc_host *host, unsigned int width, > unsigned int ddr); > u32 mmc_select_voltage(struct mmc_host *host, u32 ocr); > -int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage); > +int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, > + int cmd11); > void mmc_set_timing(struct mmc_host *host, unsigned int timing); > void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type); > > diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c > index 851c8fc..d2a05ab 100644 > --- a/drivers/mmc/core/sd.c > +++ b/drivers/mmc/core/sd.c > @@ -731,7 +731,7 @@ try_again: > */ > if (!mmc_host_is_spi(host) && rocr && > ((*rocr & 0x41000000) == 0x41000000)) { > - err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180); > + err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180, 1); > if (err) { > ocr &= ~SD_OCR_S18R; > goto try_again; > @@ -1104,7 +1104,7 @@ int mmc_attach_sd(struct mmc_host *host) > WARN_ON(!host->claimed); > > /* Make sure we are at 3.3V signalling voltage */ > - err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330); > + err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); > if (err) > return err; > > -- > 1.7.1 > > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html