[PATCHv2 1/3] Add support for GMT G762/G763 PWM fan controller
Arnaud Ebalard
arno at natisbad.org
Sat Jun 15 12:13:29 EDT 2013
Hi Simon,
spoiler: end of the story below ;-)
Simon Guinot <simon.guinot at sequanux.org> writes:
> OK you are lucky. Your bootloader initialize set_cnt with 0x5a. Mine
> don't and it is precisely the issue: set_cnt is still 0xff (the default
> value) when the driver controls the fan.
>
> Please, could you try open-loop mode with set_cnt set to 0xff ? Maybe
> you can enforce this value for the test purpose ?
>
> If you observe the same behaviour than me, then could modify the driver
> to ensure that set_cnt is not 0xff when open-loop mode is selected ?
> Maybe by systematically setting a different value (as 0) ?
Here we go:
# cd /sys/bus/i2c/drivers/g762/0-003e
# for k in fan* pwm* ; do echo -n "$k:" ; echo `cat $k `; done
fan1_alarm:0
fan1_div:1
fan1_fault:0
fan1_input:1365
fan1_pulses:2
fan1_target:1365
pwm1:0
pwm1_enable:2 /* closed-loop */
pwm1_mode:0 /* DC mode */
# echo 0 > fan1_target /* set set_cnt to 0, fan stops rotating */
# echo 1 > pwm1_enable /* switch to open-loop, fan does not rotate yet
* as default value for set_out is 0 and it has
* neither been touched by bootloader or driver */
# for k in fan* pwm* ; do echo -n "$k:" ; echo `cat $k `; done
fan1_alarm:0
fan1_div:1
fan1_fault:0
fan1_input:0
fan1_pulses:2
fan1_target:0
pwm1:0
pwm1_enable:1
pwm1_mode:0
# echo 100 > pwm1 /* set set_out to 100, fan rotates */
I don't get the issue in DC mode but ...
# echo 1 > pwm1_mode /* switch to PWM mode, fan stops rotating
* even though set_out is still set to
* 100: */
# for k in fan* pwm* ; do echo -n "$k:" ; echo `cat $k `; done
fan1_alarm:0
fan1_div:1
fan1_fault:1
fan1_input:0
fan1_pulses:2
fan1_target:0
pwm1:100
pwm1_enable:1
pwm1_mode:1
# echo 1000 > fan1_target
At that point, fan starts rotating again and its speed can be controlled
using pwm1 (i.e. set_out). But, as you pointed, if set_cnt is set to 255
then, it stop rotating: with my hardware, I tried and set fan1_target to
481 (set_cnt is 255) and fan stops. Then setting fan1_target to 482
gives set_cnt a value of 254 and make the fan run again.
So, as a conclusion, I think I get the behavior you described i.e. in
PWM mode + open-loop, if set_cnt is 255, then the fan will not rotate,
no matter the value of set_out (which is supposed to control the
rotation w/ open-loop). The problem does not appear in DC mode
(i.e. set_cnt can be 255 in DC mode + open-loop and the fan will rotate
as expected based on set_out value).
In v4 version to come, I have implemented the following fix:
switch (val) {
case G762_FAN_MODE_OPEN_LOOP:
data->fan_cmd1 &= ~G762_REG_FAN_CMD1_FAN_MODE;
/*
* BUG FIX: if SET_CNT register value is 255 then, for some
* unknown reason, fan will not rotate as expected, no matter
* the value of SET_OUT (to be specific, this seems to happen
* only in PWM mode). To workaround this bug, we give SET_CNT
* value of 254 if it is 255 when switching to open-loop.
*/
if (data->set_cnt == 0xff)
i2c_smbus_write_byte_data(client, G762_REG_SET_CNT,
254);
break;
case G762_FAN_MODE_CLOSED_LOOP:
data->fan_cmd1 |= G762_REG_FAN_CMD1_FAN_MODE;
break;
default:
goto out;
}
I tested it and it fixe the issue. Can you confirm it also does on your
side Simon by testing v4?
Cheers,
a+
More information about the linux-arm-kernel
mailing list