diff mbox

[U-Boot,4/5] mmc: sh_sdhi: Add MMC version 5.0 support

Message ID 20170513135118.8134-4-marek.vasut+renesas@gmail.com
State Accepted
Commit 91a16c3b2f909560e50d97d1d7d1a0c24589ca2d
Delegated to: Jaehoon Chung
Headers show

Commit Message

Marek Vasut May 13, 2017, 1:51 p.m. UTC
From: Kouei Abe <kouei.abe.cp@renesas.com>

Renesas SDHI SD/MMC driver did not support MMC version 5.0 devices.
This adds MMC version 5.0 device support.

Signed-off-by: Kouei Abe <kouei.abe.cp@renesas.com>
Signed-off-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
---
 arch/arm/mach-rmobile/include/mach/sh_sdhi.h |  7 ++++++-
 drivers/mmc/sh_sdhi.c                        | 24 +++++++++++++++++++-----
 2 files changed, 25 insertions(+), 6 deletions(-)

Comments

Nobuhiro Iwamatsu May 13, 2017, 9:49 p.m. UTC | #1
Hi,

2017-05-13 22:51 GMT+09:00 Marek Vasut <marek.vasut@gmail.com>:
> From: Kouei Abe <kouei.abe.cp@renesas.com>
>
> Renesas SDHI SD/MMC driver did not support MMC version 5.0 devices.
> This adds MMC version 5.0 device support.
>
> Signed-off-by: Kouei Abe <kouei.abe.cp@renesas.com>
> Signed-off-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
> Cc: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
> Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
> Cc: Jaehoon Chung <jh80.chung@samsung.com>

Reviewed-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>

> ---
>  arch/arm/mach-rmobile/include/mach/sh_sdhi.h |  7 ++++++-
>  drivers/mmc/sh_sdhi.c                        | 24 +++++++++++++++++++-----
>  2 files changed, 25 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> index a5ea45b707..1fb0648b12 100644
> --- a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> +++ b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> @@ -50,8 +50,10 @@
>  /* SDHI CMD VALUE */
>  #define CMD_MASK                       0x0000ffff
>  #define SDHI_APP                       0x0040
> +#define SDHI_MMC_SEND_OP_COND          0x0701
>  #define SDHI_SD_APP_SEND_SCR           0x0073
>  #define SDHI_SD_SWITCH                 0x1C06
> +#define SDHI_MMC_SEND_EXT_CSD          0x1C08
>
>  /* SDHI_PORTSEL */
>  #define USE_1PORT                      (1 << 8) /* 1 port */
> @@ -120,7 +122,10 @@
>  #define CLK_ENABLE                     (1 << 8)
>
>  /* SDHI_OPTION */
> -#define OPT_BUS_WIDTH_1                        (1 << 15)       /* bus width = 1 bit */
> +#define OPT_BUS_WIDTH_M                        (5 << 13)       /* 101b (15-13bit) */
> +#define OPT_BUS_WIDTH_1                        (4 << 13)       /* bus width = 1 bit */
> +#define OPT_BUS_WIDTH_4                        (0 << 13)       /* bus width = 4 bit */
> +#define OPT_BUS_WIDTH_8                        (1 << 13)       /* bus width = 8 bit */
>
>  /* SDHI_ERR_STS1 */
>  #define ERR_STS1_CRC_ERROR             ((1 << 11) | (1 << 10) | (1 << 9) | \
> diff --git a/drivers/mmc/sh_sdhi.c b/drivers/mmc/sh_sdhi.c
> index d1dd0f0fc3..c64beb6e2a 100644
> --- a/drivers/mmc/sh_sdhi.c
> +++ b/drivers/mmc/sh_sdhi.c
> @@ -489,6 +489,13 @@ static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host,
>                 else /* SD_SWITCH */
>                         opc = SDHI_SD_SWITCH;
>                 break;
> +       case MMC_CMD_SEND_OP_COND:
> +               opc = SDHI_MMC_SEND_OP_COND;
> +               break;
> +       case MMC_CMD_SEND_EXT_CSD:
> +               if (data)
> +                       opc = SDHI_MMC_SEND_EXT_CSD;
> +               break;
>         default:
>                 break;
>         }
> @@ -513,6 +520,7 @@ static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host,
>         case MMC_CMD_READ_SINGLE_BLOCK:
>         case SDHI_SD_APP_SEND_SCR:
>         case SDHI_SD_SWITCH: /* SD_SWITCH */
> +       case SDHI_MMC_SEND_EXT_CSD:
>                 ret = sh_sdhi_single_read(host, data);
>                 break;
>         default:
> @@ -648,12 +656,18 @@ static int sh_sdhi_set_ios(struct mmc *mmc)
>         if (ret)
>                 return -EINVAL;
>
> -       if (mmc->bus_width == 4)
> -               sh_sdhi_writew(host, SDHI_OPTION, ~OPT_BUS_WIDTH_1 &
> -                              sh_sdhi_readw(host, SDHI_OPTION));
> +       if (mmc->bus_width == 8)
> +               sh_sdhi_writew(host, SDHI_OPTION,
> +                              OPT_BUS_WIDTH_8 | (~OPT_BUS_WIDTH_M &
> +                              sh_sdhi_readw(host, SDHI_OPTION)));
> +       else if (mmc->bus_width == 4)
> +               sh_sdhi_writew(host, SDHI_OPTION,
> +                              OPT_BUS_WIDTH_4 | (~OPT_BUS_WIDTH_M &
> +                              sh_sdhi_readw(host, SDHI_OPTION)));
>         else
> -               sh_sdhi_writew(host, SDHI_OPTION, OPT_BUS_WIDTH_1 |
> -                              sh_sdhi_readw(host, SDHI_OPTION));
> +               sh_sdhi_writew(host, SDHI_OPTION,
> +                              OPT_BUS_WIDTH_1 | (~OPT_BUS_WIDTH_M &
> +                              sh_sdhi_readw(host, SDHI_OPTION)));
>
>         debug("clock = %d, buswidth = %d\n", mmc->clock, mmc->bus_width);
>
> --
> 2.11.0
>
Jaehoon Chung May 25, 2017, 1:45 p.m. UTC | #2
On 05/13/2017 10:51 PM, Marek Vasut wrote:
> From: Kouei Abe <kouei.abe.cp@renesas.com>
> 
> Renesas SDHI SD/MMC driver did not support MMC version 5.0 devices.
> This adds MMC version 5.0 device support.
> 
> Signed-off-by: Kouei Abe <kouei.abe.cp@renesas.com>
> Signed-off-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
> Cc: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
> Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
> Cc: Jaehoon Chung <jh80.chung@samsung.com>
> ---
>  arch/arm/mach-rmobile/include/mach/sh_sdhi.h |  7 ++++++-
>  drivers/mmc/sh_sdhi.c                        | 24 +++++++++++++++++++-----
>  2 files changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> index a5ea45b707..1fb0648b12 100644
> --- a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> +++ b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
> @@ -50,8 +50,10 @@
>  /* SDHI CMD VALUE */
>  #define CMD_MASK			0x0000ffff
>  #define SDHI_APP			0x0040
> +#define SDHI_MMC_SEND_OP_COND		0x0701
>  #define SDHI_SD_APP_SEND_SCR		0x0073
>  #define SDHI_SD_SWITCH			0x1C06
> +#define SDHI_MMC_SEND_EXT_CSD		0x1C08
>  
>  /* SDHI_PORTSEL */
>  #define USE_1PORT			(1 << 8) /* 1 port */
> @@ -120,7 +122,10 @@
>  #define CLK_ENABLE			(1 << 8)
>  
>  /* SDHI_OPTION */
> -#define OPT_BUS_WIDTH_1			(1 << 15)	/* bus width = 1 bit */
> +#define OPT_BUS_WIDTH_M			(5 << 13)	/* 101b (15-13bit) */

What is WIDTH_M?

> +#define OPT_BUS_WIDTH_1			(4 << 13)	/* bus width = 1 bit */
> +#define OPT_BUS_WIDTH_4			(0 << 13)	/* bus width = 4 bit */
> +#define OPT_BUS_WIDTH_8			(1 << 13)	/* bus width = 8 bit */
>  
>  /* SDHI_ERR_STS1 */
>  #define ERR_STS1_CRC_ERROR		((1 << 11) | (1 << 10) | (1 << 9) | \
> diff --git a/drivers/mmc/sh_sdhi.c b/drivers/mmc/sh_sdhi.c
> index d1dd0f0fc3..c64beb6e2a 100644
> --- a/drivers/mmc/sh_sdhi.c
> +++ b/drivers/mmc/sh_sdhi.c
> @@ -489,6 +489,13 @@ static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host,
>  		else /* SD_SWITCH */
>  			opc = SDHI_SD_SWITCH;
>  		break;
> +	case MMC_CMD_SEND_OP_COND:
> +		opc = SDHI_MMC_SEND_OP_COND;
> +		break;
> +	case MMC_CMD_SEND_EXT_CSD:
> +		if (data)
> +			opc = SDHI_MMC_SEND_EXT_CSD;
> +		break;
>  	default:
>  		break;
>  	}
> @@ -513,6 +520,7 @@ static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host,
>  	case MMC_CMD_READ_SINGLE_BLOCK:
>  	case SDHI_SD_APP_SEND_SCR:
>  	case SDHI_SD_SWITCH: /* SD_SWITCH */
> +	case SDHI_MMC_SEND_EXT_CSD:
>  		ret = sh_sdhi_single_read(host, data);
>  		break;
>  	default:
> @@ -648,12 +656,18 @@ static int sh_sdhi_set_ios(struct mmc *mmc)
>  	if (ret)
>  		return -EINVAL;
>  
> -	if (mmc->bus_width == 4)
> -		sh_sdhi_writew(host, SDHI_OPTION, ~OPT_BUS_WIDTH_1 &
> -			       sh_sdhi_readw(host, SDHI_OPTION));
> +	if (mmc->bus_width == 8)
> +		sh_sdhi_writew(host, SDHI_OPTION,
> +			       OPT_BUS_WIDTH_8 | (~OPT_BUS_WIDTH_M &
> +			       sh_sdhi_readw(host, SDHI_OPTION)));
> +	else if (mmc->bus_width == 4)
> +		sh_sdhi_writew(host, SDHI_OPTION,
> +			       OPT_BUS_WIDTH_4 | (~OPT_BUS_WIDTH_M &
> +			       sh_sdhi_readw(host, SDHI_OPTION)));
>  	else
> -		sh_sdhi_writew(host, SDHI_OPTION, OPT_BUS_WIDTH_1 |
> -			       sh_sdhi_readw(host, SDHI_OPTION));
> +		sh_sdhi_writew(host, SDHI_OPTION,
> +			       OPT_BUS_WIDTH_1 | (~OPT_BUS_WIDTH_M &
> +			       sh_sdhi_readw(host, SDHI_OPTION)));
>  
>  	debug("clock = %d, buswidth = %d\n", mmc->clock, mmc->bus_width);
>  
>
diff mbox

Patch

diff --git a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
index a5ea45b707..1fb0648b12 100644
--- a/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
+++ b/arch/arm/mach-rmobile/include/mach/sh_sdhi.h
@@ -50,8 +50,10 @@ 
 /* SDHI CMD VALUE */
 #define CMD_MASK			0x0000ffff
 #define SDHI_APP			0x0040
+#define SDHI_MMC_SEND_OP_COND		0x0701
 #define SDHI_SD_APP_SEND_SCR		0x0073
 #define SDHI_SD_SWITCH			0x1C06
+#define SDHI_MMC_SEND_EXT_CSD		0x1C08
 
 /* SDHI_PORTSEL */
 #define USE_1PORT			(1 << 8) /* 1 port */
@@ -120,7 +122,10 @@ 
 #define CLK_ENABLE			(1 << 8)
 
 /* SDHI_OPTION */
-#define OPT_BUS_WIDTH_1			(1 << 15)	/* bus width = 1 bit */
+#define OPT_BUS_WIDTH_M			(5 << 13)	/* 101b (15-13bit) */
+#define OPT_BUS_WIDTH_1			(4 << 13)	/* bus width = 1 bit */
+#define OPT_BUS_WIDTH_4			(0 << 13)	/* bus width = 4 bit */
+#define OPT_BUS_WIDTH_8			(1 << 13)	/* bus width = 8 bit */
 
 /* SDHI_ERR_STS1 */
 #define ERR_STS1_CRC_ERROR		((1 << 11) | (1 << 10) | (1 << 9) | \
diff --git a/drivers/mmc/sh_sdhi.c b/drivers/mmc/sh_sdhi.c
index d1dd0f0fc3..c64beb6e2a 100644
--- a/drivers/mmc/sh_sdhi.c
+++ b/drivers/mmc/sh_sdhi.c
@@ -489,6 +489,13 @@  static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host,
 		else /* SD_SWITCH */
 			opc = SDHI_SD_SWITCH;
 		break;
+	case MMC_CMD_SEND_OP_COND:
+		opc = SDHI_MMC_SEND_OP_COND;
+		break;
+	case MMC_CMD_SEND_EXT_CSD:
+		if (data)
+			opc = SDHI_MMC_SEND_EXT_CSD;
+		break;
 	default:
 		break;
 	}
@@ -513,6 +520,7 @@  static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host,
 	case MMC_CMD_READ_SINGLE_BLOCK:
 	case SDHI_SD_APP_SEND_SCR:
 	case SDHI_SD_SWITCH: /* SD_SWITCH */
+	case SDHI_MMC_SEND_EXT_CSD:
 		ret = sh_sdhi_single_read(host, data);
 		break;
 	default:
@@ -648,12 +656,18 @@  static int sh_sdhi_set_ios(struct mmc *mmc)
 	if (ret)
 		return -EINVAL;
 
-	if (mmc->bus_width == 4)
-		sh_sdhi_writew(host, SDHI_OPTION, ~OPT_BUS_WIDTH_1 &
-			       sh_sdhi_readw(host, SDHI_OPTION));
+	if (mmc->bus_width == 8)
+		sh_sdhi_writew(host, SDHI_OPTION,
+			       OPT_BUS_WIDTH_8 | (~OPT_BUS_WIDTH_M &
+			       sh_sdhi_readw(host, SDHI_OPTION)));
+	else if (mmc->bus_width == 4)
+		sh_sdhi_writew(host, SDHI_OPTION,
+			       OPT_BUS_WIDTH_4 | (~OPT_BUS_WIDTH_M &
+			       sh_sdhi_readw(host, SDHI_OPTION)));
 	else
-		sh_sdhi_writew(host, SDHI_OPTION, OPT_BUS_WIDTH_1 |
-			       sh_sdhi_readw(host, SDHI_OPTION));
+		sh_sdhi_writew(host, SDHI_OPTION,
+			       OPT_BUS_WIDTH_1 | (~OPT_BUS_WIDTH_M &
+			       sh_sdhi_readw(host, SDHI_OPTION)));
 
 	debug("clock = %d, buswidth = %d\n", mmc->clock, mmc->bus_width);