dsa: Move gpio reset into switch driver
authorAndrew Lunn <andrew@lunn.ch>
Tue, 10 May 2016 21:27:22 +0000 (23:27 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 May 2016 23:36:28 +0000 (19:36 -0400)
Resetting the switch is something the driver does, not the framework.
So move the parsing of this property into the driver.

There are no in kernel users of this property, so moving it does not
break anything. There is however a board which will make use of this
property making its way into the kernel.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/devicetree/bindings/net/dsa/dsa.txt
Documentation/devicetree/bindings/net/dsa/marvell.txt
drivers/net/dsa/mv88e6xxx.c
drivers/net/dsa/mv88e6xxx.h
include/net/dsa.h
net/dsa/dsa.c

index 5fdbbcdf8c4b84109cfeb28d0c77397d0f93aa42..9f4807f90c31f3bf35ed9bc97ce4692bd5204c44 100644 (file)
@@ -31,8 +31,6 @@ A switch child node has the following optional property:
                          switch. Must be set if the switch can not detect
                          the presence and/or size of a connected EEPROM,
                          otherwise optional.
-- reset-gpios          : phandle and specifier to a gpio line connected to
-                         reset pin of the switch chip.
 
 A switch may have multiple "port" children nodes
 
index cdd70cebdea711833fdc1018b3dd1c979686e13b..7629189398aabb80f2b2794b260267a4f6832ed4 100644 (file)
@@ -10,10 +10,17 @@ If you need a stable binding, use the old dsa.txt binding.
 Marvell Switches are MDIO devices. The following properties should be
 placed as a child node of an mdio device.
 
+The properties described here are those specific to Marvell devices.
+Additional required and optional properties can be found in dsa.txt.
+
 Required properties:
 - compatible           : Should be one of "marvell,mv88e6085",
 - reg                  : Address on the MII bus for the switch.
 
+Optional properties:
+
+- reset-gpios          : Should be a gpio specifier for a reset line
+
 Example:
 
        mdio {
@@ -23,5 +30,6 @@ Example:
                switch0: switch@0 {
                        compatible = "marvell,mv88e6085";
                        reg = <0>;
+                      reset-gpios = <&gpio5 1 GPIO_ACTIVE_LOW>;
                };
        };
index ae1cb191a0e0260de9e549fef915303ade62d941..e7e07eb7091dc84218b0c6134db6cb909756dbe5 100644 (file)
@@ -2582,7 +2582,7 @@ static int mv88e6xxx_switch_reset(struct mv88e6xxx_priv_state *ps)
 {
        bool ppu_active = mv88e6xxx_has(ps, MV88E6XXX_FLAG_PPU_ACTIVE);
        u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
-       struct gpio_desc *gpiod = ps->ds->pd->reset;
+       struct gpio_desc *gpiod = ps->reset;
        unsigned long timeout;
        int ret;
        int i;
@@ -3634,6 +3634,7 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev)
        struct mv88e6xxx_priv_state *ps;
        int id, prod_num, rev;
        struct dsa_switch *ds;
+       int err;
 
        ds = devm_kzalloc(dev, sizeof(*ds) + sizeof(*ps), GFP_KERNEL);
        if (!ds)
@@ -3663,6 +3664,17 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev)
        if (!ps->info)
                return -ENODEV;
 
+       ps->reset = devm_gpiod_get(&mdiodev->dev, "reset", GPIOD_ASIS);
+       if (IS_ERR(ps->reset)) {
+               err = PTR_ERR(ps->reset);
+               if (err == -ENOENT) {
+                       /* Optional, so not an error */
+                       ps->reset = NULL;
+               } else {
+                       return err;
+               }
+       }
+
        dev_set_drvdata(dev, ds);
 
        dev_info(dev, "switch 0x%x probed: %s, revision %u\n",
index 5f09a4ea3cc577a105db3fb1ba279e65fc996693..9ef7673f0c61f363207a5c26dd8d4ba87a6ddc3e 100644 (file)
@@ -12,6 +12,7 @@
 #define __MV88E6XXX_H
 
 #include <linux/if_vlan.h>
+#include <linux/gpio/consumer.h>
 
 #ifndef UINT64_MAX
 #define UINT64_MAX             (u64)(~((u64)0))
@@ -595,6 +596,12 @@ struct mv88e6xxx_priv_state {
        DECLARE_BITMAP(port_state_update_mask, DSA_MAX_PORTS);
 
        struct work_struct bridge_work;
+
+       /* A switch may have a GPIO line tied to its reset pin. Parse
+        * this from the device tree, and use it before performing
+        * switch soft reset.
+        */
+       struct gpio_desc *reset;
 };
 
 enum stat_type {
index 8e86af87c84fe812efb9a7cfbb5d9e6d17d8e222..ecb52e265cc3d30d2660e7f8c9737068c8e29bbc 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/timer.h>
 #include <linux/workqueue.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/phy.h>
 #include <linux/phy_fixed.h>
 #include <linux/ethtool.h>
@@ -65,13 +64,6 @@ struct dsa_chip_data {
         * NULL if there is only one switch chip.
         */
        s8              *rtable;
-
-       /*
-        * A switch may have a GPIO line tied to its reset pin. Parse
-        * this from the device tree, and use it before performing
-        * switch soft reset.
-        */
-       struct gpio_desc *reset;
 };
 
 struct dsa_platform_data {
index d61ceed912be0c6490f3826e3e9816097281136c..df169811f26d70061610356c995b26baba02831b 100644 (file)
@@ -659,9 +659,6 @@ static int dsa_of_probe(struct device *dev)
        const char *port_name;
        int chip_index, port_index;
        const unsigned int *sw_addr, *port_reg;
-       int gpio;
-       enum of_gpio_flags of_flags;
-       unsigned long flags;
        u32 eeprom_len;
        int ret;
 
@@ -740,19 +737,6 @@ static int dsa_of_probe(struct device *dev)
                        put_device(cd->host_dev);
                        cd->host_dev = &mdio_bus_switch->dev;
                }
-               gpio = of_get_named_gpio_flags(child, "reset-gpios", 0,
-                                              &of_flags);
-               if (gpio_is_valid(gpio)) {
-                       flags = (of_flags == OF_GPIO_ACTIVE_LOW ?
-                                GPIOF_ACTIVE_LOW : 0);
-                       ret = devm_gpio_request_one(dev, gpio, flags,
-                                                   "switch_reset");
-                       if (ret)
-                               goto out_free_chip;
-
-                       cd->reset = gpio_to_desc(gpio);
-                       gpiod_direction_output(cd->reset, 0);
-               }
 
                for_each_available_child_of_node(child, port) {
                        port_reg = of_get_property(port, "reg", NULL);