0001
0002
0003
0004 #include "../wifi.h"
0005 #include "../pci.h"
0006 #include "reg.h"
0007 #include "led.h"
0008
0009 static void _rtl88ee_init_led(struct ieee80211_hw *hw,
0010 struct rtl_led *pled, enum rtl_led_pin ledpin)
0011 {
0012 pled->hw = hw;
0013 pled->ledpin = ledpin;
0014 pled->ledon = false;
0015 }
0016
0017 void rtl88ee_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
0018 {
0019 u8 ledcfg;
0020 struct rtl_priv *rtlpriv = rtl_priv(hw);
0021
0022 rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD,
0023 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
0024
0025 switch (pled->ledpin) {
0026 case LED_PIN_GPIO0:
0027 break;
0028 case LED_PIN_LED0:
0029 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
0030 rtl_write_byte(rtlpriv,
0031 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5) | BIT(6));
0032 break;
0033 case LED_PIN_LED1:
0034 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
0035 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10);
0036 break;
0037 default:
0038 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
0039 "switch case %#x not processed\n", pled->ledpin);
0040 break;
0041 }
0042 pled->ledon = true;
0043 }
0044
0045 void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
0046 {
0047 struct rtl_priv *rtlpriv = rtl_priv(hw);
0048 u8 ledcfg;
0049
0050 rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD,
0051 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
0052
0053 switch (pled->ledpin) {
0054 case LED_PIN_GPIO0:
0055 break;
0056 case LED_PIN_LED0:
0057 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
0058 ledcfg &= 0xf0;
0059 if (rtlpriv->ledctl.led_opendrain) {
0060 rtl_write_byte(rtlpriv, REG_LEDCFG2,
0061 (ledcfg | BIT(3) | BIT(5) | BIT(6)));
0062 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
0063 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG,
0064 (ledcfg & 0xFE));
0065 } else
0066 rtl_write_byte(rtlpriv, REG_LEDCFG2,
0067 (ledcfg | BIT(3) | BIT(5) | BIT(6)));
0068 break;
0069 case LED_PIN_LED1:
0070 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
0071 ledcfg &= 0x10;
0072 rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3)));
0073 break;
0074 default:
0075 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
0076 "switch case %#x not processed\n", pled->ledpin);
0077 break;
0078 }
0079 pled->ledon = false;
0080 }
0081
0082 void rtl88ee_init_sw_leds(struct ieee80211_hw *hw)
0083 {
0084 struct rtl_priv *rtlpriv = rtl_priv(hw);
0085
0086 _rtl88ee_init_led(hw, &rtlpriv->ledctl.sw_led0, LED_PIN_LED0);
0087 _rtl88ee_init_led(hw, &rtlpriv->ledctl.sw_led1, LED_PIN_LED1);
0088 }
0089
0090 static void _rtl88ee_sw_led_control(struct ieee80211_hw *hw,
0091 enum led_ctl_mode ledaction)
0092 {
0093 struct rtl_priv *rtlpriv = rtl_priv(hw);
0094 struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
0095
0096 switch (ledaction) {
0097 case LED_CTL_POWER_ON:
0098 case LED_CTL_LINK:
0099 case LED_CTL_NO_LINK:
0100 rtl88ee_sw_led_on(hw, pled0);
0101 break;
0102 case LED_CTL_POWER_OFF:
0103 rtl88ee_sw_led_off(hw, pled0);
0104 break;
0105 default:
0106 break;
0107 }
0108 }
0109
0110 void rtl88ee_led_control(struct ieee80211_hw *hw,
0111 enum led_ctl_mode ledaction)
0112 {
0113 struct rtl_priv *rtlpriv = rtl_priv(hw);
0114 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0115
0116 if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) &&
0117 (ledaction == LED_CTL_TX ||
0118 ledaction == LED_CTL_RX ||
0119 ledaction == LED_CTL_SITE_SURVEY ||
0120 ledaction == LED_CTL_LINK ||
0121 ledaction == LED_CTL_NO_LINK ||
0122 ledaction == LED_CTL_START_TO_LINK ||
0123 ledaction == LED_CTL_POWER_ON)) {
0124 return;
0125 }
0126 rtl_dbg(rtlpriv, COMP_LED, DBG_TRACE, "ledaction %d,\n",
0127 ledaction);
0128 _rtl88ee_sw_led_control(hw, ledaction);
0129 }