2 * ltc2485.c - Driver for Linear Technology LTC2485 ADC
4 * Copyright (C) 2016 Alison Schofield <amsfield22@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * Datasheet: http://cds.linear.com/docs/en/datasheet/2485fd.pdf
13 #include <linux/delay.h>
14 #include <linux/i2c.h>
15 #include <linux/module.h>
17 #include <linux/iio/iio.h>
18 #include <linux/iio/sysfs.h>
20 /* Power-on configuration: rejects both 50/60Hz, operates at 1x speed */
21 #define LTC2485_CONFIG_DEFAULT 0
24 struct i2c_client
*client
;
25 ktime_t time_prev
; /* last conversion */
28 static void ltc2485_wait_conv(struct ltc2485_data
*data
)
30 const unsigned int conv_time
= 147; /* conversion time ms */
31 unsigned int time_elapsed
;
33 /* delay if conversion time not passed since last read or write */
34 time_elapsed
= ktime_ms_delta(ktime_get(), data
->time_prev
);
36 if (time_elapsed
< conv_time
)
37 msleep(conv_time
- time_elapsed
);
40 static int ltc2485_read(struct ltc2485_data
*data
, int *val
)
42 struct i2c_client
*client
= data
->client
;
46 ltc2485_wait_conv(data
);
48 ret
= i2c_master_recv(client
, (char *)&buf
, 4);
50 dev_err(&client
->dev
, "i2c_master_recv failed\n");
53 data
->time_prev
= ktime_get();
54 *val
= sign_extend32(be32_to_cpu(buf
) >> 6, 24);
59 static int ltc2485_read_raw(struct iio_dev
*indio_dev
,
60 struct iio_chan_spec
const *chan
,
61 int *val
, int *val2
, long mask
)
63 struct ltc2485_data
*data
= iio_priv(indio_dev
);
66 if (mask
== IIO_CHAN_INFO_RAW
) {
67 ret
= ltc2485_read(data
, val
);
73 } else if (mask
== IIO_CHAN_INFO_SCALE
) {
74 *val
= 5000; /* on board vref millivolts */
75 *val2
= 25; /* 25 (24 + sign) data bits */
76 return IIO_VAL_FRACTIONAL_LOG2
;
83 static const struct iio_chan_spec ltc2485_channel
[] = {
86 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
87 .info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
)
91 static const struct iio_info ltc2485_info
= {
92 .read_raw
= ltc2485_read_raw
,
95 static int ltc2485_probe(struct i2c_client
*client
,
96 const struct i2c_device_id
*id
)
98 struct iio_dev
*indio_dev
;
99 struct ltc2485_data
*data
;
102 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
|
103 I2C_FUNC_SMBUS_WRITE_BYTE
))
106 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
110 data
= iio_priv(indio_dev
);
111 i2c_set_clientdata(client
, indio_dev
);
112 data
->client
= client
;
114 indio_dev
->dev
.parent
= &client
->dev
;
115 indio_dev
->name
= id
->name
;
116 indio_dev
->info
= <c2485_info
;
117 indio_dev
->modes
= INDIO_DIRECT_MODE
;
118 indio_dev
->channels
= ltc2485_channel
;
119 indio_dev
->num_channels
= ARRAY_SIZE(ltc2485_channel
);
121 ret
= i2c_smbus_write_byte(data
->client
, LTC2485_CONFIG_DEFAULT
);
125 data
->time_prev
= ktime_get();
127 return devm_iio_device_register(&client
->dev
, indio_dev
);
130 static const struct i2c_device_id ltc2485_id
[] = {
134 MODULE_DEVICE_TABLE(i2c
, ltc2485_id
);
136 static struct i2c_driver ltc2485_driver
= {
140 .probe
= ltc2485_probe
,
141 .id_table
= ltc2485_id
,
143 module_i2c_driver(ltc2485_driver
);
145 MODULE_AUTHOR("Alison Schofield <amsfield22@gmail.com>");
146 MODULE_DESCRIPTION("Linear Technology LTC2485 ADC driver");
147 MODULE_LICENSE("GPL v2");