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