Commit 109e505a authored by Ryder Lee's avatar Ryder Lee Committed by Felix Fietkau

mt76: mt7615: add thermal sensor device support

Similar to mt7915, switching to use standard hwmon sysfs.
For reading temperature, cat /sys/class/ieee80211/phy*/hwmon*/temp1_input
Signed-off-by: default avatarRyder Lee <ryder.lee@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 34b877d9
...@@ -319,24 +319,6 @@ mt7615_radio_read(struct seq_file *s, void *data) ...@@ -319,24 +319,6 @@ mt7615_radio_read(struct seq_file *s, void *data)
return 0; return 0;
} }
static int mt7615_read_temperature(struct seq_file *s, void *data)
{
struct mt7615_dev *dev = dev_get_drvdata(s->private);
int temp;
if (!mt7615_wait_for_mcu_init(dev))
return 0;
/* cpu */
mt7615_mutex_acquire(dev);
temp = mt7615_mcu_get_temperature(dev, 0);
mt7615_mutex_release(dev);
seq_printf(s, "Temperature: %d\n", temp);
return 0;
}
static int static int
mt7615_queues_acq(struct seq_file *s, void *data) mt7615_queues_acq(struct seq_file *s, void *data)
{ {
...@@ -566,8 +548,6 @@ int mt7615_init_debugfs(struct mt7615_dev *dev) ...@@ -566,8 +548,6 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
debugfs_create_file("reset_test", 0200, dir, dev, debugfs_create_file("reset_test", 0200, dir, dev,
&fops_reset_test); &fops_reset_test);
debugfs_create_devm_seqfile(dev->mt76.dev, "temperature", dir,
mt7615_read_temperature);
debugfs_create_file("ext_mac_addr", 0600, dir, dev, &fops_ext_mac_addr); debugfs_create_file("ext_mac_addr", 0600, dir, dev, &fops_ext_mac_addr);
debugfs_create_u32("rf_wfidx", 0600, dir, &dev->debugfs_rf_wf); debugfs_create_u32("rf_wfidx", 0600, dir, &dev->debugfs_rf_wf);
......
...@@ -8,11 +8,61 @@ ...@@ -8,11 +8,61 @@
*/ */
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include "mt7615.h" #include "mt7615.h"
#include "mac.h" #include "mac.h"
#include "mcu.h" #include "mcu.h"
#include "eeprom.h" #include "eeprom.h"
static ssize_t mt7615_thermal_show_temp(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct mt7615_dev *mdev = dev_get_drvdata(dev);
int temperature;
if (!mt7615_wait_for_mcu_init(mdev))
return 0;
mt7615_mutex_acquire(mdev);
temperature = mt7615_mcu_get_temperature(mdev);
mt7615_mutex_release(mdev);
if (temperature < 0)
return temperature;
/* display in millidegree celcius */
return sprintf(buf, "%u\n", temperature * 1000);
}
static SENSOR_DEVICE_ATTR(temp1_input, 0444, mt7615_thermal_show_temp,
NULL, 0);
static struct attribute *mt7615_hwmon_attrs[] = {
&sensor_dev_attr_temp1_input.dev_attr.attr,
NULL,
};
ATTRIBUTE_GROUPS(mt7615_hwmon);
int mt7615_thermal_init(struct mt7615_dev *dev)
{
struct wiphy *wiphy = mt76_hw(dev)->wiphy;
struct device *hwmon;
if (!IS_REACHABLE(CONFIG_HWMON))
return 0;
hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev,
wiphy_name(wiphy), dev,
mt7615_hwmon_groups);
if (IS_ERR(hwmon))
return PTR_ERR(hwmon);
return 0;
}
EXPORT_SYMBOL_GPL(mt7615_thermal_init);
static void static void
mt7615_phy_init(struct mt7615_dev *dev) mt7615_phy_init(struct mt7615_dev *dev)
{ {
......
...@@ -2350,14 +2350,12 @@ int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd) ...@@ -2350,14 +2350,12 @@ int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true); return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
} }
int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index) int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
{ {
struct { struct {
u8 action; u8 action;
u8 rsv[3]; u8 rsv[3];
} req = { } req = {};
.action = index,
};
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req, return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
sizeof(req), true); sizeof(req), true);
......
...@@ -360,6 +360,7 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev) ...@@ -360,6 +360,7 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev)
} }
#endif #endif
int mt7615_thermal_init(struct mt7615_dev *dev);
int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base, int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
int irq, const u32 *map); int irq, const u32 *map);
u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr); u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr);
...@@ -498,7 +499,7 @@ u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg); ...@@ -498,7 +499,7 @@ u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg);
int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val); int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val);
int mt7615_mcu_set_dbdc(struct mt7615_dev *dev); int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);
int mt7615_mcu_set_eeprom(struct mt7615_dev *dev); int mt7615_mcu_set_eeprom(struct mt7615_dev *dev);
int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index); int mt7615_mcu_get_temperature(struct mt7615_dev *dev);
int mt7615_mcu_set_tx_power(struct mt7615_phy *phy); int mt7615_mcu_set_tx_power(struct mt7615_phy *phy);
void mt7615_mcu_exit(struct mt7615_dev *dev); void mt7615_mcu_exit(struct mt7615_dev *dev);
void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
......
...@@ -152,6 +152,10 @@ int mt7615_register_device(struct mt7615_dev *dev) ...@@ -152,6 +152,10 @@ int mt7615_register_device(struct mt7615_dev *dev)
if (ret) if (ret)
return ret; return ret;
ret = mt7615_thermal_init(dev);
if (ret)
return ret;
ieee80211_queue_work(mt76_hw(dev), &dev->mcu_work); ieee80211_queue_work(mt76_hw(dev), &dev->mcu_work);
mt7615_init_txpower(dev, &dev->mphy.sband_2g.sband); mt7615_init_txpower(dev, &dev->mphy.sband_2g.sband);
mt7615_init_txpower(dev, &dev->mphy.sband_5g.sband); mt7615_init_txpower(dev, &dev->mphy.sband_5g.sband);
......
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