diff options
-rw-r--r-- | common/fan.c | 18 | ||||
-rw-r--r-- | include/ec_commands.h | 5 | ||||
-rw-r--r-- | util/ectool.c | 63 |
3 files changed, 66 insertions, 20 deletions
diff --git a/common/fan.c b/common/fan.c index 550a4cf305..2e25f200b4 100644 --- a/common/fan.c +++ b/common/fan.c @@ -360,16 +360,26 @@ DECLARE_HOST_COMMAND(EC_CMD_PWM_SET_FAN_DUTY, static int hc_thermal_auto_fan_ctrl(struct host_cmd_handler_args *args) { int fan; + const struct ec_params_auto_fan_ctrl_v1 *p_v1 = args->params; - /* TODO(crosbug.com/p/23803) */ - for (fan = 0; fan < CONFIG_FANS; fan++) - set_thermal_control_enabled(fan, 1); + if (args->version == 0) { + for (fan = 0; fan < CONFIG_FANS; fan++) + set_thermal_control_enabled(fan, 1); + + return EC_RES_SUCCESS; + } + + fan = p_v1->fan_idx; + if (fan >= CONFIG_FANS) + return EC_RES_ERROR; + + set_thermal_control_enabled(fan, 1); return EC_RES_SUCCESS; } DECLARE_HOST_COMMAND(EC_CMD_THERMAL_AUTO_FAN_CTRL, hc_thermal_auto_fan_ctrl, - EC_VER_MASK(0)); + EC_VER_MASK(0)|EC_VER_MASK(1)); /*****************************************************************************/ diff --git a/include/ec_commands.h b/include/ec_commands.h index dcc097cc83..f6e009f17d 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -1599,6 +1599,11 @@ struct ec_params_thermal_set_threshold_v1 { /* Toggle automatic fan control */ #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 +/* Version 1 of input params */ +struct ec_params_auto_fan_ctrl_v1 { + uint8_t fan_idx; +} __packed; + /* Get TMP006 calibration data */ #define EC_CMD_TMP006_GET_CALIBRATION 0x53 diff --git a/util/ectool.c b/util/ectool.c index 5e91ca1f8c..57e0cc4463 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -1346,15 +1346,59 @@ int cmd_thermal_set_threshold(int argc, char *argv[]) } +static int get_num_fans(void) +{ + int idx, rv; + + for (idx = 0; idx < EC_FAN_SPEED_ENTRIES; idx++) { + rv = read_mapped_mem16(EC_MEMMAP_FAN + 2 * idx); + if (rv == EC_FAN_SPEED_NOT_PRESENT) + break; + } + + return idx; +} + int cmd_thermal_auto_fan_ctrl(int argc, char *argv[]) { - int rv; + int rv, num_fans; + struct ec_params_auto_fan_ctrl_v1 p_v1; + char *e; + int cmdver = 1; + + if (!ec_cmd_version_supported(EC_CMD_THERMAL_AUTO_FAN_CTRL, cmdver) + || (argc == 1)) { + /* If no argument is provided then enable auto fan ctrl */ + /* for all fans by using version 0 of the host command */ - rv = ec_command(EC_CMD_THERMAL_AUTO_FAN_CTRL, 0, NULL, 0, NULL, 0); + rv = ec_command(EC_CMD_THERMAL_AUTO_FAN_CTRL, 0, + NULL, 0, NULL, 0); + if (rv < 0) + return rv; + + printf("Automatic fan control is now on for all fans.\n"); + return 0; + } + + if (argc > 2 || !strcmp(argv[1], "help")) { + printf("Usage: %s [idx]\n", argv[0]); + return -1; + } + + num_fans = get_num_fans(); + p_v1.fan_idx = strtol(argv[1], &e, 0); + if ((e && *e) || (p_v1.fan_idx >= num_fans)) { + fprintf(stderr, "Bad fan index.\n"); + return -1; + } + + rv = ec_command(EC_CMD_THERMAL_AUTO_FAN_CTRL, cmdver, + &p_v1, sizeof(p_v1), NULL, 0); if (rv < 0) return rv; - printf("Automatic fan control is now on.\n"); + printf("Automatic fan control is now on for fan %d\n", p_v1.fan_idx); + return 0; } @@ -1376,19 +1420,6 @@ static int print_fan(int idx) return 0; } -static int get_num_fans(void) -{ - int idx, rv; - - for (idx = 0; idx < EC_FAN_SPEED_ENTRIES; idx++) { - rv = read_mapped_mem16(EC_MEMMAP_FAN + 2 * idx); - if (rv == EC_FAN_SPEED_NOT_PRESENT) - break; - } - - return idx; -} - int cmd_pwm_get_num_fans(int argc, char *argv[]) { int num_fans; |