* [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines [not found] <20260226205302.123782-1-wse@tuxedocomputers.com> @ 2026-02-26 20:50 ` Werner Sembach 2026-02-27 9:28 ` Armin Wolf 2026-02-26 20:50 ` [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting Werner Sembach ` (2 subsequent siblings) 3 siblings, 1 reply; 10+ messages in thread From: Werner Sembach @ 2026-02-26 20:50 UTC (permalink / raw) To: Armin Wolf, Hans de Goede, Ilpo Järvinen Cc: Werner Sembach, platform-driver-x86, linux-kernel From: Armin Wolf <W_Armin@gmx.de> Split hwmon feature define in smaller parts to accommodate for diverse hardware. You can now specify the presence of a cpu and/or a gpu temp sensor separately and if one or 2 fans exists. Signed-off-by: Armin Wolf <W_Armin@gmx.de> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> --- drivers/platform/x86/uniwill/uniwill-acpi.c | 68 ++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c index 6341dca20b76a..7ab82cf16f388 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -319,8 +319,11 @@ #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2) #define UNIWILL_FEATURE_LIGHTBAR BIT(3) #define UNIWILL_FEATURE_BATTERY BIT(4) -#define UNIWILL_FEATURE_HWMON BIT(5) -#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(6) +#define UNIWILL_FEATURE_CPU_TEMP BIT(5) +#define UNIWILL_FEATURE_GPU_TEMP BIT(6) +#define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) +#define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) +#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) struct uniwill_data { struct device *dev; @@ -427,7 +430,7 @@ static const struct key_entry uniwill_keymap[] = { { KE_END } }; -static inline bool uniwill_device_supports(struct uniwill_data *data, +static inline bool uniwill_device_supports(const struct uniwill_data *data, unsigned int features) { return (data->features & features) == features; @@ -937,6 +940,48 @@ static const struct attribute_group *uniwill_groups[] = { NULL }; +static umode_t uniwill_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, + int channel) +{ + const struct uniwill_data *data = drvdata; + unsigned int feature; + + switch (type) { + case hwmon_temp: + switch (channel) { + case 0: + feature = UNIWILL_FEATURE_CPU_TEMP; + break; + case 1: + feature = UNIWILL_FEATURE_GPU_TEMP; + break; + default: + return 0; + } + break; + case hwmon_fan: + case hwmon_pwm: + switch (channel) { + case 0: + feature = UNIWILL_FEATURE_PRIMARY_FAN; + break; + case 1: + feature = UNIWILL_FEATURE_SECONDARY_FAN; + break; + default: + return 0; + } + break; + default: + return 0; + } + + if (uniwill_device_supports(data, feature)) + return 0440; + + return 0; +} + static int uniwill_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { @@ -1020,7 +1065,7 @@ static int uniwill_read_string(struct device *dev, enum hwmon_sensor_types type, } static const struct hwmon_ops uniwill_ops = { - .visible = 0444, + .is_visible = uniwill_is_visible, .read = uniwill_read, .read_string = uniwill_read_string, }; @@ -1048,7 +1093,10 @@ static int uniwill_hwmon_init(struct uniwill_data *data) { struct device *hdev; - if (!uniwill_device_supports(data, UNIWILL_FEATURE_HWMON)) + if (!uniwill_device_supports(data, UNIWILL_FEATURE_CPU_TEMP) && + !uniwill_device_supports(data, UNIWILL_FEATURE_GPU_TEMP) && + !uniwill_device_supports(data, UNIWILL_FEATURE_PRIMARY_FAN) && + !uniwill_device_supports(data, UNIWILL_FEATURE_SECONDARY_FAN)) return 0; hdev = devm_hwmon_device_register_with_info(data->dev, "uniwill", data, @@ -1687,7 +1735,10 @@ static struct uniwill_device_descriptor lapac71h_descriptor __initdata = { UNIWILL_FEATURE_SUPER_KEY | UNIWILL_FEATURE_TOUCHPAD_TOGGLE | UNIWILL_FEATURE_BATTERY | - UNIWILL_FEATURE_HWMON, + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN, }; static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { @@ -1696,7 +1747,10 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { UNIWILL_FEATURE_TOUCHPAD_TOGGLE | UNIWILL_FEATURE_LIGHTBAR | UNIWILL_FEATURE_BATTERY | - UNIWILL_FEATURE_HWMON, + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN, }; static int phxarx1_phxaqf1_probe(struct uniwill_data *data) -- 2.43.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines 2026-02-26 20:50 ` [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines Werner Sembach @ 2026-02-27 9:28 ` Armin Wolf 2026-02-27 18:45 ` Werner Sembach 0 siblings, 1 reply; 10+ messages in thread From: Armin Wolf @ 2026-02-27 9:28 UTC (permalink / raw) To: Werner Sembach, Hans de Goede, Ilpo Järvinen Cc: platform-driver-x86, linux-kernel Am 26.02.26 um 21:50 schrieb Werner Sembach: > From: Armin Wolf <W_Armin@gmx.de> > > Split hwmon feature define in smaller parts to accommodate for diverse > hardware. You can now specify the presence of a cpu and/or a gpu temp > sensor separately and if one or 2 fans exists. > > Signed-off-by: Armin Wolf <W_Armin@gmx.de> > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> > --- > drivers/platform/x86/uniwill/uniwill-acpi.c | 68 ++++++++++++++++++--- > 1 file changed, 61 insertions(+), 7 deletions(-) > > diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c > index 6341dca20b76a..7ab82cf16f388 100644 > --- a/drivers/platform/x86/uniwill/uniwill-acpi.c > +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c > @@ -319,8 +319,11 @@ > #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2) > #define UNIWILL_FEATURE_LIGHTBAR BIT(3) > #define UNIWILL_FEATURE_BATTERY BIT(4) > -#define UNIWILL_FEATURE_HWMON BIT(5) > -#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(6) > +#define UNIWILL_FEATURE_CPU_TEMP BIT(5) > +#define UNIWILL_FEATURE_GPU_TEMP BIT(6) > +#define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) > +#define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) > +#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) > > struct uniwill_data { > struct device *dev; > @@ -427,7 +430,7 @@ static const struct key_entry uniwill_keymap[] = { > { KE_END } > }; > > -static inline bool uniwill_device_supports(struct uniwill_data *data, > +static inline bool uniwill_device_supports(const struct uniwill_data *data, > unsigned int features) > { > return (data->features & features) == features; > @@ -937,6 +940,48 @@ static const struct attribute_group *uniwill_groups[] = { > NULL > }; > > +static umode_t uniwill_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, > + int channel) > +{ > + const struct uniwill_data *data = drvdata; > + unsigned int feature; > + > + switch (type) { > + case hwmon_temp: > + switch (channel) { > + case 0: > + feature = UNIWILL_FEATURE_CPU_TEMP; > + break; > + case 1: > + feature = UNIWILL_FEATURE_GPU_TEMP; > + break; > + default: > + return 0; > + } > + break; > + case hwmon_fan: > + case hwmon_pwm: > + switch (channel) { > + case 0: > + feature = UNIWILL_FEATURE_PRIMARY_FAN; > + break; > + case 1: > + feature = UNIWILL_FEATURE_SECONDARY_FAN; > + break; > + default: > + return 0; > + } > + break; > + default: > + return 0; > + } > + > + if (uniwill_device_supports(data, feature)) > + return 0440; I think you forgot this one. > + > + return 0; > +} > + > static int uniwill_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, > long *val) > { > @@ -1020,7 +1065,7 @@ static int uniwill_read_string(struct device *dev, enum hwmon_sensor_types type, > } > > static const struct hwmon_ops uniwill_ops = { > - .visible = 0444, > + .is_visible = uniwill_is_visible, > .read = uniwill_read, > .read_string = uniwill_read_string, > }; > @@ -1048,7 +1093,10 @@ static int uniwill_hwmon_init(struct uniwill_data *data) > { > struct device *hdev; > > - if (!uniwill_device_supports(data, UNIWILL_FEATURE_HWMON)) > + if (!uniwill_device_supports(data, UNIWILL_FEATURE_CPU_TEMP) && > + !uniwill_device_supports(data, UNIWILL_FEATURE_GPU_TEMP) && > + !uniwill_device_supports(data, UNIWILL_FEATURE_PRIMARY_FAN) && > + !uniwill_device_supports(data, UNIWILL_FEATURE_SECONDARY_FAN)) > return 0; > > hdev = devm_hwmon_device_register_with_info(data->dev, "uniwill", data, > @@ -1687,7 +1735,10 @@ static struct uniwill_device_descriptor lapac71h_descriptor __initdata = { > UNIWILL_FEATURE_SUPER_KEY | > UNIWILL_FEATURE_TOUCHPAD_TOGGLE | > UNIWILL_FEATURE_BATTERY | > - UNIWILL_FEATURE_HWMON, > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_GPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN, > }; > > static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { > @@ -1696,7 +1747,10 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { > UNIWILL_FEATURE_TOUCHPAD_TOGGLE | > UNIWILL_FEATURE_LIGHTBAR | > UNIWILL_FEATURE_BATTERY | > - UNIWILL_FEATURE_HWMON, > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_GPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN, > }; > > static int phxarx1_phxaqf1_probe(struct uniwill_data *data) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines 2026-02-27 9:28 ` Armin Wolf @ 2026-02-27 18:45 ` Werner Sembach 0 siblings, 0 replies; 10+ messages in thread From: Werner Sembach @ 2026-02-27 18:45 UTC (permalink / raw) To: Armin Wolf, Hans de Goede, Ilpo Järvinen Cc: platform-driver-x86, linux-kernel Am 27.02.26 um 10:28 schrieb Armin Wolf: > Am 26.02.26 um 21:50 schrieb Werner Sembach: > >> From: Armin Wolf <W_Armin@gmx.de> >> >> Split hwmon feature define in smaller parts to accommodate for diverse >> hardware. You can now specify the presence of a cpu and/or a gpu temp >> sensor separately and if one or 2 fans exists. >> >> Signed-off-by: Armin Wolf <W_Armin@gmx.de> >> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> >> --- >> drivers/platform/x86/uniwill/uniwill-acpi.c | 68 ++++++++++++++++++--- >> 1 file changed, 61 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c >> b/drivers/platform/x86/uniwill/uniwill-acpi.c >> index 6341dca20b76a..7ab82cf16f388 100644 >> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c >> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c >> @@ -319,8 +319,11 @@ >> #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2) >> #define UNIWILL_FEATURE_LIGHTBAR BIT(3) >> #define UNIWILL_FEATURE_BATTERY BIT(4) >> -#define UNIWILL_FEATURE_HWMON BIT(5) >> -#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(6) >> +#define UNIWILL_FEATURE_CPU_TEMP BIT(5) >> +#define UNIWILL_FEATURE_GPU_TEMP BIT(6) >> +#define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) >> +#define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) >> +#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) >> struct uniwill_data { >> struct device *dev; >> @@ -427,7 +430,7 @@ static const struct key_entry uniwill_keymap[] = { >> { KE_END } >> }; >> -static inline bool uniwill_device_supports(struct uniwill_data *data, >> +static inline bool uniwill_device_supports(const struct uniwill_data *data, >> unsigned int features) >> { >> return (data->features & features) == features; >> @@ -937,6 +940,48 @@ static const struct attribute_group *uniwill_groups[] = { >> NULL >> }; >> +static umode_t uniwill_is_visible(const void *drvdata, enum >> hwmon_sensor_types type, u32 attr, >> + int channel) >> +{ >> + const struct uniwill_data *data = drvdata; >> + unsigned int feature; >> + >> + switch (type) { >> + case hwmon_temp: >> + switch (channel) { >> + case 0: >> + feature = UNIWILL_FEATURE_CPU_TEMP; >> + break; >> + case 1: >> + feature = UNIWILL_FEATURE_GPU_TEMP; >> + break; >> + default: >> + return 0; >> + } >> + break; >> + case hwmon_fan: >> + case hwmon_pwm: >> + switch (channel) { >> + case 0: >> + feature = UNIWILL_FEATURE_PRIMARY_FAN; >> + break; >> + case 1: >> + feature = UNIWILL_FEATURE_SECONDARY_FAN; >> + break; >> + default: >> + return 0; >> + } >> + break; >> + default: >> + return 0; >> + } >> + >> + if (uniwill_device_supports(data, feature)) >> + return 0440; > > I think you forgot this one. yes missed it > >> + >> + return 0; >> +} >> + >> static int uniwill_read(struct device *dev, enum hwmon_sensor_types type, >> u32 attr, int channel, >> long *val) >> { >> @@ -1020,7 +1065,7 @@ static int uniwill_read_string(struct device *dev, enum >> hwmon_sensor_types type, >> } >> static const struct hwmon_ops uniwill_ops = { >> - .visible = 0444, >> + .is_visible = uniwill_is_visible, >> .read = uniwill_read, >> .read_string = uniwill_read_string, >> }; >> @@ -1048,7 +1093,10 @@ static int uniwill_hwmon_init(struct uniwill_data *data) >> { >> struct device *hdev; >> - if (!uniwill_device_supports(data, UNIWILL_FEATURE_HWMON)) >> + if (!uniwill_device_supports(data, UNIWILL_FEATURE_CPU_TEMP) && >> + !uniwill_device_supports(data, UNIWILL_FEATURE_GPU_TEMP) && >> + !uniwill_device_supports(data, UNIWILL_FEATURE_PRIMARY_FAN) && >> + !uniwill_device_supports(data, UNIWILL_FEATURE_SECONDARY_FAN)) >> return 0; >> hdev = devm_hwmon_device_register_with_info(data->dev, "uniwill", data, >> @@ -1687,7 +1735,10 @@ static struct uniwill_device_descriptor >> lapac71h_descriptor __initdata = { >> UNIWILL_FEATURE_SUPER_KEY | >> UNIWILL_FEATURE_TOUCHPAD_TOGGLE | >> UNIWILL_FEATURE_BATTERY | >> - UNIWILL_FEATURE_HWMON, >> + UNIWILL_FEATURE_CPU_TEMP | >> + UNIWILL_FEATURE_GPU_TEMP | >> + UNIWILL_FEATURE_PRIMARY_FAN | >> + UNIWILL_FEATURE_SECONDARY_FAN, >> }; >> static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { >> @@ -1696,7 +1747,10 @@ static struct uniwill_device_descriptor >> lapkc71f_descriptor __initdata = { >> UNIWILL_FEATURE_TOUCHPAD_TOGGLE | >> UNIWILL_FEATURE_LIGHTBAR | >> UNIWILL_FEATURE_BATTERY | >> - UNIWILL_FEATURE_HWMON, >> + UNIWILL_FEATURE_CPU_TEMP | >> + UNIWILL_FEATURE_GPU_TEMP | >> + UNIWILL_FEATURE_PRIMARY_FAN | >> + UNIWILL_FEATURE_SECONDARY_FAN, >> }; >> static int phxarx1_phxaqf1_probe(struct uniwill_data *data) ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting [not found] <20260226205302.123782-1-wse@tuxedocomputers.com> 2026-02-26 20:50 ` [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines Werner Sembach @ 2026-02-26 20:50 ` Werner Sembach 2026-02-27 9:31 ` Armin Wolf 2026-02-26 20:50 ` [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices Werner Sembach 2026-02-26 20:50 ` [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops Werner Sembach 3 siblings, 1 reply; 10+ messages in thread From: Werner Sembach @ 2026-02-26 20:50 UTC (permalink / raw) To: Armin Wolf, Hans de Goede, Ilpo Järvinen Cc: Werner Sembach, platform-driver-x86, linux-kernel On some devices Uniwill offers the option to set the USB-C port to prioritise charging or performance. This patch exposes this setting to the userspace via sysfs for all TUXEDO devices supporting it. Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> --- drivers/platform/x86/uniwill/uniwill-acpi.c | 103 ++++++++++++++++++-- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c index 7ab82cf16f388..a34b1eed74eb2 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -266,8 +266,8 @@ #define BATTERY_CHARGE_FULL_OVER_24H BIT(3) #define BATTERY_ERM_STATUS_REACHED BIT(4) -#define EC_ADDR_CHARGE_PRIO 0x07CC -#define CHARGING_PERFORMANCE BIT(7) +#define EC_ADDR_USB_C_POWER_PRIORITY 0x07CC +#define USB_C_POWER_PRIORITY BIT(7) /* Same bits as EC_ADDR_LIGHTBAR_AC_CTRL except LIGHTBAR_S3_OFF */ #define EC_ADDR_LIGHTBAR_BAT_CTRL 0x07E2 @@ -324,6 +324,7 @@ #define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) #define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) +#define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(10) struct uniwill_data { struct device *dev; @@ -343,6 +344,8 @@ struct uniwill_data { struct mutex input_lock; /* Protects input sequence during notify */ struct input_dev *input_device; struct notifier_block nb; + struct mutex usb_c_power_priority_lock; /* Protects dependent bit write and state safe */ + unsigned int last_usb_c_power_priority; }; struct uniwill_battery_entry { @@ -527,6 +530,7 @@ static bool uniwill_writeable_reg(struct device *dev, unsigned int reg) case EC_ADDR_CTGP_DB_CTGP_OFFSET: case EC_ADDR_CTGP_DB_TPP_OFFSET: case EC_ADDR_CTGP_DB_DB_OFFSET: + case EC_ADDR_USB_C_POWER_PRIORITY: return true; default: return false; @@ -565,6 +569,7 @@ static bool uniwill_readable_reg(struct device *dev, unsigned int reg) case EC_ADDR_CTGP_DB_CTGP_OFFSET: case EC_ADDR_CTGP_DB_TPP_OFFSET: case EC_ADDR_CTGP_DB_DB_OFFSET: + case EC_ADDR_USB_C_POWER_PRIORITY: return true; default: return false; @@ -587,6 +592,7 @@ static bool uniwill_volatile_reg(struct device *dev, unsigned int reg) case EC_ADDR_TRIGGER: case EC_ADDR_SWITCH_STATUS: case EC_ADDR_CHARGE_CTRL: + case EC_ADDR_USB_C_POWER_PRIORITY: return true; default: return false; @@ -883,6 +889,78 @@ static int uniwill_nvidia_ctgp_init(struct uniwill_data *data) return 0; } +enum usb_c_power_priority_options { + USB_C_POWER_PRIORITY_OPTIONS_CHARGING = 0, + USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE, +}; + +static const char * const USB_C_POWER_PRIORITY_OPTIONS_TEXT[] = { + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = "charging", + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = "performance", +}; + +static const u8 USB_C_POWER_PRIORITY_OPTIONS_VALUE[] = { + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = 0, + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = USB_C_POWER_PRIORITY, +}; + +static ssize_t usb_c_power_priority_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct uniwill_data *data = dev_get_drvdata(dev); + unsigned int value; + int ret; + + ret = sysfs_match_string(USB_C_POWER_PRIORITY_OPTIONS_TEXT, buf); + if (ret < 0) + return ret; + + value = USB_C_POWER_PRIORITY_OPTIONS_VALUE[ret]; + + guard(mutex)(&data->usb_c_power_priority_lock); + + ret = regmap_update_bits(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, + USB_C_POWER_PRIORITY, value); + if (ret < 0) + return ret; + + data->last_usb_c_power_priority = value; + + return count; +} + +static ssize_t usb_c_power_priority_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct uniwill_data *data = dev_get_drvdata(dev); + unsigned int value; + ssize_t count = 0; + int ret; + + ret = regmap_read(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, &value); + if (ret < 0) + return ret; + + value &= USB_C_POWER_PRIORITY; + + for (int i = 0; i < ARRAY_SIZE(USB_C_POWER_PRIORITY_OPTIONS_VALUE); ++i) { + if (USB_C_POWER_PRIORITY_OPTIONS_VALUE[i] == value) + count += sysfs_emit_at(buf, count, "[%s] ", + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); + else + count += sysfs_emit_at(buf, count, "%s ", + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); + } + if (count) + buf[count - 1] = '\n'; + + return count; +} + +static DEVICE_ATTR_RW(usb_c_power_priority); + static struct attribute *uniwill_attrs[] = { /* Keyboard-related */ &dev_attr_fn_lock.attr, @@ -893,6 +971,7 @@ static struct attribute *uniwill_attrs[] = { &dev_attr_breathing_in_suspend.attr, /* Power-management-related */ &dev_attr_ctgp_offset.attr, + &dev_attr_usb_c_power_priority.attr, NULL }; @@ -927,6 +1006,11 @@ static umode_t uniwill_attr_is_visible(struct kobject *kobj, struct attribute *a return attr->mode; } + if (attr == &dev_attr_usb_c_power_priority.attr) { + if (uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) + return attr->mode; + } + return 0; } @@ -1417,11 +1501,13 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action return NOTIFY_OK; case UNIWILL_OSD_DC_ADAPTER_CHANGED: - /* noop for the time being, will change once charging priority - * gets implemented. - */ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) + return NOTIFY_DONE; - return NOTIFY_OK; + return notifier_from_errno(regmap_update_bits(data->regmap, + EC_ADDR_OEM_4, + USB_C_POWER_PRIORITY, + data->last_usb_c_power_priority)); case UNIWILL_OSD_FN_LOCK: if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK)) return NOTIFY_DONE; @@ -1515,10 +1601,15 @@ static int uniwill_probe(struct platform_device *pdev) return PTR_ERR(regmap); data->regmap = regmap; + ret = devm_mutex_init(&pdev->dev, &data->super_key_lock); if (ret < 0) return ret; + ret = devm_mutex_init(&pdev->dev, &data->usb_c_power_priority_lock); + if (ret < 0) + return ret; + ret = uniwill_ec_init(data); if (ret < 0) return ret; -- 2.43.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting 2026-02-26 20:50 ` [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting Werner Sembach @ 2026-02-27 9:31 ` Armin Wolf 2026-02-27 18:48 ` Werner Sembach 0 siblings, 1 reply; 10+ messages in thread From: Armin Wolf @ 2026-02-27 9:31 UTC (permalink / raw) To: Werner Sembach, Hans de Goede, Ilpo Järvinen Cc: platform-driver-x86, linux-kernel Am 26.02.26 um 21:50 schrieb Werner Sembach: > On some devices Uniwill offers the option to set the USB-C port to > prioritise charging or performance. This patch exposes this setting to the > userspace via sysfs for all TUXEDO devices supporting it. > > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> > --- > drivers/platform/x86/uniwill/uniwill-acpi.c | 103 ++++++++++++++++++-- > 1 file changed, 97 insertions(+), 6 deletions(-) > > diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c > index 7ab82cf16f388..a34b1eed74eb2 100644 > --- a/drivers/platform/x86/uniwill/uniwill-acpi.c > +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c > @@ -266,8 +266,8 @@ > #define BATTERY_CHARGE_FULL_OVER_24H BIT(3) > #define BATTERY_ERM_STATUS_REACHED BIT(4) > > -#define EC_ADDR_CHARGE_PRIO 0x07CC > -#define CHARGING_PERFORMANCE BIT(7) > +#define EC_ADDR_USB_C_POWER_PRIORITY 0x07CC > +#define USB_C_POWER_PRIORITY BIT(7) > > /* Same bits as EC_ADDR_LIGHTBAR_AC_CTRL except LIGHTBAR_S3_OFF */ > #define EC_ADDR_LIGHTBAR_BAT_CTRL 0x07E2 > @@ -324,6 +324,7 @@ > #define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) > #define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) > #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) > +#define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(10) > > struct uniwill_data { > struct device *dev; > @@ -343,6 +344,8 @@ struct uniwill_data { > struct mutex input_lock; /* Protects input sequence during notify */ > struct input_dev *input_device; > struct notifier_block nb; > + struct mutex usb_c_power_priority_lock; /* Protects dependent bit write and state safe */ > + unsigned int last_usb_c_power_priority; > }; > > struct uniwill_battery_entry { > @@ -527,6 +530,7 @@ static bool uniwill_writeable_reg(struct device *dev, unsigned int reg) > case EC_ADDR_CTGP_DB_CTGP_OFFSET: > case EC_ADDR_CTGP_DB_TPP_OFFSET: > case EC_ADDR_CTGP_DB_DB_OFFSET: > + case EC_ADDR_USB_C_POWER_PRIORITY: > return true; > default: > return false; > @@ -565,6 +569,7 @@ static bool uniwill_readable_reg(struct device *dev, unsigned int reg) > case EC_ADDR_CTGP_DB_CTGP_OFFSET: > case EC_ADDR_CTGP_DB_TPP_OFFSET: > case EC_ADDR_CTGP_DB_DB_OFFSET: > + case EC_ADDR_USB_C_POWER_PRIORITY: > return true; > default: > return false; > @@ -587,6 +592,7 @@ static bool uniwill_volatile_reg(struct device *dev, unsigned int reg) > case EC_ADDR_TRIGGER: > case EC_ADDR_SWITCH_STATUS: > case EC_ADDR_CHARGE_CTRL: > + case EC_ADDR_USB_C_POWER_PRIORITY: > return true; > default: > return false; > @@ -883,6 +889,78 @@ static int uniwill_nvidia_ctgp_init(struct uniwill_data *data) > return 0; > } > > +enum usb_c_power_priority_options { > + USB_C_POWER_PRIORITY_OPTIONS_CHARGING = 0, > + USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE, > +}; > + > +static const char * const USB_C_POWER_PRIORITY_OPTIONS_TEXT[] = { > + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = "charging", > + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = "performance", > +}; > + > +static const u8 USB_C_POWER_PRIORITY_OPTIONS_VALUE[] = { > + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = 0, > + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = USB_C_POWER_PRIORITY, > +}; > + > +static ssize_t usb_c_power_priority_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct uniwill_data *data = dev_get_drvdata(dev); > + unsigned int value; > + int ret; > + > + ret = sysfs_match_string(USB_C_POWER_PRIORITY_OPTIONS_TEXT, buf); > + if (ret < 0) > + return ret; > + > + value = USB_C_POWER_PRIORITY_OPTIONS_VALUE[ret]; > + > + guard(mutex)(&data->usb_c_power_priority_lock); > + > + ret = regmap_update_bits(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, > + USB_C_POWER_PRIORITY, value); > + if (ret < 0) > + return ret; > + > + data->last_usb_c_power_priority = value; > + > + return count; > +} > + > +static ssize_t usb_c_power_priority_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct uniwill_data *data = dev_get_drvdata(dev); > + unsigned int value; > + ssize_t count = 0; > + int ret; > + > + ret = regmap_read(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, &value); > + if (ret < 0) > + return ret; > + > + value &= USB_C_POWER_PRIORITY; > + > + for (int i = 0; i < ARRAY_SIZE(USB_C_POWER_PRIORITY_OPTIONS_VALUE); ++i) { > + if (USB_C_POWER_PRIORITY_OPTIONS_VALUE[i] == value) > + count += sysfs_emit_at(buf, count, "[%s] ", > + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); > + else > + count += sysfs_emit_at(buf, count, "%s ", > + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); > + } > + if (count) > + buf[count - 1] = '\n'; > + > + return count; > +} > + > +static DEVICE_ATTR_RW(usb_c_power_priority); > + > static struct attribute *uniwill_attrs[] = { > /* Keyboard-related */ > &dev_attr_fn_lock.attr, > @@ -893,6 +971,7 @@ static struct attribute *uniwill_attrs[] = { > &dev_attr_breathing_in_suspend.attr, > /* Power-management-related */ > &dev_attr_ctgp_offset.attr, > + &dev_attr_usb_c_power_priority.attr, > NULL > }; > > @@ -927,6 +1006,11 @@ static umode_t uniwill_attr_is_visible(struct kobject *kobj, struct attribute *a > return attr->mode; > } > > + if (attr == &dev_attr_usb_c_power_priority.attr) { > + if (uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) > + return attr->mode; > + } > + > return 0; > } > > @@ -1417,11 +1501,13 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action > > return NOTIFY_OK; > case UNIWILL_OSD_DC_ADAPTER_CHANGED: > - /* noop for the time being, will change once charging priority > - * gets implemented. > - */ > + if (!uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) > + return NOTIFY_DONE; > > - return NOTIFY_OK; > + return notifier_from_errno(regmap_update_bits(data->regmap, > + EC_ADDR_OEM_4, > + USB_C_POWER_PRIORITY, > + data->last_usb_c_power_priority)); You need to lock the associated mutex here before accessing last_usb_c_power_priority. Since this is not possible inside a switch statement when using guard(), i suggest that you move this code (feature check + register access) into a small helper function. > case UNIWILL_OSD_FN_LOCK: > if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK)) > return NOTIFY_DONE; > @@ -1515,10 +1601,15 @@ static int uniwill_probe(struct platform_device *pdev) > return PTR_ERR(regmap); > > data->regmap = regmap; > + > ret = devm_mutex_init(&pdev->dev, &data->super_key_lock); > if (ret < 0) > return ret; > > + ret = devm_mutex_init(&pdev->dev, &data->usb_c_power_priority_lock); > + if (ret < 0) > + return ret; last_usb_c_power_priority still needs to be initialized with the value of USB_C_POWER_PRIORITY here. I suggest that you move all of this (feature check + mutex + init) into a small helper function. Thanks, Armin Wolf > + > ret = uniwill_ec_init(data); > if (ret < 0) > return ret; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting 2026-02-27 9:31 ` Armin Wolf @ 2026-02-27 18:48 ` Werner Sembach 0 siblings, 0 replies; 10+ messages in thread From: Werner Sembach @ 2026-02-27 18:48 UTC (permalink / raw) To: Armin Wolf, Hans de Goede, Ilpo Järvinen Cc: platform-driver-x86, linux-kernel Am 27.02.26 um 10:31 schrieb Armin Wolf: > Am 26.02.26 um 21:50 schrieb Werner Sembach: > >> On some devices Uniwill offers the option to set the USB-C port to >> prioritise charging or performance. This patch exposes this setting to the >> userspace via sysfs for all TUXEDO devices supporting it. >> >> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> >> --- >> drivers/platform/x86/uniwill/uniwill-acpi.c | 103 ++++++++++++++++++-- >> 1 file changed, 97 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c >> b/drivers/platform/x86/uniwill/uniwill-acpi.c >> index 7ab82cf16f388..a34b1eed74eb2 100644 >> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c >> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c >> @@ -266,8 +266,8 @@ >> #define BATTERY_CHARGE_FULL_OVER_24H BIT(3) >> #define BATTERY_ERM_STATUS_REACHED BIT(4) >> -#define EC_ADDR_CHARGE_PRIO 0x07CC >> -#define CHARGING_PERFORMANCE BIT(7) >> +#define EC_ADDR_USB_C_POWER_PRIORITY 0x07CC >> +#define USB_C_POWER_PRIORITY BIT(7) >> /* Same bits as EC_ADDR_LIGHTBAR_AC_CTRL except LIGHTBAR_S3_OFF */ >> #define EC_ADDR_LIGHTBAR_BAT_CTRL 0x07E2 >> @@ -324,6 +324,7 @@ >> #define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) >> #define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) >> #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) >> +#define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(10) >> struct uniwill_data { >> struct device *dev; >> @@ -343,6 +344,8 @@ struct uniwill_data { >> struct mutex input_lock; /* Protects input sequence during notify */ >> struct input_dev *input_device; >> struct notifier_block nb; >> + struct mutex usb_c_power_priority_lock; /* Protects dependent bit write >> and state safe */ >> + unsigned int last_usb_c_power_priority; >> }; >> struct uniwill_battery_entry { >> @@ -527,6 +530,7 @@ static bool uniwill_writeable_reg(struct device *dev, >> unsigned int reg) >> case EC_ADDR_CTGP_DB_CTGP_OFFSET: >> case EC_ADDR_CTGP_DB_TPP_OFFSET: >> case EC_ADDR_CTGP_DB_DB_OFFSET: >> + case EC_ADDR_USB_C_POWER_PRIORITY: >> return true; >> default: >> return false; >> @@ -565,6 +569,7 @@ static bool uniwill_readable_reg(struct device *dev, >> unsigned int reg) >> case EC_ADDR_CTGP_DB_CTGP_OFFSET: >> case EC_ADDR_CTGP_DB_TPP_OFFSET: >> case EC_ADDR_CTGP_DB_DB_OFFSET: >> + case EC_ADDR_USB_C_POWER_PRIORITY: >> return true; >> default: >> return false; >> @@ -587,6 +592,7 @@ static bool uniwill_volatile_reg(struct device *dev, >> unsigned int reg) >> case EC_ADDR_TRIGGER: >> case EC_ADDR_SWITCH_STATUS: >> case EC_ADDR_CHARGE_CTRL: >> + case EC_ADDR_USB_C_POWER_PRIORITY: >> return true; >> default: >> return false; >> @@ -883,6 +889,78 @@ static int uniwill_nvidia_ctgp_init(struct uniwill_data >> *data) >> return 0; >> } >> +enum usb_c_power_priority_options { >> + USB_C_POWER_PRIORITY_OPTIONS_CHARGING = 0, >> + USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE, >> +}; >> + >> +static const char * const USB_C_POWER_PRIORITY_OPTIONS_TEXT[] = { >> + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = "charging", >> + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = "performance", >> +}; >> + >> +static const u8 USB_C_POWER_PRIORITY_OPTIONS_VALUE[] = { >> + [USB_C_POWER_PRIORITY_OPTIONS_CHARGING] = 0, >> + [USB_C_POWER_PRIORITY_OPTIONS_PERFORMANCE] = USB_C_POWER_PRIORITY, >> +}; >> + >> +static ssize_t usb_c_power_priority_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, size_t count) >> +{ >> + struct uniwill_data *data = dev_get_drvdata(dev); >> + unsigned int value; >> + int ret; >> + >> + ret = sysfs_match_string(USB_C_POWER_PRIORITY_OPTIONS_TEXT, buf); >> + if (ret < 0) >> + return ret; >> + >> + value = USB_C_POWER_PRIORITY_OPTIONS_VALUE[ret]; >> + >> + guard(mutex)(&data->usb_c_power_priority_lock); >> + >> + ret = regmap_update_bits(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, >> + USB_C_POWER_PRIORITY, value); >> + if (ret < 0) >> + return ret; >> + >> + data->last_usb_c_power_priority = value; >> + >> + return count; >> +} >> + >> +static ssize_t usb_c_power_priority_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct uniwill_data *data = dev_get_drvdata(dev); >> + unsigned int value; >> + ssize_t count = 0; >> + int ret; >> + >> + ret = regmap_read(data->regmap, EC_ADDR_USB_C_POWER_PRIORITY, &value); >> + if (ret < 0) >> + return ret; >> + >> + value &= USB_C_POWER_PRIORITY; >> + >> + for (int i = 0; i < ARRAY_SIZE(USB_C_POWER_PRIORITY_OPTIONS_VALUE); ++i) { >> + if (USB_C_POWER_PRIORITY_OPTIONS_VALUE[i] == value) >> + count += sysfs_emit_at(buf, count, "[%s] ", >> + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); >> + else >> + count += sysfs_emit_at(buf, count, "%s ", >> + USB_C_POWER_PRIORITY_OPTIONS_TEXT[i]); >> + } >> + if (count) >> + buf[count - 1] = '\n'; >> + >> + return count; >> +} >> + >> +static DEVICE_ATTR_RW(usb_c_power_priority); >> + >> static struct attribute *uniwill_attrs[] = { >> /* Keyboard-related */ >> &dev_attr_fn_lock.attr, >> @@ -893,6 +971,7 @@ static struct attribute *uniwill_attrs[] = { >> &dev_attr_breathing_in_suspend.attr, >> /* Power-management-related */ >> &dev_attr_ctgp_offset.attr, >> + &dev_attr_usb_c_power_priority.attr, >> NULL >> }; >> @@ -927,6 +1006,11 @@ static umode_t uniwill_attr_is_visible(struct kobject >> *kobj, struct attribute *a >> return attr->mode; >> } >> + if (attr == &dev_attr_usb_c_power_priority.attr) { >> + if (uniwill_device_supports(data, >> UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) >> + return attr->mode; >> + } >> + >> return 0; >> } >> @@ -1417,11 +1501,13 @@ static int uniwill_notifier_call(struct >> notifier_block *nb, unsigned long action >> return NOTIFY_OK; >> case UNIWILL_OSD_DC_ADAPTER_CHANGED: >> - /* noop for the time being, will change once charging priority >> - * gets implemented. >> - */ >> + if (!uniwill_device_supports(data, >> UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) >> + return NOTIFY_DONE; >> - return NOTIFY_OK; >> + return notifier_from_errno(regmap_update_bits(data->regmap, >> + EC_ADDR_OEM_4, >> + USB_C_POWER_PRIORITY, >> + data->last_usb_c_power_priority)); > > You need to lock the associated mutex here before accessing > last_usb_c_power_priority. Since this > is not possible inside a switch statement when using guard(), i suggest that > you move this code > (feature check + register access) into a small helper function. > >> case UNIWILL_OSD_FN_LOCK: >> if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK)) >> return NOTIFY_DONE; >> @@ -1515,10 +1601,15 @@ static int uniwill_probe(struct platform_device *pdev) >> return PTR_ERR(regmap); >> data->regmap = regmap; >> + >> ret = devm_mutex_init(&pdev->dev, &data->super_key_lock); >> if (ret < 0) >> return ret; >> + ret = devm_mutex_init(&pdev->dev, &data->usb_c_power_priority_lock); >> + if (ret < 0) >> + return ret; > > last_usb_c_power_priority still needs to be initialized with the value of > USB_C_POWER_PRIORITY here. > I suggest that you move all of this (feature check + mutex + init) into a > small helper function. ack > > Thanks, > Armin Wolf > >> + >> ret = uniwill_ec_init(data); >> if (ret < 0) >> return ret; ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices [not found] <20260226205302.123782-1-wse@tuxedocomputers.com> 2026-02-26 20:50 ` [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines Werner Sembach 2026-02-26 20:50 ` [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting Werner Sembach @ 2026-02-26 20:50 ` Werner Sembach 2026-02-27 9:35 ` Armin Wolf 2026-02-26 20:50 ` [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops Werner Sembach 3 siblings, 1 reply; 10+ messages in thread From: Werner Sembach @ 2026-02-26 20:50 UTC (permalink / raw) To: Armin Wolf, Hans de Goede, Ilpo Järvinen Cc: Werner Sembach, platform-driver-x86, linux-kernel Uses the more fine granular and/or new feature defines to enable more features across the TUXEDO device lineup. Also adds features defines that where already present, but not tested until now. Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> --- drivers/platform/x86/uniwill/uniwill-acpi.c | 214 ++++++++++++++------ 1 file changed, 156 insertions(+), 58 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c index a34b1eed74eb2..f54b27ae832d2 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -110,6 +110,8 @@ #define EC_ADDR_BAT_CYCLE_COUNT_2 0x04A7 #define EC_ADDR_PROJECT_ID 0x0740 +#define PROJECT_ID_PH4TRX1 0x12 +#define PROJECT_ID_PH6TRX1 0x15 #define EC_ADDR_AP_OEM 0x0741 #define ENABLE_MANUAL_CTRL BIT(0) @@ -1821,6 +1823,15 @@ static struct platform_driver uniwill_driver = { .shutdown = uniwill_shutdown, }; +static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __initdata = { + .features = UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN, +}; + static struct uniwill_device_descriptor lapac71h_descriptor __initdata = { .features = UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | @@ -1844,6 +1855,85 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { UNIWILL_FEATURE_SECONDARY_FAN, }; +/* + * The featuresets below reflect somewhat chronological changes: + * 1 -> 2: UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL is added to the EC firmware. + * 2 -> 3: UNIWILL_FEATURE_USB_C_POWER_PRIORITY is removed from the EC firmware. + * Some devices might divert from this timeline. + */ + +static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = { + .features = UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, +}; + +static struct uniwill_device_descriptor tux_featureset_1_nvidia_descriptor __initdata = { + .features = 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_USB_C_POWER_PRIORITY, +}; + +static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __initdata = { + .features = 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_USB_C_POWER_PRIORITY, +}; + +static struct uniwill_device_descriptor tux_featureset_3_descriptor __initdata = { + .features = UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN, +}; + +static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __initdata = { + .features = 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, +}; + +static int phxtxx1_probe(struct uniwill_data *data) +{ + unsigned int value; + int ret; + + ret = regmap_read(data->regmap, EC_ADDR_PROJECT_ID, &value); + if (ret < 0) + return ret; + + if (value == PROJECT_ID_PH4TRX1 || value == PROJECT_ID_PH6TRX1) + data->features |= UNIWILL_FEATURE_SECONDARY_FAN; + + return 0; +}; + +static struct uniwill_device_descriptor phxtxx1_descriptor __initdata = { + .features = UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, + .probe = phxtxx1_probe, +}; + static int phxarx1_phxaqf1_probe(struct uniwill_data *data) { unsigned int value; @@ -1854,37 +1944,45 @@ static int phxarx1_phxaqf1_probe(struct uniwill_data *data) return ret; if (value & HAS_GPU) - data->features |= UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; + data->features |= UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; return 0; }; static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initdata = { + .features = UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, .probe = phxarx1_phxaqf1_probe, }; -static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = { - .features = UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, +static struct uniwill_device_descriptor pf5pu1g_descriptor __initdata = { + .features = UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN, }; -static struct uniwill_device_descriptor empty_descriptor __initdata = {}; - static const struct dmi_system_id uniwill_dmi_table[] __initconst = { { - .ident = "XMG FUSION 15", + .ident = "XMG FUSION 15 (L19)", .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"), + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "LAPQC71A"), }, - .driver_data = &empty_descriptor, + .driver_data = &lapqc71a_lapqc71b_descriptor, }, { - .ident = "XMG FUSION 15", + .ident = "XMG FUSION 15 (L19)", .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"), + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "LAPQC71B"), }, - .driver_data = &empty_descriptor, + .driver_data = &lapqc71a_lapqc71b_descriptor, }, { .ident = "Intel NUC x15", @@ -1908,7 +2006,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTxX1"), }, - .driver_data = &empty_descriptor, + .driver_data = &phxtxx1_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14 Gen6 Intel", @@ -1916,7 +2014,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel", @@ -1932,7 +2030,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6AG01_PH6AQ71_PH6AQI1"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/16 Gen8 Intel/Commodore Omnia-Book Pro Gen 8", @@ -1940,7 +2038,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14 Gen8 Intel/Commodore Omnia-Book Pro Gen 8", @@ -1948,7 +2046,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel", @@ -1956,7 +2054,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD", @@ -1964,7 +2062,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxHRXx"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 Intel/Commodore Omnia-Book 15 Gen9", @@ -1972,7 +2070,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxMRXx"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD", @@ -1980,7 +2078,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxHP4NAx"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD", @@ -1988,7 +2086,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_descriptor, }, { .ident = "TUXEDO InfinityBook Pro 15 Gen10 Intel", @@ -1996,7 +2094,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxAR4NAx"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_descriptor, }, { .ident = "TUXEDO InfinityBook Max 15 Gen10 AMD", @@ -2004,7 +2102,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5KK45xS_X5SP45xS"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Max 16 Gen10 AMD", @@ -2012,7 +2110,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6HP45xU"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Max 16 Gen10 AMD", @@ -2020,7 +2118,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6KK45xU_X6SP45xU"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Max 15 Gen10 Intel", @@ -2028,7 +2126,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5AR45xS"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO InfinityBook Max 16 Gen10 Intel", @@ -2036,7 +2134,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR55xU"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15 Gen1 AMD", @@ -2044,7 +2142,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A1650TI"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15 Gen1 AMD", @@ -2052,7 +2150,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A2060"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 17 Gen1 AMD", @@ -2060,7 +2158,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A1650TI"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 17 Gen1 AMD", @@ -2068,7 +2166,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A2060"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15 Gen1 Intel", @@ -2076,7 +2174,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I1650TI"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15 Gen1 Intel", @@ -2084,7 +2182,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I2060"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 17 Gen1 Intel", @@ -2092,7 +2190,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I1650TI"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 17 Gen1 Intel", @@ -2100,7 +2198,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I2060"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Trinity 15 Intel Gen1", @@ -2108,7 +2206,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1501I"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Trinity 17 Intel Gen1", @@ -2116,7 +2214,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1701I"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15/17 Gen2 AMD", @@ -2124,7 +2222,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15/17 Gen2 Intel", @@ -2132,7 +2230,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD", @@ -2140,7 +2238,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel", @@ -2148,7 +2246,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD", @@ -2156,7 +2254,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 15 Gen4 Intel", @@ -2164,7 +2262,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Polaris 15/17 Gen5 AMD", @@ -2172,7 +2270,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_2_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen5 AMD", @@ -2180,7 +2278,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore ORION Gen 5", @@ -2188,7 +2286,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris Slim 15 Gen6 AMD", @@ -2196,7 +2294,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore ORION Slim 15 Gen6", @@ -2204,7 +2302,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", @@ -2212,7 +2310,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", @@ -2220,7 +2318,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION 17 Gen6", @@ -2228,7 +2326,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen7 AMD", @@ -2236,7 +2334,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen7 Intel", @@ -2244,7 +2342,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Stellaris 16 Gen7 Intel", @@ -2252,7 +2350,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"), }, - .driver_data = &tux_featureset_1_descriptor, + .driver_data = &tux_featureset_3_nvidia_descriptor, }, { .ident = "TUXEDO Book BA15 Gen10 AMD", @@ -2260,7 +2358,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5PU1G"), }, - .driver_data = &empty_descriptor, + .driver_data = &pf5pu1g_descriptor, }, { .ident = "TUXEDO Pulse 14 Gen1 AMD", @@ -2268,7 +2366,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1401"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_descriptor, }, { .ident = "TUXEDO Pulse 15 Gen1 AMD", @@ -2276,7 +2374,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1501"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_descriptor, }, { .ident = "TUXEDO Pulse 15 Gen2 AMD", @@ -2284,7 +2382,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5LUXG"), }, - .driver_data = &empty_descriptor, + .driver_data = &tux_featureset_1_descriptor, }, { } }; -- 2.43.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices 2026-02-26 20:50 ` [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices Werner Sembach @ 2026-02-27 9:35 ` Armin Wolf 0 siblings, 0 replies; 10+ messages in thread From: Armin Wolf @ 2026-02-27 9:35 UTC (permalink / raw) To: Werner Sembach, Hans de Goede, Ilpo Järvinen Cc: platform-driver-x86, linux-kernel Am 26.02.26 um 21:50 schrieb Werner Sembach: > Uses the more fine granular and/or new feature defines to enable more > features across the TUXEDO device lineup. > > Also adds features defines that where already present, but not tested until > now. > > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> > --- > drivers/platform/x86/uniwill/uniwill-acpi.c | 214 ++++++++++++++------ > 1 file changed, 156 insertions(+), 58 deletions(-) > > diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c > index a34b1eed74eb2..f54b27ae832d2 100644 > --- a/drivers/platform/x86/uniwill/uniwill-acpi.c > +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c > @@ -110,6 +110,8 @@ > #define EC_ADDR_BAT_CYCLE_COUNT_2 0x04A7 > > #define EC_ADDR_PROJECT_ID 0x0740 > +#define PROJECT_ID_PH4TRX1 0x12 > +#define PROJECT_ID_PH6TRX1 0x15 > > #define EC_ADDR_AP_OEM 0x0741 > #define ENABLE_MANUAL_CTRL BIT(0) > @@ -1821,6 +1823,15 @@ static struct platform_driver uniwill_driver = { > .shutdown = uniwill_shutdown, > }; > > +static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __initdata = { > + .features = UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_BATTERY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_GPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN, > +}; > + > static struct uniwill_device_descriptor lapac71h_descriptor __initdata = { > .features = UNIWILL_FEATURE_FN_LOCK | > UNIWILL_FEATURE_SUPER_KEY | > @@ -1844,6 +1855,85 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = { > UNIWILL_FEATURE_SECONDARY_FAN, > }; > > +/* > + * The featuresets below reflect somewhat chronological changes: > + * 1 -> 2: UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL is added to the EC firmware. > + * 2 -> 3: UNIWILL_FEATURE_USB_C_POWER_PRIORITY is removed from the EC firmware. > + * Some devices might divert from this timeline. > + */ > + > +static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = { > + .features = UNIWILL_FEATURE_FN_LOCK | > + UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN | > + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, > +}; > + > +static struct uniwill_device_descriptor tux_featureset_1_nvidia_descriptor __initdata = { > + .features = 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_USB_C_POWER_PRIORITY, > +}; > + > +static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __initdata = { > + .features = 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_USB_C_POWER_PRIORITY, > +}; > + > +static struct uniwill_device_descriptor tux_featureset_3_descriptor __initdata = { > + .features = UNIWILL_FEATURE_FN_LOCK | > + UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN, > +}; > + > +static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __initdata = { > + .features = 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, > +}; > + > +static int phxtxx1_probe(struct uniwill_data *data) > +{ > + unsigned int value; > + int ret; > + > + ret = regmap_read(data->regmap, EC_ADDR_PROJECT_ID, &value); > + if (ret < 0) > + return ret; > + > + if (value == PROJECT_ID_PH4TRX1 || value == PROJECT_ID_PH6TRX1) > + data->features |= UNIWILL_FEATURE_SECONDARY_FAN; > + > + return 0; > +}; > + > +static struct uniwill_device_descriptor phxtxx1_descriptor __initdata = { > + .features = UNIWILL_FEATURE_FN_LOCK | > + UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, > + .probe = phxtxx1_probe, > +}; > + > static int phxarx1_phxaqf1_probe(struct uniwill_data *data) > { > unsigned int value; > @@ -1854,37 +1944,45 @@ static int phxarx1_phxaqf1_probe(struct uniwill_data *data) > return ret; > > if (value & HAS_GPU) > - data->features |= UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; > + data->features |= UNIWILL_FEATURE_GPU_TEMP | > + UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; > > return 0; > }; > > static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initdata = { > + .features = UNIWILL_FEATURE_FN_LOCK | > + UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN | > + UNIWILL_FEATURE_SECONDARY_FAN | > + UNIWILL_FEATURE_USB_C_POWER_PRIORITY, > .probe = phxarx1_phxaqf1_probe, > }; > > -static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = { > - .features = UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, > +static struct uniwill_device_descriptor pf5pu1g_descriptor __initdata = { > + .features = UNIWILL_FEATURE_FN_LOCK | > + UNIWILL_FEATURE_SUPER_KEY | > + UNIWILL_FEATURE_CPU_TEMP | > + UNIWILL_FEATURE_PRIMARY_FAN, > }; > > -static struct uniwill_device_descriptor empty_descriptor __initdata = {}; > - > static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > { > - .ident = "XMG FUSION 15", > + .ident = "XMG FUSION 15 (L19)", > .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"), > + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "LAPQC71A"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &lapqc71a_lapqc71b_descriptor, > }, > { > - .ident = "XMG FUSION 15", > + .ident = "XMG FUSION 15 (L19)", > .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"), > + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "LAPQC71B"), I am missing a changelog for the series, and i am a bit confused. Was this change a mistake or not? Thanks, Armin Wolf > }, > - .driver_data = &empty_descriptor, > + .driver_data = &lapqc71a_lapqc71b_descriptor, > }, > { > .ident = "Intel NUC x15", > @@ -1908,7 +2006,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTxX1"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &phxtxx1_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14 Gen6 Intel", > @@ -1916,7 +2014,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel", > @@ -1932,7 +2030,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6AG01_PH6AQ71_PH6AQI1"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/16 Gen8 Intel/Commodore Omnia-Book Pro Gen 8", > @@ -1940,7 +2038,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14 Gen8 Intel/Commodore Omnia-Book Pro Gen 8", > @@ -1948,7 +2046,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel", > @@ -1956,7 +2054,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD", > @@ -1964,7 +2062,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxHRXx"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 Intel/Commodore Omnia-Book 15 Gen9", > @@ -1972,7 +2070,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxMRXx"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD", > @@ -1980,7 +2078,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxHP4NAx"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD", > @@ -1988,7 +2086,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Pro 15 Gen10 Intel", > @@ -1996,7 +2094,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxAR4NAx"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Max 15 Gen10 AMD", > @@ -2004,7 +2102,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5KK45xS_X5SP45xS"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Max 16 Gen10 AMD", > @@ -2012,7 +2110,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6HP45xU"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Max 16 Gen10 AMD", > @@ -2020,7 +2118,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6KK45xU_X6SP45xU"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Max 15 Gen10 Intel", > @@ -2028,7 +2126,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5AR45xS"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO InfinityBook Max 16 Gen10 Intel", > @@ -2036,7 +2134,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR55xU"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15 Gen1 AMD", > @@ -2044,7 +2142,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A1650TI"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15 Gen1 AMD", > @@ -2052,7 +2150,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A2060"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 17 Gen1 AMD", > @@ -2060,7 +2158,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A1650TI"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 17 Gen1 AMD", > @@ -2068,7 +2166,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A2060"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15 Gen1 Intel", > @@ -2076,7 +2174,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I1650TI"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15 Gen1 Intel", > @@ -2084,7 +2182,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I2060"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 17 Gen1 Intel", > @@ -2092,7 +2190,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I1650TI"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 17 Gen1 Intel", > @@ -2100,7 +2198,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I2060"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Trinity 15 Intel Gen1", > @@ -2108,7 +2206,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1501I"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Trinity 17 Intel Gen1", > @@ -2116,7 +2214,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1701I"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15/17 Gen2 AMD", > @@ -2124,7 +2222,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15/17 Gen2 Intel", > @@ -2132,7 +2230,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD", > @@ -2140,7 +2238,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel", > @@ -2148,7 +2246,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD", > @@ -2156,7 +2254,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 15 Gen4 Intel", > @@ -2164,7 +2262,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Polaris 15/17 Gen5 AMD", > @@ -2172,7 +2270,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_2_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen5 AMD", > @@ -2180,7 +2278,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore ORION Gen 5", > @@ -2188,7 +2286,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris Slim 15 Gen6 AMD", > @@ -2196,7 +2294,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore ORION Slim 15 Gen6", > @@ -2204,7 +2302,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", > @@ -2212,7 +2310,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", > @@ -2220,7 +2318,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION 17 Gen6", > @@ -2228,7 +2326,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen7 AMD", > @@ -2236,7 +2334,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen7 Intel", > @@ -2244,7 +2342,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Stellaris 16 Gen7 Intel", > @@ -2252,7 +2350,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"), > }, > - .driver_data = &tux_featureset_1_descriptor, > + .driver_data = &tux_featureset_3_nvidia_descriptor, > }, > { > .ident = "TUXEDO Book BA15 Gen10 AMD", > @@ -2260,7 +2358,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5PU1G"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &pf5pu1g_descriptor, > }, > { > .ident = "TUXEDO Pulse 14 Gen1 AMD", > @@ -2268,7 +2366,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1401"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_descriptor, > }, > { > .ident = "TUXEDO Pulse 15 Gen1 AMD", > @@ -2276,7 +2374,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1501"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_descriptor, > }, > { > .ident = "TUXEDO Pulse 15 Gen2 AMD", > @@ -2284,7 +2382,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = { > DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), > DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5LUXG"), > }, > - .driver_data = &empty_descriptor, > + .driver_data = &tux_featureset_1_descriptor, > }, > { } > }; ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops [not found] <20260226205302.123782-1-wse@tuxedocomputers.com> ` (2 preceding siblings ...) 2026-02-26 20:50 ` [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices Werner Sembach @ 2026-02-26 20:50 ` Werner Sembach 2026-02-27 9:36 ` Armin Wolf 3 siblings, 1 reply; 10+ messages in thread From: Werner Sembach @ 2026-02-26 20:50 UTC (permalink / raw) To: Armin Wolf, Jonathan Corbet, Shuah Khan Cc: Werner Sembach, platform-driver-x86, linux-kernel, linux-doc Adds short description for two new sysfs entries, ctgp_offset and usb_c_power_priority, to the documentation of uniwill laptops. Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> --- .../ABI/testing/sysfs-driver-uniwill-laptop | 25 +++++++++++++++++++ .../admin-guide/laptops/uniwill-laptop.rst | 12 +++++++++ 2 files changed, 37 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop index 2df70792968f3..55943252f2ab9 100644 --- a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop +++ b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop @@ -51,3 +51,28 @@ Description: Reading this file returns the current status of the breathing animation functionality. + +What: /sys/bus/platform/devices/INOU0000:XX/ctgp_offset +Date: January 2026 +KernelVersion: 7.0 +Contact: Werner Sembach <wse@tuxedocomputers.com> +Description: + Allows userspace applications to set the configurable TGP offset on top of the base + TGP. Base TGP and max TGP and therefore the max cTGP offset are device specific. + Note that setting the maximal cTGP leaves no window open for Dynamic Boost, + effectifly disabling that feature for the GPU to always be prioritized. + + Reading this file returns the current configurable TGP offset. + +What: /sys/bus/platform/devices/INOU0000:XX/usb_c_power_priority +Date: February 2026 +KernelVersion: 7.1 +Contact: Werner Sembach <wse@tuxedocomputers.com> +Description: + Allows userspace applications to set USB-C power distribution profile between one + that offers a bigger share of the power to the battery and one that offers more of + it to the CPU. Writing "charging"/"performance" into this file selects the + respective profile. + + Reading this file returns the profile names with the currently active one in + brackets. diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documentation/admin-guide/laptops/uniwill-laptop.rst index aff5f57a6bd47..c89b8b3756f84 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -50,6 +50,10 @@ between 1 and 100 percent are supported. Additionally the driver signals the presence of battery charging issues through the standard ``health`` power supply sysfs attribute. +It also let you set whether an USB-C power source should prioritise charging the battery or +delivering immediate power to the cpu. See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for +details. + Lightbar -------- @@ -58,3 +62,11 @@ LED class device. The default name of this LED class device is ``uniwill:multico See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details on how to control the various animation modes of the lightbar. + +Configurable TGP +-------- + +The ``uniwill-laptop`` driver allows to set the configurable TGP for devices with NVIDIA GPUs that +allow it. + +See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. -- 2.43.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops 2026-02-26 20:50 ` [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops Werner Sembach @ 2026-02-27 9:36 ` Armin Wolf 0 siblings, 0 replies; 10+ messages in thread From: Armin Wolf @ 2026-02-27 9:36 UTC (permalink / raw) To: Werner Sembach, Jonathan Corbet, Shuah Khan Cc: platform-driver-x86, linux-kernel, linux-doc Am 26.02.26 um 21:50 schrieb Werner Sembach: > Adds short description for two new sysfs entries, ctgp_offset and > usb_c_power_priority, to the documentation of uniwill laptops. > > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> > --- > .../ABI/testing/sysfs-driver-uniwill-laptop | 25 +++++++++++++++++++ > .../admin-guide/laptops/uniwill-laptop.rst | 12 +++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop > index 2df70792968f3..55943252f2ab9 100644 > --- a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop > +++ b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop > @@ -51,3 +51,28 @@ Description: > > Reading this file returns the current status of the breathing animation > functionality. > + > +What: /sys/bus/platform/devices/INOU0000:XX/ctgp_offset > +Date: January 2026 > +KernelVersion: 7.0 > +Contact: Werner Sembach <wse@tuxedocomputers.com> > +Description: > + Allows userspace applications to set the configurable TGP offset on top of the base > + TGP. Base TGP and max TGP and therefore the max cTGP offset are device specific. > + Note that setting the maximal cTGP leaves no window open for Dynamic Boost, > + effectifly disabling that feature for the GPU to always be prioritized. > + > + Reading this file returns the current configurable TGP offset. > + > +What: /sys/bus/platform/devices/INOU0000:XX/usb_c_power_priority > +Date: February 2026 > +KernelVersion: 7.1 > +Contact: Werner Sembach <wse@tuxedocomputers.com> > +Description: > + Allows userspace applications to set USB-C power distribution profile between one set -> choose the Thanks, Armin Wolf > + that offers a bigger share of the power to the battery and one that offers more of > + it to the CPU. Writing "charging"/"performance" into this file selects the > + respective profile. > + > + Reading this file returns the profile names with the currently active one in > + brackets. > diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documentation/admin-guide/laptops/uniwill-laptop.rst > index aff5f57a6bd47..c89b8b3756f84 100644 > --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst > +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst > @@ -50,6 +50,10 @@ between 1 and 100 percent are supported. > Additionally the driver signals the presence of battery charging issues through the standard > ``health`` power supply sysfs attribute. > > +It also let you set whether an USB-C power source should prioritise charging the battery or > +delivering immediate power to the cpu. See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for > +details. > + > Lightbar > -------- > > @@ -58,3 +62,11 @@ LED class device. The default name of this LED class device is ``uniwill:multico > > See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details on how to control the various > animation modes of the lightbar. > + > +Configurable TGP > +-------- > + > +The ``uniwill-laptop`` driver allows to set the configurable TGP for devices with NVIDIA GPUs that > +allow it. > + > +See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-02-27 18:48 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20260226205302.123782-1-wse@tuxedocomputers.com>
2026-02-26 20:50 ` [PATCH v2 1/4] platform/x86/uniwill: uniwill-laptop: Rework hwmon feature defines Werner Sembach
2026-02-27 9:28 ` Armin Wolf
2026-02-27 18:45 ` Werner Sembach
2026-02-26 20:50 ` [PATCH v2 2/4] platform/x86/uniwill: Implement USB-C power priority setting Werner Sembach
2026-02-27 9:31 ` Armin Wolf
2026-02-27 18:48 ` Werner Sembach
2026-02-26 20:50 ` [PATCH v2 3/4] platform/x86/uniwill: Apply features across all TUXEDO devices Werner Sembach
2026-02-27 9:35 ` Armin Wolf
2026-02-26 20:50 ` [PATCH v2 4/4] Documentation: laptops: Update documentation for uniwill laptops Werner Sembach
2026-02-27 9:36 ` Armin Wolf
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®