1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2011 Realtek Corporation. */
3 
4 #include "../include/osdep_service.h"
5 #include "../include/drv_types.h"
6 #include "../include/rtl8188e_hal.h"
7 #include "../include/rtl8188e_led.h"
8 
9 /*  LED object. */
10 
11 /*  LED_819xUsb routines. */
12 /*	Description: */
13 /*		Turn on LED according to LedPin specified. */
SwLedOn(struct adapter * padapter,struct LED_871x * pLed)14 void SwLedOn(struct adapter *padapter, struct LED_871x *pLed)
15 {
16 	u8	LedCfg;
17 
18 	if (padapter->bSurpriseRemoved || padapter->bDriverStopped)
19 		return;
20 	LedCfg = rtw_read8(padapter, REG_LEDCFG2);
21 	switch (pLed->LedPin) {
22 	case LED_PIN_LED0:
23 		rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); /*  SW control led0 on. */
24 		break;
25 	case LED_PIN_LED1:
26 		rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0x0f) | BIT(5)); /*  SW control led1 on. */
27 		break;
28 	default:
29 		break;
30 	}
31 	pLed->bLedOn = true;
32 }
33 
34 /*	Description: */
35 /*		Turn off LED according to LedPin specified. */
SwLedOff(struct adapter * padapter,struct LED_871x * pLed)36 void SwLedOff(struct adapter *padapter, struct LED_871x *pLed)
37 {
38 	u8	LedCfg;
39 	struct hal_data_8188e	*pHalData = GET_HAL_DATA(padapter);
40 
41 	if (padapter->bSurpriseRemoved || padapter->bDriverStopped)
42 		goto exit;
43 
44 	LedCfg = rtw_read8(padapter, REG_LEDCFG2);/* 0x4E */
45 
46 	switch (pLed->LedPin) {
47 	case LED_PIN_LED0:
48 		if (pHalData->bLedOpenDrain) {
49 			/*  Open-drain arrangement for controlling the LED) */
50 			LedCfg &= 0x90; /*  Set to software control. */
51 			rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3)));
52 			LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG);
53 			LedCfg &= 0xFE;
54 			rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg);
55 		} else {
56 			rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3) | BIT(5) | BIT(6)));
57 		}
58 		break;
59 	case LED_PIN_LED1:
60 		LedCfg &= 0x0f; /*  Set to software control. */
61 		rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3)));
62 		break;
63 	default:
64 		break;
65 	}
66 exit:
67 	pLed->bLedOn = false;
68 }
69 
70 /*  Interface to manipulate LED objects. */
71 /*  Default LED behavior. */
72 
73 /*	Description: */
74 /*		Initialize all LED_871x objects. */
rtl8188eu_InitSwLeds(struct adapter * padapter)75 void rtl8188eu_InitSwLeds(struct adapter *padapter)
76 {
77 	struct led_priv *pledpriv = &padapter->ledpriv;
78 
79 	pledpriv->LedControlHandler = LedControl8188eu;
80 
81 	InitLed871x(padapter, &pledpriv->SwLed0, LED_PIN_LED0);
82 
83 	InitLed871x(padapter, &pledpriv->SwLed1, LED_PIN_LED1);
84 }
85 
86 /*	Description: */
87 /*		DeInitialize all LED_819xUsb objects. */
rtl8188eu_DeInitSwLeds(struct adapter * padapter)88 void rtl8188eu_DeInitSwLeds(struct adapter *padapter)
89 {
90 	struct led_priv	*ledpriv = &padapter->ledpriv;
91 
92 	DeInitLed871x(&ledpriv->SwLed0);
93 	DeInitLed871x(&ledpriv->SwLed1);
94 }
95