7
7
*/
8
8
9
9
#include <linux/debugfs.h>
10
+ #include <linux/delay.h>
10
11
#include <linux/kernel.h>
11
12
#include <linux/math64.h>
12
13
#include <linux/module.h>
@@ -108,6 +109,8 @@ struct pmbus_data {
108
109
109
110
int vout_low [PMBUS_PAGES ]; /* voltage low margin */
110
111
int vout_high [PMBUS_PAGES ]; /* voltage high margin */
112
+ ktime_t write_time ; /* Last SMBUS write timestamp */
113
+ ktime_t access_time ; /* Last SMBUS access timestamp */
111
114
};
112
115
113
116
struct pmbus_debugfs_entry {
@@ -158,6 +161,39 @@ void pmbus_set_update(struct i2c_client *client, u8 reg, bool update)
158
161
}
159
162
EXPORT_SYMBOL_NS_GPL (pmbus_set_update , PMBUS );
160
163
164
+ /* Some chips need a delay between accesses. */
165
+ static void pmbus_wait (struct i2c_client * client )
166
+ {
167
+ struct pmbus_data * data = i2c_get_clientdata (client );
168
+ const struct pmbus_driver_info * info = data -> info ;
169
+ s64 delta ;
170
+
171
+ if (info -> access_delay ) {
172
+ delta = ktime_us_delta (ktime_get (), data -> access_time );
173
+
174
+ if (delta < info -> access_delay )
175
+ fsleep (info -> access_delay - delta );
176
+ } else if (info -> write_delay ) {
177
+ delta = ktime_us_delta (ktime_get (), data -> write_time );
178
+
179
+ if (delta < info -> write_delay )
180
+ fsleep (info -> write_delay - delta );
181
+ }
182
+ }
183
+
184
+ /* Sets the last accessed timestamp for pmbus_wait */
185
+ static void pmbus_update_ts (struct i2c_client * client , bool write_op )
186
+ {
187
+ struct pmbus_data * data = i2c_get_clientdata (client );
188
+ const struct pmbus_driver_info * info = data -> info ;
189
+
190
+ if (info -> access_delay ) {
191
+ data -> access_time = ktime_get ();
192
+ } else if (info -> write_delay && write_op ) {
193
+ data -> write_time = ktime_get ();
194
+ }
195
+ }
196
+
161
197
int pmbus_set_page (struct i2c_client * client , int page , int phase )
162
198
{
163
199
struct pmbus_data * data = i2c_get_clientdata (client );
@@ -168,11 +204,15 @@ int pmbus_set_page(struct i2c_client *client, int page, int phase)
168
204
169
205
if (!(data -> info -> func [page ] & PMBUS_PAGE_VIRTUAL ) &&
170
206
data -> info -> pages > 1 && page != data -> currpage ) {
207
+ pmbus_wait (client );
171
208
rv = i2c_smbus_write_byte_data (client , PMBUS_PAGE , page );
209
+ pmbus_update_ts (client , true);
172
210
if (rv < 0 )
173
211
return rv ;
174
212
213
+ pmbus_wait (client );
175
214
rv = i2c_smbus_read_byte_data (client , PMBUS_PAGE );
215
+ pmbus_update_ts (client , false);
176
216
if (rv < 0 )
177
217
return rv ;
178
218
@@ -183,8 +223,10 @@ int pmbus_set_page(struct i2c_client *client, int page, int phase)
183
223
184
224
if (data -> info -> phases [page ] && data -> currphase != phase &&
185
225
!(data -> info -> func [page ] & PMBUS_PHASE_VIRTUAL )) {
226
+ pmbus_wait (client );
186
227
rv = i2c_smbus_write_byte_data (client , PMBUS_PHASE ,
187
228
phase );
229
+ pmbus_update_ts (client , true);
188
230
if (rv )
189
231
return rv ;
190
232
}
@@ -202,7 +244,11 @@ int pmbus_write_byte(struct i2c_client *client, int page, u8 value)
202
244
if (rv < 0 )
203
245
return rv ;
204
246
205
- return i2c_smbus_write_byte (client , value );
247
+ pmbus_wait (client );
248
+ rv = i2c_smbus_write_byte (client , value );
249
+ pmbus_update_ts (client , true);
250
+
251
+ return rv ;
206
252
}
207
253
EXPORT_SYMBOL_NS_GPL (pmbus_write_byte , PMBUS );
208
254
@@ -233,7 +279,11 @@ int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg,
233
279
if (rv < 0 )
234
280
return rv ;
235
281
236
- return i2c_smbus_write_word_data (client , reg , word );
282
+ pmbus_wait (client );
283
+ rv = i2c_smbus_write_word_data (client , reg , word );
284
+ pmbus_update_ts (client , true);
285
+
286
+ return rv ;
237
287
}
238
288
EXPORT_SYMBOL_NS_GPL (pmbus_write_word_data , PMBUS );
239
289
@@ -351,7 +401,11 @@ int pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg)
351
401
if (rv < 0 )
352
402
return rv ;
353
403
354
- return i2c_smbus_read_word_data (client , reg );
404
+ pmbus_wait (client );
405
+ rv = i2c_smbus_read_word_data (client , reg );
406
+ pmbus_update_ts (client , false);
407
+
408
+ return rv ;
355
409
}
356
410
EXPORT_SYMBOL_NS_GPL (pmbus_read_word_data , PMBUS );
357
411
@@ -410,7 +464,11 @@ int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
410
464
if (rv < 0 )
411
465
return rv ;
412
466
413
- return i2c_smbus_read_byte_data (client , reg );
467
+ pmbus_wait (client );
468
+ rv = i2c_smbus_read_byte_data (client , reg );
469
+ pmbus_update_ts (client , false);
470
+
471
+ return rv ;
414
472
}
415
473
EXPORT_SYMBOL_NS_GPL (pmbus_read_byte_data , PMBUS );
416
474
@@ -422,7 +480,11 @@ int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, u8 value)
422
480
if (rv < 0 )
423
481
return rv ;
424
482
425
- return i2c_smbus_write_byte_data (client , reg , value );
483
+ pmbus_wait (client );
484
+ rv = i2c_smbus_write_byte_data (client , reg , value );
485
+ pmbus_update_ts (client , true);
486
+
487
+ return rv ;
426
488
}
427
489
EXPORT_SYMBOL_NS_GPL (pmbus_write_byte_data , PMBUS );
428
490
@@ -454,7 +516,11 @@ static int pmbus_read_block_data(struct i2c_client *client, int page, u8 reg,
454
516
if (rv < 0 )
455
517
return rv ;
456
518
457
- return i2c_smbus_read_block_data (client , reg , data_buf );
519
+ pmbus_wait (client );
520
+ rv = i2c_smbus_read_block_data (client , reg , data_buf );
521
+ pmbus_update_ts (client , false);
522
+
523
+ return rv ;
458
524
}
459
525
460
526
static struct pmbus_sensor * pmbus_find_sensor (struct pmbus_data * data , int page ,
@@ -2450,9 +2516,11 @@ static int pmbus_read_coefficients(struct i2c_client *client,
2450
2516
data .block [1 ] = attr -> reg ;
2451
2517
data .block [2 ] = 0x01 ;
2452
2518
2519
+ pmbus_wait (client );
2453
2520
rv = i2c_smbus_xfer (client -> adapter , client -> addr , client -> flags ,
2454
2521
I2C_SMBUS_WRITE , PMBUS_COEFFICIENTS ,
2455
2522
I2C_SMBUS_BLOCK_PROC_CALL , & data );
2523
+ pmbus_update_ts (client , true);
2456
2524
2457
2525
if (rv < 0 )
2458
2526
return rv ;
@@ -2604,7 +2672,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
2604
2672
2605
2673
/* Enable PEC if the controller and bus supports it */
2606
2674
if (!(data -> flags & PMBUS_NO_CAPABILITY )) {
2675
+ pmbus_wait (client );
2607
2676
ret = i2c_smbus_read_byte_data (client , PMBUS_CAPABILITY );
2677
+ pmbus_update_ts (client , false);
2678
+
2608
2679
if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK )) {
2609
2680
if (i2c_check_functionality (client -> adapter , I2C_FUNC_SMBUS_PEC ))
2610
2681
client -> flags |= I2C_CLIENT_PEC ;
@@ -2617,10 +2688,16 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
2617
2688
* Bail out if both registers are not supported.
2618
2689
*/
2619
2690
data -> read_status = pmbus_read_status_word ;
2691
+ pmbus_wait (client );
2620
2692
ret = i2c_smbus_read_word_data (client , PMBUS_STATUS_WORD );
2693
+ pmbus_update_ts (client , false);
2694
+
2621
2695
if (ret < 0 || ret == 0xffff ) {
2622
2696
data -> read_status = pmbus_read_status_byte ;
2697
+ pmbus_wait (client );
2623
2698
ret = i2c_smbus_read_byte_data (client , PMBUS_STATUS_BYTE );
2699
+ pmbus_update_ts (client , false);
2700
+
2624
2701
if (ret < 0 || ret == 0xff ) {
2625
2702
dev_err (dev , "PMBus status register not found\n" );
2626
2703
return - ENODEV ;
@@ -2635,7 +2712,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
2635
2712
* limit registers need to be disabled.
2636
2713
*/
2637
2714
if (!(data -> flags & PMBUS_NO_WRITE_PROTECT )) {
2715
+ pmbus_wait (client );
2638
2716
ret = i2c_smbus_read_byte_data (client , PMBUS_WRITE_PROTECT );
2717
+ pmbus_update_ts (client , false);
2718
+
2639
2719
if (ret > 0 && (ret & PB_WP_ANY ))
2640
2720
data -> flags |= PMBUS_WRITE_PROTECTED | PMBUS_SKIP_STATUS_CHECK ;
2641
2721
}
0 commit comments