Re: [PATCH v2] serial: 8250_of: Add basic PM runtime support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08/07/2017 03:46 PM, Franklin S Cooper Jr wrote:
Add basic PM Runtime support.

Signed-off-by: Franklin S Cooper Jr <fcooper@xxxxxx>
---

Version 2 changes:
Fix build error.
Build tested using allmodconfig

  drivers/tty/serial/8250/8250_of.c | 35 ++++++++++++++++++++++++-----------
  1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c
index 6c5a8ca..9bad8bae 100644
--- a/drivers/tty/serial/8250/8250_of.c
+++ b/drivers/tty/serial/8250/8250_of.c
@@ -18,6 +18,7 @@
  #include <linux/of_address.h>
  #include <linux/of_irq.h>
  #include <linux/of_platform.h>
+#include <linux/pm_runtime.h>
  #include <linux/clk.h>
  #include <linux/reset.h>
@@ -65,6 +66,10 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
  	int ret;
memset(port, 0, sizeof *port);
+
+	pm_runtime_enable(&ofdev->dev);
+	pm_runtime_get_sync(&ofdev->dev);
+
  	if (of_property_read_u32(np, "clock-frequency", &clk)) {
/* Get clk rate through clk driver if present */
@@ -72,12 +77,13 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
  		if (IS_ERR(info->clk)) {
  			dev_warn(&ofdev->dev,
  				"clk or clock-frequency not defined\n");
-			return PTR_ERR(info->clk);
+			ret = PTR_ERR(info->clk);
+			goto err_pmruntime;
  		}
ret = clk_prepare_enable(info->clk);
  		if (ret < 0)
-			return ret;
+			goto err_pmruntime;
clk = clk_get_rate(info->clk);
  	}
@@ -170,8 +176,10 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
  err_dispose:
  	irq_dispose_mapping(port->irq);
  err_unprepare:
-	if (info->clk)
-		clk_disable_unprepare(info->clk);
+	clk_disable_unprepare(info->clk);
+err_pmruntime:
+	pm_runtime_put_sync(&ofdev->dev);
+	pm_runtime_disable(&ofdev->dev);
  	return ret;
  }
@@ -227,8 +235,9 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
  	return 0;
  err_dispose:
  	irq_dispose_mapping(port8250.port.irq);
-	if (info->clk)
-		clk_disable_unprepare(info->clk);
+	pm_runtime_put_sync(&ofdev->dev);
+	pm_runtime_disable(&ofdev->dev);
+	clk_disable_unprepare(info->clk);
  err_free:
  	kfree(info);
  	return ret;
@@ -244,8 +253,9 @@ static int of_platform_serial_remove(struct platform_device *ofdev)
  	serial8250_unregister_port(info->line);
reset_control_assert(info->rst);
-	if (info->clk)
-		clk_disable_unprepare(info->clk);
+	pm_runtime_put_sync(&ofdev->dev);
+	pm_runtime_disable(&ofdev->dev);
+	clk_disable_unprepare(info->clk);
  	kfree(info);
  	return 0;
  }
@@ -259,9 +269,10 @@ static int of_serial_suspend(struct device *dev)
serial8250_suspend_port(info->line); - if (info->clk && (!uart_console(port) || console_suspend_enabled))
+	if ((!uart_console(port) || console_suspend_enabled)) {

Extra pair of parenthesis can be removed. ^

+		pm_runtime_put_sync(dev);
  		clk_disable_unprepare(info->clk);
-
+	}
  	return 0;
  }
@@ -271,8 +282,10 @@ static int of_serial_resume(struct device *dev)
  	struct uart_8250_port *port8250 = serial8250_get_port(info->line);
  	struct uart_port *port = &port8250->port;
- if (info->clk && (!uart_console(port) || console_suspend_enabled))
+	if ((!uart_console(port) || console_suspend_enabled)) {

Extra pair of parenthesis can be removed. ^

+		pm_runtime_get_sync(dev);
  		clk_prepare_enable(info->clk);
+	}
serial8250_resume_port(info->line);

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux