config ARCH_HAS_CRC_T10DIF
        bool
 
-choice
-       prompt "CRC-T10DIF implementation"
-       depends on CRC_T10DIF
-       default CRC_T10DIF_IMPL_ARCH if ARCH_HAS_CRC_T10DIF
-       default CRC_T10DIF_IMPL_GENERIC if !ARCH_HAS_CRC_T10DIF
-       help
-         This option allows you to override the default choice of CRC-T10DIF
-         implementation.
-
-config CRC_T10DIF_IMPL_ARCH
-       bool "Architecture-optimized" if ARCH_HAS_CRC_T10DIF
-       help
-         Use the optimized implementation of CRC-T10DIF for the selected
-         architecture.  It is recommended to keep this enabled, as it can
-         greatly improve CRC-T10DIF performance.
-
-config CRC_T10DIF_IMPL_GENERIC
-       bool "Generic implementation"
-       help
-         Use the generic table-based implementation of CRC-T10DIF.  Selecting
-         this will reduce code size slightly but can greatly reduce CRC-T10DIF
-         performance.
-
-endchoice
-
 config CRC_T10DIF_ARCH
        tristate
-       default CRC_T10DIF if CRC_T10DIF_IMPL_ARCH
+       default CRC_T10DIF if ARCH_HAS_CRC_T10DIF && CRC_OPTIMIZATIONS
 
 config CRC64_ROCKSOFT
        tristate "CRC calculation for the Rocksoft model CRC64"
        tristate "CRC32/CRC32c functions"
        default y
        select BITREVERSE
+       select CRC32_SARWATE
        help
          This option is provided for the case where no in-kernel-tree
          modules require CRC32/CRC32c functions, but a module built outside
 config ARCH_HAS_CRC32
        bool
 
-choice
-       prompt "CRC32 implementation"
-       depends on CRC32
-       default CRC32_IMPL_ARCH_PLUS_SLICEBY8 if ARCH_HAS_CRC32
-       default CRC32_IMPL_SLICEBY8 if !ARCH_HAS_CRC32
-       help
-         This option allows you to override the default choice of CRC32
-         implementation.  Choose the default unless you know that you need one
-         of the others.
-
-config CRC32_IMPL_ARCH_PLUS_SLICEBY8
-       bool "Arch-optimized, with fallback to slice-by-8" if ARCH_HAS_CRC32
-       help
-         Use architecture-optimized implementation of CRC32.  Fall back to
-         slice-by-8 in cases where the arch-optimized implementation cannot be
-         used, e.g. if the CPU lacks support for the needed instructions.
-
-         This is the default when an arch-optimized implementation exists.
-
-config CRC32_IMPL_ARCH_PLUS_SLICEBY1
-       bool "Arch-optimized, with fallback to slice-by-1" if ARCH_HAS_CRC32
-       help
-         Use architecture-optimized implementation of CRC32, but fall back to
-         slice-by-1 instead of slice-by-8 in order to reduce the binary size.
-
-config CRC32_IMPL_SLICEBY8
-       bool "Slice by 8 bytes"
-       help
-         Calculate checksum 8 bytes at a time with a clever slicing algorithm.
-         This is much slower than the architecture-optimized implementation of
-         CRC32 (if the selected arch has one), but it is portable and is the
-         fastest implementation when no arch-optimized implementation is
-         available.  It uses an 8KiB lookup table.  Most modern processors have
-         enough cache to hold this table without thrashing the cache.
-
-config CRC32_IMPL_SLICEBY4
-       bool "Slice by 4 bytes"
-       help
-         Calculate checksum 4 bytes at a time with a clever slicing algorithm.
-         This is a bit slower than slice by 8, but has a smaller 4KiB lookup
-         table.
-
-         Only choose this option if you know what you are doing.
-
-config CRC32_IMPL_SLICEBY1
-       bool "Slice by 1 byte (Sarwate's algorithm)"
-       help
-         Calculate checksum a byte at a time using Sarwate's algorithm.  This
-         is not particularly fast, but has a small 1KiB lookup table.
-
-         Only choose this option if you know what you are doing.
-
-config CRC32_IMPL_BIT
-       bool "Classic Algorithm (one bit at a time)"
-       help
-         Calculate checksum one bit at a time.  This is VERY slow, but has
-         no lookup table.  This is provided as a debugging option.
-
-         Only choose this option if you are debugging crc32.
-
-endchoice
-
 config CRC32_ARCH
        tristate
-       default CRC32 if CRC32_IMPL_ARCH_PLUS_SLICEBY8 || CRC32_IMPL_ARCH_PLUS_SLICEBY1
-
-config CRC32_SLICEBY8
-       bool
-       default y if CRC32_IMPL_SLICEBY8 || CRC32_IMPL_ARCH_PLUS_SLICEBY8
-
-config CRC32_SLICEBY4
-       bool
-       default y if CRC32_IMPL_SLICEBY4
+       default CRC32 if ARCH_HAS_CRC32 && CRC_OPTIMIZATIONS
 
 config CRC32_SARWATE
        bool
-       default y if CRC32_IMPL_SLICEBY1 || CRC32_IMPL_ARCH_PLUS_SLICEBY1
-
-config CRC32_BIT
-       bool
-       default y if CRC32_IMPL_BIT
 
 config CRC64
        tristate "CRC64 functions"
          when they need to do cyclic redundancy check according CRC8
          algorithm. Module will be called crc8.
 
+config CRC_OPTIMIZATIONS
+       bool "Enable optimized CRC implementations" if EXPERT
+       default y
+       help
+         Disabling this option reduces code size slightly by disabling the
+         architecture-optimized implementations of any CRC variants that are
+         enabled.  CRC checksumming performance may get much slower.
+
+         Keep this enabled unless you're really trying to minimize the size of
+         the kernel.
+
 config XXHASH
        tristate