diff mbox series

iio: dac: dac5571: Support powerdown for multi-channel

Message ID 20200804093138.2114-1-vincent.whitchurch@axis.com (mailing list archive)
State New, archived
Headers show
Series iio: dac: dac5571: Support powerdown for multi-channel | expand

Commit Message

Vincent Whitchurch Aug. 4, 2020, 9:31 a.m. UTC
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(-)

Comments

Sean Nyekjaer Aug. 9, 2020, 8:34 a.m. UTC | #1
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);
Jonathan Cameron Aug. 9, 2020, 11:45 a.m. UTC | #2
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);  
>
diff mbox series

Patch

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);