[PATCH v3 0/3] Add SDHCI support for Canaan K230 SoC

Jiayu Du posted 3 patches 1 month ago
There is a newer version of this series
.../bindings/mmc/snps,dwcmshc-sdhci.yaml      |  28 ++
.../boot/dts/canaan/k230-canmv-dshanpi.dts    |  56 ++++
.../dts/canaan/k230-canmv-module-dshanpi.dtsi |   7 +
arch/riscv/boot/dts/canaan/k230.dtsi          |  28 ++
drivers/mmc/host/sdhci-of-dwcmshc.c           | 287 ++++++++++++++++++
5 files changed, 406 insertions(+)
[PATCH v3 0/3] Add SDHCI support for Canaan K230 SoC
Posted by Jiayu Du 1 month ago
This series is based on the k230 usbphy series[1].

This patch series adds SDHCI support for the Canaan K230 SoC,
which uses Synopsys DWCMSHC SDHCI controllers, include MMC0 and MMC1.
The hardware designs of these two controllers are different.
The MMC0 supports eMMC, while MMC1 only supports SDIO. Detailed
information can be found in the vendor's manual[2].

From the vendor's K230 manual:
 - MMC0 supports eMMC5.0 and SDIO3.0, usually for eMMC chips.
 - MMC1 only does SDIO3.0 in 4/1-bit mode up to SDR104, and the manual
   clearly says it can't handle eMMC because of pin count and limits.

Therefore, there are two separate compatibles and the driver treats them
differently.

Link: https://lore.kernel.org/all/20260121145526.14672-1-jiayu.riscv@isrc.iscas.ac.cn/ [1]
Link: https://github.com/kendryte/k230_docs/blob/main/en/00_hardware/K230_Hardware_Design_Guide.md#mmc-circuit [2]

Changes in v3:
- Drop the clock maxItems.
- Add a const void *match_data to the struct dwcmshc_priv
- Copy the match_data pointer to dwcmshc_priv in the common dwcmshc_probe
- Link to v2: https://lore.kernel.org/all/20260226115923.75670-1-jiayu.riscv@isrc.iscas.ac.cn/

Changes in v2:
- Change the clock minItems to 5.
- Add comments to explain the reason for setting SDHCI_PROG_CLOCK_MODE.
- Write the power selection logic in the phy init cleaner.
- Replace manual delay loop with read_poll_timeout.
- Drop unnecessarily braces where a single statement will do.
- Add the match_data pointer to dwcmshc_pltfm_data.
- Add dwcmshc_k230_match_data struct to separate eMMC/SDIO config data
- Split K230 into individual emmc/sdio platform data instances instead of
  sharing one.
- Remove redundant have_phy member in k230_priv.
- Replace of_find_compatible_node with of_parse_phandle to get USB PHY
  from DT phandle.
- Link to v1: https://lore.kernel.org/all/20260204082908.27501-1-jiayu.riscv@isrc.iscas.ac.cn/

Jiayu Du (3):
  dt-bindings: mmc: Add sdhci support for Canaan k230
  mmc: sdhci-dwcmshc: Add Canaan K230 DWCMSHC controller support
  riscv: dts: canaan: Add mmc nodes for K230

 .../bindings/mmc/snps,dwcmshc-sdhci.yaml      |  28 ++
 .../boot/dts/canaan/k230-canmv-dshanpi.dts    |  56 ++++
 .../dts/canaan/k230-canmv-module-dshanpi.dtsi |   7 +
 arch/riscv/boot/dts/canaan/k230.dtsi          |  28 ++
 drivers/mmc/host/sdhci-of-dwcmshc.c           | 287 ++++++++++++++++++
 5 files changed, 406 insertions(+)

-- 
2.53.0
Re: [PATCH v3 0/3] Add SDHCI support for Canaan K230 SoC
Posted by Junhui Liu 4 weeks ago
Hi Jiayu,
Thanks for your work.

On Tue Mar 10, 2026 at 2:45 PM CST, Jiayu Du wrote:
> This series is based on the k230 usbphy series[1].
>
> This patch series adds SDHCI support for the Canaan K230 SoC,
> which uses Synopsys DWCMSHC SDHCI controllers, include MMC0 and MMC1.
> The hardware designs of these two controllers are different.
> The MMC0 supports eMMC, while MMC1 only supports SDIO. Detailed
> information can be found in the vendor's manual[2].
>
> From the vendor's K230 manual:
>  - MMC0 supports eMMC5.0 and SDIO3.0, usually for eMMC chips.
>  - MMC1 only does SDIO3.0 in 4/1-bit mode up to SDR104, and the manual
>    clearly says it can't handle eMMC because of pin count and limits.
>
> Therefore, there are two separate compatibles and the driver treats them
> differently.
>
> Link: https://lore.kernel.org/all/20260121145526.14672-1-jiayu.riscv@isrc.iscas.ac.cn/ [1]
> Link: https://github.com/kendryte/k230_docs/blob/main/en/00_hardware/K230_Hardware_Design_Guide.md#mmc-circuit [2]
>
> Changes in v3:
> - Drop the clock maxItems.
> - Add a const void *match_data to the struct dwcmshc_priv
> - Copy the match_data pointer to dwcmshc_priv in the common dwcmshc_probe
> - Link to v2: https://lore.kernel.org/all/20260226115923.75670-1-jiayu.riscv@isrc.iscas.ac.cn/
>
> Changes in v2:
> - Change the clock minItems to 5.
> - Add comments to explain the reason for setting SDHCI_PROG_CLOCK_MODE.
> - Write the power selection logic in the phy init cleaner.
> - Replace manual delay loop with read_poll_timeout.
> - Drop unnecessarily braces where a single statement will do.
> - Add the match_data pointer to dwcmshc_pltfm_data.
> - Add dwcmshc_k230_match_data struct to separate eMMC/SDIO config data
> - Split K230 into individual emmc/sdio platform data instances instead of
>   sharing one.
> - Remove redundant have_phy member in k230_priv.
> - Replace of_find_compatible_node with of_parse_phandle to get USB PHY
>   from DT phandle.
> - Link to v1: https://lore.kernel.org/all/20260204082908.27501-1-jiayu.riscv@isrc.iscas.ac.cn/
>
> Jiayu Du (3):
>   dt-bindings: mmc: Add sdhci support for Canaan k230
>   mmc: sdhci-dwcmshc: Add Canaan K230 DWCMSHC controller support
>   riscv: dts: canaan: Add mmc nodes for K230
>
>  .../bindings/mmc/snps,dwcmshc-sdhci.yaml      |  28 ++
>  .../boot/dts/canaan/k230-canmv-dshanpi.dts    |  56 ++++
>  .../dts/canaan/k230-canmv-module-dshanpi.dtsi |   7 +
>  arch/riscv/boot/dts/canaan/k230.dtsi          |  28 ++
>  drivers/mmc/host/sdhci-of-dwcmshc.c           | 287 ++++++++++++++++++
>  5 files changed, 406 insertions(+)

Tested-by: Junhui Liu <junhui.liu@pigmoral.tech>

Tested ok on CanMV-K230-V1.1 (k230-canmv.dts) with AP6212 (BCM43430)
SDIO WiFi module on MMC0 and MicroSD card on MMC1.

To be noted, a "broken-cd" property is needed to support SD card insert
and remove detect on CanMV board because the CD pin is not connected. I
am not sure if this is also needed on DShanPi as I don't have its
schematic.

-- 
Best regards,
Junhui Liu
Re: [PATCH v3 0/3] Add SDHCI support for Canaan K230 SoC
Posted by Jiayu Du 3 weeks, 6 days ago
On Wed, Mar 11, 2026 at 04:29:48PM +0800, Junhui Liu wrote:
> Hi Jiayu,
> Thanks for your work.
> 
> On Tue Mar 10, 2026 at 2:45 PM CST, Jiayu Du wrote:
> > This series is based on the k230 usbphy series[1].
> >
> > This patch series adds SDHCI support for the Canaan K230 SoC,
> > which uses Synopsys DWCMSHC SDHCI controllers, include MMC0 and MMC1.
> > The hardware designs of these two controllers are different.
> > The MMC0 supports eMMC, while MMC1 only supports SDIO. Detailed
> > information can be found in the vendor's manual[2].
> >
> > From the vendor's K230 manual:
> >  - MMC0 supports eMMC5.0 and SDIO3.0, usually for eMMC chips.
> >  - MMC1 only does SDIO3.0 in 4/1-bit mode up to SDR104, and the manual
> >    clearly says it can't handle eMMC because of pin count and limits.
> >
> > Therefore, there are two separate compatibles and the driver treats them
> > differently.
> >
> > Link: https://lore.kernel.org/all/20260121145526.14672-1-jiayu.riscv@isrc.iscas.ac.cn/ [1]
> > Link: https://github.com/kendryte/k230_docs/blob/main/en/00_hardware/K230_Hardware_Design_Guide.md#mmc-circuit [2]
> >
> > Changes in v3:
> > - Drop the clock maxItems.
> > - Add a const void *match_data to the struct dwcmshc_priv
> > - Copy the match_data pointer to dwcmshc_priv in the common dwcmshc_probe
> > - Link to v2: https://lore.kernel.org/all/20260226115923.75670-1-jiayu.riscv@isrc.iscas.ac.cn/
> >
> > Changes in v2:
> > - Change the clock minItems to 5.
> > - Add comments to explain the reason for setting SDHCI_PROG_CLOCK_MODE.
> > - Write the power selection logic in the phy init cleaner.
> > - Replace manual delay loop with read_poll_timeout.
> > - Drop unnecessarily braces where a single statement will do.
> > - Add the match_data pointer to dwcmshc_pltfm_data.
> > - Add dwcmshc_k230_match_data struct to separate eMMC/SDIO config data
> > - Split K230 into individual emmc/sdio platform data instances instead of
> >   sharing one.
> > - Remove redundant have_phy member in k230_priv.
> > - Replace of_find_compatible_node with of_parse_phandle to get USB PHY
> >   from DT phandle.
> > - Link to v1: https://lore.kernel.org/all/20260204082908.27501-1-jiayu.riscv@isrc.iscas.ac.cn/
> >
> > Jiayu Du (3):
> >   dt-bindings: mmc: Add sdhci support for Canaan k230
> >   mmc: sdhci-dwcmshc: Add Canaan K230 DWCMSHC controller support
> >   riscv: dts: canaan: Add mmc nodes for K230
> >
> >  .../bindings/mmc/snps,dwcmshc-sdhci.yaml      |  28 ++
> >  .../boot/dts/canaan/k230-canmv-dshanpi.dts    |  56 ++++
> >  .../dts/canaan/k230-canmv-module-dshanpi.dtsi |   7 +
> >  arch/riscv/boot/dts/canaan/k230.dtsi          |  28 ++
> >  drivers/mmc/host/sdhci-of-dwcmshc.c           | 287 ++++++++++++++++++
> >  5 files changed, 406 insertions(+)
> 
> Tested-by: Junhui Liu <junhui.liu@pigmoral.tech>
> 
> Tested ok on CanMV-K230-V1.1 (k230-canmv.dts) with AP6212 (BCM43430)
> SDIO WiFi module on MMC0 and MicroSD card on MMC1.
> 
> To be noted, a "broken-cd" property is needed to support SD card insert
> and remove detect on CanMV board because the CD pin is not connected. I
> am not sure if this is also needed on DShanPi as I don't have its
> schematic.

Thank you for your test and reminder. I have checked the schematic and
I will add "broken-cd" in the next version.

Best regards,
Jiayu Du