0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/delay.h>
0009 #include <linux/device.h>
0010 #include <linux/i2c.h>
0011 #include <linux/interrupt.h>
0012 #include <linux/kernel.h>
0013 #include <linux/module.h>
0014 #include <linux/slab.h>
0015 #include <linux/stat.h>
0016 #include <linux/sysfs.h>
0017
0018 #include <linux/iio/iio.h>
0019 #include <linux/iio/sysfs.h>
0020
0021
0022
0023
0024
0025 #define AD7746_REG_STATUS 0
0026 #define AD7746_REG_CAP_DATA_HIGH 1
0027 #define AD7746_REG_VT_DATA_HIGH 4
0028 #define AD7746_REG_CAP_SETUP 7
0029 #define AD7746_REG_VT_SETUP 8
0030 #define AD7746_REG_EXC_SETUP 9
0031 #define AD7746_REG_CFG 10
0032 #define AD7746_REG_CAPDACA 11
0033 #define AD7746_REG_CAPDACB 12
0034 #define AD7746_REG_CAP_OFFH 13
0035 #define AD7746_REG_CAP_GAINH 15
0036 #define AD7746_REG_VOLT_GAINH 17
0037
0038
0039 #define AD7746_STATUS_EXCERR BIT(3)
0040 #define AD7746_STATUS_RDY BIT(2)
0041 #define AD7746_STATUS_RDYVT BIT(1)
0042 #define AD7746_STATUS_RDYCAP BIT(0)
0043
0044
0045 #define AD7746_CAPSETUP_CAPEN BIT(7)
0046 #define AD7746_CAPSETUP_CIN2 BIT(6)
0047 #define AD7746_CAPSETUP_CAPDIFF BIT(5)
0048 #define AD7746_CAPSETUP_CACHOP BIT(0)
0049
0050
0051 #define AD7746_VTSETUP_VTEN (1 << 7)
0052 #define AD7746_VTSETUP_VTMD_INT_TEMP (0 << 5)
0053 #define AD7746_VTSETUP_VTMD_EXT_TEMP (1 << 5)
0054 #define AD7746_VTSETUP_VTMD_VDD_MON (2 << 5)
0055 #define AD7746_VTSETUP_VTMD_EXT_VIN (3 << 5)
0056 #define AD7746_VTSETUP_EXTREF BIT(4)
0057 #define AD7746_VTSETUP_VTSHORT BIT(1)
0058 #define AD7746_VTSETUP_VTCHOP BIT(0)
0059
0060
0061 #define AD7746_EXCSETUP_CLKCTRL BIT(7)
0062 #define AD7746_EXCSETUP_EXCON BIT(6)
0063 #define AD7746_EXCSETUP_EXCB BIT(5)
0064 #define AD7746_EXCSETUP_NEXCB BIT(4)
0065 #define AD7746_EXCSETUP_EXCA BIT(3)
0066 #define AD7746_EXCSETUP_NEXCA BIT(2)
0067 #define AD7746_EXCSETUP_EXCLVL(x) (((x) & 0x3) << 0)
0068
0069
0070 #define AD7746_CONF_VTFS_SHIFT 6
0071 #define AD7746_CONF_CAPFS_SHIFT 3
0072 #define AD7746_CONF_VTFS_MASK GENMASK(7, 6)
0073 #define AD7746_CONF_CAPFS_MASK GENMASK(5, 3)
0074 #define AD7746_CONF_MODE_IDLE (0 << 0)
0075 #define AD7746_CONF_MODE_CONT_CONV (1 << 0)
0076 #define AD7746_CONF_MODE_SINGLE_CONV (2 << 0)
0077 #define AD7746_CONF_MODE_PWRDN (3 << 0)
0078 #define AD7746_CONF_MODE_OFFS_CAL (5 << 0)
0079 #define AD7746_CONF_MODE_GAIN_CAL (6 << 0)
0080
0081
0082 #define AD7746_CAPDAC_DACEN BIT(7)
0083 #define AD7746_CAPDAC_DACP(x) ((x) & 0x7F)
0084
0085 struct ad7746_chip_info {
0086 struct i2c_client *client;
0087 struct mutex lock;
0088
0089
0090
0091
0092 u8 config;
0093 u8 cap_setup;
0094 u8 vt_setup;
0095 u8 capdac[2][2];
0096 s8 capdac_set;
0097
0098 union {
0099 __be32 d32;
0100 u8 d8[4];
0101 } data ____cacheline_aligned;
0102 };
0103
0104 enum ad7746_chan {
0105 VIN,
0106 VIN_VDD,
0107 TEMP_INT,
0108 TEMP_EXT,
0109 CIN1,
0110 CIN1_DIFF,
0111 CIN2,
0112 CIN2_DIFF,
0113 };
0114
0115 static const struct iio_chan_spec ad7746_channels[] = {
0116 [VIN] = {
0117 .type = IIO_VOLTAGE,
0118 .indexed = 1,
0119 .channel = 0,
0120 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
0121 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
0122 BIT(IIO_CHAN_INFO_SAMP_FREQ),
0123 .address = AD7746_REG_VT_DATA_HIGH << 8 |
0124 AD7746_VTSETUP_VTMD_EXT_VIN,
0125 },
0126 [VIN_VDD] = {
0127 .type = IIO_VOLTAGE,
0128 .indexed = 1,
0129 .channel = 1,
0130 .extend_name = "supply",
0131 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
0132 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
0133 BIT(IIO_CHAN_INFO_SAMP_FREQ),
0134 .address = AD7746_REG_VT_DATA_HIGH << 8 |
0135 AD7746_VTSETUP_VTMD_VDD_MON,
0136 },
0137 [TEMP_INT] = {
0138 .type = IIO_TEMP,
0139 .indexed = 1,
0140 .channel = 0,
0141 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
0142 .address = AD7746_REG_VT_DATA_HIGH << 8 |
0143 AD7746_VTSETUP_VTMD_INT_TEMP,
0144 },
0145 [TEMP_EXT] = {
0146 .type = IIO_TEMP,
0147 .indexed = 1,
0148 .channel = 1,
0149 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
0150 .address = AD7746_REG_VT_DATA_HIGH << 8 |
0151 AD7746_VTSETUP_VTMD_EXT_TEMP,
0152 },
0153 [CIN1] = {
0154 .type = IIO_CAPACITANCE,
0155 .indexed = 1,
0156 .channel = 0,
0157 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0158 BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
0159 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
0160 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
0161 .address = AD7746_REG_CAP_DATA_HIGH << 8,
0162 },
0163 [CIN1_DIFF] = {
0164 .type = IIO_CAPACITANCE,
0165 .differential = 1,
0166 .indexed = 1,
0167 .channel = 0,
0168 .channel2 = 2,
0169 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0170 BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
0171 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
0172 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
0173 .address = AD7746_REG_CAP_DATA_HIGH << 8 |
0174 AD7746_CAPSETUP_CAPDIFF
0175 },
0176 [CIN2] = {
0177 .type = IIO_CAPACITANCE,
0178 .indexed = 1,
0179 .channel = 1,
0180 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0181 BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
0182 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
0183 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
0184 .address = AD7746_REG_CAP_DATA_HIGH << 8 |
0185 AD7746_CAPSETUP_CIN2,
0186 },
0187 [CIN2_DIFF] = {
0188 .type = IIO_CAPACITANCE,
0189 .differential = 1,
0190 .indexed = 1,
0191 .channel = 1,
0192 .channel2 = 3,
0193 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0194 BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
0195 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
0196 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
0197 .address = AD7746_REG_CAP_DATA_HIGH << 8 |
0198 AD7746_CAPSETUP_CAPDIFF | AD7746_CAPSETUP_CIN2,
0199 }
0200 };
0201
0202
0203 static const unsigned char ad7746_vt_filter_rate_table[][2] = {
0204 {50, 20 + 1}, {31, 32 + 1}, {16, 62 + 1}, {8, 122 + 1},
0205 };
0206
0207 static const unsigned char ad7746_cap_filter_rate_table[][2] = {
0208 {91, 11 + 1}, {84, 12 + 1}, {50, 20 + 1}, {26, 38 + 1},
0209 {16, 62 + 1}, {13, 77 + 1}, {11, 92 + 1}, {9, 110 + 1},
0210 };
0211
0212 static int ad7746_set_capdac(struct ad7746_chip_info *chip, int channel)
0213 {
0214 int ret = i2c_smbus_write_byte_data(chip->client,
0215 AD7746_REG_CAPDACA,
0216 chip->capdac[channel][0]);
0217 if (ret < 0)
0218 return ret;
0219
0220 return i2c_smbus_write_byte_data(chip->client,
0221 AD7746_REG_CAPDACB,
0222 chip->capdac[channel][1]);
0223 }
0224
0225 static int ad7746_select_channel(struct iio_dev *indio_dev,
0226 struct iio_chan_spec const *chan)
0227 {
0228 struct ad7746_chip_info *chip = iio_priv(indio_dev);
0229 u8 vt_setup, cap_setup;
0230 int ret, delay, idx;
0231
0232 switch (chan->type) {
0233 case IIO_CAPACITANCE:
0234 cap_setup = (chan->address & 0xFF) | AD7746_CAPSETUP_CAPEN;
0235 vt_setup = chip->vt_setup & ~AD7746_VTSETUP_VTEN;
0236 idx = (chip->config & AD7746_CONF_CAPFS_MASK) >>
0237 AD7746_CONF_CAPFS_SHIFT;
0238 delay = ad7746_cap_filter_rate_table[idx][1];
0239
0240 ret = ad7746_set_capdac(chip, chan->channel);
0241 if (ret < 0)
0242 return ret;
0243
0244 if (chip->capdac_set != chan->channel)
0245 chip->capdac_set = chan->channel;
0246 break;
0247 case IIO_VOLTAGE:
0248 case IIO_TEMP:
0249 vt_setup = (chan->address & 0xFF) | AD7746_VTSETUP_VTEN;
0250 cap_setup = chip->cap_setup & ~AD7746_CAPSETUP_CAPEN;
0251 idx = (chip->config & AD7746_CONF_VTFS_MASK) >>
0252 AD7746_CONF_VTFS_SHIFT;
0253 delay = ad7746_cap_filter_rate_table[idx][1];
0254 break;
0255 default:
0256 return -EINVAL;
0257 }
0258
0259 if (chip->cap_setup != cap_setup) {
0260 ret = i2c_smbus_write_byte_data(chip->client,
0261 AD7746_REG_CAP_SETUP,
0262 cap_setup);
0263 if (ret < 0)
0264 return ret;
0265
0266 chip->cap_setup = cap_setup;
0267 }
0268
0269 if (chip->vt_setup != vt_setup) {
0270 ret = i2c_smbus_write_byte_data(chip->client,
0271 AD7746_REG_VT_SETUP,
0272 vt_setup);
0273 if (ret < 0)
0274 return ret;
0275
0276 chip->vt_setup = vt_setup;
0277 }
0278
0279 return delay;
0280 }
0281
0282 static inline ssize_t ad7746_start_calib(struct device *dev,
0283 struct device_attribute *attr,
0284 const char *buf,
0285 size_t len,
0286 u8 regval)
0287 {
0288 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0289 struct ad7746_chip_info *chip = iio_priv(indio_dev);
0290 int ret, timeout = 10;
0291 bool doit;
0292
0293 ret = kstrtobool(buf, &doit);
0294 if (ret < 0)
0295 return ret;
0296
0297 if (!doit)
0298 return 0;
0299
0300 mutex_lock(&chip->lock);
0301 regval |= chip->config;
0302 ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
0303 if (ret < 0)
0304 goto unlock;
0305
0306 do {
0307 msleep(20);
0308 ret = i2c_smbus_read_byte_data(chip->client, AD7746_REG_CFG);
0309 if (ret < 0)
0310 goto unlock;
0311
0312 } while ((ret == regval) && timeout--);
0313
0314 mutex_unlock(&chip->lock);
0315
0316 return len;
0317
0318 unlock:
0319 mutex_unlock(&chip->lock);
0320 return ret;
0321 }
0322
0323 static ssize_t ad7746_start_offset_calib(struct device *dev,
0324 struct device_attribute *attr,
0325 const char *buf,
0326 size_t len)
0327 {
0328 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0329 int ret = ad7746_select_channel(indio_dev,
0330 &ad7746_channels[to_iio_dev_attr(attr)->address]);
0331 if (ret < 0)
0332 return ret;
0333
0334 return ad7746_start_calib(dev, attr, buf, len,
0335 AD7746_CONF_MODE_OFFS_CAL);
0336 }
0337
0338 static ssize_t ad7746_start_gain_calib(struct device *dev,
0339 struct device_attribute *attr,
0340 const char *buf,
0341 size_t len)
0342 {
0343 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0344 int ret = ad7746_select_channel(indio_dev,
0345 &ad7746_channels[to_iio_dev_attr(attr)->address]);
0346 if (ret < 0)
0347 return ret;
0348
0349 return ad7746_start_calib(dev, attr, buf, len,
0350 AD7746_CONF_MODE_GAIN_CAL);
0351 }
0352
0353 static IIO_DEVICE_ATTR(in_capacitance0_calibbias_calibration,
0354 0200, NULL, ad7746_start_offset_calib, CIN1);
0355 static IIO_DEVICE_ATTR(in_capacitance1_calibbias_calibration,
0356 0200, NULL, ad7746_start_offset_calib, CIN2);
0357 static IIO_DEVICE_ATTR(in_capacitance0_calibscale_calibration,
0358 0200, NULL, ad7746_start_gain_calib, CIN1);
0359 static IIO_DEVICE_ATTR(in_capacitance1_calibscale_calibration,
0360 0200, NULL, ad7746_start_gain_calib, CIN2);
0361 static IIO_DEVICE_ATTR(in_voltage0_calibscale_calibration,
0362 0200, NULL, ad7746_start_gain_calib, VIN);
0363
0364 static int ad7746_store_cap_filter_rate_setup(struct ad7746_chip_info *chip,
0365 int val)
0366 {
0367 int i;
0368
0369 for (i = 0; i < ARRAY_SIZE(ad7746_cap_filter_rate_table); i++)
0370 if (val >= ad7746_cap_filter_rate_table[i][0])
0371 break;
0372
0373 if (i >= ARRAY_SIZE(ad7746_cap_filter_rate_table))
0374 i = ARRAY_SIZE(ad7746_cap_filter_rate_table) - 1;
0375
0376 chip->config &= ~AD7746_CONF_CAPFS_MASK;
0377 chip->config |= i << AD7746_CONF_CAPFS_SHIFT;
0378
0379 return 0;
0380 }
0381
0382 static int ad7746_store_vt_filter_rate_setup(struct ad7746_chip_info *chip,
0383 int val)
0384 {
0385 int i;
0386
0387 for (i = 0; i < ARRAY_SIZE(ad7746_vt_filter_rate_table); i++)
0388 if (val >= ad7746_vt_filter_rate_table[i][0])
0389 break;
0390
0391 if (i >= ARRAY_SIZE(ad7746_vt_filter_rate_table))
0392 i = ARRAY_SIZE(ad7746_vt_filter_rate_table) - 1;
0393
0394 chip->config &= ~AD7746_CONF_VTFS_MASK;
0395 chip->config |= i << AD7746_CONF_VTFS_SHIFT;
0396
0397 return 0;
0398 }
0399
0400 static IIO_CONST_ATTR(in_voltage_sampling_frequency_available, "50 31 16 8");
0401 static IIO_CONST_ATTR(in_capacitance_sampling_frequency_available,
0402 "91 84 50 26 16 13 11 9");
0403
0404 static struct attribute *ad7746_attributes[] = {
0405 &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
0406 &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
0407 &iio_dev_attr_in_capacitance1_calibscale_calibration.dev_attr.attr,
0408 &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
0409 &iio_dev_attr_in_voltage0_calibscale_calibration.dev_attr.attr,
0410 &iio_const_attr_in_voltage_sampling_frequency_available.dev_attr.attr,
0411 &iio_const_attr_in_capacitance_sampling_frequency_available.dev_attr.attr,
0412 NULL,
0413 };
0414
0415 static const struct attribute_group ad7746_attribute_group = {
0416 .attrs = ad7746_attributes,
0417 };
0418
0419 static int ad7746_write_raw(struct iio_dev *indio_dev,
0420 struct iio_chan_spec const *chan,
0421 int val,
0422 int val2,
0423 long mask)
0424 {
0425 struct ad7746_chip_info *chip = iio_priv(indio_dev);
0426 int ret, reg;
0427
0428 mutex_lock(&chip->lock);
0429
0430 switch (mask) {
0431 case IIO_CHAN_INFO_CALIBSCALE:
0432 if (val != 1) {
0433 ret = -EINVAL;
0434 goto out;
0435 }
0436
0437 val = (val2 * 1024) / 15625;
0438
0439 switch (chan->type) {
0440 case IIO_CAPACITANCE:
0441 reg = AD7746_REG_CAP_GAINH;
0442 break;
0443 case IIO_VOLTAGE:
0444 reg = AD7746_REG_VOLT_GAINH;
0445 break;
0446 default:
0447 ret = -EINVAL;
0448 goto out;
0449 }
0450
0451 ret = i2c_smbus_write_word_swapped(chip->client, reg, val);
0452 if (ret < 0)
0453 goto out;
0454
0455 ret = 0;
0456 break;
0457 case IIO_CHAN_INFO_CALIBBIAS:
0458 if (val < 0 || val > 0xFFFF) {
0459 ret = -EINVAL;
0460 goto out;
0461 }
0462 ret = i2c_smbus_write_word_swapped(chip->client,
0463 AD7746_REG_CAP_OFFH, val);
0464 if (ret < 0)
0465 goto out;
0466
0467 ret = 0;
0468 break;
0469 case IIO_CHAN_INFO_OFFSET:
0470 if (val < 0 || val > 43008000) {
0471 ret = -EINVAL;
0472 goto out;
0473 }
0474
0475
0476
0477
0478
0479
0480
0481 val /= 338646;
0482
0483 chip->capdac[chan->channel][chan->differential] = val > 0 ?
0484 AD7746_CAPDAC_DACP(val) | AD7746_CAPDAC_DACEN : 0;
0485
0486 ret = ad7746_set_capdac(chip, chan->channel);
0487 if (ret < 0)
0488 goto out;
0489
0490 chip->capdac_set = chan->channel;
0491
0492 ret = 0;
0493 break;
0494 case IIO_CHAN_INFO_SAMP_FREQ:
0495 if (val2) {
0496 ret = -EINVAL;
0497 goto out;
0498 }
0499
0500 switch (chan->type) {
0501 case IIO_CAPACITANCE:
0502 ret = ad7746_store_cap_filter_rate_setup(chip, val);
0503 break;
0504 case IIO_VOLTAGE:
0505 ret = ad7746_store_vt_filter_rate_setup(chip, val);
0506 break;
0507 default:
0508 ret = -EINVAL;
0509 }
0510 break;
0511 default:
0512 ret = -EINVAL;
0513 }
0514
0515 out:
0516 mutex_unlock(&chip->lock);
0517 return ret;
0518 }
0519
0520 static int ad7746_read_raw(struct iio_dev *indio_dev,
0521 struct iio_chan_spec const *chan,
0522 int *val, int *val2,
0523 long mask)
0524 {
0525 struct ad7746_chip_info *chip = iio_priv(indio_dev);
0526 int ret, delay, idx;
0527 u8 regval, reg;
0528
0529 mutex_lock(&chip->lock);
0530
0531 switch (mask) {
0532 case IIO_CHAN_INFO_RAW:
0533 case IIO_CHAN_INFO_PROCESSED:
0534 ret = ad7746_select_channel(indio_dev, chan);
0535 if (ret < 0)
0536 goto out;
0537 delay = ret;
0538
0539 regval = chip->config | AD7746_CONF_MODE_SINGLE_CONV;
0540 ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG,
0541 regval);
0542 if (ret < 0)
0543 goto out;
0544
0545 msleep(delay);
0546
0547
0548 ret = i2c_smbus_read_i2c_block_data(chip->client,
0549 chan->address >> 8, 3,
0550 &chip->data.d8[1]);
0551
0552 if (ret < 0)
0553 goto out;
0554
0555 *val = (be32_to_cpu(chip->data.d32) & 0xFFFFFF) - 0x800000;
0556
0557 switch (chan->type) {
0558 case IIO_TEMP:
0559
0560
0561
0562
0563 *val = (*val * 125) / 256;
0564 break;
0565 case IIO_VOLTAGE:
0566 if (chan->channel == 1)
0567 *val = *val * 6;
0568 break;
0569 default:
0570 break;
0571 }
0572
0573 ret = IIO_VAL_INT;
0574 break;
0575 case IIO_CHAN_INFO_CALIBSCALE:
0576 switch (chan->type) {
0577 case IIO_CAPACITANCE:
0578 reg = AD7746_REG_CAP_GAINH;
0579 break;
0580 case IIO_VOLTAGE:
0581 reg = AD7746_REG_VOLT_GAINH;
0582 break;
0583 default:
0584 ret = -EINVAL;
0585 goto out;
0586 }
0587
0588 ret = i2c_smbus_read_word_swapped(chip->client, reg);
0589 if (ret < 0)
0590 goto out;
0591
0592 *val = 1;
0593 *val2 = (15625 * ret) / 1024;
0594
0595 ret = IIO_VAL_INT_PLUS_MICRO;
0596 break;
0597 case IIO_CHAN_INFO_CALIBBIAS:
0598 ret = i2c_smbus_read_word_swapped(chip->client,
0599 AD7746_REG_CAP_OFFH);
0600 if (ret < 0)
0601 goto out;
0602 *val = ret;
0603
0604 ret = IIO_VAL_INT;
0605 break;
0606 case IIO_CHAN_INFO_OFFSET:
0607 *val = AD7746_CAPDAC_DACP(chip->capdac[chan->channel]
0608 [chan->differential]) * 338646;
0609
0610 ret = IIO_VAL_INT;
0611 break;
0612 case IIO_CHAN_INFO_SCALE:
0613 switch (chan->type) {
0614 case IIO_CAPACITANCE:
0615
0616 *val = 0;
0617 *val2 = 488;
0618 ret = IIO_VAL_INT_PLUS_NANO;
0619 break;
0620 case IIO_VOLTAGE:
0621
0622 *val = 1170;
0623 *val2 = 23;
0624 ret = IIO_VAL_FRACTIONAL_LOG2;
0625 break;
0626 default:
0627 ret = -EINVAL;
0628 break;
0629 }
0630
0631 break;
0632 case IIO_CHAN_INFO_SAMP_FREQ:
0633 switch (chan->type) {
0634 case IIO_CAPACITANCE:
0635 idx = (chip->config & AD7746_CONF_CAPFS_MASK) >>
0636 AD7746_CONF_CAPFS_SHIFT;
0637 *val = ad7746_cap_filter_rate_table[idx][0];
0638 ret = IIO_VAL_INT;
0639 break;
0640 case IIO_VOLTAGE:
0641 idx = (chip->config & AD7746_CONF_VTFS_MASK) >>
0642 AD7746_CONF_VTFS_SHIFT;
0643 *val = ad7746_vt_filter_rate_table[idx][0];
0644 ret = IIO_VAL_INT;
0645 break;
0646 default:
0647 ret = -EINVAL;
0648 }
0649 break;
0650 default:
0651 ret = -EINVAL;
0652 }
0653 out:
0654 mutex_unlock(&chip->lock);
0655 return ret;
0656 }
0657
0658 static const struct iio_info ad7746_info = {
0659 .attrs = &ad7746_attribute_group,
0660 .read_raw = ad7746_read_raw,
0661 .write_raw = ad7746_write_raw,
0662 };
0663
0664 static int ad7746_probe(struct i2c_client *client,
0665 const struct i2c_device_id *id)
0666 {
0667 struct device *dev = &client->dev;
0668 struct ad7746_chip_info *chip;
0669 struct iio_dev *indio_dev;
0670 unsigned char regval = 0;
0671 unsigned int vdd_permille;
0672 int ret;
0673
0674 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
0675 if (!indio_dev)
0676 return -ENOMEM;
0677 chip = iio_priv(indio_dev);
0678 mutex_init(&chip->lock);
0679
0680 i2c_set_clientdata(client, indio_dev);
0681
0682 chip->client = client;
0683 chip->capdac_set = -1;
0684
0685 indio_dev->name = id->name;
0686 indio_dev->info = &ad7746_info;
0687 indio_dev->channels = ad7746_channels;
0688 if (id->driver_data == 7746)
0689 indio_dev->num_channels = ARRAY_SIZE(ad7746_channels);
0690 else
0691 indio_dev->num_channels = ARRAY_SIZE(ad7746_channels) - 2;
0692 indio_dev->modes = INDIO_DIRECT_MODE;
0693
0694 if (device_property_read_bool(dev, "adi,exca-output-en")) {
0695 if (device_property_read_bool(dev, "adi,exca-output-invert"))
0696 regval |= AD7746_EXCSETUP_NEXCA;
0697 else
0698 regval |= AD7746_EXCSETUP_EXCA;
0699 }
0700
0701 if (device_property_read_bool(dev, "adi,excb-output-en")) {
0702 if (device_property_read_bool(dev, "adi,excb-output-invert"))
0703 regval |= AD7746_EXCSETUP_NEXCB;
0704 else
0705 regval |= AD7746_EXCSETUP_EXCB;
0706 }
0707
0708 ret = device_property_read_u32(dev, "adi,excitation-vdd-permille",
0709 &vdd_permille);
0710 if (!ret) {
0711 switch (vdd_permille) {
0712 case 125:
0713 regval |= AD7746_EXCSETUP_EXCLVL(0);
0714 break;
0715 case 250:
0716 regval |= AD7746_EXCSETUP_EXCLVL(1);
0717 break;
0718 case 375:
0719 regval |= AD7746_EXCSETUP_EXCLVL(2);
0720 break;
0721 case 500:
0722 regval |= AD7746_EXCSETUP_EXCLVL(3);
0723 break;
0724 default:
0725 break;
0726 }
0727 }
0728
0729 ret = i2c_smbus_write_byte_data(chip->client,
0730 AD7746_REG_EXC_SETUP, regval);
0731 if (ret < 0)
0732 return ret;
0733
0734 return devm_iio_device_register(indio_dev->dev.parent, indio_dev);
0735 }
0736
0737 static const struct i2c_device_id ad7746_id[] = {
0738 { "ad7745", 7745 },
0739 { "ad7746", 7746 },
0740 { "ad7747", 7747 },
0741 {}
0742 };
0743
0744 MODULE_DEVICE_TABLE(i2c, ad7746_id);
0745
0746 static const struct of_device_id ad7746_of_match[] = {
0747 { .compatible = "adi,ad7745" },
0748 { .compatible = "adi,ad7746" },
0749 { .compatible = "adi,ad7747" },
0750 { },
0751 };
0752
0753 MODULE_DEVICE_TABLE(of, ad7746_of_match);
0754
0755 static struct i2c_driver ad7746_driver = {
0756 .driver = {
0757 .name = KBUILD_MODNAME,
0758 .of_match_table = ad7746_of_match,
0759 },
0760 .probe = ad7746_probe,
0761 .id_table = ad7746_id,
0762 };
0763 module_i2c_driver(ad7746_driver);
0764
0765 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
0766 MODULE_DESCRIPTION("Analog Devices AD7746/5/7 capacitive sensor driver");
0767 MODULE_LICENSE("GPL v2");