diff options
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/pmbus/adm1275.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/hwmon/pmbus/adm1275.c b/drivers/hwmon/pmbus/adm1275.c index 71770ffbdaf6..c936e2782309 100644 --- a/drivers/hwmon/pmbus/adm1275.c +++ b/drivers/hwmon/pmbus/adm1275.c | |||
@@ -23,11 +23,68 @@ | |||
23 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
24 | #include "pmbus.h" | 24 | #include "pmbus.h" |
25 | 25 | ||
26 | #define ADM1275_PEAK_IOUT 0xd0 | ||
27 | #define ADM1275_PEAK_VIN 0xd1 | ||
28 | #define ADM1275_PEAK_VOUT 0xd2 | ||
26 | #define ADM1275_PMON_CONFIG 0xd4 | 29 | #define ADM1275_PMON_CONFIG 0xd4 |
27 | 30 | ||
28 | #define ADM1275_VIN_VOUT_SELECT (1 << 6) | 31 | #define ADM1275_VIN_VOUT_SELECT (1 << 6) |
29 | #define ADM1275_VRANGE (1 << 5) | 32 | #define ADM1275_VRANGE (1 << 5) |
30 | 33 | ||
34 | static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) | ||
35 | { | ||
36 | int ret; | ||
37 | |||
38 | if (page) | ||
39 | return -EINVAL; | ||
40 | |||
41 | switch (reg) { | ||
42 | case PMBUS_VIRT_READ_IOUT_MAX: | ||
43 | ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT); | ||
44 | break; | ||
45 | case PMBUS_VIRT_READ_VOUT_MAX: | ||
46 | ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT); | ||
47 | break; | ||
48 | case PMBUS_VIRT_READ_VIN_MAX: | ||
49 | ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN); | ||
50 | break; | ||
51 | case PMBUS_VIRT_RESET_IOUT_HISTORY: | ||
52 | case PMBUS_VIRT_RESET_VOUT_HISTORY: | ||
53 | case PMBUS_VIRT_RESET_VIN_HISTORY: | ||
54 | ret = 0; | ||
55 | break; | ||
56 | default: | ||
57 | ret = -ENODATA; | ||
58 | break; | ||
59 | } | ||
60 | return ret; | ||
61 | } | ||
62 | |||
63 | static int adm1275_write_word_data(struct i2c_client *client, int page, int reg, | ||
64 | u16 word) | ||
65 | { | ||
66 | int ret; | ||
67 | |||
68 | if (page) | ||
69 | return -EINVAL; | ||
70 | |||
71 | switch (reg) { | ||
72 | case PMBUS_VIRT_RESET_IOUT_HISTORY: | ||
73 | ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_IOUT, 0); | ||
74 | break; | ||
75 | case PMBUS_VIRT_RESET_VOUT_HISTORY: | ||
76 | ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VOUT, 0); | ||
77 | break; | ||
78 | case PMBUS_VIRT_RESET_VIN_HISTORY: | ||
79 | ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0); | ||
80 | break; | ||
81 | default: | ||
82 | ret = -ENODATA; | ||
83 | break; | ||
84 | } | ||
85 | return ret; | ||
86 | } | ||
87 | |||
31 | static int adm1275_probe(struct i2c_client *client, | 88 | static int adm1275_probe(struct i2c_client *client, |
32 | const struct i2c_device_id *id) | 89 | const struct i2c_device_id *id) |
33 | { | 90 | { |
@@ -58,6 +115,9 @@ static int adm1275_probe(struct i2c_client *client, | |||
58 | info->R[PSC_CURRENT_OUT] = -1; | 115 | info->R[PSC_CURRENT_OUT] = -1; |
59 | info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; | 116 | info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; |
60 | 117 | ||
118 | info->read_word_data = adm1275_read_word_data; | ||
119 | info->write_word_data = adm1275_write_word_data; | ||
120 | |||
61 | if (config & ADM1275_VRANGE) { | 121 | if (config & ADM1275_VRANGE) { |
62 | info->m[PSC_VOLTAGE_IN] = 19199; | 122 | info->m[PSC_VOLTAGE_IN] = 19199; |
63 | info->b[PSC_VOLTAGE_IN] = 0; | 123 | info->b[PSC_VOLTAGE_IN] = 0; |