mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* Re: [PATCH 2/3] mci: imx-esdhc: add DSR support
  2014-01-10  9:29 ` [PATCH 2/3] mci: imx-esdhc: " Markus Niebel
@ 2014-01-10  9:25   ` Alexander Shiyan
  2014-01-10 10:23     ` Markus Niebel
  0 siblings, 1 reply; 9+ messages in thread
From: Alexander Shiyan @ 2014-01-10  9:25 UTC (permalink / raw)
  To: Markus Niebel; +Cc: barebox, Markus Niebel

Hello.

Пятница, 10 января 2014, 10:29 +01:00 от Markus Niebel <list-09_barebox@tqsc.de>:
> From: Markus Niebel <Markus.Niebel@tqs.de>
> 
> having DSR support in mci-core we need a way to
> forward the DSR value to the driver. Add it to
> platform data for imx-esdhc
...
> diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
> index 7664e7b..deb44b0 100644
> --- a/drivers/mci/imx-esdhc.c
> +++ b/drivers/mci/imx-esdhc.c
> @@ -582,6 +582,8 @@ static int fsl_esdhc_probe(struct device_d *dev)
>  	if (host->mci.f_min < 200000)
>  		host->mci.f_min = 200000;
>  	host->mci.f_max = rate;
> +	host->mci.use_dsr = pdata->use_dsr;
> +	host->mci.dsr_val = pdata->dsr_val;

What happen if device is probed from devicetree?

---
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [RFC] mci: add DSR support
@ 2014-01-10  9:29 Markus Niebel
  2014-01-10  9:29 ` [PATCH 1/3] " Markus Niebel
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Markus Niebel @ 2014-01-10  9:29 UTC (permalink / raw)
  To: barebox

This is an example to add DSR support to barebox. Why this feature is
considered as useful is described in the first patch. Second patch shows
how to pass values and third patch shows how this can be supported for
a board.

Tested with TQMa53 and a 4.41 Micron eMMC with DSR support.

[PATCH 1/3] mci: add DSR support
[PATCH 2/3] mci: imx-esdhc: add DSR support
[PATCH 3/3] boards: tqma53: add DSR support for eMMC

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] mci: add DSR support
  2014-01-10  9:29 [RFC] mci: add DSR support Markus Niebel
@ 2014-01-10  9:29 ` Markus Niebel
  2014-01-10 11:18   ` Sascha Hauer
  2014-01-10  9:29 ` [PATCH 2/3] mci: imx-esdhc: " Markus Niebel
  2014-01-10  9:29 ` [PATCH 3/3] boards: tqma53: add DSR support for eMMC Markus Niebel
  2 siblings, 1 reply; 9+ messages in thread
From: Markus Niebel @ 2014-01-10  9:29 UTC (permalink / raw)
  To: barebox; +Cc: Markus Niebel

From: Markus Niebel <Markus.Niebel@tqs.de>

The eMMC and the SD-Card specifications describe the optional SET_DSR command.
During measurements at our lab we found that some cards implementing this feature
having really strong driver strengts per default. This can lead to voltage peaks
above the specification of the host on signal edges for data sent from a card to
the host.

Since availability of a given card type may be shorter than the time a certain
hardware will be produced it is useful to have support for this command (Alternative
would be changing termination resistors and adapting the driver strength of the
host to the used card.)

Signed-off-by: Markus Niebel <Markus.Niebel@tqs.de>
---
 drivers/mci/mci-core.c |   27 +++++++++++++++++++++++++++
 include/mci.h          |    3 +++
 2 files changed, 30 insertions(+)

diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index a232679..2c91ff2 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -102,6 +102,20 @@ static void mci_setup_cmd(struct mci_cmd *p, unsigned cmd, unsigned arg, unsigne
 }
 
 /**
+ * configure optional DSR value
+ * @param mci_dev MCI instance
+ * @return Transaction status (0 on success)
+ */
+static int mci_set_dsr(struct mci *mci)
+{
+	struct mci_cmd cmd;
+
+	mci_setup_cmd(&cmd, MMC_CMD_SET_DSR,
+			(mci->host->dsr_val >> 16) | 0xffff, MMC_RSP_NONE);
+	return mci_send_cmd(mci, &cmd, NULL);
+}
+
+/**
  * Setup SD/MMC card's blocklength to be used for future transmitts
  * @param mci_dev MCI instance
  * @param len Blocklength in bytes
@@ -836,6 +850,15 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci)
 	dev_dbg(&mci->dev, "Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20));
 }
 
+/**
+ * Extract card's DSR implementation state from CSD
+ * @param mci MCI instance
+ */
+static void mci_extract_card_dsr_imp_from_csd(struct mci *mci)
+{
+	mci->dsr_imp = UNSTUFF_BITS(mci->csd, 76, 1);
+}
+
 static int mmc_compare_ext_csds(struct mci *mci, unsigned bus_width)
 {
 	u8 *bw_ext_csd;
@@ -1058,6 +1081,7 @@ static int mci_startup(struct mci *mci)
 	mci_detect_version_from_csd(mci);
 	mci_extract_max_tran_speed_from_csd(mci);
 	mci_extract_block_lengths_from_csd(mci);
+	mci_extract_card_dsr_imp_from_csd(mci);
 
 	/* sanitiy? */
 	if (mci->read_bl_len > SECTOR_SIZE) {
@@ -1074,6 +1098,9 @@ static int mci_startup(struct mci *mci)
 	dev_dbg(&mci->dev, "Read block length: %u, Write block length: %u\n",
 		mci->read_bl_len, mci->write_bl_len);
 
+	if (mci->dsr_imp && mci->host->use_dsr)
+		mci_set_dsr(mci);
+
 	if (!mmc_host_is_spi(host)) { /* cmd not supported in spi */
 		dev_dbg(&mci->dev, "Select the card, and put it into Transfer Mode\n");
 		/* Select the card, and put it into Transfer Mode */
diff --git a/include/mci.h b/include/mci.h
index 0f10e8a..d3a553e 100644
--- a/include/mci.h
+++ b/include/mci.h
@@ -294,6 +294,8 @@ struct mci_host {
 	unsigned clock;		/**< Current clock used to talk to the card */
 	unsigned bus_width;	/**< used data bus width to the card */
 	unsigned max_req_size;
+	unsigned dsr_val;	/**< optional dsr value */
+	int use_dsr;		/**< optional dsr usage flag */
 
 	/** init the host interface */
 	int (*init)(struct mci_host*, struct device_d*);
@@ -344,6 +346,7 @@ struct mci {
 	unsigned write_bl_len;
 	uint64_t capacity;	/**< Card's data capacity in bytes */
 	int ready_for_use;	/** true if already probed */
+	int dsr_imp;		/**< DSR implementation state from CSD */
 	char *ext_csd;
 	int probe;
 	struct param_d *param_probe;
-- 
1.7.9.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/3] mci: imx-esdhc: add DSR support
  2014-01-10  9:29 [RFC] mci: add DSR support Markus Niebel
  2014-01-10  9:29 ` [PATCH 1/3] " Markus Niebel
@ 2014-01-10  9:29 ` Markus Niebel
  2014-01-10  9:25   ` Alexander Shiyan
  2014-01-10  9:29 ` [PATCH 3/3] boards: tqma53: add DSR support for eMMC Markus Niebel
  2 siblings, 1 reply; 9+ messages in thread
From: Markus Niebel @ 2014-01-10  9:29 UTC (permalink / raw)
  To: barebox; +Cc: Markus Niebel

From: Markus Niebel <Markus.Niebel@tqs.de>

having DSR support in mci-core we need a way to
forward the DSR value to the driver. Add it to
platform data for imx-esdhc

TODO: implement the same for other host controller
drivers

Signed-off-by: Markus Niebel <Markus.Niebel@tqs.de>
---
 arch/arm/mach-imx/include/mach/esdhc.h |    2 ++
 drivers/mci/imx-esdhc.c                |    2 ++
 2 files changed, 4 insertions(+)

diff --git a/arch/arm/mach-imx/include/mach/esdhc.h b/arch/arm/mach-imx/include/mach/esdhc.h
index add1691..fb7380a 100644
--- a/arch/arm/mach-imx/include/mach/esdhc.h
+++ b/arch/arm/mach-imx/include/mach/esdhc.h
@@ -42,5 +42,7 @@ struct esdhc_platform_data {
 	enum cd_types cd_type;
 	unsigned caps;
 	char *devname;
+	unsigned dsr_val;
+	int use_dsr;
 };
 #endif /* __ASM_ARCH_IMX_ESDHC_H */
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 7664e7b..deb44b0 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -582,6 +582,8 @@ static int fsl_esdhc_probe(struct device_d *dev)
 	if (host->mci.f_min < 200000)
 		host->mci.f_min = 200000;
 	host->mci.f_max = rate;
+	host->mci.use_dsr = pdata->use_dsr;
+	host->mci.dsr_val = pdata->dsr_val;
 
 	mci_of_parse(&host->mci);
 
-- 
1.7.9.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/3] boards: tqma53: add DSR support for eMMC
  2014-01-10  9:29 [RFC] mci: add DSR support Markus Niebel
  2014-01-10  9:29 ` [PATCH 1/3] " Markus Niebel
  2014-01-10  9:29 ` [PATCH 2/3] mci: imx-esdhc: " Markus Niebel
@ 2014-01-10  9:29 ` Markus Niebel
  2 siblings, 0 replies; 9+ messages in thread
From: Markus Niebel @ 2014-01-10  9:29 UTC (permalink / raw)
  To: barebox; +Cc: Markus Niebel

From: Markus Niebel <Markus.Niebel@tqs.de>

all eMMC cards with DSR support used on different
revisions of TQMa53 needs the same DSR value.
just apply it.

Signed-off-by: Markus Niebel <Markus.Niebel@tqs.de>
---
 arch/arm/boards/tqma53/board.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/boards/tqma53/board.c b/arch/arm/boards/tqma53/board.c
index 9069f7c..cc98de9 100644
--- a/arch/arm/boards/tqma53/board.c
+++ b/arch/arm/boards/tqma53/board.c
@@ -39,6 +39,8 @@
 #include <mach/iim.h>
 #include <mach/imx5.h>
 
+#define TQMA53_EMMC_DSR 0x0100u
+
 static struct fec_platform_data fec_info = {
 	.xcv_type = PHY_INTERFACE_MODE_RMII,
 };
@@ -221,6 +223,8 @@ static struct esdhc_platform_data tqma53_sd3_data = {
 	.cd_type = ESDHC_CD_PERMANENT,
 	.wp_type = ESDHC_WP_NONE,
 	.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
+	.use_dsr = 1,
+	.dsr_val = TQMA53_EMMC_DSR,
 };
 
 static int tqma53_devices_init(void)
-- 
1.7.9.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] mci: imx-esdhc: add DSR support
  2014-01-10  9:25   ` Alexander Shiyan
@ 2014-01-10 10:23     ` Markus Niebel
  0 siblings, 0 replies; 9+ messages in thread
From: Markus Niebel @ 2014-01-10 10:23 UTC (permalink / raw)
  To: Alexander Shiyan; +Cc: barebox, Markus Niebel

Hello,
> Hello.
> 
> Пятница, 10 января 2014, 10:29 +01:00 от Markus Niebel <list-09_barebox@tqsc.de>:
>> From: Markus Niebel <Markus.Niebel@tqs.de>
>>
>> having DSR support in mci-core we need a way to
>> forward the DSR value to the driver. Add it to
>> platform data for imx-esdhc
> ...
>> diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
>> index 7664e7b..deb44b0 100644
>> --- a/drivers/mci/imx-esdhc.c
>> +++ b/drivers/mci/imx-esdhc.c
>> @@ -582,6 +582,8 @@ static int fsl_esdhc_probe(struct device_d *dev)
>>  	if (host->mci.f_min < 200000)
>>  		host->mci.f_min = 200000;
>>  	host->mci.f_max = rate;
>> +	host->mci.use_dsr = pdata->use_dsr;
>> +	host->mci.dsr_val = pdata->dsr_val;
> 
> What happen if device is probed from devicetree?
Thanks for pointing this out. 

As the cover says - just a RFC. We have working code for device tree under linux here.
My proposal is to pass the DSR value as an optional property to the host controller - 
then it could be parsed by mci_of_parse - but this needs to be in sync with the kernel.
Yes and the setting from pdata should be optional - since pdata is NULL in case of device tree.

Will collect comments and prepare a second round.

Markus
> 
> ---
> 


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] mci: add DSR support
  2014-01-10  9:29 ` [PATCH 1/3] " Markus Niebel
@ 2014-01-10 11:18   ` Sascha Hauer
  2014-01-10 11:56     ` Markus Niebel
  0 siblings, 1 reply; 9+ messages in thread
From: Sascha Hauer @ 2014-01-10 11:18 UTC (permalink / raw)
  To: Markus Niebel; +Cc: barebox, Markus Niebel

Hi Markus,

On Fri, Jan 10, 2014 at 10:29:49AM +0100, Markus Niebel wrote:
> From: Markus Niebel <Markus.Niebel@tqs.de>
> 
> The eMMC and the SD-Card specifications describe the optional SET_DSR command.
> During measurements at our lab we found that some cards implementing this feature
> having really strong driver strengts per default. This can lead to voltage peaks
> above the specification of the host on signal edges for data sent from a card to
> the host.
> 
> Since availability of a given card type may be shorter than the time a certain
> hardware will be produced it is useful to have support for this command (Alternative
> would be changing termination resistors and adapting the driver strength of the
> host to the used card.)

So not all cards support this command. Have you tested it with cards
that do not support it to make sure they still work? With eMMC you know
at board level whether or not this command is supported, but with SD
cards you don't.

Sascha

> 
> Signed-off-by: Markus Niebel <Markus.Niebel@tqs.de>
> ---
>  drivers/mci/mci-core.c |   27 +++++++++++++++++++++++++++
>  include/mci.h          |    3 +++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
> index a232679..2c91ff2 100644
> --- a/drivers/mci/mci-core.c
> +++ b/drivers/mci/mci-core.c
> @@ -102,6 +102,20 @@ static void mci_setup_cmd(struct mci_cmd *p, unsigned cmd, unsigned arg, unsigne
>  }
>  
>  /**
> + * configure optional DSR value
> + * @param mci_dev MCI instance
> + * @return Transaction status (0 on success)
> + */
> +static int mci_set_dsr(struct mci *mci)
> +{
> +	struct mci_cmd cmd;
> +
> +	mci_setup_cmd(&cmd, MMC_CMD_SET_DSR,
> +			(mci->host->dsr_val >> 16) | 0xffff, MMC_RSP_NONE);
> +	return mci_send_cmd(mci, &cmd, NULL);
> +}
> +
> +/**
>   * Setup SD/MMC card's blocklength to be used for future transmitts
>   * @param mci_dev MCI instance
>   * @param len Blocklength in bytes
> @@ -836,6 +850,15 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci)
>  	dev_dbg(&mci->dev, "Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20));
>  }
>  
> +/**
> + * Extract card's DSR implementation state from CSD
> + * @param mci MCI instance
> + */
> +static void mci_extract_card_dsr_imp_from_csd(struct mci *mci)
> +{
> +	mci->dsr_imp = UNSTUFF_BITS(mci->csd, 76, 1);
> +}
> +
>  static int mmc_compare_ext_csds(struct mci *mci, unsigned bus_width)
>  {
>  	u8 *bw_ext_csd;
> @@ -1058,6 +1081,7 @@ static int mci_startup(struct mci *mci)
>  	mci_detect_version_from_csd(mci);
>  	mci_extract_max_tran_speed_from_csd(mci);
>  	mci_extract_block_lengths_from_csd(mci);
> +	mci_extract_card_dsr_imp_from_csd(mci);
>  
>  	/* sanitiy? */
>  	if (mci->read_bl_len > SECTOR_SIZE) {
> @@ -1074,6 +1098,9 @@ static int mci_startup(struct mci *mci)
>  	dev_dbg(&mci->dev, "Read block length: %u, Write block length: %u\n",
>  		mci->read_bl_len, mci->write_bl_len);
>  
> +	if (mci->dsr_imp && mci->host->use_dsr)
> +		mci_set_dsr(mci);
> +
>  	if (!mmc_host_is_spi(host)) { /* cmd not supported in spi */
>  		dev_dbg(&mci->dev, "Select the card, and put it into Transfer Mode\n");
>  		/* Select the card, and put it into Transfer Mode */
> diff --git a/include/mci.h b/include/mci.h
> index 0f10e8a..d3a553e 100644
> --- a/include/mci.h
> +++ b/include/mci.h
> @@ -294,6 +294,8 @@ struct mci_host {
>  	unsigned clock;		/**< Current clock used to talk to the card */
>  	unsigned bus_width;	/**< used data bus width to the card */
>  	unsigned max_req_size;
> +	unsigned dsr_val;	/**< optional dsr value */
> +	int use_dsr;		/**< optional dsr usage flag */
>  
>  	/** init the host interface */
>  	int (*init)(struct mci_host*, struct device_d*);
> @@ -344,6 +346,7 @@ struct mci {
>  	unsigned write_bl_len;
>  	uint64_t capacity;	/**< Card's data capacity in bytes */
>  	int ready_for_use;	/** true if already probed */
> +	int dsr_imp;		/**< DSR implementation state from CSD */
>  	char *ext_csd;
>  	int probe;
>  	struct param_d *param_probe;
> -- 
> 1.7.9.5
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] mci: add DSR support
  2014-01-10 11:18   ` Sascha Hauer
@ 2014-01-10 11:56     ` Markus Niebel
  2014-01-13  8:19       ` Sascha Hauer
  0 siblings, 1 reply; 9+ messages in thread
From: Markus Niebel @ 2014-01-10 11:56 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Markus Niebel

Hello Sascha,
Am 10.01.2014 12:18, wrote Sascha Hauer:
> Hi Markus,
> 
> On Fri, Jan 10, 2014 at 10:29:49AM +0100, Markus Niebel wrote:
>> From: Markus Niebel <Markus.Niebel@tqs.de>
>>
>> The eMMC and the SD-Card specifications describe the optional SET_DSR command.
>> During measurements at our lab we found that some cards implementing this feature
>> having really strong driver strengts per default. This can lead to voltage peaks
>> above the specification of the host on signal edges for data sent from a card to
>> the host.
>>
>> Since availability of a given card type may be shorter than the time a certain
>> hardware will be produced it is useful to have support for this command (Alternative
>> would be changing termination resistors and adapting the driver strength of the
>> host to the used card.)
> 
> So not all cards support this command. Have you tested it with cards
> that do not support it to make sure they still work? With eMMC you know
> at board level whether or not this command is supported, but with SD
> cards you don't.
> 

No tests done with SD-cards (SD card spec states, that DSR can be implemented, 
but we found no card, that implements this feature).

On the eMMC side we did tests with TQMa53 (barebox and u-boot) and TQMa6 
(u-boot only) and also with i.MX28 based platform:

if a card does not support DSR - CMD4 is never sent
if a card supports DSR but board does not activate the feature - CMD4 is never sent
if a card supports DSR and board code requests the feature - CMD4 is sent with the
configured value.

Would it be a good idea to document the feature as intended for non removable cards
where the exact value is known?

> Sascha
> 
Markus
>>
>> Signed-off-by: Markus Niebel <Markus.Niebel@tqs.de>
>> ---
>>  drivers/mci/mci-core.c |   27 +++++++++++++++++++++++++++
>>  include/mci.h          |    3 +++
>>  2 files changed, 30 insertions(+)
>>
>> diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
>> index a232679..2c91ff2 100644
>> --- a/drivers/mci/mci-core.c
>> +++ b/drivers/mci/mci-core.c
>> @@ -102,6 +102,20 @@ static void mci_setup_cmd(struct mci_cmd *p, unsigned cmd, unsigned arg, unsigne
>>  }
>>  
>>  /**
>> + * configure optional DSR value
>> + * @param mci_dev MCI instance
>> + * @return Transaction status (0 on success)
>> + */
>> +static int mci_set_dsr(struct mci *mci)
>> +{
>> +	struct mci_cmd cmd;
>> +
>> +	mci_setup_cmd(&cmd, MMC_CMD_SET_DSR,
>> +			(mci->host->dsr_val >> 16) | 0xffff, MMC_RSP_NONE);
>> +	return mci_send_cmd(mci, &cmd, NULL);
>> +}
>> +
>> +/**
>>   * Setup SD/MMC card's blocklength to be used for future transmitts
>>   * @param mci_dev MCI instance
>>   * @param len Blocklength in bytes
>> @@ -836,6 +850,15 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci)
>>  	dev_dbg(&mci->dev, "Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20));
>>  }
>>  
>> +/**
>> + * Extract card's DSR implementation state from CSD
>> + * @param mci MCI instance
>> + */
>> +static void mci_extract_card_dsr_imp_from_csd(struct mci *mci)
>> +{
>> +	mci->dsr_imp = UNSTUFF_BITS(mci->csd, 76, 1);
>> +}
>> +
>>  static int mmc_compare_ext_csds(struct mci *mci, unsigned bus_width)
>>  {
>>  	u8 *bw_ext_csd;
>> @@ -1058,6 +1081,7 @@ static int mci_startup(struct mci *mci)
>>  	mci_detect_version_from_csd(mci);
>>  	mci_extract_max_tran_speed_from_csd(mci);
>>  	mci_extract_block_lengths_from_csd(mci);
>> +	mci_extract_card_dsr_imp_from_csd(mci);
>>  
>>  	/* sanitiy? */
>>  	if (mci->read_bl_len > SECTOR_SIZE) {
>> @@ -1074,6 +1098,9 @@ static int mci_startup(struct mci *mci)
>>  	dev_dbg(&mci->dev, "Read block length: %u, Write block length: %u\n",
>>  		mci->read_bl_len, mci->write_bl_len);
>>  
>> +	if (mci->dsr_imp && mci->host->use_dsr)
>> +		mci_set_dsr(mci);
>> +
>>  	if (!mmc_host_is_spi(host)) { /* cmd not supported in spi */
>>  		dev_dbg(&mci->dev, "Select the card, and put it into Transfer Mode\n");
>>  		/* Select the card, and put it into Transfer Mode */
>> diff --git a/include/mci.h b/include/mci.h
>> index 0f10e8a..d3a553e 100644
>> --- a/include/mci.h
>> +++ b/include/mci.h
>> @@ -294,6 +294,8 @@ struct mci_host {
>>  	unsigned clock;		/**< Current clock used to talk to the card */
>>  	unsigned bus_width;	/**< used data bus width to the card */
>>  	unsigned max_req_size;
>> +	unsigned dsr_val;	/**< optional dsr value */
>> +	int use_dsr;		/**< optional dsr usage flag */
>>  
>>  	/** init the host interface */
>>  	int (*init)(struct mci_host*, struct device_d*);
>> @@ -344,6 +346,7 @@ struct mci {
>>  	unsigned write_bl_len;
>>  	uint64_t capacity;	/**< Card's data capacity in bytes */
>>  	int ready_for_use;	/** true if already probed */
>> +	int dsr_imp;		/**< DSR implementation state from CSD */
>>  	char *ext_csd;
>>  	int probe;
>>  	struct param_d *param_probe;
>> -- 
>> 1.7.9.5
>>
>>
> 


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] mci: add DSR support
  2014-01-10 11:56     ` Markus Niebel
@ 2014-01-13  8:19       ` Sascha Hauer
  0 siblings, 0 replies; 9+ messages in thread
From: Sascha Hauer @ 2014-01-13  8:19 UTC (permalink / raw)
  To: Markus Niebel; +Cc: barebox, Markus Niebel

On Fri, Jan 10, 2014 at 12:56:59PM +0100, Markus Niebel wrote:
> Hello Sascha,
> Am 10.01.2014 12:18, wrote Sascha Hauer:
> > Hi Markus,
> > 
> > On Fri, Jan 10, 2014 at 10:29:49AM +0100, Markus Niebel wrote:
> >> From: Markus Niebel <Markus.Niebel@tqs.de>
> >>
> >> The eMMC and the SD-Card specifications describe the optional SET_DSR command.
> >> During measurements at our lab we found that some cards implementing this feature
> >> having really strong driver strengts per default. This can lead to voltage peaks
> >> above the specification of the host on signal edges for data sent from a card to
> >> the host.
> >>
> >> Since availability of a given card type may be shorter than the time a certain
> >> hardware will be produced it is useful to have support for this command (Alternative
> >> would be changing termination resistors and adapting the driver strength of the
> >> host to the used card.)
> > 
> > So not all cards support this command. Have you tested it with cards
> > that do not support it to make sure they still work? With eMMC you know
> > at board level whether or not this command is supported, but with SD
> > cards you don't.
> > 
> 
> No tests done with SD-cards (SD card spec states, that DSR can be implemented, 
> but we found no card, that implements this feature).
> 
> On the eMMC side we did tests with TQMa53 (barebox and u-boot) and TQMa6 
> (u-boot only) and also with i.MX28 based platform:
> 
> if a card does not support DSR - CMD4 is never sent
> if a card supports DSR but board does not activate the feature - CMD4 is never sent
> if a card supports DSR and board code requests the feature - CMD4 is sent with the
> configured value.
> 
> Would it be a good idea to document the feature as intended for non removable cards
> where the exact value is known?

My only concern was that this feature might be enabled on slots where
cards are used that do not support the DSR feature and do not work
anymore. As this doesn't seem to be the case I'm fine with your patch.
Adding devicetree support is a good idea though as Alexander mentioned.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-01-13  8:19 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-10  9:29 [RFC] mci: add DSR support Markus Niebel
2014-01-10  9:29 ` [PATCH 1/3] " Markus Niebel
2014-01-10 11:18   ` Sascha Hauer
2014-01-10 11:56     ` Markus Niebel
2014-01-13  8:19       ` Sascha Hauer
2014-01-10  9:29 ` [PATCH 2/3] mci: imx-esdhc: " Markus Niebel
2014-01-10  9:25   ` Alexander Shiyan
2014-01-10 10:23     ` Markus Niebel
2014-01-10  9:29 ` [PATCH 3/3] boards: tqma53: add DSR support for eMMC Markus Niebel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox