Message ID | 20250506180232.1299-8-quic_ptalari@quicinc.com |
---|---|
State | New |
Headers | show |
Series | Enable QUPs and Serial on SA8255p Qualcomm platforms | expand |
On 06/05/2025 19:02, Praveen Talari wrote: > Add Power Management (PM) runtime support to Qualcomm GENI > serial driver. > > Introduce necessary callbacks and updates to ensure seamless > transitions between power states, enhancing overall power > efficiency. > > Signed-off-by: Praveen Talari <quic_ptalari@quicinc.com> > --- > drivers/tty/serial/qcom_geni_serial.c | 33 +++++++++++++++++++++++---- > 1 file changed, 29 insertions(+), 4 deletions(-) > > diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c > index 60afee3884a6..9d698c354510 100644 > --- a/drivers/tty/serial/qcom_geni_serial.c > +++ b/drivers/tty/serial/qcom_geni_serial.c > @@ -1686,10 +1686,10 @@ static void qcom_geni_serial_pm(struct uart_port *uport, > old_state = UART_PM_STATE_OFF; > > if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) > - geni_serial_resources_on(uport); > + pm_runtime_resume_and_get(uport->dev); > else if (new_state == UART_PM_STATE_OFF && > old_state == UART_PM_STATE_ON) > - geni_serial_resources_off(uport); > + pm_runtime_put_sync(uport->dev); > > } > > @@ -1827,9 +1827,11 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > return ret; > } > > + pm_runtime_enable(port->se.dev); > + > ret = uart_add_one_port(drv, uport); > if (ret) > - return ret; > + goto error; > > if (port->wakeup_irq > 0) { > device_init_wakeup(&pdev->dev, true); > @@ -1839,11 +1841,15 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > device_init_wakeup(&pdev->dev, false); > ida_free(&port_ida, uport->line); > uart_remove_one_port(drv, uport); > - return ret; > + goto error; > } > } > > return 0; > + > +error: > + pm_runtime_disable(port->se.dev); > + return ret; > } > > static void qcom_geni_serial_remove(struct platform_device *pdev) > @@ -1855,9 +1861,26 @@ static void qcom_geni_serial_remove(struct platform_device *pdev) > dev_pm_clear_wake_irq(&pdev->dev); > device_init_wakeup(&pdev->dev, false); > ida_free(&port_ida, uport->line); > + pm_runtime_disable(port->se.dev); > uart_remove_one_port(drv, &port->uport); > } > > +static int qcom_geni_serial_runtime_suspend(struct device *dev) > +{ > + struct qcom_geni_serial_port *port = dev_get_drvdata(dev); > + struct uart_port *uport = &port->uport; > + > + return geni_serial_resources_off(uport); > +}; > + > +static int qcom_geni_serial_runtime_resume(struct device *dev) > +{ > + struct qcom_geni_serial_port *port = dev_get_drvdata(dev); > + struct uart_port *uport = &port->uport; > + > + return geni_serial_resources_on(uport); > +}; > + > static int qcom_geni_serial_suspend(struct device *dev) > { > struct qcom_geni_serial_port *port = dev_get_drvdata(dev); > @@ -1901,6 +1924,8 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = { > }; > > static const struct dev_pm_ops qcom_geni_serial_pm_ops = { > + SET_RUNTIME_PM_OPS(qcom_geni_serial_runtime_suspend, > + qcom_geni_serial_runtime_resume, NULL) > SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_suspend, qcom_geni_serial_resume) > }; > > -- > 2.17.1 > > Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 60afee3884a6..9d698c354510 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -1686,10 +1686,10 @@ static void qcom_geni_serial_pm(struct uart_port *uport, old_state = UART_PM_STATE_OFF; if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) - geni_serial_resources_on(uport); + pm_runtime_resume_and_get(uport->dev); else if (new_state == UART_PM_STATE_OFF && old_state == UART_PM_STATE_ON) - geni_serial_resources_off(uport); + pm_runtime_put_sync(uport->dev); } @@ -1827,9 +1827,11 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) return ret; } + pm_runtime_enable(port->se.dev); + ret = uart_add_one_port(drv, uport); if (ret) - return ret; + goto error; if (port->wakeup_irq > 0) { device_init_wakeup(&pdev->dev, true); @@ -1839,11 +1841,15 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) device_init_wakeup(&pdev->dev, false); ida_free(&port_ida, uport->line); uart_remove_one_port(drv, uport); - return ret; + goto error; } } return 0; + +error: + pm_runtime_disable(port->se.dev); + return ret; } static void qcom_geni_serial_remove(struct platform_device *pdev) @@ -1855,9 +1861,26 @@ static void qcom_geni_serial_remove(struct platform_device *pdev) dev_pm_clear_wake_irq(&pdev->dev); device_init_wakeup(&pdev->dev, false); ida_free(&port_ida, uport->line); + pm_runtime_disable(port->se.dev); uart_remove_one_port(drv, &port->uport); } +static int qcom_geni_serial_runtime_suspend(struct device *dev) +{ + struct qcom_geni_serial_port *port = dev_get_drvdata(dev); + struct uart_port *uport = &port->uport; + + return geni_serial_resources_off(uport); +}; + +static int qcom_geni_serial_runtime_resume(struct device *dev) +{ + struct qcom_geni_serial_port *port = dev_get_drvdata(dev); + struct uart_port *uport = &port->uport; + + return geni_serial_resources_on(uport); +}; + static int qcom_geni_serial_suspend(struct device *dev) { struct qcom_geni_serial_port *port = dev_get_drvdata(dev); @@ -1901,6 +1924,8 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = { }; static const struct dev_pm_ops qcom_geni_serial_pm_ops = { + SET_RUNTIME_PM_OPS(qcom_geni_serial_runtime_suspend, + qcom_geni_serial_runtime_resume, NULL) SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_suspend, qcom_geni_serial_resume) };
Add Power Management (PM) runtime support to Qualcomm GENI serial driver. Introduce necessary callbacks and updates to ensure seamless transitions between power states, enhancing overall power efficiency. Signed-off-by: Praveen Talari <quic_ptalari@quicinc.com> --- drivers/tty/serial/qcom_geni_serial.c | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-)