#
# Kernel configuration file for the UFS Host Controller
#
# This code is based on drivers/scsi/ufs/Kconfig
# Copyright (C) 2011-2013 Samsung India Software Operations
#
# Authors:
#	Santosh Yaraganavi <santosh.sy@samsung.com>
#	Vinayak Holikatti <h.vinayak@samsung.com>
#
# 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; either version 2
# of the License, or (at your option) any later version.
# See the COPYING file in the top-level directory or visit
# <http://www.gnu.org/licenses/gpl-2.0.html>
#
# 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.
#
# This program is provided "AS IS" and "WITH ALL FAULTS" and
# without warranty of any kind. You are solely responsible for
# determining the appropriateness of using and distributing
# the program and assume all risks associated with your exercise
# of rights with respect to the program, including but not limited
# to infringement of third party rights, the risks and costs of
# program errors, damage to or loss of data, programs or equipment,
# and unavailability or interruption of operations. Under no
# circumstances will the contributor of this Program be liable for
# any damages of any kind arising from your use or distribution of
# this program.

config SCSI_UFSHCD
	tristate "Universal Flash Storage Controller Driver Core"
	depends on SCSI && SCSI_DMA
	select PM_DEVFREQ
	select DEVFREQ_GOV_SIMPLE_ONDEMAND
	select NLS
	help
	  This selects the support for UFS devices in Linux, say Y and make
	  sure that you know the name of your UFS host adapter (the card
	  inside your computer that "speaks" the UFS protocol, also
	  called UFS Host Controller), because you will be asked for it.
	  The module will be called ufshcd.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/scsi/ufs.rst>.
	  However, do not compile this as a module if your root file system
	  (the one containing the directory /) is located on a UFS device.

config SCSI_UFSHCD_PCI
	tristate "PCI bus based UFS Controller support"
	depends on SCSI_UFSHCD && PCI
	help
	  This selects the PCI UFS Host Controller Interface. Select this if
	  you have UFS Host Controller with PCI Interface.

	  If you have a controller with this interface, say Y or M here.

	  If unsure, say N.

config SCSI_UFS_DWC_TC_PCI
	tristate "DesignWare pci support using a G210 Test Chip"
	depends on SCSI_UFSHCD_PCI
	help
	  Synopsys Test Chip is a PHY for prototyping purposes.

	  If unsure, say N.

config SCSI_UFSHCD_PLATFORM
	tristate "Platform bus based UFS Controller support"
	depends on SCSI_UFSHCD
	depends on HAS_IOMEM
	help
	  This selects the UFS host controller support. Select this if
	  you have an UFS controller on Platform bus.

	  If you have a controller with this interface, say Y or M here.

	  If unsure, say N.

config SCSI_UFS_CDNS_PLATFORM
	tristate "Cadence UFS Controller platform driver"
	depends on SCSI_UFSHCD_PLATFORM
	help
	  This selects the Cadence-specific additions to UFSHCD platform driver.

	  If unsure, say N.

config SCSI_UFS_DWC_TC_PLATFORM
	tristate "DesignWare platform support using a G210 Test Chip"
	depends on SCSI_UFSHCD_PLATFORM
	help
	  Synopsys Test Chip is a PHY for prototyping purposes.

	  If unsure, say N.

config SCSI_UFS_QCOM
	tristate "QCOM specific hooks to UFS controller platform driver"
	depends on SCSI_UFSHCD_PLATFORM && ARCH_QCOM
	select QCOM_SCM if SCSI_UFS_CRYPTO
	select RESET_CONTROLLER
	help
	  This selects the QCOM specific additions to UFSHCD platform driver.
	  UFS host on QCOM needs some vendor specific configuration before
	  accessing the hardware which includes PHY configuration and vendor
	  specific registers.

	  Select this if you have UFS controller on QCOM chipset.
	  If unsure, say N.

config SCSI_UFS_MEDIATEK
	tristate "Mediatek specific hooks to UFS controller platform driver"
	depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK
	select PHY_MTK_UFS
	select RESET_TI_SYSCON
	help
	  This selects the Mediatek specific additions to UFSHCD platform driver.
	  UFS host on Mediatek needs some vendor specific configuration before
	  accessing the hardware which includes PHY configuration and vendor
	  specific registers.

	  Select this if you have UFS controller on Mediatek chipset.

	  If unsure, say N.

config SCSI_UFS_HISI
	tristate "Hisilicon specific hooks to UFS controller platform driver"
	depends on (ARCH_HISI || COMPILE_TEST) && SCSI_UFSHCD_PLATFORM
	help
	  This selects the Hisilicon specific additions to UFSHCD platform driver.

	  Select this if you have UFS controller on Hisilicon chipset.
	  If unsure, say N.

config SCSI_UFS_TI_J721E
	tristate "TI glue layer for Cadence UFS Controller"
	depends on OF && HAS_IOMEM && (ARCH_K3 || COMPILE_TEST)
	help
	  This selects driver for TI glue layer for Cadence UFS Host
	  Controller IP.

	  Selects this if you have TI platform with UFS controller.
	  If unsure, say N.

config SCSI_UFS_BSG
	bool "Universal Flash Storage BSG device node"
	depends on SCSI_UFSHCD
	select BLK_DEV_BSGLIB
	help
	  Universal Flash Storage (UFS) is SCSI transport specification for
	  accessing flash storage on digital cameras, mobile phones and
	  consumer electronic devices.
	  A UFS controller communicates with a UFS device by exchanging
	  UFS Protocol Information Units (UPIUs).
	  UPIUs can not only be used as a transport layer for the SCSI protocol
	  but are also used by the UFS native command set.
	  This transport driver supports exchanging UFS protocol information units
	  with a UFS device. See also the ufshcd driver, which is a SCSI driver
	  that supports UFS devices.

	  Select this if you need a bsg device node for your UFS controller.
	  If unsure, say N.

config SCSI_UFS_EXYNOS
	tristate "Exynos specific hooks to UFS controller platform driver"
	depends on SCSI_UFSHCD_PLATFORM && (ARCH_EXYNOS || COMPILE_TEST)
	help
	  This selects the Samsung Exynos SoC specific additions to UFSHCD
	  platform driver.  UFS host on Samsung Exynos SoC includes HCI and
	  UNIPRO layer, and associates with UFS-PHY driver.

	  Select this if you have UFS host controller on Samsung Exynos SoC.
	  If unsure, say N.

config SCSI_UFS_CRYPTO
	bool "UFS Crypto Engine Support"
	depends on SCSI_UFSHCD && BLK_INLINE_ENCRYPTION
	help
	  Enable Crypto Engine Support in UFS.
	  Enabling this makes it possible for the kernel to use the crypto
	  capabilities of the UFS device (if present) to perform crypto
	  operations on data being transferred to/from the device.

config SCSI_UFS_HPB
	bool "Support UFS Host Performance Booster"
	depends on SCSI_UFSHCD
	help
	  The UFS HPB feature improves random read performance. It caches
	  L2P (logical to physical) map of UFS to host DRAM. The driver uses HPB
	  read command by piggybacking physical page number for bypassing FTL (flash
	  translation layer)'s L2P address translation.

config SCSI_UFS_FAULT_INJECTION
	bool "UFS Fault Injection Support"
	depends on SCSI_UFSHCD && FAULT_INJECTION
	help
	  Enable fault injection support in the UFS driver. This makes it easier
	  to test the UFS error handler and abort handler.

config SCSI_UFS_HWMON
	bool "UFS  Temperature Notification"
	depends on SCSI_UFSHCD=HWMON || HWMON=y
	help
	  This provides support for UFS hardware monitoring. If enabled,
	  a hardware monitoring device will be created for the UFS device.

	  If unsure, say N.
