23
23
#include <linux/i2c.h>
24
24
#include "pmbus.h"
25
25
26
- enum chips { adm1275 , adm1276 };
26
+ enum chips { adm1075 , adm1275 , adm1276 };
27
27
28
28
#define ADM1275_PEAK_IOUT 0xd0
29
29
#define ADM1275_PEAK_VIN 0xd1
@@ -32,6 +32,9 @@ enum chips { adm1275, adm1276 };
32
32
33
33
#define ADM1275_VIN_VOUT_SELECT (1 << 6)
34
34
#define ADM1275_VRANGE (1 << 5)
35
+ #define ADM1075_IRANGE_50 (1 << 4)
36
+ #define ADM1075_IRANGE_25 (1 << 3)
37
+ #define ADM1075_IRANGE_MASK ((1 << 3) | (1 << 4))
35
38
36
39
#define ADM1275_ALERT1_CONFIG 0xd5
37
40
#define ADM1275_ALERT2_CONFIG 0xd6
@@ -53,6 +56,14 @@ enum chips { adm1275, adm1276 };
53
56
54
57
#define ADM1275_MFR_STATUS_IOUT_WARN2 (1 << 0)
55
58
59
+ #define ADM1075_READ_VAUX 0xdd
60
+ #define ADM1075_VAUX_OV_WARN_LIMIT 0xde
61
+ #define ADM1075_VAUX_UV_WARN_LIMIT 0xdf
62
+ #define ADM1075_VAUX_STATUS 0xf6
63
+
64
+ #define ADM1075_VAUX_OV_WARN (1<<7)
65
+ #define ADM1075_VAUX_UV_WARN (1<<6)
66
+
56
67
struct adm1275_data {
57
68
int id ;
58
69
bool have_oc_fault ;
@@ -87,6 +98,29 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
87
98
}
88
99
ret = pmbus_read_word_data (client , 0 , ADM1275_IOUT_WARN2_LIMIT );
89
100
break ;
101
+ case PMBUS_VOUT_OV_WARN_LIMIT :
102
+ if (data -> id != adm1075 ) {
103
+ ret = - ENODATA ;
104
+ break ;
105
+ }
106
+ ret = pmbus_read_word_data (client , 0 ,
107
+ ADM1075_VAUX_OV_WARN_LIMIT );
108
+ break ;
109
+ case PMBUS_VOUT_UV_WARN_LIMIT :
110
+ if (data -> id != adm1075 ) {
111
+ ret = - ENODATA ;
112
+ break ;
113
+ }
114
+ ret = pmbus_read_word_data (client , 0 ,
115
+ ADM1075_VAUX_UV_WARN_LIMIT );
116
+ break ;
117
+ case PMBUS_READ_VOUT :
118
+ if (data -> id != adm1075 ) {
119
+ ret = - ENODATA ;
120
+ break ;
121
+ }
122
+ ret = pmbus_read_word_data (client , 0 , ADM1075_READ_VAUX );
123
+ break ;
90
124
case PMBUS_VIRT_READ_IOUT_MAX :
91
125
ret = pmbus_read_word_data (client , 0 , ADM1275_PEAK_IOUT );
92
126
break ;
@@ -97,7 +131,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
97
131
ret = pmbus_read_word_data (client , 0 , ADM1275_PEAK_VIN );
98
132
break ;
99
133
case PMBUS_VIRT_READ_PIN_MAX :
100
- if (data -> id != adm1276 ) {
134
+ if (data -> id == adm1275 ) {
101
135
ret = - ENXIO ;
102
136
break ;
103
137
}
@@ -108,7 +142,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
108
142
case PMBUS_VIRT_RESET_VIN_HISTORY :
109
143
break ;
110
144
case PMBUS_VIRT_RESET_PIN_HISTORY :
111
- if (data -> id != adm1276 )
145
+ if (data -> id == adm1275 )
112
146
ret = - ENXIO ;
113
147
break ;
114
148
default :
@@ -176,6 +210,19 @@ static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
176
210
PB_IOUT_OC_FAULT : PB_IOUT_UC_FAULT ;
177
211
}
178
212
break ;
213
+ case PMBUS_STATUS_VOUT :
214
+ if (data -> id != adm1075 ) {
215
+ ret = - ENODATA ;
216
+ break ;
217
+ }
218
+ ret = 0 ;
219
+ mfr_status = pmbus_read_byte_data (client , 0 ,
220
+ ADM1075_VAUX_STATUS );
221
+ if (mfr_status & ADM1075_VAUX_OV_WARN )
222
+ ret |= PB_VOLTAGE_OV_WARNING ;
223
+ if (mfr_status & ADM1075_VAUX_UV_WARN )
224
+ ret |= PB_VOLTAGE_UV_WARNING ;
225
+ break ;
179
226
default :
180
227
ret = - ENODATA ;
181
228
break ;
@@ -243,6 +290,7 @@ static void adm1275_alert_handler(struct i2c_client *client, bool alarm)
243
290
}
244
291
245
292
static const struct i2c_device_id adm1275_id [] = {
293
+ { "adm1075" , adm1075 },
246
294
{ "adm1275" , adm1275 },
247
295
{ "adm1276" , adm1276 },
248
296
{ }
@@ -337,7 +385,14 @@ static int adm1275_probe(struct i2c_client *client,
337
385
info -> write_word_data = adm1275_write_word_data ;
338
386
info -> alert_handler = adm1275_alert_handler ;
339
387
340
- if (config & ADM1275_VRANGE ) {
388
+ if (data -> id == adm1075 ) {
389
+ info -> m [PSC_VOLTAGE_IN ] = 27169 ;
390
+ info -> b [PSC_VOLTAGE_IN ] = 0 ;
391
+ info -> R [PSC_VOLTAGE_IN ] = -1 ;
392
+ info -> m [PSC_VOLTAGE_OUT ] = 27169 ;
393
+ info -> b [PSC_VOLTAGE_OUT ] = 0 ;
394
+ info -> R [PSC_VOLTAGE_OUT ] = -1 ;
395
+ } else if (config & ADM1275_VRANGE ) {
341
396
info -> m [PSC_VOLTAGE_IN ] = 19199 ;
342
397
info -> b [PSC_VOLTAGE_IN ] = 0 ;
343
398
info -> R [PSC_VOLTAGE_IN ] = -2 ;
@@ -357,6 +412,31 @@ static int adm1275_probe(struct i2c_client *client,
357
412
data -> have_oc_fault = true;
358
413
359
414
switch (data -> id ) {
415
+ case adm1075 :
416
+ info -> format [PSC_POWER ] = direct ;
417
+ info -> b [PSC_POWER ] = 0 ;
418
+ info -> R [PSC_POWER ] = -1 ;
419
+ switch (config & ADM1075_IRANGE_MASK ) {
420
+ case ADM1075_IRANGE_25 :
421
+ info -> m [PSC_POWER ] = 8549 ;
422
+ info -> m [PSC_CURRENT_OUT ] = 806 ;
423
+ break ;
424
+ case ADM1075_IRANGE_50 :
425
+ info -> m [PSC_POWER ] = 4279 ;
426
+ info -> m [PSC_CURRENT_OUT ] = 404 ;
427
+ break ;
428
+ default :
429
+ dev_err (& client -> dev , "Invalid input current range" );
430
+ info -> m [PSC_POWER ] = 0 ;
431
+ info -> m [PSC_CURRENT_OUT ] = 0 ;
432
+ break ;
433
+ }
434
+ info -> func [0 ] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN
435
+ | PMBUS_HAVE_STATUS_INPUT ;
436
+ if (config & ADM1275_VIN_VOUT_SELECT )
437
+ info -> func [0 ] |=
438
+ PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT ;
439
+ break ;
360
440
case adm1275 :
361
441
if (config & ADM1275_VIN_VOUT_SELECT )
362
442
info -> func [0 ] |=
0 commit comments