Re: [PATCH 4/5] staging:iio:gyro: add adis16251 support to adis16260 driver.

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

 



On 02/05/11 17:52, Jonathan Cameron wrote:
> These parts are very similar and the adis16260 driver supports
> a lot of additional functionality.
> 
> Precursor to removal of adis16251 driver.
> 
> Note that some supported devices were missing from Kconfig help text
> and are also added in this patch.

I'll hold the this one and the next back for another week. The other 3
are going to Greg shortly as they are just code tidying.

Any feedback on this patch welcomed.

Jonathan
> 
> Signed-off-by: Jonathan Cameron <jic23@xxxxxxxxx>
> ---
>  drivers/staging/iio/gyro/Kconfig          |    4 +-
>  drivers/staging/iio/gyro/adis16260_core.c |   49 +++++++++++++++++++++++------
>  2 files changed, 41 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/staging/iio/gyro/Kconfig b/drivers/staging/iio/gyro/Kconfig
> index 236f15f..5bba4b0 100644
> --- a/drivers/staging/iio/gyro/Kconfig
> +++ b/drivers/staging/iio/gyro/Kconfig
> @@ -25,13 +25,13 @@ config ADIS16130
>  	  Angular Rate Sensor driver.
>  
>  config ADIS16260
> -	tristate "Analog Devices ADIS16260 ADIS16265 Digital Gyroscope Sensor SPI driver"
> +	tristate "Analog Devices ADIS16260 Digital Gyroscope Sensor SPI driver"
>  	depends on SPI
>  	select IIO_TRIGGER if IIO_RING_BUFFER
>  	select IIO_SW_RING if IIO_RING_BUFFER
>  	help
>  	  Say yes here to build support for Analog Devices ADIS16260 ADIS16265
> -	  programmable digital gyroscope sensor.
> +	  ADIS16250 ADIS16255 and ADIS16251 programmable digital gyroscope sensors.
>  
>  	  This driver can also be built as a module.  If so, the module
>  	  will be called adis16260.
> diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c
> index 045e27d..69a29ec 100644
> --- a/drivers/staging/iio/gyro/adis16260_core.c
> +++ b/drivers/staging/iio/gyro/adis16260_core.c
> @@ -238,10 +238,24 @@ error_ret:
>  	return ret ? ret : len;
>  }
>  
> +static ssize_t adis16260_read_frequency_available(struct device *dev,
> +						  struct device_attribute *attr,
> +						  char *buf)
> +{
> +	struct iio_dev *indio_dev = dev_get_drvdata(dev);
> +	struct adis16260_state *st = iio_dev_get_devdata(indio_dev);
> +	if (spi_get_device_id(st->us)->driver_data)
> +		return sprintf(buf, "%s\n", "0.129 ~ 256");
> +	else
> +		return sprintf(buf, "%s\n", "256 2048");
> +}
> +
>  static ssize_t adis16260_read_frequency(struct device *dev,
>  		struct device_attribute *attr,
>  		char *buf)
>  {
> +	struct iio_dev *indio_dev = dev_get_drvdata(dev);
> +	struct adis16260_state *st = iio_dev_get_devdata(indio_dev);
>  	int ret, len = 0;
>  	u16 t;
>  	int sps;
> @@ -250,7 +264,11 @@ static ssize_t adis16260_read_frequency(struct device *dev,
>  			&t);
>  	if (ret)
>  		return ret;
> -	sps =  (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048;
> +
> +	if (spi_get_device_id(st->us)->driver_data) /* If an adis16251 */
> +		sps =  (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 8 : 256;
> +	else
> +		sps =  (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048;
>  	sps /= (t & ADIS16260_SMPL_PRD_DIV_MASK) + 1;
>  	len = sprintf(buf, "%d SPS\n", sps);
>  	return len;
> @@ -272,16 +290,21 @@ static ssize_t adis16260_write_frequency(struct device *dev,
>  		return ret;
>  
>  	mutex_lock(&indio_dev->mlock);
> -
> -	t = (2048 / val);
> -	if (t > 0)
> -		t--;
> -	t &= ADIS16260_SMPL_PRD_DIV_MASK;
> +	if (spi_get_device_id(st->us)) {
> +		t = (256 / val);
> +		if (t > 0)
> +			t--;
> +		t &= ADIS16260_SMPL_PRD_DIV_MASK;
> +	} else {
> +		t = (2048 / val);
> +		if (t > 0)
> +			t--;
> +		t &= ADIS16260_SMPL_PRD_DIV_MASK;
> +	}
>  	if ((t & ADIS16260_SMPL_PRD_DIV_MASK) >= 0x0A)
>  		st->us->max_speed_hz = ADIS16260_SPI_SLOW;
>  	else
>  		st->us->max_speed_hz = ADIS16260_SPI_FAST;
> -
>  	ret = adis16260_spi_write_reg_8(dev,
>  			ADIS16260_SMPL_PRD,
>  			t);
> @@ -302,7 +325,10 @@ static ssize_t adis16260_read_gyro_scale(struct device *dev,
>  	if (st->negate)
>  		ret = sprintf(buf, "-");
>  	/* Take the iio_dev status lock */
> -	ret += sprintf(buf + ret, "%s\n", "0.00127862821");
> +	if (spi_get_device_id(st->us)->driver_data)
> +		ret += sprintf(buf + ret, "%s\n", "0.00031974432");
> +	else
> +		ret += sprintf(buf + ret, "%s\n", "0.00127862821");
>  
>  	return ret;
>  }
> @@ -475,7 +501,9 @@ static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
>  
>  static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16260_write_reset, 0);
>  
> -static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("256 2048");
> +
> +static IIO_DEVICE_ATTR(sampling_frequency_available,
> +		       S_IRUGO, adis16260_read_frequency_available, NULL, 0);
>  
>  static IIO_CONST_ATTR_NAME("adis16260");
>  
> @@ -525,7 +553,7 @@ static ADIS16260_GYRO_ATTR_SET(_Z);
>  		&iio_dev_attr_in1_raw.dev_attr.attr,			\
>  		&iio_const_attr_in1_scale.dev_attr.attr,		\
>  		&iio_dev_attr_sampling_frequency.dev_attr.attr,		\
> -		&iio_const_attr_sampling_frequency_available.dev_attr.attr, \
> +		&iio_dev_attr_sampling_frequency_available.dev_attr.attr, \
>  		&iio_dev_attr_reset.dev_attr.attr,			\
>  		&iio_const_attr_name.dev_attr.attr,			\
>  		NULL							\
> @@ -693,6 +721,7 @@ static const struct spi_device_id adis16260_id[] = {
>  	{"adis16265", 0},
>  	{"adis16250", 0},
>  	{"adis16255", 0},
> +	{"adis16251", 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