Re: [PATCH v3] Input: wacom_w8001 - add single-touch support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dmitry,

Any questions about this patch? I hope it can get in 2.6.39.

Thank you.

Ping

On Fri, Jan 7, 2011 at 10:54 AM, Ping Cheng <pinglinux@xxxxxxxxx> wrote:
> Emulate single-touch compatible events for the 2-finger panels
> so that they can be used with single-touch legacy clients.
>
> Assign device ids as Wacom USB vendor ID and product ID.
> Name the device to reflect its specific features.
>
> Scale touch cordinates to pen maximum if supported.
>
> Signed-off-by: Ping Cheng <pingc@xxxxxxxxx>
>
> ---
> Dmitry,
>
> I can not find the sourceforge inputattach project you mentioned.
> The options to attach Wacom serial devices can be add to the
> static struct input_types input_types[] in inputattach.c as the
> following:
>
> { "--wacom", Â Â Â Â Â Â"-wacom", Â Â Â "Wacom W8001-19200",
> Â Â Â ÂB19200, CS8,
> Â Â Â ÂSERIO_W8001, Â Â Â Â Â Â0x00, Â 0x00, Â 0, Â Â ÂNULL },
> { "--wacom-384", Â Â Â Â Â Â Â Â"-wacom-384", Â "Wacom W8001-38400",
> Â Â Â ÂB38400, CS8,
> Â Â Â ÂSERIO_W8001, Â Â Â Â Â Â0x00, Â 0x00, Â 0, Â Â ÂNULL },
> ---
> Âdrivers/input/touchscreen/wacom_w8001.c | Â165 ++++++++++++++++++++++++++-----
> Â1 files changed, 139 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c
> index 8ed53ad..144c4f3 100644
> --- a/drivers/input/touchscreen/wacom_w8001.c
> +++ b/drivers/input/touchscreen/wacom_w8001.c
> @@ -3,6 +3,7 @@
> Â*
> Â* Copyright (c) 2008 Jaya Kumar
> Â* Copyright (c) 2010 Red Hat, Inc.
> + * Copyright (c) 2010 - 2011 Ping Cheng, Wacom. <pingc@xxxxxxxxx>
> Â*
> Â* This file is subject to the terms and conditions of the GNU General Public
> Â* License. See the file COPYING in the main directory of this archive for
> @@ -64,11 +65,11 @@ struct w8001_coord {
>
> Â/* touch query reply packet */
> Âstruct w8001_touch_query {
> + Â Â Â u16 x;
> + Â Â Â u16 y;
> Â Â Â Âu8 panel_res;
> Â Â Â Âu8 capacity_res;
> Â Â Â Âu8 sensor_id;
> - Â Â Â u16 x;
> - Â Â Â u16 y;
> Â};
>
> Â/*
> @@ -87,9 +88,14 @@ struct w8001 {
> Â Â Â Âchar phys[32];
> Â Â Â Âint type;
> Â Â Â Âunsigned int pktlen;
> + Â Â Â u16 max_touch_x;
> + Â Â Â u16 max_touch_y;
> + Â Â Â u16 max_pen_x;
> + Â Â Â u16 max_pen_y;
> + Â Â Â char name[64];
> Â};
>
> -static void parse_data(u8 *data, struct w8001_coord *coord)
> +static void parse_pen_data(u8 *data, struct w8001_coord *coord)
> Â{
> Â Â Â Âmemset(coord, 0, sizeof(*coord));
>
> @@ -113,11 +119,19 @@ static void parse_data(u8 *data, struct w8001_coord *coord)
> Â Â Â Âcoord->tilt_y = data[8] & 0x7F;
> Â}
>
> -static void parse_touch(struct w8001 *w8001)
> +static void parse_single_touch(u8 *data, struct w8001_coord *coord)
> +{
> + Â Â Â coord->x = (data[1] << 7) | data[2];
> + Â Â Â coord->y = (data[3] << 7) | data[4];
> + Â Â Â coord->tsw = data[0] & 0x01;
> +}
> +
> +static void parse_multi_touch(struct w8001 *w8001)
> Â{
> Â Â Â Âstruct input_dev *dev = w8001->dev;
> Â Â Â Âunsigned char *data = w8001->data;
> Â Â Â Âint i;
> + Â Â Â int count = 0;
>
> Â Â Â Âfor (i = 0; i < 2; i++) {
> Â Â Â Â Â Â Â Âbool touch = data[0] & (1 << i);
> @@ -125,15 +139,33 @@ static void parse_touch(struct w8001 *w8001)
> Â Â Â Â Â Â Â Âinput_mt_slot(dev, i);
> Â Â Â Â Â Â Â Âinput_mt_report_slot_state(dev, MT_TOOL_FINGER, touch);
> Â Â Â Â Â Â Â Âif (touch) {
> - Â Â Â Â Â Â Â Â Â Â Â int x = (data[6 * i + 1] << 7) | (data[6 * i + 2]);
> - Â Â Â Â Â Â Â Â Â Â Â int y = (data[6 * i + 3] << 7) | (data[6 * i + 4]);
> + Â Â Â Â Â Â Â Â Â Â Â int x = (data[6 * i + 1] << 7) | data[6 * i + 2];
> + Â Â Â Â Â Â Â Â Â Â Â int y = (data[6 * i + 3] << 7) | data[6 * i + 4];
> Â Â Â Â Â Â Â Â Â Â Â Â/* data[5,6] and [11,12] is finger capacity */
>
> + Â Â Â Â Â Â Â Â Â Â Â /* scale to pen maximum */
> + Â Â Â Â Â Â Â Â Â Â Â if (w8001->max_pen_x && w8001->max_touch_x)
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â x = x * w8001->max_pen_x / w8001->max_touch_x;
> +
> + Â Â Â Â Â Â Â Â Â Â Â if (w8001->max_pen_y && w8001->max_touch_y)
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â y = y * w8001->max_pen_y / w8001->max_touch_y;
> +
> Â Â Â Â Â Â Â Â Â Â Â Âinput_report_abs(dev, ABS_MT_POSITION_X, x);
> Â Â Â Â Â Â Â Â Â Â Â Âinput_report_abs(dev, ABS_MT_POSITION_Y, y);
> + Â Â Â Â Â Â Â Â Â Â Â count++;
> Â Â Â Â Â Â Â Â}
> Â Â Â Â}
>
> + Â Â Â /* emulate single touch events when stylus is out of proximity.
> + Â Â Â Â* This is to make single touch backward support consistent
> + Â Â Â Â* across all Wacom single touch devices.
> + Â Â Â Â*/
> + Â Â Â if (w8001->type != BTN_TOOL_PEN &&
> + Â Â Â Â Â Â Â Â Â Â Â Â Â w8001->type != BTN_TOOL_RUBBER) {
> + Â Â Â Â Â Â Â w8001->type = count == 1 ? BTN_TOOL_FINGER : KEY_RESERVED;
> + Â Â Â Â Â Â Â input_mt_report_pointer_emulation(dev, true);
> + Â Â Â }
> +
> Â Â Â Âinput_sync(dev);
> Â}
>
> @@ -152,6 +184,15 @@ static void parse_touchquery(u8 *data, struct w8001_touch_query *query)
> Â Â Â Âquery->y = data[5] << 9;
> Â Â Â Âquery->y |= data[6] << 2;
> Â Â Â Âquery->y |= (data[2] >> 3) & 0x3;
> +
> + Â Â Â /* Early days' single-finger touch models need the following defaults */
> + Â Â Â if (!query->x && !query->y) {
> + Â Â Â Â Â Â Â query->x = 1024;
> + Â Â Â Â Â Â Â query->y = 1024;
> + Â Â Â Â Â Â Â if (query->panel_res)
> + Â Â Â Â Â Â Â Â Â Â Â query->x = query->y = (1 << query->panel_res);
> + Â Â Â Â Â Â Â query->panel_res = 10;
> + Â Â Â }
> Â}
>
> Âstatic void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
> @@ -161,16 +202,15 @@ static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
> Â Â Â Â/*
> Â Â Â Â * We have 1 bit for proximity (rdy) and 3 bits for tip, side,
> Â Â Â Â * side2/eraser. If rdy && f2 are set, this can be either pen + side2,
> - Â Â Â Â* or eraser. assume
> + Â Â Â Â* or eraser. Assume:
> Â Â Â Â * - if dev is already in proximity and f2 is toggled â pen + side2
> Â Â Â Â * - if dev comes into proximity with f2 set â eraser
> Â Â Â Â * If f2 disappears after assuming eraser, fake proximity out for
> Â Â Â Â * eraser and in for pen.
> Â Â Â Â */
>
> - Â Â Â if (!w8001->type) {
> - Â Â Â Â Â Â Â w8001->type = coord->f2 ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
> - Â Â Â } else if (w8001->type == BTN_TOOL_RUBBER) {
> + Â Â Â switch (w8001->type) {
> + Â Â Â case BTN_TOOL_RUBBER:
> Â Â Â Â Â Â Â Âif (!coord->f2) {
> Â Â Â Â Â Â Â Â Â Â Â Âinput_report_abs(dev, ABS_PRESSURE, 0);
> Â Â Â Â Â Â Â Â Â Â Â Âinput_report_key(dev, BTN_TOUCH, 0);
> @@ -180,8 +220,21 @@ static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
> Â Â Â Â Â Â Â Â Â Â Â Âinput_sync(dev);
> Â Â Â Â Â Â Â Â Â Â Â Âw8001->type = BTN_TOOL_PEN;
> Â Â Â Â Â Â Â Â}
> - Â Â Â } else {
> + Â Â Â Â Â Â Â break;
> +
> + Â Â Â case BTN_TOOL_FINGER:
> + Â Â Â Â Â Â Â input_report_key(dev, BTN_TOUCH, 0);
> + Â Â Â Â Â Â Â input_report_key(dev, BTN_TOOL_FINGER, 0);
> + Â Â Â Â Â Â Â input_sync(dev);
> + Â Â Â Â Â Â Â /* fall through */
> +
> + Â Â Â case KEY_RESERVED:
> + Â Â Â Â Â Â Â w8001->type = coord->f2 ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
> + Â Â Â Â Â Â Â break;
> +
> + Â Â Â default:
> Â Â Â Â Â Â Â Âinput_report_key(dev, BTN_STYLUS2, coord->f2);
> + Â Â Â Â Â Â Â break;
> Â Â Â Â}
>
> Â Â Â Âinput_report_abs(dev, ABS_X, coord->x);
> @@ -193,7 +246,30 @@ static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
> Â Â Â Âinput_sync(dev);
>
> Â Â Â Âif (!coord->rdy)
> - Â Â Â Â Â Â Â w8001->type = 0;
> + Â Â Â Â Â Â Â w8001->type = KEY_RESERVED;
> +}
> +
> +static void report_single_touch(struct w8001 *w8001, struct w8001_coord *coord)
> +{
> + Â Â Â struct input_dev *dev = w8001->dev;
> + Â Â Â unsigned int x = coord->x;
> + Â Â Â unsigned int y = coord->y;
> +
> + Â Â Â /* scale to pen maximum */
> + Â Â Â if (w8001->max_pen_x && w8001->max_touch_x)
> + Â Â Â Â Â Â Â x = x * w8001->max_pen_x / w8001->max_touch_x;
> +
> + Â Â Â if (w8001->max_pen_y && w8001->max_touch_y)
> + Â Â Â Â Â Â Â y = y * w8001->max_pen_y / w8001->max_touch_y;
> +
> + Â Â Â input_report_abs(dev, ABS_X, x);
> + Â Â Â input_report_abs(dev, ABS_Y, y);
> + Â Â Â input_report_key(dev, BTN_TOUCH, coord->tsw);
> + Â Â Â input_report_key(dev, BTN_TOOL_FINGER, coord->tsw);
> +
> + Â Â Â input_sync(dev);
> +
> + Â Â Â w8001->type = coord->tsw ? BTN_TOOL_FINGER : KEY_RESERVED;
> Â}
>
> Âstatic irqreturn_t w8001_interrupt(struct serio *serio,
> @@ -214,9 +290,18 @@ static irqreturn_t w8001_interrupt(struct serio *serio,
>
> Â Â Â Âcase W8001_PKTLEN_TOUCH93 - 1:
> Â Â Â Âcase W8001_PKTLEN_TOUCH9A - 1:
> - Â Â Â Â Â Â Â /* ignore one-finger touch packet. */
> - Â Â Â Â Â Â Â if (w8001->pktlen == w8001->idx)
> + Â Â Â Â Â Â Â tmp = w8001->data[0] & W8001_TOUCH_BYTE;
> + Â Â Â Â Â Â Â if (tmp != W8001_TOUCH_BYTE)
> + Â Â Â Â Â Â Â Â Â Â Â break;
> +
> + Â Â Â Â Â Â Â if (w8001->pktlen == w8001->idx) {
> Â Â Â Â Â Â Â Â Â Â Â Âw8001->idx = 0;
> + Â Â Â Â Â Â Â Â Â Â Â if (w8001->type != BTN_TOOL_PEN &&
> + Â Â Â Â Â Â Â Â Â Â Â Â Â w8001->type != BTN_TOOL_RUBBER) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â parse_single_touch(w8001->data, &coord);
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â report_single_touch(w8001, &coord);
> + Â Â Â Â Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â }
> Â Â Â Â Â Â Â Âbreak;
>
> Â Â Â Â/* Pen coordinates packet */
> @@ -225,18 +310,18 @@ static irqreturn_t w8001_interrupt(struct serio *serio,
> Â Â Â Â Â Â Â Âif (unlikely(tmp == W8001_TAB_BYTE))
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
>
> - Â Â Â Â Â Â Â tmp = (w8001->data[0] & W8001_TOUCH_BYTE);
> + Â Â Â Â Â Â Â tmp = w8001->data[0] & W8001_TOUCH_BYTE;
> Â Â Â Â Â Â Â Âif (tmp == W8001_TOUCH_BYTE)
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
>
> Â Â Â Â Â Â Â Âw8001->idx = 0;
> - Â Â Â Â Â Â Â parse_data(w8001->data, &coord);
> + Â Â Â Â Â Â Â parse_pen_data(w8001->data, &coord);
> Â Â Â Â Â Â Â Âreport_pen_events(w8001, &coord);
> Â Â Â Â Â Â Â Âbreak;
>
> Â Â Â Â/* control packet */
> Â Â Â Âcase W8001_PKTLEN_TPCCTL - 1:
> - Â Â Â Â Â Â Â tmp = (w8001->data[0] & W8001_TOUCH_MASK);
> + Â Â Â Â Â Â Â tmp = w8001->data[0] & W8001_TOUCH_MASK;
> Â Â Â Â Â Â Â Âif (tmp == W8001_TOUCH_BYTE)
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
>
> @@ -249,7 +334,7 @@ static irqreturn_t w8001_interrupt(struct serio *serio,
> Â Â Â Â/* 2 finger touch packet */
> Â Â Â Âcase W8001_PKTLEN_TOUCH2FG - 1:
> Â Â Â Â Â Â Â Âw8001->idx = 0;
> - Â Â Â Â Â Â Â parse_touch(w8001);
> + Â Â Â Â Â Â Â parse_multi_touch(w8001);
> Â Â Â Â Â Â Â Âbreak;
> Â Â Â Â}
>
> @@ -279,6 +364,7 @@ static int w8001_setup(struct w8001 *w8001)
> Â{
> Â Â Â Âstruct input_dev *dev = w8001->dev;
> Â Â Â Âstruct w8001_coord coord;
> + Â Â Â struct w8001_touch_query touch;
> Â Â Â Âint error;
>
> Â Â Â Âerror = w8001_command(w8001, W8001_CMD_STOP, false);
> @@ -287,14 +373,20 @@ static int w8001_setup(struct w8001 *w8001)
>
> Â Â Â Âmsleep(250); Â Â/* wait 250ms before querying the device */
>
> + Â Â Â strlcat(w8001->name, "Wacom Serial", sizeof(w8001->name));
> +
> Â Â Â Â/* penabled? */
> Â Â Â Âerror = w8001_command(w8001, W8001_CMD_QUERY, true);
> Â Â Â Âif (!error) {
> + Â Â Â Â Â Â Â __set_bit(BTN_TOUCH, dev->keybit);
> Â Â Â Â Â Â Â Â__set_bit(BTN_TOOL_PEN, dev->keybit);
> Â Â Â Â Â Â Â Â__set_bit(BTN_TOOL_RUBBER, dev->keybit);
> Â Â Â Â Â Â Â Â__set_bit(BTN_STYLUS, dev->keybit);
> Â Â Â Â Â Â Â Â__set_bit(BTN_STYLUS2, dev->keybit);
> - Â Â Â Â Â Â Â parse_data(w8001->response, &coord);
> +
> + Â Â Â Â Â Â Â parse_pen_data(w8001->response, &coord);
> + Â Â Â Â Â Â Â w8001->max_pen_x = coord.x;
> + Â Â Â Â Â Â Â w8001->max_pen_y = coord.y;
>
> Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_X, 0, coord.x, 0, 0);
> Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_Y, 0, coord.y, 0, 0);
> @@ -303,6 +395,8 @@ static int w8001_setup(struct w8001 *w8001)
> Â Â Â Â Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_TILT_X, 0, coord.tilt_x, 0, 0);
> Â Â Â Â Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_TILT_Y, 0, coord.tilt_y, 0, 0);
> Â Â Â Â Â Â Â Â}
> + Â Â Â Â Â Â Â w8001->id = 0x90;
> + Â Â Â Â Â Â Â strlcat(w8001->name, " Penabled", sizeof(w8001->name));
> Â Â Â Â}
>
> Â Â Â Â/* Touch enabled? */
> @@ -313,24 +407,38 @@ static int w8001_setup(struct w8001 *w8001)
> Â Â Â Â * second byte is empty, which indicates touch is not supported.
> Â Â Â Â */
> Â Â Â Âif (!error && w8001->response[1]) {
> - Â Â Â Â Â Â Â struct w8001_touch_query touch;
> + Â Â Â Â Â Â Â __set_bit(BTN_TOUCH, dev->keybit);
> + Â Â Â Â Â Â Â __set_bit(BTN_TOOL_FINGER, dev->keybit);
>
> Â Â Â Â Â Â Â Âparse_touchquery(w8001->response, &touch);
> + Â Â Â Â Â Â Â w8001->max_touch_x = touch.x;
> + Â Â Â Â Â Â Â w8001->max_touch_y = touch.y;
> +
> + Â Â Â Â Â Â Â /* scale to pen maximum */
> + Â Â Â Â Â Â Â if (w8001->max_pen_x && w8001->max_pen_y) {
> + Â Â Â Â Â Â Â Â Â Â Â touch.x = w8001->max_pen_x;
> + Â Â Â Â Â Â Â Â Â Â Â touch.y = w8001->max_pen_y;
> + Â Â Â Â Â Â Â }
>
> Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_X, 0, touch.x, 0, 0);
> Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_Y, 0, touch.y, 0, 0);
> - Â Â Â Â Â Â Â __set_bit(BTN_TOOL_FINGER, dev->keybit);
>
> Â Â Â Â Â Â Â Âswitch (touch.sensor_id) {
> Â Â Â Â Â Â Â Âcase 0:
> Â Â Â Â Â Â Â Âcase 2:
> Â Â Â Â Â Â Â Â Â Â Â Âw8001->pktlen = W8001_PKTLEN_TOUCH93;
> + Â Â Â Â Â Â Â Â Â Â Â w8001->id = 0x93;
> + Â Â Â Â Â Â Â Â Â Â Â strlcat(w8001->name, " 1FG", sizeof(w8001->name));
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> +
> Â Â Â Â Â Â Â Âcase 1:
> Â Â Â Â Â Â Â Âcase 3:
> Â Â Â Â Â Â Â Âcase 4:
> Â Â Â Â Â Â Â Â Â Â Â Âw8001->pktlen = W8001_PKTLEN_TOUCH9A;
> + Â Â Â Â Â Â Â Â Â Â Â strlcat(w8001->name, " 1FG", sizeof(w8001->name));
> + Â Â Â Â Â Â Â Â Â Â Â w8001->id = 0x9a;
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> +
> Â Â Â Â Â Â Â Âcase 5:
> Â Â Â Â Â Â Â Â Â Â Â Âw8001->pktlen = W8001_PKTLEN_TOUCH2FG;
>
> @@ -341,10 +449,17 @@ static int w8001_setup(struct w8001 *w8001)
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â0, touch.y, 0, 0);
> Â Â Â Â Â Â Â Â Â Â Â Âinput_set_abs_params(dev, ABS_MT_TOOL_TYPE,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â0, MT_TOOL_MAX, 0, 0);
> +
> + Â Â Â Â Â Â Â Â Â Â Â strlcat(w8001->name, " 2FG", sizeof(w8001->name));
> + Â Â Â Â Â Â Â Â Â Â Â if (w8001->max_pen_x && w8001->max_pen_y)
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â w8001->id = 0xE3;
> + Â Â Â Â Â Â Â Â Â Â Â else
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â w8001->id = 0xE2;
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> Â Â Â Â Â Â Â Â}
> Â Â Â Â}
>
> + Â Â Â strlcat(w8001->name, " Touchscreen", sizeof(w8001->name));
> Â Â Â Âreturn w8001_command(w8001, W8001_CMD_START, false);
> Â}
>
> @@ -384,21 +499,17 @@ static int w8001_connect(struct serio *serio, struct serio_driver *drv)
> Â Â Â Â}
>
> Â Â Â Âw8001->serio = serio;
> - Â Â Â w8001->id = serio->id.id;
> Â Â Â Âw8001->dev = input_dev;
> Â Â Â Âinit_completion(&w8001->cmd_done);
> Â Â Â Âsnprintf(w8001->phys, sizeof(w8001->phys), "%s/input0", serio->phys);
>
> - Â Â Â input_dev->name = "Wacom W8001 Penabled Serial TouchScreen";
> Â Â Â Âinput_dev->phys = w8001->phys;
> Â Â Â Âinput_dev->id.bustype = BUS_RS232;
> - Â Â Â input_dev->id.vendor = SERIO_W8001;
> - Â Â Â input_dev->id.product = w8001->id;
> + Â Â Â input_dev->id.vendor = 0x056a;
> Â Â Â Âinput_dev->id.version = 0x0100;
> Â Â Â Âinput_dev->dev.parent = &serio->dev;
>
> Â Â Â Âinput_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
> - Â Â Â __set_bit(BTN_TOUCH, input_dev->keybit);
>
> Â Â Â Âserio_set_drvdata(serio, w8001);
> Â Â Â Âerr = serio_open(serio, drv);
> @@ -409,6 +520,8 @@ static int w8001_connect(struct serio *serio, struct serio_driver *drv)
> Â Â Â Âif (err)
> Â Â Â Â Â Â Â Âgoto fail3;
>
> + Â Â Â input_dev->name = w8001->name;
> + Â Â Â input_dev->id.product = w8001->id;
> Â Â Â Âerr = input_register_device(w8001->dev);
> Â Â Â Âif (err)
> Â Â Â Â Â Â Â Âgoto fail3;
> --
> 1.7.3.4
>
>
ÿô.nlj·Ÿ®‰­†+%ŠË±é¥Šwÿº{.nlj·¥Š{±þ)éâ^n‡r¡öë¨è&£ûz¹Þúzf£¢·hšˆ§~†­†Ûÿÿïÿ‘ê_èæ+v‰¨þ)ßø

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux