* [PATCH v2 0/4] serial: atmel: cleanup code
@ 2022-06-15 8:31 Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 1/4] tty: serial: atmel: stop using legacy pm ops Claudiu Beznea
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Claudiu Beznea @ 2022-06-15 8:31 UTC (permalink / raw)
To: richard.genoud, gregkh, jirislaby, nicolas.ferre,
alexandre.belloni, patrice.chotard
Cc: linux-serial, linux-arm-kernel, linux-kernel, Claudiu Beznea
Hi,
The following patches does some cleanup for atmel_serial driver by
switching to dev_pm_ops and improving clock management code. Along with
it I took the chance and introduced a patch for st-asc which removes the
include of pm_runtime.h.
Thank you,
Claudiu Beznea
Changes in v2:
- split patch 2/3 from v1 in patch 2/4 and patch 3/4 in this
series
- collected tags
Claudiu Beznea (4):
tty: serial: atmel: stop using legacy pm ops
tty: serial: atmel: use devm_clk_get()
tty: serial: atmel: remove enable/disable clock due to
atmel_console_setup()
serial: st-asc: remove include of pm_runtime.h
drivers/tty/serial/atmel_serial.c | 93 +++++++++----------------------
drivers/tty/serial/st-asc.c | 1 -
2 files changed, 26 insertions(+), 68 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/4] tty: serial: atmel: stop using legacy pm ops
2022-06-15 8:31 [PATCH v2 0/4] serial: atmel: cleanup code Claudiu Beznea
@ 2022-06-15 8:31 ` Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 2/4] tty: serial: atmel: use devm_clk_get() Claudiu Beznea
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Claudiu Beznea @ 2022-06-15 8:31 UTC (permalink / raw)
To: richard.genoud, gregkh, jirislaby, nicolas.ferre,
alexandre.belloni, patrice.chotard
Cc: linux-serial, linux-arm-kernel, linux-kernel, Claudiu Beznea
Stop using legacy PM ops and switch using dev_pm_ops. Along with
it #ifdef CONFIG_PM are removed and __maybe_unused and pm_ptr() used
instead. Coding style recommends (at chapter Conditional Compilation)
to avoid using preprocessor conditional and use __maybe_unused
instead.
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Acked-by: Richard Genoud <richard.genoud@gmail.com>
---
drivers/tty/serial/atmel_serial.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 74dd1d3ac46f..c618d7e93058 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -166,7 +166,6 @@ struct atmel_uart_port {
unsigned int fidi_min;
unsigned int fidi_max;
-#ifdef CONFIG_PM
struct {
u32 cr;
u32 mr;
@@ -177,7 +176,6 @@ struct atmel_uart_port {
u32 fmr;
u32 fimr;
} cache;
-#endif
int (*prepare_rx)(struct uart_port *port);
int (*prepare_tx)(struct uart_port *port);
@@ -2718,7 +2716,6 @@ static struct uart_driver atmel_uart = {
.cons = ATMEL_CONSOLE_DEVICE,
};
-#ifdef CONFIG_PM
static bool atmel_serial_clk_will_stop(void)
{
#ifdef CONFIG_ARCH_AT91
@@ -2728,10 +2725,9 @@ static bool atmel_serial_clk_will_stop(void)
#endif
}
-static int atmel_serial_suspend(struct platform_device *pdev,
- pm_message_t state)
+static int __maybe_unused atmel_serial_suspend(struct device *dev)
{
- struct uart_port *port = platform_get_drvdata(pdev);
+ struct uart_port *port = dev_get_drvdata(dev);
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
if (uart_console(port) && console_suspend_enabled) {
@@ -2756,14 +2752,14 @@ static int atmel_serial_suspend(struct platform_device *pdev,
}
/* we can not wake up if we're running on slow clock */
- atmel_port->may_wakeup = device_may_wakeup(&pdev->dev);
+ atmel_port->may_wakeup = device_may_wakeup(dev);
if (atmel_serial_clk_will_stop()) {
unsigned long flags;
spin_lock_irqsave(&atmel_port->lock_suspended, flags);
atmel_port->suspended = true;
spin_unlock_irqrestore(&atmel_port->lock_suspended, flags);
- device_set_wakeup_enable(&pdev->dev, 0);
+ device_set_wakeup_enable(dev, 0);
}
uart_suspend_port(&atmel_uart, port);
@@ -2771,9 +2767,9 @@ static int atmel_serial_suspend(struct platform_device *pdev,
return 0;
}
-static int atmel_serial_resume(struct platform_device *pdev)
+static int __maybe_unused atmel_serial_resume(struct device *dev)
{
- struct uart_port *port = platform_get_drvdata(pdev);
+ struct uart_port *port = dev_get_drvdata(dev);
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
unsigned long flags;
@@ -2808,14 +2804,10 @@ static int atmel_serial_resume(struct platform_device *pdev)
spin_unlock_irqrestore(&atmel_port->lock_suspended, flags);
uart_resume_port(&atmel_uart, port);
- device_set_wakeup_enable(&pdev->dev, atmel_port->may_wakeup);
+ device_set_wakeup_enable(dev, atmel_port->may_wakeup);
return 0;
}
-#else
-#define atmel_serial_suspend NULL
-#define atmel_serial_resume NULL
-#endif
static void atmel_serial_probe_fifos(struct atmel_uart_port *atmel_port,
struct platform_device *pdev)
@@ -3019,14 +3011,16 @@ static int atmel_serial_remove(struct platform_device *pdev)
return ret;
}
+static SIMPLE_DEV_PM_OPS(atmel_serial_pm_ops, atmel_serial_suspend,
+ atmel_serial_resume);
+
static struct platform_driver atmel_serial_driver = {
.probe = atmel_serial_probe,
.remove = atmel_serial_remove,
- .suspend = atmel_serial_suspend,
- .resume = atmel_serial_resume,
.driver = {
.name = "atmel_usart_serial",
.of_match_table = of_match_ptr(atmel_serial_dt_ids),
+ .pm = pm_ptr(&atmel_serial_pm_ops),
},
};
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/4] tty: serial: atmel: use devm_clk_get()
2022-06-15 8:31 [PATCH v2 0/4] serial: atmel: cleanup code Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 1/4] tty: serial: atmel: stop using legacy pm ops Claudiu Beznea
@ 2022-06-15 8:31 ` Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 3/4] tty: serial: atmel: remove enable/disable clock due to atmel_console_setup() Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 4/4] serial: st-asc: remove include of pm_runtime.h Claudiu Beznea
3 siblings, 0 replies; 5+ messages in thread
From: Claudiu Beznea @ 2022-06-15 8:31 UTC (permalink / raw)
To: richard.genoud, gregkh, jirislaby, nicolas.ferre,
alexandre.belloni, patrice.chotard
Cc: linux-serial, linux-arm-kernel, linux-kernel, Claudiu Beznea
Use devm_clk_get() for serial clock instead of clk_get()/clk_put().
With this move the clk_get in driver's probe function.
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
---
drivers/tty/serial/atmel_serial.c | 50 ++++++++++---------------------
1 file changed, 15 insertions(+), 35 deletions(-)
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index c618d7e93058..4cec97fd7241 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -2508,24 +2508,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
if (ret)
return ret;
- /* for console, the clock could already be configured */
- if (!atmel_port->clk) {
- atmel_port->clk = clk_get(&mpdev->dev, "usart");
- if (IS_ERR(atmel_port->clk)) {
- ret = PTR_ERR(atmel_port->clk);
- atmel_port->clk = NULL;
- return ret;
- }
- ret = clk_prepare_enable(atmel_port->clk);
- if (ret) {
- clk_put(atmel_port->clk);
- atmel_port->clk = NULL;
- return ret;
- }
- port->uartclk = clk_get_rate(atmel_port->clk);
- clk_disable_unprepare(atmel_port->clk);
- /* only enable clock when USART is in use */
- }
+ port->uartclk = clk_get_rate(atmel_port->clk);
/*
* Use TXEMPTY for interrupt when rs485 or ISO7816 else TXRDY or
@@ -2896,14 +2879,23 @@ static int atmel_serial_probe(struct platform_device *pdev)
atomic_set(&atmel_port->tasklet_shutdown, 0);
spin_lock_init(&atmel_port->lock_suspended);
+ atmel_port->clk = devm_clk_get(&pdev->dev, "usart");
+ if (IS_ERR(atmel_port->clk)) {
+ ret = PTR_ERR(atmel_port->clk);
+ goto err;
+ }
+ ret = clk_prepare_enable(atmel_port->clk);
+ if (ret)
+ goto err;
+
ret = atmel_init_port(atmel_port, pdev);
if (ret)
- goto err_clear_bit;
+ goto err_clk_disable_unprepare;
atmel_port->gpios = mctrl_gpio_init(&atmel_port->uart, 0);
if (IS_ERR(atmel_port->gpios)) {
ret = PTR_ERR(atmel_port->gpios);
- goto err_clear_bit;
+ goto err_clk_disable_unprepare;
}
if (!atmel_use_pdc_rx(&atmel_port->uart)) {
@@ -2912,7 +2904,7 @@ static int atmel_serial_probe(struct platform_device *pdev)
sizeof(struct atmel_uart_char),
GFP_KERNEL);
if (!data)
- goto err_alloc_ring;
+ goto err_clk_disable_unprepare;
atmel_port->rx_ring.buf = data;
}
@@ -2936,12 +2928,6 @@ static int atmel_serial_probe(struct platform_device *pdev)
device_init_wakeup(&pdev->dev, 1);
platform_set_drvdata(pdev, atmel_port);
- /*
- * The peripheral clock has been disabled by atmel_init_port():
- * enable it before accessing I/O registers
- */
- clk_prepare_enable(atmel_port->clk);
-
if (rs485_enabled) {
atmel_uart_writel(&atmel_port->uart, ATMEL_US_MR,
ATMEL_US_USMODE_NORMAL);
@@ -2965,12 +2951,8 @@ static int atmel_serial_probe(struct platform_device *pdev)
err_add_port:
kfree(atmel_port->rx_ring.buf);
atmel_port->rx_ring.buf = NULL;
-err_alloc_ring:
- if (!uart_console(&atmel_port->uart)) {
- clk_put(atmel_port->clk);
- atmel_port->clk = NULL;
- }
-err_clear_bit:
+err_clk_disable_unprepare:
+ clk_disable_unprepare(atmel_port->clk);
clear_bit(atmel_port->uart.line, atmel_ports_in_use);
err:
return ret;
@@ -3004,8 +2986,6 @@ static int atmel_serial_remove(struct platform_device *pdev)
clear_bit(port->line, atmel_ports_in_use);
- clk_put(atmel_port->clk);
- atmel_port->clk = NULL;
pdev->dev.of_node = NULL;
return ret;
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 3/4] tty: serial: atmel: remove enable/disable clock due to atmel_console_setup()
2022-06-15 8:31 [PATCH v2 0/4] serial: atmel: cleanup code Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 1/4] tty: serial: atmel: stop using legacy pm ops Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 2/4] tty: serial: atmel: use devm_clk_get() Claudiu Beznea
@ 2022-06-15 8:31 ` Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 4/4] serial: st-asc: remove include of pm_runtime.h Claudiu Beznea
3 siblings, 0 replies; 5+ messages in thread
From: Claudiu Beznea @ 2022-06-15 8:31 UTC (permalink / raw)
To: richard.genoud, gregkh, jirislaby, nicolas.ferre,
alexandre.belloni, patrice.chotard
Cc: linux-serial, linux-arm-kernel, linux-kernel, Claudiu Beznea
There is no need for clk_prepare_enable() at the beginning of
atmel_console_setup() and clk_disable_unprepare() at the end of
atmel_console_setup() as the clock is already enabled when calling
atmel_console_setup() and its disablement is done at the end
of probe.
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
---
drivers/tty/serial/atmel_serial.c | 15 ---------------
1 file changed, 15 deletions(-)
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 4cec97fd7241..51835c7ce827 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -2630,10 +2630,6 @@ static int __init atmel_console_setup(struct console *co, char *options)
return -ENODEV;
}
- ret = clk_prepare_enable(atmel_ports[co->index].clk);
- if (ret)
- return ret;
-
atmel_uart_writel(port, ATMEL_US_IDR, -1);
atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_TXEN | ATMEL_US_RXEN);
@@ -2914,17 +2910,6 @@ static int atmel_serial_probe(struct platform_device *pdev)
if (ret)
goto err_add_port;
-#ifdef CONFIG_SERIAL_ATMEL_CONSOLE
- if (uart_console(&atmel_port->uart)
- && ATMEL_CONSOLE_DEVICE->flags & CON_ENABLED) {
- /*
- * The serial core enabled the clock for us, so undo
- * the clk_prepare_enable() in atmel_console_setup()
- */
- clk_disable_unprepare(atmel_port->clk);
- }
-#endif
-
device_init_wakeup(&pdev->dev, 1);
platform_set_drvdata(pdev, atmel_port);
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 4/4] serial: st-asc: remove include of pm_runtime.h
2022-06-15 8:31 [PATCH v2 0/4] serial: atmel: cleanup code Claudiu Beznea
` (2 preceding siblings ...)
2022-06-15 8:31 ` [PATCH v2 3/4] tty: serial: atmel: remove enable/disable clock due to atmel_console_setup() Claudiu Beznea
@ 2022-06-15 8:31 ` Claudiu Beznea
3 siblings, 0 replies; 5+ messages in thread
From: Claudiu Beznea @ 2022-06-15 8:31 UTC (permalink / raw)
To: richard.genoud, gregkh, jirislaby, nicolas.ferre,
alexandre.belloni, patrice.chotard
Cc: linux-serial, linux-arm-kernel, linux-kernel, Claudiu Beznea
st-asc driver doesn't use helpers from pm_runtime.h thus remove its
include.
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/tty/serial/st-asc.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/tty/serial/st-asc.c b/drivers/tty/serial/st-asc.c
index 1b0da603ab54..cce42f4c9bc2 100644
--- a/drivers/tty/serial/st-asc.c
+++ b/drivers/tty/serial/st-asc.c
@@ -17,7 +17,6 @@
#include <linux/tty_flip.h>
#include <linux/delay.h>
#include <linux/spinlock.h>
-#include <linux/pm_runtime.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/serial_core.h>
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-15 8:31 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-15 8:31 [PATCH v2 0/4] serial: atmel: cleanup code Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 1/4] tty: serial: atmel: stop using legacy pm ops Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 2/4] tty: serial: atmel: use devm_clk_get() Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 3/4] tty: serial: atmel: remove enable/disable clock due to atmel_console_setup() Claudiu Beznea
2022-06-15 8:31 ` [PATCH v2 4/4] serial: st-asc: remove include of pm_runtime.h Claudiu Beznea
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).