# Kconfig - LSM6DSL accelerometer and gyroscope sensor configuration
# options

#
# Copyright (c) 2017 Linaro Limited
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig LSM6DSL
	bool "LSM6DSL I2C/SPI accelerometer and gyroscope Chip"
	depends on SENSOR && (I2C || SPI)
	default n
	help
	  Enable driver for LSM6DSL accelerometer and gyroscope
	  sensor.

choice
	prompt "Interface to AP"
	depends on LSM6DSL
	default LSM6DSL_I2C
	help
	  Select interface the LSM6DSL driver is connected to AP

config LSM6DSL_SPI
	depends on SPI
	bool "SPI Interface"

config LSM6DSL_I2C
	depends on I2C
	bool "I2C Interface"

endchoice

config LSM6DSL_DEV_NAME
	string "LSM6DSL device name"
	depends on (LSM6DSL_I2C && !HAS_DTS_I2C_DEVICE) || LSM6DSL_SPI
	default "LSM6DSL"

if !HAS_DTS_I2C_DEVICE

config LSM6DSL_I2C_ADDR
	hex
	prompt "LSM6DSL I2C address"
	depends on LSM6DSL && LSM6DSL_I2C
	default 0x6A
	range 0x6A 0x6B
	help
	  I2C address of the LSM6DSL sensor.
	  Use 0x6A if the SA0 pin is pulled to GND or 0x6B if the SA0 pin
	  is pulled to VCC.

config LSM6DSL_I2C_MASTER_DEV_NAME
	string "I2C master name where LSM6DSL chip is connected"
	depends on LSM6DSL && LSM6DSL_I2C
	default "I2C_2"
	help
	  Specify the device name of the I2C master device to which LSM6DSL is
	  connected.

endif #HAS_DTS_I2C_DEVICE

config LSM6DSL_SPI_SELECT_SLAVE
	hex "LSM6DSL SPI slave select pin"
	depends on LSM6DSL && LSM6DSL_SPI
	default 1
	help
	  LSM6DSL SPI chip select pin (active low).

config LSM6DSL_SPI_BUS_FREQ
	int "LSM6DSL SPI bus speed in Hz"
	default 8000000
	depends on LSM6DSL && LSM6DSL_SPI
	help
	  This is the maximum supported SPI bus frequency. The chip supports a
	  frequency up to 10MHz.

config LSM6DSL_SPI_MASTER_DEV_NAME
	string "SPI master name where LSM6DSL chip is connected"
	depends on LSM6DSL && LSM6DSL_SPI
	default "SPI_2"
	help
	  Specify the device name of the spi master device to which LSM6DSL is
	  connected.

config LSM6DSL_SPI_GPIO_CS
	bool "LSM6DSL SPI CS through a GPIO pin"
	default n
	depends on LSM6DSL && LSM6DSL_SPI
	help
	  This option is useful if one needs to manage SPI CS through a GPIO
	  pin to by-pass the SPI controller's CS logic.

config LSM6DSL_SPI_GPIO_CS_DRV_NAME
	string "GPIO driver's name to use to drive SPI CS through"
	default ""
	depends on LSM6DSL_SPI_GPIO_CS
	help
	  This option is mandatory to set which GPIO controller to use in order
	  to actually emulate the SPI CS.

config LSM6DSL_SPI_GPIO_CS_PIN
	int "GPIO PIN to use to drive SPI CS through"
	default 0
	depends on LSM6DSL_SPI_GPIO_CS
	help
	  This option is mandatory to set which GPIO pin to use in order
	  to actually emulate the SPI CS.

choice
	prompt "Trigger mode"
	depends on LSM6DSL
	default LSM6DSL_TRIGGER_NONE
	help
	  Specify the type of triggering to be used by the driver.

config LSM6DSL_TRIGGER_NONE
	bool
	prompt "No trigger"

config LSM6DSL_TRIGGER_GLOBAL_THREAD
	bool
	prompt "Use global thread"
	depends on GPIO
	select LSM6DSL_TRIGGER

config LSM6DSL_TRIGGER_OWN_THREAD
	bool
	prompt "Use own thread"
	depends on GPIO
	select LSM6DSL_TRIGGER

endchoice

config LSM6DSL_TRIGGER
	bool
	depends on LSM6DSL

config LSM6DSL_GPIO_DEV_NAME
	string
	prompt "GPIO device"
	depends on LSM6DSL && LSM6DSL_TRIGGER
	help
	  The device name of the GPIO device to which the LSM6DSL interrupt pin
	  is connected.

config LSM6DSL_GPIO_PIN_NUM
	int
	prompt "Interrupt GPIO pin number"
	depends on LSM6DSL && LSM6DSL_TRIGGER
	help
	  The number of the GPIO on which the interrupt signal from the LSM6DSL
	  chip will be received.

config LSM6DSL_THREAD_PRIORITY
	int
	prompt "Thread priority"
	depends on LSM6DSL && LSM6DSL_TRIGGER_OWN_THREAD
	default 10
	help
	  Priority of thread used by the driver to handle interrupts.

config LSM6DSL_THREAD_STACK_SIZE
	int
	prompt "Thread stack size"
	depends on LSM6DSL && LSM6DSL_TRIGGER_OWN_THREAD
	default 1024
	help
	  Stack size of thread used by the driver to handle interrupts.

config LSM6DSL_ENABLE_TEMP
	bool "Enable temperature"
	depends on LSM6DSL
	default n
	help
	  Enable/disable temperature

config LSM6DSL_SENSORHUB
	bool "Enable I2C sensorhub feature"
	depends on LSM6DSL
	default n
	help
	  Enable/disable internal sensorhub

if LSM6DSL_SENSORHUB

config LSM6DSL_ENABLE_INTERNAL_PULLUP
	bool "Enabled internals pull-up resistors"
	default y

choice
	prompt "External sensor 0"
	default LSM6DSL_EXT0_LIS2MDL
	help
	  Choose the external sensor 0 connected to LSM6DS3.

config LSM6DSL_EXT0_LIS2MDL
	bool "LIS2MDL"
config LSM6DSL_EXT0_LPS22HB
	bool "LPS22HB"
endchoice

endif #LSM6DSL_SENSORHUB

menu "Attributes"
	depends on LSM6DSL

config LSM6DSL_GYRO_FS
	int
	prompt "Gyroscope full-scale range"
	depends on LSM6DSL
	default 0
	help
	  Specify the default gyroscope full-scale range.
	  An X value for the config represents a range of +/- X degree per
	  second. Valid values are:
	  0:  Full Scale selected at runtime
	  125:   +/- 125dps
	  245:   +/- 245dps
	  500:   +/- 500dps
	  1000:  +/- 1000dps
	  2000:  +/- 2000dps

config LSM6DSL_GYRO_ODR
	int "Gyroscope Output data rate frequency"
	depends on LSM6DSL
	range 0 10
	default 0
	help
	  Specify the default accelerometer output data rate expressed in
	  samples per second (Hz).
	  0: ODR selected at runtime
	  1: 12.5Hz
	  2: 26Hz
	  3: 52Hz
	  4: 104Hz
	  5: 208Hz
	  6: 416Hz
	  7: 833Hz
	  8: 1660Hz
	  9: 3330Hz
	  10: 6660Hz

config LSM6DSL_ACCEL_FS
	int
	prompt "Accelerometer full-scale range"
	depends on LSM6DSL
	default 0
	help
	  Specify the default accelerometer full-scale range.
	  An X value for the config represents a range of +/- X G. Valid values
	  are:
	  0:  Full Scale selected at runtime
	  2:  +/- 2g
	  4:  +/- 4g
	  8:  +/- 8g
	  16: +/- 16g

config LSM6DSL_ACCEL_ODR
	int "Accelerometer Output data rate frequency"
	depends on LSM6DSL
	range 0 10
	default 0
	help
	  Specify the default accelerometer output data rate expressed in
	  samples per second (Hz).
	  0: ODR selected at runtime
	  1: 12.5Hz
	  2: 26Hz
	  3: 52Hz
	  4: 104Hz
	  5: 208Hz
	  6: 416Hz
	  7: 833Hz
	  8: 1660Hz
	  9: 3330Hz
	  10: 6660Hz
endmenu
