# Kconfig.qmsi - QMSI GPIO 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 GPIO_QMSI
	bool "QMSI GPIO driver"
	depends on GPIO && QMSI
	default n
	help
	  Enable the GPIO driver found on Intel Microcontroller
	  platforms, using the QMSI library.

if GPIO_QMSI

config GPIO_QMSI_INIT_PRIORITY
        int
        default 60
        depends on GPIO_QMSI
        prompt "Init priority"
        help
          Device driver initialization priority.

config GPIO_QMSI_0
	bool "QMSI GPIO block 0"
	depends on GPIO_QMSI
	default n
	help
	  Include support for the GPIO port 0 using QMSI.

config GPIO_QMSI_0_NAME
	string "Driver name"
	depends on GPIO_QMSI_0
	default "GPIO_0"

config GPIO_QMSI_0_PRI
	int "Controller interrupt priority"
	depends on GPIO_QMSI_0
	help
	  IRQ priority

config GPIO_QMSI_AON
	bool "QMSI GPIO block AON"
	depends on GPIO_QMSI
	default n
	help
	  Include support for the GPIO AON (always on) port using QMSI.

config GPIO_QMSI_AON_NAME
	string "Driver name"
	depends on GPIO_QMSI_AON
	default "GPIO_AON_0"

config GPIO_QMSI_AON_PRI
	int "Controller interrupt priority"
	depends on GPIO_QMSI_AON
	help
	  IRQ priority

endif # GPIO_QMSI
