mtk_sd on Vocore2 board

Mauro Condarelli mc5686 at mclink.it
Thu Dec 19 13:35:41 CET 2019


I am having trouble understanding how to handle SD driver on my Vocore2
board.

I already managed to make it work under Linux (5.3.0).
Root problem is VoCore2 has no support for power switching on the SD/MMC
slot;
a direct wire goes directly to the 3.3V supply.

Similar issue for the clock (here I needed a very ugly patch (below)).

Questions are twofold:
1) Is this really needed (on mainstream kernel) or did I miss some DT
setting that would have achieved the same effect?
2) How to achieve equivalent effect on U-Boot .../mtk_sd.c which looks
very different from the above?

If I do a "naive" porting SD will NOT work; any commands (e.g.: "mmc
info") results in error: "mmc_init: -95, time 6201"
(curiously always with the same "time") which I *think* I traced to
inability to handle voltage changes.

Any hint would be very welcome.

Regards and
Merry Christmas and very Happy New Year!
Mauro

=========================================================================
>From 3d239054fd01fbeb03863eee7eefd2a76b82dc02 Mon Sep 17 00:00:00 2001
From: Mauro Condarelli <mc5686 at mclink.it>
Date: Wed, 18 Sep 2019 14:07:22 +0200
Subject: [PATCH 8/8] MIPS, MMC, VoCore2: Preliminary fix for mtk-sd

---
 arch/mips/boot/dts/ralink/mt7628a.dtsi | 37 ++++++++++++++++++++++++++
 arch/mips/boot/dts/ralink/vocore2.dts  |  4 +++
 arch/mips/ralink/clk.c                 |  2 +-
 drivers/mmc/host/mtk-sd.c              |  8 ++++++
 4 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/arch/mips/boot/dts/ralink/mt7628a.dtsi
b/arch/mips/boot/dts/ralink/mt7628a.dtsi
index 376536489415..9636709edc5d 100644
--- a/arch/mips/boot/dts/ralink/mt7628a.dtsi
+++ b/arch/mips/boot/dts/ralink/mt7628a.dtsi
@@ -259,6 +259,43 @@
         reset-names = "host", "device";
     };
 
+    clk48m: clk48m at 0 {
+        compatible = "fixed-clock";
+        clock-frequency = <48000000>;
+        #clock-cells = <0>;
+    };
+
+    vmmcsd_fixed: fixedregulator at 0 {
+        compatible = "regulator-fixed";
+        regulator-name = "vmmcsd_fixed";
+        regulator-min-microvolt = <3300000>;
+        regulator-max-microvolt = <3300000>;
+    };
+
+    mmc: mmc at 10130000 {
+        compatible = "mediatek,mt7620-mmc";
+        reg = <0x10130000 0x4000>;
+        builtin-cd = <1>;
+        r_smpl = <1>;
+
+        interrupt-parent = <&intc>;
+        interrupts = <14>;
+
+        clocks = <&clk48m>, <&clk48m>;
+        clock-names = "source", "hclk";
+
+        pinctrl-names = "default", "state_uhs";
+        pinctrl-0 = <&pinmux_sdmode_sdxc>;
+        pinctrl-1 = <&pinmux_sdmode_sdxc>;
+
+        vmmc-supply = <&vmmcsd_fixed>;
+        vqmmc-supply = <&vmmcsd_fixed>;
+
+        resets = <&resetc 30>;
+
+        status = "disabled";
+    };
+
     ehci at 101c0000 {
         compatible = "generic-ehci";
         reg = <0x101c0000 0x1000>;
diff --git a/arch/mips/boot/dts/ralink/vocore2.dts
b/arch/mips/boot/dts/ralink/vocore2.dts
index 559c4256d48a..19e8ece4aa2a 100644
--- a/arch/mips/boot/dts/ralink/vocore2.dts
+++ b/arch/mips/boot/dts/ralink/vocore2.dts
@@ -62,3 +62,7 @@
     status = "okay";
     mediatek,mtd-eeprom = <&eeprom 0x0000>;
 };
+
+&mmc {
+    status = "okay";
+};
diff --git a/arch/mips/ralink/clk.c b/arch/mips/ralink/clk.c
index 0e57845d7f9a..930c2776f6fd 100644
--- a/arch/mips/ralink/clk.c
+++ b/arch/mips/ralink/clk.c
@@ -90,4 +90,4 @@ struct clk *clk_get_parent(struct clk *clk)
 {
     return NULL;
 }
-EXPORT_SYMBOL(clk_get_parent);
+EXPORT_SYMBOL_GPL(clk_get_parent);
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 33f4b6387ef7..13464161521c 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -721,18 +721,22 @@ static void msdc_set_timeout(struct msdc_host
*host, u32 ns, u32 clks)
 
 static void msdc_gate_clock(struct msdc_host *host)
 {
+#ifdef handle_clocks
     clk_disable_unprepare(host->src_clk_cg);
     clk_disable_unprepare(host->src_clk);
     clk_disable_unprepare(host->bus_clk);
     clk_disable_unprepare(host->h_clk);
+#endif//handle_clocks
 }
 
 static void msdc_ungate_clock(struct msdc_host *host)
 {
+#ifdef handle_clocks
     clk_prepare_enable(host->h_clk);
     clk_prepare_enable(host->bus_clk);
     clk_prepare_enable(host->src_clk);
     clk_prepare_enable(host->src_clk_cg);
+#endif//handle_clocks
     while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB))
         cpu_relax();
 }
@@ -2199,6 +2203,9 @@ static int msdc_drv_probe(struct platform_device
*pdev)
     if (ret)
         goto host_free;
 
+
+#ifdef handle_clocks
+#error "should NOT compile!"
     host->src_clk = devm_clk_get(&pdev->dev, "source");
     if (IS_ERR(host->src_clk)) {
         ret = PTR_ERR(host->src_clk);
@@ -2218,6 +2225,7 @@ static int msdc_drv_probe(struct platform_device
*pdev)
     host->src_clk_cg = devm_clk_get(&pdev->dev, "source_cg");
     if (IS_ERR(host->src_clk_cg))
         host->src_clk_cg = NULL;
+#endif //handle_clocks
 
     host->irq = platform_get_irq(pdev, 0);
     if (host->irq < 0) {
-- 
2.23.0



More information about the U-Boot mailing list