3
3
* Copyright (C) 2017 IBM Corp.
4
4
*/
5
5
6
+ #include <linux/delay.h>
6
7
#include <linux/kernel.h>
7
8
#include <linux/module.h>
8
9
#include <linux/init.h>
@@ -23,19 +24,119 @@ enum max31785_regs {
23
24
24
25
#define MAX31785_NR_PAGES 23
25
26
#define MAX31785_NR_FAN_PAGES 6
27
+ #define MAX31785_WAIT_DELAY_US 250
26
28
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 )
29
48
{
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 );
32
132
33
133
switch (reg ) {
34
134
case PMBUS_VOUT_MODE :
35
135
return - ENOTSUPP ;
36
136
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 );
39
140
}
40
141
41
142
return - ENODATA ;
@@ -102,16 +203,19 @@ static int max31785_get_pwm(struct i2c_client *client, int page)
102
203
return rv ;
103
204
}
104
205
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 )
106
208
{
107
209
int config ;
108
210
int command ;
109
211
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 );
111
214
if (config < 0 )
112
215
return config ;
113
216
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 );
115
219
if (command < 0 )
116
220
return command ;
117
221
@@ -129,6 +233,8 @@ static int max31785_get_pwm_mode(struct i2c_client *client, int page)
129
233
static int max31785_read_word_data (struct i2c_client * client , int page ,
130
234
int phase , int reg )
131
235
{
236
+ const struct pmbus_driver_info * info = pmbus_get_driver_info (client );
237
+ struct max31785_data * driver_data = to_max31785_data (info );
132
238
u32 val ;
133
239
int rv ;
134
240
@@ -157,7 +263,7 @@ static int max31785_read_word_data(struct i2c_client *client, int page,
157
263
rv = max31785_get_pwm (client , page );
158
264
break ;
159
265
case PMBUS_VIRT_PWM_ENABLE_1 :
160
- rv = max31785_get_pwm_mode (client , page );
266
+ rv = max31785_get_pwm_mode (client , driver_data , page );
161
267
break ;
162
268
default :
163
269
rv = - ENODATA ;
@@ -188,8 +294,36 @@ static inline u32 max31785_scale_pwm(u32 sensor_val)
188
294
return (sensor_val * 100 ) / 255 ;
189
295
}
190
296
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 )
193
327
{
194
328
int config = 0 ;
195
329
int rate ;
@@ -217,18 +351,23 @@ static int max31785_pwm_enable(struct i2c_client *client, int page,
217
351
return - EINVAL ;
218
352
}
219
353
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 );
221
356
}
222
357
223
358
static int max31785_write_word_data (struct i2c_client * client , int page ,
224
359
int reg , u16 word )
225
360
{
361
+ const struct pmbus_driver_info * info = pmbus_get_driver_info (client );
362
+ struct max31785_data * driver_data = to_max31785_data (info );
363
+
226
364
switch (reg ) {
227
365
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 ));
230
369
case PMBUS_VIRT_PWM_ENABLE_1 :
231
- return max31785_pwm_enable (client , page , word );
370
+ return max31785_pwm_enable (client , driver_data , page , word );
232
371
default :
233
372
break ;
234
373
}
@@ -303,13 +442,16 @@ static int max31785_configure_dual_tach(struct i2c_client *client,
303
442
{
304
443
int ret ;
305
444
int i ;
445
+ struct max31785_data * driver_data = to_max31785_data (info );
306
446
307
447
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 );
309
450
if (ret < 0 )
310
451
return ret ;
311
452
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 );
313
455
if (ret < 0 )
314
456
return ret ;
315
457
@@ -329,6 +471,7 @@ static int max31785_probe(struct i2c_client *client)
329
471
{
330
472
struct device * dev = & client -> dev ;
331
473
struct pmbus_driver_info * info ;
474
+ struct max31785_data * driver_data ;
332
475
bool dual_tach = false;
333
476
int ret ;
334
477
@@ -337,13 +480,16 @@ static int max31785_probe(struct i2c_client *client)
337
480
I2C_FUNC_SMBUS_WORD_DATA ))
338
481
return - ENODEV ;
339
482
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 )
342
485
return - ENOMEM ;
343
486
487
+ info = & driver_data -> info ;
488
+ driver_data -> access = ktime_get ();
344
489
* info = max31785_info ;
345
490
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 );
347
493
if (ret < 0 )
348
494
return ret ;
349
495
0 commit comments