# Choose the kernel headers to use for kernel-headers target. This is
# ignored if you are building your own kernel or using the system kernel.
#

comment "Kernel Header Options"

choice
	prompt "Kernel Headers"
	default BR2_KERNEL_HEADERS_2_6_28

	help
	  Select the version of kernel header files you wish to use.
	  You must select the correct set of header files to match
	  the kernel you intend to use on your target system.

	  For the snapshot, you have to provide the
	  linux-2.6.tar.bz2 tarball in your download dir.

	config BR2_KERNEL_HEADERS_2_4_31
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.4.31 kernel headers"

	config BR2_KERNEL_HEADERS_2_6_20_4
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.20.4 kernel headers"

	config BR2_KERNEL_HEADERS_2_6_20
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.20.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_21_5
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.21.5 kernel headers"

	config BR2_KERNEL_HEADERS_2_6_21
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.21.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_22_1
		depends on !BR2_avr32 && !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.22.1 kernel headers"

	config BR2_KERNEL_HEADERS_2_6_22_10
		depends on !BR2_nios2 && BR2_DEPRECATED
		bool "Linux 2.6.22.10 kernel headers"

	config BR2_KERNEL_HEADERS_2_6_22
		depends on BR2_DEPRECATED
		bool "Linux 2.6.22.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_23
		depends on BR2_DEPRECATED
		bool "Linux 2.6.23.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_24
		depends on BR2_DEPRECATED
		bool "Linux 2.6.24.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_25
		depends on BR2_DEPRECATED
		bool "Linux 2.6.25.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_26
		depends on BR2_DEPRECATED
		bool "Linux 2.6.26.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_27
		depends on BR2_DEPRECATED || BR2_RECENT
		bool "Linux 2.6.27.x kernel headers"

	config BR2_KERNEL_HEADERS_2_6_28
		bool "Linux 2.6.28.x kernel headers"

	config BR2_KERNEL_HEADERS_SNAP
		bool "Linux 2.6 snapshot"

endchoice

config BR2_KERNEL_HEADERS_IPMI
	bool "use ipmi kernel patches"
	depends on BR2_KERNEL_HEADERS_2_6_20_4 || BR2_KERNEL_HEADERS_2_6_21_5 || BR2_KERNEL_HEADERS_2_6_22_1
	help
	  Apply patches which add IPMI sensor support.

config BR2_KERNEL_HEADERS_LZMA
	bool "use lzma initramfs kernel patches"
	depends on BR2_KERNEL_HEADERS_2_6_21_5 || BR2_KERNEL_HEADERS_2_6_22_1
	help
	  Apply patches which allow for lzma compressed
	  initramfs filesystems.  This requires the lzma
	  program in your development environment.

config BR2_KERNEL_HEADERS_RT
	bool "use realtime (-rt) kernel patches"
	depends on BR2_KERNEL_HEADERS_2_6_21_5 || BR2_KERNEL_HEADERS_2_6_22_1
	help
	  Apply Ingo's realtime extensions to linux

config BR2_KERNEL_HEADERS_PATCH_DIR
	bool "Add additional headers from $(KERNEL_HEADERS_PATCH_DIR)"
	depends on BR2_KERNEL_HEADERS_2_6_20_4 || BR2_KERNEL_HEADERS_2_6_21_5 || BR2_KERNEL_HEADERS_2_6_22_1  || BR2_KERNEL_HEADERS_2_6_22_10 || BR2_KERNEL_HEADERS_2_6_28
	help
	  Apply additional kernel patches defined by KERNEL_HEADERS_PATCH_DIR
	  in your board directory.

config BR2_DEFAULT_KERNEL_HEADERS
	string
	default "2.4.31"	if BR2_KERNEL_HEADERS_2_4_31
	default "2.6.20.4"	if BR2_KERNEL_HEADERS_2_6_20_4
	default "2.6.20.20"	if BR2_KERNEL_HEADERS_2_6_20
	default "2.6.21.5"	if BR2_KERNEL_HEADERS_2_6_21_5
	default "2.6.21.7"	if BR2_KERNEL_HEADERS_2_6_21
	default "2.6.22.1"	if BR2_KERNEL_HEADERS_2_6_22_1
	default "2.6.22.10"	if BR2_KERNEL_HEADERS_2_6_22_10
	default "2.6.22.10"	if BR2_KERNEL_HEADERS_2_6_22
	default "2.6.23"	if BR2_KERNEL_HEADERS_2_6_23
	default "2.6.24.7"	if BR2_KERNEL_HEADERS_2_6_24
	default "2.6.25.19"	if BR2_KERNEL_HEADERS_2_6_25
	default "2.6.26.8"	if BR2_KERNEL_HEADERS_2_6_26
	default "2.6.27.15"	if BR2_KERNEL_HEADERS_2_6_27
	default "2.6.28.4"	if BR2_KERNEL_HEADERS_2_6_28
	default "2.6"		if BR2_KERNEL_HEADERS_SNAP

