OSDN Git Service

mt76: mt7615: introduce LED support
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 16 Dec 2019 13:05:05 +0000 (14:05 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:02 +0000 (10:06 +0100)
Initialize brightness_set and blink_set callbacks to
mt7615_led_set_brightness and mt7615_led_set_blink in order to enable
LED support in mt7615 driver

Tested-by: Deng Qingfang <dengqf6@mail2.sysu.edu.cn>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index a2405e1..c16df56 100644 (file)
@@ -209,6 +209,58 @@ static const struct ieee80211_iface_combination if_comb[] = {
 };
 
 static void
+mt7615_led_set_config(struct led_classdev *led_cdev,
+                     u8 delay_on, u8 delay_off)
+{
+       struct mt7615_dev *dev;
+       struct mt76_dev *mt76;
+       u32 val, addr;
+
+       mt76 = container_of(led_cdev, struct mt76_dev, led_cdev);
+       dev = container_of(mt76, struct mt7615_dev, mt76);
+       val = FIELD_PREP(MT_LED_STATUS_DURATION, 0xffff) |
+             FIELD_PREP(MT_LED_STATUS_OFF, delay_off) |
+             FIELD_PREP(MT_LED_STATUS_ON, delay_on);
+
+       addr = mt7615_reg_map(dev, MT_LED_STATUS_0(mt76->led_pin));
+       mt76_wr(dev, addr, val);
+       addr = mt7615_reg_map(dev, MT_LED_STATUS_1(mt76->led_pin));
+       mt76_wr(dev, addr, val);
+
+       val = MT_LED_CTRL_REPLAY(mt76->led_pin) |
+             MT_LED_CTRL_KICK(mt76->led_pin);
+       if (mt76->led_al)
+               val |= MT_LED_CTRL_POLARITY(mt76->led_pin);
+       addr = mt7615_reg_map(dev, MT_LED_CTRL);
+       mt76_wr(dev, addr, val);
+}
+
+static int
+mt7615_led_set_blink(struct led_classdev *led_cdev,
+                    unsigned long *delay_on,
+                    unsigned long *delay_off)
+{
+       u8 delta_on, delta_off;
+
+       delta_off = max_t(u8, *delay_off / 10, 1);
+       delta_on = max_t(u8, *delay_on / 10, 1);
+
+       mt7615_led_set_config(led_cdev, delta_on, delta_off);
+
+       return 0;
+}
+
+static void
+mt7615_led_set_brightness(struct led_classdev *led_cdev,
+                         enum led_brightness brightness)
+{
+       if (!brightness)
+               mt7615_led_set_config(led_cdev, 0, 0xff);
+       else
+               mt7615_led_set_config(led_cdev, 0xff, 0);
+}
+
+static void
 mt7615_init_txpower(struct mt7615_dev *dev,
                    struct ieee80211_supported_band *sband)
 {
@@ -402,6 +454,12 @@ int mt7615_register_device(struct mt7615_dev *dev)
        mt7615_cap_dbdc_disable(dev);
        dev->phy.dfs_state = -1;
 
+       /* init led callbacks */
+       if (IS_ENABLED(CONFIG_MT76_LEDS)) {
+               dev->mt76.led_cdev.brightness_set = mt7615_led_set_brightness;
+               dev->mt76.led_cdev.blink_set = mt7615_led_set_blink;
+       }
+
        ret = mt76_register_device(&dev->mt76, true, mt7615_rates,
                                   ARRAY_SIZE(mt7615_rates));
        if (ret)
index 46db0fa..b0c1406 100644 (file)
 
 #define MT_TX_AGG_CNT(n)               MT_WF_MIB(0xa8 + ((n) << 2))
 
+#define MT_LED_BASE_PHYS               0x80024000
+#define MT_LED_PHYS(_n)                        (MT_LED_BASE_PHYS + (_n))
+
+#define MT_LED_CTRL                    MT_LED_PHYS(0x00)
+
+#define MT_LED_CTRL_REPLAY(_n)         BIT(0 + (8 * (_n)))
+#define MT_LED_CTRL_POLARITY(_n)       BIT(1 + (8 * (_n)))
+#define MT_LED_CTRL_TX_BLINK_MODE(_n)  BIT(2 + (8 * (_n)))
+#define MT_LED_CTRL_TX_MANUAL_BLINK(_n)        BIT(3 + (8 * (_n)))
+#define MT_LED_CTRL_TX_OVER_BLINK(_n)  BIT(5 + (8 * (_n)))
+#define MT_LED_CTRL_KICK(_n)           BIT(7 + (8 * (_n)))
+
+#define MT_LED_STATUS_0(_n)            MT_LED_PHYS(0x10 + ((_n) * 8))
+#define MT_LED_STATUS_1(_n)            MT_LED_PHYS(0x14 + ((_n) * 8))
+#define MT_LED_STATUS_OFF              GENMASK(31, 24)
+#define MT_LED_STATUS_ON               GENMASK(23, 16)
+#define MT_LED_STATUS_DURATION         GENMASK(15, 0)
+
 #define MT_EFUSE_BASE                  0x81070000
 #define MT_EFUSE_BASE_CTRL             0x000
 #define MT_EFUSE_BASE_CTRL_EMPTY       BIT(30)