24
24
#include <linux/module.h>
25
25
#include <linux/kernel.h>
26
26
#include <linux/string.h>
27
+ #include <linux/pm_runtime.h>
27
28
#include <linux/ptrace.h>
28
29
#include <linux/errno.h>
29
30
#include <linux/ioport.h>
@@ -77,6 +78,7 @@ static void fec_enet_itr_coal_init(struct net_device *ndev);
77
78
#define FEC_ENET_RAEM_V 0x8
78
79
#define FEC_ENET_RAFL_V 0x8
79
80
#define FEC_ENET_OPD_V 0xFFF0
81
+ #define FEC_MDIO_PM_TIMEOUT 100 /* ms */
80
82
81
83
static struct platform_device_id fec_devtype [] = {
82
84
{
@@ -1767,7 +1769,13 @@ static void fec_enet_adjust_link(struct net_device *ndev)
1767
1769
static int fec_enet_mdio_read (struct mii_bus * bus , int mii_id , int regnum )
1768
1770
{
1769
1771
struct fec_enet_private * fep = bus -> priv ;
1772
+ struct device * dev = & fep -> pdev -> dev ;
1770
1773
unsigned long time_left ;
1774
+ int ret = 0 ;
1775
+
1776
+ ret = pm_runtime_get_sync (dev );
1777
+ if (IS_ERR_VALUE (ret ))
1778
+ return ret ;
1771
1779
1772
1780
fep -> mii_timeout = 0 ;
1773
1781
init_completion (& fep -> mdio_done );
@@ -1783,18 +1791,30 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
1783
1791
if (time_left == 0 ) {
1784
1792
fep -> mii_timeout = 1 ;
1785
1793
netdev_err (fep -> netdev , "MDIO read timeout\n" );
1786
- return - ETIMEDOUT ;
1794
+ ret = - ETIMEDOUT ;
1795
+ goto out ;
1787
1796
}
1788
1797
1789
- /* return value */
1790
- return FEC_MMFR_DATA (readl (fep -> hwp + FEC_MII_DATA ));
1798
+ ret = FEC_MMFR_DATA (readl (fep -> hwp + FEC_MII_DATA ));
1799
+
1800
+ out :
1801
+ pm_runtime_mark_last_busy (dev );
1802
+ pm_runtime_put_autosuspend (dev );
1803
+
1804
+ return ret ;
1791
1805
}
1792
1806
1793
1807
static int fec_enet_mdio_write (struct mii_bus * bus , int mii_id , int regnum ,
1794
1808
u16 value )
1795
1809
{
1796
1810
struct fec_enet_private * fep = bus -> priv ;
1811
+ struct device * dev = & fep -> pdev -> dev ;
1797
1812
unsigned long time_left ;
1813
+ int ret = 0 ;
1814
+
1815
+ ret = pm_runtime_get_sync (dev );
1816
+ if (IS_ERR_VALUE (ret ))
1817
+ return ret ;
1798
1818
1799
1819
fep -> mii_timeout = 0 ;
1800
1820
init_completion (& fep -> mdio_done );
@@ -1811,10 +1831,13 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1811
1831
if (time_left == 0 ) {
1812
1832
fep -> mii_timeout = 1 ;
1813
1833
netdev_err (fep -> netdev , "MDIO write timeout\n" );
1814
- return - ETIMEDOUT ;
1834
+ ret = - ETIMEDOUT ;
1815
1835
}
1816
1836
1817
- return 0 ;
1837
+ pm_runtime_mark_last_busy (dev );
1838
+ pm_runtime_put_autosuspend (dev );
1839
+
1840
+ return ret ;
1818
1841
}
1819
1842
1820
1843
static int fec_enet_clk_enable (struct net_device * ndev , bool enable )
@@ -1826,9 +1849,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
1826
1849
ret = clk_prepare_enable (fep -> clk_ahb );
1827
1850
if (ret )
1828
1851
return ret ;
1829
- ret = clk_prepare_enable (fep -> clk_ipg );
1830
- if (ret )
1831
- goto failed_clk_ipg ;
1832
1852
if (fep -> clk_enet_out ) {
1833
1853
ret = clk_prepare_enable (fep -> clk_enet_out );
1834
1854
if (ret )
@@ -1852,7 +1872,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
1852
1872
}
1853
1873
} else {
1854
1874
clk_disable_unprepare (fep -> clk_ahb );
1855
- clk_disable_unprepare (fep -> clk_ipg );
1856
1875
if (fep -> clk_enet_out )
1857
1876
clk_disable_unprepare (fep -> clk_enet_out );
1858
1877
if (fep -> clk_ptp ) {
@@ -1874,8 +1893,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
1874
1893
if (fep -> clk_enet_out )
1875
1894
clk_disable_unprepare (fep -> clk_enet_out );
1876
1895
failed_clk_enet_out :
1877
- clk_disable_unprepare (fep -> clk_ipg );
1878
- failed_clk_ipg :
1879
1896
clk_disable_unprepare (fep -> clk_ahb );
1880
1897
1881
1898
return ret ;
@@ -2847,10 +2864,14 @@ fec_enet_open(struct net_device *ndev)
2847
2864
struct fec_enet_private * fep = netdev_priv (ndev );
2848
2865
int ret ;
2849
2866
2867
+ ret = pm_runtime_get_sync (& fep -> pdev -> dev );
2868
+ if (IS_ERR_VALUE (ret ))
2869
+ return ret ;
2870
+
2850
2871
pinctrl_pm_select_default_state (& fep -> pdev -> dev );
2851
2872
ret = fec_enet_clk_enable (ndev , true);
2852
2873
if (ret )
2853
- return ret ;
2874
+ goto clk_enable ;
2854
2875
2855
2876
/* I should reset the ring buffers here, but I don't yet know
2856
2877
* a simple way to do that.
@@ -2881,6 +2902,9 @@ fec_enet_open(struct net_device *ndev)
2881
2902
fec_enet_free_buffers (ndev );
2882
2903
err_enet_alloc :
2883
2904
fec_enet_clk_enable (ndev , false);
2905
+ clk_enable :
2906
+ pm_runtime_mark_last_busy (& fep -> pdev -> dev );
2907
+ pm_runtime_put_autosuspend (& fep -> pdev -> dev );
2884
2908
pinctrl_pm_select_sleep_state (& fep -> pdev -> dev );
2885
2909
return ret ;
2886
2910
}
@@ -2903,6 +2927,9 @@ fec_enet_close(struct net_device *ndev)
2903
2927
2904
2928
fec_enet_clk_enable (ndev , false);
2905
2929
pinctrl_pm_select_sleep_state (& fep -> pdev -> dev );
2930
+ pm_runtime_mark_last_busy (& fep -> pdev -> dev );
2931
+ pm_runtime_put_autosuspend (& fep -> pdev -> dev );
2932
+
2906
2933
fec_enet_free_buffers (ndev );
2907
2934
2908
2935
return 0 ;
@@ -3388,6 +3415,10 @@ fec_probe(struct platform_device *pdev)
3388
3415
if (ret )
3389
3416
goto failed_clk ;
3390
3417
3418
+ ret = clk_prepare_enable (fep -> clk_ipg );
3419
+ if (ret )
3420
+ goto failed_clk_ipg ;
3421
+
3391
3422
fep -> reg_phy = devm_regulator_get (& pdev -> dev , "phy" );
3392
3423
if (!IS_ERR (fep -> reg_phy )) {
3393
3424
ret = regulator_enable (fep -> reg_phy );
@@ -3434,6 +3465,8 @@ fec_probe(struct platform_device *pdev)
3434
3465
netif_carrier_off (ndev );
3435
3466
fec_enet_clk_enable (ndev , false);
3436
3467
pinctrl_pm_select_sleep_state (& pdev -> dev );
3468
+ pm_runtime_set_active (& pdev -> dev );
3469
+ pm_runtime_enable (& pdev -> dev );
3437
3470
3438
3471
ret = register_netdev (ndev );
3439
3472
if (ret )
@@ -3447,6 +3480,12 @@ fec_probe(struct platform_device *pdev)
3447
3480
3448
3481
fep -> rx_copybreak = COPYBREAK_DEFAULT ;
3449
3482
INIT_WORK (& fep -> tx_timeout_work , fec_enet_timeout_work );
3483
+
3484
+ pm_runtime_set_autosuspend_delay (& pdev -> dev , FEC_MDIO_PM_TIMEOUT );
3485
+ pm_runtime_use_autosuspend (& pdev -> dev );
3486
+ pm_runtime_mark_last_busy (& pdev -> dev );
3487
+ pm_runtime_put_autosuspend (& pdev -> dev );
3488
+
3450
3489
return 0 ;
3451
3490
3452
3491
failed_register :
@@ -3457,6 +3496,8 @@ fec_probe(struct platform_device *pdev)
3457
3496
if (fep -> reg_phy )
3458
3497
regulator_disable (fep -> reg_phy );
3459
3498
failed_regulator :
3499
+ clk_disable_unprepare (fep -> clk_ipg );
3500
+ failed_clk_ipg :
3460
3501
fec_enet_clk_enable (ndev , false);
3461
3502
failed_clk :
3462
3503
failed_phy :
@@ -3568,7 +3609,28 @@ static int __maybe_unused fec_resume(struct device *dev)
3568
3609
return ret ;
3569
3610
}
3570
3611
3571
- static SIMPLE_DEV_PM_OPS (fec_pm_ops , fec_suspend , fec_resume ) ;
3612
+ static int __maybe_unused fec_runtime_suspend (struct device * dev )
3613
+ {
3614
+ struct net_device * ndev = dev_get_drvdata (dev );
3615
+ struct fec_enet_private * fep = netdev_priv (ndev );
3616
+
3617
+ clk_disable_unprepare (fep -> clk_ipg );
3618
+
3619
+ return 0 ;
3620
+ }
3621
+
3622
+ static int __maybe_unused fec_runtime_resume (struct device * dev )
3623
+ {
3624
+ struct net_device * ndev = dev_get_drvdata (dev );
3625
+ struct fec_enet_private * fep = netdev_priv (ndev );
3626
+
3627
+ return clk_prepare_enable (fep -> clk_ipg );
3628
+ }
3629
+
3630
+ static const struct dev_pm_ops fec_pm_ops = {
3631
+ SET_SYSTEM_SLEEP_PM_OPS (fec_suspend , fec_resume )
3632
+ SET_RUNTIME_PM_OPS (fec_runtime_suspend , fec_runtime_resume , NULL )
3633
+ };
3572
3634
3573
3635
static struct platform_driver fec_driver = {
3574
3636
.driver = {
0 commit comments