Lines Matching full:dwmac
2 * dwmac-stm32.c - DWMAC Specific Glue layer for STM32 MCU
54 int (*clk_prepare)(struct stm32_dwmac *dwmac, bool prepare);
55 int (*suspend)(struct stm32_dwmac *dwmac);
56 void (*resume)(struct stm32_dwmac *dwmac);
57 int (*parse_data)(struct stm32_dwmac *dwmac,
64 struct stm32_dwmac *dwmac = plat_dat->bsp_priv; in stm32_dwmac_init() local
67 if (dwmac->ops->set_mode) { in stm32_dwmac_init()
68 ret = dwmac->ops->set_mode(plat_dat); in stm32_dwmac_init()
73 ret = clk_prepare_enable(dwmac->clk_tx); in stm32_dwmac_init()
77 if (!dwmac->dev->power.is_suspended) { in stm32_dwmac_init()
78 ret = clk_prepare_enable(dwmac->clk_rx); in stm32_dwmac_init()
80 clk_disable_unprepare(dwmac->clk_tx); in stm32_dwmac_init()
85 if (dwmac->ops->clk_prepare) { in stm32_dwmac_init()
86 ret = dwmac->ops->clk_prepare(dwmac, true); in stm32_dwmac_init()
88 clk_disable_unprepare(dwmac->clk_rx); in stm32_dwmac_init()
89 clk_disable_unprepare(dwmac->clk_tx); in stm32_dwmac_init()
96 static int stm32mp1_clk_prepare(struct stm32_dwmac *dwmac, bool prepare) in stm32mp1_clk_prepare() argument
101 ret = clk_prepare_enable(dwmac->syscfg_clk); in stm32mp1_clk_prepare()
105 if (dwmac->int_phyclk) { in stm32mp1_clk_prepare()
106 ret = clk_prepare_enable(dwmac->clk_eth_ck); in stm32mp1_clk_prepare()
108 clk_disable_unprepare(dwmac->syscfg_clk); in stm32mp1_clk_prepare()
113 clk_disable_unprepare(dwmac->syscfg_clk); in stm32mp1_clk_prepare()
114 if (dwmac->int_phyclk) in stm32mp1_clk_prepare()
115 clk_disable_unprepare(dwmac->clk_eth_ck); in stm32mp1_clk_prepare()
122 struct stm32_dwmac *dwmac = plat_dat->bsp_priv; in stm32mp1_set_mode() local
123 u32 reg = dwmac->mode_reg; in stm32mp1_set_mode()
133 if (dwmac->int_phyclk) in stm32mp1_set_mode()
139 if (dwmac->int_phyclk) in stm32mp1_set_mode()
145 if (dwmac->int_phyclk) in stm32mp1_set_mode()
156 return regmap_update_bits(dwmac->regmap, reg, in stm32mp1_set_mode()
157 dwmac->ops->syscfg_eth_mask, val); in stm32mp1_set_mode()
162 struct stm32_dwmac *dwmac = plat_dat->bsp_priv; in stm32mcu_set_mode() local
163 u32 reg = dwmac->mode_reg; in stm32mcu_set_mode()
182 return regmap_update_bits(dwmac->regmap, reg, in stm32mcu_set_mode()
183 dwmac->ops->syscfg_eth_mask, val); in stm32mcu_set_mode()
186 static void stm32_dwmac_clk_disable(struct stm32_dwmac *dwmac) in stm32_dwmac_clk_disable() argument
188 clk_disable_unprepare(dwmac->clk_tx); in stm32_dwmac_clk_disable()
189 clk_disable_unprepare(dwmac->clk_rx); in stm32_dwmac_clk_disable()
191 if (dwmac->ops->clk_prepare) in stm32_dwmac_clk_disable()
192 dwmac->ops->clk_prepare(dwmac, false); in stm32_dwmac_clk_disable()
195 static int stm32_dwmac_parse_data(struct stm32_dwmac *dwmac, in stm32_dwmac_parse_data() argument
202 dwmac->clk_tx = devm_clk_get(dev, "mac-clk-tx"); in stm32_dwmac_parse_data()
203 if (IS_ERR(dwmac->clk_tx)) { in stm32_dwmac_parse_data()
205 return PTR_ERR(dwmac->clk_tx); in stm32_dwmac_parse_data()
208 dwmac->clk_rx = devm_clk_get(dev, "mac-clk-rx"); in stm32_dwmac_parse_data()
209 if (IS_ERR(dwmac->clk_rx)) { in stm32_dwmac_parse_data()
211 return PTR_ERR(dwmac->clk_rx); in stm32_dwmac_parse_data()
214 if (dwmac->ops->parse_data) { in stm32_dwmac_parse_data()
215 err = dwmac->ops->parse_data(dwmac, dev); in stm32_dwmac_parse_data()
221 dwmac->regmap = syscon_regmap_lookup_by_phandle(np, "st,syscon"); in stm32_dwmac_parse_data()
222 if (IS_ERR(dwmac->regmap)) in stm32_dwmac_parse_data()
223 return PTR_ERR(dwmac->regmap); in stm32_dwmac_parse_data()
225 err = of_property_read_u32_index(np, "st,syscon", 1, &dwmac->mode_reg); in stm32_dwmac_parse_data()
232 static int stm32mp1_parse_data(struct stm32_dwmac *dwmac, in stm32mp1_parse_data() argument
237 dwmac->int_phyclk = of_property_read_bool(np, "st,int-phyclk"); in stm32mp1_parse_data()
240 if (dwmac->int_phyclk) { in stm32mp1_parse_data()
242 dwmac->clk_eth_ck = devm_clk_get(dev, "eth-ck"); in stm32mp1_parse_data()
243 if (IS_ERR(dwmac->clk_eth_ck)) { in stm32mp1_parse_data()
245 return PTR_ERR(dwmac->clk_eth_ck); in stm32mp1_parse_data()
250 dwmac->clk_ethstp = devm_clk_get(dev, "ethstp"); in stm32mp1_parse_data()
251 if (IS_ERR(dwmac->clk_ethstp)) { in stm32mp1_parse_data()
253 return PTR_ERR(dwmac->clk_ethstp); in stm32mp1_parse_data()
257 dwmac->syscfg_clk = devm_clk_get(dev, "syscfg-clk"); in stm32mp1_parse_data()
258 if (IS_ERR(dwmac->syscfg_clk)) { in stm32mp1_parse_data()
260 return PTR_ERR(dwmac->syscfg_clk); in stm32mp1_parse_data()
270 struct stm32_dwmac *dwmac; in stm32_dwmac_probe() local
282 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); in stm32_dwmac_probe()
283 if (!dwmac) { in stm32_dwmac_probe()
295 dwmac->ops = data; in stm32_dwmac_probe()
296 dwmac->dev = &pdev->dev; in stm32_dwmac_probe()
298 ret = stm32_dwmac_parse_data(dwmac, &pdev->dev); in stm32_dwmac_probe()
304 plat_dat->bsp_priv = dwmac; in stm32_dwmac_probe()
317 stm32_dwmac_clk_disable(dwmac); in stm32_dwmac_probe()
335 static int stm32mp1_suspend(struct stm32_dwmac *dwmac) in stm32mp1_suspend() argument
339 ret = clk_prepare_enable(dwmac->clk_ethstp); in stm32mp1_suspend()
343 clk_disable_unprepare(dwmac->clk_tx); in stm32mp1_suspend()
344 clk_disable_unprepare(dwmac->syscfg_clk); in stm32mp1_suspend()
345 if (dwmac->int_phyclk) in stm32mp1_suspend()
346 clk_disable_unprepare(dwmac->clk_eth_ck); in stm32mp1_suspend()
351 static void stm32mp1_resume(struct stm32_dwmac *dwmac) in stm32mp1_resume() argument
353 clk_disable_unprepare(dwmac->clk_ethstp); in stm32mp1_resume()
356 static int stm32mcu_suspend(struct stm32_dwmac *dwmac) in stm32mcu_suspend() argument
358 clk_disable_unprepare(dwmac->clk_tx); in stm32mcu_suspend()
359 clk_disable_unprepare(dwmac->clk_rx); in stm32mcu_suspend()
369 struct stm32_dwmac *dwmac = priv->plat->bsp_priv; in stm32_dwmac_suspend() local
375 if (dwmac->ops->suspend) in stm32_dwmac_suspend()
376 ret = dwmac->ops->suspend(dwmac); in stm32_dwmac_suspend()
385 struct stm32_dwmac *dwmac = priv->plat->bsp_priv; in stm32_dwmac_resume() local
388 if (dwmac->ops->resume) in stm32_dwmac_resume()
389 dwmac->ops->resume(dwmac); in stm32_dwmac_resume()
420 { .compatible = "st,stm32-dwmac", .data = &stm32mcu_dwmac_data},
421 { .compatible = "st,stm32mp1-dwmac", .data = &stm32mp1_dwmac_data},
430 .name = "stm32-dwmac",
439 MODULE_DESCRIPTION("STMicroelectronics STM32 DWMAC Specific Glue layer");