#
# 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.

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.

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.

endmenu
