Skip to content

Commit

Permalink
Merge tag 'iio-for-3.9b-v2' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/jic23/iio into staging-next

Jonathan writes:

	Second set of IIO new drivers, cleanups and fixes for the 3.9 cycle.

	This second version is due to a little fixup for an include
	path being added to the tsl2563 move out of staging after
	a report from Fengguang Wu and the 0-day kernel build testing
	backend.

	Minor bits:
	1) A Kconfig dependency fix for the max1363 driver that
	has been causing some autobuilder fails in Linux Next.
	2) Removal of a stale makefile entry
	3) Fix an incorrect arguement for a sizeof call
	4) Duplicate code removal in tsl2x7x driver
	5) A missing spin lock init in hid-sensor-time

	New features:
	1) mxs adc driver gains support for touchscreen special functions
	2) mxs driver gainst supprot for the MX23 and dt entries added
	3) adis16400 gains adis16448 support and some additional bells and whistles

	Moves out of staging.
	1) adis16400 - a venerable driver gets a make over and moves
	   out of staging.
	2) Kxsd9 moved out fo staging
	3) adis16080 gets cleaned up and moved out of staging
	4) tsl2563 gets a little cleaned up and move out of staging

	Removals
	1) sw_ring is killed off with all remaining drivers converted to kfifo.
	   This has been scheduled for a long time since we switched to kfifo.
	   There is demand for a high performance alternative, but this was
	   never it and I'm glad to see this vestage of IIOs youth gone once
	   and for all!
  • Loading branch information
Greg Kroah-Hartman committed Jan 29, 2013
2 parents 8f5f90a + 9c2251d commit 83eaeec
Show file tree
Hide file tree
Showing 45 changed files with 1,846 additions and 2,409 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ Required properties:
- reg: Address and length of the register set for the device
- interrupts: Should contain the LRADC interrupts

Optional properties:
- fsl,lradc-touchscreen-wires: Number of wires used to connect the touchscreen
to LRADC. Valid value is either 4 or 5. If this
property is not present, then the touchscreen is
disabled.

Examples:

lradc@80050000 {
Expand Down
2 changes: 2 additions & 0 deletions arch/arm/boot/dts/imx23.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,9 @@
};

lradc@80050000 {
compatible = "fsl,imx23-lradc";
reg = <0x80050000 0x2000>;
interrupts = <36 37 38 39 40 41 42 43 44>;
status = "disabled";
};

Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-omap2/board-rx51-peripherals.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
#include <media/si4713.h>
#include <linux/leds-lp5523.h>

#include <../drivers/staging/iio/light/tsl2563.h>
#include <linux/platform_data/tsl2563.h>
#include <linux/lis3lv02d.h>

#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
Expand Down
7 changes: 7 additions & 0 deletions drivers/iio/accel/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,11 @@ config HID_SENSOR_ACCEL_3D
Say yes here to build support for the HID SENSOR
accelerometers 3D.

config KXSD9
tristate "Kionix KXSD9 Accelerometer Driver"
depends on SPI
help
Say yes here to build support for the Kionix KXSD9 accelerometer.
Currently this only supports the device via an SPI interface.

endmenu
1 change: 1 addition & 0 deletions drivers/iio/accel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
#

obj-$(CONFIG_HID_SENSOR_ACCEL_3D) += hid-sensor-accel-3d.o
obj-$(CONFIG_KXSD9) += kxsd9.o
10 changes: 5 additions & 5 deletions drivers/staging/iio/accel/kxsd9.c → drivers/iio/accel/kxsd9.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ static int kxsd9_probe(struct spi_device *spi)
{
struct iio_dev *indio_dev;
struct kxsd9_state *st;
int ret = 0;
int ret;

indio_dev = iio_device_alloc(sizeof(*st));
if (indio_dev == NULL) {
Expand All @@ -245,14 +245,14 @@ static int kxsd9_probe(struct spi_device *spi)
indio_dev->info = &kxsd9_info;
indio_dev->modes = INDIO_DIRECT_MODE;

ret = iio_device_register(indio_dev);
if (ret)
goto error_free_dev;

spi->mode = SPI_MODE_0;
spi_setup(spi);
kxsd9_power_up(st);

ret = iio_device_register(indio_dev);
if (ret)
goto error_free_dev;

return 0;

error_free_dev:
Expand Down
4 changes: 1 addition & 3 deletions drivers/iio/adc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,8 @@ config LP8788_ADC
config MAX1363
tristate "Maxim max1363 ADC driver"
depends on I2C
select IIO_TRIGGER
select MAX1363_RING_BUFFER
select IIO_BUFFER
select IIO_KFIFO_BUF
select IIO_TRIGGERED_BUFFER
help
Say yes here to build support for many Maxim i2c analog to digital
converters (ADC). (max1361, max1362, max1363, max1364, max1036,
Expand Down
7 changes: 7 additions & 0 deletions drivers/iio/gyro/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@
#
menu "Digital gyroscope sensors"

config ADIS16080
tristate "Analog Devices ADIS16080/100 Yaw Rate Gyroscope with SPI driver"
depends on SPI
help
Say yes here to build support for Analog Devices ADIS16080, ADIS16100 Yaw
Rate Gyroscope with SPI.

config ADIS16136
tristate "Analog devices ADIS16136 and similar gyroscopes driver"
depends on SPI_MASTER
Expand Down
1 change: 1 addition & 0 deletions drivers/iio/gyro/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
# Makefile for industrial I/O gyroscope sensor drivers
#

obj-$(CONFIG_ADIS16080) += adis16080.o
obj-$(CONFIG_ADIS16136) += adis16136.o
obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o
Original file line number Diff line number Diff line change
Expand Up @@ -29,48 +29,50 @@

#define ADIS16080_DIN_WRITE (1 << 15)

struct adis16080_chip_info {
int scale_val;
int scale_val2;
};

/**
* struct adis16080_state - device instance specific data
* @us: actual spi_device to write data
* @info: chip specific parameters
* @buf: transmit or receive buffer
* @buf_lock: mutex to protect tx and rx
**/
struct adis16080_state {
struct spi_device *us;
struct mutex buf_lock;
const struct adis16080_chip_info *info;

u8 buf[2] ____cacheline_aligned;
__be16 buf ____cacheline_aligned;
};

static int adis16080_spi_write(struct iio_dev *indio_dev,
u16 val)
static int adis16080_read_sample(struct iio_dev *indio_dev,
u16 addr, int *val)
{
int ret;
struct adis16080_state *st = iio_priv(indio_dev);

mutex_lock(&st->buf_lock);
st->buf[0] = val >> 8;
st->buf[1] = val;

ret = spi_write(st->us, st->buf, 2);
mutex_unlock(&st->buf_lock);

return ret;
}

static int adis16080_spi_read(struct iio_dev *indio_dev,
u16 *val)
{
struct spi_message m;
int ret;
struct adis16080_state *st = iio_priv(indio_dev);
struct spi_transfer t[] = {
{
.tx_buf = &st->buf,
.len = 2,
.cs_change = 1,
}, {
.rx_buf = &st->buf,
.len = 2,
},
};

mutex_lock(&st->buf_lock);
st->buf = cpu_to_be16(addr | ADIS16080_DIN_WRITE);

ret = spi_read(st->us, st->buf, 2);
spi_message_init(&m);
spi_message_add_tail(&t[0], &m);
spi_message_add_tail(&t[1], &m);

ret = spi_sync(st->us, &m);
if (ret == 0)
*val = sign_extend32(((st->buf[0] & 0xF) << 8) | st->buf[1], 11);
mutex_unlock(&st->buf_lock);
*val = sign_extend32(be16_to_cpu(st->buf), 11);

return ret;
}
Expand All @@ -81,54 +83,85 @@ static int adis16080_read_raw(struct iio_dev *indio_dev,
int *val2,
long mask)
{
int ret = -EINVAL;
u16 ut = 0;
/* Take the iio_dev status lock */
struct adis16080_state *st = iio_priv(indio_dev);
int ret;

mutex_lock(&indio_dev->mlock);
switch (mask) {
case IIO_CHAN_INFO_RAW:
ret = adis16080_spi_write(indio_dev,
chan->address |
ADIS16080_DIN_WRITE);
if (ret < 0)
break;
ret = adis16080_spi_read(indio_dev, &ut);
if (ret < 0)
break;
*val = ut;
ret = IIO_VAL_INT;
mutex_lock(&indio_dev->mlock);
ret = adis16080_read_sample(indio_dev, chan->address, val);
mutex_unlock(&indio_dev->mlock);
return ret ? ret : IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
switch (chan->type) {
case IIO_ANGL_VEL:
*val = st->info->scale_val;
*val2 = st->info->scale_val2;
return IIO_VAL_FRACTIONAL;
case IIO_VOLTAGE:
/* VREF = 5V, 12 bits */
*val = 5000;
*val2 = 12;
return IIO_VAL_FRACTIONAL_LOG2;
case IIO_TEMP:
/* 85 C = 585, 25 C = 0 */
*val = 85000 - 25000;
*val2 = 585;
return IIO_VAL_FRACTIONAL;
default:
return -EINVAL;
}
case IIO_CHAN_INFO_OFFSET:
switch (chan->type) {
case IIO_VOLTAGE:
/* 2.5 V = 0 */
*val = 2048;
return IIO_VAL_INT;
case IIO_TEMP:
/* 85 C = 585, 25 C = 0 */
*val = DIV_ROUND_CLOSEST(25 * 585, 85 - 25);
return IIO_VAL_INT;
default:
return -EINVAL;
}
default:
break;
}
mutex_unlock(&indio_dev->mlock);

return ret;
return -EINVAL;
}

static const struct iio_chan_spec adis16080_channels[] = {
{
.type = IIO_ANGL_VEL,
.modified = 1,
.channel2 = IIO_MOD_Z,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
.address = ADIS16080_DIN_GYRO,
}, {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
.address = ADIS16080_DIN_AIN1,
}, {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
.address = ADIS16080_DIN_AIN2,
}, {
.type = IIO_TEMP,
.indexed = 1,
.channel = 0,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
.address = ADIS16080_DIN_TEMP,
}
};
Expand All @@ -138,8 +171,27 @@ static const struct iio_info adis16080_info = {
.driver_module = THIS_MODULE,
};

enum {
ID_ADIS16080,
ID_ADIS16100,
};

static const struct adis16080_chip_info adis16080_chip_info[] = {
[ID_ADIS16080] = {
/* 80 degree = 819, 819 rad = 46925 degree */
.scale_val = 80,
.scale_val2 = 46925,
},
[ID_ADIS16100] = {
/* 300 degree = 1230, 1230 rad = 70474 degree */
.scale_val = 300,
.scale_val2 = 70474,
},
};

static int adis16080_probe(struct spi_device *spi)
{
const struct spi_device_id *id = spi_get_device_id(spi);
int ret;
struct adis16080_state *st;
struct iio_dev *indio_dev;
Expand All @@ -156,7 +208,7 @@ static int adis16080_probe(struct spi_device *spi)

/* Allocate the comms buffers */
st->us = spi;
mutex_init(&st->buf_lock);
st->info = &adis16080_chip_info[id->driver_data];

indio_dev->name = spi->dev.driver->name;
indio_dev->channels = adis16080_channels;
Expand All @@ -176,7 +228,6 @@ static int adis16080_probe(struct spi_device *spi)
return ret;
}

/* fixme, confirm ordering in this function */
static int adis16080_remove(struct spi_device *spi)
{
iio_device_unregister(spi_get_drvdata(spi));
Expand All @@ -185,17 +236,24 @@ static int adis16080_remove(struct spi_device *spi)
return 0;
}

static const struct spi_device_id adis16080_ids[] = {
{ "adis16080", ID_ADIS16080 },
{ "adis16100", ID_ADIS16100 },
{},
};
MODULE_DEVICE_TABLE(spi, adis16080_ids);

static struct spi_driver adis16080_driver = {
.driver = {
.name = "adis16080",
.owner = THIS_MODULE,
},
.probe = adis16080_probe,
.remove = adis16080_remove,
.id_table = adis16080_ids,
};
module_spi_driver(adis16080_driver);

MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
MODULE_DESCRIPTION("Analog Devices ADIS16080/100 Yaw Rate Gyroscope Driver");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("spi:adis16080");
11 changes: 11 additions & 0 deletions drivers/iio/imu/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
#
menu "Inertial measurement units"

config ADIS16400
tristate "Analog Devices ADIS16400 and similar IMU SPI driver"
depends on SPI
select IIO_ADIS_LIB
select IIO_ADIS_LIB_BUFFER if IIO_BUFFER
help
Say yes here to build support for Analog Devices adis16300, adis16344,
adis16350, adis16354, adis16355, adis16360, adis16362, adis16364,
adis16365, adis16400 and adis16405 triaxial inertial sensors
(adis16400 series also have magnetometers).

config ADIS16480
tristate "Analog Devices ADIS16480 and similar IMU driver"
depends on SPI
Expand Down
3 changes: 3 additions & 0 deletions drivers/iio/imu/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
# Makefile for Inertial Measurement Units
#

adis16400-y := adis16400_core.o
adis16400-$(CONFIG_IIO_BUFFER) += adis16400_buffer.o
obj-$(CONFIG_ADIS16400) += adis16400.o
obj-$(CONFIG_ADIS16480) += adis16480.o

adis_lib-y += adis.o
Expand Down
Loading

0 comments on commit 83eaeec

Please sign in to comment.