#
# 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.

if SCSI_UFSHCD

config SCSI_UFSHCD_PCI
	tristate "PCI bus based UFS Controller support"
	depends on 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 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"
	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 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"
	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 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.

endif
