#
# YAFFS file system configurations
#

config YAFFS_FS
	tristate "YAFFS2 file system support"
	default n
	depends on MTD_BLOCK
	select YAFFS_YAFFS1
	select YAFFS_YAFFS2
	help
	  YAFFS2, or Yet Another Flash Filing System, is a filing system
	  optimised for NAND Flash chips.

	  To compile the YAFFS2 file system support as a module, choose M
	  here: the module will be called yaffs2.

	  If unsure, say N.

	  Further information on YAFFS2 is available at
	  <http://www.aleph1.co.uk/yaffs/>.

config YAFFS_YAFFS1
	bool "512 byte / page devices"
	depends on YAFFS_FS
	default y
	help
	  Enable YAFFS1 support -- yaffs for 512 byte / page devices

	  Not needed for 2K-page devices.

	  If unsure, say Y.

config YAFFS_9BYTE_TAGS
	bool "Use older-style on-NAND data format with pageStatus byte"
	depends on YAFFS_YAFFS1
	default n
	help

	  Older-style on-NAND data format has a "pageStatus" byte to record
	  chunk/page state.  This byte is zero when the page is discarded.
	  Choose this option if you have existing on-NAND data using this
	  format that you need to continue to support.  New data written
	  also uses the older-style format.  Note: Use of this option
	  generally requires that MTD's oob layout be adjusted to use the
	  older-style format.  See notes on tags formats and MTD versions
	  in yaffs_mtdif1.c.

	  If unsure, say N.

config YAFFS_DOES_ECC
	bool "Lets Yaffs do its own ECC"
	depends on YAFFS_FS && YAFFS_YAFFS1 && !YAFFS_9BYTE_TAGS
	default n
	help
	  This enables Yaffs to use its own ECC functions instead of using
	  the ones from the generic MTD-NAND driver.

	  If unsure, say N.

config YAFFS_ECC_WRONG_ORDER
	bool "Use the same ecc byte order as Steven Hill's nand_ecc.c"
	depends on YAFFS_FS && YAFFS_DOES_ECC && !YAFFS_9BYTE_TAGS
	default n
	help
	  This makes yaffs_ecc.c use the same ecc byte order as Steven
	  Hill's nand_ecc.c. If not set, then you get the same ecc byte
	  order as SmartMedia.

	  If unsure, say N.

config YAFFS_YAFFS2
	bool "2048 byte (or larger) / page devices"
	depends on YAFFS_FS
	default y
	help
	  Enable YAFFS2 support -- yaffs for >= 2K bytes per page devices

	  If unsure, say Y.

config YAFFS_AUTO_YAFFS2
	bool "Autoselect yaffs2 format"
	depends on YAFFS_YAFFS2
	default y
	help
	  Without this, you need to explicitely use yaffs2 as the file
	  system type. With this, you can say "yaffs" and yaffs or yaffs2
	  will be used depending on the device page size (yaffs on
	  512-byte page devices, yaffs2 on 2K page devices).

	  If unsure, say Y.

config YAFFS_DISABLE_TAGS_ECC
	bool "Disable YAFFS from doing ECC on tags by default"
	depends on YAFFS_FS && YAFFS_YAFFS2
	default n
	help
	  This defaults Yaffs to using its own ECC calculations on tags instead of
	  just relying on the MTD.
	  This behavior can also be overridden with tags_ecc_on and
	  tags_ecc_off mount options.

	  If unsure, say N.

config YAFFS_ALWAYS_CHECK_CHUNK_ERASED
	bool "Force chunk erase check"
	depends on YAFFS_FS
	default n
	help
          Normally YAFFS only checks chunks before writing until an erased
	  chunk is found. This helps to detect any partially written
	  chunks that might have happened due to power loss.

	  Enabling this forces on the test that chunks are erased in flash
	  before writing to them. This takes more time but is potentially
	  a bit more secure.

	  Suggest setting Y during development and ironing out driver
	  issues etc. Suggest setting to N if you want faster writing.

	  If unsure, say Y.

config YAFFS_EMPTY_LOST_AND_FOUND
	bool "Empty lost and found on boot"
	depends on YAFFS_FS
	default n
	help
	  If this is enabled then the contents of lost and found is
	  automatically dumped at mount.

	  If unsure, say N.

config YAFFS_DISABLE_BLOCK_REFRESHING
	bool "Disable yaffs2 block refreshing"
	depends on YAFFS_FS
	default n
	help
	 If this is set, then block refreshing is disabled.
	 Block refreshing infrequently refreshes the oldest block in
	 a yaffs2 file system. This mechanism helps to refresh flash to
	 mitigate against data loss. This is particularly useful for MLC.

	  If unsure, say N.

config YAFFS_DISABLE_BACKGROUND
	bool "Disable yaffs2 background processing"
	depends on YAFFS_FS
	default n
	help
	 If this is set, then background processing is disabled.
	 Background processing makes many foreground activities faster.

	 If unsure, say N.

config YAFFS_XATTR
	bool "Enable yaffs2 xattr support"
	depends on YAFFS_FS
	default y
	help
	 If this is set then yaffs2 will provide xattr support.
	 If unsure, say Y.
