Add set_led_colors

This commit is contained in:
Florian RICHER 2025-03-12 17:13:37 +01:00
parent e29b9e2723
commit cc1deb72bf

View file

@ -39,7 +39,7 @@ struct lnp_fan {
struct lnp_device { struct lnp_device {
struct hid_device *hdev; struct hid_device *hdev;
struct mutex lock; spinlock_t lock;
const char *dev_name; const char *dev_name;
@ -47,8 +47,33 @@ struct lnp_device {
int fans_count; int fans_count;
int rgb_leds_per_fan_count; int rgb_leds_per_fan_count;
void *fans_data; void *fans_data;
bool update_fans_leds;
}; };
static inline void lnp_schedule_work(struct lnp_device *lnp_dev)
{
unsigned long flags;
spin_lock_irqsave(&lnp_dev->lock, flags);
// if (ds->output_worker_initialized)
// schedule_work(&ds->output_worker);
spin_unlock_irqrestore(&lnp_dev->lock, flags);
}
static void lnp_set_led_colors(struct lnp_device *lnp_dev,
struct lnp_rgb_led *lnp_rgb_led, uint8_t red,
uint8_t green, uint8_t blue)
{
unsigned long flags;
spin_lock_irqsave(&lnp_dev->lock, flags);
lnp_dev->update_fans_leds = true;
lnp_rgb_led->red = red;
lnp_rgb_led->green = green;
lnp_rgb_led->blue = blue;
spin_unlock_irqrestore(&lnp_dev->lock, flags);
}
static inline int lnp_extract_fan_and_led_index(struct led_classdev *cdev, static inline int lnp_extract_fan_and_led_index(struct led_classdev *cdev,
int *fan_index, int *led_index) int *fan_index, int *led_index)
{ {
@ -58,7 +83,7 @@ static inline int lnp_extract_fan_and_led_index(struct led_classdev *cdev,
if (!substr) if (!substr)
return -EINVAL; return -EINVAL;
ret = ret = sscanf(substr, "fan-%d-led-%d", fan_index, led_index); ret = sscanf(substr, "fan-%d-led-%d", fan_index, led_index);
if (ret != 2) if (ret != 2)
return -EINVAL; return -EINVAL;
@ -66,7 +91,7 @@ static inline int lnp_extract_fan_and_led_index(struct led_classdev *cdev,
} }
static int lnp_rgb_let_brightness_set(struct led_classdev *cdev, static int lnp_rgb_let_brightness_set(struct led_classdev *cdev,
enum led_brightness) enum led_brightness brightness)
{ {
struct hid_device *hdev = to_hid_device(cdev->dev->parent); struct hid_device *hdev = to_hid_device(cdev->dev->parent);
struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev); struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev);
@ -83,6 +108,15 @@ static int lnp_rgb_let_brightness_set(struct led_classdev *cdev,
struct lnp_fan *lnp_fan = lnp_dev->fans_data + fan_index; struct lnp_fan *lnp_fan = lnp_dev->fans_data + fan_index;
struct lnp_rgb_led *lnp_rgb_led = lnp_fan->rgb_leds_data + led_index; struct lnp_rgb_led *lnp_rgb_led = lnp_fan->rgb_leds_data + led_index;
uint8_t red, green, blue;
led_mc_calc_color_components(mc_cdev, brightness);
red = mc_cdev->subled_info[0].brightness;
green = mc_cdev->subled_info[1].brightness;
blue = mc_cdev->subled_info[2].brightness;
lnp_set_led_colors(lnp_dev, lnp_rgb_led, red, green, blue);
return 0; return 0;
} }
@ -208,8 +242,6 @@ static inline int lnp_init(struct hid_device *hdev)
lnp_dev->hdev = hdev; lnp_dev->hdev = hdev;
lnp_dev->dev_name = dev_name(&hdev->dev); lnp_dev->dev_name = dev_name(&hdev->dev);
mutex_init(&lnp_dev->lock);
lnp_dev->type = LNP_LED_LL120; // Only support LL120 for now lnp_dev->type = LNP_LED_LL120; // Only support LL120 for now
lnp_dev->fans_count = number_of_fan; lnp_dev->fans_count = number_of_fan;