Message ID | 20250108-wip-bl-ad3552r-axi-v0-iio-testing-carlos-v2-3-2dac02f04638@baylibre.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | iio: ad3552r-hs: add support for ad3541/42r | expand |
On 1/8/25 11:29 AM, Angelo Dureghello wrote: > From: Angelo Dureghello <adureghello@baylibre.com> > > Change suggested from the AXI HDL team, modify the function > axi_dac_data_stream_enable() to check for interface busy, to avoid > possible issues when starting the stream. > > Fixes: e61d7178429a ("iio: dac: adi-axi-dac: extend features") > Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> > --- > drivers/iio/dac/adi-axi-dac.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/iio/dac/adi-axi-dac.c b/drivers/iio/dac/adi-axi-dac.c > index b143f7ed6847..d02eb535b648 100644 > --- a/drivers/iio/dac/adi-axi-dac.c > +++ b/drivers/iio/dac/adi-axi-dac.c > @@ -585,6 +585,17 @@ static int axi_dac_ddr_disable(struct iio_backend *back) > static int axi_dac_data_stream_enable(struct iio_backend *back) > { > struct axi_dac_state *st = iio_backend_get_priv(back); > + int ret, val; > + > + ret = regmap_read_poll_timeout(st->regmap, > + AXI_DAC_UI_STATUS_REG, val, > + FIELD_GET(AXI_DAC_UI_STATUS_IF_BUSY, val) == 0, > + 10, 100 * KILO); > + if (ret) { > + if (ret == -ETIMEDOUT) > + dev_err(st->dev, "AXI read timeout\n"); Do we really need the `dev_err()`? I think the ETIMEDOUT will bubble up to userspace anyway via buffer_postenable. If we keep it though, it could use a better message. The important part is that the AXI IP block never became ready, not that reading the register timed out. > + return ret; > + } > > return regmap_set_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, > AXI_DAC_CUSTOM_CTRL_STREAM_ENABLE); >
diff --git a/drivers/iio/dac/adi-axi-dac.c b/drivers/iio/dac/adi-axi-dac.c index b143f7ed6847..d02eb535b648 100644 --- a/drivers/iio/dac/adi-axi-dac.c +++ b/drivers/iio/dac/adi-axi-dac.c @@ -585,6 +585,17 @@ static int axi_dac_ddr_disable(struct iio_backend *back) static int axi_dac_data_stream_enable(struct iio_backend *back) { struct axi_dac_state *st = iio_backend_get_priv(back); + int ret, val; + + ret = regmap_read_poll_timeout(st->regmap, + AXI_DAC_UI_STATUS_REG, val, + FIELD_GET(AXI_DAC_UI_STATUS_IF_BUSY, val) == 0, + 10, 100 * KILO); + if (ret) { + if (ret == -ETIMEDOUT) + dev_err(st->dev, "AXI read timeout\n"); + return ret; + } return regmap_set_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, AXI_DAC_CUSTOM_CTRL_STREAM_ENABLE);