[V5,00/10] mmc: add support for sdhci 4.0

Message ID 1534406064-10065-1-git-send-email-zhang.chunyan@linaro.org
Headers show
Series
  • mmc: add support for sdhci 4.0
Related show

Message

Chunyan Zhang Aug. 16, 2018, 7:54 a.m.
From the SD host controller version 4.0 on, SDHCI implementation either
is version 3 compatible or version 4 mode. This patch-set covers those
changes which are common for SDHCI 4.0 version, regardless of whether
they are used with SD or eMMC storage devices.

This patchset also added a new sdhci driver for Spreadtrum's controller
which supports v4.0 mode.

This patchset has been tested on Spreadtrum's mobile phone, emmc can be
initialized, mounted, read and written, with these changes for common
sdhci framework and sdhci-sprd driver.

Changes from V4:
* Addressed Adrian's comments:
- Enable v4 mode in __sdhci_read_caps() and sdhci_init() instead of sdhci_do_reset();
- Move the added member 'v4_mode' to following with other bools;
- Add more comments in the added function sdhci_config_dma();
- Instead of enabling auto-CMD23 in init, enabled it only if receiving sbc from
  cards and the argument is suitable for host to deal with;
- Make the addition of the SDHCI_SPEC_4xx defines a separate patch;
- Disable auto-CMD23 if stuff bits is set in the argument of CMD23 in sdhci_request().

* For V4 mode, SDMA also can use auto-CMD23, adjusted host->flags in sdhci_setup_host().

Previous patch series:
v4: https://lkml.org/lkml/2018/7/23/269
v3: https://lkml.org/lkml/2018/7/8/239
v2: https://lkml.org/lkml/2018/6/14/936
v1: https://lkml.org/lkml/2018/6/8/108

Chunyan Zhang (10):
  mmc: sdhci: Add version V4 definition
  mmc: sdhci: Add sd host v4 mode
  mmc: sdhci: Change SDMA address register for v4 mode
  mmc: sdhci: Add ADMA2 64-bit addressing support for V4 mode
  mmc: sdhci: Add 32-bit block count support for v4 mode
  mmc: sdhci: Disable auto-CMD23 if stuff bits is set in CMD23 argument
  mmc: sdhci: Add Auto CMD Auto Select support
  mmc: sdhci: SDMA may use Auto-CMD23 in v4 mode
  mmc: sdhci-sprd: Add Spreadtrum's initial host controller
  dt-bindings: sdhci-sprd: Add bindings for the sdhci-sprd controller

 .../devicetree/bindings/mmc/sdhci-sprd.txt         |  41 ++
 drivers/mmc/host/Kconfig                           |  13 +
 drivers/mmc/host/Makefile                          |   1 +
 drivers/mmc/host/sdhci-sprd.c                      | 464 +++++++++++++++++++++
 drivers/mmc/host/sdhci.c                           | 251 ++++++++---
 drivers/mmc/host/sdhci.h                           |  22 +-
 6 files changed, 741 insertions(+), 51 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/sdhci-sprd.txt
 create mode 100644 drivers/mmc/host/sdhci-sprd.c

-- 
2.7.4

Comments

Adrian Hunter Aug. 23, 2018, 12:48 p.m. | #1
On 16/08/18 10:54, Chunyan Zhang wrote:
> Host Controller Version 4.10 re-defines SDMA System Address register

> as 32-bit Block Count for v4 mode, and SDMA uses ADMA System

> Address register (05Fh-058h) instead if v4 mode is enabled. Also

> when using 32-bit block count, 16-bit block count register need

> to be set to zero.

> 

> Signed-off-by: Chunyan Zhang <zhang.chunyan@linaro.org>

> ---

>  drivers/mmc/host/sdhci.c | 14 +++++++++++++-

>  drivers/mmc/host/sdhci.h |  1 +

>  2 files changed, 14 insertions(+), 1 deletion(-)

> 

> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c

> index 1dea1c4..b3328ee 100644

> --- a/drivers/mmc/host/sdhci.c

> +++ b/drivers/mmc/host/sdhci.c

> @@ -1073,7 +1073,19 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)

>  	/* Set the DMA boundary value and block size */

>  	sdhci_writew(host, SDHCI_MAKE_BLKSZ(host->sdma_boundary, data->blksz),

>  		     SDHCI_BLOCK_SIZE);

> -	sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);

> +

> +	/*

> +	 * For Version 4.10 onwards, if v4 mode is enabled, 16-bit Block Count

> +	 * register need to be set to zero, 32-bit Block Count register would

> +	 * be selected.

> +	 */

> +	if (host->version >= SDHCI_SPEC_410 && host->v4_mode) {

> +		if (sdhci_readw(host, SDHCI_BLOCK_COUNT))

> +			sdhci_writew(host, 0, SDHCI_BLOCK_COUNT);

> +		sdhci_writew(host, data->blocks, SDHCI_32BIT_BLK_CNT);


Since it causes problems for auto-cmd23, use of 32-bit block count needs to
be optional.  I suggest adding a quirk for this.

> +	} else {

> +		sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);

> +	}

>  }

>  

>  static inline bool sdhci_auto_cmd12(struct sdhci_host *host,

> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h

> index f95eda2..d34971ac 100644

> --- a/drivers/mmc/host/sdhci.h

> +++ b/drivers/mmc/host/sdhci.h

> @@ -28,6 +28,7 @@

>  

>  #define SDHCI_DMA_ADDRESS	0x00

>  #define SDHCI_ARGUMENT2		SDHCI_DMA_ADDRESS

> +#define SDHCI_32BIT_BLK_CNT	SDHCI_DMA_ADDRESS

>  

>  #define SDHCI_BLOCK_SIZE	0x04

>  #define  SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF))

>
Adrian Hunter Aug. 23, 2018, 12:50 p.m. | #2
On 16/08/18 10:54, Chunyan Zhang wrote:
> For version 4.10 and aboves, SDHCI_ARGUMENT2 is also uses to indicate

> 32-bit number of blocks, it doesn't support stuff bits in argument of

> CMD23, but only block count for the following command (CMD18/25).

> 

> Signed-off-by: Chunyan Zhang <zhang.chunyan@linaro.org>

> ---

>  drivers/mmc/host/sdhci.c | 9 +++++++++

>  drivers/mmc/host/sdhci.h | 1 +

>  2 files changed, 10 insertions(+)

> 

> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c

> index b3328ee..a72ad0d 100644

> --- a/drivers/mmc/host/sdhci.c

> +++ b/drivers/mmc/host/sdhci.c

> @@ -1729,6 +1729,15 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)

>  		}

>  	}

>  

> +	/*

> +	 * For version 4.10 and above, ARGUMENT2 register is also used as 32-bit

> +	 * block count register which don't support stuff bits of CMD23 argument

> +	 */

> +	if (host->version >= SDHCI_SPEC_410 &&

> +	    mrq->sbc && (mrq->sbc->arg & SDHCI_ARG2_STUFF) &&

> +	    (host->flags & SDHCI_AUTO_CMD23))

> +		host->flags &= ~SDHCI_AUTO_CMD23;


I would prefer this be done in sdhci-sprd.c by hooking ->request().  Someone
sent a patch recently to export sdhci_request().

> +

>  	if (!present || host->flags & SDHCI_DEVICE_DEAD) {

>  		mrq->cmd->error = -ENOMEDIUM;

>  		sdhci_finish_mrq(host, mrq);

> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h

> index d34971ac..daf8c1e 100644

> --- a/drivers/mmc/host/sdhci.h

> +++ b/drivers/mmc/host/sdhci.h

> @@ -28,6 +28,7 @@

>  

>  #define SDHCI_DMA_ADDRESS	0x00

>  #define SDHCI_ARGUMENT2		SDHCI_DMA_ADDRESS

> +#define  SDHCI_ARG2_STUFF	GENMASK(31, 16)

>  #define SDHCI_32BIT_BLK_CNT	SDHCI_DMA_ADDRESS

>  

>  #define SDHCI_BLOCK_SIZE	0x04

>
Chunyan Zhang Aug. 27, 2018, 11:07 a.m. | #3
On 27 August 2018 at 18:07, Ulf Hansson <ulf.hansson@linaro.org> wrote:
> On 23 August 2018 at 14:50, Adrian Hunter <adrian.hunter@intel.com> wrote:

>> On 16/08/18 10:54, Chunyan Zhang wrote:

>>> For version 4.10 and aboves, SDHCI_ARGUMENT2 is also uses to indicate

>>> 32-bit number of blocks, it doesn't support stuff bits in argument of

>>> CMD23, but only block count for the following command (CMD18/25).

>>>

>>> Signed-off-by: Chunyan Zhang <zhang.chunyan@linaro.org>

>>> ---

>>>  drivers/mmc/host/sdhci.c | 9 +++++++++

>>>  drivers/mmc/host/sdhci.h | 1 +

>>>  2 files changed, 10 insertions(+)

>>>

>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c

>>> index b3328ee..a72ad0d 100644

>>> --- a/drivers/mmc/host/sdhci.c

>>> +++ b/drivers/mmc/host/sdhci.c

>>> @@ -1729,6 +1729,15 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)

>>>               }

>>>       }

>>>

>>> +     /*

>>> +      * For version 4.10 and above, ARGUMENT2 register is also used as 32-bit

>>> +      * block count register which don't support stuff bits of CMD23 argument

>>> +      */

>>> +     if (host->version >= SDHCI_SPEC_410 &&

>>> +         mrq->sbc && (mrq->sbc->arg & SDHCI_ARG2_STUFF) &&

>>> +         (host->flags & SDHCI_AUTO_CMD23))

>>> +             host->flags &= ~SDHCI_AUTO_CMD23;

>>

>> I would prefer this be done in sdhci-sprd.c by hooking ->request().  Someone

>> sent a patch recently to export sdhci_request().

>

> Right. So I have picked up the patch you were referring to.

> https://lkml.org/lkml/2018/8/20/140

>

> Chunyan, you may now preferably base your next version on top of my

> mmc tree's next branch.


Ok, will do.

Thanks,
Chunyan

>

> [...]

>

> Kind regards

> Uffe