Lines Matching +full:max +full:- +full:channels +full:- +full:clocked
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
31 /* Max conversion high time (t_{CNVH}). */
33 /* Max conversion to MSB delay (t_{MSB}). */
47 /* AD7625_CHAN_SPEC - Define a chan spec structure for a specific chip */
75 * Waveforms containing the last-requested and rounded
85 * EN2 controls the device -3dB bandwidth (and by extension, max
189 cnv_wf.duty_length_ns = st->info->timing_spec->conv_high_ns; in ad7625_set_sampling_freq()
191 ret = pwm_round_waveform_might_sleep(st->cnv_pwm, &cnv_wf); in ad7625_set_sampling_freq()
202 st->info->chan_spec.scan_type.realbits, in ad7625_set_sampling_freq()
203 st->ref_clk_rate_hz); in ad7625_set_sampling_freq()
205 /* max t_MSB from datasheet */ in ad7625_set_sampling_freq()
206 clk_gate_wf.duty_offset_ns = st->info->timing_spec->conv_msb_ns; in ad7625_set_sampling_freq()
208 ret = pwm_round_waveform_might_sleep(st->clk_gate_pwm, &clk_gate_wf); in ad7625_set_sampling_freq()
212 st->cnv_wf = cnv_wf; in ad7625_set_sampling_freq()
213 st->clk_gate_wf = clk_gate_wf; in ad7625_set_sampling_freq()
216 target = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz, freq); in ad7625_set_sampling_freq()
217 st->sampling_freq_hz = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz, in ad7625_set_sampling_freq()
231 *val = st->sampling_freq_hz; in ad7625_read_raw()
236 *val = st->vref_mv; in ad7625_read_raw()
237 *val2 = chan->scan_type.realbits - 1; in ad7625_read_raw()
242 return -EINVAL; in ad7625_read_raw()
254 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) in ad7625_write_raw()
258 return -EINVAL; in ad7625_write_raw()
274 "adi,en%d-always-on", i); in ad7625_parse_mode()
275 /* Set the device to 0b0000 (power-down mode) by default */ in ad7625_parse_mode()
276 st->en_gpios[i] = devm_gpiod_get_optional(dev, en_gpio_buf, in ad7625_parse_mode()
278 if (IS_ERR(st->en_gpios[i])) in ad7625_parse_mode()
279 return dev_err_probe(dev, PTR_ERR(st->en_gpios[i]), in ad7625_parse_mode()
283 if (st->en_gpios[i] && en_always_on[i]) in ad7625_parse_mode()
284 return dev_err_probe(dev, -EINVAL, in ad7625_parse_mode()
285 "cannot have adi,en%d-always-on and en%d-gpios\n", i, i); in ad7625_parse_mode()
288 en_may_be_on[i] = en_always_on[i] || st->en_gpios[i]; in ad7625_parse_mode()
289 en_always_off[i] = !en_always_on[i] && !st->en_gpios[i]; in ad7625_parse_mode()
296 st->can_power_down = en_may_be_off[1] && en_may_be_off[0] && in ad7625_parse_mode()
297 st->info->has_power_down_state; in ad7625_parse_mode()
302 st->can_refin = en_may_be_off[1] && en_may_be_on[0]; in ad7625_parse_mode()
304 st->can_ref_4v096 = en_may_be_on[1] && en_may_be_off[0]; in ad7625_parse_mode()
306 /* Avoid AD796x-specific setup if the part is an AD762x */ in ad7625_parse_mode()
313 return dev_err_probe(dev, -EINVAL, in ad7625_parse_mode()
320 st->can_ref_5v = st->can_refin; in ad7625_parse_mode()
323 * specified and not hard-wired, then we can configure it to in ad7625_parse_mode()
326 st->can_narrow_bandwidth = en_may_be_on[2]; in ad7625_parse_mode()
328 st->can_wide_bandwidth = en_may_be_off[2]; in ad7625_parse_mode()
330 st->can_snooze = en_may_be_on[1] && en_may_be_on[0]; in ad7625_parse_mode()
332 st->can_test_pattern = en_may_be_off[3] && en_may_be_on[2] && in ad7625_parse_mode()
343 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7625_set_en_gpios_for_vref()
344 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7625_set_en_gpios_for_vref()
346 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7625_set_en_gpios_for_vref()
347 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7625_set_en_gpios_for_vref()
353 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7625_set_en_gpios_for_vref()
354 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7625_set_en_gpios_for_vref()
363 if (!st->can_power_down) in ad7960_set_mode()
364 return -EINVAL; in ad7960_set_mode()
366 gpiod_set_value_cansleep(st->en_gpios[2], 0); in ad7960_set_mode()
367 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7960_set_mode()
368 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7960_set_mode()
373 if (!st->can_snooze) in ad7960_set_mode()
374 return -EINVAL; in ad7960_set_mode()
376 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7960_set_mode()
377 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7960_set_mode()
382 if (!st->can_narrow_bandwidth) in ad7960_set_mode()
383 return -EINVAL; in ad7960_set_mode()
385 gpiod_set_value_cansleep(st->en_gpios[2], 1); in ad7960_set_mode()
391 if (!st->can_wide_bandwidth) in ad7960_set_mode()
392 return -EINVAL; in ad7960_set_mode()
394 gpiod_set_value_cansleep(st->en_gpios[2], 0); in ad7960_set_mode()
400 if (!st->can_test_pattern) in ad7960_set_mode()
401 return -EINVAL; in ad7960_set_mode()
403 gpiod_set_value_cansleep(st->en_gpios[3], 0); in ad7960_set_mode()
404 gpiod_set_value_cansleep(st->en_gpios[2], 1); in ad7960_set_mode()
405 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7960_set_mode()
406 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7960_set_mode()
411 return -EINVAL; in ad7960_set_mode()
420 ret = pwm_set_waveform_might_sleep(st->cnv_pwm, &st->cnv_wf, false); in ad7625_buffer_preenable()
424 ret = pwm_set_waveform_might_sleep(st->clk_gate_pwm, in ad7625_buffer_preenable()
425 &st->clk_gate_wf, false); in ad7625_buffer_preenable()
428 pwm_disable(st->cnv_pwm); in ad7625_buffer_preenable()
439 pwm_disable(st->clk_gate_pwm); in ad7625_buffer_postdisable()
440 pwm_disable(st->cnv_pwm); in ad7625_buffer_postdisable()
461 st->cnv_pwm = devm_pwm_get(dev, "cnv"); in devm_ad7625_pwm_get()
462 if (IS_ERR(st->cnv_pwm)) in devm_ad7625_pwm_get()
463 return dev_err_probe(dev, PTR_ERR(st->cnv_pwm), in devm_ad7625_pwm_get()
467 pwm_disable(st->cnv_pwm); in devm_ad7625_pwm_get()
469 st->clk_gate_pwm = devm_pwm_get(dev, "clk_gate"); in devm_ad7625_pwm_get()
470 if (IS_ERR(st->clk_gate_pwm)) in devm_ad7625_pwm_get()
471 return dev_err_probe(dev, PTR_ERR(st->clk_gate_pwm), in devm_ad7625_pwm_get()
475 pwm_disable(st->clk_gate_pwm); in devm_ad7625_pwm_get()
484 return dev_err_probe(dev, -EINVAL, in devm_ad7625_pwm_get()
487 st->ref_clk_rate_hz = ref_clk_rate_hz; in devm_ad7625_pwm_get()
494 * conditionally-optional (depending on part) REF and REFIN voltages
497 * Power-up info for the device says to bring up vio, then vdd2, then
501 * - internal reference: neither REF or REFIN is connected (invalid for
503 * - internal buffer, external reference: REF not connected, REFIN
505 * - external reference: REF connected, REFIN not connected
519 if (ret < 0 && ret != -ENODEV) in devm_ad7625_regulator_setup()
522 ref_mv = ret == -ENODEV ? 0 : ret / 1000; in devm_ad7625_regulator_setup()
525 if (ret < 0 && ret != -ENODEV) in devm_ad7625_regulator_setup()
528 st->have_refin = ret != -ENODEV; in devm_ad7625_regulator_setup()
530 if (st->have_refin && !st->can_refin) in devm_ad7625_regulator_setup()
531 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
534 if (!st->info->has_internal_vref && !st->have_refin && !ref_mv) in devm_ad7625_regulator_setup()
535 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
538 if (st->have_refin && ref_mv) in devm_ad7625_regulator_setup()
539 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
542 if (ref_mv == 4096 && !st->can_ref_4v096) in devm_ad7625_regulator_setup()
543 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
546 if (ref_mv == 5000 && !st->can_ref_5v) in devm_ad7625_regulator_setup()
547 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
550 st->vref_mv = ref_mv ?: AD7625_INTERNAL_REF_MV; in devm_ad7625_regulator_setup()
557 struct device *dev = &pdev->dev; in ad7625_probe()
565 return -ENOMEM; in ad7625_probe()
569 st->info = device_get_match_data(dev); in ad7625_probe()
570 if (!st->info) in ad7625_probe()
571 return dev_err_probe(dev, -EINVAL, "no chip info\n"); in ad7625_probe()
573 if (device_property_read_bool(dev, "adi,no-dco")) in ad7625_probe()
574 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
575 "self-clocked mode not supported\n"); in ad7625_probe()
577 if (st->info->has_bandwidth_control) in ad7625_probe()
590 if (!st->info->has_bandwidth_control) { in ad7625_probe()
591 ad7625_set_en_gpios_for_vref(st, st->have_refin, st->vref_mv); in ad7625_probe()
597 if (st->can_wide_bandwidth) { in ad7625_probe()
599 st->have_refin, st->vref_mv); in ad7625_probe()
600 } else if (st->can_narrow_bandwidth) { in ad7625_probe()
602 st->have_refin, st->vref_mv); in ad7625_probe()
604 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
609 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
617 indio_dev->channels = &st->info->chan_spec; in ad7625_probe()
618 indio_dev->num_channels = 1; in ad7625_probe()
619 indio_dev->name = st->info->name; in ad7625_probe()
620 indio_dev->info = &ad7625_info; in ad7625_probe()
621 indio_dev->setup_ops = &ad7625_buffer_setup_ops; in ad7625_probe()
623 st->back = devm_iio_backend_get(dev, NULL); in ad7625_probe()
624 if (IS_ERR(st->back)) in ad7625_probe()
625 return dev_err_probe(dev, PTR_ERR(st->back), in ad7625_probe()
628 ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev); in ad7625_probe()
632 ret = devm_iio_backend_enable(dev, st->back); in ad7625_probe()
641 default_sample_freq = st->info->max_sample_freq_hz; in ad7625_probe()
642 if (st->info->has_bandwidth_control && !st->can_wide_bandwidth) in ad7625_probe()