All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [linux 2.6] new mouse driver looking for review and integration (fwd)
       [not found] ` <20081030184450.GA18874@anvil.corenet.prv>
@ 2009-05-08  5:30   ` Tai-hwa Liang
  2009-05-09  3:17     ` Dmitry Torokhov
  0 siblings, 1 reply; 8+ messages in thread
From: Tai-hwa Liang @ 2009-05-08  5:30 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

Hi, Dmitry,

   I'm wondering about the status of the patch you submitted to git.  Will it 
being merged into 2.6.31?

On Thu, 30 Oct 2008, Dmitry Torokhov wrote:
> Dear Tai-hwa,
>
> On Tue, Oct 21, 2008 at 11:36:05AM +0800, Tai-hwa Liang wrote:
>> ---------- Forwarded message ----------
>> Date: Fri, 17 Oct 2008 15:35:35 +0800 (CST)
>> From: Tai-hwa Liang <avatar@sentelic.com>
>> To: dmitry.torokhov@gmail.com
>> Subject: Re: [linux 2.6] new mouse driver looking for review and integration
>>     (fwd)
>>
>> [Not sure if the linux-input mailing list still exists. I'm sending you based
>> on the address found in MAINTAINERS file]
>>
>> Greetings,
>>
>>   The attached is the latest driver for Sentelic Finger Sensing Pad which
>> can be found on MSI WIND Netbook.  Since there are many user requests
>> for official Linux driver, we are still looking for getting this
>> implementation being merged into the mainstream kernel tree.
>>
>>   I would be very appreciate it if you can review them.
>>
>
> I finally had some time to review the code and I believe it is in a good
> shape but I would like to adjust it a little bit to integrate it better
> with the rest of psmouse code. The patch below is what I currently have
> relative to what you sent to me.
>
> Breakdown of the changes:
>
> - fsp_ps2_command() - I removed it and instead used ps2_sendbyte in the
>   most places;
> - while reading and writing registers cmd_mutex is held ensuring
>   uninterruped operation
> - while reading registers psmouse is switched to command mode to not
>   confuse interrupt handler
> - use attribute_group to simplify creating multiple attributes
> - some formatting changes
[...]
>
> -- 
> Dmitry
> 
> Input: various fixups to Sentelic driver
> 
> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
> ---
>  drivers/input/mouse/Kconfig        |    8
>  drivers/input/mouse/Makefile       |    1
>  drivers/input/mouse/psmouse-base.c |   18 -
>  drivers/input/mouse/sentelic.c     |  857 ++++++++++++++----------------------
>  drivers/input/mouse/sentelic.h     |   39 +-
>  drivers/input/serio/libps2.c       |   15 +
>  include/linux/libps2.h             |    1
>  7 files changed, 399 insertions(+), 540 deletions(-)
> 
> diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
> index 4e99342..6c87b68 100644
> --- a/drivers/input/mouse/Kconfig
> +++ b/drivers/input/mouse/Kconfig
> @@ -107,6 +107,14 @@ config MOUSE_PS2_ELANTECH
>  	  entries. For further information,
>  	  see <file:Documentation/input/elantech.txt>.
> 
> +config MOUSE_PS2_SENTELIC
> +	bool "Sentelic Finger Sensing Pad PS/2 protocol extension"
> +	depends on MOUSE_PS2
> +	help
> +	  Say Y here if you have a laptop (such as MSI WIND Netbook)
> +	  with Sentelic Finger Sensing Pad touchpad.
> +
> +	  If unsure, say N.
>
>  config MOUSE_PS2_TOUCHKIT
>  	bool "eGalax TouchKit PS/2 protocol extension"
> diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
> index 0594f28..9eaf422 100644
> --- a/drivers/input/mouse/Makefile
> +++ b/drivers/input/mouse/Makefile
> @@ -25,5 +25,6 @@ psmouse-$(CONFIG_MOUSE_PS2_ELANTECH)	+= elantech.o
>  psmouse-$(CONFIG_MOUSE_PS2_OLPC)	+= hgpk.o
>  psmouse-$(CONFIG_MOUSE_PS2_LOGIPS2PP)	+= logips2pp.o
>  psmouse-$(CONFIG_MOUSE_PS2_LIFEBOOK)	+= lifebook.o
> +psmouse-$(CONFIG_MOUSE_PS2_SENTELIC)	+= sentelic.o
>  psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT)	+= trackpoint.o
>  psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT)	+= touchkit_ps2.o
> diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
> index 2862ad6..4683b13 100644
> --- a/drivers/input/mouse/psmouse-base.c
> +++ b/drivers/input/mouse/psmouse-base.c
> @@ -761,13 +761,6 @@ static const struct psmouse_protocol psmouse_protocols[] = {
>  		.maxproto	= 1,
>  		.detect		= intellimouse_detect,
>  	},
> - 	{
> -		.type		= PSMOUSE_FSP,
> -		.name		= "FSPPS/2",
> -		.alias		= "fsp",
> -		.detect		= fsp_detect,
> -		.init		= fsp_init,
> -	},
>  	{
>  		.type		= PSMOUSE_IMEX,
>  		.name		= "ImExPS/2",
> @@ -833,7 +826,16 @@ static const struct psmouse_protocol psmouse_protocols[] = {
>  		.detect		= elantech_detect,
>  		.init		= elantech_init,
>  	},
> - #endif
> +#endif
> +#ifdef CONFIG_MOUSE_PS2_SENTELIC
> +	{
> +		.type		= PSMOUSE_FSP,
> +		.name		= "FSPPS/2",
> +		.alias		= "fsp",
> +		.detect		= fsp_detect,
> +		.init		= fsp_init,
> +	},
> +#endif
>  	{
>  		.type		= PSMOUSE_CORTRON,
>  		.name		= "CortronPS/2",
> diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c
> index 37a07a3..f44854e 100644
> --- a/drivers/input/mouse/sentelic.c
> +++ b/drivers/input/mouse/sentelic.c
> @@ -17,8 +17,6 @@
>   *   You should have received a copy of the GNU General Public License
>   *   along with this program; if not, write to the Free Software
>   *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> - *
> - * $Id: sentelic.c 28732 2008-10-17 07:03:29Z avatar $
>   */
>
>  #include <linux/module.h>
> @@ -32,100 +30,27 @@
>  #include "psmouse.h"
>  #include "sentelic.h"
> 
> -/**
> - * The timeout for FSP PS/2 command only (in milliseconds).
> +/*
> + * Timeout for FSP PS/2 command and subsequent arguments
>   */
> -#define	FSP_CMD_TIMEOUT		(30)
> +#define	FSP_CMD_TIMEOUT		200
> +#define	FSP_CMD_TIMEOUT2	30
>
>  /** Driver version. */
>  static unsigned int	fsp_drv_ver[] = {1, 0, 0};
>
>  #ifdef	FSP_DEBUG
> -static unsigned int	ps2_packet_cnt;
> -static unsigned int	ps2_last_second;
> +static unsigned int ps2_packet_cnt;
> +static unsigned int ps2_last_second;
>  #endif
> 
> -/*
> - * A direct copy of ps2_command(), with reduced timeout value as the hardware
> - * will return non-standard response which results in timeout in almost all
> - * commanding sequences.
> - */
> -static int
> -fsp_ps2_command(struct psmouse *psmouse, unsigned char *param, int command)
> -{
> -	struct ps2dev	*ps2dev = &psmouse->ps2dev;
> -	int		timeout;
> -	int		send = (command >> 12) & 0xf;
> -	int		receive = (command >> 8) & 0xf;
> -	int		rc = -1;
> -	int		i;
> -
> -	if (receive > sizeof(ps2dev->cmdbuf)) {
> -		WARN_ON(1);
> -		return (-1);
> -	}
> -
> -	if (send && !param) {
> -		WARN_ON(1);
> -		return (-1);
> -	}
> -
> -	mutex_lock(&ps2dev->cmd_mutex);
> -
> -	serio_pause_rx(ps2dev->serio);
> -	ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0;
> -	ps2dev->cmdcnt = receive;
> -	if (receive && param)
> -		for (i = 0; i < receive; i++)
> -			ps2dev->cmdbuf[(receive - 1) - i] = param[i];
> -	serio_continue_rx(ps2dev->serio);
> -
> -	if (ps2_sendbyte(ps2dev, command & 0xff,
> -	    command == PS2_CMD_RESET_BAT ? 1000 : FSP_CMD_TIMEOUT))
> -		goto out;
> -
> -	for (i = 0; i < send; i++) {
> -		if (ps2_sendbyte(ps2dev, param[i], FSP_CMD_TIMEOUT))
> -			goto out;
> -	}
> -
> -	/*
> -	 * The reset command takes a long time to execute.
> -	 */
> -	timeout = msecs_to_jiffies(command == PS2_CMD_RESET_BAT ? 4000 : 500);
> -
> -	timeout = wait_event_timeout(ps2dev->wait,
> -	    !(ps2dev->flags & PS2_FLAG_CMD1), timeout);
> -
> -	if (ps2dev->cmdcnt && timeout > 0) {
> -		wait_event_timeout(ps2dev->wait,
> -		    !(ps2dev->flags & PS2_FLAG_CMD), timeout);
> -	}
> -
> -	if (param) {
> -		for (i = 0; i < receive; i++)
> -			param[i] = ps2dev->cmdbuf[(receive - 1) - i];
> -	}
> -
> -	if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1))
> -		goto out;
> -
> -	rc = 0;
> -out:
> -	serio_pause_rx(ps2dev->serio);
> -	ps2dev->flags = 0;
> -	serio_continue_rx(ps2dev->serio);
> -
> -	mutex_unlock(&ps2dev->cmd_mutex);
> -	return (rc);
> -}
> +int fsp_reset(struct psmouse *psmouse);
>
>  /*
>   * Make sure that the value being sent to FSP will not conflict with
>   * possible sample rate values.
>   */
> -static unsigned char
> -fsp_test_swap_cmd(unsigned char reg_val)
> +static unsigned char fsp_test_swap_cmd(unsigned char reg_val)
>  {
>  	switch (reg_val) {
>  	case 10: case 20: case 40: case 60: case 80: case 100: case 200:
> @@ -134,9 +59,9 @@ fsp_test_swap_cmd(unsigned char reg_val)
>  		 * sample rates, swap the given value such that the hardware
>  		 * wouldn't get confused.
>  		 */
> -		return ((reg_val >> 4) | (reg_val << 4));
> +		return (reg_val >> 4) | (reg_val << 4);
>  	default:
> -		return (reg_val);	/* swap isn't necessary */
> +		return reg_val;	/* swap isn't necessary */
>  	}
>  }
> 
> @@ -144,8 +69,7 @@ fsp_test_swap_cmd(unsigned char reg_val)
>   * Make sure that the value being sent to FSP will not conflict with certain
>   * commands.
>   */
> -static unsigned char
> -fsp_test_invert_cmd(unsigned char reg_val)
> +static unsigned char fsp_test_invert_cmd(unsigned char reg_val)
>  {
>  	switch (reg_val) {
>  	case 0xe9: case 0xee: case 0xf2: case 0xff:
> @@ -154,299 +78,328 @@ fsp_test_invert_cmd(unsigned char reg_val)
>  		 * commands, inverse the given value such that the hardware
>  		 * wouldn't get confused.
>  		 */
> -		return ~(reg_val);
> +		return ~reg_val;
>  	default:
> -		return (reg_val);	/* inversion isn't necessary */
> +		return reg_val;	/* inversion isn't necessary */
>  	}
>  }
> 
> -static int
> -fsp_reg_read(struct psmouse *psmouse, int reg_addr, int *reg_val)
> +static int fsp_reg_read(struct psmouse *psmouse, int reg_addr, int *reg_val)
>  {
> -	unsigned char	param[3];
> -	unsigned char	addr;
> -#ifdef	FSP_DEBUG
> -	printk(KERN_INFO "fsp_reg_read: READ REG\n");
> -#endif
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	struct ps2dev *ps2dev = &psmouse->ps2dev;
> +	unsigned char param[3];
> +	unsigned char addr;
> +	int rc = -1;
> +
> +	/*
> +	 * We need to shut off the device and switch it into command
> +	 * mode so we don't confuse our protocol handler. We don't need
> +	 * to do that for writes because sysfs set helper does this for
> +	 * us.
> +	 */
> +	ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE);
> +	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
> +	mutex_lock(&ps2dev->cmd_mutex);
> +
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
>
>  	/* should return 0xfe(request for resending) */
> -	fsp_ps2_command(psmouse, NULL, 0x0066);
> +	ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2);
>  	/* should return 0xfc(failed) */
> -	fsp_ps2_command(psmouse, NULL, 0x0088);
> +	ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2);
> 
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
>
>  	if ((addr = fsp_test_invert_cmd(reg_addr)) != reg_addr) {
> -		fsp_ps2_command(psmouse, NULL, 0x0068);
> +		ps2_sendbyte(ps2dev, 0x68, FSP_CMD_TIMEOUT2);
> +	} else if ((addr = fsp_test_swap_cmd(reg_addr)) != reg_addr) {
> +		/* swapping is required */
> +		ps2_sendbyte(ps2dev, 0xcc, FSP_CMD_TIMEOUT2);
> +		/* expect 0xfe */
>  	} else {
> -		if ((addr = fsp_test_swap_cmd(reg_addr)) != reg_addr) {
> -			/* swapping is required */
> -			fsp_ps2_command(psmouse, NULL, 0x00cc);
> -			/* expect 0xfe */
> -		} else {
> -			/* swapping isn't necessary */
> -			fsp_ps2_command(psmouse, NULL, 0x0066);
> -			/* expect 0xfe */
> -		}
> +		/* swapping isn't necessary */
> +		ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2);
> +		/* expect 0xfe */
>  	}
>  	/* should return 0xfc(failed) */
> -	fsp_ps2_command(psmouse, NULL, addr);
> +	ps2_sendbyte(ps2dev, addr, FSP_CMD_TIMEOUT);
> 
> -	if (fsp_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO) < 0)
> -		return (-1);
> +	if (__ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO) < 0)
> +		goto out;
>
>  	*reg_val = param[2];
> +	rc = 0;
> 
> -	return (0);
> + out:
> +	mutex_unlock(&ps2dev->cmd_mutex);
> +	ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
> +	psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
> +	dev_dbg(&ps2dev->serio->dev, "READ REG: 0x%02x is 0x%02x (rc = %d)\n",
> +		reg_addr, *reg_val, rc);
> +	return rc;
>  }
> 
> -static int
> -fsp_reg_write(struct psmouse *psmouse, int reg_addr, int reg_val)
> +static int fsp_reg_write(struct psmouse *psmouse, int reg_addr, int reg_val)
>  {
> -	unsigned char	v;
> -#ifdef	FSP_DEBUG
> -	printk(KERN_INFO "fsp_reg_write: WRITE REG\n");
> -#endif
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	struct ps2dev *ps2dev = &psmouse->ps2dev;
> +	unsigned char v;
> +	int rc = -1;
> +
> +	mutex_lock(&ps2dev->cmd_mutex);
> +
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
>
>  	if ((v = fsp_test_invert_cmd(reg_addr)) != reg_addr) {
>  		/* inversion is required */
> -		fsp_ps2_command(psmouse, NULL, 0x0074);
> +		ps2_sendbyte(ps2dev, 0x74, FSP_CMD_TIMEOUT2);
>  	} else {
>  		if ((v = fsp_test_swap_cmd(reg_addr)) != reg_addr) {
>  			/* swapping is required */
> -			fsp_ps2_command(psmouse, NULL, 0x0077);
> +			ps2_sendbyte(ps2dev, 0x77, FSP_CMD_TIMEOUT2);
>  		} else {
>  			/* swapping isn't necessary */
> -			fsp_ps2_command(psmouse, NULL, 0x0055);
> +			ps2_sendbyte(ps2dev, 0x55, FSP_CMD_TIMEOUT2);
>  		}
>  	}
>  	/* write the register address in correct order */
> -	fsp_ps2_command(psmouse, NULL, v);
> +	ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2);
> 
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		return -1;
>
>  	if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) {
>  		/* inversion is required */
> -		fsp_ps2_command(psmouse, NULL, 0x0047);
> +		ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2);
> +	} else if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) {
> +		/* swapping is required */
> +		ps2_sendbyte(ps2dev, 0x44, FSP_CMD_TIMEOUT2);
>  	} else {
> -		if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) {
> -			/* swapping is required */
> -			fsp_ps2_command(psmouse, NULL, 0x0044);
> -		} else {
> -			/* swapping isn't necessary */
> -			fsp_ps2_command(psmouse, NULL, 0x0033);
> -		}
> +		/* swapping isn't necessary */
> +		ps2_sendbyte(ps2dev, 0x33, FSP_CMD_TIMEOUT2);
>  	}
> +
>  	/* write the register value in correct order */
> -	fsp_ps2_command(psmouse, NULL, v);
> +	ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2);
> +	rc = 0;
> 
> -	return (0);
> + out:
> +	mutex_unlock(&ps2dev->cmd_mutex);
> +	dev_dbg(&ps2dev->serio->dev, "WRITE REG: 0x%02x to 0x%02x (rc = %d)\n",
> +		reg_addr, reg_val, rc);
> +	return rc;
>  }
>
>  /* enable register clock gating for writing certain registers */
> -static int
> -fsp_reg_write_enable(struct psmouse *psmouse, int en)
> +static int fsp_reg_write_enable(struct psmouse *psmouse, int en)
>  {
> -	int	v, nv;
> +	int v, nv;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_SYSCTL1, &v) == -1)
> -		return (-1);
> +		return -1;
> 
> -	if (en) {
> +	if (en)
>  		nv = v | FSP_BIT_EN_REG_CLK;
> -	} else {
> -		nv = v & ~(FSP_BIT_EN_REG_CLK);
> -	}
> +	else
> +		nv = v & ~FSP_BIT_EN_REG_CLK;
> +
>  	/* only write if necessary */
> -	if (nv != v) {
> +	if (nv != v)
>  		if (fsp_reg_write(psmouse, FSP_REG_SYSCTL1, nv) == -1)
> -			return (-1);
> -	}
> -	return (0);
> +			return -1;
> +
> +	return 0;
>  }
> 
> -static int
> -fsp_page_reg_read(struct psmouse *psmouse, int *reg_val)
> +static int fsp_page_reg_read(struct psmouse *psmouse, int *reg_val)
>  {
> -	unsigned char	param[3];
> -#ifdef	FSP_DEBUG
> -	printk(KERN_INFO "fsp_page_reg_read: READ PAGE REG\n");
> -#endif
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	struct ps2dev *ps2dev = &psmouse->ps2dev;
> +	unsigned char param[3];
> +	int rc = -1;
> 
> -	fsp_ps2_command(psmouse, NULL, 0x0066);
> -	fsp_ps2_command(psmouse, NULL, 0x0088);
> +	ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE);
> +	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
> +	mutex_lock(&ps2dev->cmd_mutex);
> +
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
> 
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2);
> +	ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2);
> 
> -	fsp_ps2_command(psmouse, NULL, 0x0083);
> -	fsp_ps2_command(psmouse, NULL, 0x0088);
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
> +
> +	ps2_sendbyte(ps2dev, 0x83, FSP_CMD_TIMEOUT2);
> +	ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2);
>
>  	/* get the returned result */
> -	if (fsp_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO))
> -		return (-1);
> +	if (__ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
> +		goto out;
>
>  	*reg_val = param[2];
> +	rc = 0;
> 
> -	return (0);
> + out:
> +	mutex_unlock(&ps2dev->cmd_mutex);
> +	ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
> +	psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
> +	dev_dbg(&ps2dev->serio->dev, "READ PAGE REG: 0x%02x (rc = %d)\n",
> +		*reg_val, rc);
> +	return rc;
>  }
> 
> -static int
> -fsp_page_reg_write(struct psmouse *psmouse, int reg_val)
> +static int fsp_page_reg_write(struct psmouse *psmouse, int reg_val)
>  {
> -	unsigned char	v;
> -#ifdef	FSP_DEBUG
> -	printk(KERN_INFO "fsp_page_reg_write: WRITE PAGE REG\n");
> -#endif
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	struct ps2dev *ps2dev = &psmouse->ps2dev;
> +	unsigned char v;
> +	int rc = -1;
> +
> +	mutex_lock(&ps2dev->cmd_mutex);
> +
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		goto out;
> 
> -	fsp_ps2_command(psmouse, NULL, 0x0038);
> -	fsp_ps2_command(psmouse, NULL, 0x0088);
> +	ps2_sendbyte(ps2dev, 0x38, FSP_CMD_TIMEOUT2);
> +	ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2);
> 
> -	if (fsp_ps2_command(psmouse, NULL, 0x00f3) < 0)
> -		return (-1);
> +	if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
> +		return -1;
>
>  	if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) {
> -		fsp_ps2_command(psmouse, NULL, 0x0047);
> +		ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2);
> +	} else if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) {
> +		/* swapping is required */
> +		ps2_sendbyte(ps2dev, 0x44, FSP_CMD_TIMEOUT2);
>  	} else {
> -		if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) {
> -			/* swapping is required */
> -			fsp_ps2_command(psmouse, NULL, 0x0044);
> -		} else {
> -			/* swapping isn't necessary */
> -			fsp_ps2_command(psmouse, NULL, 0x0033);
> -		}
> +		/* swapping isn't necessary */
> +		ps2_sendbyte(ps2dev, 0x33, FSP_CMD_TIMEOUT2);
>  	}
> -	fsp_ps2_command(psmouse, NULL, v);
> 
> -	return (0);
> +	ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2);
> +	rc = 0;
> +
> + out:
> +	mutex_unlock(&ps2dev->cmd_mutex);
> +	dev_dbg(&ps2dev->serio->dev, "WRITE PAGE REG: to 0x%02x (rc = %d)\n",
> +		reg_val, rc);
> +	return rc;
>  }
> 
> -static int
> -fsp_batch_write_reg(struct psmouse *psmouse,
> -			const unsigned char *params, size_t size)
> +static int fsp_batch_write_reg(struct psmouse *psmouse,
> +				const unsigned char *params, size_t size)
>  {
> -	int	i, v;
> +	int i, v;
>
>  	if (size == 0)
> -		return (0);
> +		return 0;
>
>  	/* begin writing: enable register clock gating */
>  	fsp_reg_write_enable(psmouse, 1);
> 
> -	for (i = v = 0; i < size; i += 2) {
> +	for (i = v = 0; i < size; i += 2)
>  		if (fsp_reg_write(psmouse, params[i], params[i + 1]) != 0)
>  			v = -1;
> -	}
>
>  	/* complete writing: disable register clock gating */
>  	fsp_reg_write_enable(psmouse, 0);
> 
> -	return (v);
> +	return v;
>  }
> 
> -static int
> -fsp_device_id(struct psmouse *psmouse)
> +static int fsp_device_id(struct psmouse *psmouse)
>  {
>  	int	id;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_DEVICE_ID, &id))
> -		return (-1);
> -	else
> -		return (id);
> +		return -1;
> +
> +	return id;
>  }
> 
> -static int
> -fsp_get_version(struct psmouse *psmouse)
> +static int fsp_get_version(struct psmouse *psmouse)
>  {
>  	int	ver;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_VERSION, &ver))
> -		return (-1);
> -	else
> -		return (ver);
> +		return -1;
> +
> +	return ver;
>  }
> 
> -static int
> -fsp_get_revision(struct psmouse *psmouse)
> +static int fsp_get_revision(struct psmouse *psmouse)
>  {
>  	int	rev;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_REVISION, &rev))
> -		return (-1);
> -	else
> -		return (rev);
> +		return -1;
> +
> +	return rev;
>  }
> 
> -static int
> -fsp_get_buttons(struct psmouse *psmouse)
> +static int fsp_get_buttons(struct psmouse *psmouse)
>  {
>  	int	buttons;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS1, &buttons) == -1)
> -		return (-1);
> +		return -1;
>
>  	switch (buttons & 0x30) {
>  	case 0x30:
>  	default:
>  		/* Left/Middle/Right */
> -		return (0x02);
> +		return 0x02;
>
>  	case 0x20:
>  		/* Left/Middle/Right & Scroll Up/Down */
> -		return (0x04);
> +		return 0x04;
>
>  	case 0x10:
>  		/* Left/Middle/Right & Scroll Up/Down/Right/Left */
> -		return (0x06);
> +		return 0x06;
>
>  	case 0x00:
>  		/* Left/Middle/Right/Forward/Backward & Scroll Up/Down */
> -		return (0x16);
> +		return 0x16;
>  	}
>  }
>
>  /** enable on-pad command tag output */
> -static int
> -fsp_opc_tag_enable(struct psmouse *psmouse, int en)
> +static int fsp_opc_tag_enable(struct psmouse *psmouse, int en)
>  {
> -	int	v, nv, res = 0;
> +	int v, nv;
> +	int res = 0;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_OPC_QDOWN, &v) == -1) {
> -		printk(KERN_ERR "Unable get OPC state.\n");
> -		return (-1);
> +		dev_err(&psmouse->ps2dev.serio->dev, "Unable get OPC state.\n");
> +		return -1;
>  	}
> -	if (en) {
> +
> +	if (en)
>  		nv = v | FSP_BIT_EN_OPC_TAG;
> -	} else {
> +	else
>  		nv = v & ~(FSP_BIT_EN_OPC_TAG);
> -	}
> +
>  	/* only write if necessary */
>  	if (nv != v) {
>  		fsp_reg_write_enable(psmouse, 1);
>  		res = fsp_reg_write(psmouse, FSP_REG_OPC_QDOWN, nv);
>  		fsp_reg_write_enable(psmouse, 0);
>  	}
> -	if (res != 0) {
> -		printk(KERN_ERR "Unable to enable OPC tag.\n");
> -	}
> -	return (res);
> +
> +	if (res != 0)
> +		dev_err(&psmouse->ps2dev.serio->dev,
> +			"Unable to enable OPC tag.\n");
> +
> +	return res;
>  }
>
>  /**
>   * set packet format based on the number of buttons current device has
>   */
> -static int
> -fsp_set_packet_format(struct psmouse *psmouse)
> +static int fsp_set_packet_format(struct psmouse *psmouse)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>  	struct ps2dev	*ps2dev = &psmouse->ps2dev;
> @@ -473,27 +426,33 @@ fsp_set_packet_format(struct psmouse *psmouse)
>  		ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
>  		ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
>  		if (param[0] != 0x04) {
> -			printk(KERN_ERR "Unable to enable 4 bytes packet.\n");
> +			dev_err(&psmouse->ps2dev.serio->dev,
> +				"Unable to enable 4 bytes packet.\n");
>  			psmouse->pktsize = 3;
> -			return (-1);
> +			return -1;
>  		}
>  		psmouse->pktsize = 4;
>  		break;
> +
>  	case 0x06:
>  		/* Left/Middle/Right & Scroll Up/Down/Right/Left */
>  		fsp_reg_read(psmouse, FSP_REG_SYSCTL5, &val);
>  		val &= ~(FSP_BIT_EN_MSID7 | FSP_BIT_EN_MSID8 | FSP_BIT_EN_AUTO_MSID8);
>  		val |= FSP_BIT_EN_MSID6;
>  		if (fsp_reg_write(psmouse, FSP_REG_SYSCTL5, val)) {
> -			printk(KERN_ERR "Unable to enable MSID6 mode.\n");
> -			return (-1);
> +			dev_err(&psmouse->ps2dev.serio->dev,
> +				"Unable to enable MSID6 mode.\n");
> +			return -1;
>  		}
>  		psmouse->pktsize = 4;
>  		break;
> +
>  	default:
> -		printk(KERN_ERR "Unknown number of buttons.\n");
> +		dev_err(&psmouse->ps2dev.serio->dev,
> +			"Unknown number of buttons.\n");
>  		break;
>  	}
> +
>  	/*
>  	 * enable OPC tags such that driver can tell the difference between
>  	 * on-pad and real button click
> @@ -504,26 +463,24 @@ fsp_set_packet_format(struct psmouse *psmouse)
>  /*
>   * return 0 if the pad is placed in 180 degree
>   */
> -int
> -fsp_get_degree(struct psmouse *psmouse)
> +static int fsp_get_degree(struct psmouse *psmouse)
>  {
>  	int	degree;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS1, &degree))
> -		return (-1);
> -	else
> -		return (degree & FSP_BIT_NO_ROTATION) ? 1 : 0;
> +		return -1;
> +
> +	return (degree & FSP_BIT_NO_ROTATION) ? 1 : 0;
>  }
> 
> -static int
> -fsp_onpad_vscr(struct psmouse *psmouse, int enable)
> +static int fsp_onpad_vscr(struct psmouse *psmouse, int enable)
>  {
>  	struct fsp_data		*ad = psmouse->private;
>  	struct fsp_hw_state	*state = &ad->hw_state;
>  	int			val;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_ONPAD_CTL, &val))
> -		return (-1);
> +		return -1;
>
>  	state->onpad_vscroll = (enable == 0) ? 0 : 1;
> 
> @@ -533,23 +490,22 @@ fsp_onpad_vscr(struct psmouse *psmouse, int enable)
>  		val &= (0xff ^ FSP_BIT_FIX_VSCR);
>
>  	if (fsp_reg_write(psmouse, FSP_REG_ONPAD_CTL, val))
> -		return (-1);
> +		return -1;
> 
> -	return (0);
> +	return 0;
>  }
> 
> -static int
> -fsp_onpad_hscr(struct psmouse *psmouse, int enable)
> +static int fsp_onpad_hscr(struct psmouse *psmouse, int enable)
>  {
>  	struct fsp_data		*ad = psmouse->private;
>  	struct fsp_hw_state	*state = &ad->hw_state;
>  	int			val, v2;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_ONPAD_CTL, &val))
> -		return (-1);
> +		return -1;
>
>  	if (fsp_reg_read(psmouse, FSP_REG_SYSCTL5, &v2))
> -		return (-1);
> +		return -1;
>
>  	state->onpad_hscroll = (enable == 0) ? 0 : 1;
> 
> @@ -562,17 +518,16 @@ fsp_onpad_hscr(struct psmouse *psmouse, int enable)
>  	}
>
>  	if (fsp_reg_write(psmouse, FSP_REG_ONPAD_CTL, val))
> -		return (-1);
> +		return -1;
>
>  	/* reconfigure horizontal scrolling packet output */
>  	if (fsp_reg_write(psmouse, FSP_REG_SYSCTL5, v2))
> -		return (-1);
> +		return -1;
> 
> -	return (0);
> +	return 0;
>  }
> 
> -static int
> -fsp_onpad_icon(struct psmouse *psmouse, int enable)
> +static int fsp_onpad_icon(struct psmouse *psmouse, int enable)
>  {
>  	struct fsp_data		*ad = psmouse->private;
>  	struct fsp_hw_state	*state = &ad->hw_state;
> @@ -583,7 +538,7 @@ fsp_onpad_icon(struct psmouse *psmouse, int enable)
>  	fsp_reg_read(psmouse, FSP_REG_PAGE_CTRL, &val);
>  	val |= 0x01;
>  	if (fsp_reg_write(psmouse, FSP_REG_PAGE_CTRL, val))
> -		return (-1);
> +		return -1;
>
>  	fsp_reg_write_enable(psmouse, 1);
>  	/* set position of icon switch button */
> @@ -603,13 +558,13 @@ fsp_onpad_icon(struct psmouse *psmouse, int enable)
>  		val = -1;
>  	fsp_reg_write_enable(psmouse, 0);
>  	if (val == -1)
> -		return (-1);
> +		return -1;
>
>  	/* switch back to register page 0 */
>  	fsp_reg_read(psmouse, FSP_REG_PAGE_CTRL, &val);
>  	val &= ~0x01;
>  	if (fsp_reg_write(psmouse, FSP_REG_PAGE_CTRL, val))
> -		return (-1);
> +		return -1;
>  #endif
>  	/* enable icon switch button and absolute packet */
>  	fsp_reg_read(psmouse, FSP_REG_SYSCTL5, &val);
> @@ -625,9 +580,9 @@ fsp_onpad_icon(struct psmouse *psmouse, int enable)
>  	}
>
>  	if (fsp_reg_write(psmouse, FSP_REG_SYSCTL5, val))
> -		return (-1);
> +		return -1;
> 
> -	return (0);
> +	return 0;
>  }
>
>  /*
> @@ -635,13 +590,12 @@ fsp_onpad_icon(struct psmouse *psmouse, int enable)
>   * in specified width; therefore, we ended up with rolling our own version
>   * of HEX string to integer helper.
>   */
> -static int
> -hexstr2int(const char *str, int width)
> +static int hexstr2int(const char *str, int width)
>  {
>  	int	i, val, res = 0;
>
>  	if (width > sizeof(int))
> -		return (res);
> +		return res;
>
>  	for (i = 0; i < width; i++) {
>  		const char	*ptr = &str[i];
> @@ -667,12 +621,11 @@ psmouse_attr_show_setreg(struct psmouse *psmouse, void *data, char *buf)
>   *
>   * ex: abcdc00d -- write 0xcd to register 0xab and 0x0d to 0xc0
>   */
> -static ssize_t
> -psmouse_attr_set_setreg(struct psmouse *psmouse, void *data,
> -				const char *buf, size_t count)
> +static ssize_t psmouse_attr_set_setreg(struct psmouse *psmouse, void *data,
> +					const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> -	int		i, len, val;
> +	int i, len, val;
>
>  	if ((count % 4) != 0)
>  		return (-EINVAL);
> @@ -688,14 +641,14 @@ psmouse_attr_set_setreg(struct psmouse *psmouse, void *data,
>  	ad->init_params_len = len;
>  	fsp_batch_write_reg(psmouse, ad->init_params, len);
> 
> -	return (count);
> +	return count;
>  }
>
>  PSMOUSE_DEFINE_ATTR(setreg, S_IWUSR | S_IRUGO, NULL,
>  	psmouse_attr_show_setreg, psmouse_attr_set_setreg);
> 
> -static ssize_t
> -psmouse_attr_show_getreg(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_getreg(struct psmouse *psmouse,
> +					void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> 
> @@ -708,9 +661,8 @@ psmouse_attr_show_getreg(struct psmouse *psmouse, void *data, char *buf)
>   *
>   * ex: ab -- read content from register 0xab
>   */
> -static ssize_t
> -psmouse_attr_set_getreg(struct psmouse *psmouse, void *data, const char *buf,
> -				size_t count)
> +static ssize_t psmouse_attr_set_getreg(struct psmouse *psmouse, void *data,
> +					const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>  	int		reg, val;
> @@ -731,88 +683,84 @@ psmouse_attr_set_getreg(struct psmouse *psmouse, void *data, const char *buf,
>  PSMOUSE_DEFINE_ATTR(getreg, S_IWUSR | S_IRUGO, NULL,
>  	psmouse_attr_show_getreg, psmouse_attr_set_getreg);
> 
> -static ssize_t
> -psmouse_attr_show_pagereg(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_pagereg(struct psmouse *psmouse,
> +					 void *data, char *buf)
>  {
> -	int	val;
> +	int val;
>
>  	buf[0] = 0;
>
>  	if (fsp_page_reg_read(psmouse, &val))
> -		return (-ENODEV);
> +		return -ENODEV;
>
>  	return sprintf(buf, "%02x\n", val);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_pagereg(struct psmouse *psmouse, void *data, const char *buf,
> -				size_t count)
> +static ssize_t psmouse_attr_set_pagereg(struct psmouse *psmouse, void *data,
> +					const char *buf, size_t count)
>  {
> -	int	val;
> +	int val;
>
>  	if (count != 2)
> -		return (-EINVAL);
> +		return -EINVAL;
>
>  	val = hexstr2int(buf, 2);
>
>  	if (fsp_page_reg_write(psmouse, val))
> -		return (-ENODEV);
> +		return -ENODEV;
> 
> -	return (count);
> +	return count;
>  }
>
>  PSMOUSE_DEFINE_ATTR(page, S_IWUSR | S_IRUGO, NULL,
>  	psmouse_attr_show_pagereg, psmouse_attr_set_pagereg);
> 
> -static ssize_t
> -psmouse_attr_show_ps2(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_ps2(struct psmouse *psmouse,
> +					void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> -	char		tmp[2];
> -	int		i, len;
> +	char tmp[2];
> +	int i, len;
>
>  	for (i = len = 0; i < ad->resp_cnt; i++) {
>  		len += sprintf(tmp, "%02x", ad->resp[i]);
>  		strcat(buf, tmp);
>  	}
>  	strcat(buf, "\n");
> -	return (len + 1);
> +	return len + 1;
>  }
> 
> -static ssize_t
> -psmouse_attr_set_ps2(struct psmouse *psmouse, void *data, const char *buf,
> -			size_t count)
> +static ssize_t psmouse_attr_set_ps2(struct psmouse *psmouse, void *data,
> +					const char *buf, size_t count)
>  {
> -	struct fsp_data	*ad = psmouse->private;
> -	struct ps2dev	*ps2dev = &psmouse->ps2dev;
> -	int		v;
> +	struct fsp_data *ad = psmouse->private;
> +	struct ps2dev *ps2dev = &psmouse->ps2dev;
> +	int v;
>
>  	if (count != 4)
> -		return (-EINVAL);
> +		return -EINVAL;
>
>  	v = hexstr2int(buf, 4);
> 
> -	if (ps2_command(ps2dev, ad->resp, v) != -1) {
> +	if (ps2_command(ps2dev, ad->resp, v) != -1)
>  		ad->resp_cnt = (v >> 8) & (FSP_RESP_PKT_MAXLEN - 1);
> -	} else {
> +	else
>  		ad->resp_cnt = 0;
> -	}
> -	return (count);
> +
> +	return count;
>  }
>
>  PSMOUSE_DEFINE_ATTR(ps2, S_IWUSR | S_IRUGO, NULL,
>  	psmouse_attr_show_ps2, psmouse_attr_set_ps2);
> 
> -static ssize_t
> -psmouse_attr_show_vscroll(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_vscroll(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>
>  	return sprintf(buf, "%d\n", ad->hw_state.onpad_vscroll ? 1 : 0);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_vscroll(struct psmouse *psmouse, void *data, const char *buf,
> +static ssize_t psmouse_attr_set_vscroll(struct psmouse *psmouse, void *data, const char *buf,
>  				size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -821,28 +769,26 @@ psmouse_attr_set_vscroll(struct psmouse *psmouse, void *data, const char *buf,
>
>  	val = simple_strtoul(buf, &rest, 10);
> 
> -	if (*rest || (val > 1))
> -		return (-EINVAL);
> +	if (*rest || val > 1)
> +		return -EINVAL;
>
>  	ad->hw_state.onpad_vscroll = val;
>  	fsp_onpad_vscr(psmouse, val);
> 
> -	return (count);
> +	return count;
>  }
>
>  PSMOUSE_DEFINE_ATTR(vscroll, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_vscroll, psmouse_attr_set_vscroll);
> 
> -static ssize_t
> -psmouse_attr_show_hscroll(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_hscroll(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>
>  	return sprintf(buf, "%d\n", ad->hw_state.onpad_hscroll ? 1 : 0);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_hscroll(struct psmouse *psmouse, void *data, const char *buf,
> +static ssize_t psmouse_attr_set_hscroll(struct psmouse *psmouse, void *data, const char *buf,
>  				size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -863,16 +809,14 @@ psmouse_attr_set_hscroll(struct psmouse *psmouse, void *data, const char *buf,
>  PSMOUSE_DEFINE_ATTR(hscroll, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_hscroll, psmouse_attr_set_hscroll);
> 
> -static ssize_t
> -psmouse_attr_show_onpadicon(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_onpadicon(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>
>  	return sprintf(buf, "%d\n", ad->hw_state.onpad_icon ? 1 : 0);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_onpadicon(struct psmouse *psmouse, void *data,
> +static ssize_t psmouse_attr_set_onpadicon(struct psmouse *psmouse, void *data,
>  				const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -893,16 +837,14 @@ psmouse_attr_set_onpadicon(struct psmouse *psmouse, void *data,
>  PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_onpadicon, psmouse_attr_set_onpadicon);
> 
> -static ssize_t
> -psmouse_attr_show_pktfmt(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_pktfmt(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
>
>  	return sprintf(buf, "%d\n", ad->hw_state.pkt_fmt);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_pktfmt(struct psmouse *psmouse, void *data,
> +static ssize_t psmouse_attr_set_pktfmt(struct psmouse *psmouse, void *data,
>  				const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -923,8 +865,7 @@ psmouse_attr_set_pktfmt(struct psmouse *psmouse, void *data,
>  PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_pktfmt, psmouse_attr_set_pktfmt);
> 
> -static ssize_t
> -psmouse_attr_show_flags(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_flags(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> 
> @@ -937,8 +878,7 @@ psmouse_attr_show_flags(struct psmouse *psmouse, void *data, char *buf)
>  		ad->flags & FSPDRV_FLAG_EN_OPC ? 'C' : 'c');
>  }
> 
> -static ssize_t
> -psmouse_attr_set_flags(struct psmouse *psmouse, void *data,
> +static ssize_t psmouse_attr_set_flags(struct psmouse *psmouse, void *data,
>  				const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -1004,35 +944,16 @@ psmouse_attr_set_flags(struct psmouse *psmouse, void *data,
>  			fsp_set_packet_format(psmouse);
>  			break;
>  		default:
> -			return (-EINVAL);
> +			return -EINVAL;
>  		}
>  	}
> -	return (count);
> +	return count;
>  }
>
>  PSMOUSE_DEFINE_ATTR(flags, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_flags, psmouse_attr_set_flags);
> 
> -static ssize_t
> -psmouse_attr_show_ver(struct psmouse *psmouse, void *data, char *buf)
> -{
> -	return sprintf(buf, "Sentelic FSP kernel module %d.%d.%d\n",
> -		fsp_drv_ver[0], fsp_drv_ver[1], fsp_drv_ver[2]);
> -}
> -
> -static ssize_t
> -psmouse_attr_set_ver(struct psmouse *psmouse, void *data,
> -				const char *buf, size_t count)
> -{
> -	/* do nothing */
> -	return (count);
> -}
> -
> -PSMOUSE_DEFINE_ATTR(ver, S_IRUSR | S_IRUGO, NULL,
> -	psmouse_attr_show_ver, psmouse_attr_set_ver);
> -
> -static ssize_t
> -psmouse_attr_show_accel(struct psmouse *psmouse, void *data, char *buf)
> +static ssize_t psmouse_attr_show_accel(struct psmouse *psmouse, void *data, char *buf)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> 
> @@ -1040,8 +961,7 @@ psmouse_attr_show_accel(struct psmouse *psmouse, void *data, char *buf)
>  		ad->accel_num, ad->accel_denom, ad->accel_threshold);
>  }
> 
> -static ssize_t
> -psmouse_attr_set_accel(struct psmouse *psmouse, void *data,
> +static ssize_t psmouse_attr_set_accel(struct psmouse *psmouse, void *data,
>  				const char *buf, size_t count)
>  {
>  	struct fsp_data	*ad = psmouse->private;
> @@ -1066,167 +986,98 @@ psmouse_attr_set_accel(struct psmouse *psmouse, void *data,
>  PSMOUSE_DEFINE_ATTR(accel, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
>  	psmouse_attr_show_accel, psmouse_attr_set_accel);
> 
> -int
> -fsp_reset(struct psmouse *psmouse)
> +int fsp_reset(struct psmouse *psmouse)
>  {
>  	/* TODO: reset initial parameters */
> -	return (0);
> +	return 0;
>  }
> 
> -static int
> -fsp_reconnect(struct psmouse *psmouse)
> +static int fsp_reconnect(struct psmouse *psmouse)
>  {
> -	int		version;
> +	int version;
>
>  	if (fsp_detect(psmouse, 0) < 0)
> -		return (-1);
> +		return -1;
>
>  	if ((version = fsp_get_version(psmouse)) < 0)
> -		return (-1);
> +		return -1;
>
>  	fsp_reset(psmouse);
> 
> -	return (0);
> -}
> -
> -static void
> -fsp_remove_sysfs(struct psmouse *psmouse)
> -{
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_setreg.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_getreg.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_page.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_ps2.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_vscroll.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_hscroll.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_onpadicon.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_pktfmt.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_flags.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_ver.dattr);
> -	device_remove_file(&psmouse->ps2dev.serio->dev,
> -				&psmouse_attr_accel.dattr);
> +	return 0;
>  }
> 
> -static void
> -fsp_disconnect(struct psmouse *psmouse)
> +static struct attribute *fsp_attributes[] = {
> +	&psmouse_attr_setreg.dattr.attr,
> +	&psmouse_attr_getreg.dattr.attr,
> +	&psmouse_attr_page.dattr.attr,
> +	&psmouse_attr_ps2.dattr.attr,
> +	&psmouse_attr_vscroll.dattr.attr,
> +	&psmouse_attr_hscroll.dattr.attr,
> +	&psmouse_attr_accel.dattr.attr,
> +	NULL
> +};
> +
> +static struct attribute_group fsp_attribute_group = {
> +	.attrs	= fsp_attributes,
> +};
> +
> +static void fsp_disconnect(struct psmouse *psmouse)
>  {
> -	fsp_remove_sysfs(psmouse);
> +	sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj,
> +			   &fsp_attribute_group);
>  	fsp_opc_tag_enable(psmouse, 0);
>  	fsp_reset(psmouse);
>  	kfree(psmouse->private);
>  }
> 
> -int
> -fsp_detect(struct psmouse *psmouse, int set_properties)
> +int fsp_detect(struct psmouse *psmouse, int set_properties)
>  {
> -	int	rc;
> +	int	error;
>
>  	if (fsp_device_id(psmouse) != 0x01)
> -		return (-1);
> +		return -1;
>
>  	if (set_properties) {
>  		psmouse->vendor = "Sentelic";
>  		psmouse->name = "FingerSensingPad";
> 
> -		/*
> -		 * register sysfs callbacks for userland program to set
> -		 * initial parameters
> -		 */
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_setreg.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_getreg.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_page.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_ps2.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_vscroll.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_hscroll.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_onpadicon.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_pktfmt.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_flags.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_ver.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> -
> -		rc = device_create_file(&psmouse->ps2dev.serio->dev,
> -					&psmouse_attr_accel.dattr);
> -		if (rc)
> -			goto sysfs_creation_failed;
> +		error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj,
> +					   &fsp_attribute_group);
> +		if (error) {
> +			dev_err(&psmouse->ps2dev.serio->dev,
> +				"Failed to create sysfs attributes (%d)",
> +				error);
> +			return -1;
> +		}
>  	}
> -	return (0);
> -sysfs_creation_failed:
> -	fsp_remove_sysfs(psmouse);
> -	printk(KERN_ERR "failed to create sysfs node(%d)", rc);
> -	return (-1);
> +
> +	return 0;
>  }
> 
> -static void
> -fsp_set_input_params(struct psmouse *psmouse)
> +static void fsp_set_input_params(struct psmouse *psmouse)
>  {
>  	struct fsp_data		*ad = psmouse->private;
>  	struct fsp_hw_state	*state = &ad->hw_state;
>
>  	if (state->abs_pkt == 0) {
> -		set_bit(BTN_MIDDLE, psmouse->dev->keybit);
> -		set_bit(REL_WHEEL, psmouse->dev->relbit);
> -		set_bit(REL_HWHEEL, psmouse->dev->relbit);
> +		__set_bit(BTN_MIDDLE, psmouse->dev->keybit);
> +		__set_bit(REL_WHEEL, psmouse->dev->relbit);
> +		__set_bit(REL_HWHEEL, psmouse->dev->relbit);
> 
> -		set_bit(EV_REL, psmouse->dev->evbit);
> -		set_bit(REL_X, psmouse->dev->relbit);
> -		set_bit(REL_Y, psmouse->dev->relbit);
> +		__set_bit(EV_REL, psmouse->dev->evbit);
> +		__set_bit(REL_X, psmouse->dev->relbit);
> +		__set_bit(REL_Y, psmouse->dev->relbit);
> 
> -		set_bit(BTN_BACK, psmouse->dev->keybit);
> -		set_bit(BTN_FORWARD, psmouse->dev->keybit);
> +		__set_bit(BTN_BACK, psmouse->dev->keybit);
> +		__set_bit(BTN_FORWARD, psmouse->dev->keybit);
> 
> -		clear_bit(EV_ABS, psmouse->dev->evbit);
> -		clear_bit(BTN_SIDE, psmouse->dev->keybit);
> -		clear_bit(BTN_EXTRA, psmouse->dev->keybit);
> +		__clear_bit(EV_ABS, psmouse->dev->evbit);
> +		__clear_bit(BTN_SIDE, psmouse->dev->keybit);
> +		__clear_bit(BTN_EXTRA, psmouse->dev->keybit);
>  	} else {
>  		/* enable absolute packet mode */
> -		set_bit(EV_ABS, psmouse->dev->evbit);
> +		__set_bit(EV_ABS, psmouse->dev->evbit);
>
>  		input_set_abs_params(psmouse->dev, ABS_X,
>  			0, 1023, 0, 0);
> @@ -1240,12 +1091,7 @@ fsp_set_input_params(struct psmouse *psmouse)
>  	}
>  }
> 
> -static psmouse_ret_t
> -fsp_process_byte(struct psmouse *psmouse
> -#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
> -, struct pt_regs *regs
> -#endif
> -)
> +static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse)
>  {
>  	struct input_dev	*dev = psmouse->dev;
>  	struct fsp_data		*ad = psmouse->private;
> @@ -1259,17 +1105,7 @@ fsp_process_byte(struct psmouse *psmouse
>  	int			rel_x, rel_y;
>
>  	if (psmouse->pktcnt < 4)
> -		return (PSMOUSE_GOOD_DATA);
> -
> -	if (psmouse->ps2dev.flags != 0) {
> -		/*
> -		 * XXX need to find the root cause that makes commanding
> -		 * packet leaking to this function.
> -		 *
> -		 * Perhaps our own version of ps2_command() is out of date?
> -		 */
> -		return (PSMOUSE_GOOD_DATA);
> -	}
> +		return PSMOUSE_GOOD_DATA;
>
>  	/*
>  	 * Full packet accumulated, process it
> @@ -1290,6 +1126,7 @@ fsp_process_byte(struct psmouse *psmouse
>  			prev_abs_x = abs_x;
>  			prev_abs_y = abs_y;
>  		}
> +
>  		if (ad->flags & (FSPDRV_FLAG_OPICON_BTN | FSPDRV_FLAG_OPICON_KEY)) {
>  			/* do nothing */
>  		} else {
> @@ -1310,28 +1147,24 @@ fsp_process_byte(struct psmouse *psmouse
>  		input_report_abs(dev, ABS_X, prev_abs_x);
>  		input_report_abs(dev, ABS_Y, prev_abs_y);
>  		break;
> +
>  	case FSP_PKT_TYPE_NORMAL_OPC:
>  		/* on-pad click, filter it if necessary */
> -		if ((ad->flags & FSPDRV_FLAG_EN_OPC) != FSPDRV_FLAG_EN_OPC) {
> +		if ((ad->flags & FSPDRV_FLAG_EN_OPC) != FSPDRV_FLAG_EN_OPC)
>  			packet[0] &= ~BIT(0);
> -		}
>  		/* fall through */
>  	case FSP_PKT_TYPE_NORMAL:
>  		/* normal packet */
>  		/* special packet data translation from on-pad packets */
>  		if (packet[3] != 0) {
> -			if (packet[3] & BIT(0)) {
> +			if (packet[3] & BIT(0))
>  				button_status |= 0x01;	/* wheel down */
> -			}
> -			if (packet[3] & BIT(1)) {
> +			if (packet[3] & BIT(1))
>  				button_status |= 0x0f;	/* wheel up */
> -			}
> -			if (packet[3] & BIT(2)) {
> +			if (packet[3] & BIT(2))
>  				button_status |= BIT(5);/* horizontal left */
> -			}
> -			if (packet[3] & BIT(3)) {
> +			if (packet[3] & BIT(3))
>  				button_status |= BIT(4);/* horizontal right */
> -			}
>  			/* push back to packet queue */
>  			if (button_status != 0)
>  				packet[3] = button_status;
> @@ -1341,7 +1174,8 @@ fsp_process_byte(struct psmouse *psmouse
>  		/*
>  		 * Processing wheel up/down and extra button events
>  		 */
> -		input_report_rel(dev, REL_WHEEL, (int)(packet[3] & 8) - (int)(packet[3] & 7));
> +		input_report_rel(dev, REL_WHEEL,
> +				 (int)(packet[3] & 8) - (int)(packet[3] & 7));
>  		input_report_rel(dev, REL_HWHEEL, lscroll - rscroll);
>  		input_report_key(dev, BTN_BACK, lscroll);
>  		input_report_key(dev, BTN_FORWARD, rscroll);
> @@ -1357,12 +1191,10 @@ fsp_process_byte(struct psmouse *psmouse
>  		rel_x = packet[1] ? (int)packet[1] - (int)((packet[0] << 4) & 0x100) : 0;
>  		rel_y = packet[2] ? (int)((packet[0] << 3) & 0x100) - (int)packet[2] : 0;
> 
> -		if (abs(rel_x) > ad->accel_threshold) {
> +		if (abs(rel_x) > ad->accel_threshold)
>  			rel_x = rel_x * ad->accel_num / ad->accel_denom;
> -		}
> -		if (abs(rel_y) > ad->accel_threshold) {
> +		if (abs(rel_y) > ad->accel_threshold)
>  			rel_y = rel_y * ad->accel_num / ad->accel_denom;
> -		}
>  		input_report_rel(dev, REL_X, rel_x);
>  		input_report_rel(dev, REL_Y, rel_y);
>  		break;
> @@ -1381,20 +1213,20 @@ fsp_process_byte(struct psmouse *psmouse
>  		ps2_last_second = jiffies_msec;
>  	}
>  #endif
> -	return (PSMOUSE_FULL_PACKET);
> +	return PSMOUSE_FULL_PACKET;
>  }
> 
> -int
> -fsp_init(struct psmouse *psmouse)
> +int fsp_init(struct psmouse *psmouse)
>  {
>  	struct fsp_data	*priv;
> -	int		ver;
> +	int ver;
>
>  	if ((ver = fsp_get_version(psmouse)) < 0)
> -		return (-1);
> +		return -1;
> 
> -	if (!(priv = kzalloc(sizeof(struct fsp_data), GFP_KERNEL)))
> -		return (-ENOMEM);
> +	priv = kzalloc(sizeof(struct fsp_data), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
>
>  	psmouse->private = priv;
> 
> @@ -1424,7 +1256,8 @@ fsp_init(struct psmouse *psmouse)
>  	psmouse->reconnect = fsp_reconnect;
>
>  	/* report hardware information */
> -	printk(KERN_INFO "Finger Sensing Pad, hw: %d.%d.%d, sw: %d.%d.%d, buttons: %d\n",
> +	printk(KERN_INFO "Finger Sensing Pad, "
> +		"hw: %d.%d.%d, sw: %d.%d.%d, buttons: %d\n",
>  		(priv->ver >> 4), (priv->ver & 0x0F), priv->rev,
>  		fsp_drv_ver[0], fsp_drv_ver[1], fsp_drv_ver[2],
>  		priv->buttons & 7);
> @@ -1449,5 +1282,5 @@ fsp_init(struct psmouse *psmouse)
>  	/* set various supported input event bits */
>  	fsp_set_input_params(psmouse);
> 
> -	return (0);
> +	return 0;
>  }
> diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h
> index 8fcaa40..30dae3b 100644
> --- a/drivers/input/mouse/sentelic.h
> +++ b/drivers/input/mouse/sentelic.h
> @@ -17,18 +17,10 @@
>   *   You should have received a copy of the GNU General Public License
>   *   along with this program; if not, write to the Free Software
>   *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> - *
> - * $Id: sentelic.h 28700 2008-10-16 07:23:43Z avatar $
>   */
> 
> -#ifndef	__SENTELIC_H__
> -#define	__SENTELIC_H__
> -
> -#if	defined(__KERNEL__)
> -extern int fsp_detect(struct psmouse *psmouse, int set_properties);
> -extern int fsp_init(struct psmouse *psmouse);
> -extern int fsp_reset(struct psmouse *psmouse);
> -#endif
> +#ifndef	__SENTELIC_H
> +#define	__SENTELIC_H
>
>  /* Finger-sensing Pad information registers */
>  #define	FSP_REG_DEVICE_ID	0x00
> @@ -71,8 +63,7 @@ extern int fsp_reset(struct psmouse *psmouse);
>  #define	FSP_PKT_TYPE_NORMAL_OPC	(0x03)
>  #define	FSP_PKT_TYPE_SHIFT	(6)
> 
> -struct fsp_hw_state
> -{
> +struct fsp_hw_state {
>  	unsigned char	onpad_vscroll:1,/* On-pad vertical scroll zone */
>  			onpad_hscroll:1,/* On-pad horizontal scroll zone */
>  			onpad_icon:1,	/* On-pad icons */
> @@ -83,8 +74,7 @@ struct fsp_hw_state
>  	unsigned int	reg_val;	/* used by reg_write sysctl */
>  };
> 
> -struct fsp_data
> -{
> +struct fsp_data {
>  	unsigned int		flags;
>  #define FSPDRV_FLAG_CMD		(0x010)	/* The command bit of flags indicates the special FSP PS/2 command is sent. */
>  #define FSPDRV_FLAG_RESP	(0x020)	/* The response bit of flags indicates the special FSP PS/2 comamnd is sent and response is received. */
> @@ -95,8 +85,8 @@ struct fsp_data
>  #define	FSPDRV_FLAG_AUTO_SWITCH	(0x400)	/* software on-pad icon auto switch */
>  #define	FSPDRV_FLAG_EN_OPC	(0x800)	/* enable on-pad clicking */
>  #define FSP_RESP_PKT_MAXLEN	(8)	/* The max response packet size. */
> -	unsigned char 		cmd;	/* The buffer used to store the sending PS/2 command */
> -	unsigned char 		resp[FSP_RESP_PKT_MAXLEN]; /* The buffer used to store the response of PS/2 command */
> +	unsigned char		cmd;	/* The buffer used to store the sending PS/2 command */
> +	unsigned char		resp[FSP_RESP_PKT_MAXLEN]; /* The buffer used to store the response of PS/2 command */
>  	int			resp_cnt;	/* The command count in resp buffer */
>  	unsigned char		buttons;	/* Number of buttons */
>  	unsigned char		ver;		/* hardware version */
> @@ -133,4 +123,19 @@ struct fsp_data
>  	struct fsp_hw_state	hw_state;
>  };
> 
> -#endif	/* !__SENTELIC_H__ */
> +#ifdef CONFIG_MOUSE_PS2_SENTELIC
> +extern int fsp_detect(struct psmouse *psmouse, int set_properties);
> +extern int fsp_init(struct psmouse *psmouse);
> +/*extern int fsp_reset(struct psmouse *psmouse);*/
> +#else
> +inline int fsp_detect(struct psmouse *psmouse, int set_properties)
> +{
> +	return -ENOSYS;
> +}
> +inline int fsp_init(struct psmouse *psmouse)
> +{
> +	return -ENOSYS;
> +}
> +#endif
> +
> +#endif	/* __SENTELIC_H */
> diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c
> index 2b304c2..e6852b8 100644
> --- a/drivers/input/serio/libps2.c
> +++ b/drivers/input/serio/libps2.c
> @@ -161,7 +161,7 @@ static int ps2_adjust_timeout(struct ps2dev *ps2dev, int command, int timeout)
>   * ps2_command() can only be called from a process context
>   */
> 
> -int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
> +int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
>  {
>  	int timeout;
>  	int send = (command >> 12) & 0xf;
> @@ -179,8 +179,6 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
>  		return -1;
>  	}
> 
> -	mutex_lock(&ps2dev->cmd_mutex);
> -
>  	serio_pause_rx(ps2dev->serio);
>  	ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0;
>  	ps2dev->cmdcnt = receive;
> @@ -231,7 +229,18 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
>  	ps2dev->flags = 0;
>  	serio_continue_rx(ps2dev->serio);
> 
> +	return rc;
> +}
> +EXPORT_SYMBOL(__ps2_command);
> +
> +int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
> +{
> +	int rc;
> +
> +	mutex_lock(&ps2dev->cmd_mutex);
> +	rc = __ps2_command(ps2dev, param, command);
>  	mutex_unlock(&ps2dev->cmd_mutex);
> +
>  	return rc;
>  }
>  EXPORT_SYMBOL(ps2_command);
> diff --git a/include/linux/libps2.h b/include/linux/libps2.h
> index afc4133..06ef5d8 100644
> --- a/include/linux/libps2.h
> +++ b/include/linux/libps2.h
> @@ -42,6 +42,7 @@ struct ps2dev {
>  void ps2_init(struct ps2dev *ps2dev, struct serio *serio);
>  int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout);
>  void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout);
> +int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command);
>  int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command);
>  int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data);
>  int ps2_handle_response(struct ps2dev *ps2dev, unsigned char data);

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and integration (fwd)
  2009-05-08  5:30   ` [linux 2.6] new mouse driver looking for review and integration (fwd) Tai-hwa Liang
@ 2009-05-09  3:17     ` Dmitry Torokhov
  2009-05-13  9:56       ` Tai-hwa Liang
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Torokhov @ 2009-05-09  3:17 UTC (permalink / raw)
  To: Tai-hwa Liang; +Cc: linux-input

Hi Tai-hwa,

On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
> Hi, Dmitry,
>
>    I'm wondering about the status of the patch you submitted to git.  Will
> it being merged into 2.6.31?
>

I really need to get back to it. The weekend is coming up, I should have time 
to go over it, I shall respond by Monday.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and integration (fwd)
  2009-05-09  3:17     ` Dmitry Torokhov
@ 2009-05-13  9:56       ` Tai-hwa Liang
  2009-05-14  3:40         ` Dmitry Torokhov
  0 siblings, 1 reply; 8+ messages in thread
From: Tai-hwa Liang @ 2009-05-13  9:56 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

On Fri, 8 May 2009, Dmitry Torokhov wrote:
> Hi Tai-hwa,
> 
> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
> > Hi, Dmitry,
> >
> >    I'm wondering about the status of the patch you submitted to git.  Will
> > it being merged into 2.6.31?
> >
> 
> I really need to get back to it. The weekend is coming up, I should have time 
> to go over it, I shall respond by Monday.

   Thanks.  Where is the git repository I can use to retrieve the code you've
submitted?  I have a few changes for your patched code.

-- 
Cheers,

Tai-hwa Liang

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and integration (fwd)
  2009-05-13  9:56       ` Tai-hwa Liang
@ 2009-05-14  3:40         ` Dmitry Torokhov
  2009-05-14  8:05           ` Tai-hwa Liang
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Torokhov @ 2009-05-14  3:40 UTC (permalink / raw)
  To: Tai-hwa Liang; +Cc: linux-input

On Wed, May 13, 2009 at 05:56:39PM +0800, Tai-hwa Liang wrote:
> On Fri, 8 May 2009, Dmitry Torokhov wrote:
>> Hi Tai-hwa,
>>
>> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
>> > Hi, Dmitry,
>> >
>> >    I'm wondering about the status of the patch you submitted to git.  Will
>> > it being merged into 2.6.31?
>> >
>>
>> I really need to get back to it. The weekend is coming up, I should 
>> have time to go over it, I shall respond by Monday.
>
>   Thanks.  Where is the git repository I can use to retrieve the code you've
> submitted?  I have a few changes for your patched code.
>

I have created "sentelic" branch here:

	git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git

I fetched the latest version of the driver off the sourceforge page and
used it as the baseline.

The idea is to implement full absolute packet support and not rely on
relative packets because users will expect Synaptics X driver work with
this device as it works with all other touchpads (Synaptics, ALPS,
Elantec, BCM, appletouch).

BTW, I have a few questions regarding protocol:

What is 'arc', x1_g, x2_g, y1_g, y2_g in the absolute packet data?

Thanks!

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and  integration (fwd)
  2009-05-14  3:40         ` Dmitry Torokhov
@ 2009-05-14  8:05           ` Tai-hwa Liang
  2009-05-21  7:58             ` Tai-hwa Liang
  0 siblings, 1 reply; 8+ messages in thread
From: Tai-hwa Liang @ 2009-05-14  8:05 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

On Wed, 13 May 2009, Dmitry Torokhov wrote:
> On Wed, May 13, 2009 at 05:56:39PM +0800, Tai-hwa Liang wrote:
> > On Fri, 8 May 2009, Dmitry Torokhov wrote:
> >> Hi Tai-hwa,
> >>
> >> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
> >> > Hi, Dmitry,
> >> >
> >> >    I'm wondering about the status of the patch you submitted to git.  Will
> >> > it being merged into 2.6.31?
> >> >
> >>
> >> I really need to get back to it. The weekend is coming up, I should 
> >> have time to go over it, I shall respond by Monday.
> >
> >   Thanks.  Where is the git repository I can use to retrieve the code you've
> > submitted?  I have a few changes for your patched code.
> >
> 
> I have created "sentelic" branch here:
>
> 	git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
> 
> I fetched the latest version of the driver off the sourceforge page and
> used it as the baseline.

   Thank you.  I'm reading through the differences.  Looks good to me so far.

> The idea is to implement full absolute packet support and not rely on
> relative packets because users will expect Synaptics X driver work with
> this device as it works with all other touchpads (Synaptics, ALPS,
> Elantec, BCM, appletouch).

   I can understand that; however, absolute coordinates returned by
current FSP hardware isn't suitable for cursor movement, which makes
relative packet necessary if you want to have a functional hardware.

> BTW, I have a few questions regarding protocol:
> 
> What is 'arc', x1_g, x2_g, y1_g, y2_g in the absolute packet data?

   Those are obsoleted information which used to represent finger tracks.

-- 
Cheers,

Tai-hwa Liang

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and  integration (fwd)
  2009-05-14  8:05           ` Tai-hwa Liang
@ 2009-05-21  7:58             ` Tai-hwa Liang
  2009-06-04  2:16               ` Tai-hwa Liang
  2009-06-11  7:25               ` Tai-hwa Liang
  0 siblings, 2 replies; 8+ messages in thread
From: Tai-hwa Liang @ 2009-05-21  7:58 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

On Thu, 14 May 2009, Tai-hwa Liang wrote:
> On Wed, 13 May 2009, Dmitry Torokhov wrote:
>> On Wed, May 13, 2009 at 05:56:39PM +0800, Tai-hwa Liang wrote:
>> > On Fri, 8 May 2009, Dmitry Torokhov wrote:
>> >> Hi Tai-hwa,
>> >>
>> >> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
>> >> > Hi, Dmitry,
>> >> >
>> >> >    I'm wondering about the status of the patch you submitted to git. 
>> Will
>> >> > it being merged into 2.6.31?
>> >> >
>> >>
>> >> I really need to get back to it. The weekend is coming up, I should >> 
>> have time to go over it, I shall respond by Monday.
>> >
>> >   Thanks.  Where is the git repository I can use to retrieve the code 
>> you've
>> > submitted?  I have a few changes for your patched code.
>> >
>> 
>> I have created "sentelic" branch here:
>>
>> 	git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
>> 
>> I fetched the latest version of the driver off the sourceforge page and
>> used it as the baseline.
>
>  Thank you.  I'm reading through the differences.  Looks good to me so far.
>
>> The idea is to implement full absolute packet support and not rely on
>> relative packets because users will expect Synaptics X driver work with
>> this device as it works with all other touchpads (Synaptics, ALPS,
>> Elantec, BCM, appletouch).
>
>  I can understand that; however, absolute coordinates returned by
> current FSP hardware isn't suitable for cursor movement, which makes
> relative packet necessary if you want to have a functional hardware.
>
>> BTW, I have a few questions regarding protocol:
>> 
>> What is 'arc', x1_g, x2_g, y1_g, y2_g in the absolute packet data?
>
>  Those are obsoleted information which used to represent finger tracks.

Hi, Dmitry,

   Following are a few changes based on the sentelic branch you've created:

- Returning EIO instead of ENODEV when fsp_page_reg_read() failed;
- Reverting onpadicon and pktfmt sysfs node to world writable as userland
   application needs to write it without root privilege;
- Removing unused variables from fsp_hw_state.

Signed-off-by:	Tai-hwa Liang <avatar@sentelic.com>

diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c
index 5999378..d98c4d6 100644
--- a/drivers/input/mouse/sentelic.c
+++ b/drivers/input/mouse/sentelic.c
@@ -30,7 +30,7 @@
  #include "psmouse.h"
  #include "sentelic.h"

-/*
+/**
   * Timeout for FSP PS/2 command only (in milliseconds).
   */
  #define	FSP_CMD_TIMEOUT		200
@@ -615,7 +615,7 @@ static ssize_t fsp_attr_show_pagereg(struct psmouse *psmouse,
  	int val = 0;

  	if (fsp_page_reg_read(psmouse, &val))
-		return -ENODEV;
+		return -EIO;

  	return sprintf(buf, "%02x\n", val);
  }
@@ -712,7 +712,7 @@ static ssize_t fsp_attr_set_onpadicon(struct psmouse *psmouse, void *data,
  	return count;
  }

-PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO, NULL,
+PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
  			fsp_attr_show_onpadicon, fsp_attr_set_onpadicon);

  static ssize_t fsp_attr_show_pktfmt(struct psmouse *psmouse,
@@ -738,7 +738,7 @@ static ssize_t fsp_attr_set_pktfmt(struct psmouse *psmouse, void *data,
  	return count;
  }

-PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO, NULL,
+PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
  			fsp_attr_show_pktfmt, fsp_attr_set_pktfmt);

  static ssize_t fsp_attr_show_flags(struct psmouse *psmouse,
diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h
index 03d7ab8..9c00c19 100644
--- a/drivers/input/mouse/sentelic.h
+++ b/drivers/input/mouse/sentelic.h
@@ -83,9 +83,6 @@ struct fsp_data {
  #define	FSPDRV_FLAG_AUTO_SWITCH	(0x400)	/* software on-pad icon auto switch */
  #define	FSPDRV_FLAG_EN_OPC	(0x800)	/* enable on-pad clicking */
  #define FSP_RESP_PKT_MAXLEN	(8)	/* The max response packet size. */
-	unsigned char		cmd;	/* The buffer used to store the sending PS/2 command */
-	unsigned char		resp[FSP_RESP_PKT_MAXLEN]; /* The buffer used to store the response of PS/2 command */
-	int			resp_cnt;	/* The command count in resp buffer */
  	unsigned char		buttons;	/* Number of buttons */
  	unsigned char		ver;		/* hardware version */
  	unsigned char		rev;		/* hardware revison */

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and  integration (fwd)
  2009-05-21  7:58             ` Tai-hwa Liang
@ 2009-06-04  2:16               ` Tai-hwa Liang
  2009-06-11  7:25               ` Tai-hwa Liang
  1 sibling, 0 replies; 8+ messages in thread
From: Tai-hwa Liang @ 2009-06-04  2:16 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

Hi, Dmitry,

   Any status update on this one?

On Thu, 21 May 2009, Tai-hwa Liang wrote:
> On Thu, 14 May 2009, Tai-hwa Liang wrote:
>> On Wed, 13 May 2009, Dmitry Torokhov wrote:
>>> On Wed, May 13, 2009 at 05:56:39PM +0800, Tai-hwa Liang wrote:
>>> > On Fri, 8 May 2009, Dmitry Torokhov wrote:
>>> >> Hi Tai-hwa,
>>> >>
>>> >> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
>>> >> > Hi, Dmitry,
>>> >> >
>>> >> >    I'm wondering about the status of the patch you submitted to git. 
>>> Will
>>> >> > it being merged into 2.6.31?
>>> >> >
>>> >>
>>> >> I really need to get back to it. The weekend is coming up, I should >> 
>>> have time to go over it, I shall respond by Monday.
>>> >
>>> >   Thanks.  Where is the git repository I can use to retrieve the code 
>>> you've
>>> > submitted?  I have a few changes for your patched code.
>>> >
>>> 
>>> I have created "sentelic" branch here:
>>>
>>> 	git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
>>> 
>>> I fetched the latest version of the driver off the sourceforge page and
>>> used it as the baseline.
>>
>>  Thank you.  I'm reading through the differences.  Looks good to me so far.
>> 
>>> The idea is to implement full absolute packet support and not rely on
>>> relative packets because users will expect Synaptics X driver work with
>>> this device as it works with all other touchpads (Synaptics, ALPS,
>>> Elantec, BCM, appletouch).
>>
>>  I can understand that; however, absolute coordinates returned by
>> current FSP hardware isn't suitable for cursor movement, which makes
>> relative packet necessary if you want to have a functional hardware.
>> 
>>> BTW, I have a few questions regarding protocol:
>>> 
>>> What is 'arc', x1_g, x2_g, y1_g, y2_g in the absolute packet data?
>>
>>  Those are obsoleted information which used to represent finger tracks.
>
> Hi, Dmitry,
>
>  Following are a few changes based on the sentelic branch you've created:
>
> - Returning EIO instead of ENODEV when fsp_page_reg_read() failed;
> - Reverting onpadicon and pktfmt sysfs node to world writable as userland
>  application needs to write it without root privilege;
> - Removing unused variables from fsp_hw_state.
>
> Signed-off-by:	Tai-hwa Liang <avatar@sentelic.com>
>
> diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c
> index 5999378..d98c4d6 100644
> --- a/drivers/input/mouse/sentelic.c
> +++ b/drivers/input/mouse/sentelic.c
> @@ -30,7 +30,7 @@
> #include "psmouse.h"
> #include "sentelic.h"
>
> -/*
> +/**
>  * Timeout for FSP PS/2 command only (in milliseconds).
>  */
> #define	FSP_CMD_TIMEOUT		200
> @@ -615,7 +615,7 @@ static ssize_t fsp_attr_show_pagereg(struct psmouse 
> *psmouse,
> 	int val = 0;
>
> 	if (fsp_page_reg_read(psmouse, &val))
> -		return -ENODEV;
> +		return -EIO;
>
> 	return sprintf(buf, "%02x\n", val);
> }
> @@ -712,7 +712,7 @@ static ssize_t fsp_attr_set_onpadicon(struct psmouse 
> *psmouse, void *data,
> 	return count;
> }
>
> -PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO, NULL,
> +PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
> 			fsp_attr_show_onpadicon, fsp_attr_set_onpadicon);
>
> static ssize_t fsp_attr_show_pktfmt(struct psmouse *psmouse,
> @@ -738,7 +738,7 @@ static ssize_t fsp_attr_set_pktfmt(struct psmouse 
> *psmouse, void *data,
> 	return count;
> }
>
> -PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO, NULL,
> +PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
> 			fsp_attr_show_pktfmt, fsp_attr_set_pktfmt);
>
> static ssize_t fsp_attr_show_flags(struct psmouse *psmouse,
> diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h
> index 03d7ab8..9c00c19 100644
> --- a/drivers/input/mouse/sentelic.h
> +++ b/drivers/input/mouse/sentelic.h
> @@ -83,9 +83,6 @@ struct fsp_data {
> #define	FSPDRV_FLAG_AUTO_SWITCH	(0x400)	/* software on-pad icon auto 
> switch */
> #define	FSPDRV_FLAG_EN_OPC	(0x800)	/* enable on-pad clicking */
> #define FSP_RESP_PKT_MAXLEN	(8)	/* The max response packet size. */
> -	unsigned char		cmd;	/* The buffer used to store the 
> sending PS/2 command */
> -	unsigned char		resp[FSP_RESP_PKT_MAXLEN]; /* The buffer used 
> to store the response of PS/2 command */
> -	int			resp_cnt;	/* The command count in resp 
> buffer */
> 	unsigned char		buttons;	/* Number of buttons */
> 	unsigned char		ver;		/* hardware version */
> 	unsigned char		rev;		/* hardware revison */

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [linux 2.6] new mouse driver looking for review and  integration (fwd)
  2009-05-21  7:58             ` Tai-hwa Liang
  2009-06-04  2:16               ` Tai-hwa Liang
@ 2009-06-11  7:25               ` Tai-hwa Liang
  1 sibling, 0 replies; 8+ messages in thread
From: Tai-hwa Liang @ 2009-06-11  7:25 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

Hi, Dmitry,

   Any updates on this? Is it possible to get it into 2.6.31?

On Thu, 21 May 2009, Tai-hwa Liang wrote:
> On Thu, 14 May 2009, Tai-hwa Liang wrote:
>> On Wed, 13 May 2009, Dmitry Torokhov wrote:
>>> On Wed, May 13, 2009 at 05:56:39PM +0800, Tai-hwa Liang wrote:
>>> > On Fri, 8 May 2009, Dmitry Torokhov wrote:
>>> >> Hi Tai-hwa,
>>> >>
>>> >> On Thursday 07 May 2009 22:30:52 Tai-hwa Liang wrote:
>>> >> > Hi, Dmitry,
>>> >> >
>>> >> >    I'm wondering about the status of the patch you submitted to git. 
>>> Will
>>> >> > it being merged into 2.6.31?
>>> >> >
>>> >>
>>> >> I really need to get back to it. The weekend is coming up, I should >> 
>>> have time to go over it, I shall respond by Monday.
>>> >
>>> >   Thanks.  Where is the git repository I can use to retrieve the code 
>>> you've
>>> > submitted?  I have a few changes for your patched code.
>>> >
>>> 
>>> I have created "sentelic" branch here:
>>>
>>> 	git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
>>> 
>>> I fetched the latest version of the driver off the sourceforge page and
>>> used it as the baseline.
>>
>>  Thank you.  I'm reading through the differences.  Looks good to me so far.
>> 
>>> The idea is to implement full absolute packet support and not rely on
>>> relative packets because users will expect Synaptics X driver work with
>>> this device as it works with all other touchpads (Synaptics, ALPS,
>>> Elantec, BCM, appletouch).
>>
>>  I can understand that; however, absolute coordinates returned by
>> current FSP hardware isn't suitable for cursor movement, which makes
>> relative packet necessary if you want to have a functional hardware.
>> 
>>> BTW, I have a few questions regarding protocol:
>>> 
>>> What is 'arc', x1_g, x2_g, y1_g, y2_g in the absolute packet data?
>>
>>  Those are obsoleted information which used to represent finger tracks.
>
> Hi, Dmitry,
>
>  Following are a few changes based on the sentelic branch you've created:
>
> - Returning EIO instead of ENODEV when fsp_page_reg_read() failed;
> - Reverting onpadicon and pktfmt sysfs node to world writable as userland
>  application needs to write it without root privilege;
> - Removing unused variables from fsp_hw_state.
>
> Signed-off-by:	Tai-hwa Liang <avatar@sentelic.com>
>
> diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c
> index 5999378..d98c4d6 100644
> --- a/drivers/input/mouse/sentelic.c
> +++ b/drivers/input/mouse/sentelic.c
> @@ -30,7 +30,7 @@
> #include "psmouse.h"
> #include "sentelic.h"
>
> -/*
> +/**
>  * Timeout for FSP PS/2 command only (in milliseconds).
>  */
> #define	FSP_CMD_TIMEOUT		200
> @@ -615,7 +615,7 @@ static ssize_t fsp_attr_show_pagereg(struct psmouse 
> *psmouse,
> 	int val = 0;
>
> 	if (fsp_page_reg_read(psmouse, &val))
> -		return -ENODEV;
> +		return -EIO;
>
> 	return sprintf(buf, "%02x\n", val);
> }
> @@ -712,7 +712,7 @@ static ssize_t fsp_attr_set_onpadicon(struct psmouse 
> *psmouse, void *data,
> 	return count;
> }
>
> -PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO, NULL,
> +PSMOUSE_DEFINE_ATTR(onpadicon, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
> 			fsp_attr_show_onpadicon, fsp_attr_set_onpadicon);
>
> static ssize_t fsp_attr_show_pktfmt(struct psmouse *psmouse,
> @@ -738,7 +738,7 @@ static ssize_t fsp_attr_set_pktfmt(struct psmouse 
> *psmouse, void *data,
> 	return count;
> }
>
> -PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO, NULL,
> +PSMOUSE_DEFINE_ATTR(pktfmt, S_IWUSR | S_IRUGO | S_IWUGO, NULL,
> 			fsp_attr_show_pktfmt, fsp_attr_set_pktfmt);
>
> static ssize_t fsp_attr_show_flags(struct psmouse *psmouse,
> diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h
> index 03d7ab8..9c00c19 100644
> --- a/drivers/input/mouse/sentelic.h
> +++ b/drivers/input/mouse/sentelic.h
> @@ -83,9 +83,6 @@ struct fsp_data {
> #define	FSPDRV_FLAG_AUTO_SWITCH	(0x400)	/* software on-pad icon auto 
> switch */
> #define	FSPDRV_FLAG_EN_OPC	(0x800)	/* enable on-pad clicking */
> #define FSP_RESP_PKT_MAXLEN	(8)	/* The max response packet size. */
> -	unsigned char		cmd;	/* The buffer used to store the 
> sending PS/2 command */
> -	unsigned char		resp[FSP_RESP_PKT_MAXLEN]; /* The buffer used 
> to store the response of PS/2 command */
> -	int			resp_cnt;	/* The command count in resp 
> buffer */
> 	unsigned char		buttons;	/* Number of buttons */
> 	unsigned char		ver;		/* hardware version */
> 	unsigned char		rev;		/* hardware revison */

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-06-11  7:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <0810211135259.24686@cnaqrzbavhz.fragryvp.pbz>
     [not found] ` <20081030184450.GA18874@anvil.corenet.prv>
2009-05-08  5:30   ` [linux 2.6] new mouse driver looking for review and integration (fwd) Tai-hwa Liang
2009-05-09  3:17     ` Dmitry Torokhov
2009-05-13  9:56       ` Tai-hwa Liang
2009-05-14  3:40         ` Dmitry Torokhov
2009-05-14  8:05           ` Tai-hwa Liang
2009-05-21  7:58             ` Tai-hwa Liang
2009-06-04  2:16               ` Tai-hwa Liang
2009-06-11  7:25               ` Tai-hwa Liang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.