Merge branch 'mv88e6171_temps'
Andrew Lunn says: ==================== Add temperature reading and registers dump to mv88e6171 These patches centralize the temperature sensor reading code, and then make use of it with the mv88e6171 which has a compatible sensor. Additionally, support is added for reading the mv88e6171 via ethtool. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
ca24502434
|
@ -291,54 +291,6 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NET_DSA_HWMON
|
|
||||||
|
|
||||||
static int mv88e6123_61_65_get_temp(struct dsa_switch *ds, int *temp)
|
|
||||||
{
|
|
||||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
|
||||||
int ret;
|
|
||||||
int val;
|
|
||||||
|
|
||||||
*temp = 0;
|
|
||||||
|
|
||||||
mutex_lock(&ps->phy_mutex);
|
|
||||||
|
|
||||||
ret = mv88e6xxx_phy_write(ds, 0x0, 0x16, 0x6);
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* Enable temperature sensor */
|
|
||||||
ret = mv88e6xxx_phy_read(ds, 0x0, 0x1a);
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
ret = mv88e6xxx_phy_write(ds, 0x0, 0x1a, ret | (1 << 5));
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* Wait for temperature to stabilize */
|
|
||||||
usleep_range(10000, 12000);
|
|
||||||
|
|
||||||
val = mv88e6xxx_phy_read(ds, 0x0, 0x1a);
|
|
||||||
if (val < 0) {
|
|
||||||
ret = val;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable temperature sensor */
|
|
||||||
ret = mv88e6xxx_phy_write(ds, 0x0, 0x1a, ret & ~(1 << 5));
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
*temp = ((val & 0x1f) - 5) * 5;
|
|
||||||
|
|
||||||
error:
|
|
||||||
mv88e6xxx_phy_write(ds, 0x0, 0x16, 0x0);
|
|
||||||
mutex_unlock(&ps->phy_mutex);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_NET_DSA_HWMON */
|
|
||||||
|
|
||||||
static int mv88e6123_61_65_setup(struct dsa_switch *ds)
|
static int mv88e6123_61_65_setup(struct dsa_switch *ds)
|
||||||
{
|
{
|
||||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||||
|
@ -471,7 +423,7 @@ struct dsa_switch_driver mv88e6123_61_65_switch_driver = {
|
||||||
.get_ethtool_stats = mv88e6123_61_65_get_ethtool_stats,
|
.get_ethtool_stats = mv88e6123_61_65_get_ethtool_stats,
|
||||||
.get_sset_count = mv88e6123_61_65_get_sset_count,
|
.get_sset_count = mv88e6123_61_65_get_sset_count,
|
||||||
#ifdef CONFIG_NET_DSA_HWMON
|
#ifdef CONFIG_NET_DSA_HWMON
|
||||||
.get_temp = mv88e6123_61_65_get_temp,
|
.get_temp = mv88e6xxx_get_temp,
|
||||||
#endif
|
#endif
|
||||||
.get_regs_len = mv88e6xxx_get_regs_len,
|
.get_regs_len = mv88e6xxx_get_regs_len,
|
||||||
.get_regs = mv88e6xxx_get_regs,
|
.get_regs = mv88e6xxx_get_regs,
|
||||||
|
|
|
@ -316,6 +316,8 @@ static int mv88e6171_setup(struct dsa_switch *ds)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_init(&ps->phy_mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,18 +331,28 @@ static int mv88e6171_port_to_phy_addr(int port)
|
||||||
static int
|
static int
|
||||||
mv88e6171_phy_read(struct dsa_switch *ds, int port, int regnum)
|
mv88e6171_phy_read(struct dsa_switch *ds, int port, int regnum)
|
||||||
{
|
{
|
||||||
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||||
int addr = mv88e6171_port_to_phy_addr(port);
|
int addr = mv88e6171_port_to_phy_addr(port);
|
||||||
|
int ret;
|
||||||
|
|
||||||
return mv88e6xxx_phy_read(ds, addr, regnum);
|
mutex_lock(&ps->phy_mutex);
|
||||||
|
ret = mv88e6xxx_phy_read(ds, addr, regnum);
|
||||||
|
mutex_unlock(&ps->phy_mutex);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mv88e6171_phy_write(struct dsa_switch *ds,
|
mv88e6171_phy_write(struct dsa_switch *ds,
|
||||||
int port, int regnum, u16 val)
|
int port, int regnum, u16 val)
|
||||||
{
|
{
|
||||||
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||||
int addr = mv88e6171_port_to_phy_addr(port);
|
int addr = mv88e6171_port_to_phy_addr(port);
|
||||||
|
int ret;
|
||||||
|
|
||||||
return mv88e6xxx_phy_write(ds, addr, regnum, val);
|
mutex_lock(&ps->phy_mutex);
|
||||||
|
ret = mv88e6xxx_phy_write(ds, addr, regnum, val);
|
||||||
|
mutex_unlock(&ps->phy_mutex);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct mv88e6xxx_hw_stat mv88e6171_hw_stats[] = {
|
static struct mv88e6xxx_hw_stat mv88e6171_hw_stats[] = {
|
||||||
|
@ -408,6 +420,11 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
|
||||||
.get_strings = mv88e6171_get_strings,
|
.get_strings = mv88e6171_get_strings,
|
||||||
.get_ethtool_stats = mv88e6171_get_ethtool_stats,
|
.get_ethtool_stats = mv88e6171_get_ethtool_stats,
|
||||||
.get_sset_count = mv88e6171_get_sset_count,
|
.get_sset_count = mv88e6171_get_sset_count,
|
||||||
|
#ifdef CONFIG_NET_DSA_HWMON
|
||||||
|
.get_temp = mv88e6xxx_get_temp,
|
||||||
|
#endif
|
||||||
|
.get_regs_len = mv88e6xxx_get_regs_len,
|
||||||
|
.get_regs = mv88e6xxx_get_regs,
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_ALIAS("platform:mv88e6171");
|
MODULE_ALIAS("platform:mv88e6171");
|
||||||
|
|
|
@ -539,6 +539,54 @@ void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_DSA_HWMON
|
||||||
|
|
||||||
|
int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
|
||||||
|
{
|
||||||
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||||
|
int ret;
|
||||||
|
int val;
|
||||||
|
|
||||||
|
*temp = 0;
|
||||||
|
|
||||||
|
mutex_lock(&ps->phy_mutex);
|
||||||
|
|
||||||
|
ret = mv88e6xxx_phy_write(ds, 0x0, 0x16, 0x6);
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* Enable temperature sensor */
|
||||||
|
ret = mv88e6xxx_phy_read(ds, 0x0, 0x1a);
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
ret = mv88e6xxx_phy_write(ds, 0x0, 0x1a, ret | (1 << 5));
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* Wait for temperature to stabilize */
|
||||||
|
usleep_range(10000, 12000);
|
||||||
|
|
||||||
|
val = mv88e6xxx_phy_read(ds, 0x0, 0x1a);
|
||||||
|
if (val < 0) {
|
||||||
|
ret = val;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable temperature sensor */
|
||||||
|
ret = mv88e6xxx_phy_write(ds, 0x0, 0x1a, ret & ~(1 << 5));
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
*temp = ((val & 0x1f) - 5) * 5;
|
||||||
|
|
||||||
|
error:
|
||||||
|
mv88e6xxx_phy_write(ds, 0x0, 0x16, 0x0);
|
||||||
|
mutex_unlock(&ps->phy_mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_NET_DSA_HWMON */
|
||||||
|
|
||||||
static int __init mv88e6xxx_init(void)
|
static int __init mv88e6xxx_init(void)
|
||||||
{
|
{
|
||||||
#if IS_ENABLED(CONFIG_NET_DSA_MV88E6131)
|
#if IS_ENABLED(CONFIG_NET_DSA_MV88E6131)
|
||||||
|
|
|
@ -81,6 +81,7 @@ void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
|
||||||
int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port);
|
int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port);
|
||||||
void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
|
void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
|
||||||
struct ethtool_regs *regs, void *_p);
|
struct ethtool_regs *regs, void *_p);
|
||||||
|
int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp);
|
||||||
|
|
||||||
extern struct dsa_switch_driver mv88e6131_switch_driver;
|
extern struct dsa_switch_driver mv88e6131_switch_driver;
|
||||||
extern struct dsa_switch_driver mv88e6123_61_65_switch_driver;
|
extern struct dsa_switch_driver mv88e6123_61_65_switch_driver;
|
||||||
|
|
Loading…
Reference in New Issue