platform/chrome: Add Chrome OS keyboard backlight LEDs support
Subsystems (2)
PATCH 1/1 platform/chrome: Add Chrome OS keyboard backlight LEDs support
This is a driver for ACPI-based keyboard backlight LEDs found on Chromebooks. The driver locates \\_SB.KBLT ACPI device and exports backlight as "chromeos::kbd_backlight" LED class device in sysfs.
---
Changes form previous submission:
- moved from drivers/leds to drivers/platform/chrome
- added method to retrieve brightness from ACPI
- renamed to cros_kbd_led_backlight
- config option renamed to CROS_KBD_LED_BACKLIGHT
- no longer setting initial brightness to max brightness (although on Pixel 1 - Link - ACPI initially reports 100 as brightness anyway)
I ran this on Pixel 1; Evan, could you give it a spin on your Pixel 2?
Thanks!
drivers/platform/chrome/Kconfig | 10 ++ drivers/platform/chrome/Makefile | 15 +-- drivers/platform/chrome/cros_kbd_led_backlight.c | 123 +++++++++++++++++++++++ 3 files changed, 141 insertions(+), 7 deletions(-)
drivers/platform/chrome/Kconfig +10 -0
@@ -64,4 +64,14 @@ config CROS_EC_PROTO help ChromeOS EC communication protocol helpers. +config CROS_KBD_LED_BACKLIGHT + tristate "Backlight LED support for Chrome OS keyboards" + depends on LEDS_CLASS && ACPI + help + This option enables support for the keyboard backlight LEDs on + select Chrome OS systems. + + To compile this driver as a module, choose M here: the + module will be called cros_kbd_led_backlight. + endif # CHROMEOS_PLATFORMS
drivers/platform/chrome/Makefile +8 -7
@@ -1,8 +1,9 @@ -obj-$(CONFIG_CHROMEOS_LAPTOP) += chromeos_laptop.o -obj-$(CONFIG_CHROMEOS_PSTORE) += chromeos_pstore.o -cros_ec_devs-objs := cros_ec_dev.o cros_ec_sysfs.o \ - cros_ec_lightbar.o cros_ec_vbc.o -obj-$(CONFIG_CROS_EC_CHARDEV) += cros_ec_devs.o -obj-$(CONFIG_CROS_EC_LPC) += cros_ec_lpc.o -obj-$(CONFIG_CROS_EC_PROTO) += cros_ec_proto.o +obj-$(CONFIG_CHROMEOS_LAPTOP) += chromeos_laptop.o +obj-$(CONFIG_CHROMEOS_PSTORE) += chromeos_pstore.o +cros_ec_devs-objs := cros_ec_dev.o cros_ec_sysfs.o \ + cros_ec_lightbar.o cros_ec_vbc.o +obj-$(CONFIG_CROS_EC_CHARDEV) += cros_ec_devs.o +obj-$(CONFIG_CROS_EC_LPC) += cros_ec_lpc.o +obj-$(CONFIG_CROS_EC_PROTO) += cros_ec_proto.o +obj-$(CONFIG_CROS_KBD_LED_BACKLIGHT) += cros_kbd_led_backlight.o
drivers/platform/chrome/cros_kbd_led_backlight.c new file +123 -0
123 lines not on this page · raw message
Signature · 5 lines
2.7.0.rc3.207.g0ac5344 -- Dmitry
Quoted 164 lines · Dmitry Torokhov
This is a driver for ACPI-based keyboard backlight LEDs found on Chromebooks. The driver locates \\_SB.KBLT ACPI device and exports backlight as "
chromeos::kbd_backlight" LED class device in sysfs.Signed-off-by Simon Que <[email protected]>Signed-off-by Duncan Laurie <[email protected]>Signed-off-by Dmitry Torokhov <[email protected]>---
Changes form previous submission:
- moved from
drivers/ledstodrivers/platform/chrome
- added method to retrieve brightness from ACPI
- renamed tocros_kbd_led_backlight
- config option renamed toCROS_KBD_LED_BACKLIGHT
- no longer setting initial brightness to max brightness (although on Pixel 1 - Link - ACPI initially reports 100 as brightness anyway)I ran this on Pixel 1; Evan, could you give it a spin on your Pixel 2?
Thanks!
drivers/platform/chrome/Kconfig | 10 ++ drivers/platform/chrome/Makefile | 15 +-- drivers/platform/chrome/cros_kbd_led_backlight.c | 123 +++++++++++++++++++++++ 3 files changed, 141 insertions(+), 7 deletions(-)drivers/platform/chrome/Kconfig +10
-0@@ -64,4 +64,14 @@ config CROS_EC_PROTO help ChromeOS EC communication protocol helpers. +config CROS_KBD_LED_BACKLIGHT + tristate "Backlight LED support for Chrome OS keyboards" + depends on LEDS_CLASS && ACPI + help + This option enables support for the keyboard backlight LEDs on + select Chrome OS systems. + + To compile this driver as a module, choose M here: the + module will be called cros_kbd_led_backlight. + endif # CHROMEOS_PLATFORMSdrivers/platform/chrome/Makefile +8
-7@@ -1,8 +1,9 @@ -obj-$(CONFIG_CHROMEOS_LAPTOP) += chromeos_laptop.o -obj-$(CONFIG_CHROMEOS_PSTORE) += chromeos_pstore.o -cros_ec_devs-objs := cros_ec_dev.o cros_ec_sysfs.o \ - cros_ec_lightbar.o cros_ec_vbc.o -obj-$(CONFIG_CROS_EC_CHARDEV) += cros_ec_devs.o -obj-$(CONFIG_CROS_EC_LPC) += cros_ec_lpc.o -obj-$(CONFIG_CROS_EC_PROTO) += cros_ec_proto.o +obj-$(CONFIG_CHROMEOS_LAPTOP) += chromeos_laptop.o +obj-$(CONFIG_CHROMEOS_PSTORE) += chromeos_pstore.o +cros_ec_devs-objs := cros_ec_dev.o cros_ec_sysfs.o \ + cros_ec_lightbar.o cros_ec_vbc.o +obj-$(CONFIG_CROS_EC_CHARDEV) += cros_ec_devs.o +obj-$(CONFIG_CROS_EC_LPC) += cros_ec_lpc.o +obj-$(CONFIG_CROS_EC_PROTO) += cros_ec_proto.o +obj-$(CONFIG_CROS_KBD_LED_BACKLIGHT) += cros_kbd_led_backlight.odrivers/platform/chrome/cros_kbd_led_backlight.c new file +91
-0@@ -0,0 +1,123 @@ +/* +* Keyboard backlight LED driver for Chrome OS. +* +* Copyright (C) 2012 Google, Inc. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include <linux/acpi.h> +#include <linux/leds.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/slab.h> + +/* Keyboard LED ACPI Device must be defined in firmware */ +#define ACPI_KEYBOARD_BACKLIGHT_DEVICE "\\_SB.KBLT" +#define ACPI_KEYBOARD_BACKLIGHT_READ ACPI_KEYBOARD_BACKLIGHT_DEVICE ".KBQC" +#define ACPI_KEYBOARD_BACKLIGHT_WRITE ACPI_KEYBOARD_BACKLIGHT_DEVICE ".KBCM" + +#define ACPI_KEYBOARD_BACKLIGHT_MAX 100 + +static void keyboard_led_set_brightness (struct led_classdev *cdev, +enum led_brightness brightness) +{ +union acpi_object param; +struct acpi_object_list input; +acpi_status status; + + param.type =ACPI_TYPE_INTEGER ; + param.integer.value = brightness; + input.count =1 ; + input.pointer = ¶m; + + status =acpi_evaluate_object (NULL ,ACPI_KEYBOARD_BACKLIGHT_WRITE , + &input,NULL ); +if (ACPI_FAILURE (status)) +dev_err (cdev->dev,"Error setting keyboard LED value: %d\n" , + status); +} + +static enum led_brightness +keyboard_led_get_brightness (struct led_classdev *cdev) +{ +unsigned long long brightness; +acpi_status status; + + status =acpi_evaluate_integer (NULL ,ACPI_KEYBOARD_BACKLIGHT_READ , +NULL , &brightness); +if (ACPI_FAILURE (status)) { +dev_err (cdev->dev,"Error getting keyboard LED value: %d\n" , + status); +return -EIO ; + } + +return brightness; +} + +static int keyboard_led_probe (struct platform_device *pdev) +{ +struct led_classdev *cdev; +acpi_handle handle; +acpi_status status; +int error; + +/* Look for the keyboard LED ACPI Device */ + status =acpi_get_handle (ACPI_ROOT_OBJECT , +ACPI_KEYBOARD_BACKLIGHT_DEVICE , + &handle); +if (ACPI_FAILURE (status)) { +dev_err (&pdev->dev,"Unable to find ACPI device %s: %d\n" , +ACPI_KEYBOARD_BACKLIGHT_DEVICE , status); +return -ENXIO ; + } + + cdev =devm_kzalloc (&pdev->dev,sizeof (*cdev),GFP_KERNEL ); +if (!cdev) +return -ENOMEM ; + + cdev->name ="chromeos::kbd_backlight" ;
drivers/platform/chrome/cros_kbd_led_backlight.c line 101
Quoted 10 lines
drivers/platform/chrome/cros_kbd_led_backlight.c new file +10
-0+ cdev->max_brightness =ACPI_KEYBOARD_BACKLIGHT_MAX ; + cdev->flags |=LED_CORE_SUSPENDRESUME ; + cdev->brightness_set = keyboard_led_set_brightness; + cdev->brightness_get = keyboard_led_get_brightness; + + error =devm_led_classdev_register (&pdev->dev, cdev); +if (error) +return error; + +platform_set_drvdata (pdev, cdev);
Is this needed ?
Thanks,
Guenter
Quoted 28 lines
drivers/platform/chrome/cros_kbd_led_backlight.c new file +22
-1+return 0 ; +} + +static const struct acpi_device_id keyboard_led_id[] = { + {"GOOG0002" ,0 }, + { } +}; +MODULE_DEVICE_TABLE (acpi, keyboard_led_id); + +static struct platform_driver keyboard_led_driver = { + .driver = { + .name ="chromeos-keyboard-leds" , + .acpi_match_table =ACPI_PTR (keyboard_led_id), + }, + .probe = keyboard_led_probe, +}; +module_platform_driver (keyboard_led_driver); + +MODULE_AUTHOR ("Simon Que <[email protected]>" ); +MODULE_DESCRIPTION ("ChromeOS Keyboard backlight LED Driver" ); +MODULE_LICENSE ("GPL" ); +MODULE_ALIAS ("platform:chromeos-keyboard-leds" ); --2.7.0.rc3.207.g0ac5344
--
Dmitry
Quoted 18 lines · Dmitry Torokhov
This is a driver for ACPI-based keyboard backlight LEDs found on Chromebooks. The driver locates \\_SB.KBLT ACPI device and exports backlight as "
chromeos::kbd_backlight" LED class device in sysfs.Signed-off-by Simon Que <[email protected]>Signed-off-by Duncan Laurie <[email protected]>Signed-off-by Dmitry Torokhov <[email protected]>---
Changes form previous submission:
- moved from
drivers/ledstodrivers/platform/chrome
- added method to retrieve brightness from ACPI
- renamed tocros_kbd_led_backlight
- config option renamed toCROS_KBD_LED_BACKLIGHT
- no longer setting initial brightness to max brightness (although on Pixel 1 - Link - ACPI initially reports 100 as brightness anyway)
Quoted 2 lines
I ran this on Pixel 1; Evan, could you give it a spin on your Pixel 2?
Works fine here.
Thanks
Signature · 2 lines
Evan McClain https://keybase.io/aeroevan