1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for Linear Technology LTC2471 and LTC2473 voltage monitors
4 * The LTC2473 is identical to the 2471, but reports a differential signal.
6 * Copyright (C) 2017 Topic Embedded Products
7 * Author: Mike Looijmans <mike.looijmans@topic.nl>
10 #include <linux/err.h>
11 #include <linux/i2c.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/iio/iio.h>
15 #include <linux/iio/sysfs.h>
23 struct i2c_client
*client
;
26 /* Reference voltage is 1.25V */
27 #define LTC2471_VREF 1250
29 /* Read two bytes from the I2C bus to obtain the ADC result */
30 static int ltc2471_get_value(struct i2c_client
*client
)
35 ret
= i2c_master_recv(client
, (char *)&buf
, sizeof(buf
));
38 if (ret
!= sizeof(buf
))
42 return be16_to_cpu(buf
);
45 static int ltc2471_read_raw(struct iio_dev
*indio_dev
,
46 struct iio_chan_spec
const *chan
,
47 int *val
, int *val2
, long info
)
49 struct ltc2471_data
*data
= iio_priv(indio_dev
);
53 case IIO_CHAN_INFO_RAW
:
54 ret
= ltc2471_get_value(data
->client
);
60 case IIO_CHAN_INFO_SCALE
:
61 if (chan
->differential
)
62 /* Output ranges from -VREF to +VREF */
63 *val
= 2 * LTC2471_VREF
;
65 /* Output ranges from 0 to VREF */
67 *val2
= 16; /* 16 data bits */
68 return IIO_VAL_FRACTIONAL_LOG2
;
70 case IIO_CHAN_INFO_OFFSET
:
71 /* Only differential chip has this property */
80 static const struct iio_chan_spec ltc2471_channel
[] = {
83 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
84 .info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
),
88 static const struct iio_chan_spec ltc2473_channel
[] = {
91 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
92 .info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
) |
93 BIT(IIO_CHAN_INFO_OFFSET
),
98 static const struct iio_info ltc2471_info
= {
99 .read_raw
= ltc2471_read_raw
,
102 static int ltc2471_i2c_probe(struct i2c_client
*client
,
103 const struct i2c_device_id
*id
)
105 struct iio_dev
*indio_dev
;
106 struct ltc2471_data
*data
;
109 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
112 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
116 data
= iio_priv(indio_dev
);
117 data
->client
= client
;
119 indio_dev
->name
= id
->name
;
120 indio_dev
->info
= <c2471_info
;
121 indio_dev
->modes
= INDIO_DIRECT_MODE
;
122 if (id
->driver_data
== ltc2473
)
123 indio_dev
->channels
= ltc2473_channel
;
125 indio_dev
->channels
= ltc2471_channel
;
126 indio_dev
->num_channels
= 1;
128 /* Trigger once to start conversion and check if chip is there */
129 ret
= ltc2471_get_value(client
);
131 dev_err(&client
->dev
, "Cannot read from device.\n");
135 return devm_iio_device_register(&client
->dev
, indio_dev
);
138 static const struct i2c_device_id ltc2471_i2c_id
[] = {
139 { "ltc2471", ltc2471
},
140 { "ltc2473", ltc2473
},
143 MODULE_DEVICE_TABLE(i2c
, ltc2471_i2c_id
);
145 static struct i2c_driver ltc2471_i2c_driver
= {
149 .probe
= ltc2471_i2c_probe
,
150 .id_table
= ltc2471_i2c_id
,
153 module_i2c_driver(ltc2471_i2c_driver
);
155 MODULE_DESCRIPTION("LTC2471/LTC2473 ADC driver");
156 MODULE_AUTHOR("Topic Embedded Products");
157 MODULE_LICENSE("GPL v2");