On 15 February 2016 at 16:01, Wolfram Sang <[email protected]> wrote:
> From: Wolfram Sang <[email protected]>
>
> Registers are 64bit apart, so we refactor bus_shift handling a little and set
> it based on the DT compatible. Also, EXT_ACC is different. It has been tested
> on a Salvator-X (Gen3) and, to check for regressions, on a Lager (Gen2).
>
> Signed-off-by: Ai Kyuse <[email protected]>
> Signed-off-by: Wolfram Sang <[email protected]>
Thanks, applied for next!
Kind regards
Uffe
> ---
> Documentation/devicetree/bindings/mmc/tmio_mmc.txt | 1 +
> drivers/mmc/host/Kconfig | 2 +-
> drivers/mmc/host/sh_mobile_sdhi.c | 47
> ++++++++++++++++------
> 3 files changed, 36 insertions(+), 14 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/mmc/tmio_mmc.txt
> b/Documentation/devicetree/bindings/mmc/tmio_mmc.txt
> index 400b640fabc768..7fb746dd1a68ca 100644
> --- a/Documentation/devicetree/bindings/mmc/tmio_mmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/tmio_mmc.txt
> @@ -22,6 +22,7 @@ Required properties:
> "renesas,sdhi-r8a7792" - SDHI IP on R8A7792 SoC
> "renesas,sdhi-r8a7793" - SDHI IP on R8A7793 SoC
> "renesas,sdhi-r8a7794" - SDHI IP on R8A7794 SoC
> + "renesas,sdhi-r8a7795" - SDHI IP on R8A7795 SoC
>
> Optional properties:
> - toshiba,mmc-wrprotect-disable: write-protect detection is unavailable
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 4a35ebf5165d83..d9a9d92fa8379a 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -560,7 +560,7 @@ config MMC_TMIO
>
> config MMC_SDHI
> tristate "SH-Mobile SDHI SD/SDIO controller support"
> - depends on SUPERH || ARM
> + depends on SUPERH || ARM || ARM64
> depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST
> select MMC_TMIO_CORE
> help
> diff --git a/drivers/mmc/host/sh_mobile_sdhi.c
> b/drivers/mmc/host/sh_mobile_sdhi.c
> index 557e2b9dadeec7..9aa147959276d0 100644
> --- a/drivers/mmc/host/sh_mobile_sdhi.c
> +++ b/drivers/mmc/host/sh_mobile_sdhi.c
> @@ -1,6 +1,8 @@
> /*
> * SuperH Mobile SDHI
> *
> + * Copyright (C) 2016 Sang Engineering, Wolfram Sang
> + * Copyright (C) 2015-16 Renesas Electronics Corporation
> * Copyright (C) 2009 Magnus Damm
> *
> * This program is free software; you can redistribute it and/or modify
> @@ -43,6 +45,7 @@ struct sh_mobile_sdhi_of_data {
> unsigned long capabilities2;
> enum dma_slave_buswidth dma_buswidth;
> dma_addr_t dma_rx_offset;
> + unsigned bus_shift;
> };
>
> static const struct sh_mobile_sdhi_of_data sh_mobile_sdhi_of_cfg[] = {
> @@ -65,6 +68,13 @@ static const struct sh_mobile_sdhi_of_data
> of_rcar_gen2_compatible = {
> .dma_rx_offset = 0x2000,
> };
>
> +static const struct sh_mobile_sdhi_of_data of_rcar_gen3_compatible = {
> + .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE
> |
> + TMIO_MMC_CLK_ACTUAL | TMIO_MMC_FAST_CLK_CHG,
> + .capabilities = MMC_CAP_SD_HIGHSPEED,
> + .bus_shift = 2,
> +};
> +
> static const struct of_device_id sh_mobile_sdhi_of_match[] = {
> { .compatible = "renesas,sdhi-shmobile" },
> { .compatible = "renesas,sdhi-sh7372" },
> @@ -78,6 +88,7 @@ static const struct of_device_id sh_mobile_sdhi_of_match[]
> = {
> { .compatible = "renesas,sdhi-r8a7792", .data =
> &of_rcar_gen2_compatible, },
> { .compatible = "renesas,sdhi-r8a7793", .data =
> &of_rcar_gen2_compatible, },
> { .compatible = "renesas,sdhi-r8a7794", .data =
> &of_rcar_gen2_compatible, },
> + { .compatible = "renesas,sdhi-r8a7795", .data =
> &of_rcar_gen3_compatible, },
> {},
> };
> MODULE_DEVICE_TABLE(of, sh_mobile_sdhi_of_match);
> @@ -103,6 +114,15 @@ static void sh_mobile_sdhi_sdbuf_width(struct
> tmio_mmc_host *host, int width)
> case 0xCB0D:
> val = (width == 32) ? 0x0000 : 0x0001;
> break;
> + case 0xCC10: /* Gen3, SD only */
> + case 0xCD10: /* Gen3, SD + MMC */
> + if (width == 64)
> + val = 0x0000;
> + else if (width == 32)
> + val = 0x0101;
> + else
> + val = 0x0001;
> + break;
> default:
> /* nothing to do */
> return;
> @@ -233,16 +253,26 @@ static int sh_mobile_sdhi_probe(struct platform_device
> *pdev)
> goto eprobe;
> }
>
> + if (of_id && of_id->data) {
> + const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
> +
> + mmc_data->flags |= of_data->tmio_flags;
> + mmc_data->capabilities |= of_data->capabilities;
> + mmc_data->capabilities2 |= of_data->capabilities2;
> + mmc_data->dma_rx_offset = of_data->dma_rx_offset;
> + dma_priv->dma_buswidth = of_data->dma_buswidth;
> + host->bus_shift = of_data->bus_shift;
> + }
> +
> host->dma = dma_priv;
> host->write16_hook = sh_mobile_sdhi_write16_hook;
> host->clk_enable = sh_mobile_sdhi_clk_enable;
> host->clk_disable = sh_mobile_sdhi_clk_disable;
> host->multi_io_quirk = sh_mobile_sdhi_multi_io_quirk;
> - /* SD control register space size is 0x100, 0x200 for bus_shift=1 */
> - if (resource_size(res) > 0x100)
> +
> + /* Orginally registers were 16 bit apart, could be 32 or 64 nowadays
> */
> + if (!host->bus_shift && resource_size(res) > 0x100) /* old way to
> determine the shift */
> host->bus_shift = 1;
> - else
> - host->bus_shift = 0;
>
> if (mmd)
> *mmc_data = *mmd;
> @@ -274,15 +304,6 @@ static int sh_mobile_sdhi_probe(struct platform_device
> *pdev)
> */
> mmc_data->flags |= TMIO_MMC_SDIO_STATUS_QUIRK;
>
> - if (of_id && of_id->data) {
> - const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
> - mmc_data->flags |= of_data->tmio_flags;
> - mmc_data->capabilities |= of_data->capabilities;
> - mmc_data->capabilities2 |= of_data->capabilities2;
> - mmc_data->dma_rx_offset = of_data->dma_rx_offset;
> - dma_priv->dma_buswidth = of_data->dma_buswidth;
> - }
> -
> ret = tmio_mmc_host_probe(host, mmc_data);
> if (ret < 0)
> goto efree;
> --
> 2.1.4
>