[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250110071351.66888-10-basharath@couthit.com>
Date: Fri, 10 Jan 2025 12:43:50 +0530
From: Basharath Hussain Khaja <basharath@...thit.com>
To: danishanwar@...com,
rogerq@...nel.org,
andrew+netdev@...n.ch,
davem@...emloft.net,
edumazet@...gle.com,
kuba@...nel.org,
pabeni@...hat.com,
robh@...nel.org,
krzk+dt@...nel.org,
conor+dt@...nel.org,
nm@...com,
ssantosh@...nel.org,
tony@...mide.com,
richardcochran@...il.com,
parvathi@...thit.com,
basharath@...thit.com,
schnelle@...ux.ibm.com,
rdunlap@...radead.org,
diogo.ivo@...mens.com,
m-karicheri2@...com,
horms@...nel.org,
jacob.e.keller@...el.com,
m-malladi@...com,
javier.carrasco.cruz@...il.com,
afd@...com,
s-anna@...com
Cc: linux-arm-kernel@...ts.infradead.org,
netdev@...r.kernel.org,
devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org,
linux-omap@...r.kernel.org,
pratheesh@...com,
prajith@...com,
vigneshr@...com,
praneeth@...com,
srk@...com,
rogerq@...com,
krishna@...thit.com,
pmohan@...thit.com,
mohan@...thit.com
Subject: [RFC PATCH 09/10] net: ti: prueth: Adds power management support for PRU-ICSS
From: Roger Quadros <rogerq@...com>
Changes for supporting the sleep/resume feature for PRU-ICSS.
PRU-ICSS will be kept in IDLE mode for optimal power consumption by Linux
power management subsystem and will be resumed when it is required.
Signed-off-by: Roger Quadros <rogerq@...com>
Signed-off-by: Andrew F. Davis <afd@...com>
Signed-off-by: Parvathi Pudi <parvathi@...thit.com>
Signed-off-by: Basharath Hussain Khaja <basharath@...thit.com>
---
drivers/net/ethernet/ti/icssm/icssm_prueth.c | 62 ++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/net/ethernet/ti/icssm/icssm_prueth.c b/drivers/net/ethernet/ti/icssm/icssm_prueth.c
index 97de6b7ebd29..7727975dab88 100644
--- a/drivers/net/ethernet/ti/icssm/icssm_prueth.c
+++ b/drivers/net/ethernet/ti/icssm/icssm_prueth.c
@@ -2325,6 +2325,67 @@ static void icssm_prueth_remove(struct platform_device *pdev)
pru_rproc_put(prueth->pru0);
}
+#ifdef CONFIG_PM_SLEEP
+static int icssm_prueth_suspend(struct device *dev)
+{
+ struct prueth *prueth = dev_get_drvdata(dev);
+ struct net_device *ndev;
+ int i, ret;
+
+ for (i = 0; i < PRUETH_NUM_MACS; i++) {
+ ndev = prueth->registered_netdevs[i];
+
+ if (!ndev)
+ continue;
+
+ if (netif_running(ndev)) {
+ netif_device_detach(ndev);
+ ret = icssm_emac_ndo_stop(ndev);
+ if (ret < 0) {
+ netdev_err(ndev, "failed to stop: %d", ret);
+ return ret;
+ }
+ }
+ }
+
+ pruss_cfg_ocp_master_ports(prueth->pruss, 0);
+
+ return 0;
+}
+
+static int icssm_prueth_resume(struct device *dev)
+{
+ struct prueth *prueth = dev_get_drvdata(dev);
+ struct net_device *ndev;
+ int i, ret;
+
+ pruss_cfg_ocp_master_ports(prueth->pruss, 1);
+
+ for (i = 0; i < PRUETH_NUM_MACS; i++) {
+ ndev = prueth->registered_netdevs[i];
+
+ if (!ndev)
+ continue;
+
+ if (netif_running(ndev)) {
+ ret = icssm_emac_ndo_open(ndev);
+ if (ret < 0) {
+ netdev_err(ndev, "failed to start: %d", ret);
+ return ret;
+ }
+ netif_device_attach(ndev);
+ }
+ }
+
+ return 0;
+}
+
+#endif /* CONFIG_PM_SLEEP */
+
+static const struct dev_pm_ops prueth_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(icssm_prueth_suspend, icssm_prueth_resume)
+};
+
/* AM57xx SoC-specific firmware data */
static struct prueth_private_data am57xx_prueth_pdata = {
.fw_pru[PRUSS_PRU0] = {
@@ -2349,6 +2410,7 @@ static struct platform_driver prueth_driver = {
.driver = {
.name = "prueth",
.of_match_table = prueth_dt_match,
+ .pm = &prueth_dev_pm_ops,
},
};
module_platform_driver(prueth_driver);
--
2.34.1
Powered by blists - more mailing lists