162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright(c) 2009-2013 Realtek Corporation.*/ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "../wifi.h" 562306a36Sopenharmony_ci#include "../pci.h" 662306a36Sopenharmony_ci#include "reg.h" 762306a36Sopenharmony_ci#include "led.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_civoid rtl88ee_sw_led_on(struct ieee80211_hw *hw, enum rtl_led_pin pin) 1062306a36Sopenharmony_ci{ 1162306a36Sopenharmony_ci u8 ledcfg; 1262306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD, 1562306a36Sopenharmony_ci "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pin); 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci switch (pin) { 1862306a36Sopenharmony_ci case LED_PIN_GPIO0: 1962306a36Sopenharmony_ci break; 2062306a36Sopenharmony_ci case LED_PIN_LED0: 2162306a36Sopenharmony_ci ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); 2262306a36Sopenharmony_ci rtl_write_byte(rtlpriv, 2362306a36Sopenharmony_ci REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5) | BIT(6)); 2462306a36Sopenharmony_ci break; 2562306a36Sopenharmony_ci case LED_PIN_LED1: 2662306a36Sopenharmony_ci ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); 2762306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10); 2862306a36Sopenharmony_ci break; 2962306a36Sopenharmony_ci default: 3062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 3162306a36Sopenharmony_ci "switch case %#x not processed\n", pin); 3262306a36Sopenharmony_ci break; 3362306a36Sopenharmony_ci } 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_civoid rtl88ee_sw_led_off(struct ieee80211_hw *hw, enum rtl_led_pin pin) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 3962306a36Sopenharmony_ci u8 ledcfg; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD, 4262306a36Sopenharmony_ci "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pin); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci switch (pin) { 4562306a36Sopenharmony_ci case LED_PIN_GPIO0: 4662306a36Sopenharmony_ci break; 4762306a36Sopenharmony_ci case LED_PIN_LED0: 4862306a36Sopenharmony_ci ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); 4962306a36Sopenharmony_ci ledcfg &= 0xf0; 5062306a36Sopenharmony_ci if (rtlpriv->ledctl.led_opendrain) { 5162306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_LEDCFG2, 5262306a36Sopenharmony_ci (ledcfg | BIT(3) | BIT(5) | BIT(6))); 5362306a36Sopenharmony_ci ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); 5462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, 5562306a36Sopenharmony_ci (ledcfg & 0xFE)); 5662306a36Sopenharmony_ci } else 5762306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_LEDCFG2, 5862306a36Sopenharmony_ci (ledcfg | BIT(3) | BIT(5) | BIT(6))); 5962306a36Sopenharmony_ci break; 6062306a36Sopenharmony_ci case LED_PIN_LED1: 6162306a36Sopenharmony_ci ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); 6262306a36Sopenharmony_ci ledcfg &= 0x10; 6362306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3))); 6462306a36Sopenharmony_ci break; 6562306a36Sopenharmony_ci default: 6662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 6762306a36Sopenharmony_ci "switch case %#x not processed\n", pin); 6862306a36Sopenharmony_ci break; 6962306a36Sopenharmony_ci } 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic void _rtl88ee_sw_led_control(struct ieee80211_hw *hw, 7362306a36Sopenharmony_ci enum led_ctl_mode ledaction) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 7662306a36Sopenharmony_ci enum rtl_led_pin pin0 = rtlpriv->ledctl.sw_led0; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci switch (ledaction) { 7962306a36Sopenharmony_ci case LED_CTL_POWER_ON: 8062306a36Sopenharmony_ci case LED_CTL_LINK: 8162306a36Sopenharmony_ci case LED_CTL_NO_LINK: 8262306a36Sopenharmony_ci rtl88ee_sw_led_on(hw, pin0); 8362306a36Sopenharmony_ci break; 8462306a36Sopenharmony_ci case LED_CTL_POWER_OFF: 8562306a36Sopenharmony_ci rtl88ee_sw_led_off(hw, pin0); 8662306a36Sopenharmony_ci break; 8762306a36Sopenharmony_ci default: 8862306a36Sopenharmony_ci break; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_civoid rtl88ee_led_control(struct ieee80211_hw *hw, 9362306a36Sopenharmony_ci enum led_ctl_mode ledaction) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 9662306a36Sopenharmony_ci struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) && 9962306a36Sopenharmony_ci (ledaction == LED_CTL_TX || 10062306a36Sopenharmony_ci ledaction == LED_CTL_RX || 10162306a36Sopenharmony_ci ledaction == LED_CTL_SITE_SURVEY || 10262306a36Sopenharmony_ci ledaction == LED_CTL_LINK || 10362306a36Sopenharmony_ci ledaction == LED_CTL_NO_LINK || 10462306a36Sopenharmony_ci ledaction == LED_CTL_START_TO_LINK || 10562306a36Sopenharmony_ci ledaction == LED_CTL_POWER_ON)) { 10662306a36Sopenharmony_ci return; 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_LED, DBG_TRACE, "ledaction %d,\n", 10962306a36Sopenharmony_ci ledaction); 11062306a36Sopenharmony_ci _rtl88ee_sw_led_control(hw, ledaction); 11162306a36Sopenharmony_ci} 112