RE: [PATCH] mmc: Add support for eMMC Dual Data Rate

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Philip,


> -----Original Message-----
> From: Philip Rakity [mailto:prakity@xxxxxxxxxxx]
> Sent: Saturday, April 23, 2011 1:57 AM
> To: linux-mmc@xxxxxxxxxxxxxxx
> Cc: Nath, Arindam
> Subject: [PATCH] mmc: Add support for eMMC Dual Data Rate
> 
> 
> eMMC voltage change not required for 1.8V.  3.3V and 1.8V vcc
> are capable of doing DDR. vccq of 1.8v is not required.
> 
> Signed-off-by: Philip Rakity <prakity@xxxxxxxxxxx>
> ---
>  drivers/mmc/core/core.c  |   14 ++------------
>  drivers/mmc/core/core.h  |    2 --
>  drivers/mmc/core/mmc.c   |   33 ++++++++++++++++++++++++++++-----
>  include/linux/mmc/host.h |    1 +
>  4 files changed, 31 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 91ab31f..69df00c 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -720,22 +720,12 @@ void mmc_set_bus_mode(struct mmc_host *host,
> unsigned int mode)
>  }
> 
>  /*
> - * Change data bus width and DDR mode of a host.
> - */
> -void mmc_set_bus_width_ddr(struct mmc_host *host, unsigned int width,
> -			   unsigned int ddr)
> -{
> -	host->ios.bus_width = width;
> -	host->ios.ddr = ddr;
> -	mmc_set_ios(host);
> -}
> -
> -/*
>   * Change data bus width of a host.
>   */
>  void mmc_set_bus_width(struct mmc_host *host, unsigned int width)
>  {
> -	mmc_set_bus_width_ddr(host, width, MMC_SDR_MODE);
> +	host->ios.bus_width = width;
> +	mmc_set_ios(host);
>  }
> 
>  /**
> diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
> index 6114ca5..c5d0e8b 100644
> --- a/drivers/mmc/core/core.h
> +++ b/drivers/mmc/core/core.h
> @@ -38,8 +38,6 @@ void mmc_ungate_clock(struct mmc_host *host);
>  void mmc_set_ungated(struct mmc_host *host);
>  void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
>  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);
>  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/mmc.c b/drivers/mmc/core/mmc.c
> index ba1c878..f4b675b 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -20,6 +20,7 @@
>  #include "core.h"
>  #include "bus.h"
>  #include "mmc_ops.h"
> +#include "sd_ops.h"
> 
>  static const unsigned int tran_exp[] = {
>  	10000,		100000,		1000000,	10000000,
> @@ -633,10 +634,12 @@ static int mmc_init_card(struct mmc_host *host,
> u32 ocr,
>  	 */
>  	if (mmc_card_highspeed(card)) {
>  		if ((card->ext_csd.card_type & EXT_CSD_CARD_TYPE_DDR_1_8V)
> -			&& (host->caps & (MMC_CAP_1_8V_DDR)))
> +			&& ((host->caps & (MMC_CAP_1_8V_DDR |
> MMC_CAP_UHS_DDR50))
> +				== (MMC_CAP_1_8V_DDR | MMC_CAP_UHS_DDR50)))
>  				ddr = MMC_1_8V_DDR_MODE;
>  		else if ((card->ext_csd.card_type &
> EXT_CSD_CARD_TYPE_DDR_1_2V)
> -			&& (host->caps & (MMC_CAP_1_2V_DDR)))
> +			&& ((host->caps & (MMC_CAP_1_2V_DDR |
> MMC_CAP_UHS_DDR50))
> +				== (MMC_CAP_1_2V_DDR | MMC_CAP_UHS_DDR50)))
>  				ddr = MMC_1_2V_DDR_MODE;
>  	}
> 
> @@ -670,8 +673,7 @@ static int mmc_init_card(struct mmc_host *host, u32
> ocr,
>  					 ext_csd_bits[idx][0],
>  					 0);
>  			if (!err) {
> -				mmc_set_bus_width_ddr(card->host,
> -						      bus_width, MMC_SDR_MODE);
> +				mmc_set_bus_width(card->host, bus_width);
>  				/*
>  				 * If controller can't handle bus width test,
>  				 * use the highest bus width to maintain
> @@ -697,8 +699,29 @@ static int mmc_init_card(struct mmc_host *host,
> u32 ocr,
>  				1 << bus_width, ddr);
>  			goto free_card;
>  		} else if (ddr) {
> +			/*
> +			 * eMMC cards can support 3.3V to 1.2V i/o (vccq)
> +			 * signaling.
> +			 *
> +			 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V
> vccq.
> +			 *
> +			 * 1.8V vccq at 3.3V core voltage (vcc) is not
> required
> +			 * in the JEDEC spec for DDR.
> +			 *
> +			 * Do not force change in vccq since we are obviously
> +			 * working and no change to vccq is needed.
> +			 *
> +			 * WARNING: eMMC rules are NOT the same as SD DDR
> +			 */
> +			if (ddr == EXT_CSD_CARD_TYPE_DDR_1_2V) {
> +				err = mmc_set_signal_voltage(host,
> +					MMC_SIGNAL_VOLTAGE_120, 0);

Will this call really have any effect? *cmd11* argument is 0, so CMD11 won't be sent in this case. Also since there is no handler in my sdhci_start_signal_voltage_switch() for MMC_SIGNAL_VOLTAGE_120, the function will simply return 0.

Thanks,
Arindam


--
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


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux