From 197c25f359d6511a4e0ba803cbe12e6cba8fa747 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Mon, 25 Jul 2022 16:58:27 +0200 Subject: [PATCH 01/19] Add uw charging prio and charging profile hw io methods --- src/uniwill_keyboard.h | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 24c0ea4..7050f6b 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -819,6 +819,65 @@ static int uw_lightbar_remove(struct platform_device *dev) return 0; } +/* + * charging_prio values + * 0 => charging priority + * 1 => performance priority + */ +static int uw_set_charging_priority(u8 charging_priority) +{ + u8 previous_data, next_data; + int result; + + charging_priority = (charging_priority & 0x01) << 7; + + result = uniwill_read_ec_ram(0x07cc, &previous_data); + if (result != 0) + return result; + + next_data = (previous_data & ~(1 << 7)) | charging_priority; + result = uniwill_write_ec_ram(0x07cc, next_data); + + return result; +} + +static int uw_get_charging_priority(u8 *charging_priority) +{ + int result = uniwill_read_ec_ram(0x07cc, charging_priority); + *charging_priority = (*charging_priority >> 7) & 0x01; + return result; +} + +/* + * charging_prio values + * 0 => high capacity + * 1 => balanced + * 2 => stationary + */ +static int uw_set_charging_profile(u8 charging_profile) +{ + u8 previous_data, next_data; + int result; + + charging_profile = (charging_profile & 0x03) << 4; + + result = uniwill_read_ec_ram(0x07a6, &previous_data); + if (result != 0) + return result; + + next_data = (previous_data & ~(0x03 << 4)) | charging_profile; + result = uniwill_write_ec_ram(0x07a6, next_data); + + return result; +} + +static int uw_get_charging_profile(u8 *charging_profile) +{ + int result = uniwill_read_ec_ram(0x07a6, charging_profile); + *charging_profile = (*charging_profile >> 4) & 0x03; + return result; +} + static int uniwill_keyboard_probe(struct platform_device *dev) { u32 i; From f5916ddc34b719c25ebc35626fdb02544014400f Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Tue, 15 Nov 2022 18:53:30 +0100 Subject: [PATCH 02/19] Add interface definition for charging prio --- src/uniwill_keyboard.h | 97 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 7050f6b..e921a8f 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -878,6 +878,103 @@ static int uw_get_charging_profile(u8 *charging_profile) return result; } +struct char_to_u8_t { + char* descriptor; + u8 value; +}; + +/** + * Commonly used standard colors + */ +static struct char_to_u8_t charging_prio_options[] = { + { .descriptor = "charge_battery", .value = 0x00 }, + { .descriptor = "performance", .value = 0x01 } +}; + +static ssize_t uw_charging_prios_available_show(struct device *child, + struct device_attribute *attr, + char *buffer) +{ + int i; + for (i = 0; i < ARRAY_SIZE(charging_prio_options); ++i) + sprintf(buffer + strlen(buffer), " %s", + charging_prio_options[i].descriptor); + sprintf(buffer + strlen(buffer), "\n"); + return strlen(buffer); +} + +static ssize_t uw_charging_prio_show(struct device *child, + struct device_attribute *attr, char *buffer) +{ + u8 charging_prio_value; + int i, result; + + result = uw_get_charging_priority(&charging_prio_value); + if (result != 0) + return result; + + for (i = 0; i < ARRAY_SIZE(charging_prio_options); ++i) + if (charging_prio_options[i].value == charging_prio_value) { + sprintf(buffer, "%s\n", charging_prio_options[i].descriptor); + return strlen(buffer); + } + + pr_err("Read charging prio value not matched to a descriptor\n"); + + return -EIO; +} + +static ssize_t uw_charging_prio_store(struct device *child, + struct device_attribute *attr, + const char *buffer, size_t size) +{ + u8 charging_prio_value; + int i, result; + char *buffer_copy; + char *charging_prio_descriptor; + buffer_copy = kmalloc(size + 1, GFP_KERNEL); + strcpy(buffer_copy, buffer); + charging_prio_descriptor = strstrip(buffer_copy); + + for (i = 0; i < ARRAY_SIZE(charging_prio_options); ++i) + if (strcmp(charging_prio_options[i].descriptor, charging_prio_descriptor) == 0) { + charging_prio_value = charging_prio_options[i].value; + break; + } + + kfree(buffer_copy); + + if (i < ARRAY_SIZE(charging_prio_options)) { + // Option found try to set + result = uw_set_charging_priority(charging_prio_value); + if (result == 0) + return size; + else + return -EIO; + } else + // Invalid input, not matched to an option + return -EINVAL; +} + +struct uw_charging_prio_attrs_t { + struct device_attribute charging_prios_available; + struct device_attribute charging_prio; +} uw_charging_prio_attrs = { + .charging_prios_available = __ATTR(charging_prios_available, 0444, uw_charging_prios_available_show, NULL), + .charging_prio = __ATTR(charging_prio, 0644, uw_charging_prio_show, uw_charging_prio_store) +}; + +static struct attribute *uw_charging_prio_attrs_list[] = { + &uw_charging_prio_attrs.charging_prios_available.attr, + &uw_charging_prio_attrs.charging_prio.attr, + NULL +}; + +static struct attribute_group uw_charging_prio_attr_group = { + .name = "uw_charging_priority", + .attrs = uw_charging_prio_attrs_list +}; + static int uniwill_keyboard_probe(struct platform_device *dev) { u32 i; From 0ba6d70c06c2a1b30ebacb0d466b0d5f048f5a3a Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Wed, 16 Nov 2022 11:30:40 +0100 Subject: [PATCH 03/19] Add charging prio capability check - Add uw features property - Add ec has charging prio func - Move uw device id func def --- src/uniwill_interfaces.h | 1 + src/uniwill_keyboard.h | 124 ++++++++++++++++++++++----------------- 2 files changed, 71 insertions(+), 54 deletions(-) diff --git a/src/uniwill_interfaces.h b/src/uniwill_interfaces.h index ae95e39..c0a3ab0 100644 --- a/src/uniwill_interfaces.h +++ b/src/uniwill_interfaces.h @@ -68,6 +68,7 @@ struct uniwill_device_features_t { bool uniwill_profile_v1_two_profs; bool uniwill_profile_v1_three_profs; bool uniwill_profile_v1_three_profs_leds_only; + bool uniwill_has_charging_prio; }; u32 uniwill_add_interface(struct uniwill_interface_t *new_interface); diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index e921a8f..9d987c3 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -208,60 +208,6 @@ u32 uniwill_get_active_interface_id(char **id_str) } EXPORT_SYMBOL(uniwill_get_active_interface_id); -struct uniwill_device_features_t *uniwill_get_device_features(void) -{ - struct uniwill_device_features_t *uw_feats = &uniwill_device_features; - u32 status; - - status = uniwill_read_ec_ram(0x0740, &uw_feats->model); - if (status != 0) - uw_feats->model = 0; - - uw_feats->uniwill_profile_v1_two_profs = false - || dmi_match(DMI_BOARD_NAME, "PF5PU1G") - || dmi_match(DMI_BOARD_NAME, "PULSE1401") - || dmi_match(DMI_BOARD_NAME, "PULSE1501") - ; - - uw_feats->uniwill_profile_v1_three_profs = false - // Devices with "classic" profile support - || dmi_match(DMI_BOARD_NAME, "POLARIS1501A1650TI") - || dmi_match(DMI_BOARD_NAME, "POLARIS1501A2060") - || dmi_match(DMI_BOARD_NAME, "POLARIS1501I1650TI") - || dmi_match(DMI_BOARD_NAME, "POLARIS1501I2060") - || dmi_match(DMI_BOARD_NAME, "POLARIS1701A1650TI") - || dmi_match(DMI_BOARD_NAME, "POLARIS1701A2060") - || dmi_match(DMI_BOARD_NAME, "POLARIS1701I1650TI") - || dmi_match(DMI_BOARD_NAME, "POLARIS1701I2060") - // Note: XMG Fusion removed for now, seem to have - // neither same power profile control nor TDP set - //|| dmi_match(DMI_BOARD_NAME, "LAPQC71A") - //|| dmi_match(DMI_BOARD_NAME, "LAPQC71B") - //|| dmi_match(DMI_PRODUCT_NAME, "A60 MUV") - ; - - uw_feats->uniwill_profile_v1_three_profs_leds_only = false - // Devices where profile mainly controls power profile LED status -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XA02") - || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XI02") - || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XA03") - || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XI03") - || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XI03") - || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XA03") - || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XI04") - || dmi_match(DMI_PRODUCT_SKU, "STEPOL1XA04") -#endif - ; - - uw_feats->uniwill_profile_v1 = - uw_feats->uniwill_profile_v1_two_profs || - uw_feats->uniwill_profile_v1_three_profs; - - return uw_feats; -} -EXPORT_SYMBOL(uniwill_get_device_features); - static void key_event_work(struct work_struct *work) { sparse_keymap_report_known_event( @@ -848,6 +794,20 @@ static int uw_get_charging_priority(u8 *charging_priority) return result; } +static int uw_has_charging_priority(bool *status) +{ + u8 data; + int result; + result = uniwill_read_ec_ram(0x0742, &data); + + if (data & (1 << 5)) + *status = true; + else + *status = false; + + return result; +} + /* * charging_prio values * 0 => high capacity @@ -975,6 +935,62 @@ static struct attribute_group uw_charging_prio_attr_group = { .attrs = uw_charging_prio_attrs_list }; +struct uniwill_device_features_t *uniwill_get_device_features(void) +{ + struct uniwill_device_features_t *uw_feats = &uniwill_device_features; + u32 status; + + status = uniwill_read_ec_ram(0x0740, &uw_feats->model); + if (status != 0) + uw_feats->model = 0; + + uw_feats->uniwill_profile_v1_two_profs = false + || dmi_match(DMI_BOARD_NAME, "PF5PU1G") + || dmi_match(DMI_BOARD_NAME, "PULSE1401") + || dmi_match(DMI_BOARD_NAME, "PULSE1501") + ; + + uw_feats->uniwill_profile_v1_three_profs = false + // Devices with "classic" profile support + || dmi_match(DMI_BOARD_NAME, "POLARIS1501A1650TI") + || dmi_match(DMI_BOARD_NAME, "POLARIS1501A2060") + || dmi_match(DMI_BOARD_NAME, "POLARIS1501I1650TI") + || dmi_match(DMI_BOARD_NAME, "POLARIS1501I2060") + || dmi_match(DMI_BOARD_NAME, "POLARIS1701A1650TI") + || dmi_match(DMI_BOARD_NAME, "POLARIS1701A2060") + || dmi_match(DMI_BOARD_NAME, "POLARIS1701I1650TI") + || dmi_match(DMI_BOARD_NAME, "POLARIS1701I2060") + // Note: XMG Fusion removed for now, seem to have + // neither same power profile control nor TDP set + //|| dmi_match(DMI_BOARD_NAME, "LAPQC71A") + //|| dmi_match(DMI_BOARD_NAME, "LAPQC71B") + //|| dmi_match(DMI_PRODUCT_NAME, "A60 MUV") + ; + + uw_feats->uniwill_profile_v1_three_profs_leds_only = false + // Devices where profile mainly controls power profile LED status +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XA02") + || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XI02") + || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XA03") + || dmi_match(DMI_PRODUCT_SKU, "POLARIS1XI03") + || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XI03") + || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XA03") + || dmi_match(DMI_PRODUCT_SKU, "STELLARIS1XI04") + || dmi_match(DMI_PRODUCT_SKU, "STEPOL1XA04") +#endif + ; + + uw_feats->uniwill_profile_v1 = + uw_feats->uniwill_profile_v1_two_profs || + uw_feats->uniwill_profile_v1_three_profs; + + uw_has_charging_priority(&uw_feats->uniwill_has_charging_prio); + + return uw_feats; +} +EXPORT_SYMBOL(uniwill_get_device_features); + static int uniwill_keyboard_probe(struct platform_device *dev) { u32 i; From acc12d579f4a905ed9c657578bf1de531491cd35 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 18:20:04 +0100 Subject: [PATCH 04/19] Add charging prio init --- src/uniwill_keyboard.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 9d987c3..95608df 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -765,6 +765,8 @@ static int uw_lightbar_remove(struct platform_device *dev) return 0; } +static bool uw_charging_prio_loaded = false; + /* * charging_prio values * 0 => charging priority @@ -1026,11 +1028,16 @@ static int uniwill_keyboard_probe(struct platform_device *dev) status = uw_lightbar_init(dev); uw_lightbar_loaded = (status >= 0); + if (uw_feats->uniwill_has_charging_prio) + uw_charging_prio_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_prio_attr_group) == 0; + return 0; } static int uniwill_keyboard_remove(struct platform_device *dev) { + if (uw_charging_prio_loaded) + sysfs_remove_group(&dev->dev.kobj, &uw_charging_prio_attr_group); if (uniwill_kbd_bl_type_rgb_single_color) { sysfs_remove_group(&dev->dev.kobj, &uw_kbd_bl_color_attr_group); From dcf9ec030cb8fce9b9f228ac591f587c82ee15a8 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 18:36:40 +0100 Subject: [PATCH 05/19] Fix list output whitespace --- src/uniwill_keyboard.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 95608df..e25c2ec 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -857,11 +857,17 @@ static ssize_t uw_charging_prios_available_show(struct device *child, struct device_attribute *attr, char *buffer) { - int i; - for (i = 0; i < ARRAY_SIZE(charging_prio_options); ++i) - sprintf(buffer + strlen(buffer), " %s", + int i, n; + n = ARRAY_SIZE(charging_prio_options); + for (i = 0; i < n; ++i) { + sprintf(buffer + strlen(buffer), "%s", charging_prio_options[i].descriptor); - sprintf(buffer + strlen(buffer), "\n"); + if (i < n - 1) + sprintf(buffer + strlen(buffer), " "); + else + sprintf(buffer + strlen(buffer), "\n"); + } + return strlen(buffer); } From 7e03e3dfd9924774da1bc70ce7bd38a3dac9c2be Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 18:38:03 +0100 Subject: [PATCH 06/19] Remove old copy comment --- src/uniwill_keyboard.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index e25c2ec..ccb1eeb 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -845,9 +845,6 @@ struct char_to_u8_t { u8 value; }; -/** - * Commonly used standard colors - */ static struct char_to_u8_t charging_prio_options[] = { { .descriptor = "charge_battery", .value = 0x00 }, { .descriptor = "performance", .value = 0x01 } From ae58c0ddcbbb19ff273c27d255730844cae8e8fd Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 18:58:01 +0100 Subject: [PATCH 07/19] Add uw charging profiles interface structures --- src/uniwill_keyboard.h | 96 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index ccb1eeb..1ee8ee7 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -845,6 +845,102 @@ struct char_to_u8_t { u8 value; }; +static struct char_to_u8_t charging_profile_options[] = { + { .descriptor = "high_capacity", .value = 0x00 }, + { .descriptor = "balanced", .value = 0x01 }, + { .descriptor = "stationary", .value = 0x02 } +}; + +static ssize_t uw_charging_profiles_available_show(struct device *child, + struct device_attribute *attr, + char *buffer) +{ + int i, n; + n = ARRAY_SIZE(charging_profile_options); + for (i = 0; i < n; ++i) { + sprintf(buffer + strlen(buffer), "%s", + charging_profile_options[i].descriptor); + if (i < n - 1) + sprintf(buffer + strlen(buffer), " "); + else + sprintf(buffer + strlen(buffer), "\n"); + } + + return strlen(buffer); +} + +static ssize_t uw_charging_profile_show(struct device *child, + struct device_attribute *attr, char *buffer) +{ + u8 charging_profile_value; + int i, result; + + result = uw_get_charging_profile(&charging_profile_value); + if (result != 0) + return result; + + for (i = 0; i < ARRAY_SIZE(charging_profile_options); ++i) + if (charging_profile_options[i].value == charging_profile_value) { + sprintf(buffer, "%s\n", charging_profile_options[i].descriptor); + return strlen(buffer); + } + + pr_err("Read charging profile value not matched to a descriptor\n"); + + return -EIO; +} + +static ssize_t uw_charging_profile_store(struct device *child, + struct device_attribute *attr, + const char *buffer, size_t size) +{ + u8 charging_profile_value; + int i, result; + char *buffer_copy; + char *charging_profile_descriptor; + buffer_copy = kmalloc(size + 1, GFP_KERNEL); + strcpy(buffer_copy, buffer); + charging_profile_descriptor = strstrip(buffer_copy); + + for (i = 0; i < ARRAY_SIZE(charging_profile_options); ++i) + if (strcmp(charging_profile_options[i].descriptor, charging_profile_descriptor) == 0) { + charging_profile_value = charging_profile_options[i].value; + break; + } + + kfree(buffer_copy); + + if (i < ARRAY_SIZE(charging_profile_options)) { + // Option found try to set + result = uw_set_charging_profile(charging_profile_value); + if (result == 0) + return size; + else + return -EIO; + } else + // Invalid input, not matched to an option + return -EINVAL; +} + +struct uw_charging_profile_attrs_t { + struct device_attribute charging_profiles_available; + struct device_attribute charging_profile; +} uw_charging_profile_attrs = { + .charging_profiles_available = __ATTR(charging_profiles_available, 0444, uw_charging_profiles_available_show, NULL), + .charging_profile = __ATTR(charging_profile, 0644, uw_charging_profile_show, uw_charging_profile_store) +}; + +static struct attribute *uw_charging_profile_attrs_list[] = { + &uw_charging_profile_attrs.charging_profiles_available.attr, + &uw_charging_profile_attrs.charging_profile.attr, + NULL +}; + +static struct attribute_group uw_charging_profile_attr_group = { + .name = "uw_charging_profile", + .attrs = uw_charging_profile_attrs_list +}; + static struct char_to_u8_t charging_prio_options[] = { { .descriptor = "charge_battery", .value = 0x00 }, { .descriptor = "performance", .value = 0x01 } From 32e16b49f3414d7a78c7fbf0bc0516200720a012 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 19:01:27 +0100 Subject: [PATCH 08/19] Fix comment typo --- src/uniwill_keyboard.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 1ee8ee7..e0963c6 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -811,7 +811,7 @@ static int uw_has_charging_priority(bool *status) } /* - * charging_prio values + * charging_profile values * 0 => high capacity * 1 => balanced * 2 => stationary From d6f32f72701cc6993fe780f70216c30390e721b8 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 18 Nov 2022 19:45:03 +0100 Subject: [PATCH 09/19] Add uw charging profile init --- src/uniwill_keyboard.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index e0963c6..ba8b1f7 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -810,6 +810,8 @@ static int uw_has_charging_priority(bool *status) return result; } +static bool uw_charging_profile_loaded = false; + /* * charging_profile values * 0 => high capacity @@ -1130,6 +1132,8 @@ static int uniwill_keyboard_probe(struct platform_device *dev) if (uw_feats->uniwill_has_charging_prio) uw_charging_prio_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_prio_attr_group) == 0; + uw_charging_profile_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_profile_attr_group) == 0; + return 0; } @@ -1138,6 +1142,9 @@ static int uniwill_keyboard_remove(struct platform_device *dev) if (uw_charging_prio_loaded) sysfs_remove_group(&dev->dev.kobj, &uw_charging_prio_attr_group); + if (uw_charging_profile_loaded) + sysfs_remove_group(&dev->dev.kobj, &uw_charging_profile_attr_group); + if (uniwill_kbd_bl_type_rgb_single_color) { sysfs_remove_group(&dev->dev.kobj, &uw_kbd_bl_color_attr_group); } From 97ddaed7820dd93c5934551004ad19d09684f265 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Mon, 21 Nov 2022 14:47:55 +0100 Subject: [PATCH 10/19] Add id check for charging profile --- src/uniwill_interfaces.h | 1 + src/uniwill_keyboard.h | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/uniwill_interfaces.h b/src/uniwill_interfaces.h index c0a3ab0..f8895e4 100644 --- a/src/uniwill_interfaces.h +++ b/src/uniwill_interfaces.h @@ -69,6 +69,7 @@ struct uniwill_device_features_t { bool uniwill_profile_v1_three_profs; bool uniwill_profile_v1_three_profs_leds_only; bool uniwill_has_charging_prio; + bool uniwill_has_charging_profile; }; u32 uniwill_add_interface(struct uniwill_interface_t *new_interface); diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index ba8b1f7..73b28a3 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -842,6 +842,20 @@ static int uw_get_charging_profile(u8 *charging_profile) return result; } +static int uw_has_charging_profile(bool *status) +{ + u8 data; + int result; + result = uniwill_read_ec_ram(0x078e, &data); + + if (data & (1 << 3)) + *status = true; + else + *status = false; + + return result; +} + struct char_to_u8_t { char* descriptor; u8 value; @@ -1089,6 +1103,7 @@ struct uniwill_device_features_t *uniwill_get_device_features(void) uw_feats->uniwill_profile_v1_three_profs; uw_has_charging_priority(&uw_feats->uniwill_has_charging_prio); + uw_has_charging_profile(&uw_feats->uniwill_has_charging_profile); return uw_feats; } @@ -1132,7 +1147,8 @@ static int uniwill_keyboard_probe(struct platform_device *dev) if (uw_feats->uniwill_has_charging_prio) uw_charging_prio_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_prio_attr_group) == 0; - uw_charging_profile_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_profile_attr_group) == 0; + if (uw_feats->uniwill_has_charging_prio) + uw_charging_profile_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_profile_attr_group) == 0; return 0; } From 362e16e703d20b2d00fbd105324957049df5bc79 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Mon, 21 Nov 2022 17:00:04 +0100 Subject: [PATCH 11/19] Remove attribute group name prefix --- src/uniwill_keyboard.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 73b28a3..2296c1e 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -953,7 +953,7 @@ static struct attribute *uw_charging_profile_attrs_list[] = { }; static struct attribute_group uw_charging_profile_attr_group = { - .name = "uw_charging_profile", + .name = "charging_profile", .attrs = uw_charging_profile_attrs_list }; @@ -1048,7 +1048,7 @@ static struct attribute *uw_charging_prio_attrs_list[] = { }; static struct attribute_group uw_charging_prio_attr_group = { - .name = "uw_charging_priority", + .name = "charging_priority", .attrs = uw_charging_prio_attrs_list }; From bb4885cb571efcce4cdf2d0eb342c84415a3aee4 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Mon, 21 Nov 2022 17:47:28 +0100 Subject: [PATCH 12/19] Fix feature check --- src/uniwill_keyboard.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 2296c1e..9729a3b 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -1147,7 +1147,7 @@ static int uniwill_keyboard_probe(struct platform_device *dev) if (uw_feats->uniwill_has_charging_prio) uw_charging_prio_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_prio_attr_group) == 0; - if (uw_feats->uniwill_has_charging_prio) + if (uw_feats->uniwill_has_charging_profile) uw_charging_profile_loaded = sysfs_create_group(&dev->dev.kobj, &uw_charging_profile_attr_group) == 0; return 0; From e6659e4f6f8a1ea856a7ca88545e37ed8b40210d Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Tue, 6 Dec 2022 17:06:26 +0100 Subject: [PATCH 13/19] Always enable Dynamic Boost --- src/uniwill_keyboard.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 24c0ea4..1f6539c 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -840,6 +840,12 @@ static int uniwill_keyboard_probe(struct platform_device *dev) uniwill_write_ec_ram(0x0743 + i, data); } } + else { + // Activate NVIDIA Dynamic Boost + uniwill_write_ec_ram(0x0743, 0x03); + uniwill_write_ec_ram(0x0745, 0x23); + uniwill_write_ec_ram(0x0746, 0xff); + } // Enable manual mode uniwill_write_ec_ram(0x0741, 0x01); From f2c37fcc06cd55860b86a8d2abff9d92bd76ca08 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 16 Dec 2022 18:05:09 +0100 Subject: [PATCH 14/19] Exclude devices where interface is known to be incompatible with feature --- src/uniwill_keyboard.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 9729a3b..392b271 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -800,6 +800,17 @@ static int uw_has_charging_priority(bool *status) { u8 data; int result; + + bool not_supported_device = false + || dmi_match(DMI_BOARD_NAME, "PF5PU1G") + || dmi_match(DMI_BOARD_NAME, "LAPQC71A") + || dmi_match(DMI_BOARD_NAME, "LAPQC71B") + || dmi_match(DMI_PRODUCT_NAME, "A60 MUV") + ; + + if (not_supported_device) + return false; + result = uniwill_read_ec_ram(0x0742, &data); if (data & (1 << 5)) @@ -846,6 +857,17 @@ static int uw_has_charging_profile(bool *status) { u8 data; int result; + + bool not_supported_device = false + || dmi_match(DMI_BOARD_NAME, "PF5PU1G") + || dmi_match(DMI_BOARD_NAME, "LAPQC71A") + || dmi_match(DMI_BOARD_NAME, "LAPQC71B") + || dmi_match(DMI_PRODUCT_NAME, "A60 MUV") + ; + + if (not_supported_device) + return false; + result = uniwill_read_ec_ram(0x078e, &data); if (data & (1 << 3)) From c458c837678eeaae146ac70110af7bc1f32b719a Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Mon, 19 Dec 2022 15:30:14 +0100 Subject: [PATCH 15/19] Change activation sequence for faster apply --- src/uniwill_keyboard.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 1f6539c..bd4e1b8 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -842,9 +842,9 @@ static int uniwill_keyboard_probe(struct platform_device *dev) } else { // Activate NVIDIA Dynamic Boost - uniwill_write_ec_ram(0x0743, 0x03); + uniwill_write_ec_ram(0x0746, 0x19); uniwill_write_ec_ram(0x0745, 0x23); - uniwill_write_ec_ram(0x0746, 0xff); + uniwill_write_ec_ram(0x0743, 0x03); } // Enable manual mode From 88363ec0309fe4b490d1f9576c45bd5b4d12c552 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Mon, 19 Dec 2022 17:49:07 +0100 Subject: [PATCH 16/19] Update version to 3.1.2 + changelog --- .../usr/share/doc/module-name/changelog.gz | Bin 1544 -> 1647 bytes dkms.conf | 2 +- src/tuxedo_keyboard.c | 2 +- src_pkg/rpm_pkg.spec | 5 +++++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/deb/module-name/usr/share/doc/module-name/changelog.gz b/deb/module-name/usr/share/doc/module-name/changelog.gz index d0547ca481c32ec3dddc0317fae1cd7eeba97b2c..d61c9cedc11937f27121489a77d22b5175277458 100644 GIT binary patch literal 1647 zcmV-#29Wt5iwFq0m7rq+17m1mZf9j|Z)X6lSle#fI1qi$R}Av7uy4I)o%HK>NL?&vB3cb-V z97g?L!Kwun$?NZ2ZjJzch8sa*PBo;jf@Ca#SW0c6mys8c^SP#`4|Ay?p~?^@Af;=T z;BrA}%ESWn1`@;lP8VsaAz2c&a369d=ZsTe!ca9Q3H94l=Gx}DRK_j*)6g|YJKLGBf zIDv2q*EE4Bh$0BjX5-UY5Wp`%7z9U0W*^nz9;!c5>dA&V5qf~^dMC8ZXzhtv5(5iq zfEh4W37TRQfM_6KXogM_^$HuQRzyiFQorpjdqMj-vD~34@1Y#|2I*=SrtguNJpVYn||cfu%{S`-`Mc!VH^t!Y8Abf0*E&c~qfGAD{;)M0|T zk{P55%@iCjF^tX_1ApwjJNL@qL>HHPk8tmKM{og<~d+;ha0lIcRu zr=>lC;B<$aAbLA~$jzYuJ{ih6QK%(kigLgeFb2*ROA`}SWu;$!UFx&`Xr$wzGx+En zE^<|hZ#)~Fw}GD?z{c<9+7$k>yg(L4v+-FQvaDFmzS5_9s_ zYA1sFjJxYy^9#k9NagJVHL~Ab{9~k3Z0Ve~(Rq4+&T=tp#(C&^BlHs9z1#+84O|%G zunpJb0Ir9pNpSzXt3NkGe3N``>CN@?<%bV{hm#=suJvCYixdn|F=4yO6{kcDYz_&p z>bEw;xN!zMb5Ad&MS;vwHokrPw~6G~&b?@KzjLlcqpGrnuC0z*%kp>+iLQI3utvR0 ztFggi7jg53a)k;TNXlG|(yoV;PC4KeN3^N{lkZ`a7Fl^=6@dcPf2-ym%L1X0V&INu z*yO)bN2JO&MA63l;zuLgKp0nIF%6$T7x{LzBw~R!)yT7Z9G)K&PDFw$yh+zM;G}m? zsyLj^qSg*G+An76G#8HFB%~|0Ndwww7ERiqMF%C4aJrV;cI5RdRZ3L@z7OsHhCRYw zK&m1!o{h(?W5+>Wiw;l~aOizf4*zSv;h)`jDd8ZN17>lNlr9!NUFnN)y6SD+>0b2E zjq*kixS|)ecHMnbRHbEYludBnr*7IWVpHFAbi;E^-EfIz$gde}GFFW&8*DJ>7t{V0 zv@=6D>bv+ssWd()n=+p_cq=a#rFir6xz~BT!#Tbj zqtL^kWm=B>1ke%!HD8t51G+|-^{l&=+@hRfYYgVQ|E5oXEd=`C3Ad#fnNw^_uO;rN zWpasp$2^GpJrz`u24twRrb+&d2MokJIp2|&{}rLkoz9;4-d}k#nN22bo%KRnPV5*Sv+EL5TnTgb$hy&c5Ey|+$PX%P?Uc-+S*23v= tHFy@4b=u~1xZi0H_yI@40!YW3Yysu08gK$PdrcZS{x6v)*wD}v0077gElU6Z literal 1544 zcmV+j2KV_NiwFo$d`)8l17m1mZf9j|Z)X6lSle#fMi71XR}B16NUf!il<13kK^f&L}f6T zjKgs_{1vR4Q<1*>&gJ?D;Ai+isUQibkQ1RtGS4BG3bZUJWOT(+s=+LXfw?rm3>d2f z%|PZrG!QVfD5WCm^fOfK1^w z1;-0aquY#$Klafc7fkqXbV+G;+$0mZD45omx;KfEODcA*lmY~G#MP4NL(a#AJ%QkK zhnygKJ%7l}p#(k|$~jS}C1i?nz!fkB&gKh~5EQm8QLx4@zpnMUd1$2Lp*Q&G94<>$ zi*GucoOgl0IDq}`?Nb=9PT?p2=?p(1t59INu|5Un&mk=8n7T-R+l(Gm**L2WsT7zxby}r`XbY(M9L!0Xpl&texjEXlh`P^8W2MIBVg; z9EV-F;sdxIp5oyC)2{w-Hhf=vZt2bSr?>Cl{~g9b^h4{vJXR$bqGH1CEmxcpF|sA3 zyy@TC5JQ0poXi8gkQN1!qip>6_TQ$G<2d)C(Zk-g5>1-U7P_%I>1@l>JtVs6k--Y} zF0IA^i&Mn;4dogY4v>tw9;Mw3se^LB8;)qx0pcHFlvY)FX%&GA)xW#uo}Cp!A;rjD z&2Y$nqmD>btcjv6|KhC?9w3Zsu~>$mK3Da2wIE`Sdm78LdmY}N5KcsjEBuzec?d7y zo-}zlokg7!X0l(*)M+l9zDh`6Y;gdLkf5RT( zEFevjn9iotPTO&i*J=VZ4IBm^mBarsY{h5SUP@@hO28_viqhr6mn(fXPFI6%IQ^R* zhH*_(7f;}tUeq~t_qnJ>%i1WLqTi>^?N_;Bjlcn)k~wNBlRllssB7H@&w zrGAj64(ZVC#bUq#O6If=-=ArA0v9d1k?U9G6Zy9eNH7?d{-}z++`p^m_pr6f3btmP zZ%2CFI0v3Me5v}Ha-uaJwxwp@egs#LvUJHwlsijMtx=k9GPxFQ;nwSowCSQGNUogE z9i?8lB`3yltJ_+yNl)F#auZ7tz3AWeCh#CvHNRnpoFnfoI{3vBTqapP6}Nu3v0c6U zM+{H2+z23?b^(kJ1N=a@1&5L(93S|BQ%JRW7e6SK)&pfT=IchiG>bBP^YgXW+uos% zuWb}Y7<9Ph$UA_J6sUYzYY*rOVQ#$cN^*;GN~|$h@BW!S0X7#He=ppYVrEWpEWOmY zqYmd1`H6WD_d6=6A}z?!R85=w8xI(W4>I48m;Wz9T|2!a@w2~)B%Z}_S0vHlNF2@X ze=rKQCY6uC8%X3Eze4smtLpkC)?lfS`n6*tKetU}?nX3lIh)r_^=kuU?7oKo)>x~c ur;YKfI_pJO(Bb}|J>UnlgcXpUZ?YAXv&P^A&U?kJ8vh3)CwM1i6953KNctN9 diff --git a/dkms.conf b/dkms.conf index df82bf3..e34dbd9 100644 --- a/dkms.conf +++ b/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME=tuxedo-keyboard -PACKAGE_VERSION=3.1.1 +PACKAGE_VERSION=3.1.2 DEST_MODULE_LOCATION[0]="/kernel/lib/" BUILT_MODULE_NAME[0]="tuxedo_keyboard" diff --git a/src/tuxedo_keyboard.c b/src/tuxedo_keyboard.c index 57f2ba6..f8f4c6e 100644 --- a/src/tuxedo_keyboard.c +++ b/src/tuxedo_keyboard.c @@ -26,7 +26,7 @@ MODULE_AUTHOR("TUXEDO Computers GmbH "); MODULE_DESCRIPTION("TUXEDO Computers keyboard & keyboard backlight Driver"); MODULE_LICENSE("GPL"); -MODULE_VERSION("3.1.1"); +MODULE_VERSION("3.1.2"); static DEFINE_MUTEX(tuxedo_keyboard_init_driver_lock); diff --git a/src_pkg/rpm_pkg.spec b/src_pkg/rpm_pkg.spec index 6963417..21e690e 100644 --- a/src_pkg/rpm_pkg.spec +++ b/src_pkg/rpm_pkg.spec @@ -142,6 +142,11 @@ exit 0 %changelog +* Mon Dec 19 2022 C Sandberg 3.1.2-1 +- Enables dynamic boost (max offset) for certain devices needing sw ctl +- Adds charging profile interface for devices supporting charging profiles +- Adds charging priority interface for devices supporting USB-C PD charging + priority setting * Mon Oct 17 2022 C Sandberg 3.1.1-1 - Reenable fans-off for some devices that got it turned of as a temporary workaround - Fix default fan curve not being reenabled when tccd is stopped From e8eeb3502828729d41dbb717bde481587f25ede5 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Fri, 23 Dec 2022 09:52:20 +0100 Subject: [PATCH 17/19] Avoid further feature identification if interface is missing --- src/tuxedo_io/tuxedo_io.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tuxedo_io/tuxedo_io.c b/src/tuxedo_io/tuxedo_io.c index 607fc34..a4dc62f 100644 --- a/src/tuxedo_io/tuxedo_io.c +++ b/src/tuxedo_io/tuxedo_io.c @@ -153,9 +153,12 @@ void uw_id_tdp(void) static u32 uniwill_identify(void) { - uw_feats = uniwill_get_device_features(); - uw_id_tdp(); - return uniwill_get_active_interface_id(NULL) == 0 ? 1 : 0; + u32 result = uniwill_get_active_interface_id(NULL) == 0 ? 1 : 0; + if (result) { + uw_feats = uniwill_get_device_features(); + uw_id_tdp(); + } + return result; } /*static int fop_open(struct inode *inode, struct file *file) From f99b283cec92dbf9f9730bb84781613b1a558de7 Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Mon, 9 Jan 2023 17:26:25 +0100 Subject: [PATCH 18/19] Fall back to old fancontrol on IBP 14 Gen 6 with H processor to fix 2nd fan not turning --- src/tuxedo_io/tuxedo_io.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tuxedo_io/tuxedo_io.c b/src/tuxedo_io/tuxedo_io.c index a4dc62f..d69594a 100644 --- a/src/tuxedo_io/tuxedo_io.c +++ b/src/tuxedo_io/tuxedo_io.c @@ -266,6 +266,13 @@ static int has_universal_ec_fan_control(void) { int ret; u8 data; + if (uw_feats->model == UW_MODEL_PH4TRX) { + // For some reason, on this particular device, the 2nd fan is not controlled via the + // "GPU" fan curve when the bit to seperate both fancurves is set, but the old fan + // control works just fine. + return 0; + } + ret = uniwill_read_ec_ram(0x078e, &data); if (ret < 0) { return ret; From cd907695b548d91d73ab9c34886f07aceb02ed57 Mon Sep 17 00:00:00 2001 From: Christoffer Sandberg Date: Wed, 11 Jan 2023 09:51:38 +0000 Subject: [PATCH 19/19] Update version to 3.1.3 - tuxedo-io to 0.3.2 - changelog --- .../usr/share/doc/module-name/changelog.gz | Bin 1647 -> 1752 bytes dkms.conf | 2 +- src/tuxedo_io/tuxedo_io.c | 2 +- src/tuxedo_keyboard.c | 2 +- src_pkg/rpm_pkg.spec | 4 ++++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/deb/module-name/usr/share/doc/module-name/changelog.gz b/deb/module-name/usr/share/doc/module-name/changelog.gz index d61c9cedc11937f27121489a77d22b5175277458..060d4e61771881b5a1eaf4466a5fd500d66ecb6d 100644 GIT binary patch delta 1589 zcmV-52Fm&G4A>2SABzYGuZ6y20s~`cVQyz-Y;R`(tytS`+c*$?&sPlcu&{S)SCZ{G z@m{dG7U?2s(6ngZ7L-KWgeg+s#ZLP5JESg_TRV!1eMt<7L!LQv=0X|!L{m9f(dSqa zl|pYc42Prs?_kw}isboEE;mO2zrqcBg4>ISaQu#n6VNn&ks^gT5g?=ioiibrSU`_( zLzN(gt*L*T7!D-Ql_bfsUvH#kMu93N)qqR6BAl%#WK?UipcdT~aOt*O5y%x? zQ(?evU`~m#isD`XEQQUI3bepe=Om#X4OtV$Nz7^g=m-V_xP(U{(wM3R{9)|V-^Tl# z$Sk*Lrib`{>o0&WG<^eM2=5Vf6htEkgW33G76kBH5C*}~k=aL8w1=u|;SSf3J`0ku z1Y#+*fnG+QK+flynm){>f`lqV(ASi%S%S+2rK#gkZyalWr}H$`kSvK>xEILcoN?Ol z)@@UnYn$g%8Mp9z3%z$UCKWT!?Yn(`yck@#48p(I2<03)Od0Ak}AZMH5GL z1mW}*REK-0{z$1O+i6V?kX`SDmsjP9SrP*alm#<@!VxsZC;-twz|ahxBn?l7_tqX0%)KQ|!V@vs&BuRlGX-4KbO}kSug%61-sW?R*+NcQjP=Vov zTyCg;s-q5gKA1FzxfO|FQed88z6c%X`mA3X>3HZ2K01Z-T$SP*&qk+h;Li?VzrA=2C+idV#s8Y(FJu)m3^(Q{ zRzm6!=2&ZnUZLOT+-+Tlya|%_#z^+8MmJyg(L4v+=YI+4KN17n=uJ zXss%hj?oC?=l+j8vk>zg(d}xqhYLsj{ql6dD!ce(7>*#ejJqPKErp&>;srBH8^Z<1 zz}>FsHCechU7bR(+Ac9CZ>)AAsL!~6z1lTDSDcAd-rQ3o``yJqMmoio&a*Z;PY%#o zE@sU*4_$ABUc$SV+hE$jg)t7>a7_;2x__Jmcb|9l=VplSlFu!@zWRLe;ln@SB#2(M z{_8`Lf*~pmd1)`l22&R}Qm>7}$Nka;y7`lpHH*v`FZbiZ?EuHXz; zR<_W!)lq9%9`B!fvCXeh@6u{)u-HZ1yrEp7ax*Y0(h_=AMkxRd4G~_o9bxlsAIF6}_mn>+YMPDlKcHY~n78lZFI6JAV0a zTU=r*SdCq`?WEkahsm2^btzvYi9_0VwwMgqK=I<-`LcV~pc}bNE+cvFf)gvZm!MjsG~cF^F9j(9UXxh`9DkAKwE)6# z8^Fn7fFJ2L;ZTx<;|t$#GO6mj_(7>OUMQO~pEr0bFBheF^YgjadA!3pz8s?h|2b#c z=Ha+41Zuu2wFmx-R6XmiCATQ2*cyZR?%(M*z!n1i?}Xb@jLZqPrRNfN)H1n5zGEK5 z{f-K%NCPrdS<@u{+5-mSoqC+_$jg64D08Q?C%*Sro=j$wNt-9pVNV>*?i-9ktx4rQ z@B<|BjgOH1dR3Xf#2QQ$QeHc1`8hL@x)X7Lo3lk(RR67j4Bcb+xx!jFJ+21NqOzW~ nIUVkI+5^7Fk+1;L@g`e9nN|Z%;AXE$Bgg*(C-s~q`xO8HfoKS+ delta 1492 zcmV;_1uOd44etzpABzYGxs{+}0s~`cVQyz-Y;R`(tytS`+c*$?&sPlcu&{SySCZ`{ z_Fk~L7THD8plQ&)Ehve$2~(uNi=FiAcSv0~3r*!bsUV@s z5GEj{YnI@0L21gw0`vwF!~ISdX{sSv618w2awX@CQ((eSH75!6+f?S-=DAeHE&SF( z@7;_^#msB_ZqHAbgDZHvu5EEQ*xI8%ZrRZh334@1Y#|2I*=SrtguNJpVYn||cfu%{S`-`Mc!VH^t!Y8Abf0*E&c~qf zGAD{;)M0|Tk{P55%@iCjF^tX_1ApwjJNL@qL>HHPk8tmKM{og<~d z+;hZ#m6GW~&Znh4f#7t9oFIBTe#p(C06rPYIZ>!3WQuaY6)*gC94>NIif=p{owtFX9>9Kg`4mppr|^@1I>RSq6*3Gr<|kG{>Ja8wYldE- z-{#z1U5C60lJJ!{(KZx;S@~$Wrs4QqIPu(ngivFPNwV@>VD(fSQj9mrDQ@#4wduSH zXo!Di;i!$1^EWsdBNGQb?||%9F_hXA{<6G47Dlu2SsSvm1IS!#9%Z4ms#H2gBaEN> zKl02%%y&e$tI-}V9QF6h(*72IFd3u1(axrVhdFXm0 z^b+2^+y-Y2To~i94cFuVu7{^daR0okKQ}{slYDOJ&Gqx;hYx>;lOX!8^HGMaRxhcPcNl^MS;vwHokrPw~6G~&b?@KzjLlcqpGrnuC0z* z%kp>+iLQI3utvR0tFggi7jg53a)k;TNXlG|(yoV;PC4KeN3^N{lkZ`a7Fl^=6@dcP zf2-ym%L1X0V&INu*yO)bN2JO&MA63l;zuLgKp0nIF%6$T7x{LzBw~R!)yT7xWdslr zPpUYa&Z5>1Gukg^>NFRQ-;;&}B1^(vK&m1!o{h(?W5+>Wiw;l~aOizf4*zSv;h)`j zDd8ZN17>lNlr9!NUFnN)y6SD+>0b2Ejq*kixS|)ecHMnbRHbEYludBnr<3ypJyUV@ zc;|0YHLS+2+jdfJ+Qa0{u)35VlEfkHJ6lW!Y@lR8yYT&)rYA6M(2ZQbDWAySIv_@8 zSn|Cp`f~ri?BD&yDl6EAalUQoW#R03;_y=SPm_QJ7y+e|nFT34L9R=F!xlM5ezs`g z7gKN*r)5{%&b!sv)wzC5;ECq70K#z_z{z2NAL%yXP?Ch>2j6fqsp`A1ke%!HD8t51G+|-^{l&=+@hRfYYgVQ|E5oXEd=`C3Ad#fnNw^_uO;rN zWpasp$2^GpJrz`u24twRrb+&d2MokJIp2|&{}rLkoz9;4-d}k#nN22bo%KRnPV5*SvM%q!!&zXtTornY6oGr?t`cDO9=w8E*71qM( uaW!}rm37+YbhzJX5BLE`!U9Ogn`{B)tQv3vH+xMQIsPx1C)m)?6aWBxEZgk> diff --git a/dkms.conf b/dkms.conf index e34dbd9..8d1d25a 100644 --- a/dkms.conf +++ b/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME=tuxedo-keyboard -PACKAGE_VERSION=3.1.2 +PACKAGE_VERSION=3.1.3 DEST_MODULE_LOCATION[0]="/kernel/lib/" BUILT_MODULE_NAME[0]="tuxedo_keyboard" diff --git a/src/tuxedo_io/tuxedo_io.c b/src/tuxedo_io/tuxedo_io.c index d69594a..38c47ba 100644 --- a/src/tuxedo_io/tuxedo_io.c +++ b/src/tuxedo_io/tuxedo_io.c @@ -34,7 +34,7 @@ MODULE_DESCRIPTION("Hardware interface for TUXEDO laptops"); MODULE_AUTHOR("TUXEDO Computers GmbH "); -MODULE_VERSION("0.3.1"); +MODULE_VERSION("0.3.2"); MODULE_LICENSE("GPL"); MODULE_ALIAS_CLEVO_INTERFACES(); diff --git a/src/tuxedo_keyboard.c b/src/tuxedo_keyboard.c index f8f4c6e..a3e7bd4 100644 --- a/src/tuxedo_keyboard.c +++ b/src/tuxedo_keyboard.c @@ -26,7 +26,7 @@ MODULE_AUTHOR("TUXEDO Computers GmbH "); MODULE_DESCRIPTION("TUXEDO Computers keyboard & keyboard backlight Driver"); MODULE_LICENSE("GPL"); -MODULE_VERSION("3.1.2"); +MODULE_VERSION("3.1.3"); static DEFINE_MUTEX(tuxedo_keyboard_init_driver_lock); diff --git a/src_pkg/rpm_pkg.spec b/src_pkg/rpm_pkg.spec index 21e690e..176a229 100644 --- a/src_pkg/rpm_pkg.spec +++ b/src_pkg/rpm_pkg.spec @@ -142,6 +142,10 @@ exit 0 %changelog +* Wed Jan 11 2023 C Sandberg 3.1.3-1 +- Fix IBP14Gen6 second fan not spinning (alternative fan ctl approach) +- Fix some error-lookalike messages in kernel log (aka prevent uw feature + id when interface not available) * Mon Dec 19 2022 C Sandberg 3.1.2-1 - Enables dynamic boost (max offset) for certain devices needing sw ctl - Adds charging profile interface for devices supporting charging profiles