#
# Accelerometer drivers
#
# When adding new entries keep the list in alphabetical order

menu "Accelerometers"

config BMA180
	tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"
	depends on I2C
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	  Say Y here if you want to build a driver for the Bosch BMA180 or
	  BMA250 triaxial acceleration sensor.

	  To compile this driver as a module, choose M here: the
	  module will be called bma180.

config BMC150_ACCEL
	tristate "Bosch BMC150 Accelerometer Driver"
	depends on I2C
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	  Say yes here to build support for the following Bosch accelerometers:
	  BMC150, BMI055, BMA250E, BMA222E, BMA255, BMA280.

	  Currently this only supports the device via an i2c interface.

	  This is a combo module with both accelerometer and magnetometer.
	  This driver is only implementing accelerometer part, which has
	  its own address and register map.

config HID_SENSOR_ACCEL_3D
	depends on HID_SENSOR_HUB
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	select HID_SENSOR_IIO_COMMON
	select HID_SENSOR_IIO_TRIGGER
	tristate "HID Accelerometers 3D"
	help
	  Say yes here to build support for the HID SENSOR
	  accelerometers 3D.

	  To compile this driver as a module, choose M here: the
	  module will be called hid-sensor-accel-3d.

config IIO_ST_ACCEL_3AXIS
	tristate "STMicroelectronics accelerometers 3-Axis Driver"
	depends on (I2C || SPI_MASTER) && SYSFS
	select IIO_ST_SENSORS_CORE
	select IIO_ST_ACCEL_I2C_3AXIS if (I2C)
	select IIO_ST_ACCEL_SPI_3AXIS if (SPI_MASTER)
	select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
	help
	  Say yes here to build support for STMicroelectronics accelerometers:
	  LSM303DLH, LSM303DLHC, LIS3DH, LSM330D, LSM330DL, LSM330DLC,
	  LIS331DLH, LSM303DL, LSM303DLM, LSM330.

	  This driver can also be built as a module. If so, these modules
	  will be created:
	  - st_accel (core functions for the driver [it is mandatory]);
	  - st_accel_i2c (necessary for the I2C devices [optional*]);
	  - st_accel_spi (necessary for the SPI devices [optional*]);

	  (*) one of these is necessary to do something.

config IIO_ST_ACCEL_I2C_3AXIS
	tristate
	depends on IIO_ST_ACCEL_3AXIS
	depends on IIO_ST_SENSORS_I2C

config IIO_ST_ACCEL_SPI_3AXIS
	tristate
	depends on IIO_ST_ACCEL_3AXIS
	depends on IIO_ST_SENSORS_SPI

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.

	  To compile this driver as a module, choose M here: the module
	  will be called kxsd9.

config MMA8452
	tristate "Freescale MMA8452Q Accelerometer Driver"
	depends on I2C
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	  Say yes here to build support for the Freescale MMA8452Q 3-axis
	  accelerometer.

	  To compile this driver as a module, choose M here: the module
	  will be called mma8452.

config KXCJK1013
	tristate "Kionix 3-Axis Accelerometer Driver"
	depends on I2C
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	  Say Y here if you want to build a driver for the Kionix KXCJK-1013
	  triaxial acceleration sensor. This driver also supports KXCJ9-1008
	  and KXTJ2-1009.

	  To compile this driver as a module, choose M here: the module will
	  be called kxcjk-1013.

config MMA9551_CORE
	tristate

config MMA9551
	tristate "Freescale MMA9551L Intelligent Motion-Sensing Platform Driver"
	depends on I2C
	select MMA9551_CORE

	help
	  Say yes here to build support for the Freescale MMA9551L
	  Intelligent Motion-Sensing Platform Driver.

	  To compile this driver as a module, choose M here: the module
	  will be called mma9551.

config MMA9553
	tristate "Freescale MMA9553L Intelligent Pedometer Platform Driver"
	depends on I2C
	select MMA9551_CORE
	help
	  Say yes here to build support for the Freescale MMA9553L
	  Intelligent Pedometer Platform Driver.

	  To compile this driver as a module, choose M here: the module
	  will be called mma9553.

config STK8312
	tristate "Sensortek STK8312 3-Axis Accelerometer Driver"
	depends on I2C
	help
	  Say yes here to get support for the Sensortek STK8312 3-axis
	  accelerometer.

	  Choosing M will build the driver as a module. If so, the module
	  will be called stk8312.

config STK8BA50
	tristate "Sensortek STK8BA50 3-Axis Accelerometer Driver"
	depends on I2C
	help
	  Say yes here to get support for the Sensortek STK8BA50 3-axis
	  accelerometer.

	  Choosing M will build the driver as a module. If so, the module
	  will be called stk8ba50.

endmenu
