On 25/07/26 23:56, Jonathan Cameron wrote:
> On Wed, 22 Jul 2026 16:50:24 +0100
> Rodrigo Alencar via B4 Relay <[email protected]> 
> wrote:
> 
> > From: Rodrigo Alencar <[email protected]>
> > 
> > Expose frequency_source, phase_source and amplitude_source attributes in
> > debugfs. Those indicate from which channel the specific DDS parameter is
> > being sourced by returning its label. The implementation follows the
> > priority table found in the datasheet.
> > 
> For this one sashiko raised some questions and made me wonder how this
> actually works given it is using active_scan_masks and so far we don't
> have any buffered support in the driver.  My guess is you backported
> this from on top of some other code that you haven't posted yet.
> 
> Please have another check that this all works with just the series
> posted.
> 
> Note that you will need to claim buffer mode successfully to mess
> around with that in paths that aren't inherently only used in buffered
> mode.

Yes, I will drop that part for now.
 
> 
> 
> > @@ -2078,6 +2092,171 @@ static int ad9910_setup(struct device *dev, struct 
> > ad9910_state *st,
> >     return ad9910_io_update(st);
> >  }
> >  
> > +static inline const char *ad9910_frequency_source_get(struct iio_dev 
> > *indio_dev)
> > +{
> > +   struct ad9910_state *st = iio_priv(indio_dev);
> > +   bool ram_en, mode_en;
> > +
> > +   guard(mutex)(&st->lock);
> > +
> > +   /* RAM enabled and data destination is frequency */
> > +   ram_en = AD9910_RAM_ENABLED(st);
> > +   if (ram_en && AD9910_DEST_FREQUENCY ==
> > +                 FIELD_GET(AD9910_CFR1_RAM_PLAYBACK_DEST_MSK,
> > +                           st->reg[AD9910_REG_CFR1].val32))
> > +           return ad9910_channel_str[AD9910_CHAN_IDX_RAM];
> > +
> > +   /* DRG enabled and data destination is frequency */
> > +   mode_en = FIELD_GET(AD9910_CFR2_DRG_ENABLE_MSK,
> > +                       st->reg[AD9910_REG_CFR2].val32);
> > +   if (mode_en && AD9910_DEST_FREQUENCY ==
> > +                  FIELD_GET(AD9910_CFR2_DRG_DEST_MSK,
> > +                            st->reg[AD9910_REG_CFR2].val32))
> > +           return ad9910_channel_str[AD9910_CHAN_IDX_DRG_FREQ];
> > +
> > +   /* Parallel data port enabled and data destination is frequency */
> > +   mode_en = FIELD_GET(AD9910_CFR2_PARALLEL_DATA_PORT_EN_MSK,
> > +                       st->reg[AD9910_REG_CFR2].val32);
> > +   if (mode_en && indio_dev->active_scan_mask &&
> 
> active_scan_mask is only set on a call to iio_enable_buffers.
> So what is this checking?  I guess today it will always fail as
> active_scan_mask is NULL.  Once that is in use, it will be racy
> however, so you'll need to claim buffered mode (or fail in which
> case the null check isn't needed).  That claim will hold it
> in a particular state - under the hood it is taking mlock
> which is what sashiko suggests - that is just meant to be opaque
> to drivers so do it with an explicit attempt to claim buffered mode.

I will have buffer ops implemented, so I better cache the current
scan mask in a state variable and have that protected with the local lock.

I will drop those checks for now.

> 
> > +       test_bit(AD9910_SCAN_IDX_FREQ, indio_dev->active_scan_mask))
> > +           return ad9910_channel_str[AD9910_CHAN_IDX_PARALLEL_FREQ];
> > +
> > +   /* FTW: RAM enabled and data destination is phase, amplitude, or polar 
> > */
> > +   if (ram_en)
> > +           return ad9910_channel_str[AD9910_CHAN_IDX_RAM];
> > +
> > +   /* single tone profiles */
> > +   return ad9910_channel_str[AD9910_CHAN_IDX_PROFILE_0 + st->profile];
> > +}

-- 
Kind regards,

Rodrigo Alencar

Reply via email to