0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bitfield.h>
0009 #include <linux/bits.h>
0010 #include <linux/crc8.h>
0011 #include <linux/delay.h>
0012 #include <linux/device.h>
0013 #include <linux/err.h>
0014 #include <linux/interrupt.h>
0015 #include <linux/kernel.h>
0016 #include <linux/module.h>
0017 #include <linux/mod_devicetable.h>
0018 #include <linux/mutex.h>
0019 #include <linux/slab.h>
0020 #include <linux/sysfs.h>
0021 #include <linux/spi/spi.h>
0022
0023 #include <linux/iio/events.h>
0024 #include <linux/iio/iio.h>
0025
0026
0027
0028 #define AD7280A_CELL_VOLTAGE_1_REG 0x0
0029 #define AD7280A_CELL_VOLTAGE_2_REG 0x1
0030 #define AD7280A_CELL_VOLTAGE_3_REG 0x2
0031 #define AD7280A_CELL_VOLTAGE_4_REG 0x3
0032 #define AD7280A_CELL_VOLTAGE_5_REG 0x4
0033 #define AD7280A_CELL_VOLTAGE_6_REG 0x5
0034 #define AD7280A_AUX_ADC_1_REG 0x6
0035 #define AD7280A_AUX_ADC_2_REG 0x7
0036 #define AD7280A_AUX_ADC_3_REG 0x8
0037 #define AD7280A_AUX_ADC_4_REG 0x9
0038 #define AD7280A_AUX_ADC_5_REG 0xA
0039 #define AD7280A_AUX_ADC_6_REG 0xB
0040 #define AD7280A_SELF_TEST_REG 0xC
0041
0042 #define AD7280A_CTRL_HB_REG 0xD
0043 #define AD7280A_CTRL_HB_CONV_INPUT_MSK GENMASK(7, 6)
0044 #define AD7280A_CTRL_HB_CONV_INPUT_ALL 0
0045 #define AD7280A_CTRL_HB_CONV_INPUT_6CELL_AUX1_3_5 1
0046 #define AD7280A_CTRL_HB_CONV_INPUT_6CELL 2
0047 #define AD7280A_CTRL_HB_CONV_INPUT_SELF_TEST 3
0048 #define AD7280A_CTRL_HB_CONV_RREAD_MSK GENMASK(5, 4)
0049 #define AD7280A_CTRL_HB_CONV_RREAD_ALL 0
0050 #define AD7280A_CTRL_HB_CONV_RREAD_6CELL_AUX1_3_5 1
0051 #define AD7280A_CTRL_HB_CONV_RREAD_6CELL 2
0052 #define AD7280A_CTRL_HB_CONV_RREAD_NO 3
0053 #define AD7280A_CTRL_HB_CONV_START_MSK BIT(3)
0054 #define AD7280A_CTRL_HB_CONV_START_CNVST 0
0055 #define AD7280A_CTRL_HB_CONV_START_CS 1
0056 #define AD7280A_CTRL_HB_CONV_AVG_MSK GENMASK(2, 1)
0057 #define AD7280A_CTRL_HB_CONV_AVG_DIS 0
0058 #define AD7280A_CTRL_HB_CONV_AVG_2 1
0059 #define AD7280A_CTRL_HB_CONV_AVG_4 2
0060 #define AD7280A_CTRL_HB_CONV_AVG_8 3
0061 #define AD7280A_CTRL_HB_PWRDN_SW BIT(0)
0062
0063 #define AD7280A_CTRL_LB_REG 0xE
0064 #define AD7280A_CTRL_LB_SWRST_MSK BIT(7)
0065 #define AD7280A_CTRL_LB_ACQ_TIME_MSK GENMASK(6, 5)
0066 #define AD7280A_CTRL_LB_ACQ_TIME_400ns 0
0067 #define AD7280A_CTRL_LB_ACQ_TIME_800ns 1
0068 #define AD7280A_CTRL_LB_ACQ_TIME_1200ns 2
0069 #define AD7280A_CTRL_LB_ACQ_TIME_1600ns 3
0070 #define AD7280A_CTRL_LB_MUST_SET BIT(4)
0071 #define AD7280A_CTRL_LB_THERMISTOR_MSK BIT(3)
0072 #define AD7280A_CTRL_LB_LOCK_DEV_ADDR_MSK BIT(2)
0073 #define AD7280A_CTRL_LB_INC_DEV_ADDR_MSK BIT(1)
0074 #define AD7280A_CTRL_LB_DAISY_CHAIN_RB_MSK BIT(0)
0075
0076 #define AD7280A_CELL_OVERVOLTAGE_REG 0xF
0077 #define AD7280A_CELL_UNDERVOLTAGE_REG 0x10
0078 #define AD7280A_AUX_ADC_OVERVOLTAGE_REG 0x11
0079 #define AD7280A_AUX_ADC_UNDERVOLTAGE_REG 0x12
0080
0081 #define AD7280A_ALERT_REG 0x13
0082 #define AD7280A_ALERT_REMOVE_MSK GENMASK(3, 0)
0083 #define AD7280A_ALERT_REMOVE_AUX5 BIT(0)
0084 #define AD7280A_ALERT_REMOVE_AUX3_AUX5 BIT(1)
0085 #define AD7280A_ALERT_REMOVE_VIN5 BIT(2)
0086 #define AD7280A_ALERT_REMOVE_VIN4_VIN5 BIT(3)
0087 #define AD7280A_ALERT_GEN_STATIC_HIGH BIT(6)
0088 #define AD7280A_ALERT_RELAY_SIG_CHAIN_DOWN (BIT(7) | BIT(6))
0089
0090 #define AD7280A_CELL_BALANCE_REG 0x14
0091 #define AD7280A_CELL_BALANCE_CHAN_BITMAP_MSK GENMASK(7, 2)
0092 #define AD7280A_CB1_TIMER_REG 0x15
0093 #define AD7280A_CB_TIMER_VAL_MSK GENMASK(7, 3)
0094 #define AD7280A_CB2_TIMER_REG 0x16
0095 #define AD7280A_CB3_TIMER_REG 0x17
0096 #define AD7280A_CB4_TIMER_REG 0x18
0097 #define AD7280A_CB5_TIMER_REG 0x19
0098 #define AD7280A_CB6_TIMER_REG 0x1A
0099 #define AD7280A_PD_TIMER_REG 0x1B
0100 #define AD7280A_READ_REG 0x1C
0101 #define AD7280A_READ_ADDR_MSK GENMASK(7, 2)
0102 #define AD7280A_CNVST_CTRL_REG 0x1D
0103
0104
0105 #define AD7280A_TRANS_WRITE_DEVADDR_MSK GENMASK(31, 27)
0106 #define AD7280A_TRANS_WRITE_ADDR_MSK GENMASK(26, 21)
0107 #define AD7280A_TRANS_WRITE_VAL_MSK GENMASK(20, 13)
0108 #define AD7280A_TRANS_WRITE_ALL_MSK BIT(12)
0109 #define AD7280A_TRANS_WRITE_CRC_MSK GENMASK(10, 3)
0110 #define AD7280A_TRANS_WRITE_RES_PATTERN 0x2
0111
0112
0113 #define AD7280A_TRANS_READ_DEVADDR_MSK GENMASK(31, 27)
0114 #define AD7280A_TRANS_READ_CONV_CHANADDR_MSK GENMASK(26, 23)
0115 #define AD7280A_TRANS_READ_CONV_DATA_MSK GENMASK(22, 11)
0116 #define AD7280A_TRANS_READ_REG_REGADDR_MSK GENMASK(26, 21)
0117 #define AD7280A_TRANS_READ_REG_DATA_MSK GENMASK(20, 13)
0118 #define AD7280A_TRANS_READ_WRITE_ACK_MSK BIT(10)
0119 #define AD7280A_TRANS_READ_CRC_MSK GENMASK(9, 2)
0120
0121
0122 #define AD7280A_ALL_CELLS (0xAD << 16)
0123
0124 #define AD7280A_MAX_SPI_CLK_HZ 700000
0125 #define AD7280A_MAX_CHAIN 8
0126 #define AD7280A_CELLS_PER_DEV 6
0127 #define AD7280A_BITS 12
0128 #define AD7280A_NUM_CH (AD7280A_AUX_ADC_6_REG - \
0129 AD7280A_CELL_VOLTAGE_1_REG + 1)
0130
0131 #define AD7280A_CALC_VOLTAGE_CHAN_NUM(d, c) (((d) * AD7280A_CELLS_PER_DEV) + \
0132 (c))
0133 #define AD7280A_CALC_TEMP_CHAN_NUM(d, c) (((d) * AD7280A_CELLS_PER_DEV) + \
0134 (c) - AD7280A_CELLS_PER_DEV)
0135
0136 #define AD7280A_DEVADDR_MASTER 0
0137 #define AD7280A_DEVADDR_ALL 0x1F
0138
0139 static const unsigned short ad7280a_n_avg[4] = {1, 2, 4, 8};
0140 static const unsigned short ad7280a_t_acq_ns[4] = {470, 1030, 1510, 1945};
0141
0142
0143 static unsigned int ad7280a_devaddr(unsigned int addr)
0144 {
0145 return ((addr & 0x1) << 4) |
0146 ((addr & 0x2) << 2) |
0147 (addr & 0x4) |
0148 ((addr & 0x8) >> 2) |
0149 ((addr & 0x10) >> 4);
0150 }
0151
0152
0153
0154
0155
0156
0157
0158 #define AD7280A_READ_TXVAL 0xF800030A
0159
0160
0161
0162
0163
0164
0165 #define POLYNOM 0x2F
0166
0167 struct ad7280_state {
0168 struct spi_device *spi;
0169 struct iio_chan_spec *channels;
0170 unsigned int chain_last_alert_ignore;
0171 bool thermistor_term_en;
0172 int slave_num;
0173 int scan_cnt;
0174 int readback_delay_us;
0175 unsigned char crc_tab[CRC8_TABLE_SIZE];
0176 u8 oversampling_ratio;
0177 u8 acquisition_time;
0178 unsigned char ctrl_lb;
0179 unsigned char cell_threshhigh;
0180 unsigned char cell_threshlow;
0181 unsigned char aux_threshhigh;
0182 unsigned char aux_threshlow;
0183 unsigned char cb_mask[AD7280A_MAX_CHAIN];
0184 struct mutex lock;
0185
0186 __be32 tx __aligned(IIO_DMA_MINALIGN);
0187 __be32 rx;
0188 };
0189
0190 static unsigned char ad7280_calc_crc8(unsigned char *crc_tab, unsigned int val)
0191 {
0192 unsigned char crc;
0193
0194 crc = crc_tab[val >> 16 & 0xFF];
0195 crc = crc_tab[crc ^ (val >> 8 & 0xFF)];
0196
0197 return crc ^ (val & 0xFF);
0198 }
0199
0200 static int ad7280_check_crc(struct ad7280_state *st, unsigned int val)
0201 {
0202 unsigned char crc = ad7280_calc_crc8(st->crc_tab, val >> 10);
0203
0204 if (crc != ((val >> 2) & 0xFF))
0205 return -EIO;
0206
0207 return 0;
0208 }
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 static void ad7280_delay(struct ad7280_state *st)
0219 {
0220 if (st->readback_delay_us < 50)
0221 udelay(st->readback_delay_us);
0222 else
0223 usleep_range(250, 500);
0224 }
0225
0226 static int __ad7280_read32(struct ad7280_state *st, unsigned int *val)
0227 {
0228 int ret;
0229 struct spi_transfer t = {
0230 .tx_buf = &st->tx,
0231 .rx_buf = &st->rx,
0232 .len = sizeof(st->tx),
0233 };
0234
0235 st->tx = cpu_to_be32(AD7280A_READ_TXVAL);
0236
0237 ret = spi_sync_transfer(st->spi, &t, 1);
0238 if (ret)
0239 return ret;
0240
0241 *val = be32_to_cpu(st->rx);
0242
0243 return 0;
0244 }
0245
0246 static int ad7280_write(struct ad7280_state *st, unsigned int devaddr,
0247 unsigned int addr, bool all, unsigned int val)
0248 {
0249 unsigned int reg = FIELD_PREP(AD7280A_TRANS_WRITE_DEVADDR_MSK, devaddr) |
0250 FIELD_PREP(AD7280A_TRANS_WRITE_ADDR_MSK, addr) |
0251 FIELD_PREP(AD7280A_TRANS_WRITE_VAL_MSK, val) |
0252 FIELD_PREP(AD7280A_TRANS_WRITE_ALL_MSK, all);
0253
0254 reg |= FIELD_PREP(AD7280A_TRANS_WRITE_CRC_MSK,
0255 ad7280_calc_crc8(st->crc_tab, reg >> 11));
0256
0257 reg |= AD7280A_TRANS_WRITE_RES_PATTERN;
0258
0259 st->tx = cpu_to_be32(reg);
0260
0261 return spi_write(st->spi, &st->tx, sizeof(st->tx));
0262 }
0263
0264 static int ad7280_read_reg(struct ad7280_state *st, unsigned int devaddr,
0265 unsigned int addr)
0266 {
0267 int ret;
0268 unsigned int tmp;
0269
0270
0271 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_HB_REG, 1,
0272 FIELD_PREP(AD7280A_CTRL_HB_CONV_INPUT_MSK,
0273 AD7280A_CTRL_HB_CONV_INPUT_ALL) |
0274 FIELD_PREP(AD7280A_CTRL_HB_CONV_RREAD_MSK,
0275 AD7280A_CTRL_HB_CONV_RREAD_NO) |
0276 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK,
0277 st->oversampling_ratio));
0278 if (ret)
0279 return ret;
0280
0281
0282 ret = ad7280_write(st, devaddr, AD7280A_CTRL_HB_REG, 0,
0283 FIELD_PREP(AD7280A_CTRL_HB_CONV_INPUT_MSK,
0284 AD7280A_CTRL_HB_CONV_INPUT_ALL) |
0285 FIELD_PREP(AD7280A_CTRL_HB_CONV_RREAD_MSK,
0286 AD7280A_CTRL_HB_CONV_RREAD_ALL) |
0287 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK,
0288 st->oversampling_ratio));
0289 if (ret)
0290 return ret;
0291
0292
0293 ret = ad7280_write(st, devaddr, AD7280A_READ_REG, 0,
0294 FIELD_PREP(AD7280A_READ_ADDR_MSK, addr));
0295 if (ret)
0296 return ret;
0297
0298 ret = __ad7280_read32(st, &tmp);
0299 if (ret)
0300 return ret;
0301
0302 if (ad7280_check_crc(st, tmp))
0303 return -EIO;
0304
0305 if ((FIELD_GET(AD7280A_TRANS_READ_DEVADDR_MSK, tmp) != devaddr) ||
0306 (FIELD_GET(AD7280A_TRANS_READ_REG_REGADDR_MSK, tmp) != addr))
0307 return -EFAULT;
0308
0309 return FIELD_GET(AD7280A_TRANS_READ_REG_DATA_MSK, tmp);
0310 }
0311
0312 static int ad7280_read_channel(struct ad7280_state *st, unsigned int devaddr,
0313 unsigned int addr)
0314 {
0315 int ret;
0316 unsigned int tmp;
0317
0318 ret = ad7280_write(st, devaddr, AD7280A_READ_REG, 0,
0319 FIELD_PREP(AD7280A_READ_ADDR_MSK, addr));
0320 if (ret)
0321 return ret;
0322
0323 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_HB_REG, 1,
0324 FIELD_PREP(AD7280A_CTRL_HB_CONV_INPUT_MSK,
0325 AD7280A_CTRL_HB_CONV_INPUT_ALL) |
0326 FIELD_PREP(AD7280A_CTRL_HB_CONV_RREAD_MSK,
0327 AD7280A_CTRL_HB_CONV_RREAD_NO) |
0328 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK,
0329 st->oversampling_ratio));
0330 if (ret)
0331 return ret;
0332
0333 ret = ad7280_write(st, devaddr, AD7280A_CTRL_HB_REG, 0,
0334 FIELD_PREP(AD7280A_CTRL_HB_CONV_INPUT_MSK,
0335 AD7280A_CTRL_HB_CONV_INPUT_ALL) |
0336 FIELD_PREP(AD7280A_CTRL_HB_CONV_RREAD_MSK,
0337 AD7280A_CTRL_HB_CONV_RREAD_ALL) |
0338 FIELD_PREP(AD7280A_CTRL_HB_CONV_START_MSK,
0339 AD7280A_CTRL_HB_CONV_START_CS) |
0340 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK,
0341 st->oversampling_ratio));
0342 if (ret)
0343 return ret;
0344
0345 ad7280_delay(st);
0346
0347 ret = __ad7280_read32(st, &tmp);
0348 if (ret)
0349 return ret;
0350
0351 if (ad7280_check_crc(st, tmp))
0352 return -EIO;
0353
0354 if ((FIELD_GET(AD7280A_TRANS_READ_DEVADDR_MSK, tmp) != devaddr) ||
0355 (FIELD_GET(AD7280A_TRANS_READ_CONV_CHANADDR_MSK, tmp) != addr))
0356 return -EFAULT;
0357
0358 return FIELD_GET(AD7280A_TRANS_READ_CONV_DATA_MSK, tmp);
0359 }
0360
0361 static int ad7280_read_all_channels(struct ad7280_state *st, unsigned int cnt,
0362 unsigned int *array)
0363 {
0364 int i, ret;
0365 unsigned int tmp, sum = 0;
0366
0367 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_READ_REG, 1,
0368 AD7280A_CELL_VOLTAGE_1_REG << 2);
0369 if (ret)
0370 return ret;
0371
0372 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_HB_REG, 1,
0373 FIELD_PREP(AD7280A_CTRL_HB_CONV_INPUT_MSK,
0374 AD7280A_CTRL_HB_CONV_INPUT_ALL) |
0375 FIELD_PREP(AD7280A_CTRL_HB_CONV_RREAD_MSK,
0376 AD7280A_CTRL_HB_CONV_RREAD_ALL) |
0377 FIELD_PREP(AD7280A_CTRL_HB_CONV_START_MSK,
0378 AD7280A_CTRL_HB_CONV_START_CS) |
0379 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK,
0380 st->oversampling_ratio));
0381 if (ret)
0382 return ret;
0383
0384 ad7280_delay(st);
0385
0386 for (i = 0; i < cnt; i++) {
0387 ret = __ad7280_read32(st, &tmp);
0388 if (ret)
0389 return ret;
0390
0391 if (ad7280_check_crc(st, tmp))
0392 return -EIO;
0393
0394 if (array)
0395 array[i] = tmp;
0396
0397 if (FIELD_GET(AD7280A_TRANS_READ_CONV_CHANADDR_MSK, tmp) <=
0398 AD7280A_CELL_VOLTAGE_6_REG)
0399 sum += FIELD_GET(AD7280A_TRANS_READ_CONV_DATA_MSK, tmp);
0400 }
0401
0402 return sum;
0403 }
0404
0405 static void ad7280_sw_power_down(void *data)
0406 {
0407 struct ad7280_state *st = data;
0408
0409 ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_HB_REG, 1,
0410 AD7280A_CTRL_HB_PWRDN_SW |
0411 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK, st->oversampling_ratio));
0412 }
0413
0414 static int ad7280_chain_setup(struct ad7280_state *st)
0415 {
0416 unsigned int val, n;
0417 int ret;
0418
0419 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_LB_REG, 1,
0420 FIELD_PREP(AD7280A_CTRL_LB_DAISY_CHAIN_RB_MSK, 1) |
0421 FIELD_PREP(AD7280A_CTRL_LB_LOCK_DEV_ADDR_MSK, 1) |
0422 AD7280A_CTRL_LB_MUST_SET |
0423 FIELD_PREP(AD7280A_CTRL_LB_SWRST_MSK, 1) |
0424 st->ctrl_lb);
0425 if (ret)
0426 return ret;
0427
0428 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_LB_REG, 1,
0429 FIELD_PREP(AD7280A_CTRL_LB_DAISY_CHAIN_RB_MSK, 1) |
0430 FIELD_PREP(AD7280A_CTRL_LB_LOCK_DEV_ADDR_MSK, 1) |
0431 AD7280A_CTRL_LB_MUST_SET |
0432 FIELD_PREP(AD7280A_CTRL_LB_SWRST_MSK, 0) |
0433 st->ctrl_lb);
0434 if (ret)
0435 goto error_power_down;
0436
0437 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_READ_REG, 1,
0438 FIELD_PREP(AD7280A_READ_ADDR_MSK, AD7280A_CTRL_LB_REG));
0439 if (ret)
0440 goto error_power_down;
0441
0442 for (n = 0; n <= AD7280A_MAX_CHAIN; n++) {
0443 ret = __ad7280_read32(st, &val);
0444 if (ret)
0445 goto error_power_down;
0446
0447 if (val == 0)
0448 return n - 1;
0449
0450 if (ad7280_check_crc(st, val)) {
0451 ret = -EIO;
0452 goto error_power_down;
0453 }
0454
0455 if (n != ad7280a_devaddr(FIELD_GET(AD7280A_TRANS_READ_DEVADDR_MSK, val))) {
0456 ret = -EIO;
0457 goto error_power_down;
0458 }
0459 }
0460 ret = -EFAULT;
0461
0462 error_power_down:
0463 ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CTRL_HB_REG, 1,
0464 AD7280A_CTRL_HB_PWRDN_SW |
0465 FIELD_PREP(AD7280A_CTRL_HB_CONV_AVG_MSK, st->oversampling_ratio));
0466
0467 return ret;
0468 }
0469
0470 static ssize_t ad7280_show_balance_sw(struct iio_dev *indio_dev,
0471 uintptr_t private,
0472 const struct iio_chan_spec *chan, char *buf)
0473 {
0474 struct ad7280_state *st = iio_priv(indio_dev);
0475
0476 return sysfs_emit(buf, "%d\n",
0477 !!(st->cb_mask[chan->address >> 8] &
0478 BIT(chan->address & 0xFF)));
0479 }
0480
0481 static ssize_t ad7280_store_balance_sw(struct iio_dev *indio_dev,
0482 uintptr_t private,
0483 const struct iio_chan_spec *chan,
0484 const char *buf, size_t len)
0485 {
0486 struct ad7280_state *st = iio_priv(indio_dev);
0487 unsigned int devaddr, ch;
0488 bool readin;
0489 int ret;
0490
0491 ret = kstrtobool(buf, &readin);
0492 if (ret)
0493 return ret;
0494
0495 devaddr = chan->address >> 8;
0496 ch = chan->address & 0xFF;
0497
0498 mutex_lock(&st->lock);
0499 if (readin)
0500 st->cb_mask[devaddr] |= BIT(ch);
0501 else
0502 st->cb_mask[devaddr] &= ~BIT(ch);
0503
0504 ret = ad7280_write(st, devaddr, AD7280A_CELL_BALANCE_REG, 0,
0505 FIELD_PREP(AD7280A_CELL_BALANCE_CHAN_BITMAP_MSK,
0506 st->cb_mask[devaddr]));
0507 mutex_unlock(&st->lock);
0508
0509 return ret ? ret : len;
0510 }
0511
0512 static ssize_t ad7280_show_balance_timer(struct iio_dev *indio_dev,
0513 uintptr_t private,
0514 const struct iio_chan_spec *chan,
0515 char *buf)
0516 {
0517 struct ad7280_state *st = iio_priv(indio_dev);
0518 unsigned int msecs;
0519 int ret;
0520
0521 mutex_lock(&st->lock);
0522 ret = ad7280_read_reg(st, chan->address >> 8,
0523 (chan->address & 0xFF) + AD7280A_CB1_TIMER_REG);
0524 mutex_unlock(&st->lock);
0525
0526 if (ret < 0)
0527 return ret;
0528
0529 msecs = FIELD_GET(AD7280A_CB_TIMER_VAL_MSK, ret) * 71500;
0530
0531 return sysfs_emit(buf, "%u.%u\n", msecs / 1000, msecs % 1000);
0532 }
0533
0534 static ssize_t ad7280_store_balance_timer(struct iio_dev *indio_dev,
0535 uintptr_t private,
0536 const struct iio_chan_spec *chan,
0537 const char *buf, size_t len)
0538 {
0539 struct ad7280_state *st = iio_priv(indio_dev);
0540 int val, val2;
0541 int ret;
0542
0543 ret = iio_str_to_fixpoint(buf, 1000, &val, &val2);
0544 if (ret)
0545 return ret;
0546
0547 val = val * 1000 + val2;
0548 val /= 71500;
0549
0550 if (val > 31)
0551 return -EINVAL;
0552
0553 mutex_lock(&st->lock);
0554 ret = ad7280_write(st, chan->address >> 8,
0555 (chan->address & 0xFF) + AD7280A_CB1_TIMER_REG, 0,
0556 FIELD_PREP(AD7280A_CB_TIMER_VAL_MSK, val));
0557 mutex_unlock(&st->lock);
0558
0559 return ret ? ret : len;
0560 }
0561
0562 static const struct iio_chan_spec_ext_info ad7280_cell_ext_info[] = {
0563 {
0564 .name = "balance_switch_en",
0565 .read = ad7280_show_balance_sw,
0566 .write = ad7280_store_balance_sw,
0567 .shared = IIO_SEPARATE,
0568 }, {
0569 .name = "balance_switch_timer",
0570 .read = ad7280_show_balance_timer,
0571 .write = ad7280_store_balance_timer,
0572 .shared = IIO_SEPARATE,
0573 },
0574 {}
0575 };
0576
0577 static const struct iio_event_spec ad7280_events[] = {
0578 {
0579 .type = IIO_EV_TYPE_THRESH,
0580 .dir = IIO_EV_DIR_RISING,
0581 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE),
0582 }, {
0583 .type = IIO_EV_TYPE_THRESH,
0584 .dir = IIO_EV_DIR_FALLING,
0585 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE),
0586 },
0587 };
0588
0589 static void ad7280_voltage_channel_init(struct iio_chan_spec *chan, int i,
0590 bool irq_present)
0591 {
0592 chan->type = IIO_VOLTAGE;
0593 chan->differential = 1;
0594 chan->channel = i;
0595 chan->channel2 = chan->channel + 1;
0596 if (irq_present) {
0597 chan->event_spec = ad7280_events;
0598 chan->num_event_specs = ARRAY_SIZE(ad7280_events);
0599 }
0600 chan->ext_info = ad7280_cell_ext_info;
0601 }
0602
0603 static void ad7280_temp_channel_init(struct iio_chan_spec *chan, int i,
0604 bool irq_present)
0605 {
0606 chan->type = IIO_TEMP;
0607 chan->channel = i;
0608 if (irq_present) {
0609 chan->event_spec = ad7280_events;
0610 chan->num_event_specs = ARRAY_SIZE(ad7280_events);
0611 }
0612 }
0613
0614 static void ad7280_common_fields_init(struct iio_chan_spec *chan, int addr,
0615 int cnt)
0616 {
0617 chan->indexed = 1;
0618 chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
0619 chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE);
0620 chan->info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO);
0621 chan->address = addr;
0622 chan->scan_index = cnt;
0623 chan->scan_type.sign = 'u';
0624 chan->scan_type.realbits = 12;
0625 chan->scan_type.storagebits = 32;
0626 }
0627
0628 static void ad7280_total_voltage_channel_init(struct iio_chan_spec *chan,
0629 int cnt, int dev)
0630 {
0631 chan->type = IIO_VOLTAGE;
0632 chan->differential = 1;
0633 chan->channel = 0;
0634 chan->channel2 = dev * AD7280A_CELLS_PER_DEV;
0635 chan->address = AD7280A_ALL_CELLS;
0636 chan->indexed = 1;
0637 chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
0638 chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE);
0639 chan->scan_index = cnt;
0640 chan->scan_type.sign = 'u';
0641 chan->scan_type.realbits = 32;
0642 chan->scan_type.storagebits = 32;
0643 }
0644
0645 static void ad7280_init_dev_channels(struct ad7280_state *st, int dev, int *cnt,
0646 bool irq_present)
0647 {
0648 int addr, ch, i;
0649 struct iio_chan_spec *chan;
0650
0651 for (ch = AD7280A_CELL_VOLTAGE_1_REG; ch <= AD7280A_AUX_ADC_6_REG; ch++) {
0652 chan = &st->channels[*cnt];
0653
0654 if (ch < AD7280A_AUX_ADC_1_REG) {
0655 i = AD7280A_CALC_VOLTAGE_CHAN_NUM(dev, ch);
0656 ad7280_voltage_channel_init(chan, i, irq_present);
0657 } else {
0658 i = AD7280A_CALC_TEMP_CHAN_NUM(dev, ch);
0659 ad7280_temp_channel_init(chan, i, irq_present);
0660 }
0661
0662 addr = ad7280a_devaddr(dev) << 8 | ch;
0663 ad7280_common_fields_init(chan, addr, *cnt);
0664
0665 (*cnt)++;
0666 }
0667 }
0668
0669 static int ad7280_channel_init(struct ad7280_state *st, bool irq_present)
0670 {
0671 int dev, cnt = 0;
0672
0673 st->channels = devm_kcalloc(&st->spi->dev, (st->slave_num + 1) * 12 + 1,
0674 sizeof(*st->channels), GFP_KERNEL);
0675 if (!st->channels)
0676 return -ENOMEM;
0677
0678 for (dev = 0; dev <= st->slave_num; dev++)
0679 ad7280_init_dev_channels(st, dev, &cnt, irq_present);
0680
0681 ad7280_total_voltage_channel_init(&st->channels[cnt], cnt, dev);
0682
0683 return cnt + 1;
0684 }
0685
0686 static int ad7280a_read_thresh(struct iio_dev *indio_dev,
0687 const struct iio_chan_spec *chan,
0688 enum iio_event_type type,
0689 enum iio_event_direction dir,
0690 enum iio_event_info info, int *val, int *val2)
0691 {
0692 struct ad7280_state *st = iio_priv(indio_dev);
0693
0694 switch (chan->type) {
0695 case IIO_VOLTAGE:
0696 switch (dir) {
0697 case IIO_EV_DIR_RISING:
0698 *val = 1000 + (st->cell_threshhigh * 1568L) / 100;
0699 return IIO_VAL_INT;
0700 case IIO_EV_DIR_FALLING:
0701 *val = 1000 + (st->cell_threshlow * 1568L) / 100;
0702 return IIO_VAL_INT;
0703 default:
0704 return -EINVAL;
0705 }
0706 break;
0707 case IIO_TEMP:
0708 switch (dir) {
0709 case IIO_EV_DIR_RISING:
0710 *val = ((st->aux_threshhigh) * 196L) / 10;
0711 return IIO_VAL_INT;
0712 case IIO_EV_DIR_FALLING:
0713 *val = (st->aux_threshlow * 196L) / 10;
0714 return IIO_VAL_INT;
0715 default:
0716 return -EINVAL;
0717 }
0718 break;
0719 default:
0720 return -EINVAL;
0721 }
0722 }
0723
0724 static int ad7280a_write_thresh(struct iio_dev *indio_dev,
0725 const struct iio_chan_spec *chan,
0726 enum iio_event_type type,
0727 enum iio_event_direction dir,
0728 enum iio_event_info info,
0729 int val, int val2)
0730 {
0731 struct ad7280_state *st = iio_priv(indio_dev);
0732 unsigned int addr;
0733 long value;
0734 int ret;
0735
0736 if (val2 != 0)
0737 return -EINVAL;
0738
0739 mutex_lock(&st->lock);
0740 switch (chan->type) {
0741 case IIO_VOLTAGE:
0742 value = ((val - 1000) * 100) / 1568;
0743 value = clamp(value, 0L, 0xFFL);
0744 switch (dir) {
0745 case IIO_EV_DIR_RISING:
0746 addr = AD7280A_CELL_OVERVOLTAGE_REG;
0747 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, addr,
0748 1, value);
0749 if (ret)
0750 break;
0751 st->cell_threshhigh = value;
0752 break;
0753 case IIO_EV_DIR_FALLING:
0754 addr = AD7280A_CELL_UNDERVOLTAGE_REG;
0755 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, addr,
0756 1, value);
0757 if (ret)
0758 break;
0759 st->cell_threshlow = value;
0760 break;
0761 default:
0762 ret = -EINVAL;
0763 goto err_unlock;
0764 }
0765 break;
0766 case IIO_TEMP:
0767 value = (val * 10) / 196;
0768 value = clamp(value, 0L, 0xFFL);
0769 switch (dir) {
0770 case IIO_EV_DIR_RISING:
0771 addr = AD7280A_AUX_ADC_OVERVOLTAGE_REG;
0772 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, addr,
0773 1, value);
0774 if (ret)
0775 break;
0776 st->aux_threshhigh = value;
0777 break;
0778 case IIO_EV_DIR_FALLING:
0779 addr = AD7280A_AUX_ADC_UNDERVOLTAGE_REG;
0780 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, addr,
0781 1, value);
0782 if (ret)
0783 break;
0784 st->aux_threshlow = value;
0785 break;
0786 default:
0787 ret = -EINVAL;
0788 goto err_unlock;
0789 }
0790 break;
0791 default:
0792 ret = -EINVAL;
0793 goto err_unlock;
0794 }
0795
0796 err_unlock:
0797 mutex_unlock(&st->lock);
0798
0799 return ret;
0800 }
0801
0802 static irqreturn_t ad7280_event_handler(int irq, void *private)
0803 {
0804 struct iio_dev *indio_dev = private;
0805 struct ad7280_state *st = iio_priv(indio_dev);
0806 unsigned int *channels;
0807 int i, ret;
0808
0809 channels = kcalloc(st->scan_cnt, sizeof(*channels), GFP_KERNEL);
0810 if (!channels)
0811 return IRQ_HANDLED;
0812
0813 ret = ad7280_read_all_channels(st, st->scan_cnt, channels);
0814 if (ret < 0)
0815 goto out;
0816
0817 for (i = 0; i < st->scan_cnt; i++) {
0818 unsigned int val;
0819
0820 val = FIELD_GET(AD7280A_TRANS_READ_CONV_DATA_MSK, channels[i]);
0821 if (FIELD_GET(AD7280A_TRANS_READ_CONV_CHANADDR_MSK, channels[i]) <=
0822 AD7280A_CELL_VOLTAGE_6_REG) {
0823 if (val >= st->cell_threshhigh) {
0824 u64 tmp = IIO_EVENT_CODE(IIO_VOLTAGE, 1, 0,
0825 IIO_EV_DIR_RISING,
0826 IIO_EV_TYPE_THRESH,
0827 0, 0, 0);
0828 iio_push_event(indio_dev, tmp,
0829 iio_get_time_ns(indio_dev));
0830 } else if (val <= st->cell_threshlow) {
0831 u64 tmp = IIO_EVENT_CODE(IIO_VOLTAGE, 1, 0,
0832 IIO_EV_DIR_FALLING,
0833 IIO_EV_TYPE_THRESH,
0834 0, 0, 0);
0835 iio_push_event(indio_dev, tmp,
0836 iio_get_time_ns(indio_dev));
0837 }
0838 } else {
0839 if (val >= st->aux_threshhigh) {
0840 u64 tmp = IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
0841 IIO_EV_TYPE_THRESH,
0842 IIO_EV_DIR_RISING);
0843 iio_push_event(indio_dev, tmp,
0844 iio_get_time_ns(indio_dev));
0845 } else if (val <= st->aux_threshlow) {
0846 u64 tmp = IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
0847 IIO_EV_TYPE_THRESH,
0848 IIO_EV_DIR_FALLING);
0849 iio_push_event(indio_dev, tmp,
0850 iio_get_time_ns(indio_dev));
0851 }
0852 }
0853 }
0854
0855 out:
0856 kfree(channels);
0857
0858 return IRQ_HANDLED;
0859 }
0860
0861 static void ad7280_update_delay(struct ad7280_state *st)
0862 {
0863
0864
0865
0866
0867
0868
0869
0870
0871 st->readback_delay_us =
0872 ((ad7280a_t_acq_ns[st->acquisition_time & 0x3] + 720) *
0873 (AD7280A_NUM_CH * ad7280a_n_avg[st->oversampling_ratio & 0x3])) -
0874 ad7280a_t_acq_ns[st->acquisition_time & 0x3] + st->slave_num * 250;
0875
0876
0877 st->readback_delay_us = DIV_ROUND_UP(st->readback_delay_us, 1000);
0878 st->readback_delay_us += 5;
0879 }
0880
0881 static int ad7280_read_raw(struct iio_dev *indio_dev,
0882 struct iio_chan_spec const *chan,
0883 int *val,
0884 int *val2,
0885 long m)
0886 {
0887 struct ad7280_state *st = iio_priv(indio_dev);
0888 int ret;
0889
0890 switch (m) {
0891 case IIO_CHAN_INFO_RAW:
0892 mutex_lock(&st->lock);
0893 if (chan->address == AD7280A_ALL_CELLS)
0894 ret = ad7280_read_all_channels(st, st->scan_cnt, NULL);
0895 else
0896 ret = ad7280_read_channel(st, chan->address >> 8,
0897 chan->address & 0xFF);
0898 mutex_unlock(&st->lock);
0899
0900 if (ret < 0)
0901 return ret;
0902
0903 *val = ret;
0904
0905 return IIO_VAL_INT;
0906 case IIO_CHAN_INFO_SCALE:
0907 if ((chan->address & 0xFF) <= AD7280A_CELL_VOLTAGE_6_REG)
0908 *val = 4000;
0909 else
0910 *val = 5000;
0911
0912 *val2 = AD7280A_BITS;
0913 return IIO_VAL_FRACTIONAL_LOG2;
0914 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
0915 *val = ad7280a_n_avg[st->oversampling_ratio];
0916 return IIO_VAL_INT;
0917 }
0918 return -EINVAL;
0919 }
0920
0921 static int ad7280_write_raw(struct iio_dev *indio_dev,
0922 struct iio_chan_spec const *chan,
0923 int val, int val2, long mask)
0924 {
0925 struct ad7280_state *st = iio_priv(indio_dev);
0926 int i;
0927
0928 switch (mask) {
0929 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
0930 if (val2 != 0)
0931 return -EINVAL;
0932 for (i = 0; i < ARRAY_SIZE(ad7280a_n_avg); i++) {
0933 if (val == ad7280a_n_avg[i]) {
0934 st->oversampling_ratio = i;
0935 ad7280_update_delay(st);
0936 return 0;
0937 }
0938 }
0939 return -EINVAL;
0940 default:
0941 return -EINVAL;
0942 }
0943 }
0944
0945 static const struct iio_info ad7280_info = {
0946 .read_raw = ad7280_read_raw,
0947 .write_raw = ad7280_write_raw,
0948 .read_event_value = &ad7280a_read_thresh,
0949 .write_event_value = &ad7280a_write_thresh,
0950 };
0951
0952 static const struct iio_info ad7280_info_no_irq = {
0953 .read_raw = ad7280_read_raw,
0954 .write_raw = ad7280_write_raw,
0955 };
0956
0957 static int ad7280_probe(struct spi_device *spi)
0958 {
0959 struct device *dev = &spi->dev;
0960 struct ad7280_state *st;
0961 int ret;
0962 struct iio_dev *indio_dev;
0963
0964 indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
0965 if (!indio_dev)
0966 return -ENOMEM;
0967
0968 st = iio_priv(indio_dev);
0969 spi_set_drvdata(spi, indio_dev);
0970 st->spi = spi;
0971 mutex_init(&st->lock);
0972
0973 st->thermistor_term_en =
0974 device_property_read_bool(dev, "adi,thermistor-termination");
0975
0976 if (device_property_present(dev, "adi,acquisition-time-ns")) {
0977 u32 val;
0978
0979 ret = device_property_read_u32(dev, "adi,acquisition-time-ns", &val);
0980 if (ret)
0981 return ret;
0982
0983 switch (val) {
0984 case 400:
0985 st->acquisition_time = AD7280A_CTRL_LB_ACQ_TIME_400ns;
0986 break;
0987 case 800:
0988 st->acquisition_time = AD7280A_CTRL_LB_ACQ_TIME_800ns;
0989 break;
0990 case 1200:
0991 st->acquisition_time = AD7280A_CTRL_LB_ACQ_TIME_1200ns;
0992 break;
0993 case 1600:
0994 st->acquisition_time = AD7280A_CTRL_LB_ACQ_TIME_1600ns;
0995 break;
0996 default:
0997 dev_err(dev, "Firmware provided acquisition time is invalid\n");
0998 return -EINVAL;
0999 }
1000 } else {
1001 st->acquisition_time = AD7280A_CTRL_LB_ACQ_TIME_400ns;
1002 }
1003
1004
1005 if (device_property_present(dev, "adi,voltage-alert-last-chan")) {
1006 u32 val;
1007
1008 ret = device_property_read_u32(dev, "adi,voltage-alert-last-chan", &val);
1009 if (ret)
1010 return ret;
1011
1012 switch (val) {
1013 case 3:
1014 st->chain_last_alert_ignore |= AD7280A_ALERT_REMOVE_VIN4_VIN5;
1015 break;
1016 case 4:
1017 st->chain_last_alert_ignore |= AD7280A_ALERT_REMOVE_VIN5;
1018 break;
1019 case 5:
1020 break;
1021 default:
1022 dev_err(dev,
1023 "Firmware provided last voltage alert channel invalid\n");
1024 break;
1025 }
1026 }
1027 crc8_populate_msb(st->crc_tab, POLYNOM);
1028
1029 st->spi->max_speed_hz = AD7280A_MAX_SPI_CLK_HZ;
1030 st->spi->mode = SPI_MODE_1;
1031 spi_setup(st->spi);
1032
1033 st->ctrl_lb = FIELD_PREP(AD7280A_CTRL_LB_ACQ_TIME_MSK, st->acquisition_time) |
1034 FIELD_PREP(AD7280A_CTRL_LB_THERMISTOR_MSK, st->thermistor_term_en);
1035 st->oversampling_ratio = 0;
1036
1037 ret = ad7280_chain_setup(st);
1038 if (ret < 0)
1039 return ret;
1040
1041 st->slave_num = ret;
1042 st->scan_cnt = (st->slave_num + 1) * AD7280A_NUM_CH;
1043 st->cell_threshhigh = 0xFF;
1044 st->aux_threshhigh = 0xFF;
1045
1046 ret = devm_add_action_or_reset(dev, ad7280_sw_power_down, st);
1047 if (ret)
1048 return ret;
1049
1050 ad7280_update_delay(st);
1051
1052 indio_dev->name = spi_get_device_id(spi)->name;
1053 indio_dev->modes = INDIO_DIRECT_MODE;
1054
1055 ret = ad7280_channel_init(st, spi->irq > 0);
1056 if (ret < 0)
1057 return ret;
1058
1059 indio_dev->num_channels = ret;
1060 indio_dev->channels = st->channels;
1061 if (spi->irq > 0) {
1062 ret = ad7280_write(st, AD7280A_DEVADDR_MASTER,
1063 AD7280A_ALERT_REG, 1,
1064 AD7280A_ALERT_RELAY_SIG_CHAIN_DOWN);
1065 if (ret)
1066 return ret;
1067
1068 ret = ad7280_write(st, ad7280a_devaddr(st->slave_num),
1069 AD7280A_ALERT_REG, 0,
1070 AD7280A_ALERT_GEN_STATIC_HIGH |
1071 FIELD_PREP(AD7280A_ALERT_REMOVE_MSK,
1072 st->chain_last_alert_ignore));
1073 if (ret)
1074 return ret;
1075
1076 ret = devm_request_threaded_irq(dev, spi->irq,
1077 NULL,
1078 ad7280_event_handler,
1079 IRQF_TRIGGER_FALLING |
1080 IRQF_ONESHOT,
1081 indio_dev->name,
1082 indio_dev);
1083 if (ret)
1084 return ret;
1085
1086 indio_dev->info = &ad7280_info;
1087 } else {
1088 indio_dev->info = &ad7280_info_no_irq;
1089 }
1090
1091 return devm_iio_device_register(dev, indio_dev);
1092 }
1093
1094 static const struct spi_device_id ad7280_id[] = {
1095 {"ad7280a", 0},
1096 {}
1097 };
1098 MODULE_DEVICE_TABLE(spi, ad7280_id);
1099
1100 static struct spi_driver ad7280_driver = {
1101 .driver = {
1102 .name = "ad7280",
1103 },
1104 .probe = ad7280_probe,
1105 .id_table = ad7280_id,
1106 };
1107 module_spi_driver(ad7280_driver);
1108
1109 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
1110 MODULE_DESCRIPTION("Analog Devices AD7280A");
1111 MODULE_LICENSE("GPL v2");