Lines Matching +full:ref +full:- +full:clock +full:- +full:period +full:- +full:ns
1 // SPDX-License-Identifier: (GPL-2.0-only)
47 /* AD7625_CHAN_SPEC - Define a chan spec structure for a specific chip */
65 /* rate of the clock gated by the "clk_gate" PWM */
75 * Waveforms containing the last-requested and rounded
85 * EN2 controls the device -3dB bandwidth (and by extension, max
118 * conv_msb_ns is set to 0 instead of the datasheet maximum of 200ns to
120 * modulo 200 and offset by a full period. Values greater than or equal
121 * to the period would be rejected by the PWM API.
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()
196 * Set up the burst signal for transferring data. period and 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()
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()
256 return -EBUSY; in ad7625_write_raw()
261 return -EINVAL; in ad7625_write_raw()
277 "adi,en%d-always-on", i); in ad7625_parse_mode()
278 /* Set the device to 0b0000 (power-down mode) by default */ in ad7625_parse_mode()
279 st->en_gpios[i] = devm_gpiod_get_optional(dev, en_gpio_buf, in ad7625_parse_mode()
281 if (IS_ERR(st->en_gpios[i])) in ad7625_parse_mode()
282 return dev_err_probe(dev, PTR_ERR(st->en_gpios[i]), in ad7625_parse_mode()
286 if (st->en_gpios[i] && en_always_on[i]) in ad7625_parse_mode()
287 return dev_err_probe(dev, -EINVAL, in ad7625_parse_mode()
288 "cannot have adi,en%d-always-on and en%d-gpios\n", i, i); in ad7625_parse_mode()
291 en_may_be_on[i] = en_always_on[i] || st->en_gpios[i]; in ad7625_parse_mode()
292 en_always_off[i] = !en_always_on[i] && !st->en_gpios[i]; in ad7625_parse_mode()
299 st->can_power_down = en_may_be_off[1] && en_may_be_off[0] && in ad7625_parse_mode()
300 st->info->has_power_down_state; in ad7625_parse_mode()
305 st->can_refin = en_may_be_off[1] && en_may_be_on[0]; in ad7625_parse_mode()
306 /* 4.096V can be applied to REF when the EN mode is 0bXX10. */ in ad7625_parse_mode()
307 st->can_ref_4v096 = en_may_be_on[1] && en_may_be_off[0]; in ad7625_parse_mode()
309 /* Avoid AD796x-specific setup if the part is an AD762x */ in ad7625_parse_mode()
316 return dev_err_probe(dev, -EINVAL, in ad7625_parse_mode()
319 * 5V can be applied to the AD796x REF pin when the EN mode is in ad7625_parse_mode()
323 st->can_ref_5v = st->can_refin; in ad7625_parse_mode()
326 * specified and not hard-wired, then we can configure it to in ad7625_parse_mode()
329 st->can_narrow_bandwidth = en_may_be_on[2]; in ad7625_parse_mode()
331 st->can_wide_bandwidth = en_may_be_off[2]; in ad7625_parse_mode()
333 st->can_snooze = en_may_be_on[1] && en_may_be_on[0]; in ad7625_parse_mode()
335 st->can_test_pattern = en_may_be_off[3] && en_may_be_on[2] && in ad7625_parse_mode()
346 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7625_set_en_gpios_for_vref()
347 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7625_set_en_gpios_for_vref()
349 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7625_set_en_gpios_for_vref()
350 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7625_set_en_gpios_for_vref()
354 * neither REF nor REFIN is provided in ad7625_set_en_gpios_for_vref()
356 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7625_set_en_gpios_for_vref()
357 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7625_set_en_gpios_for_vref()
366 if (!st->can_power_down) in ad7960_set_mode()
367 return -EINVAL; in ad7960_set_mode()
369 gpiod_set_value_cansleep(st->en_gpios[2], 0); in ad7960_set_mode()
370 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7960_set_mode()
371 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7960_set_mode()
376 if (!st->can_snooze) in ad7960_set_mode()
377 return -EINVAL; in ad7960_set_mode()
379 gpiod_set_value_cansleep(st->en_gpios[1], 1); in ad7960_set_mode()
380 gpiod_set_value_cansleep(st->en_gpios[0], 1); in ad7960_set_mode()
385 if (!st->can_narrow_bandwidth) in ad7960_set_mode()
386 return -EINVAL; in ad7960_set_mode()
388 gpiod_set_value_cansleep(st->en_gpios[2], 1); in ad7960_set_mode()
394 if (!st->can_wide_bandwidth) in ad7960_set_mode()
395 return -EINVAL; in ad7960_set_mode()
397 gpiod_set_value_cansleep(st->en_gpios[2], 0); in ad7960_set_mode()
403 if (!st->can_test_pattern) in ad7960_set_mode()
404 return -EINVAL; in ad7960_set_mode()
406 gpiod_set_value_cansleep(st->en_gpios[3], 0); in ad7960_set_mode()
407 gpiod_set_value_cansleep(st->en_gpios[2], 1); in ad7960_set_mode()
408 gpiod_set_value_cansleep(st->en_gpios[1], 0); in ad7960_set_mode()
409 gpiod_set_value_cansleep(st->en_gpios[0], 0); in ad7960_set_mode()
414 return -EINVAL; in ad7960_set_mode()
423 ret = pwm_set_waveform_might_sleep(st->cnv_pwm, &st->cnv_wf, false); in ad7625_buffer_preenable()
427 ret = pwm_set_waveform_might_sleep(st->clk_gate_pwm, in ad7625_buffer_preenable()
428 &st->clk_gate_wf, false); in ad7625_buffer_preenable()
431 pwm_disable(st->cnv_pwm); in ad7625_buffer_preenable()
442 pwm_disable(st->clk_gate_pwm); in ad7625_buffer_postdisable()
443 pwm_disable(st->cnv_pwm); in ad7625_buffer_postdisable()
464 st->cnv_pwm = devm_pwm_get(dev, "cnv"); in devm_ad7625_pwm_get()
465 if (IS_ERR(st->cnv_pwm)) in devm_ad7625_pwm_get()
466 return dev_err_probe(dev, PTR_ERR(st->cnv_pwm), in devm_ad7625_pwm_get()
470 pwm_disable(st->cnv_pwm); in devm_ad7625_pwm_get()
472 st->clk_gate_pwm = devm_pwm_get(dev, "clk_gate"); in devm_ad7625_pwm_get()
473 if (IS_ERR(st->clk_gate_pwm)) in devm_ad7625_pwm_get()
474 return dev_err_probe(dev, PTR_ERR(st->clk_gate_pwm), in devm_ad7625_pwm_get()
478 pwm_disable(st->clk_gate_pwm); in devm_ad7625_pwm_get()
487 return dev_err_probe(dev, -EINVAL, in devm_ad7625_pwm_get()
490 st->ref_clk_rate_hz = ref_clk_rate_hz; in devm_ad7625_pwm_get()
497 * conditionally-optional (depending on part) REF and REFIN voltages
500 * Power-up info for the device says to bring up vio, then vdd2, then
504 * - internal reference: neither REF or REFIN is connected (invalid for
506 * - internal buffer, external reference: REF not connected, REFIN
508 * - external reference: REF connected, REFIN not connected
521 ret = devm_regulator_get_enable_read_voltage(dev, "ref"); in devm_ad7625_regulator_setup()
522 if (ret < 0 && ret != -ENODEV) in devm_ad7625_regulator_setup()
523 return dev_err_probe(dev, ret, "failed to get REF voltage\n"); in devm_ad7625_regulator_setup()
525 ref_mv = ret == -ENODEV ? 0 : ret / 1000; in devm_ad7625_regulator_setup()
528 if (ret < 0 && ret != -ENODEV) in devm_ad7625_regulator_setup()
531 st->have_refin = ret != -ENODEV; in devm_ad7625_regulator_setup()
533 if (st->have_refin && !st->can_refin) in devm_ad7625_regulator_setup()
534 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
537 if (!st->info->has_internal_vref && !st->have_refin && !ref_mv) in devm_ad7625_regulator_setup()
538 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
539 "Need either REFIN or REF\n"); in devm_ad7625_regulator_setup()
541 if (st->have_refin && ref_mv) in devm_ad7625_regulator_setup()
542 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
543 "cannot have both REFIN and REF supplies\n"); in devm_ad7625_regulator_setup()
545 if (ref_mv == 4096 && !st->can_ref_4v096) in devm_ad7625_regulator_setup()
546 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
547 "REF is 4.096V in unsupported mode\n"); in devm_ad7625_regulator_setup()
549 if (ref_mv == 5000 && !st->can_ref_5v) in devm_ad7625_regulator_setup()
550 return dev_err_probe(dev, -EINVAL, in devm_ad7625_regulator_setup()
551 "REF is 5V in unsupported mode\n"); in devm_ad7625_regulator_setup()
553 st->vref_mv = ref_mv ?: AD7625_INTERNAL_REF_MV; in devm_ad7625_regulator_setup()
560 struct device *dev = &pdev->dev; in ad7625_probe()
568 return -ENOMEM; in ad7625_probe()
572 st->info = device_get_match_data(dev); in ad7625_probe()
573 if (!st->info) in ad7625_probe()
574 return dev_err_probe(dev, -EINVAL, "no chip info\n"); in ad7625_probe()
576 if (device_property_read_bool(dev, "adi,no-dco")) in ad7625_probe()
577 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
578 "self-clocked mode not supported\n"); in ad7625_probe()
580 if (st->info->has_bandwidth_control) in ad7625_probe()
593 if (!st->info->has_bandwidth_control) { in ad7625_probe()
594 ad7625_set_en_gpios_for_vref(st, st->have_refin, st->vref_mv); in ad7625_probe()
600 if (st->can_wide_bandwidth) { in ad7625_probe()
602 st->have_refin, st->vref_mv); in ad7625_probe()
603 } else if (st->can_narrow_bandwidth) { in ad7625_probe()
605 st->have_refin, st->vref_mv); in ad7625_probe()
607 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
612 return dev_err_probe(dev, -EINVAL, in ad7625_probe()
620 indio_dev->channels = &st->info->chan_spec; in ad7625_probe()
621 indio_dev->num_channels = 1; in ad7625_probe()
622 indio_dev->name = st->info->name; in ad7625_probe()
623 indio_dev->info = &ad7625_info; in ad7625_probe()
624 indio_dev->setup_ops = &ad7625_buffer_setup_ops; in ad7625_probe()
626 st->back = devm_iio_backend_get(dev, NULL); in ad7625_probe()
627 if (IS_ERR(st->back)) in ad7625_probe()
628 return dev_err_probe(dev, PTR_ERR(st->back), in ad7625_probe()
631 ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev); in ad7625_probe()
635 ret = devm_iio_backend_enable(dev, st->back); in ad7625_probe()
644 default_sample_freq = st->info->max_sample_freq_hz; in ad7625_probe()
645 if (st->info->has_bandwidth_control && !st->can_wide_bandwidth) in ad7625_probe()