diff --git a/10_lightning_node_pro_led/lightning_node_pro_led.c b/10_lightning_node_pro_led/lightning_node_pro_led.c index 8c1c0be..92b5e26 100644 --- a/10_lightning_node_pro_led/lightning_node_pro_led.c +++ b/10_lightning_node_pro_led/lightning_node_pro_led.c @@ -39,7 +39,7 @@ struct lnp_fan { struct lnp_device { struct hid_device *hdev; - struct mutex lock; + spinlock_t lock; const char *dev_name; @@ -47,8 +47,33 @@ struct lnp_device { int fans_count; int rgb_leds_per_fan_count; 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, 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) 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) 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, - enum led_brightness) + enum led_brightness brightness) { struct hid_device *hdev = to_hid_device(cdev->dev->parent); 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_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; } @@ -208,8 +242,6 @@ static inline int lnp_init(struct hid_device *hdev) lnp_dev->hdev = hdev; 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->fans_count = number_of_fan;