# SPDX-License-Identifier: GPL-2.0
#
# USB Storage driver configuration
#

comment "NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may"
comment "also be needed; see USB_STORAGE Help for more info"

config USB_STORAGE
	tristate "USB Mass Storage support"
	depends on SCSI
	help
	  Say Y here if you want to connect USB mass storage devices to your
	  computer's USB port. This is the driver you need for USB
	  floppy drives, USB hard disks, USB tape drives, USB CD-ROMs,
	  USB flash devices, and memory sticks, along with
	  similar devices. This driver may also be used for some cameras
	  and card readers.

	  This option depends on 'SCSI' support being enabled, but you
	  probably also need 'SCSI device support: SCSI disk support'
	  (BLK_DEV_SD) for most USB storage devices.

	  To compile this driver as a module, choose M here: the
	  module will be called usb-storage.

if USB_STORAGE

config USB_STORAGE_DEBUG
	bool "USB Mass Storage verbose debug"
	help
	  Say Y here in order to have the USB Mass Storage code generate
	  verbose debugging messages.

config USB_STORAGE_REALTEK
	tristate "Realtek Card Reader support"
	help
	  Say Y here to include additional code to support the power-saving function
	  for Realtek RTS51xx USB card readers.

	  If this driver is compiled as a module, it will be named ums-realtek.

config REALTEK_AUTOPM
	bool "Realtek Card Reader autosuspend support"
	depends on USB_STORAGE_REALTEK && PM
	default y

config USB_STORAGE_DATAFAB
	tristate "Datafab Compact Flash Reader support"
	help
	  Support for certain Datafab CompactFlash readers.
	  Datafab has a web page at <http://www.datafab.com/>.

	  If this driver is compiled as a module, it will be named ums-datafab.

config USB_STORAGE_FREECOM
	tristate "Freecom USB/ATAPI Bridge support"
	help
	  Support for the Freecom USB to IDE/ATAPI adaptor.
	  Freecom has a web page at <https://www.freecom.de/>.

	  If this driver is compiled as a module, it will be named ums-freecom.

config USB_STORAGE_ISD200
	tristate "ISD-200 USB/ATA Bridge support"
	help
	  Say Y here if you want to use USB Mass Store devices based
	  on the In-Systems Design ISD-200 USB/ATA bridge.

	  Some of the products that use this chip are:

	  - Archos Jukebox 6000
	  - ISD SmartCable for Storage
	  - Taiwan Skymaster CD530U/DEL-0241 IDE bridge
	  - Sony CRX10U CD-R/RW drive
	  - CyQ've CQ8060A CDRW drive
	  - Planex eXtreme Drive RX-25HU USB-IDE cable (not model RX-25U)

	  If this driver is compiled as a module, it will be named ums-isd200.

config USB_STORAGE_USBAT
	tristate "USBAT/USBAT02-based storage support"
	help
	  Say Y here to include additional code to support storage devices
	  based on the SCM/Shuttle USBAT/USBAT02 processors.

	  Devices reported to work with this driver include:
	  - CompactFlash reader included with Kodak DC3800 camera
	  - Dane-Elec Zmate CompactFlash reader
	  - Delkin Efilm reader2
	  - HP 8200e/8210e/8230e CD-Writer Plus drives
	  - I-JAM JS-50U
	  - Jessops CompactFlash JESDCFRU BLACK
	  - Kingston Technology PCREAD-USB/CF
	  - Maxell UA4 CompactFlash reader
	  - Memorex UCF-100
	  - Microtech ZiO! ICS-45 CF2
	  - RCA LYRA MP3 portable
	  - Sandisk ImageMate SDDR-05b

	  If this driver is compiled as a module, it will be named ums-usbat.

config USB_STORAGE_SDDR09
	tristate "SanDisk SDDR-09 (and other SmartMedia, including DPCM) support"
	help
	  Say Y here to include additional code to support the Sandisk SDDR-09
	  SmartMedia reader in the USB Mass Storage driver.
	  Also works for the Microtech Zio! CompactFlash/SmartMedia reader.

	  If this driver is compiled as a module, it will be named ums-sddr09.

config USB_STORAGE_SDDR55
	tristate "SanDisk SDDR-55 SmartMedia support"
	help
	  Say Y here to include additional code to support the Sandisk SDDR-55
	  SmartMedia reader in the USB Mass Storage driver.

	  If this driver is compiled as a module, it will be named ums-sddr55.

config USB_STORAGE_JUMPSHOT
	tristate "Lexar Jumpshot Compact Flash Reader"
	help
	  Say Y here to include additional code to support the Lexar Jumpshot
	  USB CompactFlash reader.

	  If this driver is compiled as a module, it will be named ums-jumpshot.

config USB_STORAGE_ALAUDA
	tristate "Olympus MAUSB-10/Fuji DPC-R1 support"
	help
	  Say Y here to include additional code to support the Olympus MAUSB-10
	  and Fujifilm DPC-R1 USB Card reader/writer devices.

	  These devices are based on the Alauda chip and support both
	  XD and SmartMedia cards.

	  If this driver is compiled as a module, it will be named ums-alauda.

config USB_STORAGE_ONETOUCH
	tristate "Support OneTouch Button on Maxtor Hard Drives"
	depends on INPUT=y || INPUT=USB_STORAGE
	help
	  Say Y here to include additional code to support the Maxtor OneTouch
	  USB hard drive's onetouch button.

	  This code registers the button on the front of Maxtor OneTouch USB
	  hard drive's as an input device. An action can be associated with
	  this input in any keybinding software. (e.g. gnome's keyboard short-
	  cuts)

	  If this driver is compiled as a module, it will be named ums-onetouch.

config USB_STORAGE_KARMA
	tristate "Support for Rio Karma music player"
	help
	  Say Y here to include additional code to support the Rio Karma
	  USB interface.

	  This code places the Rio Karma into mass storage mode, enabling
	  it to be mounted as an ordinary filesystem. Performing an eject
	  on the resulting scsi device node returns the Karma to normal
	  operation.

	  If this driver is compiled as a module, it will be named ums-karma.

config USB_STORAGE_CYPRESS_ATACB
	tristate "SAT emulation on Cypress USB/ATA Bridge with ATACB"
	help
	  Say Y here if you want to use SAT (ata pass through) on devices based
	  on the Cypress USB/ATA bridge supporting ATACB. This will allow you
	  to use tools to tune and monitor your drive (like hdparm or smartctl).

	  If you say no here your device will still work with the standard usb
	  mass storage class.

	  If this driver is compiled as a module, it will be named ums-cypress.

config USB_STORAGE_ENE_UB6250
	tristate "USB ENE card reader support"
	help
	  Say Y here if you wish to control a ENE SD/MS Card reader.
	  Note that this driver does not support SM cards.

	  To compile this driver as a module, choose M here: the
	  module will be called ums-eneub6250.

endif # USB_STORAGE

config USB_UAS
	tristate "USB Attached SCSI"
	depends on SCSI && USB_STORAGE
	help
	  The USB Attached SCSI protocol is supported by some USB
	  storage devices.  It permits higher performance by supporting
	  multiple outstanding commands.

	  If you don't know whether you have a UAS device, it is safe to
	  say 'Y' or 'M' here and the kernel will use the right driver.

	  If you compile this driver as a module, it will be named uas.
