# DesignWare GPIO configuration options

# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menuconfig GPIO_DW
	bool "Designware GPIO"
	select HAS_DTS_GPIO
	help
	  Enable driver for Designware GPIO

if GPIO_DW

config GPIO_DW_SHARED_IRQ
	bool

config GPIO_DW_INIT_PRIORITY
	int "Init priority"
	default 60
	help
	  Device driver initialization priority.

config GPIO_DW_CLOCK_GATE
	bool "Enable clock gating"
	select CLOCK_CONTROL

config GPIO_DW_CLOCK_GATE_DRV_NAME
	string
	depends on GPIO_DW_CLOCK_GATE
	default ""

config GPIO_DW_0
	bool "Designware GPIO block 0"
	help
	  Include Designware GPIO driver

if !HAS_DTS
config GPIO_DW_0_NAME
	string "Driver name"
	depends on GPIO_DW_0
	default "GPIO_0"
endif

config GPIO_DW_0_CLOCK_GATE_SUBSYS
	int "Clock controller's subsystem"
	depends on GPIO_DW_CLOCK_GATE && GPIO_DW_0

choice
	prompt "Port 0 Interrupts via"
	default GPIO_DW_0_IRQ_DIRECT
	depends on GPIO_DW_0

config GPIO_DW_0_IRQ_DIRECT
	bool "Direct Hardware Interrupt"
	help
	  When interrupts fire, the driver's ISR function is being called directly.

config GPIO_DW_0_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select GPIO_DW_SHARED_IRQ
	help
	  When interrupts fire, the shared IRQ driver is notified. Then the shared IRQ
	  driver dispatches the interrupt to other drivers.

endchoice

if !HAS_DTS
config GPIO_DW_0_IRQ_PRI
	int "Controller interrupt priority"
	depends on GPIO_DW_0 && GPIO_DW_0_IRQ_DIRECT
	help
	  IRQ priority
endif

config GPIO_DW_1
	bool "Designware GPIO block 1"
	help
	  Include Designware GPIO driver

if !HAS_DTS
config GPIO_DW_1_NAME
	string "Driver name"
	depends on GPIO_DW_1
	default "GPIO_1"
endif

config GPIO_DW_1_CLOCK_GATE_SUBSYS
	int "Clock controller's subsystem"
	depends on GPIO_DW_CLOCK_GATE && GPIO_DW_1

choice
	prompt "Port 1 Interrupts via"
	default GPIO_DW_1_IRQ_DIRECT
	depends on GPIO_DW_1

config GPIO_DW_1_IRQ_DIRECT
	bool "Direct Hardware Interrupt"
	help
	  When interrupts fire, the driver's ISR function is being called directly.

config GPIO_DW_1_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select GPIO_DW_SHARED_IRQ
	help
	  When interrupts fire, the shared IRQ driver is notified. Then the shared IRQ
	  driver dispatches the interrupt to other drivers.

endchoice

if !HAS_DTS
config GPIO_DW_1_IRQ_PRI
	int "Controller interrupt priority"
	depends on GPIO_DW_1 && GPIO_DW_1_IRQ_DIRECT
	help
	  IRQ priority
endif

config GPIO_DW_2
	bool "Designware GPIO block 1"
	help
	  Include Designware GPIO driver

if !HAS_DTS
config GPIO_DW_2_NAME
	string "Driver name"
	depends on GPIO_DW_2
	default "GPIO_2"
endif

config GPIO_DW_2_CLOCK_GATE_SUBSYS
	int "Clock controller's subsystem"
	depends on GPIO_DW_CLOCK_GATE && GPIO_DW_2

choice
	prompt "Port 1 Interrupts via"
	default GPIO_DW_2_IRQ_DIRECT
	depends on GPIO_DW_2

config GPIO_DW_2_IRQ_DIRECT
	bool "Direct Hardware Interrupt"
	help
	  When interrupts fire, the driver's ISR function is being called directly.

config GPIO_DW_2_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select GPIO_DW_SHARED_IRQ
	help
	  When interrupts fire, the shared IRQ driver is notified. Then the shared IRQ
	  driver dispatches the interrupt to other drivers.

endchoice

if !HAS_DTS
config GPIO_DW_2_IRQ_PRI
	int "Controller interrupt priority"
	depends on GPIO_DW_2 && GPIO_DW_2_IRQ_DIRECT
	help
	  IRQ priority
endif

config GPIO_DW_3
	bool "Designware GPIO block 1"
	help
	  Include Designware GPIO driver

if !HAS_DTS
config GPIO_DW_3_NAME
	string "Driver name"
	depends on GPIO_DW_3
	default "GPIO_3"
endif

config GPIO_DW_3_CLOCK_GATE_SUBSYS
	int "Clock controller's subsystem"
	depends on GPIO_DW_CLOCK_GATE && GPIO_DW_3

choice
	prompt "Port 1 Interrupts via"
	default GPIO_DW_3_IRQ_DIRECT
	depends on GPIO_DW_3

config GPIO_DW_3_IRQ_DIRECT
	bool "Direct Hardware Interrupt"
	help
	  When interrupts fire, the driver's ISR function is being called directly.

config GPIO_DW_3_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select GPIO_DW_SHARED_IRQ
	help
	  When interrupts fire, the shared IRQ driver is notified. Then the shared IRQ
	  driver dispatches the interrupt to other drivers.

endchoice

if !HAS_DTS
config GPIO_DW_3_IRQ_PRI
	int "Controller interrupt priority"
	depends on GPIO_DW_3 && GPIO_DW_3_IRQ_DIRECT
	help
	  IRQ priority
endif

endif # GPIO_DW
