From: David Mosberger-Tang <hidden> Date: 2021-12-15 03:05:13
The only change in this version is to fix a dt_binding_check error by
including <dt-bindings/gpio/gpio.h> in microchip,wilc1000.yaml.
David Mosberger-Tang (2):
wilc1000: Add reset/enable GPIO support to SPI driver
wilc1000: Document enable-gpios and reset-gpios properties
.../net/wireless/microchip,wilc1000.yaml | 19 ++++++
drivers/net/wireless/microchip/wilc1000/spi.c | 58 ++++++++++++++++++-
.../net/wireless/microchip/wilc1000/wlan.c | 2 +-
3 files changed, 75 insertions(+), 4 deletions(-)
--
2.25.1
From: David Mosberger-Tang <hidden> Date: 2021-12-15 03:05:20
Add documentation for the ENABLE and RESET GPIOs that may be needed by
wilc1000-spi.
Signed-off-by: David Mosberger-Tang <redacted>
---
.../net/wireless/microchip,wilc1000.yaml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
@@ -32,6 +32,21 @@ properties:clock-names:const:rtc+enable-gpios:+maxItems:1+description:Used by wilc1000-spi to determine the GPIO line+connected to the ENABLE line. If specified, reset-gpios+must be specified as well as otherwise the driver cannot+ensure the timing required between asserting ENABLE+and deasserting RESET. This should be declared as an+active-high signal.++reset-gpios:+maxItems:1+description:Used by wilc1000-spi to determine the GPIO line+connected to the RESET line. This should be declared as an+active-low signal.+required:-compatible-interrupts
From: David Mosberger-Tang <hidden> Date: 2021-12-15 03:05:21
For the SDIO driver, the RESET/ENABLE pins of WILC1000 are controlled
through the SDIO power sequence driver. This commit adds analogous
support for the SPI driver. Specifically, during initialization, the
chip will be ENABLEd and taken out of RESET and during
deinitialization, the chip will be placed back into RESET and disabled
(both to reduce power consumption and to ensure the WiFi radio is
off).
Both RESET and ENABLE GPIOs are optional. However, if the ENABLE GPIO
is specified, then the RESET GPIO should normally also be specified as
otherwise there is no way to ensure proper timing of the ENABLE/RESET
sequence.
Signed-off-by: David Mosberger-Tang <redacted>
---
drivers/net/wireless/microchip/wilc1000/spi.c | 58 ++++++++++++++++++-
.../net/wireless/microchip/wilc1000/wlan.c | 2 +-
2 files changed, 56 insertions(+), 4 deletions(-)
@@ -43,6 +44,10 @@ struct wilc_spi {boolprobing_crc;/* true if we're probing chip's CRC config */boolcrc7_enabled;/* true if crc7 is currently enabled */boolcrc16_enabled;/* true if crc16 is currently enabled */+structwilc_gpios{+structgpio_desc*enable;/* ENABLE GPIO or NULL */+structgpio_desc*reset;/* RESET GPIO or NULL */+}gpios;};staticconststructwilc_hif_funcwilc_hif_spi;
@@ -152,6 +157,46 @@ struct wilc_spi_special_cmd_rsp {u8status;}__packed;+staticintwilc_parse_gpios(structwilc*wilc)+{+structspi_device*spi=to_spi_device(wilc->dev);+structwilc_spi*spi_priv=wilc->bus_data;+structwilc_gpios*gpios=&spi_priv->gpios;++/* get ENABLE pin and deassert it (if it is defined): */+gpios->enable=devm_gpiod_get_optional(&spi->dev,+"enable",GPIOD_OUT_LOW);+/* get RESET pin and assert it (if it is defined): */+if(gpios->enable){+/* if enable pin exists, reset must exist as well */+gpios->reset=devm_gpiod_get(&spi->dev,+"reset",GPIOD_OUT_HIGH);+if(IS_ERR(gpios->reset)){+dev_err(&spi->dev,"missing reset gpio.\n");+returnPTR_ERR(gpios->reset);+}+}else{+gpios->reset=devm_gpiod_get_optional(&spi->dev,+"reset",GPIOD_OUT_HIGH);+}+return0;+}++staticvoidwilc_wlan_power(structwilc*wilc,boolon)+{+structwilc_spi*spi_priv=wilc->bus_data;+structwilc_gpios*gpios=&spi_priv->gpios;++if(on){+gpiod_set_value(gpios->enable,1);/* assert ENABLE */+mdelay(5);+gpiod_set_value(gpios->reset,0);/* deassert RESET */+}else{+gpiod_set_value(gpios->reset,1);/* assert RESET */+gpiod_set_value(gpios->enable,0);/* deassert ENABLE */+}+}+staticintwilc_bus_probe(structspi_device*spi){intret;
@@ -171,6 +216,10 @@ static int wilc_bus_probe(struct spi_device *spi)wilc->bus_data=spi_priv;wilc->dev_irq_num=spi->irq;+ret=wilc_parse_gpios(wilc);+if(ret<0)+gotonetdev_cleanup;+wilc->rtc_clk=devm_clk_get_optional(&spi->dev,"rtc");if(IS_ERR(wilc->rtc_clk)){ret=PTR_ERR(wilc->rtc_clk);
@@ -984,9 +1033,10 @@ static int wilc_spi_reset(struct wilc *wilc)staticintwilc_spi_deinit(structwilc*wilc){-/*-*TODO:-*/+structwilc_spi*spi_priv=wilc->bus_data;++spi_priv->isinit=false;+wilc_wlan_power(wilc,false);return0;}
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
The only change in this version is to fix a dt_binding_check error by
including <dt-bindings/gpio/gpio.h> in microchip,wilc1000.yaml.
For future patches, here you should have the full changelog b/w version,
something like:
Changes in v5:
- this
- that
- etc
Changes in v4:
- this, that
...
Changes in v2:
- this, that
David Mosberger-Tang (2):
wilc1000: Add reset/enable GPIO support to SPI driver
wilc1000: Document enable-gpios and reset-gpios properties
.../net/wireless/microchip,wilc1000.yaml | 19 ++++++
drivers/net/wireless/microchip/wilc1000/spi.c | 58 ++++++++++++++++++-
.../net/wireless/microchip/wilc1000/wlan.c | 2 +-
3 files changed, 75 insertions(+), 4 deletions(-)
--
2.25.1
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
For the SDIO driver, the RESET/ENABLE pins of WILC1000 are controlled
through the SDIO power sequence driver. This commit adds analogous
support for the SPI driver. Specifically, during initialization, the
chip will be ENABLEd and taken out of RESET and during
deinitialization, the chip will be placed back into RESET and disabled
(both to reduce power consumption and to ensure the WiFi radio is
off).
Both RESET and ENABLE GPIOs are optional. However, if the ENABLE GPIO
is specified, then the RESET GPIO should normally also be specified as
otherwise there is no way to ensure proper timing of the ENABLE/RESET
sequence.
Signed-off-by: David Mosberger-Tang <redacted>
---
drivers/net/wireless/microchip/wilc1000/spi.c | 58 ++++++++++++++++++-
.../net/wireless/microchip/wilc1000/wlan.c | 2 +-
2 files changed, 56 insertions(+), 4 deletions(-)
@@ -43,6 +44,10 @@ struct wilc_spi {boolprobing_crc;/* true if we're probing chip's CRC config */boolcrc7_enabled;/* true if crc7 is currently enabled */boolcrc16_enabled;/* true if crc16 is currently enabled */+structwilc_gpios{+structgpio_desc*enable;/* ENABLE GPIO or NULL */+structgpio_desc*reset;/* RESET GPIO or NULL */+}gpios;};staticconststructwilc_hif_funcwilc_hif_spi;
@@ -152,6 +157,46 @@ struct wilc_spi_special_cmd_rsp {u8status;}__packed;+staticintwilc_parse_gpios(structwilc*wilc)+{+structspi_device*spi=to_spi_device(wilc->dev);+structwilc_spi*spi_priv=wilc->bus_data;+structwilc_gpios*gpios=&spi_priv->gpios;++/* get ENABLE pin and deassert it (if it is defined): */+gpios->enable=devm_gpiod_get_optional(&spi->dev,+"enable",GPIOD_OUT_LOW);+/* get RESET pin and assert it (if it is defined): */+if(gpios->enable){+/* if enable pin exists, reset must exist as well */+gpios->reset=devm_gpiod_get(&spi->dev,+"reset",GPIOD_OUT_HIGH);
As far as I can tell form gpiolib code the difference b/w GPIOD_OUT_HIGH
and GPIOD_OUT_LOW in gpiolib is related to the initial value for the GPIO.
Did you used GPIOD_OUT_HIGH for reset to have the chip out of reset at this
point?
From what I can tell from gpiolib code, requesting the pin from device tree
with:
+ reset-gpios = <&pioA 6 GPIO_ACTIVE_LOW>;
makes the value written with gpiod_set_value() to be negated, thus the 0
written here is translated to a 1 on the pin. Is there a reason you did it
like this? Would it have been simpler to have both pins requested with
GPIO_ACTIVE_HIGH and here to do gpiod_set_value(gpio, 1) for both of the
pin. In this way, at the first read of the code one one would have been
telling that it does what datasheet specifies: for power on toggle enable
and reset gpios from 0 to 1 with a delay in between.
I don't usually see comments near the code line in kernel. Maybe move them
before the actual code line or remove them at all as the code is impler enough?
quoted hunk
+ }+}+ static int wilc_bus_probe(struct spi_device *spi) { int ret;
@@ -171,6 +216,10 @@ static int wilc_bus_probe(struct spi_device *spi) wilc->bus_data = spi_priv; wilc->dev_irq_num = spi->irq;+ ret = wilc_parse_gpios(wilc);+ if (ret < 0)+ goto netdev_cleanup;+ wilc->rtc_clk = devm_clk_get_optional(&spi->dev, "rtc"); if (IS_ERR(wilc->rtc_clk)) { ret = PTR_ERR(wilc->rtc_clk);
From: David Mosberger-Tang <hidden> Date: 2021-12-15 14:48:46
On Wed, 2021-12-15 at 05:37 +0000, Claudiu.Beznea@microchip.com wrote:
On 15.12.2021 05:05, David Mosberger-Tang wrote:
quoted
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
The only change in this version is to fix a dt_binding_check error by
including <dt-bindings/gpio/gpio.h> in microchip,wilc1000.yaml.
For future patches, here you should have the full changelog b/w version,
something like:
Changes in v5:
- this
- that
- etc
Changes in v4:
- this, that
...
Changes in v2:
- this, that
Sure, I can do that going forward.
Thanks,
--david
From: David Mosberger-Tang <hidden> Date: 2021-12-15 14:59:30
On Wed, 2021-12-15 at 06:41 +0000, Claudiu.Beznea@microchip.com wrote:
On 15.12.2021 05:05, David Mosberger-Tang wrote:
quoted
+static int wilc_parse_gpios(struct wilc *wilc)
quoted
+{+ struct spi_device *spi = to_spi_device(wilc->dev);+ struct wilc_spi *spi_priv = wilc->bus_data;+ struct wilc_gpios *gpios = &spi_priv->gpios;++ /* get ENABLE pin and deassert it (if it is defined): */+ gpios->enable = devm_gpiod_get_optional(&spi->dev,+ "enable", GPIOD_OUT_LOW);+ /* get RESET pin and assert it (if it is defined): */+ if (gpios->enable) {+ /* if enable pin exists, reset must exist as well */+ gpios->reset = devm_gpiod_get(&spi->dev,+ "reset", GPIOD_OUT_HIGH);
As far as I can tell form gpiolib code the difference b/w GPIOD_OUT_HIGH
and GPIOD_OUT_LOW in gpiolib is related to the initial value for the GPIO.
Yes.
Did you used GPIOD_OUT_HIGH for reset to have the chip out of reset at this
point?
No, ~RESET is an active-low signal. GPIOD_OUT_LOW should really be
called GPIOD_OUT_DEASSERTED or something like that. The code ensures
that the chip is in RESET and ~ENABLEd after parsing the GPIOs.
From what I can tell from gpiolib code, requesting the pin from device tree
with:
+ reset-gpios = <&pioA 6 GPIO_ACTIVE_LOW>;
makes the value written with gpiod_set_value() to be negated, thus the 0
written here is translated to a 1 on the pin. Is there a reason you did it
like this?
Yes, of course. RESET is an active-low signal, as defined in the
datasheet.
Would it have been simpler to have both pins requested with
GPIO_ACTIVE_HIGH and here to do gpiod_set_value(gpio, 1) for both of the
pin. In this way, at the first read of the code one one would have been
telling that it does what datasheet specifies: for power on toggle enable
and reset gpios from 0 to 1 with a delay in between.
I think you're confusing 0 and 1 with low-voltage and high-voltage. 0
means de-assert the signal, 1 means assert the signal. Whether that
translates to a low voltage or a high voltage depends on whether the
signal a active-low or active-high.
I don't usually see comments near the code line in kernel. Maybe move them
before the actual code line or remove them at all as the code is impler enough?
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
On Wed, 2021-12-15 at 06:41 +0000, Claudiu.Beznea@microchip.com wrote:
quoted
On 15.12.2021 05:05, David Mosberger-Tang wrote:
quoted
+static int wilc_parse_gpios(struct wilc *wilc)
quoted
+{+ struct spi_device *spi = to_spi_device(wilc->dev);+ struct wilc_spi *spi_priv = wilc->bus_data;+ struct wilc_gpios *gpios = &spi_priv->gpios;++ /* get ENABLE pin and deassert it (if it is defined): */+ gpios->enable = devm_gpiod_get_optional(&spi->dev,+ "enable", GPIOD_OUT_LOW);+ /* get RESET pin and assert it (if it is defined): */+ if (gpios->enable) {+ /* if enable pin exists, reset must exist as well */+ gpios->reset = devm_gpiod_get(&spi->dev,+ "reset", GPIOD_OUT_HIGH);
As far as I can tell form gpiolib code the difference b/w GPIOD_OUT_HIGH
and GPIOD_OUT_LOW in gpiolib is related to the initial value for the GPIO.
Yes.
quoted
Did you used GPIOD_OUT_HIGH for reset to have the chip out of reset at this
point?
No, ~RESET is an active-low signal. GPIOD_OUT_LOW should really be
called GPIOD_OUT_DEASSERTED or something like that. The code ensures
that the chip is in RESET and ~ENABLEd after parsing the GPIOs.
From what I can tell from gpiolib code, requesting the pin from device tree
with:
+ reset-gpios = <&pioA 6 GPIO_ACTIVE_LOW>;
makes the value written with gpiod_set_value() to be negated, thus the 0
written here is translated to a 1 on the pin. Is there a reason you did it
like this?
Yes, of course. RESET is an active-low signal, as defined in the
datasheet.
Right, I missed that.
quoted
Would it have been simpler to have both pins requested with
GPIO_ACTIVE_HIGH and here to do gpiod_set_value(gpio, 1) for both of the
pin. In this way, at the first read of the code one one would have been
telling that it does what datasheet specifies: for power on toggle enable
and reset gpios from 0 to 1 with a delay in between.
I think you're confusing 0 and 1 with low-voltage and high-voltage. 0
means de-assert the signal, 1 means assert the signal. Whether that
translates to a low voltage or a high voltage depends on whether the
signal a active-low or active-high.
I don't usually see comments near the code line in kernel. Maybe move them
before the actual code line or remove them at all as the code is impler enough?
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
The only change in this version is to fix a dt_binding_check error by
including <dt-bindings/gpio/gpio.h> in microchip,wilc1000.yaml.
David Mosberger-Tang (2):
wilc1000: Add reset/enable GPIO support to SPI driver
wilc1000: Document enable-gpios and reset-gpios properties
.../net/wireless/microchip,wilc1000.yaml | 19 ++++++
drivers/net/wireless/microchip/wilc1000/spi.c | 58 ++++++++++++++++++-
.../net/wireless/microchip/wilc1000/wlan.c | 2 +-
3 files changed, 75 insertions(+), 4 deletions(-)
--
2.25.1
Comments are clarified, you can add my:
Reviewed-by: Claudiu Beznea <redacted>
From: Rob Herring <robh@kernel.org> Date: 2021-12-16 19:00:38
On Wed, 15 Dec 2021 03:05:12 +0000, David Mosberger-Tang wrote:
Add documentation for the ENABLE and RESET GPIOs that may be needed by
wilc1000-spi.
Signed-off-by: David Mosberger-Tang <redacted>
---
.../net/wireless/microchip,wilc1000.yaml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)