mbox series

[V2,0/7] mmc: add support for sdhci 4.0

Message ID 1529028255-6022-1-git-send-email-zhang.chunyan@linaro.org
Headers show
Series mmc: add support for sdhci 4.0 | expand

Message

Chunyan Zhang June 15, 2018, 2:04 a.m. UTC
From: Chunyan Zhang <chunyan.zhang@spreadtrum.com>


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 v1:
* Addressed comments from Ulf:
 - Add dt-bindings for Spreadtrum sdhci;
 - Use assigned-clocks* DT bindings to set default source of sdio clock;
 - Removed unuseful print;
 - Removed two functions which are not used;
 - Add back the missing pm_runtime_put_autosuspend() after adding sdhci host.

* Changed Spreadtrum sdhci driver name to sdhci-sprd.

Chunyan Zhang (7):
  mmc: sdhci: add sd host v4 mode
  mmc: sdhci: made changes for System Address register of SDMA
  mmc: sdhci: add ADMA2 64-bit addressing support for V4 mode
  mmc: sdhci: add 32-bit block count support for v4 mode
  mmc: sdhci: add CMD23 support for v4 mode
  mmc: sdhci-sprd: added 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                      | 426 +++++++++++++++++++++
 drivers/mmc/host/sdhci.c                           |  85 +++-
 drivers/mmc/host/sdhci.h                           |  31 +-
 6 files changed, 575 insertions(+), 22 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 June 21, 2018, 11:22 a.m. UTC | #1
On 15/06/18 05:04, Chunyan Zhang wrote:
> According to the SD host controller specification version 4.10, when

> Host Version 4 is enabled, SDMA uses ADMA System Address register

> (05Fh-058h) instead of using SDMA System Address register to

> support both 32-bit and 64-bit addressing.

> 

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

> ---

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

>  1 file changed, 8 insertions(+), 2 deletions(-)

> 

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

> index cf5695f..f57201f 100644

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

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

> @@ -805,6 +805,7 @@ static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)

>  static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)

>  {

>  	u8 ctrl;

> +	u32 reg;


reg could just be an int.

>  	struct mmc_data *data = cmd->data;

>  

>  	if (sdhci_data_line_cmd(cmd))

> @@ -894,8 +895,10 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)

>  					     SDHCI_ADMA_ADDRESS_HI);

>  		} else {

>  			WARN_ON(sg_cnt != 1);

> +			reg = host->v4_mode ? SDHCI_ADMA_ADDRESS :

> +				SDHCI_DMA_ADDRESS;

>  			sdhci_writel(host, sdhci_sdma_address(host),

> -				     SDHCI_DMA_ADDRESS);

> +				     reg);


Shouldn't we support 64-bit SDMA in version 4 mode?


>  		}

>  	}

>  

> @@ -2721,6 +2724,7 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)

>  		 */

>  		if (intmask & SDHCI_INT_DMA_END) {

>  			u32 dmastart, dmanow;

> +			u32 reg;

>  

>  			dmastart = sdhci_sdma_address(host);

>  			dmanow = dmastart + host->data->bytes_xfered;

> @@ -2733,7 +2737,9 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)

>  			host->data->bytes_xfered = dmanow - dmastart;

>  			DBG("DMA base 0x%08x, transferred 0x%06x bytes, next 0x%08x\n",

>  			    dmastart, host->data->bytes_xfered, dmanow);

> -			sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS);

> +			reg = host->v4_mode ? SDHCI_ADMA_ADDRESS :

> +				SDHCI_DMA_ADDRESS;

> +			sdhci_writel(host, dmanow, reg);


Shouldn't we support 64-bit SDMA in version 4 mode?

>  		}

>  

>  		if (intmask & SDHCI_INT_DATA_END) {

>