as-linux.m4: update AS_LINUX_OVERRIDE_KERNEL_RELEASE()
[comedi.git] / m4 / as-linux.m4
index 5449fa2566ee427f9624220500060592a805a119..e0363a0917ff3398a9848579cb34779858e13b2b 100644 (file)
@@ -13,6 +13,7 @@ dnl AS_LINUX()
 dnl
 dnl this macro adds the options
 dnl --with-linuxdir        to specify a kernel build tree location
 dnl
 dnl this macro adds the options
 dnl --with-linuxdir        to specify a kernel build tree location
+dnl --with-linuxsrcdir     to specify a kernel source tree location
 dnl --with-linuxconfig     to specify a kernel .config file
 dnl --with-kernel-release  to specify an alternative uname -r
 dnl --with-machine         to specify an alternative uname -m
 dnl --with-linuxconfig     to specify a kernel .config file
 dnl --with-kernel-release  to specify an alternative uname -r
 dnl --with-machine         to specify an alternative uname -m
@@ -23,7 +24,9 @@ dnl --with-modulesdeveldir to specify the base install location of build stuff
 
 dnl this macro defines:
 dnl LINUX_DIR
 
 dnl this macro defines:
 dnl LINUX_DIR
-dnl   The directory where the Linux source resides.
+dnl   The directory where the Linux build tree resides.
+dnl LINUX_SRC_DIR
+dnl   The directory where the Linux source tree resides.
 dnl CONFIG_FILE
 dnl   The Linux config file
 dnl LINUX_ARCH
 dnl CONFIG_FILE
 dnl   The Linux config file
 dnl LINUX_ARCH
@@ -54,11 +57,11 @@ dnl LINUX_MODULE_EXT
 dnl   Module extension (.o or .ko)
 dnl LINUX_MODPOST
 dnl   path to modpost script
 dnl   Module extension (.o or .ko)
 dnl LINUX_MODPOST
 dnl   path to modpost script
-dnl modulesdir
+dnl MODULESDIR
 dnl   base install path for kernel modules
 dnl   base install path for kernel modules
-dnl modulesdeveldir
+dnl MODULESDEVELDIR
 dnl   base install path for kernel module development files
 dnl   base install path for kernel module development files
-dnl 
+dnl
 dnl End of search list.
 
 dnl main entry point
 dnl End of search list.
 
 dnl main entry point
@@ -68,32 +71,36 @@ AC_DEFUN([AS_LINUX],
        dnl check if user supplied a uname -r, and if not use the running one
        AS_LINUX_KERNEL_RELEASE()
        dnl check if user supplied a uname -m, and if not use the running one
        dnl check if user supplied a uname -r, and if not use the running one
        AS_LINUX_KERNEL_RELEASE()
        dnl check if user supplied a uname -m, and if not use the running one
-       AS_LINUX_MACHINE()       
+       AS_LINUX_MACHINE()
        dnl check if the user supplied an rpm target arch
        dnl override the LINUX_MACHINE value if he did
        dnl check if the user supplied an rpm target arch
        dnl override the LINUX_MACHINE value if he did
-       AS_LINUX_RPM_TARGET()    
-        
-       dnl find the kernel source tree for the given uname -r   
+       AS_LINUX_RPM_TARGET()
+
+       dnl find the kernel build tree for the given uname -r
        AS_LINUX_DIR()
        AS_LINUX_DIR()
+       dnl override kernel release uname -r value with info from build tree
+       AS_LINUX_OVERRIDE_KERNEL_RELEASE($LINUX_DIR)
+       dnl find the kernel source tree from the build tree or --with-linuxsrcdir
+       AS_LINUX_SRC_DIR($LINUX_DIR)
        dnl check if user supplied an EXTRAVERSION, and if not get from uname -r
        dnl check if user supplied an EXTRAVERSION, and if not get from uname -r
-       AS_LINUX_EXTRAVERSION($LINUX_KERNEL_RELEASE)     
+       AS_LINUX_EXTRAVERSION($LINUX_KERNEL_RELEASE)
        dnl check if user supplied a config file; if not, guess a good one
        dnl check if user supplied a config file; if not, guess a good one
-       AS_LINUX_CONFIG($LINUX_DIR, $LINUX_KERNEL_RELEASE, $LINUX_MACHINE)       
+       AS_LINUX_CONFIG($LINUX_DIR, $LINUX_KERNEL_RELEASE, $LINUX_MACHINE)
        dnl check if we're building on pre-FC2 Red Hat/Fedora,
        dnl check if we're building on pre-FC2 Red Hat/Fedora,
-       dnl and add some flags if we are         
-       AS_CHECK_REDHAT_PRE_FC2()        
+       dnl and add some flags if we are
+       AS_CHECK_REDHAT_PRE_FC2()
        dnl check for where to install modules
        AS_LINUX_MODULESDIR($LINUX_KERNEL_RELEASE)
        dnl check for where to install module development files
        AS_LINUX_MODULESDEVELDIR($LINUX_DIR)
        dnl check for where to install modules
        AS_LINUX_MODULESDIR($LINUX_KERNEL_RELEASE)
        dnl check for where to install module development files
        AS_LINUX_MODULESDEVELDIR($LINUX_DIR)
-       dnl check for the MAJOR/MINOR version of Linux   
+       dnl check for the MAJOR/MINOR version of Linux
        AS_LINUX_VERSION_MAJOR_MINOR($LINUX_DIR)
 
        dnl now call the correct macro to get compiler flags
        dnl the versioned AS_LINUX macros just use the global variables
        dnl this could be cleaned up later on if we feel like it
        case $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR in
        AS_LINUX_VERSION_MAJOR_MINOR($LINUX_DIR)
 
        dnl now call the correct macro to get compiler flags
        dnl the versioned AS_LINUX macros just use the global variables
        dnl this could be cleaned up later on if we feel like it
        case $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR in
-               2.6)
+               2.6 | 3.[[0-9]]*)
                        AS_LINUX_2_6()
                        ;;
                2.[[01234]])
                        AS_LINUX_2_6()
                        ;;
                2.[[01234]])
@@ -106,18 +113,18 @@ AC_DEFUN([AS_LINUX],
 ])
 
 
 ])
 
 
-dnl check if we can find a source dir for the Linux kernel
-dnl defines LINUX_DIR to the absolute location of a usable kernel source tree
+dnl check if we can find a build dir for the Linux kernel
+dnl defines LINUX_DIR to the absolute location of a usable kernel build tree
 AC_DEFUN([AS_LINUX_DIR],
 [
        AC_ARG_WITH([linuxdir],
                [AC_HELP_STRING([--with-linuxdir=DIR],
 AC_DEFUN([AS_LINUX_DIR],
 [
        AC_ARG_WITH([linuxdir],
                [AC_HELP_STRING([--with-linuxdir=DIR],
-                       [specify path to Linux source directory])],
+                       [specify path to Linux build directory])],
                [LINUX_DIR="${withval}"],
                [LINUX_DIR=default])
 
        if test "${LINUX_DIR}" != "default" ; then
                [LINUX_DIR="${withval}"],
                [LINUX_DIR=default])
 
        if test "${LINUX_DIR}" != "default" ; then
-               AS_TRY_LINUX_DIR([${LINUX_DIR}], , AC_MSG_ERROR([Linux dir not found]) )
+               AS_TRY_LINUX_DIR([${LINUX_DIR}], , AC_MSG_ERROR([Linux build dir not found]) )
        fi
 
        if test "${LINUX_DIR}" = "default" ; then
        fi
 
        if test "${LINUX_DIR}" = "default" ; then
@@ -134,15 +141,71 @@ AC_DEFUN([AS_LINUX_DIR],
        fi
 
        if test "${LINUX_DIR}" = "default" ; then
        fi
 
        if test "${LINUX_DIR}" = "default" ; then
-               AC_MSG_ERROR([Linux source directory not found])
+               AC_MSG_ERROR([Linux build directory not found])
        fi
 
        AC_SUBST(LINUX_DIR)
 ])
 
        fi
 
        AC_SUBST(LINUX_DIR)
 ])
 
-dnl check if the given candidate path for a linux source tree is usable
+dnl check if the given candidate path for a linux build tree is usable
 AC_DEFUN([AS_TRY_LINUX_DIR],
 AC_DEFUN([AS_TRY_LINUX_DIR],
-       [AC_MSG_CHECKING(for Linux in $1)
+       [AC_MSG_CHECKING(for Linux build in $1)
+
+       if test -f "$1/Makefile" ; then
+               result=yes
+               $2
+       else
+               result="not found"
+               $3
+       fi
+
+       AC_MSG_RESULT($result)
+])
+
+dnl get the kernel source directory
+dnl $1 is the kernel build directory
+dnl defines LINUX_SRC_DIR to the absolute location of kernel source tree
+AC_DEFUN([AS_LINUX_SRC_DIR],
+[
+       AC_ARG_WITH([linuxsrcdir],
+               [AC_HELP_STRING([--with-linuxsrcdir=DIR],
+                       [specify path to Linux source directory])],
+               [LINUX_SRC_DIR="${withval}"],
+               [LINUX_SRC_DIR=default])
+
+       if test "${LINUX_SRC_DIR}" != "default" ; then
+               AS_TRY_LINUX_SRC_DIR([${LINUX_SRC_DIR}], , AC_MSG_ERROR([Linux source dir not found]) )
+       fi
+
+       if test "${LINUX_SRC_DIR}" = "default" ; then
+               AC_MSG_CHECKING(for separate Linux source and build directory)
+               dir=`sed -n -e 's/^KERNELSRC *:= *\(.*\)/\1/p' "$1/Makefile"`
+               if test -z "$dir"; then
+                       # 2.6.25
+                       dir=`sed -n -e 's/^MAKEARGS *:= *-C *\([[^[:space:]]]*\).*/\1/p' "$1/Makefile"`
+               fi
+               if test -z "$dir"; then
+                       AC_MSG_RESULT([no])
+                       LINUX_SRC_DIR="$1"
+               else
+                       AC_MSG_RESULT([yes])
+                       case "$dir" in
+                       .*) dir="$1/$dir" ;;
+                       esac
+                       AS_TRY_LINUX_SRC_DIR([${dir}], [LINUX_SRC_DIR=${dir}], )
+               fi
+       fi
+
+       if test "${LINUX_SRC_DIR}" = "default" ; then
+               AC_MSG_ERROR([Linux source directory not found])
+       fi
+
+       AC_SUBST(LINUX_SRC_DIR)
+])
+
+dnl check if the given candidate path for a linux source tree is usable
+AC_DEFUN([AS_TRY_LINUX_SRC_DIR],
+       [AC_MSG_CHECKING(for Linux source in $1)
 
        if test -f "$1/Makefile" ; then
                result=yes
 
        if test -f "$1/Makefile" ; then
                result=yes
@@ -172,8 +235,33 @@ AC_DEFUN([AS_LINUX_KERNEL_RELEASE],
         AC_MSG_NOTICE([Using $LINUX_KERNEL_RELEASE as the uname -r value])
 ])
 
         AC_MSG_NOTICE([Using $LINUX_KERNEL_RELEASE as the uname -r value])
 ])
 
+dnl replaces LINUX_KERNEL_RELEASE once the Linux build directory is known
+dnl first argument is the Linux build directory
+AC_DEFUN([AS_LINUX_OVERRIDE_KERNEL_RELEASE],
+[
+       INCDIR="$1/include"
+       UTSINC="${INCDIR}/generated/utsrelease.h"
+       if ! test -f "${UTSINC}"; then
+               UTSINC="${INCDIR}/linux/utsrelease.h"
+       fi
+       if ! test -f "${UTSINC}"; then
+               UTSINC="${INCDIR}/linux/version.h"
+       fi
+       if test -f "${UTSINC}"; then
+               RELEASE=`echo UTS_RELEASE | cat "${UTSINC}" - |
+                       /lib/cpp -I "${INCDIR}" | tail -n 1 |
+                       sed 's/^"\(.*\)"$/\1/'`
+               if test "${RELEASE}" != "UTS_RELEASE" -a "${RELEASE}" != "" \
+                       -a "${RELEASE}" != "${LINUX_KERNEL_RELEASE}"; then
+                       AC_MSG_NOTICE([Overriding uname -r value with ${RELEASE}])
+                       LINUX_KERNEL_RELEASE="${RELEASE}"
+               fi
+
+       fi
+])
+
 dnl allow for specifying a machine (uname -m) to build for
 dnl allow for specifying a machine (uname -m) to build for
-dnl use uname -, of running one if not specified
+dnl use uname -m, of running one if not specified
 dnl store result in LINUX_MACHINE
 AC_DEFUN([AS_LINUX_MACHINE],
 [
 dnl store result in LINUX_MACHINE
 AC_DEFUN([AS_LINUX_MACHINE],
 [
@@ -184,7 +272,7 @@ AC_DEFUN([AS_LINUX_MACHINE],
                [LINUX_MACHINE=`uname -m`])
         if test "x$LINUX_MACHINE" = "xyes";
         then
                [LINUX_MACHINE=`uname -m`])
         if test "x$LINUX_MACHINE" = "xyes";
         then
-               LINUX_MACHINE=`uname -r`
+               LINUX_MACHINE=`uname -m`
         fi
         AC_MSG_NOTICE([Using $LINUX_MACHINE as the uname -m value])
 ])
         fi
         AC_MSG_NOTICE([Using $LINUX_MACHINE as the uname -m value])
 ])
@@ -210,23 +298,13 @@ AC_DEFUN([AS_LINUX_RPM_TARGET],
        then
                dnl if we have rpm, try to guess the target of the kernel
                dnl we want to build for using rpm
        then
                dnl if we have rpm, try to guess the target of the kernel
                dnl we want to build for using rpm
-               AC_PATH_PROG(RPM, rpm, yes, no)
+               AC_PATH_PROG([RPM], [rpm], [no])
                if test "x$RPM" != "xno" ; then
                if test "x$RPM" != "xno" ; then
-                       AC_MSG_CHECKING([if rpm can be used to query packages])
-                       if rpm -qa >/dev/null 2>/dev/null ; then
-                         rpm_check=yes
+                       if $RPM -q kernel-$RELEASE > /dev/null
+                       then
+                         LINUX_RPM_TARGET=`$RPM -q --queryformat %{arch} kernel-$RELEASE`
                        else
                        else
-                         rpm_check=no
-                       fi
-                       AC_MSG_RESULT($rpm_check)
-
-                       if test "x$rpm_check" = yes ; then
-                         if rpm -q kernel-$RELEASE > /dev/null
-                         then
-                           LINUX_RPM_TARGET=`rpm -q --queryformat %{arch} kernel-$RELEASE`
-                         else
-                           AC_MSG_NOTICE([Cannot guess target arch, consider setting it using --with-rpm-target])
-                         fi
+                         AC_MSG_NOTICE([Cannot guess target arch, consider setting it using --with-rpm-target])
                        fi
                fi
        fi
                        fi
                fi
        fi
@@ -363,10 +441,10 @@ AC_DEFUN([AS_CHECK_REDHAT_PRE_FC2],
         HAVE_REDHAT_KERNEL=false
         ac_save_CFLAGS="$CFLAGS"
         CFLAGS="$CFLAGS -I${LINUX_DIR}/include/linux"
         HAVE_REDHAT_KERNEL=false
         ac_save_CFLAGS="$CFLAGS"
         CFLAGS="$CFLAGS -I${LINUX_DIR}/include/linux"
-        AC_COMPILE_IFELSE(AC_LANG_PROGRAM([
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #include "rhconfig.h"
 int code = RED_HAT_LINUX_KERNEL;
 #include "rhconfig.h"
 int code = RED_HAT_LINUX_KERNEL;
-       ]),
+       ]])],
         AC_MSG_RESULT(found); HAVE_REDHAT_KERNEL=true,
         AC_MSG_RESULT(not found))
        dnl restore CFLAGS
         AC_MSG_RESULT(found); HAVE_REDHAT_KERNEL=true,
         AC_MSG_RESULT(not found))
        dnl restore CFLAGS
@@ -381,7 +459,7 @@ int code = RED_HAT_LINUX_KERNEL;
        BIGMEM='0'
        HUGEMEM='0'
 
        BIGMEM='0'
        HUGEMEM='0'
 
-       dnl get variables from the currently running kernel as default 
+       dnl get variables from the currently running kernel as default
        KERNEL_TYPE=`uname -r | sed 's_^.*\(smp\|enterprise\|bigmem\|hugemem\)$_\1_;t;s_.*__;'`
        KERNEL_RELEASE=`uname -r | sed 's|smp\|enterprise\|bigmem\|hugemem||g'`
        KERNEL_ARCH=`uname -m`
        KERNEL_TYPE=`uname -r | sed 's_^.*\(smp\|enterprise\|bigmem\|hugemem\)$_\1_;t;s_.*__;'`
        KERNEL_RELEASE=`uname -r | sed 's|smp\|enterprise\|bigmem\|hugemem||g'`
        KERNEL_ARCH=`uname -m`
@@ -498,6 +576,7 @@ flags:
        echo LINUX_CC=\"\$(CC)\" >>\$(obj)/flags
        echo LINUX_LD=\"\$(LD) \$(LDFLAGS) \$(LDFLAGS_MODULE)\" >>\$(obj)/flags
        echo LINUX_AS=\"\$(AS)\" >>\$(obj)/flags
        echo LINUX_CC=\"\$(CC)\" >>\$(obj)/flags
        echo LINUX_LD=\"\$(LD) \$(LDFLAGS) \$(LDFLAGS_MODULE)\" >>\$(obj)/flags
        echo LINUX_AS=\"\$(AS)\" >>\$(obj)/flags
+       echo LINUX_MODLIB=\"\$(MODLIB)\" >>\$(obj)/flags
 EOF
 
        echo ${MAKE-make} -C ${LINUX_DIR} V=1 SUBDIRS=${tmpdir} LINUXDIR=${LINUX_DIR} modules >&5 2>&5
 EOF
 
        echo ${MAKE-make} -C ${LINUX_DIR} V=1 SUBDIRS=${tmpdir} LINUXDIR=${LINUX_DIR} modules >&5 2>&5
@@ -523,9 +602,10 @@ EOF
        AC_SUBST(LINUX_MODULE_EXT)
        AC_SUBST(LINUX_MODULE_STYLE)
        AC_SUBST(LINUX_MODPOST)
        AC_SUBST(LINUX_MODULE_EXT)
        AC_SUBST(LINUX_MODULE_STYLE)
        AC_SUBST(LINUX_MODPOST)
+       AC_SUBST(LINUX_MODLIB)
 
        AC_MSG_RESULT([$LINUX_CFLAGS])
 
        AC_MSG_RESULT([$LINUX_CFLAGS])
-       
+
        AC_PATH_PROG([LINUX_MODPOST], ["modpost"], ["no"], ["$LINUX_DIR/scripts:$LINUX_DIR/scripts/mod"])
 ])
 
        AC_PATH_PROG([LINUX_MODPOST], ["modpost"], ["no"], ["$LINUX_DIR/scripts:$LINUX_DIR/scripts/mod"])
 ])
 
@@ -678,8 +758,197 @@ AC_DEFUN([AS_LINUX_VERSION_MAJOR_MINOR],
 # Check if kernel source tree is recent enough to support "Kbuild" files.
 AC_DEFUN([COMEDI_CHECK_LINUX_KBUILD],
 [
 # Check if kernel source tree is recent enough to support "Kbuild" files.
 AC_DEFUN([COMEDI_CHECK_LINUX_KBUILD],
 [
-       AC_MSG_CHECKING([for Kbuild in $1])
-       if test -a $1/Kbuild; then
+       AC_MSG_CHECKING([for Kbuild support in $1])
+       dnl If $1/scripts/Makefile.build refers to $(<something>)/Kbuild
+       dnl then we support Kbuild (2.6.10 onwards).
+       if grep -q '/Kbuild' "$1/scripts/Makefile.build" 2>/dev/null; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_PCMCIA_PROBE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have a probe member in the pcmcia_driver
+# struct.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_DRIVER_PROBE],
+[
+       AC_REQUIRE([AC_PROG_EGREP])
+       AC_MSG_CHECKING([$1 for probe in pcmcia_driver struct])
+       cat "$1/include/pcmcia/ds.h" | tr \\n ' ' | [$EGREP "struct[[:space:]]+pcmcia_driver[[:space:]]*[{][^}]*probe"] > /dev/null
+       if (($?)); then
+               AC_MSG_RESULT([no])
+               $3
+       else
+               AC_MSG_RESULT([yes])
+               $2
+       fi
+])
+
+# COMEDI_CHECK_PCMCIA_DRIVER_NAME([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have a name member in the pcmcia_driver
+# struct.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_DRIVER_NAME],
+[
+       AC_REQUIRE([AC_PROG_EGREP])
+       AC_MSG_CHECKING([$1 for name in pcmcia_driver struct])
+       cat "$1/include/pcmcia/ds.h" | tr \\n ' ' | [$EGREP "struct[[:space:]]+pcmcia_driver[[:space:]]*[{][^}]*name"] > /dev/null
+       if (($?)); then
+               AC_MSG_RESULT([no])
+               $3
+       else
+               AC_MSG_RESULT([yes])
+               $2
+       fi
+])
+
+# COMEDI_CHECK_PCMCIA_LOOP_TUPLE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have the pcmcia_loop_tuple
+# function.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_LOOP_TUPLE],
+[
+       AC_MSG_CHECKING([$1 for pcmcia_loop_tuple function])
+       if [grep -q 'int[[:space:]]\+pcmcia_loop_tuple[[:space:]]*(' "$1/include/pcmcia/ds.h"] 2>/dev/null ; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_DS_DEV_NODE_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the dev_node_t type
+# in pcmcia/ds.h.
+AC_DEFUN([COMEDI_CHECK_DS_DEV_NODE_T],
+[
+       AC_MSG_CHECKING([$1 for dev_node_t in pcmcia/ds.h (removed in 2.6.35)])
+       if [grep -q dev_node_t "$1/include/pcmcia/ds.h"] 2>/dev/null ; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_CS_IRQ_REQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the irq_req_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_IRQ_REQ_T],
+[
+       AC_MSG_CHECKING([$1 for irq_req_t in pcmcia/cs.h (removed in 2.6.35)])
+       if [grep -q irq_req_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_CS_IO_REQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the io_req_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_IO_REQ_T],
+[
+       AC_MSG_CHECKING([$1 for io_req_t in pcmcia/cs.h (removed in 2.6.36)])
+       if [grep -q io_req_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_CS_MEMREQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the memreq_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_MEMREQ_T],
+[
+       AC_MSG_CHECKING([$1 for memreq_t in pcmcia/cs.h (removed in 2.6.36)])
+       if [grep -q memreq_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_HAVE_CS_TYPES_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <pcmcia/cs_types.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_CS_TYPES_H],
+[
+       AC_MSG_CHECKING([$1 for include/pcmcia/cs_types.h (removed in 2.6.36)])
+       if test -f "$1/include/pcmcia/cs_types.h"; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_HAVE_CS_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <pcmcia/cs.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_CS_H],
+[
+       AC_MSG_CHECKING([$1 for include/pcmcia/cs.h (removed in 2.6.37)])
+       if test -f "$1/include/pcmcia/cs.h"; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_HAVE_MUTEX_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <linux/mutex.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_MUTEX_H],
+[
+       AC_MSG_CHECKING([$1 for include/linux/mutex.h])
+       if test -f "$1/include/linux/mutex.h"; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_HAVE_LINUX_SEMAPHORE_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <linux/semaphore.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_LINUX_SEMAPHORE_H],
+[
+       AC_MSG_CHECKING([$1 for include/linux/semaphore.h])
+       if test -f "$1/include/linux/semaphore.h"; then
                AC_MSG_RESULT([yes])
                $2
        else
                AC_MSG_RESULT([yes])
                $2
        else
@@ -687,3 +956,41 @@ AC_DEFUN([COMEDI_CHECK_LINUX_KBUILD],
                $3
        fi
 ])
                $3
        fi
 ])
+
+# COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# -------------------------------------------------------------
+# Check if kernel is new enough to have generic 'bool' type in <linux/types.h>
+# and 'false' and 'true' enum constants in <linux/stddef.h>.  This was added
+# in vanilla 2.6.19, but backported to RHEL5 2.6.18.
+AC_DEFUN([COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE],
+[
+       AC_MSG_CHECKING([$1 for 'bool' in include/linux/types.h])
+       if grep -q 'bool;' "$1/include/linux/types.h" 2>/dev/null; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])
+
+# COMEDI_CHECK_REQUEST_FIRMWARE_NOWAIT_HAS_GFP([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# -------------------------------------------------------------
+# Check if the kernel's request_firmware_nowait() function has the gfp
+# parameter.  This was added in vanilla 2.6.33 but Red Hat backported it
+# to their 2.6.32 kernel.
+AC_DEFUN([COMEDI_CHECK_REQUEST_FIRMWARE_NOWAIT_HAS_GFP],
+[
+       AC_REQUIRE([AC_PROG_EGREP])
+       AC_MSG_CHECKING([$1 for gfp parameter in request_firmware_nowait()])
+       $EGREP -q gfp_t "$1/include/linux/firmware.h"
+       if (($?)); then
+               AC_MSG_RESULT([no])
+               $3
+       else
+               AC_MSG_RESULT([yes])
+               $2
+       fi
+])