* [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios
@ 2024-06-12 13:14 Hui Wang
2024-06-12 13:14 ` [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT Hui Wang
2024-06-12 16:37 ` [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Conor Dooley
0 siblings, 2 replies; 10+ messages in thread
From: Hui Wang @ 2024-06-12 13:14 UTC (permalink / raw)
To: linux-serial, devicetree, gregkh
Cc: jirislaby, hvilleneuve, robh, krzk+dt, conor+dt, andy,
lech.perczak, Maarten.Brock, hui.wang
In some designs, the chip reset pin is connected to a GPIO, and this
GPIO needs to be set correctly before probing the driver, so add a
reset-gpios in the device tree.
Signed-off-by: Hui Wang <hui.wang@canonical.com>
---
In the v3:
- drop the Reviewed-by
- change gpio to GPIO
- change "this GPIO" to "and this GPIO"
- change "so adding" to "so add"
Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml b/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml
index 5dec15b7e7c3..88871480018e 100644
--- a/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml
+++ b/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml
@@ -28,6 +28,9 @@ properties:
clocks:
maxItems: 1
+ reset-gpios:
+ maxItems: 1
+
clock-frequency:
description:
When there is no clock provider visible to the platform, this
@@ -91,6 +94,7 @@ unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/gpio/gpio.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
@@ -120,6 +124,7 @@ examples:
compatible = "nxp,sc16is752";
reg = <0x54>;
clocks = <&clk20m>;
+ reset-gpios = <&gpio5 13 GPIO_ACTIVE_LOW>;
interrupt-parent = <&gpio3>;
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
nxp,modem-control-line-ports = <0 1>; /* Ports 0 and 1 as modem control lines */
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:14 [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Hui Wang
@ 2024-06-12 13:14 ` Hui Wang
2024-06-12 13:50 ` Hugo Villeneuve
2024-06-12 13:56 ` Lech Perczak
2024-06-12 16:37 ` [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Conor Dooley
1 sibling, 2 replies; 10+ messages in thread
From: Hui Wang @ 2024-06-12 13:14 UTC (permalink / raw)
To: linux-serial, devicetree, gregkh
Cc: jirislaby, hvilleneuve, robh, krzk+dt, conor+dt, andy,
lech.perczak, Maarten.Brock, hui.wang
Some boards connect a GPIO to the reset pin, and the reset pin needs
to be setup correctly before accessing the chip.
Add a function to handle the chip reset. If the reset-gpios is defined
in the DT, do hardware reset through this GPIO, othwerwise do software
reset as before.
Signed-off-by: Hui Wang <hui.wang@canonical.com>
---
In the v3:
- drop Reviewed-by
- adjust the sequence of if, else if and else
- replace PTR_ERR(reset_gpiod) with dev_err_probe
- change GPIOD_OUT_LOW to GPIOD_OUT_HIGH, this will assert the reset pin after requesting the GPIO
- change the 2nd parameter struct regmap *regmap[] to struct regmap *regmap
- address all spelling and description issues in the v2
drivers/tty/serial/sc16is7xx.c | 33 +++++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
index bf0065d1c8e9..8c7e0fe76049 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -14,6 +14,7 @@
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/export.h>
+#include <linux/gpio/consumer.h>
#include <linux/gpio/driver.h>
#include <linux/idr.h>
#include <linux/kthread.h>
@@ -1467,6 +1468,30 @@ static const struct serial_rs485 sc16is7xx_rs485_supported = {
.delay_rts_after_send = 1, /* Not supported but keep returning -EINVAL */
};
+/* Reset device, purging any pending irq / data */
+static int sc16is7xx_reset(struct device *dev, struct regmap *regmap)
+{
+ struct gpio_desc *reset_gpio;
+
+ /* The reset GPIO is ACTIVE_LOW, flag GPIOD_OUT_HIGH asserts the reset GPIO */
+ reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(reset_gpio))
+ return dev_err_probe(dev, PTR_ERR(reset_gpio), "Failed to get reset GPIO\n");
+
+ if (reset_gpio) {
+ /* The minimum reset pulse width is 3 us. */
+ udelay(5);
+ gpiod_set_value_cansleep(reset_gpio, 0);
+ /* Deassert GPIO */
+ } else {
+ /* Software reset */
+ regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
+ SC16IS7XX_IOCONTROL_SRESET_BIT);
+ }
+
+ return 0;
+}
+
int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
struct regmap *regmaps[], int irq)
{
@@ -1527,6 +1552,10 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
s->devtype = devtype;
dev_set_drvdata(dev, s);
+ ret = sc16is7xx_reset(dev, regmaps[0]);
+ if (ret)
+ goto out_clk;
+
kthread_init_worker(&s->kworker);
s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker,
"sc16is7xx");
@@ -1536,10 +1565,6 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
}
sched_set_fifo(s->kworker_task);
- /* reset device, purging any pending irq / data */
- regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG,
- SC16IS7XX_IOCONTROL_SRESET_BIT);
-
/* Mark each port line and status as uninitialised. */
for (i = 0; i < devtype->nr_uart; ++i) {
s->p[i].port.line = SC16IS7XX_MAX_DEVS;
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:14 ` [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT Hui Wang
@ 2024-06-12 13:50 ` Hugo Villeneuve
2024-06-12 14:46 ` Hui Wang
2024-06-12 13:56 ` Lech Perczak
1 sibling, 1 reply; 10+ messages in thread
From: Hugo Villeneuve @ 2024-06-12 13:50 UTC (permalink / raw)
To: Hui Wang
Cc: linux-serial, devicetree, gregkh, jirislaby, hvilleneuve, robh,
krzk+dt, conor+dt, andy, lech.perczak, Maarten.Brock
On Wed, 12 Jun 2024 21:14:54 +0800
Hui Wang <hui.wang@canonical.com> wrote:
Hi Hui,
> Some boards connect a GPIO to the reset pin, and the reset pin needs
> to be setup correctly before accessing the chip.
>
> Add a function to handle the chip reset. If the reset-gpios is defined
> in the DT, do hardware reset through this GPIO, othwerwise do software
> reset as before.
>
> Signed-off-by: Hui Wang <hui.wang@canonical.com>
> ---
> In the v3:
> - drop Reviewed-by
> - adjust the sequence of if, else if and else
> - replace PTR_ERR(reset_gpiod) with dev_err_probe
> - change GPIOD_OUT_LOW to GPIOD_OUT_HIGH, this will assert the reset pin after requesting the GPIO
> - change the 2nd parameter struct regmap *regmap[] to struct regmap *regmap
> - address all spelling and description issues in the v2
>
> drivers/tty/serial/sc16is7xx.c | 33 +++++++++++++++++++++++++++++----
> 1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
> index bf0065d1c8e9..8c7e0fe76049 100644
> --- a/drivers/tty/serial/sc16is7xx.c
> +++ b/drivers/tty/serial/sc16is7xx.c
> @@ -14,6 +14,7 @@
> #include <linux/delay.h>
> #include <linux/device.h>
> #include <linux/export.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/gpio/driver.h>
> #include <linux/idr.h>
> #include <linux/kthread.h>
> @@ -1467,6 +1468,30 @@ static const struct serial_rs485 sc16is7xx_rs485_supported = {
> .delay_rts_after_send = 1, /* Not supported but keep returning -EINVAL */
> };
>
> +/* Reset device, purging any pending irq / data */
> +static int sc16is7xx_reset(struct device *dev, struct regmap *regmap)
> +{
> + struct gpio_desc *reset_gpio;
> +
> + /* The reset GPIO is ACTIVE_LOW, flag GPIOD_OUT_HIGH asserts the reset GPIO */
> + reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(reset_gpio))
> + return dev_err_probe(dev, PTR_ERR(reset_gpio), "Failed to get reset GPIO\n");
> +
> + if (reset_gpio) {
> + /* The minimum reset pulse width is 3 us. */
> + udelay(5);
> + gpiod_set_value_cansleep(reset_gpio, 0);
> + /* Deassert GPIO */
Move this comment after its corresponding statement:
gpiod_set_value_cansleep(reset_gpio, 0); /* Deassert GPIO */
> + } else {
> + /* Software reset */
> + regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
> + SC16IS7XX_IOCONTROL_SRESET_BIT);
> + }
> +
> + return 0;
> +}
> +
> int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> struct regmap *regmaps[], int irq)
> {
> @@ -1527,6 +1552,10 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> s->devtype = devtype;
> dev_set_drvdata(dev, s);
>
> + ret = sc16is7xx_reset(dev, regmaps[0]);
> + if (ret)
> + goto out_clk;
> +
You could move this block where the original software reset was
located, unless you have a good reason to move it here? This will make
the review (diff) easier...
> kthread_init_worker(&s->kworker);
> s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker,
> "sc16is7xx");
> @@ -1536,10 +1565,6 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> }
> sched_set_fifo(s->kworker_task);
>
> - /* reset device, purging any pending irq / data */
> - regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG,
> - SC16IS7XX_IOCONTROL_SRESET_BIT);
> -
> /* Mark each port line and status as uninitialised. */
> for (i = 0; i < devtype->nr_uart; ++i) {
> s->p[i].port.line = SC16IS7XX_MAX_DEVS;
> --
> 2.34.1
--
Hugo Villeneuve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:14 ` [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT Hui Wang
2024-06-12 13:50 ` Hugo Villeneuve
@ 2024-06-12 13:56 ` Lech Perczak
2024-06-12 14:50 ` Hui Wang
2024-06-13 20:45 ` Andy Shevchenko
1 sibling, 2 replies; 10+ messages in thread
From: Lech Perczak @ 2024-06-12 13:56 UTC (permalink / raw)
To: Hui Wang, linux-serial, devicetree, gregkh
Cc: jirislaby, hvilleneuve, robh, krzk+dt, conor+dt, andy,
Maarten.Brock
Hi,
Some comments inline.
W dniu 12.06.2024 o 15:14, Hui Wang pisze:
> Some boards connect a GPIO to the reset pin, and the reset pin needs
> to be setup correctly before accessing the chip.
>
> Add a function to handle the chip reset. If the reset-gpios is defined
> in the DT, do hardware reset through this GPIO, othwerwise do software
> reset as before.
>
> Signed-off-by: Hui Wang <hui.wang@canonical.com>
> ---
> In the v3:
> - drop Reviewed-by
> - adjust the sequence of if, else if and else
> - replace PTR_ERR(reset_gpiod) with dev_err_probe
> - change GPIOD_OUT_LOW to GPIOD_OUT_HIGH, this will assert the reset pin after requesting the GPIO
> - change the 2nd parameter struct regmap *regmap[] to struct regmap *regmap
> - address all spelling and description issues in the v2
>
> drivers/tty/serial/sc16is7xx.c | 33 +++++++++++++++++++++++++++++----
> 1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
> index bf0065d1c8e9..8c7e0fe76049 100644
> --- a/drivers/tty/serial/sc16is7xx.c
> +++ b/drivers/tty/serial/sc16is7xx.c
> @@ -14,6 +14,7 @@
> #include <linux/delay.h>
> #include <linux/device.h>
> #include <linux/export.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/gpio/driver.h>
> #include <linux/idr.h>
> #include <linux/kthread.h>
> @@ -1467,6 +1468,30 @@ static const struct serial_rs485 sc16is7xx_rs485_supported = {
> .delay_rts_after_send = 1, /* Not supported but keep returning -EINVAL */
> };
>
> +/* Reset device, purging any pending irq / data */
> +static int sc16is7xx_reset(struct device *dev, struct regmap *regmap)
> +{
> + struct gpio_desc *reset_gpio;
> +
> + /* The reset GPIO is ACTIVE_LOW, flag GPIOD_OUT_HIGH asserts the reset GPIO */
s/reset GPIO is ACTIVE_LOW /reset input is active low/ - because we're referring to the chip input here, and this is reflected in DT bindings.
Also, it isn't clear from the comment that GPIO is asserted immediately.
> + reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(reset_gpio))
> + return dev_err_probe(dev, PTR_ERR(reset_gpio), "Failed to get reset GPIO\n");
> +
> + if (reset_gpio) {
> + /* The minimum reset pulse width is 3 us. */
> + udelay(5);
Prefer usleep_range() over that, since maximum reset time isn't all that critical.
> + gpiod_set_value_cansleep(reset_gpio, 0);
> + /* Deassert GPIO */
This comment should go one line above or be removed entirely.
> + } else {
> + /* Software reset */
> + regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
> + SC16IS7XX_IOCONTROL_SRESET_BIT);
> + }
> +
> + return 0;
> +}
> +
> int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> struct regmap *regmaps[], int irq)
> {
> @@ -1527,6 +1552,10 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> s->devtype = devtype;
> dev_set_drvdata(dev, s);
>
> + ret = sc16is7xx_reset(dev, regmaps[0]);
> + if (ret)
> + goto out_clk;
> +
> kthread_init_worker(&s->kworker);
> s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker,
> "sc16is7xx");
> @@ -1536,10 +1565,6 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
> }
> sched_set_fifo(s->kworker_task);
>
> - /* reset device, purging any pending irq / data */
> - regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG,
> - SC16IS7XX_IOCONTROL_SRESET_BIT);
> -
> /* Mark each port line and status as uninitialised. */
> for (i = 0; i < devtype->nr_uart; ++i) {
> s->p[i].port.line = SC16IS7XX_MAX_DEVS;
> --
> 2.34.1
--
Pozdrawiam/With kind regards,
Lech Perczak
Sr. Software Engineer
Camlin Technologies Poland Limited Sp. z o.o.
Strzegomska 54,
53-611 Wroclaw
Tel: (+48) 71 75 000 16
Email: lech.perczak@camlingroup.com
Website: http://www.camlingroup.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:50 ` Hugo Villeneuve
@ 2024-06-12 14:46 ` Hui Wang
0 siblings, 0 replies; 10+ messages in thread
From: Hui Wang @ 2024-06-12 14:46 UTC (permalink / raw)
To: Hugo Villeneuve
Cc: linux-serial, devicetree, gregkh, jirislaby, hvilleneuve, robh,
krzk+dt, conor+dt, andy, lech.perczak, Maarten.Brock
On 6/12/24 21:50, Hugo Villeneuve wrote:
> On Wed, 12 Jun 2024 21:14:54 +0800
> Hui Wang <hui.wang@canonical.com> wrote:
>
> Hi Hui,
>
>> Some boards connect a GPIO to the reset pin, and the reset pin needs
>> to be setup correctly before accessing the chip.
>>
>> Add a function to handle the chip reset. If the reset-gpios is defined
>> in the DT, do hardware reset through this GPIO, othwerwise do software
>> reset as before.
...
>> + /* The minimum reset pulse width is 3 us. */
>> + udelay(5);
>> + gpiod_set_value_cansleep(reset_gpio, 0);
>> + /* Deassert GPIO */
> Move this comment after its corresponding statement:
> gpiod_set_value_cansleep(reset_gpio, 0); /* Deassert GPIO */
>
Got it.
>> + } else {
>> + /* Software reset */
>> + regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
>> + SC16IS7XX_IOCONTROL_SRESET_BIT);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> struct regmap *regmaps[], int irq)
>> {
>> @@ -1527,6 +1552,10 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> s->devtype = devtype;
>> dev_set_drvdata(dev, s);
>>
>> + ret = sc16is7xx_reset(dev, regmaps[0]);
>> + if (ret)
>> + goto out_clk;
>> +
> You could move this block where the original software reset was
> located, unless you have a good reason to move it here? This will make
> the review (diff) easier...
If I move it to the place where the original software reset was located,
I can't use "goto out_clk" anymore, it not only needs to release clk but
also needs to stop the kthread, so I have to add a new tag before the
kthread_stop(s->kworker_task) and goto that tag.
Thanks.
>> kthread_init_worker(&s->kworker);
>> s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker,
>> "sc16is7xx");
>> @@ -1536,10 +1565,6 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> }
>> sched_set_fifo(s->kworker_task);
>>
>> - /* reset device, purging any pending irq / data */
>> - regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG,
>> - SC16IS7XX_IOCONTROL_SRESET_BIT);
>> -
>> /* Mark each port line and status as uninitialised. */
>> for (i = 0; i < devtype->nr_uart; ++i) {
>> s->p[i].port.line = SC16IS7XX_MAX_DEVS;
>> --
>> 2.34.1
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:56 ` Lech Perczak
@ 2024-06-12 14:50 ` Hui Wang
2024-06-13 20:45 ` Andy Shevchenko
1 sibling, 0 replies; 10+ messages in thread
From: Hui Wang @ 2024-06-12 14:50 UTC (permalink / raw)
To: Lech Perczak, linux-serial, devicetree, gregkh
Cc: jirislaby, hvilleneuve, robh, krzk+dt, conor+dt, andy,
Maarten.Brock
On 6/12/24 21:56, Lech Perczak wrote:
> Hi,
> Some comments inline.
>
> W dniu 12.06.2024 o 15:14, Hui Wang pisze:
>> Some boards connect a GPIO to the reset pin, and the reset pin needs
>> to be setup correctly before accessing the chip.
>>
>> Add a function to handle the chip reset. If the reset-gpios is defined
>> in the DT, do hardware reset through this GPIO, othwerwise do software
>> reset as before.
>>
>> Signed-off-by: Hui Wang <hui.wang@canonical.com>
>> ---
>> In the v3:
>> - drop Reviewed-by
>> - adjust the sequence of if, else if and else
>> - replace PTR_ERR(reset_gpiod) with dev_err_probe
>> - change GPIOD_OUT_LOW to GPIOD_OUT_HIGH, this will assert the reset pin after requesting the GPIO
>> - change the 2nd parameter struct regmap *regmap[] to struct regmap *regmap
>> - address all spelling and description issues in the v2
>>
>> drivers/tty/serial/sc16is7xx.c | 33 +++++++++++++++++++++++++++++----
>> 1 file changed, 29 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
>> index bf0065d1c8e9..8c7e0fe76049 100644
>> --- a/drivers/tty/serial/sc16is7xx.c
>> +++ b/drivers/tty/serial/sc16is7xx.c
>> @@ -14,6 +14,7 @@
>> #include <linux/delay.h>
>> #include <linux/device.h>
>> #include <linux/export.h>
>> +#include <linux/gpio/consumer.h>
>> #include <linux/gpio/driver.h>
>> #include <linux/idr.h>
>> #include <linux/kthread.h>
>> @@ -1467,6 +1468,30 @@ static const struct serial_rs485 sc16is7xx_rs485_supported = {
>> .delay_rts_after_send = 1, /* Not supported but keep returning -EINVAL */
>> };
>>
>> +/* Reset device, purging any pending irq / data */
>> +static int sc16is7xx_reset(struct device *dev, struct regmap *regmap)
>> +{
>> + struct gpio_desc *reset_gpio;
>> +
>> + /* The reset GPIO is ACTIVE_LOW, flag GPIOD_OUT_HIGH asserts the reset GPIO */
> s/reset GPIO is ACTIVE_LOW /reset input is active low/ - because we're referring to the chip input here, and this is reflected in DT bindings.
>
> Also, it isn't clear from the comment that GPIO is asserted immediately.
Got it.
>
>
>> + reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
>> + if (IS_ERR(reset_gpio))
>> + return dev_err_probe(dev, PTR_ERR(reset_gpio), "Failed to get reset GPIO\n");
>> +
>> + if (reset_gpio) {
>> + /* The minimum reset pulse width is 3 us. */
>> + udelay(5);
> Prefer usleep_range() over that, since maximum reset time isn't all that critical.
Got it.
>
>
>> + gpiod_set_value_cansleep(reset_gpio, 0);
>> + /* Deassert GPIO */
> This comment should go one line above or be removed entirely.
Got it.
Thanks.
>
>
>> + } else {
>> + /* Software reset */
>> + regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
>> + SC16IS7XX_IOCONTROL_SRESET_BIT);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> struct regmap *regmaps[], int irq)
>> {
>> @@ -1527,6 +1552,10 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> s->devtype = devtype;
>> dev_set_drvdata(dev, s);
>>
>> + ret = sc16is7xx_reset(dev, regmaps[0]);
>> + if (ret)
>> + goto out_clk;
>> +
>> kthread_init_worker(&s->kworker);
>> s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker,
>> "sc16is7xx");
>> @@ -1536,10 +1565,6 @@ int sc16is7xx_probe(struct device *dev, const struct sc16is7xx_devtype *devtype,
>> }
>> sched_set_fifo(s->kworker_task);
>>
>> - /* reset device, purging any pending irq / data */
>> - regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG,
>> - SC16IS7XX_IOCONTROL_SRESET_BIT);
>> -
>> /* Mark each port line and status as uninitialised. */
>> for (i = 0; i < devtype->nr_uart; ++i) {
>> s->p[i].port.line = SC16IS7XX_MAX_DEVS;
>> --
>> 2.34.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios
2024-06-12 13:14 [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Hui Wang
2024-06-12 13:14 ` [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT Hui Wang
@ 2024-06-12 16:37 ` Conor Dooley
2024-06-12 16:49 ` Hugo Villeneuve
1 sibling, 1 reply; 10+ messages in thread
From: Conor Dooley @ 2024-06-12 16:37 UTC (permalink / raw)
To: Hui Wang
Cc: linux-serial, devicetree, gregkh, jirislaby, hvilleneuve, robh,
krzk+dt, conor+dt, andy, lech.perczak, Maarten.Brock
[-- Attachment #1: Type: text/plain, Size: 522 bytes --]
On Wed, Jun 12, 2024 at 09:14:53PM +0800, Hui Wang wrote:
> In some designs, the chip reset pin is connected to a GPIO, and this
> GPIO needs to be set correctly before probing the driver, so add a
> reset-gpios in the device tree.
>
> Signed-off-by: Hui Wang <hui.wang@canonical.com>
> ---
> In the v3:
> - drop the Reviewed-by
> - change gpio to GPIO
> - change "this GPIO" to "and this GPIO"
> - change "so adding" to "so add"
There's no need to drop an R-b for grammar changes in a commit message.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios
2024-06-12 16:37 ` [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Conor Dooley
@ 2024-06-12 16:49 ` Hugo Villeneuve
2024-06-12 16:58 ` Conor Dooley
0 siblings, 1 reply; 10+ messages in thread
From: Hugo Villeneuve @ 2024-06-12 16:49 UTC (permalink / raw)
To: Conor Dooley
Cc: Hui Wang, linux-serial, devicetree, gregkh, jirislaby,
hvilleneuve, robh, krzk+dt, conor+dt, andy, lech.perczak,
Maarten.Brock
On Wed, 12 Jun 2024 17:37:30 +0100
Conor Dooley <conor@kernel.org> wrote:
> On Wed, Jun 12, 2024 at 09:14:53PM +0800, Hui Wang wrote:
> > In some designs, the chip reset pin is connected to a GPIO, and this
> > GPIO needs to be set correctly before probing the driver, so add a
> > reset-gpios in the device tree.
> >
> > Signed-off-by: Hui Wang <hui.wang@canonical.com>
> > ---
> > In the v3:
> > - drop the Reviewed-by
> > - change gpio to GPIO
> > - change "this GPIO" to "and this GPIO"
> > - change "so adding" to "so add"
>
> There's no need to drop an R-b for grammar changes in a commit message.
Hi Conor,
The R-b tags were never given in the first place, that is why they are
removed:
https://lore.kernel.org/all/6b1b0635-304c-48d7-a941-fae30962083a@canonical.com/
--
Hugo Villeneuve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios
2024-06-12 16:49 ` Hugo Villeneuve
@ 2024-06-12 16:58 ` Conor Dooley
0 siblings, 0 replies; 10+ messages in thread
From: Conor Dooley @ 2024-06-12 16:58 UTC (permalink / raw)
To: Hugo Villeneuve
Cc: Hui Wang, linux-serial, devicetree, gregkh, jirislaby,
hvilleneuve, robh, krzk+dt, conor+dt, andy, lech.perczak,
Maarten.Brock
[-- Attachment #1: Type: text/plain, Size: 1063 bytes --]
On Wed, Jun 12, 2024 at 12:49:43PM -0400, Hugo Villeneuve wrote:
> On Wed, 12 Jun 2024 17:37:30 +0100
> Conor Dooley <conor@kernel.org> wrote:
>
> > On Wed, Jun 12, 2024 at 09:14:53PM +0800, Hui Wang wrote:
> > > In some designs, the chip reset pin is connected to a GPIO, and this
> > > GPIO needs to be set correctly before probing the driver, so add a
> > > reset-gpios in the device tree.
> > >
> > > Signed-off-by: Hui Wang <hui.wang@canonical.com>
> > > ---
> > > In the v3:
> > > - drop the Reviewed-by
> > > - change gpio to GPIO
> > > - change "this GPIO" to "and this GPIO"
> > > - change "so adding" to "so add"
> >
> > There's no need to drop an R-b for grammar changes in a commit message.
>
> Hi Conor,
> The R-b tags were never given in the first place, that is why they are
> removed:
>
> https://lore.kernel.org/all/6b1b0635-304c-48d7-a941-fae30962083a@canonical.com/
lmao, yea that's justified (and probably should've been mentioned).
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Thanks,
Conor.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT
2024-06-12 13:56 ` Lech Perczak
2024-06-12 14:50 ` Hui Wang
@ 2024-06-13 20:45 ` Andy Shevchenko
1 sibling, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2024-06-13 20:45 UTC (permalink / raw)
To: Lech Perczak
Cc: Hui Wang, linux-serial, devicetree, gregkh, jirislaby,
hvilleneuve, robh, krzk+dt, conor+dt, andy, Maarten.Brock
On Wed, Jun 12, 2024 at 3:57 PM Lech Perczak
<lech.perczak@camlingroup.com> wrote:
> W dniu 12.06.2024 o 15:14, Hui Wang pisze:
> > Some boards connect a GPIO to the reset pin, and the reset pin needs
> > to be setup correctly before accessing the chip.
> >
> > Add a function to handle the chip reset. If the reset-gpios is defined
> > in the DT, do hardware reset through this GPIO, othwerwise do software
otherwise
> > reset as before.
...
> > + if (reset_gpio) {
> > + /* The minimum reset pulse width is 3 us. */
> > + udelay(5);
>
> Prefer usleep_range() over that, since maximum reset time isn't all that critical.
For this little sleep the usleep_range() won't gain much. OTOH one may
use flseep() and let the sane default to be used.
> > + gpiod_set_value_cansleep(reset_gpio, 0);
> > + /* Deassert GPIO */
>
> This comment should go one line above or be removed entirely.
>
> > + } else {
> > + /* Software reset */
> > + regmap_write(regmap, SC16IS7XX_IOCONTROL_REG,
> > + SC16IS7XX_IOCONTROL_SRESET_BIT);
> > + }
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-06-13 20:46 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-12 13:14 [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Hui Wang
2024-06-12 13:14 ` [PATCH v3 2/2] serial: sc16is7xx: hardware reset chip if reset-gpios is defined in DT Hui Wang
2024-06-12 13:50 ` Hugo Villeneuve
2024-06-12 14:46 ` Hui Wang
2024-06-12 13:56 ` Lech Perczak
2024-06-12 14:50 ` Hui Wang
2024-06-13 20:45 ` Andy Shevchenko
2024-06-12 16:37 ` [PATCH v3 1/2] dt-bindings: serial: sc16is7xx: add reset-gpios Conor Dooley
2024-06-12 16:49 ` Hugo Villeneuve
2024-06-12 16:58 ` Conor Dooley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox