File Index
Files and directories
Sign in
FILE

ti-ads1119.c

File preview with syntax highlighting.

linux-6.19.14/drivers/iio/adc/ti-ads1119.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Texas Instruments ADS1119 ADC driver.
  4 *
  5 * Copyright 2024 Toradex
  6 */
  7
  8#include <linux/bits.h>
  9#include <linux/bitfield.h>
 10#include <linux/completion.h>
 11#include <linux/delay.h>
 12#include <linux/dev_printk.h>
 13#include <linux/err.h>
 14#include <linux/gpio/consumer.h>
 15#include <linux/interrupt.h>
 16#include <linux/iopoll.h>
 17#include <linux/i2c.h>
 18#include <linux/kernel.h>
 19#include <linux/math.h>
 20#include <linux/module.h>
 21#include <linux/pm_runtime.h>
 22#include <linux/regulator/consumer.h>
 23#include <linux/units.h>
 24
 25#include <linux/iio/iio.h>
 26#include <linux/iio/buffer.h>
 27#include <linux/iio/trigger.h>
 28#include <linux/iio/triggered_buffer.h>
 29#include <linux/iio/trigger_consumer.h>
 30
 31#define ADS1119_CMD_RESET		0x06
 32#define ADS1119_CMD_POWERDOWN		0x02
 33#define ADS1119_CMD_START_SYNC		0x08
 34#define ADS1119_CMD_RDATA		0x10
 35#define ADS1119_CMD_RREG_CONFIG		0x20
 36#define ADS1119_CMD_RREG_STATUS		0x24
 37#define ADS1119_CMD_WREG		0x40
 38
 39#define ADS1119_CMD_RREG(reg)		(0x20 | (reg) << 2)
 40
 41/* Config register */
 42#define ADS1119_REG_CONFIG	0x00
 43#define ADS1119_CONFIG_VREF_FIELD	BIT(0)
 44#define ADS1119_CONFIG_CM_FIELD		BIT(1)
 45#define ADS1119_CONFIG_DR_FIELD		GENMASK(3, 2)
 46#define ADS1119_CONFIG_GAIN_FIELD	BIT(4)
 47#define ADS1119_CONFIG_MUX_FIELD	GENMASK(7, 5)
 48
 49#define ADS1119_VREF_INTERNAL	0
 50#define ADS1119_VREF_EXTERNAL	1
 51#define ADS1119_VREF_INTERNAL_VAL 2048000
 52
 53#define ADS1119_CM_SINGLE	0
 54#define ADS1119_CM_CONTINUOUS	1
 55
 56#define ADS1119_DR_20_SPS	0
 57#define ADS1119_DR_90_SPS	1
 58#define ADS1119_DR_330_SPS	2
 59#define ADS1119_DR_1000_SPS	3
 60
 61#define ADS1119_GAIN_1	0
 62#define ADS1119_GAIN_4	1
 63
 64#define ADS1119_MUX_AIN0_AIN1	0
 65#define ADS1119_MUX_AIN2_AIN3	1
 66#define ADS1119_MUX_AIN1_AIN2	2
 67#define ADS1119_MUX_AIN0	3
 68#define ADS1119_MUX_AIN1	4
 69#define ADS1119_MUX_AIN2	5
 70#define ADS1119_MUX_AIN3	6
 71#define ADS1119_MUX_SHORTED	7
 72
 73/* Status register */
 74#define ADS1119_REG_STATUS	0x01
 75#define ADS1119_STATUS_DRDY_FIELD	BIT(7)
 76
 77#define ADS1119_DEFAULT_GAIN		1
 78#define ADS1119_DEFAULT_DATARATE	20
 79
 80#define ADS1119_SUSPEND_DELAY		2000
 81
 82/* Timeout based on the minimum sample rate of 20 SPS (50000us) */
 83#define ADS1119_MAX_DRDY_TIMEOUT	85000
 84
 85#define ADS1119_MAX_CHANNELS		7
 86#define ADS1119_MAX_SINGLE_CHANNELS	4
 87
 88struct ads1119_channel_config {
 89	int gain;
 90	int datarate;
 91	int mux;
 92};
 93
 94struct ads1119_state {
 95	struct completion completion;
 96	struct i2c_client *client;
 97	struct gpio_desc *reset_gpio;
 98	struct iio_trigger *trig;
 99	struct ads1119_channel_config *channels_cfg;
100	unsigned int num_channels_cfg;
101	unsigned int cached_config;
102	int vref_uV;
103};
104
105static const char * const ads1119_power_supplies[] = {
106	"avdd", "dvdd"
107};
108
109static const int ads1119_available_datarates[] = {
110	20, 90, 330, 1000,
111};
112
113static const int ads1119_available_gains[] = {
114	1, 1,
115	1, 4,
116};
117
118static int ads1119_upd_cfg_reg(struct ads1119_state *st, unsigned int fields,
119			       unsigned int val)
120{
121	unsigned int config = st->cached_config;
122	int ret;
123
124	config &= ~fields;
125	config |= val;
126
127	ret = i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG, config);
128	if (ret)
129		return ret;
130
131	st->cached_config = config;
132
133	return 0;
134}
135
136static bool ads1119_data_ready(struct ads1119_state *st)
137{
138	int status;
139
140	status = i2c_smbus_read_byte_data(st->client, ADS1119_CMD_RREG_STATUS);
141	if (status < 0)
142		return false;
143
144	return FIELD_GET(ADS1119_STATUS_DRDY_FIELD, status);
145}
146
147static int ads1119_reset(struct ads1119_state *st)
148{
149	st->cached_config = 0;
150
151	if (!st->reset_gpio)
152		return i2c_smbus_write_byte(st->client, ADS1119_CMD_RESET);
153
154	gpiod_set_value_cansleep(st->reset_gpio, 1);
155	udelay(1);
156	gpiod_set_value_cansleep(st->reset_gpio, 0);
157	udelay(1);
158
159	return 0;
160}
161
162static int ads1119_set_conv_mode(struct ads1119_state *st, bool continuous)
163{
164	unsigned int mode;
165
166	if (continuous)
167		mode = ADS1119_CM_CONTINUOUS;
168	else
169		mode = ADS1119_CM_SINGLE;
170
171	return ads1119_upd_cfg_reg(st, ADS1119_CONFIG_CM_FIELD,
172				   FIELD_PREP(ADS1119_CONFIG_CM_FIELD, mode));
173}
174
175static int ads1119_get_hw_gain(int gain)
176{
177	if (gain == 4)
178		return ADS1119_GAIN_4;
179	else
180		return ADS1119_GAIN_1;
181}
182
183static int ads1119_get_hw_datarate(int datarate)
184{
185	switch (datarate) {
186	case 90:
187		return ADS1119_DR_90_SPS;
188	case 330:
189		return ADS1119_DR_330_SPS;
190	case 1000:
191		return ADS1119_DR_1000_SPS;
192	case 20:
193	default:
194		return ADS1119_DR_20_SPS;
195	}
196}
197
198static int ads1119_configure_channel(struct ads1119_state *st, int mux,
199				     int gain, int datarate)
200{
201	int ret;
202
203	ret = ads1119_upd_cfg_reg(st, ADS1119_CONFIG_MUX_FIELD,
204				  FIELD_PREP(ADS1119_CONFIG_MUX_FIELD, mux));
205	if (ret)
206		return ret;
207
208	ret = ads1119_upd_cfg_reg(st, ADS1119_CONFIG_GAIN_FIELD,
209				  FIELD_PREP(ADS1119_CONFIG_GAIN_FIELD,
210					     ads1119_get_hw_gain(gain)));
211	if (ret)
212		return ret;
213
214	return ads1119_upd_cfg_reg(st, ADS1119_CONFIG_DR_FIELD,
215				   FIELD_PREP(ADS1119_CONFIG_DR_FIELD,
216					      ads1119_get_hw_datarate(datarate)));
217}
218
219static int ads1119_poll_data_ready(struct ads1119_state *st,
220				   struct iio_chan_spec const *chan)
221{
222	unsigned int datarate = st->channels_cfg[chan->address].datarate;
223	unsigned long wait_time;
224	bool data_ready;
225
226	/* Poll 5 times more than the data rate */
227	wait_time = DIV_ROUND_CLOSEST(MICRO, 5 * datarate);
228
229	return read_poll_timeout(ads1119_data_ready, data_ready,
230				 data_ready, wait_time,
231				 ADS1119_MAX_DRDY_TIMEOUT, false, st);
232}
233
234static int ads1119_read_data(struct ads1119_state *st,
235			     struct iio_chan_spec const *chan,
236			     unsigned int *val)
237{
238	unsigned int timeout;
239	int ret = 0;
240
241	timeout = msecs_to_jiffies(ADS1119_MAX_DRDY_TIMEOUT);
242
243	if (!st->client->irq) {
244		ret = ads1119_poll_data_ready(st, chan);
245		if (ret)
246			return ret;
247	} else if (!wait_for_completion_timeout(&st->completion, timeout)) {
248		return -ETIMEDOUT;
249	}
250
251	ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA);
252	if (ret < 0)
253		return ret;
254
255	*val = ret;
256
257	return 0;
258}
259
260static int ads1119_single_conversion(struct ads1119_state *st,
261				     struct iio_chan_spec const *chan,
262				     int *val,
263				     bool calib_offset)
264{
265	struct device *dev = &st->client->dev;
266	int mux = st->channels_cfg[chan->address].mux;
267	int gain = st->channels_cfg[chan->address].gain;
268	int datarate = st->channels_cfg[chan->address].datarate;
269	unsigned int sample;
270	int ret;
271
272	if (calib_offset)
273		mux = ADS1119_MUX_SHORTED;
274
275	ret = pm_runtime_resume_and_get(dev);
276	if (ret)
277		return ret;
278
279	ret = ads1119_configure_channel(st, mux, gain, datarate);
280	if (ret)
281		goto pdown;
282
283	if (st->client->irq)
284		reinit_completion(&st->completion);
285
286	ret = i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC);
287	if (ret)
288		goto pdown;
289
290	ret = ads1119_read_data(st, chan, &sample);
291	if (ret)
292		goto pdown;
293
294	*val = sign_extend32(sample, chan->scan_type.realbits - 1);
295	ret = IIO_VAL_INT;
296pdown:
297	pm_runtime_put_autosuspend(dev);
298	return ret;
299}
300
301static int ads1119_validate_datarate(struct ads1119_state *st, int datarate)
302{
303	switch (datarate) {
304	case 20:
305	case 90:
306	case 330:
307	case 1000:
308		return datarate;
309	default:
310		return -EINVAL;
311	}
312}
313
314static int ads1119_read_avail(struct iio_dev *indio_dev,
315			      struct iio_chan_spec const *chan,
316			      const int **vals, int *type, int *length,
317			      long mask)
318{
319	switch (mask) {
320	case IIO_CHAN_INFO_SCALE:
321		*type = IIO_VAL_FRACTIONAL;
322		*vals = ads1119_available_gains;
323		*length = ARRAY_SIZE(ads1119_available_gains);
324		return IIO_AVAIL_LIST;
325	case IIO_CHAN_INFO_SAMP_FREQ:
326		*type = IIO_VAL_INT;
327		*vals = ads1119_available_datarates;
328		*length = ARRAY_SIZE(ads1119_available_datarates);
329		return IIO_AVAIL_LIST;
330	default:
331		return -EINVAL;
332	}
333}
334
335static int ads1119_read_raw(struct iio_dev *indio_dev,
336			    struct iio_chan_spec const *chan, int *val,
337			    int *val2, long mask)
338{
339	struct ads1119_state *st = iio_priv(indio_dev);
340	unsigned int index = chan->address;
341	int ret;
342
343	if (index >= st->num_channels_cfg)
344		return -EINVAL;
345
346	switch (mask) {
347	case IIO_CHAN_INFO_RAW:
348		if (!iio_device_claim_direct(indio_dev))
349			return -EBUSY;
350		ret = ads1119_single_conversion(st, chan, val, false);
351		iio_device_release_direct(indio_dev);
352		return ret;
353	case IIO_CHAN_INFO_OFFSET:
354		if (!iio_device_claim_direct(indio_dev))
355			return -EBUSY;
356		ret = ads1119_single_conversion(st, chan, val, true);
357		iio_device_release_direct(indio_dev);
358		return ret;
359	case IIO_CHAN_INFO_SCALE:
360		*val = st->vref_uV / 1000;
361		*val /= st->channels_cfg[index].gain;
362		*val2 = chan->scan_type.realbits - 1;
363		return IIO_VAL_FRACTIONAL_LOG2;
364	case IIO_CHAN_INFO_SAMP_FREQ:
365		*val = st->channels_cfg[index].datarate;
366		return IIO_VAL_INT;
367	default:
368		return -EINVAL;
369	}
370}
371
372static int ads1119_write_raw(struct iio_dev *indio_dev,
373			     struct iio_chan_spec const *chan, int val,
374			     int val2, long mask)
375{
376	struct ads1119_state *st = iio_priv(indio_dev);
377	unsigned int index = chan->address;
378	int ret;
379
380	if (index >= st->num_channels_cfg)
381		return -EINVAL;
382
383	switch (mask) {
384	case IIO_CHAN_INFO_SCALE:
385		ret = MICRO / ((val * MICRO) + val2);
386		if (ret != 1 && ret != 4)
387			return -EINVAL;
388
389		st->channels_cfg[index].gain = ret;
390		return 0;
391	case IIO_CHAN_INFO_SAMP_FREQ:
392		ret = ads1119_validate_datarate(st, val);
393		if (ret < 0)
394			return ret;
395
396		st->channels_cfg[index].datarate = ret;
397		return 0;
398	default:
399		return -EINVAL;
400	}
401}
402
403static int ads1119_debugfs_reg_access(struct iio_dev *indio_dev,
404				      unsigned int reg, unsigned int writeval,
405				      unsigned int *readval)
406{
407	struct ads1119_state *st = iio_priv(indio_dev);
408	int ret;
409
410	if (reg > ADS1119_REG_STATUS)
411		return -EINVAL;
412
413	if (readval) {
414		ret = i2c_smbus_read_byte_data(st->client,
415					       ADS1119_CMD_RREG(reg));
416		if (ret < 0)
417			return ret;
418
419		*readval = ret;
420		return 0;
421	}
422
423	if (reg > ADS1119_REG_CONFIG)
424		return -EINVAL;
425
426	return i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG,
427					 writeval);
428}
429
430static const struct iio_info ads1119_info = {
431	.read_avail = ads1119_read_avail,
432	.read_raw = ads1119_read_raw,
433	.write_raw = ads1119_write_raw,
434	.debugfs_reg_access = ads1119_debugfs_reg_access,
435};
436
437static int ads1119_triggered_buffer_preenable(struct iio_dev *indio_dev)
438{
439	struct ads1119_state *st = iio_priv(indio_dev);
440	struct device *dev = &st->client->dev;
441	unsigned int index;
442	int ret;
443
444	index = find_first_bit(indio_dev->active_scan_mask,
445			       iio_get_masklength(indio_dev));
446
447	ret = ads1119_set_conv_mode(st, true);
448	if (ret)
449		return ret;
450
451	ret = ads1119_configure_channel(st,
452					st->channels_cfg[index].mux,
453					st->channels_cfg[index].gain,
454					st->channels_cfg[index].datarate);
455	if (ret)
456		return ret;
457
458	ret = pm_runtime_resume_and_get(dev);
459	if (ret)
460		return ret;
461
462	return i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC);
463}
464
465static int ads1119_triggered_buffer_postdisable(struct iio_dev *indio_dev)
466{
467	struct ads1119_state *st = iio_priv(indio_dev);
468	struct device *dev = &st->client->dev;
469	int ret;
470
471	ret = ads1119_set_conv_mode(st, false);
472	if (ret)
473		return ret;
474
475	pm_runtime_put_autosuspend(dev);
476
477	return 0;
478}
479
480static const struct iio_buffer_setup_ops ads1119_buffer_setup_ops = {
481	.preenable = ads1119_triggered_buffer_preenable,
482	.postdisable = ads1119_triggered_buffer_postdisable,
483	.validate_scan_mask = &iio_validate_scan_mask_onehot,
484};
485
486static const struct iio_trigger_ops ads1119_trigger_ops = {
487	.validate_device = &iio_trigger_validate_own_device,
488};
489
490static irqreturn_t ads1119_irq_handler(int irq, void *dev_id)
491{
492	struct iio_dev *indio_dev = dev_id;
493	struct ads1119_state *st = iio_priv(indio_dev);
494
495	if (iio_buffer_enabled(indio_dev) && iio_trigger_using_own(indio_dev))
496		iio_trigger_poll(indio_dev->trig);
497	else
498		complete(&st->completion);
499
500	return IRQ_HANDLED;
501}
502
503static irqreturn_t ads1119_trigger_handler(int irq, void *private)
504{
505	struct iio_poll_func *pf = private;
506	struct iio_dev *indio_dev = pf->indio_dev;
507	struct ads1119_state *st = iio_priv(indio_dev);
508	struct {
509		s16 sample;
510		aligned_s64 timestamp;
511	} scan = { };
512	unsigned int index;
513	int ret;
514
515	if (!iio_trigger_using_own(indio_dev)) {
516		index = find_first_bit(indio_dev->active_scan_mask,
517				       iio_get_masklength(indio_dev));
518
519		ret = ads1119_poll_data_ready(st, &indio_dev->channels[index]);
520		if (ret) {
521			dev_err(&st->client->dev,
522				"Failed to poll data on trigger (%d)\n", ret);
523			goto done;
524		}
525	}
526
527	ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA);
528	if (ret < 0) {
529		dev_err(&st->client->dev,
530			"Failed to read data on trigger (%d)\n", ret);
531		goto done;
532	}
533
534	scan.sample = ret;
535
536	iio_push_to_buffers_with_ts(indio_dev, &scan, sizeof(scan),
537				    iio_get_time_ns(indio_dev));
538done:
539	iio_trigger_notify_done(indio_dev->trig);
540	return IRQ_HANDLED;
541}
542
543static int ads1119_init(struct ads1119_state *st, bool vref_external)
544{
545	int ret;
546
547	ret = ads1119_reset(st);
548	if (ret)
549		return ret;
550
551	if (vref_external)
552		return ads1119_upd_cfg_reg(st,
553					   ADS1119_CONFIG_VREF_FIELD,
554					   FIELD_PREP(ADS1119_CONFIG_VREF_FIELD,
555						      ADS1119_VREF_EXTERNAL));
556	return 0;
557}
558
559static int ads1119_map_analog_inputs_mux(int ain_pos, int ain_neg,
560					 bool differential)
561{
562	if (ain_pos >= ADS1119_MAX_SINGLE_CHANNELS)
563		return -EINVAL;
564
565	if (!differential)
566		return ADS1119_MUX_AIN0 + ain_pos;
567
568	if (ain_pos == 0 && ain_neg == 1)
569		return ADS1119_MUX_AIN0_AIN1;
570	else if (ain_pos == 1 && ain_neg == 2)
571		return ADS1119_MUX_AIN1_AIN2;
572	else if (ain_pos == 2 && ain_neg == 3)
573		return ADS1119_MUX_AIN2_AIN3;
574
575	return -EINVAL;
576}
577
578static int ads1119_alloc_and_config_channels(struct iio_dev *indio_dev)
579{
580	const struct iio_chan_spec ads1119_channel =
581		(const struct iio_chan_spec) {
582		.type = IIO_VOLTAGE,
583		.indexed = 1,
584		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
585		BIT(IIO_CHAN_INFO_SCALE) |
586		BIT(IIO_CHAN_INFO_OFFSET) |
587		BIT(IIO_CHAN_INFO_SAMP_FREQ),
588		.info_mask_shared_by_all_available =
589		BIT(IIO_CHAN_INFO_SCALE) |
590		BIT(IIO_CHAN_INFO_SAMP_FREQ),
591		.scan_type = {
592			.sign = 's',
593			.realbits = 16,
594			.storagebits = 16,
595			.endianness = IIO_CPU,
596		},
597	};
598	const struct iio_chan_spec ads1119_ts = IIO_CHAN_SOFT_TIMESTAMP(0);
599	struct ads1119_state *st = iio_priv(indio_dev);
600	struct iio_chan_spec *iio_channels, *chan;
601	struct device *dev = &st->client->dev;
602	unsigned int num_channels, i;
603	bool differential;
604	u32 ain[2];
605	int ret;
606
607	st->num_channels_cfg = device_get_child_node_count(dev);
608	if (st->num_channels_cfg > ADS1119_MAX_CHANNELS)
609		return dev_err_probe(dev, -EINVAL,
610				     "Too many channels %d, max is %d\n",
611				     st->num_channels_cfg,
612				     ADS1119_MAX_CHANNELS);
613
614	st->channels_cfg = devm_kcalloc(dev, st->num_channels_cfg,
615					sizeof(*st->channels_cfg), GFP_KERNEL);
616	if (!st->channels_cfg)
617		return -ENOMEM;
618
619	/* Allocate one more iio channel for the timestamp */
620	num_channels = st->num_channels_cfg + 1;
621	iio_channels = devm_kcalloc(dev, num_channels, sizeof(*iio_channels),
622				    GFP_KERNEL);
623	if (!iio_channels)
624		return -ENOMEM;
625
626	i = 0;
627
628	device_for_each_child_node_scoped(dev, child) {
629		chan = &iio_channels[i];
630
631		differential = fwnode_property_present(child, "diff-channels");
632		if (differential)
633			ret = fwnode_property_read_u32_array(child,
634							     "diff-channels",
635							     ain, 2);
636		else
637			ret = fwnode_property_read_u32(child, "single-channel",
638						       &ain[0]);
639
640		if (ret)
641			return dev_err_probe(dev, ret,
642					     "Failed to get channel property\n");
643
644		ret = ads1119_map_analog_inputs_mux(ain[0], ain[1],
645						    differential);
646		if (ret < 0)
647			return dev_err_probe(dev, ret,
648					     "Invalid channel value\n");
649
650		st->channels_cfg[i].mux = ret;
651		st->channels_cfg[i].gain = ADS1119_DEFAULT_GAIN;
652		st->channels_cfg[i].datarate = ADS1119_DEFAULT_DATARATE;
653
654		*chan = ads1119_channel;
655		chan->channel = ain[0];
656		chan->address = i;
657		chan->scan_index = i;
658
659		if (differential) {
660			chan->channel2 = ain[1];
661			chan->differential = 1;
662		}
663
664		dev_dbg(dev, "channel: index %d, mux %d\n", i,
665			st->channels_cfg[i].mux);
666
667		i++;
668	}
669
670	iio_channels[i] = ads1119_ts;
671	iio_channels[i].address = i;
672	iio_channels[i].scan_index = i;
673
674	indio_dev->channels = iio_channels;
675	indio_dev->num_channels = num_channels;
676
677	return 0;
678}
679
680static void ads1119_powerdown(void *data)
681{
682	struct ads1119_state *st = data;
683
684	i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN);
685}
686
687static int ads1119_probe(struct i2c_client *client)
688{
689	struct iio_dev *indio_dev;
690	struct ads1119_state *st;
691	struct device *dev = &client->dev;
692	bool vref_external = true;
693	int ret;
694
695	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
696	if (!indio_dev)
697		return -ENOMEM;
698
699	st = iio_priv(indio_dev);
700	st->client = client;
701
702	indio_dev->name = "ads1119";
703	indio_dev->info = &ads1119_info;
704	indio_dev->modes = INDIO_DIRECT_MODE;
705
706	i2c_set_clientdata(client, indio_dev);
707
708	ret = devm_regulator_bulk_get_enable(dev,
709					     ARRAY_SIZE(ads1119_power_supplies),
710					     ads1119_power_supplies);
711	if (ret)
712		return dev_err_probe(dev, ret,
713				     "Failed to get and enable supplies\n");
714
715	st->vref_uV = devm_regulator_get_enable_read_voltage(dev, "vref");
716	if (st->vref_uV == -ENODEV) {
717		vref_external = false;
718		st->vref_uV = ADS1119_VREF_INTERNAL_VAL;
719	} else if (st->vref_uV < 0) {
720		return dev_err_probe(dev, st->vref_uV, "Failed to get vref\n");
721	}
722
723	st->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
724	if (IS_ERR(st->reset_gpio))
725		return dev_err_probe(dev, PTR_ERR(st->reset_gpio),
726				     "Failed to get reset gpio\n");
727
728	ret = ads1119_alloc_and_config_channels(indio_dev);
729	if (ret)
730		return ret;
731
732	init_completion(&st->completion);
733
734	ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
735					      ads1119_trigger_handler,
736					      &ads1119_buffer_setup_ops);
737	if (ret)
738		return dev_err_probe(dev, ret, "Failed to setup IIO buffer\n");
739
740	if (client->irq > 0) {
741		ret = devm_request_irq(dev, client->irq, ads1119_irq_handler,
742				       IRQF_NO_THREAD, "ads1119", indio_dev);
743		if (ret)
744			return dev_err_probe(dev, ret,
745					     "Failed to allocate irq\n");
746
747		st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
748						  indio_dev->name,
749						  iio_device_id(indio_dev));
750		if (!st->trig)
751			return -ENOMEM;
752
753		st->trig->ops = &ads1119_trigger_ops;
754		iio_trigger_set_drvdata(st->trig, indio_dev);
755
756		ret = devm_iio_trigger_register(dev, st->trig);
757		if (ret)
758			return dev_err_probe(dev, ret,
759					     "Failed to register IIO trigger\n");
760	}
761
762	ret = ads1119_init(st, vref_external);
763	if (ret)
764		return dev_err_probe(dev, ret,
765				     "Failed to initialize device\n");
766
767	pm_runtime_set_autosuspend_delay(dev, ADS1119_SUSPEND_DELAY);
768	pm_runtime_use_autosuspend(dev);
769	pm_runtime_mark_last_busy(dev);
770	pm_runtime_set_active(dev);
771
772	ret = devm_pm_runtime_enable(dev);
773	if (ret)
774		return dev_err_probe(dev, ret, "Failed to enable pm runtime\n");
775
776	ret = devm_add_action_or_reset(dev, ads1119_powerdown, st);
777	if (ret)
778		return ret;
779
780	return devm_iio_device_register(dev, indio_dev);
781}
782
783static int ads1119_runtime_suspend(struct device *dev)
784{
785	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
786	struct ads1119_state *st = iio_priv(indio_dev);
787
788	return i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN);
789}
790
791/*
792 * The ADS1119 does not require a resume function because it automatically
793 * powers on after a reset.
794 * After a power down command, the ADS1119 can still communicate but turns off
795 * its analog parts. To resume from power down, the device will power up again
796 * upon receiving a start/sync command.
797 */
798static DEFINE_RUNTIME_DEV_PM_OPS(ads1119_pm_ops, ads1119_runtime_suspend,
799				 NULL, NULL);
800
801static const struct of_device_id __maybe_unused ads1119_of_match[] = {
802	{ .compatible = "ti,ads1119" },
803	{ }
804};
805MODULE_DEVICE_TABLE(of, ads1119_of_match);
806
807static const struct i2c_device_id ads1119_id[] = {
808	{ "ads1119" },
809	{ }
810};
811MODULE_DEVICE_TABLE(i2c, ads1119_id);
812
813static struct i2c_driver ads1119_driver = {
814	.driver = {
815		.name = "ads1119",
816		.of_match_table = ads1119_of_match,
817		.pm = pm_ptr(&ads1119_pm_ops),
818	},
819	.probe = ads1119_probe,
820	.id_table = ads1119_id,
821};
822module_i2c_driver(ads1119_driver);
823
824MODULE_AUTHOR("João Paulo Gonçalves <joao.goncalves@toradex.com>");
825MODULE_DESCRIPTION("Texas Instruments ADS1119 ADC Driver");
826MODULE_LICENSE("GPL");
~/ Read-only file preview.