# Kconfig - i.MX RT series
#
# Copyright (c) 2017, NXP
#
# SPDX-License-Identifier: Apache-2.0
#

if SOC_SERIES_IMX_RT

config SOC_SERIES
	default "rt"

config TEXT_SECTION_OFFSET
	default 0x2000 if BOOT_FLEXSPI_NOR || BOOT_SEMC_NOR

config INIT_ENET_PLL

if CLOCK_CONTROL

config CLOCK_CONTROL_MCUX_CCM
	default y if HAS_MCUX_CCM

endif # CLOCK_CONTROL

if DISPLAY

config DISPLAY_MCUX_ELCDIF
	default y if HAS_MCUX_ELCDIF

endif # DISPLAY

if GPIO

config GPIO_MCUX_IGPIO
	default y if HAS_MCUX_IGPIO

endif # GPIO

if ENTROPY_GENERATOR

config ENTROPY_MCUX_TRNG
	default y if HAS_MCUX_TRNG

endif # ENTROPY_GENERATOR

if I2C

config I2C_MCUX_LPI2C
	default y if HAS_MCUX_LPI2C

endif # I2C

if PWM

config PWM_MCUX
	default y if HAS_MCUX_PWM

endif # PWM

if NET_L2_ETHERNET

config ETH_MCUX
	default y if HAS_MCUX_ENET

endif # NET_L2_ETHERNET

if SERIAL

config UART_MCUX_LPUART
	default y if HAS_MCUX_LPUART

endif # SERIAL

if COUNTER

config COUNTER_MCUX_GPT
	default y if HAS_MCUX_GPT

config COUNTER_MCUX_GPT1
	default y if HAS_MCUX_GPT

config COUNTER_MCUX_GPT2
	default y if HAS_MCUX_GPT

endif # COUNTER

if SPI

config SPI_MCUX_LPSPI
	default y if HAS_MCUX_LPSPI

endif # SPI

if CODE_ITCM

config FLASH_SIZE
	default $(dt_int_val,DT_INST_0_NXP_IMX_ITCM_SIZE,K)

config FLASH_BASE_ADDRESS
	default $(dt_hex_val,DT_INST_0_NXP_IMX_ITCM_BASE_ADDRESS)

endif # CODE_ITCM

if CODE_FLEXSPI

config FLASH_SIZE
	default $(dt_int_val,DT_NXP_IMX_FLEXSPI_402A8000_SIZE_1,K)

config FLASH_BASE_ADDRESS
	default $(dt_hex_val,DT_NXP_IMX_FLEXSPI_402A8000_BASE_ADDRESS_1)

endif # CODE_FLEXSPI

if CODE_FLEXSPI2

config FLASH_SIZE
        default $(dt_int_val,DT_NXP_IMX_FLEXSPI_402A4000_SIZE_1,K)

config FLASH_BASE_ADDRESS
        default $(dt_hex_val,DT_NXP_IMX_FLEXSPI_402A4000_BASE_ADDRESS_1)

endif # CODE_FLEXSPI2

if DATA_DTCM

config SRAM_SIZE
	default $(dt_int_val,DT_INST_0_NXP_IMX_DTCM_SIZE,K)

config SRAM_BASE_ADDRESS
	default $(dt_hex_val,DT_INST_0_NXP_IMX_DTCM_BASE_ADDRESS)

endif # DATA_DTCM

if DATA_SEMC

config SRAM_SIZE
	default $(dt_int_val,DT_MMIO_SRAM_80000000_SIZE,K)

config SRAM_BASE_ADDRESS
	default $(dt_hex_val,DT_MMIO_SRAM_80000000_BASE_ADDRESS)

endif # DATA_SEMC

if USB

config USB_DC_NXP_EHCI
	default y

endif # USB

source "soc/arm/nxp_imx/rt/Kconfig.defconfig.mimxrt*"

endif # SOC_SERIES_IMX_RT
