From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6347D34104B; Sat, 30 May 2026 17:08:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160907; cv=none; b=ZXZ4EpsdWCYHhPrpxiGjV1MRIY661Rb64H1+1tWIJpy/e8EB9r9vxylRioJgCO46uAYhFTAyjkBmXEmFlKgxsvnXtj3we2PAhOVrq4F9IdURELGf7bAvyLfsR+908ZyHF26mPFar9VuR6dI/UqUp3gThqEpalYvai6V5HlfV0qk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160907; c=relaxed/simple; bh=ompSXeXYx/a39mO1OsBxKknBFvmAevt6wFCGqlgGlgc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FqNFxbvREogD2Sksee/KjXt6CgUD7jAwXgkRIS/E6QKuLO1UJlwm1VEFmI1wl+96ukHCcLQNuNsB7Ql6stpRg5O7BReBuCtYLEnb/k5qGn69iSD2xLAnN83Uk9NAe67re1f+vbBn+c6dB6Xf49YvwatGT0HaHzlUO3dpsJo6dxc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=VPoRcPUM; arc=none smtp.client-ip=212.227.17.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="VPoRcPUM" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160902; x=1780765702; i=w_armin@gmx.de; bh=gkRk4JY2Ksgn3gniRstDy80OcK4f5fTyJ1e1CTy7PJM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=VPoRcPUMMjV2I59OWhUDjtbM91dXxyn0rb1NLme/00yOpK1piwXS4YCcI+n97hfB vYA4k695Q77caokZRmJloe3uCb4giqq+oJWRqkTeJEl17o+oHap6c9ziAFliiNmwu J3lvhKDJPh8nAe6QtMJu8VNzfVgrscuXw5ogPOPQCcWNznRrrXL4T/DrDwiLV7YRJ ZeF0fVTItrfatrh+LtlQgXNExgVUlFDET02IDWW8Qt3LYuGd1OBT/tOEE+IDB+Lle W1GULR7hprXhW3j9TrB2/Qjp76sMIJZNjRTI6o0ZRHZRvukwR/pro/m67Dt653DmS zixF2TaVk8ROszUwug== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MbzuB-1x0mNd2oBj-00fJAZ; Sat, 30 May 2026 19:08:22 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 1/7] platform/x86: uniwill-laptop: Add keyboard backlight support Date: Sat, 30 May 2026 19:08:07 +0200 Message-Id: <20260530170813.10166-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Kx0Va9ciVLPkPec6u/HCZOThV42T+XLT0er7KJCuAWHvcWj2Y74 uHlUkPOcvJCKeLcxXn1tAGYirf3Al2r+nJZwC5zIbxE0ZGXyXXeLIyFMgZP0OhKhiloW/mb W/GBBasKwLN2kOcjUhG9a8I6ccRF7l5/WaADQEzEIp9wOlFYNNDzniQABo2O5ivWmcJi4dw gko3QZ3uL9uZrmHHQlOdQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:VcwIhsUrJnY=;jAqRxmzXURK+MXI5/lBOB9ACNO7 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 3MwjNlZrdbLeqq096U= Content-Type: text/plain; charset="utf-8" Many Uniwill-based devices support either a white-only or fully features RGB keyboard backlight. Add support for this feature and handle the associated WMI events. Signed-off-by: Armin Wolf --- .../admin-guide/laptops/uniwill-laptop.rst | 13 + drivers/platform/x86/uniwill/uniwill-acpi.c | 392 +++++++++++++++++- 2 files changed, 397 insertions(+), 8 deletions(-) diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index 24b41dbab886..2b1e5da703a5 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -77,6 +77,19 @@ LED class device. The default name of this LED class dev= ice is ``uniwill:multico See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details on h= ow to control the various animation modes of the lightbar. =20 +Keyboard Backlight +------------------ + +The ``uniwill-laptop`` driver supports controlling the keyboard backlight = using the standard +LED class interface. The default name of this LED class device is ``uniwil= l:white:kbd_backlight`` +when the keyboard backlight supports only a single color, or ``uniwill:mul= ticolor:kbd_backlight`` +when the keyboard backlight supports RGB colors. The maximum intensity for= each color channel +in RGB mode is 50. + +Keep in mind that due to hardware design choices, the driver does not supp= ort the RGB value +``0x000000`` (black), instead it will fall back to ``0x010101`` (faint whi= te). In order to +disable the keyboard backlight, the standard LED brightness setting has to= be used instead. + Configurable TGP ---------------- =20 diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index ab063ead45b9..fd040197b189 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -110,8 +110,31 @@ #define EC_ADDR_BAT_CYCLE_COUNT_2 0x04A7 =20 #define EC_ADDR_PROJECT_ID 0x0740 +#define PROJECT_ID_NONE 0x00 +#define PROJECT_ID_GI 0x01 +#define PROJECT_ID_GJ 0x02 +#define PROJECT_ID_GK 0x03 +#define PROJECT_ID_GICN 0x04 +#define PROJECT_ID_GJCN 0x05 +#define PROJECT_ID_GK5CN_X 0x06 +#define PROJECT_ID_GK7CN_S 0x07 +#define PROJECT_ID_GK7CPCS_GK5CQ7Z 0x08 +#define PROJECT_ID_PF 0x09 +#define PROJECT_ID_GK5CP_4X_5X_6X 0x0A +#define PROJECT_ID_IDP 0x0B +#define PROJECT_ID_IDY_6Y 0x0C +#define PROJECT_ID_IDY_7Y 0x0D +#define PROJECT_ID_PF4MU_PF4MN_PF5MU 0x0E +#define PROJECT_ID_CML_GAMING 0x0F +#define PROJECT_ID_GK7NXXR 0x10 +#define PROJECT_ID_GM5MU1Y 0x11 #define PROJECT_ID_PH4TRX1 0x12 +#define PROJECT_ID_PH4TUX1 0x13 +#define PROJECT_ID_PH4TQX1 0x14 #define PROJECT_ID_PH6TRX1 0x15 +#define PROJECT_ID_PH6TQXX 0x16 +#define PROJECT_ID_PHXAXXX 0x17 +#define PROJECT_ID_PHXPXXX 0x18 =20 #define EC_ADDR_AP_OEM 0x0741 #define ENABLE_MANUAL_CTRL BIT(0) @@ -214,6 +237,7 @@ #define FAN_TABLE_OFFICE_MODE BIT(2) #define FAN_V3 BIT(3) #define DEFAULT_MODE BIT(4) +#define ENABLE_CHINA_MODE BIT(6) =20 #define EC_ADDR_PL1_SETTING 0x0783 =20 @@ -225,11 +249,11 @@ #define FAN_CURVE_LENGTH 5 =20 #define EC_ADDR_KBD_STATUS 0x078C -#define KBD_WHITE_ONLY BIT(0) // ~single color -#define KBD_SINGLE_COLOR_OFF BIT(1) +#define KBD_WHITE_ONLY BIT(0) +#define KBD_POWER_OFF BIT(1) #define KBD_TURBO_LEVEL_MASK GENMASK(3, 2) #define KBD_APPLY BIT(4) -#define KBD_BRIGHTNESS GENMASK(7, 5) +#define KBD_BRIGHTNESS_MASK GENMASK(7, 5) =20 #define EC_ADDR_FAN_CTRL 0x078E #define FAN3P5 BIT(1) @@ -320,6 +344,9 @@ #define LED_CHANNELS 3 #define LED_MAX_BRIGHTNESS 200 =20 +#define KBD_LED_CHANNELS 3 +#define KBD_LED_MAX_INTENSITY 50 + #define UNIWILL_FEATURE_FN_LOCK BIT(0) #define UNIWILL_FEATURE_SUPER_KEY BIT(1) #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2) @@ -333,6 +360,7 @@ #define UNIWILL_FEATURE_SECONDARY_FAN BIT(9) #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(10) #define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(11) +#define UNIWILL_FEATURE_KEYBOARD_BACKLIGHT BIT(12) =20 enum usb_c_power_priority_options { USB_C_POWER_PRIORITY_CHARGING =3D 0, @@ -344,6 +372,7 @@ struct uniwill_data { acpi_handle handle; struct regmap *regmap; unsigned int features; + u8 project_id; struct acpi_battery_hook hook; struct mutex battery_lock; /* Protects the list of currently registered b= atteries */ union { @@ -362,6 +391,18 @@ struct uniwill_data { struct mutex led_lock; /* Protects writes to the lightbar registers */ struct led_classdev_mc led_mc_cdev; struct mc_subled led_mc_subled_info[LED_CHANNELS]; + bool single_color_kbd; + u8 kbd_led_max_brightness; + unsigned int last_kbd_status; + union { + struct { + /* Protects writes to the RGB keyboard backlight registers */ + struct mutex kbd_rgb_led_lock; + struct led_classdev_mc kbd_led_mc_cdev; + struct mc_subled kbd_led_mc_subled_info[KBD_LED_CHANNELS]; + }; + struct led_classdev kbd_led_cdev; + }; struct mutex input_lock; /* Protects input sequence during notify */ struct input_dev *input_device; struct notifier_block nb; @@ -376,6 +417,7 @@ struct uniwill_battery_entry { =20 struct uniwill_device_descriptor { unsigned int features; + u8 kbd_led_max_brightness; /* Executed during driver probing */ int (*probe)(struct uniwill_data *data); }; @@ -427,6 +469,9 @@ static const struct key_entry uniwill_keymap[] =3D { { KE_KEY, UNIWILL_OSD_KBDILLUMDOWN, { KEY_KBDILLUMDOW= N }}, { KE_KEY, UNIWILL_OSD_KBDILLUMUP, { KEY_KBDILLUMUP = }}, =20 + /* Reported when the EC changed the keyboard backlight brightness */ + { KE_IGNORE, UNIWILL_OSD_BACKLIGHT_LEVEL_CHANGE, { KEY_UNKNOWN }}, + /* Reported when the user wants to toggle the microphone mute status */ { KE_KEY, UNIWILL_OSD_MIC_MUTE, { KEY_MICMUTE }}, =20 @@ -435,11 +480,6 @@ static const struct key_entry uniwill_keymap[] =3D { =20 /* Reported when the user wants to toggle the brightness of the keyboard = */ { KE_KEY, UNIWILL_OSD_KBDILLUMTOGGLE, { KEY_KBDILLUMTOG= GLE }}, - { KE_KEY, UNIWILL_OSD_KB_LED_LEVEL0, { KEY_KBDILLUMTOG= GLE }}, - { KE_KEY, UNIWILL_OSD_KB_LED_LEVEL1, { KEY_KBDILLUMTOG= GLE }}, - { KE_KEY, UNIWILL_OSD_KB_LED_LEVEL2, { KEY_KBDILLUMTOG= GLE }}, - { KE_KEY, UNIWILL_OSD_KB_LED_LEVEL3, { KEY_KBDILLUMTOG= GLE }}, - { KE_KEY, UNIWILL_OSD_KB_LED_LEVEL4, { KEY_KBDILLUMTOG= GLE }}, =20 /* FIXME: find out the exact meaning of those events */ { KE_IGNORE, UNIWILL_OSD_BAT_CHARGE_FULL_24_H, { KEY_UNKNOWN }}, @@ -547,6 +587,11 @@ static bool uniwill_writeable_reg(struct device *dev, = unsigned int reg) case EC_ADDR_LIGHTBAR_AC_BLUE: case EC_ADDR_BIOS_OEM: case EC_ADDR_TRIGGER: + case EC_ADDR_RGB_RED: + case EC_ADDR_RGB_GREEN: + case EC_ADDR_RGB_BLUE: + case EC_ADDR_BIOS_OEM_2: + case EC_ADDR_KBD_STATUS: case EC_ADDR_OEM_4: case EC_ADDR_CHARGE_CTRL: case EC_ADDR_LIGHTBAR_BAT_CTRL: @@ -583,8 +628,14 @@ static bool uniwill_readable_reg(struct device *dev, u= nsigned int reg) case EC_ADDR_BIOS_OEM: case EC_ADDR_PWM_1: case EC_ADDR_PWM_2: + case EC_ADDR_SUPPORT_2: case EC_ADDR_TRIGGER: case EC_ADDR_SWITCH_STATUS: + case EC_ADDR_RGB_RED: + case EC_ADDR_RGB_GREEN: + case EC_ADDR_RGB_BLUE: + case EC_ADDR_BIOS_OEM_2: + case EC_ADDR_KBD_STATUS: case EC_ADDR_OEM_4: case EC_ADDR_CHARGE_CTRL: case EC_ADDR_LIGHTBAR_BAT_CTRL: @@ -616,8 +667,10 @@ static bool uniwill_volatile_reg(struct device *dev, u= nsigned int reg) case EC_ADDR_BIOS_OEM: case EC_ADDR_PWM_1: case EC_ADDR_PWM_2: + case EC_ADDR_SUPPORT_2: case EC_ADDR_TRIGGER: case EC_ADDR_SWITCH_STATUS: + case EC_ADDR_KBD_STATUS: case EC_ADDR_OEM_4: case EC_ADDR_CHARGE_CTRL: case EC_ADDR_USB_C_POWER_PRIORITY: @@ -1441,6 +1494,246 @@ static int uniwill_led_init(struct uniwill_data *da= ta) &init_data); } =20 +static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightnes= s) +{ + struct led_classdev *led_cdev; + int ret; + + if (data->single_color_kbd) + led_cdev =3D &data->kbd_led_cdev; + else + led_cdev =3D &data->kbd_led_mc_cdev.led_cdev; + + guard(mutex)(&led_cdev->led_access); + + /* Sync the LED brightness with the actual hardware state */ + ret =3D led_update_brightness(led_cdev); + if (ret < 0) + return ret; + + led_classdev_notify_brightness_hw_changed(led_cdev, brightness); + + return 0; +} + +#define KBD_LED_MASK (KBD_BRIGHTNESS_MASK | KBD_APPLY | KBD_POWER_OFF) + +static int uniwill_kbd_led_write_brightness(struct uniwill_data *data, int= brightness) +{ + /* KBD_POWER_OFF is always implicitly cleared */ + unsigned int regval =3D FIELD_PREP(KBD_BRIGHTNESS_MASK, brightness) | KBD= _APPLY; + + /* We must ensure that the "apply" bit is always written */ + return regmap_write_bits(data->regmap, EC_ADDR_KBD_STATUS, KBD_LED_MASK, = regval); +} + +static int uniwill_kbd_led_read_brightness(struct uniwill_data *data) +{ + unsigned int regval; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_KBD_STATUS, ®val); + if (ret < 0) + return ret; + + return min(FIELD_GET(KBD_BRIGHTNESS_MASK, regval), data->kbd_led_max_brig= htness); +} + +static int uniwill_kbd_led_brightness_set(struct led_classdev *led_cdev, + enum led_brightness brightness) +{ + struct uniwill_data *data =3D container_of(led_cdev, struct uniwill_data,= kbd_led_cdev); + + return uniwill_kbd_led_write_brightness(data, brightness); +} + +static enum led_brightness uniwill_kbd_led_brightness_get(struct led_class= dev *led_cdev) +{ + struct uniwill_data *data =3D container_of(led_cdev, struct uniwill_data,= kbd_led_cdev); + + return uniwill_kbd_led_read_brightness(data); +} + +static const unsigned int uniwill_kbd_led_channel_to_reg[KBD_LED_CHANNELS]= =3D { + EC_ADDR_RGB_RED, + EC_ADDR_RGB_GREEN, + EC_ADDR_RGB_BLUE, +}; + +static int uniwill_kbd_led_mc_brightness_set(struct led_classdev *led_cdev, + enum led_brightness brightness) +{ + struct led_classdev_mc *led_mc_cdev =3D lcdev_to_mccdev(led_cdev); + struct uniwill_data *data =3D container_of(led_mc_cdev, struct uniwill_da= ta, kbd_led_mc_cdev); + unsigned int min_intensity =3D 0; + unsigned int regval; + int ret; + + guard(mutex)(&data->kbd_rgb_led_lock); + + /* + * The EC interprets a RGB value of 0x000000 as a command to restore + * the device-specfic default RGB value. Work around this by writing + * a RGB value of 0x010101 (faint white) instead. + */ + if (data->kbd_led_mc_subled_info[0].intensity =3D=3D 0 && + data->kbd_led_mc_subled_info[1].intensity =3D=3D 0 && + data->kbd_led_mc_subled_info[2].intensity =3D=3D 0) + min_intensity =3D 1; + + for (int i =3D 0; i < KBD_LED_CHANNELS; i++) { + regval =3D max(data->kbd_led_mc_subled_info[i].intensity, min_intensity); + ret =3D regmap_write(data->regmap, uniwill_kbd_led_channel_to_reg[i], re= gval); + if (ret < 0) + return ret; + } + + ret =3D regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR,= RGB_APPLY_COLOR); + if (ret < 0) + return ret; + + return uniwill_kbd_led_write_brightness(data, brightness); +} + +static enum led_brightness uniwill_kbd_led_mc_brightness_get(struct led_cl= assdev *led_cdev) +{ + struct led_classdev_mc *led_mc_cdev =3D lcdev_to_mccdev(led_cdev); + struct uniwill_data *data =3D container_of(led_mc_cdev, struct uniwill_da= ta, kbd_led_mc_cdev); + + return uniwill_kbd_led_read_brightness(data); +} + +static int uniwill_kbd_led_init(struct uniwill_data *data) +{ + unsigned int color_indices[KBD_LED_CHANNELS] =3D { + LED_COLOR_ID_RED, + LED_COLOR_ID_GREEN, + LED_COLOR_ID_BLUE, + }; + struct led_init_data init_data =3D { + .devicename =3D DRIVER_NAME, + .devname_mandatory =3D true, + }; + bool intensity_all_zeros =3D true; + bool needs_trigger =3D false; + unsigned int regval; + int ret; + + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return 0; + + ret =3D regmap_read(data->regmap, EC_ADDR_SUPPORT_2, ®val); + if (ret < 0) + return ret; + + if (!(regval & CHINA_MODE)) { + ret =3D regmap_set_bits(data->regmap, EC_ADDR_BIOS_OEM_2, ENABLE_CHINA_M= ODE); + if (ret < 0) + return ret; + } + + ret =3D regmap_read(data->regmap, EC_ADDR_KBD_STATUS, ®val); + if (ret < 0) + return ret; + + regval |=3D KBD_APPLY; + regval &=3D ~KBD_POWER_OFF; + ret =3D regmap_write(data->regmap, EC_ADDR_KBD_STATUS, regval); + if (ret < 0) + return ret; + + switch (data->project_id) { + case PROJECT_ID_PF: + case PROJECT_ID_PF4MU_PF4MN_PF5MU: + case PROJECT_ID_PH4TRX1: + case PROJECT_ID_PH4TUX1: + case PROJECT_ID_PH4TQX1: + case PROJECT_ID_PH6TRX1: + case PROJECT_ID_PH6TQXX: + case PROJECT_ID_PHXAXXX: + case PROJECT_ID_PHXPXXX: + data->single_color_kbd =3D true; + break; + default: + data->single_color_kbd =3D regval & KBD_WHITE_ONLY; + break; + } + + if (data->single_color_kbd) { + init_data.default_label =3D "white:" LED_FUNCTION_KBD_BACKLIGHT; + data->kbd_led_cdev.max_brightness =3D data->kbd_led_max_brightness; + data->kbd_led_cdev.color =3D LED_COLOR_ID_WHITE; + data->kbd_led_cdev.flags =3D LED_BRIGHT_HW_CHANGED | LED_REJECT_NAME_CON= FLICT; + data->kbd_led_cdev.brightness_set_blocking =3D uniwill_kbd_led_brightnes= s_set; + data->kbd_led_cdev.brightness_get =3D uniwill_kbd_led_brightness_get; + + return devm_led_classdev_register_ext(data->dev, &data->kbd_led_cdev, &i= nit_data); + } + + for (int i =3D 0; i < KBD_LED_CHANNELS; i++) { + data->kbd_led_mc_subled_info[i].color_index =3D color_indices[i]; + + ret =3D regmap_read(data->regmap, uniwill_kbd_led_channel_to_reg[i], &re= gval); + if (ret < 0) + return ret; + + /* + * Make sure that the initial intensity value is not greater than + * the maximum intensity. + */ + if (regval > KBD_LED_MAX_INTENSITY) { + regval =3D KBD_LED_MAX_INTENSITY; + ret =3D regmap_write(data->regmap, uniwill_kbd_led_channel_to_reg[i], r= egval); + if (ret < 0) + return ret; + + needs_trigger =3D true; + } + + if (regval) + intensity_all_zeros =3D false; + + data->kbd_led_mc_subled_info[i].intensity =3D regval; + data->kbd_led_mc_subled_info[i].max_intensity =3D KBD_LED_MAX_INTENSITY; + data->kbd_led_mc_subled_info[i].channel =3D i; + } + + /* See uniwill_kbd_led_mc_brightness_set() for an explaination. */ + if (intensity_all_zeros) { + for (int i =3D 0; i < KBD_LED_CHANNELS; i++) { + data->kbd_led_mc_subled_info[i].intensity =3D 1; + ret =3D regmap_write(data->regmap, uniwill_kbd_led_channel_to_reg[i], 1= ); + if (ret < 0) + return ret; + } + + needs_trigger =3D true; + } + + if (needs_trigger) { + ret =3D regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, + RGB_APPLY_COLOR); + if (ret < 0) + return ret; + } + + ret =3D devm_mutex_init(data->dev, &data->kbd_rgb_led_lock); + if (ret < 0) + return ret; + + init_data.default_label =3D "multicolor:" LED_FUNCTION_KBD_BACKLIGHT; + data->kbd_led_mc_cdev.led_cdev.max_brightness =3D data->kbd_led_max_brigh= tness; + data->kbd_led_mc_cdev.led_cdev.color =3D LED_COLOR_ID_MULTI; + data->kbd_led_mc_cdev.led_cdev.flags =3D LED_BRIGHT_HW_CHANGED | LED_REJE= CT_NAME_CONFLICT; + data->kbd_led_mc_cdev.led_cdev.brightness_set_blocking =3D uniwill_kbd_le= d_mc_brightness_set; + data->kbd_led_mc_cdev.led_cdev.brightness_get =3D uniwill_kbd_led_mc_brig= htness_get; + data->kbd_led_mc_cdev.subled_info =3D data->kbd_led_mc_subled_info; + data->kbd_led_mc_cdev.num_colors =3D KBD_LED_CHANNELS; + + return devm_led_classdev_multicolor_register_ext(data->dev, &data->kbd_le= d_mc_cdev, + &init_data); +} + static unsigned int uniwill_sanitize_battery_threshold(unsigned int value) { /* 0 means "charging threshold not active" */ @@ -1789,6 +2082,31 @@ static int uniwill_notifier_call(struct notifier_blo= ck *nb, unsigned long action sysfs_notify(&data->dev->kobj, NULL, "fn_lock"); =20 return NOTIFY_OK; + case UNIWILL_OSD_KB_LED_LEVEL0: + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return NOTIFY_DONE; + + return notifier_from_errno(uniwill_notify_kbd_led(data, 0)); + case UNIWILL_OSD_KB_LED_LEVEL1: + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return NOTIFY_DONE; + + return notifier_from_errno(uniwill_notify_kbd_led(data, 1)); + case UNIWILL_OSD_KB_LED_LEVEL2: + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return NOTIFY_DONE; + + return notifier_from_errno(uniwill_notify_kbd_led(data, 2)); + case UNIWILL_OSD_KB_LED_LEVEL3: + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return NOTIFY_DONE; + + return notifier_from_errno(uniwill_notify_kbd_led(data, 3)); + case UNIWILL_OSD_KB_LED_LEVEL4: + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return NOTIFY_DONE; + + return notifier_from_errno(uniwill_notify_kbd_led(data, 4)); default: mutex_lock(&data->input_lock); sparse_keymap_report_event(data->input_device, action, 1, true); @@ -1842,6 +2160,7 @@ static int uniwill_ec_init(struct uniwill_data *data) if (ret < 0) return ret; =20 + data->project_id =3D value; dev_dbg(data->dev, "Project ID: %u\n", value); =20 ret =3D regmap_set_bits(data->regmap, EC_ADDR_AP_OEM, ENABLE_MANUAL_CTRL); @@ -1885,6 +2204,7 @@ static int uniwill_probe(struct platform_device *pdev) return ret; =20 data->features =3D device_descriptor.features; + data->kbd_led_max_brightness =3D device_descriptor.kbd_led_max_brightness; =20 /* * Some devices might need to perform some device-specific initialization= steps @@ -1905,6 +2225,10 @@ static int uniwill_probe(struct platform_device *pde= v) if (ret < 0) return ret; =20 + ret =3D uniwill_kbd_led_init(data); + if (ret < 0) + return ret; + ret =3D uniwill_hwmon_init(data); if (ret < 0) return ret; @@ -1976,6 +2300,31 @@ static int uniwill_suspend_battery(struct uniwill_da= ta *data) return regmap_read(data->regmap, EC_ADDR_CHARGE_CTRL, &data->last_charge_= ctrl); } =20 +static int uniwill_suspend_kbd_led(struct uniwill_data *data) +{ + unsigned int regval; + int ret; + + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return 0; + + ret =3D regmap_read(data->regmap, EC_ADDR_KBD_STATUS, ®val); + if (ret < 0) + return ret; + + /* + * Save the current keyboard backlight settings in order to restore them + * during resume. We cannot use the regmap code for that since this regis= ter + * needs to be declared as volatile because the brightness can be changed + * by the EC. + */ + data->last_kbd_status =3D regval; + FIELD_MODIFY(KBD_BRIGHTNESS_MASK, ®val, 0); + regval |=3D KBD_APPLY | KBD_POWER_OFF; + + return regmap_write(data->regmap, EC_ADDR_KBD_STATUS, regval); +} + static int uniwill_suspend_nvidia_ctgp(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) @@ -2006,6 +2355,10 @@ static int uniwill_suspend(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_suspend_kbd_led(data); + if (ret < 0) + return ret; + ret =3D uniwill_suspend_nvidia_ctgp(data); if (ret < 0) return ret; @@ -2052,6 +2405,23 @@ static int uniwill_resume_battery(struct uniwill_dat= a *data) return 0; } =20 +static int uniwill_resume_kbd_led(struct uniwill_data *data) +{ + int ret; + + if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT)) + return 0; + + ret =3D regmap_write(data->regmap, EC_ADDR_KBD_STATUS, data->last_kbd_sta= tus | KBD_APPLY); + if (ret < 0) + return ret; + + if (data->single_color_kbd) + return 0; + + return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, = RGB_APPLY_COLOR); +} + static int uniwill_resume_nvidia_ctgp(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) @@ -2096,6 +2466,10 @@ static int uniwill_resume(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_resume_kbd_led(data); + if (ret < 0) + return ret; + ret =3D uniwill_resume_nvidia_ctgp(data); if (ret < 0) return ret; @@ -2745,6 +3119,8 @@ static int __init uniwill_init(void) if (force) { /* Assume that the device supports all features except the charge limit = */ device_descriptor.features =3D UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARG= E_LIMIT; + /* Some models only support 3 brightness levels */ + device_descriptor.kbd_led_max_brightness =3D 4; pr_warn("Enabling potentially unsupported features\n"); } =20 --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F04A239B4A6; Sat, 30 May 2026 17:08:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160906; cv=none; b=kwiwNRVgMTYVTeMNCkLcyEkDfy/HX8Hdt7rFM1Jbf4ICoF7QunlBu//iTWV22JzTuu1ew4zU/FvOtu7t8YYvTqj6XQcTOXKCA6jKNsMClih1yMXX1BF5okUjlFoEB8Uf+xAS+7vTsvxwH1SkC8r0ApVRwCS/OA0wazKvyezpu3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160906; c=relaxed/simple; bh=M8ssyN9mD6lorYGimnlKG2wqW+UTPXpbAoRi43u++w0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WsNpDIsjnDN6ORZslj9F1xOoOgVptzrX46NnUFDWI5DBxtAz2jhDccgjZY1vFafYS5fFxuGb/nu+A9rweQzfP0uweh3xw+GlHbcgONtXQbkU7uRtPQSGDn/TMvQ5yNlLLzTuMRK78EnBY5UKPpULGiCHo3zapitWVh/tf1a5dps= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=EVC5kXYX; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="EVC5kXYX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160903; x=1780765703; i=w_armin@gmx.de; bh=3FeRx3dxf7O/GClUiYx6fg0+4G3NLV5bY8Sa9qtB4ng=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=EVC5kXYXRSspo+dTq+WS3BuT2MW4FsgBQPmm3138sCLHybF1yWAiUDHK4T5Jr44Z AhdKuVhmViWBkTubsG16hyfhXAGz8Oktp712uvzrjjX65fArdnyDrsHV4AX+pp89z Ak0YZgV9U+2axOt68hw6u+YjcoBkebDxAlnXXZzUccGfAAW9eSJeqUtwA4GIiDRJn AUkBJCPlrzKOoAmLoctYw0O9qaGxtconJdCuxD9otgnYY47HJv5YDGcjt8xUMf3Pg 73giJPIsofjW7fmoKUucmzK+7QAlnrrF1nEm2qturdGCnWZfwptritKpXrcclRlCA zHURnCW5QYMRUnx2EA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MDywu-1wdJKt1P3E-00Gw8C; Sat, 30 May 2026 19:08:23 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 2/7] platform/x86: uniwill-laptop: Handle screen-related events Date: Sat, 30 May 2026 19:08:08 +0200 Message-Id: <20260530170813.10166-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:ba2qRDY1AeNI5pcH+SKV2CQV1x3ChH0DOWZSYU8gRdCyGKXg9be dUafvYk3V9FlD2dxovgBNEBhjoTuj1sphDJ+iav2hm3KwTi5v5X2BEO+Fu/rmiHDdBB8q5Q KPRlGYuuUdO2Z7tzs8YCY4j86h0q39hJL38w8eX34OrLc1Xvg4E9UqOAquOaZX4KKyPxqim lPuCvm6gARVmc4vOWwqZg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:TYK/hODzVmo=;eso2D+wlvQcIxFg0sShG7CofSvk 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 WsOCV2JWbuNq7NTix8= Content-Type: text/plain; charset="utf-8" The EC will report event 0xCC on some devices when the screen has been enabled/disabled during resume/suspend. Ignore this event because it is currently unused by the driver. Signed-off-by: Armin Wolf --- drivers/platform/x86/uniwill/uniwill-acpi.c | 6 ++++++ drivers/platform/x86/uniwill/uniwill-wmi.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index fd040197b189..b3be2f2dbdd8 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -95,6 +95,9 @@ =20 #define EC_ADDR_MAIN_FAN_RPM_2 0x0465 =20 +#define EC_ADDR_SCREEN_STATUS 0x0466 +#define SCREEN_SUSPENDED BIT(6) + #define EC_ADDR_SECOND_FAN_RPM_1 0x046C =20 #define EC_ADDR_SECOND_FAN_RPM_2 0x046D @@ -488,6 +491,9 @@ static const struct key_entry uniwill_keymap[] =3D { /* Reported when the user wants to toggle the benchmark mode status */ { KE_IGNORE, UNIWILL_OSD_BENCHMARK_MODE_TOGGLE, { KEY_UNKNOWN }}, =20 + /* Reported when the screen is enabled/disabled during resume/suspend */ + { KE_IGNORE, UNIWILL_OSD_SCREEN_STATE_CHANGED, { KEY_UNKNOWN }}, + /* Reported when the user wants to toggle the webcam */ { KE_IGNORE, UNIWILL_OSD_WEBCAM_TOGGLE, { KEY_UNKNOWN }}, =20 diff --git a/drivers/platform/x86/uniwill/uniwill-wmi.h b/drivers/platform/= x86/uniwill/uniwill-wmi.h index fb1910c0f741..b25b2f31211c 100644 --- a/drivers/platform/x86/uniwill/uniwill-wmi.h +++ b/drivers/platform/x86/uniwill/uniwill-wmi.h @@ -113,6 +113,8 @@ =20 #define UNIWILL_OSD_BENCHMARK_MODE_TOGGLE 0xC0 =20 +#define UNIWILL_OSD_SCREEN_STATE_CHANGED 0xCC + #define UNIWILL_OSD_WEBCAM_TOGGLE 0xCF =20 #define UNIWILL_OSD_KBD_BACKLIGHT_CHANGED 0xF0 --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9051C3A8730; Sat, 30 May 2026 17:08:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160916; cv=none; b=jVORtDgsO3/OJUvi3IICsXc7g7wvmp9ESeP74vwZhaUYbRC8/FTV8ukICmB7B/r9oGcIKzHBmLXq+Fjws2j6Vf9IE4z5gy6hyphwjCeZuncE1lIKBY+/GdfBp3OSc++Luj5h4jUyYz2/Ghu3cVXEgTXjzQgJk6TCgfk/kYfoe3I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160916; c=relaxed/simple; bh=tfioD8tzufb4czgQBhbjTjKOedyhbKU0ajK48sNwHe0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XCNDUmosSvnes9CUm9+LVEOQRE7X9wbk3RkBjX6kLTm5UdAY57FAP1Jwh5kmQ5Ma5TqoK2GekPnexins9hn9y8R/a256vJHhxdZJQJXqSvP+PpOG6DDpyiJpP2neKowTc1VBTNhDoy9ns6PrMu6iNK3i39yCciyUJj/DuKu5n0g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=G1WI6kCP; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="G1WI6kCP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160904; x=1780765704; i=w_armin@gmx.de; bh=4V7GiqYBxEcYkJSy4Vt7ACu0AIyZ49iMrz6wxhZOmu8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=G1WI6kCPWmZxztnnAhT/PljhKiR8zpNvQTzzYPWmV0fQ7Vymdng2MLh0hCXuPsZT g3pBCQACZUYPOptS01odbMxExIjVyPR0weTtoFKH6la5TTMif/0cNR26aT/1g2M3S Oqt0ObSdKlSG/1/16CsRPWyLrdKiJ0MVUvKfaKDJNErOFXm0P/ooUA1l2jytMpgXM n/Id0Op+NbRR/HLmoc+pIvZOVzaaL6dJX+NkTiqa0Py7jwCGbam196zOvx/tOXl1r V49g0lZmXa/e0AV65JYRsA/bEOF4QabD2FfQkEcwLHpoOs76Klllpn149FEVFrn21 TyZrCFq2+OJe4nS7/Q== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M1po0-1wRAFE2Whk-00D2Uc; Sat, 30 May 2026 19:08:24 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 3/7] platform/x86: uniwill-laptop: Add AC auto boot support Date: Sat, 30 May 2026 19:08:09 +0200 Message-Id: <20260530170813.10166-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:ezjNQhTr+txzP6hf1CJYqriBcJxZH6EmCtVBP+EISzfMRx21tj7 ll2FiMX28lRfUhBtkEzAyXQOgUNTxX/zFSP64yP+uZ0vuRj+k2QvmK8dRhoqWHk5w18R7MA uHdhcZys8VmJWOVigPniNirmLVJSVRwyaGnYT4g1DftGg/BsCz8EleSohWDYMQtoiR6sTV9 mhtPdVkL7ooFlhS4g8VpA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:xjjk3FZbFN0=;gpUQOfJk/Ur+i1wqIPKr/TQkEZ+ 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 Content-Type: text/plain; charset="utf-8" Some devices support a "AC auto boot" feature where the system will automatically boot when being connected to a power source. Add support for this feature. Signed-off-by: Armin Wolf --- .../ABI/testing/sysfs-driver-uniwill-laptop | 11 ++++ .../admin-guide/laptops/uniwill-laptop.rst | 7 +++ drivers/platform/x86/uniwill/uniwill-acpi.c | 51 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop b/Docume= ntation/ABI/testing/sysfs-driver-uniwill-laptop index 2397c65c969a..57272f906184 100644 --- a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop +++ b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop @@ -78,3 +78,14 @@ Description: =20 Reading this file returns the profile names with the currently active on= e in brackets. + +What: /sys/bus/platform/devices/INOU0000:XX/ac_auto_boot +Date: March 2026 +KernelVersion: 7.1 +Contact: Armin Wolf +Description: + Allows userspace applications to configure if the device should boot aut= omatically + when being connected to a power source. Writing "1"/"0" into this file + enables/disables this functionality. + + Reading this file returns the current status of the AC auto boot functio= nality. diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index 2b1e5da703a5..b6213fb1d3e0 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -98,6 +98,13 @@ allow it. =20 See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. =20 +AC Auto Boot +------------ + +The ``uniwill-laptop`` driver allows the user to configure if the system s= hould automatically +boot when being connected to a power source, see +Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. + References =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index b3be2f2dbdd8..897c6163de53 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -112,6 +112,9 @@ =20 #define EC_ADDR_BAT_CYCLE_COUNT_2 0x04A7 =20 +#define EC_ADDR_OEM_9 0x0726 +#define AC_AUTO_BOOT_ENABLE BIT(3) + #define EC_ADDR_PROJECT_ID 0x0740 #define PROJECT_ID_NONE 0x00 #define PROJECT_ID_GI 0x01 @@ -364,6 +367,7 @@ #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(10) #define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(11) #define UNIWILL_FEATURE_KEYBOARD_BACKLIGHT BIT(12) +#define UNIWILL_FEATURE_AC_AUTO_BOOT BIT(13) =20 enum usb_c_power_priority_options { USB_C_POWER_PRIORITY_CHARGING =3D 0, @@ -586,6 +590,7 @@ static const struct regmap_bus uniwill_ec_bus =3D { static bool uniwill_writeable_reg(struct device *dev, unsigned int reg) { switch (reg) { + case EC_ADDR_OEM_9: case EC_ADDR_AP_OEM: case EC_ADDR_LIGHTBAR_AC_CTRL: case EC_ADDR_LIGHTBAR_AC_RED: @@ -625,6 +630,7 @@ static bool uniwill_readable_reg(struct device *dev, un= signed int reg) case EC_ADDR_SECOND_FAN_RPM_1: case EC_ADDR_SECOND_FAN_RPM_2: case EC_ADDR_BAT_ALERT: + case EC_ADDR_OEM_9: case EC_ADDR_PROJECT_ID: case EC_ADDR_AP_OEM: case EC_ADDR_LIGHTBAR_AC_CTRL: @@ -1136,6 +1142,45 @@ static int usb_c_power_priority_init(struct uniwill_= data *data) return 0; } =20 +static ssize_t ac_auto_boot_store(struct device *dev, struct device_attrib= ute *attr, + const char *buf, size_t count) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + unsigned int regval; + bool enable; + int ret; + + ret =3D kstrtobool(buf, &enable); + if (ret < 0) + return ret; + + if (enable) + regval =3D AC_AUTO_BOOT_ENABLE; + else + regval =3D 0; + + ret =3D regmap_update_bits(data->regmap, EC_ADDR_OEM_9, AC_AUTO_BOOT_ENAB= LE, regval); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t ac_auto_boot_show(struct device *dev, struct device_attribu= te *attr, char *buf) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + unsigned int regval; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_OEM_9, ®val); + if (ret < 0) + return ret; + + return sysfs_emit(buf, "%d\n", !!(regval & AC_AUTO_BOOT_ENABLE)); +} + +static DEVICE_ATTR_RW(ac_auto_boot); + static struct attribute *uniwill_attrs[] =3D { /* Keyboard-related */ &dev_attr_fn_lock.attr, @@ -1147,6 +1192,7 @@ static struct attribute *uniwill_attrs[] =3D { /* Power-management-related */ &dev_attr_ctgp_offset.attr, &dev_attr_usb_c_power_priority.attr, + &dev_attr_ac_auto_boot.attr, NULL }; =20 @@ -1186,6 +1232,11 @@ static umode_t uniwill_attr_is_visible(struct kobjec= t *kobj, struct attribute *a return attr->mode; } =20 + if (attr =3D=3D &dev_attr_ac_auto_boot.attr) { + if (uniwill_device_supports(data, UNIWILL_FEATURE_AC_AUTO_BOOT)) + return attr->mode; + } + return 0; } =20 --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 138663AFCF3; Sat, 30 May 2026 17:08:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160916; cv=none; b=rLJS1OhRcK3Js0zHTOklaMsDXsaAaDh91bB5JNwNiYI6XPnz5iaCibOU3x6oqF98xt3HzUPPdQ83OO6ZeOSLHOtOY9xYyc39r8yRAhf3H5e0YV1pNMoD1FQiQ2fXJYaHMkxPUm3pWR/PdC14V/zU4cxRcqlX7yLCsUcdt1OxsG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160916; c=relaxed/simple; bh=KXm9Beay7K60yl1c2uJfftzQRajOVXGaak+dHS33+ew=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=svl+KaQ2TqFJ0hoBoXtWDsngLibBSY3BmSfpJNwibmmIaWX/PvngG1+RXvBmt6XtUvWCXB6eux1jMXGtLdw7sW4ex9uRBgIAsUR0VftuWe2SYAtPn5d4fBSpMzhqLagE1S9grNfDY3kUGtb6MczAO+SyfneGBaots08jSB87UNs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=kg2vJSA9; arc=none smtp.client-ip=212.227.17.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="kg2vJSA9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160905; x=1780765705; i=w_armin@gmx.de; bh=7wgA/+jdf9HUuVZh2/vtmx45kw0Zgdss+e5MNnFWC2w=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=kg2vJSA9bC/xDya+U0yagbMfwCq2uIyRCGMXHUDWfeD8VIwL7o7VX2ACYWZEvL41 y4o/Oh16FvXeoGMLnWdOgf0X19fcdmVYOL5Sr3P0dTAM9yt7dIQGb6Zj0omtX3Qjc AzK8lC/meN7V+OqBxTEgRAZUs/HONcyy5eRXHDjGEqGPEFva1JyXxy8b1cqKR/sEu wt2kq8k0QQRqLlZI5IKjVYTdN7EBLXjRa1IlurrmyT/SSMS9U3LpDNixyd8wMJ1RN jcEAxLhkU2EnjSXfu7fUmXU9xGjrh3+Jp4m9+sBrg0qvNA8AVBQdlwz0bwUEtEnPm qUURnZj4rG74tH1dNQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MGhyc-1wXF4F16TS-00By99; Sat, 30 May 2026 19:08:25 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 4/7] platform/x86: uniwill-laptop: Add support for USB powershare Date: Sat, 30 May 2026 19:08:10 +0200 Message-Id: <20260530170813.10166-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:A97XsTne4UgPDJyy8y4TYnF6HUFL0ue+PUr6s4IGeGP+TalVWDI eEUUkCu/ww9pUyrA34sBIeHuIMLMWKXqD8Z0e9p8hRimdViaowxKeIXoY8UHdJdtO67Z8sD GT5VnaYWIzyBGwp9Xn3hXmwQ9FevoK14gvXktLKOlJT5KUMIMLDskzzz2TDi74ohdhiQKl0 68TxxqJvSesBAQKQjbCuQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:ViQ1ASz96Ek=;aJMnBITU0OQiluVkRJbFajhb+ST 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 Content-Type: text/plain; charset="utf-8" Some devices support a "USB powershare" feature where the system will continue to provide power via the USB ports when hibernating or powered off. Add support for this feaure. Signed-off-by: Armin Wolf --- .../ABI/testing/sysfs-driver-uniwill-laptop | 16 ++- .../admin-guide/laptops/uniwill-laptop.rst | 7 ++ drivers/platform/x86/uniwill/uniwill-acpi.c | 100 ++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop b/Docume= ntation/ABI/testing/sysfs-driver-uniwill-laptop index 57272f906184..943f92c6b561 100644 --- a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop +++ b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop @@ -86,6 +86,20 @@ Contact: Armin Wolf Description: Allows userspace applications to configure if the device should boot aut= omatically when being connected to a power source. Writing "1"/"0" into this file - enables/disables this functionality. + enables/disables this functionality. Enabling both AC auto boot and USB = powershare + at the same time is not supported. =20 Reading this file returns the current status of the AC auto boot functio= nality. + +What: /sys/bus/platform/devices/INOU0000:XX/usb_powershare_high +Date: March 2026 +KernelVersion: 7.1 +Contact: Armin Wolf +Description: + Allows userspace applications to configure if the device should continue= to provide + power via the USB ports when hibernating or powered off. Might also incr= ease the + power budget available to USB ports on some devices. Writing "1"/"0" int= o this + file enables/disables this functionality. Enabling both USB powershare a= nd AC auto + boot at the same time is not supported. + + Reading this file returns the current status of the USB powershare funct= ionality. diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index b6213fb1d3e0..be50b45b82ef 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -105,6 +105,13 @@ The ``uniwill-laptop`` driver allows the user to confi= gure if the system should boot when being connected to a power source, see Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. =20 +USB Powershare +-------------- + +The ``uniwill-laptop`` driver allows the user to configure if the system s= hould continue to +provide power via the USB ports when hibernating or powered off, see +Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. + References =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 897c6163de53..00140c0a67a0 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -368,6 +368,7 @@ #define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(11) #define UNIWILL_FEATURE_KEYBOARD_BACKLIGHT BIT(12) #define UNIWILL_FEATURE_AC_AUTO_BOOT BIT(13) +#define UNIWILL_FEATURE_USB_POWERSHARE BIT(14) =20 enum usb_c_power_priority_options { USB_C_POWER_PRIORITY_CHARGING =3D 0, @@ -393,6 +394,7 @@ struct uniwill_data { bool last_fn_lock_state; bool last_super_key_enable_state; bool last_touchpad_toggle_enable_state; + bool last_usb_powershare_high_state; struct mutex super_key_lock; /* Protects the toggling of the super key lo= ck state */ struct list_head batteries; struct mutex led_lock; /* Protects writes to the lightbar registers */ @@ -1181,6 +1183,70 @@ static ssize_t ac_auto_boot_show(struct device *dev,= struct device_attribute *at =20 static DEVICE_ATTR_RW(ac_auto_boot); =20 +static int uniwill_write_usb_powershare_high(struct uniwill_data *data, bo= ol status) +{ + unsigned int value; + + if (status) + value =3D TRIGGER_USB_CHARGING; + else + value =3D 0; + + /* + * Normaly this RMW-sequence could also trigger the super key toggle, + * but the EC seems to take care that those bits are always read as 0. + */ + return regmap_update_bits(data->regmap, EC_ADDR_TRIGGER, TRIGGER_USB_CHAR= GING, value); +} + +static ssize_t usb_powershare_high_store(struct device *dev, struct device= _attribute *attr, + const char *buf, size_t count) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + bool enable; + int ret; + + ret =3D kstrtobool(buf, &enable); + if (ret < 0) + return ret; + + ret =3D uniwill_write_usb_powershare_high(data, enable); + if (ret < 0) + return ret; + + return count; +} + +static int uniwill_read_usb_powershare_high(struct uniwill_data *data, boo= l *status) +{ + unsigned int value; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_TRIGGER, &value); + if (ret < 0) + return ret; + + *status =3D !!(value & TRIGGER_USB_CHARGING); + + return 0; +} + +static ssize_t usb_powershare_high_show(struct device *dev, struct device_= attribute *attr, + char *buf) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + bool status; + int ret; + + ret =3D uniwill_read_usb_powershare_high(data, &status); + if (ret < 0) + return ret; + + return sysfs_emit(buf, "%d\n", status); +} + +static DEVICE_ATTR_RW(usb_powershare_high); + static struct attribute *uniwill_attrs[] =3D { /* Keyboard-related */ &dev_attr_fn_lock.attr, @@ -1193,6 +1259,7 @@ static struct attribute *uniwill_attrs[] =3D { &dev_attr_ctgp_offset.attr, &dev_attr_usb_c_power_priority.attr, &dev_attr_ac_auto_boot.attr, + &dev_attr_usb_powershare_high.attr, NULL }; =20 @@ -1237,6 +1304,11 @@ static umode_t uniwill_attr_is_visible(struct kobjec= t *kobj, struct attribute *a return attr->mode; } =20 + if (attr =3D=3D &dev_attr_usb_powershare_high.attr) { + if (uniwill_device_supports(data, UNIWILL_FEATURE_USB_POWERSHARE)) + return attr->mode; + } + return 0; } =20 @@ -2382,6 +2454,18 @@ static int uniwill_suspend_kbd_led(struct uniwill_da= ta *data) return regmap_write(data->regmap, EC_ADDR_KBD_STATUS, regval); } =20 +static int uniwill_suspend_usb_powershare(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_USB_POWERSHARE)) + return 0; + + /* + * EC_ADDR_TRIGGER is marked as volatile, so we have to restore it + * ourselves. + */ + return uniwill_read_usb_powershare_high(data, &data->last_usb_powershare_= high_state); +} + static int uniwill_suspend_nvidia_ctgp(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) @@ -2416,6 +2500,10 @@ static int uniwill_suspend(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_suspend_usb_powershare(data); + if (ret < 0) + return ret; + ret =3D uniwill_suspend_nvidia_ctgp(data); if (ret < 0) return ret; @@ -2479,6 +2567,14 @@ static int uniwill_resume_kbd_led(struct uniwill_dat= a *data) return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, = RGB_APPLY_COLOR); } =20 +static int uniwill_resume_usb_powershare(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_USB_POWERSHARE)) + return 0; + + return uniwill_write_usb_powershare_high(data, data->last_usb_powershare_= high_state); +} + static int uniwill_resume_nvidia_ctgp(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) @@ -2527,6 +2623,10 @@ static int uniwill_resume(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_resume_usb_powershare(data); + if (ret < 0) + return ret; + ret =3D uniwill_resume_nvidia_ctgp(data); if (ret < 0) return ret; --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F4A8481DD; Sat, 30 May 2026 17:08:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160915; cv=none; b=CtzhC/faR6zSQcPZBVf4XzmqB3y4l/TVM/6rN9ZijXO7pNuEYgaxjNSUMs2l/g9fzxhR+KKzigCSVUUDEDSFQ6aaYqSYZWM6+1hmhKNeUCSr3g+aSVJi2NcLP1SMFnjQS7cw2/Gjge3A70FIq4bvK2pjFon7GkLXnSHKlL1vZ48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160915; c=relaxed/simple; bh=ZmL9aM6VNaYtoBKwGpzezAr/GjXi+fkYzrKOOICALZo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tlc2uIU39Rs5eXsFMZfxaHGNniIUE9CGjP9vSZZJeBcuH7w4BjWmTtTKASFziGwr2k5yseBpSOnO+lc7ABegcPEDBwMJ+EYXhJf5ZJowdKJxXmp7ISd1n22+7+eoTHZW6sp5hgWLMyysGhgGFyQcEom1bYX+JXz3Jx3VnAf9uoU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=rD08OnbQ; arc=none smtp.client-ip=212.227.17.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="rD08OnbQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160906; x=1780765706; i=w_armin@gmx.de; bh=v65804IrD7e7xvpj0IlSC2MZpoI7NJH5z0viT8sxyx4=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=rD08OnbQeE/t+QNIFbAdmTyxo5a2aNXL0Ntkgj+jR1BPlnSPiwiMIy8IlybVKUEN 82aLAunZO0PCcvyr11/9xZhqe2PWgUUYuZJLHzeegm92OvASusVEVIDhIeyM7VHiS jf37lCEbs0u0UCn4e3a5/FdZAGQiyf47UpYiGTTtfWZ043pXd+v+2MhmNvc+darWu TQQc9sAPRDfuKZjXCBw38oR0KTebyckWOQ1e6FJI8cAVQLM8sC/R1VfOcy5k1tO1I 84U04DKTPe02M/aEqMkgy0BOkV67K9LjX7h75kwzCmDZbgfeTRUWT6VZjdo96BAzu b+oPR6KFvE69BWFi5g== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MvbG2-1xKvpX3rGg-00zSEh; Sat, 30 May 2026 19:08:25 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 5/7] platform/x86: uniwill-laptop: Add support for the MACHENIKE L16 Pro Date: Sat, 30 May 2026 19:08:11 +0200 Message-Id: <20260530170813.10166-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:1JHJ6c7fCkbAFMmzg2yGI6kRSM2J5lWbK+uqniJk6EFCS3HrCc8 NRsEE/SHtxdvBp0sbll8t2mtRRnMXONUuMdP/NmtrMrWW6ov1Xe7MaIAG1DTYWB6Z0EinbO HRRT9RHnymHFkXtWQdeR6oQozKYoTs8QCpnf3PIto5pjZB/Az+CFvsaV32dsMvGrUBHmp3h WFKuEuS5dNmdBbvSJ1XPQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:ooXe5gnDyBM=;3xGeFigetuEL+2pPAVuF5oynXNY hgOyHdQZyoaEjH19H+LQ+K2vj3/zlMEDUUP4vxRb6gTdbH3YqXo3p0DBY63Ss2JgP/i/qB5WM +yggjkv1ZB1BNJEQJQWs1Q1Ehdlan7x7Erem/6aJSKv39dWYHD+LU3YdDMWIJQfBhuL3H0APe JD7yGrhfs4vYs3rptr8B5VXo15iPHFF6YLTCzRL0q5uq64B07Jch2zWtbbiLCHxOh6cN6Xrpt j6HL2NXhj/ATsu2pS2NHNIQTUjke1MLC7hDzcr58cpO186SCR79Vxq1B42n9lkwj+z57+UOKV PfU2v/bCIaXUoG8cox/wY48em+hnniVFr4B0kAyDMCDL1111z5IKwlwVfWMoKd0Qb8VanlnIv PIUCxTBv+xvQyw+/bTHydbbrpIjggXCIPD9CZRGLx7arGqh7YkNMimTQkRAz96KJQpmBGeSmE 8jETVxn3Uv0CREDDvKi4bSI9pbMlmnqKGJJptyVY4C93IfDJ7r6G/QwawOl0A3JXbRucHnF9p +O/SEB37dsIYIvNllpPNfw2vfFZ7Co+VJKSaOTMQNS2kpsvHgKsqIlIlyviovBacVgMuc2RrE hbov+VOdDYxXrYywtPplVLCxmHITLlCDhgVGt35chxdygo1l1Y4wVgm5vbDS5dy5aEr7aFttE MpQstkbmtRygnZYWq19XJlPQu3DsiuMkl96uSlgpu8E2IjMldHjLV7/44QSbX6JdH4yVSpEqu 7JvCYR77buflSAOL9W+qnIQB4IHWaQD5KLiH/DwUyTwS6mcJokS01x5TNoYiSBnq74mj4DpPh I2MG62qC5vXA6QZlJVX1jl7jJ89bF+amMwHwiYs4LWMp238Lzt0REQuJTiQC1ONfLjKEHVOTl W3iRPhFMgpAKsSK3THbWs3TtFcym1KpccVm/HQ8z2KpCzCYqRYbrXtroYVnB3S92KmZbMy393 5IVoU38ZxSadlPBLsyzHBQoHbGi76JlGzhtlPqvG5jRAzeEi4N1QyKEG78MpV/g2H8/t1VFMF 7wmoqIfP8nej3mY0btJvhUXoSOtcT/v+OFSaDlf3uy9JkpKQy3fhHigMngn1h1BGklIExYqHH TAINVvdSXY51kj165/aBHTBB2N90vtLUupGzBkFNHbsj6L9RhV4NEgeRoccWFpZ2Z9vgVzC2H Pb3p3shkG+Yk8QWHXRolFrqW1UV3mnhPyPPuntxtLuxv2/SqjlRwujjnK6xRkP5ti1dTslZzP Faj1VoBKb+zhwXC7dw1E/HcLAPURnJkYXTq9bjaRlCqzidQl3INXXs1vicOnPMorJnoxyYf9v tjZfsbTLdmpdsQJe6oFnONPZ+XPRf7BKSSMUlKmQplfv4TseRTfPq1fKNT+H6vIzSEAHlZqWa uCMvLObcgy87FfLnueCnF46KjMLeP+L9Te3Z7hHM2GI/qOow9yaQ8cQe7VBNkpIFIA59UYU1I PYWXkGL1bEQ+zKlNnWZeQV/zc6WJqBo5Gw/wzJk/v472wm9PXZJAzO57zgim/45QHcMbAFG1T hlNcvuIKoTN91OBSJCMAvy4dTBt8UV1IgEut/IbBcVqcBXRNF+UbuQCzThFDjaSGb5XqK7d+/ JtBYl4RIU9KXEGdsJ68BGtavlkG9SPCSmRIoj3pJMiFnkxMfGObaoBj4kp8AcXbKCCGL54qzE pPkWGm4WbT+KZKfr11kmAzMTFMjsD4T4mw2yYS+WmLHohXGJf/FiesDDNtZVcQGQqMRnrg5Fn hF8xkUiQSUyNW6m8qW2zuhzIfkyfYEI80ao9dE5wFAkDQ9MNMqRT8x0YJI09fnbJSYMm6n/Bz T/DHbRoG6vJsvBl6M9YMPkAuVIIS9DEPATEvqGDYXoc6drIrkowvtAlMZ+CFROzfJzpKkRdMr BzJaXBgFoMPX28jjxHf4Nq684ob80A6SL87Seb+HqqmYlVaETgrQ0TBWnkFs+cCup4OgRUp1Z TCqZqZtOJDwLX9dQD37xcBl2KkjD0gQFjDP8hVxwgQIKmbgQMgBtzChCnZ7HiOejPgE6unAv+ qpX39rHb6vgWtozvbAZaZqdlddrpT8dopAeovoNEPCOAFW2+8GvlOazgFCbuQOsCVcOp+ncVX HCtCJoOb+e0tviwTYnmYuTOgJNtyoTWoNF11rWUPlrWNq/8ss2RwGAnIb8d0EodzUe0O4bkTS gSbclitQrYnuvnC8BBDeV/0TEQm2zf2byhC3Ljx9YWhfZmzdnU9R6VdEMHLef2njF4/q5OHbc uIOoH1dlkc+kEfii8H7s8ysfdegNEZjhhRKjIyknNVtOeziXTIGk+OPtoU05WDIm5ZlqttatO EPosK+zmEdK8NWwTjQeu9Ld9RQrNnYxEUxcT8x2UW1d2rwxRljqKR4yIoc4cvo3qk9q+dGEhb OEVstiY8V9Y7kzzarwabw1VMm5O2B2lRSaqusagqjWq7lqO4bKW8uc91nWLpJvk+oVs19yHZb NUiEkeR9eVW7L3elaxN7DUtX8Yz7hpNeJzhZepEbJG2GikHT38qkVUNC3Da2/T2mfj0YqZXmZ wMWdTlqKK0Xapg9FBuIoNdY9MOGItbPgeAZTosBKtpH0l6VSLj2JjwRG2AJYnwii+qAcnluCj VhbqOh/XWdaOuzckqJOnm4f+XmRVK9hgMIoS2EDEuOpmE3+6EjqyAyUrjMB375rDd+wnoZ1ZE 9vDxNGbEPicHP3y0UFhyNZ3z0NVYP013eRBPkMrhT0tgZ5QF90vTKGlrY3ytk1MVwdq3sV2PX Rm2ovrWbXQmRjl9b0A4HKZBrSB/TGRpMzcTMmbEc0jvsTU/twmk3+X3QFdWee3kCIKnWdwX+d 4TMj/Rchig+5bT+iEPPhQmbqVHXOfyVdhzXnHX03JEtjnaDSVZ0/oLTRnDfUML5IdZy/MKl0u r2ODIxAyILJfMf4K5eEmMoDu2Vs9dh5BpTQ7eiud3F7Qb6EdaHdQiCaqzRgmFzJ+YHjgcBY10 u1tn8XsHHg67fSl0Qt0cn9FkFDzSzNYFpYZG9NLaFPaJVH66D5vyLt8bpY8bhfowIR8yBDb2g 7x+oIsZ2Oa7mgLhx2RGelSD3y6o2UGjAbIy+Fsg7S2H0fFtBvM+Gy0JYU3T9m6ZtYO3rj0Ox2 +Fa2KTiLWEjM7ISZ1afh0lY++z9gnPxLBNmoE+/1+sLgzWWJ4gRSObNKlNV9LhAvpGEfIztnM lNLAh5I0yAV/TeP39o26W2qPCvmhwcYKj9w0q2I+S7age+qs+Fq8Ulv+oO1i+gd8e6Umykb0B ZkOUdVnW2uqLcPNC/JgZTSd40Nnyii6+4aomigpwq2bHcaTj5JVvXxEgnybWQm61JtulQ14gs fSOp6XKedC9jIqtyafphBI+FKTpIpa9L8qfk1KHhuXxxIV8iPV57VqAlS+rfLhgZiPO3TAoXK pqmdUjzBh94S/jplHqvv2gnm8sBlCh6WGcYFt9KP3WSRN/c7Yeuh6Vl6C8J6k9DZNTsg46zMa AKFvuHSsazDyIpbnPcDGDxKqfz+cQMCJxcIcKYmGrG1LhdRxU9zHqF+b6CrhgB6fhmHKVZnrV pN4gvxx09XhBu2j8nLmNYRI9ODxBP92I176b+l5NEUoEjGSKlXygaNOxW30PjACX3IIix1EFw oyh72de+gYuczaTJo2YP+nlxuM6WkkRVjtmuXAD33a+Ls3nb8d9oX9aFPD7UOqHYbkCd6gy9I oOkhWM7sZmrPFN1viXDXKXie4B/8hc3+h31mCMnAI4Fl4OgK+HxJ0vYupmaWmoQPUBBjYLZ9f Sv7xyCFkKoQXdDO6vzNLyXFrdacKq5kNcIemOxdBLn+sjHo/dUTs90mdEIS6OfvO3u3DQCZGZ b6TcMwrxmxcv987+P3db51bTbW6ZiK+r+hFfRtLwwjDARqWTSrsyOQwNwnYjIWPNY5b8GzUVa Zg5EI7VTsKZ8oi5EaPybPv+is2CdDIs8MLKj1cYpYaejWvYUxDi6HbN36/Q78H38C3VrEq2Xh gf8oOS96Fbqe7G4ann+0C6SNK++R5RGPlhDzH3Vfx1YTJIXuEtVXzBxlbojHUTqphwR2URIb0 Dn8x/1sRePy6iqVHVpDPZ+1/J0iL0BW2UJkZNoF4LNCkU6lAEVqTj8sapF/KtwA9yxKv5yxJ8 ODkJYfjORrk08q752jlMXaz3WzSPpE8w6+qQCbxYh9veWVo9rz1pT+32gVlOyuNGnGUWyWUSc UHhw2rnhylz+gWwZYi1RRitMlUkfIODYM9jnWR0maPw38x8QfLP6JC89geYZsw3SB2QHEqSWT Kil05XkTDrsGpQPgy2tKe/9cFCHC41BtZxJv5I2pWW6bc/cYHreUU9LKwXEUv+jwe8j3H6vU6 ZX3JkN/FD+SlOlCMPrq2QdpOmPHHNNUjlLjEVf0CEizSAEs5lJHrSVJPoUrSf9MAk8XXE+UCR jRMSfzw3bgr2Zxwb3xHpbXBhfwe4H5VTq0iAFfd34aTjaULE6gMe8dHQFPhzz/O+0vsNy7Li7 Qo9h5ymJlIqaQc6/v9NeqboD9b3FRx2k4C8soDPNSpkHYP/ztjpU4WJThfJrKFYWahsD6+3DU TZmTnMOzpU+pgsAHrWN+8rUsQv+xsW2NwVR7f5l8JwAHb+5pyyAS2Uv7kPhXebfvFYYjF3G6P Nz9u/BFghV2vwZpBz7RArZAy+vt76eN6ChyGlPchsnO0e0gSGv6a0Asmjz1Pq6LRbkzKsLnmY xb/I73oEs71cO9L1adfva8SBrQR9fZwNMJD2swrZHskrLjayhZ3mGjo25INu/e8sYDrIJFWVa pMUYcXRxw6kUZJbABqNK6vg08BR3+cGelF5YLbYRmbKIhOqAcVGQp1awNaBu2cuyQ6ECkplyz dcQYiWS4oDrzAj0IbQj6ajP9xF5arLS7uxQUTBhRei6+BSE7aJVLEcyVBkMTgBPwZ8CRrdfsh xOJlqXIWZFqoDhi5CwZdDuXyfEV9UKzYdWy2sOR5g/m3AsFWWcBjJ/2+t9N2p0Y1E0aB5doZd jPBb2jyyQRu+6jkSzhNb5ILEVIrguZksBEGqvtdMwg+S2ga1r3gq+RdAUghpU+B7rmuDWUnQj CKKW+u5roXIAWFAKkUtQh4FeK6R6/7PUjm8ZtX8LCvyrEYqxZpGye0ijEeuuOf8crb95A3zBU aM3qyOr9kD/iFrgGJufQ+63m+1sBP73T4r69V4opGy2HLakKLQKLigVs47PCQLJXI0G4F/3C4 nnr0gjlJ/JvdeotnfqWslnE6dZaAoloRKVeEHLBe5OiF/R9vw+Jh/vUR0lZ5M5qGJyuMbvJXQ DCUgqP1BThsDQJMHBJ/4GphVbW/sanfuHfcgPUkpuF8iwA5TryjM6IHLq3Vtjb3upo7JVkhnv fFdzGy4dLc0PHVBzE52D4dwaPGPVp/Cw2u9VmnGprgwEuy93/ANBg1h3S1HziyuDf6mUeuXm8 zsK3M29rrFe1axvDvw+A2MBI0BTP2vykB6AxX+58ob+Bo8rqFF6ufpCxRQdSTTFT28SuKnLaC qheq/JoazVM9dE4B7mgj6+p7cX1sd2pwrGKcblx9b0/BZbBy0nJDiJjAD5AXhrnnsQ/EfRYVE da7eBA+nkW+8J5KSOhgg0xLHwfN2xtfoaaXaLf50UTHrmsq/BVKE9jRp0284Ase/M1nwk4BMy skPNNzsdV3gX1sdmmg= Content-Type: text/plain; charset="utf-8" A user has reported that the driver works on the MACHENIKE L16 Pro. Add the necessary device descriptor and DMI entry to allow the driver to automatically load on this device. Reported-by: zatrit Closes: https://github.com/Wer-Wolf/uniwill-laptop/pull/11 Signed-off-by: Armin Wolf --- drivers/platform/x86/uniwill/uniwill-acpi.c | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 00140c0a67a0..0011c553c2cb 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2657,6 +2657,20 @@ static struct platform_driver uniwill_driver =3D { .shutdown =3D uniwill_shutdown, }; =20 +static struct uniwill_device_descriptor machenike_l16p_descriptor __initda= ta =3D { + .features =3D UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL | + UNIWILL_FEATURE_KEYBOARD_BACKLIGHT | + UNIWILL_FEATURE_AC_AUTO_BOOT | + UNIWILL_FEATURE_USB_POWERSHARE, + .kbd_led_max_brightness =3D 4, +}; + static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __ini= tdata =3D { .features =3D UNIWILL_FEATURE_SUPER_KEY | UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | @@ -2809,6 +2823,14 @@ static struct uniwill_device_descriptor pf5pu1g_desc= riptor __initdata =3D { }; =20 static const struct dmi_system_id uniwill_dmi_table[] __initconst =3D { + { + .ident =3D "MACHENIKE L16 Pro", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "MACHENIKE"), + DMI_EXACT_MATCH(DMI_BOARD_NAME, "L16P"), + }, + .driver_data =3D &machenike_l16p_descriptor, + }, { .ident =3D "XMG FUSION 15 (L19)", .matches =3D { --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 603C03AF646; Sat, 30 May 2026 17:08:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160914; cv=none; b=M1ZT8vhSLTheg8udblHvyqxmaz2yVbTrw0aH8dfGqdFSuA1uxEFxxFl0/EMWGmeSOiffDOeokiAtcawTJzdExCLL2nF0jv6NIaTr6fkWj67PVgwyLFr2Jb8CuJgNDPVrcAz8vEI7JSTZDLwMSqRAjWTaxUXqk8X58RTlWUVa7M4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160914; c=relaxed/simple; bh=DVvhHfc8Gqa6+4cP4D0jOAyaAIgSAtEWzaqhO85qePE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XAiU/8FWJ1UQwagC7rY13jF24XHQDMZJAl9+pTtQftlYcaP67LppWv6iR0jf9zCbvIwyW3jIqQwbQKp4Siz5qCPyf5MtMOcwuMYRoobmhiqY0NJn7OzE2KRnkAqlhE7gi35LxfzvucijQ+qKpKgavvaY//0CbuA+TgsypStNdSg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=fzgMzCzH; arc=none smtp.client-ip=212.227.17.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="fzgMzCzH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160906; x=1780765706; i=w_armin@gmx.de; bh=/H6lCto0VC04416eEoUEzrwKbtqBdV9K42/LAfjX4gs=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=fzgMzCzH33JN130IgmP/2kv0uV9fcu8701mkPRAmKUZ1uQAb/hzkz2GiF2fq5mgG UsDO+1GKxxpDUc9deTFgwg3DPFgRH0WlEPyKS8kW+gesDzQMLQON2UGjfL7Zeg/+p vFvibHLoDz4YKeA5cq8ugD0pi19wwIDhizm1htackddsaTDOIkwUp+5S92MbPVsTe fEvWOoTtWUxbmSWQVWgtc2CZnOhPY/NejnRozY+EHthZTFBL24ltZPeIw6F7jT1cB mRh5K1buQM1n0fU2+VUqkbnvqqiI2JctJ18DDjNTrW/Rzu1oOfW52KTCnc/+u/8l6 bEmLhcBr2W0kqYnbCw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MiJVG-1wyqZo2NHi-00mvy1; Sat, 30 May 2026 19:08:26 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 6/7] platform/x86: uniwill-laptop: Add support for the AiStone X4SP4NAL Date: Sat, 30 May 2026 19:08:12 +0200 Message-Id: <20260530170813.10166-7-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:SiNB0zI9HJYZs5j4b1qTn7qa2r55XqPjvTS4RlFL0SMVgRBrjAC jE7hdtX5vvO2mGJt8UrIjXm927ukXd6sOAJIBkC5v6A/VBRjt4vJl3oFHN0565+DyukWNnn AAgejozru2c2/tzjRZnR4JGIq3GGsZr6/NSeoTCQOJm6MeZ/dQSbC/L5lvDoMsuPMy1L0k/ qx+R+tr0mRcAjqiai0h8w== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:D9ghFFFpbqg=;w2woVOF/MJYrCQ34KTxhPR7EzFx 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 1t2i4HDMJJ6T0Ind38= Content-Type: text/plain; charset="utf-8" A user has reported that the driver works on the AiStone X4SP4NAL. Add the necessary device descriptor and DMI entry to allow the driver to automatically load on this device. Reported-by: Michael Seifert Closes: https://github.com/Wer-Wolf/uniwill-laptop/pull/10 Tested-by: Michael Seifert Signed-off-by: Armin Wolf --- drivers/platform/x86/uniwill/uniwill-acpi.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 0011c553c2cb..d688ffca3b5e 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2822,7 +2822,28 @@ static struct uniwill_device_descriptor pf5pu1g_desc= riptor __initdata =3D { UNIWILL_FEATURE_PRIMARY_FAN, }; =20 +static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata =3D= { + .features =3D UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_KEYBOARD_BACKLIGHT | + UNIWILL_FEATURE_AC_AUTO_BOOT | + UNIWILL_FEATURE_USB_POWERSHARE, + .kbd_led_max_brightness =3D 2, +}; + static const struct dmi_system_id uniwill_dmi_table[] __initconst =3D { + { + .ident =3D "AiStone X4SP4NAL", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "AiStone"), + DMI_EXACT_MATCH(DMI_BOARD_NAME, "X4SP4NAL"), + }, + .driver_data =3D &x4sp4nal_descriptor, + }, { .ident =3D "MACHENIKE L16 Pro", .matches =3D { --=20 2.39.5 From nobody Mon Jun 8 08:54:32 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CFA163AC0FC; Sat, 30 May 2026 17:08:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160913; cv=none; b=OFMJ8h1qFLXSJmooY8mR3ijWZbCY10M47fk9qVAcIPF7XkmVnUEf9rHRIJ7xV4SmK1MxUqFvSLq6Xrxrhdw2O0e6nwJ0CR3haMlYJiiQItyNXlsOt53S64t1qShrd0l9vMhl5YJgqVaIjqKecw93msCBUsrzBPUhcklJYv/3WM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780160913; c=relaxed/simple; bh=kZDruwbqreBpmWMBu6cZeEOviF7AR5rxDXQw3qTTtps=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=o/eybfuujfT5/nsNZ6yphgzm1c64GrTxVOUgfo4rr1D2wkfveSRXydSn7IdihozCnN0/112lzJxkGGpcehtYVpeJEqUR0tTD239f1KxXATeGfVfjoNmvXYWBiw8Oi5vi8xpTp2I6vZQbxu4r/NX9NhLhlKQr9R8CFtSlg0DT3Ig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=SHsoXakD; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="SHsoXakD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1780160907; x=1780765707; i=w_armin@gmx.de; bh=pgRvckvajwwmWE2WCmcugtHmnmfdX1fkxQlJFMFD1dQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=SHsoXakDp5Bb5SILEDd5drHcIrPd2jAU58i8IQjdFOtLKRNjQxRMxdF7zraaxwIi N1/Qq6Z7GwKaXkSMUAsMh5rCHn4bRPRFnzrW/TNHPOmi97Swj5gOuUmlAtbvRXxm1 FlBpIQu/oe9Fps/xrifcQ9PW34eZBroKZWki9JPNvedIiNCgsHKjwTXtTzd/nLwk0 WZ6Jy8q6ZuZ6SV2KioBtFY4xIOyauilVAuuxlW+O+G1GWJaUJQYG5KLxwcBFgg2un EiTI6Pbvq+fMKrhmSQmapbNEHF8bf4QynQPV3UlXBs+kNaWTM7uOzgaOI6zKZquLf TGBhnMj9zOEobvsG2g== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M6ll8-1wNItp0B3u-00FoAO; Sat, 30 May 2026 19:08:27 +0200 From: Armin Wolf To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, wse@tuxedocomputers.com Subject: [PATCH 7/7] platform/x86: uniwill-laptop: Add lightbar support for LAPQC71A/B Date: Sat, 30 May 2026 19:08:13 +0200 Message-Id: <20260530170813.10166-8-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260530170813.10166-1-W_Armin@gmx.de> References: <20260530170813.10166-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:MJCnMvgWkQnfYYOF3eEnvuPbVG4izEabA2qfmUOMrRQAfAau8Zg /VDdq0nc8RwvTqnZ3OvVOQ1TtgqqYm9xk4ZOBCF33LvfyMX6aEMoTe9daO02AasCY8ErtJF +QwyqhiRp53eoe4yYxxIzTAAPmNxB+cl2UZ01ib6FAu13tz+Uzm3YxvPErJB1Ms9joNIT9f WcDoUINb3y8X3AKqSrcWg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:P/H+TeSiBSw=;jIsCzLigIA/KqsUcgozD1wi/wIE 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 Content-Type: text/plain; charset="utf-8" The LAPQC71A and LAPQC71B both feature a RGB lightbar with 36 brightness levels per color component. Extend the device descriptor to supply the maximum brightness of the lightbar and whitelist both models for UNIWILL_FEATURE_LIGHTBAR. Signed-off-by: Armin Wolf --- drivers/platform/x86/uniwill/uniwill-acpi.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index d688ffca3b5e..f55b239bd4d1 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -348,7 +348,6 @@ #define FAN_TABLE_LENGTH 16 =20 #define LED_CHANNELS 3 -#define LED_MAX_BRIGHTNESS 200 =20 #define KBD_LED_CHANNELS 3 #define KBD_LED_MAX_INTENSITY 50 @@ -398,6 +397,7 @@ struct uniwill_data { struct mutex super_key_lock; /* Protects the toggling of the super key lo= ck state */ struct list_head batteries; struct mutex led_lock; /* Protects writes to the lightbar registers */ + u8 lightbar_max_brightness; struct led_classdev_mc led_mc_cdev; struct mc_subled led_mc_subled_info[LED_CHANNELS]; bool single_color_kbd; @@ -427,6 +427,7 @@ struct uniwill_battery_entry { struct uniwill_device_descriptor { unsigned int features; u8 kbd_led_max_brightness; + u8 lightbar_max_brightness; /* Executed during driver probing */ int (*probe)(struct uniwill_data *data); }; @@ -1514,7 +1515,7 @@ static int uniwill_led_brightness_set(struct led_clas= sdev *led_cdev, enum led_br =20 for (int i =3D 0; i < LED_CHANNELS; i++) { /* Prevent the brightness values from overflowing */ - value =3D min(LED_MAX_BRIGHTNESS, data->led_mc_subled_info[i].brightness= ); + value =3D min(data->lightbar_max_brightness, data->led_mc_subled_info[i]= .brightness); ret =3D regmap_write(data->regmap, uniwill_led_channel_to_ac_reg[i], val= ue); if (ret < 0) return ret; @@ -1583,14 +1584,14 @@ static int uniwill_led_init(struct uniwill_data *da= ta) return ret; =20 data->led_mc_cdev.led_cdev.color =3D LED_COLOR_ID_MULTI; - data->led_mc_cdev.led_cdev.max_brightness =3D LED_MAX_BRIGHTNESS; + data->led_mc_cdev.led_cdev.max_brightness =3D data->lightbar_max_brightne= ss; data->led_mc_cdev.led_cdev.flags =3D LED_REJECT_NAME_CONFLICT; data->led_mc_cdev.led_cdev.brightness_set_blocking =3D uniwill_led_bright= ness_set; =20 if (value & LIGHTBAR_S0_OFF) data->led_mc_cdev.led_cdev.brightness =3D 0; else - data->led_mc_cdev.led_cdev.brightness =3D LED_MAX_BRIGHTNESS; + data->led_mc_cdev.led_cdev.brightness =3D data->lightbar_max_brightness; =20 for (int i =3D 0; i < LED_CHANNELS; i++) { data->led_mc_subled_info[i].color_index =3D color_indices[i]; @@ -1603,7 +1604,7 @@ static int uniwill_led_init(struct uniwill_data *data) * Make sure that the initial intensity value is not greater than * the maximum brightness. */ - value =3D min(LED_MAX_BRIGHTNESS, value); + value =3D min(data->lightbar_max_brightness, value); ret =3D regmap_write(data->regmap, uniwill_led_channel_to_ac_reg[i], val= ue); if (ret < 0) return ret; @@ -2334,6 +2335,7 @@ static int uniwill_probe(struct platform_device *pdev) =20 data->features =3D device_descriptor.features; data->kbd_led_max_brightness =3D device_descriptor.kbd_led_max_brightness; + data->lightbar_max_brightness =3D device_descriptor.lightbar_max_brightne= ss; =20 /* * Some devices might need to perform some device-specific initialization= steps @@ -2673,11 +2675,13 @@ static struct uniwill_device_descriptor machenike_l= 16p_descriptor __initdata =3D { =20 static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __ini= tdata =3D { .features =3D UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_LIGHTBAR | UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN, + .lightbar_max_brightness =3D 36, }; =20 static struct uniwill_device_descriptor lapac71h_descriptor __initdata =3D= { @@ -2701,6 +2705,7 @@ static struct uniwill_device_descriptor lapkc71f_desc= riptor __initdata =3D { UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN, + .lightbar_max_brightness =3D 200, }; =20 /* @@ -3321,6 +3326,8 @@ static int __init uniwill_init(void) device_descriptor.features =3D UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARG= E_LIMIT; /* Some models only support 3 brightness levels */ device_descriptor.kbd_led_max_brightness =3D 4; + /* Some models only support 36 brightness levels per color component */ + device_descriptor.lightbar_max_brightness =3D 200; pr_warn("Enabling potentially unsupported features\n"); } =20 --=20 2.39.5