mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-28 02:35:28 +00:00
samus: change fan RPM values, enable fast-start
Updating the fan speeds according to the manufacturer's specs. The fan vendor recommends that the minimum fan speed be a 20% duty cycle. Since the built-in fan controller has a tach-based feedback loop, I'm using the RPM value instead of the duty cycle (20% is 2286 RPM, according to the vendor). The vendor also wants a 30% duty cycle to start turning, but the built-in fan controller provides support for fast-start too. The controller's minimum fast-start duty cycle is 50%, but it also has a programmable number of revolutions that it will wait before backing off. Holding my ear down close to the fans while they start and stop, it seems that the minimum 2 revolution start period is sufficient and provides the least noise. Of course, since I've never had any problems starting the fans directly at 1000 RPM this noise is a little more noticeable than that. It's quite possible that the built-in controller is smart enough to make 1000 RPM work by bumping the duty cycle up until the fans turn even if the fans don't like it. BUG=chrome-os-partner:32892 BRANCH=ToT,samus TEST=manual Listen closely and run the EC console "faninfo" command to see the fans start and stop as the system boots and idles. Change-Id: I47c9e7cef3f9f4bd815a13032fe10234decd62ed Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/224830 Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
committed by
chrome-internal-fetch
parent
7eaa290c35
commit
8cd9856cf8
@@ -105,16 +105,16 @@ BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT);
|
||||
|
||||
/* Physical fans. These are logically separate from pwm_channels. */
|
||||
const struct fan_t fans[] = {
|
||||
{.flags = FAN_USE_RPM_MODE,
|
||||
.rpm_min = 1000,
|
||||
.rpm_max = 6500,
|
||||
{.flags = FAN_USE_RPM_MODE | FAN_USE_FAST_START,
|
||||
.rpm_min = 2286,
|
||||
.rpm_max = 6350,
|
||||
.ch = 2,
|
||||
.pgood_gpio = -1,
|
||||
.enable_gpio = -1,
|
||||
},
|
||||
{.flags = FAN_USE_RPM_MODE,
|
||||
.rpm_min = 1000,
|
||||
.rpm_max = 6500,
|
||||
{.flags = FAN_USE_RPM_MODE | FAN_USE_FAST_START,
|
||||
.rpm_min = 2286,
|
||||
.rpm_max = 6350,
|
||||
.ch = 3,
|
||||
.pgood_gpio = -1,
|
||||
.enable_gpio = -1,
|
||||
|
||||
@@ -132,7 +132,9 @@ int fan_is_stalled(int ch)
|
||||
|
||||
void fan_channel_setup(int ch, unsigned int flags)
|
||||
{
|
||||
if (flags & FAN_USE_RPM_MODE) {
|
||||
uint32_t init;
|
||||
|
||||
if (flags & FAN_USE_RPM_MODE)
|
||||
/*
|
||||
* Configure automatic/feedback mode:
|
||||
* 0x8000 = bit 15 = auto-restart
|
||||
@@ -146,8 +148,8 @@ void fan_channel_setup(int ch, unsigned int flags)
|
||||
* (see note at top of file)
|
||||
* 0x0000 = bit 0 = automatic control
|
||||
*/
|
||||
LM4_FAN_FANCH(ch) = 0x802c;
|
||||
} else {
|
||||
init = 0x802c;
|
||||
else
|
||||
/*
|
||||
* Configure drive-only mode:
|
||||
* 0x0000 = bit 15 = no auto-restart
|
||||
@@ -159,8 +161,17 @@ void fan_channel_setup(int ch, unsigned int flags)
|
||||
* 0x0000 = bits 3:2 = 1 pulses per revolution
|
||||
* 0x0001 = bit 0 = manual control
|
||||
*/
|
||||
LM4_FAN_FANCH(ch) = 0x0001;
|
||||
}
|
||||
init = 0x0001;
|
||||
|
||||
if (flags & FAN_USE_FAST_START)
|
||||
/*
|
||||
* Configure fast-start mode
|
||||
* 0x0000 = bits 10:8 = start period (2<<0) edges
|
||||
* 0x0040 = bits 7:6 = fast start at 50% duty
|
||||
*/
|
||||
init |= 0x0040;
|
||||
|
||||
LM4_FAN_FANCH(ch) = init;
|
||||
}
|
||||
|
||||
static void fan_init(void)
|
||||
|
||||
@@ -21,8 +21,11 @@ struct fan_t {
|
||||
int enable_gpio;
|
||||
};
|
||||
|
||||
/* Values for the flags field */
|
||||
#define FAN_USE_RPM_MODE (1 << 0)
|
||||
/* 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 const struct fan_t fans[];
|
||||
@@ -82,9 +85,6 @@ enum fan_status {
|
||||
};
|
||||
enum fan_status fan_get_status(int ch);
|
||||
|
||||
/* Flag to enable automatic RPM control using tach input */
|
||||
#define FAN_USE_RPM_MODE (1 << 0)
|
||||
|
||||
/* Initialize the HW according to the desired flags */
|
||||
void fan_channel_setup(int ch, unsigned int flags);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user