xref: /linux/drivers/net/wireless/realtek/rtw89/led_mc.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*721d90c8SJohnson Tsai // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*721d90c8SJohnson Tsai /* Copyright(c) 2026 Realtek Corporation
3*721d90c8SJohnson Tsai  */
4*721d90c8SJohnson Tsai 
5*721d90c8SJohnson Tsai #include "core.h"
6*721d90c8SJohnson Tsai #include "debug.h"
7*721d90c8SJohnson Tsai #include "led.h"
8*721d90c8SJohnson Tsai 
rtw89_led_mc_brightness_set(struct led_classdev * led,enum led_brightness brightness)9*721d90c8SJohnson Tsai static int rtw89_led_mc_brightness_set(struct led_classdev *led,
10*721d90c8SJohnson Tsai 				       enum led_brightness brightness)
11*721d90c8SJohnson Tsai {
12*721d90c8SJohnson Tsai 	struct led_classdev_mc *mcdev = lcdev_to_mccdev(led);
13*721d90c8SJohnson Tsai 	struct rtw89_led *rtw_led = container_of(mcdev, struct rtw89_led, led_mc);
14*721d90c8SJohnson Tsai 	struct rtw89_dev *rtwdev = container_of(rtw_led, struct rtw89_dev, led);
15*721d90c8SJohnson Tsai 	const struct rtw89_led_desc *desc = rtw_led->desc;
16*721d90c8SJohnson Tsai 	const struct rtw89_led_gpio_entry *e;
17*721d90c8SJohnson Tsai 	unsigned int i;
18*721d90c8SJohnson Tsai 
19*721d90c8SJohnson Tsai 	led_mc_calc_color_components(mcdev, brightness);
20*721d90c8SJohnson Tsai 
21*721d90c8SJohnson Tsai 	wiphy_lock(rtwdev->hw->wiphy);
22*721d90c8SJohnson Tsai 
23*721d90c8SJohnson Tsai 	for (i = 0; i < mcdev->num_colors; i++) {
24*721d90c8SJohnson Tsai 		e = &desc->gpios[i];
25*721d90c8SJohnson Tsai 		if (rtw_led->brightness_cache[i] == mcdev->subled_info[i].brightness) {
26*721d90c8SJohnson Tsai 			rtw89_debug(rtwdev, RTW89_DBG_LED,
27*721d90c8SJohnson Tsai 				    "led_mc_set: pin=%u skip (no change)\n", e->pin);
28*721d90c8SJohnson Tsai 			continue;
29*721d90c8SJohnson Tsai 		}
30*721d90c8SJohnson Tsai 
31*721d90c8SJohnson Tsai 		rtw89_debug(rtwdev, RTW89_DBG_LED, "led_mc_set: pin=%u brightness=%u\n",
32*721d90c8SJohnson Tsai 			    e->pin, mcdev->subled_info[i].brightness);
33*721d90c8SJohnson Tsai 		rtw89_led_gpio_set(rtwdev, e, mcdev->subled_info[i].brightness);
34*721d90c8SJohnson Tsai 		rtw_led->brightness_cache[i] = mcdev->subled_info[i].brightness;
35*721d90c8SJohnson Tsai 	}
36*721d90c8SJohnson Tsai 
37*721d90c8SJohnson Tsai 	wiphy_unlock(rtwdev->hw->wiphy);
38*721d90c8SJohnson Tsai 
39*721d90c8SJohnson Tsai 	return 0;
40*721d90c8SJohnson Tsai }
41*721d90c8SJohnson Tsai 
rtw89_led_mc_init(struct rtw89_dev * rtwdev,const struct rtw89_led_desc * desc)42*721d90c8SJohnson Tsai int rtw89_led_mc_init(struct rtw89_dev *rtwdev, const struct rtw89_led_desc *desc)
43*721d90c8SJohnson Tsai {
44*721d90c8SJohnson Tsai 	struct rtw89_led *rtw_led = &rtwdev->led;
45*721d90c8SJohnson Tsai 	struct led_classdev_mc *led_mc = &rtw_led->led_mc;
46*721d90c8SJohnson Tsai 	int i, ret;
47*721d90c8SJohnson Tsai 
48*721d90c8SJohnson Tsai 	led_mc->num_colors = desc->n_gpio;
49*721d90c8SJohnson Tsai 	led_mc->subled_info = rtw_led->subled;
50*721d90c8SJohnson Tsai 
51*721d90c8SJohnson Tsai 	for (i = 0; i < desc->n_gpio; i++) {
52*721d90c8SJohnson Tsai 		const struct rtw89_led_gpio_entry *e = &desc->gpios[i];
53*721d90c8SJohnson Tsai 
54*721d90c8SJohnson Tsai 		rtw_led->subled[i].color_index = e->color;
55*721d90c8SJohnson Tsai 		rtw_led->subled[i].intensity = e->intensity;
56*721d90c8SJohnson Tsai 		rtw_led->subled[i].brightness = 0;
57*721d90c8SJohnson Tsai 		rtw_led->subled[i].channel = i;
58*721d90c8SJohnson Tsai 
59*721d90c8SJohnson Tsai 		rtw89_led_gpio_config(rtwdev, e);
60*721d90c8SJohnson Tsai 	}
61*721d90c8SJohnson Tsai 
62*721d90c8SJohnson Tsai 	snprintf(rtw_led->name, sizeof(rtw_led->name), "rtw89-%s-multicolor",
63*721d90c8SJohnson Tsai 		 wiphy_name(rtwdev->hw->wiphy));
64*721d90c8SJohnson Tsai 	led_mc->led_cdev.name = rtw_led->name;
65*721d90c8SJohnson Tsai 	led_mc->led_cdev.brightness_set_blocking = rtw89_led_mc_brightness_set;
66*721d90c8SJohnson Tsai 	led_mc->led_cdev.max_brightness = LED_ON;
67*721d90c8SJohnson Tsai 	led_mc->led_cdev.default_trigger = ieee80211_get_assoc_led_name(rtwdev->hw);
68*721d90c8SJohnson Tsai 
69*721d90c8SJohnson Tsai 	ret = led_classdev_multicolor_register(rtwdev->dev, led_mc);
70*721d90c8SJohnson Tsai 	if (ret)
71*721d90c8SJohnson Tsai 		rtw89_warn(rtwdev, "failed to register multicolor LED, ret=%d\n", ret);
72*721d90c8SJohnson Tsai 
73*721d90c8SJohnson Tsai 	return ret;
74*721d90c8SJohnson Tsai }
75*721d90c8SJohnson Tsai 
rtw89_led_mc_deinit(struct rtw89_dev * rtwdev)76*721d90c8SJohnson Tsai void rtw89_led_mc_deinit(struct rtw89_dev *rtwdev)
77*721d90c8SJohnson Tsai {
78*721d90c8SJohnson Tsai 	struct rtw89_led *rtw_led = &rtwdev->led;
79*721d90c8SJohnson Tsai 
80*721d90c8SJohnson Tsai 	led_classdev_multicolor_unregister(&rtw_led->led_mc);
81*721d90c8SJohnson Tsai }
82