Re: [PATCH 6/8] staging:iio:dac:ad5446: Convert to extended channel attributes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 04/23/2012 06:51 PM, Lars-Peter Clausen wrote:
> Use extended channel attributes instead of raw sysfs files for the additional
> channel attributes.
One formatting suggestion.  I am a little unconvinced that we gain much
from using the extended channel attributes here, but otherwise fine.
> 
> Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx>
Acked-by: Jonathan Cameron <jic23@xxxxxxxxxx>
> ---
>  drivers/staging/iio/dac/ad5446.c |  141 +++++++++++++++++++-------------------
>  1 file changed, 70 insertions(+), 71 deletions(-)
> 
> diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
> index 6b8f341..c767024 100644
> --- a/drivers/staging/iio/dac/ad5446.c
> +++ b/drivers/staging/iio/dac/ad5446.c
> @@ -51,64 +51,69 @@ static void ad5660_store_pwr_down(struct ad5446_state *st, unsigned mode)
>  	st->data.d24[2] = val & 0xFF;
>  }
>  
> -static ssize_t ad5446_write_powerdown_mode(struct device *dev,
> -				       struct device_attribute *attr,
> -				       const char *buf, size_t len)
> +static const char * const ad5446_powerdown_modes[] = {
> +	"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"
> +};
> +
> +static ssize_t ad5446_read_powerdown_mode_available(struct iio_dev *indio_dev,
> +	const struct iio_chan_spec *chan, char *buf)
> +{
> +	return sprintf(buf, "%s %s %s\n", ad5446_powerdown_modes[1],
> +		ad5446_powerdown_modes[2], ad5446_powerdown_modes[3]);
> +}
> +
> +static ssize_t ad5446_write_powerdown_mode(struct iio_dev *indio_dev,
> +					    const struct iio_chan_spec *chan,
> +					    const char *buf, size_t len)
>  {
> -	struct iio_dev *indio_dev = dev_get_drvdata(dev);
>  	struct ad5446_state *st = iio_priv(indio_dev);
> +	int i;
>  
> -	if (sysfs_streq(buf, "1kohm_to_gnd"))
> -		st->pwr_down_mode = MODE_PWRDWN_1k;
> -	else if (sysfs_streq(buf, "100kohm_to_gnd"))
> -		st->pwr_down_mode = MODE_PWRDWN_100k;
> -	else if (sysfs_streq(buf, "three_state"))
> -		st->pwr_down_mode = MODE_PWRDWN_TRISTATE;
> -	else
> +	for (i = 1; i < ARRAY_SIZE(ad5446_powerdown_modes); i++) {
> +		if (sysfs_streq(buf, ad5446_powerdown_modes[i])) {
> +			st->pwr_down_mode = i;
> +			break;
> +		}
> +	}
> +
> +	if (i == ARRAY_SIZE(ad5446_powerdown_modes))
>  		return -EINVAL;
>  
>  	return len;
>  }
>  
> -static ssize_t ad5446_read_powerdown_mode(struct device *dev,
> -				      struct device_attribute *attr, char *buf)
> +static ssize_t ad5446_read_powerdown_mode(struct iio_dev *indio_dev,
> +					   const struct iio_chan_spec *chan,
> +					   char *buf)
>  {
> -	struct iio_dev *indio_dev = dev_get_drvdata(dev);
>  	struct ad5446_state *st = iio_priv(indio_dev);
>  
> -	char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"};
> -
> -	return sprintf(buf, "%s\n", mode[st->pwr_down_mode]);
> +	return sprintf(buf, "%s\n", ad5446_powerdown_modes[st->pwr_down_mode]);
>  }
>  
> -static ssize_t ad5446_read_dac_powerdown(struct device *dev,
> -					   struct device_attribute *attr,
> +static ssize_t ad5446_read_dac_powerdown(struct iio_dev *indio_dev,
> +					   const struct iio_chan_spec *chan,
>  					   char *buf)
>  {
> -	struct iio_dev *indio_dev = dev_get_drvdata(dev);
>  	struct ad5446_state *st = iio_priv(indio_dev);
>  
>  	return sprintf(buf, "%d\n", st->pwr_down);
>  }
>  
> -static ssize_t ad5446_write_dac_powerdown(struct device *dev,
> -					    struct device_attribute *attr,
> +static ssize_t ad5446_write_dac_powerdown(struct iio_dev *indio_dev,
> +					    const struct iio_chan_spec *chan,
>  					    const char *buf, size_t len)
>  {
> -	struct iio_dev *indio_dev = dev_get_drvdata(dev);
>  	struct ad5446_state *st = iio_priv(indio_dev);
> -	unsigned long readin;
> +	bool powerdown;
>  	int ret;
>  
> -	ret = strict_strtol(buf, 10, &readin);
> +	ret = strtobool(buf, &powerdown);
>  	if (ret)
>  		return ret;
>  
> -	if (readin > 1)
> -		ret = -EINVAL;
> -
>  	mutex_lock(&indio_dev->mlock);
> -	st->pwr_down = readin;
> +	st->pwr_down = powerdown;
>  
>  	if (st->pwr_down)
>  		st->chip_info->store_pwr_down(st, st->pwr_down_mode);
> @@ -121,38 +126,42 @@ static ssize_t ad5446_write_dac_powerdown(struct device *dev,
>  	return ret ? ret : len;
>  }
>  
> -static IIO_DEVICE_ATTR(out_voltage_powerdown_mode, S_IRUGO | S_IWUSR,
> -			ad5446_read_powerdown_mode,
> -			ad5446_write_powerdown_mode, 0);
> -
> -static IIO_CONST_ATTR(out_voltage_powerdown_mode_available,
> -			"1kohm_to_gnd 100kohm_to_gnd three_state");
> -
> -static IIO_DEVICE_ATTR(out_voltage0_powerdown, S_IRUGO | S_IWUSR,
> -			ad5446_read_dac_powerdown,
> -			ad5446_write_dac_powerdown, 0);
> -
> -static struct attribute *ad5446_attributes[] = {
> -	&iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
> -	&iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
> -	&iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
> -	NULL,
> -};
> -
> -static const struct attribute_group ad5446_attribute_group = {
> -	.attrs = ad5446_attributes,
> +static const struct iio_chan_spec_ext_info ad5064_ext_info_powerdown[] = {
> +	{
> +		.name = "powerdown",
> +		.read = ad5446_read_dac_powerdown,
> +		.write = ad5446_write_dac_powerdown,
> +	},
}, { is preferred I think
> +	{
> +		.name = "powerdown_mode",
> +		.read = ad5446_read_powerdown_mode,
> +		.write = ad5446_write_powerdown_mode,
> +	},
> +	{
> +		.name = "powerdown_mode_available",
> +		.shared = true,
> +		.read = ad5446_read_powerdown_mode_available,
> +	},
> +	{ },
>  };
>  
> -#define AD5446_CHANNEL(bits, storage, shift) { \
> +#define _AD5446_CHANNEL(bits, storage, shift, ext) { \
>  	.type = IIO_VOLTAGE, \
>  	.indexed = 1, \
>  	.output = 1, \
>  	.channel = 0, \
>  	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
>  	IIO_CHAN_INFO_SCALE_SHARED_BIT,	\
> -	.scan_type = IIO_ST('u', (bits), (storage), (shift)) \
> +	.scan_type = IIO_ST('u', (bits), (storage), (shift)), \
> +	.ext_info = (ext), \
>  }
>  
> +#define AD5446_CHANNEL(bits, storage, shift) \
> +	_AD5446_CHANNEL(bits, storage, shift, NULL)
> +
> +#define AD5446_CHANNEL_POWERDOWN(bits, storage, shift) \
> +	_AD5446_CHANNEL(bits, storage, shift, ad5064_ext_info_powerdown)
> +
>  static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  	[ID_AD5444] = {
>  		.channel = AD5446_CHANNEL(12, 16, 2),
> @@ -175,52 +184,52 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.store_sample = ad5446_store_sample,
>  	},
>  	[ID_AD5601] = {
> -		.channel = AD5446_CHANNEL(8, 16, 6),
> +		.channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5611] = {
> -		.channel = AD5446_CHANNEL(10, 16, 4),
> +		.channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5621] = {
> -		.channel = AD5446_CHANNEL(12, 16, 2),
> +		.channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5620_2500] = {
> -		.channel = AD5446_CHANNEL(12, 16, 2),
> +		.channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5620_1250] = {
> -		.channel = AD5446_CHANNEL(12, 16, 2),
> +		.channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5640_2500] = {
> -		.channel = AD5446_CHANNEL(14, 16, 0),
> +		.channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5640_1250] = {
> -		.channel = AD5446_CHANNEL(14, 16, 0),
> +		.channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5446_store_sample,
>  		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5660_2500] = {
> -		.channel = AD5446_CHANNEL(16, 16, 0),
> +		.channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5660_store_sample,
>  		.store_pwr_down = ad5660_store_pwr_down,
>  	},
>  	[ID_AD5660_1250] = {
> -		.channel = AD5446_CHANNEL(16, 16, 0),
> +		.channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5660_store_sample,
>  		.store_pwr_down = ad5660_store_pwr_down,
> @@ -279,13 +288,6 @@ static int ad5446_write_raw(struct iio_dev *indio_dev,
>  static const struct iio_info ad5446_info = {
>  	.read_raw = ad5446_read_raw,
>  	.write_raw = ad5446_write_raw,
> -	.attrs = &ad5446_attribute_group,
> -	.driver_module = THIS_MODULE,
> -};
> -
> -static const struct iio_info ad5446_info_no_pwr_down = {
> -	.read_raw = ad5446_read_raw,
> -	.write_raw = ad5446_write_raw,
>  	.driver_module = THIS_MODULE,
>  };
>  
> @@ -321,10 +323,7 @@ static int __devinit ad5446_probe(struct spi_device *spi)
>  	/* Establish that the iio_dev is a child of the spi device */
>  	indio_dev->dev.parent = &spi->dev;
>  	indio_dev->name = spi_get_device_id(spi)->name;
> -	if (st->chip_info->store_pwr_down)
> -		indio_dev->info = &ad5446_info;
> -	else
> -		indio_dev->info = &ad5446_info_no_pwr_down;
> +	indio_dev->info = &ad5446_info;
>  	indio_dev->modes = INDIO_DIRECT_MODE;
>  	indio_dev->channels = &st->chip_info->channel;
>  	indio_dev->num_channels = 1;

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux