// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* Copyright(c) 2025 Realtek Corporation */ #include "main.h" #include "debug.h" #include "led.h" static int rtw_led_set_blocking(struct led_classdev *led, enum led_brightness brightness) { struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev); rtwdev->chip->ops->led_set(led, brightness); return 0; } void rtw_led_init(struct rtw_dev *rtwdev) { static const struct ieee80211_tpt_blink rtw_tpt_blink[] = { { .throughput = 0 * 1024, .blink_time = 334 }, { .throughput = 1 * 1024, .blink_time = 260 }, { .throughput = 5 * 1024, .blink_time = 220 }, { .throughput = 10 * 1024, .blink_time = 190 }, { .throughput = 20 * 1024, .blink_time = 170 }, { .throughput = 50 * 1024, .blink_time = 150 }, { .throughput = 70 * 1024, .blink_time = 130 }, { .throughput = 100 * 1024, .blink_time = 110 }, { .throughput = 200 * 1024, .blink_time = 80 }, { .throughput = 300 * 1024, .blink_time = 50 }, }; struct led_classdev *led = &rtwdev->led_cdev; int err; if (!rtwdev->chip->ops->led_set) return; if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) led->brightness_set = rtwdev->chip->ops->led_set; else led->brightness_set_blocking = rtw_led_set_blocking; snprintf(rtwdev->led_name, sizeof(rtwdev->led_name), "rtw88-%s", dev_name(rtwdev->dev)); led->name = rtwdev->led_name; led->max_brightness = LED_ON; led->default_trigger = ieee80211_create_tpt_led_trigger(rtwdev->hw, IEEE80211_TPT_LEDTRIG_FL_RADIO, rtw_tpt_blink, ARRAY_SIZE(rtw_tpt_blink)); err = led_classdev_register(rtwdev->dev, led); if (err) { rtw_warn(rtwdev, "Failed to register the LED, error %d\n", err); return; } rtwdev->led_registered = true; } void rtw_led_deinit(struct rtw_dev *rtwdev) { struct led_classdev *led = &rtwdev->led_cdev; if (!rtwdev->led_registered) return; rtwdev->chip->ops->led_set(led, LED_OFF); led_classdev_unregister(led); }