/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* Fan control module for Chrome EC */ #ifndef __CROS_EC_FAN_H #define __CROS_EC_FAN_H struct fan_conf { unsigned int flags; /* Hardware channel number (the meaning is chip-specific) */ int ch; /* Active-high power_good input GPIO, or -1 if none */ int pgood_gpio; /* Active-high power_enable output GPIO, or -1 if none */ int enable_gpio; }; struct fan_rpm { /* rpm_min is to keep turning. rpm_start is to begin turning */ int rpm_min; int rpm_start; int rpm_max; }; /* Characteristic of each physical fan */ struct fan_t { const struct fan_conf *conf; const struct fan_rpm *rpm; }; /* Values for .flags field */ /* Enable automatic RPM control using tach input */ #define FAN_USE_RPM_MODE (1 << 0) /* Require a higher duty cycle to start up than to keep running */ #define FAN_USE_FAST_START (1 << 1) /* The list of fans is instantiated in board.c. */ extern struct fan_t fans[]; /* For convenience */ #define FAN_CH(fan) fans[fan].conf->ch /** * Set the amount of active cooling needed. The thermal control task will call * this frequently, and the fan control logic will attempt to provide it. * * @param fan Fan number (index into fans[]) * @param pct Percentage of cooling effort needed (0 - 100) */ void fan_set_percent_needed(int fan, int pct); /** * This function translates the percentage of cooling needed into a target RPM. * The default implementation should be sufficient for most needs, but * individual boards may provide a custom version if needed (see config.h). * * @param fan Fan number (index into fans[]) * @param pct Percentage of cooling effort needed (always in [0,100]) * Return Target RPM for fan */ int fan_percent_to_rpm(int fan, int pct); /** * These functions require chip-specific implementations. */ /* Enable/Disable the fan controller */ void fan_set_enabled(int ch, int enabled); int fan_get_enabled(int ch); /* Fixed pwm duty cycle (0-100%) */ void fan_set_duty(int ch, int percent); int fan_get_duty(int ch); /* Enable/Disable automatic RPM control using tach feedback */ void fan_set_rpm_mode(int ch, int rpm_mode); int fan_get_rpm_mode(int ch); /* Set the target for the automatic RPM control */ void fan_set_rpm_target(int ch, int rpm); int fan_get_rpm_actual(int ch); int fan_get_rpm_target(int ch); /* Is the fan stalled when it shouldn't be? */ int fan_is_stalled(int ch); /* How is the automatic RPM control doing? */ enum fan_status { FAN_STATUS_STOPPED = 0, FAN_STATUS_CHANGING = 1, FAN_STATUS_LOCKED = 2, FAN_STATUS_FRUSTRATED = 3 }; enum fan_status fan_get_status(int ch); /* Initialize the HW according to the desired flags */ void fan_channel_setup(int ch, unsigned int flags); #endif /* __CROS_EC_FAN_H */