Skip to contentSkip to conversation

mmc: socfpga: Add clock framework support

PATCH New Marek Vasut 2 participants 2 messages Aug 8, 2018 – Aug 9, 2018 MMC, SD and SDIO

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mmc: socfpga: Add clock framework support

Add support for fetching the clock frequency both using the legacy method in case clock framework is disabled as well as via the clock framework if it is enabled. This allows for migration to the clock framework on platforms which supports it while not breaking legacy platforms. That said, the legacy method must be removed eventually.

Cc Chin Liang See <[email protected]>
Cc Dinh Nguyen <[email protected]>
Cc Ley Foon Tan <[email protected]>
---
 drivers/mmc/socfpga_dw_mmc.c | 40 +++++++++++++++++++++++++++++++---------
 1 file changed, 31 insertions(+), 9 deletions(-)
drivers/mmc/socfpga_dw_mmc.c +31 -9
index ed8ba10c93..739c1629a2 100644
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <asm/arch/clock_manager.h>
 #include <asm/arch/system_manager.h>
+#include <clk.h>
 #include <dm.h>
 #include <dwmmc.h>
 #include <errno.h>
@@ -70,20 +71,39 @@ static void socfpga_dwmci_clksel(struct dwmci_host *host)
 		CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
 }
 
-static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
+static int socfpga_dwmmc_get_clk_rate(struct udevice *dev)
 {
-	/* FIXME: probe from DT eventually too/ */
-	const unsigned long clk = cm_get_mmc_controller_clk_hz();
-
 	struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
 	struct dwmci_host *host = &priv->host;
-	int fifo_depth;
+#if CONFIG_IS_ENABLED(CLK)
+	struct clk clk;
+	int ret;
+
+	ret = clk_get_by_index(dev, 1, &clk);
+	if (ret)
+		return ret;
 
-	if (clk == 0) {
+	host->bus_hz = clk_get_rate(&clk);
+
+	clk_free(&clk);
+#else
+	/* Fixed clock divide by 4 which due to the SDMMC wrapper */
+	host->bus_hz = cm_get_mmc_controller_clk_hz();
+#endif
+	if (host->bus_hz == 0) {
 		printf("DWMMC: MMC clock is zero!");
 		return -EINVAL;
 	}
 
+	return 0;
+}
+
+static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
+{
+	struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
+	struct dwmci_host *host = &priv->host;
+	int fifo_depth;
+
 	fifo_depth = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
 				    "fifo-depth", 0);
 	if (fifo_depth < 0) {
@@ -102,8 +122,6 @@ static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
 	 * We only have one dwmmc block on gen5 SoCFPGA.
 	 */
 	host->dev_index = 0;
-	/* Fixed clock divide by 4 which due to the SDMMC wrapper */
-	host->bus_hz = clk;
 	host->fifoth_val = MSIZE(0x2) |
 		RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
 	priv->drvsel = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),
@@ -123,6 +141,11 @@ 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;
+	int ret;
+
+	ret = socfpga_dwmmc_get_clk_rate(dev);
+	if (ret)
+		return ret;
 
 	socfpga_dwmci_reset(dev);
 
@@ -130,7 +153,6 @@ static int socfpga_dwmmc_probe(struct udevice *dev)
 	dwmci_setup_cfg(&plat->cfg, host, host->bus_hz, 400000);
 	host->mmc = &plat->mmc;
 #else
-	int ret;
 
 	ret = add_dwmci(host, host->bus_hz, 400000);
 	if (ret)
Signature · 1 line
2.16.2
#1 lore raw

PATCH 1/1 mmc: socfpga: Add clock framework support

Quoted 108 lines · Marek Vasut

Add support for fetching the clock frequency both using the legacy method in case clock framework is disabled as well as via the clock framework if it is enabled. This allows for migration to the clock framework on platforms which supports it while not breaking legacy platforms. That said, the legacy method must be removed eventually.

Cc Chin Liang See <[email protected]>
Cc Dinh Nguyen <[email protected]>
Cc Ley Foon Tan <[email protected]>

---
 drivers/mmc/socfpga_dw_mmc.c | 40 +++++++++++++++++++++++++++++++---
------

 1 file changed, 31 insertions(+), 9 deletions(-)
drivers/mmc/socfpga_dw_mmc.c +1 -0
index ed8ba10c93..739c1629a2 100644
@@ -6,6 +6,7 @@
  #include <common.h>
  #include <asm/arch/clock_manager.h>
  #include <asm/arch/system_manager.h>
+#include <clk.h>
  #include <dm.h>
  #include <dwmmc.h>
  #include <errno.h>
@@ -70,20 +71,39 @@ static void socfpga_dwmci_clksel(struct
 dwmci_host *host)
  		CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
  }

drivers/mmc/socfpga_dw_mmc.c +1 -1
-static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
+static int socfpga_dwmmc_get_clk_rate(struct udevice *dev)

 {

drivers/mmc/socfpga_dw_mmc.c +0 -3
-	/* FIXME: probe from DT eventually too/ */
-	const unsigned long clk = cm_get_mmc_controller_clk_hz();
-

  struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev); struct dwmci_host *host = &priv->host;

drivers/mmc/socfpga_dw_mmc.c +7 -1
-	int fifo_depth;
+#if CONFIG_IS_ENABLED(CLK)
+	struct clk clk;
+	int ret;
+
+	ret = clk_get_by_index(dev, 1, &clk);
+	if (ret)
+		return ret;

drivers/mmc/socfpga_dw_mmc.c +8 -1
-	if (clk == 0) {
+	host->bus_hz = clk_get_rate(&clk);
+
+	clk_free(&clk);
+#else
+	/* Fixed clock divide by 4 which due to the SDMMC wrapper */
+	host->bus_hz = cm_get_mmc_controller_clk_hz();
+#endif
+	if (host->bus_hz == 0) {

  printf("DWMMC: MMC clock is zero!"); return -EINVAL;
  }

drivers/mmc/socfpga_dw_mmc.c +9 -0
+	return 0;
+}
+
+static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
+{
+	struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
+	struct dwmci_host *host = &priv->host;
+	int fifo_depth;
+

  fifo_depth = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
      "fifo-depth", 0); if (fifo_depth < 0) {

drivers/mmc/socfpga_dw_mmc.c +0 -2
@@ -102,8 +122,6 @@ static int
 socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
  	 * We only have one dwmmc block on gen5 SoCFPGA.
  	 */
  	host->dev_index = 0;
-	/* Fixed clock divide by 4 which due to the SDMMC wrapper */
-	host->bus_hz = clk;

  host->fifoth_val = MSIZE(0x2) | RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
  priv->drvsel = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),

drivers/mmc/socfpga_dw_mmc.c +5 -0
@@ -123,6 +141,11 @@ 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;
+	int ret;
+
+	ret = socfpga_dwmmc_get_clk_rate(dev);
+	if (ret)
+		return ret;


  socfpga_dwmci_reset(dev);

drivers/mmc/socfpga_dw_mmc.c +0 -1
@@ -130,7 +153,6 @@ static int socfpga_dwmmc_probe(struct udevice
 *dev)
  	dwmci_setup_cfg(&plat->cfg, host, host->bus_hz, 400000);
  	host->mmc = &plat->mmc;
  #else
-	int ret;
Quoted 3 lines


  ret = add_dwmci(host, host->bus_hz, 400000); if (ret)