428 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * lmp91000.c - Support for Texas Instruments digital potentiostats4 *5 * Copyright (C) 2016, 20186 * Author: Matt Ranostay <matt.ranostay@konsulko.com>7 *8 * TODO: bias voltage + polarity control, and multiple chip support9 */10 11#include <linux/module.h>12#include <linux/i2c.h>13#include <linux/delay.h>14#include <linux/mod_devicetable.h>15#include <linux/regmap.h>16#include <linux/iio/iio.h>17#include <linux/iio/buffer.h>18#include <linux/iio/consumer.h>19#include <linux/iio/trigger.h>20#include <linux/iio/trigger_consumer.h>21#include <linux/iio/triggered_buffer.h>22 23#define LMP91000_REG_LOCK 0x0124#define LMP91000_REG_TIACN 0x1025#define LMP91000_REG_TIACN_GAIN_SHIFT 226 27#define LMP91000_REG_REFCN 0x1128#define LMP91000_REG_REFCN_EXT_REF 0x2029#define LMP91000_REG_REFCN_50_ZERO 0x8030 31#define LMP91000_REG_MODECN 0x1232#define LMP91000_REG_MODECN_3LEAD 0x0333#define LMP91000_REG_MODECN_TEMP 0x0734 35#define LMP91000_DRV_NAME "lmp91000"36 37static const int lmp91000_tia_gain[] = { 0, 2750, 3500, 7000, 14000, 35000,38 120000, 350000 };39 40static const int lmp91000_rload[] = { 10, 33, 50, 100 };41 42#define LMP91000_TEMP_BASE -4043 44static const u16 lmp91000_temp_lut[] = {45 1875, 1867, 1860, 1852, 1844, 1836, 1828, 1821, 1813, 1805,46 1797, 1789, 1782, 1774, 1766, 1758, 1750, 1742, 1734, 1727,47 1719, 1711, 1703, 1695, 1687, 1679, 1671, 1663, 1656, 1648,48 1640, 1632, 1624, 1616, 1608, 1600, 1592, 1584, 1576, 1568,49 1560, 1552, 1544, 1536, 1528, 1520, 1512, 1504, 1496, 1488,50 1480, 1472, 1464, 1456, 1448, 1440, 1432, 1424, 1415, 1407,51 1399, 1391, 1383, 1375, 1367, 1359, 1351, 1342, 1334, 1326,52 1318, 1310, 1302, 1293, 1285, 1277, 1269, 1261, 1253, 1244,53 1236, 1228, 1220, 1212, 1203, 1195, 1187, 1179, 1170, 1162,54 1154, 1146, 1137, 1129, 1121, 1112, 1104, 1096, 1087, 1079,55 1071, 1063, 1054, 1046, 1038, 1029, 1021, 1012, 1004, 996,56 987, 979, 971, 962, 954, 945, 937, 929, 920, 912,57 903, 895, 886, 878, 870, 861 };58 59static const struct regmap_config lmp91000_regmap_config = {60 .reg_bits = 8,61 .val_bits = 8,62};63 64struct lmp91000_data {65 struct regmap *regmap;66 struct device *dev;67 68 struct iio_trigger *trig;69 struct iio_cb_buffer *cb_buffer;70 struct iio_channel *adc_chan;71 72 struct completion completion;73 u8 chan_select;74 /* 64-bit data + 64-bit naturally aligned timestamp */75 u32 buffer[4] __aligned(8);76};77 78static const struct iio_chan_spec lmp91000_channels[] = {79 { /* chemical channel mV */80 .type = IIO_VOLTAGE,81 .channel = 0,82 .address = LMP91000_REG_MODECN_3LEAD,83 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |84 BIT(IIO_CHAN_INFO_OFFSET) |85 BIT(IIO_CHAN_INFO_SCALE),86 .scan_index = 0,87 .scan_type = {88 .sign = 's',89 .realbits = 32,90 .storagebits = 32,91 },92 },93 IIO_CHAN_SOFT_TIMESTAMP(1),94 { /* temperature channel mV */95 .type = IIO_TEMP,96 .channel = 1,97 .address = LMP91000_REG_MODECN_TEMP,98 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),99 .scan_index = -1,100 },101};102 103static int lmp91000_read(struct lmp91000_data *data, int channel, int *val)104{105 int state, ret;106 107 ret = regmap_read(data->regmap, LMP91000_REG_MODECN, &state);108 if (ret)109 return -EINVAL;110 111 ret = regmap_write(data->regmap, LMP91000_REG_MODECN, channel);112 if (ret)113 return -EINVAL;114 115 /* delay till first temperature reading is complete */116 if (state != channel && channel == LMP91000_REG_MODECN_TEMP)117 usleep_range(3000, 4000);118 119 data->chan_select = channel != LMP91000_REG_MODECN_3LEAD;120 121 iio_trigger_poll_nested(data->trig);122 123 ret = wait_for_completion_timeout(&data->completion, HZ);124 reinit_completion(&data->completion);125 126 if (!ret)127 return -ETIMEDOUT;128 129 *val = data->buffer[data->chan_select];130 131 return 0;132}133 134static irqreturn_t lmp91000_buffer_handler(int irq, void *private)135{136 struct iio_poll_func *pf = private;137 struct iio_dev *indio_dev = pf->indio_dev;138 struct lmp91000_data *data = iio_priv(indio_dev);139 int ret, val;140 141 memset(data->buffer, 0, sizeof(data->buffer));142 143 ret = lmp91000_read(data, LMP91000_REG_MODECN_3LEAD, &val);144 if (!ret) {145 data->buffer[0] = val;146 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,147 iio_get_time_ns(indio_dev));148 }149 150 iio_trigger_notify_done(indio_dev->trig);151 152 return IRQ_HANDLED;153}154 155static int lmp91000_read_raw(struct iio_dev *indio_dev,156 struct iio_chan_spec const *chan,157 int *val, int *val2, long mask)158{159 struct lmp91000_data *data = iio_priv(indio_dev);160 161 switch (mask) {162 case IIO_CHAN_INFO_RAW:163 case IIO_CHAN_INFO_PROCESSED: {164 int ret = iio_channel_start_all_cb(data->cb_buffer);165 166 if (ret)167 return ret;168 169 ret = lmp91000_read(data, chan->address, val);170 171 iio_channel_stop_all_cb(data->cb_buffer);172 173 if (ret)174 return ret;175 176 if (mask == IIO_CHAN_INFO_PROCESSED) {177 int tmp, i;178 179 ret = iio_convert_raw_to_processed(data->adc_chan,180 *val, &tmp, 1);181 if (ret)182 return ret;183 184 for (i = 0; i < ARRAY_SIZE(lmp91000_temp_lut); i++)185 if (lmp91000_temp_lut[i] < tmp)186 break;187 188 *val = (LMP91000_TEMP_BASE + i) * 1000;189 }190 return IIO_VAL_INT;191 }192 case IIO_CHAN_INFO_OFFSET:193 return iio_read_channel_offset(data->adc_chan, val, val2);194 case IIO_CHAN_INFO_SCALE:195 return iio_read_channel_scale(data->adc_chan, val, val2);196 }197 198 return -EINVAL;199}200 201static const struct iio_info lmp91000_info = {202 .read_raw = lmp91000_read_raw,203};204 205static int lmp91000_read_config(struct lmp91000_data *data)206{207 struct device *dev = data->dev;208 unsigned int reg, val;209 int i, ret;210 211 ret = device_property_read_u32(dev, "ti,tia-gain-ohm", &val);212 if (ret) {213 if (!device_property_read_bool(dev, "ti,external-tia-resistor")) {214 dev_err(dev, "no ti,tia-gain-ohm defined and external resistor not specified\n");215 return ret;216 }217 val = 0;218 }219 220 ret = -EINVAL;221 for (i = 0; i < ARRAY_SIZE(lmp91000_tia_gain); i++) {222 if (lmp91000_tia_gain[i] == val) {223 reg = i << LMP91000_REG_TIACN_GAIN_SHIFT;224 ret = 0;225 break;226 }227 }228 229 if (ret) {230 dev_err(dev, "invalid ti,tia-gain-ohm %d\n", val);231 return ret;232 }233 234 ret = device_property_read_u32(dev, "ti,rload-ohm", &val);235 if (ret) {236 val = 100;237 dev_info(dev, "no ti,rload-ohm defined, default to %d\n", val);238 }239 240 ret = -EINVAL;241 for (i = 0; i < ARRAY_SIZE(lmp91000_rload); i++) {242 if (lmp91000_rload[i] == val) {243 reg |= i;244 ret = 0;245 break;246 }247 }248 249 if (ret) {250 dev_err(dev, "invalid ti,rload-ohm %d\n", val);251 return ret;252 }253 254 regmap_write(data->regmap, LMP91000_REG_LOCK, 0);255 regmap_write(data->regmap, LMP91000_REG_TIACN, reg);256 regmap_write(data->regmap, LMP91000_REG_REFCN,257 LMP91000_REG_REFCN_EXT_REF | LMP91000_REG_REFCN_50_ZERO);258 regmap_write(data->regmap, LMP91000_REG_LOCK, 1);259 260 return 0;261}262 263static int lmp91000_buffer_cb(const void *val, void *private)264{265 struct iio_dev *indio_dev = private;266 struct lmp91000_data *data = iio_priv(indio_dev);267 268 data->buffer[data->chan_select] = *((int *)val);269 complete_all(&data->completion);270 271 return 0;272}273 274static int lmp91000_buffer_postenable(struct iio_dev *indio_dev)275{276 struct lmp91000_data *data = iio_priv(indio_dev);277 278 return iio_channel_start_all_cb(data->cb_buffer);279}280 281static int lmp91000_buffer_predisable(struct iio_dev *indio_dev)282{283 struct lmp91000_data *data = iio_priv(indio_dev);284 285 iio_channel_stop_all_cb(data->cb_buffer);286 287 return 0;288}289 290static const struct iio_buffer_setup_ops lmp91000_buffer_setup_ops = {291 .postenable = lmp91000_buffer_postenable,292 .predisable = lmp91000_buffer_predisable,293};294 295static int lmp91000_probe(struct i2c_client *client)296{297 struct device *dev = &client->dev;298 struct lmp91000_data *data;299 struct iio_dev *indio_dev;300 int ret;301 302 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));303 if (!indio_dev)304 return -ENOMEM;305 306 indio_dev->info = &lmp91000_info;307 indio_dev->channels = lmp91000_channels;308 indio_dev->num_channels = ARRAY_SIZE(lmp91000_channels);309 indio_dev->name = LMP91000_DRV_NAME;310 indio_dev->modes = INDIO_DIRECT_MODE;311 i2c_set_clientdata(client, indio_dev);312 313 data = iio_priv(indio_dev);314 data->dev = dev;315 data->regmap = devm_regmap_init_i2c(client, &lmp91000_regmap_config);316 if (IS_ERR(data->regmap)) {317 dev_err(dev, "regmap initialization failed.\n");318 return PTR_ERR(data->regmap);319 }320 321 data->trig = devm_iio_trigger_alloc(dev, "%s-mux%d",322 indio_dev->name,323 iio_device_id(indio_dev));324 if (!data->trig) {325 dev_err(dev, "cannot allocate iio trigger.\n");326 return -ENOMEM;327 }328 329 init_completion(&data->completion);330 331 ret = lmp91000_read_config(data);332 if (ret)333 return ret;334 335 ret = iio_trigger_set_immutable(iio_channel_cb_get_iio_dev(data->cb_buffer),336 data->trig);337 if (ret) {338 dev_err(dev, "cannot set immutable trigger.\n");339 return ret;340 }341 342 ret = iio_trigger_register(data->trig);343 if (ret) {344 dev_err(dev, "cannot register iio trigger.\n");345 return ret;346 }347 348 ret = iio_triggered_buffer_setup(indio_dev, NULL,349 &lmp91000_buffer_handler,350 &lmp91000_buffer_setup_ops);351 if (ret)352 goto error_unreg_trigger;353 354 data->cb_buffer = iio_channel_get_all_cb(dev, &lmp91000_buffer_cb,355 indio_dev);356 357 if (IS_ERR(data->cb_buffer)) {358 if (PTR_ERR(data->cb_buffer) == -ENODEV)359 ret = -EPROBE_DEFER;360 else361 ret = PTR_ERR(data->cb_buffer);362 363 goto error_unreg_buffer;364 }365 366 data->adc_chan = iio_channel_cb_get_channels(data->cb_buffer);367 368 ret = iio_device_register(indio_dev);369 if (ret)370 goto error_unreg_cb_buffer;371 372 return 0;373 374error_unreg_cb_buffer:375 iio_channel_release_all_cb(data->cb_buffer);376 377error_unreg_buffer:378 iio_triggered_buffer_cleanup(indio_dev);379 380error_unreg_trigger:381 iio_trigger_unregister(data->trig);382 383 return ret;384}385 386static void lmp91000_remove(struct i2c_client *client)387{388 struct iio_dev *indio_dev = i2c_get_clientdata(client);389 struct lmp91000_data *data = iio_priv(indio_dev);390 391 iio_device_unregister(indio_dev);392 393 iio_channel_stop_all_cb(data->cb_buffer);394 iio_channel_release_all_cb(data->cb_buffer);395 396 iio_triggered_buffer_cleanup(indio_dev);397 iio_trigger_unregister(data->trig);398}399 400static const struct of_device_id lmp91000_of_match[] = {401 { .compatible = "ti,lmp91000", },402 { .compatible = "ti,lmp91002", },403 { },404};405MODULE_DEVICE_TABLE(of, lmp91000_of_match);406 407static const struct i2c_device_id lmp91000_id[] = {408 { "lmp91000" },409 { "lmp91002" },410 {}411};412MODULE_DEVICE_TABLE(i2c, lmp91000_id);413 414static struct i2c_driver lmp91000_driver = {415 .driver = {416 .name = LMP91000_DRV_NAME,417 .of_match_table = lmp91000_of_match,418 },419 .probe = lmp91000_probe,420 .remove = lmp91000_remove,421 .id_table = lmp91000_id,422};423module_i2c_driver(lmp91000_driver);424 425MODULE_AUTHOR("Matt Ranostay <matt.ranostay@konsulko.com>");426MODULE_DESCRIPTION("LMP91000 digital potentiostat");427MODULE_LICENSE("GPL");428