Skip to content

Commit d5b5fc8

Browse files
jwrdegoedeJiri Kosina
authored andcommitted
HID: lg-g15: Add support for the M1-M3 and MR LEDs
Add support for controlling the LEDs below the M1-M3 and MR keys. Signed-off-by: Hans de Goede <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 97b741a commit d5b5fc8

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

drivers/hid/hid-lg-g15.c

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ enum lg_g15_led_type {
2828
LG_G15_KBD_BRIGHTNESS,
2929
LG_G15_LCD_BRIGHTNESS,
3030
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
3136
};
3237

3338
struct lg_g15_led {
@@ -45,7 +50,7 @@ struct lg_g15_data {
4550
struct input_dev *input;
4651
struct hid_device *hdev;
4752
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];
4954
};
5055

5156
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)
6267

6368
g15->leds[LG_G15_KBD_BRIGHTNESS].brightness = g15->transfer_buf[1];
6469
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+
6580
return 0;
6681
}
6782

@@ -86,7 +101,8 @@ static int lg_g15_led_set(struct led_classdev *led_cdev,
86101
struct lg_g15_led *g15_led =
87102
container_of(led_cdev, struct lg_g15_led, cdev);
88103
struct lg_g15_data *g15 = dev_get_drvdata(led_cdev->dev->parent);
89-
int ret;
104+
u8 val, mask = 0;
105+
int i, ret;
90106

91107
/* Ignore LED off on unregister / keyboard unplug */
92108
if (led_cdev->flags & LED_UNREGISTERING)
@@ -95,10 +111,26 @@ static int lg_g15_led_set(struct led_classdev *led_cdev,
95111
mutex_lock(&g15->mutex);
96112

97113
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);
100114
g15->transfer_buf[3] = 0;
101115

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+
102134
ret = hid_hw_raw_request(g15->hdev, LG_G15_FEATURE_REPORT,
103135
g15->transfer_buf, 4,
104136
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
@@ -257,14 +289,22 @@ static int lg_g15_register_led(struct lg_g15_data *g15, int i)
257289
const char * const led_names[] = {
258290
"g15::kbd_backlight",
259291
"g15::lcd_backlight",
292+
"g15::macro_preset1",
293+
"g15::macro_preset2",
294+
"g15::macro_preset3",
295+
"g15::macro_record",
260296
};
261297

262298
g15->leds[i].led = i;
263299
g15->leds[i].cdev.name = led_names[i];
264300
g15->leds[i].cdev.brightness_set_blocking = lg_g15_led_set;
265301
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+
}
268308

269309
return devm_led_classdev_register(&g15->hdev->dev, &g15->leds[i].cdev);
270310
}
@@ -377,7 +417,7 @@ static int lg_g15_probe(struct hid_device *hdev, const struct hid_device_id *id)
377417
goto error_hw_stop;
378418

379419
/* Register LED devices */
380-
for (i = 0; i < LG_G15_BRIGHTNESS_MAX; i++) {
420+
for (i = 0; i < LG_G15_LED_MAX; i++) {
381421
ret = lg_g15_register_led(g15, i);
382422
if (ret)
383423
goto error_hw_stop;

0 commit comments

Comments
 (0)