1313#include <linux/thermal.h>
1414
1515#define MLXREG_FAN_MAX_TACHO 14
16+ #define MLXREG_FAN_MAX_PWM 4
17+ #define MLXREG_FAN_PWM_NOT_CONNECTED 0xff
1618#define MLXREG_FAN_MAX_STATE 10
1719#define MLXREG_FAN_MIN_DUTY 51 /* 20% */
1820#define MLXREG_FAN_MAX_DUTY 255 /* 100% */
@@ -105,7 +107,7 @@ struct mlxreg_fan {
105107 void * regmap ;
106108 struct mlxreg_core_platform_data * pdata ;
107109 struct mlxreg_fan_tacho tacho [MLXREG_FAN_MAX_TACHO ];
108- struct mlxreg_fan_pwm pwm ;
110+ struct mlxreg_fan_pwm pwm [ MLXREG_FAN_MAX_PWM ] ;
109111 int tachos_per_drwr ;
110112 int samples ;
111113 int divider ;
@@ -119,6 +121,7 @@ mlxreg_fan_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
119121{
120122 struct mlxreg_fan * fan = dev_get_drvdata (dev );
121123 struct mlxreg_fan_tacho * tacho ;
124+ struct mlxreg_fan_pwm * pwm ;
122125 u32 regval ;
123126 int err ;
124127
@@ -169,9 +172,10 @@ mlxreg_fan_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
169172 break ;
170173
171174 case hwmon_pwm :
175+ pwm = & fan -> pwm [channel ];
172176 switch (attr ) {
173177 case hwmon_pwm_input :
174- err = regmap_read (fan -> regmap , fan -> pwm . reg , & regval );
178+ err = regmap_read (fan -> regmap , pwm -> reg , & regval );
175179 if (err )
176180 return err ;
177181
@@ -195,6 +199,7 @@ mlxreg_fan_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
195199 int channel , long val )
196200{
197201 struct mlxreg_fan * fan = dev_get_drvdata (dev );
202+ struct mlxreg_fan_pwm * pwm ;
198203
199204 switch (type ) {
200205 case hwmon_pwm :
@@ -203,7 +208,8 @@ mlxreg_fan_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
203208 if (val < MLXREG_FAN_MIN_DUTY ||
204209 val > MLXREG_FAN_MAX_DUTY )
205210 return - EINVAL ;
206- return regmap_write (fan -> regmap , fan -> pwm .reg , val );
211+ pwm = & fan -> pwm [channel ];
212+ return regmap_write (fan -> regmap , pwm -> reg , val );
207213 default :
208214 return - EOPNOTSUPP ;
209215 }
@@ -235,7 +241,7 @@ mlxreg_fan_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr,
235241 break ;
236242
237243 case hwmon_pwm :
238- if (!(((struct mlxreg_fan * )data )-> pwm .connected ))
244+ if (!(((struct mlxreg_fan * )data )-> pwm [ channel ] .connected ))
239245 return 0 ;
240246
241247 switch (attr ) {
@@ -270,6 +276,9 @@ static const struct hwmon_channel_info *mlxreg_fan_hwmon_info[] = {
270276 HWMON_F_INPUT | HWMON_F_FAULT ,
271277 HWMON_F_INPUT | HWMON_F_FAULT ),
272278 HWMON_CHANNEL_INFO (pwm ,
279+ HWMON_PWM_INPUT ,
280+ HWMON_PWM_INPUT ,
281+ HWMON_PWM_INPUT ,
273282 HWMON_PWM_INPUT ),
274283 NULL
275284};
@@ -300,7 +309,7 @@ static int mlxreg_fan_get_cur_state(struct thermal_cooling_device *cdev,
300309 u32 regval ;
301310 int err ;
302311
303- err = regmap_read (fan -> regmap , fan -> pwm .reg , & regval );
312+ err = regmap_read (fan -> regmap , fan -> pwm [ 0 ] .reg , & regval );
304313 if (err ) {
305314 dev_err (fan -> dev , "Failed to query PWM duty\n" );
306315 return err ;
@@ -343,7 +352,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
343352 for (i = state ; i <= MLXREG_FAN_MAX_STATE ; i ++ )
344353 fan -> cooling_levels [i ] = i ;
345354
346- err = regmap_read (fan -> regmap , fan -> pwm .reg , & regval );
355+ err = regmap_read (fan -> regmap , fan -> pwm [ 0 ] .reg , & regval );
347356 if (err ) {
348357 dev_err (fan -> dev , "Failed to query PWM duty\n" );
349358 return err ;
@@ -361,7 +370,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
361370
362371 /* Normalize the state to the valid speed range. */
363372 state = fan -> cooling_levels [state ];
364- err = regmap_write (fan -> regmap , fan -> pwm .reg ,
373+ err = regmap_write (fan -> regmap , fan -> pwm [ 0 ] .reg ,
365374 MLXREG_FAN_PWM_STATE2DUTY (state ));
366375 if (err ) {
367376 dev_err (fan -> dev , "Failed to write PWM duty\n" );
@@ -392,6 +401,22 @@ static int mlxreg_fan_connect_verify(struct mlxreg_fan *fan,
392401 return !!(regval & data -> bit );
393402}
394403
404+ static int mlxreg_pwm_connect_verify (struct mlxreg_fan * fan ,
405+ struct mlxreg_core_data * data )
406+ {
407+ u32 regval ;
408+ int err ;
409+
410+ err = regmap_read (fan -> regmap , data -> reg , & regval );
411+ if (err ) {
412+ dev_err (fan -> dev , "Failed to query pwm register 0x%08x\n" ,
413+ data -> reg );
414+ return err ;
415+ }
416+
417+ return regval != MLXREG_FAN_PWM_NOT_CONNECTED ;
418+ }
419+
395420static int mlxreg_fan_speed_divider_get (struct mlxreg_fan * fan ,
396421 struct mlxreg_core_data * data )
397422{
@@ -420,8 +445,8 @@ static int mlxreg_fan_speed_divider_get(struct mlxreg_fan *fan,
420445static int mlxreg_fan_config (struct mlxreg_fan * fan ,
421446 struct mlxreg_core_platform_data * pdata )
422447{
448+ int tacho_num = 0 , tacho_avail = 0 , pwm_num = 0 , i ;
423449 struct mlxreg_core_data * data = pdata -> data ;
424- int tacho_num = 0 , tacho_avail = 0 , i ;
425450 bool configured = false;
426451 int err ;
427452
@@ -451,13 +476,19 @@ static int mlxreg_fan_config(struct mlxreg_fan *fan,
451476 fan -> tacho [tacho_num ++ ].connected = true;
452477 tacho_avail ++ ;
453478 } else if (strnstr (data -> label , "pwm" , sizeof (data -> label ))) {
454- if (fan -> pwm . connected ) {
455- dev_err (fan -> dev , "duplicate pwm entry : %s\n" ,
479+ if (pwm_num == MLXREG_FAN_MAX_TACHO ) {
480+ dev_err (fan -> dev , "too many pwm entries : %s\n" ,
456481 data -> label );
457482 return - EINVAL ;
458483 }
459- fan -> pwm .reg = data -> reg ;
460- fan -> pwm .connected = true;
484+
485+ err = mlxreg_pwm_connect_verify (fan , data );
486+ if (err )
487+ return err ;
488+
489+ fan -> pwm [pwm_num ].reg = data -> reg ;
490+ fan -> pwm [pwm_num ].connected = true;
491+ pwm_num ++ ;
461492 } else if (strnstr (data -> label , "conf" , sizeof (data -> label ))) {
462493 if (configured ) {
463494 dev_err (fan -> dev , "duplicate conf entry: %s\n" ,
0 commit comments