Skip to content

Commit 4d177f4

Browse files
lopsided98davem330
authored andcommitted
net: stmmac: dwmac-stm32: refactor clock config
Currently, clock configuration is spread throughout the driver and partially duplicated for the STM32MP1 and STM32 MCU variants. This makes it difficult to keep track of which clocks need to be enabled or disabled in various scenarios. This patch adds symmetric stm32_dwmac_clk_enable/disable() functions that handle all clock configuration, including quirks required while suspending or resuming. syscfg_clk and clk_eth_ck are not present on STM32 MCUs, but it is fine to try to configure them anyway since NULL clocks are ignored. Signed-off-by: Ben Wolsieffer <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7497b0a commit 4d177f4

File tree

1 file changed

+45
-68
lines changed

1 file changed

+45
-68
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c

Lines changed: 45 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ struct stm32_dwmac {
9898

9999
struct stm32_ops {
100100
int (*set_mode)(struct plat_stmmacenet_data *plat_dat);
101-
int (*clk_prepare)(struct stm32_dwmac *dwmac, bool prepare);
102101
int (*suspend)(struct stm32_dwmac *dwmac);
103102
void (*resume)(struct stm32_dwmac *dwmac);
104103
int (*parse_data)(struct stm32_dwmac *dwmac,
@@ -107,62 +106,55 @@ struct stm32_ops {
107106
bool clk_rx_enable_in_suspend;
108107
};
109108

110-
static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat)
109+
static int stm32_dwmac_clk_enable(struct stm32_dwmac *dwmac, bool resume)
111110
{
112-
struct stm32_dwmac *dwmac = plat_dat->bsp_priv;
113111
int ret;
114112

115-
if (dwmac->ops->set_mode) {
116-
ret = dwmac->ops->set_mode(plat_dat);
117-
if (ret)
118-
return ret;
119-
}
120-
121113
ret = clk_prepare_enable(dwmac->clk_tx);
122114
if (ret)
123-
return ret;
115+
goto err_clk_tx;
124116

125-
if (!dwmac->ops->clk_rx_enable_in_suspend ||
126-
!dwmac->dev->power.is_suspended) {
117+
if (!dwmac->ops->clk_rx_enable_in_suspend || !resume) {
127118
ret = clk_prepare_enable(dwmac->clk_rx);
128-
if (ret) {
129-
clk_disable_unprepare(dwmac->clk_tx);
130-
return ret;
131-
}
119+
if (ret)
120+
goto err_clk_rx;
132121
}
133122

134-
if (dwmac->ops->clk_prepare) {
135-
ret = dwmac->ops->clk_prepare(dwmac, true);
136-
if (ret) {
137-
clk_disable_unprepare(dwmac->clk_rx);
138-
clk_disable_unprepare(dwmac->clk_tx);
139-
}
123+
ret = clk_prepare_enable(dwmac->syscfg_clk);
124+
if (ret)
125+
goto err_syscfg_clk;
126+
127+
if (dwmac->enable_eth_ck) {
128+
ret = clk_prepare_enable(dwmac->clk_eth_ck);
129+
if (ret)
130+
goto err_clk_eth_ck;
140131
}
141132

142133
return ret;
134+
135+
err_clk_eth_ck:
136+
clk_disable_unprepare(dwmac->syscfg_clk);
137+
err_syscfg_clk:
138+
if (!dwmac->ops->clk_rx_enable_in_suspend || !resume)
139+
clk_disable_unprepare(dwmac->clk_rx);
140+
err_clk_rx:
141+
clk_disable_unprepare(dwmac->clk_tx);
142+
err_clk_tx:
143+
return ret;
143144
}
144145

145-
static int stm32mp1_clk_prepare(struct stm32_dwmac *dwmac, bool prepare)
146+
static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat, bool resume)
146147
{
147-
int ret = 0;
148+
struct stm32_dwmac *dwmac = plat_dat->bsp_priv;
149+
int ret;
148150

149-
if (prepare) {
150-
ret = clk_prepare_enable(dwmac->syscfg_clk);
151+
if (dwmac->ops->set_mode) {
152+
ret = dwmac->ops->set_mode(plat_dat);
151153
if (ret)
152154
return ret;
153-
if (dwmac->enable_eth_ck) {
154-
ret = clk_prepare_enable(dwmac->clk_eth_ck);
155-
if (ret) {
156-
clk_disable_unprepare(dwmac->syscfg_clk);
157-
return ret;
158-
}
159-
}
160-
} else {
161-
clk_disable_unprepare(dwmac->syscfg_clk);
162-
if (dwmac->enable_eth_ck)
163-
clk_disable_unprepare(dwmac->clk_eth_ck);
164155
}
165-
return ret;
156+
157+
return stm32_dwmac_clk_enable(dwmac, resume);
166158
}
167159

168160
static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)
@@ -252,13 +244,15 @@ static int stm32mcu_set_mode(struct plat_stmmacenet_data *plat_dat)
252244
dwmac->ops->syscfg_eth_mask, val << 23);
253245
}
254246

255-
static void stm32_dwmac_clk_disable(struct stm32_dwmac *dwmac)
247+
static void stm32_dwmac_clk_disable(struct stm32_dwmac *dwmac, bool suspend)
256248
{
257249
clk_disable_unprepare(dwmac->clk_tx);
258-
clk_disable_unprepare(dwmac->clk_rx);
250+
if (!dwmac->ops->clk_rx_enable_in_suspend || !suspend)
251+
clk_disable_unprepare(dwmac->clk_rx);
259252

260-
if (dwmac->ops->clk_prepare)
261-
dwmac->ops->clk_prepare(dwmac, false);
253+
clk_disable_unprepare(dwmac->syscfg_clk);
254+
if (dwmac->enable_eth_ck)
255+
clk_disable_unprepare(dwmac->clk_eth_ck);
262256
}
263257

264258
static int stm32_dwmac_parse_data(struct stm32_dwmac *dwmac,
@@ -397,7 +391,7 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
397391

398392
plat_dat->bsp_priv = dwmac;
399393

400-
ret = stm32_dwmac_init(plat_dat);
394+
ret = stm32_dwmac_init(plat_dat, false);
401395
if (ret)
402396
return ret;
403397

@@ -408,7 +402,7 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
408402
return 0;
409403

410404
err_clk_disable:
411-
stm32_dwmac_clk_disable(dwmac);
405+
stm32_dwmac_clk_disable(dwmac, false);
412406

413407
return ret;
414408
}
@@ -421,7 +415,7 @@ static void stm32_dwmac_remove(struct platform_device *pdev)
421415

422416
stmmac_dvr_remove(&pdev->dev);
423417

424-
stm32_dwmac_clk_disable(priv->plat->bsp_priv);
418+
stm32_dwmac_clk_disable(dwmac, false);
425419

426420
if (dwmac->irq_pwr_wakeup >= 0) {
427421
dev_pm_clear_wake_irq(&pdev->dev);
@@ -431,33 +425,14 @@ static void stm32_dwmac_remove(struct platform_device *pdev)
431425

432426
static int stm32mp1_suspend(struct stm32_dwmac *dwmac)
433427
{
434-
int ret = 0;
435-
436-
ret = clk_prepare_enable(dwmac->clk_ethstp);
437-
if (ret)
438-
return ret;
439-
440-
clk_disable_unprepare(dwmac->clk_tx);
441-
clk_disable_unprepare(dwmac->syscfg_clk);
442-
if (dwmac->enable_eth_ck)
443-
clk_disable_unprepare(dwmac->clk_eth_ck);
444-
445-
return ret;
428+
return clk_prepare_enable(dwmac->clk_ethstp);
446429
}
447430

448431
static void stm32mp1_resume(struct stm32_dwmac *dwmac)
449432
{
450433
clk_disable_unprepare(dwmac->clk_ethstp);
451434
}
452435

453-
static int stm32mcu_suspend(struct stm32_dwmac *dwmac)
454-
{
455-
clk_disable_unprepare(dwmac->clk_tx);
456-
clk_disable_unprepare(dwmac->clk_rx);
457-
458-
return 0;
459-
}
460-
461436
#ifdef CONFIG_PM_SLEEP
462437
static int stm32_dwmac_suspend(struct device *dev)
463438
{
@@ -468,6 +443,10 @@ static int stm32_dwmac_suspend(struct device *dev)
468443
int ret;
469444

470445
ret = stmmac_suspend(dev);
446+
if (ret)
447+
return ret;
448+
449+
stm32_dwmac_clk_disable(dwmac, true);
471450

472451
if (dwmac->ops->suspend)
473452
ret = dwmac->ops->suspend(dwmac);
@@ -485,7 +464,7 @@ static int stm32_dwmac_resume(struct device *dev)
485464
if (dwmac->ops->resume)
486465
dwmac->ops->resume(dwmac);
487466

488-
ret = stm32_dwmac_init(priv->plat);
467+
ret = stm32_dwmac_init(priv->plat, true);
489468
if (ret)
490469
return ret;
491470

@@ -500,13 +479,11 @@ static SIMPLE_DEV_PM_OPS(stm32_dwmac_pm_ops,
500479

501480
static struct stm32_ops stm32mcu_dwmac_data = {
502481
.set_mode = stm32mcu_set_mode,
503-
.suspend = stm32mcu_suspend,
504482
.syscfg_eth_mask = SYSCFG_MCU_ETH_MASK
505483
};
506484

507485
static struct stm32_ops stm32mp1_dwmac_data = {
508486
.set_mode = stm32mp1_set_mode,
509-
.clk_prepare = stm32mp1_clk_prepare,
510487
.suspend = stm32mp1_suspend,
511488
.resume = stm32mp1_resume,
512489
.parse_data = stm32mp1_parse_data,

0 commit comments

Comments
 (0)