1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright(c) 2009-2012 Realtek Corporation.*/ |
3 | |
4 | #include "../wifi.h" |
5 | #include "../usb.h" |
6 | #include "reg.h" |
7 | #include "led.h" |
8 | |
9 | void rtl92cu_sw_led_on(struct ieee80211_hw *hw, enum rtl_led_pin pin) |
10 | { |
11 | u8 ledcfg; |
12 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
13 | |
14 | rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n" , |
15 | REG_LEDCFG2, pin); |
16 | ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); |
17 | switch (pin) { |
18 | case LED_PIN_GPIO0: |
19 | break; |
20 | case LED_PIN_LED0: |
21 | rtl_write_byte(rtlpriv, |
22 | REG_LEDCFG2, val8: (ledcfg & 0xf0) | BIT(5) | BIT(6)); |
23 | break; |
24 | case LED_PIN_LED1: |
25 | rtl_write_byte(rtlpriv, REG_LEDCFG2, val8: (ledcfg & 0x0f) | BIT(5)); |
26 | break; |
27 | default: |
28 | pr_err("switch case %#x not processed\n" , pin); |
29 | break; |
30 | } |
31 | } |
32 | |
33 | void rtl92cu_sw_led_off(struct ieee80211_hw *hw, enum rtl_led_pin pin) |
34 | { |
35 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
36 | u8 ledcfg; |
37 | |
38 | rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n" , |
39 | REG_LEDCFG2, pin); |
40 | ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); |
41 | switch (pin) { |
42 | case LED_PIN_GPIO0: |
43 | break; |
44 | case LED_PIN_LED0: |
45 | ledcfg &= 0xf0; |
46 | if (rtlpriv->ledctl.led_opendrain) |
47 | rtl_write_byte(rtlpriv, REG_LEDCFG2, |
48 | val8: (ledcfg | BIT(1) | BIT(5) | BIT(6))); |
49 | else |
50 | rtl_write_byte(rtlpriv, REG_LEDCFG2, |
51 | val8: (ledcfg | BIT(3) | BIT(5) | BIT(6))); |
52 | break; |
53 | case LED_PIN_LED1: |
54 | ledcfg &= 0x0f; |
55 | rtl_write_byte(rtlpriv, REG_LEDCFG2, val8: (ledcfg | BIT(3))); |
56 | break; |
57 | default: |
58 | pr_err("switch case %#x not processed\n" , pin); |
59 | break; |
60 | } |
61 | } |
62 | |
63 | void rtl92cu_led_control(struct ieee80211_hw *hw, |
64 | enum led_ctl_mode ledaction) |
65 | { |
66 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
67 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
68 | |
69 | if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) && |
70 | (ledaction == LED_CTL_TX || |
71 | ledaction == LED_CTL_RX || |
72 | ledaction == LED_CTL_SITE_SURVEY || |
73 | ledaction == LED_CTL_LINK || |
74 | ledaction == LED_CTL_NO_LINK || |
75 | ledaction == LED_CTL_START_TO_LINK || |
76 | ledaction == LED_CTL_POWER_ON)) { |
77 | return; |
78 | } |
79 | rtl_dbg(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d\n" , ledaction); |
80 | } |
81 | |