Message ID | 20240216160526.235594-2-hpa@redhat.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | KTD2026 indicator LED for X86 Xiaomi Pad2 | expand |
Hi Kate, On 2/16/24 17:05, Kate Hsuan wrote: > There is a KTD2026 LED controller to manage the indicator LED for Xiaomi > pad2. The ACPI for it is not properly made so the kernel can't get > a correct description of it. > > This work add a description for this RGB LED controller and also set a > trigger to indicate the chaging event (bq27520-0-charging). When it is > charging, the indicator LED will be turn on. > > Signed-off-by: Kate Hsuan <hpa@redhat.com> > --- > .../platform/x86/x86-android-tablets/other.c | 85 +++++++++++++++++++ > .../x86/x86-android-tablets/shared-psy-info.h | 2 + > 2 files changed, 87 insertions(+) > > diff --git a/drivers/platform/x86/x86-android-tablets/other.c b/drivers/platform/x86/x86-android-tablets/other.c > index bc6bbf7ec6ea..542ef6667b7b 100644 > --- a/drivers/platform/x86/x86-android-tablets/other.c > +++ b/drivers/platform/x86/x86-android-tablets/other.c > @@ -12,6 +12,7 @@ > #include <linux/gpio/machine.h> > #include <linux/input.h> > #include <linux/platform_device.h> > +#include <dt-bindings/leds/common.h> > > #include "shared-psy-info.h" > #include "x86-android-tablets.h" > @@ -593,6 +594,87 @@ const struct x86_dev_info whitelabel_tm800a550l_info __initconst = { > .gpiod_lookup_tables = whitelabel_tm800a550l_gpios, > }; > > +/* > + * The fwnode for ktd2026 on Xaomi pad2. It composed of a RGB LED node > + * with three subnodes for each color (B/G/R). The RGB LED node is named > + * "multi-led" to align with the name in the device tree. > + */ > + > +/* main fwnode for ktd2026 */ > +static const struct software_node ktd2026_node = { > +}; > + > +static const struct property_entry ktd2026_rgb_led_props[] = { > + PROPERTY_ENTRY_U32("reg", 0), > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RGB), > + PROPERTY_ENTRY_STRING("function", "indicator"), > + PROPERTY_ENTRY_STRING("linux,default-trigger", > + "bq27520-0-charging"), > + > + { } > +}; What is the result of setting this default trigger on the multi-color LED class device ? Will the LED now turn on at whatever color it was last set (presumably white?) when charging and turn off again when charging is complete, or the charger is plugged out ? Regards, Hans > + > +static const struct software_node ktd2026_rgb_led_node = { > + .name = "multi-led", > + .properties = ktd2026_rgb_led_props, > + .parent = &ktd2026_node, > +}; > + > +/* B */ > +static const struct property_entry ktd2026_red_led_props[] = { > + PROPERTY_ENTRY_U32("reg", 0), > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_BLUE), > + { } > +}; > + > +static const struct software_node ktd2026_red_led_node = { > + .properties = ktd2026_red_led_props, > + .parent = &ktd2026_rgb_led_node, > +}; > + > +/* G */ > +static const struct property_entry ktd2026_green_led_props[] = { > + PROPERTY_ENTRY_U32("reg", 1), > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_GREEN), > + { } > +}; > + > +static const struct software_node ktd2026_green_led_node = { > + .properties = ktd2026_green_led_props, > + .parent = &ktd2026_rgb_led_node, > +}; > + > +/* R */ > +static const struct property_entry ktd2026_blue_led_props[] = { > + PROPERTY_ENTRY_U32("reg", 2), > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RED), > + { } > +}; > + > +static const struct software_node ktd2026_blue_led_node = { > + .properties = ktd2026_blue_led_props, > + .parent = &ktd2026_rgb_led_node, > +}; > + > +static const struct software_node *ktd2026_node_group[] = { > + &ktd2026_node, > + &ktd2026_rgb_led_node, > + &ktd2026_red_led_node, > + &ktd2026_green_led_node, > + &ktd2026_blue_led_node, > + NULL > +}; > + > +static int __init xiaomi_mipad2_init(void) > +{ > + return software_node_register_node_group(ktd2026_node_group); > +} > + > +static void xiaomi_mipad2_exit(void) > +{ > + software_node_unregister_node_group(ktd2026_node_group); > +} > + > /* > * If the EFI bootloader is not Xiaomi's own signed Android loader, then the > * Xiaomi Mi Pad 2 X86 tablet sets OSID in the DSDT to 1 (Windows), causing > @@ -616,6 +698,7 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst > .type = "ktd2026", > .addr = 0x30, > .dev_name = "ktd2026", > + .swnode = &ktd2026_node, > }, > .adapter_path = "\\_SB_.PCI0.I2C3", > }, > @@ -624,4 +707,6 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst > const struct x86_dev_info xiaomi_mipad2_info __initconst = { > .i2c_client_info = xiaomi_mipad2_i2c_clients, > .i2c_client_count = ARRAY_SIZE(xiaomi_mipad2_i2c_clients), > + .init = xiaomi_mipad2_init, > + .exit = xiaomi_mipad2_exit, > }; > diff --git a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > index c2d2968cddc2..8c33ec47ee12 100644 > --- a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > +++ b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > @@ -29,4 +29,6 @@ extern const char * const bq24190_modules[]; > extern const struct platform_device_info int3496_pdevs[]; > extern struct gpiod_lookup_table int3496_reference_gpios; > > +extern const struct software_node ktd2026_leds_node; > + > #endif
Hi Hans, On Mon, Feb 19, 2024 at 10:07 PM Hans de Goede <hdegoede@redhat.com> wrote: > > Hi Kate, > > On 2/16/24 17:05, Kate Hsuan wrote: > > There is a KTD2026 LED controller to manage the indicator LED for Xiaomi > > pad2. The ACPI for it is not properly made so the kernel can't get > > a correct description of it. > > > > This work add a description for this RGB LED controller and also set a > > trigger to indicate the chaging event (bq27520-0-charging). When it is > > charging, the indicator LED will be turn on. > > > > Signed-off-by: Kate Hsuan <hpa@redhat.com> > > --- > > .../platform/x86/x86-android-tablets/other.c | 85 +++++++++++++++++++ > > .../x86/x86-android-tablets/shared-psy-info.h | 2 + > > 2 files changed, 87 insertions(+) > > > > diff --git a/drivers/platform/x86/x86-android-tablets/other.c b/drivers/platform/x86/x86-android-tablets/other.c > > index bc6bbf7ec6ea..542ef6667b7b 100644 > > --- a/drivers/platform/x86/x86-android-tablets/other.c > > +++ b/drivers/platform/x86/x86-android-tablets/other.c > > @@ -12,6 +12,7 @@ > > #include <linux/gpio/machine.h> > > #include <linux/input.h> > > #include <linux/platform_device.h> > > +#include <dt-bindings/leds/common.h> > > > > #include "shared-psy-info.h" > > #include "x86-android-tablets.h" > > @@ -593,6 +594,87 @@ const struct x86_dev_info whitelabel_tm800a550l_info __initconst = { > > .gpiod_lookup_tables = whitelabel_tm800a550l_gpios, > > }; > > > > +/* > > + * The fwnode for ktd2026 on Xaomi pad2. It composed of a RGB LED node > > + * with three subnodes for each color (B/G/R). The RGB LED node is named > > + * "multi-led" to align with the name in the device tree. > > + */ > > + > > +/* main fwnode for ktd2026 */ > > +static const struct software_node ktd2026_node = { > > +}; > > + > > +static const struct property_entry ktd2026_rgb_led_props[] = { > > + PROPERTY_ENTRY_U32("reg", 0), > > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RGB), > > + PROPERTY_ENTRY_STRING("function", "indicator"), > > + PROPERTY_ENTRY_STRING("linux,default-trigger", > > + "bq27520-0-charging"), > > + > > + { } > > +}; > > What is the result of setting this default trigger on > the multi-color LED class device ? Thank you for reviewing it. > > Will the LED now turn on at whatever color it was last > set (presumably white?) You are right. It is white. > when charging and turn off > again when charging is complete, or the charger is plugged out ? The behavior is simple. It is lit up when the charger is connected. It is turned off when the charger is disconnected. Many triggers can be used. bq27520-0-charging-or-full [bq27520-0-charging] bq27520-0-full bq27520-0-charging-blink-full-solid I think bq27520-0-charging-or-full or bq27520-0-charging-blink-full-solid can be used in the v3 patch. (The battery status is always "charging" for my Xiaomi pad2. Even the battery is 100%. When the pad is off and then connect the charger, it will be turned on immediately. The LED will be lit up after the kernel module is loaded) > > Regards, > > Hans > > > > > > + > > +static const struct software_node ktd2026_rgb_led_node = { > > + .name = "multi-led", > > + .properties = ktd2026_rgb_led_props, > > + .parent = &ktd2026_node, > > +}; > > + > > +/* B */ > > +static const struct property_entry ktd2026_red_led_props[] = { > > + PROPERTY_ENTRY_U32("reg", 0), > > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_BLUE), > > + { } > > +}; > > + > > +static const struct software_node ktd2026_red_led_node = { > > + .properties = ktd2026_red_led_props, > > + .parent = &ktd2026_rgb_led_node, > > +}; > > + > > +/* G */ > > +static const struct property_entry ktd2026_green_led_props[] = { > > + PROPERTY_ENTRY_U32("reg", 1), > > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_GREEN), > > + { } > > +}; > > + > > +static const struct software_node ktd2026_green_led_node = { > > + .properties = ktd2026_green_led_props, > > + .parent = &ktd2026_rgb_led_node, > > +}; > > + > > +/* R */ > > +static const struct property_entry ktd2026_blue_led_props[] = { > > + PROPERTY_ENTRY_U32("reg", 2), > > + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RED), > > + { } > > +}; > > + > > +static const struct software_node ktd2026_blue_led_node = { > > + .properties = ktd2026_blue_led_props, > > + .parent = &ktd2026_rgb_led_node, > > +}; > > + > > +static const struct software_node *ktd2026_node_group[] = { > > + &ktd2026_node, > > + &ktd2026_rgb_led_node, > > + &ktd2026_red_led_node, > > + &ktd2026_green_led_node, > > + &ktd2026_blue_led_node, > > + NULL > > +}; > > + > > +static int __init xiaomi_mipad2_init(void) > > +{ > > + return software_node_register_node_group(ktd2026_node_group); > > +} > > + > > +static void xiaomi_mipad2_exit(void) > > +{ > > + software_node_unregister_node_group(ktd2026_node_group); > > +} > > + > > /* > > * If the EFI bootloader is not Xiaomi's own signed Android loader, then the > > * Xiaomi Mi Pad 2 X86 tablet sets OSID in the DSDT to 1 (Windows), causing > > @@ -616,6 +698,7 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst > > .type = "ktd2026", > > .addr = 0x30, > > .dev_name = "ktd2026", > > + .swnode = &ktd2026_node, > > }, > > .adapter_path = "\\_SB_.PCI0.I2C3", > > }, > > @@ -624,4 +707,6 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst > > const struct x86_dev_info xiaomi_mipad2_info __initconst = { > > .i2c_client_info = xiaomi_mipad2_i2c_clients, > > .i2c_client_count = ARRAY_SIZE(xiaomi_mipad2_i2c_clients), > > + .init = xiaomi_mipad2_init, > > + .exit = xiaomi_mipad2_exit, > > }; > > diff --git a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > > index c2d2968cddc2..8c33ec47ee12 100644 > > --- a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > > +++ b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h > > @@ -29,4 +29,6 @@ extern const char * const bq24190_modules[]; > > extern const struct platform_device_info int3496_pdevs[]; > > extern struct gpiod_lookup_table int3496_reference_gpios; > > > > +extern const struct software_node ktd2026_leds_node; > > + > > #endif >
diff --git a/drivers/platform/x86/x86-android-tablets/other.c b/drivers/platform/x86/x86-android-tablets/other.c index bc6bbf7ec6ea..542ef6667b7b 100644 --- a/drivers/platform/x86/x86-android-tablets/other.c +++ b/drivers/platform/x86/x86-android-tablets/other.c @@ -12,6 +12,7 @@ #include <linux/gpio/machine.h> #include <linux/input.h> #include <linux/platform_device.h> +#include <dt-bindings/leds/common.h> #include "shared-psy-info.h" #include "x86-android-tablets.h" @@ -593,6 +594,87 @@ const struct x86_dev_info whitelabel_tm800a550l_info __initconst = { .gpiod_lookup_tables = whitelabel_tm800a550l_gpios, }; +/* + * The fwnode for ktd2026 on Xaomi pad2. It composed of a RGB LED node + * with three subnodes for each color (B/G/R). The RGB LED node is named + * "multi-led" to align with the name in the device tree. + */ + +/* main fwnode for ktd2026 */ +static const struct software_node ktd2026_node = { +}; + +static const struct property_entry ktd2026_rgb_led_props[] = { + PROPERTY_ENTRY_U32("reg", 0), + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RGB), + PROPERTY_ENTRY_STRING("function", "indicator"), + PROPERTY_ENTRY_STRING("linux,default-trigger", + "bq27520-0-charging"), + + { } +}; + +static const struct software_node ktd2026_rgb_led_node = { + .name = "multi-led", + .properties = ktd2026_rgb_led_props, + .parent = &ktd2026_node, +}; + +/* B */ +static const struct property_entry ktd2026_red_led_props[] = { + PROPERTY_ENTRY_U32("reg", 0), + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_BLUE), + { } +}; + +static const struct software_node ktd2026_red_led_node = { + .properties = ktd2026_red_led_props, + .parent = &ktd2026_rgb_led_node, +}; + +/* G */ +static const struct property_entry ktd2026_green_led_props[] = { + PROPERTY_ENTRY_U32("reg", 1), + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_GREEN), + { } +}; + +static const struct software_node ktd2026_green_led_node = { + .properties = ktd2026_green_led_props, + .parent = &ktd2026_rgb_led_node, +}; + +/* R */ +static const struct property_entry ktd2026_blue_led_props[] = { + PROPERTY_ENTRY_U32("reg", 2), + PROPERTY_ENTRY_U32("color", LED_COLOR_ID_RED), + { } +}; + +static const struct software_node ktd2026_blue_led_node = { + .properties = ktd2026_blue_led_props, + .parent = &ktd2026_rgb_led_node, +}; + +static const struct software_node *ktd2026_node_group[] = { + &ktd2026_node, + &ktd2026_rgb_led_node, + &ktd2026_red_led_node, + &ktd2026_green_led_node, + &ktd2026_blue_led_node, + NULL +}; + +static int __init xiaomi_mipad2_init(void) +{ + return software_node_register_node_group(ktd2026_node_group); +} + +static void xiaomi_mipad2_exit(void) +{ + software_node_unregister_node_group(ktd2026_node_group); +} + /* * If the EFI bootloader is not Xiaomi's own signed Android loader, then the * Xiaomi Mi Pad 2 X86 tablet sets OSID in the DSDT to 1 (Windows), causing @@ -616,6 +698,7 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst .type = "ktd2026", .addr = 0x30, .dev_name = "ktd2026", + .swnode = &ktd2026_node, }, .adapter_path = "\\_SB_.PCI0.I2C3", }, @@ -624,4 +707,6 @@ static const struct x86_i2c_client_info xiaomi_mipad2_i2c_clients[] __initconst const struct x86_dev_info xiaomi_mipad2_info __initconst = { .i2c_client_info = xiaomi_mipad2_i2c_clients, .i2c_client_count = ARRAY_SIZE(xiaomi_mipad2_i2c_clients), + .init = xiaomi_mipad2_init, + .exit = xiaomi_mipad2_exit, }; diff --git a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h index c2d2968cddc2..8c33ec47ee12 100644 --- a/drivers/platform/x86/x86-android-tablets/shared-psy-info.h +++ b/drivers/platform/x86/x86-android-tablets/shared-psy-info.h @@ -29,4 +29,6 @@ extern const char * const bq24190_modules[]; extern const struct platform_device_info int3496_pdevs[]; extern struct gpiod_lookup_table int3496_reference_gpios; +extern const struct software_node ktd2026_leds_node; + #endif
There is a KTD2026 LED controller to manage the indicator LED for Xiaomi pad2. The ACPI for it is not properly made so the kernel can't get a correct description of it. This work add a description for this RGB LED controller and also set a trigger to indicate the chaging event (bq27520-0-charging). When it is charging, the indicator LED will be turn on. Signed-off-by: Kate Hsuan <hpa@redhat.com> --- .../platform/x86/x86-android-tablets/other.c | 85 +++++++++++++++++++ .../x86/x86-android-tablets/shared-psy-info.h | 2 + 2 files changed, 87 insertions(+)