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