linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/14] serial: Add a helper to parse device properties and more
@ 2024-02-26 14:19 Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 01/14] serial: core: Move struct uart_port::quirks closer to possible values Andy Shevchenko
                   ` (13 more replies)
  0 siblings, 14 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

I have noticed that many drivers are using the subset of the common
properties and IRQ retrieval code. With the moving it to one place
we have got a common parser one for many.

Tested on Intel Apollo Lake with DesingWare 8250 UARTs (clang compiled)
and in QEMU for Aspeed configuration (gcc compiled). The rest has been
compile tested on x86_64 with clang.

In v2:
- fixed typo (Hugo)
- renamed UPIO_UNSET --> UPIO_UNKNOWN (Florian)
- fixed 8250_of not working (Andrew)
- dropped unused variable in 8250_bcm7271 (LKP)
- added tag to 8250_aspeed_vuart (Andrew)

Andy Shevchenko (14):
  serial: core: Move struct uart_port::quirks closer to possible values
  serial: core: Add UPIO_UNKNOWN constant for unknown port type
  serial: port: Introduce a common helper to read properties
  serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties()
  serial: 8250_bcm2835aux: Switch to use uart_read_port_properties()
  serial: 8250_bcm7271: Switch to use uart_read_port_properties()
  serial: 8250_dw: Switch to use uart_read_port_properties()
  serial: 8250_ingenic: Switch to use uart_read_port_properties()
  serial: 8250_lpc18xx: Switch to use uart_read_port_properties()
  serial: 8250_of: Switch to use uart_read_port_properties()
  serial: 8250_omap: Switch to use uart_read_port_properties()
  serial: 8250_pxa: Switch to use uart_read_port_properties()
  serial: 8250_tegra: Switch to use uart_read_port_properties()
  serial: 8250_uniphier: Switch to use uart_read_port_properties()

 drivers/tty/serial/8250/8250_aspeed_vuart.c |  50 +++-----
 drivers/tty/serial/8250/8250_bcm2835aux.c   |  92 ++++++--------
 drivers/tty/serial/8250/8250_bcm7271.c      |  56 +++-----
 drivers/tty/serial/8250/8250_dw.c           |  67 ++++------
 drivers/tty/serial/8250/8250_ingenic.c      |  20 +--
 drivers/tty/serial/8250/8250_lpc18xx.c      |  20 ++-
 drivers/tty/serial/8250/8250_of.c           | 105 ++++-----------
 drivers/tty/serial/8250/8250_omap.c         |  29 ++---
 drivers/tty/serial/8250/8250_pxa.c          |  22 ++--
 drivers/tty/serial/8250/8250_tegra.c        |  26 ++--
 drivers/tty/serial/8250/8250_uniphier.c     |  17 +--
 drivers/tty/serial/serial_port.c            | 134 ++++++++++++++++++++
 include/linux/serial_core.h                 |  10 +-
 13 files changed, 313 insertions(+), 335 deletions(-)

-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH v2 01/14] serial: core: Move struct uart_port::quirks closer to possible values
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 02/14] serial: core: Add UPIO_UNKNOWN constant for unknown port type Andy Shevchenko
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

Currently it's not crystal clear what UPIO_* and UPQ_* definitions
belong to. Reindent the code, so it will be easy to read and understand.
No functional changes intended.

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 include/linux/serial_core.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 55b1f3ba48ac..2d2ec99eca93 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -467,8 +467,8 @@ struct uart_port {
 	unsigned int		fifosize;		/* tx fifo size */
 	unsigned char		x_char;			/* xon/xoff char */
 	unsigned char		regshift;		/* reg offset shift */
+
 	unsigned char		iotype;			/* io access style */
-	unsigned char		quirks;			/* internal quirks */
 
 #define UPIO_PORT		(SERIAL_IO_PORT)	/* 8b I/O port access */
 #define UPIO_HUB6		(SERIAL_IO_HUB6)	/* Hub6 ISA card */
@@ -479,7 +479,9 @@ struct uart_port {
 #define UPIO_MEM32BE		(SERIAL_IO_MEM32BE)	/* 32b big endian */
 #define UPIO_MEM16		(SERIAL_IO_MEM16)	/* 16b little endian */
 
-	/* quirks must be updated while holding port mutex */
+	unsigned char		quirks;			/* internal quirks */
+
+	/* internal quirks must be updated while holding port mutex */
 #define UPQ_NO_TXEN_TEST	BIT(0)
 
 	unsigned int		read_status_mask;	/* driver specific */
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 02/14] serial: core: Add UPIO_UNKNOWN constant for unknown port type
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 01/14] serial: core: Move struct uart_port::quirks closer to possible values Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 03/14] serial: port: Introduce a common helper to read properties Andy Shevchenko
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

In some APIs we would like to assign the special value to iotype
and compare against it in another places. Introduce UPIO_UNKNOWN
for this purpose.

Note, we can't use 0, because it's a valid value for IO port access.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 include/linux/serial_core.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 2d2ec99eca93..c2cf9484014c 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -470,6 +470,7 @@ struct uart_port {
 
 	unsigned char		iotype;			/* io access style */
 
+#define UPIO_UNKNOWN		((unsigned char)~0U)	/* UCHAR_MAX */
 #define UPIO_PORT		(SERIAL_IO_PORT)	/* 8b I/O port access */
 #define UPIO_HUB6		(SERIAL_IO_HUB6)	/* Hub6 ISA card */
 #define UPIO_MEM		(SERIAL_IO_MEM)		/* driver-specific */
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 03/14] serial: port: Introduce a common helper to read properties
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 01/14] serial: core: Move struct uart_port::quirks closer to possible values Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 02/14] serial: core: Add UPIO_UNKNOWN constant for unknown port type Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-03-02 20:58   ` Greg Kroah-Hartman
  2024-02-26 14:19 ` [PATCH v2 04/14] serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties() Andy Shevchenko
                   ` (10 subsequent siblings)
  13 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Several serial drivers want to read the same or similar set of
the port properties. Make a common helper for them.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/serial_port.c | 134 +++++++++++++++++++++++++++++++
 include/linux/serial_core.h      |   1 +
 2 files changed, 135 insertions(+)

diff --git a/drivers/tty/serial/serial_port.c b/drivers/tty/serial/serial_port.c
index 88975a4df306..ecc980e9dba6 100644
--- a/drivers/tty/serial/serial_port.c
+++ b/drivers/tty/serial/serial_port.c
@@ -8,7 +8,10 @@
 
 #include <linux/device.h>
 #include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <linux/serial_core.h>
 #include <linux/spinlock.h>
 
@@ -82,6 +85,137 @@ void uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)
 }
 EXPORT_SYMBOL(uart_remove_one_port);
 
+/**
+ * uart_read_port_properties - read firmware properties of the given UART port
+ * @port: corresponding port
+ * @use_defaults: apply defaults (when %true) or validate the values (when %false)
+ *
+ * The following device properties are supported:
+ *   - clock-frequency (optional)
+ *   - fifo-size (optional)
+ *   - no-loopback-test (optional)
+ *   - reg-shift (defaults may apply)
+ *   - reg-offset (value may be validated)
+ *   - reg-io-width (defaults may apply or value may be validated)
+ *   - interrupts (OF only)
+ *   - serial [alias ID] (OF only)
+ *
+ * If the port->dev is of struct platform_device type the interrupt line
+ * will be retrieved via platform_get_irq() call against that device.
+ * Otherwise it will be assigned by fwnode_irq_get() call. In both cases
+ * the index 0 of the resource is used.
+ *
+ * The caller is responsible to initialize the following fields of the @port
+ *   ->dev (must be valid)
+ *   ->flags
+ *   ->mapbase
+ *   ->mapsize
+ *   ->regshift (if @use_defaults is false)
+ * before calling this function. Alternatively the above mentioned fields
+ * may be zeroed, in such case the only ones, that have associated properties
+ * found, will be set to the respective values.
+ *
+ * If no error happened, the ->irq, ->mapbase, ->mapsize will be altered.
+ * The ->iotype is always altered.
+ *
+ * When @use_defaults is true and the respective property is not found
+ * the following values will be applied:
+ *   ->regshift = 0
+ * In this case IRQ must be provided, otherwise an error will be returned.
+ *
+ * When @use_defaults is false and the respective property is found
+ * the following values will be validated:
+ *   - reg-io-width (->iotype)
+ *   - reg-offset (->mapsize against ->mapbase)
+ *
+ * Returns: 0 on success or negative errno on failure
+ */
+int uart_read_port_properties(struct uart_port *port, bool use_defaults)
+{
+	struct device *dev = port->dev;
+	u32 value;
+	int ret;
+
+	/* Read optional UART functional clock frequency */
+	device_property_read_u32(dev, "clock-frequency", &port->uartclk);
+
+	/* Read the registers alignment (default: 8-bit) */
+	ret = device_property_read_u32(dev, "reg-shift", &value);
+	if (ret)
+		port->regshift = use_defaults ? 0 : port->regshift;
+	else
+		port->regshift = value;
+
+	/* Read the registers I/O access type (default: MMIO 8-bit) */
+	ret = device_property_read_u32(dev, "reg-io-width", &value);
+	if (ret) {
+		port->iotype = UPIO_MEM;
+	} else {
+		switch (value) {
+		case 1:
+			port->iotype = UPIO_MEM;
+			break;
+		case 2:
+			port->iotype = UPIO_MEM16;
+			break;
+		case 4:
+			port->iotype = device_is_big_endian(dev) ? UPIO_MEM32BE : UPIO_MEM32;
+			break;
+		default:
+			if (!use_defaults) {
+				dev_err(dev, "Unsupported reg-io-width (%u)\n", value);
+				return -EINVAL;
+			}
+			port->iotype = UPIO_UNKNOWN;
+			break;
+		}
+	}
+
+	/* Read the address mapping base offset (default: no offset) */
+	ret = device_property_read_u32(dev, "reg-offset", &value);
+	if (ret)
+		value = 0;
+
+	/* Check for shifted address mapping overflow */
+	if (!use_defaults && port->mapsize < value) {
+		dev_err(dev, "reg-offset %u exceeds region size %pa\n", value, &port->mapsize);
+		return -EINVAL;
+	}
+
+	port->mapbase += value;
+	port->mapsize -= value;
+
+	/* Read optional FIFO size */
+	device_property_read_u32(dev, "fifo-size", &port->fifosize);
+
+	if (device_property_read_bool(dev, "no-loopback-test"))
+		port->flags |= UPF_SKIP_TEST;
+
+	/* Get index of serial line, if found in DT aliases */
+	ret = of_alias_get_id(dev_of_node(dev), "serial");
+	if (ret >= 0)
+		port->line = ret;
+
+	if (dev_is_platform(dev))
+		ret = platform_get_irq(to_platform_device(dev), 0);
+	else
+		ret = fwnode_irq_get(dev_fwnode(dev), 0);
+	if (ret == -EPROBE_DEFER)
+		return ret;
+	if (ret > 0)
+		port->irq = ret;
+	else if (use_defaults)
+		/* By default IRQ support is mandatory */
+		return ret;
+	else
+		port->irq = 0;
+
+	port->flags |= UPF_SHARE_IRQ;
+
+	return 0;
+}
+EXPORT_SYMBOL(uart_read_port_properties);
+
 static struct device_driver serial_port_driver = {
 	.name = "port",
 	.suppress_bind_attrs = true,
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index c2cf9484014c..3fc8683e7b53 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -962,6 +962,7 @@ int uart_register_driver(struct uart_driver *uart);
 void uart_unregister_driver(struct uart_driver *uart);
 int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
 void uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
+int uart_read_port_properties(struct uart_port *port, bool use_defaults);
 bool uart_match_port(const struct uart_port *port1,
 		const struct uart_port *port2);
 
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 04/14] serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (2 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 03/14] serial: port: Introduce a common helper to read properties Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 05/14] serial: 8250_bcm2835aux: " Andy Shevchenko
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 drivers/tty/serial/8250/8250_aspeed_vuart.c | 50 +++++++--------------
 1 file changed, 15 insertions(+), 35 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
index 8c2aaf7af7b7..2a4bc39b11af 100644
--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
+++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
@@ -419,8 +419,8 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 	struct aspeed_vuart *vuart;
 	struct device_node *np;
 	struct resource *res;
-	u32 clk, prop, sirq[2];
 	int rc, sirq_polarity;
+	u32 prop, sirq[2];
 	struct clk *vclk;
 
 	np = pdev->dev.of_node;
@@ -447,53 +447,35 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 	port.port.status = UPSTAT_SYNC_FIFO;
 	port.port.dev = &pdev->dev;
 	port.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
+	port.port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_FIXED_PORT | UPF_FIXED_TYPE |
+			  UPF_NO_THRE_TEST;
 	port.bugs |= UART_BUG_TXRACE;
 
 	rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group);
 	if (rc < 0)
 		return rc;
 
-	if (of_property_read_u32(np, "clock-frequency", &clk)) {
+	rc = uart_read_port_properties(&port.port, true);
+	if (rc)
+		goto err_sysfs_remove;
+
+	/* Get clk rate through clk driver if present */
+	if (!port.port.uartclk) {
 		vclk = devm_clk_get_enabled(dev, NULL);
 		if (IS_ERR(vclk)) {
 			rc = dev_err_probe(dev, PTR_ERR(vclk), "clk or clock-frequency not defined\n");
 			goto err_sysfs_remove;
 		}
 
-		clk = clk_get_rate(vclk);
+		port.port.uartclk = clk_get_rate(vclk);
 	}
 
 	/* If current-speed was set, then try not to change it. */
 	if (of_property_read_u32(np, "current-speed", &prop) == 0)
-		port.port.custom_divisor = clk / (16 * prop);
+		port.port.custom_divisor = port.port.uartclk / (16 * prop);
 
-	/* Check for shifted address mapping */
-	if (of_property_read_u32(np, "reg-offset", &prop) == 0)
-		port.port.mapbase += prop;
-
-	/* Check for registers offset within the devices address range */
-	if (of_property_read_u32(np, "reg-shift", &prop) == 0)
-		port.port.regshift = prop;
-
-	/* Check for fifo size */
-	if (of_property_read_u32(np, "fifo-size", &prop) == 0)
-		port.port.fifosize = prop;
-
-	/* Check for a fixed line number */
-	rc = of_alias_get_id(np, "serial");
-	if (rc >= 0)
-		port.port.line = rc;
-
-	port.port.irq = irq_of_parse_and_map(np, 0);
 	port.port.handle_irq = aspeed_vuart_handle_irq;
-	port.port.iotype = UPIO_MEM;
 	port.port.type = PORT_ASPEED_VUART;
-	port.port.uartclk = clk;
-	port.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
-		| UPF_FIXED_PORT | UPF_FIXED_TYPE | UPF_NO_THRE_TEST;
-
-	if (of_property_read_bool(np, "no-loopback-test"))
-		port.port.flags |= UPF_SKIP_TEST;
 
 	if (port.port.fifosize)
 		port.capabilities = UART_CAP_FIFO;
@@ -503,7 +485,7 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 
 	rc = serial8250_register_8250_port(&port);
 	if (rc < 0)
-		goto err_clk_disable;
+		goto err_sysfs_remove;
 
 	vuart->line = rc;
 	vuart->port = serial8250_get_port(vuart->line);
@@ -529,7 +511,7 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 	rc = aspeed_vuart_set_lpc_address(vuart, prop);
 	if (rc < 0) {
 		dev_err_probe(dev, rc, "invalid value in aspeed,lpc-io-reg property\n");
-		goto err_clk_disable;
+		goto err_sysfs_remove;
 	}
 
 	rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", sirq, 2);
@@ -541,14 +523,14 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 	rc = aspeed_vuart_set_sirq(vuart, sirq[0]);
 	if (rc < 0) {
 		dev_err_probe(dev, rc, "invalid sirq number in aspeed,lpc-interrupts property\n");
-		goto err_clk_disable;
+		goto err_sysfs_remove;
 	}
 
 	sirq_polarity = aspeed_vuart_map_irq_polarity(sirq[1]);
 	if (sirq_polarity < 0) {
 		rc = dev_err_probe(dev, sirq_polarity,
 				   "invalid sirq polarity in aspeed,lpc-interrupts property\n");
-		goto err_clk_disable;
+		goto err_sysfs_remove;
 	}
 
 	aspeed_vuart_set_sirq_polarity(vuart, sirq_polarity);
@@ -559,8 +541,6 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 
 	return 0;
 
-err_clk_disable:
-	irq_dispose_mapping(port.port.irq);
 err_sysfs_remove:
 	sysfs_remove_group(&vuart->dev->kobj, &aspeed_vuart_attr_group);
 	return rc;
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 05/14] serial: 8250_bcm2835aux: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (3 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 04/14] serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties() Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 18:23   ` Florian Fainelli
  2024-02-26 14:19 ` [PATCH v2 06/14] serial: 8250_bcm7271: " Andy Shevchenko
                   ` (8 subsequent siblings)
  13 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_bcm2835aux.c | 92 +++++++++++------------
 1 file changed, 42 insertions(+), 50 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c
index beac6b340ace..69c3c5ca77f7 100644
--- a/drivers/tty/serial/8250/8250_bcm2835aux.c
+++ b/drivers/tty/serial/8250/8250_bcm2835aux.c
@@ -45,10 +45,6 @@ struct bcm2835aux_data {
 	u32 cntl;
 };
 
-struct bcm2835_aux_serial_driver_data {
-	resource_size_t offset;
-};
-
 static void bcm2835aux_rs485_start_tx(struct uart_8250_port *up)
 {
 	if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
@@ -85,10 +81,9 @@ static void bcm2835aux_rs485_stop_tx(struct uart_8250_port *up)
 
 static int bcm2835aux_serial_probe(struct platform_device *pdev)
 {
-	const struct bcm2835_aux_serial_driver_data *bcm_data;
+	const struct software_node *bcm2835_swnode;
 	struct uart_8250_port up = { };
 	struct bcm2835aux_data *data;
-	resource_size_t offset = 0;
 	struct resource *res;
 	unsigned int uartclk;
 	int ret;
@@ -101,12 +96,8 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
 	/* initialize data */
 	up.capabilities = UART_CAP_FIFO | UART_CAP_MINI;
 	up.port.dev = &pdev->dev;
-	up.port.regshift = 2;
 	up.port.type = PORT_16550;
-	up.port.iotype = UPIO_MEM;
-	up.port.fifosize = 8;
-	up.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE |
-			UPF_SKIP_TEST | UPF_IOREMAP;
+	up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE | UPF_SKIP_TEST | UPF_IOREMAP;
 	up.port.rs485_config = serial8250_em485_config;
 	up.port.rs485_supported = serial8250_em485_supported;
 	up.rs485_start_tx = bcm2835aux_rs485_start_tx;
@@ -122,12 +113,6 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
 	if (IS_ERR(data->clk))
 		return dev_err_probe(&pdev->dev, PTR_ERR(data->clk), "could not get clk\n");
 
-	/* get the interrupt */
-	ret = platform_get_irq(pdev, 0);
-	if (ret < 0)
-		return ret;
-	up.port.irq = ret;
-
 	/* map the main registers */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
@@ -135,52 +120,40 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	bcm_data = device_get_match_data(&pdev->dev);
+	up.port.mapbase = res->start;
+	up.port.mapsize = resource_size(res);
 
-	/* Some UEFI implementations (e.g. tianocore/edk2 for the Raspberry Pi)
-	 * describe the miniuart with a base address that encompasses the auxiliary
-	 * registers shared between the miniuart and spi.
-	 *
-	 * This is due to historical reasons, see discussion here :
-	 * https://edk2.groups.io/g/devel/topic/87501357#84349
-	 *
-	 * We need to add the offset between the miniuart and auxiliary
-	 * registers to get the real miniuart base address.
-	 */
-	if (bcm_data)
-		offset = bcm_data->offset;
+	bcm2835_swnode = device_get_match_data(&pdev->dev);
+	if (bcm2835_swnode) {
+		ret = device_add_software_node(&pdev->dev, bcm2835_swnode);
+		if (ret)
+			return ret;
+	}
 
-	up.port.mapbase = res->start + offset;
-	up.port.mapsize = resource_size(res) - offset;
+	ret = uart_read_port_properties(&up.port, true);
+	if (ret)
+		goto rm_swnode;
 
-	/* Check for a fixed line number */
-	ret = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (ret >= 0)
-		up.port.line = ret;
+	up.port.regshift = 2;
+	up.port.fifosize = 8;
 
 	/* enable the clock as a last step */
 	ret = clk_prepare_enable(data->clk);
 	if (ret) {
-		dev_err(&pdev->dev, "unable to enable uart clock - %d\n",
-			ret);
-		return ret;
+		dev_err_probe(&pdev->dev, ret, "unable to enable uart clock\n");
+		goto rm_swnode;
 	}
 
 	uartclk = clk_get_rate(data->clk);
-	if (!uartclk) {
-		ret = device_property_read_u32(&pdev->dev, "clock-frequency", &uartclk);
-		if (ret) {
-			dev_err_probe(&pdev->dev, ret, "could not get clk rate\n");
-			goto dis_clk;
-		}
-	}
+	if (uartclk)
+		up.port.uartclk = uartclk;
 
 	/* the HW-clock divider for bcm2835aux is 8,
 	 * but 8250 expects a divider of 16,
 	 * so we have to multiply the actual clock by 2
 	 * to get identical baudrates.
 	 */
-	up.port.uartclk = uartclk * 2;
+	up.port.uartclk *= 2;
 
 	/* register the port */
 	ret = serial8250_register_8250_port(&up);
@@ -194,6 +167,8 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
 
 dis_clk:
 	clk_disable_unprepare(data->clk);
+rm_swnode:
+	device_remove_software_node(&pdev->dev);
 	return ret;
 }
 
@@ -203,10 +178,27 @@ static void bcm2835aux_serial_remove(struct platform_device *pdev)
 
 	serial8250_unregister_port(data->line);
 	clk_disable_unprepare(data->clk);
+	device_remove_software_node(&pdev->dev);
 }
 
-static const struct bcm2835_aux_serial_driver_data bcm2835_acpi_data = {
-	.offset = 0x40,
+/*
+ * Some UEFI implementations (e.g. tianocore/edk2 for the Raspberry Pi)
+ * describe the miniuart with a base address that encompasses the auxiliary
+ * registers shared between the miniuart and spi.
+ *
+ * This is due to historical reasons, see discussion here:
+ * https://edk2.groups.io/g/devel/topic/87501357#84349
+ *
+ * We need to add the offset between the miniuart and auxiliary registers
+ * to get the real miniuart base address.
+ */
+static const struct property_entry bcm2835_acpi_properties[] = {
+	PROPERTY_ENTRY_U32("reg-offset", 0x40),
+	{ }
+};
+
+static const struct software_node bcm2835_acpi_node = {
+	.properties = bcm2835_acpi_properties,
 };
 
 static const struct of_device_id bcm2835aux_serial_match[] = {
@@ -216,7 +208,7 @@ static const struct of_device_id bcm2835aux_serial_match[] = {
 MODULE_DEVICE_TABLE(of, bcm2835aux_serial_match);
 
 static const struct acpi_device_id bcm2835aux_serial_acpi_match[] = {
-	{ "BCM2836", (kernel_ulong_t)&bcm2835_acpi_data },
+	{ "BCM2836", (kernel_ulong_t)&bcm2835_acpi_node },
 	{ }
 };
 MODULE_DEVICE_TABLE(acpi, bcm2835aux_serial_acpi_match);
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 06/14] serial: 8250_bcm7271: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (4 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 05/14] serial: 8250_bcm2835aux: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 18:23   ` Florian Fainelli
  2024-02-26 14:19 ` [PATCH v2 07/14] serial: 8250_dw: " Andy Shevchenko
                   ` (7 subsequent siblings)
  13 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_bcm7271.c | 56 +++++++++-----------------
 1 file changed, 19 insertions(+), 37 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
index 1532fa2e8ec4..83ecf18fcf3e 100644
--- a/drivers/tty/serial/8250/8250_bcm7271.c
+++ b/drivers/tty/serial/8250/8250_bcm7271.c
@@ -935,17 +935,14 @@ static void brcmuart_init_debugfs(struct brcmuart_priv *priv,
 static int brcmuart_probe(struct platform_device *pdev)
 {
 	struct resource *regs;
-	struct device_node *np = pdev->dev.of_node;
 	const struct of_device_id *of_id = NULL;
 	struct uart_8250_port *new_port;
 	struct device *dev = &pdev->dev;
 	struct brcmuart_priv *priv;
 	struct clk *baud_mux_clk;
 	struct uart_8250_port up;
-	int irq;
 	void __iomem *membase = NULL;
 	resource_size_t mapbase = 0;
-	u32 clk_rate = 0;
 	int ret;
 	int x;
 	int dma_irq;
@@ -953,15 +950,12 @@ static int brcmuart_probe(struct platform_device *pdev)
 		"uart", "dma_rx", "dma_tx", "dma_intr2", "dma_arb"
 	};
 
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
 	priv = devm_kzalloc(dev, sizeof(struct brcmuart_priv),
 			GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
 
-	of_id = of_match_node(brcmuart_dt_ids, np);
+	of_id = of_match_node(brcmuart_dt_ids, dev->of_node);
 	if (!of_id || !of_id->data)
 		priv->rate_table = brcmstb_rate_table;
 	else
@@ -1011,7 +1005,23 @@ static int brcmuart_probe(struct platform_device *pdev)
 		}
 	}
 
-	of_property_read_u32(np, "clock-frequency", &clk_rate);
+	dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
+
+	memset(&up, 0, sizeof(up));
+	up.port.type = PORT_BCM7271;
+	up.port.dev = dev;
+	up.port.mapbase = mapbase;
+	up.port.membase = membase;
+	up.port.handle_irq = brcmuart_handle_irq;
+	up.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_FIXED_TYPE;
+	up.port.private_data = priv;
+
+	ret = uart_read_port_properties(&up.port, true);
+	if (ret)
+		goto release_dma;
+
+	up.port.regshift = 2;
+	up.port.iotype = device_is_big_endian(dev) ? UPIO_MEM32BE : UPIO_MEM32;
 
 	/* See if a Baud clock has been specified */
 	baud_mux_clk = devm_clk_get_optional_enabled(dev, "sw_baud");
@@ -1023,39 +1033,11 @@ static int brcmuart_probe(struct platform_device *pdev)
 
 		priv->baud_mux_clk = baud_mux_clk;
 		init_real_clk_rates(dev, priv);
-		clk_rate = priv->default_mux_rate;
+		up.port.uartclk = priv->default_mux_rate;
 	} else {
 		dev_dbg(dev, "BAUD MUX clock not specified\n");
 	}
 
-	if (clk_rate == 0) {
-		ret = dev_err_probe(dev, -EINVAL, "clock-frequency or clk not defined\n");
-		goto release_dma;
-	}
-
-	dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
-
-	memset(&up, 0, sizeof(up));
-	up.port.type = PORT_BCM7271;
-	up.port.uartclk = clk_rate;
-	up.port.dev = dev;
-	up.port.mapbase = mapbase;
-	up.port.membase = membase;
-	up.port.irq = irq;
-	up.port.handle_irq = brcmuart_handle_irq;
-	up.port.regshift = 2;
-	up.port.iotype = of_device_is_big_endian(np) ?
-		UPIO_MEM32BE : UPIO_MEM32;
-	up.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF
-		| UPF_FIXED_PORT | UPF_FIXED_TYPE;
-	up.port.dev = dev;
-	up.port.private_data = priv;
-
-	/* Check for a fixed line number */
-	ret = of_alias_get_id(np, "serial");
-	if (ret >= 0)
-		up.port.line = ret;
-
 	/* setup HR timer */
 	hrtimer_init(&priv->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
 	priv->hrt.function = brcmuart_hrtimer_func;
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 07/14] serial: 8250_dw: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (5 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 06/14] serial: 8250_bcm7271: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 08/14] serial: 8250_ingenic: " Andy Shevchenko
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_dw.c | 67 +++++++++++++------------------
 1 file changed, 27 insertions(+), 40 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index 2d1f350a4bea..a1825e83231f 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -17,7 +17,6 @@
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
 #include <linux/notifier.h>
-#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/property.h>
@@ -449,12 +448,7 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data)
 
 	if (np) {
 		unsigned int quirks = data->pdata->quirks;
-		int id;
 
-		/* get index of serial line, if found in DT aliases */
-		id = of_alias_get_id(np, "serial");
-		if (id >= 0)
-			p->line = id;
 #ifdef CONFIG_64BIT
 		if (quirks & DW_UART_QUIRK_OCTEON) {
 			p->serial_in = dw8250_serial_inq;
@@ -465,12 +459,6 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data)
 		}
 #endif
 
-		if (of_device_is_big_endian(np)) {
-			p->iotype = UPIO_MEM32BE;
-			p->serial_in = dw8250_serial_in32be;
-			p->serial_out = dw8250_serial_out32be;
-		}
-
 		if (quirks & DW_UART_QUIRK_ARMADA_38X)
 			p->serial_out = dw8250_serial_out38x;
 		if (quirks & DW_UART_QUIRK_SKIP_SET_RATE)
@@ -510,39 +498,21 @@ static int dw8250_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct dw8250_data *data;
 	struct resource *regs;
-	int irq;
 	int err;
-	u32 val;
 
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!regs)
 		return dev_err_probe(dev, -EINVAL, "no registers defined\n");
 
-	irq = platform_get_irq_optional(pdev, 0);
-	/* no interrupt -> fall back to polling */
-	if (irq == -ENXIO)
-		irq = 0;
-	if (irq < 0)
-		return irq;
-
 	spin_lock_init(&p->lock);
-	p->mapbase	= regs->start;
-	p->irq		= irq;
 	p->handle_irq	= dw8250_handle_irq;
 	p->pm		= dw8250_do_pm;
 	p->type		= PORT_8250;
-	p->flags	= UPF_SHARE_IRQ | UPF_FIXED_PORT;
+	p->flags	= UPF_FIXED_PORT;
 	p->dev		= dev;
-	p->iotype	= UPIO_MEM;
-	p->serial_in	= dw8250_serial_in;
-	p->serial_out	= dw8250_serial_out;
 	p->set_ldisc	= dw8250_set_ldisc;
 	p->set_termios	= dw8250_set_termios;
 
-	p->membase = devm_ioremap(dev, regs->start, resource_size(regs));
-	if (!p->membase)
-		return -ENOMEM;
-
 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
@@ -554,15 +524,35 @@ static int dw8250_probe(struct platform_device *pdev)
 	data->uart_16550_compatible = device_property_read_bool(dev,
 						"snps,uart-16550-compatible");
 
-	err = device_property_read_u32(dev, "reg-shift", &val);
-	if (!err)
-		p->regshift = val;
+	p->mapbase = regs->start;
+	p->mapsize = resource_size(regs);
 
-	err = device_property_read_u32(dev, "reg-io-width", &val);
-	if (!err && val == 4) {
-		p->iotype = UPIO_MEM32;
+	p->membase = devm_ioremap(dev, p->mapbase, p->mapsize);
+	if (!p->membase)
+		return -ENOMEM;
+
+	err = uart_read_port_properties(p, true);
+	/* no interrupt -> fall back to polling */
+	if (err == -ENXIO)
+		err = 0;
+	if (err)
+		return err;
+
+	switch (p->iotype) {
+	case UPIO_MEM:
+		p->serial_in = dw8250_serial_in;
+		p->serial_out = dw8250_serial_out;
+		break;
+	case UPIO_MEM32:
 		p->serial_in = dw8250_serial_in32;
 		p->serial_out = dw8250_serial_out32;
+		break;
+	case UPIO_MEM32BE:
+		p->serial_in = dw8250_serial_in32be;
+		p->serial_out = dw8250_serial_out32be;
+		break;
+	default:
+		return -ENODEV;
 	}
 
 	if (device_property_read_bool(dev, "dcd-override")) {
@@ -589,9 +579,6 @@ static int dw8250_probe(struct platform_device *pdev)
 		data->msr_mask_off |= UART_MSR_TERI;
 	}
 
-	/* Always ask for fixed clock rate from a property. */
-	device_property_read_u32(dev, "clock-frequency", &p->uartclk);
-
 	/* If there is separate baudclk, get the rate from it. */
 	data->clk = devm_clk_get_optional_enabled(dev, "baudclk");
 	if (data->clk == NULL)
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 08/14] serial: 8250_ingenic: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (6 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 07/14] serial: 8250_dw: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 09/14] serial: 8250_lpc18xx: " Andy Shevchenko
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_ingenic.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_ingenic.c b/drivers/tty/serial/8250/8250_ingenic.c
index a12f737924c0..7603129f1c07 100644
--- a/drivers/tty/serial/8250/8250_ingenic.c
+++ b/drivers/tty/serial/8250/8250_ingenic.c
@@ -234,7 +234,7 @@ static int ingenic_uart_probe(struct platform_device *pdev)
 	struct ingenic_uart_data *data;
 	const struct ingenic_uart_config *cdata;
 	struct resource *regs;
-	int irq, err, line;
+	int err;
 
 	cdata = of_device_get_match_data(&pdev->dev);
 	if (!cdata) {
@@ -242,10 +242,6 @@ static int ingenic_uart_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
-
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!regs) {
 		dev_err(&pdev->dev, "no registers defined\n");
@@ -259,21 +255,19 @@ static int ingenic_uart_probe(struct platform_device *pdev)
 	spin_lock_init(&uart.port.lock);
 	uart.port.type = PORT_16550A;
 	uart.port.flags = UPF_SKIP_TEST | UPF_IOREMAP | UPF_FIXED_TYPE;
-	uart.port.iotype = UPIO_MEM;
 	uart.port.mapbase = regs->start;
-	uart.port.regshift = 2;
 	uart.port.serial_out = ingenic_uart_serial_out;
 	uart.port.serial_in = ingenic_uart_serial_in;
-	uart.port.irq = irq;
 	uart.port.dev = &pdev->dev;
-	uart.port.fifosize = cdata->fifosize;
 	uart.tx_loadsz = cdata->tx_loadsz;
 	uart.capabilities = UART_CAP_FIFO | UART_CAP_RTOIE;
 
-	/* Check for a fixed line number */
-	line = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (line >= 0)
-		uart.port.line = line;
+	err = uart_read_port_properties(&uart.port, true);
+	if (err)
+		return err;
+
+	uart.port.regshift = 2;
+	uart.port.fifosize = cdata->fifosize;
 
 	uart.port.membase = devm_ioremap(&pdev->dev, regs->start,
 					 resource_size(regs));
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 09/14] serial: 8250_lpc18xx: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (7 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 08/14] serial: 8250_ingenic: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 10/14] serial: 8250_of: " Andy Shevchenko
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_lpc18xx.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_lpc18xx.c b/drivers/tty/serial/8250/8250_lpc18xx.c
index 8d728a6a5991..e4a6b7b4caf2 100644
--- a/drivers/tty/serial/8250/8250_lpc18xx.c
+++ b/drivers/tty/serial/8250/8250_lpc18xx.c
@@ -92,11 +92,7 @@ static int lpc18xx_serial_probe(struct platform_device *pdev)
 	struct lpc18xx_uart_data *data;
 	struct uart_8250_port uart;
 	struct resource *res;
-	int irq, ret;
-
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
+	int ret;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
@@ -139,19 +135,12 @@ static int lpc18xx_serial_probe(struct platform_device *pdev)
 		goto dis_clk_reg;
 	}
 
-	ret = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (ret >= 0)
-		uart.port.line = ret;
-
 	data->dma.rx_param = data;
 	data->dma.tx_param = data;
 
 	spin_lock_init(&uart.port.lock);
 	uart.port.dev = &pdev->dev;
-	uart.port.irq = irq;
-	uart.port.iotype = UPIO_MEM32;
 	uart.port.mapbase = res->start;
-	uart.port.regshift = 2;
 	uart.port.type = PORT_16550A;
 	uart.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE | UPF_SKIP_TEST;
 	uart.port.uartclk = clk_get_rate(data->clk_uart);
@@ -160,6 +149,13 @@ static int lpc18xx_serial_probe(struct platform_device *pdev)
 	uart.port.rs485_supported = lpc18xx_rs485_supported;
 	uart.port.serial_out = lpc18xx_uart_serial_out;
 
+	ret = uart_read_port_properties(&uart.port, true);
+	if (ret)
+		return ret;
+
+	uart.port.iotype = UPIO_MEM32;
+	uart.port.regshift = 2;
+
 	uart.dma = &data->dma;
 	uart.dma->rxconf.src_maxburst = 1;
 	uart.dma->txconf.dst_maxburst = 1;
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 10/14] serial: 8250_of: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (8 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 09/14] serial: 8250_lpc18xx: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 18:24   ` Florian Fainelli
  2024-02-26 14:19 ` [PATCH v2 11/14] serial: 8250_omap: " Andy Shevchenko
                   ` (3 subsequent siblings)
  13 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_of.c | 105 +++++++-----------------------
 1 file changed, 22 insertions(+), 83 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c
index 9dcc17e33269..1a699ce2e812 100644
--- a/drivers/tty/serial/8250/8250_of.c
+++ b/drivers/tty/serial/8250/8250_of.c
@@ -69,37 +69,22 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
 	struct device *dev = &ofdev->dev;
 	struct device_node *np = dev->of_node;
 	struct uart_port *port = &up->port;
-	u32 clk, spd, prop;
-	int ret, irq;
+	u32 spd;
+	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 */
-		info->clk = devm_clk_get_enabled(dev, NULL);
-		if (IS_ERR(info->clk)) {
-			ret = dev_err_probe(dev, PTR_ERR(info->clk), "failed to get clock\n");
-			goto err_pmruntime;
-		}
-
-		clk = clk_get_rate(info->clk);
-	}
-	/* If current-speed was set, then try not to change it. */
-	if (of_property_read_u32(np, "current-speed", &spd) == 0)
-		port->custom_divisor = clk / (16 * spd);
-
 	ret = of_address_to_resource(np, 0, &resource);
 	if (ret) {
 		dev_err_probe(dev, ret, "invalid address\n");
 		goto err_pmruntime;
 	}
 
-	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_FIXED_PORT |
-				  UPF_FIXED_TYPE;
+	port->dev = &ofdev->dev;
+	port->flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_FIXED_TYPE;
 	spin_lock_init(&port->lock);
 
 	if (resource_type(&resource) == IORESOURCE_IO) {
@@ -108,70 +93,31 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
 	} else {
 		port->mapbase = resource.start;
 		port->mapsize = resource_size(&resource);
-
-		/* Check for shifted address mapping */
-		if (of_property_read_u32(np, "reg-offset", &prop) == 0) {
-			if (prop >= port->mapsize) {
-				ret = dev_err_probe(dev, -EINVAL, "reg-offset %u exceeds region size %pa\n",
-						    prop, &port->mapsize);
-				goto err_pmruntime;
-			}
-
-			port->mapbase += prop;
-			port->mapsize -= prop;
-		}
-
-		port->iotype = UPIO_MEM;
-		if (of_property_read_u32(np, "reg-io-width", &prop) == 0) {
-			switch (prop) {
-			case 1:
-				port->iotype = UPIO_MEM;
-				break;
-			case 2:
-				port->iotype = UPIO_MEM16;
-				break;
-			case 4:
-				port->iotype = of_device_is_big_endian(np) ?
-					       UPIO_MEM32BE : UPIO_MEM32;
-				break;
-			default:
-				ret = dev_err_probe(dev, -EINVAL, "unsupported reg-io-width (%u)\n",
-						    prop);
-				goto err_pmruntime;
-			}
-		}
 		port->flags |= UPF_IOREMAP;
 	}
 
+	ret = uart_read_port_properties(port, false);
+	if (ret)
+		goto err_pmruntime;
+
+	/* Get clk rate through clk driver if present */
+	if (!port->uartclk) {
+		info->clk = devm_clk_get_enabled(dev, NULL);
+		if (IS_ERR(info->clk)) {
+			ret = dev_err_probe(dev, PTR_ERR(info->clk), "failed to get clock\n");
+			goto err_pmruntime;
+		}
+
+		port->uartclk = clk_get_rate(info->clk);
+	}
+	/* If current-speed was set, then try not to change it. */
+	if (of_property_read_u32(np, "current-speed", &spd) == 0)
+		port->custom_divisor = port->uartclk / (16 * spd);
+
 	/* Compatibility with the deprecated pxa driver and 8250_pxa drivers. */
 	if (of_device_is_compatible(np, "mrvl,mmp-uart"))
 		port->regshift = 2;
 
-	/* Check for registers offset within the devices address range */
-	if (of_property_read_u32(np, "reg-shift", &prop) == 0)
-		port->regshift = prop;
-
-	/* Check for fifo size */
-	if (of_property_read_u32(np, "fifo-size", &prop) == 0)
-		port->fifosize = prop;
-
-	/* Check for a fixed line number */
-	ret = of_alias_get_id(np, "serial");
-	if (ret >= 0)
-		port->line = ret;
-
-	irq = of_irq_get(np, 0);
-	if (irq < 0) {
-		if (irq == -EPROBE_DEFER) {
-			ret = -EPROBE_DEFER;
-			goto err_pmruntime;
-		}
-		/* IRQ support not mandatory */
-		irq = 0;
-	}
-
-	port->irq = irq;
-
 	info->rst = devm_reset_control_get_optional_shared(&ofdev->dev, NULL);
 	if (IS_ERR(info->rst)) {
 		ret = PTR_ERR(info->rst);
@@ -183,12 +129,6 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
 		goto err_pmruntime;
 
 	port->type = type;
-	port->uartclk = clk;
-
-	if (of_property_read_bool(np, "no-loopback-test"))
-		port->flags |= UPF_SKIP_TEST;
-
-	port->dev = &ofdev->dev;
 	port->rs485_config = serial8250_em485_config;
 	port->rs485_supported = serial8250_em485_supported;
 	up->rs485_start_tx = serial8250_em485_start_tx;
@@ -280,7 +220,6 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
 	platform_set_drvdata(ofdev, info);
 	return 0;
 err_dispose:
-	irq_dispose_mapping(port8250.port.irq);
 	pm_runtime_put_sync(&ofdev->dev);
 	pm_runtime_disable(&ofdev->dev);
 err_free:
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 11/14] serial: 8250_omap: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (9 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 10/14] serial: 8250_of: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 12/14] serial: 8250_pxa: " Andy Shevchenko
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_omap.c | 29 ++++++++++-------------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 6942990a333c..173af575a43e 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -1394,11 +1394,7 @@ static int omap8250_probe(struct platform_device *pdev)
 	struct uart_8250_port up;
 	struct resource *regs;
 	void __iomem *membase;
-	int irq, ret;
-
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
+	int ret;
 
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!regs) {
@@ -1419,7 +1415,6 @@ static int omap8250_probe(struct platform_device *pdev)
 	up.port.dev = &pdev->dev;
 	up.port.mapbase = regs->start;
 	up.port.membase = membase;
-	up.port.irq = irq;
 	/*
 	 * It claims to be 16C750 compatible however it is a little different.
 	 * It has EFR and has no FCR7_64byte bit. The AFE (which it claims to
@@ -1429,13 +1424,9 @@ static int omap8250_probe(struct platform_device *pdev)
 	 * or pm callback.
 	 */
 	up.port.type = PORT_8250;
-	up.port.iotype = UPIO_MEM;
-	up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE | UPF_SOFT_FLOW |
-		UPF_HARD_FLOW;
+	up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE | UPF_SOFT_FLOW | UPF_HARD_FLOW;
 	up.port.private_data = priv;
 
-	up.port.regshift = OMAP_UART_REGSHIFT;
-	up.port.fifosize = 64;
 	up.tx_loadsz = 64;
 	up.capabilities = UART_CAP_FIFO;
 #ifdef CONFIG_PM
@@ -1461,14 +1452,14 @@ static int omap8250_probe(struct platform_device *pdev)
 	up.rs485_stop_tx = serial8250_em485_stop_tx;
 	up.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
 
-	ret = of_alias_get_id(np, "serial");
-	if (ret < 0) {
-		dev_err(&pdev->dev, "failed to get alias\n");
+	ret = uart_read_port_properties(&up.port, true);
+	if (ret)
 		return ret;
-	}
-	up.port.line = ret;
 
-	if (of_property_read_u32(np, "clock-frequency", &up.port.uartclk)) {
+	up.port.regshift = OMAP_UART_REGSHIFT;
+	up.port.fifosize = 64;
+
+	if (!up.port.uartclk) {
 		struct clk *clk;
 
 		clk = devm_clk_get(&pdev->dev, NULL);
@@ -1560,8 +1551,8 @@ static int omap8250_probe(struct platform_device *pdev)
 	}
 #endif
 
-	irq_set_status_flags(irq, IRQ_NOAUTOEN);
-	ret = devm_request_irq(&pdev->dev, irq, omap8250_irq, 0,
+	irq_set_status_flags(up.port.irq, IRQ_NOAUTOEN);
+	ret = devm_request_irq(&pdev->dev, up.port.irq, omap8250_irq, 0,
 			       dev_name(&pdev->dev), priv);
 	if (ret < 0)
 		return ret;
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 12/14] serial: 8250_pxa: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (10 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 11/14] serial: 8250_omap: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 13/14] serial: 8250_tegra: " Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 14/14] serial: 8250_uniphier: " Andy Shevchenko
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_pxa.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_pxa.c b/drivers/tty/serial/8250/8250_pxa.c
index 77686da42ce8..0c9140b93414 100644
--- a/drivers/tty/serial/8250/8250_pxa.c
+++ b/drivers/tty/serial/8250/8250_pxa.c
@@ -92,11 +92,7 @@ static int serial_pxa_probe(struct platform_device *pdev)
 	struct uart_8250_port uart = {};
 	struct pxa8250_data *data;
 	struct resource *mmres;
-	int irq, ret;
-
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
+	int ret;
 
 	mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!mmres)
@@ -114,21 +110,21 @@ static int serial_pxa_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	ret = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (ret >= 0)
-		uart.port.line = ret;
-
 	uart.port.type = PORT_XSCALE;
-	uart.port.iotype = UPIO_MEM32;
 	uart.port.mapbase = mmres->start;
-	uart.port.regshift = 2;
-	uart.port.irq = irq;
-	uart.port.fifosize = 64;
 	uart.port.flags = UPF_IOREMAP | UPF_SKIP_TEST | UPF_FIXED_TYPE;
 	uart.port.dev = &pdev->dev;
 	uart.port.uartclk = clk_get_rate(data->clk);
 	uart.port.pm = serial_pxa_pm;
 	uart.port.private_data = data;
+
+	ret = uart_read_port_properties(&uart.port, true);
+	if (ret)
+		return ret;
+
+	uart.port.iotype = UPIO_MEM32;
+	uart.port.regshift = 2;
+	uart.port.fifosize = 64;
 	uart.dl_write = serial_pxa_dl_write;
 
 	ret = serial8250_register_8250_port(&uart);
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 13/14] serial: 8250_tegra: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (11 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 12/14] serial: 8250_pxa: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-26 14:19 ` [PATCH v2 14/14] serial: 8250_uniphier: " Andy Shevchenko
  13 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_tegra.c | 26 +++++++++-----------------
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_tegra.c b/drivers/tty/serial/8250/8250_tegra.c
index ba352262df75..ce48d02dfa0d 100644
--- a/drivers/tty/serial/8250/8250_tegra.c
+++ b/drivers/tty/serial/8250/8250_tegra.c
@@ -57,25 +57,11 @@ static int tegra_uart_probe(struct platform_device *pdev)
 	port = &port8250.port;
 	spin_lock_init(&port->lock);
 
-	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_FIXED_PORT |
-		      UPF_FIXED_TYPE;
-	port->iotype = UPIO_MEM32;
-	port->regshift = 2;
+	port->flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_FIXED_TYPE;
 	port->type = PORT_TEGRA;
-	port->irqflags |= IRQF_SHARED;
 	port->dev = &pdev->dev;
 	port->handle_break = tegra_uart_handle_break;
 
-	ret = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (ret >= 0)
-		port->line = ret;
-
-	ret = platform_get_irq(pdev, 0);
-	if (ret < 0)
-		return ret;
-
-	port->irq = ret;
-
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 		return -ENODEV;
@@ -88,12 +74,18 @@ static int tegra_uart_probe(struct platform_device *pdev)
 	port->mapbase = res->start;
 	port->mapsize = resource_size(res);
 
+	ret = uart_read_port_properties(port, true);
+	if (ret)
+		return ret;
+
+	port->iotype = UPIO_MEM32;
+	port->regshift = 2;
+
 	uart->rst = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
 	if (IS_ERR(uart->rst))
 		return PTR_ERR(uart->rst);
 
-	if (device_property_read_u32(&pdev->dev, "clock-frequency",
-				     &port->uartclk)) {
+	if (!port->uartclk) {
 		uart->clk = devm_clk_get(&pdev->dev, NULL);
 		if (IS_ERR(uart->clk)) {
 			dev_err(&pdev->dev, "failed to get clock!\n");
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 14/14] serial: 8250_uniphier: Switch to use uart_read_port_properties()
  2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
                   ` (12 preceding siblings ...)
  2024-02-26 14:19 ` [PATCH v2 13/14] serial: 8250_tegra: " Andy Shevchenko
@ 2024-02-26 14:19 ` Andy Shevchenko
  2024-02-27  9:43   ` Kunihiko Hayashi
  13 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-26 14:19 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Andy Shevchenko, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

Since we have now a common helper to read port properties
use it instead of sparse home grown solution.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/8250/8250_uniphier.c | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_uniphier.c b/drivers/tty/serial/8250/8250_uniphier.c
index 6399a38ecce2..d3f270a191ee 100644
--- a/drivers/tty/serial/8250/8250_uniphier.c
+++ b/drivers/tty/serial/8250/8250_uniphier.c
@@ -162,7 +162,6 @@ static int uniphier_uart_probe(struct platform_device *pdev)
 	struct uniphier8250_priv *priv;
 	struct resource *regs;
 	void __iomem *membase;
-	int irq;
 	int ret;
 
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -175,23 +174,12 @@ static int uniphier_uart_probe(struct platform_device *pdev)
 	if (!membase)
 		return -ENOMEM;
 
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
-
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
 
 	memset(&up, 0, sizeof(up));
 
-	ret = of_alias_get_id(dev->of_node, "serial");
-	if (ret < 0) {
-		dev_err(dev, "failed to get alias id\n");
-		return ret;
-	}
-	up.port.line = ret;
-
 	priv->clk = devm_clk_get(dev, NULL);
 	if (IS_ERR(priv->clk)) {
 		dev_err(dev, "failed to get clock\n");
@@ -211,7 +199,10 @@ static int uniphier_uart_probe(struct platform_device *pdev)
 	up.port.mapbase = regs->start;
 	up.port.mapsize = resource_size(regs);
 	up.port.membase = membase;
-	up.port.irq = irq;
+
+	ret = uart_read_port_properties(&up.port, true);
+	if (ret)
+		return ret;
 
 	up.port.type = PORT_16550A;
 	up.port.iotype = UPIO_MEM32;
-- 
2.43.0.rc1.1.gbec44491f096


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 06/14] serial: 8250_bcm7271: Switch to use uart_read_port_properties()
  2024-02-26 14:19 ` [PATCH v2 06/14] serial: 8250_bcm7271: " Andy Shevchenko
@ 2024-02-26 18:23   ` Florian Fainelli
  0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2024-02-26 18:23 UTC (permalink / raw)
  To: Andy Shevchenko, Greg Kroah-Hartman, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

[-- Attachment #1: Type: text/plain, Size: 357 bytes --]

On 2/26/24 06:19, Andy Shevchenko wrote:
> Since we have now a common helper to read port properties
> use it instead of sparse home grown solution.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
-- 
Florian


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4221 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 05/14] serial: 8250_bcm2835aux: Switch to use uart_read_port_properties()
  2024-02-26 14:19 ` [PATCH v2 05/14] serial: 8250_bcm2835aux: " Andy Shevchenko
@ 2024-02-26 18:23   ` Florian Fainelli
  0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2024-02-26 18:23 UTC (permalink / raw)
  To: Andy Shevchenko, Greg Kroah-Hartman, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

[-- Attachment #1: Type: text/plain, Size: 357 bytes --]

On 2/26/24 06:19, Andy Shevchenko wrote:
> Since we have now a common helper to read port properties
> use it instead of sparse home grown solution.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
-- 
Florian


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4221 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 10/14] serial: 8250_of: Switch to use uart_read_port_properties()
  2024-02-26 14:19 ` [PATCH v2 10/14] serial: 8250_of: " Andy Shevchenko
@ 2024-02-26 18:24   ` Florian Fainelli
  2024-02-27 14:55     ` Andy Shevchenko
  0 siblings, 1 reply; 23+ messages in thread
From: Florian Fainelli @ 2024-02-26 18:24 UTC (permalink / raw)
  To: Andy Shevchenko, Greg Kroah-Hartman, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

[-- Attachment #1: Type: text/plain, Size: 412 bytes --]

On 2/26/24 06:19, Andy Shevchenko wrote:
> Since we have now a common helper to read port properties
> use it instead of sparse home grown solution.
> 
> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
-- 
Florian


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4221 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 14/14] serial: 8250_uniphier: Switch to use uart_read_port_properties()
  2024-02-26 14:19 ` [PATCH v2 14/14] serial: 8250_uniphier: " Andy Shevchenko
@ 2024-02-27  9:43   ` Kunihiko Hayashi
  2024-02-27 14:55     ` Andy Shevchenko
  0 siblings, 1 reply; 23+ messages in thread
From: Kunihiko Hayashi @ 2024-02-27  9:43 UTC (permalink / raw)
  To: Andy Shevchenko, Greg Kroah-Hartman, Thomas Gleixner,
	linux-kernel, linux-serial, linux-arm-kernel, linux-aspeed,
	linux-rpi-kernel, linux-mips, linux-tegra
  Cc: Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Masami Hiramatsu

Hi,

On 2024/02/26 23:19, Andy Shevchenko wrote:
> Since we have now a common helper to read port properties
> use it instead of sparse home grown solution.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

I confirmed that it works properly.

Reviewed-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Tested-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>

Thank you,

---
Best Regards
Kunihiko Hayashi

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 10/14] serial: 8250_of: Switch to use uart_read_port_properties()
  2024-02-26 18:24   ` Florian Fainelli
@ 2024-02-27 14:55     ` Andy Shevchenko
  0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-27 14:55 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: Greg Kroah-Hartman, Thomas Gleixner, linux-kernel, linux-serial,
	linux-arm-kernel, linux-aspeed, linux-rpi-kernel, linux-mips,
	linux-tegra, Jiri Slaby, Joel Stanley, Andrew Jeffery,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu, Andi Shyti

On Mon, Feb 26, 2024 at 10:24:30AM -0800, Florian Fainelli wrote:
> On 2/26/24 06:19, Andy Shevchenko wrote:
> > Since we have now a common helper to read port properties
> > use it instead of sparse home grown solution.
> > 
> > Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> 
> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
> Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>

Thank you for testing!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 14/14] serial: 8250_uniphier: Switch to use uart_read_port_properties()
  2024-02-27  9:43   ` Kunihiko Hayashi
@ 2024-02-27 14:55     ` Andy Shevchenko
  0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-02-27 14:55 UTC (permalink / raw)
  To: Kunihiko Hayashi
  Cc: Greg Kroah-Hartman, Thomas Gleixner, linux-kernel, linux-serial,
	linux-arm-kernel, linux-aspeed, linux-rpi-kernel, linux-mips,
	linux-tegra, Jiri Slaby, Joel Stanley, Andrew Jeffery,
	Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Al Cooper, Ilpo Järvinen, Paul Cercueil,
	Vladimir Zapolskiy, Thierry Reding, Jonathan Hunter,
	Masami Hiramatsu

On Tue, Feb 27, 2024 at 06:43:51PM +0900, Kunihiko Hayashi wrote:
> Hi,
> 
> On 2024/02/26 23:19, Andy Shevchenko wrote:
> > Since we have now a common helper to read port properties
> > use it instead of sparse home grown solution.
> > 
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> 
> I confirmed that it works properly.
> 
> Reviewed-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
> Tested-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>

Thank you for testing!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 03/14] serial: port: Introduce a common helper to read properties
  2024-02-26 14:19 ` [PATCH v2 03/14] serial: port: Introduce a common helper to read properties Andy Shevchenko
@ 2024-03-02 20:58   ` Greg Kroah-Hartman
  2024-03-04 11:09     ` Andy Shevchenko
  0 siblings, 1 reply; 23+ messages in thread
From: Greg Kroah-Hartman @ 2024-03-02 20:58 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Thomas Gleixner, linux-kernel, linux-serial, linux-arm-kernel,
	linux-aspeed, linux-rpi-kernel, linux-mips, linux-tegra,
	Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

On Mon, Feb 26, 2024 at 04:19:19PM +0200, Andy Shevchenko wrote:
> Several serial drivers want to read the same or similar set of
> the port properties. Make a common helper for them.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/tty/serial/serial_port.c | 134 +++++++++++++++++++++++++++++++
>  include/linux/serial_core.h      |   1 +
>  2 files changed, 135 insertions(+)
> 
> diff --git a/drivers/tty/serial/serial_port.c b/drivers/tty/serial/serial_port.c
> index 88975a4df306..ecc980e9dba6 100644
> --- a/drivers/tty/serial/serial_port.c
> +++ b/drivers/tty/serial/serial_port.c
> @@ -8,7 +8,10 @@
>  
>  #include <linux/device.h>
>  #include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
>  #include <linux/pm_runtime.h>
> +#include <linux/property.h>
>  #include <linux/serial_core.h>
>  #include <linux/spinlock.h>
>  
> @@ -82,6 +85,137 @@ void uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)
>  }
>  EXPORT_SYMBOL(uart_remove_one_port);
>  
> +/**
> + * uart_read_port_properties - read firmware properties of the given UART port

I like, but:

> + * @port: corresponding port
> + * @use_defaults: apply defaults (when %true) or validate the values (when %false)

Using random booleans in a function is horrid.  Every time you see the
function call, or want to call it, you need to go and look up what the
boolean is and means.

Make 2 public functions here, one that does it with use_defaults=true
and one =false and then have them both call this one static function,
that way the function names themselves are easy to read and understand
and maintain over time.

thanks,

greg k-h


> + *
> + * The following device properties are supported:
> + *   - clock-frequency (optional)
> + *   - fifo-size (optional)
> + *   - no-loopback-test (optional)
> + *   - reg-shift (defaults may apply)
> + *   - reg-offset (value may be validated)
> + *   - reg-io-width (defaults may apply or value may be validated)
> + *   - interrupts (OF only)
> + *   - serial [alias ID] (OF only)
> + *
> + * If the port->dev is of struct platform_device type the interrupt line
> + * will be retrieved via platform_get_irq() call against that device.
> + * Otherwise it will be assigned by fwnode_irq_get() call. In both cases
> + * the index 0 of the resource is used.
> + *
> + * The caller is responsible to initialize the following fields of the @port
> + *   ->dev (must be valid)
> + *   ->flags
> + *   ->mapbase
> + *   ->mapsize
> + *   ->regshift (if @use_defaults is false)
> + * before calling this function. Alternatively the above mentioned fields
> + * may be zeroed, in such case the only ones, that have associated properties
> + * found, will be set to the respective values.
> + *
> + * If no error happened, the ->irq, ->mapbase, ->mapsize will be altered.
> + * The ->iotype is always altered.
> + *
> + * When @use_defaults is true and the respective property is not found
> + * the following values will be applied:
> + *   ->regshift = 0
> + * In this case IRQ must be provided, otherwise an error will be returned.
> + *
> + * When @use_defaults is false and the respective property is found
> + * the following values will be validated:
> + *   - reg-io-width (->iotype)
> + *   - reg-offset (->mapsize against ->mapbase)
> + *
> + * Returns: 0 on success or negative errno on failure
> + */
> +int uart_read_port_properties(struct uart_port *port, bool use_defaults)
> +{
> +	struct device *dev = port->dev;
> +	u32 value;
> +	int ret;
> +
> +	/* Read optional UART functional clock frequency */
> +	device_property_read_u32(dev, "clock-frequency", &port->uartclk);
> +
> +	/* Read the registers alignment (default: 8-bit) */
> +	ret = device_property_read_u32(dev, "reg-shift", &value);
> +	if (ret)
> +		port->regshift = use_defaults ? 0 : port->regshift;
> +	else
> +		port->regshift = value;
> +
> +	/* Read the registers I/O access type (default: MMIO 8-bit) */
> +	ret = device_property_read_u32(dev, "reg-io-width", &value);
> +	if (ret) {
> +		port->iotype = UPIO_MEM;
> +	} else {
> +		switch (value) {
> +		case 1:
> +			port->iotype = UPIO_MEM;
> +			break;
> +		case 2:
> +			port->iotype = UPIO_MEM16;
> +			break;
> +		case 4:
> +			port->iotype = device_is_big_endian(dev) ? UPIO_MEM32BE : UPIO_MEM32;
> +			break;
> +		default:
> +			if (!use_defaults) {
> +				dev_err(dev, "Unsupported reg-io-width (%u)\n", value);
> +				return -EINVAL;
> +			}
> +			port->iotype = UPIO_UNKNOWN;
> +			break;
> +		}
> +	}
> +
> +	/* Read the address mapping base offset (default: no offset) */
> +	ret = device_property_read_u32(dev, "reg-offset", &value);
> +	if (ret)
> +		value = 0;
> +
> +	/* Check for shifted address mapping overflow */
> +	if (!use_defaults && port->mapsize < value) {
> +		dev_err(dev, "reg-offset %u exceeds region size %pa\n", value, &port->mapsize);
> +		return -EINVAL;
> +	}
> +
> +	port->mapbase += value;
> +	port->mapsize -= value;
> +
> +	/* Read optional FIFO size */
> +	device_property_read_u32(dev, "fifo-size", &port->fifosize);
> +
> +	if (device_property_read_bool(dev, "no-loopback-test"))
> +		port->flags |= UPF_SKIP_TEST;
> +
> +	/* Get index of serial line, if found in DT aliases */
> +	ret = of_alias_get_id(dev_of_node(dev), "serial");
> +	if (ret >= 0)
> +		port->line = ret;
> +
> +	if (dev_is_platform(dev))
> +		ret = platform_get_irq(to_platform_device(dev), 0);
> +	else
> +		ret = fwnode_irq_get(dev_fwnode(dev), 0);
> +	if (ret == -EPROBE_DEFER)
> +		return ret;
> +	if (ret > 0)
> +		port->irq = ret;
> +	else if (use_defaults)
> +		/* By default IRQ support is mandatory */
> +		return ret;
> +	else
> +		port->irq = 0;
> +
> +	port->flags |= UPF_SHARE_IRQ;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(uart_read_port_properties);

EXPORT_SYMBOL_GPL()?  I have to ask :)

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 03/14] serial: port: Introduce a common helper to read properties
  2024-03-02 20:58   ` Greg Kroah-Hartman
@ 2024-03-04 11:09     ` Andy Shevchenko
  0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-03-04 11:09 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: Thomas Gleixner, linux-kernel, linux-serial, linux-arm-kernel,
	linux-aspeed, linux-rpi-kernel, linux-mips, linux-tegra,
	Jiri Slaby, Joel Stanley, Andrew Jeffery, Florian Fainelli,
	Broadcom internal kernel review list, Ray Jui, Scott Branden,
	Al Cooper, Ilpo Järvinen, Paul Cercueil, Vladimir Zapolskiy,
	Thierry Reding, Jonathan Hunter, Kunihiko Hayashi,
	Masami Hiramatsu

On Sat, Mar 02, 2024 at 09:58:53PM +0100, Greg Kroah-Hartman wrote:
> On Mon, Feb 26, 2024 at 04:19:19PM +0200, Andy Shevchenko wrote:

...

> > + * uart_read_port_properties - read firmware properties of the given UART port
> 
> I like, but:
> 
> > + * @port: corresponding port
> > + * @use_defaults: apply defaults (when %true) or validate the values (when %false)
> 
> Using random booleans in a function is horrid.  Every time you see the
> function call, or want to call it, you need to go and look up what the
> boolean is and means.
> 
> Make 2 public functions here, one that does it with use_defaults=true
> and one =false and then have them both call this one static function,
> that way the function names themselves are easy to read and understand
> and maintain over time.

Okay! I'll redo that.

...

> > +EXPORT_SYMBOL(uart_read_port_properties);
> 
> EXPORT_SYMBOL_GPL()?  I have to ask :)

No clue, the rest in this file is EXPORT_SYMBOL, but I admit I followed the
cargo cult. I'll check the modified code and see if I may use _GPL version.

Thank you for review!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2024-03-04 11:09 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-26 14:19 [PATCH v2 00/14] serial: Add a helper to parse device properties and more Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 01/14] serial: core: Move struct uart_port::quirks closer to possible values Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 02/14] serial: core: Add UPIO_UNKNOWN constant for unknown port type Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 03/14] serial: port: Introduce a common helper to read properties Andy Shevchenko
2024-03-02 20:58   ` Greg Kroah-Hartman
2024-03-04 11:09     ` Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 04/14] serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties() Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 05/14] serial: 8250_bcm2835aux: " Andy Shevchenko
2024-02-26 18:23   ` Florian Fainelli
2024-02-26 14:19 ` [PATCH v2 06/14] serial: 8250_bcm7271: " Andy Shevchenko
2024-02-26 18:23   ` Florian Fainelli
2024-02-26 14:19 ` [PATCH v2 07/14] serial: 8250_dw: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 08/14] serial: 8250_ingenic: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 09/14] serial: 8250_lpc18xx: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 10/14] serial: 8250_of: " Andy Shevchenko
2024-02-26 18:24   ` Florian Fainelli
2024-02-27 14:55     ` Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 11/14] serial: 8250_omap: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 12/14] serial: 8250_pxa: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 13/14] serial: 8250_tegra: " Andy Shevchenko
2024-02-26 14:19 ` [PATCH v2 14/14] serial: 8250_uniphier: " Andy Shevchenko
2024-02-27  9:43   ` Kunihiko Hayashi
2024-02-27 14:55     ` Andy Shevchenko

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).