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

comment "NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may 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.
