Hi,

On 9/20/19 7:38 AM, Christophe Roullier wrote:
Add optional support for syscfg clock in dwmac-stm32.c
Now Syscfg clock is activated automatically when syscfg
registers are used

Signed-off-by: Christophe Roullier <christophe.roull...@st.com>
---
  .../net/ethernet/stmicro/stmmac/dwmac-stm32.c | 36 +++++++++++++------
  1 file changed, 25 insertions(+), 11 deletions(-)

Acked-by: Alexandre TORGUE <alexandre.tor...@st.com>


diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
index 4ef041bdf6a1..7e6619868cc1 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
@@ -152,23 +152,32 @@ static int stm32mp1_clk_prepare(struct stm32_dwmac 
*dwmac, bool prepare)
        int ret = 0;
if (prepare) {
-               ret = clk_prepare_enable(dwmac->syscfg_clk);
-               if (ret)
-                       return ret;
-
+               if (dwmac->syscfg_clk) {
+                       ret = clk_prepare_enable(dwmac->syscfg_clk);
+                       if (ret)
+                               return ret;
+               }
                if (dwmac->clk_eth_ck) {
                        ret = clk_prepare_enable(dwmac->clk_eth_ck);
                        if (ret) {
-                               clk_disable_unprepare(dwmac->syscfg_clk);
+                               if (dwmac->syscfg_clk)
+                                       goto unprepare_syscfg;
                                return ret;
                        }
                }
        } else {
-               clk_disable_unprepare(dwmac->syscfg_clk);
+               if (dwmac->syscfg_clk)
+                       clk_disable_unprepare(dwmac->syscfg_clk);
+
                if (dwmac->clk_eth_ck)
                        clk_disable_unprepare(dwmac->clk_eth_ck);
        }
        return ret;
+
+unprepare_syscfg:
+       clk_disable_unprepare(dwmac->syscfg_clk);
+
+       return ret;
  }
static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)
@@ -296,7 +305,7 @@ static int stm32mp1_parse_data(struct stm32_dwmac *dwmac,
  {
        struct platform_device *pdev = to_platform_device(dev);
        struct device_node *np = dev->of_node;
-       int err = 0;
+       int err;
/* Gigabit Ethernet 125MHz clock selection. */
        dwmac->eth_clk_sel_reg = of_property_read_bool(np, "st,eth-clk-sel");
@@ -320,13 +329,17 @@ static int stm32mp1_parse_data(struct stm32_dwmac *dwmac,
                return PTR_ERR(dwmac->clk_ethstp);
        }
- /* Clock for sysconfig */
+       /*  Optional Clock for sysconfig */
        dwmac->syscfg_clk = devm_clk_get(dev, "syscfg-clk");
        if (IS_ERR(dwmac->syscfg_clk)) {
-               dev_err(dev, "No syscfg clock provided...\n");
-               return PTR_ERR(dwmac->syscfg_clk);
+               err = PTR_ERR(dwmac->syscfg_clk);
+               if (err != -ENOENT)
+                       return err;
+               dwmac->syscfg_clk = NULL;
        }
+ err = 0;
+
        /* Get IRQ information early to have an ability to ask for deferred
         * probe if needed before we went too far with resource allocation.
         */
@@ -436,7 +449,8 @@ static int stm32mp1_suspend(struct stm32_dwmac *dwmac)
                return ret;
clk_disable_unprepare(dwmac->clk_tx);
-       clk_disable_unprepare(dwmac->syscfg_clk);
+       if (dwmac->syscfg_clk)
+               clk_disable_unprepare(dwmac->syscfg_clk);
        if (dwmac->clk_eth_ck)
                clk_disable_unprepare(dwmac->clk_eth_ck);

Reply via email to