On Tue, Aug 11, 2015 at 12:02:58AM -0300, Fabio Estevam wrote:
On Mon, Aug 10, 2015 at 10:35 PM, Eduardo Valentin [off-list ref] wrote:
quoted
static int imx_poll_get_char(struct uart_port *port)
{
- if (!(readl_relaxed(port->membase + USR2) & USR2_RDR))
- return NO_POLL_CHAR;
+ int ret;
+
+ pm_runtime_get_sync(sport->dev);
+ if (!(readl_relaxed(port->membase + USR2) & USR2_RDR)) {
+ ret = NO_POLL_CHAR;
+ goto mark_last;
+ }
- return readl_relaxed(port->membase + URXD0) & URXD_RX_DATA;
+ ret = readl_relaxed(port->membase + URXD0) & URXD_RX_DATA;
+
+mark_last:
+ pm_runtime_mark_last_busy(sport->dev);
+ pm_runtime_put_autosuspend(sport->dev);
You should return ret here.
quoted
+static int serial_imx_runtime_resume(struct device *dev)
+{
+ struct imx_port *sport = dev_get_drvdata(dev);
+
+ clk_enable(sport->clk_per);
clk_enable() may fail.
quoted
+ clk_enable(sport->clk_ipg);
Same here.
quoted
@@ -2096,6 +2212,8 @@ static int imx_serial_port_resume(struct device *dev)
struct platform_device *pdev = to_platform_device(dev);
struct imx_port *sport = platform_get_drvdata(pdev);
+ clk_prepare_enable(sport->clk_per);
clk_prepare_enable() may fail.
quoted
+ clk_prepare_enable(sport->clk_ipg);
Ditto.
agreed on all. resending this one with the above suggestions/fixes applied.