# Kconfig.qmsi - QMSI SPI driver 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 SPI_QMSI
	bool "QMSI driver for SPI controller"
	depends on SPI && QMSI
	default n
	help
	  SPI driver implementation using QMSI library. QMSI is the
	  Quark Microcontroller Software Interface, providing a common
	  interface to the Quark family of microcontrollers.

if SPI_QMSI

config	SPI_QMSI_PORT_0
	bool
	prompt "QMSI SPI port 0"
	depends on SPI_QMSI
	default n
	help
	  Enable QMSI's SPI controller port 0.

config SPI_QMSI_CS_GPIO
	bool "SPI port CS pin is controlled via a GPIO port"
	depends on SPI_QMSI && GPIO
	default n

config  SPI_QMSI_PORT_0_DRV_NAME
	string
	prompt "QMSI SPI port 0 device name"
	depends on SPI_QMSI_PORT_0
	default "SPI_0"

config  SPI_QMSI_PORT_0_PRI
	int
	prompt "Port 0 interrupt priority"
	depends on SPI_QMSI_PORT_0

config  SPI_QMSI_PORT_0_CS_GPIO_PORT
	string
	prompt "The GPIO port which is used to control CS"
	depends on SPI_QMSI_PORT_0 && SPI_QMSI_CS_GPIO
	default GPIO_QMSI_0_NAME

config  SPI_QMSI_PORT_0_CS_GPIO_PIN
	int "The GPIO PIN which is used to act as a CS pin"
	depends on SPI_QMSI_PORT_0 && SPI_QMSI_CS_GPIO
	default 0

config  SPI_QMSI_PORT_1
	bool
	prompt "QMSI SPI port 1"
	depends on SPI_QMSI
	default n
	help
	  Enable QMSI's SPI controller port 1.

config  SPI_QMSI_PORT_1_DRV_NAME
	string
	prompt "QMSI SPI port 1 device name"
	depends on SPI_QMSI_PORT_1
	default "SPI_1"

config  SPI_QMSI_PORT_1_PRI
	int
	prompt "Port 0 interrupt priority"
	depends on SPI_QMSI_PORT_1

config  SPI_QMSI_PORT_1_CS_GPIO_PORT
	string
	prompt "The GPIO port which is used to control CS"
	depends on SPI_QMSI_PORT_1 && SPI_QMSI_CS_GPIO
	default GPIO_QMSI_0_NAME

config  SPI_QMSI_PORT_1_CS_GPIO_PIN
	int "The GPIO PIN which is used to act as a CS pin"
	depends on SPI_QMSI_PORT_1 && SPI_QMSI_CS_GPIO
	default 0

endif # SPI_QMSI
