summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSunil Paidimarri <hisunil@codeaurora.org>2019-06-13 19:14:06 -0700
committerSuraj Jaiswal <jsuraj@codeaurora.org>2019-10-29 17:13:52 +0530
commite35f72889f71b1db7828ebc89495ec6f8deb423c (patch)
treed774db0692f5c904e4ce882f86b668800e094193 /drivers
parent6f35b39a62679d40883b01f0a4958c32f36ca52b (diff)
downloaddata-kernel-e35f72889f71b1db7828ebc89495ec6f8deb423c.tar.gz
data-kernel: EMAC: Add hibernation mode support.
Update EMAC driver to support hibernation mode support. Bring down interface on hibernation mode and up on exi Change-Id: I20591969a56fb30c0a13be617f519bb43119f27d Acked-by: Rahul Kawadgave <rahulak@qti.qualcomm.com> Signed-off-by: Sunil Paidimarri <hisunil@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c90
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,
},
};