# Kconfig - sensor configuration options

#
# Copyright (c) 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

menuconfig SENSOR
	bool
	prompt "Sensor Drivers"
	default n
	help
	  Include sensor drivers in system config

config SENSOR_DELAYED_WORK
	depends on SENSOR
	bool

config SENSOR_DELAYED_WORK_STACK_SIZE
	int "Sensor delayed work fiber stack size"
	depends on SENSOR && SENSOR_DELAYED_WORK
	default 1024

config SENSOR_DELAYED_WORK_PRIORITY
	int "Sensor delayed work fiber priority"
	depends on SENSOR && SENSOR_DELAYED_WORK
	default 10

config SENSOR_DEBUG
	bool "Enable sensor debug output"
	default n
	depends on SENSOR && PRINTK
	help
	  This option enables debug output for sensor drivers.

source "drivers/sensor/Kconfig.bma280"

source "drivers/sensor/Kconfig.bmc150_magn"

source "drivers/sensor/Kconfig.bmp280"

source "drivers/sensor/Kconfig.hdc1008"

source "drivers/sensor/Kconfig.isl29035"

source "drivers/sensor/Kconfig.lis3dh"

source "drivers/sensor/Kconfig.lsm9ds0_gyro"

source "drivers/sensor/Kconfig.mcp9808"

source "drivers/sensor/Kconfig.sht3xd"

source "drivers/sensor/Kconfig.sx9500"
