[PATCH v2 3/3] mmc: socfpga_dw_mmc: Enable/disable SDMMC clock via API
Chee, Tien Fong
tien.fong.chee at altera.com
Thu Sep 11 04:02:51 CEST 2025
> -----Original Message-----
> From: Yuslaimi, Alif Zakuan <alif.zakuan.yuslaimi at altera.com>
> Sent: Tuesday, September 9, 2025 10:11 AM
> To: u-boot at lists.denx.de
> Cc: Tom Rini <trini at konsulko.com>; Lukasz Majewski <lukma at denx.de>;
> Sean Anderson <seanga2 at gmail.com>; Peng Fan <peng.fan at nxp.com>;
> Jaehoon Chung <jh80.chung at samsung.com>; Chee, Tien Fong
> <tien.fong.chee at altera.com>; Simon Glass <sjg at chromium.org>; Marek
> Vasut <marek.vasut+renesas at mailbox.org>; Simon Goldschmidt
> <simon.k.r.goldschmidt at gmail.com>; Yuslaimi, Alif Zakuan
> <alif.zakuan.yuslaimi at altera.com>
> Subject: [PATCH v2 3/3] mmc: socfpga_dw_mmc: Enable/disable SDMMC
> clock via API
>
> From: Alif Zakuan Yuslaimi <alif.zakuan.yuslaimi at altera.com>
>
> Update the driver to enable or disable the SDMMC clock via clock driver
> model API instead of doing it in the driver itself.
>
> This allows for scalability of the driver for various SoCFPGA devices.
>
> Signed-off-by: Alif Zakuan Yuslaimi <alif.zakuan.yuslaimi at altera.com>
> ---
> drivers/mmc/socfpga_dw_mmc.c | 33 +++++++++++++++++----------------
> 1 file changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/mmc/socfpga_dw_mmc.c
> b/drivers/mmc/socfpga_dw_mmc.c index 3b86bc9b18c..db4e0129c2e
> 100644
> --- a/drivers/mmc/socfpga_dw_mmc.c
> +++ b/drivers/mmc/socfpga_dw_mmc.c
> @@ -29,7 +29,9 @@ struct socfpga_dwmci_plat {
>
> /* socfpga implmentation specific driver private data */ struct
> dwmci_socfpga_priv_data {
> + struct udevice *dev;
> struct dwmci_host host;
> + struct clk mmc_clk_ciu;
> unsigned int drvsel;
> unsigned int smplsel;
> };
> @@ -51,28 +53,23 @@ static void socfpga_dwmci_reset(struct udevice *dev)
> static int socfpga_dwmci_clksel(struct dwmci_host *host) {
> struct dwmci_socfpga_priv_data *priv = host->priv;
> + int ret;
> +
> u32 sdmmc_mask = ((priv->smplsel & 0x7) <<
> SYSMGR_SDMMC_SMPLSEL_SHIFT) |
> ((priv->drvsel & 0x7) <<
> SYSMGR_SDMMC_DRVSEL_SHIFT);
>
> - /* Get clock manager base address */
> - struct udevice *clkmgr_dev;
> - int ret = uclass_get_device_by_name(UCLASS_CLK, "clock-
> controller at ffd10000", &clkmgr_dev);
> -
> + ret = clk_get_by_name(priv->dev, "ciu", &priv->mmc_clk_ciu);
> if (ret) {
> - printf("Failed to get clkmgr device: %d\n", ret);
> + debug("%s: Failed to get SDMMC clock from dts\n",
> __func__);
> return ret;
> }
>
> - fdt_addr_t clkmgr_base = dev_read_addr(clkmgr_dev);
> -
> - if (clkmgr_base == FDT_ADDR_T_NONE) {
> - printf("Failed to read base address from clkmgr DT node\n");
> - return -EINVAL;
> - }
> -
> /* Disable SDMMC clock. */
> - clrbits_le32(clkmgr_base + CLKMGR_PERPLL_EN,
> - CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
> + ret = clk_disable(&priv->mmc_clk_ciu);
> + if (ret) {
> + printf("%s: Failed to disable SDMMC clock\n", __func__);
> + return ret;
> + }
>
> debug("%s: drvsel %d smplsel %d\n", __func__,
> priv->drvsel, priv->smplsel);
> @@ -92,8 +89,11 @@ static int socfpga_dwmci_clksel(struct dwmci_host
> *host) #endif
>
> /* Enable SDMMC clock */
> - setbits_le32(clkmgr_base + CLKMGR_PERPLL_EN,
> - CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
> + ret = clk_enable(&priv->mmc_clk_ciu);
> + if (ret) {
> + printf("%s: Failed to enable SDMMC clock\n", __func__);
> + return ret;
> + }
>
> return 0;
> }
> @@ -169,6 +169,7 @@ static int socfpga_dwmmc_probe(struct udevice *dev)
> struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
> struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
> struct dwmci_host *host = &priv->host;
> + priv->dev = dev;
> int ret;
>
> ret = socfpga_dwmmc_get_clk_rate(dev);
> --
> 2.35.3
Reviewed-by: Tien Fong Chee <tien.fong.chee at altera.com>
Best regards,
Tien Fong
More information about the U-Boot
mailing list