[PATCH 4.9 42/51] tty: serial: 8250_mtk: always resume the device in probe.

From: Greg Kroah-Hartman
Date: Tue Dec 11 2018 - 10:50:20 EST


4.9-stable review patch. If anyone has any objections, please let me know.

------------------

From: Peter Shih <pihsun@xxxxxxxxxxxx>

commit 100bc3e2bebf95506da57cbdf5f26b25f6da4c81 upstream.

serial8250_register_8250_port calls uart_config_port, which calls
config_port on the port before it tries to power on the port. So we need
the port to be on before calling serial8250_register_8250_port. Change
the code to always do a runtime resume in probe before registering port,
and always do a runtime suspend in remove.

This basically reverts the change in commit 68e5fc4a255a ("tty: serial:
8250_mtk: use pm_runtime callbacks for enabling"), but still use
pm_runtime callbacks.

Fixes: 68e5fc4a255a ("tty: serial: 8250_mtk: use pm_runtime callbacks for enabling")
Signed-off-by: Peter Shih <pihsun@xxxxxxxxxxxx>
Cc: stable <stable@xxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>

---
drivers/tty/serial/8250/8250_mtk.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)

--- a/drivers/tty/serial/8250/8250_mtk.c
+++ b/drivers/tty/serial/8250/8250_mtk.c
@@ -225,17 +225,17 @@ static int mtk8250_probe(struct platform

platform_set_drvdata(pdev, data);

- pm_runtime_enable(&pdev->dev);
- if (!pm_runtime_enabled(&pdev->dev)) {
- err = mtk8250_runtime_resume(&pdev->dev);
- if (err)
- return err;
- }
+ err = mtk8250_runtime_resume(&pdev->dev);
+ if (err)
+ return err;

data->line = serial8250_register_8250_port(&uart);
if (data->line < 0)
return data->line;

+ pm_runtime_set_active(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+
return 0;
}

@@ -246,13 +246,11 @@ static int mtk8250_remove(struct platfor
pm_runtime_get_sync(&pdev->dev);

serial8250_unregister_port(data->line);
+ mtk8250_runtime_suspend(&pdev->dev);

pm_runtime_disable(&pdev->dev);
pm_runtime_put_noidle(&pdev->dev);

- if (!pm_runtime_status_suspended(&pdev->dev))
- mtk8250_runtime_suspend(&pdev->dev);
-
return 0;
}