* [PATCH] iio: dac: dac5571: Support powerdown for multi-channel
@ 2020-08-04 9:31 Vincent Whitchurch
2020-08-09 8:34 ` Sean Nyekjaer
0 siblings, 1 reply; 3+ messages in thread
From: Vincent Whitchurch @ 2020-08-04 9:31 UTC (permalink / raw)
To: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
Peter Meerwald-Stadler
Cc: kernel, sean, linux-iio, Vincent Whitchurch
The driver currently only allows channel 0 to be powered down but the
multi-channel variants of the hardware allow each channel to be powered
down separately and with separate power down modes. Add support for
this.
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
drivers/iio/dac/ti-dac5571.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/drivers/iio/dac/ti-dac5571.c b/drivers/iio/dac/ti-dac5571.c
index 3a2bb0efe50d..ce8c3d646fb1 100644
--- a/drivers/iio/dac/ti-dac5571.c
+++ b/drivers/iio/dac/ti-dac5571.c
@@ -47,8 +47,8 @@ struct dac5571_data {
struct mutex lock;
struct regulator *vref;
u16 val[4];
- bool powerdown;
- u8 powerdown_mode;
+ bool powerdown[4];
+ u8 powerdown_mode[4];
struct dac5571_spec const *spec;
int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
@@ -125,7 +125,7 @@ static int dac5571_get_powerdown_mode(struct iio_dev *indio_dev,
{
struct dac5571_data *data = iio_priv(indio_dev);
- return data->powerdown_mode;
+ return data->powerdown_mode[chan->channel];
}
static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
@@ -135,17 +135,17 @@ static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
struct dac5571_data *data = iio_priv(indio_dev);
int ret = 0;
- if (data->powerdown_mode == mode)
+ if (data->powerdown_mode[chan->channel] == mode)
return 0;
mutex_lock(&data->lock);
- if (data->powerdown) {
+ if (data->powerdown[chan->channel]) {
ret = data->dac5571_pwrdwn(data, chan->channel,
DAC5571_POWERDOWN(mode));
if (ret)
goto out;
}
- data->powerdown_mode = mode;
+ data->powerdown_mode[chan->channel] = mode;
out:
mutex_unlock(&data->lock);
@@ -167,7 +167,7 @@ static ssize_t dac5571_read_powerdown(struct iio_dev *indio_dev,
{
struct dac5571_data *data = iio_priv(indio_dev);
- return sprintf(buf, "%d\n", data->powerdown);
+ return sprintf(buf, "%d\n", data->powerdown[chan->channel]);
}
static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
@@ -183,19 +183,20 @@ static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
if (ret)
return ret;
- if (data->powerdown == powerdown)
+ if (data->powerdown[chan->channel] == powerdown)
return len;
mutex_lock(&data->lock);
if (powerdown)
ret = data->dac5571_pwrdwn(data, chan->channel,
- DAC5571_POWERDOWN(data->powerdown_mode));
+ DAC5571_POWERDOWN(data->powerdown_mode[chan->channel]));
else
- ret = data->dac5571_cmd(data, chan->channel, data->val[0]);
+ ret = data->dac5571_cmd(data, chan->channel,
+ data->val[chan->channel]);
if (ret)
goto out;
- data->powerdown = powerdown;
+ data->powerdown[chan->channel] = powerdown;
out:
mutex_unlock(&data->lock);
@@ -209,9 +210,9 @@ static const struct iio_chan_spec_ext_info dac5571_ext_info[] = {
.name = "powerdown",
.read = dac5571_read_powerdown,
.write = dac5571_write_powerdown,
- .shared = IIO_SHARED_BY_TYPE,
+ .shared = IIO_SEPARATE,
},
- IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &dac5571_powerdown_mode),
+ IIO_ENUM("powerdown_mode", IIO_SEPARATE, &dac5571_powerdown_mode),
IIO_ENUM_AVAILABLE("powerdown_mode", &dac5571_powerdown_mode),
{},
};
@@ -276,7 +277,7 @@ static int dac5571_write_raw(struct iio_dev *indio_dev,
if (val >= (1 << data->spec->resolution) || val < 0)
return -EINVAL;
- if (data->powerdown)
+ if (data->powerdown[chan->channel])
return -EBUSY;
mutex_lock(&data->lock);
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] iio: dac: dac5571: Support powerdown for multi-channel
2020-08-04 9:31 [PATCH] iio: dac: dac5571: Support powerdown for multi-channel Vincent Whitchurch
@ 2020-08-09 8:34 ` Sean Nyekjaer
2020-08-09 11:45 ` Jonathan Cameron
0 siblings, 1 reply; 3+ messages in thread
From: Sean Nyekjaer @ 2020-08-09 8:34 UTC (permalink / raw)
To: Vincent Whitchurch, Jonathan Cameron, Hartmut Knaack,
Lars-Peter Clausen, Peter Meerwald-Stadler
Cc: kernel, linux-iio
On 04/08/2020 11.31, Vincent Whitchurch wrote:
> The driver currently only allows channel 0 to be powered down but the
> multi-channel variants of the hardware allow each channel to be powered
> down separately and with separate power down modes. Add support for
> this.
>
> Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Acked-by: Sean Nyekjaer <sean@geanix.com>
> ---
> drivers/iio/dac/ti-dac5571.c | 29 +++++++++++++++--------------
> 1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/iio/dac/ti-dac5571.c b/drivers/iio/dac/ti-dac5571.c
> index 3a2bb0efe50d..ce8c3d646fb1 100644
> --- a/drivers/iio/dac/ti-dac5571.c
> +++ b/drivers/iio/dac/ti-dac5571.c
> @@ -47,8 +47,8 @@ struct dac5571_data {
> struct mutex lock;
> struct regulator *vref;
> u16 val[4];
> - bool powerdown;
> - u8 powerdown_mode;
> + bool powerdown[4];
> + u8 powerdown_mode[4];
> struct dac5571_spec const *spec;
> int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
> int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
> @@ -125,7 +125,7 @@ static int dac5571_get_powerdown_mode(struct iio_dev *indio_dev,
> {
> struct dac5571_data *data = iio_priv(indio_dev);
>
> - return data->powerdown_mode;
> + return data->powerdown_mode[chan->channel];
> }
>
> static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
> @@ -135,17 +135,17 @@ static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
> struct dac5571_data *data = iio_priv(indio_dev);
> int ret = 0;
>
> - if (data->powerdown_mode == mode)
> + if (data->powerdown_mode[chan->channel] == mode)
> return 0;
>
> mutex_lock(&data->lock);
> - if (data->powerdown) {
> + if (data->powerdown[chan->channel]) {
> ret = data->dac5571_pwrdwn(data, chan->channel,
> DAC5571_POWERDOWN(mode));
> if (ret)
> goto out;
> }
> - data->powerdown_mode = mode;
> + data->powerdown_mode[chan->channel] = mode;
>
> out:
> mutex_unlock(&data->lock);
> @@ -167,7 +167,7 @@ static ssize_t dac5571_read_powerdown(struct iio_dev *indio_dev,
> {
> struct dac5571_data *data = iio_priv(indio_dev);
>
> - return sprintf(buf, "%d\n", data->powerdown);
> + return sprintf(buf, "%d\n", data->powerdown[chan->channel]);
> }
>
> static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
> @@ -183,19 +183,20 @@ static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
> if (ret)
> return ret;
>
> - if (data->powerdown == powerdown)
> + if (data->powerdown[chan->channel] == powerdown)
> return len;
>
> mutex_lock(&data->lock);
> if (powerdown)
> ret = data->dac5571_pwrdwn(data, chan->channel,
> - DAC5571_POWERDOWN(data->powerdown_mode));
> + DAC5571_POWERDOWN(data->powerdown_mode[chan->channel]));
> else
> - ret = data->dac5571_cmd(data, chan->channel, data->val[0]);
> + ret = data->dac5571_cmd(data, chan->channel,
> + data->val[chan->channel]);
> if (ret)
> goto out;
>
> - data->powerdown = powerdown;
> + data->powerdown[chan->channel] = powerdown;
>
> out:
> mutex_unlock(&data->lock);
> @@ -209,9 +210,9 @@ static const struct iio_chan_spec_ext_info dac5571_ext_info[] = {
> .name = "powerdown",
> .read = dac5571_read_powerdown,
> .write = dac5571_write_powerdown,
> - .shared = IIO_SHARED_BY_TYPE,
> + .shared = IIO_SEPARATE,
> },
> - IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &dac5571_powerdown_mode),
> + IIO_ENUM("powerdown_mode", IIO_SEPARATE, &dac5571_powerdown_mode),
> IIO_ENUM_AVAILABLE("powerdown_mode", &dac5571_powerdown_mode),
> {},
> };
> @@ -276,7 +277,7 @@ static int dac5571_write_raw(struct iio_dev *indio_dev,
> if (val >= (1 << data->spec->resolution) || val < 0)
> return -EINVAL;
>
> - if (data->powerdown)
> + if (data->powerdown[chan->channel])
> return -EBUSY;
>
> mutex_lock(&data->lock);
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] iio: dac: dac5571: Support powerdown for multi-channel
2020-08-09 8:34 ` Sean Nyekjaer
@ 2020-08-09 11:45 ` Jonathan Cameron
0 siblings, 0 replies; 3+ messages in thread
From: Jonathan Cameron @ 2020-08-09 11:45 UTC (permalink / raw)
To: Sean Nyekjaer
Cc: Vincent Whitchurch, Hartmut Knaack, Lars-Peter Clausen,
Peter Meerwald-Stadler, kernel, linux-iio
On Sun, 9 Aug 2020 10:34:15 +0200
Sean Nyekjaer <sean@geanix.com> wrote:
> On 04/08/2020 11.31, Vincent Whitchurch wrote:
> > The driver currently only allows channel 0 to be powered down but the
> > multi-channel variants of the hardware allow each channel to be powered
> > down separately and with separate power down modes. Add support for
> > this.
> >
> > Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
> Acked-by: Sean Nyekjaer <sean@geanix.com>
Applied.
Thanks,
Jonathan
> > ---
> > drivers/iio/dac/ti-dac5571.c | 29 +++++++++++++++--------------
> > 1 file changed, 15 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/iio/dac/ti-dac5571.c b/drivers/iio/dac/ti-dac5571.c
> > index 3a2bb0efe50d..ce8c3d646fb1 100644
> > --- a/drivers/iio/dac/ti-dac5571.c
> > +++ b/drivers/iio/dac/ti-dac5571.c
> > @@ -47,8 +47,8 @@ struct dac5571_data {
> > struct mutex lock;
> > struct regulator *vref;
> > u16 val[4];
> > - bool powerdown;
> > - u8 powerdown_mode;
> > + bool powerdown[4];
> > + u8 powerdown_mode[4];
> > struct dac5571_spec const *spec;
> > int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
> > int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
> > @@ -125,7 +125,7 @@ static int dac5571_get_powerdown_mode(struct iio_dev *indio_dev,
> > {
> > struct dac5571_data *data = iio_priv(indio_dev);
> >
> > - return data->powerdown_mode;
> > + return data->powerdown_mode[chan->channel];
> > }
> >
> > static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
> > @@ -135,17 +135,17 @@ static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
> > struct dac5571_data *data = iio_priv(indio_dev);
> > int ret = 0;
> >
> > - if (data->powerdown_mode == mode)
> > + if (data->powerdown_mode[chan->channel] == mode)
> > return 0;
> >
> > mutex_lock(&data->lock);
> > - if (data->powerdown) {
> > + if (data->powerdown[chan->channel]) {
> > ret = data->dac5571_pwrdwn(data, chan->channel,
> > DAC5571_POWERDOWN(mode));
> > if (ret)
> > goto out;
> > }
> > - data->powerdown_mode = mode;
> > + data->powerdown_mode[chan->channel] = mode;
> >
> > out:
> > mutex_unlock(&data->lock);
> > @@ -167,7 +167,7 @@ static ssize_t dac5571_read_powerdown(struct iio_dev *indio_dev,
> > {
> > struct dac5571_data *data = iio_priv(indio_dev);
> >
> > - return sprintf(buf, "%d\n", data->powerdown);
> > + return sprintf(buf, "%d\n", data->powerdown[chan->channel]);
> > }
> >
> > static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
> > @@ -183,19 +183,20 @@ static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
> > if (ret)
> > return ret;
> >
> > - if (data->powerdown == powerdown)
> > + if (data->powerdown[chan->channel] == powerdown)
> > return len;
> >
> > mutex_lock(&data->lock);
> > if (powerdown)
> > ret = data->dac5571_pwrdwn(data, chan->channel,
> > - DAC5571_POWERDOWN(data->powerdown_mode));
> > + DAC5571_POWERDOWN(data->powerdown_mode[chan->channel]));
> > else
> > - ret = data->dac5571_cmd(data, chan->channel, data->val[0]);
> > + ret = data->dac5571_cmd(data, chan->channel,
> > + data->val[chan->channel]);
> > if (ret)
> > goto out;
> >
> > - data->powerdown = powerdown;
> > + data->powerdown[chan->channel] = powerdown;
> >
> > out:
> > mutex_unlock(&data->lock);
> > @@ -209,9 +210,9 @@ static const struct iio_chan_spec_ext_info dac5571_ext_info[] = {
> > .name = "powerdown",
> > .read = dac5571_read_powerdown,
> > .write = dac5571_write_powerdown,
> > - .shared = IIO_SHARED_BY_TYPE,
> > + .shared = IIO_SEPARATE,
> > },
> > - IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &dac5571_powerdown_mode),
> > + IIO_ENUM("powerdown_mode", IIO_SEPARATE, &dac5571_powerdown_mode),
> > IIO_ENUM_AVAILABLE("powerdown_mode", &dac5571_powerdown_mode),
> > {},
> > };
> > @@ -276,7 +277,7 @@ static int dac5571_write_raw(struct iio_dev *indio_dev,
> > if (val >= (1 << data->spec->resolution) || val < 0)
> > return -EINVAL;
> >
> > - if (data->powerdown)
> > + if (data->powerdown[chan->channel])
> > return -EBUSY;
> >
> > mutex_lock(&data->lock);
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-08-09 11:45 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-04 9:31 [PATCH] iio: dac: dac5571: Support powerdown for multi-channel Vincent Whitchurch
2020-08-09 8:34 ` Sean Nyekjaer
2020-08-09 11:45 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).