Commit 9e81c2c7 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

wifi: mt76: mt7915: enable per-phy led support

Introduce the capability to support per-phy led blinking. This is needed
for devices supporting dbdc.
Tested-by: default avatarFrank Wunderlich <frank-w@public-files.de>
Co-developed-by: default avatarRyder Lee <ryder.Lee@mediatek.com>
Signed-off-by: default avatarRyder Lee <ryder.Lee@mediatek.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 3abd46dd
...@@ -523,6 +523,12 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht, ...@@ -523,6 +523,12 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht,
return ret; return ret;
} }
if (IS_ENABLED(CONFIG_MT76_LEDS)) {
ret = mt76_led_init(phy);
if (ret)
return ret;
}
wiphy_read_of_freq_limits(phy->hw->wiphy); wiphy_read_of_freq_limits(phy->hw->wiphy);
mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ);
mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ);
...@@ -542,6 +548,8 @@ void mt76_unregister_phy(struct mt76_phy *phy) ...@@ -542,6 +548,8 @@ void mt76_unregister_phy(struct mt76_phy *phy)
{ {
struct mt76_dev *dev = phy->dev; struct mt76_dev *dev = phy->dev;
if (IS_ENABLED(CONFIG_MT76_LEDS))
mt76_led_cleanup(phy);
mt76_tx_status_check(dev, true); mt76_tx_status_check(dev, true);
ieee80211_unregister_hw(phy->hw); ieee80211_unregister_hw(phy->hw);
dev->phys[phy->band_idx] = NULL; dev->phys[phy->band_idx] = NULL;
......
...@@ -215,24 +215,25 @@ static void mt7915_led_set_config(struct led_classdev *led_cdev, ...@@ -215,24 +215,25 @@ static void mt7915_led_set_config(struct led_classdev *led_cdev,
mphy = container_of(led_cdev, struct mt76_phy, leds.cdev); mphy = container_of(led_cdev, struct mt76_phy, leds.cdev);
dev = container_of(mphy->dev, struct mt7915_dev, mt76); dev = container_of(mphy->dev, struct mt7915_dev, mt76);
/* select TX blink mode, 2: only data frames */ /* set PWM mode */
mt76_rmw_field(dev, MT_TMAC_TCR0(0), MT_TMAC_TCR0_TX_BLINK, 2); val = FIELD_PREP(MT_LED_STATUS_DURATION, 0xffff) |
FIELD_PREP(MT_LED_STATUS_OFF, delay_off) |
FIELD_PREP(MT_LED_STATUS_ON, delay_on);
mt76_wr(dev, MT_LED_STATUS_0(mphy->band_idx), val);
mt76_wr(dev, MT_LED_STATUS_1(mphy->band_idx), val);
/* enable LED */ /* enable LED */
mt76_wr(dev, MT_LED_EN(0), 1); mt76_wr(dev, MT_LED_EN(mphy->band_idx), 1);
/* set LED Tx blink on/off time */
val = FIELD_PREP(MT_LED_TX_BLINK_ON_MASK, delay_on) |
FIELD_PREP(MT_LED_TX_BLINK_OFF_MASK, delay_off);
mt76_wr(dev, MT_LED_TX_BLINK(0), val);
/* control LED */ /* control LED */
val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK; val = MT_LED_CTRL_KICK;
if (mphy->leds.al) if (dev->mphy.leds.al)
val |= MT_LED_CTRL_POLARITY; val |= MT_LED_CTRL_POLARITY;
if (mphy->band_idx)
val |= MT_LED_CTRL_BAND;
mt76_wr(dev, MT_LED_CTRL(0), val); mt76_wr(dev, MT_LED_CTRL(mphy->band_idx), val);
mt76_clear(dev, MT_LED_CTRL(0), MT_LED_CTRL_KICK); mt76_clear(dev, MT_LED_CTRL(mphy->band_idx), MT_LED_CTRL_KICK);
} }
static int mt7915_led_set_blink(struct led_classdev *led_cdev, static int mt7915_led_set_blink(struct led_classdev *led_cdev,
...@@ -319,9 +320,10 @@ mt7915_regd_notifier(struct wiphy *wiphy, ...@@ -319,9 +320,10 @@ mt7915_regd_notifier(struct wiphy *wiphy,
} }
static void static void
mt7915_init_wiphy(struct ieee80211_hw *hw) mt7915_init_wiphy(struct mt7915_phy *phy)
{ {
struct mt7915_phy *phy = mt7915_hw_phy(hw); struct mt76_phy *mphy = phy->mt76;
struct ieee80211_hw *hw = mphy->hw;
struct mt76_dev *mdev = &phy->dev->mt76; struct mt76_dev *mdev = &phy->dev->mt76;
struct wiphy *wiphy = hw->wiphy; struct wiphy *wiphy = hw->wiphy;
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
...@@ -415,6 +417,12 @@ mt7915_init_wiphy(struct ieee80211_hw *hw) ...@@ -415,6 +417,12 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
wiphy->available_antennas_rx = phy->mt76->antenna_mask; wiphy->available_antennas_rx = phy->mt76->antenna_mask;
wiphy->available_antennas_tx = phy->mt76->antenna_mask; wiphy->available_antennas_tx = phy->mt76->antenna_mask;
/* init led callbacks */
if (IS_ENABLED(CONFIG_MT76_LEDS)) {
mphy->leds.cdev.brightness_set = mt7915_led_set_brightness;
mphy->leds.cdev.blink_set = mt7915_led_set_blink;
}
} }
static void static void
...@@ -473,6 +481,72 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band) ...@@ -473,6 +481,72 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)
mt76_rmw(dev, MT_WTBLOFF_TOP_RSCR(band), mask, set); mt76_rmw(dev, MT_WTBLOFF_TOP_RSCR(band), mask, set);
} }
static void
mt7915_init_led_mux(struct mt7915_dev *dev)
{
if (!IS_ENABLED(CONFIG_MT76_LEDS))
return;
if (dev->dbdc_support) {
switch (mt76_chip(&dev->mt76)) {
case 0x7915:
mt76_rmw_field(dev, MT_LED_GPIO_MUX2,
GENMASK(11, 8), 4);
mt76_rmw_field(dev, MT_LED_GPIO_MUX3,
GENMASK(11, 8), 4);
break;
case 0x7986:
mt76_rmw_field(dev, MT_LED_GPIO_MUX0,
GENMASK(7, 4), 1);
mt76_rmw_field(dev, MT_LED_GPIO_MUX0,
GENMASK(11, 8), 1);
break;
case 0x7916:
mt76_rmw_field(dev, MT_LED_GPIO_MUX1,
GENMASK(27, 24), 3);
mt76_rmw_field(dev, MT_LED_GPIO_MUX1,
GENMASK(31, 28), 3);
break;
default:
break;
}
} else if (dev->mphy.leds.pin) {
switch (mt76_chip(&dev->mt76)) {
case 0x7915:
mt76_rmw_field(dev, MT_LED_GPIO_MUX3,
GENMASK(11, 8), 4);
break;
case 0x7986:
mt76_rmw_field(dev, MT_LED_GPIO_MUX0,
GENMASK(11, 8), 1);
break;
case 0x7916:
mt76_rmw_field(dev, MT_LED_GPIO_MUX1,
GENMASK(31, 28), 3);
break;
default:
break;
}
} else {
switch (mt76_chip(&dev->mt76)) {
case 0x7915:
mt76_rmw_field(dev, MT_LED_GPIO_MUX2,
GENMASK(11, 8), 4);
break;
case 0x7986:
mt76_rmw_field(dev, MT_LED_GPIO_MUX0,
GENMASK(7, 4), 1);
break;
case 0x7916:
mt76_rmw_field(dev, MT_LED_GPIO_MUX1,
GENMASK(27, 24), 3);
break;
default:
break;
}
}
}
void mt7915_mac_init(struct mt7915_dev *dev) void mt7915_mac_init(struct mt7915_dev *dev)
{ {
int i; int i;
...@@ -497,10 +571,7 @@ void mt7915_mac_init(struct mt7915_dev *dev) ...@@ -497,10 +571,7 @@ void mt7915_mac_init(struct mt7915_dev *dev)
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
mt7915_mac_init_band(dev, i); mt7915_mac_init_band(dev, i);
if (IS_ENABLED(CONFIG_MT76_LEDS)) { mt7915_init_led_mux(dev);
i = dev->mphy.leds.pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2;
mt76_rmw_field(dev, i, MT_LED_GPIO_SEL_MASK, 4);
}
} }
int mt7915_txbf_init(struct mt7915_dev *dev) int mt7915_txbf_init(struct mt7915_dev *dev)
...@@ -569,7 +640,7 @@ mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy) ...@@ -569,7 +640,7 @@ mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy)
mt76_eeprom_override(mphy); mt76_eeprom_override(mphy);
/* init wiphy according to mphy and phy */ /* init wiphy according to mphy and phy */
mt7915_init_wiphy(mphy->hw); mt7915_init_wiphy(phy);
ret = mt76_register_phy(mphy, true, mt76_rates, ret = mt76_register_phy(mphy, true, mt76_rates,
ARRAY_SIZE(mt76_rates)); ARRAY_SIZE(mt76_rates));
...@@ -1104,7 +1175,6 @@ static void mt7915_stop_hardware(struct mt7915_dev *dev) ...@@ -1104,7 +1175,6 @@ static void mt7915_stop_hardware(struct mt7915_dev *dev)
int mt7915_register_device(struct mt7915_dev *dev) int mt7915_register_device(struct mt7915_dev *dev)
{ {
struct ieee80211_hw *hw = mt76_hw(dev);
struct mt7915_phy *phy2; struct mt7915_phy *phy2;
int ret; int ret;
...@@ -1133,18 +1203,12 @@ int mt7915_register_device(struct mt7915_dev *dev) ...@@ -1133,18 +1203,12 @@ int mt7915_register_device(struct mt7915_dev *dev)
if (ret) if (ret)
goto free_phy2; goto free_phy2;
mt7915_init_wiphy(hw); mt7915_init_wiphy(&dev->phy);
#ifdef CONFIG_NL80211_TESTMODE #ifdef CONFIG_NL80211_TESTMODE
dev->mt76.test_ops = &mt7915_testmode_ops; dev->mt76.test_ops = &mt7915_testmode_ops;
#endif #endif
/* init led callbacks */
if (IS_ENABLED(CONFIG_MT76_LEDS)) {
dev->mphy.leds.cdev.brightness_set = mt7915_led_set_brightness;
dev->mphy.leds.cdev.blink_set = mt7915_led_set_blink;
}
ret = mt76_register_device(&dev->mt76, true, mt76_rates, ret = mt76_register_device(&dev->mt76, true, mt76_rates,
ARRAY_SIZE(mt76_rates)); ARRAY_SIZE(mt76_rates));
if (ret) if (ret)
......
...@@ -1054,6 +1054,7 @@ enum offs_rev { ...@@ -1054,6 +1054,7 @@ enum offs_rev {
#define MT_LED_CTRL(_n) MT_LED_PHYS(0x00 + ((_n) * 4)) #define MT_LED_CTRL(_n) MT_LED_PHYS(0x00 + ((_n) * 4))
#define MT_LED_CTRL_KICK BIT(7) #define MT_LED_CTRL_KICK BIT(7)
#define MT_LED_CTRL_BAND BIT(4)
#define MT_LED_CTRL_BLINK_MODE BIT(2) #define MT_LED_CTRL_BLINK_MODE BIT(2)
#define MT_LED_CTRL_POLARITY BIT(1) #define MT_LED_CTRL_POLARITY BIT(1)
...@@ -1061,11 +1062,18 @@ enum offs_rev { ...@@ -1061,11 +1062,18 @@ enum offs_rev {
#define MT_LED_TX_BLINK_ON_MASK GENMASK(7, 0) #define MT_LED_TX_BLINK_ON_MASK GENMASK(7, 0)
#define MT_LED_TX_BLINK_OFF_MASK GENMASK(15, 8) #define MT_LED_TX_BLINK_OFF_MASK GENMASK(15, 8)
#define MT_LED_STATUS_0(_n) MT_LED_PHYS(0x20 + ((_n) * 8))
#define MT_LED_STATUS_1(_n) MT_LED_PHYS(0x24 + ((_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_LED_EN(_n) MT_LED_PHYS(0x40 + ((_n) * 4)) #define MT_LED_EN(_n) MT_LED_PHYS(0x40 + ((_n) * 4))
#define MT_LED_GPIO_MUX0 0x70005050 /* GPIO 1 and GPIO 2 */
#define MT_LED_GPIO_MUX1 0x70005054 /* GPIO 14 and 15 */
#define MT_LED_GPIO_MUX2 0x70005058 /* GPIO 18 */ #define MT_LED_GPIO_MUX2 0x70005058 /* GPIO 18 */
#define MT_LED_GPIO_MUX3 0x7000505C /* GPIO 26 */ #define MT_LED_GPIO_MUX3 0x7000505c /* GPIO 26 */
#define MT_LED_GPIO_SEL_MASK GENMASK(11, 8)
/* MT TOP */ /* MT TOP */
#define MT_TOP_BASE 0x18060000 #define MT_TOP_BASE 0x18060000
......
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