Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261982AbVBPEPE (ORCPT ); Tue, 15 Feb 2005 23:15:04 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261983AbVBPEPE (ORCPT ); Tue, 15 Feb 2005 23:15:04 -0500 Received: from wproxy.gmail.com ([64.233.184.192]:63249 "EHLO wproxy.gmail.com") by vger.kernel.org with ESMTP id S261982AbVBPENo (ORCPT ); Tue, 15 Feb 2005 23:13:44 -0500 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=FvZ2nAHszdliw2PY+j/cBT1u+D/Fq6KvMGkowbcmUBfWtzM4CuBZfmVn+Wjj4zSyIGJ1JfQQdRmvdKMDfabvAdyP7YTiyMZBfg8E4FW7TecmoV++HqcKT3dC1wlnx6vADNgysfdJUQeGOrJI7E2QaMaMJZ3l1m9dXRjYQqcn2Ac= Message-ID: Date: Tue, 15 Feb 2005 23:13:41 -0500 From: Stephen Evanchik Reply-To: Stephen Evanchik To: Vojtech Pavlik Subject: Re: PATCH 2.6.11-rc4]: IBM TrackPoint configuration support Cc: Dmitry Torokhov , linux-kernel@vger.kernel.org In-Reply-To: <20050215141618.GC8119@ucw.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <200502132031.02214.dtor_core@ameritech.net> <20050215141618.GC8119@ucw.cz> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 18612 Lines: 582 On Tue, 15 Feb 2005 15:16:18 +0100, Vojtech Pavlik wrote: > Stephen, if you fix the above, and send me the patch, I'll merge it, > there isn't any other problem with it. Ok, more descriptive names, I noticed that psmouse->disconnect wasn't being called when my laptop suspended so I made the reconnect function sync the in memory configuration with what is actually on the device. Also, I removed the external port disable commands in trackpoint_init -- they didn't seem to do anything on my T23. Stephen diff -uNr a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile --- a/drivers/input/mouse/Makefile 2005-02-13 12:47:32.000000000 -0500 +++ b/drivers/input/mouse/Makefile 2005-02-13 12:46:30.000000000 -0500 @@ -14,4 +14,4 @@ obj-$(CONFIG_MOUSE_SERIAL) += sermouse.o obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o -psmouse-objs := psmouse-base.o alps.o logips2pp.o synaptics.o +psmouse-objs := psmouse-base.o alps.o logips2pp.o synaptics.o trackpoint.o diff -uNr a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c --- a/drivers/input/mouse/psmouse-base.c 2005-02-13 12:47:32.000000000 -0500 +++ b/drivers/input/mouse/psmouse-base.c 2005-02-13 17:33:17.000000000 -0500 @@ -23,6 +23,7 @@ #include "psmouse.h" #include "synaptics.h" #include "logips2pp.h" +#include "trackpoint.h" #include "alps.h" #define DRIVER_DESC "PS/2 mouse driver" @@ -482,6 +483,16 @@ return PSMOUSE_IMPS; /* + * Try to initialize the IBM TrackPoint + */ + if (max_proto > PSMOUSE_PS2 && trackpoint_init(psmouse) == 0) { + psmouse->vendor = "IBM"; + psmouse->name = "TrackPoint"; + + return PSMOUSE_PS2; + } + +/* * Okay, all failed, we have a standard mouse here. The number of the buttons * is still a question, though. We assume 3. */ diff -uNr a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c --- a/drivers/input/mouse/trackpoint.c 1969-12-31 19:00:00.000000000 -0500 +++ b/drivers/input/mouse/trackpoint.c 2005-02-15 23:05:08.000000000 -0500 @@ -0,0 +1,344 @@ +/* + * Stephen Evanchik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Trademarks are the property of their respective owners. + * + * 13/02/2005 - Removed middle button scroll, see Xorg for + * scroll emulation. + * + * 03/02/2005 - Remove proc and module parameters + * Added sysfs attributes + * + * 29/01/2005 - Fixed UltraNav support + * Moved to libps2 interface + * Renamed internal property variables to be consistent with reference docs + * Fixed negative inertia not being set properly + * Added middle button scroll module parameter + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "psmouse.h" +#include "trackpoint.h" + + +PSMOUSE_DEFINE_ATTR(sensitivity); +PSMOUSE_DEFINE_ATTR(speed); +PSMOUSE_DEFINE_ATTR(inertia); +PSMOUSE_DEFINE_ATTR(reach); +PSMOUSE_DEFINE_ATTR(draghys); +PSMOUSE_DEFINE_ATTR(mindrag); +PSMOUSE_DEFINE_ATTR(thresh); +PSMOUSE_DEFINE_ATTR(upthresh); +PSMOUSE_DEFINE_ATTR(ztime); +PSMOUSE_DEFINE_ATTR(jenks); +PSMOUSE_DEFINE_ATTR(press_to_select); +PSMOUSE_DEFINE_ATTR(skipback); +PSMOUSE_DEFINE_ATTR(middle_btn_disable); +PSMOUSE_DEFINE_ATTR(ext_dev); +PSMOUSE_DEFINE_ATTR(transparent); + + +#define MAKE_ATTR_READ(_item) \ + static ssize_t psmouse_attr_show_##_item(struct psmouse *psmouse, char *buf) \ + { \ + struct trackpoint_data *tp = psmouse->private; \ + return sprintf(buf, "%lu\n", (unsigned long)tp->_item); \ + } + +#define MAKE_ATTR_WRITE(_item, command) \ + static ssize_t psmouse_attr_set_##_item(struct psmouse *psmouse, const char *buf, size_t count) \ + { \ + char *rest; \ + unsigned long value; \ + struct trackpoint_data *tp = psmouse->private; \ + value = simple_strtoul(buf, &rest, 10); \ + if(*rest) \ + return -EINVAL; \ + tp->_item = value; \ + trackpoint_write(&psmouse->ps2dev, command, tp->_item); \ + return count; \ + } + +#define MAKE_ATTR_TOGGLE(_item, command, mask) \ + static ssize_t psmouse_attr_set_##_item(struct psmouse *psmouse, const char *buf, size_t count) \ + { \ + unsigned char toggle; \ + struct trackpoint_data *tp = psmouse->private; \ + toggle = (buf[0] == '1') ? 1 : 0; \ + if( toggle != tp->_item) { \ + tp->_item = toggle; \ + trackpoint_toggle_bit(&psmouse->ps2dev, command, mask); \ + } \ + return count; \ + } + + +/* + * Device IO: read, write and toggle bit + */ +static void trackpoint_command(struct ps2dev *ps2dev, unsigned char cmd) +{ + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, cmd)); +} + +static void trackpoint_read(struct ps2dev *ps2dev, unsigned char loc, unsigned char *results) +{ + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)); + ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 1, loc)); +} + +static void trackpoint_write(struct ps2dev *ps2dev, unsigned char loc, unsigned char val) +{ + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_WRITE_MEM)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, val)); +} + +static int trackpoint_toggle_bit(struct ps2dev *ps2dev, unsigned char loc, unsigned char mask) +{ + /* Bad things will happen if the loc param isn't in this range */ + if(loc < 0x20 || loc >= 0x2F) + return -1; + + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_TOGGLE)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)); + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, mask)); + + return 0; +} + + +MAKE_ATTR_WRITE(sensitivity, TP_SENS); +MAKE_ATTR_READ(sensitivity); + +MAKE_ATTR_WRITE(speed, TP_SPEED); +MAKE_ATTR_READ(speed); + +MAKE_ATTR_WRITE(inertia, TP_INERTIA); +MAKE_ATTR_READ(inertia); + +MAKE_ATTR_WRITE(reach, TP_REACH); +MAKE_ATTR_READ(reach); + +MAKE_ATTR_WRITE(draghys, TP_DRAGHYS); +MAKE_ATTR_READ(draghys); + +MAKE_ATTR_WRITE(mindrag, TP_MINDRAG); +MAKE_ATTR_READ(mindrag); + +MAKE_ATTR_WRITE(thresh, TP_THRESH); +MAKE_ATTR_READ(thresh); + +MAKE_ATTR_WRITE(upthresh, TP_UP_THRESH); +MAKE_ATTR_READ(upthresh); + +MAKE_ATTR_WRITE(ztime, TP_Z_TIME); +MAKE_ATTR_READ(ztime); + +MAKE_ATTR_WRITE(jenks, TP_JENKS_CURV); +MAKE_ATTR_READ(jenks); + +MAKE_ATTR_TOGGLE(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); +MAKE_ATTR_READ(press_to_select); + +MAKE_ATTR_TOGGLE(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); +MAKE_ATTR_READ(skipback); + +MAKE_ATTR_TOGGLE(middle_btn_disable, TP_TOGGLE_MB, TP_MASK_MB); +MAKE_ATTR_READ(middle_btn_disable); + +MAKE_ATTR_TOGGLE(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); +MAKE_ATTR_READ(ext_dev); + +/* MAKE_ATTR_WRITE( ) for Soft Transparent mode */ +static ssize_t psmouse_attr_set_transparent(struct psmouse *psmouse, const char *buf, size_t count) +{ + unsigned char command; + + struct trackpoint_data *tp = psmouse->private; + + tp->transparent = (buf[0] == '1') ? 1 : 0; + + command = (tp->transparent) ? TP_SET_SOFT_TRANS : TP_CANCEL_SOFT_TRANS; + + trackpoint_command(&psmouse->ps2dev, command); + + return count; +} + +MAKE_ATTR_READ(transparent); + + +static void trackpoint_disconnect(struct psmouse *psmouse) +{ + struct serio *serio = psmouse->ps2dev.serio; + + device_remove_file(&serio->dev, &psmouse_attr_sensitivity); + device_remove_file(&serio->dev, &psmouse_attr_speed); + device_remove_file(&serio->dev, &psmouse_attr_inertia); + device_remove_file(&serio->dev, &psmouse_attr_reach); + device_remove_file(&serio->dev, &psmouse_attr_draghys); + device_remove_file(&serio->dev, &psmouse_attr_mindrag); + device_remove_file(&serio->dev, &psmouse_attr_thresh); + device_remove_file(&serio->dev, &psmouse_attr_upthresh); + device_remove_file(&serio->dev, &psmouse_attr_ztime); + device_remove_file(&serio->dev, &psmouse_attr_jenks); + device_remove_file(&serio->dev, &psmouse_attr_press_to_select); + device_remove_file(&serio->dev, &psmouse_attr_skipback); + device_remove_file(&serio->dev, &psmouse_attr_middle_btn_disable); + device_remove_file(&serio->dev, &psmouse_attr_ext_dev); + device_remove_file(&serio->dev, &psmouse_attr_transparent); + + kfree(psmouse->private); + + psmouse->private = NULL; +} + +static int trackpoint_sync(struct psmouse *psmouse) +{ + unsigned char toggle; + struct trackpoint_data *tp = psmouse->private; + + + /* Push the config to the device */ + + trackpoint_write(&psmouse->ps2dev, TP_SENS, tp->sensitivity); + trackpoint_write(&psmouse->ps2dev, TP_INERTIA, tp->inertia); + trackpoint_write(&psmouse->ps2dev, TP_SPEED, tp->speed); + + trackpoint_write(&psmouse->ps2dev, TP_REACH, tp->reach); + trackpoint_write(&psmouse->ps2dev, TP_DRAGHYS, tp->draghys); + trackpoint_write(&psmouse->ps2dev, TP_MINDRAG, tp->mindrag); + + trackpoint_write(&psmouse->ps2dev, TP_THRESH, tp->thresh); + trackpoint_write(&psmouse->ps2dev, TP_UP_THRESH, tp->upthresh); + + trackpoint_write(&psmouse->ps2dev, TP_Z_TIME, tp->ztime); + trackpoint_write(&psmouse->ps2dev, TP_JENKS_CURV, tp->jenks); + + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_PTSON, &toggle); + if(((toggle & TP_MASK_PTSON) == TP_MASK_PTSON)!= tp->press_to_select) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_PTSON, TP_MASK_PTSON); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_MB, &toggle); + if(((toggle & TP_MASK_MB) == TP_MASK_MB) != tp->middle_btn_disable) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_MB, TP_MASK_MB); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle); + if(((toggle & TP_MASK_TWOHAND) == TP_MASK_TWOHAND) != tp->twohand) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, TP_MASK_TWOHAND); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_SKIPBACK, &toggle); + if(((toggle & TP_MASK_SKIPBACK) == TP_MASK_SKIPBACK) != tp->skipback) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_MB, &toggle); + if(((toggle & TP_MASK_MB) == TP_MASK_MB) != tp->middle_btn_disable) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_MB, TP_MASK_MB); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_SOURCE_TAG, &toggle); + if(((toggle & TP_MASK_SOURCE_TAG) == TP_MASK_SOURCE_TAG) != tp->source_tag) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_SOURCE_TAG, TP_MASK_SOURCE_TAG); + + trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_EXT_DEV, &toggle); + if(((toggle & TP_MASK_EXT_DEV) == TP_MASK_EXT_DEV) != tp->skipback) + trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); + + + + return 0; +} + +static void trackpoint_defaults(struct trackpoint_data *tp) +{ + tp->press_to_select = TP_DEF_PTSON; + tp->sensitivity = TP_DEF_SENS; + tp->speed = TP_DEF_SPEED; + tp->reach = TP_DEF_REACH; + + tp->draghys = TP_DEF_DRAGHYS; + tp->mindrag = TP_DEF_MINDRAG; + + tp->thresh = TP_DEF_THRESH; + tp->upthresh = TP_DEF_UP_THRESH; + + tp->ztime = TP_DEF_Z_TIME; + tp->jenks = TP_DEF_JENKS_CURV; + + tp->middle_btn_disable = TP_DEF_MB; + + tp->inertia = TP_DEF_INERTIA; + tp->skipback = TP_DEF_SKIPBACK; + tp->ext_dev = TP_DEF_EXT_DEV; +} + + + +int trackpoint_init(struct psmouse *psmouse) +{ + unsigned char param[2]; + struct trackpoint_data *priv; + + struct ps2dev *ps2dev = &psmouse->ps2dev; + struct serio *serio = ps2dev->serio; + + param[0] = param[1] = 0; + + if(ps2_command(ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) + return -1; + + if(param[0] != TP_MAGIC_IDENT) + return -1; + + psmouse->private = priv = kmalloc(sizeof(struct trackpoint_data), GFP_KERNEL); + + if(!priv) + return -1; + + memset(priv, 0, sizeof(struct trackpoint_data)); + + priv->firmware_id = param[1]; + trackpoint_defaults(priv); + + trackpoint_sync(psmouse); + + psmouse->reconnect = trackpoint_sync; + psmouse->disconnect = trackpoint_disconnect; + + device_create_file(&serio->dev, &psmouse_attr_sensitivity); + device_create_file(&serio->dev, &psmouse_attr_speed); + device_create_file(&serio->dev, &psmouse_attr_inertia); + device_create_file(&serio->dev, &psmouse_attr_reach); + device_create_file(&serio->dev, &psmouse_attr_draghys); + device_create_file(&serio->dev, &psmouse_attr_mindrag); + device_create_file(&serio->dev, &psmouse_attr_thresh); + device_create_file(&serio->dev, &psmouse_attr_upthresh); + device_create_file(&serio->dev, &psmouse_attr_ztime); + device_create_file(&serio->dev, &psmouse_attr_jenks); + device_create_file(&serio->dev, &psmouse_attr_press_to_select); + device_create_file(&serio->dev, &psmouse_attr_skipback); + device_create_file(&serio->dev, &psmouse_attr_middle_btn_disable); + device_create_file(&serio->dev, &psmouse_attr_ext_dev); + device_create_file(&serio->dev, &psmouse_attr_transparent); + + printk(KERN_INFO "IBM TrackPoint firmware: 0x%02X\n", param[1]); + + return 0; +} + diff -uNr a/drivers/input/mouse/trackpoint.h b/drivers/input/mouse/trackpoint.h --- a/drivers/input/mouse/trackpoint.h 1969-12-31 19:00:00.000000000 -0500 +++ b/drivers/input/mouse/trackpoint.h 2005-02-15 22:59:49.000000000 -0500 @@ -0,0 +1,157 @@ +/* + * IBM TrackPoint PS/2 mouse driver + * + * Stephen Evanchik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _TRACKPOINT_H +#define _TRACKPOINT_H + +/* + * These constants are from the TrackPoint System + * Engineering documentation Version 4 from IBM Watson + * research: + * http://wwwcssrv.almaden.ibm.com/trackpoint/download.html + */ + +#define TP_COMMAND (0xE2) /* Commands start with this */ + +#define TP_READ_ID (0xE1) /* Sent for device identification */ +#define TP_MAGIC_IDENT (0x01) /* Sent after a TP_READ_ID followed */ + /* by the firmware ID */ + + +/* + * Commands + */ +#define TP_RECALIB (0x51) /* Recalibrate */ +#define TP_POWER_DOWN (0x44) /* Can only be undone through HW reset */ +#define TP_EXT_DEV (0x21) /* Determines if external device is connected (RO) */ +#define TP_EXT_BTN (0x4B) /* Read extended button status */ +#define TP_POR (0x7F) /* Execute Power on Reset */ +#define TP_POR_RESULTS (0x25) /* Read Power on Self test results */ +#define TP_DISABLE_EXT (0x40) /* Disable external pointing device */ +#define TP_ENABLE_EXT (0x41) /* Enable external pointing device */ + +/* + * Mode manipulation + */ +#define TP_SET_SOFT_TRANS (0x4E) /* Set mode */ +#define TP_CANCEL_SOFT_TRANS (0xB9) /* Cancel mode */ +#define TP_SET_HARD_TRANS (0x45) /* Mode can only be set */ + + +/* + * Register oriented commands/properties + */ +#define TP_WRITE_MEM (0x81) +#define TP_READ_MEM (0x80) /* Not used in this implementation */ + +/* +* RAM Locations for properties + */ +#define TP_SENS (0x4A) /* Sensitivity */ +#define TP_MB (0x4C) /* Read Middle Button Status (RO) */ +#define TP_INERTIA (0x4D) /* Negative Inertia */ +#define TP_SPEED (0x60) /* Speed of TP Cursor */ +#define TP_REACH (0x57) /* Backup for Z-axis press */ +#define TP_DRAGHYS (0x58) /* Drag Hysteresis */ + /* (how hard it is to drag */ + /* with Z-axis pressed) */ + +#define TP_MINDRAG (0x59) /* Minimum amount of force needed */ + /* to trigger dragging */ + +#define TP_THRESH (0x5C) /* Minimum value for a Z-axis press */ +#define TP_UP_THRESH (0x5A) /* Used to generate a 'click' on Z-axis */ +#define TP_Z_TIME (0x5E) /* How sharp of a press */ +#define TP_JENKS_CURV (0x5D) /* Minimum curvature for double click */ + +/* + * Toggling Flag bits + */ +#define TP_TOGGLE (0x47) /* Toggle command */ + +#define TP_TOGGLE_MB (0x23) /* Disable/Enable Middle Button */ +#define TP_TOGGLE_DRIFT (0x23) /* Drift Correction */ +#define TP_TOGGLE_BURST (0x28) /* Burst Mode */ +#define TP_TOGGLE_PTSON (0x2C) /* Press to Select */ +#define TP_TOGGLE_HARD_TRANS (0x2C) /* Alternate method to set Hard Transparency */ +#define TP_TOGGLE_TWOHAND (0x2D) /* Two handed */ +#define TP_TOGGLE_STICKY_TWO (0x2D) /* Sticky two handed */ +#define TP_TOGGLE_SKIPBACK (0x2D) /* Suppress movement */ + /* after drag release */ +#define TP_TOGGLE_EXT_DEV (0x23) /* Toggle external device */ +#define TP_TOGGLE_SOURCE_TAG (0x20) /* Bit 3 of the first packet will be set to + to the origin of the packet (external or TP) */ + +/* + * Various makses for registers + * XOR'd to current contents for new value + */ +#define TP_MASK_PTSON (0x01) +#define TP_MASK_SKIPBACK (0x08) +#define TP_MASK_TWOHAND (0x01) +#define TP_MASK_STICKY_TWO (0x04) +#define TP_MASK_HARD_TRANS (0x80) +#define TP_MASK_BURST (0x80) +#define TP_MASK_MB (0x01) +#define TP_MASK_DRIFT (0x80) +#define TP_MASK_EXT_DEV (0x02) +#define TP_MASK_SOURCE_TAG (0x80) + +/* Power on Self Test Results */ +#define TP_POR_SUCCESS (0x3B) + +/* + * Default power on values + */ +#define TP_DEF_SENS (0x80) +#define TP_DEF_INERTIA (0x06) +#define TP_DEF_SPEED (0x61) +#define TP_DEF_REACH (0x0A) + +#define TP_DEF_DRAGHYS (0xFF) +#define TP_DEF_MINDRAG (0x14) + +#define TP_DEF_THRESH (0x08) +#define TP_DEF_UP_THRESH (0xFF) +#define TP_DEF_Z_TIME (0x26) +#define TP_DEF_JENKS_CURV (0x87) + +/* Toggles */ +#define TP_DEF_MB (0x00) +#define TP_DEF_PTSON (0x00) +#define TP_DEF_SKIPBACK (0x00) +#define TP_DEF_EXT_DEV (0x01) + +#define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd)) + + + +struct trackpoint_data +{ + unsigned char firmware_id; + + unsigned char sensitivity, speed, inertia, reach; + unsigned char draghys, mindrag; + unsigned char thresh, upthresh; + unsigned char ztime, jenks; + + unsigned char press_to_select; + unsigned char twohand, skipback; + unsigned char middle_btn_disable; + + unsigned char ext_dev; + unsigned char transparent; + unsigned char source_tag; + +}; + +extern int trackpoint_init (struct psmouse *psmouse); + +#endif /* _TRACKPOINT_H */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/