linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH v4 0/9]
       [not found] <1438843469-23807-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-06  7:08 ` Jaehoon Chung
       [not found]   ` <55C30D52.6040802@rock-chips.com>
       [not found] ` <1438843539-24017-1-git-send-email-shawn.lin@rock-chips.com>
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Jaehoon Chung @ 2015-08-06  7:08 UTC (permalink / raw)
  To: linux-arm-kernel

Hi, Shawn.

I remembered that Krzysztof has mentioned "Fix the title of cover letter."
Your cover letter's title is nothing.. "[RFC PATCH v4 0/9] " ??
[RFC PATCH v4 0/9] your title...

Best Regards,
Jaehoon Chung

On 08/06/2015 03:44 PM, Shawn Lin wrote:
> Add external dma support for Synopsys MSHC
> 
> Synopsys DesignWare mobile storage host controller supports three
> types of transfer mode: pio, internal dma and external dma. However,
> dw_mmc can only supports pio and internal dma now. Thus some platforms
> using dw-mshc integrated with generic dma can't work in dma mode. So we
> submit this patch to achieve it.
> 
> And the config option, CONFIG_MMC_DW_IDMAC, was added by Will Newton
> (commit:f95f3850) for the first version of dw_mmc and never be touched since
> then. At that time dt-bindings hadn't been introduced into dw_mmc yet means
> we should select CONFIG_MMC_DW_IDMAC to enable internal dma mode at compile
> time. Nowadays, device-tree helps us to support a variety of boards with one
> kernel. That's why we need to remove it and decide the transfer mode by reading
> dw_mmc's HCON reg at runtime.
> 
> This RFC patch needs lots of ACKs. I know it's hard, but it does need someone
> to make the running.
> 
> Patch does the following things:
> - remove CONFIG_MMC_DW_IDMAC config option
> - add bindings for edmac used by synopsys-dw-mshc
>   at runtime
> - add edmac support for synopsys-dw-mshc
> 
> Patch is based on next of git://git.linaro.org/people/ulf.hansson/mmc
> 
> 
> Changes in v4:
> - remove "host->trans_mode" and use "host->use_dma" to indicate
>   transfer mode.
> - remove all bt-bindings' changes since we don't need new properities.
> - check transfer mode at runtime by reading HCON reg
> - spilt defconfig changes for each sub-architecture
> - fix the title of cover letter
> - reuse some code for reducing code size
> 
> Changes in v3:
> - choose transfer mode at runtime
> - remove all CONFIG_MMC_DW_IDMAC config option
> - add supports-idmac property for some platforms
> 
> Changes in v2:
> - Fix typo of dev_info msg
> - remove unused dmach from declaration of dw_mci_dma_slave
> 
> Shawn Lin (9):
>   mmc: dw_mmc: Add external dma interface support
>   Documentation: synopsys-dw-mshc: add bindings for idmac and edmac
>   mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arc: axs10x_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arm: exynos_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arm: hisi_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arm: lpc18xx_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arm: multi_v7_defconfig: remove CONFIG_MMC_DW_IDMAC
>   arm: zx_defconfig: remove CONFIG_MMC_DW_IDMAC
> 
>  .../devicetree/bindings/mmc/synopsys-dw-mshc.txt   |  25 ++
>  arch/arc/configs/axs101_defconfig                  |   1 -
>  arch/arc/configs/axs103_defconfig                  |   1 -
>  arch/arc/configs/axs103_smp_defconfig              |   1 -
>  arch/arm/configs/exynos_defconfig                  |   1 -
>  arch/arm/configs/hisi_defconfig                    |   1 -
>  arch/arm/configs/lpc18xx_defconfig                 |   1 -
>  arch/arm/configs/multi_v7_defconfig                |   1 -
>  arch/arm/configs/zx_defconfig                      |   1 -
>  arch/mips/configs/pistachio_defconfig              |   1 -
>  drivers/mmc/host/Kconfig                           |  11 +-
>  drivers/mmc/host/dw_mmc-pltfm.c                    |   2 +
>  drivers/mmc/host/dw_mmc.c                          | 258 +++++++++++++++++----
>  include/linux/mmc/dw_mmc.h                         |  27 ++-
>  14 files changed, 257 insertions(+), 75 deletions(-)
> 

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

* [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support
       [not found] ` <1438843491-23853-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-06  7:08   ` Krzysztof Kozlowski
       [not found]     ` <55C30C1C.6070801@rock-chips.com>
  2015-08-07 21:32   ` Joachim Eastwood
  2015-08-10 18:03   ` Alim Akhtar
  2 siblings, 1 reply; 15+ messages in thread
From: Krzysztof Kozlowski @ 2015-08-06  7:08 UTC (permalink / raw)
  To: linux-arm-kernel

On 06.08.2015 15:44, Shawn Lin wrote:
> DesignWare MMC Controller can supports two types of DMA
> mode: external dma and internal dma. We get a RK312x platform
> integrated dw_mmc and ARM pl330 dma controller. This patch add
> edmac ops to support these platforms. I've tested it on RK312x
> platform with edmac mode and RK3288 platform with idmac mode.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> 
> ---
> 
> Changes in v4:
> - remove "host->trans_mode" and use "host->use_dma" to indicate
>   transfer mode.
> - remove all bt-bindings' changes since we don't need new properities.
> - check transfer mode at runtime by reading HCON reg
> - spilt defconfig changes for each sub-architecture
> - fix the title of cover letter

How did you fixed the title? It is still empty :)
	Subject: [RFC PATCH v4 0/9]

> - reuse some code for reducing code size
> 
> Changes in v3:
> - choose transfer mode at runtime
> - remove all CONFIG_MMC_DW_IDMAC config option
> - add supports-idmac property for some platforms
> 
> Changes in v2:
> - Fix typo of dev_info msg
> - remove unused dmach from declaration of dw_mci_dma_slave
> 
>  drivers/mmc/host/Kconfig        |  11 +-
>  drivers/mmc/host/dw_mmc-pltfm.c |   2 +
>  drivers/mmc/host/dw_mmc.c       | 258 ++++++++++++++++++++++++++++++++--------
>  include/linux/mmc/dw_mmc.h      |  27 ++++-
>  4 files changed, 232 insertions(+), 66 deletions(-)
> 
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 6a0f9c7..a86c0eb 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -607,15 +607,7 @@ config MMC_DW
>  	help
>  	  This selects support for the Synopsys DesignWare Mobile Storage IP
>  	  block, this provides host support for SD and MMC interfaces, in both
> -	  PIO and external DMA modes.
> -
> -config MMC_DW_IDMAC
> -	bool "Internal DMAC interface"
> -	depends on MMC_DW
> -	help
> -	  This selects support for the internal DMAC block within the Synopsys
> -	  Designware Mobile Storage IP block. This disables the external DMA
> -	  interface.
> +	  PIO, internal DMA mode and external DMA modes.
>  
>  config MMC_DW_PLTFM
>  	tristate "Synopsys Designware MCI Support as platform device"
> @@ -644,7 +636,6 @@ config MMC_DW_K3
>  	tristate "K3 specific extensions for Synopsys DW Memory Card Interface"
>  	depends on MMC_DW
>  	select MMC_DW_PLTFM
> -	select MMC_DW_IDMAC
>  	help
>  	  This selects support for Hisilicon K3 SoC specific extensions to the
>  	  Synopsys DesignWare Memory Card Interface driver. Select this option
> diff --git a/drivers/mmc/host/dw_mmc-pltfm.c b/drivers/mmc/host/dw_mmc-pltfm.c
> index ec6dbcd..7e1d13b 100644
> --- a/drivers/mmc/host/dw_mmc-pltfm.c
> +++ b/drivers/mmc/host/dw_mmc-pltfm.c
> @@ -59,6 +59,8 @@ int dw_mci_pltfm_register(struct platform_device *pdev,
>  	host->pdata = pdev->dev.platform_data;
>  
>  	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	/* Get registers' physical base address */
> +	host->phy_regs = (void *)(regs->start);
>  	host->regs = devm_ioremap_resource(&pdev->dev, regs);
>  	if (IS_ERR(host->regs))
>  		return PTR_ERR(host->regs);
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 40e9d8e..5d6cdff 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -56,7 +56,7 @@
>  #define DW_MCI_FREQ_MAX	200000000	/* unit: HZ */
>  #define DW_MCI_FREQ_MIN	400000		/* unit: HZ */
>  
> -#ifdef CONFIG_MMC_DW_IDMAC
> +
>  #define IDMAC_INT_CLR		(SDMMC_IDMAC_INT_AI | SDMMC_IDMAC_INT_NI | \
>  				 SDMMC_IDMAC_INT_CES | SDMMC_IDMAC_INT_DU | \
>  				 SDMMC_IDMAC_INT_FBE | SDMMC_IDMAC_INT_RI | \
> @@ -99,7 +99,6 @@ struct idmac_desc {
>  
>  	__le32		des3;	/* buffer 2 physical address */
>  };
> -#endif /* CONFIG_MMC_DW_IDMAC */
>  
>  static bool dw_mci_reset(struct dw_mci *host);
>  static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset);
> @@ -403,7 +402,6 @@ static int dw_mci_get_dma_dir(struct mmc_data *data)
>  		return DMA_FROM_DEVICE;
>  }
>  
> -#ifdef CONFIG_MMC_DW_IDMAC
>  static void dw_mci_dma_cleanup(struct dw_mci *host)
>  {
>  	struct mmc_data *data = host->data;
> @@ -441,12 +439,21 @@ static void dw_mci_idmac_stop_dma(struct dw_mci *host)
>  	mci_writel(host, BMOD, temp);
>  }
>  
> -static void dw_mci_idmac_complete_dma(struct dw_mci *host)
> +static void dw_mci_dmac_complete_dma(void *arg)
>  {
> +	struct dw_mci *host = arg;

Why changing the argument to void*?

Best regards,
Krzysztof

>  	struct mmc_data *data = host->data;
>  
>  	dev_vdbg(host->dev, "DMA complete\n");
>  
> +	if (host->use_dma == TRANS_MODE_EDMAC)
> +		if (data && (data->flags & MMC_DATA_READ))
> +			/* Invalidate cache after read */
> +			dma_sync_sg_for_cpu(mmc_dev(host->cur_slot->mmc),
> +					    data->sg,
> +					    data->sg_len,
> +					    DMA_FROM_DEVICE);
> +
>  	host->dma_ops->cleanup(host);

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

* [RFC PATCH v4 5/9] arm: exynos_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843539-24017-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-06  7:08   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 15+ messages in thread
From: Krzysztof Kozlowski @ 2015-08-06  7:08 UTC (permalink / raw)
  To: linux-arm-kernel

On 06.08.2015 15:45, Shawn Lin wrote:
> DesignWare MMC Controller's transfer mode should be decided
> at runtime instead of compile-time. So we remove this config
> option and read dw_mmc's register to select DMA master.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
> 
>  arch/arm/configs/exynos_defconfig | 1 -
>  1 file changed, 1 deletion(-)

Acked-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>

Best regards,
Krzysztof

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

* [RFC PATCH v4 0/9]
       [not found]   ` <55C30D52.6040802@rock-chips.com>
@ 2015-08-06  7:33     ` Jaehoon Chung
  0 siblings, 0 replies; 15+ messages in thread
From: Jaehoon Chung @ 2015-08-06  7:33 UTC (permalink / raw)
  To: linux-arm-kernel

On 08/06/2015 04:31 PM, Shawn Lin wrote:
> ? 2015/8/6 15:08, Jaehoon Chung ??:
>> Hi, Shawn.
>>
>> I remembered that Krzysztof has mentioned "Fix the title of cover letter."
>> Your cover letter's title is nothing.. "[RFC PATCH v4 0/9] " ??
>> [RFC PATCH v4 0/9] your title...
>  Sorry, I forgot it, and will fix in next version...

No problem :) 
At next time,  add the title at your cover-letter, plz.

Best Regards,
Jaehoon Chung

> 
>> Best Regards,
>> Jaehoon Chung
>>
>> On 08/06/2015 03:44 PM, Shawn Lin wrote:
>>> Add external dma support for Synopsys MSHC
>>>
>>> Synopsys DesignWare mobile storage host controller supports three
>>> types of transfer mode: pio, internal dma and external dma. However,
>>> dw_mmc can only supports pio and internal dma now. Thus some platforms
>>> using dw-mshc integrated with generic dma can't work in dma mode. So we
>>> submit this patch to achieve it.
>>>
>>> And the config option, CONFIG_MMC_DW_IDMAC, was added by Will Newton
>>> (commit:f95f3850) for the first version of dw_mmc and never be touched since
>>> then. At that time dt-bindings hadn't been introduced into dw_mmc yet means
>>> we should select CONFIG_MMC_DW_IDMAC to enable internal dma mode at compile
>>> time. Nowadays, device-tree helps us to support a variety of boards with one
>>> kernel. That's why we need to remove it and decide the transfer mode by reading
>>> dw_mmc's HCON reg at runtime.
>>>
>>> This RFC patch needs lots of ACKs. I know it's hard, but it does need someone
>>> to make the running.
>>>
>>> Patch does the following things:
>>> - remove CONFIG_MMC_DW_IDMAC config option
>>> - add bindings for edmac used by synopsys-dw-mshc
>>>    at runtime
>>> - add edmac support for synopsys-dw-mshc
>>>
>>> Patch is based on next of git://git.linaro.org/people/ulf.hansson/mmc
>>>
>>>
>>> Changes in v4:
>>> - remove "host->trans_mode" and use "host->use_dma" to indicate
>>>    transfer mode.
>>> - remove all bt-bindings' changes since we don't need new properities.
>>> - check transfer mode at runtime by reading HCON reg
>>> - spilt defconfig changes for each sub-architecture
>>> - fix the title of cover letter
>>> - reuse some code for reducing code size
>>>
>>> Changes in v3:
>>> - choose transfer mode at runtime
>>> - remove all CONFIG_MMC_DW_IDMAC config option
>>> - add supports-idmac property for some platforms
>>>
>>> Changes in v2:
>>> - Fix typo of dev_info msg
>>> - remove unused dmach from declaration of dw_mci_dma_slave
>>>
>>> Shawn Lin (9):
>>>    mmc: dw_mmc: Add external dma interface support
>>>    Documentation: synopsys-dw-mshc: add bindings for idmac and edmac
>>>    mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arc: axs10x_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arm: exynos_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arm: hisi_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arm: lpc18xx_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arm: multi_v7_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>    arm: zx_defconfig: remove CONFIG_MMC_DW_IDMAC
>>>
>>>   .../devicetree/bindings/mmc/synopsys-dw-mshc.txt   |  25 ++
>>>   arch/arc/configs/axs101_defconfig                  |   1 -
>>>   arch/arc/configs/axs103_defconfig                  |   1 -
>>>   arch/arc/configs/axs103_smp_defconfig              |   1 -
>>>   arch/arm/configs/exynos_defconfig                  |   1 -
>>>   arch/arm/configs/hisi_defconfig                    |   1 -
>>>   arch/arm/configs/lpc18xx_defconfig                 |   1 -
>>>   arch/arm/configs/multi_v7_defconfig                |   1 -
>>>   arch/arm/configs/zx_defconfig                      |   1 -
>>>   arch/mips/configs/pistachio_defconfig              |   1 -
>>>   drivers/mmc/host/Kconfig                           |  11 +-
>>>   drivers/mmc/host/dw_mmc-pltfm.c                    |   2 +
>>>   drivers/mmc/host/dw_mmc.c                          | 258 +++++++++++++++++----
>>>   include/linux/mmc/dw_mmc.h                         |  27 ++-
>>>   14 files changed, 257 insertions(+), 75 deletions(-)
>>>
>>
>>
>>
> 
> 

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

* [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support
       [not found]     ` <55C30C1C.6070801@rock-chips.com>
@ 2015-08-06  7:37       ` Krzysztof Kozlowski
  0 siblings, 0 replies; 15+ messages in thread
From: Krzysztof Kozlowski @ 2015-08-06  7:37 UTC (permalink / raw)
  To: linux-arm-kernel

On 06.08.2015 16:26, Shawn Lin wrote:
> ? 2015/8/6 15:08, Krzysztof Kozlowski ??:
>> On 06.08.2015 15:44, Shawn Lin wrote:
>>> DesignWare MMC Controller can supports two types of DMA
>>> mode: external dma and internal dma. We get a RK312x platform
>>> integrated dw_mmc and ARM pl330 dma controller. This patch add
>>> edmac ops to support these platforms. I've tested it on RK312x
>>> platform with edmac mode and RK3288 platform with idmac mode.
>>>
>>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>>>
>>> ---
>>>
>>> Changes in v4:
>>> - remove "host->trans_mode" and use "host->use_dma" to indicate
>>>    transfer mode.
>>> - remove all bt-bindings' changes since we don't need new properities.
>>> - check transfer mode at runtime by reading HCON reg
>>> - spilt defconfig changes for each sub-architecture
>>> - fix the title of cover letter
>> How did you fixed the title? It is still empty :)
>>     Subject: [RFC PATCH v4 0/9]
>   I mentioned that in ChangeLog-v4 but unfortunately I forgot it.
>   Thanks, Krzysztof.  I will be more careful and add it for next version.
> 
>>
>>> - reuse some code for reducing code size
>>>
>>> Changes in v3:
>>> - choose transfer mode at runtime
>>> - remove all CONFIG_MMC_DW_IDMAC config option
>>> - add supports-idmac property for some platforms
>>>
>>> Changes in v2:
>>> - Fix typo of dev_info msg
>>> - remove unused dmach from declaration of dw_mci_dma_slave
>>>
>>>   drivers/mmc/host/Kconfig        |  11 +-
>>>   drivers/mmc/host/dw_mmc-pltfm.c |   2 +
>>>   drivers/mmc/host/dw_mmc.c       | 258
>>> ++++++++++++++++++++++++++++++++--------
>>>   include/linux/mmc/dw_mmc.h      |  27 ++++-
>>>   4 files changed, 232 insertions(+), 66 deletions(-)
>>>
>>> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
>>> index 6a0f9c7..a86c0eb 100644
>>> --- a/drivers/mmc/host/Kconfig
>>> +++ b/drivers/mmc/host/Kconfig
>>> @@ -607,15 +607,7 @@ config MMC_DW
>>>       help
>>>         This selects support for the Synopsys DesignWare Mobile
>>> Storage IP
>>>         block, this provides host support for SD and MMC interfaces,
>>> in both
>>> -      PIO and external DMA modes.
>>> -
>>> -config MMC_DW_IDMAC
>>> -    bool "Internal DMAC interface"
>>> -    depends on MMC_DW
>>> -    help
>>> -      This selects support for the internal DMAC block within the
>>> Synopsys
>>> -      Designware Mobile Storage IP block. This disables the external
>>> DMA
>>> -      interface.
>>> +      PIO, internal DMA mode and external DMA modes.
>>>     config MMC_DW_PLTFM
>>>       tristate "Synopsys Designware MCI Support as platform device"
>>> @@ -644,7 +636,6 @@ config MMC_DW_K3
>>>       tristate "K3 specific extensions for Synopsys DW Memory Card
>>> Interface"
>>>       depends on MMC_DW
>>>       select MMC_DW_PLTFM
>>> -    select MMC_DW_IDMAC
>>>       help
>>>         This selects support for Hisilicon K3 SoC specific extensions
>>> to the
>>>         Synopsys DesignWare Memory Card Interface driver. Select this
>>> option
>>> diff --git a/drivers/mmc/host/dw_mmc-pltfm.c
>>> b/drivers/mmc/host/dw_mmc-pltfm.c
>>> index ec6dbcd..7e1d13b 100644
>>> --- a/drivers/mmc/host/dw_mmc-pltfm.c
>>> +++ b/drivers/mmc/host/dw_mmc-pltfm.c
>>> @@ -59,6 +59,8 @@ int dw_mci_pltfm_register(struct platform_device
>>> *pdev,
>>>       host->pdata = pdev->dev.platform_data;
>>>         regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> +    /* Get registers' physical base address */
>>> +    host->phy_regs = (void *)(regs->start);
>>>       host->regs = devm_ioremap_resource(&pdev->dev, regs);
>>>       if (IS_ERR(host->regs))
>>>           return PTR_ERR(host->regs);
>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>> index 40e9d8e..5d6cdff 100644
>>> --- a/drivers/mmc/host/dw_mmc.c
>>> +++ b/drivers/mmc/host/dw_mmc.c
>>> @@ -56,7 +56,7 @@
>>>   #define DW_MCI_FREQ_MAX    200000000    /* unit: HZ */
>>>   #define DW_MCI_FREQ_MIN    400000        /* unit: HZ */
>>>   -#ifdef CONFIG_MMC_DW_IDMAC
>>> +
>>>   #define IDMAC_INT_CLR        (SDMMC_IDMAC_INT_AI |
>>> SDMMC_IDMAC_INT_NI | \
>>>                    SDMMC_IDMAC_INT_CES | SDMMC_IDMAC_INT_DU | \
>>>                    SDMMC_IDMAC_INT_FBE | SDMMC_IDMAC_INT_RI | \
>>> @@ -99,7 +99,6 @@ struct idmac_desc {
>>>         __le32        des3;    /* buffer 2 physical address */
>>>   };
>>> -#endif /* CONFIG_MMC_DW_IDMAC */
>>>     static bool dw_mci_reset(struct dw_mci *host);
>>>   static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset);
>>> @@ -403,7 +402,6 @@ static int dw_mci_get_dma_dir(struct mmc_data *data)
>>>           return DMA_FROM_DEVICE;
>>>   }
>>>   -#ifdef CONFIG_MMC_DW_IDMAC
>>>   static void dw_mci_dma_cleanup(struct dw_mci *host)
>>>   {
>>>       struct mmc_data *data = host->data;
>>> @@ -441,12 +439,21 @@ static void dw_mci_idmac_stop_dma(struct dw_mci
>>> *host)
>>>       mci_writel(host, BMOD, temp);
>>>   }
>>>   -static void dw_mci_idmac_complete_dma(struct dw_mci *host)
>>> +static void dw_mci_dmac_complete_dma(void *arg)
>>>   {
>>> +    struct dw_mci *host = arg;
>> Why changing the argument to void*?
> 
> This function will be used as callback hook of dmaengine, and the
> prototype is
> "typedef void (*dma_async_tx_callback)(void *dma_async_param);".
> w/o this change, we meet a warning  for incompatible pointer case.

Thanks for clarifying.

Best regards,
Krzysztof

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

* [RFC PATCH v4 3/9] mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843515-23935-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-06  9:05   ` Govindraj Raja
  2015-08-06 13:17   ` Ralf Baechle
  2015-08-12 22:05   ` Ralf Baechle
  2 siblings, 0 replies; 15+ messages in thread
From: Govindraj Raja @ 2015-08-06  9:05 UTC (permalink / raw)
  To: linux-arm-kernel



> -----Original Message-----
> From: Shawn Lin [mailto:shawn.lin at rock-chips.com]
> Sent: 06 August 2015 07:45 AM
> To: jh80.chung at samsung.com; ulf.hansson at linaro.org
> Cc: heiko at sntech.de; dianders at chromium.org; Vineet.Gupta1 at synopsys.com;
> Wei Xu; Joachim Eastwood; Alexey Brodkin; Kukjin Kim; Krzysztof Kozlowski;
> Russell King; Jun Nie; Ralf Baechle; Govindraj Raja; linux-arm-
> kernel at lists.infradead.org; linux-samsung-soc at vger.kernel.org; linux-
> mips at linux-mips.org; linux-mmc at vger.kernel.org; linux-
> kernel at vger.kernel.org; linux-rockchip at lists.infradead.org;
> devicetree at vger.kernel.org; Shawn Lin
> Subject: [RFC PATCH v4 3/9] mips: pistachio_defconfig: remove
> CONFIG_MMC_DW_IDMAC
> 
> DesignWare MMC Controller's transfer mode should be decided at runtime
> instead of compile-time. So we remove this config option and read dw_mmc's
> register to select DMA master.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
> 
>  arch/mips/configs/pistachio_defconfig | 1 -
>  1 file changed, 1 deletion(-)

Acked-by: Govindraj Raja <govindraj.raja@imgtec.com>

--
Thanks,
Govindraj.R

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

* [RFC PATCH v4 3/9] mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843515-23935-1-git-send-email-shawn.lin@rock-chips.com>
  2015-08-06  9:05   ` [RFC PATCH v4 3/9] mips: pistachio_defconfig: " Govindraj Raja
@ 2015-08-06 13:17   ` Ralf Baechle
  2015-08-12 22:05   ` Ralf Baechle
  2 siblings, 0 replies; 15+ messages in thread
From: Ralf Baechle @ 2015-08-06 13:17 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Aug 06, 2015 at 02:45:15PM +0800, Shawn Lin wrote:

>  arch/mips/configs/pistachio_defconfig | 1 -

Acked-by: Ralf Baechle <ralf@linux-mips.org>

  Ralf

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

* [RFC PATCH v4 4/9] arc: axs10x_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843526-23976-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-07  5:48   ` Vineet Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Vineet Gupta @ 2015-08-07  5:48 UTC (permalink / raw)
  To: linux-arm-kernel

On Thursday 06 August 2015 12:19 PM, Shawn Lin wrote:
> DesignWare MMC Controller's transfer mode should be decided
> at runtime instead of compile-time. So we remove this config
> option and read dw_mmc's register to select DMA master.
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

Acked-by: Vineet Gupta <vgupta@synopsys.com>

Thx,
-Vineet

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

* [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support
       [not found] ` <1438843491-23853-1-git-send-email-shawn.lin@rock-chips.com>
  2015-08-06  7:08   ` [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support Krzysztof Kozlowski
@ 2015-08-07 21:32   ` Joachim Eastwood
  2015-08-07 23:37     ` Shawn Lin
  2015-08-10 18:03   ` Alim Akhtar
  2 siblings, 1 reply; 15+ messages in thread
From: Joachim Eastwood @ 2015-08-07 21:32 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Shawn,

On 6 August 2015 at 08:44, Shawn Lin <shawn.lin@rock-chips.com> wrote:
> DesignWare MMC Controller can supports two types of DMA
> mode: external dma and internal dma. We get a RK312x platform
> integrated dw_mmc and ARM pl330 dma controller. This patch add
> edmac ops to support these platforms. I've tested it on RK312x
> platform with edmac mode and RK3288 platform with idmac mode.
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

> @@ -2256,26 +2373,30 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
>
>         }
>
> -#ifdef CONFIG_MMC_DW_IDMAC
> -       /* Handle DMA interrupts */
> -       if (host->dma_64bit_address == 1) {
> -               pending = mci_readl(host, IDSTS64);
> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_TI |
> -                                                       SDMMC_IDMAC_INT_RI);
> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
> -                       host->dma_ops->complete(host);
> -               }
> -       } else {
> -               pending = mci_readl(host, IDSTS);
> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI |
> -                                                       SDMMC_IDMAC_INT_RI);
> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
> -                       host->dma_ops->complete(host);
> +       if (host->use_dma == TRANS_MODE_IDMAC) {

Doing:
if (host->use_dma != TRANS_MODE_IDMAC)
    return IRQ_HANDLED;

Could save you the extra level of identation you add below.

> +               /* Handle DMA interrupts */
> +               if (host->dma_64bit_address == 1) {
> +                       pending = mci_readl(host, IDSTS64);
> +                       if (pending & (SDMMC_IDMAC_INT_TI |
> +                                      SDMMC_IDMAC_INT_RI)) {
> +                               mci_writel(host, IDSTS64,
> +                                          SDMMC_IDMAC_INT_TI |
> +                                          SDMMC_IDMAC_INT_RI);
> +                               mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
> +                               host->dma_ops->complete((void *)host);
> +                       }
> +               } else {
> +                       pending = mci_readl(host, IDSTS);
> +                       if (pending & (SDMMC_IDMAC_INT_TI |
> +                                      SDMMC_IDMAC_INT_RI)) {
> +                               mci_writel(host, IDSTS,
> +                                          SDMMC_IDMAC_INT_TI |
> +                                          SDMMC_IDMAC_INT_RI);
> +                               mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
> +                               host->dma_ops->complete((void *)host);
> +                       }
>                 }
>         }
> -#endif
>
>         return IRQ_HANDLED;
>  }


> @@ -2437,6 +2567,21 @@ static void dw_mci_cleanup_slot(struct dw_mci_slot *slot, unsigned int id)
>  static void dw_mci_init_dma(struct dw_mci *host)
>  {
>         int addr_config;
> +       int trans_mode;
> +       struct device *dev = host->dev;
> +       struct device_node *np = dev->of_node;
> +
> +       /* Check tansfer mode */
> +       trans_mode = (mci_readl(host, HCON) >> 16) & 0x3;

I think it would be nice if you could add some defines for 16 and 0x03
or add a macro like SDMMC_GET_FCNT() that is in dw_mmc.h.

> +       if (trans_mode == 0) {
> +               trans_mode = TRANS_MODE_IDMAC;
> +       } else if (trans_mode == 1 || trans_mode == 2) {
> +               trans_mode = TRANS_MODE_EDMAC;
> +       } else {
> +               trans_mode = TRANS_MODE_PIO;
> +               goto no_dma;
> +       }
> +
>         /* Check ADDR_CONFIG bit in HCON to find IDMAC address bus width */
>         addr_config = (mci_readl(host, HCON) >> 27) & 0x01;

I'll try to get this patch tested on my lpc18xx platform soon.
btw, the HCON reg on lpc18xx reads as 0x00e42cc1 (address 0x40004070).


regard,
Joachim Eastwood

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

* [RFC PATCH v4 7/9] arm: lpc18xx_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843590-24101-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-07 21:34   ` Joachim Eastwood
  0 siblings, 0 replies; 15+ messages in thread
From: Joachim Eastwood @ 2015-08-07 21:34 UTC (permalink / raw)
  To: linux-arm-kernel

On 6 August 2015 at 08:46, Shawn Lin <shawn.lin@rock-chips.com> wrote:
> DesignWare MMC Controller's transfer mode should be decided
> at runtime instead of compile-time. So we remove this config
> option and read dw_mmc's register to select DMA master.
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

Acked-by: Joachim Eastwood <manabian@gmail.com>

>  arch/arm/configs/lpc18xx_defconfig | 1 -
>  1 file changed, 1 deletion(-)
>
> diff --git a/arch/arm/configs/lpc18xx_defconfig b/arch/arm/configs/lpc18xx_defconfig
> index 1c47f86..b7e8cda 100644
> --- a/arch/arm/configs/lpc18xx_defconfig
> +++ b/arch/arm/configs/lpc18xx_defconfig
> @@ -119,7 +119,6 @@ CONFIG_USB_EHCI_HCD=y
>  CONFIG_USB_EHCI_ROOT_HUB_TT=y
>  CONFIG_MMC=y
>  CONFIG_MMC_DW=y
> -CONFIG_MMC_DW_IDMAC=y
>  CONFIG_NEW_LEDS=y
>  CONFIG_LEDS_CLASS=y
>  CONFIG_LEDS_PCA9532=y
> --
> 2.3.7
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

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

* [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support
  2015-08-07 21:32   ` Joachim Eastwood
@ 2015-08-07 23:37     ` Shawn Lin
  0 siblings, 0 replies; 15+ messages in thread
From: Shawn Lin @ 2015-08-07 23:37 UTC (permalink / raw)
  To: linux-arm-kernel

? 2015/8/8 5:32, Joachim Eastwood ??:
> Hi Shawn,
>
> On 6 August 2015 at 08:44, Shawn Lin <shawn.lin@rock-chips.com> wrote:
>> DesignWare MMC Controller can supports two types of DMA
>> mode: external dma and internal dma. We get a RK312x platform
>> integrated dw_mmc and ARM pl330 dma controller. This patch add
>> edmac ops to support these platforms. I've tested it on RK312x
>> platform with edmac mode and RK3288 platform with idmac mode.
>>
>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>
>> @@ -2256,26 +2373,30 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
>>
>>          }
>>
>> -#ifdef CONFIG_MMC_DW_IDMAC
>> -       /* Handle DMA interrupts */
>> -       if (host->dma_64bit_address == 1) {
>> -               pending = mci_readl(host, IDSTS64);
>> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
>> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_TI |
>> -                                                       SDMMC_IDMAC_INT_RI);
>> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
>> -                       host->dma_ops->complete(host);
>> -               }
>> -       } else {
>> -               pending = mci_readl(host, IDSTS);
>> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
>> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI |
>> -                                                       SDMMC_IDMAC_INT_RI);
>> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
>> -                       host->dma_ops->complete(host);
>> +       if (host->use_dma == TRANS_MODE_IDMAC) {
>
> Doing:
> if (host->use_dma != TRANS_MODE_IDMAC)
>      return IRQ_HANDLED;
>

Okay.

> Could save you the extra level of identation you add below.
>
>> +               /* Handle DMA interrupts */
>> +               if (host->dma_64bit_address == 1) {
>> +                       pending = mci_readl(host, IDSTS64);
>> +                       if (pending & (SDMMC_IDMAC_INT_TI |
>> +                                      SDMMC_IDMAC_INT_RI)) {
>> +                               mci_writel(host, IDSTS64,
>> +                                          SDMMC_IDMAC_INT_TI |
>> +                                          SDMMC_IDMAC_INT_RI);
>> +                               mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
>> +                               host->dma_ops->complete((void *)host);
>> +                       }
>> +               } else {
>> +                       pending = mci_readl(host, IDSTS);
>> +                       if (pending & (SDMMC_IDMAC_INT_TI |
>> +                                      SDMMC_IDMAC_INT_RI)) {
>> +                               mci_writel(host, IDSTS,
>> +                                          SDMMC_IDMAC_INT_TI |
>> +                                          SDMMC_IDMAC_INT_RI);
>> +                               mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
>> +                               host->dma_ops->complete((void *)host);
>> +                       }
>>                  }
>>          }
>> -#endif
>>
>>          return IRQ_HANDLED;
>>   }
>
>
>> @@ -2437,6 +2567,21 @@ static void dw_mci_cleanup_slot(struct dw_mci_slot *slot, unsigned int id)
>>   static void dw_mci_init_dma(struct dw_mci *host)
>>   {
>>          int addr_config;
>> +       int trans_mode;
>> +       struct device *dev = host->dev;
>> +       struct device_node *np = dev->of_node;
>> +
>> +       /* Check tansfer mode */
>> +       trans_mode = (mci_readl(host, HCON) >> 16) & 0x3;
>
> I think it would be nice if you could add some defines for 16 and 0x03
> or add a macro like SDMMC_GET_FCNT() that is in dw_mmc.h.
>

yes, it's better to avoid magic number for register operation to make
others understand w/o checking databook for details. And might more than 
one (e.g "Check ADDR_CONFIG bit in HCON to find IDMAC address bus 
width") should be modified.

Although one patch only do one thing, I will drop by to make it in v5.

>> +       if (trans_mode == 0) {
>> +               trans_mode = TRANS_MODE_IDMAC;
>> +       } else if (trans_mode == 1 || trans_mode == 2) {
>> +               trans_mode = TRANS_MODE_EDMAC;
>> +       } else {
>> +               trans_mode = TRANS_MODE_PIO;
>> +               goto no_dma;
>> +       }
>> +
>>          /* Check ADDR_CONFIG bit in HCON to find IDMAC address bus width */
>>          addr_config = (mci_readl(host, HCON) >> 27) & 0x01;
>
> I'll try to get this patch tested on my lpc18xx platform soon.
> btw, the HCON reg on lpc18xx reads as 0x00e42cc1 (address 0x40004070).
>

yes, HCON[17:16] is 2b'00 means your lpc18xx use IDMAC.

>
> regard,
> Joachim Eastwood
>
>
>


-- 
Shawn Lin

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

* [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support
       [not found] ` <1438843491-23853-1-git-send-email-shawn.lin@rock-chips.com>
  2015-08-06  7:08   ` [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support Krzysztof Kozlowski
  2015-08-07 21:32   ` Joachim Eastwood
@ 2015-08-10 18:03   ` Alim Akhtar
  2 siblings, 0 replies; 15+ messages in thread
From: Alim Akhtar @ 2015-08-10 18:03 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Shawn

On Thu, Aug 6, 2015 at 12:14 PM, Shawn Lin <shawn.lin@rock-chips.com> wrote:
> DesignWare MMC Controller can supports two types of DMA
> mode: external dma and internal dma. We get a RK312x platform
> integrated dw_mmc and ARM pl330 dma controller. This patch add
> edmac ops to support these platforms. I've tested it on RK312x
> platform with edmac mode and RK3288 platform with idmac mode.
>
Just curious to know if their are any performance (read/write)
difference with Idmac and edmac?

> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>
> ---
>
> Changes in v4:
> - remove "host->trans_mode" and use "host->use_dma" to indicate
>   transfer mode.
> - remove all bt-bindings' changes since we don't need new properities.
> - check transfer mode at runtime by reading HCON reg
> - spilt defconfig changes for each sub-architecture
> - fix the title of cover letter
> - reuse some code for reducing code size
>
> Changes in v3:
> - choose transfer mode at runtime
> - remove all CONFIG_MMC_DW_IDMAC config option
> - add supports-idmac property for some platforms
>
> Changes in v2:
> - Fix typo of dev_info msg
> - remove unused dmach from declaration of dw_mci_dma_slave
>
>  drivers/mmc/host/Kconfig        |  11 +-
>  drivers/mmc/host/dw_mmc-pltfm.c |   2 +
>  drivers/mmc/host/dw_mmc.c       | 258 ++++++++++++++++++++++++++++++++--------
>  include/linux/mmc/dw_mmc.h      |  27 ++++-
>  4 files changed, 232 insertions(+), 66 deletions(-)
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 6a0f9c7..a86c0eb 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -607,15 +607,7 @@ config MMC_DW
>         help
>           This selects support for the Synopsys DesignWare Mobile Storage IP
>           block, this provides host support for SD and MMC interfaces, in both
> -         PIO and external DMA modes.
> -
> -config MMC_DW_IDMAC
> -       bool "Internal DMAC interface"
> -       depends on MMC_DW
> -       help
> -         This selects support for the internal DMAC block within the Synopsys
> -         Designware Mobile Storage IP block. This disables the external DMA
> -         interface.
> +         PIO, internal DMA mode and external DMA modes.
>
>  config MMC_DW_PLTFM
>         tristate "Synopsys Designware MCI Support as platform device"
> @@ -644,7 +636,6 @@ config MMC_DW_K3
>         tristate "K3 specific extensions for Synopsys DW Memory Card Interface"
>         depends on MMC_DW
>         select MMC_DW_PLTFM
> -       select MMC_DW_IDMAC
>         help
>           This selects support for Hisilicon K3 SoC specific extensions to the
>           Synopsys DesignWare Memory Card Interface driver. Select this option
> diff --git a/drivers/mmc/host/dw_mmc-pltfm.c b/drivers/mmc/host/dw_mmc-pltfm.c
> index ec6dbcd..7e1d13b 100644
> --- a/drivers/mmc/host/dw_mmc-pltfm.c
> +++ b/drivers/mmc/host/dw_mmc-pltfm.c
> @@ -59,6 +59,8 @@ int dw_mci_pltfm_register(struct platform_device *pdev,
>         host->pdata = pdev->dev.platform_data;
>
>         regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       /* Get registers' physical base address */
> +       host->phy_regs = (void *)(regs->start);
>         host->regs = devm_ioremap_resource(&pdev->dev, regs);
>         if (IS_ERR(host->regs))
>                 return PTR_ERR(host->regs);
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 40e9d8e..5d6cdff 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -56,7 +56,7 @@
>  #define DW_MCI_FREQ_MAX        200000000       /* unit: HZ */
>  #define DW_MCI_FREQ_MIN        400000          /* unit: HZ */
>
> -#ifdef CONFIG_MMC_DW_IDMAC
> +
>  #define IDMAC_INT_CLR          (SDMMC_IDMAC_INT_AI | SDMMC_IDMAC_INT_NI | \
>                                  SDMMC_IDMAC_INT_CES | SDMMC_IDMAC_INT_DU | \
>                                  SDMMC_IDMAC_INT_FBE | SDMMC_IDMAC_INT_RI | \
> @@ -99,7 +99,6 @@ struct idmac_desc {
>
>         __le32          des3;   /* buffer 2 physical address */
>  };
> -#endif /* CONFIG_MMC_DW_IDMAC */
>
>  static bool dw_mci_reset(struct dw_mci *host);
>  static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset);
> @@ -403,7 +402,6 @@ static int dw_mci_get_dma_dir(struct mmc_data *data)
>                 return DMA_FROM_DEVICE;
>  }
>
> -#ifdef CONFIG_MMC_DW_IDMAC
>  static void dw_mci_dma_cleanup(struct dw_mci *host)
>  {
>         struct mmc_data *data = host->data;
> @@ -441,12 +439,21 @@ static void dw_mci_idmac_stop_dma(struct dw_mci *host)
>         mci_writel(host, BMOD, temp);
>  }
>
> -static void dw_mci_idmac_complete_dma(struct dw_mci *host)
> +static void dw_mci_dmac_complete_dma(void *arg)
>  {
> +       struct dw_mci *host = arg;
>         struct mmc_data *data = host->data;
>
>         dev_vdbg(host->dev, "DMA complete\n");
>
> +       if (host->use_dma == TRANS_MODE_EDMAC)
> +               if (data && (data->flags & MMC_DATA_READ))
> +                       /* Invalidate cache after read */
> +                       dma_sync_sg_for_cpu(mmc_dev(host->cur_slot->mmc),
> +                                           data->sg,
> +                                           data->sg_len,
> +                                           DMA_FROM_DEVICE);
> +
>         host->dma_ops->cleanup(host);
>
>         /*
> @@ -527,7 +534,7 @@ static void dw_mci_translate_sglist(struct dw_mci *host, struct mmc_data *data,
>         wmb();
>  }
>
> -static void dw_mci_idmac_start_dma(struct dw_mci *host, unsigned int sg_len)
> +static int dw_mci_idmac_start_dma(struct dw_mci *host, unsigned int sg_len)
>  {
>         u32 temp;
>
> @@ -551,6 +558,8 @@ static void dw_mci_idmac_start_dma(struct dw_mci *host, unsigned int sg_len)
>
>         /* Start it running */
>         mci_writel(host, PLDMND, 1);
> +
> +       return 0;
>  }
>
>  static int dw_mci_idmac_init(struct dw_mci *host)
> @@ -629,10 +638,112 @@ static const struct dw_mci_dma_ops dw_mci_idmac_ops = {
>         .init = dw_mci_idmac_init,
>         .start = dw_mci_idmac_start_dma,
>         .stop = dw_mci_idmac_stop_dma,
> -       .complete = dw_mci_idmac_complete_dma,
> +       .complete = dw_mci_dmac_complete_dma,
> +       .cleanup = dw_mci_dma_cleanup,
> +};
> +
> +static void dw_mci_edmac_stop_dma(struct dw_mci *host)
> +{
> +       dmaengine_terminate_all(host->dms->ch);
> +}
> +
> +static int dw_mci_edmac_start_dma(struct dw_mci *host,
> +                                           unsigned int sg_len)
> +{
> +       struct dma_slave_config cfg;
> +       struct dma_async_tx_descriptor *desc = NULL;
> +       struct scatterlist *sgl = host->data->sg;
> +       const u32 mszs[] = {1, 4, 8, 16, 32, 64, 128, 256};
> +       u32 sg_elems = host->data->sg_len;
> +       u32 fifoth_val;
> +       u32 fifo_offset = host->fifo_reg - host->regs;
> +       int ret = 0;
> +
> +       /* Set external dma config: burst size, burst width */
> +       cfg.dst_addr = (dma_addr_t)(host->phy_regs + fifo_offset);
> +       cfg.src_addr = cfg.dst_addr;
> +       cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
> +       cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
> +
> +       /* Match burst msize with external dma config */
> +       fifoth_val = mci_readl(host, FIFOTH);
> +       cfg.dst_maxburst = mszs[(fifoth_val >> 28) & 0x7];
> +       cfg.src_maxburst = cfg.dst_maxburst;
> +
> +       if (host->data->flags & MMC_DATA_WRITE)
> +               cfg.direction = DMA_MEM_TO_DEV;
> +       else /* MMC_DATA_READ */
> +               cfg.direction = DMA_DEV_TO_MEM;
> +
> +       ret = dmaengine_slave_config(host->dms->ch, &cfg);
> +       if (ret) {
> +               dev_err(host->dev, "Failed to config edmac.\n");
> +               return -EBUSY;
> +       }
> +
> +       desc = dmaengine_prep_slave_sg(host->dms->ch, sgl,
> +                                      sg_len, cfg.direction,
> +                                      DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
> +       if (!desc) {
> +               dev_err(host->dev, "Can't prepare slave sg.\n");
> +               return -EBUSY;
> +       }
> +
> +       /* Set dw_mci_edmac_complete_dma as callback */
> +       desc->callback = dw_mci_dmac_complete_dma;
> +       desc->callback_param = (void *)host;
> +       dmaengine_submit(desc);
> +
> +       /* Flush cache before write */
> +       if (host->data->flags & MMC_DATA_WRITE)
> +               dma_sync_sg_for_device(mmc_dev(host->cur_slot->mmc), sgl,
> +                                      sg_elems, DMA_TO_DEVICE);
> +
> +       dma_async_issue_pending(host->dms->ch);
> +
> +       return 0;
> +}
> +
> +static int dw_mci_edmac_init(struct dw_mci *host)
> +{
> +       /* Request external dma channel */
> +       host->dms = kzalloc(sizeof(struct dw_mci_dma_slave), GFP_KERNEL);
> +       if (!host->dms)
> +               return -ENOMEM;
> +
> +       host->dms->ch = dma_request_slave_channel(host->dev, "rx-tx");
> +       if (!host->dms->ch) {
> +               dev_err(host->dev,
> +                       "Failed to get external DMA channel %d\n",
> +                       host->dms->ch->chan_id);
> +               kfree(host->dms);
> +               host->dms = NULL;
> +               return -ENXIO;
> +       }
> +
> +       return 0;
> +}
> +
> +static void dw_mci_edmac_exit(struct dw_mci *host)
> +{
> +       if (host->dms) {
> +               if (host->dms->ch) {
> +                       dma_release_channel(host->dms->ch);
> +                       host->dms->ch = NULL;
> +               }
> +               kfree(host->dms);
> +               host->dms = NULL;
> +       }
> +}
> +
> +static const struct dw_mci_dma_ops dw_mci_edmac_ops = {
> +       .init = dw_mci_edmac_init,
> +       .exit = dw_mci_edmac_exit,
> +       .start = dw_mci_edmac_start_dma,
> +       .stop = dw_mci_edmac_stop_dma,
> +       .complete = dw_mci_dmac_complete_dma,
>         .cleanup = dw_mci_dma_cleanup,
>  };
> -#endif /* CONFIG_MMC_DW_IDMAC */
>
>  static int dw_mci_pre_dma_transfer(struct dw_mci *host,
>                                    struct mmc_data *data,
> @@ -712,7 +823,6 @@ static void dw_mci_post_req(struct mmc_host *mmc,
>
>  static void dw_mci_adjust_fifoth(struct dw_mci *host, struct mmc_data *data)
>  {
> -#ifdef CONFIG_MMC_DW_IDMAC
>         unsigned int blksz = data->blksz;
>         const u32 mszs[] = {1, 4, 8, 16, 32, 64, 128, 256};
>         u32 fifo_width = 1 << host->data_shift;
> @@ -720,6 +830,10 @@ static void dw_mci_adjust_fifoth(struct dw_mci *host, struct mmc_data *data)
>         u32 msize = 0, rx_wmark = 1, tx_wmark, tx_wmark_invers;
>         int idx = (sizeof(mszs) / sizeof(mszs[0])) - 1;
>
> +       /* pio should ship this scenario */
> +       if (!host->use_dma)
> +               return;
> +
>         tx_wmark = (host->fifo_depth) / 2;
>         tx_wmark_invers = host->fifo_depth - tx_wmark;
>
> @@ -748,7 +862,6 @@ static void dw_mci_adjust_fifoth(struct dw_mci *host, struct mmc_data *data)
>  done:
>         fifoth_val = SDMMC_SET_FIFOTH(msize, rx_wmark, tx_wmark);
>         mci_writel(host, FIFOTH, fifoth_val);
> -#endif
>  }
>
>  static void dw_mci_ctrl_rd_thld(struct dw_mci *host, struct mmc_data *data)
> @@ -835,7 +948,11 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data)
>         mci_writel(host, INTMASK, temp);
>         spin_unlock_irqrestore(&host->irq_lock, irqflags);
>
> -       host->dma_ops->start(host, sg_len);
> +       if (host->dma_ops->start(host, sg_len)) {
> +               /* We can't do DMA */
> +               dev_err(host->dev, "%s: failed to start DMA.\n", __func__);
> +               return -ENODEV;
> +       }
>
>         return 0;
>  }
> @@ -2256,26 +2373,30 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
>
>         }
>
> -#ifdef CONFIG_MMC_DW_IDMAC
> -       /* Handle DMA interrupts */
> -       if (host->dma_64bit_address == 1) {
> -               pending = mci_readl(host, IDSTS64);
> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_TI |
> -                                                       SDMMC_IDMAC_INT_RI);
> -                       mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
> -                       host->dma_ops->complete(host);
> -               }
> -       } else {
> -               pending = mci_readl(host, IDSTS);
> -               if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI |
> -                                                       SDMMC_IDMAC_INT_RI);
> -                       mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
> -                       host->dma_ops->complete(host);
> +       if (host->use_dma == TRANS_MODE_IDMAC) {
> +               /* Handle DMA interrupts */
> +               if (host->dma_64bit_address == 1) {
> +                       pending = mci_readl(host, IDSTS64);
> +                       if (pending & (SDMMC_IDMAC_INT_TI |
> +                                      SDMMC_IDMAC_INT_RI)) {
> +                               mci_writel(host, IDSTS64,
> +                                          SDMMC_IDMAC_INT_TI |
> +                                          SDMMC_IDMAC_INT_RI);
> +                               mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI);
> +                               host->dma_ops->complete((void *)host);
> +                       }
> +               } else {
> +                       pending = mci_readl(host, IDSTS);
> +                       if (pending & (SDMMC_IDMAC_INT_TI |
> +                                      SDMMC_IDMAC_INT_RI)) {
> +                               mci_writel(host, IDSTS,
> +                                          SDMMC_IDMAC_INT_TI |
> +                                          SDMMC_IDMAC_INT_RI);
> +                               mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
> +                               host->dma_ops->complete((void *)host);
> +                       }
>                 }
>         }
> -#endif
>
>         return IRQ_HANDLED;
>  }
> @@ -2391,19 +2512,28 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
>                 mmc->max_seg_size = host->pdata->blk_settings->max_seg_size;
>         } else {
>                 /* Useful defaults if platform data is unset. */
> -#ifdef CONFIG_MMC_DW_IDMAC
> -               mmc->max_segs = host->ring_size;
> -               mmc->max_blk_size = 65536;
> -               mmc->max_seg_size = 0x1000;
> -               mmc->max_req_size = mmc->max_seg_size * host->ring_size;
> -               mmc->max_blk_count = mmc->max_req_size / 512;
> -#else
> -               mmc->max_segs = 64;
> -               mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */
> -               mmc->max_blk_count = 512;
> -               mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
> -               mmc->max_seg_size = mmc->max_req_size;
> -#endif /* CONFIG_MMC_DW_IDMAC */
> +               if (host->use_dma == TRANS_MODE_IDMAC) {
> +                       mmc->max_segs = host->ring_size;
> +                       mmc->max_blk_size = 65536;
> +                       mmc->max_seg_size = 0x1000;
> +                       mmc->max_req_size = mmc->max_seg_size * host->ring_size;
> +                       mmc->max_blk_count = mmc->max_req_size / 512;
> +               } else if (host->use_dma == TRANS_MODE_EDMAC) {
> +                       mmc->max_segs = 64;
> +                       mmc->max_blk_size = 65536;
> +                       mmc->max_blk_count = 65535;
> +                       mmc->max_req_size =
> +                                       mmc->max_blk_size * mmc->max_blk_count;
> +                       mmc->max_seg_size = mmc->max_req_size;
> +               } else {
> +                       /* TRANS_MODE_PIO */
> +                       mmc->max_segs = 64;
> +                       mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */
> +                       mmc->max_blk_count = 512;
> +                       mmc->max_req_size =
> +                                       mmc->max_blk_size * mmc->max_blk_count;
> +                       mmc->max_seg_size = mmc->max_req_size;
> +               }
>         }
>
>         if (dw_mci_get_cd(mmc))
> @@ -2437,6 +2567,21 @@ static void dw_mci_cleanup_slot(struct dw_mci_slot *slot, unsigned int id)
>  static void dw_mci_init_dma(struct dw_mci *host)
>  {
>         int addr_config;
> +       int trans_mode;
> +       struct device *dev = host->dev;
> +       struct device_node *np = dev->of_node;
> +
> +       /* Check tansfer mode */
> +       trans_mode = (mci_readl(host, HCON) >> 16) & 0x3;
> +       if (trans_mode == 0) {
> +               trans_mode = TRANS_MODE_IDMAC;
> +       } else if (trans_mode == 1 || trans_mode == 2) {
> +               trans_mode = TRANS_MODE_EDMAC;
> +       } else {
> +               trans_mode = TRANS_MODE_PIO;
> +               goto no_dma;
> +       }
> +
>         /* Check ADDR_CONFIG bit in HCON to find IDMAC address bus width */
>         addr_config = (mci_readl(host, HCON) >> 27) & 0x01;
>
> @@ -2462,10 +2607,19 @@ static void dw_mci_init_dma(struct dw_mci *host)
>         }
>
>         /* Determine which DMA interface to use */
> -#ifdef CONFIG_MMC_DW_IDMAC
> -       host->dma_ops = &dw_mci_idmac_ops;
> -       dev_info(host->dev, "Using internal DMA controller.\n");
> -#endif
> +       if (trans_mode == TRANS_MODE_IDMAC) {
> +               host->dma_ops = &dw_mci_idmac_ops;
> +               dev_info(host->dev, "Using internal DMA controller.\n");
> +       } else {
> +               /* TRANS_MODE_EDMAC: check dma bindings again */
> +               if ((of_property_count_strings(np, "dma-names") < 0) ||
> +                   (!of_find_property(np, "dmas", NULL))) {
> +                       trans_mode = TRANS_MODE_PIO;
> +                       goto no_dma;
> +               }
> +               host->dma_ops = &dw_mci_edmac_ops;
> +               dev_info(host->dev, "Using external DMA controller.\n");
> +       }
>
>         if (!host->dma_ops)
>                 goto no_dma;
> @@ -2482,12 +2636,12 @@ static void dw_mci_init_dma(struct dw_mci *host)
>                 goto no_dma;
>         }
>
> -       host->use_dma = 1;
> +       host->use_dma = trans_mode;
>         return;
>
>  no_dma:
>         dev_info(host->dev, "Using PIO mode.\n");
> -       host->use_dma = 0;
> +       host->use_dma = trans_mode;
>         return;
>  }
>
> @@ -2570,10 +2724,9 @@ static bool dw_mci_reset(struct dw_mci *host)
>                 }
>         }
>
> -#if IS_ENABLED(CONFIG_MMC_DW_IDMAC)
> -       /* It is also recommended that we reset and reprogram idmac */
> -       dw_mci_idmac_reset(host);
> -#endif
> +       if (host->use_dma == TRANS_MODE_IDMAC)
> +               /* It is also recommended that we reset and reprogram idmac */
> +               dw_mci_idmac_reset(host);
>
>         ret = true;
>
> @@ -2958,6 +3111,9 @@ EXPORT_SYMBOL(dw_mci_remove);
>   */
>  int dw_mci_suspend(struct dw_mci *host)
>  {
> +       if (host->use_dma && host->dma_ops->exit)
> +               host->dma_ops->exit(host);
> +
>         return 0;
>  }
>  EXPORT_SYMBOL(dw_mci_suspend);
> diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h
> index 5be9767..9ed6257 100644
> --- a/include/linux/mmc/dw_mmc.h
> +++ b/include/linux/mmc/dw_mmc.h
> @@ -16,6 +16,7 @@
>
>  #include <linux/scatterlist.h>
>  #include <linux/mmc/core.h>
> +#include <linux/dmaengine.h>
>
>  #define MAX_MCI_SLOTS  2
>
> @@ -40,6 +41,17 @@ enum {
>
>  struct mmc_data;
>
> +enum {
> +       TRANS_MODE_PIO = 0,
> +       TRANS_MODE_IDMAC,
> +       TRANS_MODE_EDMAC
> +};
> +
> +struct dw_mci_dma_slave {
> +       struct dma_chan *ch;
> +       enum dma_transfer_direction direction;
> +};
> +
>  /**
>   * struct dw_mci - MMC controller state shared between all slots
>   * @lock: Spinlock protecting the queue and associated data.
> @@ -153,11 +165,16 @@ struct dw_mci {
>         dma_addr_t              sg_dma;
>         void                    *sg_cpu;
>         const struct dw_mci_dma_ops     *dma_ops;
> -#ifdef CONFIG_MMC_DW_IDMAC
> +       /* For idmac */
>         unsigned int            ring_size;
> -#else
> +
> +       /* For edmac */
> +       struct dw_mci_dma_slave *dms;
> +       /* Registers's physical base address */
> +       void                    *phy_regs;
> +
>         struct dw_mci_dma_data  *dma_data;
> -#endif
> +
>         u32                     cmd_status;
>         u32                     data_status;
>         u32                     stop_cmdr;
> @@ -210,8 +227,8 @@ struct dw_mci {
>  struct dw_mci_dma_ops {
>         /* DMA Ops */
>         int (*init)(struct dw_mci *host);
> -       void (*start)(struct dw_mci *host, unsigned int sg_len);
> -       void (*complete)(struct dw_mci *host);
> +       int (*start)(struct dw_mci *host, unsigned int sg_len);
> +       void (*complete)(void *host);
>         void (*stop)(struct dw_mci *host);
>         void (*cleanup)(struct dw_mci *host);
>         void (*exit)(struct dw_mci *host);
> --
> 2.3.7
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Regards,
Alim

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

* [RFC PATCH v4 3/9] mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843515-23935-1-git-send-email-shawn.lin@rock-chips.com>
  2015-08-06  9:05   ` [RFC PATCH v4 3/9] mips: pistachio_defconfig: " Govindraj Raja
  2015-08-06 13:17   ` Ralf Baechle
@ 2015-08-12 22:05   ` Ralf Baechle
  2015-08-13  0:08     ` Shawn Lin
  2 siblings, 1 reply; 15+ messages in thread
From: Ralf Baechle @ 2015-08-12 22:05 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Aug 06, 2015 at 02:45:15PM +0800, Shawn Lin wrote:

> DesignWare MMC Controller's transfer mode should be decided
> at runtime instead of compile-time. So we remove this config
> option and read dw_mmc's register to select DMA master.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
> 
>  arch/mips/configs/pistachio_defconfig | 1 -

Acked-by: Ralf Baechle <ralf@linux-mips.org>

Please feel free to merge this patch with the remainder
of the series.

  Ralf

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

* [RFC PATCH v4 3/9] mips: pistachio_defconfig: remove CONFIG_MMC_DW_IDMAC
  2015-08-12 22:05   ` Ralf Baechle
@ 2015-08-13  0:08     ` Shawn Lin
  0 siblings, 0 replies; 15+ messages in thread
From: Shawn Lin @ 2015-08-13  0:08 UTC (permalink / raw)
  To: linux-arm-kernel

? 2015/8/13 6:05, Ralf Baechle ??:
> On Thu, Aug 06, 2015 at 02:45:15PM +0800, Shawn Lin wrote:
>
>> DesignWare MMC Controller's transfer mode should be decided
>> at runtime instead of compile-time. So we remove this config
>> option and read dw_mmc's register to select DMA master.
>>
>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>> ---
>>
>> Changes in v4: None
>> Changes in v3: None
>> Changes in v2: None
>>
>>   arch/mips/configs/pistachio_defconfig | 1 -
>
> Acked-by: Ralf Baechle <ralf@linux-mips.org>
>
> Please feel free to merge this patch with the remainder
> of the series.
>

Thanks, Ralf. :)

v5 is coming which will be rebased on 
"https://github.com/jh80chung/dw-mmc.git tags/dw-mmc-for-ulf-v4.2" for 
the next merge window
that make Jeahoon do it easier. Also define new macro for reading
HCON register suggested by Joachim.


>    Ralf
>
>
>


-- 
Shawn Lin

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

* [RFC PATCH v4 6/9] arm: hisi_defconfig: remove CONFIG_MMC_DW_IDMAC
       [not found] ` <1438843553-24058-1-git-send-email-shawn.lin@rock-chips.com>
@ 2015-08-13 10:18   ` Wei Xu
  0 siblings, 0 replies; 15+ messages in thread
From: Wei Xu @ 2015-08-13 10:18 UTC (permalink / raw)
  To: linux-arm-kernel



On 8/6/2015 7:45 AM, Shawn Lin wrote:
> DesignWare MMC Controller's transfer mode should be decided
> at runtime instead of compile-time. So we remove this config
> option and read dw_mmc's register to select DMA master.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

Acked-by: Wei Xu <xuwei5@hisilicon.com>

> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
> 
>  arch/arm/configs/hisi_defconfig | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/arch/arm/configs/hisi_defconfig b/arch/arm/configs/hisi_defconfig
> index 5997dbc..b2e340b 100644
> --- a/arch/arm/configs/hisi_defconfig
> +++ b/arch/arm/configs/hisi_defconfig
> @@ -69,7 +69,6 @@ CONFIG_NOP_USB_XCEIV=y
>  CONFIG_MMC=y
>  CONFIG_RTC_CLASS=y
>  CONFIG_MMC_DW=y
> -CONFIG_MMC_DW_IDMAC=y
>  CONFIG_MMC_DW_PLTFM=y
>  CONFIG_RTC_DRV_PL031=y
>  CONFIG_DMADEVICES=y
> 

Thanks!

Best Regards,
Wei

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

end of thread, other threads:[~2015-08-13 10:18 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1438843469-23807-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-06  7:08 ` [RFC PATCH v4 0/9] Jaehoon Chung
     [not found]   ` <55C30D52.6040802@rock-chips.com>
2015-08-06  7:33     ` Jaehoon Chung
     [not found] ` <1438843539-24017-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-06  7:08   ` [RFC PATCH v4 5/9] arm: exynos_defconfig: remove CONFIG_MMC_DW_IDMAC Krzysztof Kozlowski
     [not found] ` <1438843515-23935-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-06  9:05   ` [RFC PATCH v4 3/9] mips: pistachio_defconfig: " Govindraj Raja
2015-08-06 13:17   ` Ralf Baechle
2015-08-12 22:05   ` Ralf Baechle
2015-08-13  0:08     ` Shawn Lin
     [not found] ` <1438843526-23976-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-07  5:48   ` [RFC PATCH v4 4/9] arc: axs10x_defconfig: " Vineet Gupta
     [not found] ` <1438843491-23853-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-06  7:08   ` [RFC PATCH v4 1/9] mmc: dw_mmc: Add external dma interface support Krzysztof Kozlowski
     [not found]     ` <55C30C1C.6070801@rock-chips.com>
2015-08-06  7:37       ` Krzysztof Kozlowski
2015-08-07 21:32   ` Joachim Eastwood
2015-08-07 23:37     ` Shawn Lin
2015-08-10 18:03   ` Alim Akhtar
     [not found] ` <1438843590-24101-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-07 21:34   ` [RFC PATCH v4 7/9] arm: lpc18xx_defconfig: remove CONFIG_MMC_DW_IDMAC Joachim Eastwood
     [not found] ` <1438843553-24058-1-git-send-email-shawn.lin@rock-chips.com>
2015-08-13 10:18   ` [RFC PATCH v4 6/9] arm: hisi_defconfig: " Wei Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).