To compile this driver as a module, choose M here: the
          module will be called psmouse.
 
+config MOUSE_PS2_ALPS
+       bool "ALPS PS/2 mouse protocol extension" if EMBEDDED
+       default y
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have an ALPS PS/2 touchpad connected to
+         your system.
+
+         If unsure, say Y.
+
+config MOUSE_PS2_LOGIPS2PP
+       bool "Logictech PS/2++ mouse protocol extension" if EMBEDDED
+       default y
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have a Logictech PS/2++ mouse connected to
+         your system.
+
+         If unsure, say Y.
+
+config MOUSE_PS2_SYNAPTICS
+       bool "Synaptics PS/2 mouse protocol extension" if EMBEDDED
+       default y
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have a Synaptics PS/2 TouchPad connected to
+         your system.
+
+         If unsure, say Y.
+
+config MOUSE_PS2_LIFEBOOK
+       bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EMBEDDED
+       default y
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have a Fujitsu B-series Lifebook PS/2
+         TouchScreen connected to your system.
+
+         If unsure, say Y.
+
+config MOUSE_PS2_TRACKPOINT
+       bool "IBM Trackpoint PS/2 mouse protocol extension" if EMBEDDED
+       default y
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have an IBM Trackpoint PS/2 mouse connected
+         to your system.
+
+         If unsure, say Y.
+
+config MOUSE_PS2_TOUCHKIT
+       bool "eGalax TouchKit PS/2 protocol extension"
+       depends on MOUSE_PS2
+       ---help---
+         Say Y here if you have an eGalax TouchKit PS/2 touchscreen
+         connected to your system.
+
+         If unsure, say N.
+
 config MOUSE_SERIAL
        tristate "Serial mouse"
        select SERIO
          digitizer (VSXXX-AB) DEC produced.
 
 config MOUSE_HIL
-       tristate "HIL pointers (mice etc)."     
+       tristate "HIL pointers (mice etc)."
        depends on GSC || HP300
        select HP_SDC
        select HIL_MLC
 
 obj-$(CONFIG_MOUSE_HIL)                += hil_ptr.o
 obj-$(CONFIG_MOUSE_VSXXXAA)    += vsxxxaa.o
 
-psmouse-objs  := psmouse-base.o alps.o logips2pp.o synaptics.o lifebook.o \
-               trackpoint.o touchkit_ps2.o
+psmouse-objs := psmouse-base.o synaptics.o
+
+psmouse-$(CONFIG_MOUSE_PS2_ALPS)       += alps.o
+psmouse-$(CONFIG_MOUSE_PS2_LOGIPS2PP)  += logips2pp.o
+psmouse-$(CONFIG_MOUSE_PS2_LIFEBOOK)   += lifebook.o
+psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT) += trackpoint.o
+psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT)   += touchkit_ps2.o
 
 #ifndef _ALPS_H
 #define _ALPS_H
 
-int alps_detect(struct psmouse *psmouse, int set_properties);
-int alps_init(struct psmouse *psmouse);
-
 struct alps_model_info {
         unsigned char signature[3];
         unsigned char byte0, mask0;
        int prev_fin;                   /* Finger bit from previous packet */
 };
 
+#ifdef CONFIG_MOUSE_PS2_ALPS
+int alps_detect(struct psmouse *psmouse, int set_properties);
+int alps_init(struct psmouse *psmouse);
+#else
+inline int alps_detect(struct psmouse *psmouse, int set_properties)
+{
+       return -ENOSYS;
+}
+inline int alps_init(struct psmouse *psmouse)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_MOUSE_PS2_ALPS */
+
 #endif
 
 #ifndef _LIFEBOOK_H
 #define _LIFEBOOK_H
 
+#ifdef CONFIG_MOUSE_PS2_LIFEBOOK
 int lifebook_detect(struct psmouse *psmouse, int set_properties);
 int lifebook_init(struct psmouse *psmouse);
+#else
+inline int lifebook_detect(struct psmouse *psmouse, int set_properties)
+{
+       return -ENOSYS;
+}
+inline int lifebook_init(struct psmouse *psmouse)
+{
+       return -ENOSYS;
+}
+#endif
 
 #endif
 
 #ifndef _LOGIPS2PP_H
 #define _LOGIPS2PP_H
 
+#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP
 int ps2pp_init(struct psmouse *psmouse, int set_properties);
+#else
+inline int ps2pp_init(struct psmouse *psmouse, int set_properties)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_MOUSE_PS2_LOGIPS2PP */
 
 #endif
 
                return PSMOUSE_THINKPS;
 
 /*
- * Try Synaptics TouchPad
+ * Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol
+ * support is disabled in config - we need to know if it is synaptics so we
+ * can reset it properly after probing for intellimouse.
  */
        if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse, set_properties) == 0) {
                synaptics_hardware = 1;
                .maxproto       = 1,
                .detect         = ps2bare_detect,
        },
+#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP
        {
                .type           = PSMOUSE_PS2PP,
                .name           = "PS2++",
                .alias          = "logitech",
                .detect         = ps2pp_init,
        },
+#endif
        {
                .type           = PSMOUSE_THINKPS,
                .name           = "ThinkPS/2",
                .maxproto       = 1,
                .detect         = im_explorer_detect,
        },
+#ifdef CONFIG_MOUSE_PS2_SYNAPTICS
        {
                .type           = PSMOUSE_SYNAPTICS,
                .name           = "SynPS/2",
                .detect         = synaptics_detect,
                .init           = synaptics_init,
        },
+#endif
+#ifdef CONFIG_MOUSE_PS2_ALPS
        {
                .type           = PSMOUSE_ALPS,
                .name           = "AlpsPS/2",
                .detect         = alps_detect,
                .init           = alps_init,
        },
+#endif
+#ifdef CONFIG_MOUSE_PS2_LIFEBOOK
        {
                .type           = PSMOUSE_LIFEBOOK,
                .name           = "LBPS/2",
                .alias          = "lifebook",
                .init           = lifebook_init,
        },
+#endif
+#ifdef CONFIG_MOUSE_PS2_TRACKPOINT
        {
                .type           = PSMOUSE_TRACKPOINT,
                .name           = "TPPS/2",
                .alias          = "trackpoint",
                .detect         = trackpoint_detect,
        },
+#endif
+#ifdef CONFIG_MOUSE_PS2_TOUCHKIT
        {
                .type           = PSMOUSE_TOUCHKIT_PS2,
                .name           = "touchkitPS/2",
                .alias          = "touchkit",
                .detect         = touchkit_ps2_detect,
        },
+#endif
        {
                .type           = PSMOUSE_AUTO,
                .name           = "auto",
 
 #define YMIN_NOMINAL 1408
 #define YMAX_NOMINAL 4448
 
+
 /*****************************************************************************
- *     Synaptics communications functions
+ *     Stuff we need even when we do not want native Synaptics support
  ****************************************************************************/
 
 /*
- * Send a command to the synpatics touchpad by special commands
+ * Set the synaptics touchpad mode byte by special commands
  */
-static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param)
+static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode)
 {
-       if (psmouse_sliced_command(psmouse, c))
+       unsigned char param[1];
+
+       if (psmouse_sliced_command(psmouse, mode))
                return -1;
-       if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO))
+       param[0] = SYN_PS_SET_MODE2;
+       if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE))
                return -1;
        return 0;
 }
 
+int synaptics_detect(struct psmouse *psmouse, int set_properties)
+{
+       struct ps2dev *ps2dev = &psmouse->ps2dev;
+       unsigned char param[4];
+
+       param[0] = 0;
+
+       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
+       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
+       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
+       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
+       ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
+
+       if (param[1] != 0x47)
+               return -ENODEV;
+
+       if (set_properties) {
+               psmouse->vendor = "Synaptics";
+               psmouse->name = "TouchPad";
+       }
+
+       return 0;
+}
+
+void synaptics_reset(struct psmouse *psmouse)
+{
+       /* reset touchpad back to relative mode, gestures enabled */
+       synaptics_mode_cmd(psmouse, 0);
+}
+
+#ifdef CONFIG_MOUSE_PS2_SYNAPTICS
+
+/*****************************************************************************
+ *     Synaptics communications functions
+ ****************************************************************************/
+
 /*
- * Set the synaptics touchpad mode byte by special commands
+ * Send a command to the synpatics touchpad by special commands
  */
-static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode)
+static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param)
 {
-       unsigned char param[1];
-
-       if (psmouse_sliced_command(psmouse, mode))
+       if (psmouse_sliced_command(psmouse, c))
                return -1;
-       param[0] = SYN_PS_SET_MODE2;
-       if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE))
+       if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO))
                return -1;
        return 0;
 }
        clear_bit(REL_Y, dev->relbit);
 }
 
-void synaptics_reset(struct psmouse *psmouse)
-{
-       /* reset touchpad back to relative mode, gestures enabled */
-       synaptics_mode_cmd(psmouse, 0);
-}
-
 static void synaptics_disconnect(struct psmouse *psmouse)
 {
        synaptics_reset(psmouse);
        return 0;
 }
 
-int synaptics_detect(struct psmouse *psmouse, int set_properties)
-{
-       struct ps2dev *ps2dev = &psmouse->ps2dev;
-       unsigned char param[4];
-
-       param[0] = 0;
-
-       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
-       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
-       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
-       ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
-       ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
-
-       if (param[1] != 0x47)
-               return -1;
-
-       if (set_properties) {
-               psmouse->vendor = "Synaptics";
-               psmouse->name = "TouchPad";
-       }
-
-       return 0;
-}
-
 #if defined(__i386__)
 #include <linux/dmi.h>
 static struct dmi_system_id toshiba_dmi_table[] = {
        return -1;
 }
 
+#else /* CONFIG_MOUSE_PS2_SYNAPTICS */
+
+int synaptics_init(struct psmouse *psmouse)
+{
+       return -ENOSYS;
+}
+
+#endif /* CONFIG_MOUSE_PS2_SYNAPTICS */
 
 
 #ifndef _SYNAPTICS_H
 #define _SYNAPTICS_H
 
-extern int synaptics_detect(struct psmouse *psmouse, int set_properties);
-extern int synaptics_init(struct psmouse *psmouse);
-extern void synaptics_reset(struct psmouse *psmouse);
-
 /* synaptics queries */
 #define SYN_QUE_IDENTIFY               0x00
 #define SYN_QUE_MODES                  0x01
 #define SYN_MODE_WMODE(m)              ((m) & (1 << 0))
 
 /* synaptics identify query bits */
-#define SYN_ID_MODEL(i)                (((i) >> 4) & 0x0f)
-#define SYN_ID_MAJOR(i)                ((i) & 0x0f)
-#define SYN_ID_MINOR(i)                (((i) >> 16) & 0xff)
+#define SYN_ID_MODEL(i)                        (((i) >> 4) & 0x0f)
+#define SYN_ID_MAJOR(i)                        ((i) & 0x0f)
+#define SYN_ID_MINOR(i)                        (((i) >> 16) & 0xff)
 #define SYN_ID_IS_SYNAPTICS(i)         ((((i) >> 8) & 0xff) == 0x47)
 
 /* synaptics special commands */
 struct synaptics_data {
        /* Data read from the touchpad */
        unsigned long int model_id;             /* Model-ID */
-       unsigned long int capabilities;         /* Capabilities */
-       unsigned long int ext_cap;              /* Extended Capabilities */
+       unsigned long int capabilities;         /* Capabilities */
+       unsigned long int ext_cap;              /* Extended Capabilities */
        unsigned long int identity;             /* Identification */
 
        unsigned char pkt_type;                 /* packet type - old, new, etc */
        int scroll;
 };
 
+int synaptics_detect(struct psmouse *psmouse, int set_properties);
+int synaptics_init(struct psmouse *psmouse);
+void synaptics_reset(struct psmouse *psmouse);
+
 #endif /* _SYNAPTICS_H */
 
 #ifndef _TOUCHKIT_PS2_H
 #define _TOUCHKIT_PS2_H
 
+#ifdef CONFIG_MOUSE_PS2_TOUCHKIT
 int touchkit_ps2_detect(struct psmouse *psmouse, int set_properties);
+#else
+inline int touchkit_ps2_detect(struct psmouse *psmouse, int set_properties)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_MOUSE_PS2_TOUCHKIT */
 
 #endif
 
        unsigned char ext_dev;
 };
 
-extern int trackpoint_detect(struct psmouse *psmouse, int set_properties);
+#ifdef CONFIG_MOUSE_PS2_TRACKPOINT
+int trackpoint_detect(struct psmouse *psmouse, int set_properties);
+#else
+inline int trackpoint_detect(struct psmouse *psmouse, int set_properties)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_MOUSE_PS2_TRACKPOINT */
 
 #endif /* _TRACKPOINT_H */