Skip to content

Commit

Permalink
dsa: Move gpio reset into switch driver
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
lunn authored and davem330 committed May 11, 2016
1 parent 14c7b3c commit 52638f7
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 27 deletions.
2 changes: 0 additions & 2 deletions Documentation/devicetree/bindings/net/dsa/dsa.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 8 additions & 0 deletions Documentation/devicetree/bindings/net/dsa/marvell.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -23,5 +30,6 @@ Example:
switch0: switch@0 {
compatible = "marvell,mv88e6085";
reg = <0>;
reset-gpios = <&gpio5 1 GPIO_ACTIVE_LOW>;
};
};
14 changes: 13 additions & 1 deletion drivers/net/dsa/mv88e6xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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",
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/dsa/mv88e6xxx.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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 {
Expand Down
8 changes: 0 additions & 8 deletions include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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 {
Expand Down
16 changes: 0 additions & 16 deletions net/dsa/dsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 52638f7

Please sign in to comment.