# Kconfig.quark_se_ss - Quark SE Sensor Subsystem I2C 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 I2C_QUARK_SE_SS
	bool "I2C Driver for Quark SE Sensor Subsystem (SS)"
	default n
	depends on SOC_QUARK_SE_SS
	depends on I2C
	help
	This option enables the driver to support the I2C on Quark SE Sensor
	Subsystem.

if I2C_QUARK_SE_SS

config I2C_QUARK_SE_SS_0
	bool "Enable Quark SE SS I2C Port 0"
	depends on I2C_QUARK_SE_SS
	default n

config I2C_QUARK_SE_SS_0_NAME
	string "Select a name for finding the device"
	depends on I2C_QUARK_SE_SS_0
	default "I2C_SS_0"

config I2C_QUARK_SE_SS_0_DEFAULT_CFG
	hex "Default Configuration for Quark SE SS I2C Port 0"
	depends on I2C_QUARK_SE_SS_0
	default 0x0
	help
	Allows the I2C port to be brought up with a default configuration.
	This is useful to set if other drivers depend upon using the I2C bus
	before the application has a chance to custom configure the port.
	Setting this value does not prohibit the application from customizing
	the values later. Refer to the I2C datasheet for proper values.

config I2C_QUARK_SE_SS_1
	bool "Enable Quark SE SS I2C Port 1"
	depends on I2C_QUARK_SE_SS
	default n

config I2C_QUARK_SE_SS_1_NAME
	string "Select a name for finding the device"
	depends on I2C_QUARK_SE_SS_1
	default "I2C_SS_1"

config I2C_QUARK_SE_SS_1_DEFAULT_CFG
	hex "Default Configuration for Quark SE SS I2C Port 1"
	depends on I2C_QUARK_SE_SS_1
	default 0x0
	help
	Allows the I2C port to be brought up with a default configuration.
	This is useful to set if other drivers depend upon using the I2C bus
	before the application has a chance to custom configure the port.
	Setting this value does not prohibit the application from customizing
	the values later. Refer to the I2C datasheet for proper values.

endif # I2C_QUARK_SE_SS
