]> git.itanic.dy.fi Git - linux-stable/commitdiff
staging: wfx: add proper "compatible" string
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Tue, 11 Feb 2020 10:35:02 +0000 (11:35 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Apr 2020 09:00:25 +0000 (11:00 +0200)
commit eec6e3ee636ec3adaa85ebe4b4acaacfcf06277e upstream.

Add "compatible" string matching "vendor,chip" template and proper
GPIO flags handling. Keep support for old name and reset polarity
for older devicetrees.

Cc: stable@vger.kernel.org # d3a5bcb4a17f ("gpio: add gpiod_toggle_active_low()")
Cc: stable@vger.kernel.org
Fixes: 0096214a59a7 ("staging: wfx: add support for I/O access")
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Link: https://lore.kernel.org/r/0e6dda06f145676861860f073a53dc95987c7ab5.1581416843.git.mirq-linux@rere.qmqm.pl
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/Documentation/devicetree/bindings/net/wireless/siliabs,wfx.txt
drivers/staging/wfx/bus_spi.c

index 26de6762b94241959effee09ca1b5ed233f52da8..52f97673da1e0782581ffaa34197d0164dc3bac3 100644 (file)
@@ -6,7 +6,7 @@ SPI
 You have to declare the WFxxx chip in your device tree.
 
 Required properties:
- - compatible: Should be "silabs,wfx-spi"
+ - compatible: Should be "silabs,wf200"
  - reg: Chip select address of device
  - spi-max-frequency: Maximum SPI clocking speed of device in Hz
  - interrupts-extended: Should contain interrupt line (interrupt-parent +
@@ -15,6 +15,7 @@ Required properties:
 Optional properties:
  - reset-gpios: phandle of gpio that will be used to reset chip during probe.
    Without this property, you may encounter issues with warm boot.
+   (Legacy: when compatible == "silabs,wfx-spi", the gpio is inverted.)
 
 Please consult Documentation/devicetree/bindings/spi/spi-bus.txt for optional
 SPI connection related properties,
@@ -23,12 +24,12 @@ Example:
 
 &spi1 {
        wfx {
-               compatible = "silabs,wfx-spi";
+               compatible = "silabs,wf200";
                pinctrl-names = "default";
                pinctrl-0 = <&wfx_irq &wfx_gpios>;
                interrupts-extended = <&gpio 16 IRQ_TYPE_EDGE_RISING>;
                wakeup-gpios = <&gpio 12 GPIO_ACTIVE_HIGH>;
-               reset-gpios = <&gpio 13 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
                reg = <0>;
                spi-max-frequency = <42000000>;
        };
index ab0cda1e124f37f43bad34c72c570010f327c89c..7c2cf2e8228f596c1039f03b1a11d7318764c49a 100644 (file)
@@ -27,6 +27,8 @@ MODULE_PARM_DESC(gpio_reset, "gpio number for reset. -1 for none.");
 #define SET_WRITE 0x7FFF        /* usage: and operation */
 #define SET_READ 0x8000         /* usage: or operation */
 
+#define WFX_RESET_INVERTED 1
+
 static const struct wfx_platform_data wfx_spi_pdata = {
        .file_fw = "wfm_wf200",
        .file_pds = "wf200.pds",
@@ -199,9 +201,11 @@ static int wfx_spi_probe(struct spi_device *func)
        if (!bus->gpio_reset) {
                dev_warn(&func->dev, "try to load firmware anyway\n");
        } else {
-               gpiod_set_value(bus->gpio_reset, 0);
-               udelay(100);
+               if (spi_get_device_id(func)->driver_data & WFX_RESET_INVERTED)
+                       gpiod_toggle_active_low(bus->gpio_reset);
                gpiod_set_value(bus->gpio_reset, 1);
+               udelay(100);
+               gpiod_set_value(bus->gpio_reset, 0);
                udelay(2000);
        }
 
@@ -243,14 +247,16 @@ static int wfx_spi_disconnect(struct spi_device *func)
  * stripped.
  */
 static const struct spi_device_id wfx_spi_id[] = {
-       { "wfx-spi", 0 },
+       { "wfx-spi", WFX_RESET_INVERTED },
+       { "wf200", 0 },
        { },
 };
 MODULE_DEVICE_TABLE(spi, wfx_spi_id);
 
 #ifdef CONFIG_OF
 static const struct of_device_id wfx_spi_of_match[] = {
-       { .compatible = "silabs,wfx-spi" },
+       { .compatible = "silabs,wfx-spi", .data = (void *)WFX_RESET_INVERTED },
+       { .compatible = "silabs,wf200" },
        { },
 };
 MODULE_DEVICE_TABLE(of, wfx_spi_of_match);