Commit f8cd8753 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

dsa: mv88e6xxx: Handle eeprom-length property

A switch can export an attached EEPROM using the standard ethtool API.
However the switch itself cannot determine the size of the EEPROM, and
multiple sizes are allowed. Thus a device tree property is supported
to indicate the length of the EEPROM. Parse this property during
device probe, and implement a callback function to retrieve it.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ff04955c
...@@ -869,6 +869,16 @@ static int mv88e6xxx_read_eeprom_word(struct dsa_switch *ds, int addr) ...@@ -869,6 +869,16 @@ static int mv88e6xxx_read_eeprom_word(struct dsa_switch *ds, int addr)
return ret; return ret;
} }
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
if (mv88e6xxx_has(ps, MV88E6XXX_FLAG_EEPROM))
return ps->eeprom_len;
return 0;
}
static int mv88e6xxx_get_eeprom(struct dsa_switch *ds, static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
struct ethtool_eeprom *eeprom, u8 *data) struct ethtool_eeprom *eeprom, u8 *data)
{ {
...@@ -3610,6 +3620,7 @@ struct dsa_switch_driver mv88e6xxx_switch_driver = { ...@@ -3610,6 +3620,7 @@ struct dsa_switch_driver mv88e6xxx_switch_driver = {
.set_temp_limit = mv88e6xxx_set_temp_limit, .set_temp_limit = mv88e6xxx_set_temp_limit,
.get_temp_alarm = mv88e6xxx_get_temp_alarm, .get_temp_alarm = mv88e6xxx_get_temp_alarm,
#endif #endif
.get_eeprom_len = mv88e6xxx_get_eeprom_len,
.get_eeprom = mv88e6xxx_get_eeprom, .get_eeprom = mv88e6xxx_get_eeprom,
.set_eeprom = mv88e6xxx_set_eeprom, .set_eeprom = mv88e6xxx_set_eeprom,
.get_regs_len = mv88e6xxx_get_regs_len, .get_regs_len = mv88e6xxx_get_regs_len,
...@@ -3631,9 +3642,11 @@ struct dsa_switch_driver mv88e6xxx_switch_driver = { ...@@ -3631,9 +3642,11 @@ struct dsa_switch_driver mv88e6xxx_switch_driver = {
int mv88e6xxx_probe(struct mdio_device *mdiodev) int mv88e6xxx_probe(struct mdio_device *mdiodev)
{ {
struct device *dev = &mdiodev->dev; struct device *dev = &mdiodev->dev;
struct device_node *np = dev->of_node;
struct mv88e6xxx_priv_state *ps; struct mv88e6xxx_priv_state *ps;
int id, prod_num, rev; int id, prod_num, rev;
struct dsa_switch *ds; struct dsa_switch *ds;
u32 eeprom_len;
int err; int err;
ds = devm_kzalloc(dev, sizeof(*ds) + sizeof(*ps), GFP_KERNEL); ds = devm_kzalloc(dev, sizeof(*ds) + sizeof(*ps), GFP_KERNEL);
...@@ -3676,6 +3689,10 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev) ...@@ -3676,6 +3689,10 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev)
} }
} }
if (mv88e6xxx_has(ps, MV88E6XXX_FLAG_EEPROM) &&
!of_property_read_u32(np, "eeprom-length", &eeprom_len))
ps->eeprom_len = eeprom_len;
dev_set_drvdata(dev, ds); dev_set_drvdata(dev, ds);
dev_info(dev, "switch 0x%x probed: %s, revision %u\n", dev_info(dev, "switch 0x%x probed: %s, revision %u\n",
......
...@@ -602,6 +602,9 @@ struct mv88e6xxx_priv_state { ...@@ -602,6 +602,9 @@ struct mv88e6xxx_priv_state {
* switch soft reset. * switch soft reset.
*/ */
struct gpio_desc *reset; struct gpio_desc *reset;
/* set to size of eeprom if supported by the switch */
int eeprom_len;
}; };
enum stat_type { enum stat_type {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment