@@ -1255,6 +1255,49 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1255
1255
return 0 ;
1256
1256
}
1257
1257
1258
+ static int fec_enet_clk_enable (struct net_device * ndev , bool enable )
1259
+ {
1260
+ struct fec_enet_private * fep = netdev_priv (ndev );
1261
+ int ret ;
1262
+
1263
+ if (enable ) {
1264
+ ret = clk_prepare_enable (fep -> clk_ahb );
1265
+ if (ret )
1266
+ return ret ;
1267
+ ret = clk_prepare_enable (fep -> clk_ipg );
1268
+ if (ret )
1269
+ goto failed_clk_ipg ;
1270
+ if (fep -> clk_enet_out ) {
1271
+ ret = clk_prepare_enable (fep -> clk_enet_out );
1272
+ if (ret )
1273
+ goto failed_clk_enet_out ;
1274
+ }
1275
+ if (fep -> clk_ptp ) {
1276
+ ret = clk_prepare_enable (fep -> clk_ptp );
1277
+ if (ret )
1278
+ goto failed_clk_ptp ;
1279
+ }
1280
+ } else {
1281
+ clk_disable_unprepare (fep -> clk_ahb );
1282
+ clk_disable_unprepare (fep -> clk_ipg );
1283
+ if (fep -> clk_enet_out )
1284
+ clk_disable_unprepare (fep -> clk_enet_out );
1285
+ if (fep -> clk_ptp )
1286
+ clk_disable_unprepare (fep -> clk_ptp );
1287
+ }
1288
+
1289
+ return 0 ;
1290
+ failed_clk_ptp :
1291
+ if (fep -> clk_enet_out )
1292
+ clk_disable_unprepare (fep -> clk_enet_out );
1293
+ failed_clk_enet_out :
1294
+ clk_disable_unprepare (fep -> clk_ipg );
1295
+ failed_clk_ipg :
1296
+ clk_disable_unprepare (fep -> clk_ahb );
1297
+
1298
+ return ret ;
1299
+ }
1300
+
1258
1301
static int fec_enet_mii_probe (struct net_device * ndev )
1259
1302
{
1260
1303
struct fec_enet_private * fep = netdev_priv (ndev );
@@ -1773,6 +1816,10 @@ fec_enet_open(struct net_device *ndev)
1773
1816
struct fec_enet_private * fep = netdev_priv (ndev );
1774
1817
int ret ;
1775
1818
1819
+ ret = fec_enet_clk_enable (ndev , true);
1820
+ if (ret )
1821
+ return ret ;
1822
+
1776
1823
/* I should reset the ring buffers here, but I don't yet know
1777
1824
* a simple way to do that.
1778
1825
*/
@@ -1811,6 +1858,7 @@ fec_enet_close(struct net_device *ndev)
1811
1858
phy_disconnect (fep -> phy_dev );
1812
1859
}
1813
1860
1861
+ fec_enet_clk_enable (ndev , false);
1814
1862
fec_enet_free_buffers (ndev );
1815
1863
1816
1864
return 0 ;
@@ -2164,26 +2212,10 @@ fec_probe(struct platform_device *pdev)
2164
2212
fep -> bufdesc_ex = 0 ;
2165
2213
}
2166
2214
2167
- ret = clk_prepare_enable ( fep -> clk_ahb );
2215
+ ret = fec_enet_clk_enable ( ndev , true );
2168
2216
if (ret )
2169
2217
goto failed_clk ;
2170
2218
2171
- ret = clk_prepare_enable (fep -> clk_ipg );
2172
- if (ret )
2173
- goto failed_clk_ipg ;
2174
-
2175
- if (fep -> clk_enet_out ) {
2176
- ret = clk_prepare_enable (fep -> clk_enet_out );
2177
- if (ret )
2178
- goto failed_clk_enet_out ;
2179
- }
2180
-
2181
- if (fep -> clk_ptp ) {
2182
- ret = clk_prepare_enable (fep -> clk_ptp );
2183
- if (ret )
2184
- goto failed_clk_ptp ;
2185
- }
2186
-
2187
2219
fep -> reg_phy = devm_regulator_get (& pdev -> dev , "phy" );
2188
2220
if (!IS_ERR (fep -> reg_phy )) {
2189
2221
ret = regulator_enable (fep -> reg_phy );
@@ -2225,6 +2257,7 @@ fec_probe(struct platform_device *pdev)
2225
2257
2226
2258
/* Carrier starts down, phylib will bring it up */
2227
2259
netif_carrier_off (ndev );
2260
+ fec_enet_clk_enable (ndev , false);
2228
2261
2229
2262
ret = register_netdev (ndev );
2230
2263
if (ret )
@@ -2244,15 +2277,7 @@ fec_probe(struct platform_device *pdev)
2244
2277
if (fep -> reg_phy )
2245
2278
regulator_disable (fep -> reg_phy );
2246
2279
failed_regulator :
2247
- if (fep -> clk_ptp )
2248
- clk_disable_unprepare (fep -> clk_ptp );
2249
- failed_clk_ptp :
2250
- if (fep -> clk_enet_out )
2251
- clk_disable_unprepare (fep -> clk_enet_out );
2252
- failed_clk_enet_out :
2253
- clk_disable_unprepare (fep -> clk_ipg );
2254
- failed_clk_ipg :
2255
- clk_disable_unprepare (fep -> clk_ahb );
2280
+ fec_enet_clk_enable (ndev , false);
2256
2281
failed_clk :
2257
2282
failed_ioremap :
2258
2283
free_netdev (ndev );
@@ -2272,14 +2297,9 @@ fec_drv_remove(struct platform_device *pdev)
2272
2297
del_timer_sync (& fep -> time_keep );
2273
2298
if (fep -> reg_phy )
2274
2299
regulator_disable (fep -> reg_phy );
2275
- if (fep -> clk_ptp )
2276
- clk_disable_unprepare (fep -> clk_ptp );
2277
2300
if (fep -> ptp_clock )
2278
2301
ptp_clock_unregister (fep -> ptp_clock );
2279
- if (fep -> clk_enet_out )
2280
- clk_disable_unprepare (fep -> clk_enet_out );
2281
- clk_disable_unprepare (fep -> clk_ipg );
2282
- clk_disable_unprepare (fep -> clk_ahb );
2302
+ fec_enet_clk_enable (ndev , false);
2283
2303
free_netdev (ndev );
2284
2304
2285
2305
return 0 ;
@@ -2296,12 +2316,7 @@ fec_suspend(struct device *dev)
2296
2316
fec_stop (ndev );
2297
2317
netif_device_detach (ndev );
2298
2318
}
2299
- if (fep -> clk_ptp )
2300
- clk_disable_unprepare (fep -> clk_ptp );
2301
- if (fep -> clk_enet_out )
2302
- clk_disable_unprepare (fep -> clk_enet_out );
2303
- clk_disable_unprepare (fep -> clk_ipg );
2304
- clk_disable_unprepare (fep -> clk_ahb );
2319
+ fec_enet_clk_enable (ndev , false);
2305
2320
2306
2321
if (fep -> reg_phy )
2307
2322
regulator_disable (fep -> reg_phy );
@@ -2322,25 +2337,9 @@ fec_resume(struct device *dev)
2322
2337
return ret ;
2323
2338
}
2324
2339
2325
- ret = clk_prepare_enable (fep -> clk_ahb );
2326
- if (ret )
2327
- goto failed_clk_ahb ;
2328
-
2329
- ret = clk_prepare_enable (fep -> clk_ipg );
2340
+ ret = fec_enet_clk_enable (ndev , true);
2330
2341
if (ret )
2331
- goto failed_clk_ipg ;
2332
-
2333
- if (fep -> clk_enet_out ) {
2334
- ret = clk_prepare_enable (fep -> clk_enet_out );
2335
- if (ret )
2336
- goto failed_clk_enet_out ;
2337
- }
2338
-
2339
- if (fep -> clk_ptp ) {
2340
- ret = clk_prepare_enable (fep -> clk_ptp );
2341
- if (ret )
2342
- goto failed_clk_ptp ;
2343
- }
2342
+ goto failed_clk ;
2344
2343
2345
2344
if (netif_running (ndev )) {
2346
2345
fec_restart (ndev , fep -> full_duplex );
@@ -2349,14 +2348,7 @@ fec_resume(struct device *dev)
2349
2348
2350
2349
return 0 ;
2351
2350
2352
- failed_clk_ptp :
2353
- if (fep -> clk_enet_out )
2354
- clk_disable_unprepare (fep -> clk_enet_out );
2355
- failed_clk_enet_out :
2356
- clk_disable_unprepare (fep -> clk_ipg );
2357
- failed_clk_ipg :
2358
- clk_disable_unprepare (fep -> clk_ahb );
2359
- failed_clk_ahb :
2351
+ failed_clk :
2360
2352
if (fep -> reg_phy )
2361
2353
regulator_disable (fep -> reg_phy );
2362
2354
return ret ;
0 commit comments