2020-03-18 10:51:57

by Chunyan Zhang

[permalink] [raw]
Subject: [PATCH v3 0/2] two fixes on sprd serial driver

From: Chunyan Zhang <[email protected]>

Changes from v2:
* Return -EINVAL for both kinds of errors for calling of_alias_get_id(),
to avoid return a positive value as error number if index is larger
than the array size;
* removed cleanup for sprd_port.

Chunyan Zhang (2):
serial: sprd: getting port index via serial alias only
serial: sprd: remove redundant sprd_port cleanup

drivers/tty/serial/sprd_serial.c | 40 +++++---------------------------
1 file changed, 6 insertions(+), 34 deletions(-)

--
2.20.1


2020-03-18 10:53:19

by Chunyan Zhang

[permalink] [raw]
Subject: [PATCH v3 1/2] serial: sprd: getting port index via serial aliases only

From: Chunyan Zhang <[email protected]>

This patch simplifies the process of getting serial port number, with
this patch, serial devices must have aliases configured in devicetree.

The serial port searched out via sprd_port array maybe wrong if we don't
have serial alias defined in devicetree, and specify console with command
line, we would get the wrong port number if other serial ports probe
failed before console's. So using aliases is mandatory.

Signed-off-by: Chunyan Zhang <[email protected]>
---
drivers/tty/serial/sprd_serial.c | 36 +++++---------------------------
1 file changed, 5 insertions(+), 31 deletions(-)

diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c
index 914862844790..e9d148d47bec 100644
--- a/drivers/tty/serial/sprd_serial.c
+++ b/drivers/tty/serial/sprd_serial.c
@@ -1102,29 +1102,6 @@ static struct uart_driver sprd_uart_driver = {
.cons = SPRD_CONSOLE,
};

-static int sprd_probe_dt_alias(int index, struct device *dev)
-{
- struct device_node *np;
- int ret = index;
-
- if (!IS_ENABLED(CONFIG_OF))
- return ret;
-
- np = dev->of_node;
- if (!np)
- return ret;
-
- ret = of_alias_get_id(np, "serial");
- if (ret < 0)
- ret = index;
- else if (ret >= ARRAY_SIZE(sprd_port) || sprd_port[ret] != NULL) {
- dev_warn(dev, "requested serial port %d not available.\n", ret);
- ret = index;
- }
-
- return ret;
-}
-
static int sprd_remove(struct platform_device *dev)
{
struct sprd_uart_port *sup = platform_get_drvdata(dev);
@@ -1204,14 +1181,11 @@ static int sprd_probe(struct platform_device *pdev)
int index;
int ret;

- for (index = 0; index < ARRAY_SIZE(sprd_port); index++)
- if (sprd_port[index] == NULL)
- break;
-
- if (index == ARRAY_SIZE(sprd_port))
- return -EBUSY;
-
- index = sprd_probe_dt_alias(index, &pdev->dev);
+ index = of_alias_get_id(pdev->dev.of_node, "serial");
+ if (index < 0 || index >= ARRAY_SIZE(sprd_port)) {
+ dev_err(&pdev->dev, "got a wrong serial alias id %d\n", index);
+ return -EINVAL;
+ }

sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]),
GFP_KERNEL);
--
2.20.1

2020-03-18 10:53:31

by Chunyan Zhang

[permalink] [raw]
Subject: [PATCH v3 2/2] serial: sprd: remove redundant sprd_port cleanup

From: Chunyan Zhang <[email protected]>

We don't need to cleanup sprd_port anymore, since we've dropped the way
of using the sprd_port[] array to get port index.

Signed-off-by: Chunyan Zhang <[email protected]>
---
drivers/tty/serial/sprd_serial.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c
index e9d148d47bec..cefdd051b2d0 100644
--- a/drivers/tty/serial/sprd_serial.c
+++ b/drivers/tty/serial/sprd_serial.c
@@ -1237,10 +1237,8 @@ static int sprd_probe(struct platform_device *pdev)
sprd_ports_num++;

ret = uart_add_one_port(&sprd_uart_driver, up);
- if (ret) {
- sprd_port[index] = NULL;
+ if (ret)
sprd_remove(pdev);
- }

platform_set_drvdata(pdev, up);

--
2.20.1

2020-03-18 10:55:43

by Baolin Wang

[permalink] [raw]
Subject: Re: [PATCH v3 1/2] serial: sprd: getting port index via serial aliases only

On Wed, Mar 18, 2020 at 6:51 PM Chunyan Zhang <[email protected]> wrote:
>
> From: Chunyan Zhang <[email protected]>
>
> This patch simplifies the process of getting serial port number, with
> this patch, serial devices must have aliases configured in devicetree.
>
> The serial port searched out via sprd_port array maybe wrong if we don't
> have serial alias defined in devicetree, and specify console with command
> line, we would get the wrong port number if other serial ports probe
> failed before console's. So using aliases is mandatory.
>
> Signed-off-by: Chunyan Zhang <[email protected]>

Looks good to me.
Reviewed-by: Baolin Wang <[email protected]>

> ---
> drivers/tty/serial/sprd_serial.c | 36 +++++---------------------------
> 1 file changed, 5 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c
> index 914862844790..e9d148d47bec 100644
> --- a/drivers/tty/serial/sprd_serial.c
> +++ b/drivers/tty/serial/sprd_serial.c
> @@ -1102,29 +1102,6 @@ static struct uart_driver sprd_uart_driver = {
> .cons = SPRD_CONSOLE,
> };
>
> -static int sprd_probe_dt_alias(int index, struct device *dev)
> -{
> - struct device_node *np;
> - int ret = index;
> -
> - if (!IS_ENABLED(CONFIG_OF))
> - return ret;
> -
> - np = dev->of_node;
> - if (!np)
> - return ret;
> -
> - ret = of_alias_get_id(np, "serial");
> - if (ret < 0)
> - ret = index;
> - else if (ret >= ARRAY_SIZE(sprd_port) || sprd_port[ret] != NULL) {
> - dev_warn(dev, "requested serial port %d not available.\n", ret);
> - ret = index;
> - }
> -
> - return ret;
> -}
> -
> static int sprd_remove(struct platform_device *dev)
> {
> struct sprd_uart_port *sup = platform_get_drvdata(dev);
> @@ -1204,14 +1181,11 @@ static int sprd_probe(struct platform_device *pdev)
> int index;
> int ret;
>
> - for (index = 0; index < ARRAY_SIZE(sprd_port); index++)
> - if (sprd_port[index] == NULL)
> - break;
> -
> - if (index == ARRAY_SIZE(sprd_port))
> - return -EBUSY;
> -
> - index = sprd_probe_dt_alias(index, &pdev->dev);
> + index = of_alias_get_id(pdev->dev.of_node, "serial");
> + if (index < 0 || index >= ARRAY_SIZE(sprd_port)) {
> + dev_err(&pdev->dev, "got a wrong serial alias id %d\n", index);
> + return -EINVAL;
> + }
>
> sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]),
> GFP_KERNEL);
> --
> 2.20.1
>


--
Baolin Wang

2020-03-18 10:57:17

by Baolin Wang

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] serial: sprd: remove redundant sprd_port cleanup

On Wed, Mar 18, 2020 at 6:51 PM Chunyan Zhang <[email protected]> wrote:
>
> From: Chunyan Zhang <[email protected]>
>
> We don't need to cleanup sprd_port anymore, since we've dropped the way
> of using the sprd_port[] array to get port index.
>
> Signed-off-by: Chunyan Zhang <[email protected]>

Looks good to me.
Reviewed-by: Baolin Wang <[email protected]>

> ---
> drivers/tty/serial/sprd_serial.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c
> index e9d148d47bec..cefdd051b2d0 100644
> --- a/drivers/tty/serial/sprd_serial.c
> +++ b/drivers/tty/serial/sprd_serial.c
> @@ -1237,10 +1237,8 @@ static int sprd_probe(struct platform_device *pdev)
> sprd_ports_num++;
>
> ret = uart_add_one_port(&sprd_uart_driver, up);
> - if (ret) {
> - sprd_port[index] = NULL;
> + if (ret)
> sprd_remove(pdev);
> - }
>
> platform_set_drvdata(pdev, up);
>
> --
> 2.20.1
>


--
Baolin Wang