0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/init.h>
0013 #include <linux/slab.h>
0014 #include <linux/jiffies.h>
0015 #include <linux/i2c.h>
0016 #include <linux/hwmon.h>
0017 #include <linux/hwmon-sysfs.h>
0018 #include <linux/err.h>
0019 #include <linux/mutex.h>
0020 #include <linux/delay.h>
0021
0022 #define ADC_STEP_MV 2
0023 #define ADC_MAX_LOW_MEASUREMENT_MV 2000
0024
0025 enum powr1xxx_chips { powr1014, powr1220 };
0026
0027 enum powr1220_regs {
0028 VMON_STATUS0,
0029 VMON_STATUS1,
0030 VMON_STATUS2,
0031 OUTPUT_STATUS0,
0032 OUTPUT_STATUS1,
0033 OUTPUT_STATUS2,
0034 INPUT_STATUS,
0035 ADC_VALUE_LOW,
0036 ADC_VALUE_HIGH,
0037 ADC_MUX,
0038 UES_BYTE0,
0039 UES_BYTE1,
0040 UES_BYTE2,
0041 UES_BYTE3,
0042 GP_OUTPUT1,
0043 GP_OUTPUT2,
0044 GP_OUTPUT3,
0045 INPUT_VALUE,
0046 RESET,
0047 TRIM1_TRIM,
0048 TRIM2_TRIM,
0049 TRIM3_TRIM,
0050 TRIM4_TRIM,
0051 TRIM5_TRIM,
0052 TRIM6_TRIM,
0053 TRIM7_TRIM,
0054 TRIM8_TRIM,
0055 MAX_POWR1220_REGS
0056 };
0057
0058 enum powr1220_adc_values {
0059 VMON1,
0060 VMON2,
0061 VMON3,
0062 VMON4,
0063 VMON5,
0064 VMON6,
0065 VMON7,
0066 VMON8,
0067 VMON9,
0068 VMON10,
0069 VMON11,
0070 VMON12,
0071 VCCA,
0072 VCCINP,
0073 MAX_POWR1220_ADC_VALUES
0074 };
0075
0076 struct powr1220_data {
0077 struct i2c_client *client;
0078 struct mutex update_lock;
0079 u8 max_channels;
0080 bool adc_valid[MAX_POWR1220_ADC_VALUES];
0081
0082 unsigned long adc_last_updated[MAX_POWR1220_ADC_VALUES];
0083
0084
0085 int adc_maxes[MAX_POWR1220_ADC_VALUES];
0086 int adc_values[MAX_POWR1220_ADC_VALUES];
0087 };
0088
0089 static const char * const input_names[] = {
0090 [VMON1] = "vmon1",
0091 [VMON2] = "vmon2",
0092 [VMON3] = "vmon3",
0093 [VMON4] = "vmon4",
0094 [VMON5] = "vmon5",
0095 [VMON6] = "vmon6",
0096 [VMON7] = "vmon7",
0097 [VMON8] = "vmon8",
0098 [VMON9] = "vmon9",
0099 [VMON10] = "vmon10",
0100 [VMON11] = "vmon11",
0101 [VMON12] = "vmon12",
0102 [VCCA] = "vcca",
0103 [VCCINP] = "vccinp",
0104 };
0105
0106
0107 static int powr1220_read_adc(struct device *dev, int ch_num)
0108 {
0109 struct powr1220_data *data = dev_get_drvdata(dev);
0110 int reading;
0111 int result;
0112 int adc_range = 0;
0113
0114 mutex_lock(&data->update_lock);
0115
0116 if (time_after(jiffies, data->adc_last_updated[ch_num] + HZ) ||
0117 !data->adc_valid[ch_num]) {
0118
0119
0120
0121
0122
0123
0124 if (data->adc_maxes[ch_num] > ADC_MAX_LOW_MEASUREMENT_MV ||
0125 data->adc_maxes[ch_num] == 0)
0126 adc_range = 1 << 4;
0127
0128
0129 result = i2c_smbus_write_byte_data(data->client, ADC_MUX,
0130 adc_range | ch_num);
0131 if (result)
0132 goto exit;
0133
0134
0135
0136
0137
0138 udelay(200);
0139
0140
0141 result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_LOW);
0142 if (result < 0)
0143 goto exit;
0144
0145 reading = result >> 4;
0146
0147
0148 result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_HIGH);
0149 if (result < 0)
0150 goto exit;
0151
0152 reading |= result << 4;
0153
0154
0155 reading *= ADC_STEP_MV;
0156 data->adc_values[ch_num] = reading;
0157 data->adc_valid[ch_num] = true;
0158 data->adc_last_updated[ch_num] = jiffies;
0159 result = reading;
0160
0161 if (reading > data->adc_maxes[ch_num])
0162 data->adc_maxes[ch_num] = reading;
0163 } else {
0164 result = data->adc_values[ch_num];
0165 }
0166
0167 exit:
0168 mutex_unlock(&data->update_lock);
0169
0170 return result;
0171 }
0172
0173 static umode_t
0174 powr1220_is_visible(const void *data, enum hwmon_sensor_types type, u32
0175 attr, int channel)
0176 {
0177 struct powr1220_data *chip_data = (struct powr1220_data *)data;
0178
0179 if (channel >= chip_data->max_channels)
0180 return 0;
0181
0182 switch (type) {
0183 case hwmon_in:
0184 switch (attr) {
0185 case hwmon_in_input:
0186 case hwmon_in_highest:
0187 case hwmon_in_label:
0188 return 0444;
0189 default:
0190 break;
0191 }
0192 break;
0193 default:
0194 break;
0195 }
0196
0197 return 0;
0198 }
0199
0200 static int
0201 powr1220_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0202 int channel, const char **str)
0203 {
0204 switch (type) {
0205 case hwmon_in:
0206 switch (attr) {
0207 case hwmon_in_label:
0208 *str = input_names[channel];
0209 return 0;
0210 default:
0211 return -EOPNOTSUPP;
0212 }
0213 break;
0214 default:
0215 return -EOPNOTSUPP;
0216 }
0217
0218 return -EOPNOTSUPP;
0219 }
0220
0221 static int
0222 powr1220_read(struct device *dev, enum hwmon_sensor_types type, u32
0223 attr, int channel, long *val)
0224 {
0225 struct powr1220_data *data = dev_get_drvdata(dev);
0226 int ret;
0227
0228 switch (type) {
0229 case hwmon_in:
0230 switch (attr) {
0231 case hwmon_in_input:
0232 ret = powr1220_read_adc(dev, channel);
0233 if (ret < 0)
0234 return ret;
0235 *val = ret;
0236 break;
0237 case hwmon_in_highest:
0238 *val = data->adc_maxes[channel];
0239 break;
0240 default:
0241 return -EOPNOTSUPP;
0242 }
0243 break;
0244 default:
0245 return -EOPNOTSUPP;
0246 }
0247
0248 return 0;
0249 }
0250
0251 static const struct hwmon_channel_info *powr1220_info[] = {
0252 HWMON_CHANNEL_INFO(in,
0253 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0254 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0255 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0256 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0257 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0258 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0259 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0260 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0261 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0262 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0263 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0264 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0265 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
0266 HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL),
0267
0268 NULL
0269 };
0270
0271 static const struct hwmon_ops powr1220_hwmon_ops = {
0272 .read = powr1220_read,
0273 .read_string = powr1220_read_string,
0274 .is_visible = powr1220_is_visible,
0275 };
0276
0277 static const struct hwmon_chip_info powr1220_chip_info = {
0278 .ops = &powr1220_hwmon_ops,
0279 .info = powr1220_info,
0280 };
0281
0282 static const struct i2c_device_id powr1220_ids[];
0283
0284 static int powr1220_probe(struct i2c_client *client)
0285 {
0286 struct powr1220_data *data;
0287 struct device *hwmon_dev;
0288
0289 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
0290 return -ENODEV;
0291
0292 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
0293 if (!data)
0294 return -ENOMEM;
0295
0296 switch (i2c_match_id(powr1220_ids, client)->driver_data) {
0297 case powr1014:
0298 data->max_channels = 10;
0299 break;
0300 default:
0301 data->max_channels = 12;
0302 break;
0303 }
0304
0305 mutex_init(&data->update_lock);
0306 data->client = client;
0307
0308 hwmon_dev = devm_hwmon_device_register_with_info(&client->dev,
0309 client->name,
0310 data,
0311 &powr1220_chip_info,
0312 NULL);
0313
0314 return PTR_ERR_OR_ZERO(hwmon_dev);
0315 }
0316
0317 static const struct i2c_device_id powr1220_ids[] = {
0318 { "powr1014", powr1014, },
0319 { "powr1220", powr1220, },
0320 { }
0321 };
0322
0323 MODULE_DEVICE_TABLE(i2c, powr1220_ids);
0324
0325 static struct i2c_driver powr1220_driver = {
0326 .class = I2C_CLASS_HWMON,
0327 .driver = {
0328 .name = "powr1220",
0329 },
0330 .probe_new = powr1220_probe,
0331 .id_table = powr1220_ids,
0332 };
0333
0334 module_i2c_driver(powr1220_driver);
0335
0336 MODULE_AUTHOR("Scott Kanowitz");
0337 MODULE_DESCRIPTION("POWR1220 driver");
0338 MODULE_LICENSE("GPL");