1 // SPDX-License-Identifier: GPL-2.0+
3 * IIO driver for MCP356X/MCP356XR and MCP346X/MCP346XR series ADC chip family
5 * Copyright (C) 2022-2023 Microchip Technology Inc. and its subsidiaries
9 * Datasheet for MCP3561, MCP3562, MCP3564 can be found here:
10 * https://ww1.microchip.com/downloads/aemDocuments/documents/MSLD/ProductDocuments/DataSheets/MCP3561-2-4-Family-Data-Sheet-DS20006181C.pdf
11 * Datasheet for MCP3561R, MCP3562R, MCP3564R can be found here:
12 * https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP3561_2_4R-Data-Sheet-DS200006391C.pdf
13 * Datasheet for MCP3461, MCP3462, MCP3464 can be found here:
14 * https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP3461-2-4-Two-Four-Eight-Channel-153.6-ksps-Low-Noise-16-Bit-Delta-Sigma-ADC-Data-Sheet-20006180D.pdf
15 * Datasheet for MCP3461R, MCP3462R, MCP3464R can be found here:
16 * https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP3461-2-4R-Family-Data-Sheet-DS20006404C.pdf
19 #include <linux/bitfield.h>
20 #include <linux/iopoll.h>
21 #include <linux/regulator/consumer.h>
22 #include <linux/spi/spi.h>
23 #include <linux/units.h>
24 #include <linux/util_macros.h>
26 #include <linux/iio/iio.h>
27 #include <linux/iio/sysfs.h>
29 #define MCP3564_ADCDATA_REG 0x00
31 #define MCP3564_CONFIG0_REG 0x01
32 #define MCP3564_CONFIG0_ADC_MODE_MASK GENMASK(1, 0)
33 /* Current Source/Sink Selection Bits for Sensor Bias */
34 #define MCP3564_CONFIG0_CS_SEL_MASK GENMASK(3, 2)
35 /* Internal clock is selected and AMCLK is present on the analog master clock output pin */
36 #define MCP3564_CONFIG0_USE_INT_CLK_OUTPUT_EN 0x03
37 /* Internal clock is selected and no clock output is present on the CLK pin */
38 #define MCP3564_CONFIG0_USE_INT_CLK 0x02
39 /* External digital clock */
40 #define MCP3564_CONFIG0_USE_EXT_CLK 0x01
41 /* External digital clock (default) */
42 #define MCP3564_CONFIG0_USE_EXT_CLK_DEFAULT 0x00
43 #define MCP3564_CONFIG0_CLK_SEL_MASK GENMASK(5, 4)
44 #define MCP3456_CONFIG0_BIT6_DEFAULT BIT(6)
45 #define MCP3456_CONFIG0_VREF_MASK BIT(7)
47 #define MCP3564_CONFIG1_REG 0x02
48 #define MCP3564_CONFIG1_OVERSPL_RATIO_MASK GENMASK(5, 2)
50 #define MCP3564_CONFIG2_REG 0x03
51 #define MCP3564_CONFIG2_AZ_REF_MASK BIT(1)
52 #define MCP3564_CONFIG2_AZ_MUX_MASK BIT(2)
54 #define MCP3564_CONFIG2_HARDWARE_GAIN_MASK GENMASK(5, 3)
55 #define MCP3564_DEFAULT_HARDWARE_GAIN 0x01
56 #define MCP3564_CONFIG2_BOOST_CURRENT_MASK GENMASK(7, 6)
58 #define MCP3564_CONFIG3_REG 0x04
59 #define MCP3464_CONFIG3_EN_GAINCAL_MASK BIT(0)
60 #define MCP3464_CONFIG3_EN_OFFCAL_MASK BIT(1)
61 #define MCP3464_CONFIG3_EN_CRCCOM_MASK BIT(2)
62 #define MCP3464_CONFIG3_CRC_FORMAT_MASK BIT(3)
64 * ADC Output Data Format 32-bit (25-bit right justified data + Channel ID):
65 * CHID[3:0] + SGN extension (4 bits) + 24-bit ADC data.
66 * It allows overrange with the SGN extension.
68 #define MCP3464_CONFIG3_DATA_FMT_32B_WITH_CH_ID 3
70 * ADC Output Data Format 32-bit (25-bit right justified data):
71 * SGN extension (8-bit) + 24-bit ADC data.
72 * It allows overrange with the SGN extension.
74 #define MCP3464_CONFIG3_DATA_FMT_32B_SGN_EXT 2
76 * ADC Output Data Format 32-bit (24-bit left justified data):
77 * 24-bit ADC data + 0x00 (8-bit).
78 * It does not allow overrange (ADC code locked to 0xFFFFFF or 0x800000).
80 #define MCP3464_CONFIG3_DATA_FMT_32B_LEFT_JUSTIFIED 1
82 * ADC Output Data Format 24-bit (default ADC coding):
84 * It does not allow overrange (ADC code locked to 0xFFFFFF or 0x800000).
86 #define MCP3464_CONFIG3_DATA_FMT_24B 0
87 #define MCP3464_CONFIG3_DATA_FORMAT_MASK GENMASK(5, 4)
89 /* Continuous Conversion mode or continuous conversion cycle in SCAN mode. */
90 #define MCP3464_CONFIG3_CONV_MODE_CONTINUOUS 3
92 * One-shot conversion or one-shot cycle in SCAN mode. It sets ADC_MODE[1:0] to ‘10’
93 * (standby) at the end of the conversion or at the end of the conversion cycle in SCAN mode.
95 #define MCP3464_CONFIG3_CONV_MODE_ONE_SHOT_STANDBY 2
97 * One-shot conversion or one-shot cycle in SCAN mode. It sets ADC_MODE[1:0] to ‘0x’ (ADC
98 * Shutdown) at the end of the conversion or at the end of the conversion cycle in SCAN
101 #define MCP3464_CONFIG3_CONV_MODE_ONE_SHOT_SHUTDOWN 0
102 #define MCP3464_CONFIG3_CONV_MODE_MASK GENMASK(7, 6)
104 #define MCP3564_IRQ_REG 0x05
105 #define MCP3464_EN_STP_MASK BIT(0)
106 #define MCP3464_EN_FASTCMD_MASK BIT(1)
107 #define MCP3464_IRQ_MODE_0_MASK BIT(2)
108 #define MCP3464_IRQ_MODE_1_MASK BIT(3)
109 #define MCP3564_POR_STATUS_MASK BIT(4)
110 #define MCP3564_CRCCFG_STATUS_MASK BIT(5)
111 #define MCP3564_DATA_READY_MASK BIT(6)
113 #define MCP3564_MUX_REG 0x06
114 #define MCP3564_MUX_VIN_P_MASK GENMASK(7, 4)
115 #define MCP3564_MUX_VIN_N_MASK GENMASK(3, 0)
116 #define MCP3564_MUX_SET(x, y) (FIELD_PREP(MCP3564_MUX_VIN_P_MASK, (x)) | \
117 FIELD_PREP(MCP3564_MUX_VIN_N_MASK, (y)))
119 #define MCP3564_SCAN_REG 0x07
120 #define MCP3564_SCAN_CH_SEL_MASK GENMASK(15, 0)
121 #define MCP3564_SCAN_CH_SEL_SET(x) FIELD_PREP(MCP3564_SCAN_CH_SEL_MASK, (x))
122 #define MCP3564_SCAN_DELAY_TIME_MASK GENMASK(23, 21)
123 #define MCP3564_SCAN_DELAY_TIME_SET(x) FIELD_PREP(MCP3564_SCAN_DELAY_TIME_MASK, (x))
124 #define MCP3564_SCAN_DEFAULT_VALUE 0
126 #define MCP3564_TIMER_REG 0x08
127 #define MCP3564_TIMER_DEFAULT_VALUE 0
129 #define MCP3564_OFFSETCAL_REG 0x09
130 #define MCP3564_DEFAULT_OFFSETCAL 0
132 #define MCP3564_GAINCAL_REG 0x0A
133 #define MCP3564_DEFAULT_GAINCAL 0x00800000
135 #define MCP3564_RESERVED_B_REG 0x0B
137 #define MCP3564_RESERVED_C_REG 0x0C
138 #define MCP3564_C_REG_DEFAULT 0x50
139 #define MCP3564R_C_REG_DEFAULT 0x30
141 #define MCP3564_LOCK_REG 0x0D
142 #define MCP3564_LOCK_WRITE_ACCESS_PASSWORD 0xA5
143 #define MCP3564_RESERVED_E_REG 0x0E
144 #define MCP3564_CRCCFG_REG 0x0F
146 #define MCP3564_CMD_HW_ADDR_MASK GENMASK(7, 6)
147 #define MCP3564_CMD_ADDR_MASK GENMASK(5, 2)
149 #define MCP3564_HW_ADDR_MASK GENMASK(1, 0)
151 #define MCP3564_FASTCMD_START 0x0A
152 #define MCP3564_FASTCMD_RESET 0x0E
154 #define MCP3461_HW_ID 0x0008
155 #define MCP3462_HW_ID 0x0009
156 #define MCP3464_HW_ID 0x000B
158 #define MCP3561_HW_ID 0x000C
159 #define MCP3562_HW_ID 0x000D
160 #define MCP3564_HW_ID 0x000F
161 #define MCP3564_HW_ID_MASK GENMASK(3, 0)
163 #define MCP3564R_INT_VREF_MV 2400
165 #define MCP3564_DATA_READY_TIMEOUT_MS 2000
167 #define MCP3564_MAX_PGA 8
168 #define MCP3564_MAX_BURNOUT_IDX 4
169 #define MCP3564_MAX_CHANNELS 66
186 enum mcp3564_delay_time {
188 MCP3564_DELAY_8_DMCLK,
189 MCP3564_DELAY_16_DMCLK,
190 MCP3564_DELAY_32_DMCLK,
191 MCP3564_DELAY_64_DMCLK,
192 MCP3564_DELAY_128_DMCLK,
193 MCP3564_DELAY_256_DMCLK,
194 MCP3564_DELAY_512_DMCLK
197 enum mcp3564_adc_conversion_mode {
198 MCP3564_ADC_MODE_DEFAULT,
199 MCP3564_ADC_MODE_SHUTDOWN,
200 MCP3564_ADC_MODE_STANDBY,
201 MCP3564_ADC_MODE_CONVERSION
204 enum mcp3564_adc_bias_current {
205 MCP3564_BOOST_CURRENT_x0_50,
206 MCP3564_BOOST_CURRENT_x0_66,
207 MCP3564_BOOST_CURRENT_x1_00,
208 MCP3564_BOOST_CURRENT_x2_00
211 enum mcp3564_burnout {
212 MCP3564_CONFIG0_CS_SEL_0_0_uA,
213 MCP3564_CONFIG0_CS_SEL_0_9_uA,
214 MCP3564_CONFIG0_CS_SEL_3_7_uA,
215 MCP3564_CONFIG0_CS_SEL_15_uA
218 enum mcp3564_channel_names {
229 MCP3564_RESERVED, /* do not use */
232 MCP3564_TEMP_DIODE_P,
233 MCP3564_TEMP_DIODE_M,
234 MCP3564_INTERNAL_VCM,
237 enum mcp3564_oversampling {
238 MCP3564_OVERSAMPLING_RATIO_32,
239 MCP3564_OVERSAMPLING_RATIO_64,
240 MCP3564_OVERSAMPLING_RATIO_128,
241 MCP3564_OVERSAMPLING_RATIO_256,
242 MCP3564_OVERSAMPLING_RATIO_512,
243 MCP3564_OVERSAMPLING_RATIO_1024,
244 MCP3564_OVERSAMPLING_RATIO_2048,
245 MCP3564_OVERSAMPLING_RATIO_4096,
246 MCP3564_OVERSAMPLING_RATIO_8192,
247 MCP3564_OVERSAMPLING_RATIO_16384,
248 MCP3564_OVERSAMPLING_RATIO_20480,
249 MCP3564_OVERSAMPLING_RATIO_24576,
250 MCP3564_OVERSAMPLING_RATIO_40960,
251 MCP3564_OVERSAMPLING_RATIO_49152,
252 MCP3564_OVERSAMPLING_RATIO_81920,
253 MCP3564_OVERSAMPLING_RATIO_98304
256 static const unsigned int mcp3564_oversampling_avail[] = {
257 [MCP3564_OVERSAMPLING_RATIO_32] = 32,
258 [MCP3564_OVERSAMPLING_RATIO_64] = 64,
259 [MCP3564_OVERSAMPLING_RATIO_128] = 128,
260 [MCP3564_OVERSAMPLING_RATIO_256] = 256,
261 [MCP3564_OVERSAMPLING_RATIO_512] = 512,
262 [MCP3564_OVERSAMPLING_RATIO_1024] = 1024,
263 [MCP3564_OVERSAMPLING_RATIO_2048] = 2048,
264 [MCP3564_OVERSAMPLING_RATIO_4096] = 4096,
265 [MCP3564_OVERSAMPLING_RATIO_8192] = 8192,
266 [MCP3564_OVERSAMPLING_RATIO_16384] = 16384,
267 [MCP3564_OVERSAMPLING_RATIO_20480] = 20480,
268 [MCP3564_OVERSAMPLING_RATIO_24576] = 24576,
269 [MCP3564_OVERSAMPLING_RATIO_40960] = 40960,
270 [MCP3564_OVERSAMPLING_RATIO_49152] = 49152,
271 [MCP3564_OVERSAMPLING_RATIO_81920] = 81920,
272 [MCP3564_OVERSAMPLING_RATIO_98304] = 98304
276 * Current Source/Sink Selection Bits for Sensor Bias (source on VIN+/sink on VIN-)
278 static const int mcp3564_burnout_avail[][2] = {
279 [MCP3564_CONFIG0_CS_SEL_0_0_uA] = { 0, 0 },
280 [MCP3564_CONFIG0_CS_SEL_0_9_uA] = { 0, 900 },
281 [MCP3564_CONFIG0_CS_SEL_3_7_uA] = { 0, 3700 },
282 [MCP3564_CONFIG0_CS_SEL_15_uA] = { 0, 15000 }
286 * BOOST[1:0]: ADC Bias Current Selection
288 static const char * const mcp3564_boost_current_avail[] = {
289 [MCP3564_BOOST_CURRENT_x0_50] = "0.5",
290 [MCP3564_BOOST_CURRENT_x0_66] = "0.66",
291 [MCP3564_BOOST_CURRENT_x1_00] = "1",
292 [MCP3564_BOOST_CURRENT_x2_00] = "2",
296 * Calibration bias values
298 static const int mcp3564_calib_bias[] = {
299 -8388608, /* min: -2^23 */
301 8388607 /* max: 2^23 - 1 */
305 * Calibration scale values
306 * The Gain Error Calibration register (GAINCAL) is an
307 * unsigned 24-bit register that holds the digital gain error
308 * calibration value, GAINCAL which could be calculated by
309 * GAINCAL (V/V) = (GAINCAL[23:0])/8388608
310 * The gain error calibration value range in equivalent voltage is [0; 2-2^(-23)]
312 static const unsigned int mcp3564_calib_scale[] = {
314 1, /* step: 1/8388608 */
315 16777215 /* max: 2 - 2^(-23) */
318 /* Programmable hardware gain x1/3, x1, x2, x4, x8, x16, x32, x64 */
319 static const int mcp3564_hwgain_frac[] = {
330 static const char *mcp3564_channel_labels[2] = {
331 "burnout_current", "temperature",
335 * struct mcp3564_chip_info - chip specific data
337 * @num_channels: number of channels
338 * @resolution: ADC resolution
339 * @have_vref: does the hardware have an internal voltage reference?
341 struct mcp3564_chip_info {
343 unsigned int num_channels;
344 unsigned int resolution;
349 * struct mcp3564_state - working data for a ADC device
350 * @chip_info: chip specific data
351 * @spi: SPI device structure
352 * @vref: the regulator device used as a voltage reference in case
353 * external voltage reference is used
354 * @vref_mv: voltage reference value in miliVolts
355 * @lock: synchronize access to driver's state members
356 * @dev_addr: hardware device address
357 * @oversampling: the index inside oversampling list of the ADC
358 * @hwgain: the index inside hardware gain list of the ADC
359 * @scale_tbls: table with precalculated scale
360 * @calib_bias: calibration bias value
361 * @calib_scale: calibration scale value
362 * @current_boost_mode: the index inside current boost list of the ADC
363 * @burnout_mode: the index inside current bias list of the ADC
364 * @auto_zeroing_mux: set if ADC auto-zeroing algorithm is enabled
365 * @auto_zeroing_ref: set if ADC auto-Zeroing Reference Buffer Setting is enabled
366 * @have_vref: does the ADC have an internal voltage reference?
367 * @labels: table with channels labels
369 struct mcp3564_state {
370 const struct mcp3564_chip_info *chip_info;
371 struct spi_device *spi;
372 struct regulator *vref;
373 unsigned short vref_mv;
374 struct mutex lock; /* Synchronize access to driver's state members */
376 enum mcp3564_oversampling oversampling;
378 unsigned int scale_tbls[MCP3564_MAX_PGA][2];
381 unsigned int current_boost_mode;
382 enum mcp3564_burnout burnout_mode;
383 bool auto_zeroing_mux;
384 bool auto_zeroing_ref;
386 const char *labels[MCP3564_MAX_CHANNELS];
389 static inline u8 mcp3564_cmd_write(u8 chip_addr, u8 reg)
391 return FIELD_PREP(MCP3564_CMD_HW_ADDR_MASK, chip_addr) |
392 FIELD_PREP(MCP3564_CMD_ADDR_MASK, reg) |
396 static inline u8 mcp3564_cmd_read(u8 chip_addr, u8 reg)
398 return FIELD_PREP(MCP3564_CMD_HW_ADDR_MASK, chip_addr) |
399 FIELD_PREP(MCP3564_CMD_ADDR_MASK, reg) |
403 static int mcp3564_read_8bits(struct mcp3564_state *adc, u8 reg, u8 *val)
409 tx_buf = mcp3564_cmd_read(adc->dev_addr, reg);
411 ret = spi_write_then_read(adc->spi, &tx_buf, sizeof(tx_buf),
412 &rx_buf, sizeof(rx_buf));
418 static int mcp3564_read_16bits(struct mcp3564_state *adc, u8 reg, u16 *val)
424 tx_buf = mcp3564_cmd_read(adc->dev_addr, reg);
426 ret = spi_write_then_read(adc->spi, &tx_buf, sizeof(tx_buf),
427 &rx_buf, sizeof(rx_buf));
428 *val = be16_to_cpu(rx_buf);
433 static int mcp3564_read_32bits(struct mcp3564_state *adc, u8 reg, u32 *val)
439 tx_buf = mcp3564_cmd_read(adc->dev_addr, reg);
441 ret = spi_write_then_read(adc->spi, &tx_buf, sizeof(tx_buf),
442 &rx_buf, sizeof(rx_buf));
443 *val = be32_to_cpu(rx_buf);
448 static int mcp3564_write_8bits(struct mcp3564_state *adc, u8 reg, u8 val)
452 tx_buf[0] = mcp3564_cmd_write(adc->dev_addr, reg);
455 return spi_write_then_read(adc->spi, tx_buf, sizeof(tx_buf), NULL, 0);
458 static int mcp3564_write_24bits(struct mcp3564_state *adc, u8 reg, u32 val)
462 val |= (mcp3564_cmd_write(adc->dev_addr, reg) << 24);
463 val_be = cpu_to_be32(val);
465 return spi_write_then_read(adc->spi, &val_be, sizeof(val_be), NULL, 0);
468 static int mcp3564_fast_cmd(struct mcp3564_state *adc, u8 fast_cmd)
472 val = FIELD_PREP(MCP3564_CMD_HW_ADDR_MASK, adc->dev_addr) |
473 FIELD_PREP(MCP3564_CMD_ADDR_MASK, fast_cmd);
475 return spi_write_then_read(adc->spi, &val, 1, NULL, 0);
478 static int mcp3564_update_8bits(struct mcp3564_state *adc, u8 reg, u32 mask, u8 val)
485 ret = mcp3564_read_8bits(adc, reg, &tmp);
492 return mcp3564_write_8bits(adc, reg, tmp);
495 static int mcp3564_set_current_boost_mode(struct iio_dev *indio_dev,
496 const struct iio_chan_spec *chan,
499 struct mcp3564_state *adc = iio_priv(indio_dev);
502 dev_dbg(&indio_dev->dev, "%s: %d\n", __func__, mode);
504 mutex_lock(&adc->lock);
505 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG2_REG, MCP3564_CONFIG2_BOOST_CURRENT_MASK,
506 FIELD_PREP(MCP3564_CONFIG2_BOOST_CURRENT_MASK, mode));
509 dev_err(&indio_dev->dev, "Failed to configure CONFIG2 register\n");
511 adc->current_boost_mode = mode;
513 mutex_unlock(&adc->lock);
518 static int mcp3564_get_current_boost_mode(struct iio_dev *indio_dev,
519 const struct iio_chan_spec *chan)
521 struct mcp3564_state *adc = iio_priv(indio_dev);
523 return adc->current_boost_mode;
526 static const struct iio_enum mcp3564_current_boost_mode_enum = {
527 .items = mcp3564_boost_current_avail,
528 .num_items = ARRAY_SIZE(mcp3564_boost_current_avail),
529 .set = mcp3564_set_current_boost_mode,
530 .get = mcp3564_get_current_boost_mode,
533 static const struct iio_chan_spec_ext_info mcp3564_ext_info[] = {
534 IIO_ENUM("boost_current_gain", IIO_SHARED_BY_ALL, &mcp3564_current_boost_mode_enum),
536 .name = "boost_current_gain_available",
537 .shared = IIO_SHARED_BY_ALL,
538 .read = iio_enum_available_read,
539 .private = (uintptr_t)&mcp3564_current_boost_mode_enum,
544 static ssize_t mcp3564_auto_zeroing_mux_show(struct device *dev,
545 struct device_attribute *attr,
548 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
549 struct mcp3564_state *adc = iio_priv(indio_dev);
551 return sysfs_emit(buf, "%d\n", adc->auto_zeroing_mux);
554 static ssize_t mcp3564_auto_zeroing_mux_store(struct device *dev,
555 struct device_attribute *attr,
556 const char *buf, size_t len)
558 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
559 struct mcp3564_state *adc = iio_priv(indio_dev);
563 ret = kstrtobool(buf, &auto_zero);
567 mutex_lock(&adc->lock);
568 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG2_REG, MCP3564_CONFIG2_AZ_MUX_MASK,
569 FIELD_PREP(MCP3564_CONFIG2_AZ_MUX_MASK, auto_zero));
572 dev_err(&indio_dev->dev, "Failed to update CONFIG2 register\n");
574 adc->auto_zeroing_mux = auto_zero;
576 mutex_unlock(&adc->lock);
578 return ret ? ret : len;
581 static ssize_t mcp3564_auto_zeroing_ref_show(struct device *dev,
582 struct device_attribute *attr,
585 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
586 struct mcp3564_state *adc = iio_priv(indio_dev);
588 return sysfs_emit(buf, "%d\n", adc->auto_zeroing_ref);
591 static ssize_t mcp3564_auto_zeroing_ref_store(struct device *dev,
592 struct device_attribute *attr,
593 const char *buf, size_t len)
595 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
596 struct mcp3564_state *adc = iio_priv(indio_dev);
600 ret = kstrtobool(buf, &auto_zero);
604 mutex_lock(&adc->lock);
605 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG2_REG, MCP3564_CONFIG2_AZ_REF_MASK,
606 FIELD_PREP(MCP3564_CONFIG2_AZ_REF_MASK, auto_zero));
609 dev_err(&indio_dev->dev, "Failed to update CONFIG2 register\n");
611 adc->auto_zeroing_ref = auto_zero;
613 mutex_unlock(&adc->lock);
615 return ret ? ret : len;
618 static const struct iio_chan_spec mcp3564_channel_template = {
622 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
623 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) |
624 BIT(IIO_CHAN_INFO_CALIBSCALE) |
625 BIT(IIO_CHAN_INFO_CALIBBIAS) |
626 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
627 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SCALE) |
628 BIT(IIO_CHAN_INFO_CALIBSCALE) |
629 BIT(IIO_CHAN_INFO_CALIBBIAS) |
630 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
631 .ext_info = mcp3564_ext_info,
634 static const struct iio_chan_spec mcp3564_temp_channel_template = {
637 .address = ((MCP3564_TEMP_DIODE_P << 4) | MCP3564_TEMP_DIODE_M),
638 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
639 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) |
640 BIT(IIO_CHAN_INFO_CALIBSCALE) |
641 BIT(IIO_CHAN_INFO_CALIBBIAS) |
642 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
643 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SCALE) |
644 BIT(IIO_CHAN_INFO_CALIBSCALE) |
645 BIT(IIO_CHAN_INFO_CALIBBIAS) |
646 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
649 static const struct iio_chan_spec mcp3564_burnout_channel_template = {
653 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
654 .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW),
658 * Number of channels could be calculated:
659 * num_channels = single_ended_input + differential_input + temperature + burnout
660 * Eg. for MCP3561 (only 2 channels available: CH0 and CH1)
661 * single_ended_input = (CH0 - GND), (CH1 - GND) = 2
662 * differential_input = (CH0 - CH1), (CH0 - CH0) = 2
663 * num_channels = 2 + 2 + 2
664 * Generic formula is:
665 * num_channels = P^R(Number_of_single_ended_channels, 2) + 2 (temperature + burnout channels)
666 * P^R(Number_of_single_ended_channels, 2) is Permutations with Replacement of
667 * Number_of_single_ended_channels taken by 2
669 static const struct mcp3564_chip_info mcp3564_chip_infos_tbl[] = {
744 static int mcp3564_read_single_value(struct iio_dev *indio_dev,
745 struct iio_chan_spec const *channel,
748 struct mcp3564_state *adc = iio_priv(indio_dev);
753 ret = mcp3564_write_8bits(adc, MCP3564_MUX_REG, channel->address);
757 /* Start ADC Conversion using fast command (overwrites ADC_MODE[1:0] = 11) */
758 ret = mcp3564_fast_cmd(adc, MCP3564_FASTCMD_START);
763 * Check if the conversion is ready. If not, wait a little bit, and
764 * in case of timeout exit with an error.
766 ret = read_poll_timeout(mcp3564_read_8bits, ret_read,
767 ret_read || !(tmp & MCP3564_DATA_READY_MASK),
768 20000, MCP3564_DATA_READY_TIMEOUT_MS * 1000, true,
769 adc, MCP3564_IRQ_REG, &tmp);
771 /* failed to read status register */
778 if (tmp & MCP3564_DATA_READY_MASK)
779 /* failing to finish conversion */
782 return mcp3564_read_32bits(adc, MCP3564_ADCDATA_REG, val);
785 static int mcp3564_read_avail(struct iio_dev *indio_dev,
786 struct iio_chan_spec const *channel,
787 const int **vals, int *type,
788 int *length, long mask)
790 struct mcp3564_state *adc = iio_priv(indio_dev);
793 case IIO_CHAN_INFO_RAW:
794 if (!channel->output)
797 *vals = mcp3564_burnout_avail[0];
798 *length = ARRAY_SIZE(mcp3564_burnout_avail) * 2;
799 *type = IIO_VAL_INT_PLUS_MICRO;
800 return IIO_AVAIL_LIST;
801 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
802 *vals = mcp3564_oversampling_avail;
803 *length = ARRAY_SIZE(mcp3564_oversampling_avail);
805 return IIO_AVAIL_LIST;
806 case IIO_CHAN_INFO_SCALE:
807 *vals = (int *)adc->scale_tbls;
808 *length = ARRAY_SIZE(adc->scale_tbls) * 2;
809 *type = IIO_VAL_INT_PLUS_NANO;
810 return IIO_AVAIL_LIST;
811 case IIO_CHAN_INFO_CALIBBIAS:
812 *vals = mcp3564_calib_bias;
814 return IIO_AVAIL_RANGE;
815 case IIO_CHAN_INFO_CALIBSCALE:
816 *vals = mcp3564_calib_scale;
818 return IIO_AVAIL_RANGE;
824 static int mcp3564_read_raw(struct iio_dev *indio_dev,
825 struct iio_chan_spec const *channel,
826 int *val, int *val2, long mask)
828 struct mcp3564_state *adc = iio_priv(indio_dev);
832 case IIO_CHAN_INFO_RAW:
833 if (channel->output) {
834 mutex_lock(&adc->lock);
835 *val = mcp3564_burnout_avail[adc->burnout_mode][0];
836 *val2 = mcp3564_burnout_avail[adc->burnout_mode][1];
837 mutex_unlock(&adc->lock);
838 return IIO_VAL_INT_PLUS_MICRO;
841 ret = mcp3564_read_single_value(indio_dev, channel, val);
845 case IIO_CHAN_INFO_SCALE:
846 mutex_lock(&adc->lock);
847 *val = adc->scale_tbls[adc->hwgain][0];
848 *val2 = adc->scale_tbls[adc->hwgain][1];
849 mutex_unlock(&adc->lock);
850 return IIO_VAL_INT_PLUS_NANO;
851 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
852 *val = mcp3564_oversampling_avail[adc->oversampling];
854 case IIO_CHAN_INFO_CALIBBIAS:
855 *val = adc->calib_bias;
857 case IIO_CHAN_INFO_CALIBSCALE:
858 *val = adc->calib_scale;
865 static int mcp3564_write_raw_get_fmt(struct iio_dev *indio_dev,
866 struct iio_chan_spec const *chan,
870 case IIO_CHAN_INFO_RAW:
871 return IIO_VAL_INT_PLUS_MICRO;
872 case IIO_CHAN_INFO_CALIBBIAS:
873 case IIO_CHAN_INFO_CALIBSCALE:
874 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
876 case IIO_CHAN_INFO_SCALE:
877 return IIO_VAL_INT_PLUS_NANO;
883 static int mcp3564_write_raw(struct iio_dev *indio_dev,
884 struct iio_chan_spec const *channel, int val,
887 struct mcp3564_state *adc = iio_priv(indio_dev);
890 enum mcp3564_burnout burnout;
894 case IIO_CHAN_INFO_RAW:
895 if (!channel->output)
898 for (burnout = 0; burnout < MCP3564_MAX_BURNOUT_IDX; burnout++)
899 if (val == mcp3564_burnout_avail[burnout][0] &&
900 val2 == mcp3564_burnout_avail[burnout][1])
903 if (burnout == MCP3564_MAX_BURNOUT_IDX)
906 if (burnout == adc->burnout_mode)
909 mutex_lock(&adc->lock);
910 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG0_REG,
911 MCP3564_CONFIG0_CS_SEL_MASK,
912 FIELD_PREP(MCP3564_CONFIG0_CS_SEL_MASK, burnout));
915 dev_err(&indio_dev->dev, "Failed to configure burnout current\n");
917 adc->burnout_mode = burnout;
918 mutex_unlock(&adc->lock);
920 case IIO_CHAN_INFO_CALIBBIAS:
921 if (val < mcp3564_calib_bias[0] && val > mcp3564_calib_bias[2])
924 mutex_lock(&adc->lock);
925 ret = mcp3564_write_24bits(adc, MCP3564_OFFSETCAL_REG, val);
927 adc->calib_bias = val;
928 mutex_unlock(&adc->lock);
930 case IIO_CHAN_INFO_CALIBSCALE:
931 if (val < mcp3564_calib_scale[0] && val > mcp3564_calib_scale[2])
934 if (adc->calib_scale == val)
937 mutex_lock(&adc->lock);
938 ret = mcp3564_write_24bits(adc, MCP3564_GAINCAL_REG, val);
940 adc->calib_scale = val;
941 mutex_unlock(&adc->lock);
943 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
947 tmp = find_closest(val, mcp3564_oversampling_avail,
948 ARRAY_SIZE(mcp3564_oversampling_avail));
950 if (adc->oversampling == tmp)
953 mutex_lock(&adc->lock);
954 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG1_REG,
955 MCP3564_CONFIG1_OVERSPL_RATIO_MASK,
956 FIELD_PREP(MCP3564_CONFIG1_OVERSPL_RATIO_MASK,
959 adc->oversampling = tmp;
960 mutex_unlock(&adc->lock);
962 case IIO_CHAN_INFO_SCALE:
963 for (hwgain = 0; hwgain < MCP3564_MAX_PGA; hwgain++)
964 if (val == adc->scale_tbls[hwgain][0] &&
965 val2 == adc->scale_tbls[hwgain][1])
968 if (hwgain == MCP3564_MAX_PGA)
971 if (hwgain == adc->hwgain)
974 mutex_lock(&adc->lock);
975 ret = mcp3564_update_8bits(adc, MCP3564_CONFIG2_REG,
976 MCP3564_CONFIG2_HARDWARE_GAIN_MASK,
977 FIELD_PREP(MCP3564_CONFIG2_HARDWARE_GAIN_MASK, hwgain));
979 adc->hwgain = hwgain;
981 mutex_unlock(&adc->lock);
988 static int mcp3564_read_label(struct iio_dev *indio_dev,
989 struct iio_chan_spec const *chan, char *label)
991 struct mcp3564_state *adc = iio_priv(indio_dev);
993 return sprintf(label, "%s\n", adc->labels[chan->scan_index]);
996 static int mcp3564_parse_fw_children(struct iio_dev *indio_dev)
998 struct mcp3564_state *adc = iio_priv(indio_dev);
999 struct device *dev = &adc->spi->dev;
1000 struct iio_chan_spec *channels;
1001 struct fwnode_handle *child;
1002 struct iio_chan_spec chanspec = mcp3564_channel_template;
1003 struct iio_chan_spec temp_chanspec = mcp3564_temp_channel_template;
1004 struct iio_chan_spec burnout_chanspec = mcp3564_burnout_channel_template;
1006 unsigned int num_ch;
1008 const char *node_name;
1012 num_ch = device_get_child_node_count(dev);
1014 return dev_err_probe(&indio_dev->dev, -ENODEV,
1015 "FW has no channels defined\n");
1017 /* Reserve space for burnout and temperature channel */
1020 if (num_ch > adc->chip_info->num_channels)
1021 return dev_err_probe(dev, -EINVAL, "Too many channels %d > %d\n",
1022 num_ch, adc->chip_info->num_channels);
1024 channels = devm_kcalloc(dev, num_ch, sizeof(*channels), GFP_KERNEL);
1026 return dev_err_probe(dev, -ENOMEM, "Can't allocate memory\n");
1028 device_for_each_child_node(dev, child) {
1029 node_name = fwnode_get_name(child);
1031 if (fwnode_property_present(child, "diff-channels")) {
1032 ret = fwnode_property_read_u32_array(child,
1035 ARRAY_SIZE(inputs));
1036 chanspec.differential = 1;
1038 ret = fwnode_property_read_u32(child, "reg", &inputs[0]);
1040 chanspec.differential = 0;
1041 inputs[1] = MCP3564_AGND;
1044 fwnode_handle_put(child);
1048 if (inputs[0] > MCP3564_INTERNAL_VCM ||
1049 inputs[1] > MCP3564_INTERNAL_VCM) {
1050 fwnode_handle_put(child);
1051 return dev_err_probe(&indio_dev->dev, -EINVAL,
1052 "Channel index > %d, for %s\n",
1053 MCP3564_INTERNAL_VCM + 1,
1057 chanspec.address = (inputs[0] << 4) | inputs[1];
1058 chanspec.channel = inputs[0];
1059 chanspec.channel2 = inputs[1];
1060 chanspec.scan_index = chan_idx;
1062 if (fwnode_property_present(child, "label")) {
1063 fwnode_property_read_string(child, "label", &label);
1064 adc->labels[chan_idx] = label;
1067 channels[chan_idx] = chanspec;
1071 /* Add burnout current channel */
1072 burnout_chanspec.scan_index = chan_idx;
1073 channels[chan_idx] = burnout_chanspec;
1074 adc->labels[chan_idx] = mcp3564_channel_labels[0];
1075 chanspec.scan_index = chan_idx;
1078 /* Add temperature channel */
1079 temp_chanspec.scan_index = chan_idx;
1080 channels[chan_idx] = temp_chanspec;
1081 adc->labels[chan_idx] = mcp3564_channel_labels[1];
1084 indio_dev->num_channels = chan_idx;
1085 indio_dev->channels = channels;
1090 static void mcp3564_disable_reg(void *reg)
1092 regulator_disable(reg);
1095 static void mcp3564_fill_scale_tbls(struct mcp3564_state *adc)
1097 unsigned int pow = adc->chip_info->resolution - 1;
1103 for (i = 0; i < MCP3564_MAX_PGA; i++) {
1105 tmp1 = ((u64)ref * NANO) >> pow;
1106 div_u64_rem(tmp1, NANO, &tmp0);
1108 tmp1 = tmp1 * mcp3564_hwgain_frac[(2 * i) + 1];
1109 tmp0 = (int)div_u64(tmp1, mcp3564_hwgain_frac[2 * i]);
1111 adc->scale_tbls[i][1] = tmp0;
1115 static int mcp3564_config(struct iio_dev *indio_dev)
1117 struct mcp3564_state *adc = iio_priv(indio_dev);
1118 struct device *dev = &adc->spi->dev;
1119 const struct spi_device_id *dev_id;
1122 enum mcp3564_ids ids;
1124 unsigned int tmp = 0x01;
1128 * The address is set on a per-device basis by fuses in the factory,
1129 * configured on request. If not requested, the fuses are set for 0x1.
1130 * The device address is part of the device markings to avoid
1131 * potential confusion. This address is coded on two bits, so four possible
1132 * addresses are available when multiple devices are present on the same
1133 * SPI bus with only one Chip Select line for all devices.
1135 device_property_read_u32(dev, "microchip,hw-device-address", &tmp);
1138 dev_err_probe(dev, tmp,
1139 "invalid device address. Must be in range 0-3.\n");
1143 adc->dev_addr = FIELD_GET(MCP3564_HW_ADDR_MASK, tmp);
1145 dev_dbg(dev, "use HW device address %i\n", adc->dev_addr);
1147 ret = mcp3564_read_8bits(adc, MCP3564_RESERVED_C_REG, &tmp_reg);
1152 case MCP3564_C_REG_DEFAULT:
1153 adc->have_vref = false;
1155 case MCP3564R_C_REG_DEFAULT:
1156 adc->have_vref = true;
1159 dev_info(dev, "Unknown chip found: %d\n", tmp_reg);
1164 ret = mcp3564_read_16bits(adc, MCP3564_RESERVED_E_REG, &tmp_u16);
1168 switch (tmp_u16 & MCP3564_HW_ID_MASK) {
1206 dev_info(dev, "Unknown chip found: %d\n", tmp_u16);
1213 * If failed to identify the hardware based on internal registers,
1214 * try using fallback compatible in device tree to deal with some newer part number.
1216 adc->chip_info = spi_get_device_match_data(adc->spi);
1217 if (!adc->chip_info) {
1218 dev_id = spi_get_device_id(adc->spi);
1219 adc->chip_info = (const struct mcp3564_chip_info *)dev_id->driver_data;
1222 adc->have_vref = adc->chip_info->have_vref;
1224 adc->chip_info = &mcp3564_chip_infos_tbl[ids];
1227 dev_dbg(dev, "Found %s chip\n", adc->chip_info->name);
1229 adc->vref = devm_regulator_get_optional(dev, "vref");
1230 if (IS_ERR(adc->vref)) {
1231 if (PTR_ERR(adc->vref) != -ENODEV)
1232 return dev_err_probe(dev, PTR_ERR(adc->vref),
1233 "failed to get regulator\n");
1235 /* Check if chip has internal vref */
1236 if (!adc->have_vref)
1237 return dev_err_probe(dev, PTR_ERR(adc->vref),
1240 dev_dbg(dev, "%s: Using internal Vref\n", __func__);
1242 ret = regulator_enable(adc->vref);
1246 ret = devm_add_action_or_reset(dev, mcp3564_disable_reg,
1251 dev_dbg(dev, "%s: Using External Vref\n", __func__);
1253 ret = regulator_get_voltage(adc->vref);
1255 return dev_err_probe(dev, ret,
1256 "Failed to read vref regulator\n");
1258 adc->vref_mv = ret / MILLI;
1261 ret = mcp3564_parse_fw_children(indio_dev);
1266 * Command sequence that ensures a recovery with the desired settings
1267 * in any cases of loss-of-power scenario (Full Chip Reset):
1268 * - Write LOCK register to 0xA5
1269 * - Write IRQ register to 0x03
1270 * - Send "Device Full Reset" fast command
1271 * - Wait 1ms for "Full Reset" to complete
1273 ret = mcp3564_write_8bits(adc, MCP3564_LOCK_REG, MCP3564_LOCK_WRITE_ACCESS_PASSWORD);
1277 ret = mcp3564_write_8bits(adc, MCP3564_IRQ_REG, 0x03);
1281 ret = mcp3564_fast_cmd(adc, MCP3564_FASTCMD_RESET);
1286 * After Full reset wait some time to be able to fully reset the part and place
1287 * it back in a default configuration.
1288 * From datasheet: POR (Power On Reset Time) is ~1us
1289 * 1ms should be enough.
1293 /* set a gain of 1x for GAINCAL */
1294 ret = mcp3564_write_24bits(adc, MCP3564_GAINCAL_REG, MCP3564_DEFAULT_GAINCAL);
1298 adc->calib_scale = MCP3564_DEFAULT_GAINCAL;
1300 ret = mcp3564_write_24bits(adc, MCP3564_OFFSETCAL_REG, MCP3564_DEFAULT_OFFSETCAL);
1304 ret = mcp3564_write_24bits(adc, MCP3564_TIMER_REG, MCP3564_TIMER_DEFAULT_VALUE);
1308 ret = mcp3564_write_24bits(adc, MCP3564_SCAN_REG,
1309 MCP3564_SCAN_DELAY_TIME_SET(MCP3564_NO_DELAY) |
1310 MCP3564_SCAN_CH_SEL_SET(MCP3564_SCAN_DEFAULT_VALUE));
1314 ret = mcp3564_write_8bits(adc, MCP3564_MUX_REG, MCP3564_MUX_SET(MCP3564_CH0, MCP3564_CH1));
1318 ret = mcp3564_write_8bits(adc, MCP3564_IRQ_REG,
1319 FIELD_PREP(MCP3464_EN_FASTCMD_MASK, 1) |
1320 FIELD_PREP(MCP3464_EN_STP_MASK, 1));
1324 tmp_reg = FIELD_PREP(MCP3464_CONFIG3_CONV_MODE_MASK,
1325 MCP3464_CONFIG3_CONV_MODE_ONE_SHOT_STANDBY);
1326 tmp_reg |= FIELD_PREP(MCP3464_CONFIG3_DATA_FORMAT_MASK,
1327 MCP3464_CONFIG3_DATA_FMT_32B_SGN_EXT);
1328 tmp_reg |= MCP3464_CONFIG3_EN_OFFCAL_MASK;
1329 tmp_reg |= MCP3464_CONFIG3_EN_GAINCAL_MASK;
1331 ret = mcp3564_write_8bits(adc, MCP3564_CONFIG3_REG, tmp_reg);
1335 tmp_reg = FIELD_PREP(MCP3564_CONFIG2_BOOST_CURRENT_MASK, MCP3564_BOOST_CURRENT_x1_00);
1336 tmp_reg |= FIELD_PREP(MCP3564_CONFIG2_HARDWARE_GAIN_MASK, 0x01);
1337 tmp_reg |= FIELD_PREP(MCP3564_CONFIG2_AZ_MUX_MASK, 1);
1339 ret = mcp3564_write_8bits(adc, MCP3564_CONFIG2_REG, tmp_reg);
1344 adc->auto_zeroing_mux = true;
1345 adc->auto_zeroing_ref = false;
1346 adc->current_boost_mode = MCP3564_BOOST_CURRENT_x1_00;
1348 tmp_reg = FIELD_PREP(MCP3564_CONFIG1_OVERSPL_RATIO_MASK, MCP3564_OVERSAMPLING_RATIO_98304);
1350 ret = mcp3564_write_8bits(adc, MCP3564_CONFIG1_REG, tmp_reg);
1354 adc->oversampling = MCP3564_OVERSAMPLING_RATIO_98304;
1356 tmp_reg = FIELD_PREP(MCP3564_CONFIG0_ADC_MODE_MASK, MCP3564_ADC_MODE_STANDBY);
1357 tmp_reg |= FIELD_PREP(MCP3564_CONFIG0_CS_SEL_MASK, MCP3564_CONFIG0_CS_SEL_0_0_uA);
1358 tmp_reg |= FIELD_PREP(MCP3564_CONFIG0_CLK_SEL_MASK, MCP3564_CONFIG0_USE_INT_CLK);
1359 tmp_reg |= MCP3456_CONFIG0_BIT6_DEFAULT;
1362 tmp_reg |= FIELD_PREP(MCP3456_CONFIG0_VREF_MASK, 1);
1363 adc->vref_mv = MCP3564R_INT_VREF_MV;
1366 ret = mcp3564_write_8bits(adc, MCP3564_CONFIG0_REG, tmp_reg);
1368 adc->burnout_mode = MCP3564_CONFIG0_CS_SEL_0_0_uA;
1373 static IIO_DEVICE_ATTR(auto_zeroing_ref_enable, 0644,
1374 mcp3564_auto_zeroing_ref_show,
1375 mcp3564_auto_zeroing_ref_store, 0);
1377 static IIO_DEVICE_ATTR(auto_zeroing_mux_enable, 0644,
1378 mcp3564_auto_zeroing_mux_show,
1379 mcp3564_auto_zeroing_mux_store, 0);
1381 static struct attribute *mcp3564_attributes[] = {
1382 &iio_dev_attr_auto_zeroing_mux_enable.dev_attr.attr,
1386 static struct attribute *mcp3564r_attributes[] = {
1387 &iio_dev_attr_auto_zeroing_mux_enable.dev_attr.attr,
1388 &iio_dev_attr_auto_zeroing_ref_enable.dev_attr.attr,
1392 static struct attribute_group mcp3564_attribute_group = {
1393 .attrs = mcp3564_attributes,
1396 static struct attribute_group mcp3564r_attribute_group = {
1397 .attrs = mcp3564r_attributes,
1400 static const struct iio_info mcp3564_info = {
1401 .read_raw = mcp3564_read_raw,
1402 .read_avail = mcp3564_read_avail,
1403 .write_raw = mcp3564_write_raw,
1404 .write_raw_get_fmt = mcp3564_write_raw_get_fmt,
1405 .read_label = mcp3564_read_label,
1406 .attrs = &mcp3564_attribute_group,
1409 static const struct iio_info mcp3564r_info = {
1410 .read_raw = mcp3564_read_raw,
1411 .read_avail = mcp3564_read_avail,
1412 .write_raw = mcp3564_write_raw,
1413 .write_raw_get_fmt = mcp3564_write_raw_get_fmt,
1414 .read_label = mcp3564_read_label,
1415 .attrs = &mcp3564r_attribute_group,
1418 static int mcp3564_probe(struct spi_device *spi)
1421 struct iio_dev *indio_dev;
1422 struct mcp3564_state *adc;
1424 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
1428 adc = iio_priv(indio_dev);
1431 dev_dbg(&spi->dev, "%s: probe(spi = 0x%p)\n", __func__, spi);
1434 * Do any chip specific initialization, e.g:
1435 * read/write some registers
1436 * enable/disable certain channels
1437 * change the sampling rate to the requested value
1439 ret = mcp3564_config(indio_dev);
1441 return dev_err_probe(&spi->dev, ret,
1442 "Can't configure MCP356X device\n");
1444 dev_dbg(&spi->dev, "%s: Vref (mV): %d\n", __func__, adc->vref_mv);
1446 mcp3564_fill_scale_tbls(adc);
1448 indio_dev->name = adc->chip_info->name;
1449 indio_dev->modes = INDIO_DIRECT_MODE;
1452 indio_dev->info = &mcp3564r_info;
1454 indio_dev->info = &mcp3564_info;
1456 mutex_init(&adc->lock);
1458 ret = devm_iio_device_register(&spi->dev, indio_dev);
1460 return dev_err_probe(&spi->dev, ret,
1461 "Can't register IIO device\n");
1466 static const struct of_device_id mcp3564_dt_ids[] = {
1467 { .compatible = "microchip,mcp3461", .data = &mcp3564_chip_infos_tbl[mcp3461] },
1468 { .compatible = "microchip,mcp3462", .data = &mcp3564_chip_infos_tbl[mcp3462] },
1469 { .compatible = "microchip,mcp3464", .data = &mcp3564_chip_infos_tbl[mcp3464] },
1470 { .compatible = "microchip,mcp3561", .data = &mcp3564_chip_infos_tbl[mcp3561] },
1471 { .compatible = "microchip,mcp3562", .data = &mcp3564_chip_infos_tbl[mcp3562] },
1472 { .compatible = "microchip,mcp3564", .data = &mcp3564_chip_infos_tbl[mcp3564] },
1473 { .compatible = "microchip,mcp3461r", .data = &mcp3564_chip_infos_tbl[mcp3461r] },
1474 { .compatible = "microchip,mcp3462r", .data = &mcp3564_chip_infos_tbl[mcp3462r] },
1475 { .compatible = "microchip,mcp3464r", .data = &mcp3564_chip_infos_tbl[mcp3464r] },
1476 { .compatible = "microchip,mcp3561r", .data = &mcp3564_chip_infos_tbl[mcp3561r] },
1477 { .compatible = "microchip,mcp3562r", .data = &mcp3564_chip_infos_tbl[mcp3562r] },
1478 { .compatible = "microchip,mcp3564r", .data = &mcp3564_chip_infos_tbl[mcp3564r] },
1481 MODULE_DEVICE_TABLE(of, mcp3564_dt_ids);
1483 static const struct spi_device_id mcp3564_id[] = {
1484 { "mcp3461", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3461] },
1485 { "mcp3462", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3462] },
1486 { "mcp3464", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3464] },
1487 { "mcp3561", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3561] },
1488 { "mcp3562", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3562] },
1489 { "mcp3564", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3564] },
1490 { "mcp3461r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3461r] },
1491 { "mcp3462r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3462r] },
1492 { "mcp3464r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3464r] },
1493 { "mcp3561r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3561r] },
1494 { "mcp3562r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3562r] },
1495 { "mcp3564r", (kernel_ulong_t)&mcp3564_chip_infos_tbl[mcp3564r] },
1498 MODULE_DEVICE_TABLE(spi, mcp3564_id);
1500 static struct spi_driver mcp3564_driver = {
1503 .of_match_table = mcp3564_dt_ids,
1505 .probe = mcp3564_probe,
1506 .id_table = mcp3564_id,
1509 module_spi_driver(mcp3564_driver);
1512 MODULE_DESCRIPTION("Microchip MCP346x/MCP346xR and MCP356x/MCP346xR ADCs");
1513 MODULE_LICENSE("GPL v2");