Skip to content

Commit c33a0b4

Browse files
ziyao233Sasha Levin
authored andcommitted
platform/loongarch: laptop: Add backlight power control support
commit 53c762b upstream. loongson_laptop_turn_{on,off}_backlight() are designed for controlling the power of the backlight, but they aren't really used in the driver previously. Unify these two functions since they only differ in arguments passed to ACPI method, and wire up loongson_laptop_backlight_update() to update the power state of the backlight as well. Tested on the TongFang L860-T2 Loongson-3A5000 laptop. Cc: [email protected] Fixes: 6246ed0 ("LoongArch: Add ACPI-based generic laptop driver") Signed-off-by: Yao Zi <[email protected]> Signed-off-by: Huacai Chen <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 7cf5e60 commit c33a0b4

File tree

1 file changed

+37
-36
lines changed

1 file changed

+37
-36
lines changed

drivers/platform/loongarch/loongson-laptop.c

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ static struct input_dev *generic_inputdev;
5656
static acpi_handle hotkey_handle;
5757
static struct key_entry hotkey_keycode_map[GENERIC_HOTKEY_MAP_MAX];
5858

59-
int loongson_laptop_turn_on_backlight(void);
60-
int loongson_laptop_turn_off_backlight(void);
59+
static bool bl_powered;
6160
static int loongson_laptop_backlight_update(struct backlight_device *bd);
6261

6362
/* 2. ACPI Helpers and device model */
@@ -354,16 +353,42 @@ static int ec_backlight_level(u8 level)
354353
return level;
355354
}
356355

356+
static int ec_backlight_set_power(bool state)
357+
{
358+
int status;
359+
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
360+
struct acpi_object_list args = { 1, &arg0 };
361+
362+
arg0.integer.value = state;
363+
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
364+
if (ACPI_FAILURE(status)) {
365+
pr_info("Loongson lvds error: 0x%x\n", status);
366+
return -EIO;
367+
}
368+
369+
return 0;
370+
}
371+
357372
static int loongson_laptop_backlight_update(struct backlight_device *bd)
358373
{
359-
int lvl = ec_backlight_level(bd->props.brightness);
374+
bool target_powered = !backlight_is_blank(bd);
375+
int ret = 0, lvl = ec_backlight_level(bd->props.brightness);
360376

361377
if (lvl < 0)
362378
return -EIO;
379+
363380
if (ec_set_brightness(lvl))
364381
return -EIO;
365382

366-
return 0;
383+
if (target_powered != bl_powered) {
384+
ret = ec_backlight_set_power(target_powered);
385+
if (ret < 0)
386+
return ret;
387+
388+
bl_powered = target_powered;
389+
}
390+
391+
return ret;
367392
}
368393

369394
static int loongson_laptop_get_brightness(struct backlight_device *bd)
@@ -384,52 +409,28 @@ static const struct backlight_ops backlight_laptop_ops = {
384409

385410
static int laptop_backlight_register(void)
386411
{
387-
int status = 0;
412+
int status = 0, ret;
388413
struct backlight_properties props;
389414

390415
memset(&props, 0, sizeof(props));
391416

392417
if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d"))
393418
return -EIO;
394419

420+
ret = ec_backlight_set_power(true);
421+
if (ret)
422+
return ret;
423+
424+
bl_powered = true;
425+
395426
props.max_brightness = status;
396427
props.brightness = ec_get_brightness();
428+
props.power = BACKLIGHT_POWER_ON;
397429
props.type = BACKLIGHT_PLATFORM;
398430

399431
backlight_device_register("loongson_laptop",
400432
NULL, NULL, &backlight_laptop_ops, &props);
401433

402-
return 0;
403-
}
404-
405-
int loongson_laptop_turn_on_backlight(void)
406-
{
407-
int status;
408-
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
409-
struct acpi_object_list args = { 1, &arg0 };
410-
411-
arg0.integer.value = 1;
412-
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
413-
if (ACPI_FAILURE(status)) {
414-
pr_info("Loongson lvds error: 0x%x\n", status);
415-
return -ENODEV;
416-
}
417-
418-
return 0;
419-
}
420-
421-
int loongson_laptop_turn_off_backlight(void)
422-
{
423-
int status;
424-
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
425-
struct acpi_object_list args = { 1, &arg0 };
426-
427-
arg0.integer.value = 0;
428-
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
429-
if (ACPI_FAILURE(status)) {
430-
pr_info("Loongson lvds error: 0x%x\n", status);
431-
return -ENODEV;
432-
}
433434

434435
return 0;
435436
}

0 commit comments

Comments
 (0)