@@ -28,6 +28,11 @@ enum lg_g15_led_type {
28
28
LG_G15_KBD_BRIGHTNESS ,
29
29
LG_G15_LCD_BRIGHTNESS ,
30
30
LG_G15_BRIGHTNESS_MAX ,
31
+ LG_G15_MACRO_PRESET1 = 2 ,
32
+ LG_G15_MACRO_PRESET2 ,
33
+ LG_G15_MACRO_PRESET3 ,
34
+ LG_G15_MACRO_RECORD ,
35
+ LG_G15_LED_MAX
31
36
};
32
37
33
38
struct lg_g15_led {
@@ -45,7 +50,7 @@ struct lg_g15_data {
45
50
struct input_dev * input ;
46
51
struct hid_device * hdev ;
47
52
enum lg_g15_model model ;
48
- struct lg_g15_led leds [LG_G15_BRIGHTNESS_MAX ];
53
+ struct lg_g15_led leds [LG_G15_LED_MAX ];
49
54
};
50
55
51
56
static int lg_g15_update_led_brightness (struct lg_g15_data * g15 )
@@ -62,6 +67,16 @@ static int lg_g15_update_led_brightness(struct lg_g15_data *g15)
62
67
63
68
g15 -> leds [LG_G15_KBD_BRIGHTNESS ].brightness = g15 -> transfer_buf [1 ];
64
69
g15 -> leds [LG_G15_LCD_BRIGHTNESS ].brightness = g15 -> transfer_buf [2 ];
70
+
71
+ g15 -> leds [LG_G15_MACRO_PRESET1 ].brightness =
72
+ !(g15 -> transfer_buf [3 ] & 0x01 );
73
+ g15 -> leds [LG_G15_MACRO_PRESET2 ].brightness =
74
+ !(g15 -> transfer_buf [3 ] & 0x02 );
75
+ g15 -> leds [LG_G15_MACRO_PRESET3 ].brightness =
76
+ !(g15 -> transfer_buf [3 ] & 0x04 );
77
+ g15 -> leds [LG_G15_MACRO_RECORD ].brightness =
78
+ !(g15 -> transfer_buf [3 ] & 0x08 );
79
+
65
80
return 0 ;
66
81
}
67
82
@@ -86,7 +101,8 @@ static int lg_g15_led_set(struct led_classdev *led_cdev,
86
101
struct lg_g15_led * g15_led =
87
102
container_of (led_cdev , struct lg_g15_led , cdev );
88
103
struct lg_g15_data * g15 = dev_get_drvdata (led_cdev -> dev -> parent );
89
- int ret ;
104
+ u8 val , mask = 0 ;
105
+ int i , ret ;
90
106
91
107
/* Ignore LED off on unregister / keyboard unplug */
92
108
if (led_cdev -> flags & LED_UNREGISTERING )
@@ -95,10 +111,26 @@ static int lg_g15_led_set(struct led_classdev *led_cdev,
95
111
mutex_lock (& g15 -> mutex );
96
112
97
113
g15 -> transfer_buf [0 ] = LG_G15_FEATURE_REPORT ;
98
- g15 -> transfer_buf [1 ] = g15_led -> led + 1 ;
99
- g15 -> transfer_buf [2 ] = brightness << (g15_led -> led * 4 );
100
114
g15 -> transfer_buf [3 ] = 0 ;
101
115
116
+ if (g15_led -> led < LG_G15_BRIGHTNESS_MAX ) {
117
+ g15 -> transfer_buf [1 ] = g15_led -> led + 1 ;
118
+ g15 -> transfer_buf [2 ] = brightness << (g15_led -> led * 4 );
119
+ } else {
120
+ for (i = LG_G15_MACRO_PRESET1 ; i < LG_G15_LED_MAX ; i ++ ) {
121
+ if (i == g15_led -> led )
122
+ val = brightness ;
123
+ else
124
+ val = g15 -> leds [i ].brightness ;
125
+
126
+ if (val )
127
+ mask |= 1 << (i - LG_G15_MACRO_PRESET1 );
128
+ }
129
+
130
+ g15 -> transfer_buf [1 ] = 0x04 ;
131
+ g15 -> transfer_buf [2 ] = ~mask ;
132
+ }
133
+
102
134
ret = hid_hw_raw_request (g15 -> hdev , LG_G15_FEATURE_REPORT ,
103
135
g15 -> transfer_buf , 4 ,
104
136
HID_FEATURE_REPORT , HID_REQ_SET_REPORT );
@@ -257,14 +289,22 @@ static int lg_g15_register_led(struct lg_g15_data *g15, int i)
257
289
const char * const led_names [] = {
258
290
"g15::kbd_backlight" ,
259
291
"g15::lcd_backlight" ,
292
+ "g15::macro_preset1" ,
293
+ "g15::macro_preset2" ,
294
+ "g15::macro_preset3" ,
295
+ "g15::macro_record" ,
260
296
};
261
297
262
298
g15 -> leds [i ].led = i ;
263
299
g15 -> leds [i ].cdev .name = led_names [i ];
264
300
g15 -> leds [i ].cdev .brightness_set_blocking = lg_g15_led_set ;
265
301
g15 -> leds [i ].cdev .brightness_get = lg_g15_led_get ;
266
- g15 -> leds [i ].cdev .flags = LED_BRIGHT_HW_CHANGED ;
267
- g15 -> leds [i ].cdev .max_brightness = 2 ;
302
+ if (i < LG_G15_BRIGHTNESS_MAX ) {
303
+ g15 -> leds [i ].cdev .flags = LED_BRIGHT_HW_CHANGED ;
304
+ g15 -> leds [i ].cdev .max_brightness = 2 ;
305
+ } else {
306
+ g15 -> leds [i ].cdev .max_brightness = 1 ;
307
+ }
268
308
269
309
return devm_led_classdev_register (& g15 -> hdev -> dev , & g15 -> leds [i ].cdev );
270
310
}
@@ -377,7 +417,7 @@ static int lg_g15_probe(struct hid_device *hdev, const struct hid_device_id *id)
377
417
goto error_hw_stop ;
378
418
379
419
/* Register LED devices */
380
- for (i = 0 ; i < LG_G15_BRIGHTNESS_MAX ; i ++ ) {
420
+ for (i = 0 ; i < LG_G15_LED_MAX ; i ++ ) {
381
421
ret = lg_g15_register_led (g15 , i );
382
422
if (ret )
383
423
goto error_hw_stop ;
0 commit comments