# Nuvoton Cortex-M4 Embedded Controller

# Copyright (c) 2020 Nuvoton Technology Corporation.
# SPDX-License-Identifier: Apache-2.0

config SOC_FAMILY_NPCX
	bool

if SOC_FAMILY_NPCX
config SOC_FAMILY
	string
	default "nuvoton_npcx"

menuconfig NPCX_HEADER
	bool "The output binary with NPCX binary header"
	help
	  On NPCX series chip, the NPCX ROM code loads firmware image from flash
	  to RAM by the firmware binary header setting. Enable this to invoke
	  the 'ecst' which generates the NPCX firmware header.

if NPCX_HEADER

config NPCX_IMAGE_OUTPUT_BIN
	bool "Build npcx binary in BIN format"
	default y
	help
	  Build a "raw" binary zephyr/zephyr.npcx.bin in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config NPCX_IMAGE_OUTPUT_HEX
	bool "Build npcx binary in HEX format"
	depends on NPCX_IMAGE_OUTPUT_BIN
	help
	  Build an HEX binary zephyr/zephyr.npcx.hex in the build directory.
	  This is generated from the npcx BIN image.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config NPCX_HEADER_CHIP
	string
	default "npcx7m6" if SOC_NPCX7M6FB || SOC_NPCX7M6FC
	default "npcx7m7" if SOC_NPCX7M7FC
	default "npcx9m3" if SOC_NPCX9M3F
	default "npcx9m6" if SOC_NPCX9M6F
	default "npcx9m7" if SOC_NPCX9M7F

choice NPCX_HEADER_SPI_MAX_CLOCK_CHOICE
	prompt "Clock rate to use for SPI flash"
	default NPCX_HEADER_SPI_MAX_CLOCK_20
	help
	  This selects the max clock rate that will be used for loading firmware
	  binary from flash to RAM.

config NPCX_HEADER_SPI_MAX_CLOCK_20
	bool "SPI flash max clock rate of 20 MHz"

config NPCX_HEADER_SPI_MAX_CLOCK_25
	bool "SPI flash max clock rate of 25 MHz"

config NPCX_HEADER_SPI_MAX_CLOCK_33
	bool "SPI flash max clock rate of 33 MHz"
	depends on !SOC_SERIES_NPCX9

config NPCX_HEADER_SPI_MAX_CLOCK_40
	bool "SPI flash max clock rate of 40 MHz"

config NPCX_HEADER_SPI_MAX_CLOCK_50
	bool "SPI flash max clock rate of 50 MHz"
endchoice

config NPCX_HEADER_SPI_MAX_CLOCK
	int
	default 20 if NPCX_HEADER_SPI_MAX_CLOCK_20
	default 25 if NPCX_HEADER_SPI_MAX_CLOCK_25
	default 33 if NPCX_HEADER_SPI_MAX_CLOCK_33
	default 40 if NPCX_HEADER_SPI_MAX_CLOCK_40
	default 50 if NPCX_HEADER_SPI_MAX_CLOCK_50

choice NPCX_HEADER_SPI_READ_MODE_CHOICE
	prompt "Reading mode used by the SPI flash"
	default NPCX_HEADER_SPI_READ_MODE_NORMAL
	help
	  This sets the reading mode that can be used by the SPI flash.
	  Reading modes supported are normal, fast, dual, and quad.

config NPCX_HEADER_SPI_READ_MODE_NORMAL
	bool "SPI flash operates with normal reading mode"

config NPCX_HEADER_SPI_READ_MODE_FAST
	bool "SPI flash operates with fast reading mode"

config NPCX_HEADER_SPI_READ_MODE_DUAL
	bool "SPI flash operates with dual reading mode"

config NPCX_HEADER_SPI_READ_MODE_QUAD
	bool "SPI flash operates with quad reading mode"
endchoice

config NPCX_HEADER_SPI_READ_MODE
	string
	default "normal" if NPCX_HEADER_SPI_READ_MODE_NORMAL
	default "fast" if NPCX_HEADER_SPI_READ_MODE_FAST
	default "dual" if NPCX_HEADER_SPI_READ_MODE_DUAL
	default "quad" if NPCX_HEADER_SPI_READ_MODE_QUAD

choice NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_CHOICE
	prompt "Core clock to SPI flash clock ratio"
	default NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_1
	help
	  This sets the clock ratio (core clock / SPI clock)

config NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_1
	bool "NPCX SPI clock ratio 1"
	help
	  The SPI flash clock has the same frequency as the core clock.

config NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_2
	bool "NPCX SPI clock ratio 2"
	help
	  The core clock frequency is twice the flash clock frequency.
endchoice

config NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO
	int
	default 1 if NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_1
	default 2 if NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO_2

config NPCX_HEADER_ENABLE_HEADER_CRC
	bool "Header crc check"
	help
	  When enabled, the header will be verified at boot using a crc
	  checksum.

config NPCX_HEADER_ENABLE_FIRMWARE_CRC
	bool "Firmware image crc check"
	help
	  When enabled, the firmware image will be verified at boot using a
	  crc checksum.

choice NPCX_HEADER_FLASH_SIZE_CHOICE
	prompt "Flash size"
	default NPCX_HEADER_FLASH_SIZE_0P5M_1M if SOC_SERIES_NPCX7 || \
						  SOC_SERIES_NPCX9
	default NPCX_HEADER_FLASH_SIZE_16M
	help
	  This sets the SPI flash size.

config NPCX_HEADER_FLASH_SIZE_0P5M_1M
	bool "SPI flash size 0.5M or 1M Bytes"
	help
	  The SPI flash size is 0.5M or 1M Bytes.

config NPCX_HEADER_FLASH_SIZE_2M
	bool "SPI flash size 2M Bytes"
	help
	  The SPI flash size is 2M Bytes.

config NPCX_HEADER_FLASH_SIZE_4M
	bool "SPI flash size 4M Bytes"
	help
	  The SPI flash size is 4M Bytes.

config NPCX_HEADER_FLASH_SIZE_8M
	bool "SPI flash size 8M Bytes"
	help
	  The SPI flash size is 8M Bytes.

config NPCX_HEADER_FLASH_SIZE_16M
	bool "SPI flash size 16M Bytes"
	help
	  The SPI flash size is 16M Bytes.
endchoice

config NPCX_HEADER_FLASH_SIZE
	int
	default 1 if NPCX_HEADER_FLASH_SIZE_0P5M_1M
	default 2 if NPCX_HEADER_FLASH_SIZE_2M
	default 4 if NPCX_HEADER_FLASH_SIZE_4M
	default 8 if NPCX_HEADER_FLASH_SIZE_8M
	default 16 if NPCX_HEADER_FLASH_SIZE_16M

endif # NPCX_HEADER

# Select SoC Part No. and configuration options
source "soc/arm/nuvoton_npcx/*/Kconfig.soc"

config NPCX_PM_TRACE
	bool "Trace System Power Management in NPCX family"
	depends on PM
	help
	  Internal config to enable runtime power management traces.

endif # SOC_FAMILY_NPCX
