33 * Copyright (C) 2017 IBM Corp.
44 */
55
6+ #include <linux/delay.h>
67#include <linux/kernel.h>
78#include <linux/module.h>
89#include <linux/init.h>
@@ -23,19 +24,119 @@ enum max31785_regs {
2324
2425#define MAX31785_NR_PAGES 23
2526#define MAX31785_NR_FAN_PAGES 6
27+ #define MAX31785_WAIT_DELAY_US 250
2628
27- static int max31785_read_byte_data (struct i2c_client * client , int page ,
28- int reg )
29+ struct max31785_data {
30+ ktime_t access ; /* Chip access time */
31+ struct pmbus_driver_info info ;
32+ };
33+
34+ #define to_max31785_data (x ) container_of(x, struct max31785_data, info)
35+
36+ /*
37+ * MAX31785 Driver Workaround
38+ *
39+ * The MAX31785 fan controller occasionally exhibits communication issues.
40+ * These issues are not indicated by the device itself, except for occasional
41+ * NACK responses during master transactions. No error bits are set in STATUS_BYTE.
42+ *
43+ * To address this, we introduce a delay of 250us between consecutive accesses
44+ * to the fan controller. This delay helps mitigate communication problems by
45+ * allowing sufficient time between accesses.
46+ */
47+ static inline void max31785_wait (const struct max31785_data * data )
2948{
30- if (page < MAX31785_NR_PAGES )
31- return - ENODATA ;
49+ s64 delta = ktime_us_delta (ktime_get (), data -> access );
50+
51+ if (delta < MAX31785_WAIT_DELAY_US )
52+ usleep_range (MAX31785_WAIT_DELAY_US - delta ,
53+ MAX31785_WAIT_DELAY_US );
54+ }
55+
56+ static int max31785_i2c_write_byte_data (struct i2c_client * client ,
57+ struct max31785_data * driver_data ,
58+ int command , u16 data )
59+ {
60+ int rc ;
61+
62+ max31785_wait (driver_data );
63+ rc = i2c_smbus_write_byte_data (client , command , data );
64+ driver_data -> access = ktime_get ();
65+ return rc ;
66+ }
67+
68+ static int max31785_i2c_read_word_data (struct i2c_client * client ,
69+ struct max31785_data * driver_data ,
70+ int command )
71+ {
72+ int rc ;
73+
74+ max31785_wait (driver_data );
75+ rc = i2c_smbus_read_word_data (client , command );
76+ driver_data -> access = ktime_get ();
77+ return rc ;
78+ }
79+
80+ static int _max31785_read_byte_data (struct i2c_client * client ,
81+ struct max31785_data * driver_data ,
82+ int page , int command )
83+ {
84+ int rc ;
85+
86+ max31785_wait (driver_data );
87+ rc = pmbus_read_byte_data (client , page , command );
88+ driver_data -> access = ktime_get ();
89+ return rc ;
90+ }
91+
92+ static int _max31785_write_byte_data (struct i2c_client * client ,
93+ struct max31785_data * driver_data ,
94+ int page , int command , u16 data )
95+ {
96+ int rc ;
97+
98+ max31785_wait (driver_data );
99+ rc = pmbus_write_byte_data (client , page , command , data );
100+ driver_data -> access = ktime_get ();
101+ return rc ;
102+ }
103+
104+ static int _max31785_read_word_data (struct i2c_client * client ,
105+ struct max31785_data * driver_data ,
106+ int page , int phase , int command )
107+ {
108+ int rc ;
109+
110+ max31785_wait (driver_data );
111+ rc = pmbus_read_word_data (client , page , phase , command );
112+ driver_data -> access = ktime_get ();
113+ return rc ;
114+ }
115+
116+ static int _max31785_write_word_data (struct i2c_client * client ,
117+ struct max31785_data * driver_data ,
118+ int page , int command , u16 data )
119+ {
120+ int rc ;
121+
122+ max31785_wait (driver_data );
123+ rc = pmbus_write_word_data (client , page , command , data );
124+ driver_data -> access = ktime_get ();
125+ return rc ;
126+ }
127+
128+ static int max31785_read_byte_data (struct i2c_client * client , int page , int reg )
129+ {
130+ const struct pmbus_driver_info * info = pmbus_get_driver_info (client );
131+ struct max31785_data * driver_data = to_max31785_data (info );
32132
33133 switch (reg ) {
34134 case PMBUS_VOUT_MODE :
35135 return - ENOTSUPP ;
36136 case PMBUS_FAN_CONFIG_12 :
37- return pmbus_read_byte_data (client , page - MAX31785_NR_PAGES ,
38- reg );
137+ return _max31785_read_byte_data (client , driver_data ,
138+ page - MAX31785_NR_PAGES ,
139+ reg );
39140 }
40141
41142 return - ENODATA ;
@@ -102,16 +203,19 @@ static int max31785_get_pwm(struct i2c_client *client, int page)
102203 return rv ;
103204}
104205
105- static int max31785_get_pwm_mode (struct i2c_client * client , int page )
206+ static int max31785_get_pwm_mode (struct i2c_client * client ,
207+ struct max31785_data * driver_data , int page )
106208{
107209 int config ;
108210 int command ;
109211
110- config = pmbus_read_byte_data (client , page , PMBUS_FAN_CONFIG_12 );
212+ config = _max31785_read_byte_data (client , driver_data , page ,
213+ PMBUS_FAN_CONFIG_12 );
111214 if (config < 0 )
112215 return config ;
113216
114- command = pmbus_read_word_data (client , page , 0xff , PMBUS_FAN_COMMAND_1 );
217+ command = _max31785_read_word_data (client , driver_data , page , 0xff ,
218+ PMBUS_FAN_COMMAND_1 );
115219 if (command < 0 )
116220 return command ;
117221
@@ -129,6 +233,8 @@ static int max31785_get_pwm_mode(struct i2c_client *client, int page)
129233static int max31785_read_word_data (struct i2c_client * client , int page ,
130234 int phase , int reg )
131235{
236+ const struct pmbus_driver_info * info = pmbus_get_driver_info (client );
237+ struct max31785_data * driver_data = to_max31785_data (info );
132238 u32 val ;
133239 int rv ;
134240
@@ -157,7 +263,7 @@ static int max31785_read_word_data(struct i2c_client *client, int page,
157263 rv = max31785_get_pwm (client , page );
158264 break ;
159265 case PMBUS_VIRT_PWM_ENABLE_1 :
160- rv = max31785_get_pwm_mode (client , page );
266+ rv = max31785_get_pwm_mode (client , driver_data , page );
161267 break ;
162268 default :
163269 rv = - ENODATA ;
@@ -188,8 +294,36 @@ static inline u32 max31785_scale_pwm(u32 sensor_val)
188294 return (sensor_val * 100 ) / 255 ;
189295}
190296
191- static int max31785_pwm_enable (struct i2c_client * client , int page ,
192- u16 word )
297+ static int max31785_update_fan (struct i2c_client * client ,
298+ struct max31785_data * driver_data , int page ,
299+ u8 config , u8 mask , u16 command )
300+ {
301+ int from , rv ;
302+ u8 to ;
303+
304+ from = _max31785_read_byte_data (client , driver_data , page ,
305+ PMBUS_FAN_CONFIG_12 );
306+ if (from < 0 )
307+ return from ;
308+
309+ to = (from & ~mask ) | (config & mask );
310+
311+ if (to != from ) {
312+ rv = _max31785_write_byte_data (client , driver_data , page ,
313+ PMBUS_FAN_CONFIG_12 , to );
314+ if (rv < 0 )
315+ return rv ;
316+ }
317+
318+ rv = _max31785_write_word_data (client , driver_data , page ,
319+ PMBUS_FAN_COMMAND_1 , command );
320+
321+ return rv ;
322+ }
323+
324+ static int max31785_pwm_enable (struct i2c_client * client ,
325+ struct max31785_data * driver_data , int page ,
326+ u16 word )
193327{
194328 int config = 0 ;
195329 int rate ;
@@ -217,18 +351,23 @@ static int max31785_pwm_enable(struct i2c_client *client, int page,
217351 return - EINVAL ;
218352 }
219353
220- return pmbus_update_fan (client , page , 0 , config , PB_FAN_1_RPM , rate );
354+ return max31785_update_fan (client , driver_data , page , config ,
355+ PB_FAN_1_RPM , rate );
221356}
222357
223358static int max31785_write_word_data (struct i2c_client * client , int page ,
224359 int reg , u16 word )
225360{
361+ const struct pmbus_driver_info * info = pmbus_get_driver_info (client );
362+ struct max31785_data * driver_data = to_max31785_data (info );
363+
226364 switch (reg ) {
227365 case PMBUS_VIRT_PWM_1 :
228- return pmbus_update_fan (client , page , 0 , 0 , PB_FAN_1_RPM ,
229- max31785_scale_pwm (word ));
366+ return max31785_update_fan (client , driver_data , page , 0 ,
367+ PB_FAN_1_RPM ,
368+ max31785_scale_pwm (word ));
230369 case PMBUS_VIRT_PWM_ENABLE_1 :
231- return max31785_pwm_enable (client , page , word );
370+ return max31785_pwm_enable (client , driver_data , page , word );
232371 default :
233372 break ;
234373 }
@@ -303,13 +442,16 @@ static int max31785_configure_dual_tach(struct i2c_client *client,
303442{
304443 int ret ;
305444 int i ;
445+ struct max31785_data * driver_data = to_max31785_data (info );
306446
307447 for (i = 0 ; i < MAX31785_NR_FAN_PAGES ; i ++ ) {
308- ret = i2c_smbus_write_byte_data (client , PMBUS_PAGE , i );
448+ ret = max31785_i2c_write_byte_data (client , driver_data ,
449+ PMBUS_PAGE , i );
309450 if (ret < 0 )
310451 return ret ;
311452
312- ret = i2c_smbus_read_word_data (client , MFR_FAN_CONFIG );
453+ ret = max31785_i2c_read_word_data (client , driver_data ,
454+ MFR_FAN_CONFIG );
313455 if (ret < 0 )
314456 return ret ;
315457
@@ -329,6 +471,7 @@ static int max31785_probe(struct i2c_client *client)
329471{
330472 struct device * dev = & client -> dev ;
331473 struct pmbus_driver_info * info ;
474+ struct max31785_data * driver_data ;
332475 bool dual_tach = false;
333476 int ret ;
334477
@@ -337,13 +480,16 @@ static int max31785_probe(struct i2c_client *client)
337480 I2C_FUNC_SMBUS_WORD_DATA ))
338481 return - ENODEV ;
339482
340- info = devm_kzalloc (dev , sizeof (struct pmbus_driver_info ), GFP_KERNEL );
341- if (!info )
483+ driver_data = devm_kzalloc (dev , sizeof (struct max31785_data ), GFP_KERNEL );
484+ if (!driver_data )
342485 return - ENOMEM ;
343486
487+ info = & driver_data -> info ;
488+ driver_data -> access = ktime_get ();
344489 * info = max31785_info ;
345490
346- ret = i2c_smbus_write_byte_data (client , PMBUS_PAGE , 255 );
491+ ret = max31785_i2c_write_byte_data (client , driver_data ,
492+ PMBUS_PAGE , 255 );
347493 if (ret < 0 )
348494 return ret ;
349495
0 commit comments