@@ -98,7 +98,6 @@ struct stm32_dwmac {
98
98
99
99
struct stm32_ops {
100
100
int (* set_mode )(struct plat_stmmacenet_data * plat_dat );
101
- int (* clk_prepare )(struct stm32_dwmac * dwmac , bool prepare );
102
101
int (* suspend )(struct stm32_dwmac * dwmac );
103
102
void (* resume )(struct stm32_dwmac * dwmac );
104
103
int (* parse_data )(struct stm32_dwmac * dwmac ,
@@ -107,62 +106,55 @@ struct stm32_ops {
107
106
bool clk_rx_enable_in_suspend ;
108
107
};
109
108
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 )
111
110
{
112
- struct stm32_dwmac * dwmac = plat_dat -> bsp_priv ;
113
111
int ret ;
114
112
115
- if (dwmac -> ops -> set_mode ) {
116
- ret = dwmac -> ops -> set_mode (plat_dat );
117
- if (ret )
118
- return ret ;
119
- }
120
-
121
113
ret = clk_prepare_enable (dwmac -> clk_tx );
122
114
if (ret )
123
- return ret ;
115
+ goto err_clk_tx ;
124
116
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 ) {
127
118
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 ;
132
121
}
133
122
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 ;
140
131
}
141
132
142
133
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 ;
143
144
}
144
145
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 )
146
147
{
147
- int ret = 0 ;
148
+ struct stm32_dwmac * dwmac = plat_dat -> bsp_priv ;
149
+ int ret ;
148
150
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 );
151
153
if (ret )
152
154
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 );
164
155
}
165
- return ret ;
156
+
157
+ return stm32_dwmac_clk_enable (dwmac , resume );
166
158
}
167
159
168
160
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)
252
244
dwmac -> ops -> syscfg_eth_mask , val << 23 );
253
245
}
254
246
255
- static void stm32_dwmac_clk_disable (struct stm32_dwmac * dwmac )
247
+ static void stm32_dwmac_clk_disable (struct stm32_dwmac * dwmac , bool suspend )
256
248
{
257
249
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 );
259
252
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 );
262
256
}
263
257
264
258
static int stm32_dwmac_parse_data (struct stm32_dwmac * dwmac ,
@@ -397,7 +391,7 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
397
391
398
392
plat_dat -> bsp_priv = dwmac ;
399
393
400
- ret = stm32_dwmac_init (plat_dat );
394
+ ret = stm32_dwmac_init (plat_dat , false );
401
395
if (ret )
402
396
return ret ;
403
397
@@ -408,7 +402,7 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
408
402
return 0 ;
409
403
410
404
err_clk_disable :
411
- stm32_dwmac_clk_disable (dwmac );
405
+ stm32_dwmac_clk_disable (dwmac , false );
412
406
413
407
return ret ;
414
408
}
@@ -421,7 +415,7 @@ static void stm32_dwmac_remove(struct platform_device *pdev)
421
415
422
416
stmmac_dvr_remove (& pdev -> dev );
423
417
424
- stm32_dwmac_clk_disable (priv -> plat -> bsp_priv );
418
+ stm32_dwmac_clk_disable (dwmac , false );
425
419
426
420
if (dwmac -> irq_pwr_wakeup >= 0 ) {
427
421
dev_pm_clear_wake_irq (& pdev -> dev );
@@ -431,33 +425,14 @@ static void stm32_dwmac_remove(struct platform_device *pdev)
431
425
432
426
static int stm32mp1_suspend (struct stm32_dwmac * dwmac )
433
427
{
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 );
446
429
}
447
430
448
431
static void stm32mp1_resume (struct stm32_dwmac * dwmac )
449
432
{
450
433
clk_disable_unprepare (dwmac -> clk_ethstp );
451
434
}
452
435
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
-
461
436
#ifdef CONFIG_PM_SLEEP
462
437
static int stm32_dwmac_suspend (struct device * dev )
463
438
{
@@ -468,6 +443,10 @@ static int stm32_dwmac_suspend(struct device *dev)
468
443
int ret ;
469
444
470
445
ret = stmmac_suspend (dev );
446
+ if (ret )
447
+ return ret ;
448
+
449
+ stm32_dwmac_clk_disable (dwmac , true);
471
450
472
451
if (dwmac -> ops -> suspend )
473
452
ret = dwmac -> ops -> suspend (dwmac );
@@ -485,7 +464,7 @@ static int stm32_dwmac_resume(struct device *dev)
485
464
if (dwmac -> ops -> resume )
486
465
dwmac -> ops -> resume (dwmac );
487
466
488
- ret = stm32_dwmac_init (priv -> plat );
467
+ ret = stm32_dwmac_init (priv -> plat , true );
489
468
if (ret )
490
469
return ret ;
491
470
@@ -500,13 +479,11 @@ static SIMPLE_DEV_PM_OPS(stm32_dwmac_pm_ops,
500
479
501
480
static struct stm32_ops stm32mcu_dwmac_data = {
502
481
.set_mode = stm32mcu_set_mode ,
503
- .suspend = stm32mcu_suspend ,
504
482
.syscfg_eth_mask = SYSCFG_MCU_ETH_MASK
505
483
};
506
484
507
485
static struct stm32_ops stm32mp1_dwmac_data = {
508
486
.set_mode = stm32mp1_set_mode ,
509
- .clk_prepare = stm32mp1_clk_prepare ,
510
487
.suspend = stm32mp1_suspend ,
511
488
.resume = stm32mp1_resume ,
512
489
.parse_data = stm32mp1_parse_data ,
0 commit comments