Skip to content

Commit b27ea27

Browse files
Wer-Wolfjwrdegoede
authored andcommitted
platform/x86: lg-laptop: Use ACPI device handle when evaluating WMAB/WMBB
On the LG Gram 16Z90S, the WMAB and WMBB ACPI methods are not mapped under \XINI, but instead are mapped under \_SB.XINI. The reason for this is that the LGEX0820 ACPI device used by this driver is mapped at \_SB.XINI, so the ACPI methods where moved as well to appear below the LGEX0820 ACPI device. Fix this by using the ACPI handle from the ACPI device when evaluating both methods. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218901 Tested-by: Agathe Boutmy <[email protected]> Signed-off-by: Armin Wolf <[email protected]> Reviewed-by: Ilpo Järvinen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Hans de Goede <[email protected]> Signed-off-by: Hans de Goede <[email protected]>
1 parent 58a54f2 commit b27ea27

File tree

1 file changed

+33
-46
lines changed

1 file changed

+33
-46
lines changed

drivers/platform/x86/lg-laptop.c

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ MODULE_LICENSE("GPL");
3939
#define WMI_METHOD_WMBB "2B4F501A-BD3C-4394-8DCF-00A7D2BC8210"
4040
#define WMI_EVENT_GUID WMI_EVENT_GUID0
4141

42-
#define WMAB_METHOD "\\XINI.WMAB"
43-
#define WMBB_METHOD "\\XINI.WMBB"
4442
#define SB_GGOV_METHOD "\\_SB.GGOV"
4543
#define GOV_TLED 0x2020008
4644
#define WM_GET 1
@@ -74,7 +72,7 @@ static u32 inited;
7472

7573
static int battery_limit_use_wmbb;
7674
static struct led_classdev kbd_backlight;
77-
static enum led_brightness get_kbd_backlight_level(void);
75+
static enum led_brightness get_kbd_backlight_level(struct device *dev);
7876

7977
static const struct key_entry wmi_keymap[] = {
8078
{KE_KEY, 0x70, {KEY_F15} }, /* LG control panel (F1) */
@@ -127,11 +125,10 @@ static int ggov(u32 arg0)
127125
return res;
128126
}
129127

130-
static union acpi_object *lg_wmab(u32 method, u32 arg1, u32 arg2)
128+
static union acpi_object *lg_wmab(struct device *dev, u32 method, u32 arg1, u32 arg2)
131129
{
132130
union acpi_object args[3];
133131
acpi_status status;
134-
acpi_handle handle;
135132
struct acpi_object_list arg;
136133
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
137134

@@ -142,29 +139,22 @@ static union acpi_object *lg_wmab(u32 method, u32 arg1, u32 arg2)
142139
args[2].type = ACPI_TYPE_INTEGER;
143140
args[2].integer.value = arg2;
144141

145-
status = acpi_get_handle(NULL, (acpi_string) WMAB_METHOD, &handle);
146-
if (ACPI_FAILURE(status)) {
147-
pr_err("Cannot get handle");
148-
return NULL;
149-
}
150-
151142
arg.count = 3;
152143
arg.pointer = args;
153144

154-
status = acpi_evaluate_object(handle, NULL, &arg, &buffer);
145+
status = acpi_evaluate_object(ACPI_HANDLE(dev), "WMAB", &arg, &buffer);
155146
if (ACPI_FAILURE(status)) {
156-
acpi_handle_err(handle, "WMAB: call failed.\n");
147+
dev_err(dev, "WMAB: call failed.\n");
157148
return NULL;
158149
}
159150

160151
return buffer.pointer;
161152
}
162153

163-
static union acpi_object *lg_wmbb(u32 method_id, u32 arg1, u32 arg2)
154+
static union acpi_object *lg_wmbb(struct device *dev, u32 method_id, u32 arg1, u32 arg2)
164155
{
165156
union acpi_object args[3];
166157
acpi_status status;
167-
acpi_handle handle;
168158
struct acpi_object_list arg;
169159
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
170160
u8 buf[32];
@@ -180,18 +170,12 @@ static union acpi_object *lg_wmbb(u32 method_id, u32 arg1, u32 arg2)
180170
args[2].buffer.length = 32;
181171
args[2].buffer.pointer = buf;
182172

183-
status = acpi_get_handle(NULL, (acpi_string)WMBB_METHOD, &handle);
184-
if (ACPI_FAILURE(status)) {
185-
pr_err("Cannot get handle");
186-
return NULL;
187-
}
188-
189173
arg.count = 3;
190174
arg.pointer = args;
191175

192-
status = acpi_evaluate_object(handle, NULL, &arg, &buffer);
176+
status = acpi_evaluate_object(ACPI_HANDLE(dev), "WMBB", &arg, &buffer);
193177
if (ACPI_FAILURE(status)) {
194-
acpi_handle_err(handle, "WMAB: call failed.\n");
178+
dev_err(dev, "WMBB: call failed.\n");
195179
return NULL;
196180
}
197181

@@ -222,7 +206,7 @@ static void wmi_notify(u32 value, void *context)
222206

223207
if (eventcode == 0x10000000) {
224208
led_classdev_notify_brightness_hw_changed(
225-
&kbd_backlight, get_kbd_backlight_level());
209+
&kbd_backlight, get_kbd_backlight_level(kbd_backlight.dev->parent));
226210
} else {
227211
key = sparse_keymap_entry_from_scancode(
228212
wmi_input_dev, eventcode);
@@ -287,7 +271,7 @@ static ssize_t fan_mode_store(struct device *dev,
287271
if (ret)
288272
return ret;
289273

290-
r = lg_wmab(WM_FAN_MODE, WM_GET, 0);
274+
r = lg_wmab(dev, WM_FAN_MODE, WM_GET, 0);
291275
if (!r)
292276
return -EIO;
293277

@@ -298,9 +282,9 @@ static ssize_t fan_mode_store(struct device *dev,
298282

299283
m = r->integer.value;
300284
kfree(r);
301-
r = lg_wmab(WM_FAN_MODE, WM_SET, (m & 0xffffff0f) | (value << 4));
285+
r = lg_wmab(dev, WM_FAN_MODE, WM_SET, (m & 0xffffff0f) | (value << 4));
302286
kfree(r);
303-
r = lg_wmab(WM_FAN_MODE, WM_SET, (m & 0xfffffff0) | value);
287+
r = lg_wmab(dev, WM_FAN_MODE, WM_SET, (m & 0xfffffff0) | value);
304288
kfree(r);
305289

306290
return count;
@@ -312,7 +296,7 @@ static ssize_t fan_mode_show(struct device *dev,
312296
unsigned int status;
313297
union acpi_object *r;
314298

315-
r = lg_wmab(WM_FAN_MODE, WM_GET, 0);
299+
r = lg_wmab(dev, WM_FAN_MODE, WM_GET, 0);
316300
if (!r)
317301
return -EIO;
318302

@@ -339,7 +323,7 @@ static ssize_t usb_charge_store(struct device *dev,
339323
if (ret)
340324
return ret;
341325

342-
r = lg_wmbb(WMBB_USB_CHARGE, WM_SET, value);
326+
r = lg_wmbb(dev, WMBB_USB_CHARGE, WM_SET, value);
343327
if (!r)
344328
return -EIO;
345329

@@ -353,7 +337,7 @@ static ssize_t usb_charge_show(struct device *dev,
353337
unsigned int status;
354338
union acpi_object *r;
355339

356-
r = lg_wmbb(WMBB_USB_CHARGE, WM_GET, 0);
340+
r = lg_wmbb(dev, WMBB_USB_CHARGE, WM_GET, 0);
357341
if (!r)
358342
return -EIO;
359343

@@ -381,7 +365,7 @@ static ssize_t reader_mode_store(struct device *dev,
381365
if (ret)
382366
return ret;
383367

384-
r = lg_wmab(WM_READER_MODE, WM_SET, value);
368+
r = lg_wmab(dev, WM_READER_MODE, WM_SET, value);
385369
if (!r)
386370
return -EIO;
387371

@@ -395,7 +379,7 @@ static ssize_t reader_mode_show(struct device *dev,
395379
unsigned int status;
396380
union acpi_object *r;
397381

398-
r = lg_wmab(WM_READER_MODE, WM_GET, 0);
382+
r = lg_wmab(dev, WM_READER_MODE, WM_GET, 0);
399383
if (!r)
400384
return -EIO;
401385

@@ -423,7 +407,7 @@ static ssize_t fn_lock_store(struct device *dev,
423407
if (ret)
424408
return ret;
425409

426-
r = lg_wmab(WM_FN_LOCK, WM_SET, value);
410+
r = lg_wmab(dev, WM_FN_LOCK, WM_SET, value);
427411
if (!r)
428412
return -EIO;
429413

@@ -437,7 +421,7 @@ static ssize_t fn_lock_show(struct device *dev,
437421
unsigned int status;
438422
union acpi_object *r;
439423

440-
r = lg_wmab(WM_FN_LOCK, WM_GET, 0);
424+
r = lg_wmab(dev, WM_FN_LOCK, WM_GET, 0);
441425
if (!r)
442426
return -EIO;
443427

@@ -467,9 +451,9 @@ static ssize_t charge_control_end_threshold_store(struct device *dev,
467451
union acpi_object *r;
468452

469453
if (battery_limit_use_wmbb)
470-
r = lg_wmbb(WMBB_BATT_LIMIT, WM_SET, value);
454+
r = lg_wmbb(&pf_device->dev, WMBB_BATT_LIMIT, WM_SET, value);
471455
else
472-
r = lg_wmab(WM_BATT_LIMIT, WM_SET, value);
456+
r = lg_wmab(&pf_device->dev, WM_BATT_LIMIT, WM_SET, value);
473457
if (!r)
474458
return -EIO;
475459

@@ -488,7 +472,7 @@ static ssize_t charge_control_end_threshold_show(struct device *device,
488472
union acpi_object *r;
489473

490474
if (battery_limit_use_wmbb) {
491-
r = lg_wmbb(WMBB_BATT_LIMIT, WM_GET, 0);
475+
r = lg_wmbb(&pf_device->dev, WMBB_BATT_LIMIT, WM_GET, 0);
492476
if (!r)
493477
return -EIO;
494478

@@ -499,7 +483,7 @@ static ssize_t charge_control_end_threshold_show(struct device *device,
499483

500484
status = r->buffer.pointer[0x10];
501485
} else {
502-
r = lg_wmab(WM_BATT_LIMIT, WM_GET, 0);
486+
r = lg_wmab(&pf_device->dev, WM_BATT_LIMIT, WM_GET, 0);
503487
if (!r)
504488
return -EIO;
505489

@@ -578,7 +562,7 @@ static void tpad_led_set(struct led_classdev *cdev,
578562
{
579563
union acpi_object *r;
580564

581-
r = lg_wmab(WM_TLED, WM_SET, brightness > LED_OFF);
565+
r = lg_wmab(cdev->dev->parent, WM_TLED, WM_SET, brightness > LED_OFF);
582566
kfree(r);
583567
}
584568

@@ -600,16 +584,16 @@ static void kbd_backlight_set(struct led_classdev *cdev,
600584
val = 0;
601585
if (brightness >= LED_FULL)
602586
val = 0x24;
603-
r = lg_wmab(WM_KEY_LIGHT, WM_SET, val);
587+
r = lg_wmab(cdev->dev->parent, WM_KEY_LIGHT, WM_SET, val);
604588
kfree(r);
605589
}
606590

607-
static enum led_brightness get_kbd_backlight_level(void)
591+
static enum led_brightness get_kbd_backlight_level(struct device *dev)
608592
{
609593
union acpi_object *r;
610594
int val;
611595

612-
r = lg_wmab(WM_KEY_LIGHT, WM_GET, 0);
596+
r = lg_wmab(dev, WM_KEY_LIGHT, WM_GET, 0);
613597

614598
if (!r)
615599
return LED_OFF;
@@ -637,7 +621,7 @@ static enum led_brightness get_kbd_backlight_level(void)
637621

638622
static enum led_brightness kbd_backlight_get(struct led_classdev *cdev)
639623
{
640-
return get_kbd_backlight_level();
624+
return get_kbd_backlight_level(cdev->dev->parent);
641625
}
642626

643627
static LED_DEVICE(kbd_backlight, 255, LED_BRIGHT_HW_CHANGED);
@@ -664,6 +648,11 @@ static struct platform_driver pf_driver = {
664648

665649
static int acpi_add(struct acpi_device *device)
666650
{
651+
struct platform_device_info pdev_info = {
652+
.fwnode = acpi_fwnode_handle(device),
653+
.name = PLATFORM_NAME,
654+
.id = PLATFORM_DEVID_NONE,
655+
};
667656
int ret;
668657
const char *product;
669658
int year = 2017;
@@ -675,9 +664,7 @@ static int acpi_add(struct acpi_device *device)
675664
if (ret)
676665
return ret;
677666

678-
pf_device = platform_device_register_simple(PLATFORM_NAME,
679-
PLATFORM_DEVID_NONE,
680-
NULL, 0);
667+
pf_device = platform_device_register_full(&pdev_info);
681668
if (IS_ERR(pf_device)) {
682669
ret = PTR_ERR(pf_device);
683670
pf_device = NULL;

0 commit comments

Comments
 (0)