# ST Microelectronics LSM6DSO 6-axis IMU sensor driver
#
# Copyright (c) 2019 STMicroelectronics
#
# SPDX-License-Identifier: Apache-2.0
#
menuconfig LSM6DSO
	bool "LSM6DSO I2C/SPI accelerometer and gyroscope Chip"
	depends on (I2C && HAS_DTS_I2C) || (SPI && HAS_DTS_SPI)
	select HAS_STMEMSC
	select USE_STDC_LSM6DSO
	help
	  Enable driver for LSM6DSO accelerometer and gyroscope
	  sensor.

if LSM6DSO

choice LSM6DSO_TRIGGER_MODE
	prompt "Trigger mode"
	help
	  Specify the type of triggering to be used by the driver.

config LSM6DSO_TRIGGER_NONE
	bool "No trigger"

config LSM6DSO_TRIGGER_GLOBAL_THREAD
	bool "Use global thread"
	depends on GPIO
	select LSM6DSO_TRIGGER

config LSM6DSO_TRIGGER_OWN_THREAD
	bool "Use own thread"
	depends on GPIO
	select LSM6DSO_TRIGGER

endchoice

config LSM6DSO_TRIGGER
	bool

if LSM6DSO_TRIGGER

config LSM6DSO_THREAD_PRIORITY
	int "Thread priority"
	depends on LSM6DSO_TRIGGER_OWN_THREAD
	default 10
	help
	  Priority of thread used by the driver to handle interrupts.

config LSM6DSO_THREAD_STACK_SIZE
	int "Thread stack size"
	depends on LSM6DSO_TRIGGER_OWN_THREAD
	default 1024
	help
	  Stack size of thread used by the driver to handle interrupts.

choice LSM6DSO_INT_PIN
	prompt "Sensor INT pin number"
	default LSM6DSO_INT_PIN_1
	help
	  The number of LSM6DSO int pin used to generate interrupt to cpu.
	  Supported values are int1 or int2

config LSM6DSO_INT_PIN_1
	bool "int1"

config LSM6DSO_INT_PIN_2
	bool "int2"
endchoice

endif # LSM6DSO_TRIGGER

config LSM6DSO_ENABLE_TEMP
	bool "Enable temperature"
	help
	  Enable/disable temperature

config LSM6DSO_SENSORHUB
	bool "Enable I2C sensorhub feature"
	help
	  Enable/disable internal sensorhub. You can enable
	  a maximum of two external sensors (if more than two are enabled
	  the system would enumerate only the first two found)

if LSM6DSO_SENSORHUB

config LSM6DSO_EXT_LIS2MDL
	bool "Enable LIS2MDL as external sensor"
	default y

config LSM6DSO_EXT_LPS22HH
	bool "Enable LPS22HH as external sensor"
	default y

config LSM6DSO_EXT_HTS221
	bool "Enable HTS221 as external sensor"

config LSM6DSO_EXT_LPS22HB
	bool "Enable LPS22HB as external sensor"

endif #LSM6DSO_SENSORHUB

menu "Attributes"

config LSM6DSO_GYRO_FS
	int "Gyroscope full-scale range"
	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
	  250:   +/- 250dps
	  500:   +/- 500dps
	  1000:  +/- 1000dps
	  2000:  +/- 2000dps

config LSM6DSO_GYRO_ODR
	int "Gyroscope Output data rate frequency"
	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 LSM6DSO_ACCEL_FS
	int "Accelerometer full-scale range"
	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 LSM6DSO_ACCEL_ODR
	int "Accelerometer Output data rate frequency"
	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

endif # LSM6DSO
