# Kconfig - Pinmux configuration options

#
# Copyright (c) 2015 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.
#

#
# PinMux options
#
menuconfig PINMUX
        bool "Enable platform pinmux driver"
        default n

config PINMUX_BASE
        hex "Base Address"
	depends on PINMUX
        help
        On platforms where there is a base pinmux register, set this value to
        enable the driver to directly access the memory.

config PINMUX_NUM_PINS
	int "Number of Pins to configure"
	default 0
	depends on PINMUX
        help
        Select the number of pins for the pinmux to operate on.

config PINMUX_DEV
        bool "Configure pinmux for early board testing"
        depends on PINMUX
        default n
        help
        Enables the use of the pinmux_set and pinmux_get functions for early
        prototyping on new hardware.  WARNING: When using these options, it
        is possible to permanently damage the hardware.

config PINMUX_INIT_PRIORITY
	int
	prompt "Init priority"
	default 60
	depends on PINMUX
	help
	  Device driver initialization priority.
	  The device needs to be initialized after all the devices it
	  uses.

config PINMUX_GALILEO_EXP0_NAME
        string "Name of the GPIO expander 0"
        depends on PINMUX && BOARD_GALILEO
        default "EXP0"
        help
        The name of the GPIO expander labelled as EXP0 in the schematic.

config PINMUX_GALILEO_EXP1_NAME
        string "Name of the GPIO expander 1"
        depends on PINMUX && BOARD_GALILEO
        default "EXP1"
        help
        The name of the GPIO expander labelled as EXP1 in the schematic.

config PINMUX_GALILEO_EXP2_NAME
        string "Name of the GPIO expander 2"
        depends on PINMUX && BOARD_GALILEO
        default "EXP2"
        help
        The name of the GPIO expander labelled as EXP2 in the schematic.

config PINMUX_GALILEO_PWM0_NAME
        string "Name of the PWM LED expander 0"
        depends on PINMUX && BOARD_GALILEO
        default "PWM0"
        help
        The name of the PWM LED expander labelled as PWM0 in the schematic.

config PINMUX_GALILEO_GPIO_DW_NAME
        string "Name of the DesignWare GPIO"
        depends on PINMUX && BOARD_GALILEO
        default "GPIO_0"
        help
        The name of the DesignWare GPIO with GPIO<0>..GPIO<7> in the schematic.

config PINMUX_GALILEO_GPIO_INTEL_CW_NAME
        string "Name of the Legacy Bridge Core Well GPIO"
        depends on PINMUX && BOARD_GALILEO
        default "GPIO_M0"
        help
        The name of the Legacy Bridge Core Well GPIO with GPIO<8>..GPIO<9>
        in the schematic.

config PINMUX_GALILEO_GPIO_INTEL_RW_NAME
        string "Name of the Legacy Bridge Resume Well GPIO"
        depends on PINMUX && BOARD_GALILEO
        default "GPIO_M1"
        help
        The name of the Legacy Bridge Resume Well GPIO with
        GPIO_SUS<0>..GPIO_SUS<5> in the schematic.
