diff options
author | qctecmdr <qctecmdr@localhost> | 2019-11-04 16:38:11 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-11-04 16:38:11 -0800 |
commit | 803cf375a1562213965a942572939ecd86fa12ef (patch) | |
tree | c93605d51529daee6f647742bc8c6a455dc2f971 /drivers | |
parent | 09f2bd7cdb5e0715771c7ca28cb2ed46d50cdfea (diff) | |
parent | e35f72889f71b1db7828ebc89495ec6f8deb423c (diff) | |
download | data-kernel-803cf375a1562213965a942572939ecd86fa12ef.tar.gz |
Merge "data-kernel: EMAC: Add hibernation mode support."
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c index e2202a1..8b67187 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c @@ -2459,6 +2459,95 @@ static INT DWC_ETH_QOS_resume(struct platform_device *pdev) #endif /* CONFIG_PM */ +static int DWC_ETH_QOS_hib_restore(struct device *dev) { + struct DWC_ETH_QOS_prv_data *pdata = gDWC_ETH_QOS_prv_data; + int ret = 0; + + if (of_device_is_compatible(dev->of_node, "qcom,emac-smmu-embedded")) + return 0; + + EMACINFO(" start\n"); + + ret = DWC_ETH_QOS_init_regulators(dev); + if (ret) + return ret; + + ret = DWC_ETH_QOS_init_gpios(dev); + if (ret) + return ret; + + ret = DWC_ETH_QOS_get_clks(dev); + if (ret) + return ret; + + DWC_ETH_QOS_set_clk_and_bus_config(pdata, pdata->speed); + + DWC_ETH_QOS_set_rgmii_func_clk_en(); + +#ifdef DWC_ETH_QOS_CONFIG_PTP + DWC_ETH_QOS_ptp_init(pdata); +#endif /* end of DWC_ETH_QOS_CONFIG_PTP */ + + /* issue software reset to device */ + pdata->hw_if.exit(); + + /* Bypass PHYLIB for TBI, RTBI and SGMII interface */ + if (pdata->hw_feat.sma_sel == 1) { + ret = DWC_ETH_QOS_mdio_register(pdata->dev); + if (ret < 0) { + EMACERR("MDIO bus (id %d) registration failed\n", + pdata->bus_id); + return ret; + } + } + + if (!(pdata->dev->flags & IFF_UP)) { + pdata->dev->netdev_ops->ndo_open(pdata->dev); + pdata->dev->flags |= IFF_UP; + } + + EMACINFO("end\n"); + + return ret; +} + +static int DWC_ETH_QOS_hib_freeze(struct device *dev) { + struct DWC_ETH_QOS_prv_data *pdata = gDWC_ETH_QOS_prv_data; + int ret = 0; + + if (of_device_is_compatible(dev->of_node, "qcom,emac-smmu-embedded")) + return 0; + + EMACINFO(" start\n"); + if (pdata->dev->flags & IFF_UP) { + pdata->dev->netdev_ops->ndo_stop(pdata->dev); + pdata->dev->flags &= ~IFF_UP; + } + + if (pdata->hw_feat.sma_sel == 1) + DWC_ETH_QOS_mdio_unregister(pdata->dev); + +#ifdef DWC_ETH_QOS_CONFIG_PTP + DWC_ETH_QOS_ptp_remove(pdata); +#endif /* end of DWC_ETH_QOS_CONFIG_PTP */ + + DWC_ETH_QOS_disable_clks(dev); + + DWC_ETH_QOS_disable_regulators(); + + DWC_ETH_QOS_free_gpios(); + + EMACINFO("end\n"); + + return ret; +} + +static const struct dev_pm_ops DWC_ETH_QOS_pm_ops = { + .freeze = DWC_ETH_QOS_hib_freeze, + .restore = DWC_ETH_QOS_hib_restore, + .thaw = DWC_ETH_QOS_hib_restore, +}; + static struct platform_driver DWC_ETH_QOS_plat_drv = { .probe = DWC_ETH_QOS_probe, .remove = DWC_ETH_QOS_remove, @@ -2471,6 +2560,7 @@ static struct platform_driver DWC_ETH_QOS_plat_drv = { .name = DRV_NAME, .owner = THIS_MODULE, .of_match_table = DWC_ETH_QOS_plat_drv_match, + .pm = &DWC_ETH_QOS_pm_ops, }, }; |