The Linux driver in v5.13 doesn't determine min and max frequency from
clk_ciu, instead it consults the clock-frequency property in the device
tree. We will want to follow the Linux way for the StarFive, especially
because clk_get_rate returns bogus results for the JH7100, because the
clock tree doesn't yet describe enough information to calculate rates.

Add a compatible that does the necessary things as well as a generic
snps,dw-mshc compatible, like what the vendor device tree uses. The hope
is, that with complete clock tree described, we can drop the
starfive,jh7100-dw-mshc compatible check in future and use the generic
compatible instead.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 drivers/mci/dw_mmc.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/mci/dw_mmc.c b/drivers/mci/dw_mmc.c
index ad1d2a06b914..b402090ab3cb 100644
--- a/drivers/mci/dw_mmc.c
+++ b/drivers/mci/dw_mmc.c
@@ -32,7 +32,7 @@ struct dwmci_host {
        unsigned int fifo_size_bytes;
 
        struct dwmci_idmac *idmac;
-       unsigned long clkrate;
+       u32 clkrate;
        int ciu_div;
        u32 fifoth_val;
        u32 pwren_value;
@@ -572,7 +572,7 @@ static int dw_mmc_probe(struct device_d *dev)
 
        rst = reset_control_get(dev, "reset");
        if (IS_ERR(rst)) {
-               dev_warn(dev, "error claiming reset: %pe\n", rst);
+               return PTR_ERR(rst);
        } else if (rst) {
                reset_control_assert(rst);
                udelay(10);
@@ -617,7 +617,11 @@ static int dw_mmc_probe(struct device_d *dev)
        else
                host->pwren_value = 1;
 
-       host->clkrate = clk_get_rate(host->clk_ciu);
+       if (of_device_is_compatible(dev->device_node, 
"starfive,jh7100-dw-mshc"))
+               of_property_read_u32(dev->device_node, "clock-frequency", 
&host->clkrate);
+       if (!host->clkrate)
+               host->clkrate = clk_get_rate(host->clk_ciu);
+
        host->mci.f_min = host->clkrate / 510 / host->ciu_div;
        if (host->mci.f_min < 200000)
                host->mci.f_min = 200000;
@@ -635,6 +639,10 @@ static __maybe_unused struct of_device_id 
dw_mmc_compatible[] = {
                .compatible = "rockchip,rk2928-dw-mshc",
        }, {
                .compatible = "rockchip,rk3288-dw-mshc",
+       }, {
+               .compatible = "snps,dw-mshc",
+       }, {
+               .compatible = "starfive,jh7100-dw-mshc",
        }, {
                /* sentinel */
        }
-- 
2.29.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to