From 0bd5dae9fda187ed9241e17a32ae42b913eb9502 Mon Sep 17 00:00:00 2001 From: Vadim Vetrov Date: Tue, 2 Jul 2024 19:13:58 +0300 Subject: [PATCH 1/2] Support for reverse fan speed. On some platforms fan speed is reversed (more value in ec -> less fan speed). This commit adds a workaround for this problem without break of existing APIs. --- ec_memory_configuration.h | 7 +++++++ msi-ec.c | 29 +++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/ec_memory_configuration.h b/ec_memory_configuration.h index c50ba6f..768c759 100644 --- a/ec_memory_configuration.h +++ b/ec_memory_configuration.h @@ -63,11 +63,18 @@ struct msi_ec_fan_mode_conf { struct msi_ec_mode modes[5]; // fixed size for easier hard coding }; +#define FAN_PARSE_STRATEGY_NORMAL 0 +// When fan speed specified in reverse order +// 0xff - minimal speed, 0x01 - maximum and 0x00 - stopped. +#define FAN_PARSE_STRATEGY_REVERSE 1 struct msi_ec_cpu_conf { int rt_temp_address; int rt_fan_speed_address; // realtime int rt_fan_speed_base_min; int rt_fan_speed_base_max; + // For special fan speed parsing cases + // Optional parameter. Defaults to FAN_PARSE_STRATEGY_NORMAL. + int rt_fan_parse_strategy; int bs_fan_speed_address; // basic int bs_fan_speed_base_min; int bs_fan_speed_base_max; diff --git a/msi-ec.c b/msi-ec.c index 628d385..0d3c34c 100644 --- a/msi-ec.c +++ b/msi-ec.c @@ -1169,7 +1169,7 @@ static struct msi_ec_conf CONF13 __initdata = { }; static const char *ALLOWED_FW_14[] __initconst = { - "17L2EMS1.108", // Katana 17 B11UCX + "17L2EMS1.108", // Katana 17 B11UCX, Katana GF76-11UC NULL }; @@ -1228,8 +1228,9 @@ static struct msi_ec_conf CONF14 __initdata = { .cpu = { .rt_temp_address = 0x68, .rt_fan_speed_address = 0xc9, - .rt_fan_speed_base_min = 0x00, // ? - .rt_fan_speed_base_max = 0x96, // ? + .rt_fan_speed_base_min = 0xff, + .rt_fan_speed_base_max = 0x4a, + .rt_fan_parse_strategy = FAN_PARSE_STRATEGY_REVERSE, .bs_fan_speed_address = MSI_EC_ADDR_UNSUPP, .bs_fan_speed_base_min = 0x00, // ? .bs_fan_speed_base_max = 0x0f, // ? @@ -2736,14 +2737,26 @@ static ssize_t cpu_realtime_fan_speed_show(struct device *device, if (result < 0) return result; - if ((rdata < conf.cpu.rt_fan_speed_base_min || - rdata > conf.cpu.rt_fan_speed_base_max)) + if (rdata == 0) + return sysfs_emit(buf, "%i\n", 0); + + int fan_speed = rdata; + int fan_speed_max = conf.cpu.rt_fan_speed_base_max; + int fan_speed_min = conf.cpu.rt_fan_speed_base_min; + if (conf.cpu.rt_fan_parse_strategy == FAN_PARSE_STRATEGY_REVERSE) { + fan_speed *= -1; + fan_speed_max *= -1; + fan_speed_min *= -1; + } + + if ((fan_speed < fan_speed_min || + fan_speed > fan_speed_max)) return -EINVAL; return sysfs_emit(buf, "%i\n", - 100 * (rdata - conf.cpu.rt_fan_speed_base_min) / - (conf.cpu.rt_fan_speed_base_max - - conf.cpu.rt_fan_speed_base_min)); + 100 * (fan_speed - fan_speed_min) / + (fan_speed_max - + fan_speed_min)); } static ssize_t cpu_basic_fan_speed_show(struct device *device, From e579abfeaf42f74d8a2f7c6869453ac8bb1c1c31 Mon Sep 17 00:00:00 2001 From: Vadim Vetrov Date: Wed, 3 Jul 2024 22:13:34 +0300 Subject: [PATCH 2/2] Fix keyboard brightness reset on module exit. By default kernel triggers the setter on led_classdev_unregister which leads to keyboard brightness reset (the keyboard backlight turns off). This behavior may cause resets every system reboot. Also it's quite annoying in development. --- msi-ec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/msi-ec.c b/msi-ec.c index 0d3c34c..47f0239 100644 --- a/msi-ec.c +++ b/msi-ec.c @@ -3235,6 +3235,11 @@ static enum led_brightness kbd_bl_sysfs_get(struct led_classdev *led_cdev) static int kbd_bl_sysfs_set(struct led_classdev *led_cdev, enum led_brightness brightness) { + // By default, on an unregister event, + // kernel triggers the setter with 0 brightness. + if (led_cdev->flags & LED_UNREGISTERING) + return 0; + u8 wdata; if (brightness < 0 || brightness > 3) return -1;