# Kconfig - Quark SE configuration options

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

if SOC_QUARK_SE

config SOC
	default quark_se

config PHYS_RAM_ADDR
	default 0xA8006400

config PHYS_LOAD_ADDR
	default 0x40030000 if XIP

config RAM_SIZE
	default 55

config ROM_SIZE
	default 144

config	SYS_CLOCK_HW_CYCLES_PER_SEC
	default 32000000

config IOAPIC_NUM_RTES
	default 64 if IOAPIC

config LOAPIC_TIMER_IRQ
	default 64 if LOAPIC_TIMER

config TOOLCHAIN_VARIANT
	default "iamcu"

config QMSI
	def_bool y

config QMSI_BUILTIN
	def_bool y

if PWM
config PWM_QMSI
	def_bool y
endif

if GPIO
config GPIO_QMSI
	def_bool y

config GPIO_QMSI_0
	def_bool y

config GPIO_QMSI_0_IRQ_PRI
	default 2

config GPIO_QMSI_AON
	def_bool y
config GPIO_QMSI_AON_IRQ_PRI
	default 2
endif # GPIO

if I2C
config I2C_QMSI
	def_bool y

config I2C_0
	def_bool y

if I2C_0

config I2C_0_IRQ_PRI
	default 2
config I2C_0_DEFAULT_CFG
	default 0x12

endif # I2C_0

config I2C_1
	def_bool y

if I2C_1
config I2C_1_IRQ_PRI
	default 2
config I2C_1_DEFAULT_CFG
	default 0x12

endif # I2C_1

endif # I2C


if CLOCK_CONTROL

config CLOCK_CONTROL_QUARK_SE
	def_bool y

if CLOCK_CONTROL_QUARK_SE

config CLOCK_CONTROL_QUARK_SE_PERIPHERAL
	def_bool y
config CLOCK_CONTROL_QUARK_SE_PERIPHERAL_DRV_NAME
	default "clk_peripheral"

config CLOCK_CONTROL_QUARK_SE_EXTERNAL
	def_bool y
config CLOCK_CONTROL_QUARK_SE_EXTERNAL_DRV_NAME
	default "clk_external"

config CLOCK_CONTROL_QUARK_SE_SENSOR
	def_bool y
config CLOCK_CONTROL_QUARK_SE_SENSOR_DRV_NAME
	default "clk_sensor"

endif # CLOCK_CONTROL_QUARK_SE

endif # CLOCK_CONTROL


if COUNTER
config AON_COUNTER_QMSI
	def_bool y
config AON_TIMER_QMSI
	def_bool y
config AON_TIMER_IRQ_PRI
	default 2

endif


if SPI
config SPI_QMSI
	def_bool y

config SPI_0
	def_bool y

config SPI_0_IRQ_PRI
	default 2

config SPI_1
	def_bool y

config SPI_1_IRQ_PRI
	default 2

endif # SPI

if ADC
config ADC_QMSI
	def_bool y
endif


if AIO_COMPARATOR
config AIO_COMPARATOR_QMSI
	def_bool y
endif


if WATCHDOG
config WDT_QMSI
	def_bool y

config WDT_0_IRQ_PRI
	default 2
endif # WATCHDOG

if RTC
config RTC_QMSI
	def_bool y
config RTC_0_IRQ_PRI
	default 2
endif # RTC

if UART_QMSI
config UART_QMSI_0
	def_bool y

if UART_QMSI_0

config UART_QMSI_0_IRQ_PRI
	default 3

endif # UART_QMSI_0

config UART_QMSI_1
	def_bool y

if UART_QMSI_1

config UART_QMSI_1_IRQ_PRI
	default 3

endif # UART_QMSI_1

endif # UART_QMSI

if UART_CONSOLE

config UART_CONSOLE_ON_DEV_NAME
	default "UART_1"

endif

if SOC_FLASH_QMSI
config SOC_FLASH_QMSI_SYS_SIZE
	default 0x60000
endif # SOC_FLASH_QMSI

if USB
config USB_DW_IRQ_PRI
	default 3
endif # USB

endif # SOC_QUARK_SE
