fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / input / mouse / psmouse.h
index 20bbab4..cf1de95 100644 (file)
@@ -2,10 +2,12 @@
 #define _PSMOUSE_H
 
 #define PSMOUSE_CMD_SETSCALE11 0x00e6
+#define PSMOUSE_CMD_SETSCALE21 0x00e7
 #define PSMOUSE_CMD_SETRES     0x10e8
 #define PSMOUSE_CMD_GETINFO    0x03e9
 #define PSMOUSE_CMD_SETSTREAM  0x00ea
-#define PSMOUSE_CMD_POLL       0x03eb
+#define PSMOUSE_CMD_SETPOLL    0x00f0
+#define PSMOUSE_CMD_POLL       0x00eb  /* caller sets number of bytes to receive */
 #define PSMOUSE_CMD_GETID      0x02f2
 #define PSMOUSE_CMD_SETRATE    0x10f3
 #define PSMOUSE_CMD_ENABLE     0x00f4
 #define PSMOUSE_RET_ACK                0xfa
 #define PSMOUSE_RET_NAK                0xfe
 
-#define PSMOUSE_FLAG_ACK       0       /* Waiting for ACK/NAK */
-#define PSMOUSE_FLAG_CMD       1       /* Waiting for command to finish */
-#define PSMOUSE_FLAG_CMD1      2       /* Waiting for the first byte of command response */
-#define PSMOUSE_FLAG_WAITID    3       /* Command execiting is GET ID */
-
 enum psmouse_state {
        PSMOUSE_IGNORE,
        PSMOUSE_INITIALIZING,
+       PSMOUSE_RESYNCING,
        PSMOUSE_CMD_MODE,
        PSMOUSE_ACTIVATED,
 };
@@ -39,49 +37,94 @@ typedef enum {
 
 struct psmouse {
        void *private;
-       struct input_dev dev;
-       struct serio *serio;
+       struct input_dev *dev;
+       struct ps2dev ps2dev;
+       struct work_struct resync_work;
        char *vendor;
        char *name;
-       unsigned char cmdbuf[8];
        unsigned char packet[8];
-       unsigned char cmdcnt;
+       unsigned char badbyte;
        unsigned char pktcnt;
+       unsigned char pktsize;
        unsigned char type;
-       unsigned char model;
+       unsigned char acks_disable_command;
+       unsigned int model;
        unsigned long last;
        unsigned long out_of_sync;
+       unsigned long num_resyncs;
        enum psmouse_state state;
-       unsigned char nak;
-       char error;
        char devname[64];
        char phys[32];
-       unsigned long flags;
 
-       /* Used to signal completion from interrupt handler */
-       wait_queue_head_t wait;
+       unsigned int rate;
+       unsigned int resolution;
+       unsigned int resetafter;
+       unsigned int resync_time;
+       unsigned int smartscroll;       /* Logitech only */
+
+       psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);
+       void (*set_rate)(struct psmouse *psmouse, unsigned int rate);
+       void (*set_resolution)(struct psmouse *psmouse, unsigned int resolution);
 
-       psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse, struct pt_regs *regs);
        int (*reconnect)(struct psmouse *psmouse);
        void (*disconnect)(struct psmouse *psmouse);
+       void (*cleanup)(struct psmouse *psmouse);
+       int (*poll)(struct psmouse *psmouse);
 
        void (*pt_activate)(struct psmouse *psmouse);
        void (*pt_deactivate)(struct psmouse *psmouse);
 };
 
-#define PSMOUSE_PS2            1
-#define PSMOUSE_PS2PP          2
-#define PSMOUSE_PS2TPP         3
-#define PSMOUSE_GENPS          4
-#define PSMOUSE_IMPS           5
-#define PSMOUSE_IMEX           6
-#define PSMOUSE_SYNAPTICS      7
+enum psmouse_type {
+       PSMOUSE_NONE,
+       PSMOUSE_PS2,
+       PSMOUSE_PS2PP,
+       PSMOUSE_THINKPS,
+       PSMOUSE_GENPS,
+       PSMOUSE_IMPS,
+       PSMOUSE_IMEX,
+       PSMOUSE_SYNAPTICS,
+       PSMOUSE_ALPS,
+       PSMOUSE_LIFEBOOK,
+       PSMOUSE_TRACKPOINT,
+       PSMOUSE_AUTO            /* This one should always be last */
+};
 
-int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command);
 int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command);
 int psmouse_reset(struct psmouse *psmouse);
+void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
+
+
+struct psmouse_attribute {
+       struct device_attribute dattr;
+       void *data;
+       ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf);
+       ssize_t (*set)(struct psmouse *psmouse, void *data,
+                       const char *buf, size_t count);
+};
+#define to_psmouse_attr(a)     container_of((a), struct psmouse_attribute, dattr)
+
+ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr,
+                                char *buf);
+ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr,
+                               const char *buf, size_t count);
 
-extern int psmouse_smartscroll;
-extern unsigned int psmouse_rate;
+#define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set)                  \
+static ssize_t _show(struct psmouse *, void *data, char *);                    \
+static ssize_t _set(struct psmouse *, void *data, const char *, size_t);       \
+static struct psmouse_attribute psmouse_attr_##_name = {                       \
+       .dattr  = {                                                             \
+               .attr   = {                                                     \
+                       .name   = __stringify(_name),                           \
+                       .mode   = _mode,                                        \
+                       .owner  = THIS_MODULE,                                  \
+               },                                                              \
+               .show   = psmouse_attr_show_helper,                             \
+               .store  = psmouse_attr_set_helper,                              \
+       },                                                                      \
+       .data   = _data,                                                        \
+       .show   = _show,                                                        \
+       .set    = _set,                                                         \
+}
 
 #endif /* _PSMOUSE_H */