Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * powr1220.c - Driver for the Lattice POWR1220 programmable power supply
0004  * and monitor. Users can read all ADC inputs along with their labels
0005  * using the sysfs nodes.
0006  *
0007  * Copyright (c) 2014 Echo360 https://www.echo360.com
0008  * Scott Kanowitz <skanowitz@echo360.com> <scott.kanowitz@gmail.com>
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      /* the next value is in jiffies */
0082     unsigned long adc_last_updated[MAX_POWR1220_ADC_VALUES];
0083 
0084     /* values */
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 /* Reads the specified ADC channel */
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          * figure out if we need to use the attenuator for
0120          * high inputs or inputs that we don't yet have a measurement
0121          * for. We dynamically set the attenuator depending on the
0122          * max reading.
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         /* set the attenuator and mux */
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          * wait at least Tconvert time (200 us) for the
0136          * conversion to complete
0137          */
0138         udelay(200);
0139 
0140         /* get the ADC reading */
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         /* get the upper half of the reading */
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         /* now convert the reading to a voltage */
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");