|
@@ -2964,154 +2964,6 @@ static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
|
|
|
of_node_put(chip->mdio_np);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_NET_DSA_HWMON
|
|
|
-
|
|
|
-static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
- u16 val;
|
|
|
- int ret;
|
|
|
-
|
|
|
- *temp = 0;
|
|
|
-
|
|
|
- mutex_lock(&chip->reg_lock);
|
|
|
-
|
|
|
- ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
|
|
|
- if (ret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- /* Enable temperature sensor */
|
|
|
- ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
|
|
|
- if (ret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
|
|
|
- if (ret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- /* Wait for temperature to stabilize */
|
|
|
- usleep_range(10000, 12000);
|
|
|
-
|
|
|
- ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
|
|
|
- if (ret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- /* Disable temperature sensor */
|
|
|
- ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
|
|
|
- if (ret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- *temp = ((val & 0x1f) - 5) * 5;
|
|
|
-
|
|
|
-error:
|
|
|
- mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
|
|
|
- mutex_unlock(&chip->reg_lock);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
- int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
|
|
|
- u16 val;
|
|
|
- int ret;
|
|
|
-
|
|
|
- *temp = 0;
|
|
|
-
|
|
|
- mutex_lock(&chip->reg_lock);
|
|
|
- ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
|
|
|
- mutex_unlock(&chip->reg_lock);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- *temp = (val & 0xff) - 25;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
-
|
|
|
- if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
|
|
|
- return -EOPNOTSUPP;
|
|
|
-
|
|
|
- if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
|
|
|
- return mv88e63xx_get_temp(ds, temp);
|
|
|
-
|
|
|
- return mv88e61xx_get_temp(ds, temp);
|
|
|
-}
|
|
|
-
|
|
|
-static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
- int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
|
|
|
- u16 val;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
|
|
|
- return -EOPNOTSUPP;
|
|
|
-
|
|
|
- *temp = 0;
|
|
|
-
|
|
|
- mutex_lock(&chip->reg_lock);
|
|
|
- ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
|
|
|
- mutex_unlock(&chip->reg_lock);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- *temp = (((val >> 8) & 0x1f) * 5) - 25;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
- int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
|
|
|
- u16 val;
|
|
|
- int err;
|
|
|
-
|
|
|
- if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
|
|
|
- return -EOPNOTSUPP;
|
|
|
-
|
|
|
- mutex_lock(&chip->reg_lock);
|
|
|
- err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
|
|
|
- if (err)
|
|
|
- goto unlock;
|
|
|
- temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
|
|
|
- err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
|
|
|
- (val & 0xe0ff) | (temp << 8));
|
|
|
-unlock:
|
|
|
- mutex_unlock(&chip->reg_lock);
|
|
|
-
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
-static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
|
|
|
-{
|
|
|
- struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
- int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
|
|
|
- u16 val;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
|
|
|
- return -EOPNOTSUPP;
|
|
|
-
|
|
|
- *alarm = false;
|
|
|
-
|
|
|
- mutex_lock(&chip->reg_lock);
|
|
|
- ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
|
|
|
- mutex_unlock(&chip->reg_lock);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- *alarm = !!(val & 0x40);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif /* CONFIG_NET_DSA_HWMON */
|
|
|
-
|
|
|
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
|
|
|
{
|
|
|
struct mv88e6xxx_chip *chip = ds->priv;
|
|
@@ -4386,12 +4238,6 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
|
|
|
.get_sset_count = mv88e6xxx_get_sset_count,
|
|
|
.set_eee = mv88e6xxx_set_eee,
|
|
|
.get_eee = mv88e6xxx_get_eee,
|
|
|
-#ifdef CONFIG_NET_DSA_HWMON
|
|
|
- .get_temp = mv88e6xxx_get_temp,
|
|
|
- .get_temp_limit = mv88e6xxx_get_temp_limit,
|
|
|
- .set_temp_limit = mv88e6xxx_set_temp_limit,
|
|
|
- .get_temp_alarm = mv88e6xxx_get_temp_alarm,
|
|
|
-#endif
|
|
|
.get_eeprom_len = mv88e6xxx_get_eeprom_len,
|
|
|
.get_eeprom = mv88e6xxx_get_eeprom,
|
|
|
.set_eeprom = mv88e6xxx_set_eeprom,
|