struct ad7625_timing_spec { /* Max conversion high time (t_{CNVH}). */ unsignedint conv_high_ns; /* Max conversion to MSB delay (t_{MSB}). */ unsignedint conv_msb_ns;
};
/* TODO: Add a rounding API for PWMs that can simplify this */
target = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz, freq);
st->sampling_freq_hz = DIV_ROUND_CLOSEST(st->ref_clk_rate_hz,
target);
return0;
}
staticint ad7625_read_raw(struct iio_dev *indio_dev, conststruct iio_chan_spec *chan, int *val, int *val2, long info)
{ struct ad7625_state *st = iio_priv(indio_dev);
switch (info) { case IIO_CHAN_INFO_SAMP_FREQ:
*val = st->sampling_freq_hz;
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = st->vref_mv;
*val2 = chan->scan_type.realbits - 1;
return IIO_VAL_FRACTIONAL_LOG2;
default: return -EINVAL;
}
}
staticint ad7625_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long info)
{ struct ad7625_state *st = iio_priv(indio_dev); int ret;
switch (info) { case IIO_CHAN_INFO_SAMP_FREQ: if (!iio_device_claim_direct(indio_dev)) return -EBUSY;
ret = ad7625_set_sampling_freq(st, val);
iio_device_release_direct(indio_dev); return ret; default: return -EINVAL;
}
}
for (i = 0; i < num_gpios; i++) {
snprintf(en_gpio_buf, sizeof(en_gpio_buf), "en%d", i);
snprintf(always_on_buf, sizeof(always_on_buf), "adi,en%d-always-on", i); /* Set the device to 0b0000 (power-down mode) by default */
st->en_gpios[i] = devm_gpiod_get_optional(dev, en_gpio_buf,
GPIOD_OUT_LOW); if (IS_ERR(st->en_gpios[i])) return dev_err_probe(dev, PTR_ERR(st->en_gpios[i]), "failed to get EN%d GPIO\n", i);
en_always_on[i] = device_property_read_bool(dev, always_on_buf); if (st->en_gpios[i] && en_always_on[i]) return dev_err_probe(dev, -EINVAL, "cannot have adi,en%d-always-on and en%d-gpios\n", i, i);
st->cnv_pwm = devm_pwm_get(dev, "cnv"); if (IS_ERR(st->cnv_pwm)) return dev_err_probe(dev, PTR_ERR(st->cnv_pwm), "failed to get cnv pwm\n");
/* Preemptively disable the PWM in case it was enabled at boot */
pwm_disable(st->cnv_pwm);
st->clk_gate_pwm = devm_pwm_get(dev, "clk_gate"); if (IS_ERR(st->clk_gate_pwm)) return dev_err_probe(dev, PTR_ERR(st->clk_gate_pwm), "failed to get clk_gate pwm\n");
/* Preemptively disable the PWM in case it was enabled at boot */
pwm_disable(st->clk_gate_pwm);
ref_clk = devm_clk_get_enabled(dev, NULL); if (IS_ERR(ref_clk)) return dev_err_probe(dev, PTR_ERR(ref_clk), "failed to get ref_clk\n");
ref_clk_rate_hz = clk_get_rate(ref_clk); if (!ref_clk_rate_hz) return dev_err_probe(dev, -EINVAL, "failed to get ref_clk rate\n");
ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names),
regulator_names); if (ret) return ret;
ret = devm_regulator_get_enable_read_voltage(dev, "ref"); if (ret < 0 && ret != -ENODEV) return dev_err_probe(dev, ret, "failed to get REF voltage\n");
ref_mv = ret == -ENODEV ? 0 : ret / 1000;
ret = devm_regulator_get_enable_optional(dev, "refin"); if (ret < 0 && ret != -ENODEV) return dev_err_probe(dev, ret, "failed to get REFIN voltage\n");
st->have_refin = ret != -ENODEV;
if (st->have_refin && !st->can_refin) return dev_err_probe(dev, -EINVAL, "REFIN provided in unsupported mode\n");
if (!st->info->has_internal_vref && !st->have_refin && !ref_mv) return dev_err_probe(dev, -EINVAL, "Need either REFIN or REF\n");
if (st->have_refin && ref_mv) return dev_err_probe(dev, -EINVAL, "cannot have both REFIN and REF supplies\n");
if (ref_mv == 4096 && !st->can_ref_4v096) return dev_err_probe(dev, -EINVAL, "REF is 4.096V in unsupported mode\n");
if (ref_mv == 5000 && !st->can_ref_5v) return dev_err_probe(dev, -EINVAL, "REF is 5V in unsupported mode\n");
indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); if (!indio_dev) return -ENOMEM;
st = iio_priv(indio_dev);
st->info = device_get_match_data(dev); if (!st->info) return dev_err_probe(dev, -EINVAL, "no chip info\n");
if (device_property_read_bool(dev, "adi,no-dco")) return dev_err_probe(dev, -EINVAL, "self-clocked mode not supported\n");
if (st->info->has_bandwidth_control)
ret = ad7625_parse_mode(dev, st, 4); else
ret = ad7625_parse_mode(dev, st, 2);
if (ret) return ret;
ret = devm_ad7625_regulator_setup(dev, st); if (ret) return ret;
/* Set the device mode based on detected EN configuration. */ if (!st->info->has_bandwidth_control) {
ad7625_set_en_gpios_for_vref(st, st->have_refin, st->vref_mv);
} else { /* *Ifneithersamplingmodeisavailable,thenreportanerror, *sincetheothermodesarenotusefuldefaults.
*/ if (st->can_wide_bandwidth) {
ret = ad7960_set_mode(st, AD7960_MODE_WIDE_BANDWIDTH,
st->have_refin, st->vref_mv);
} elseif (st->can_narrow_bandwidth) {
ret = ad7960_set_mode(st, AD7960_MODE_NARROW_BANDWIDTH,
st->have_refin, st->vref_mv);
} else { return dev_err_probe(dev, -EINVAL, "couldn't set device to wide or narrow bandwidth modes\n");
}
if (ret) return dev_err_probe(dev, -EINVAL, "failed to set EN pins\n");
}
ret = devm_ad7625_pwm_get(dev, st); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.