mt76: mt7615: add thermal sensor device support
authorRyder Lee <ryder.lee@mediatek.com>
Fri, 23 Apr 2021 22:02:06 +0000 (06:02 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 07:22:45 +0000 (09:22 +0200)
Similar to mt7915, switching to use standard hwmon sysfs.
For reading temperature, cat /sys/class/ieee80211/phy*/hwmon*/temp1_input

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c

index 676bb22726d6402320294362e0e2fac6388a4b7b..8cb4426e757c58ac3cb0785612beec0fb39b7886 100644 (file)
@@ -319,24 +319,6 @@ mt7615_radio_read(struct seq_file *s, void *data)
        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
 mt7615_queues_acq(struct seq_file *s, void *data)
 {
@@ -566,8 +548,6 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
 
        debugfs_create_file("reset_test", 0200, dir, dev,
                            &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_u32("rf_wfidx", 0600, dir, &dev->debugfs_rf_wf);
index ecc3ca9eb6580783268e3ed59805cb184179ba29..4aa7877a638310daa81b234f6b8bc1cf28092494 100644 (file)
@@ -8,11 +8,61 @@
  */
 
 #include <linux/etherdevice.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
 #include "mt7615.h"
 #include "mac.h"
 #include "mcu.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
 mt7615_phy_init(struct mt7615_dev *dev)
 {
index 32090e01b4d21725258943fa43b2ddf1f4d9a4d0..a59bd7af81be2d5a746abb6a5f706e510daee181 100644 (file)
@@ -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);
 }
 
-int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
+int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
 {
        struct {
                u8 action;
                u8 rsv[3];
-       } req = {
-               .action = index,
-       };
+       } req = {};
 
        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
                                 sizeof(req), true);
index 2ba86bd96a3183ea4b2a6e01ebca4f9d8ec341da..8f03dddba8cf273096b97bcdd4240d01bd2b4a33 100644 (file)
@@ -360,6 +360,7 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev)
 }
 #endif
 
+int mt7615_thermal_init(struct mt7615_dev *dev);
 int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
                      int irq, const u32 *map);
 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);
 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_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);
 void mt7615_mcu_exit(struct mt7615_dev *dev);
 void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
index 273fda08bfa25bbbc7922805257639f09d4f26a8..261cff78de40c6b16f6ad81a162e0578b8ac3b49 100644 (file)
@@ -152,6 +152,10 @@ int mt7615_register_device(struct mt7615_dev *dev)
        if (ret)
                return ret;
 
+       ret = mt7615_thermal_init(dev);
+       if (ret)
+               return ret;
+
        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_5g.sband);