2 * Driver for Linear Technology LTC2471 and LTC2473 voltage monitors
3 * The LTC2473 is identical to the 2471, but reports a differential signal.
5 * Copyright (C) 2017 Topic Embedded Products
6 * Author: Mike Looijmans <mike.looijmans@topic.nl>
11 #include <linux/err.h>
12 #include <linux/i2c.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/iio/iio.h>
16 #include <linux/iio/sysfs.h>
24 struct i2c_client
*client
;
27 /* Reference voltage is 1.25V */
28 #define LTC2471_VREF 1250
30 /* Read two bytes from the I2C bus to obtain the ADC result */
31 static int ltc2471_get_value(struct i2c_client
*client
)
36 ret
= i2c_master_recv(client
, (char *)&buf
, sizeof(buf
));
39 if (ret
!= sizeof(buf
))
43 return be16_to_cpu(buf
);
46 static int ltc2471_read_raw(struct iio_dev
*indio_dev
,
47 struct iio_chan_spec
const *chan
,
48 int *val
, int *val2
, long info
)
50 struct ltc2471_data
*data
= iio_priv(indio_dev
);
54 case IIO_CHAN_INFO_RAW
:
55 ret
= ltc2471_get_value(data
->client
);
61 case IIO_CHAN_INFO_SCALE
:
62 if (chan
->differential
)
63 /* Output ranges from -VREF to +VREF */
64 *val
= 2 * LTC2471_VREF
;
66 /* Output ranges from 0 to VREF */
68 *val2
= 16; /* 16 data bits */
69 return IIO_VAL_FRACTIONAL_LOG2
;
71 case IIO_CHAN_INFO_OFFSET
:
72 /* Only differential chip has this property */
81 static const struct iio_chan_spec ltc2471_channel
[] = {
84 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
85 .info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
),
89 static const struct iio_chan_spec ltc2473_channel
[] = {
92 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
93 .info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
) |
94 BIT(IIO_CHAN_INFO_OFFSET
),
99 static const struct iio_info ltc2471_info
= {
100 .read_raw
= ltc2471_read_raw
,
103 static int ltc2471_i2c_probe(struct i2c_client
*client
,
104 const struct i2c_device_id
*id
)
106 struct iio_dev
*indio_dev
;
107 struct ltc2471_data
*data
;
110 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
113 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
117 data
= iio_priv(indio_dev
);
118 data
->client
= client
;
120 indio_dev
->dev
.parent
= &client
->dev
;
121 indio_dev
->name
= id
->name
;
122 indio_dev
->info
= <c2471_info
;
123 indio_dev
->modes
= INDIO_DIRECT_MODE
;
124 if (id
->driver_data
== ltc2473
)
125 indio_dev
->channels
= ltc2473_channel
;
127 indio_dev
->channels
= ltc2471_channel
;
128 indio_dev
->num_channels
= 1;
130 /* Trigger once to start conversion and check if chip is there */
131 ret
= ltc2471_get_value(client
);
133 dev_err(&client
->dev
, "Cannot read from device.\n");
137 return devm_iio_device_register(&client
->dev
, indio_dev
);
140 static const struct i2c_device_id ltc2471_i2c_id
[] = {
141 { "ltc2471", ltc2471
},
142 { "ltc2473", ltc2473
},
145 MODULE_DEVICE_TABLE(i2c
, ltc2471_i2c_id
);
147 static struct i2c_driver ltc2471_i2c_driver
= {
151 .probe
= ltc2471_i2c_probe
,
152 .id_table
= ltc2471_i2c_id
,
155 module_i2c_driver(ltc2471_i2c_driver
);
157 MODULE_DESCRIPTION("LTC2471/LTC2473 ADC driver");
158 MODULE_AUTHOR("Topic Embedded Products");
159 MODULE_LICENSE("GPL v2");