##
## This file is part of the coreboot project.
##
## Copyright (C) 2012 The Chromium OS Authors.
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; version 2 of the License.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##

config SPI_FLASH
	bool
	default n
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash.

if SPI_FLASH

config SPI_ATOMIC_SEQUENCING
	bool
	default y if ARCH_X86
	default n if !ARCH_X86
	help
	  Select this option if the SPI controller uses "atomic sequencing."
	  Atomic sequencing is when the sequence of commands is pre-programmed
	  in the SPI controller. Hardware manages the transaction instead of
	  software. This is common on x86 platforms.

config SPI_FLASH_MEMORY_MAPPED
	bool
	default y if ARCH_X86
	default n if !ARCH_X86
	help
	  Inform system if SPI is memory-mapped or not.

config SPI_FLASH_SMM
	bool "SPI flash driver support in SMM"
	default n
	depends on HAVE_SMI_HANDLER
	help
	  Select this option if you want SPI flash support in SMM.

config SPI_FLASH_NO_FAST_READ
	bool "Disable Fast Read command"
	default n
	help
	  Select this option if your setup requires to avoid "fast read"s
	  from the SPI flash parts.

config SPI_FLASH_ADESTO
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Adesto Technologies.

config SPI_FLASH_AMIC
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by AMIC.

config SPI_FLASH_ATMEL
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Atmel.

config SPI_FLASH_EON
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by EON.

config SPI_FLASH_GIGADEVICE
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Gigadevice.

config SPI_FLASH_MACRONIX
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Macronix.

config SPI_FLASH_SPANSION
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Spansion.

config SPI_FLASH_SST
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by SST.

config SPI_FLASH_STMICRO
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by ST MICRO.

config SPI_FLASH_WINBOND
	bool
	default y if !COMMON_CBFS_SPI_WRAPPER
	help
	  Select this option if your chipset driver needs to store certain
	  data in the SPI flash and your SPI flash is made by Winbond.

config SPI_FLASH_FAST_READ_DUAL_OUTPUT_3B
	bool
	default n
	depends on SPI_FLASH
	help
	  Select this option if your SPI flash supports the fast read dual-
	  output command (opcode 0x3b) where the opcode and address are sent
	  to the chip on MOSI and data is received on both MOSI and MISO.

endif # SPI_FLASH

config HAVE_SPI_CONSOLE_SUPPORT
	def_bool n

