|
@@ -193,14 +193,17 @@ static inline unsigned int rpm_from_cnt(u8 cnt, u32 clk_freq, u16 p,
|
|
|
* Convert fan RPM value from sysfs into count value for fan controller
|
|
|
* register (FAN_SET_CNT).
|
|
|
*/
|
|
|
-static inline unsigned char cnt_from_rpm(u32 rpm, u32 clk_freq, u16 p,
|
|
|
+static inline unsigned char cnt_from_rpm(unsigned long rpm, u32 clk_freq, u16 p,
|
|
|
u8 clk_div, u8 gear_mult)
|
|
|
{
|
|
|
- if (!rpm) /* to stop the fan, set cnt to 255 */
|
|
|
+ unsigned long f1 = clk_freq * 30 * gear_mult;
|
|
|
+ unsigned long f2 = p * clk_div;
|
|
|
+
|
|
|
+ if (!rpm) /* to stop the fan, set cnt to 255 */
|
|
|
return 0xff;
|
|
|
|
|
|
- return clamp_val(((clk_freq * 30 * gear_mult) / (rpm * p * clk_div)),
|
|
|
- 0, 255);
|
|
|
+ rpm = clamp_val(rpm, f1 / (255 * f2), ULONG_MAX / f2);
|
|
|
+ return DIV_ROUND_CLOSEST(f1, rpm * f2);
|
|
|
}
|
|
|
|
|
|
/* helper to grab and cache data, at most one time per second */
|