* [PATCH v2 0/3] Fix and refactor output disable logic
@ 2025-04-20 17:47 Gabriel Shahrouzi
2025-04-20 17:47 ` [PATCH v2 1/3] iio: frequency: Use SLEEP bit instead of RESET to disable output Gabriel Shahrouzi
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Gabriel Shahrouzi @ 2025-04-20 17:47 UTC (permalink / raw)
To: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging,
Michael.Hennerich
Cc: gshahrouzi, skhan, linux-kernel-mentees
Patch 1 includes the initial fix.
Patch 2 refactors the code to use the out_altvoltage_powerdown ABI.
Patch 3 adds small improvements by minimizing the size of types and
doing a redundancy check.
Not sure whether to include a read function for powerdown as well since
all the other attributes only had write permissions. I can also do this
for the other attributes to help modernize the driver.
Gabriel Shahrouzi (3):
iio: frequency: Use SLEEP bit instead of RESET to disable output
staging: iio: ad9832: Refactor powerdown control
staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown
drivers/staging/iio/frequency/ad9832.c | 50 ++++++++++++++++++--------
1 file changed, 36 insertions(+), 14 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v2 1/3] iio: frequency: Use SLEEP bit instead of RESET to disable output 2025-04-20 17:47 [PATCH v2 0/3] Fix and refactor output disable logic Gabriel Shahrouzi @ 2025-04-20 17:47 ` Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 2/3] staging: iio: ad9832: Refactor powerdown control Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown Gabriel Shahrouzi 2 siblings, 0 replies; 7+ messages in thread From: Gabriel Shahrouzi @ 2025-04-20 17:47 UTC (permalink / raw) To: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich Cc: gshahrouzi, skhan, linux-kernel-mentees, stable According to the AD9832 datasheet (Table 10, D12 description), setting the RESET bit forces the phase accumulator to zero, which corresponds to a full-scale DC output, rather than disabling the output signal. The correct way to disable the output and enter a low-power state is to set the AD9832_SLEEP bit (Table 10, D13 description), which powers down the internal DAC current sources and disables internal clocks. Fixes: ea707584bac1 ("Staging: IIO: DDS: AD9832 / AD9835 driver") Cc: stable@vger.kernel.org Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> --- drivers/staging/iio/frequency/ad9832.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c index db42810c7664b..0872ff4ec4896 100644 --- a/drivers/staging/iio/frequency/ad9832.c +++ b/drivers/staging/iio/frequency/ad9832.c @@ -232,7 +232,7 @@ static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, st->ctrl_src &= ~(AD9832_RESET | AD9832_SLEEP | AD9832_CLR); else - st->ctrl_src |= AD9832_RESET; + st->ctrl_src |= AD9832_SLEEP; st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | st->ctrl_src); -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/3] staging: iio: ad9832: Refactor powerdown control 2025-04-20 17:47 [PATCH v2 0/3] Fix and refactor output disable logic Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 1/3] iio: frequency: Use SLEEP bit instead of RESET to disable output Gabriel Shahrouzi @ 2025-04-20 17:47 ` Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown Gabriel Shahrouzi 2 siblings, 0 replies; 7+ messages in thread From: Gabriel Shahrouzi @ 2025-04-20 17:47 UTC (permalink / raw) To: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich Cc: gshahrouzi, skhan, linux-kernel-mentees Replace custom implementation with out_altvoltage_powerdown ABI. The attribute's logic is inverted (1 now enables powerdown) to match the standard. Modernize driver by using the standard IIO interface. Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> --- drivers/staging/iio/frequency/ad9832.c | 44 ++++++++++++++++++-------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c index 0872ff4ec4896..a8fc20379efed 100644 --- a/drivers/staging/iio/frequency/ad9832.c +++ b/drivers/staging/iio/frequency/ad9832.c @@ -167,6 +167,34 @@ static int ad9832_write_phase(struct ad9832_state *st, return spi_sync(st->spi, &st->phase_msg); } +static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct ad9832_state *st = iio_priv(indio_dev); + int ret; + unsigned long val; + + ret = kstrtoul(buf, 10, &val); + if (ret) + goto error_ret; + + mutex_lock(&st->lock); + if (val) + st->ctrl_src |= AD9832_SLEEP; + else + st->ctrl_src &= ~(AD9832_RESET | AD9832_SLEEP | + AD9832_CLR); + + st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | + st->ctrl_src); + ret = spi_sync(st->spi, &st->msg); + mutex_unlock(&st->lock); + +error_ret: + return ret ? ret : len; +} + static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { @@ -227,17 +255,6 @@ static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, st->ctrl_fp); ret = spi_sync(st->spi, &st->msg); break; - case AD9832_OUTPUT_EN: - if (val) - st->ctrl_src &= ~(AD9832_RESET | AD9832_SLEEP | - AD9832_CLR); - else - st->ctrl_src |= AD9832_SLEEP; - - st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | - st->ctrl_src); - ret = spi_sync(st->spi, &st->msg); - break; default: ret = -ENODEV; } @@ -266,8 +283,7 @@ static IIO_CONST_ATTR_PHASE_SCALE(0, "0.0015339808"); /* 2PI/2^12 rad*/ static IIO_DEV_ATTR_PINCONTROL_EN(0, 0200, NULL, ad9832_write, AD9832_PINCTRL_EN); -static IIO_DEV_ATTR_OUT_ENABLE(0, 0200, NULL, - ad9832_write, AD9832_OUTPUT_EN); +static IIO_DEVICE_ATTR(out_altvoltage_powerdown, 0200, NULL, ad9832_write_powerdown, 0); static struct attribute *ad9832_attributes[] = { &iio_dev_attr_out_altvoltage0_frequency0.dev_attr.attr, @@ -281,7 +297,7 @@ static struct attribute *ad9832_attributes[] = { &iio_dev_attr_out_altvoltage0_pincontrol_en.dev_attr.attr, &iio_dev_attr_out_altvoltage0_frequencysymbol.dev_attr.attr, &iio_dev_attr_out_altvoltage0_phasesymbol.dev_attr.attr, - &iio_dev_attr_out_altvoltage0_out_enable.dev_attr.attr, + &iio_dev_attr_out_altvoltage_powerdown.dev_attr.attr, NULL, }; -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown 2025-04-20 17:47 [PATCH v2 0/3] Fix and refactor output disable logic Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 1/3] iio: frequency: Use SLEEP bit instead of RESET to disable output Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 2/3] staging: iio: ad9832: Refactor powerdown control Gabriel Shahrouzi @ 2025-04-20 17:47 ` Gabriel Shahrouzi 2025-04-22 10:08 ` Dan Carpenter 2 siblings, 1 reply; 7+ messages in thread From: Gabriel Shahrouzi @ 2025-04-20 17:47 UTC (permalink / raw) To: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich Cc: gshahrouzi, skhan, linux-kernel-mentees Minimize size of type that needs to be used by replacing unsigned long with bool. Avoid redundancy by checking if cached power state is the same as the one requested. Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> --- drivers/staging/iio/frequency/ad9832.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c index a8fc20379efed..2ab6026d56b5c 100644 --- a/drivers/staging/iio/frequency/ad9832.c +++ b/drivers/staging/iio/frequency/ad9832.c @@ -173,13 +173,19 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct ad9832_state *st = iio_priv(indio_dev); int ret; - unsigned long val; + bool val; + bool cur; - ret = kstrtoul(buf, 10, &val); + ret = kstrtobool(buf, &val); if (ret) - goto error_ret; + return ret; mutex_lock(&st->lock); + + cur = !!(st->ctrl_src & AD9832_SLEEP); + if (val == cur) + goto unlock; + if (val) st->ctrl_src |= AD9832_SLEEP; else @@ -189,10 +195,10 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | st->ctrl_src); ret = spi_sync(st->spi, &st->msg); - mutex_unlock(&st->lock); -error_ret: - return ret ? ret : len; +unlock: + mutex_unlock(&st->lock); + return len; } static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown 2025-04-20 17:47 ` [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown Gabriel Shahrouzi @ 2025-04-22 10:08 ` Dan Carpenter 2025-04-22 16:14 ` Gabriel Shahrouzi 2025-04-22 16:25 ` Gabriel Shahrouzi 0 siblings, 2 replies; 7+ messages in thread From: Dan Carpenter @ 2025-04-22 10:08 UTC (permalink / raw) To: Gabriel Shahrouzi Cc: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich, skhan, linux-kernel-mentees On Sun, Apr 20, 2025 at 01:47:25PM -0400, Gabriel Shahrouzi wrote: > Minimize size of type that needs to be used by replacing unsigned long > with bool. Avoid redundancy by checking if cached power state is the > same as the one requested. > > Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> > --- > drivers/staging/iio/frequency/ad9832.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c > index a8fc20379efed..2ab6026d56b5c 100644 > --- a/drivers/staging/iio/frequency/ad9832.c > +++ b/drivers/staging/iio/frequency/ad9832.c > @@ -173,13 +173,19 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > struct iio_dev *indio_dev = dev_to_iio_dev(dev); > struct ad9832_state *st = iio_priv(indio_dev); > int ret; > - unsigned long val; > + bool val; > + bool cur; > > - ret = kstrtoul(buf, 10, &val); > + ret = kstrtobool(buf, &val); > if (ret) > - goto error_ret; > + return ret; Fold this whole thing into patch 2. Don't write something and then fix it in the next patch. > > mutex_lock(&st->lock); > + > + cur = !!(st->ctrl_src & AD9832_SLEEP); > + if (val == cur) > + goto unlock; > + > if (val) > st->ctrl_src |= AD9832_SLEEP; > else > @@ -189,10 +195,10 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | > st->ctrl_src); > ret = spi_sync(st->spi, &st->msg); > - mutex_unlock(&st->lock); > > -error_ret: > - return ret ? ret : len; > +unlock: > + mutex_unlock(&st->lock); > + return len; This should still be: return ret ? ret : len; regards, dan carpenter ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown 2025-04-22 10:08 ` Dan Carpenter @ 2025-04-22 16:14 ` Gabriel Shahrouzi 2025-04-22 16:25 ` Gabriel Shahrouzi 1 sibling, 0 replies; 7+ messages in thread From: Gabriel Shahrouzi @ 2025-04-22 16:14 UTC (permalink / raw) To: Dan Carpenter Cc: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich, skhan, linux-kernel-mentees On Tue, Apr 22, 2025 at 6:08 AM Dan Carpenter <dan.carpenter@linaro.org> wrote: > > On Sun, Apr 20, 2025 at 01:47:25PM -0400, Gabriel Shahrouzi wrote: > > Minimize size of type that needs to be used by replacing unsigned long > > with bool. Avoid redundancy by checking if cached power state is the > > same as the one requested. > > > > Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> > > --- > > drivers/staging/iio/frequency/ad9832.c | 18 ++++++++++++------ > > 1 file changed, 12 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c > > index a8fc20379efed..2ab6026d56b5c 100644 > > --- a/drivers/staging/iio/frequency/ad9832.c > > +++ b/drivers/staging/iio/frequency/ad9832.c > > @@ -173,13 +173,19 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > > struct iio_dev *indio_dev = dev_to_iio_dev(dev); > > struct ad9832_state *st = iio_priv(indio_dev); > > int ret; > > - unsigned long val; > > + bool val; > > + bool cur; > > > > - ret = kstrtoul(buf, 10, &val); > > + ret = kstrtobool(buf, &val); > > if (ret) > > - goto error_ret; > > + return ret; > > Fold this whole thing into patch 2. Don't write something and then fix > it in the next patch. > > > > > mutex_lock(&st->lock); > > + > > + cur = !!(st->ctrl_src & AD9832_SLEEP); > > + if (val == cur) > > + goto unlock; > > + > > if (val) > > st->ctrl_src |= AD9832_SLEEP; > > else > > @@ -189,10 +195,10 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > > st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | > > st->ctrl_src); > > ret = spi_sync(st->spi, &st->msg); > > - mutex_unlock(&st->lock); > > > > -error_ret: > > - return ret ? ret : len; > > +unlock: > > + mutex_unlock(&st->lock); > > + return len; > > This should still be: > > return ret ? ret : len; Ah right, the return from the spi_sync. Thanks. > > regards, > dan carpenter > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown 2025-04-22 10:08 ` Dan Carpenter 2025-04-22 16:14 ` Gabriel Shahrouzi @ 2025-04-22 16:25 ` Gabriel Shahrouzi 1 sibling, 0 replies; 7+ messages in thread From: Gabriel Shahrouzi @ 2025-04-22 16:25 UTC (permalink / raw) To: Dan Carpenter Cc: gregkh, jic23, lars, linux-iio, linux-kernel, linux-staging, Michael.Hennerich, skhan, linux-kernel-mentees On Tue, Apr 22, 2025 at 6:08 AM Dan Carpenter <dan.carpenter@linaro.org> wrote: > > On Sun, Apr 20, 2025 at 01:47:25PM -0400, Gabriel Shahrouzi wrote: > > Minimize size of type that needs to be used by replacing unsigned long > > with bool. Avoid redundancy by checking if cached power state is the > > same as the one requested. > > > > Signed-off-by: Gabriel Shahrouzi <gshahrouzi@gmail.com> > > --- > > drivers/staging/iio/frequency/ad9832.c | 18 ++++++++++++------ > > 1 file changed, 12 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c > > index a8fc20379efed..2ab6026d56b5c 100644 > > --- a/drivers/staging/iio/frequency/ad9832.c > > +++ b/drivers/staging/iio/frequency/ad9832.c > > @@ -173,13 +173,19 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > > struct iio_dev *indio_dev = dev_to_iio_dev(dev); > > struct ad9832_state *st = iio_priv(indio_dev); > > int ret; > > - unsigned long val; > > + bool val; > > + bool cur; > > > > - ret = kstrtoul(buf, 10, &val); > > + ret = kstrtobool(buf, &val); > > if (ret) > > - goto error_ret; > > + return ret; > > Fold this whole thing into patch 2. Don't write something and then fix > it in the next patch. Ah, I forgot to respond to this part — makes sense. I was initially trying to mirror the original author’s style and build on top of it, but I see now that all the changes should be folded into a single patch. > > > > > mutex_lock(&st->lock); > > + > > + cur = !!(st->ctrl_src & AD9832_SLEEP); > > + if (val == cur) > > + goto unlock; > > + > > if (val) > > st->ctrl_src |= AD9832_SLEEP; > > else > > @@ -189,10 +195,10 @@ static ssize_t ad9832_write_powerdown(struct device *dev, struct device_attribut > > st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | > > st->ctrl_src); > > ret = spi_sync(st->spi, &st->msg); > > - mutex_unlock(&st->lock); > > > > -error_ret: > > - return ret ? ret : len; > > +unlock: > > + mutex_unlock(&st->lock); > > + return len; > > This should still be: > > return ret ? ret : len; > > regards, > dan carpenter > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-04-22 16:26 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-04-20 17:47 [PATCH v2 0/3] Fix and refactor output disable logic Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 1/3] iio: frequency: Use SLEEP bit instead of RESET to disable output Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 2/3] staging: iio: ad9832: Refactor powerdown control Gabriel Shahrouzi 2025-04-20 17:47 ` [PATCH v2 3/3] staging: iio: ad9832: Add minor improvements to ad9832_write_powerdown Gabriel Shahrouzi 2025-04-22 10:08 ` Dan Carpenter 2025-04-22 16:14 ` Gabriel Shahrouzi 2025-04-22 16:25 ` Gabriel Shahrouzi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox