xref: /linux/drivers/iio/adc/ad7625.c (revision b7ffd0fa65e96283ab4cced9195b67bf9e7a2f2a)
1*b7ffd0faSTrevor Gamblin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2*b7ffd0faSTrevor Gamblin /*
3*b7ffd0faSTrevor Gamblin  * Analog Devices Inc. AD7625 ADC driver
4*b7ffd0faSTrevor Gamblin  *
5*b7ffd0faSTrevor Gamblin  * Copyright 2024 Analog Devices Inc.
6*b7ffd0faSTrevor Gamblin  * Copyright 2024 BayLibre, SAS
7*b7ffd0faSTrevor Gamblin  *
8*b7ffd0faSTrevor Gamblin  * Note that this driver requires the AXI ADC IP block configured for
9*b7ffd0faSTrevor Gamblin  * LVDS to function. See Documentation/iio/ad7625.rst for more
10*b7ffd0faSTrevor Gamblin  * information.
11*b7ffd0faSTrevor Gamblin  */
12*b7ffd0faSTrevor Gamblin 
13*b7ffd0faSTrevor Gamblin #include <linux/clk.h>
14*b7ffd0faSTrevor Gamblin #include <linux/device.h>
15*b7ffd0faSTrevor Gamblin #include <linux/err.h>
16*b7ffd0faSTrevor Gamblin #include <linux/gpio/consumer.h>
17*b7ffd0faSTrevor Gamblin #include <linux/iio/backend.h>
18*b7ffd0faSTrevor Gamblin #include <linux/iio/iio.h>
19*b7ffd0faSTrevor Gamblin #include <linux/kernel.h>
20*b7ffd0faSTrevor Gamblin #include <linux/mod_devicetable.h>
21*b7ffd0faSTrevor Gamblin #include <linux/module.h>
22*b7ffd0faSTrevor Gamblin #include <linux/platform_device.h>
23*b7ffd0faSTrevor Gamblin #include <linux/pwm.h>
24*b7ffd0faSTrevor Gamblin #include <linux/regulator/consumer.h>
25*b7ffd0faSTrevor Gamblin #include <linux/units.h>
26*b7ffd0faSTrevor Gamblin 
27*b7ffd0faSTrevor Gamblin #define AD7625_INTERNAL_REF_MV 4096
28*b7ffd0faSTrevor Gamblin #define AD7960_MAX_NBW_FREQ (2 * MEGA)
29*b7ffd0faSTrevor Gamblin 
30*b7ffd0faSTrevor Gamblin struct ad7625_timing_spec {
31*b7ffd0faSTrevor Gamblin 	/* Max conversion high time (t_{CNVH}). */
32*b7ffd0faSTrevor Gamblin 	unsigned int conv_high_ns;
33*b7ffd0faSTrevor Gamblin 	/* Max conversion to MSB delay (t_{MSB}). */
34*b7ffd0faSTrevor Gamblin 	unsigned int conv_msb_ns;
35*b7ffd0faSTrevor Gamblin };
36*b7ffd0faSTrevor Gamblin 
37*b7ffd0faSTrevor Gamblin struct ad7625_chip_info {
38*b7ffd0faSTrevor Gamblin 	const char *name;
39*b7ffd0faSTrevor Gamblin 	const unsigned int max_sample_freq_hz;
40*b7ffd0faSTrevor Gamblin 	const struct ad7625_timing_spec *timing_spec;
41*b7ffd0faSTrevor Gamblin 	const struct iio_chan_spec chan_spec;
42*b7ffd0faSTrevor Gamblin 	const bool has_power_down_state;
43*b7ffd0faSTrevor Gamblin 	const bool has_bandwidth_control;
44*b7ffd0faSTrevor Gamblin 	const bool has_internal_vref;
45*b7ffd0faSTrevor Gamblin };
46*b7ffd0faSTrevor Gamblin 
47*b7ffd0faSTrevor Gamblin /* AD7625_CHAN_SPEC - Define a chan spec structure for a specific chip */
48*b7ffd0faSTrevor Gamblin #define AD7625_CHAN_SPEC(_bits) {					\
49*b7ffd0faSTrevor Gamblin 	.type = IIO_VOLTAGE,						\
50*b7ffd0faSTrevor Gamblin 	.indexed = 1,							\
51*b7ffd0faSTrevor Gamblin 	.differential = 1,						\
52*b7ffd0faSTrevor Gamblin 	.channel = 0,							\
53*b7ffd0faSTrevor Gamblin 	.channel2 = 1,							\
54*b7ffd0faSTrevor Gamblin 	.info_mask_separate = BIT(IIO_CHAN_INFO_SCALE),			\
55*b7ffd0faSTrevor Gamblin 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
56*b7ffd0faSTrevor Gamblin 	.scan_index = 0,						\
57*b7ffd0faSTrevor Gamblin 	.scan_type.sign = 's',						\
58*b7ffd0faSTrevor Gamblin 	.scan_type.storagebits = (_bits) > 16 ? 32 : 16,		\
59*b7ffd0faSTrevor Gamblin 	.scan_type.realbits = (_bits),					\
60*b7ffd0faSTrevor Gamblin }
61*b7ffd0faSTrevor Gamblin 
62*b7ffd0faSTrevor Gamblin struct ad7625_state {
63*b7ffd0faSTrevor Gamblin 	const struct ad7625_chip_info *info;
64*b7ffd0faSTrevor Gamblin 	struct iio_backend *back;
65*b7ffd0faSTrevor Gamblin 	/* rate of the clock gated by the "clk_gate" PWM */
66*b7ffd0faSTrevor Gamblin 	u32 ref_clk_rate_hz;
67*b7ffd0faSTrevor Gamblin 	/* PWM burst signal for transferring acquired data to the host */
68*b7ffd0faSTrevor Gamblin 	struct pwm_device *clk_gate_pwm;
69*b7ffd0faSTrevor Gamblin 	/*
70*b7ffd0faSTrevor Gamblin 	 * PWM control signal for initiating data conversion. Analog
71*b7ffd0faSTrevor Gamblin 	 * inputs are sampled beginning on this signal's rising edge.
72*b7ffd0faSTrevor Gamblin 	 */
73*b7ffd0faSTrevor Gamblin 	struct pwm_device *cnv_pwm;
74*b7ffd0faSTrevor Gamblin 	/*
75*b7ffd0faSTrevor Gamblin 	 * Waveforms containing the last-requested and rounded
76*b7ffd0faSTrevor Gamblin 	 * properties for the clk_gate and cnv PWMs
77*b7ffd0faSTrevor Gamblin 	 */
78*b7ffd0faSTrevor Gamblin 	struct pwm_waveform clk_gate_wf;
79*b7ffd0faSTrevor Gamblin 	struct pwm_waveform cnv_wf;
80*b7ffd0faSTrevor Gamblin 	unsigned int vref_mv;
81*b7ffd0faSTrevor Gamblin 	u32 sampling_freq_hz;
82*b7ffd0faSTrevor Gamblin 	/*
83*b7ffd0faSTrevor Gamblin 	 * Optional GPIOs for controlling device state. EN0 and EN1
84*b7ffd0faSTrevor Gamblin 	 * determine voltage reference configuration and on/off state.
85*b7ffd0faSTrevor Gamblin 	 * EN2 controls the device -3dB bandwidth (and by extension, max
86*b7ffd0faSTrevor Gamblin 	 * sample rate). EN3 controls the VCM reference output. EN2 and
87*b7ffd0faSTrevor Gamblin 	 * EN3 are only present for the AD796x devices.
88*b7ffd0faSTrevor Gamblin 	 */
89*b7ffd0faSTrevor Gamblin 	struct gpio_desc *en_gpios[4];
90*b7ffd0faSTrevor Gamblin 	bool can_power_down;
91*b7ffd0faSTrevor Gamblin 	bool can_refin;
92*b7ffd0faSTrevor Gamblin 	bool can_ref_4v096;
93*b7ffd0faSTrevor Gamblin 	/*
94*b7ffd0faSTrevor Gamblin 	 * Indicate whether the bandwidth can be narrow (9MHz).
95*b7ffd0faSTrevor Gamblin 	 * When true, device sample rate must also be < 2MSPS.
96*b7ffd0faSTrevor Gamblin 	 */
97*b7ffd0faSTrevor Gamblin 	bool can_narrow_bandwidth;
98*b7ffd0faSTrevor Gamblin 	/* Indicate whether the bandwidth can be wide (28MHz). */
99*b7ffd0faSTrevor Gamblin 	bool can_wide_bandwidth;
100*b7ffd0faSTrevor Gamblin 	bool can_ref_5v;
101*b7ffd0faSTrevor Gamblin 	bool can_snooze;
102*b7ffd0faSTrevor Gamblin 	bool can_test_pattern;
103*b7ffd0faSTrevor Gamblin 	/* Indicate whether there is a REFIN supply connected */
104*b7ffd0faSTrevor Gamblin 	bool have_refin;
105*b7ffd0faSTrevor Gamblin };
106*b7ffd0faSTrevor Gamblin 
107*b7ffd0faSTrevor Gamblin static const struct ad7625_timing_spec ad7625_timing_spec = {
108*b7ffd0faSTrevor Gamblin 	.conv_high_ns = 40,
109*b7ffd0faSTrevor Gamblin 	.conv_msb_ns = 145,
110*b7ffd0faSTrevor Gamblin };
111*b7ffd0faSTrevor Gamblin 
112*b7ffd0faSTrevor Gamblin static const struct ad7625_timing_spec ad7626_timing_spec = {
113*b7ffd0faSTrevor Gamblin 	.conv_high_ns = 40,
114*b7ffd0faSTrevor Gamblin 	.conv_msb_ns = 80,
115*b7ffd0faSTrevor Gamblin };
116*b7ffd0faSTrevor Gamblin 
117*b7ffd0faSTrevor Gamblin /*
118*b7ffd0faSTrevor Gamblin  * conv_msb_ns is set to 0 instead of the datasheet maximum of 200ns to
119*b7ffd0faSTrevor Gamblin  * avoid exceeding the minimum conversion time, i.e. it is effectively
120*b7ffd0faSTrevor Gamblin  * modulo 200 and offset by a full period. Values greater than or equal
121*b7ffd0faSTrevor Gamblin  * to the period would be rejected by the PWM API.
122*b7ffd0faSTrevor Gamblin  */
123*b7ffd0faSTrevor Gamblin static const struct ad7625_timing_spec ad7960_timing_spec = {
124*b7ffd0faSTrevor Gamblin 	.conv_high_ns = 80,
125*b7ffd0faSTrevor Gamblin 	.conv_msb_ns = 0,
126*b7ffd0faSTrevor Gamblin };
127*b7ffd0faSTrevor Gamblin 
128*b7ffd0faSTrevor Gamblin static const struct ad7625_chip_info ad7625_chip_info = {
129*b7ffd0faSTrevor Gamblin 	.name = "ad7625",
130*b7ffd0faSTrevor Gamblin 	.max_sample_freq_hz = 6 * MEGA,
131*b7ffd0faSTrevor Gamblin 	.timing_spec = &ad7625_timing_spec,
132*b7ffd0faSTrevor Gamblin 	.chan_spec = AD7625_CHAN_SPEC(16),
133*b7ffd0faSTrevor Gamblin 	.has_power_down_state = false,
134*b7ffd0faSTrevor Gamblin 	.has_bandwidth_control = false,
135*b7ffd0faSTrevor Gamblin 	.has_internal_vref = true,
136*b7ffd0faSTrevor Gamblin };
137*b7ffd0faSTrevor Gamblin 
138*b7ffd0faSTrevor Gamblin static const struct ad7625_chip_info ad7626_chip_info = {
139*b7ffd0faSTrevor Gamblin 	.name = "ad7626",
140*b7ffd0faSTrevor Gamblin 	.max_sample_freq_hz = 10 * MEGA,
141*b7ffd0faSTrevor Gamblin 	.timing_spec = &ad7626_timing_spec,
142*b7ffd0faSTrevor Gamblin 	.chan_spec = AD7625_CHAN_SPEC(16),
143*b7ffd0faSTrevor Gamblin 	.has_power_down_state = true,
144*b7ffd0faSTrevor Gamblin 	.has_bandwidth_control = false,
145*b7ffd0faSTrevor Gamblin 	.has_internal_vref = true,
146*b7ffd0faSTrevor Gamblin };
147*b7ffd0faSTrevor Gamblin 
148*b7ffd0faSTrevor Gamblin static const struct ad7625_chip_info ad7960_chip_info = {
149*b7ffd0faSTrevor Gamblin 	.name = "ad7960",
150*b7ffd0faSTrevor Gamblin 	.max_sample_freq_hz = 5 * MEGA,
151*b7ffd0faSTrevor Gamblin 	.timing_spec = &ad7960_timing_spec,
152*b7ffd0faSTrevor Gamblin 	.chan_spec = AD7625_CHAN_SPEC(18),
153*b7ffd0faSTrevor Gamblin 	.has_power_down_state = true,
154*b7ffd0faSTrevor Gamblin 	.has_bandwidth_control = true,
155*b7ffd0faSTrevor Gamblin 	.has_internal_vref = false,
156*b7ffd0faSTrevor Gamblin };
157*b7ffd0faSTrevor Gamblin 
158*b7ffd0faSTrevor Gamblin static const struct ad7625_chip_info ad7961_chip_info = {
159*b7ffd0faSTrevor Gamblin 	.name = "ad7961",
160*b7ffd0faSTrevor Gamblin 	.max_sample_freq_hz = 5 * MEGA,
161*b7ffd0faSTrevor Gamblin 	.timing_spec = &ad7960_timing_spec,
162*b7ffd0faSTrevor Gamblin 	.chan_spec = AD7625_CHAN_SPEC(16),
163*b7ffd0faSTrevor Gamblin 	.has_power_down_state = true,
164*b7ffd0faSTrevor Gamblin 	.has_bandwidth_control = true,
165*b7ffd0faSTrevor Gamblin 	.has_internal_vref = false,
166*b7ffd0faSTrevor Gamblin };
167*b7ffd0faSTrevor Gamblin 
168*b7ffd0faSTrevor Gamblin enum ad7960_mode {
169*b7ffd0faSTrevor Gamblin 	AD7960_MODE_POWER_DOWN,
170*b7ffd0faSTrevor Gamblin 	AD7960_MODE_SNOOZE,
171*b7ffd0faSTrevor Gamblin 	AD7960_MODE_NARROW_BANDWIDTH,
172*b7ffd0faSTrevor Gamblin 	AD7960_MODE_WIDE_BANDWIDTH,
173*b7ffd0faSTrevor Gamblin 	AD7960_MODE_TEST_PATTERN,
174*b7ffd0faSTrevor Gamblin };
175*b7ffd0faSTrevor Gamblin 
176*b7ffd0faSTrevor Gamblin static int ad7625_set_sampling_freq(struct ad7625_state *st, u32 freq)
177*b7ffd0faSTrevor Gamblin {
178*b7ffd0faSTrevor Gamblin 	u32 target;
179*b7ffd0faSTrevor Gamblin 	struct pwm_waveform clk_gate_wf = { }, cnv_wf = { };
180*b7ffd0faSTrevor Gamblin 	int ret;
181*b7ffd0faSTrevor Gamblin 
182*b7ffd0faSTrevor Gamblin 	target = DIV_ROUND_UP(NSEC_PER_SEC, freq);
183*b7ffd0faSTrevor Gamblin 	cnv_wf.period_length_ns = clamp(target, 100, 10 * KILO);
184*b7ffd0faSTrevor Gamblin 
185*b7ffd0faSTrevor Gamblin 	/*
186*b7ffd0faSTrevor Gamblin 	 * Use the maximum conversion time t_CNVH from the datasheet as
187*b7ffd0faSTrevor Gamblin 	 * the duty_cycle for ref_clk, cnv, and clk_gate
188*b7ffd0faSTrevor Gamblin 	 */
189*b7ffd0faSTrevor Gamblin 	cnv_wf.duty_length_ns = st->info->timing_spec->conv_high_ns;
190*b7ffd0faSTrevor Gamblin 
191*b7ffd0faSTrevor Gamblin 	ret = pwm_round_waveform_might_sleep(st->cnv_pwm, &cnv_wf);
192*b7ffd0faSTrevor Gamblin 	if (ret)
193*b7ffd0faSTrevor Gamblin 		return ret;
194*b7ffd0faSTrevor Gamblin 
195*b7ffd0faSTrevor Gamblin 	/*
196*b7ffd0faSTrevor Gamblin 	 * Set up the burst signal for transferring data. period and
197*b7ffd0faSTrevor Gamblin 	 * offset should mirror the CNV signal
198*b7ffd0faSTrevor Gamblin 	 */
199*b7ffd0faSTrevor Gamblin 	clk_gate_wf.period_length_ns = cnv_wf.period_length_ns;
200*b7ffd0faSTrevor Gamblin 
201*b7ffd0faSTrevor Gamblin 	clk_gate_wf.duty_length_ns = DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC *
202*b7ffd0faSTrevor Gamblin 		st->info->chan_spec.scan_type.realbits,
203*b7ffd0faSTrevor Gamblin 		st->ref_clk_rate_hz);
204*b7ffd0faSTrevor Gamblin 
205*b7ffd0faSTrevor Gamblin 	/* max t_MSB from datasheet */
206*b7ffd0faSTrevor Gamblin 	clk_gate_wf.duty_offset_ns = st->info->timing_spec->conv_msb_ns;
207*b7ffd0faSTrevor Gamblin 
208*b7ffd0faSTrevor Gamblin 	ret = pwm_round_waveform_might_sleep(st->clk_gate_pwm, &clk_gate_wf);
209*b7ffd0faSTrevor Gamblin 	if (ret)
210*b7ffd0faSTrevor Gamblin 		return ret;
211*b7ffd0faSTrevor Gamblin 
212*b7ffd0faSTrevor Gamblin 	st->cnv_wf = cnv_wf;
213*b7ffd0faSTrevor Gamblin 	st->clk_gate_wf = clk_gate_wf;
214*b7ffd0faSTrevor Gamblin 
215*b7ffd0faSTrevor Gamblin 	/* TODO: Add a rounding API for PWMs that can simplify this */
216*b7ffd0faSTrevor Gamblin 	target = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz, freq);
217*b7ffd0faSTrevor Gamblin 	st->sampling_freq_hz = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz,
218*b7ffd0faSTrevor Gamblin 						 target);
219*b7ffd0faSTrevor Gamblin 
220*b7ffd0faSTrevor Gamblin 	return 0;
221*b7ffd0faSTrevor Gamblin }
222*b7ffd0faSTrevor Gamblin 
223*b7ffd0faSTrevor Gamblin static int ad7625_read_raw(struct iio_dev *indio_dev,
224*b7ffd0faSTrevor Gamblin 			   const struct iio_chan_spec *chan,
225*b7ffd0faSTrevor Gamblin 			   int *val, int *val2, long info)
226*b7ffd0faSTrevor Gamblin {
227*b7ffd0faSTrevor Gamblin 	struct ad7625_state *st = iio_priv(indio_dev);
228*b7ffd0faSTrevor Gamblin 
229*b7ffd0faSTrevor Gamblin 	switch (info) {
230*b7ffd0faSTrevor Gamblin 	case IIO_CHAN_INFO_SAMP_FREQ:
231*b7ffd0faSTrevor Gamblin 		*val = st->sampling_freq_hz;
232*b7ffd0faSTrevor Gamblin 
233*b7ffd0faSTrevor Gamblin 		return IIO_VAL_INT;
234*b7ffd0faSTrevor Gamblin 
235*b7ffd0faSTrevor Gamblin 	case IIO_CHAN_INFO_SCALE:
236*b7ffd0faSTrevor Gamblin 		*val = st->vref_mv;
237*b7ffd0faSTrevor Gamblin 		*val2 = chan->scan_type.realbits - 1;
238*b7ffd0faSTrevor Gamblin 
239*b7ffd0faSTrevor Gamblin 		return IIO_VAL_FRACTIONAL_LOG2;
240*b7ffd0faSTrevor Gamblin 
241*b7ffd0faSTrevor Gamblin 	default:
242*b7ffd0faSTrevor Gamblin 		return -EINVAL;
243*b7ffd0faSTrevor Gamblin 	}
244*b7ffd0faSTrevor Gamblin }
245*b7ffd0faSTrevor Gamblin 
246*b7ffd0faSTrevor Gamblin static int ad7625_write_raw(struct iio_dev *indio_dev,
247*b7ffd0faSTrevor Gamblin 			    struct iio_chan_spec const *chan,
248*b7ffd0faSTrevor Gamblin 			    int val, int val2, long info)
249*b7ffd0faSTrevor Gamblin {
250*b7ffd0faSTrevor Gamblin 	struct ad7625_state *st = iio_priv(indio_dev);
251*b7ffd0faSTrevor Gamblin 
252*b7ffd0faSTrevor Gamblin 	switch (info) {
253*b7ffd0faSTrevor Gamblin 	case IIO_CHAN_INFO_SAMP_FREQ:
254*b7ffd0faSTrevor Gamblin 		iio_device_claim_direct_scoped(return -EBUSY, indio_dev)
255*b7ffd0faSTrevor Gamblin 			return ad7625_set_sampling_freq(st, val);
256*b7ffd0faSTrevor Gamblin 		unreachable();
257*b7ffd0faSTrevor Gamblin 	default:
258*b7ffd0faSTrevor Gamblin 		return -EINVAL;
259*b7ffd0faSTrevor Gamblin 	}
260*b7ffd0faSTrevor Gamblin }
261*b7ffd0faSTrevor Gamblin 
262*b7ffd0faSTrevor Gamblin static int ad7625_parse_mode(struct device *dev, struct ad7625_state *st,
263*b7ffd0faSTrevor Gamblin 			     int num_gpios)
264*b7ffd0faSTrevor Gamblin {
265*b7ffd0faSTrevor Gamblin 	bool en_always_on[4], en_always_off[4];
266*b7ffd0faSTrevor Gamblin 	bool en_may_be_on[4], en_may_be_off[4];
267*b7ffd0faSTrevor Gamblin 	char en_gpio_buf[4];
268*b7ffd0faSTrevor Gamblin 	char always_on_buf[18];
269*b7ffd0faSTrevor Gamblin 	int i;
270*b7ffd0faSTrevor Gamblin 
271*b7ffd0faSTrevor Gamblin 	for (i = 0; i < num_gpios; i++) {
272*b7ffd0faSTrevor Gamblin 		snprintf(en_gpio_buf, sizeof(en_gpio_buf), "en%d", i);
273*b7ffd0faSTrevor Gamblin 		snprintf(always_on_buf, sizeof(always_on_buf),
274*b7ffd0faSTrevor Gamblin 			 "adi,en%d-always-on", i);
275*b7ffd0faSTrevor Gamblin 		/* Set the device to 0b0000 (power-down mode) by default */
276*b7ffd0faSTrevor Gamblin 		st->en_gpios[i] = devm_gpiod_get_optional(dev, en_gpio_buf,
277*b7ffd0faSTrevor Gamblin 							  GPIOD_OUT_LOW);
278*b7ffd0faSTrevor Gamblin 		if (IS_ERR(st->en_gpios[i]))
279*b7ffd0faSTrevor Gamblin 			return dev_err_probe(dev, PTR_ERR(st->en_gpios[i]),
280*b7ffd0faSTrevor Gamblin 					     "failed to get EN%d GPIO\n", i);
281*b7ffd0faSTrevor Gamblin 
282*b7ffd0faSTrevor Gamblin 		en_always_on[i] = device_property_read_bool(dev, always_on_buf);
283*b7ffd0faSTrevor Gamblin 		if (st->en_gpios[i] && en_always_on[i])
284*b7ffd0faSTrevor Gamblin 			return dev_err_probe(dev, -EINVAL,
285*b7ffd0faSTrevor Gamblin 				"cannot have adi,en%d-always-on and en%d-gpios\n", i, i);
286*b7ffd0faSTrevor Gamblin 
287*b7ffd0faSTrevor Gamblin 		en_may_be_off[i] = !en_always_on[i];
288*b7ffd0faSTrevor Gamblin 		en_may_be_on[i] = en_always_on[i] || st->en_gpios[i];
289*b7ffd0faSTrevor Gamblin 		en_always_off[i] = !en_always_on[i] && !st->en_gpios[i];
290*b7ffd0faSTrevor Gamblin 	}
291*b7ffd0faSTrevor Gamblin 
292*b7ffd0faSTrevor Gamblin 	/*
293*b7ffd0faSTrevor Gamblin 	 * Power down is mode 0bXX00, but not all devices have a valid
294*b7ffd0faSTrevor Gamblin 	 * power down state.
295*b7ffd0faSTrevor Gamblin 	 */
296*b7ffd0faSTrevor Gamblin 	st->can_power_down = en_may_be_off[1] && en_may_be_off[0] &&
297*b7ffd0faSTrevor Gamblin 			     st->info->has_power_down_state;
298*b7ffd0faSTrevor Gamblin 	/*
299*b7ffd0faSTrevor Gamblin 	 * The REFIN pin can take a 1.2V (AD762x) or 2.048V (AD796x)
300*b7ffd0faSTrevor Gamblin 	 * external reference when the mode is 0bXX01.
301*b7ffd0faSTrevor Gamblin 	 */
302*b7ffd0faSTrevor Gamblin 	st->can_refin = en_may_be_off[1] && en_may_be_on[0];
303*b7ffd0faSTrevor Gamblin 	/* 4.096V can be applied to REF when the EN mode is 0bXX10. */
304*b7ffd0faSTrevor Gamblin 	st->can_ref_4v096 = en_may_be_on[1] && en_may_be_off[0];
305*b7ffd0faSTrevor Gamblin 
306*b7ffd0faSTrevor Gamblin 	/* Avoid AD796x-specific setup if the part is an AD762x */
307*b7ffd0faSTrevor Gamblin 	if (num_gpios == 2)
308*b7ffd0faSTrevor Gamblin 		return 0;
309*b7ffd0faSTrevor Gamblin 
310*b7ffd0faSTrevor Gamblin 	/* mode 0b1100 (AD796x) is invalid */
311*b7ffd0faSTrevor Gamblin 	if (en_always_on[3] && en_always_on[2] &&
312*b7ffd0faSTrevor Gamblin 	    en_always_off[1] && en_always_off[0])
313*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
314*b7ffd0faSTrevor Gamblin 				     "EN GPIOs set to invalid mode 0b1100\n");
315*b7ffd0faSTrevor Gamblin 	/*
316*b7ffd0faSTrevor Gamblin 	 * 5V can be applied to the AD796x REF pin when the EN mode is
317*b7ffd0faSTrevor Gamblin 	 * the same (0bX001 or 0bX101) as for can_refin, and REFIN is
318*b7ffd0faSTrevor Gamblin 	 * 0V.
319*b7ffd0faSTrevor Gamblin 	 */
320*b7ffd0faSTrevor Gamblin 	st->can_ref_5v = st->can_refin;
321*b7ffd0faSTrevor Gamblin 	/*
322*b7ffd0faSTrevor Gamblin 	 * Bandwidth (AD796x) is controlled solely by EN2. If it's
323*b7ffd0faSTrevor Gamblin 	 * specified and not hard-wired, then we can configure it to
324*b7ffd0faSTrevor Gamblin 	 * change the bandwidth between 28MHz and 9MHz.
325*b7ffd0faSTrevor Gamblin 	 */
326*b7ffd0faSTrevor Gamblin 	st->can_narrow_bandwidth = en_may_be_on[2];
327*b7ffd0faSTrevor Gamblin 	/* Wide bandwidth mode is possible if EN2 can be 0. */
328*b7ffd0faSTrevor Gamblin 	st->can_wide_bandwidth = en_may_be_off[2];
329*b7ffd0faSTrevor Gamblin 	/* Snooze mode (AD796x) is 0bXX11 when REFIN = 0V. */
330*b7ffd0faSTrevor Gamblin 	st->can_snooze = en_may_be_on[1] && en_may_be_on[0];
331*b7ffd0faSTrevor Gamblin 	/* Test pattern mode (AD796x) is 0b0100. */
332*b7ffd0faSTrevor Gamblin 	st->can_test_pattern = en_may_be_off[3] && en_may_be_on[2] &&
333*b7ffd0faSTrevor Gamblin 			       en_may_be_off[1] && en_may_be_off[0];
334*b7ffd0faSTrevor Gamblin 
335*b7ffd0faSTrevor Gamblin 	return 0;
336*b7ffd0faSTrevor Gamblin }
337*b7ffd0faSTrevor Gamblin 
338*b7ffd0faSTrevor Gamblin /* Set EN1 and EN0 based on reference voltage source */
339*b7ffd0faSTrevor Gamblin static void ad7625_set_en_gpios_for_vref(struct ad7625_state *st,
340*b7ffd0faSTrevor Gamblin 					 bool have_refin, int ref_mv)
341*b7ffd0faSTrevor Gamblin {
342*b7ffd0faSTrevor Gamblin 	if (have_refin || ref_mv == 5000) {
343*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 0);
344*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 1);
345*b7ffd0faSTrevor Gamblin 	} else if (ref_mv == 4096) {
346*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 1);
347*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 0);
348*b7ffd0faSTrevor Gamblin 	} else {
349*b7ffd0faSTrevor Gamblin 		/*
350*b7ffd0faSTrevor Gamblin 		 * Unreachable by AD796x, since the driver will error if
351*b7ffd0faSTrevor Gamblin 		 * neither REF nor REFIN is provided
352*b7ffd0faSTrevor Gamblin 		 */
353*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 1);
354*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 1);
355*b7ffd0faSTrevor Gamblin 	}
356*b7ffd0faSTrevor Gamblin }
357*b7ffd0faSTrevor Gamblin 
358*b7ffd0faSTrevor Gamblin static int ad7960_set_mode(struct ad7625_state *st, enum ad7960_mode mode,
359*b7ffd0faSTrevor Gamblin 			   bool have_refin, int ref_mv)
360*b7ffd0faSTrevor Gamblin {
361*b7ffd0faSTrevor Gamblin 	switch (mode) {
362*b7ffd0faSTrevor Gamblin 	case AD7960_MODE_POWER_DOWN:
363*b7ffd0faSTrevor Gamblin 		if (!st->can_power_down)
364*b7ffd0faSTrevor Gamblin 			return -EINVAL;
365*b7ffd0faSTrevor Gamblin 
366*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[2], 0);
367*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 0);
368*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 0);
369*b7ffd0faSTrevor Gamblin 
370*b7ffd0faSTrevor Gamblin 		return 0;
371*b7ffd0faSTrevor Gamblin 
372*b7ffd0faSTrevor Gamblin 	case AD7960_MODE_SNOOZE:
373*b7ffd0faSTrevor Gamblin 		if (!st->can_snooze)
374*b7ffd0faSTrevor Gamblin 			return -EINVAL;
375*b7ffd0faSTrevor Gamblin 
376*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 1);
377*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 1);
378*b7ffd0faSTrevor Gamblin 
379*b7ffd0faSTrevor Gamblin 		return 0;
380*b7ffd0faSTrevor Gamblin 
381*b7ffd0faSTrevor Gamblin 	case AD7960_MODE_NARROW_BANDWIDTH:
382*b7ffd0faSTrevor Gamblin 		if (!st->can_narrow_bandwidth)
383*b7ffd0faSTrevor Gamblin 			return -EINVAL;
384*b7ffd0faSTrevor Gamblin 
385*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[2], 1);
386*b7ffd0faSTrevor Gamblin 		ad7625_set_en_gpios_for_vref(st, have_refin, ref_mv);
387*b7ffd0faSTrevor Gamblin 
388*b7ffd0faSTrevor Gamblin 		return 0;
389*b7ffd0faSTrevor Gamblin 
390*b7ffd0faSTrevor Gamblin 	case AD7960_MODE_WIDE_BANDWIDTH:
391*b7ffd0faSTrevor Gamblin 		if (!st->can_wide_bandwidth)
392*b7ffd0faSTrevor Gamblin 			return -EINVAL;
393*b7ffd0faSTrevor Gamblin 
394*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[2], 0);
395*b7ffd0faSTrevor Gamblin 		ad7625_set_en_gpios_for_vref(st, have_refin, ref_mv);
396*b7ffd0faSTrevor Gamblin 
397*b7ffd0faSTrevor Gamblin 		return 0;
398*b7ffd0faSTrevor Gamblin 
399*b7ffd0faSTrevor Gamblin 	case AD7960_MODE_TEST_PATTERN:
400*b7ffd0faSTrevor Gamblin 		if (!st->can_test_pattern)
401*b7ffd0faSTrevor Gamblin 			return -EINVAL;
402*b7ffd0faSTrevor Gamblin 
403*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[3], 0);
404*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[2], 1);
405*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[1], 0);
406*b7ffd0faSTrevor Gamblin 		gpiod_set_value_cansleep(st->en_gpios[0], 0);
407*b7ffd0faSTrevor Gamblin 
408*b7ffd0faSTrevor Gamblin 		return 0;
409*b7ffd0faSTrevor Gamblin 
410*b7ffd0faSTrevor Gamblin 	default:
411*b7ffd0faSTrevor Gamblin 		return -EINVAL;
412*b7ffd0faSTrevor Gamblin 	}
413*b7ffd0faSTrevor Gamblin }
414*b7ffd0faSTrevor Gamblin 
415*b7ffd0faSTrevor Gamblin static int ad7625_buffer_preenable(struct iio_dev *indio_dev)
416*b7ffd0faSTrevor Gamblin {
417*b7ffd0faSTrevor Gamblin 	struct ad7625_state *st = iio_priv(indio_dev);
418*b7ffd0faSTrevor Gamblin 	int ret;
419*b7ffd0faSTrevor Gamblin 
420*b7ffd0faSTrevor Gamblin 	ret = pwm_set_waveform_might_sleep(st->cnv_pwm, &st->cnv_wf, false);
421*b7ffd0faSTrevor Gamblin 	if (ret)
422*b7ffd0faSTrevor Gamblin 		return ret;
423*b7ffd0faSTrevor Gamblin 
424*b7ffd0faSTrevor Gamblin 	ret = pwm_set_waveform_might_sleep(st->clk_gate_pwm,
425*b7ffd0faSTrevor Gamblin 					   &st->clk_gate_wf, false);
426*b7ffd0faSTrevor Gamblin 	if (ret) {
427*b7ffd0faSTrevor Gamblin 		/* Disable cnv PWM if clk_gate setup failed */
428*b7ffd0faSTrevor Gamblin 		pwm_disable(st->cnv_pwm);
429*b7ffd0faSTrevor Gamblin 		return ret;
430*b7ffd0faSTrevor Gamblin 	}
431*b7ffd0faSTrevor Gamblin 
432*b7ffd0faSTrevor Gamblin 	return 0;
433*b7ffd0faSTrevor Gamblin }
434*b7ffd0faSTrevor Gamblin 
435*b7ffd0faSTrevor Gamblin static int ad7625_buffer_postdisable(struct iio_dev *indio_dev)
436*b7ffd0faSTrevor Gamblin {
437*b7ffd0faSTrevor Gamblin 	struct ad7625_state *st = iio_priv(indio_dev);
438*b7ffd0faSTrevor Gamblin 
439*b7ffd0faSTrevor Gamblin 	pwm_disable(st->clk_gate_pwm);
440*b7ffd0faSTrevor Gamblin 	pwm_disable(st->cnv_pwm);
441*b7ffd0faSTrevor Gamblin 
442*b7ffd0faSTrevor Gamblin 	return 0;
443*b7ffd0faSTrevor Gamblin }
444*b7ffd0faSTrevor Gamblin 
445*b7ffd0faSTrevor Gamblin static const struct iio_info ad7625_info = {
446*b7ffd0faSTrevor Gamblin 	.read_raw = ad7625_read_raw,
447*b7ffd0faSTrevor Gamblin 	.write_raw = ad7625_write_raw,
448*b7ffd0faSTrevor Gamblin };
449*b7ffd0faSTrevor Gamblin 
450*b7ffd0faSTrevor Gamblin static const struct iio_buffer_setup_ops ad7625_buffer_setup_ops = {
451*b7ffd0faSTrevor Gamblin 	.preenable = &ad7625_buffer_preenable,
452*b7ffd0faSTrevor Gamblin 	.postdisable = &ad7625_buffer_postdisable,
453*b7ffd0faSTrevor Gamblin };
454*b7ffd0faSTrevor Gamblin 
455*b7ffd0faSTrevor Gamblin static int devm_ad7625_pwm_get(struct device *dev,
456*b7ffd0faSTrevor Gamblin 			       struct ad7625_state *st)
457*b7ffd0faSTrevor Gamblin {
458*b7ffd0faSTrevor Gamblin 	struct clk *ref_clk;
459*b7ffd0faSTrevor Gamblin 	u32 ref_clk_rate_hz;
460*b7ffd0faSTrevor Gamblin 
461*b7ffd0faSTrevor Gamblin 	st->cnv_pwm = devm_pwm_get(dev, "cnv");
462*b7ffd0faSTrevor Gamblin 	if (IS_ERR(st->cnv_pwm))
463*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, PTR_ERR(st->cnv_pwm),
464*b7ffd0faSTrevor Gamblin 				     "failed to get cnv pwm\n");
465*b7ffd0faSTrevor Gamblin 
466*b7ffd0faSTrevor Gamblin 	/* Preemptively disable the PWM in case it was enabled at boot */
467*b7ffd0faSTrevor Gamblin 	pwm_disable(st->cnv_pwm);
468*b7ffd0faSTrevor Gamblin 
469*b7ffd0faSTrevor Gamblin 	st->clk_gate_pwm = devm_pwm_get(dev, "clk_gate");
470*b7ffd0faSTrevor Gamblin 	if (IS_ERR(st->clk_gate_pwm))
471*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, PTR_ERR(st->clk_gate_pwm),
472*b7ffd0faSTrevor Gamblin 				     "failed to get clk_gate pwm\n");
473*b7ffd0faSTrevor Gamblin 
474*b7ffd0faSTrevor Gamblin 	/* Preemptively disable the PWM in case it was enabled at boot */
475*b7ffd0faSTrevor Gamblin 	pwm_disable(st->clk_gate_pwm);
476*b7ffd0faSTrevor Gamblin 
477*b7ffd0faSTrevor Gamblin 	ref_clk = devm_clk_get_enabled(dev, NULL);
478*b7ffd0faSTrevor Gamblin 	if (IS_ERR(ref_clk))
479*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, PTR_ERR(ref_clk),
480*b7ffd0faSTrevor Gamblin 				     "failed to get ref_clk");
481*b7ffd0faSTrevor Gamblin 
482*b7ffd0faSTrevor Gamblin 	ref_clk_rate_hz = clk_get_rate(ref_clk);
483*b7ffd0faSTrevor Gamblin 	if (!ref_clk_rate_hz)
484*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
485*b7ffd0faSTrevor Gamblin 				     "failed to get ref_clk rate");
486*b7ffd0faSTrevor Gamblin 
487*b7ffd0faSTrevor Gamblin 	st->ref_clk_rate_hz = ref_clk_rate_hz;
488*b7ffd0faSTrevor Gamblin 
489*b7ffd0faSTrevor Gamblin 	return 0;
490*b7ffd0faSTrevor Gamblin }
491*b7ffd0faSTrevor Gamblin 
492*b7ffd0faSTrevor Gamblin /*
493*b7ffd0faSTrevor Gamblin  * There are three required input voltages for each device, plus two
494*b7ffd0faSTrevor Gamblin  * conditionally-optional (depending on part) REF and REFIN voltages
495*b7ffd0faSTrevor Gamblin  * where their validity depends upon the EN pin configuration.
496*b7ffd0faSTrevor Gamblin  *
497*b7ffd0faSTrevor Gamblin  * Power-up info for the device says to bring up vio, then vdd2, then
498*b7ffd0faSTrevor Gamblin  * vdd1, so list them in that order in the regulator_names array.
499*b7ffd0faSTrevor Gamblin  *
500*b7ffd0faSTrevor Gamblin  * The reference voltage source is determined like so:
501*b7ffd0faSTrevor Gamblin  * - internal reference: neither REF or REFIN is connected (invalid for
502*b7ffd0faSTrevor Gamblin  *   AD796x)
503*b7ffd0faSTrevor Gamblin  * - internal buffer, external reference: REF not connected, REFIN
504*b7ffd0faSTrevor Gamblin  *   connected
505*b7ffd0faSTrevor Gamblin  * - external reference: REF connected, REFIN not connected
506*b7ffd0faSTrevor Gamblin  */
507*b7ffd0faSTrevor Gamblin static int devm_ad7625_regulator_setup(struct device *dev,
508*b7ffd0faSTrevor Gamblin 				       struct ad7625_state *st)
509*b7ffd0faSTrevor Gamblin {
510*b7ffd0faSTrevor Gamblin 	static const char * const regulator_names[] = { "vio", "vdd2", "vdd1" };
511*b7ffd0faSTrevor Gamblin 	int ret, ref_mv;
512*b7ffd0faSTrevor Gamblin 
513*b7ffd0faSTrevor Gamblin 	ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names),
514*b7ffd0faSTrevor Gamblin 					     regulator_names);
515*b7ffd0faSTrevor Gamblin 	if (ret)
516*b7ffd0faSTrevor Gamblin 		return ret;
517*b7ffd0faSTrevor Gamblin 
518*b7ffd0faSTrevor Gamblin 	ret = devm_regulator_get_enable_read_voltage(dev, "ref");
519*b7ffd0faSTrevor Gamblin 	if (ret < 0 && ret != -ENODEV)
520*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, ret, "failed to get REF voltage\n");
521*b7ffd0faSTrevor Gamblin 
522*b7ffd0faSTrevor Gamblin 	ref_mv = ret == -ENODEV ? 0 : ret / 1000;
523*b7ffd0faSTrevor Gamblin 
524*b7ffd0faSTrevor Gamblin 	ret = devm_regulator_get_enable_optional(dev, "refin");
525*b7ffd0faSTrevor Gamblin 	if (ret < 0 && ret != -ENODEV)
526*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, ret, "failed to get REFIN voltage\n");
527*b7ffd0faSTrevor Gamblin 
528*b7ffd0faSTrevor Gamblin 	st->have_refin = ret != -ENODEV;
529*b7ffd0faSTrevor Gamblin 
530*b7ffd0faSTrevor Gamblin 	if (st->have_refin && !st->can_refin)
531*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
532*b7ffd0faSTrevor Gamblin 				     "REFIN provided in unsupported mode\n");
533*b7ffd0faSTrevor Gamblin 
534*b7ffd0faSTrevor Gamblin 	if (!st->info->has_internal_vref && !st->have_refin && !ref_mv)
535*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
536*b7ffd0faSTrevor Gamblin 				     "Need either REFIN or REF");
537*b7ffd0faSTrevor Gamblin 
538*b7ffd0faSTrevor Gamblin 	if (st->have_refin && ref_mv)
539*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
540*b7ffd0faSTrevor Gamblin 				     "cannot have both REFIN and REF supplies\n");
541*b7ffd0faSTrevor Gamblin 
542*b7ffd0faSTrevor Gamblin 	if (ref_mv == 4096 && !st->can_ref_4v096)
543*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
544*b7ffd0faSTrevor Gamblin 				     "REF is 4.096V in unsupported mode\n");
545*b7ffd0faSTrevor Gamblin 
546*b7ffd0faSTrevor Gamblin 	if (ref_mv == 5000 && !st->can_ref_5v)
547*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
548*b7ffd0faSTrevor Gamblin 				     "REF is 5V in unsupported mode\n");
549*b7ffd0faSTrevor Gamblin 
550*b7ffd0faSTrevor Gamblin 	st->vref_mv = ref_mv ?: AD7625_INTERNAL_REF_MV;
551*b7ffd0faSTrevor Gamblin 
552*b7ffd0faSTrevor Gamblin 	return 0;
553*b7ffd0faSTrevor Gamblin }
554*b7ffd0faSTrevor Gamblin 
555*b7ffd0faSTrevor Gamblin static int ad7625_probe(struct platform_device *pdev)
556*b7ffd0faSTrevor Gamblin {
557*b7ffd0faSTrevor Gamblin 	struct device *dev = &pdev->dev;
558*b7ffd0faSTrevor Gamblin 	struct iio_dev *indio_dev;
559*b7ffd0faSTrevor Gamblin 	struct ad7625_state *st;
560*b7ffd0faSTrevor Gamblin 	int ret;
561*b7ffd0faSTrevor Gamblin 	u32 default_sample_freq;
562*b7ffd0faSTrevor Gamblin 
563*b7ffd0faSTrevor Gamblin 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
564*b7ffd0faSTrevor Gamblin 	if (!indio_dev)
565*b7ffd0faSTrevor Gamblin 		return -ENOMEM;
566*b7ffd0faSTrevor Gamblin 
567*b7ffd0faSTrevor Gamblin 	st = iio_priv(indio_dev);
568*b7ffd0faSTrevor Gamblin 
569*b7ffd0faSTrevor Gamblin 	st->info = device_get_match_data(dev);
570*b7ffd0faSTrevor Gamblin 	if (!st->info)
571*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL, "no chip info\n");
572*b7ffd0faSTrevor Gamblin 
573*b7ffd0faSTrevor Gamblin 	if (device_property_read_bool(dev, "adi,no-dco"))
574*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, -EINVAL,
575*b7ffd0faSTrevor Gamblin 				     "self-clocked mode not supported\n");
576*b7ffd0faSTrevor Gamblin 
577*b7ffd0faSTrevor Gamblin 	if (st->info->has_bandwidth_control)
578*b7ffd0faSTrevor Gamblin 		ret = ad7625_parse_mode(dev, st, 4);
579*b7ffd0faSTrevor Gamblin 	else
580*b7ffd0faSTrevor Gamblin 		ret = ad7625_parse_mode(dev, st, 2);
581*b7ffd0faSTrevor Gamblin 
582*b7ffd0faSTrevor Gamblin 	if (ret)
583*b7ffd0faSTrevor Gamblin 		return ret;
584*b7ffd0faSTrevor Gamblin 
585*b7ffd0faSTrevor Gamblin 	ret = devm_ad7625_regulator_setup(dev, st);
586*b7ffd0faSTrevor Gamblin 	if (ret)
587*b7ffd0faSTrevor Gamblin 		return ret;
588*b7ffd0faSTrevor Gamblin 
589*b7ffd0faSTrevor Gamblin 	/* Set the device mode based on detected EN configuration. */
590*b7ffd0faSTrevor Gamblin 	if (!st->info->has_bandwidth_control) {
591*b7ffd0faSTrevor Gamblin 		ad7625_set_en_gpios_for_vref(st, st->have_refin, st->vref_mv);
592*b7ffd0faSTrevor Gamblin 	} else {
593*b7ffd0faSTrevor Gamblin 		/*
594*b7ffd0faSTrevor Gamblin 		 * If neither sampling mode is available, then report an error,
595*b7ffd0faSTrevor Gamblin 		 * since the other modes are not useful defaults.
596*b7ffd0faSTrevor Gamblin 		 */
597*b7ffd0faSTrevor Gamblin 		if (st->can_wide_bandwidth) {
598*b7ffd0faSTrevor Gamblin 			ret = ad7960_set_mode(st, AD7960_MODE_WIDE_BANDWIDTH,
599*b7ffd0faSTrevor Gamblin 					      st->have_refin, st->vref_mv);
600*b7ffd0faSTrevor Gamblin 		} else if (st->can_narrow_bandwidth) {
601*b7ffd0faSTrevor Gamblin 			ret = ad7960_set_mode(st, AD7960_MODE_NARROW_BANDWIDTH,
602*b7ffd0faSTrevor Gamblin 					      st->have_refin, st->vref_mv);
603*b7ffd0faSTrevor Gamblin 		} else {
604*b7ffd0faSTrevor Gamblin 			return dev_err_probe(dev, -EINVAL,
605*b7ffd0faSTrevor Gamblin 				"couldn't set device to wide or narrow bandwidth modes\n");
606*b7ffd0faSTrevor Gamblin 		}
607*b7ffd0faSTrevor Gamblin 
608*b7ffd0faSTrevor Gamblin 		if (ret)
609*b7ffd0faSTrevor Gamblin 			return dev_err_probe(dev, -EINVAL,
610*b7ffd0faSTrevor Gamblin 					     "failed to set EN pins\n");
611*b7ffd0faSTrevor Gamblin 	}
612*b7ffd0faSTrevor Gamblin 
613*b7ffd0faSTrevor Gamblin 	ret = devm_ad7625_pwm_get(dev, st);
614*b7ffd0faSTrevor Gamblin 	if (ret)
615*b7ffd0faSTrevor Gamblin 		return ret;
616*b7ffd0faSTrevor Gamblin 
617*b7ffd0faSTrevor Gamblin 	indio_dev->channels = &st->info->chan_spec;
618*b7ffd0faSTrevor Gamblin 	indio_dev->num_channels = 1;
619*b7ffd0faSTrevor Gamblin 	indio_dev->name = st->info->name;
620*b7ffd0faSTrevor Gamblin 	indio_dev->info = &ad7625_info;
621*b7ffd0faSTrevor Gamblin 	indio_dev->setup_ops = &ad7625_buffer_setup_ops;
622*b7ffd0faSTrevor Gamblin 
623*b7ffd0faSTrevor Gamblin 	st->back = devm_iio_backend_get(dev, NULL);
624*b7ffd0faSTrevor Gamblin 	if (IS_ERR(st->back))
625*b7ffd0faSTrevor Gamblin 		return dev_err_probe(dev, PTR_ERR(st->back),
626*b7ffd0faSTrevor Gamblin 				     "failed to get IIO backend");
627*b7ffd0faSTrevor Gamblin 
628*b7ffd0faSTrevor Gamblin 	ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev);
629*b7ffd0faSTrevor Gamblin 	if (ret)
630*b7ffd0faSTrevor Gamblin 		return ret;
631*b7ffd0faSTrevor Gamblin 
632*b7ffd0faSTrevor Gamblin 	ret = devm_iio_backend_enable(dev, st->back);
633*b7ffd0faSTrevor Gamblin 	if (ret)
634*b7ffd0faSTrevor Gamblin 		return ret;
635*b7ffd0faSTrevor Gamblin 
636*b7ffd0faSTrevor Gamblin 	/*
637*b7ffd0faSTrevor Gamblin 	 * Set the initial sampling frequency to the maximum, unless the
638*b7ffd0faSTrevor Gamblin 	 * AD796x device is limited to narrow bandwidth by EN2 == 1, in
639*b7ffd0faSTrevor Gamblin 	 * which case the sampling frequency should be limited to 2MSPS
640*b7ffd0faSTrevor Gamblin 	 */
641*b7ffd0faSTrevor Gamblin 	default_sample_freq = st->info->max_sample_freq_hz;
642*b7ffd0faSTrevor Gamblin 	if (st->info->has_bandwidth_control && !st->can_wide_bandwidth)
643*b7ffd0faSTrevor Gamblin 		default_sample_freq = AD7960_MAX_NBW_FREQ;
644*b7ffd0faSTrevor Gamblin 
645*b7ffd0faSTrevor Gamblin 	ret = ad7625_set_sampling_freq(st, default_sample_freq);
646*b7ffd0faSTrevor Gamblin 	if (ret)
647*b7ffd0faSTrevor Gamblin 		dev_err_probe(dev, ret,
648*b7ffd0faSTrevor Gamblin 			      "failed to set valid sampling frequency\n");
649*b7ffd0faSTrevor Gamblin 
650*b7ffd0faSTrevor Gamblin 	return devm_iio_device_register(dev, indio_dev);
651*b7ffd0faSTrevor Gamblin }
652*b7ffd0faSTrevor Gamblin 
653*b7ffd0faSTrevor Gamblin static const struct of_device_id ad7625_of_match[] = {
654*b7ffd0faSTrevor Gamblin 	{ .compatible = "adi,ad7625", .data = &ad7625_chip_info },
655*b7ffd0faSTrevor Gamblin 	{ .compatible = "adi,ad7626", .data = &ad7626_chip_info },
656*b7ffd0faSTrevor Gamblin 	{ .compatible = "adi,ad7960", .data = &ad7960_chip_info },
657*b7ffd0faSTrevor Gamblin 	{ .compatible = "adi,ad7961", .data = &ad7961_chip_info },
658*b7ffd0faSTrevor Gamblin 	{ }
659*b7ffd0faSTrevor Gamblin };
660*b7ffd0faSTrevor Gamblin MODULE_DEVICE_TABLE(of, ad7625_of_match);
661*b7ffd0faSTrevor Gamblin 
662*b7ffd0faSTrevor Gamblin static const struct platform_device_id ad7625_device_ids[] = {
663*b7ffd0faSTrevor Gamblin 	{ .name = "ad7625", .driver_data = (kernel_ulong_t)&ad7625_chip_info },
664*b7ffd0faSTrevor Gamblin 	{ .name = "ad7626", .driver_data = (kernel_ulong_t)&ad7626_chip_info },
665*b7ffd0faSTrevor Gamblin 	{ .name = "ad7960", .driver_data = (kernel_ulong_t)&ad7960_chip_info },
666*b7ffd0faSTrevor Gamblin 	{ .name = "ad7961", .driver_data = (kernel_ulong_t)&ad7961_chip_info },
667*b7ffd0faSTrevor Gamblin 	{ }
668*b7ffd0faSTrevor Gamblin };
669*b7ffd0faSTrevor Gamblin MODULE_DEVICE_TABLE(platform, ad7625_device_ids);
670*b7ffd0faSTrevor Gamblin 
671*b7ffd0faSTrevor Gamblin static struct platform_driver ad7625_driver = {
672*b7ffd0faSTrevor Gamblin 	.probe = ad7625_probe,
673*b7ffd0faSTrevor Gamblin 	.driver = {
674*b7ffd0faSTrevor Gamblin 		.name = "ad7625",
675*b7ffd0faSTrevor Gamblin 		.of_match_table = ad7625_of_match,
676*b7ffd0faSTrevor Gamblin 	},
677*b7ffd0faSTrevor Gamblin 	.id_table = ad7625_device_ids,
678*b7ffd0faSTrevor Gamblin };
679*b7ffd0faSTrevor Gamblin module_platform_driver(ad7625_driver);
680*b7ffd0faSTrevor Gamblin 
681*b7ffd0faSTrevor Gamblin MODULE_AUTHOR("Trevor Gamblin <tgamblin@baylibre.com>");
682*b7ffd0faSTrevor Gamblin MODULE_DESCRIPTION("Analog Devices AD7625 ADC");
683*b7ffd0faSTrevor Gamblin MODULE_LICENSE("Dual BSD/GPL");
684*b7ffd0faSTrevor Gamblin MODULE_IMPORT_NS(IIO_BACKEND);
685