* Re: [PATCH] drivers: input: mouse: Use "static inline" instead of "inline" in "lifebook.h"
From: Chen Gang @ 2014-11-09 10:49 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: linux-input, linux-kernel@vger.kernel.org, cmetcalf@tilera.com
In-Reply-To: <545F4602.10101@gmail.com>
After this patch, our tile can pass allmodconfig building. :-)
Thanks.
On 11/09/2014 06:46 PM, Chen Gang wrote:
> For inline function in header file, better to be "static inline", or may
> cause building break under the latest upstream gcc (although, probably,
> it should be the gcc's issue).
>
> The related error (with allmodconfig under tile):
>
> MODPOST 4002 modules
> ERROR: "lifebook_detect" [drivers/input/mouse/psmouse.ko] undefined!
>
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
> drivers/input/mouse/lifebook.h | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/input/mouse/lifebook.h b/drivers/input/mouse/lifebook.h
> index 4c4326c..0baf02a 100644
> --- a/drivers/input/mouse/lifebook.h
> +++ b/drivers/input/mouse/lifebook.h
> @@ -16,14 +16,14 @@ void lifebook_module_init(void);
> int lifebook_detect(struct psmouse *psmouse, bool set_properties);
> int lifebook_init(struct psmouse *psmouse);
> #else
> -inline void lifebook_module_init(void)
> +static inline void lifebook_module_init(void)
> {
> }
> -inline int lifebook_detect(struct psmouse *psmouse, bool set_properties)
> +static inline int lifebook_detect(struct psmouse *psmouse, bool set_properties)
> {
> return -ENOSYS;
> }
> -inline int lifebook_init(struct psmouse *psmouse)
> +static inline int lifebook_init(struct psmouse *psmouse)
> {
> return -ENOSYS;
> }
>
--
Chen Gang
Open share and attitude like air water and life which God blessed
^ permalink raw reply
* Help with input_report_key not reporting key
From: Jose Diez @ 2014-11-09 10:57 UTC (permalink / raw)
To: linux-input
Hello linux-input,
Sorry to post about a similar question again, but I'm still stuck. So a
bit of back story: I'm writing a custom HID driver which, among other
things, will register several input devices.
I'm able to read HID reports from the device using the raw_event
callback, and I'm able to communicate with the device, but I seem to
have hit an obstacle I can't get over. I've tried to add a proper input
device to the driver, and while it registers it properly and shows up in
/dev/input/*, the events seem to not go through.
I found this simple kernel module, which indeed works properly and
reports key events: http://sprunge.us/NLcD
I then adapted it to work with my kernel module, shown here:
http://sprunge.us/egIi
It allocates the input device in fblng_probe(), sets the KEY_A bit in
the keybit field, and registers it. Then, when a request comes to the
device, in fblng_event(), I (try to) send a key with input_report_key.
This doesn't seem to trigger a keypress.
I'm looking at the relevant /dev/input/eventX with `evtest`. I know I'm
getting events through, because I can see it in `dmesg`. However, it
doesn't actually go through to the input handler.
Any help, please?
Thanks a lot,
Jose
^ permalink raw reply
* Re: [PATCH v3 3/4] input: alps: For protocol V3, do not process data when last packet's bit7 is set
From: Pali Rohár @ 2014-11-09 11:22 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, Yunkang Tang, Tommy Will, linux-input,
linux-kernel
In-Reply-To: <20141109075039.GA34700@dtor-ws>
[-- Attachment #1.1: Type: Text/Plain, Size: 2381 bytes --]
On Sunday 09 November 2014 08:50:39 Dmitry Torokhov wrote:
> Hi Pali,
>
> On Sun, Nov 02, 2014 at 12:25:09AM +0100, Pali Rohár wrote:
> > Sometimes on Dell Latitude laptops psmouse/alps driver
> > receive invalid ALPS protocol V3 packets with bit7 set in
> > last byte. More often it can be reproduced on Dell Latitude
> > E6440 or E7440 with closed lid and pushing cover above
> > touchpad.
> >
> > If bit7 in last packet byte is set then it is not valid ALPS
> > packet. I was told that ALPS devices never send these
> > packets. It is not know yet who send those packets, it
> > could be Dell EC, bug in BIOS and also bug in touchpad
> > firmware...
> >
> > With this patch alps driver does not process those invalid
> > packets and drops it with PSMOUSE_FULL_PACKET so psmouse
> > driver does not enter to out of sync state.
> >
> > This patch fix problem when psmouse driver still resetting
> > ALPS device when laptop lid is closed because of receiving
> > invalid packets in out of sync state.
> >
> > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > Tested-by: Pali Rohár <pali.rohar@gmail.com>
> > Cc: stable@vger.kernel.org
> > ---
> >
> > drivers/input/mouse/alps.c | 10 ++++++++++
> > 1 file changed, 10 insertions(+)
> >
> > diff --git a/drivers/input/mouse/alps.c
> > b/drivers/input/mouse/alps.c index 7c47e97..e802d28 100644
> > --- a/drivers/input/mouse/alps.c
> > +++ b/drivers/input/mouse/alps.c
> > @@ -1181,6 +1181,16 @@ static psmouse_ret_t
> > alps_process_byte(struct psmouse *psmouse)
> >
> > return PSMOUSE_BAD_DATA;
> >
> > }
> >
> > + if (priv->proto_version == ALPS_PROTO_V3 &&
> > psmouse->pktcnt == psmouse->pktsize) { + // For protocol
> > V3, do not process data when last packet's bit7 is set
> > + if (psmouse->packet[psmouse->pktcnt - 1] & 0x80) {
> > + psmouse_dbg(psmouse, "v3 discard packet[%i] =
%x\n",
> > + psmouse->pktcnt - 1,
> > + psmouse->packet[psmouse->pktcnt - 1]);
> > + return PSMOUSE_FULL_PACKET;
> > + }
> > + }
>
> I wanted to apply it, but I would like some more data. Could
> you please send me the dmesg with i8042.debug wit this patch
> in place?
>
> Thanks!
See attachment. It contains debug log from both i8042.debug=1 and
psmouse.ko with applied all 4 patches.
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #1.2: alps-i8042-lid-patches.log --]
[-- Type: text/x-log, Size: 192889 bytes --]
[ 950.754275] i8042: [237297] 00 <- i8042 (interrupt, 1, 12)
[ 950.755303] i8042: [237297] 00 <- i8042 (interrupt, 1, 12)
[ 950.756406] i8042: [237298] 08 <- i8042 (interrupt, 1, 12)
[ 950.757314] i8042: [237298] 40 <- i8042 (interrupt, 1, 12)
[ 950.758340] i8042: [237298] 00 <- i8042 (interrupt, 1, 12)
[ 950.763480] i8042: [237299] cf <- i8042 (interrupt, 1, 12)
[ 950.764455] i8042: [237300] 00 <- i8042 (interrupt, 1, 12)
[ 950.765511] i8042: [237300] 00 <- i8042 (interrupt, 1, 12)
[ 950.766616] i8042: [237300] 08 <- i8042 (interrupt, 1, 12)
[ 950.767526] i8042: [237300] 00 <- i8042 (interrupt, 1, 12)
[ 950.768552] i8042: [237301] 00 <- i8042 (interrupt, 1, 12)
[ 950.773513] i8042: [237302] 8f <- i8042 (interrupt, 1, 12)
[ 950.774535] i8042: [237302] 00 <- i8042 (interrupt, 1, 12)
[ 950.775560] i8042: [237302] 00 <- i8042 (interrupt, 1, 12)
[ 950.776666] i8042: [237303] 08 <- i8042 (interrupt, 1, 12)
[ 950.777573] i8042: [237303] 40 <- i8042 (interrupt, 1, 12)
[ 950.778599] i8042: [237303] 00 <- i8042 (interrupt, 1, 12)
[ 950.783754] i8042: [237304] cf <- i8042 (interrupt, 1, 12)
[ 950.784779] i8042: [237305] 00 <- i8042 (interrupt, 1, 12)
[ 950.785805] i8042: [237305] 70 <- i8042 (interrupt, 1, 12)
[ 950.786910] i8042: [237305] 7f <- i8042 (interrupt, 1, 12)
[ 950.790897] i8042: [237306] 00 <- i8042 (interrupt, 1, 12)
[ 950.791138] i8042: [237306] ff <- i8042 (interrupt, 1, 12)
[ 950.791142] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.793936] i8042: [237307] 8f <- i8042 (interrupt, 1, 12)
[ 950.794962] i8042: [237307] 00 <- i8042 (interrupt, 1, 12)
[ 950.795988] i8042: [237307] 00 <- i8042 (interrupt, 1, 12)
[ 950.797095] i8042: [237308] 08 <- i8042 (interrupt, 1, 12)
[ 950.798004] i8042: [237308] 40 <- i8042 (interrupt, 1, 12)
[ 950.799031] i8042: [237308] 00 <- i8042 (interrupt, 1, 12)
[ 950.804070] i8042: [237309] cf <- i8042 (interrupt, 1, 12)
[ 950.805097] i8042: [237310] 00 <- i8042 (interrupt, 1, 12)
[ 950.806203] i8042: [237310] 70 <- i8042 (interrupt, 1, 12)
[ 950.807112] i8042: [237310] 7f <- i8042 (interrupt, 1, 12)
[ 950.808139] i8042: [237310] 00 <- i8042 (interrupt, 1, 12)
[ 950.809166] i8042: [237311] ff <- i8042 (interrupt, 1, 12)
[ 950.809169] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.814304] i8042: [237312] cf <- i8042 (interrupt, 1, 12)
[ 950.815330] i8042: [237312] 00 <- i8042 (interrupt, 1, 12)
[ 950.816438] i8042: [237313] 00 <- i8042 (interrupt, 1, 12)
[ 950.817346] i8042: [237313] 08 <- i8042 (interrupt, 1, 12)
[ 950.818374] i8042: [237313] 00 <- i8042 (interrupt, 1, 12)
[ 950.819400] i8042: [237313] 00 <- i8042 (interrupt, 1, 12)
[ 950.824440] i8042: [237315] cf <- i8042 (interrupt, 1, 12)
[ 950.825451] i8042: [237315] 00 <- i8042 (interrupt, 1, 12)
[ 950.826558] i8042: [237315] 00 <- i8042 (interrupt, 1, 12)
[ 950.827496] i8042: [237315] 08 <- i8042 (interrupt, 1, 12)
[ 950.828524] i8042: [237316] 00 <- i8042 (interrupt, 1, 12)
[ 950.829577] i8042: [237316] 00 <- i8042 (interrupt, 1, 12)
[ 950.834617] i8042: [237317] 8f <- i8042 (interrupt, 1, 12)
[ 950.835643] i8042: [237317] 00 <- i8042 (interrupt, 1, 12)
[ 950.836693] i8042: [237318] 00 <- i8042 (interrupt, 1, 12)
[ 950.837628] i8042: [237318] 08 <- i8042 (interrupt, 1, 12)
[ 950.838685] i8042: [237318] 40 <- i8042 (interrupt, 1, 12)
[ 950.839714] i8042: [237318] 00 <- i8042 (interrupt, 1, 12)
[ 950.844836] i8042: [237320] cf <- i8042 (interrupt, 1, 12)
[ 950.845861] i8042: [237320] 00 <- i8042 (interrupt, 1, 12)
[ 950.846967] i8042: [237320] 78 <- i8042 (interrupt, 1, 12)
[ 950.847876] i8042: [237320] 7f <- i8042 (interrupt, 1, 12)
[ 950.848904] i8042: [237321] 06 <- i8042 (interrupt, 1, 12)
[ 950.849930] i8042: [237321] ff <- i8042 (interrupt, 1, 12)
[ 950.849945] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.855003] i8042: [237322] 8f <- i8042 (interrupt, 1, 12)
[ 950.856027] i8042: [237322] 00 <- i8042 (interrupt, 1, 12)
[ 950.857133] i8042: [237323] 00 <- i8042 (interrupt, 1, 12)
[ 950.858044] i8042: [237323] 08 <- i8042 (interrupt, 1, 12)
[ 950.859071] i8042: [237323] 40 <- i8042 (interrupt, 1, 12)
[ 950.860098] i8042: [237323] 00 <- i8042 (interrupt, 1, 12)
[ 950.865135] i8042: [237325] cf <- i8042 (interrupt, 1, 12)
[ 950.866108] i8042: [237325] 00 <- i8042 (interrupt, 1, 12)
[ 950.867211] i8042: [237325] 78 <- i8042 (interrupt, 1, 12)
[ 950.868730] i8042: [237326] 7f <- i8042 (interrupt, 1, 12)
[ 950.869758] i8042: [237326] 06 <- i8042 (interrupt, 1, 12)
[ 950.870784] i8042: [237326] ff <- i8042 (interrupt, 1, 12)
[ 950.870791] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.875350] i8042: [237327] 8f <- i8042 (interrupt, 1, 12)
[ 950.876449] i8042: [237328] 00 <- i8042 (interrupt, 1, 12)
[ 950.877357] i8042: [237328] 00 <- i8042 (interrupt, 1, 12)
[ 950.878383] i8042: [237328] 08 <- i8042 (interrupt, 1, 12)
[ 950.879412] i8042: [237328] 40 <- i8042 (interrupt, 1, 12)
[ 950.880440] i8042: [237329] 00 <- i8042 (interrupt, 1, 12)
[ 950.885579] i8042: [237330] cf <- i8042 (interrupt, 1, 12)
[ 950.886684] i8042: [237330] 00 <- i8042 (interrupt, 1, 12)
[ 950.887594] i8042: [237330] 00 <- i8042 (interrupt, 1, 12)
[ 950.888621] i8042: [237331] 08 <- i8042 (interrupt, 1, 12)
[ 950.889647] i8042: [237331] 00 <- i8042 (interrupt, 1, 12)
[ 950.890674] i8042: [237331] 00 <- i8042 (interrupt, 1, 12)
[ 950.895716] i8042: [237332] 8f <- i8042 (interrupt, 1, 12)
[ 950.896823] i8042: [237333] 00 <- i8042 (interrupt, 1, 12)
[ 950.897729] i8042: [237333] 00 <- i8042 (interrupt, 1, 12)
[ 950.898756] i8042: [237333] 08 <- i8042 (interrupt, 1, 12)
[ 950.899744] i8042: [237333] 40 <- i8042 (interrupt, 1, 12)
[ 950.900810] i8042: [237334] 00 <- i8042 (interrupt, 1, 12)
[ 950.905848] i8042: [237335] cf <- i8042 (interrupt, 1, 12)
[ 950.906955] i8042: [237335] 04 <- i8042 (interrupt, 1, 12)
[ 950.907865] i8042: [237335] 78 <- i8042 (interrupt, 1, 12)
[ 950.908894] i8042: [237336] 7f <- i8042 (interrupt, 1, 12)
[ 950.910196] i8042: [237336] 06 <- i8042 (interrupt, 1, 12)
[ 950.910887] i8042: [237336] ff <- i8042 (interrupt, 1, 12)
[ 950.910893] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.916043] i8042: [237337] 8f <- i8042 (interrupt, 1, 12)
[ 950.917149] i8042: [237338] 00 <- i8042 (interrupt, 1, 12)
[ 950.918057] i8042: [237338] 00 <- i8042 (interrupt, 1, 12)
[ 950.919084] i8042: [237338] 08 <- i8042 (interrupt, 1, 12)
[ 950.920110] i8042: [237338] 40 <- i8042 (interrupt, 1, 12)
[ 950.921136] i8042: [237339] 00 <- i8042 (interrupt, 1, 12)
[ 950.926346] i8042: [237340] cf <- i8042 (interrupt, 1, 12)
[ 950.927253] i8042: [237340] 00 <- i8042 (interrupt, 1, 12)
[ 950.928279] i8042: [237340] 78 <- i8042 (interrupt, 1, 12)
[ 950.929307] i8042: [237341] 7f <- i8042 (interrupt, 1, 12)
[ 950.930332] i8042: [237341] 06 <- i8042 (interrupt, 1, 12)
[ 950.931359] i8042: [237341] ff <- i8042 (interrupt, 1, 12)
[ 950.931365] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.936480] i8042: [237343] 8f <- i8042 (interrupt, 1, 12)
[ 950.937503] i8042: [237343] 00 <- i8042 (interrupt, 1, 12)
[ 950.938529] i8042: [237343] 00 <- i8042 (interrupt, 1, 12)
[ 950.939529] i8042: [237343] 08 <- i8042 (interrupt, 1, 12)
[ 950.940524] i8042: [237344] 40 <- i8042 (interrupt, 1, 12)
[ 950.941580] i8042: [237344] 00 <- i8042 (interrupt, 1, 12)
[ 950.946729] i8042: [237345] cf <- i8042 (interrupt, 1, 12)
[ 950.947755] i8042: [237345] 00 <- i8042 (interrupt, 1, 12)
[ 950.948783] i8042: [237346] 78 <- i8042 (interrupt, 1, 12)
[ 950.949808] i8042: [237346] 7f <- i8042 (interrupt, 1, 12)
[ 950.950834] i8042: [237346] 06 <- i8042 (interrupt, 1, 12)
[ 950.951861] i8042: [237346] ff <- i8042 (interrupt, 1, 12)
[ 950.951867] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.956801] i8042: [237348] 8f <- i8042 (interrupt, 1, 12)
[ 950.957825] i8042: [237348] 00 <- i8042 (interrupt, 1, 12)
[ 950.958852] i8042: [237348] 00 <- i8042 (interrupt, 1, 12)
[ 950.959878] i8042: [237348] 08 <- i8042 (interrupt, 1, 12)
[ 950.960906] i8042: [237349] 40 <- i8042 (interrupt, 1, 12)
[ 950.961930] i8042: [237349] 00 <- i8042 (interrupt, 1, 12)
[ 950.966974] i8042: [237350] cf <- i8042 (interrupt, 1, 12)
[ 950.967999] i8042: [237350] 00 <- i8042 (interrupt, 1, 12)
[ 950.969026] i8042: [237351] 78 <- i8042 (interrupt, 1, 12)
[ 950.970052] i8042: [237351] 7f <- i8042 (interrupt, 1, 12)
[ 950.971078] i8042: [237351] 06 <- i8042 (interrupt, 1, 12)
[ 950.972107] i8042: [237351] ff <- i8042 (interrupt, 1, 12)
[ 950.972113] psmouse serio1: alps: v3 discard packet[5] = ff
[ 950.977225] i8042: [237353] cf <- i8042 (interrupt, 1, 12)
[ 950.978249] i8042: [237353] 00 <- i8042 (interrupt, 1, 12)
[ 950.979278] i8042: [237353] 00 <- i8042 (interrupt, 1, 12)
[ 950.980301] i8042: [237353] 08 <- i8042 (interrupt, 1, 12)
[ 950.981329] i8042: [237354] 00 <- i8042 (interrupt, 1, 12)
[ 950.982355] i8042: [237354] 00 <- i8042 (interrupt, 1, 12)
[ 950.987355] i8042: [237355] 8f <- i8042 (interrupt, 1, 12)
[ 950.988264] i8042: [237355] 00 <- i8042 (interrupt, 1, 12)
[ 950.989292] i8042: [237356] 00 <- i8042 (interrupt, 1, 12)
[ 950.990316] i8042: [237356] 08 <- i8042 (interrupt, 1, 12)
[ 950.991343] i8042: [237356] 40 <- i8042 (interrupt, 1, 12)
[ 950.992369] i8042: [237356] 00 <- i8042 (interrupt, 1, 12)
[ 950.997489] i8042: [237358] cf <- i8042 (interrupt, 1, 12)
[ 950.998513] i8042: [237358] 00 <- i8042 (interrupt, 1, 12)
[ 950.999538] i8042: [237358] 70 <- i8042 (interrupt, 1, 12)
[ 951.000524] i8042: [237359] 7f <- i8042 (interrupt, 1, 12)
[ 951.001592] i8042: [237359] 02 <- i8042 (interrupt, 1, 12)
[ 951.002618] i8042: [237359] ff <- i8042 (interrupt, 1, 12)
[ 951.002624] psmouse serio1: alps: v3 discard packet[5] = ff
[ 951.007672] i8042: [237360] 8f <- i8042 (interrupt, 1, 12)
[ 951.008684] i8042: [237361] 00 <- i8042 (interrupt, 1, 12)
[ 951.009726] i8042: [237361] 00 <- i8042 (interrupt, 1, 12)
[ 951.010752] i8042: [237361] 08 <- i8042 (interrupt, 1, 12)
[ 951.011779] i8042: [237361] 40 <- i8042 (interrupt, 1, 12)
[ 951.012805] i8042: [237362] 00 <- i8042 (interrupt, 1, 12)
[ 951.017765] i8042: [237363] cf <- i8042 (interrupt, 1, 12)
[ 951.018790] i8042: [237363] 00 <- i8042 (interrupt, 1, 12)
[ 951.019816] i8042: [237363] 70 <- i8042 (interrupt, 1, 12)
[ 951.020844] i8042: [237364] 7f <- i8042 (interrupt, 1, 12)
[ 951.021870] i8042: [237364] 02 <- i8042 (interrupt, 1, 12)
[ 951.022897] i8042: [237364] ff <- i8042 (interrupt, 1, 12)
[ 951.022904] psmouse serio1: alps: v3 discard packet[5] = ff
[ 951.027973] i8042: [237365] 8f <- i8042 (interrupt, 1, 12)
[ 951.028999] i8042: [237366] 00 <- i8042 (interrupt, 1, 12)
[ 951.030024] i8042: [237366] 00 <- i8042 (interrupt, 1, 12)
[ 951.031052] i8042: [237366] 08 <- i8042 (interrupt, 1, 12)
[ 951.032375] i8042: [237366] 40 <- i8042 (interrupt, 1, 12)
[ 951.033084] i8042: [237367] 00 <- i8042 (interrupt, 1, 12)
[ 951.038173] i8042: [237368] cf <- i8042 (interrupt, 1, 12)
[ 951.039232] i8042: [237368] 00 <- i8042 (interrupt, 1, 12)
[ 951.040258] i8042: [237368] 00 <- i8042 (interrupt, 1, 12)
[ 951.041290] i8042: [237369] 08 <- i8042 (interrupt, 1, 12)
[ 951.042297] i8042: [237369] 00 <- i8042 (interrupt, 1, 12)
[ 951.043327] i8042: [237369] 00 <- i8042 (interrupt, 1, 12)
[ 951.048283] i8042: [237370] cf <- i8042 (interrupt, 1, 12)
[ 951.049309] i8042: [237371] 00 <- i8042 (interrupt, 1, 12)
[ 951.050281] i8042: [237371] 00 <- i8042 (interrupt, 1, 12)
[ 951.051306] i8042: [237371] 08 <- i8042 (interrupt, 1, 12)
[ 951.052352] i8042: [237371] 00 <- i8042 (interrupt, 1, 12)
[ 951.053416] i8042: [237372] 00 <- i8042 (interrupt, 1, 12)
[ 951.058493] i8042: [237373] cf <- i8042 (interrupt, 1, 12)
[ 951.059519] i8042: [237373] 00 <- i8042 (interrupt, 1, 12)
[ 951.060562] i8042: [237374] 00 <- i8042 (interrupt, 1, 12)
[ 951.061555] i8042: [237374] 08 <- i8042 (interrupt, 1, 12)
[ 951.062581] i8042: [237374] 00 <- i8042 (interrupt, 1, 12)
[ 951.064163] i8042: [237374] 00 <- i8042 (interrupt, 1, 12)
[ 951.068657] i8042: [237376] cf <- i8042 (interrupt, 1, 12)
[ 951.069670] i8042: [237376] 00 <- i8042 (interrupt, 1, 12)
[ 951.070678] i8042: [237376] 00 <- i8042 (interrupt, 1, 12)
[ 951.071746] i8042: [237376] 08 <- i8042 (interrupt, 1, 12)
[ 951.072750] i8042: [237377] 00 <- i8042 (interrupt, 1, 12)
[ 951.073776] i8042: [237377] 00 <- i8042 (interrupt, 1, 12)
[ 951.078894] i8042: [237378] 8f <- i8042 (interrupt, 1, 12)
[ 951.079921] i8042: [237378] 00 <- i8042 (interrupt, 1, 12)
[ 951.080949] i8042: [237379] 00 <- i8042 (interrupt, 1, 12)
[ 951.081975] i8042: [237379] 08 <- i8042 (interrupt, 1, 12)
[ 951.083001] i8042: [237379] 00 <- i8042 (interrupt, 1, 12)
[ 951.084003] i8042: [237379] 00 <- i8042 (interrupt, 1, 12)
[ 951.089002] i8042: [237381] 8f <- i8042 (interrupt, 1, 12)
[ 951.090028] i8042: [237381] 00 <- i8042 (interrupt, 1, 12)
[ 951.091055] i8042: [237381] 00 <- i8042 (interrupt, 1, 12)
[ 951.092081] i8042: [237381] 08 <- i8042 (interrupt, 1, 12)
[ 951.093109] i8042: [237382] 00 <- i8042 (interrupt, 1, 12)
[ 951.094137] i8042: [237382] 00 <- i8042 (interrupt, 1, 12)
[ 951.099227] i8042: [237383] 8f <- i8042 (interrupt, 1, 12)
[ 951.100256] i8042: [237383] 00 <- i8042 (interrupt, 1, 12)
[ 951.101286] i8042: [237384] 00 <- i8042 (interrupt, 1, 12)
[ 951.102308] i8042: [237384] 08 <- i8042 (interrupt, 1, 12)
[ 951.103338] i8042: [237384] 00 <- i8042 (interrupt, 1, 12)
[ 951.104364] i8042: [237384] 00 <- i8042 (interrupt, 1, 12)
[ 951.109438] i8042: [237386] 8f <- i8042 (interrupt, 1, 12)
[ 951.110464] i8042: [237386] 00 <- i8042 (interrupt, 1, 12)
[ 951.111492] i8042: [237386] 00 <- i8042 (interrupt, 1, 12)
[ 951.112518] i8042: [237386] 08 <- i8042 (interrupt, 1, 12)
[ 951.113547] i8042: [237387] 00 <- i8042 (interrupt, 1, 12)
[ 951.114573] i8042: [237387] 00 <- i8042 (interrupt, 1, 12)
[ 951.119553] i8042: [237388] 8f <- i8042 (interrupt, 1, 12)
[ 951.120561] i8042: [237389] 00 <- i8042 (interrupt, 1, 12)
[ 951.121587] i8042: [237389] 00 <- i8042 (interrupt, 1, 12)
[ 951.122613] i8042: [237389] 08 <- i8042 (interrupt, 1, 12)
[ 951.123640] i8042: [237389] 00 <- i8042 (interrupt, 1, 12)
[ 951.124612] i8042: [237390] 00 <- i8042 (interrupt, 1, 12)
[ 951.129761] i8042: [237391] 8f <- i8042 (interrupt, 1, 12)
[ 951.130788] i8042: [237391] 00 <- i8042 (interrupt, 1, 12)
[ 951.131789] i8042: [237391] 00 <- i8042 (interrupt, 1, 12)
[ 951.132813] i8042: [237392] 08 <- i8042 (interrupt, 1, 12)
[ 951.133869] i8042: [237392] 00 <- i8042 (interrupt, 1, 12)
[ 951.134896] i8042: [237392] 00 <- i8042 (interrupt, 1, 12)
[ 951.139872] i8042: [237393] 8f <- i8042 (interrupt, 1, 12)
[ 951.140897] i8042: [237394] 00 <- i8042 (interrupt, 1, 12)
[ 951.141924] i8042: [237394] 00 <- i8042 (interrupt, 1, 12)
[ 951.142950] i8042: [237394] 08 <- i8042 (interrupt, 1, 12)
[ 951.143978] i8042: [237394] 00 <- i8042 (interrupt, 1, 12)
[ 951.145005] i8042: [237395] 00 <- i8042 (interrupt, 1, 12)
[ 951.150074] i8042: [237396] 8f <- i8042 (interrupt, 1, 12)
[ 951.151082] i8042: [237396] 00 <- i8042 (interrupt, 1, 12)
[ 951.152127] i8042: [237396] 00 <- i8042 (interrupt, 1, 12)
[ 951.153178] i8042: [237397] 08 <- i8042 (interrupt, 1, 12)
[ 951.154497] i8042: [237397] 00 <- i8042 (interrupt, 1, 12)
[ 951.155206] i8042: [237397] 00 <- i8042 (interrupt, 1, 12)
[ 951.160281] i8042: [237398] 8f <- i8042 (interrupt, 1, 12)
[ 951.161888] i8042: [237399] 00 <- i8042 (interrupt, 1, 12)
[ 951.162911] i8042: [237399] 00 <- i8042 (interrupt, 1, 12)
[ 951.163937] i8042: [237399] 08 <- i8042 (interrupt, 1, 12)
[ 951.164968] i8042: [237400] 00 <- i8042 (interrupt, 1, 12)
[ 951.166072] i8042: [237400] 00 <- i8042 (interrupt, 1, 12)
[ 951.170403] i8042: [237401] 8f <- i8042 (interrupt, 1, 12)
[ 951.171431] i8042: [237401] 00 <- i8042 (interrupt, 1, 12)
[ 951.172457] i8042: [237401] 00 <- i8042 (interrupt, 1, 12)
[ 951.173483] i8042: [237402] 08 <- i8042 (interrupt, 1, 12)
[ 951.174512] i8042: [237402] 00 <- i8042 (interrupt, 1, 12)
[ 951.175618] i8042: [237402] 00 <- i8042 (interrupt, 1, 12)
[ 951.180661] i8042: [237404] 8f <- i8042 (interrupt, 1, 12)
[ 951.181689] i8042: [237404] 00 <- i8042 (interrupt, 1, 12)
[ 951.182716] i8042: [237404] 00 <- i8042 (interrupt, 1, 12)
[ 951.183743] i8042: [237404] 08 <- i8042 (interrupt, 1, 12)
[ 951.184768] i8042: [237405] 00 <- i8042 (interrupt, 1, 12)
[ 951.185873] i8042: [237405] 00 <- i8042 (interrupt, 1, 12)
[ 951.190797] i8042: [237406] 8f <- i8042 (interrupt, 1, 12)
[ 951.191823] i8042: [237406] 00 <- i8042 (interrupt, 1, 12)
[ 951.192851] i8042: [237407] 00 <- i8042 (interrupt, 1, 12)
[ 951.193876] i8042: [237407] 08 <- i8042 (interrupt, 1, 12)
[ 951.194973] i8042: [237407] 00 <- i8042 (interrupt, 1, 12)
[ 951.195883] i8042: [237407] 00 <- i8042 (interrupt, 1, 12)
[ 951.200923] i8042: [237409] 8f <- i8042 (interrupt, 1, 12)
[ 951.201949] i8042: [237409] 00 <- i8042 (interrupt, 1, 12)
[ 951.202976] i8042: [237409] 00 <- i8042 (interrupt, 1, 12)
[ 951.204004] i8042: [237409] 08 <- i8042 (interrupt, 1, 12)
[ 951.205109] i8042: [237410] 00 <- i8042 (interrupt, 1, 12)
[ 951.206004] i8042: [237410] 00 <- i8042 (interrupt, 1, 12)
[ 951.211147] i8042: [237411] 8f <- i8042 (interrupt, 1, 12)
[ 951.212203] i8042: [237411] 00 <- i8042 (interrupt, 1, 12)
[ 951.213231] i8042: [237412] 00 <- i8042 (interrupt, 1, 12)
[ 951.214255] i8042: [237412] 08 <- i8042 (interrupt, 1, 12)
[ 951.215360] i8042: [237412] 00 <- i8042 (interrupt, 1, 12)
[ 951.216270] i8042: [237412] 00 <- i8042 (interrupt, 1, 12)
[ 951.221308] i8042: [237414] 8f <- i8042 (interrupt, 1, 12)
[ 951.222335] i8042: [237414] 00 <- i8042 (interrupt, 1, 12)
[ 951.223361] i8042: [237414] 00 <- i8042 (interrupt, 1, 12)
[ 951.224387] i8042: [237414] 08 <- i8042 (interrupt, 1, 12)
[ 951.225496] i8042: [237415] 00 <- i8042 (interrupt, 1, 12)
[ 951.226402] i8042: [237415] 00 <- i8042 (interrupt, 1, 12)
[ 951.231443] i8042: [237416] 8f <- i8042 (interrupt, 1, 12)
[ 951.232467] i8042: [237416] 00 <- i8042 (interrupt, 1, 12)
[ 951.233493] i8042: [237417] 00 <- i8042 (interrupt, 1, 12)
[ 951.234521] i8042: [237417] 08 <- i8042 (interrupt, 1, 12)
[ 951.235626] i8042: [237417] 00 <- i8042 (interrupt, 1, 12)
[ 951.236534] i8042: [237417] 00 <- i8042 (interrupt, 1, 12)
[ 951.241690] i8042: [237419] 8f <- i8042 (interrupt, 1, 12)
[ 951.242714] i8042: [237419] 00 <- i8042 (interrupt, 1, 12)
[ 951.243743] i8042: [237419] 00 <- i8042 (interrupt, 1, 12)
[ 951.244841] i8042: [237420] 08 <- i8042 (interrupt, 1, 12)
[ 951.245747] i8042: [237420] 00 <- i8042 (interrupt, 1, 12)
[ 951.246773] i8042: [237420] 00 <- i8042 (interrupt, 1, 12)
[ 951.251758] i8042: [237421] 8f <- i8042 (interrupt, 1, 12)
[ 951.252838] i8042: [237422] 00 <- i8042 (interrupt, 1, 12)
[ 951.253864] i8042: [237422] 00 <- i8042 (interrupt, 1, 12)
[ 951.254972] i8042: [237422] 08 <- i8042 (interrupt, 1, 12)
[ 951.255879] i8042: [237422] 00 <- i8042 (interrupt, 1, 12)
[ 951.256907] i8042: [237423] 00 <- i8042 (interrupt, 1, 12)
[ 951.262043] i8042: [237424] 8f <- i8042 (interrupt, 1, 12)
[ 951.263067] i8042: [237424] 00 <- i8042 (interrupt, 1, 12)
[ 951.264053] i8042: [237424] 00 <- i8042 (interrupt, 1, 12)
[ 951.265155] i8042: [237425] 08 <- i8042 (interrupt, 1, 12)
[ 951.266107] i8042: [237425] 00 <- i8042 (interrupt, 1, 12)
[ 951.267133] i8042: [237425] 00 <- i8042 (interrupt, 1, 12)
[ 951.272172] i8042: [237426] 8f <- i8042 (interrupt, 1, 12)
[ 951.273197] i8042: [237427] 00 <- i8042 (interrupt, 1, 12)
[ 951.274223] i8042: [237427] 00 <- i8042 (interrupt, 1, 12)
[ 951.275329] i8042: [237427] 08 <- i8042 (interrupt, 1, 12)
[ 951.276526] i8042: [237427] 00 <- i8042 (interrupt, 1, 12)
[ 951.277235] i8042: [237428] 00 <- i8042 (interrupt, 1, 12)
[ 951.282394] i8042: [237429] 8f <- i8042 (interrupt, 1, 12)
[ 951.283423] i8042: [237429] 00 <- i8042 (interrupt, 1, 12)
[ 951.284448] i8042: [237429] 00 <- i8042 (interrupt, 1, 12)
[ 951.285556] i8042: [237430] 08 <- i8042 (interrupt, 1, 12)
[ 951.286464] i8042: [237430] 00 <- i8042 (interrupt, 1, 12)
[ 951.287490] i8042: [237430] 00 <- i8042 (interrupt, 1, 12)
[ 951.292475] i8042: [237431] 8f <- i8042 (interrupt, 1, 12)
[ 951.293555] i8042: [237432] 00 <- i8042 (interrupt, 1, 12)
[ 951.294655] i8042: [237432] 00 <- i8042 (interrupt, 1, 12)
[ 951.295563] i8042: [237432] 08 <- i8042 (interrupt, 1, 12)
[ 951.296590] i8042: [237432] 00 <- i8042 (interrupt, 1, 12)
[ 951.297617] i8042: [237433] 00 <- i8042 (interrupt, 1, 12)
[ 951.302658] i8042: [237434] 8f <- i8042 (interrupt, 1, 12)
[ 951.303684] i8042: [237434] 00 <- i8042 (interrupt, 1, 12)
[ 951.304792] i8042: [237435] 00 <- i8042 (interrupt, 1, 12)
[ 951.305700] i8042: [237435] 08 <- i8042 (interrupt, 1, 12)
[ 951.306725] i8042: [237435] 00 <- i8042 (interrupt, 1, 12)
[ 951.307752] i8042: [237435] 00 <- i8042 (interrupt, 1, 12)
[ 951.312909] i8042: [237437] 8f <- i8042 (interrupt, 1, 12)
[ 951.313936] i8042: [237437] 00 <- i8042 (interrupt, 1, 12)
[ 951.315043] i8042: [237437] 00 <- i8042 (interrupt, 1, 12)
[ 951.315951] i8042: [237437] 08 <- i8042 (interrupt, 1, 12)
[ 951.316977] i8042: [237438] 00 <- i8042 (interrupt, 1, 12)
[ 951.318002] i8042: [237438] 00 <- i8042 (interrupt, 1, 12)
[ 951.323043] i8042: [237439] 8f <- i8042 (interrupt, 1, 12)
[ 951.324070] i8042: [237439] 00 <- i8042 (interrupt, 1, 12)
[ 951.325175] i8042: [237440] 00 <- i8042 (interrupt, 1, 12)
[ 951.326057] i8042: [237440] 08 <- i8042 (interrupt, 1, 12)
[ 951.327054] i8042: [237440] 00 <- i8042 (interrupt, 1, 12)
[ 951.328138] i8042: [237440] 00 <- i8042 (interrupt, 1, 12)
[ 951.333182] i8042: [237442] 8f <- i8042 (interrupt, 1, 12)
[ 951.334190] i8042: [237442] 00 <- i8042 (interrupt, 1, 12)
[ 951.335294] i8042: [237442] 00 <- i8042 (interrupt, 1, 12)
[ 951.336203] i8042: [237442] 08 <- i8042 (interrupt, 1, 12)
[ 951.337233] i8042: [237443] 00 <- i8042 (interrupt, 1, 12)
[ 951.338257] i8042: [237443] 00 <- i8042 (interrupt, 1, 12)
[ 952.208302] i8042: [237660] 8f <- i8042 (interrupt, 1, 12)
[ 952.209332] i8042: [237661] 00 <- i8042 (interrupt, 1, 12)
[ 952.210356] i8042: [237661] 00 <- i8042 (interrupt, 1, 12)
[ 952.211461] i8042: [237661] 08 <- i8042 (interrupt, 1, 12)
[ 952.212371] i8042: [237661] 40 <- i8042 (interrupt, 1, 12)
[ 952.213398] i8042: [237662] 00 <- i8042 (interrupt, 1, 12)
[ 952.218437] i8042: [237663] cf <- i8042 (interrupt, 1, 12)
[ 952.219461] i8042: [237663] 00 <- i8042 (interrupt, 1, 12)
[ 952.220489] i8042: [237663] 00 <- i8042 (interrupt, 1, 12)
[ 952.221595] i8042: [237664] 08 <- i8042 (interrupt, 1, 12)
[ 952.222503] i8042: [237664] 00 <- i8042 (interrupt, 1, 12)
[ 952.223474] i8042: [237664] 00 <- i8042 (interrupt, 1, 12)
[ 952.228667] i8042: [237665] 8f <- i8042 (interrupt, 1, 12)
[ 952.229694] i8042: [237666] 00 <- i8042 (interrupt, 1, 12)
[ 952.230800] i8042: [237666] 00 <- i8042 (interrupt, 1, 12)
[ 952.231708] i8042: [237666] 08 <- i8042 (interrupt, 1, 12)
[ 952.232735] i8042: [237666] 40 <- i8042 (interrupt, 1, 12)
[ 952.233766] i8042: [237667] 00 <- i8042 (interrupt, 1, 12)
[ 952.238763] i8042: [237668] cf <- i8042 (interrupt, 1, 12)
[ 952.239787] i8042: [237668] 00 <- i8042 (interrupt, 1, 12)
[ 952.240893] i8042: [237668] 70 <- i8042 (interrupt, 1, 12)
[ 952.241805] i8042: [237669] 7f <- i8042 (interrupt, 1, 12)
[ 952.242813] i8042: [237669] 00 <- i8042 (interrupt, 1, 12)
[ 952.243837] i8042: [237669] ff <- i8042 (interrupt, 1, 12)
[ 952.243843] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.248995] i8042: [237670] 8f <- i8042 (interrupt, 1, 12)
[ 952.250020] i8042: [237671] 00 <- i8042 (interrupt, 1, 12)
[ 952.251126] i8042: [237671] 00 <- i8042 (interrupt, 1, 12)
[ 952.252032] i8042: [237671] 08 <- i8042 (interrupt, 1, 12)
[ 952.253060] i8042: [237671] 40 <- i8042 (interrupt, 1, 12)
[ 952.254386] i8042: [237672] 00 <- i8042 (interrupt, 1, 12)
[ 952.259151] i8042: [237673] cf <- i8042 (interrupt, 1, 12)
[ 952.260176] i8042: [237673] 00 <- i8042 (interrupt, 1, 12)
[ 952.261281] i8042: [237674] 00 <- i8042 (interrupt, 1, 12)
[ 952.262247] i8042: [237674] 08 <- i8042 (interrupt, 1, 12)
[ 952.263273] i8042: [237674] 00 <- i8042 (interrupt, 1, 12)
[ 952.264302] i8042: [237674] 00 <- i8042 (interrupt, 1, 12)
[ 952.269339] i8042: [237676] 8f <- i8042 (interrupt, 1, 12)
[ 952.270364] i8042: [237676] 00 <- i8042 (interrupt, 1, 12)
[ 952.271471] i8042: [237676] 00 <- i8042 (interrupt, 1, 12)
[ 952.272379] i8042: [237676] 08 <- i8042 (interrupt, 1, 12)
[ 952.273408] i8042: [237677] 40 <- i8042 (interrupt, 1, 12)
[ 952.274431] i8042: [237677] 00 <- i8042 (interrupt, 1, 12)
[ 952.279472] i8042: [237678] cf <- i8042 (interrupt, 1, 12)
[ 952.280567] i8042: [237678] 5c <- i8042 (interrupt, 1, 12)
[ 952.281449] i8042: [237679] 7c <- i8042 (interrupt, 1, 12)
[ 952.282504] i8042: [237679] 7f <- i8042 (interrupt, 1, 12)
[ 952.283531] i8042: [237679] 16 <- i8042 (interrupt, 1, 12)
[ 952.284557] i8042: [237679] ff <- i8042 (interrupt, 1, 12)
[ 952.284564] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.289713] i8042: [237681] cf <- i8042 (interrupt, 1, 12)
[ 952.290820] i8042: [237681] 00 <- i8042 (interrupt, 1, 12)
[ 952.291728] i8042: [237681] 00 <- i8042 (interrupt, 1, 12)
[ 952.292699] i8042: [237681] 08 <- i8042 (interrupt, 1, 12)
[ 952.293724] i8042: [237682] 00 <- i8042 (interrupt, 1, 12)
[ 952.294808] i8042: [237682] 00 <- i8042 (interrupt, 1, 12)
[ 952.299847] i8042: [237683] cf <- i8042 (interrupt, 1, 12)
[ 952.300955] i8042: [237683] 00 <- i8042 (interrupt, 1, 12)
[ 952.301862] i8042: [237684] 00 <- i8042 (interrupt, 1, 12)
[ 952.302890] i8042: [237684] 08 <- i8042 (interrupt, 1, 12)
[ 952.303917] i8042: [237684] 00 <- i8042 (interrupt, 1, 12)
[ 952.304919] i8042: [237684] 00 <- i8042 (interrupt, 1, 12)
[ 952.310102] i8042: [237686] 8f <- i8042 (interrupt, 1, 12)
[ 952.311208] i8042: [237686] 00 <- i8042 (interrupt, 1, 12)
[ 952.312116] i8042: [237686] 00 <- i8042 (interrupt, 1, 12)
[ 952.313144] i8042: [237686] 08 <- i8042 (interrupt, 1, 12)
[ 952.314170] i8042: [237687] 40 <- i8042 (interrupt, 1, 12)
[ 952.315196] i8042: [237687] 00 <- i8042 (interrupt, 1, 12)
[ 952.320235] i8042: [237688] cf <- i8042 (interrupt, 1, 12)
[ 952.321343] i8042: [237689] 00 <- i8042 (interrupt, 1, 12)
[ 952.322250] i8042: [237689] 00 <- i8042 (interrupt, 1, 12)
[ 952.323277] i8042: [237689] 08 <- i8042 (interrupt, 1, 12)
[ 952.324303] i8042: [237689] 00 <- i8042 (interrupt, 1, 12)
[ 952.325332] i8042: [237690] 00 <- i8042 (interrupt, 1, 12)
[ 952.330442] i8042: [237691] 8f <- i8042 (interrupt, 1, 12)
[ 952.331349] i8042: [237691] 00 <- i8042 (interrupt, 1, 12)
[ 952.332375] i8042: [237691] 00 <- i8042 (interrupt, 1, 12)
[ 952.334443] i8042: [237692] 08 <- i8042 (interrupt, 1, 12)
[ 952.335469] i8042: [237692] 40 <- i8042 (interrupt, 1, 12)
[ 952.336497] i8042: [237692] 00 <- i8042 (interrupt, 1, 12)
[ 952.340656] i8042: [237693] cf <- i8042 (interrupt, 1, 12)
[ 952.341682] i8042: [237694] 7c <- i8042 (interrupt, 1, 12)
[ 952.342707] i8042: [237694] 7c <- i8042 (interrupt, 1, 12)
[ 952.343734] i8042: [237694] 7f <- i8042 (interrupt, 1, 12)
[ 952.344722] i8042: [237694] 16 <- i8042 (interrupt, 1, 12)
[ 952.345746] i8042: [237695] ff <- i8042 (interrupt, 1, 12)
[ 952.345750] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.350790] i8042: [237696] 8f <- i8042 (interrupt, 1, 12)
[ 952.351697] i8042: [237696] 00 <- i8042 (interrupt, 1, 12)
[ 952.352725] i8042: [237696] 00 <- i8042 (interrupt, 1, 12)
[ 952.353753] i8042: [237697] 08 <- i8042 (interrupt, 1, 12)
[ 952.354778] i8042: [237697] 40 <- i8042 (interrupt, 1, 12)
[ 952.355803] i8042: [237697] 00 <- i8042 (interrupt, 1, 12)
[ 952.360906] i8042: [237698] cf <- i8042 (interrupt, 1, 12)
[ 952.361901] i8042: [237699] 00 <- i8042 (interrupt, 1, 12)
[ 952.362905] i8042: [237699] 00 <- i8042 (interrupt, 1, 12)
[ 952.363960] i8042: [237699] 08 <- i8042 (interrupt, 1, 12)
[ 952.365014] i8042: [237699] 00 <- i8042 (interrupt, 1, 12)
[ 952.366041] i8042: [237700] 00 <- i8042 (interrupt, 1, 12)
[ 952.371163] i8042: [237701] cf <- i8042 (interrupt, 1, 12)
[ 952.372190] i8042: [237701] 00 <- i8042 (interrupt, 1, 12)
[ 952.373214] i8042: [237701] 00 <- i8042 (interrupt, 1, 12)
[ 952.374243] i8042: [237702] 08 <- i8042 (interrupt, 1, 12)
[ 952.375550] i8042: [237702] 00 <- i8042 (interrupt, 1, 12)
[ 952.376260] i8042: [237702] 00 <- i8042 (interrupt, 1, 12)
[ 952.381318] i8042: [237704] cf <- i8042 (interrupt, 1, 12)
[ 952.382341] i8042: [237704] 00 <- i8042 (interrupt, 1, 12)
[ 952.383367] i8042: [237704] 00 <- i8042 (interrupt, 1, 12)
[ 952.384393] i8042: [237704] 08 <- i8042 (interrupt, 1, 12)
[ 952.385422] i8042: [237705] 00 <- i8042 (interrupt, 1, 12)
[ 952.386445] i8042: [237705] 00 <- i8042 (interrupt, 1, 12)
[ 952.391403] i8042: [237706] 8f <- i8042 (interrupt, 1, 12)
[ 952.392429] i8042: [237706] 00 <- i8042 (interrupt, 1, 12)
[ 952.393457] i8042: [237707] 00 <- i8042 (interrupt, 1, 12)
[ 952.394481] i8042: [237707] 08 <- i8042 (interrupt, 1, 12)
[ 952.395507] i8042: [237707] 40 <- i8042 (interrupt, 1, 12)
[ 952.396534] i8042: [237707] 00 <- i8042 (interrupt, 1, 12)
[ 952.401582] i8042: [237709] cf <- i8042 (interrupt, 1, 12)
[ 952.402636] i8042: [237709] 00 <- i8042 (interrupt, 1, 12)
[ 952.403662] i8042: [237709] 00 <- i8042 (interrupt, 1, 12)
[ 952.404688] i8042: [237709] 08 <- i8042 (interrupt, 1, 12)
[ 952.405716] i8042: [237710] 00 <- i8042 (interrupt, 1, 12)
[ 952.406742] i8042: [237710] 00 <- i8042 (interrupt, 1, 12)
[ 952.411835] i8042: [237711] 8f <- i8042 (interrupt, 1, 12)
[ 952.412860] i8042: [237711] 00 <- i8042 (interrupt, 1, 12)
[ 952.413887] i8042: [237712] 00 <- i8042 (interrupt, 1, 12)
[ 952.414862] i8042: [237712] 08 <- i8042 (interrupt, 1, 12)
[ 952.415942] i8042: [237712] 40 <- i8042 (interrupt, 1, 12)
[ 952.416967] i8042: [237712] 00 <- i8042 (interrupt, 1, 12)
[ 952.421940] i8042: [237714] cf <- i8042 (interrupt, 1, 12)
[ 952.422966] i8042: [237714] 7d <- i8042 (interrupt, 1, 12)
[ 952.423993] i8042: [237714] 7c <- i8042 (interrupt, 1, 12)
[ 952.424996] i8042: [237714] 7f <- i8042 (interrupt, 1, 12)
[ 952.426005] i8042: [237715] 16 <- i8042 (interrupt, 1, 12)
[ 952.427030] i8042: [237715] ff <- i8042 (interrupt, 1, 12)
[ 952.427034] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.432132] i8042: [237716] 8f <- i8042 (interrupt, 1, 12)
[ 952.433160] i8042: [237716] 00 <- i8042 (interrupt, 1, 12)
[ 952.434189] i8042: [237717] 00 <- i8042 (interrupt, 1, 12)
[ 952.435213] i8042: [237717] 08 <- i8042 (interrupt, 1, 12)
[ 952.436186] i8042: [237717] 40 <- i8042 (interrupt, 1, 12)
[ 952.437209] i8042: [237717] 00 <- i8042 (interrupt, 1, 12)
[ 952.442361] i8042: [237719] cf <- i8042 (interrupt, 1, 12)
[ 952.443389] i8042: [237719] 7f <- i8042 (interrupt, 1, 12)
[ 952.444413] i8042: [237719] 7c <- i8042 (interrupt, 1, 12)
[ 952.445440] i8042: [237720] 7f <- i8042 (interrupt, 1, 12)
[ 952.446464] i8042: [237720] 1e <- i8042 (interrupt, 1, 12)
[ 952.447500] i8042: [237720] 66 <- i8042 (interrupt, 1, 12)
[ 952.452465] i8042: [237721] 8f <- i8042 (interrupt, 1, 12)
[ 952.453441] i8042: [237722] 00 <- i8042 (interrupt, 1, 12)
[ 952.454517] i8042: [237722] 00 <- i8042 (interrupt, 1, 12)
[ 952.455544] i8042: [237722] 08 <- i8042 (interrupt, 1, 12)
[ 952.456570] i8042: [237722] 40 <- i8042 (interrupt, 1, 12)
[ 952.457598] i8042: [237723] 00 <- i8042 (interrupt, 1, 12)
[ 952.462692] i8042: [237724] cf <- i8042 (interrupt, 1, 12)
[ 952.463718] i8042: [237724] 7f <- i8042 (interrupt, 1, 12)
[ 952.464743] i8042: [237724] 7c <- i8042 (interrupt, 1, 12)
[ 952.465771] i8042: [237725] 7f <- i8042 (interrupt, 1, 12)
[ 952.466796] i8042: [237725] 1e <- i8042 (interrupt, 1, 12)
[ 952.467822] i8042: [237725] 65 <- i8042 (interrupt, 1, 12)
[ 952.472741] i8042: [237726] cf <- i8042 (interrupt, 1, 12)
[ 952.473824] i8042: [237727] 00 <- i8042 (interrupt, 1, 12)
[ 952.474849] i8042: [237727] 00 <- i8042 (interrupt, 1, 12)
[ 952.475874] i8042: [237727] 08 <- i8042 (interrupt, 1, 12)
[ 952.476902] i8042: [237727] 00 <- i8042 (interrupt, 1, 12)
[ 952.477931] i8042: [237728] 00 <- i8042 (interrupt, 1, 12)
[ 952.483023] i8042: [237729] 8f <- i8042 (interrupt, 1, 12)
[ 952.484049] i8042: [237729] 00 <- i8042 (interrupt, 1, 12)
[ 952.485075] i8042: [237729] 00 <- i8042 (interrupt, 1, 12)
[ 952.486104] i8042: [237730] 08 <- i8042 (interrupt, 1, 12)
[ 952.487129] i8042: [237730] 40 <- i8042 (interrupt, 1, 12)
[ 952.488155] i8042: [237730] 00 <- i8042 (interrupt, 1, 12)
[ 952.493229] i8042: [237731] cf <- i8042 (interrupt, 1, 12)
[ 952.494257] i8042: [237732] 7f <- i8042 (interrupt, 1, 12)
[ 952.495285] i8042: [237732] 7c <- i8042 (interrupt, 1, 12)
[ 952.496310] i8042: [237732] 7f <- i8042 (interrupt, 1, 12)
[ 952.497336] i8042: [237732] 1e <- i8042 (interrupt, 1, 12)
[ 952.498710] i8042: [237733] 65 <- i8042 (interrupt, 1, 12)
[ 952.503435] i8042: [237734] 8f <- i8042 (interrupt, 1, 12)
[ 952.504462] i8042: [237734] 00 <- i8042 (interrupt, 1, 12)
[ 952.505499] i8042: [237735] 00 <- i8042 (interrupt, 1, 12)
[ 952.506442] i8042: [237735] 08 <- i8042 (interrupt, 1, 12)
[ 952.507524] i8042: [237735] 40 <- i8042 (interrupt, 1, 12)
[ 952.508635] i8042: [237735] 00 <- i8042 (interrupt, 1, 12)
[ 952.513558] i8042: [237737] cf <- i8042 (interrupt, 1, 12)
[ 952.514583] i8042: [237737] 00 <- i8042 (interrupt, 1, 12)
[ 952.515611] i8042: [237737] 00 <- i8042 (interrupt, 1, 12)
[ 952.516637] i8042: [237737] 08 <- i8042 (interrupt, 1, 12)
[ 952.517671] i8042: [237738] 00 <- i8042 (interrupt, 1, 12)
[ 952.518757] i8042: [237738] 00 <- i8042 (interrupt, 1, 12)
[ 952.523680] i8042: [237739] cf <- i8042 (interrupt, 1, 12)
[ 952.524707] i8042: [237739] 00 <- i8042 (interrupt, 1, 12)
[ 952.525735] i8042: [237740] 00 <- i8042 (interrupt, 1, 12)
[ 952.526760] i8042: [237740] 08 <- i8042 (interrupt, 1, 12)
[ 952.527870] i8042: [237740] 00 <- i8042 (interrupt, 1, 12)
[ 952.532309] i8042: [237741] 00 <- i8042 (interrupt, 1, 12)
[ 952.533925] i8042: [237742] cf <- i8042 (interrupt, 1, 12)
[ 952.534949] i8042: [237742] 00 <- i8042 (interrupt, 1, 12)
[ 952.535978] i8042: [237742] 00 <- i8042 (interrupt, 1, 12)
[ 952.537005] i8042: [237742] 08 <- i8042 (interrupt, 1, 12)
[ 952.538112] i8042: [237743] 00 <- i8042 (interrupt, 1, 12)
[ 952.539022] i8042: [237743] 00 <- i8042 (interrupt, 1, 12)
[ 952.544005] i8042: [237744] 8f <- i8042 (interrupt, 1, 12)
[ 952.545030] i8042: [237744] 00 <- i8042 (interrupt, 1, 12)
[ 952.546073] i8042: [237745] 00 <- i8042 (interrupt, 1, 12)
[ 952.547143] i8042: [237745] 08 <- i8042 (interrupt, 1, 12)
[ 952.548250] i8042: [237745] 40 <- i8042 (interrupt, 1, 12)
[ 952.549135] i8042: [237745] 00 <- i8042 (interrupt, 1, 12)
[ 952.554201] i8042: [237747] cf <- i8042 (interrupt, 1, 12)
[ 952.555226] i8042: [237747] 7f <- i8042 (interrupt, 1, 12)
[ 952.556253] i8042: [237747] 7c <- i8042 (interrupt, 1, 12)
[ 952.557280] i8042: [237747] 7f <- i8042 (interrupt, 1, 12)
[ 952.558388] i8042: [237748] 1e <- i8042 (interrupt, 1, 12)
[ 952.559296] i8042: [237748] ff <- i8042 (interrupt, 1, 12)
[ 952.559302] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.564455] i8042: [237749] cf <- i8042 (interrupt, 1, 12)
[ 952.565444] i8042: [237750] 00 <- i8042 (interrupt, 1, 12)
[ 952.566468] i8042: [237750] 00 <- i8042 (interrupt, 1, 12)
[ 952.567495] i8042: [237750] 08 <- i8042 (interrupt, 1, 12)
[ 952.568645] i8042: [237750] 00 <- i8042 (interrupt, 1, 12)
[ 952.569554] i8042: [237751] 00 <- i8042 (interrupt, 1, 12)
[ 952.574597] i8042: [237752] cf <- i8042 (interrupt, 1, 12)
[ 952.575620] i8042: [237752] 00 <- i8042 (interrupt, 1, 12)
[ 952.576606] i8042: [237752] 00 <- i8042 (interrupt, 1, 12)
[ 952.577711] i8042: [237753] 08 <- i8042 (interrupt, 1, 12)
[ 952.578620] i8042: [237753] 00 <- i8042 (interrupt, 1, 12)
[ 952.579648] i8042: [237753] 00 <- i8042 (interrupt, 1, 12)
[ 952.584731] i8042: [237754] cf <- i8042 (interrupt, 1, 12)
[ 952.585760] i8042: [237755] 00 <- i8042 (interrupt, 1, 12)
[ 952.586786] i8042: [237755] 00 <- i8042 (interrupt, 1, 12)
[ 952.587891] i8042: [237755] 08 <- i8042 (interrupt, 1, 12)
[ 952.588801] i8042: [237755] 00 <- i8042 (interrupt, 1, 12)
[ 952.589828] i8042: [237756] 00 <- i8042 (interrupt, 1, 12)
[ 952.594987] i8042: [237757] cf <- i8042 (interrupt, 1, 12)
[ 952.596015] i8042: [237757] 00 <- i8042 (interrupt, 1, 12)
[ 952.597040] i8042: [237757] 00 <- i8042 (interrupt, 1, 12)
[ 952.598151] i8042: [237758] 08 <- i8042 (interrupt, 1, 12)
[ 952.599058] i8042: [237758] 00 <- i8042 (interrupt, 1, 12)
[ 952.600085] i8042: [237758] 00 <- i8042 (interrupt, 1, 12)
[ 952.605126] i8042: [237759] cf <- i8042 (interrupt, 1, 12)
[ 952.606154] i8042: [237760] 00 <- i8042 (interrupt, 1, 12)
[ 952.607182] i8042: [237760] 00 <- i8042 (interrupt, 1, 12)
[ 952.608289] i8042: [237760] 08 <- i8042 (interrupt, 1, 12)
[ 952.609141] i8042: [237760] 00 <- i8042 (interrupt, 1, 12)
[ 952.610192] i8042: [237761] 00 <- i8042 (interrupt, 1, 12)
[ 952.615233] i8042: [237762] 8f <- i8042 (interrupt, 1, 12)
[ 952.616260] i8042: [237762] 00 <- i8042 (interrupt, 1, 12)
[ 952.617286] i8042: [237762] 00 <- i8042 (interrupt, 1, 12)
[ 952.618395] i8042: [237763] 08 <- i8042 (interrupt, 1, 12)
[ 952.619302] i8042: [237763] 40 <- i8042 (interrupt, 1, 12)
[ 952.620654] i8042: [237763] 00 <- i8042 (interrupt, 1, 12)
[ 952.625463] i8042: [237765] cf <- i8042 (interrupt, 1, 12)
[ 952.627681] i8042: [237765] 7f <- i8042 (interrupt, 1, 12)
[ 952.628708] i8042: [237765] 7c <- i8042 (interrupt, 1, 12)
[ 952.629732] i8042: [237766] 7f <- i8042 (interrupt, 1, 12)
[ 952.630757] i8042: [237766] 1e <- i8042 (interrupt, 1, 12)
[ 952.631784] i8042: [237766] ff <- i8042 (interrupt, 1, 12)
[ 952.631791] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.635642] i8042: [237767] 8f <- i8042 (interrupt, 1, 12)
[ 952.636669] i8042: [237767] 00 <- i8042 (interrupt, 1, 12)
[ 952.637775] i8042: [237768] 00 <- i8042 (interrupt, 1, 12)
[ 952.638681] i8042: [237768] 08 <- i8042 (interrupt, 1, 12)
[ 952.639707] i8042: [237768] 40 <- i8042 (interrupt, 1, 12)
[ 952.640734] i8042: [237768] 00 <- i8042 (interrupt, 1, 12)
[ 952.645773] i8042: [237770] cf <- i8042 (interrupt, 1, 12)
[ 952.646799] i8042: [237770] 7d <- i8042 (interrupt, 1, 12)
[ 952.647902] i8042: [237770] 7c <- i8042 (interrupt, 1, 12)
[ 952.648811] i8042: [237770] 7f <- i8042 (interrupt, 1, 12)
[ 952.649841] i8042: [237771] 1e <- i8042 (interrupt, 1, 12)
[ 952.650863] i8042: [237771] ff <- i8042 (interrupt, 1, 12)
[ 952.650869] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.656021] i8042: [237772] cf <- i8042 (interrupt, 1, 12)
[ 952.657049] i8042: [237772] 00 <- i8042 (interrupt, 1, 12)
[ 952.658156] i8042: [237773] 00 <- i8042 (interrupt, 1, 12)
[ 952.658986] i8042: [237773] 08 <- i8042 (interrupt, 1, 12)
[ 952.660013] i8042: [237773] 00 <- i8042 (interrupt, 1, 12)
[ 952.661095] i8042: [237773] 00 <- i8042 (interrupt, 1, 12)
[ 952.666135] i8042: [237775] cf <- i8042 (interrupt, 1, 12)
[ 952.667161] i8042: [237775] 00 <- i8042 (interrupt, 1, 12)
[ 952.668265] i8042: [237775] 00 <- i8042 (interrupt, 1, 12)
[ 952.669173] i8042: [237775] 08 <- i8042 (interrupt, 1, 12)
[ 952.670201] i8042: [237776] 00 <- i8042 (interrupt, 1, 12)
[ 952.671226] i8042: [237776] 00 <- i8042 (interrupt, 1, 12)
[ 952.676382] i8042: [237777] 8f <- i8042 (interrupt, 1, 12)
[ 952.677489] i8042: [237778] 00 <- i8042 (interrupt, 1, 12)
[ 952.678394] i8042: [237778] 00 <- i8042 (interrupt, 1, 12)
[ 952.679419] i8042: [237778] 08 <- i8042 (interrupt, 1, 12)
[ 952.680447] i8042: [237778] 40 <- i8042 (interrupt, 1, 12)
[ 952.681473] i8042: [237778] 00 <- i8042 (interrupt, 1, 12)
[ 952.686514] i8042: [237780] cf <- i8042 (interrupt, 1, 12)
[ 952.687616] i8042: [237780] 7c <- i8042 (interrupt, 1, 12)
[ 952.688469] i8042: [237780] 7c <- i8042 (interrupt, 1, 12)
[ 952.689531] i8042: [237781] 7f <- i8042 (interrupt, 1, 12)
[ 952.690576] i8042: [237781] 16 <- i8042 (interrupt, 1, 12)
[ 952.691601] i8042: [237781] ff <- i8042 (interrupt, 1, 12)
[ 952.691607] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.696583] i8042: [237782] 8f <- i8042 (interrupt, 1, 12)
[ 952.697718] i8042: [237783] 00 <- i8042 (interrupt, 1, 12)
[ 952.698653] i8042: [237783] 00 <- i8042 (interrupt, 1, 12)
[ 952.699679] i8042: [237783] 08 <- i8042 (interrupt, 1, 12)
[ 952.700704] i8042: [237783] 40 <- i8042 (interrupt, 1, 12)
[ 952.701732] i8042: [237784] 00 <- i8042 (interrupt, 1, 12)
[ 952.706862] i8042: [237785] cf <- i8042 (interrupt, 1, 12)
[ 952.707956] i8042: [237785] 7c <- i8042 (interrupt, 1, 12)
[ 952.708874] i8042: [237785] 7c <- i8042 (interrupt, 1, 12)
[ 952.709901] i8042: [237786] 7f <- i8042 (interrupt, 1, 12)
[ 952.710931] i8042: [237786] 16 <- i8042 (interrupt, 1, 12)
[ 952.711938] i8042: [237786] ff <- i8042 (interrupt, 1, 12)
[ 952.711943] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.717020] i8042: [237787] cf <- i8042 (interrupt, 1, 12)
[ 952.718103] i8042: [237788] 00 <- i8042 (interrupt, 1, 12)
[ 952.719011] i8042: [237788] 00 <- i8042 (interrupt, 1, 12)
[ 952.720037] i8042: [237788] 08 <- i8042 (interrupt, 1, 12)
[ 952.721063] i8042: [237788] 00 <- i8042 (interrupt, 1, 12)
[ 952.722115] i8042: [237789] 00 <- i8042 (interrupt, 1, 12)
[ 952.727323] i8042: [237790] 8f <- i8042 (interrupt, 1, 12)
[ 952.728231] i8042: [237790] 00 <- i8042 (interrupt, 1, 12)
[ 952.729200] i8042: [237790] 00 <- i8042 (interrupt, 1, 12)
[ 952.730224] i8042: [237791] 08 <- i8042 (interrupt, 1, 12)
[ 952.731308] i8042: [237791] 40 <- i8042 (interrupt, 1, 12)
[ 952.732335] i8042: [237791] 00 <- i8042 (interrupt, 1, 12)
[ 952.737436] i8042: [237792] cf <- i8042 (interrupt, 1, 12)
[ 952.738463] i8042: [237793] 30 <- i8042 (interrupt, 1, 12)
[ 952.739489] i8042: [237793] 7c <- i8042 (interrupt, 1, 12)
[ 952.740515] i8042: [237793] 7f <- i8042 (interrupt, 1, 12)
[ 952.741544] i8042: [237794] 16 <- i8042 (interrupt, 1, 12)
[ 952.745626] i8042: [237795] ff <- i8042 (interrupt, 1, 12)
[ 952.745632] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.747569] i8042: [237795] 8f <- i8042 (interrupt, 1, 12)
[ 952.748597] i8042: [237795] 00 <- i8042 (interrupt, 1, 12)
[ 952.749625] i8042: [237796] 00 <- i8042 (interrupt, 1, 12)
[ 952.750650] i8042: [237796] 08 <- i8042 (interrupt, 1, 12)
[ 952.751680] i8042: [237796] 40 <- i8042 (interrupt, 1, 12)
[ 952.752708] i8042: [237796] 00 <- i8042 (interrupt, 1, 12)
[ 952.757785] i8042: [237798] cf <- i8042 (interrupt, 1, 12)
[ 952.758811] i8042: [237798] 00 <- i8042 (interrupt, 1, 12)
[ 952.759837] i8042: [237798] 70 <- i8042 (interrupt, 1, 12)
[ 952.760864] i8042: [237798] 7f <- i8042 (interrupt, 1, 12)
[ 952.761873] i8042: [237799] 02 <- i8042 (interrupt, 1, 12)
[ 952.762862] i8042: [237799] ff <- i8042 (interrupt, 1, 12)
[ 952.762868] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.767878] i8042: [237800] 8f <- i8042 (interrupt, 1, 12)
[ 952.768905] i8042: [237800] 00 <- i8042 (interrupt, 1, 12)
[ 952.769931] i8042: [237801] 00 <- i8042 (interrupt, 1, 12)
[ 952.770958] i8042: [237801] 08 <- i8042 (interrupt, 1, 12)
[ 952.771985] i8042: [237801] 40 <- i8042 (interrupt, 1, 12)
[ 952.772974] i8042: [237801] 00 <- i8042 (interrupt, 1, 12)
[ 952.778109] i8042: [237803] cf <- i8042 (interrupt, 1, 12)
[ 952.779134] i8042: [237803] 00 <- i8042 (interrupt, 1, 12)
[ 952.780161] i8042: [237803] 00 <- i8042 (interrupt, 1, 12)
[ 952.781189] i8042: [237803] 08 <- i8042 (interrupt, 1, 12)
[ 952.782214] i8042: [237804] 00 <- i8042 (interrupt, 1, 12)
[ 952.783258] i8042: [237804] 00 <- i8042 (interrupt, 1, 12)
[ 952.788306] i8042: [237805] 8f <- i8042 (interrupt, 1, 12)
[ 952.789330] i8042: [237805] 00 <- i8042 (interrupt, 1, 12)
[ 952.790360] i8042: [237806] 00 <- i8042 (interrupt, 1, 12)
[ 952.791386] i8042: [237806] 08 <- i8042 (interrupt, 1, 12)
[ 952.792412] i8042: [237806] 40 <- i8042 (interrupt, 1, 12)
[ 952.793438] i8042: [237806] 00 <- i8042 (interrupt, 1, 12)
[ 952.798358] i8042: [237808] cf <- i8042 (interrupt, 1, 12)
[ 952.799413] i8042: [237808] 00 <- i8042 (interrupt, 1, 12)
[ 952.800468] i8042: [237808] 70 <- i8042 (interrupt, 1, 12)
[ 952.801493] i8042: [237808] 7f <- i8042 (interrupt, 1, 12)
[ 952.802523] i8042: [237809] 02 <- i8042 (interrupt, 1, 12)
[ 952.803548] i8042: [237809] ff <- i8042 (interrupt, 1, 12)
[ 952.803554] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.808642] i8042: [237810] 8f <- i8042 (interrupt, 1, 12)
[ 952.809668] i8042: [237811] 00 <- i8042 (interrupt, 1, 12)
[ 952.810694] i8042: [237811] 00 <- i8042 (interrupt, 1, 12)
[ 952.811720] i8042: [237811] 08 <- i8042 (interrupt, 1, 12)
[ 952.812749] i8042: [237811] 40 <- i8042 (interrupt, 1, 12)
[ 952.813775] i8042: [237812] 00 <- i8042 (interrupt, 1, 12)
[ 952.818750] i8042: [237813] cf <- i8042 (interrupt, 1, 12)
[ 952.819778] i8042: [237813] 00 <- i8042 (interrupt, 1, 12)
[ 952.820807] i8042: [237813] 00 <- i8042 (interrupt, 1, 12)
[ 952.822872] i8042: [237814] 08 <- i8042 (interrupt, 1, 12)
[ 952.823046] i8042: [237814] 00 <- i8042 (interrupt, 1, 12)
[ 952.824119] i8042: [237814] 00 <- i8042 (interrupt, 1, 12)
[ 952.828918] i8042: [237815] 8f <- i8042 (interrupt, 1, 12)
[ 952.829974] i8042: [237816] 00 <- i8042 (interrupt, 1, 12)
[ 952.830999] i8042: [237816] 00 <- i8042 (interrupt, 1, 12)
[ 952.832025] i8042: [237816] 08 <- i8042 (interrupt, 1, 12)
[ 952.832998] i8042: [237816] 40 <- i8042 (interrupt, 1, 12)
[ 952.834023] i8042: [237817] 00 <- i8042 (interrupt, 1, 12)
[ 952.839174] i8042: [237818] cf <- i8042 (interrupt, 1, 12)
[ 952.840201] i8042: [237818] 00 <- i8042 (interrupt, 1, 12)
[ 952.841228] i8042: [237818] 70 <- i8042 (interrupt, 1, 12)
[ 952.842254] i8042: [237819] 7f <- i8042 (interrupt, 1, 12)
[ 952.843283] i8042: [237819] 00 <- i8042 (interrupt, 1, 12)
[ 952.844310] i8042: [237819] ff <- i8042 (interrupt, 1, 12)
[ 952.844316] psmouse serio1: alps: v3 discard packet[5] = ff
[ 952.849270] i8042: [237820] cf <- i8042 (interrupt, 1, 12)
[ 952.850297] i8042: [237821] 00 <- i8042 (interrupt, 1, 12)
[ 952.851324] i8042: [237821] 00 <- i8042 (interrupt, 1, 12)
[ 952.852350] i8042: [237821] 08 <- i8042 (interrupt, 1, 12)
[ 952.853377] i8042: [237821] 00 <- i8042 (interrupt, 1, 12)
[ 952.854404] i8042: [237822] 00 <- i8042 (interrupt, 1, 12)
[ 952.859484] i8042: [237823] cf <- i8042 (interrupt, 1, 12)
[ 952.860508] i8042: [237823] 00 <- i8042 (interrupt, 1, 12)
[ 952.861536] i8042: [237823] 00 <- i8042 (interrupt, 1, 12)
[ 952.862561] i8042: [237824] 08 <- i8042 (interrupt, 1, 12)
[ 952.863591] i8042: [237824] 00 <- i8042 (interrupt, 1, 12)
[ 952.864852] i8042: [237824] 00 <- i8042 (interrupt, 1, 12)
[ 952.869641] i8042: [237826] cf <- i8042 (interrupt, 1, 12)
[ 952.870711] i8042: [237826] 00 <- i8042 (interrupt, 1, 12)
[ 952.871738] i8042: [237826] 00 <- i8042 (interrupt, 1, 12)
[ 952.872764] i8042: [237826] 08 <- i8042 (interrupt, 1, 12)
[ 952.873765] i8042: [237827] 00 <- i8042 (interrupt, 1, 12)
[ 952.874818] i8042: [237827] 00 <- i8042 (interrupt, 1, 12)
[ 952.879794] i8042: [237828] cf <- i8042 (interrupt, 1, 12)
[ 952.880821] i8042: [237828] 00 <- i8042 (interrupt, 1, 12)
[ 952.881847] i8042: [237829] 00 <- i8042 (interrupt, 1, 12)
[ 952.882873] i8042: [237829] 08 <- i8042 (interrupt, 1, 12)
[ 952.883900] i8042: [237829] 00 <- i8042 (interrupt, 1, 12)
[ 952.884927] i8042: [237829] 00 <- i8042 (interrupt, 1, 12)
[ 952.890023] i8042: [237831] cf <- i8042 (interrupt, 1, 12)
[ 952.891048] i8042: [237831] 00 <- i8042 (interrupt, 1, 12)
[ 952.892075] i8042: [237831] 00 <- i8042 (interrupt, 1, 12)
[ 952.893103] i8042: [237831] 08 <- i8042 (interrupt, 1, 12)
[ 952.894131] i8042: [237832] 00 <- i8042 (interrupt, 1, 12)
[ 952.895235] i8042: [237832] 00 <- i8042 (interrupt, 1, 12)
[ 952.900102] i8042: [237833] cf <- i8042 (interrupt, 1, 12)
[ 952.901125] i8042: [237833] 00 <- i8042 (interrupt, 1, 12)
[ 952.902210] i8042: [237834] 00 <- i8042 (interrupt, 1, 12)
[ 952.903237] i8042: [237834] 08 <- i8042 (interrupt, 1, 12)
[ 952.904264] i8042: [237834] 00 <- i8042 (interrupt, 1, 12)
[ 952.905370] i8042: [237834] 00 <- i8042 (interrupt, 1, 12)
[ 952.910391] i8042: [237836] cf <- i8042 (interrupt, 1, 12)
[ 952.911414] i8042: [237836] 00 <- i8042 (interrupt, 1, 12)
[ 952.912443] i8042: [237836] 00 <- i8042 (interrupt, 1, 12)
[ 952.913469] i8042: [237836] 08 <- i8042 (interrupt, 1, 12)
[ 952.914496] i8042: [237837] 00 <- i8042 (interrupt, 1, 12)
[ 952.915600] i8042: [237837] 00 <- i8042 (interrupt, 1, 12)
[ 952.920725] i8042: [237838] cf <- i8042 (interrupt, 1, 12)
[ 952.921707] i8042: [237839] 00 <- i8042 (interrupt, 1, 12)
[ 952.922775] i8042: [237839] 00 <- i8042 (interrupt, 1, 12)
[ 952.923805] i8042: [237839] 08 <- i8042 (interrupt, 1, 12)
[ 952.924833] i8042: [237839] 00 <- i8042 (interrupt, 1, 12)
[ 952.925937] i8042: [237840] 00 <- i8042 (interrupt, 1, 12)
[ 952.930739] i8042: [237841] cf <- i8042 (interrupt, 1, 12)
[ 952.931767] i8042: [237841] 00 <- i8042 (interrupt, 1, 12)
[ 952.932793] i8042: [237841] 00 <- i8042 (interrupt, 1, 12)
[ 952.933764] i8042: [237842] 08 <- i8042 (interrupt, 1, 12)
[ 952.934789] i8042: [237842] 00 <- i8042 (interrupt, 1, 12)
[ 952.935950] i8042: [237842] 00 <- i8042 (interrupt, 1, 12)
[ 952.940871] i8042: [237843] cf <- i8042 (interrupt, 1, 12)
[ 952.941897] i8042: [237844] 00 <- i8042 (interrupt, 1, 12)
[ 952.942922] i8042: [237844] 00 <- i8042 (interrupt, 1, 12)
[ 952.943949] i8042: [237844] 08 <- i8042 (interrupt, 1, 12)
[ 952.945033] i8042: [237844] 00 <- i8042 (interrupt, 1, 12)
[ 952.945949] i8042: [237845] 00 <- i8042 (interrupt, 1, 12)
[ 952.951006] i8042: [237846] cf <- i8042 (interrupt, 1, 12)
[ 952.952031] i8042: [237846] 00 <- i8042 (interrupt, 1, 12)
[ 952.953058] i8042: [237846] 00 <- i8042 (interrupt, 1, 12)
[ 952.954085] i8042: [237847] 08 <- i8042 (interrupt, 1, 12)
[ 952.955191] i8042: [237847] 00 <- i8042 (interrupt, 1, 12)
[ 952.956099] i8042: [237847] 00 <- i8042 (interrupt, 1, 12)
[ 952.961258] i8042: [237848] cf <- i8042 (interrupt, 1, 12)
[ 952.962282] i8042: [237849] 00 <- i8042 (interrupt, 1, 12)
[ 952.963310] i8042: [237849] 00 <- i8042 (interrupt, 1, 12)
[ 952.964336] i8042: [237849] 08 <- i8042 (interrupt, 1, 12)
[ 952.965414] i8042: [237849] 00 <- i8042 (interrupt, 1, 12)
[ 952.966296] i8042: [237850] 00 <- i8042 (interrupt, 1, 12)
[ 952.971391] i8042: [237851] cf <- i8042 (interrupt, 1, 12)
[ 952.972417] i8042: [237851] 00 <- i8042 (interrupt, 1, 12)
[ 952.973443] i8042: [237851] 00 <- i8042 (interrupt, 1, 12)
[ 952.974470] i8042: [237852] 08 <- i8042 (interrupt, 1, 12)
[ 952.975575] i8042: [237852] 00 <- i8042 (interrupt, 1, 12)
[ 952.976484] i8042: [237852] 00 <- i8042 (interrupt, 1, 12)
[ 952.981524] i8042: [237853] cf <- i8042 (interrupt, 1, 12)
[ 952.982550] i8042: [237854] 00 <- i8042 (interrupt, 1, 12)
[ 952.983575] i8042: [237854] 00 <- i8042 (interrupt, 1, 12)
[ 952.984600] i8042: [237854] 08 <- i8042 (interrupt, 1, 12)
[ 952.985707] i8042: [237855] 00 <- i8042 (interrupt, 1, 12)
[ 952.986904] i8042: [237855] 00 <- i8042 (interrupt, 1, 12)
[ 952.991746] i8042: [237856] cf <- i8042 (interrupt, 1, 12)
[ 952.992771] i8042: [237856] 00 <- i8042 (interrupt, 1, 12)
[ 952.993799] i8042: [237857] 00 <- i8042 (interrupt, 1, 12)
[ 952.994903] i8042: [237857] 08 <- i8042 (interrupt, 1, 12)
[ 952.995812] i8042: [237857] 00 <- i8042 (interrupt, 1, 12)
[ 952.996840] i8042: [237857] 00 <- i8042 (interrupt, 1, 12)
[ 953.001822] i8042: [237859] cf <- i8042 (interrupt, 1, 12)
[ 953.002846] i8042: [237859] 00 <- i8042 (interrupt, 1, 12)
[ 953.003932] i8042: [237859] 00 <- i8042 (interrupt, 1, 12)
[ 953.005015] i8042: [237859] 08 <- i8042 (interrupt, 1, 12)
[ 953.005920] i8042: [237860] 00 <- i8042 (interrupt, 1, 12)
[ 953.006973] i8042: [237860] 00 <- i8042 (interrupt, 1, 12)
[ 953.012130] i8042: [237861] cf <- i8042 (interrupt, 1, 12)
[ 953.013158] i8042: [237861] 00 <- i8042 (interrupt, 1, 12)
[ 953.014187] i8042: [237862] 00 <- i8042 (interrupt, 1, 12)
[ 953.015292] i8042: [237862] 08 <- i8042 (interrupt, 1, 12)
[ 953.016203] i8042: [237862] 00 <- i8042 (interrupt, 1, 12)
[ 953.018273] i8042: [237863] 00 <- i8042 (interrupt, 1, 12)
[ 953.022250] i8042: [237864] cf <- i8042 (interrupt, 1, 12)
[ 953.023275] i8042: [237864] 00 <- i8042 (interrupt, 1, 12)
[ 953.024301] i8042: [237864] 00 <- i8042 (interrupt, 1, 12)
[ 953.025407] i8042: [237864] 08 <- i8042 (interrupt, 1, 12)
[ 953.026319] i8042: [237865] 00 <- i8042 (interrupt, 1, 12)
[ 953.027343] i8042: [237865] 00 <- i8042 (interrupt, 1, 12)
[ 953.032384] i8042: [237866] 8f <- i8042 (interrupt, 1, 12)
[ 953.033410] i8042: [237866] 00 <- i8042 (interrupt, 1, 12)
[ 953.034437] i8042: [237867] 00 <- i8042 (interrupt, 1, 12)
[ 953.035542] i8042: [237867] 08 <- i8042 (interrupt, 1, 12)
[ 953.036452] i8042: [237867] 00 <- i8042 (interrupt, 1, 12)
[ 953.037479] i8042: [237867] 00 <- i8042 (interrupt, 1, 12)
[ 953.042635] i8042: [237869] 8f <- i8042 (interrupt, 1, 12)
[ 953.043660] i8042: [237869] 00 <- i8042 (interrupt, 1, 12)
[ 953.044767] i8042: [237869] 00 <- i8042 (interrupt, 1, 12)
[ 953.045677] i8042: [237869] 08 <- i8042 (interrupt, 1, 12)
[ 953.046702] i8042: [237870] 00 <- i8042 (interrupt, 1, 12)
[ 953.047729] i8042: [237870] 00 <- i8042 (interrupt, 1, 12)
[ 953.052767] i8042: [237871] 8f <- i8042 (interrupt, 1, 12)
[ 953.053793] i8042: [237872] 00 <- i8042 (interrupt, 1, 12)
[ 953.054902] i8042: [237872] 00 <- i8042 (interrupt, 1, 12)
[ 953.055810] i8042: [237872] 08 <- i8042 (interrupt, 1, 12)
[ 953.056837] i8042: [237872] 00 <- i8042 (interrupt, 1, 12)
[ 953.057864] i8042: [237873] 00 <- i8042 (interrupt, 1, 12)
[ 953.062903] i8042: [237874] 8f <- i8042 (interrupt, 1, 12)
[ 953.063929] i8042: [237874] 00 <- i8042 (interrupt, 1, 12)
[ 953.065035] i8042: [237874] 00 <- i8042 (interrupt, 1, 12)
[ 953.065946] i8042: [237875] 08 <- i8042 (interrupt, 1, 12)
[ 953.066971] i8042: [237875] 00 <- i8042 (interrupt, 1, 12)
[ 953.067998] i8042: [237875] 00 <- i8042 (interrupt, 1, 12)
[ 953.073154] i8042: [237876] 8f <- i8042 (interrupt, 1, 12)
[ 953.074207] i8042: [237877] 00 <- i8042 (interrupt, 1, 12)
[ 953.075111] i8042: [237877] 00 <- i8042 (interrupt, 1, 12)
[ 953.076139] i8042: [237877] 08 <- i8042 (interrupt, 1, 12)
[ 953.077203] i8042: [237877] 00 <- i8042 (interrupt, 1, 12)
[ 953.078250] i8042: [237878] 00 <- i8042 (interrupt, 1, 12)
[ 953.083291] i8042: [237879] 8f <- i8042 (interrupt, 1, 12)
[ 953.084377] i8042: [237879] 00 <- i8042 (interrupt, 1, 12)
[ 953.085287] i8042: [237879] 00 <- i8042 (interrupt, 1, 12)
[ 953.086313] i8042: [237880] 08 <- i8042 (interrupt, 1, 12)
[ 953.087343] i8042: [237880] 00 <- i8042 (interrupt, 1, 12)
[ 953.088368] i8042: [237880] 00 <- i8042 (interrupt, 1, 12)
[ 953.093577] i8042: [237881] 8f <- i8042 (interrupt, 1, 12)
[ 953.094486] i8042: [237882] 00 <- i8042 (interrupt, 1, 12)
[ 953.095510] i8042: [237882] 00 <- i8042 (interrupt, 1, 12)
[ 953.096538] i8042: [237882] 08 <- i8042 (interrupt, 1, 12)
[ 953.097565] i8042: [237882] 00 <- i8042 (interrupt, 1, 12)
[ 953.098591] i8042: [237883] 00 <- i8042 (interrupt, 1, 12)
[ 953.103710] i8042: [237884] 8f <- i8042 (interrupt, 1, 12)
[ 953.104737] i8042: [237884] 00 <- i8042 (interrupt, 1, 12)
[ 953.105765] i8042: [237885] 00 <- i8042 (interrupt, 1, 12)
[ 953.106789] i8042: [237885] 08 <- i8042 (interrupt, 1, 12)
[ 953.107817] i8042: [237885] 00 <- i8042 (interrupt, 1, 12)
[ 953.109134] i8042: [237885] 00 <- i8042 (interrupt, 1, 12)
[ 953.113937] i8042: [237887] 8f <- i8042 (interrupt, 1, 12)
[ 953.114844] i8042: [237887] 00 <- i8042 (interrupt, 1, 12)
[ 953.116203] i8042: [237887] 00 <- i8042 (interrupt, 1, 12)
[ 953.117232] i8042: [237887] 08 <- i8042 (interrupt, 1, 12)
[ 953.118259] i8042: [237888] 00 <- i8042 (interrupt, 1, 12)
[ 953.119284] i8042: [237888] 00 <- i8042 (interrupt, 1, 12)
[ 953.124037] i8042: [237889] 8f <- i8042 (interrupt, 1, 12)
[ 953.124946] i8042: [237889] 00 <- i8042 (interrupt, 1, 12)
[ 953.125972] i8042: [237890] 00 <- i8042 (interrupt, 1, 12)
[ 953.126999] i8042: [237890] 08 <- i8042 (interrupt, 1, 12)
[ 953.128026] i8042: [237890] 00 <- i8042 (interrupt, 1, 12)
[ 953.129051] i8042: [237890] 00 <- i8042 (interrupt, 1, 12)
[ 953.134172] i8042: [237892] 8f <- i8042 (interrupt, 1, 12)
[ 953.135199] i8042: [237892] 00 <- i8042 (interrupt, 1, 12)
[ 953.136225] i8042: [237892] 00 <- i8042 (interrupt, 1, 12)
[ 953.137252] i8042: [237892] 08 <- i8042 (interrupt, 1, 12)
[ 953.138280] i8042: [237893] 00 <- i8042 (interrupt, 1, 12)
[ 953.139305] i8042: [237893] 00 <- i8042 (interrupt, 1, 12)
[ 953.144400] i8042: [237894] 8f <- i8042 (interrupt, 1, 12)
[ 953.145455] i8042: [237894] 00 <- i8042 (interrupt, 1, 12)
[ 953.146482] i8042: [237895] 00 <- i8042 (interrupt, 1, 12)
[ 953.147490] i8042: [237895] 08 <- i8042 (interrupt, 1, 12)
[ 953.148517] i8042: [237895] 00 <- i8042 (interrupt, 1, 12)
[ 953.149543] i8042: [237895] 00 <- i8042 (interrupt, 1, 12)
[ 954.049843] i8042: [238120] 8f <- i8042 (interrupt, 1, 12)
[ 954.050949] i8042: [238121] 00 <- i8042 (interrupt, 1, 12)
[ 954.051858] i8042: [238121] 00 <- i8042 (interrupt, 1, 12)
[ 954.052883] i8042: [238121] 08 <- i8042 (interrupt, 1, 12)
[ 954.053910] i8042: [238121] 40 <- i8042 (interrupt, 1, 12)
[ 954.054937] i8042: [238122] 00 <- i8042 (interrupt, 1, 12)
[ 954.060046] i8042: [238123] cf <- i8042 (interrupt, 1, 12)
[ 954.060954] i8042: [238123] 00 <- i8042 (interrupt, 1, 12)
[ 954.061981] i8042: [238123] 00 <- i8042 (interrupt, 1, 12)
[ 954.063008] i8042: [238124] 08 <- i8042 (interrupt, 1, 12)
[ 954.064035] i8042: [238124] 00 <- i8042 (interrupt, 1, 12)
[ 954.065062] i8042: [238124] 00 <- i8042 (interrupt, 1, 12)
[ 954.070182] i8042: [238125] 8f <- i8042 (interrupt, 1, 12)
[ 954.071212] i8042: [238126] 00 <- i8042 (interrupt, 1, 12)
[ 954.072219] i8042: [238126] 00 <- i8042 (interrupt, 1, 12)
[ 954.073245] i8042: [238126] 08 <- i8042 (interrupt, 1, 12)
[ 954.074273] i8042: [238126] 40 <- i8042 (interrupt, 1, 12)
[ 954.075299] i8042: [238127] 00 <- i8042 (interrupt, 1, 12)
[ 954.080421] i8042: [238128] cf <- i8042 (interrupt, 1, 12)
[ 954.081445] i8042: [238128] 00 <- i8042 (interrupt, 1, 12)
[ 954.082473] i8042: [238129] 70 <- i8042 (interrupt, 1, 12)
[ 954.083498] i8042: [238129] 7f <- i8042 (interrupt, 1, 12)
[ 954.084524] i8042: [238129] 00 <- i8042 (interrupt, 1, 12)
[ 954.085844] i8042: [238129] ff <- i8042 (interrupt, 1, 12)
[ 954.085850] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.090501] i8042: [238131] 8f <- i8042 (interrupt, 1, 12)
[ 954.091526] i8042: [238131] 00 <- i8042 (interrupt, 1, 12)
[ 954.093227] i8042: [238131] 00 <- i8042 (interrupt, 1, 12)
[ 954.094253] i8042: [238131] 08 <- i8042 (interrupt, 1, 12)
[ 954.095278] i8042: [238132] 40 <- i8042 (interrupt, 1, 12)
[ 954.096305] i8042: [238132] 00 <- i8042 (interrupt, 1, 12)
[ 954.100692] i8042: [238133] cf <- i8042 (interrupt, 1, 12)
[ 954.101718] i8042: [238133] 00 <- i8042 (interrupt, 1, 12)
[ 954.102745] i8042: [238134] 70 <- i8042 (interrupt, 1, 12)
[ 954.103718] i8042: [238134] 7f <- i8042 (interrupt, 1, 12)
[ 954.104739] i8042: [238134] 00 <- i8042 (interrupt, 1, 12)
[ 954.105823] i8042: [238134] ff <- i8042 (interrupt, 1, 12)
[ 954.105829] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.110799] i8042: [238136] cf <- i8042 (interrupt, 1, 12)
[ 954.111824] i8042: [238136] 00 <- i8042 (interrupt, 1, 12)
[ 954.112851] i8042: [238136] 00 <- i8042 (interrupt, 1, 12)
[ 954.113877] i8042: [238136] 08 <- i8042 (interrupt, 1, 12)
[ 954.114904] i8042: [238137] 00 <- i8042 (interrupt, 1, 12)
[ 954.115929] i8042: [238137] 00 <- i8042 (interrupt, 1, 12)
[ 954.121020] i8042: [238138] 8f <- i8042 (interrupt, 1, 12)
[ 954.122048] i8042: [238138] 00 <- i8042 (interrupt, 1, 12)
[ 954.123074] i8042: [238139] 00 <- i8042 (interrupt, 1, 12)
[ 954.124100] i8042: [238139] 08 <- i8042 (interrupt, 1, 12)
[ 954.125125] i8042: [238139] 40 <- i8042 (interrupt, 1, 12)
[ 954.126153] i8042: [238139] 00 <- i8042 (interrupt, 1, 12)
[ 954.131225] i8042: [238141] cf <- i8042 (interrupt, 1, 12)
[ 954.132248] i8042: [238141] 00 <- i8042 (interrupt, 1, 12)
[ 954.133274] i8042: [238141] 70 <- i8042 (interrupt, 1, 12)
[ 954.134302] i8042: [238141] 7f <- i8042 (interrupt, 1, 12)
[ 954.135329] i8042: [238142] 00 <- i8042 (interrupt, 1, 12)
[ 954.136354] i8042: [238142] ff <- i8042 (interrupt, 1, 12)
[ 954.136360] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.141326] i8042: [238143] 8f <- i8042 (interrupt, 1, 12)
[ 954.142356] i8042: [238143] 00 <- i8042 (interrupt, 1, 12)
[ 954.143382] i8042: [238144] 00 <- i8042 (interrupt, 1, 12)
[ 954.144406] i8042: [238144] 08 <- i8042 (interrupt, 1, 12)
[ 954.145432] i8042: [238144] 40 <- i8042 (interrupt, 1, 12)
[ 954.146461] i8042: [238145] 00 <- i8042 (interrupt, 1, 12)
[ 954.151551] i8042: [238146] cf <- i8042 (interrupt, 1, 12)
[ 954.152544] i8042: [238146] 00 <- i8042 (interrupt, 1, 12)
[ 954.153603] i8042: [238146] 70 <- i8042 (interrupt, 1, 12)
[ 954.154631] i8042: [238147] 7f <- i8042 (interrupt, 1, 12)
[ 954.155656] i8042: [238147] 00 <- i8042 (interrupt, 1, 12)
[ 954.156681] i8042: [238147] ff <- i8042 (interrupt, 1, 12)
[ 954.156687] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.161757] i8042: [238148] 8f <- i8042 (interrupt, 1, 12)
[ 954.162783] i8042: [238149] 00 <- i8042 (interrupt, 1, 12)
[ 954.163809] i8042: [238149] 00 <- i8042 (interrupt, 1, 12)
[ 954.164835] i8042: [238149] 08 <- i8042 (interrupt, 1, 12)
[ 954.165862] i8042: [238149] 40 <- i8042 (interrupt, 1, 12)
[ 954.166889] i8042: [238150] 00 <- i8042 (interrupt, 1, 12)
[ 954.171863] i8042: [238151] cf <- i8042 (interrupt, 1, 12)
[ 954.172885] i8042: [238151] 00 <- i8042 (interrupt, 1, 12)
[ 954.173913] i8042: [238151] 70 <- i8042 (interrupt, 1, 12)
[ 954.174942] i8042: [238152] 7f <- i8042 (interrupt, 1, 12)
[ 954.175910] i8042: [238152] 00 <- i8042 (interrupt, 1, 12)
[ 954.176932] i8042: [238152] ff <- i8042 (interrupt, 1, 12)
[ 954.176937] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.182082] i8042: [238153] 8f <- i8042 (interrupt, 1, 12)
[ 954.183111] i8042: [238154] 00 <- i8042 (interrupt, 1, 12)
[ 954.184134] i8042: [238154] 00 <- i8042 (interrupt, 1, 12)
[ 954.185162] i8042: [238154] 08 <- i8042 (interrupt, 1, 12)
[ 954.186188] i8042: [238154] 40 <- i8042 (interrupt, 1, 12)
[ 954.187216] i8042: [238155] 00 <- i8042 (interrupt, 1, 12)
[ 954.192270] i8042: [238156] cf <- i8042 (interrupt, 1, 12)
[ 954.193296] i8042: [238156] 00 <- i8042 (interrupt, 1, 12)
[ 954.194320] i8042: [238156] 7c <- i8042 (interrupt, 1, 12)
[ 954.195350] i8042: [238157] 7f <- i8042 (interrupt, 1, 12)
[ 954.196374] i8042: [238157] 02 <- i8042 (interrupt, 1, 12)
[ 954.197400] i8042: [238157] ff <- i8042 (interrupt, 1, 12)
[ 954.197406] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.202358] i8042: [238158] 8f <- i8042 (interrupt, 1, 12)
[ 954.203383] i8042: [238159] 00 <- i8042 (interrupt, 1, 12)
[ 954.204409] i8042: [238159] 00 <- i8042 (interrupt, 1, 12)
[ 954.205435] i8042: [238159] 08 <- i8042 (interrupt, 1, 12)
[ 954.206405] i8042: [238160] 40 <- i8042 (interrupt, 1, 12)
[ 954.207776] i8042: [238160] 00 <- i8042 (interrupt, 1, 12)
[ 954.212557] i8042: [238161] cf <- i8042 (interrupt, 1, 12)
[ 954.213584] i8042: [238161] 00 <- i8042 (interrupt, 1, 12)
[ 954.214611] i8042: [238162] 7c <- i8042 (interrupt, 1, 12)
[ 954.215582] i8042: [238162] 7f <- i8042 (interrupt, 1, 12)
[ 954.216662] i8042: [238162] 02 <- i8042 (interrupt, 1, 12)
[ 954.217770] i8042: [238162] ff <- i8042 (interrupt, 1, 12)
[ 954.217776] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.222791] i8042: [238164] 8f <- i8042 (interrupt, 1, 12)
[ 954.223817] i8042: [238164] 00 <- i8042 (interrupt, 1, 12)
[ 954.224844] i8042: [238164] 00 <- i8042 (interrupt, 1, 12)
[ 954.225868] i8042: [238164] 08 <- i8042 (interrupt, 1, 12)
[ 954.226896] i8042: [238165] 40 <- i8042 (interrupt, 1, 12)
[ 954.228002] i8042: [238165] 00 <- i8042 (interrupt, 1, 12)
[ 954.232927] i8042: [238166] cf <- i8042 (interrupt, 1, 12)
[ 954.233952] i8042: [238166] 00 <- i8042 (interrupt, 1, 12)
[ 954.234979] i8042: [238167] 00 <- i8042 (interrupt, 1, 12)
[ 954.236007] i8042: [238167] 08 <- i8042 (interrupt, 1, 12)
[ 954.237035] i8042: [238167] 00 <- i8042 (interrupt, 1, 12)
[ 954.238141] i8042: [238167] 00 <- i8042 (interrupt, 1, 12)
[ 954.243035] i8042: [238169] 8f <- i8042 (interrupt, 1, 12)
[ 954.244088] i8042: [238169] 00 <- i8042 (interrupt, 1, 12)
[ 954.245116] i8042: [238169] 00 <- i8042 (interrupt, 1, 12)
[ 954.246142] i8042: [238169] 08 <- i8042 (interrupt, 1, 12)
[ 954.247171] i8042: [238170] 40 <- i8042 (interrupt, 1, 12)
[ 954.248277] i8042: [238170] 00 <- i8042 (interrupt, 1, 12)
[ 954.253298] i8042: [238171] cf <- i8042 (interrupt, 1, 12)
[ 954.254323] i8042: [238171] 7d <- i8042 (interrupt, 1, 12)
[ 954.255348] i8042: [238172] 7c <- i8042 (interrupt, 1, 12)
[ 954.256376] i8042: [238172] 7f <- i8042 (interrupt, 1, 12)
[ 954.257483] i8042: [238172] 16 <- i8042 (interrupt, 1, 12)
[ 954.258395] i8042: [238172] ff <- i8042 (interrupt, 1, 12)
[ 954.258401] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.263413] i8042: [238174] cf <- i8042 (interrupt, 1, 12)
[ 954.264440] i8042: [238174] 00 <- i8042 (interrupt, 1, 12)
[ 954.265468] i8042: [238174] 00 <- i8042 (interrupt, 1, 12)
[ 954.266453] i8042: [238175] 08 <- i8042 (interrupt, 1, 12)
[ 954.267600] i8042: [238175] 00 <- i8042 (interrupt, 1, 12)
[ 954.268508] i8042: [238175] 00 <- i8042 (interrupt, 1, 12)
[ 954.273649] i8042: [238176] cf <- i8042 (interrupt, 1, 12)
[ 954.274619] i8042: [238177] 00 <- i8042 (interrupt, 1, 12)
[ 954.275641] i8042: [238177] 00 <- i8042 (interrupt, 1, 12)
[ 954.276724] i8042: [238177] 08 <- i8042 (interrupt, 1, 12)
[ 954.277835] i8042: [238177] 00 <- i8042 (interrupt, 1, 12)
[ 954.278743] i8042: [238178] 00 <- i8042 (interrupt, 1, 12)
[ 954.283783] i8042: [238179] 8f <- i8042 (interrupt, 1, 12)
[ 954.284807] i8042: [238179] 00 <- i8042 (interrupt, 1, 12)
[ 954.285812] i8042: [238179] 00 <- i8042 (interrupt, 1, 12)
[ 954.286861] i8042: [238180] 08 <- i8042 (interrupt, 1, 12)
[ 954.288751] i8042: [238180] 40 <- i8042 (interrupt, 1, 12)
[ 954.289778] i8042: [238180] 00 <- i8042 (interrupt, 1, 12)
[ 954.293993] i8042: [238181] cf <- i8042 (interrupt, 1, 12)
[ 954.295019] i8042: [238182] 7d <- i8042 (interrupt, 1, 12)
[ 954.296046] i8042: [238182] 7c <- i8042 (interrupt, 1, 12)
[ 954.297071] i8042: [238182] 7f <- i8042 (interrupt, 1, 12)
[ 954.298099] i8042: [238182] 16 <- i8042 (interrupt, 1, 12)
[ 954.299207] i8042: [238183] ff <- i8042 (interrupt, 1, 12)
[ 954.299213] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.304126] i8042: [238184] 8f <- i8042 (interrupt, 1, 12)
[ 954.305152] i8042: [238184] 53 <- i8042 (interrupt, 1, 12)
[ 954.306179] i8042: [238184] 2c <- i8042 (interrupt, 1, 12)
[ 954.307209] i8042: [238185] 08 <- i8042 (interrupt, 1, 12)
[ 954.308232] i8042: [238185] 63 <- i8042 (interrupt, 1, 12)
[ 954.309338] i8042: [238185] 18 <- i8042 (interrupt, 1, 12)
[ 954.314261] i8042: [238186] ef <- i8042 (interrupt, 1, 12)
[ 954.315287] i8042: [238187] 7f <- i8042 (interrupt, 1, 12)
[ 954.316314] i8042: [238187] 7f <- i8042 (interrupt, 1, 12)
[ 954.317340] i8042: [238187] 7f <- i8042 (interrupt, 1, 12)
[ 954.318366] i8042: [238187] 7e <- i8042 (interrupt, 1, 12)
[ 954.319472] i8042: [238188] 77 <- i8042 (interrupt, 1, 12)
[ 954.324515] i8042: [238189] cf <- i8042 (interrupt, 1, 12)
[ 954.325541] i8042: [238189] 53 <- i8042 (interrupt, 1, 12)
[ 954.326569] i8042: [238190] 3b <- i8042 (interrupt, 1, 12)
[ 954.327555] i8042: [238190] 08 <- i8042 (interrupt, 1, 12)
[ 954.328701] i8042: [238190] 2c <- i8042 (interrupt, 1, 12)
[ 954.329893] i8042: [238190] 24 <- i8042 (interrupt, 1, 12)
[ 954.334572] i8042: [238192] 8f <- i8042 (interrupt, 1, 12)
[ 954.335643] i8042: [238192] 53 <- i8042 (interrupt, 1, 12)
[ 954.336670] i8042: [238192] 3b <- i8042 (interrupt, 1, 12)
[ 954.337695] i8042: [238192] 08 <- i8042 (interrupt, 1, 12)
[ 954.338803] i8042: [238193] 6c <- i8042 (interrupt, 1, 12)
[ 954.339708] i8042: [238193] 00 <- i8042 (interrupt, 1, 12)
[ 954.344868] i8042: [238194] cf <- i8042 (interrupt, 1, 12)
[ 954.345892] i8042: [238194] 7f <- i8042 (interrupt, 1, 12)
[ 954.346878] i8042: [238195] 7e <- i8042 (interrupt, 1, 12)
[ 954.347901] i8042: [238195] 7f <- i8042 (interrupt, 1, 12)
[ 954.349007] i8042: [238195] 7e <- i8042 (interrupt, 1, 12)
[ 954.349916] i8042: [238195] 62 <- i8042 (interrupt, 1, 12)
[ 954.355000] i8042: [238197] 8f <- i8042 (interrupt, 1, 12)
[ 954.356008] i8042: [238197] 53 <- i8042 (interrupt, 1, 12)
[ 954.357033] i8042: [238197] 3a <- i8042 (interrupt, 1, 12)
[ 954.358020] i8042: [238197] 08 <- i8042 (interrupt, 1, 12)
[ 954.359122] i8042: [238198] 7f <- i8042 (interrupt, 1, 12)
[ 954.360030] i8042: [238198] 00 <- i8042 (interrupt, 1, 12)
[ 954.365110] i8042: [238199] cf <- i8042 (interrupt, 1, 12)
[ 954.366136] i8042: [238199] 7f <- i8042 (interrupt, 1, 12)
[ 954.367163] i8042: [238200] 7e <- i8042 (interrupt, 1, 12)
[ 954.368191] i8042: [238200] 7f <- i8042 (interrupt, 1, 12)
[ 954.369295] i8042: [238200] 7e <- i8042 (interrupt, 1, 12)
[ 954.370203] i8042: [238200] 66 <- i8042 (interrupt, 1, 12)
[ 954.375363] i8042: [238202] 8f <- i8042 (interrupt, 1, 12)
[ 954.376388] i8042: [238202] 53 <- i8042 (interrupt, 1, 12)
[ 954.377415] i8042: [238202] 3a <- i8042 (interrupt, 1, 12)
[ 954.378520] i8042: [238203] 08 <- i8042 (interrupt, 1, 12)
[ 954.379427] i8042: [238203] 7f <- i8042 (interrupt, 1, 12)
[ 954.380454] i8042: [238203] 00 <- i8042 (interrupt, 1, 12)
[ 954.386345] i8042: [238204] cf <- i8042 (interrupt, 1, 12)
[ 954.387370] i8042: [238205] 7f <- i8042 (interrupt, 1, 12)
[ 954.388533] i8042: [238205] 7e <- i8042 (interrupt, 1, 12)
[ 954.389442] i8042: [238205] 7f <- i8042 (interrupt, 1, 12)
[ 954.390468] i8042: [238205] 7e <- i8042 (interrupt, 1, 12)
[ 954.391497] i8042: [238206] 67 <- i8042 (interrupt, 1, 12)
[ 954.395709] i8042: [238207] 8f <- i8042 (interrupt, 1, 12)
[ 954.396735] i8042: [238207] 53 <- i8042 (interrupt, 1, 12)
[ 954.397758] i8042: [238207] 3a <- i8042 (interrupt, 1, 12)
[ 954.398869] i8042: [238208] 08 <- i8042 (interrupt, 1, 12)
[ 954.399774] i8042: [238208] 7f <- i8042 (interrupt, 1, 12)
[ 954.400802] i8042: [238208] 00 <- i8042 (interrupt, 1, 12)
[ 954.405843] i8042: [238209] ef <- i8042 (interrupt, 1, 12)
[ 954.406869] i8042: [238210] 7f <- i8042 (interrupt, 1, 12)
[ 954.407895] i8042: [238210] 7f <- i8042 (interrupt, 1, 12)
[ 954.409003] i8042: [238210] 7f <- i8042 (interrupt, 1, 12)
[ 954.409911] i8042: [238210] 7e <- i8042 (interrupt, 1, 12)
[ 954.410938] i8042: [238211] 77 <- i8042 (interrupt, 1, 12)
[ 954.416024] i8042: [238212] 8f <- i8042 (interrupt, 1, 12)
[ 954.417105] i8042: [238212] 53 <- i8042 (interrupt, 1, 12)
[ 954.418099] i8042: [238212] 54 <- i8042 (interrupt, 1, 12)
[ 954.419182] i8042: [238213] 08 <- i8042 (interrupt, 1, 12)
[ 954.420089] i8042: [238213] 7d <- i8042 (interrupt, 1, 12)
[ 954.421115] i8042: [238213] 00 <- i8042 (interrupt, 1, 12)
[ 954.426213] i8042: [238214] cf <- i8042 (interrupt, 1, 12)
[ 954.427240] i8042: [238215] 7f <- i8042 (interrupt, 1, 12)
[ 954.428307] i8042: [238215] 7e <- i8042 (interrupt, 1, 12)
[ 954.429212] i8042: [238215] 7f <- i8042 (interrupt, 1, 12)
[ 954.430238] i8042: [238215] 7e <- i8042 (interrupt, 1, 12)
[ 954.431306] i8042: [238216] 67 <- i8042 (interrupt, 1, 12)
[ 954.436346] i8042: [238217] 9f <- i8042 (interrupt, 1, 12)
[ 954.437371] i8042: [238217] 6e <- i8042 (interrupt, 1, 12)
[ 954.438479] i8042: [238217] 54 <- i8042 (interrupt, 1, 12)
[ 954.439331] i8042: [238218] 08 <- i8042 (interrupt, 1, 12)
[ 954.440355] i8042: [238218] 7d <- i8042 (interrupt, 1, 12)
[ 954.441385] i8042: [238218] 19 <- i8042 (interrupt, 1, 12)
[ 954.446594] i8042: [238220] ef <- i8042 (interrupt, 1, 12)
[ 954.447624] i8042: [238220] 7f <- i8042 (interrupt, 1, 12)
[ 954.448730] i8042: [238220] 7f <- i8042 (interrupt, 1, 12)
[ 954.449584] i8042: [238220] 7f <- i8042 (interrupt, 1, 12)
[ 954.450607] i8042: [238221] 7e <- i8042 (interrupt, 1, 12)
[ 954.451981] i8042: [238221] 77 <- i8042 (interrupt, 1, 12)
[ 954.456703] i8042: [238222] 9f <- i8042 (interrupt, 1, 12)
[ 954.457729] i8042: [238222] 6e <- i8042 (interrupt, 1, 12)
[ 954.458805] i8042: [238223] 54 <- i8042 (interrupt, 1, 12)
[ 954.459745] i8042: [238223] 08 <- i8042 (interrupt, 1, 12)
[ 954.460774] i8042: [238223] 7c <- i8042 (interrupt, 1, 12)
[ 954.461800] i8042: [238223] 00 <- i8042 (interrupt, 1, 12)
[ 954.466937] i8042: [238225] ef <- i8042 (interrupt, 1, 12)
[ 954.467965] i8042: [238225] 7f <- i8042 (interrupt, 1, 12)
[ 954.469071] i8042: [238225] 7f <- i8042 (interrupt, 1, 12)
[ 954.469979] i8042: [238225] 7f <- i8042 (interrupt, 1, 12)
[ 954.471007] i8042: [238226] 7e <- i8042 (interrupt, 1, 12)
[ 954.472033] i8042: [238226] 77 <- i8042 (interrupt, 1, 12)
[ 954.477072] i8042: [238227] 9f <- i8042 (interrupt, 1, 12)
[ 954.478179] i8042: [238227] 53 <- i8042 (interrupt, 1, 12)
[ 954.479088] i8042: [238228] 54 <- i8042 (interrupt, 1, 12)
[ 954.480115] i8042: [238228] 08 <- i8042 (interrupt, 1, 12)
[ 954.481142] i8042: [238228] 7e <- i8042 (interrupt, 1, 12)
[ 954.482167] i8042: [238228] 1a <- i8042 (interrupt, 1, 12)
[ 954.487235] i8042: [238230] ef <- i8042 (interrupt, 1, 12)
[ 954.488343] i8042: [238230] 7f <- i8042 (interrupt, 1, 12)
[ 954.489253] i8042: [238230] 7f <- i8042 (interrupt, 1, 12)
[ 954.490278] i8042: [238230] 7f <- i8042 (interrupt, 1, 12)
[ 954.491308] i8042: [238231] 7e <- i8042 (interrupt, 1, 12)
[ 954.492332] i8042: [238231] 77 <- i8042 (interrupt, 1, 12)
[ 954.497374] i8042: [238232] 8f <- i8042 (interrupt, 1, 12)
[ 954.498479] i8042: [238232] 53 <- i8042 (interrupt, 1, 12)
[ 954.499387] i8042: [238233] 54 <- i8042 (interrupt, 1, 12)
[ 954.500414] i8042: [238233] 08 <- i8042 (interrupt, 1, 12)
[ 954.501440] i8042: [238233] 7e <- i8042 (interrupt, 1, 12)
[ 954.502466] i8042: [238233] 1a <- i8042 (interrupt, 1, 12)
[ 954.507693] i8042: [238235] ef <- i8042 (interrupt, 1, 12)
[ 954.508601] i8042: [238235] 7f <- i8042 (interrupt, 1, 12)
[ 954.509629] i8042: [238235] 7f <- i8042 (interrupt, 1, 12)
[ 954.510657] i8042: [238236] 7f <- i8042 (interrupt, 1, 12)
[ 954.511683] i8042: [238236] 7e <- i8042 (interrupt, 1, 12)
[ 954.512710] i8042: [238236] 77 <- i8042 (interrupt, 1, 12)
[ 954.517774] i8042: [238237] af <- i8042 (interrupt, 1, 12)
[ 954.518799] i8042: [238238] 6e <- i8042 (interrupt, 1, 12)
[ 954.519854] i8042: [238238] 54 <- i8042 (interrupt, 1, 12)
[ 954.520909] i8042: [238238] 08 <- i8042 (interrupt, 1, 12)
[ 954.521936] i8042: [238238] 7f <- i8042 (interrupt, 1, 12)
[ 954.522962] i8042: [238239] 1c <- i8042 (interrupt, 1, 12)
[ 954.528063] i8042: [238240] ef <- i8042 (interrupt, 1, 12)
[ 954.529090] i8042: [238240] 7f <- i8042 (interrupt, 1, 12)
[ 954.530116] i8042: [238240] 7f <- i8042 (interrupt, 1, 12)
[ 954.531146] i8042: [238241] 7f <- i8042 (interrupt, 1, 12)
[ 954.532171] i8042: [238241] 7e <- i8042 (interrupt, 1, 12)
[ 954.533199] i8042: [238241] 77 <- i8042 (interrupt, 1, 12)
[ 954.538200] i8042: [238242] 8f <- i8042 (interrupt, 1, 12)
[ 954.539108] i8042: [238243] 53 <- i8042 (interrupt, 1, 12)
[ 954.540137] i8042: [238243] 54 <- i8042 (interrupt, 1, 12)
[ 954.541164] i8042: [238243] 08 <- i8042 (interrupt, 1, 12)
[ 954.542191] i8042: [238243] 7e <- i8042 (interrupt, 1, 12)
[ 954.543218] i8042: [238244] 1a <- i8042 (interrupt, 1, 12)
[ 954.548339] i8042: [238245] ef <- i8042 (interrupt, 1, 12)
[ 954.549308] i8042: [238245] 7f <- i8042 (interrupt, 1, 12)
[ 954.550333] i8042: [238245] 7f <- i8042 (interrupt, 1, 12)
[ 954.551392] i8042: [238246] 7f <- i8042 (interrupt, 1, 12)
[ 954.552419] i8042: [238246] 7e <- i8042 (interrupt, 1, 12)
[ 954.553470] i8042: [238246] 73 <- i8042 (interrupt, 1, 12)
[ 954.558429] i8042: [238247] 8f <- i8042 (interrupt, 1, 12)
[ 954.559454] i8042: [238248] 53 <- i8042 (interrupt, 1, 12)
[ 954.560480] i8042: [238248] 54 <- i8042 (interrupt, 1, 12)
[ 954.561507] i8042: [238248] 08 <- i8042 (interrupt, 1, 12)
[ 954.562534] i8042: [238248] 7e <- i8042 (interrupt, 1, 12)
[ 954.563561] i8042: [238249] 1a <- i8042 (interrupt, 1, 12)
[ 954.568584] i8042: [238250] ef <- i8042 (interrupt, 1, 12)
[ 954.569608] i8042: [238250] 7f <- i8042 (interrupt, 1, 12)
[ 954.570692] i8042: [238251] 7f <- i8042 (interrupt, 1, 12)
[ 954.571718] i8042: [238251] 7f <- i8042 (interrupt, 1, 12)
[ 954.572743] i8042: [238251] 7e <- i8042 (interrupt, 1, 12)
[ 954.573771] i8042: [238251] 73 <- i8042 (interrupt, 1, 12)
[ 954.578739] i8042: [238253] 9f <- i8042 (interrupt, 1, 12)
[ 954.579754] i8042: [238253] 6e <- i8042 (interrupt, 1, 12)
[ 954.581737] i8042: [238253] 54 <- i8042 (interrupt, 1, 12)
[ 954.582788] i8042: [238254] 08 <- i8042 (interrupt, 1, 12)
[ 954.583792] i8042: [238254] 7e <- i8042 (interrupt, 1, 12)
[ 954.584813] i8042: [238254] 1d <- i8042 (interrupt, 1, 12)
[ 954.588998] i8042: [238255] ef <- i8042 (interrupt, 1, 12)
[ 954.590024] i8042: [238255] 7f <- i8042 (interrupt, 1, 12)
[ 954.591052] i8042: [238256] 7f <- i8042 (interrupt, 1, 12)
[ 954.592076] i8042: [238256] 7f <- i8042 (interrupt, 1, 12)
[ 954.593103] i8042: [238256] 7e <- i8042 (interrupt, 1, 12)
[ 954.594091] i8042: [238256] 77 <- i8042 (interrupt, 1, 12)
[ 954.599105] i8042: [238258] 9f <- i8042 (interrupt, 1, 12)
[ 954.600129] i8042: [238258] 53 <- i8042 (interrupt, 1, 12)
[ 954.601155] i8042: [238258] 54 <- i8042 (interrupt, 1, 12)
[ 954.602181] i8042: [238258] 08 <- i8042 (interrupt, 1, 12)
[ 954.603167] i8042: [238259] 7e <- i8042 (interrupt, 1, 12)
[ 954.604204] i8042: [238259] 1a <- i8042 (interrupt, 1, 12)
[ 954.609324] i8042: [238260] ef <- i8042 (interrupt, 1, 12)
[ 954.610309] i8042: [238260] 7f <- i8042 (interrupt, 1, 12)
[ 954.611327] i8042: [238261] 7e <- i8042 (interrupt, 1, 12)
[ 954.612351] i8042: [238261] 7f <- i8042 (interrupt, 1, 12)
[ 954.613377] i8042: [238261] 7e <- i8042 (interrupt, 1, 12)
[ 954.614420] i8042: [238261] 77 <- i8042 (interrupt, 1, 12)
[ 954.619545] i8042: [238263] 8f <- i8042 (interrupt, 1, 12)
[ 954.620570] i8042: [238263] 6e <- i8042 (interrupt, 1, 12)
[ 954.621596] i8042: [238263] 38 <- i8042 (interrupt, 1, 12)
[ 954.622584] i8042: [238263] 08 <- i8042 (interrupt, 1, 12)
[ 954.623646] i8042: [238264] 78 <- i8042 (interrupt, 1, 12)
[ 954.624674] i8042: [238264] 3e <- i8042 (interrupt, 1, 12)
[ 954.629645] i8042: [238265] ef <- i8042 (interrupt, 1, 12)
[ 954.630688] i8042: [238266] 7f <- i8042 (interrupt, 1, 12)
[ 954.631682] i8042: [238266] 7f <- i8042 (interrupt, 1, 12)
[ 954.632709] i8042: [238266] 7f <- i8042 (interrupt, 1, 12)
[ 954.633733] i8042: [238266] 7e <- i8042 (interrupt, 1, 12)
[ 954.634723] i8042: [238267] 77 <- i8042 (interrupt, 1, 12)
[ 954.639839] i8042: [238268] 8f <- i8042 (interrupt, 1, 12)
[ 954.640844] i8042: [238268] 6e <- i8042 (interrupt, 1, 12)
[ 954.641871] i8042: [238268] 54 <- i8042 (interrupt, 1, 12)
[ 954.642898] i8042: [238269] 08 <- i8042 (interrupt, 1, 12)
[ 954.643923] i8042: [238269] 7e <- i8042 (interrupt, 1, 12)
[ 954.644948] i8042: [238269] 1c <- i8042 (interrupt, 1, 12)
[ 954.649982] i8042: [238270] ef <- i8042 (interrupt, 1, 12)
[ 954.651039] i8042: [238271] 7f <- i8042 (interrupt, 1, 12)
[ 954.652062] i8042: [238271] 7f <- i8042 (interrupt, 1, 12)
[ 954.653058] i8042: [238271] 7f <- i8042 (interrupt, 1, 12)
[ 954.654118] i8042: [238271] 7e <- i8042 (interrupt, 1, 12)
[ 954.655248] i8042: [238272] 77 <- i8042 (interrupt, 1, 12)
[ 954.660165] i8042: [238273] af <- i8042 (interrupt, 1, 12)
[ 954.661189] i8042: [238273] 53 <- i8042 (interrupt, 1, 12)
[ 954.662194] i8042: [238273] 38 <- i8042 (interrupt, 1, 12)
[ 954.663243] i8042: [238274] 08 <- i8042 (interrupt, 1, 12)
[ 954.664269] i8042: [238274] 7a <- i8042 (interrupt, 1, 12)
[ 954.665375] i8042: [238274] 3e <- i8042 (interrupt, 1, 12)
[ 954.670391] i8042: [238275] ef <- i8042 (interrupt, 1, 12)
[ 954.671417] i8042: [238276] 7f <- i8042 (interrupt, 1, 12)
[ 954.672441] i8042: [238276] 7f <- i8042 (interrupt, 1, 12)
[ 954.673469] i8042: [238276] 7f <- i8042 (interrupt, 1, 12)
[ 954.674574] i8042: [238276] 7e <- i8042 (interrupt, 1, 12)
[ 954.675481] i8042: [238277] 73 <- i8042 (interrupt, 1, 12)
[ 954.680497] i8042: [238278] 8f <- i8042 (interrupt, 1, 12)
[ 954.681525] i8042: [238278] 53 <- i8042 (interrupt, 1, 12)
[ 954.682551] i8042: [238278] 54 <- i8042 (interrupt, 1, 12)
[ 954.683577] i8042: [238279] 08 <- i8042 (interrupt, 1, 12)
[ 954.684681] i8042: [238279] 7e <- i8042 (interrupt, 1, 12)
[ 954.685589] i8042: [238279] 1a <- i8042 (interrupt, 1, 12)
[ 954.690709] i8042: [238281] ef <- i8042 (interrupt, 1, 12)
[ 954.691769] i8042: [238281] 7f <- i8042 (interrupt, 1, 12)
[ 954.692795] i8042: [238281] 7f <- i8042 (interrupt, 1, 12)
[ 954.693821] i8042: [238281] 7f <- i8042 (interrupt, 1, 12)
[ 954.694894] i8042: [238282] 7e <- i8042 (interrupt, 1, 12)
[ 954.695833] i8042: [238282] 77 <- i8042 (interrupt, 1, 12)
[ 954.700828] i8042: [238283] 8f <- i8042 (interrupt, 1, 12)
[ 954.701854] i8042: [238283] 53 <- i8042 (interrupt, 1, 12)
[ 954.702881] i8042: [238284] 38 <- i8042 (interrupt, 1, 12)
[ 954.703906] i8042: [238284] 08 <- i8042 (interrupt, 1, 12)
[ 954.705014] i8042: [238284] 79 <- i8042 (interrupt, 1, 12)
[ 954.705922] i8042: [238284] 3e <- i8042 (interrupt, 1, 12)
[ 954.711080] i8042: [238286] ef <- i8042 (interrupt, 1, 12)
[ 954.712106] i8042: [238286] 7f <- i8042 (interrupt, 1, 12)
[ 954.713133] i8042: [238286] 7f <- i8042 (interrupt, 1, 12)
[ 954.714160] i8042: [238286] 7f <- i8042 (interrupt, 1, 12)
[ 954.715269] i8042: [238287] 7e <- i8042 (interrupt, 1, 12)
[ 954.716175] i8042: [238287] 73 <- i8042 (interrupt, 1, 12)
[ 954.721218] i8042: [238288] 9f <- i8042 (interrupt, 1, 12)
[ 954.722216] i8042: [238288] 6e <- i8042 (interrupt, 1, 12)
[ 954.723211] i8042: [238289] 54 <- i8042 (interrupt, 1, 12)
[ 954.724383] i8042: [238289] 08 <- i8042 (interrupt, 1, 12)
[ 954.725261] i8042: [238289] 7d <- i8042 (interrupt, 1, 12)
[ 954.726289] i8042: [238289] 1b <- i8042 (interrupt, 1, 12)
[ 954.731448] i8042: [238291] ef <- i8042 (interrupt, 1, 12)
[ 954.732474] i8042: [238291] 7f <- i8042 (interrupt, 1, 12)
[ 954.733502] i8042: [238291] 7f <- i8042 (interrupt, 1, 12)
[ 954.734608] i8042: [238291] 7f <- i8042 (interrupt, 1, 12)
[ 954.735517] i8042: [238292] 7e <- i8042 (interrupt, 1, 12)
[ 954.736544] i8042: [238292] 73 <- i8042 (interrupt, 1, 12)
[ 954.741584] i8042: [238293] 9f <- i8042 (interrupt, 1, 12)
[ 954.742586] i8042: [238293] 53 <- i8042 (interrupt, 1, 12)
[ 954.743636] i8042: [238294] 54 <- i8042 (interrupt, 1, 12)
[ 954.744743] i8042: [238294] 08 <- i8042 (interrupt, 1, 12)
[ 954.745653] i8042: [238294] 7e <- i8042 (interrupt, 1, 12)
[ 954.746679] i8042: [238294] 19 <- i8042 (interrupt, 1, 12)
[ 954.751722] i8042: [238296] ef <- i8042 (interrupt, 1, 12)
[ 954.752747] i8042: [238296] 7f <- i8042 (interrupt, 1, 12)
[ 954.753774] i8042: [238296] 7e <- i8042 (interrupt, 1, 12)
[ 954.754886] i8042: [238297] 7f <- i8042 (interrupt, 1, 12)
[ 954.755716] i8042: [238297] 7e <- i8042 (interrupt, 1, 12)
[ 954.756744] i8042: [238297] 67 <- i8042 (interrupt, 1, 12)
[ 954.761957] i8042: [238298] bf <- i8042 (interrupt, 1, 12)
[ 954.762986] i8042: [238299] 53 <- i8042 (interrupt, 1, 12)
[ 954.764012] i8042: [238299] 54 <- i8042 (interrupt, 1, 12)
[ 954.765119] i8042: [238299] 08 <- i8042 (interrupt, 1, 12)
[ 954.766006] i8042: [238299] 6e <- i8042 (interrupt, 1, 12)
[ 954.767027] i8042: [238300] 19 <- i8042 (interrupt, 1, 12)
[ 954.772097] i8042: [238301] ef <- i8042 (interrupt, 1, 12)
[ 954.773122] i8042: [238301] 7f <- i8042 (interrupt, 1, 12)
[ 954.774223] i8042: [238301] 7f <- i8042 (interrupt, 1, 12)
[ 954.775128] i8042: [238302] 7f <- i8042 (interrupt, 1, 12)
[ 954.777203] i8042: [238302] 7e <- i8042 (interrupt, 1, 12)
[ 954.778209] i8042: [238302] 77 <- i8042 (interrupt, 1, 12)
[ 954.782306] i8042: [238303] 9f <- i8042 (interrupt, 1, 12)
[ 954.783333] i8042: [238304] 6e <- i8042 (interrupt, 1, 12)
[ 954.784410] i8042: [238304] 54 <- i8042 (interrupt, 1, 12)
[ 954.785347] i8042: [238304] 08 <- i8042 (interrupt, 1, 12)
[ 954.786322] i8042: [238304] 7d <- i8042 (interrupt, 1, 12)
[ 954.787343] i8042: [238305] 1a <- i8042 (interrupt, 1, 12)
[ 954.792439] i8042: [238306] ef <- i8042 (interrupt, 1, 12)
[ 954.793468] i8042: [238306] 7f <- i8042 (interrupt, 1, 12)
[ 954.794576] i8042: [238306] 7e <- i8042 (interrupt, 1, 12)
[ 954.795486] i8042: [238307] 7f <- i8042 (interrupt, 1, 12)
[ 954.796510] i8042: [238307] 7e <- i8042 (interrupt, 1, 12)
[ 954.797538] i8042: [238307] 67 <- i8042 (interrupt, 1, 12)
[ 954.802578] i8042: [238308] bf <- i8042 (interrupt, 1, 12)
[ 954.803603] i8042: [238309] 53 <- i8042 (interrupt, 1, 12)
[ 954.804710] i8042: [238309] 3b <- i8042 (interrupt, 1, 12)
[ 954.805618] i8042: [238309] 08 <- i8042 (interrupt, 1, 12)
[ 954.806646] i8042: [238309] 69 <- i8042 (interrupt, 1, 12)
[ 954.807672] i8042: [238310] 2b <- i8042 (interrupt, 1, 12)
[ 954.812829] i8042: [238311] ef <- i8042 (interrupt, 1, 12)
[ 954.813855] i8042: [238311] 7f <- i8042 (interrupt, 1, 12)
[ 954.814963] i8042: [238312] 7f <- i8042 (interrupt, 1, 12)
[ 954.815828] i8042: [238312] 7f <- i8042 (interrupt, 1, 12)
[ 954.816897] i8042: [238312] 7e <- i8042 (interrupt, 1, 12)
[ 954.817896] i8042: [238312] 77 <- i8042 (interrupt, 1, 12)
[ 954.822927] i8042: [238314] 8f <- i8042 (interrupt, 1, 12)
[ 954.824088] i8042: [238314] 53 <- i8042 (interrupt, 1, 12)
[ 954.824998] i8042: [238314] 54 <- i8042 (interrupt, 1, 12)
[ 954.826023] i8042: [238314] 08 <- i8042 (interrupt, 1, 12)
[ 954.827023] i8042: [238315] 7c <- i8042 (interrupt, 1, 12)
[ 954.828048] i8042: [238315] 00 <- i8042 (interrupt, 1, 12)
[ 954.833117] i8042: [238316] ef <- i8042 (interrupt, 1, 12)
[ 954.834224] i8042: [238316] 7f <- i8042 (interrupt, 1, 12)
[ 954.835133] i8042: [238317] 7f <- i8042 (interrupt, 1, 12)
[ 954.836158] i8042: [238317] 7f <- i8042 (interrupt, 1, 12)
[ 954.837185] i8042: [238317] 7e <- i8042 (interrupt, 1, 12)
[ 954.838212] i8042: [238317] 77 <- i8042 (interrupt, 1, 12)
[ 954.843312] i8042: [238319] af <- i8042 (interrupt, 1, 12)
[ 954.844415] i8042: [238319] 53 <- i8042 (interrupt, 1, 12)
[ 954.845323] i8042: [238319] 54 <- i8042 (interrupt, 1, 12)
[ 954.846349] i8042: [238319] 08 <- i8042 (interrupt, 1, 12)
[ 954.847375] i8042: [238320] 6b <- i8042 (interrupt, 1, 12)
[ 954.848402] i8042: [238320] 00 <- i8042 (interrupt, 1, 12)
[ 954.853440] i8042: [238321] ef <- i8042 (interrupt, 1, 12)
[ 954.854581] i8042: [238321] 7f <- i8042 (interrupt, 1, 12)
[ 954.855470] i8042: [238322] 7f <- i8042 (interrupt, 1, 12)
[ 954.856516] i8042: [238322] 7f <- i8042 (interrupt, 1, 12)
[ 954.857542] i8042: [238322] 7e <- i8042 (interrupt, 1, 12)
[ 954.858569] i8042: [238322] 77 <- i8042 (interrupt, 1, 12)
[ 954.863609] i8042: [238324] bf <- i8042 (interrupt, 1, 12)
[ 954.864713] i8042: [238324] 53 <- i8042 (interrupt, 1, 12)
[ 954.865602] i8042: [238324] 54 <- i8042 (interrupt, 1, 12)
[ 954.866647] i8042: [238324] 08 <- i8042 (interrupt, 1, 12)
[ 954.867696] i8042: [238325] 6c <- i8042 (interrupt, 1, 12)
[ 954.868722] i8042: [238325] 16 <- i8042 (interrupt, 1, 12)
[ 954.874993] i8042: [238327] ef <- i8042 (interrupt, 1, 12)
[ 954.876019] i8042: [238327] 7f <- i8042 (interrupt, 1, 12)
[ 954.877044] i8042: [238327] 7f <- i8042 (interrupt, 1, 12)
[ 954.878071] i8042: [238327] 7f <- i8042 (interrupt, 1, 12)
[ 954.879099] i8042: [238328] 7e <- i8042 (interrupt, 1, 12)
[ 954.880124] i8042: [238328] 77 <- i8042 (interrupt, 1, 12)
[ 954.883983] i8042: [238329] 8f <- i8042 (interrupt, 1, 12)
[ 954.885087] i8042: [238329] 53 <- i8042 (interrupt, 1, 12)
[ 954.885995] i8042: [238329] 54 <- i8042 (interrupt, 1, 12)
[ 954.887023] i8042: [238330] 08 <- i8042 (interrupt, 1, 12)
[ 954.888048] i8042: [238330] 7d <- i8042 (interrupt, 1, 12)
[ 954.889074] i8042: [238330] 00 <- i8042 (interrupt, 1, 12)
[ 954.894228] i8042: [238331] cf <- i8042 (interrupt, 1, 12)
[ 954.895372] i8042: [238332] 7f <- i8042 (interrupt, 1, 12)
[ 954.925882] i8042: [238339] 7e <- i8042 (interrupt, 1, 12)
[ 954.925926] i8042: [238339] 7f <- i8042 (interrupt, 1, 12)
[ 954.926065] i8042: [238339] 7e <- i8042 (interrupt, 1, 12)
[ 954.926205] i8042: [238339] 66 <- i8042 (interrupt, 1, 12)
[ 954.926337] i8042: [238339] 8f <- i8042 (interrupt, 1, 12)
[ 954.926457] i8042: [238339] 53 <- i8042 (interrupt, 1, 12)
[ 954.926596] i8042: [238339] 54 <- i8042 (interrupt, 1, 12)
[ 954.926729] i8042: [238339] 08 <- i8042 (interrupt, 1, 12)
[ 954.926848] i8042: [238340] 7d <- i8042 (interrupt, 1, 12)
[ 954.927998] i8042: [238340] 00 <- i8042 (interrupt, 1, 12)
[ 954.929083] i8042: [238340] cf <- i8042 (interrupt, 1, 12)
[ 954.930107] i8042: [238340] 7f <- i8042 (interrupt, 1, 12)
[ 954.931107] i8042: [238341] 7e <- i8042 (interrupt, 1, 12)
[ 954.932160] i8042: [238341] 7f <- i8042 (interrupt, 1, 12)
[ 954.933187] i8042: [238341] 7e <- i8042 (interrupt, 1, 12)
[ 954.934187] i8042: [238341] 66 <- i8042 (interrupt, 1, 12)
[ 954.935316] i8042: [238342] bf <- i8042 (interrupt, 1, 12)
[ 954.936227] i8042: [238342] 3b <- i8042 (interrupt, 1, 12)
[ 954.937254] i8042: [238342] 2c <- i8042 (interrupt, 1, 12)
[ 954.938279] i8042: [238342] 08 <- i8042 (interrupt, 1, 12)
[ 954.939316] i8042: [238343] 7b <- i8042 (interrupt, 1, 12)
[ 954.940613] i8042: [238343] 16 <- i8042 (interrupt, 1, 12)
[ 954.945100] i8042: [238344] ef <- i8042 (interrupt, 1, 12)
[ 954.946207] i8042: [238344] 7f <- i8042 (interrupt, 1, 12)
[ 954.947120] i8042: [238345] 7f <- i8042 (interrupt, 1, 12)
[ 954.948126] i8042: [238345] 7f <- i8042 (interrupt, 1, 12)
[ 954.949152] i8042: [238345] 7e <- i8042 (interrupt, 1, 12)
[ 954.950157] i8042: [238345] 77 <- i8042 (interrupt, 1, 12)
[ 954.955195] i8042: [238347] cf <- i8042 (interrupt, 1, 12)
[ 954.956325] i8042: [238347] 00 <- i8042 (interrupt, 1, 12)
[ 954.957234] i8042: [238347] 00 <- i8042 (interrupt, 1, 12)
[ 954.958237] i8042: [238347] 08 <- i8042 (interrupt, 1, 12)
[ 954.959296] i8042: [238348] 00 <- i8042 (interrupt, 1, 12)
[ 954.960297] i8042: [238348] 00 <- i8042 (interrupt, 1, 12)
[ 954.965398] i8042: [238349] bf <- i8042 (interrupt, 1, 12)
[ 954.966517] i8042: [238349] 3b <- i8042 (interrupt, 1, 12)
[ 954.967469] i8042: [238350] 2c <- i8042 (interrupt, 1, 12)
[ 954.968493] i8042: [238350] 08 <- i8042 (interrupt, 1, 12)
[ 954.969521] i8042: [238350] 7b <- i8042 (interrupt, 1, 12)
[ 954.970548] i8042: [238350] 00 <- i8042 (interrupt, 1, 12)
[ 954.975568] i8042: [238352] cf <- i8042 (interrupt, 1, 12)
[ 954.976646] i8042: [238352] 7f <- i8042 (interrupt, 1, 12)
[ 954.977581] i8042: [238352] 7c <- i8042 (interrupt, 1, 12)
[ 954.978610] i8042: [238352] 7f <- i8042 (interrupt, 1, 12)
[ 954.979639] i8042: [238353] 1e <- i8042 (interrupt, 1, 12)
[ 954.980665] i8042: [238353] ff <- i8042 (interrupt, 1, 12)
[ 954.980671] psmouse serio1: alps: v3 discard packet[5] = ff
[ 954.985825] i8042: [238354] bf <- i8042 (interrupt, 1, 12)
[ 954.986912] i8042: [238355] 3b <- i8042 (interrupt, 1, 12)
[ 954.987821] i8042: [238355] 2c <- i8042 (interrupt, 1, 12)
[ 954.988850] i8042: [238355] 08 <- i8042 (interrupt, 1, 12)
[ 954.989876] i8042: [238355] 7b <- i8042 (interrupt, 1, 12)
[ 954.990903] i8042: [238356] 00 <- i8042 (interrupt, 1, 12)
[ 954.995979] i8042: [238357] cf <- i8042 (interrupt, 1, 12)
[ 954.996887] i8042: [238357] 7f <- i8042 (interrupt, 1, 12)
[ 954.997914] i8042: [238357] 7c <- i8042 (interrupt, 1, 12)
[ 954.998945] i8042: [238358] 7f <- i8042 (interrupt, 1, 12)
[ 955.000005] i8042: [238358] 1e <- i8042 (interrupt, 1, 12)
[ 955.001032] i8042: [238358] ff <- i8042 (interrupt, 1, 12)
[ 955.001038] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.006152] i8042: [238359] cf <- i8042 (interrupt, 1, 12)
[ 955.007179] i8042: [238360] 00 <- i8042 (interrupt, 1, 12)
[ 955.008183] i8042: [238360] 00 <- i8042 (interrupt, 1, 12)
[ 955.009209] i8042: [238360] 08 <- i8042 (interrupt, 1, 12)
[ 955.010231] i8042: [238360] 00 <- i8042 (interrupt, 1, 12)
[ 955.011262] i8042: [238361] 00 <- i8042 (interrupt, 1, 12)
[ 955.016380] i8042: [238362] cf <- i8042 (interrupt, 1, 12)
[ 955.017434] i8042: [238362] 4b <- i8042 (interrupt, 1, 12)
[ 955.018461] i8042: [238362] 3b <- i8042 (interrupt, 1, 12)
[ 955.019487] i8042: [238363] 08 <- i8042 (interrupt, 1, 12)
[ 955.020514] i8042: [238363] 21 <- i8042 (interrupt, 1, 12)
[ 955.021542] i8042: [238363] 29 <- i8042 (interrupt, 1, 12)
[ 955.026502] i8042: [238364] cf <- i8042 (interrupt, 1, 12)
[ 955.027529] i8042: [238365] 00 <- i8042 (interrupt, 1, 12)
[ 955.028554] i8042: [238365] 00 <- i8042 (interrupt, 1, 12)
[ 955.029582] i8042: [238365] 08 <- i8042 (interrupt, 1, 12)
[ 955.030609] i8042: [238365] 00 <- i8042 (interrupt, 1, 12)
[ 955.031636] i8042: [238366] 00 <- i8042 (interrupt, 1, 12)
[ 955.036599] i8042: [238367] cf <- i8042 (interrupt, 1, 12)
[ 955.037604] i8042: [238367] 00 <- i8042 (interrupt, 1, 12)
[ 955.038633] i8042: [238367] 00 <- i8042 (interrupt, 1, 12)
[ 955.039661] i8042: [238368] 08 <- i8042 (interrupt, 1, 12)
[ 955.040686] i8042: [238368] 00 <- i8042 (interrupt, 1, 12)
[ 955.041711] i8042: [238368] 00 <- i8042 (interrupt, 1, 12)
[ 955.046750] i8042: [238369] 8f <- i8042 (interrupt, 1, 12)
[ 955.047817] i8042: [238370] 4b <- i8042 (interrupt, 1, 12)
[ 955.048845] i8042: [238370] 3b <- i8042 (interrupt, 1, 12)
[ 955.049871] i8042: [238370] 08 <- i8042 (interrupt, 1, 12)
[ 955.050874] i8042: [238370] 61 <- i8042 (interrupt, 1, 12)
[ 955.051900] i8042: [238371] 00 <- i8042 (interrupt, 1, 12)
[ 955.056978] i8042: [238372] cf <- i8042 (interrupt, 1, 12)
[ 955.058028] i8042: [238372] 00 <- i8042 (interrupt, 1, 12)
[ 955.059057] i8042: [238373] 00 <- i8042 (interrupt, 1, 12)
[ 955.060084] i8042: [238373] 08 <- i8042 (interrupt, 1, 12)
[ 955.061110] i8042: [238373] 00 <- i8042 (interrupt, 1, 12)
[ 955.062134] i8042: [238373] 00 <- i8042 (interrupt, 1, 12)
[ 955.067134] i8042: [238375] cf <- i8042 (interrupt, 1, 12)
[ 955.068158] i8042: [238375] 00 <- i8042 (interrupt, 1, 12)
[ 955.070227] i8042: [238375] 00 <- i8042 (interrupt, 1, 12)
[ 955.070402] i8042: [238375] 08 <- i8042 (interrupt, 1, 12)
[ 955.071425] i8042: [238376] 00 <- i8042 (interrupt, 1, 12)
[ 955.072430] i8042: [238376] 00 <- i8042 (interrupt, 1, 12)
[ 955.077311] i8042: [238377] 8f <- i8042 (interrupt, 1, 12)
[ 955.078365] i8042: [238377] 4b <- i8042 (interrupt, 1, 12)
[ 955.079391] i8042: [238378] 3b <- i8042 (interrupt, 1, 12)
[ 955.080389] i8042: [238378] 08 <- i8042 (interrupt, 1, 12)
[ 955.081391] i8042: [238378] 61 <- i8042 (interrupt, 1, 12)
[ 955.082436] i8042: [238378] 00 <- i8042 (interrupt, 1, 12)
[ 955.087506] i8042: [238380] cf <- i8042 (interrupt, 1, 12)
[ 955.088526] i8042: [238380] 7d <- i8042 (interrupt, 1, 12)
[ 955.089556] i8042: [238380] 7c <- i8042 (interrupt, 1, 12)
[ 955.090566] i8042: [238380] 7f <- i8042 (interrupt, 1, 12)
[ 955.091608] i8042: [238381] 1e <- i8042 (interrupt, 1, 12)
[ 955.092636] i8042: [238381] ff <- i8042 (interrupt, 1, 12)
[ 955.092640] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.097755] i8042: [238382] 8f <- i8042 (interrupt, 1, 12)
[ 955.098742] i8042: [238382] 4b <- i8042 (interrupt, 1, 12)
[ 955.099775] i8042: [238383] 3b <- i8042 (interrupt, 1, 12)
[ 955.100831] i8042: [238383] 08 <- i8042 (interrupt, 1, 12)
[ 955.101858] i8042: [238383] 61 <- i8042 (interrupt, 1, 12)
[ 955.102883] i8042: [238383] 00 <- i8042 (interrupt, 1, 12)
[ 955.107853] i8042: [238385] cf <- i8042 (interrupt, 1, 12)
[ 955.108880] i8042: [238385] 7d <- i8042 (interrupt, 1, 12)
[ 955.109906] i8042: [238385] 7c <- i8042 (interrupt, 1, 12)
[ 955.110891] i8042: [238385] 7f <- i8042 (interrupt, 1, 12)
[ 955.111955] i8042: [238386] 1e <- i8042 (interrupt, 1, 12)
[ 955.112981] i8042: [238386] ff <- i8042 (interrupt, 1, 12)
[ 955.112988] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.118070] i8042: [238387] 8f <- i8042 (interrupt, 1, 12)
[ 955.119094] i8042: [238388] 4b <- i8042 (interrupt, 1, 12)
[ 955.120120] i8042: [238388] 3b <- i8042 (interrupt, 1, 12)
[ 955.121146] i8042: [238388] 08 <- i8042 (interrupt, 1, 12)
[ 955.122172] i8042: [238388] 61 <- i8042 (interrupt, 1, 12)
[ 955.123199] i8042: [238389] 00 <- i8042 (interrupt, 1, 12)
[ 955.128169] i8042: [238390] cf <- i8042 (interrupt, 1, 12)
[ 955.129191] i8042: [238390] 7d <- i8042 (interrupt, 1, 12)
[ 955.130218] i8042: [238390] 7c <- i8042 (interrupt, 1, 12)
[ 955.131246] i8042: [238391] 7f <- i8042 (interrupt, 1, 12)
[ 955.132272] i8042: [238391] 1e <- i8042 (interrupt, 1, 12)
[ 955.133295] i8042: [238391] ff <- i8042 (interrupt, 1, 12)
[ 955.133301] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.138342] i8042: [238392] 8f <- i8042 (interrupt, 1, 12)
[ 955.139411] i8042: [238393] 4b <- i8042 (interrupt, 1, 12)
[ 955.140434] i8042: [238393] 3b <- i8042 (interrupt, 1, 12)
[ 955.141461] i8042: [238393] 08 <- i8042 (interrupt, 1, 12)
[ 955.142484] i8042: [238393] 61 <- i8042 (interrupt, 1, 12)
[ 955.143545] i8042: [238394] 00 <- i8042 (interrupt, 1, 12)
[ 955.148548] i8042: [238395] cf <- i8042 (interrupt, 1, 12)
[ 955.149588] i8042: [238395] 7d <- i8042 (interrupt, 1, 12)
[ 955.150613] i8042: [238395] 7c <- i8042 (interrupt, 1, 12)
[ 955.151640] i8042: [238396] 7f <- i8042 (interrupt, 1, 12)
[ 955.152660] i8042: [238396] 1e <- i8042 (interrupt, 1, 12)
[ 955.153765] i8042: [238396] ff <- i8042 (interrupt, 1, 12)
[ 955.153773] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.158721] i8042: [238397] 8f <- i8042 (interrupt, 1, 12)
[ 955.159725] i8042: [238398] 4b <- i8042 (interrupt, 1, 12)
[ 955.160718] i8042: [238398] 3b <- i8042 (interrupt, 1, 12)
[ 955.161795] i8042: [238398] 08 <- i8042 (interrupt, 1, 12)
[ 955.162823] i8042: [238398] 61 <- i8042 (interrupt, 1, 12)
[ 955.163927] i8042: [238399] 00 <- i8042 (interrupt, 1, 12)
[ 955.168941] i8042: [238400] cf <- i8042 (interrupt, 1, 12)
[ 955.169967] i8042: [238400] 7d <- i8042 (interrupt, 1, 12)
[ 955.170993] i8042: [238401] 7c <- i8042 (interrupt, 1, 12)
[ 955.172019] i8042: [238401] 7f <- i8042 (interrupt, 1, 12)
[ 955.173043] i8042: [238401] 1e <- i8042 (interrupt, 1, 12)
[ 955.174148] i8042: [238401] ff <- i8042 (interrupt, 1, 12)
[ 955.174154] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.179070] i8042: [238403] 8f <- i8042 (interrupt, 1, 12)
[ 955.180093] i8042: [238403] 4b <- i8042 (interrupt, 1, 12)
[ 955.181120] i8042: [238403] 3b <- i8042 (interrupt, 1, 12)
[ 955.182146] i8042: [238403] 08 <- i8042 (interrupt, 1, 12)
[ 955.183172] i8042: [238404] 61 <- i8042 (interrupt, 1, 12)
[ 955.184276] i8042: [238404] 00 <- i8042 (interrupt, 1, 12)
[ 955.189225] i8042: [238405] cf <- i8042 (interrupt, 1, 12)
[ 955.190250] i8042: [238405] 7d <- i8042 (interrupt, 1, 12)
[ 955.191277] i8042: [238406] 7c <- i8042 (interrupt, 1, 12)
[ 955.192304] i8042: [238406] 7f <- i8042 (interrupt, 1, 12)
[ 955.193401] i8042: [238406] 1e <- i8042 (interrupt, 1, 12)
[ 955.194309] i8042: [238406] ff <- i8042 (interrupt, 1, 12)
[ 955.194315] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.199467] i8042: [238408] 8f <- i8042 (interrupt, 1, 12)
[ 955.200493] i8042: [238408] 4b <- i8042 (interrupt, 1, 12)
[ 955.201518] i8042: [238408] 3b <- i8042 (interrupt, 1, 12)
[ 955.202546] i8042: [238408] 08 <- i8042 (interrupt, 1, 12)
[ 955.203655] i8042: [238409] 61 <- i8042 (interrupt, 1, 12)
[ 955.204563] i8042: [238409] 00 <- i8042 (interrupt, 1, 12)
[ 955.209547] i8042: [238410] cf <- i8042 (interrupt, 1, 12)
[ 955.210627] i8042: [238410] 7c <- i8042 (interrupt, 1, 12)
[ 955.211618] i8042: [238411] 7c <- i8042 (interrupt, 1, 12)
[ 955.212647] i8042: [238411] 7f <- i8042 (interrupt, 1, 12)
[ 955.213754] i8042: [238411] 1e <- i8042 (interrupt, 1, 12)
[ 955.214663] i8042: [238411] ff <- i8042 (interrupt, 1, 12)
[ 955.214679] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.219736] i8042: [238413] 8f <- i8042 (interrupt, 1, 12)
[ 955.220767] i8042: [238413] 4b <- i8042 (interrupt, 1, 12)
[ 955.221734] i8042: [238413] 3b <- i8042 (interrupt, 1, 12)
[ 955.222817] i8042: [238413] 08 <- i8042 (interrupt, 1, 12)
[ 955.223927] i8042: [238414] 61 <- i8042 (interrupt, 1, 12)
[ 955.224832] i8042: [238414] 00 <- i8042 (interrupt, 1, 12)
[ 955.229991] i8042: [238415] cf <- i8042 (interrupt, 1, 12)
[ 955.231032] i8042: [238416] 7c <- i8042 (interrupt, 1, 12)
[ 955.232028] i8042: [238416] 7c <- i8042 (interrupt, 1, 12)
[ 955.233056] i8042: [238416] 7f <- i8042 (interrupt, 1, 12)
[ 955.234138] i8042: [238416] 1e <- i8042 (interrupt, 1, 12)
[ 955.235075] i8042: [238417] ff <- i8042 (interrupt, 1, 12)
[ 955.235081] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.240096] i8042: [238418] 8f <- i8042 (interrupt, 1, 12)
[ 955.241119] i8042: [238418] 4b <- i8042 (interrupt, 1, 12)
[ 955.242147] i8042: [238418] 3b <- i8042 (interrupt, 1, 12)
[ 955.243224] i8042: [238419] 08 <- i8042 (interrupt, 1, 12)
[ 955.244153] i8042: [238419] 61 <- i8042 (interrupt, 1, 12)
[ 955.245180] i8042: [238419] 00 <- i8042 (interrupt, 1, 12)
[ 955.250335] i8042: [238420] cf <- i8042 (interrupt, 1, 12)
[ 955.251363] i8042: [238421] 74 <- i8042 (interrupt, 1, 12)
[ 955.252389] i8042: [238421] 7c <- i8042 (interrupt, 1, 12)
[ 955.253496] i8042: [238421] 7f <- i8042 (interrupt, 1, 12)
[ 955.254405] i8042: [238421] 1e <- i8042 (interrupt, 1, 12)
[ 955.255433] i8042: [238422] ff <- i8042 (interrupt, 1, 12)
[ 955.255439] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.260467] i8042: [238423] cf <- i8042 (interrupt, 1, 12)
[ 955.261493] i8042: [238423] 00 <- i8042 (interrupt, 1, 12)
[ 955.262520] i8042: [238423] 00 <- i8042 (interrupt, 1, 12)
[ 955.263632] i8042: [238424] 08 <- i8042 (interrupt, 1, 12)
[ 955.264521] i8042: [238424] 00 <- i8042 (interrupt, 1, 12)
[ 955.265880] i8042: [238424] 00 <- i8042 (interrupt, 1, 12)
[ 955.270683] i8042: [238425] 8f <- i8042 (interrupt, 1, 12)
[ 955.271709] i8042: [238426] 4b <- i8042 (interrupt, 1, 12)
[ 955.272734] i8042: [238426] 3b <- i8042 (interrupt, 1, 12)
[ 955.273841] i8042: [238426] 08 <- i8042 (interrupt, 1, 12)
[ 955.274721] i8042: [238426] 61 <- i8042 (interrupt, 1, 12)
[ 955.275775] i8042: [238427] 00 <- i8042 (interrupt, 1, 12)
[ 955.280815] i8042: [238428] cf <- i8042 (interrupt, 1, 12)
[ 955.281842] i8042: [238428] 7c <- i8042 (interrupt, 1, 12)
[ 955.282869] i8042: [238428] 7c <- i8042 (interrupt, 1, 12)
[ 955.283976] i8042: [238429] 7f <- i8042 (interrupt, 1, 12)
[ 955.284884] i8042: [238429] 16 <- i8042 (interrupt, 1, 12)
[ 955.285911] i8042: [238429] ff <- i8042 (interrupt, 1, 12)
[ 955.285917] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.290952] i8042: [238430] 8f <- i8042 (interrupt, 1, 12)
[ 955.291977] i8042: [238431] 4b <- i8042 (interrupt, 1, 12)
[ 955.293076] i8042: [238431] 3b <- i8042 (interrupt, 1, 12)
[ 955.293986] i8042: [238431] 08 <- i8042 (interrupt, 1, 12)
[ 955.295012] i8042: [238431] 61 <- i8042 (interrupt, 1, 12)
[ 955.296040] i8042: [238432] 00 <- i8042 (interrupt, 1, 12)
[ 955.301200] i8042: [238433] cf <- i8042 (interrupt, 1, 12)
[ 955.302226] i8042: [238433] 7c <- i8042 (interrupt, 1, 12)
[ 955.303306] i8042: [238434] 7c <- i8042 (interrupt, 1, 12)
[ 955.304243] i8042: [238434] 7f <- i8042 (interrupt, 1, 12)
[ 955.305269] i8042: [238434] 16 <- i8042 (interrupt, 1, 12)
[ 955.306295] i8042: [238434] ff <- i8042 (interrupt, 1, 12)
[ 955.306301] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.311319] i8042: [238436] 8f <- i8042 (interrupt, 1, 12)
[ 955.312332] i8042: [238436] 4b <- i8042 (interrupt, 1, 12)
[ 955.313492] i8042: [238436] 3b <- i8042 (interrupt, 1, 12)
[ 955.314401] i8042: [238436] 08 <- i8042 (interrupt, 1, 12)
[ 955.315428] i8042: [238437] 61 <- i8042 (interrupt, 1, 12)
[ 955.316455] i8042: [238437] 00 <- i8042 (interrupt, 1, 12)
[ 955.321495] i8042: [238438] cf <- i8042 (interrupt, 1, 12)
[ 955.322521] i8042: [238438] 7c <- i8042 (interrupt, 1, 12)
[ 955.323629] i8042: [238439] 7c <- i8042 (interrupt, 1, 12)
[ 955.324536] i8042: [238439] 7f <- i8042 (interrupt, 1, 12)
[ 955.325563] i8042: [238439] 16 <- i8042 (interrupt, 1, 12)
[ 955.326569] i8042: [238439] ff <- i8042 (interrupt, 1, 12)
[ 955.326575] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.331728] i8042: [238441] 8f <- i8042 (interrupt, 1, 12)
[ 955.332754] i8042: [238441] 4b <- i8042 (interrupt, 1, 12)
[ 955.333862] i8042: [238441] 3b <- i8042 (interrupt, 1, 12)
[ 955.334770] i8042: [238441] 08 <- i8042 (interrupt, 1, 12)
[ 955.335798] i8042: [238442] 61 <- i8042 (interrupt, 1, 12)
[ 955.336823] i8042: [238442] 00 <- i8042 (interrupt, 1, 12)
[ 955.341863] i8042: [238443] cf <- i8042 (interrupt, 1, 12)
[ 955.342969] i8042: [238443] 00 <- i8042 (interrupt, 1, 12)
[ 955.343875] i8042: [238444] 00 <- i8042 (interrupt, 1, 12)
[ 955.344903] i8042: [238444] 08 <- i8042 (interrupt, 1, 12)
[ 955.345930] i8042: [238444] 00 <- i8042 (interrupt, 1, 12)
[ 955.346957] i8042: [238444] 00 <- i8042 (interrupt, 1, 12)
[ 955.351996] i8042: [238446] 8f <- i8042 (interrupt, 1, 12)
[ 955.353101] i8042: [238446] 4b <- i8042 (interrupt, 1, 12)
[ 955.354009] i8042: [238446] 3b <- i8042 (interrupt, 1, 12)
[ 955.355035] i8042: [238446] 08 <- i8042 (interrupt, 1, 12)
[ 955.356063] i8042: [238447] 61 <- i8042 (interrupt, 1, 12)
[ 955.357088] i8042: [238447] 00 <- i8042 (interrupt, 1, 12)
[ 955.362246] i8042: [238448] cf <- i8042 (interrupt, 1, 12)
[ 955.363676] i8042: [238449] 00 <- i8042 (interrupt, 1, 12)
[ 955.364701] i8042: [238449] 70 <- i8042 (interrupt, 1, 12)
[ 955.365730] i8042: [238449] 7f <- i8042 (interrupt, 1, 12)
[ 955.366755] i8042: [238449] 06 <- i8042 (interrupt, 1, 12)
[ 955.367783] i8042: [238450] ff <- i8042 (interrupt, 1, 12)
[ 955.367790] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.372347] i8042: [238451] 8f <- i8042 (interrupt, 1, 12)
[ 955.373454] i8042: [238451] 4b <- i8042 (interrupt, 1, 12)
[ 955.374365] i8042: [238451] 3b <- i8042 (interrupt, 1, 12)
[ 955.375391] i8042: [238452] 08 <- i8042 (interrupt, 1, 12)
[ 955.376416] i8042: [238452] 61 <- i8042 (interrupt, 1, 12)
[ 955.377442] i8042: [238452] 00 <- i8042 (interrupt, 1, 12)
[ 955.382604] i8042: [238453] cf <- i8042 (interrupt, 1, 12)
[ 955.383651] i8042: [238454] 00 <- i8042 (interrupt, 1, 12)
[ 955.384617] i8042: [238454] 78 <- i8042 (interrupt, 1, 12)
[ 955.385642] i8042: [238454] 7f <- i8042 (interrupt, 1, 12)
[ 955.386669] i8042: [238454] 06 <- i8042 (interrupt, 1, 12)
[ 955.387698] i8042: [238455] ff <- i8042 (interrupt, 1, 12)
[ 955.387704] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.392809] i8042: [238456] 8f <- i8042 (interrupt, 1, 12)
[ 955.393715] i8042: [238456] 4b <- i8042 (interrupt, 1, 12)
[ 955.394724] i8042: [238456] 3b <- i8042 (interrupt, 1, 12)
[ 955.395769] i8042: [238457] 08 <- i8042 (interrupt, 1, 12)
[ 955.396794] i8042: [238457] 61 <- i8042 (interrupt, 1, 12)
[ 955.397821] i8042: [238457] 00 <- i8042 (interrupt, 1, 12)
[ 955.402899] i8042: [238458] cf <- i8042 (interrupt, 1, 12)
[ 955.403964] i8042: [238459] 00 <- i8042 (interrupt, 1, 12)
[ 955.404989] i8042: [238459] 70 <- i8042 (interrupt, 1, 12)
[ 955.406016] i8042: [238459] 7f <- i8042 (interrupt, 1, 12)
[ 955.407042] i8042: [238459] 06 <- i8042 (interrupt, 1, 12)
[ 955.408072] i8042: [238460] ff <- i8042 (interrupt, 1, 12)
[ 955.408079] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.413174] i8042: [238461] 8f <- i8042 (interrupt, 1, 12)
[ 955.414199] i8042: [238461] 4b <- i8042 (interrupt, 1, 12)
[ 955.415227] i8042: [238462] 3b <- i8042 (interrupt, 1, 12)
[ 955.416228] i8042: [238462] 08 <- i8042 (interrupt, 1, 12)
[ 955.417279] i8042: [238462] 61 <- i8042 (interrupt, 1, 12)
[ 955.418305] i8042: [238462] 00 <- i8042 (interrupt, 1, 12)
[ 955.423266] i8042: [238464] cf <- i8042 (interrupt, 1, 12)
[ 955.424290] i8042: [238464] 00 <- i8042 (interrupt, 1, 12)
[ 955.425317] i8042: [238464] 70 <- i8042 (interrupt, 1, 12)
[ 955.426343] i8042: [238464] 7f <- i8042 (interrupt, 1, 12)
[ 955.427371] i8042: [238465] 06 <- i8042 (interrupt, 1, 12)
[ 955.428396] i8042: [238465] ff <- i8042 (interrupt, 1, 12)
[ 955.428402] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.433417] i8042: [238466] 8f <- i8042 (interrupt, 1, 12)
[ 955.434445] i8042: [238466] 4b <- i8042 (interrupt, 1, 12)
[ 955.435474] i8042: [238467] 3b <- i8042 (interrupt, 1, 12)
[ 955.436497] i8042: [238467] 08 <- i8042 (interrupt, 1, 12)
[ 955.437526] i8042: [238467] 61 <- i8042 (interrupt, 1, 12)
[ 955.438551] i8042: [238467] 00 <- i8042 (interrupt, 1, 12)
[ 955.443629] i8042: [238469] cf <- i8042 (interrupt, 1, 12)
[ 955.444657] i8042: [238469] 00 <- i8042 (interrupt, 1, 12)
[ 955.445684] i8042: [238469] 70 <- i8042 (interrupt, 1, 12)
[ 955.446711] i8042: [238469] 7f <- i8042 (interrupt, 1, 12)
[ 955.447738] i8042: [238470] 00 <- i8042 (interrupt, 1, 12)
[ 955.448762] i8042: [238470] ff <- i8042 (interrupt, 1, 12)
[ 955.448768] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.453721] i8042: [238471] 8f <- i8042 (interrupt, 1, 12)
[ 955.454747] i8042: [238471] 4b <- i8042 (interrupt, 1, 12)
[ 955.455773] i8042: [238472] 3b <- i8042 (interrupt, 1, 12)
[ 955.456801] i8042: [238472] 08 <- i8042 (interrupt, 1, 12)
[ 955.457828] i8042: [238472] 61 <- i8042 (interrupt, 1, 12)
[ 955.458855] i8042: [238472] 00 <- i8042 (interrupt, 1, 12)
[ 955.463927] i8042: [238474] cf <- i8042 (interrupt, 1, 12)
[ 955.464951] i8042: [238474] 00 <- i8042 (interrupt, 1, 12)
[ 955.465977] i8042: [238474] 70 <- i8042 (interrupt, 1, 12)
[ 955.467007] i8042: [238474] 7f <- i8042 (interrupt, 1, 12)
[ 955.468035] i8042: [238475] 00 <- i8042 (interrupt, 1, 12)
[ 955.469061] i8042: [238475] ff <- i8042 (interrupt, 1, 12)
[ 955.469067] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.474098] i8042: [238476] 8f <- i8042 (interrupt, 1, 12)
[ 955.475135] i8042: [238476] 4b <- i8042 (interrupt, 1, 12)
[ 955.476189] i8042: [238477] 3b <- i8042 (interrupt, 1, 12)
[ 955.477214] i8042: [238477] 08 <- i8042 (interrupt, 1, 12)
[ 955.478242] i8042: [238477] 61 <- i8042 (interrupt, 1, 12)
[ 955.479272] i8042: [238478] 00 <- i8042 (interrupt, 1, 12)
[ 955.484298] i8042: [238479] cf <- i8042 (interrupt, 1, 12)
[ 955.485321] i8042: [238479] 00 <- i8042 (interrupt, 1, 12)
[ 955.486347] i8042: [238479] 70 <- i8042 (interrupt, 1, 12)
[ 955.487374] i8042: [238480] 7f <- i8042 (interrupt, 1, 12)
[ 955.488400] i8042: [238480] 00 <- i8042 (interrupt, 1, 12)
[ 955.489410] i8042: [238480] ff <- i8042 (interrupt, 1, 12)
[ 955.489426] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.494433] i8042: [238481] cf <- i8042 (interrupt, 1, 12)
[ 955.495462] i8042: [238482] 00 <- i8042 (interrupt, 1, 12)
[ 955.496487] i8042: [238482] 00 <- i8042 (interrupt, 1, 12)
[ 955.497516] i8042: [238482] 08 <- i8042 (interrupt, 1, 12)
[ 955.498540] i8042: [238482] 00 <- i8042 (interrupt, 1, 12)
[ 955.499568] i8042: [238483] 00 <- i8042 (interrupt, 1, 12)
[ 955.504658] i8042: [238484] cf <- i8042 (interrupt, 1, 12)
[ 955.505658] i8042: [238484] 00 <- i8042 (interrupt, 1, 12)
[ 955.506672] i8042: [238484] 00 <- i8042 (interrupt, 1, 12)
[ 955.507737] i8042: [238485] 08 <- i8042 (interrupt, 1, 12)
[ 955.508711] i8042: [238485] 00 <- i8042 (interrupt, 1, 12)
[ 955.509791] i8042: [238485] 00 <- i8042 (interrupt, 1, 12)
[ 955.514765] i8042: [238486] cf <- i8042 (interrupt, 1, 12)
[ 955.515789] i8042: [238487] 00 <- i8042 (interrupt, 1, 12)
[ 955.516817] i8042: [238487] 00 <- i8042 (interrupt, 1, 12)
[ 955.517843] i8042: [238487] 08 <- i8042 (interrupt, 1, 12)
[ 955.518871] i8042: [238487] 00 <- i8042 (interrupt, 1, 12)
[ 955.519897] i8042: [238488] 00 <- i8042 (interrupt, 1, 12)
[ 955.524989] i8042: [238489] cf <- i8042 (interrupt, 1, 12)
[ 955.526016] i8042: [238489] 00 <- i8042 (interrupt, 1, 12)
[ 955.527042] i8042: [238489] 00 <- i8042 (interrupt, 1, 12)
[ 955.528070] i8042: [238490] 08 <- i8042 (interrupt, 1, 12)
[ 955.529095] i8042: [238490] 00 <- i8042 (interrupt, 1, 12)
[ 955.530121] i8042: [238490] 00 <- i8042 (interrupt, 1, 12)
[ 955.535156] i8042: [238491] cf <- i8042 (interrupt, 1, 12)
[ 955.536165] i8042: [238492] 00 <- i8042 (interrupt, 1, 12)
[ 955.537247] i8042: [238492] 00 <- i8042 (interrupt, 1, 12)
[ 955.538288] i8042: [238492] 08 <- i8042 (interrupt, 1, 12)
[ 955.539285] i8042: [238493] 00 <- i8042 (interrupt, 1, 12)
[ 955.540309] i8042: [238493] 00 <- i8042 (interrupt, 1, 12)
[ 955.545251] i8042: [238494] cf <- i8042 (interrupt, 1, 12)
[ 955.546276] i8042: [238494] 00 <- i8042 (interrupt, 1, 12)
[ 955.547303] i8042: [238495] 00 <- i8042 (interrupt, 1, 12)
[ 955.548328] i8042: [238495] 08 <- i8042 (interrupt, 1, 12)
[ 955.549355] i8042: [238495] 00 <- i8042 (interrupt, 1, 12)
[ 955.550381] i8042: [238495] 00 <- i8042 (interrupt, 1, 12)
[ 955.555545] i8042: [238497] cf <- i8042 (interrupt, 1, 12)
[ 955.556569] i8042: [238497] 00 <- i8042 (interrupt, 1, 12)
[ 955.557594] i8042: [238497] 00 <- i8042 (interrupt, 1, 12)
[ 955.558977] i8042: [238497] 08 <- i8042 (interrupt, 1, 12)
[ 955.559989] i8042: [238498] 00 <- i8042 (interrupt, 1, 12)
[ 955.561053] i8042: [238498] 00 <- i8042 (interrupt, 1, 12)
[ 955.565652] i8042: [238499] cf <- i8042 (interrupt, 1, 12)
[ 955.566676] i8042: [238499] 00 <- i8042 (interrupt, 1, 12)
[ 955.567701] i8042: [238500] 00 <- i8042 (interrupt, 1, 12)
[ 955.568727] i8042: [238500] 08 <- i8042 (interrupt, 1, 12)
[ 955.569752] i8042: [238500] 00 <- i8042 (interrupt, 1, 12)
[ 955.570776] i8042: [238500] 00 <- i8042 (interrupt, 1, 12)
[ 955.575866] i8042: [238502] cf <- i8042 (interrupt, 1, 12)
[ 955.576891] i8042: [238502] 00 <- i8042 (interrupt, 1, 12)
[ 955.577917] i8042: [238502] 00 <- i8042 (interrupt, 1, 12)
[ 955.578941] i8042: [238502] 08 <- i8042 (interrupt, 1, 12)
[ 955.579969] i8042: [238503] 00 <- i8042 (interrupt, 1, 12)
[ 955.580993] i8042: [238503] 00 <- i8042 (interrupt, 1, 12)
[ 955.586066] i8042: [238504] cf <- i8042 (interrupt, 1, 12)
[ 955.587093] i8042: [238504] 00 <- i8042 (interrupt, 1, 12)
[ 955.588121] i8042: [238505] 00 <- i8042 (interrupt, 1, 12)
[ 955.589146] i8042: [238505] 08 <- i8042 (interrupt, 1, 12)
[ 955.590172] i8042: [238505] 00 <- i8042 (interrupt, 1, 12)
[ 955.591279] i8042: [238506] 00 <- i8042 (interrupt, 1, 12)
[ 955.596201] i8042: [238507] cf <- i8042 (interrupt, 1, 12)
[ 955.597224] i8042: [238507] 00 <- i8042 (interrupt, 1, 12)
[ 955.598250] i8042: [238507] 00 <- i8042 (interrupt, 1, 12)
[ 955.599277] i8042: [238508] 08 <- i8042 (interrupt, 1, 12)
[ 955.600304] i8042: [238508] 00 <- i8042 (interrupt, 1, 12)
[ 955.601406] i8042: [238508] 00 <- i8042 (interrupt, 1, 12)
[ 955.606329] i8042: [238509] cf <- i8042 (interrupt, 1, 12)
[ 955.607356] i8042: [238510] 00 <- i8042 (interrupt, 1, 12)
[ 955.608381] i8042: [238510] 00 <- i8042 (interrupt, 1, 12)
[ 955.609406] i8042: [238510] 08 <- i8042 (interrupt, 1, 12)
[ 955.610432] i8042: [238510] 00 <- i8042 (interrupt, 1, 12)
[ 955.611504] i8042: [238511] 00 <- i8042 (interrupt, 1, 12)
[ 955.616541] i8042: [238512] cf <- i8042 (interrupt, 1, 12)
[ 955.617567] i8042: [238512] 00 <- i8042 (interrupt, 1, 12)
[ 955.618592] i8042: [238512] 00 <- i8042 (interrupt, 1, 12)
[ 955.619618] i8042: [238513] 08 <- i8042 (interrupt, 1, 12)
[ 955.620644] i8042: [238513] 00 <- i8042 (interrupt, 1, 12)
[ 955.621780] i8042: [238513] 00 <- i8042 (interrupt, 1, 12)
[ 955.626660] i8042: [238514] cf <- i8042 (interrupt, 1, 12)
[ 955.627726] i8042: [238515] 00 <- i8042 (interrupt, 1, 12)
[ 955.628749] i8042: [238515] 00 <- i8042 (interrupt, 1, 12)
[ 955.629775] i8042: [238515] 08 <- i8042 (interrupt, 1, 12)
[ 955.630801] i8042: [238515] 00 <- i8042 (interrupt, 1, 12)
[ 955.631905] i8042: [238516] 00 <- i8042 (interrupt, 1, 12)
[ 955.636939] i8042: [238517] cf <- i8042 (interrupt, 1, 12)
[ 955.637965] i8042: [238517] 00 <- i8042 (interrupt, 1, 12)
[ 955.638990] i8042: [238517] 00 <- i8042 (interrupt, 1, 12)
[ 955.640016] i8042: [238518] 08 <- i8042 (interrupt, 1, 12)
[ 955.641120] i8042: [238518] 00 <- i8042 (interrupt, 1, 12)
[ 955.642028] i8042: [238518] 00 <- i8042 (interrupt, 1, 12)
[ 955.647066] i8042: [238519] cf <- i8042 (interrupt, 1, 12)
[ 955.648093] i8042: [238520] 00 <- i8042 (interrupt, 1, 12)
[ 955.649116] i8042: [238520] 00 <- i8042 (interrupt, 1, 12)
[ 955.650142] i8042: [238520] 08 <- i8042 (interrupt, 1, 12)
[ 955.651249] i8042: [238520] 00 <- i8042 (interrupt, 1, 12)
[ 955.652130] i8042: [238521] 00 <- i8042 (interrupt, 1, 12)
[ 955.657176] i8042: [238522] cf <- i8042 (interrupt, 1, 12)
[ 955.658204] i8042: [238522] 00 <- i8042 (interrupt, 1, 12)
[ 955.659229] i8042: [238522] 00 <- i8042 (interrupt, 1, 12)
[ 955.660255] i8042: [238523] 08 <- i8042 (interrupt, 1, 12)
[ 955.661361] i8042: [238523] 00 <- i8042 (interrupt, 1, 12)
[ 955.662269] i8042: [238523] 00 <- i8042 (interrupt, 1, 12)
[ 955.667428] i8042: [238525] cf <- i8042 (interrupt, 1, 12)
[ 955.668451] i8042: [238525] 00 <- i8042 (interrupt, 1, 12)
[ 955.669477] i8042: [238525] 00 <- i8042 (interrupt, 1, 12)
[ 955.670504] i8042: [238525] 08 <- i8042 (interrupt, 1, 12)
[ 955.671609] i8042: [238526] 00 <- i8042 (interrupt, 1, 12)
[ 955.672517] i8042: [238526] 00 <- i8042 (interrupt, 1, 12)
[ 955.677628] i8042: [238527] 8f <- i8042 (interrupt, 1, 12)
[ 955.678620] i8042: [238527] 00 <- i8042 (interrupt, 1, 12)
[ 955.679681] i8042: [238528] 00 <- i8042 (interrupt, 1, 12)
[ 955.680709] i8042: [238528] 08 <- i8042 (interrupt, 1, 12)
[ 955.681816] i8042: [238528] 00 <- i8042 (interrupt, 1, 12)
[ 955.682724] i8042: [238528] 00 <- i8042 (interrupt, 1, 12)
[ 955.687714] i8042: [238530] 8f <- i8042 (interrupt, 1, 12)
[ 955.688789] i8042: [238530] 00 <- i8042 (interrupt, 1, 12)
[ 955.689818] i8042: [238530] 00 <- i8042 (interrupt, 1, 12)
[ 955.690842] i8042: [238530] 08 <- i8042 (interrupt, 1, 12)
[ 955.691952] i8042: [238531] 00 <- i8042 (interrupt, 1, 12)
[ 955.692861] i8042: [238531] 00 <- i8042 (interrupt, 1, 12)
[ 955.697901] i8042: [238532] 8f <- i8042 (interrupt, 1, 12)
[ 955.698928] i8042: [238532] 00 <- i8042 (interrupt, 1, 12)
[ 955.699955] i8042: [238533] 00 <- i8042 (interrupt, 1, 12)
[ 955.700980] i8042: [238533] 08 <- i8042 (interrupt, 1, 12)
[ 955.702087] i8042: [238533] 00 <- i8042 (interrupt, 1, 12)
[ 955.702997] i8042: [238533] 00 <- i8042 (interrupt, 1, 12)
[ 955.708009] i8042: [238535] 8f <- i8042 (interrupt, 1, 12)
[ 955.709061] i8042: [238535] 00 <- i8042 (interrupt, 1, 12)
[ 955.710089] i8042: [238535] 00 <- i8042 (interrupt, 1, 12)
[ 955.711087] i8042: [238535] 08 <- i8042 (interrupt, 1, 12)
[ 955.712223] i8042: [238536] 00 <- i8042 (interrupt, 1, 12)
[ 955.713132] i8042: [238536] 00 <- i8042 (interrupt, 1, 12)
[ 955.718289] i8042: [238537] 8f <- i8042 (interrupt, 1, 12)
[ 955.719317] i8042: [238538] 00 <- i8042 (interrupt, 1, 12)
[ 955.720343] i8042: [238538] 00 <- i8042 (interrupt, 1, 12)
[ 955.721369] i8042: [238538] 08 <- i8042 (interrupt, 1, 12)
[ 955.722473] i8042: [238538] 00 <- i8042 (interrupt, 1, 12)
[ 955.723353] i8042: [238539] 00 <- i8042 (interrupt, 1, 12)
[ 955.728424] i8042: [238540] 8f <- i8042 (interrupt, 1, 12)
[ 955.729448] i8042: [238540] 00 <- i8042 (interrupt, 1, 12)
[ 955.730475] i8042: [238540] 00 <- i8042 (interrupt, 1, 12)
[ 955.731502] i8042: [238541] 08 <- i8042 (interrupt, 1, 12)
[ 955.732608] i8042: [238541] 00 <- i8042 (interrupt, 1, 12)
[ 955.733515] i8042: [238541] 00 <- i8042 (interrupt, 1, 12)
[ 955.738552] i8042: [238542] 8f <- i8042 (interrupt, 1, 12)
[ 955.739582] i8042: [238543] 00 <- i8042 (interrupt, 1, 12)
[ 955.740606] i8042: [238543] 00 <- i8042 (interrupt, 1, 12)
[ 955.741681] i8042: [238543] 08 <- i8042 (interrupt, 1, 12)
[ 955.742620] i8042: [238543] 00 <- i8042 (interrupt, 1, 12)
[ 955.743647] i8042: [238544] 00 <- i8042 (interrupt, 1, 12)
[ 955.748803] i8042: [238545] 8f <- i8042 (interrupt, 1, 12)
[ 955.749830] i8042: [238545] 00 <- i8042 (interrupt, 1, 12)
[ 955.750856] i8042: [238545] 00 <- i8042 (interrupt, 1, 12)
[ 955.751964] i8042: [238546] 08 <- i8042 (interrupt, 1, 12)
[ 955.752872] i8042: [238546] 00 <- i8042 (interrupt, 1, 12)
[ 955.754334] i8042: [238546] 00 <- i8042 (interrupt, 1, 12)
[ 955.759001] i8042: [238547] 8f <- i8042 (interrupt, 1, 12)
[ 955.759970] i8042: [238548] 00 <- i8042 (interrupt, 1, 12)
[ 955.761125] i8042: [238548] 00 <- i8042 (interrupt, 1, 12)
[ 955.762032] i8042: [238548] 08 <- i8042 (interrupt, 1, 12)
[ 955.763059] i8042: [238548] 00 <- i8042 (interrupt, 1, 12)
[ 955.764086] i8042: [238549] 00 <- i8042 (interrupt, 1, 12)
[ 955.769125] i8042: [238550] 8f <- i8042 (interrupt, 1, 12)
[ 955.770133] i8042: [238550] 00 <- i8042 (interrupt, 1, 12)
[ 955.771239] i8042: [238550] 00 <- i8042 (interrupt, 1, 12)
[ 955.772149] i8042: [238551] 08 <- i8042 (interrupt, 1, 12)
[ 955.773174] i8042: [238551] 00 <- i8042 (interrupt, 1, 12)
[ 955.774201] i8042: [238551] 00 <- i8042 (interrupt, 1, 12)
[ 955.779336] i8042: [238552] 8f <- i8042 (interrupt, 1, 12)
[ 955.780364] i8042: [238553] 00 <- i8042 (interrupt, 1, 12)
[ 955.781470] i8042: [238553] 00 <- i8042 (interrupt, 1, 12)
[ 955.782379] i8042: [238553] 08 <- i8042 (interrupt, 1, 12)
[ 955.783405] i8042: [238554] 00 <- i8042 (interrupt, 1, 12)
[ 955.784433] i8042: [238554] 00 <- i8042 (interrupt, 1, 12)
[ 955.789470] i8042: [238555] 8f <- i8042 (interrupt, 1, 12)
[ 955.790467] i8042: [238555] 00 <- i8042 (interrupt, 1, 12)
[ 955.791559] i8042: [238556] 00 <- i8042 (interrupt, 1, 12)
[ 955.792510] i8042: [238556] 08 <- i8042 (interrupt, 1, 12)
[ 955.793538] i8042: [238556] 00 <- i8042 (interrupt, 1, 12)
[ 955.794565] i8042: [238556] 00 <- i8042 (interrupt, 1, 12)
[ 955.911661] i8042: [238586] 8f <- i8042 (interrupt, 1, 12)
[ 955.912594] i8042: [238586] 4b <- i8042 (interrupt, 1, 12)
[ 955.913620] i8042: [238586] 3b <- i8042 (interrupt, 1, 12)
[ 955.914645] i8042: [238586] 08 <- i8042 (interrupt, 1, 12)
[ 955.915673] i8042: [238587] 61 <- i8042 (interrupt, 1, 12)
[ 955.916701] i8042: [238587] 00 <- i8042 (interrupt, 1, 12)
[ 955.921846] i8042: [238588] cf <- i8042 (interrupt, 1, 12)
[ 955.922755] i8042: [238588] 00 <- i8042 (interrupt, 1, 12)
[ 955.923783] i8042: [238589] 00 <- i8042 (interrupt, 1, 12)
[ 955.924809] i8042: [238589] 08 <- i8042 (interrupt, 1, 12)
[ 955.925834] i8042: [238589] 00 <- i8042 (interrupt, 1, 12)
[ 955.926860] i8042: [238589] 00 <- i8042 (interrupt, 1, 12)
[ 955.931982] i8042: [238591] cf <- i8042 (interrupt, 1, 12)
[ 955.933010] i8042: [238591] 00 <- i8042 (interrupt, 1, 12)
[ 955.934035] i8042: [238591] 00 <- i8042 (interrupt, 1, 12)
[ 955.935062] i8042: [238591] 08 <- i8042 (interrupt, 1, 12)
[ 955.936089] i8042: [238592] 00 <- i8042 (interrupt, 1, 12)
[ 955.937115] i8042: [238592] 00 <- i8042 (interrupt, 1, 12)
[ 955.942071] i8042: [238593] 8f <- i8042 (interrupt, 1, 12)
[ 955.943100] i8042: [238593] 4b <- i8042 (interrupt, 1, 12)
[ 955.944126] i8042: [238594] 3b <- i8042 (interrupt, 1, 12)
[ 955.945154] i8042: [238594] 08 <- i8042 (interrupt, 1, 12)
[ 955.946180] i8042: [238594] 61 <- i8042 (interrupt, 1, 12)
[ 955.947206] i8042: [238594] 00 <- i8042 (interrupt, 1, 12)
[ 955.952263] i8042: [238596] cf <- i8042 (interrupt, 1, 12)
[ 955.953288] i8042: [238596] 00 <- i8042 (interrupt, 1, 12)
[ 955.954314] i8042: [238596] 70 <- i8042 (interrupt, 1, 12)
[ 955.955302] i8042: [238596] 7f <- i8042 (interrupt, 1, 12)
[ 955.956366] i8042: [238597] 00 <- i8042 (interrupt, 1, 12)
[ 955.957395] i8042: [238597] ff <- i8042 (interrupt, 1, 12)
[ 955.957401] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.962469] i8042: [238598] cf <- i8042 (interrupt, 1, 12)
[ 955.963498] i8042: [238599] 00 <- i8042 (interrupt, 1, 12)
[ 955.964522] i8042: [238599] 00 <- i8042 (interrupt, 1, 12)
[ 955.965551] i8042: [238599] 08 <- i8042 (interrupt, 1, 12)
[ 955.966578] i8042: [238599] 00 <- i8042 (interrupt, 1, 12)
[ 955.967605] i8042: [238600] 00 <- i8042 (interrupt, 1, 12)
[ 955.972564] i8042: [238601] 8f <- i8042 (interrupt, 1, 12)
[ 955.973591] i8042: [238601] 4b <- i8042 (interrupt, 1, 12)
[ 955.974619] i8042: [238601] 3b <- i8042 (interrupt, 1, 12)
[ 955.975646] i8042: [238602] 08 <- i8042 (interrupt, 1, 12)
[ 955.976671] i8042: [238602] 61 <- i8042 (interrupt, 1, 12)
[ 955.977697] i8042: [238602] 00 <- i8042 (interrupt, 1, 12)
[ 955.982778] i8042: [238603] cf <- i8042 (interrupt, 1, 12)
[ 955.983804] i8042: [238604] 04 <- i8042 (interrupt, 1, 12)
[ 955.984831] i8042: [238604] 7c <- i8042 (interrupt, 1, 12)
[ 955.985859] i8042: [238604] 7f <- i8042 (interrupt, 1, 12)
[ 955.986862] i8042: [238604] 16 <- i8042 (interrupt, 1, 12)
[ 955.987913] i8042: [238605] ff <- i8042 (interrupt, 1, 12)
[ 955.987919] psmouse serio1: alps: v3 discard packet[5] = ff
[ 955.992889] i8042: [238606] 8f <- i8042 (interrupt, 1, 12)
[ 955.993916] i8042: [238606] 4b <- i8042 (interrupt, 1, 12)
[ 955.994943] i8042: [238606] 3b <- i8042 (interrupt, 1, 12)
[ 955.995972] i8042: [238607] 08 <- i8042 (interrupt, 1, 12)
[ 955.996998] i8042: [238607] 61 <- i8042 (interrupt, 1, 12)
[ 955.998025] i8042: [238607] 00 <- i8042 (interrupt, 1, 12)
[ 956.003122] i8042: [238608] cf <- i8042 (interrupt, 1, 12)
[ 956.004147] i8042: [238609] 00 <- i8042 (interrupt, 1, 12)
[ 956.005174] i8042: [238609] 00 <- i8042 (interrupt, 1, 12)
[ 956.006200] i8042: [238609] 08 <- i8042 (interrupt, 1, 12)
[ 956.007229] i8042: [238609] 00 <- i8042 (interrupt, 1, 12)
[ 956.008257] i8042: [238610] 00 <- i8042 (interrupt, 1, 12)
[ 956.013231] i8042: [238611] 8f <- i8042 (interrupt, 1, 12)
[ 956.014257] i8042: [238611] 4b <- i8042 (interrupt, 1, 12)
[ 956.015284] i8042: [238611] 3b <- i8042 (interrupt, 1, 12)
[ 956.016310] i8042: [238612] 08 <- i8042 (interrupt, 1, 12)
[ 956.017342] i8042: [238612] 61 <- i8042 (interrupt, 1, 12)
[ 956.018349] i8042: [238612] 00 <- i8042 (interrupt, 1, 12)
[ 956.023443] i8042: [238613] cf <- i8042 (interrupt, 1, 12)
[ 956.024470] i8042: [238614] 00 <- i8042 (interrupt, 1, 12)
[ 956.025497] i8042: [238614] 00 <- i8042 (interrupt, 1, 12)
[ 956.026499] i8042: [238614] 08 <- i8042 (interrupt, 1, 12)
[ 956.027550] i8042: [238615] 00 <- i8042 (interrupt, 1, 12)
[ 956.028575] i8042: [238615] 00 <- i8042 (interrupt, 1, 12)
[ 956.033647] i8042: [238616] 8f <- i8042 (interrupt, 1, 12)
[ 956.034672] i8042: [238616] 4b <- i8042 (interrupt, 1, 12)
[ 956.035700] i8042: [238617] 3b <- i8042 (interrupt, 1, 12)
[ 956.036723] i8042: [238617] 08 <- i8042 (interrupt, 1, 12)
[ 956.037751] i8042: [238617] 61 <- i8042 (interrupt, 1, 12)
[ 956.038775] i8042: [238617] 00 <- i8042 (interrupt, 1, 12)
[ 956.043767] i8042: [238619] cf <- i8042 (interrupt, 1, 12)
[ 956.044793] i8042: [238619] 7d <- i8042 (interrupt, 1, 12)
[ 956.045817] i8042: [238619] 7c <- i8042 (interrupt, 1, 12)
[ 956.047520] i8042: [238620] 7f <- i8042 (interrupt, 1, 12)
[ 956.048545] i8042: [238620] 1e <- i8042 (interrupt, 1, 12)
[ 956.049651] i8042: [238620] 65 <- i8042 (interrupt, 1, 12)
[ 956.053983] i8042: [238621] cf <- i8042 (interrupt, 1, 12)
[ 956.054990] i8042: [238621] 00 <- i8042 (interrupt, 1, 12)
[ 956.056016] i8042: [238622] 00 <- i8042 (interrupt, 1, 12)
[ 956.057042] i8042: [238622] 08 <- i8042 (interrupt, 1, 12)
[ 956.058067] i8042: [238622] 00 <- i8042 (interrupt, 1, 12)
[ 956.059175] i8042: [238622] 00 <- i8042 (interrupt, 1, 12)
[ 956.064095] i8042: [238624] af <- i8042 (interrupt, 1, 12)
[ 956.065120] i8042: [238624] 53 <- i8042 (interrupt, 1, 12)
[ 956.066146] i8042: [238624] 54 <- i8042 (interrupt, 1, 12)
[ 956.067170] i8042: [238624] 08 <- i8042 (interrupt, 1, 12)
[ 956.068199] i8042: [238625] 6b <- i8042 (interrupt, 1, 12)
[ 956.069302] i8042: [238625] 15 <- i8042 (interrupt, 1, 12)
[ 956.074343] i8042: [238626] cf <- i8042 (interrupt, 1, 12)
[ 956.075368] i8042: [238626] 7f <- i8042 (interrupt, 1, 12)
[ 956.076394] i8042: [238627] 7e <- i8042 (interrupt, 1, 12)
[ 956.077421] i8042: [238627] 7f <- i8042 (interrupt, 1, 12)
[ 956.078446] i8042: [238627] 7e <- i8042 (interrupt, 1, 12)
[ 956.079554] i8042: [238628] 66 <- i8042 (interrupt, 1, 12)
[ 956.084473] i8042: [238629] af <- i8042 (interrupt, 1, 12)
[ 956.085496] i8042: [238629] 53 <- i8042 (interrupt, 1, 12)
[ 956.086523] i8042: [238629] 54 <- i8042 (interrupt, 1, 12)
[ 956.087551] i8042: [238630] 08 <- i8042 (interrupt, 1, 12)
[ 956.088576] i8042: [238630] 6b <- i8042 (interrupt, 1, 12)
[ 956.089682] i8042: [238630] 16 <- i8042 (interrupt, 1, 12)
[ 956.094600] i8042: [238631] ef <- i8042 (interrupt, 1, 12)
[ 956.095626] i8042: [238632] 7f <- i8042 (interrupt, 1, 12)
[ 956.096651] i8042: [238632] 7f <- i8042 (interrupt, 1, 12)
[ 956.097678] i8042: [238632] 7f <- i8042 (interrupt, 1, 12)
[ 956.098703] i8042: [238632] 7e <- i8042 (interrupt, 1, 12)
[ 956.099813] i8042: [238633] 77 <- i8042 (interrupt, 1, 12)
[ 956.104851] i8042: [238634] bf <- i8042 (interrupt, 1, 12)
[ 956.105876] i8042: [238634] 53 <- i8042 (interrupt, 1, 12)
[ 956.106903] i8042: [238634] 54 <- i8042 (interrupt, 1, 12)
[ 956.107930] i8042: [238635] 08 <- i8042 (interrupt, 1, 12)
[ 956.109035] i8042: [238635] 6d <- i8042 (interrupt, 1, 12)
[ 956.109897] i8042: [238635] 17 <- i8042 (interrupt, 1, 12)
[ 956.114984] i8042: [238636] cf <- i8042 (interrupt, 1, 12)
[ 956.116009] i8042: [238637] 7f <- i8042 (interrupt, 1, 12)
[ 956.117036] i8042: [238637] 7e <- i8042 (interrupt, 1, 12)
[ 956.118061] i8042: [238637] 7f <- i8042 (interrupt, 1, 12)
[ 956.119167] i8042: [238637] 7e <- i8042 (interrupt, 1, 12)
[ 956.120076] i8042: [238638] 67 <- i8042 (interrupt, 1, 12)
[ 956.125054] i8042: [238639] bf <- i8042 (interrupt, 1, 12)
[ 956.126078] i8042: [238639] 53 <- i8042 (interrupt, 1, 12)
[ 956.127166] i8042: [238639] 54 <- i8042 (interrupt, 1, 12)
[ 956.128137] i8042: [238640] 08 <- i8042 (interrupt, 1, 12)
[ 956.129262] i8042: [238640] 6c <- i8042 (interrupt, 1, 12)
[ 956.130170] i8042: [238640] 17 <- i8042 (interrupt, 1, 12)
[ 956.135325] i8042: [238641] ef <- i8042 (interrupt, 1, 12)
[ 956.136350] i8042: [238642] 7f <- i8042 (interrupt, 1, 12)
[ 956.137376] i8042: [238642] 7f <- i8042 (interrupt, 1, 12)
[ 956.138480] i8042: [238642] 7f <- i8042 (interrupt, 1, 12)
[ 956.139423] i8042: [238642] 7e <- i8042 (interrupt, 1, 12)
[ 956.140449] i8042: [238643] 77 <- i8042 (interrupt, 1, 12)
[ 956.145415] i8042: [238644] 8f <- i8042 (interrupt, 1, 12)
[ 956.146467] i8042: [238644] 53 <- i8042 (interrupt, 1, 12)
[ 956.147515] i8042: [238644] 38 <- i8042 (interrupt, 1, 12)
[ 956.148624] i8042: [238645] 08 <- i8042 (interrupt, 1, 12)
[ 956.149531] i8042: [238645] 75 <- i8042 (interrupt, 1, 12)
[ 956.150559] i8042: [238645] 3e <- i8042 (interrupt, 1, 12)
[ 956.155682] i8042: [238647] ef <- i8042 (interrupt, 1, 12)
[ 956.156706] i8042: [238647] 7f <- i8042 (interrupt, 1, 12)
[ 956.157804] i8042: [238647] 7f <- i8042 (interrupt, 1, 12)
[ 956.158712] i8042: [238647] 7f <- i8042 (interrupt, 1, 12)
[ 956.159739] i8042: [238648] 7e <- i8042 (interrupt, 1, 12)
[ 956.160764] i8042: [238648] 77 <- i8042 (interrupt, 1, 12)
[ 956.165867] i8042: [238649] 9f <- i8042 (interrupt, 1, 12)
[ 956.166893] i8042: [238649] 6e <- i8042 (interrupt, 1, 12)
[ 956.167949] i8042: [238650] 54 <- i8042 (interrupt, 1, 12)
[ 956.168884] i8042: [238650] 08 <- i8042 (interrupt, 1, 12)
[ 956.169933] i8042: [238650] 7d <- i8042 (interrupt, 1, 12)
[ 956.170962] i8042: [238650] 19 <- i8042 (interrupt, 1, 12)
[ 956.175973] i8042: [238652] cf <- i8042 (interrupt, 1, 12)
[ 956.177024] i8042: [238652] 7f <- i8042 (interrupt, 1, 12)
[ 956.178133] i8042: [238652] 7e <- i8042 (interrupt, 1, 12)
[ 956.179042] i8042: [238652] 7f <- i8042 (interrupt, 1, 12)
[ 956.180068] i8042: [238653] 7e <- i8042 (interrupt, 1, 12)
[ 956.181094] i8042: [238653] 66 <- i8042 (interrupt, 1, 12)
[ 956.186250] i8042: [238654] 9f <- i8042 (interrupt, 1, 12)
[ 956.187355] i8042: [238654] 6e <- i8042 (interrupt, 1, 12)
[ 956.188264] i8042: [238655] 54 <- i8042 (interrupt, 1, 12)
[ 956.189290] i8042: [238655] 08 <- i8042 (interrupt, 1, 12)
[ 956.190316] i8042: [238655] 7d <- i8042 (interrupt, 1, 12)
[ 956.191344] i8042: [238655] 00 <- i8042 (interrupt, 1, 12)
[ 956.196385] i8042: [238657] ef <- i8042 (interrupt, 1, 12)
[ 956.197445] i8042: [238657] 7f <- i8042 (interrupt, 1, 12)
[ 956.198380] i8042: [238657] 7f <- i8042 (interrupt, 1, 12)
[ 956.199407] i8042: [238657] 7f <- i8042 (interrupt, 1, 12)
[ 956.200381] i8042: [238658] 7e <- i8042 (interrupt, 1, 12)
[ 956.201418] i8042: [238658] 73 <- i8042 (interrupt, 1, 12)
[ 956.206500] i8042: [238659] bf <- i8042 (interrupt, 1, 12)
[ 956.207609] i8042: [238660] 53 <- i8042 (interrupt, 1, 12)
[ 956.208517] i8042: [238660] 54 <- i8042 (interrupt, 1, 12)
[ 956.209542] i8042: [238660] 08 <- i8042 (interrupt, 1, 12)
[ 956.210571] i8042: [238660] 6d <- i8042 (interrupt, 1, 12)
[ 956.211599] i8042: [238661] 16 <- i8042 (interrupt, 1, 12)
[ 956.216755] i8042: [238662] ef <- i8042 (interrupt, 1, 12)
[ 956.217859] i8042: [238662] 7f <- i8042 (interrupt, 1, 12)
[ 956.218770] i8042: [238662] 7f <- i8042 (interrupt, 1, 12)
[ 956.219795] i8042: [238663] 7f <- i8042 (interrupt, 1, 12)
[ 956.220822] i8042: [238663] 7e <- i8042 (interrupt, 1, 12)
[ 956.221849] i8042: [238663] 77 <- i8042 (interrupt, 1, 12)
[ 956.226886] i8042: [238664] bf <- i8042 (interrupt, 1, 12)
[ 956.227959] i8042: [238665] 27 <- i8042 (interrupt, 1, 12)
[ 956.228866] i8042: [238665] 54 <- i8042 (interrupt, 1, 12)
[ 956.229871] i8042: [238665] 08 <- i8042 (interrupt, 1, 12)
[ 956.230905] i8042: [238665] 7c <- i8042 (interrupt, 1, 12)
[ 956.231980] i8042: [238666] 00 <- i8042 (interrupt, 1, 12)
[ 956.237089] i8042: [238667] ef <- i8042 (interrupt, 1, 12)
[ 956.237997] i8042: [238667] 7f <- i8042 (interrupt, 1, 12)
[ 956.239026] i8042: [238667] 7f <- i8042 (interrupt, 1, 12)
[ 956.240055] i8042: [238668] 7f <- i8042 (interrupt, 1, 12)
[ 956.241079] i8042: [238668] 7e <- i8042 (interrupt, 1, 12)
[ 956.242897] i8042: [238668] 77 <- i8042 (interrupt, 1, 12)
[ 956.247267] i8042: [238669] bf <- i8042 (interrupt, 1, 12)
[ 956.248293] i8042: [238670] 27 <- i8042 (interrupt, 1, 12)
[ 956.249321] i8042: [238670] 54 <- i8042 (interrupt, 1, 12)
[ 956.250347] i8042: [238670] 08 <- i8042 (interrupt, 1, 12)
[ 956.251374] i8042: [238670] 7c <- i8042 (interrupt, 1, 12)
[ 956.252403] i8042: [238671] 00 <- i8042 (interrupt, 1, 12)
[ 956.257524] i8042: [238672] cf <- i8042 (interrupt, 1, 12)
[ 956.258536] i8042: [238672] 7f <- i8042 (interrupt, 1, 12)
[ 956.259518] i8042: [238672] 7c <- i8042 (interrupt, 1, 12)
[ 956.260600] i8042: [238673] 7f <- i8042 (interrupt, 1, 12)
[ 956.261628] i8042: [238673] 7e <- i8042 (interrupt, 1, 12)
[ 956.262654] i8042: [238673] ff <- i8042 (interrupt, 1, 12)
[ 956.262660] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.267614] i8042: [238674] cf <- i8042 (interrupt, 1, 12)
[ 956.268533] i8042: [238675] 00 <- i8042 (interrupt, 1, 12)
[ 956.269590] i8042: [238675] 00 <- i8042 (interrupt, 1, 12)
[ 956.270615] i8042: [238675] 08 <- i8042 (interrupt, 1, 12)
[ 956.271652] i8042: [238676] 00 <- i8042 (interrupt, 1, 12)
[ 956.272652] i8042: [238676] 00 <- i8042 (interrupt, 1, 12)
[ 956.277769] i8042: [238677] bf <- i8042 (interrupt, 1, 12)
[ 956.278797] i8042: [238677] 27 <- i8042 (interrupt, 1, 12)
[ 956.279824] i8042: [238678] 54 <- i8042 (interrupt, 1, 12)
[ 956.280851] i8042: [238678] 08 <- i8042 (interrupt, 1, 12)
[ 956.281877] i8042: [238678] 7c <- i8042 (interrupt, 1, 12)
[ 956.282904] i8042: [238678] 00 <- i8042 (interrupt, 1, 12)
[ 956.287874] i8042: [238680] cf <- i8042 (interrupt, 1, 12)
[ 956.288885] i8042: [238680] 7f <- i8042 (interrupt, 1, 12)
[ 956.289952] i8042: [238680] 7c <- i8042 (interrupt, 1, 12)
[ 956.290941] i8042: [238680] 7f <- i8042 (interrupt, 1, 12)
[ 956.292016] i8042: [238681] 1e <- i8042 (interrupt, 1, 12)
[ 956.293015] i8042: [238681] 64 <- i8042 (interrupt, 1, 12)
[ 956.298091] i8042: [238682] af <- i8042 (interrupt, 1, 12)
[ 956.299115] i8042: [238682] 53 <- i8042 (interrupt, 1, 12)
[ 956.300141] i8042: [238683] 31 <- i8042 (interrupt, 1, 12)
[ 956.301166] i8042: [238683] 08 <- i8042 (interrupt, 1, 12)
[ 956.302192] i8042: [238683] 60 <- i8042 (interrupt, 1, 12)
[ 956.303219] i8042: [238683] 00 <- i8042 (interrupt, 1, 12)
[ 956.308295] i8042: [238685] cf <- i8042 (interrupt, 1, 12)
[ 956.309321] i8042: [238685] 7f <- i8042 (interrupt, 1, 12)
[ 956.310347] i8042: [238685] 7c <- i8042 (interrupt, 1, 12)
[ 956.311373] i8042: [238685] 7f <- i8042 (interrupt, 1, 12)
[ 956.312400] i8042: [238686] 1e <- i8042 (interrupt, 1, 12)
[ 956.313427] i8042: [238686] ff <- i8042 (interrupt, 1, 12)
[ 956.313433] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.318481] i8042: [238687] af <- i8042 (interrupt, 1, 12)
[ 956.319454] i8042: [238687] 53 <- i8042 (interrupt, 1, 12)
[ 956.320490] i8042: [238688] 31 <- i8042 (interrupt, 1, 12)
[ 956.321559] i8042: [238688] 08 <- i8042 (interrupt, 1, 12)
[ 956.322585] i8042: [238688] 60 <- i8042 (interrupt, 1, 12)
[ 956.323611] i8042: [238688] 00 <- i8042 (interrupt, 1, 12)
[ 956.328576] i8042: [238690] cf <- i8042 (interrupt, 1, 12)
[ 956.329595] i8042: [238690] 7c <- i8042 (interrupt, 1, 12)
[ 956.330620] i8042: [238690] 7c <- i8042 (interrupt, 1, 12)
[ 956.331645] i8042: [238690] 7f <- i8042 (interrupt, 1, 12)
[ 956.332672] i8042: [238691] 16 <- i8042 (interrupt, 1, 12)
[ 956.333698] i8042: [238691] ff <- i8042 (interrupt, 1, 12)
[ 956.333704] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.338793] i8042: [238692] af <- i8042 (interrupt, 1, 12)
[ 956.340589] i8042: [238693] 53 <- i8042 (interrupt, 1, 12)
[ 956.341615] i8042: [238693] 31 <- i8042 (interrupt, 1, 12)
[ 956.342642] i8042: [238693] 08 <- i8042 (interrupt, 1, 12)
[ 956.343669] i8042: [238693] 60 <- i8042 (interrupt, 1, 12)
[ 956.344694] i8042: [238694] 00 <- i8042 (interrupt, 1, 12)
[ 956.348906] i8042: [238695] cf <- i8042 (interrupt, 1, 12)
[ 956.349943] i8042: [238695] 70 <- i8042 (interrupt, 1, 12)
[ 956.350955] i8042: [238695] 7c <- i8042 (interrupt, 1, 12)
[ 956.351980] i8042: [238696] 7f <- i8042 (interrupt, 1, 12)
[ 956.353069] i8042: [238696] 16 <- i8042 (interrupt, 1, 12)
[ 956.354075] i8042: [238696] ff <- i8042 (interrupt, 1, 12)
[ 956.354081] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.359166] i8042: [238697] af <- i8042 (interrupt, 1, 12)
[ 956.360171] i8042: [238698] 53 <- i8042 (interrupt, 1, 12)
[ 956.361176] i8042: [238698] 31 <- i8042 (interrupt, 1, 12)
[ 956.362187] i8042: [238698] 08 <- i8042 (interrupt, 1, 12)
[ 956.363228] i8042: [238698] 60 <- i8042 (interrupt, 1, 12)
[ 956.364254] i8042: [238699] 00 <- i8042 (interrupt, 1, 12)
[ 956.369271] i8042: [238700] cf <- i8042 (interrupt, 1, 12)
[ 956.370296] i8042: [238700] 70 <- i8042 (interrupt, 1, 12)
[ 956.371321] i8042: [238700] 7c <- i8042 (interrupt, 1, 12)
[ 956.372346] i8042: [238701] 7f <- i8042 (interrupt, 1, 12)
[ 956.373374] i8042: [238701] 16 <- i8042 (interrupt, 1, 12)
[ 956.374400] i8042: [238701] ff <- i8042 (interrupt, 1, 12)
[ 956.374407] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.379436] i8042: [238702] af <- i8042 (interrupt, 1, 12)
[ 956.380517] i8042: [238703] 53 <- i8042 (interrupt, 1, 12)
[ 956.381542] i8042: [238703] 31 <- i8042 (interrupt, 1, 12)
[ 956.382569] i8042: [238703] 08 <- i8042 (interrupt, 1, 12)
[ 956.383594] i8042: [238703] 60 <- i8042 (interrupt, 1, 12)
[ 956.384569] i8042: [238704] 00 <- i8042 (interrupt, 1, 12)
[ 956.389714] i8042: [238705] cf <- i8042 (interrupt, 1, 12)
[ 956.390739] i8042: [238705] 00 <- i8042 (interrupt, 1, 12)
[ 956.391752] i8042: [238706] 00 <- i8042 (interrupt, 1, 12)
[ 956.392791] i8042: [238706] 08 <- i8042 (interrupt, 1, 12)
[ 956.393817] i8042: [238706] 00 <- i8042 (interrupt, 1, 12)
[ 956.394842] i8042: [238706] 00 <- i8042 (interrupt, 1, 12)
[ 956.399816] i8042: [238708] af <- i8042 (interrupt, 1, 12)
[ 956.400839] i8042: [238708] 53 <- i8042 (interrupt, 1, 12)
[ 956.401867] i8042: [238708] 31 <- i8042 (interrupt, 1, 12)
[ 956.402869] i8042: [238708] 08 <- i8042 (interrupt, 1, 12)
[ 956.403891] i8042: [238709] 60 <- i8042 (interrupt, 1, 12)
[ 956.404943] i8042: [238709] 00 <- i8042 (interrupt, 1, 12)
[ 956.409969] i8042: [238710] cf <- i8042 (interrupt, 1, 12)
[ 956.410915] i8042: [238710] 00 <- i8042 (interrupt, 1, 12)
[ 956.411939] i8042: [238711] 70 <- i8042 (interrupt, 1, 12)
[ 956.413021] i8042: [238711] 7f <- i8042 (interrupt, 1, 12)
[ 956.414050] i8042: [238711] 06 <- i8042 (interrupt, 1, 12)
[ 956.415058] i8042: [238711] ff <- i8042 (interrupt, 1, 12)
[ 956.415065] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.420125] i8042: [238713] af <- i8042 (interrupt, 1, 12)
[ 956.421194] i8042: [238713] 53 <- i8042 (interrupt, 1, 12)
[ 956.422221] i8042: [238713] 31 <- i8042 (interrupt, 1, 12)
[ 956.423222] i8042: [238713] 08 <- i8042 (interrupt, 1, 12)
[ 956.424273] i8042: [238714] 60 <- i8042 (interrupt, 1, 12)
[ 956.425299] i8042: [238714] 00 <- i8042 (interrupt, 1, 12)
[ 956.430377] i8042: [238715] cf <- i8042 (interrupt, 1, 12)
[ 956.431356] i8042: [238715] 00 <- i8042 (interrupt, 1, 12)
[ 956.432386] i8042: [238716] 70 <- i8042 (interrupt, 1, 12)
[ 956.433456] i8042: [238716] 7f <- i8042 (interrupt, 1, 12)
[ 956.434483] i8042: [238716] 06 <- i8042 (interrupt, 1, 12)
[ 956.435588] i8042: [238716] ff <- i8042 (interrupt, 1, 12)
[ 956.435594] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.440837] i8042: [238718] cf <- i8042 (interrupt, 1, 12)
[ 956.441819] i8042: [238718] 00 <- i8042 (interrupt, 1, 12)
[ 956.442846] i8042: [238718] 00 <- i8042 (interrupt, 1, 12)
[ 956.443872] i8042: [238719] 08 <- i8042 (interrupt, 1, 12)
[ 956.444898] i8042: [238719] 00 <- i8042 (interrupt, 1, 12)
[ 956.446048] i8042: [238719] 00 <- i8042 (interrupt, 1, 12)
[ 956.450733] i8042: [238720] af <- i8042 (interrupt, 1, 12)
[ 956.451775] i8042: [238721] 53 <- i8042 (interrupt, 1, 12)
[ 956.452769] i8042: [238721] 31 <- i8042 (interrupt, 1, 12)
[ 956.453794] i8042: [238721] 08 <- i8042 (interrupt, 1, 12)
[ 956.454821] i8042: [238721] 60 <- i8042 (interrupt, 1, 12)
[ 956.455905] i8042: [238722] 00 <- i8042 (interrupt, 1, 12)
[ 956.460850] i8042: [238723] cf <- i8042 (interrupt, 1, 12)
[ 956.461876] i8042: [238723] 00 <- i8042 (interrupt, 1, 12)
[ 956.462901] i8042: [238723] 70 <- i8042 (interrupt, 1, 12)
[ 956.463929] i8042: [238724] 7f <- i8042 (interrupt, 1, 12)
[ 956.464956] i8042: [238724] 00 <- i8042 (interrupt, 1, 12)
[ 956.466063] i8042: [238724] ff <- i8042 (interrupt, 1, 12)
[ 956.466069] psmouse serio1: alps: v3 discard packet[5] = ff
[ 956.471083] i8042: [238725] cf <- i8042 (interrupt, 1, 12)
[ 956.472107] i8042: [238726] 00 <- i8042 (interrupt, 1, 12)
[ 956.473135] i8042: [238726] 00 <- i8042 (interrupt, 1, 12)
[ 956.474166] i8042: [238726] 08 <- i8042 (interrupt, 1, 12)
[ 956.475175] i8042: [238726] 00 <- i8042 (interrupt, 1, 12)
[ 956.476283] i8042: [238727] 00 <- i8042 (interrupt, 1, 12)
[ 956.481147] i8042: [238728] af <- i8042 (interrupt, 1, 12)
[ 956.482184] i8042: [238728] 53 <- i8042 (interrupt, 1, 12)
[ 956.483257] i8042: [238728] 31 <- i8042 (interrupt, 1, 12)
[ 956.484283] i8042: [238729] 08 <- i8042 (interrupt, 1, 12)
[ 956.485308] i8042: [238729] 60 <- i8042 (interrupt, 1, 12)
[ 956.486415] i8042: [238729] 00 <- i8042 (interrupt, 1, 12)
[ 956.491454] i8042: [238730] cf <- i8042 (interrupt, 1, 12)
[ 956.492481] i8042: [238731] 00 <- i8042 (interrupt, 1, 12)
[ 956.493505] i8042: [238731] 00 <- i8042 (interrupt, 1, 12)
[ 956.494532] i8042: [238731] 08 <- i8042 (interrupt, 1, 12)
[ 956.495559] i8042: [238731] 00 <- i8042 (interrupt, 1, 12)
[ 956.496666] i8042: [238732] 00 <- i8042 (interrupt, 1, 12)
[ 956.501585] i8042: [238733] cf <- i8042 (interrupt, 1, 12)
[ 956.502612] i8042: [238733] 00 <- i8042 (interrupt, 1, 12)
[ 956.503639] i8042: [238733] 00 <- i8042 (interrupt, 1, 12)
[ 956.504668] i8042: [238734] 08 <- i8042 (interrupt, 1, 12)
[ 956.505772] i8042: [238734] 00 <- i8042 (interrupt, 1, 12)
[ 956.506681] i8042: [238734] 00 <- i8042 (interrupt, 1, 12)
[ 956.511721] i8042: [238735] cf <- i8042 (interrupt, 1, 12)
[ 956.512748] i8042: [238736] 00 <- i8042 (interrupt, 1, 12)
[ 956.513774] i8042: [238736] 00 <- i8042 (interrupt, 1, 12)
[ 956.514802] i8042: [238736] 08 <- i8042 (interrupt, 1, 12)
[ 956.515911] i8042: [238737] 00 <- i8042 (interrupt, 1, 12)
[ 956.516815] i8042: [238737] 00 <- i8042 (interrupt, 1, 12)
[ 956.521858] i8042: [238738] cf <- i8042 (interrupt, 1, 12)
[ 956.522884] i8042: [238738] 00 <- i8042 (interrupt, 1, 12)
[ 956.523911] i8042: [238739] 00 <- i8042 (interrupt, 1, 12)
[ 956.524939] i8042: [238739] 08 <- i8042 (interrupt, 1, 12)
[ 956.526045] i8042: [238739] 00 <- i8042 (interrupt, 1, 12)
[ 956.526952] i8042: [238739] 00 <- i8042 (interrupt, 1, 12)
[ 956.532034] i8042: [238741] cf <- i8042 (interrupt, 1, 12)
[ 956.533060] i8042: [238741] 00 <- i8042 (interrupt, 1, 12)
[ 956.534085] i8042: [238741] 00 <- i8042 (interrupt, 1, 12)
[ 956.536146] i8042: [238742] 08 <- i8042 (interrupt, 1, 12)
[ 956.537053] i8042: [238742] 00 <- i8042 (interrupt, 1, 12)
[ 956.538079] i8042: [238742] 00 <- i8042 (interrupt, 1, 12)
[ 956.542294] i8042: [238743] cf <- i8042 (interrupt, 1, 12)
[ 956.543319] i8042: [238743] 00 <- i8042 (interrupt, 1, 12)
[ 956.544347] i8042: [238744] 00 <- i8042 (interrupt, 1, 12)
[ 956.545374] i8042: [238744] 08 <- i8042 (interrupt, 1, 12)
[ 956.546476] i8042: [238744] 00 <- i8042 (interrupt, 1, 12)
[ 956.547387] i8042: [238744] 00 <- i8042 (interrupt, 1, 12)
[ 956.552427] i8042: [238746] 8f <- i8042 (interrupt, 1, 12)
[ 956.553452] i8042: [238746] 00 <- i8042 (interrupt, 1, 12)
[ 956.554424] i8042: [238746] 00 <- i8042 (interrupt, 1, 12)
[ 956.555540] i8042: [238746] 08 <- i8042 (interrupt, 1, 12)
[ 956.556491] i8042: [238747] 00 <- i8042 (interrupt, 1, 12)
[ 956.557518] i8042: [238747] 00 <- i8042 (interrupt, 1, 12)
[ 956.562533] i8042: [238748] 8f <- i8042 (interrupt, 1, 12)
[ 956.563555] i8042: [238748] 00 <- i8042 (interrupt, 1, 12)
[ 956.564610] i8042: [238749] 00 <- i8042 (interrupt, 1, 12)
[ 956.565714] i8042: [238749] 08 <- i8042 (interrupt, 1, 12)
[ 956.566620] i8042: [238749] 00 <- i8042 (interrupt, 1, 12)
[ 956.567647] i8042: [238749] 00 <- i8042 (interrupt, 1, 12)
[ 956.572804] i8042: [238751] 8f <- i8042 (interrupt, 1, 12)
[ 956.573830] i8042: [238751] 00 <- i8042 (interrupt, 1, 12)
[ 956.574869] i8042: [238751] 00 <- i8042 (interrupt, 1, 12)
[ 956.575945] i8042: [238752] 08 <- i8042 (interrupt, 1, 12)
[ 956.576852] i8042: [238752] 00 <- i8042 (interrupt, 1, 12)
[ 956.577856] i8042: [238752] 00 <- i8042 (interrupt, 1, 12)
[ 956.582877] i8042: [238753] 8f <- i8042 (interrupt, 1, 12)
[ 956.583886] i8042: [238754] 00 <- i8042 (interrupt, 1, 12)
[ 956.584925] i8042: [238754] 00 <- i8042 (interrupt, 1, 12)
[ 956.586073] i8042: [238754] 08 <- i8042 (interrupt, 1, 12)
[ 956.586981] i8042: [238754] 00 <- i8042 (interrupt, 1, 12)
[ 956.588008] i8042: [238755] 00 <- i8042 (interrupt, 1, 12)
[ 956.593152] i8042: [238756] 8f <- i8042 (interrupt, 1, 12)
[ 956.594189] i8042: [238756] 00 <- i8042 (interrupt, 1, 12)
[ 956.595213] i8042: [238756] 00 <- i8042 (interrupt, 1, 12)
[ 956.596319] i8042: [238757] 08 <- i8042 (interrupt, 1, 12)
[ 956.597228] i8042: [238757] 00 <- i8042 (interrupt, 1, 12)
[ 956.598252] i8042: [238757] 00 <- i8042 (interrupt, 1, 12)
[ 956.603292] i8042: [238758] 8f <- i8042 (interrupt, 1, 12)
[ 956.604275] i8042: [238759] 00 <- i8042 (interrupt, 1, 12)
[ 956.605421] i8042: [238759] 00 <- i8042 (interrupt, 1, 12)
[ 956.606326] i8042: [238759] 08 <- i8042 (interrupt, 1, 12)
[ 956.607354] i8042: [238759] 00 <- i8042 (interrupt, 1, 12)
[ 956.608381] i8042: [238760] 00 <- i8042 (interrupt, 1, 12)
[ 956.613386] i8042: [238761] 8f <- i8042 (interrupt, 1, 12)
[ 956.614410] i8042: [238761] 00 <- i8042 (interrupt, 1, 12)
[ 956.615514] i8042: [238761] 00 <- i8042 (interrupt, 1, 12)
[ 956.616423] i8042: [238762] 08 <- i8042 (interrupt, 1, 12)
[ 956.617425] i8042: [238762] 00 <- i8042 (interrupt, 1, 12)
[ 956.618469] i8042: [238762] 00 <- i8042 (interrupt, 1, 12)
[ 956.623663] i8042: [238763] 8f <- i8042 (interrupt, 1, 12)
[ 956.624688] i8042: [238764] 00 <- i8042 (interrupt, 1, 12)
[ 956.625793] i8042: [238764] 00 <- i8042 (interrupt, 1, 12)
[ 956.626671] i8042: [238764] 08 <- i8042 (interrupt, 1, 12)
[ 956.627727] i8042: [238764] 00 <- i8042 (interrupt, 1, 12)
[ 956.628752] i8042: [238765] 00 <- i8042 (interrupt, 1, 12)
[ 956.633770] i8042: [238766] 8f <- i8042 (interrupt, 1, 12)
[ 956.634795] i8042: [238766] 00 <- i8042 (interrupt, 1, 12)
[ 956.635902] i8042: [238767] 00 <- i8042 (interrupt, 1, 12)
[ 956.636769] i8042: [238767] 08 <- i8042 (interrupt, 1, 12)
[ 956.637834] i8042: [238767] 00 <- i8042 (interrupt, 1, 12)
[ 956.638860] i8042: [238767] 00 <- i8042 (interrupt, 1, 12)
[ 956.644016] i8042: [238769] 8f <- i8042 (interrupt, 1, 12)
[ 956.645039] i8042: [238769] 00 <- i8042 (interrupt, 1, 12)
[ 956.646147] i8042: [238769] 00 <- i8042 (interrupt, 1, 12)
[ 956.647053] i8042: [238769] 08 <- i8042 (interrupt, 1, 12)
[ 956.648084] i8042: [238770] 00 <- i8042 (interrupt, 1, 12)
[ 956.649092] i8042: [238770] 00 <- i8042 (interrupt, 1, 12)
[ 956.654219] i8042: [238771] 8f <- i8042 (interrupt, 1, 12)
[ 956.655265] i8042: [238771] 00 <- i8042 (interrupt, 1, 12)
[ 956.656173] i8042: [238772] 00 <- i8042 (interrupt, 1, 12)
[ 956.657200] i8042: [238772] 08 <- i8042 (interrupt, 1, 12)
[ 956.658227] i8042: [238772] 00 <- i8042 (interrupt, 1, 12)
[ 956.659255] i8042: [238772] 00 <- i8042 (interrupt, 1, 12)
[ 956.664294] i8042: [238774] 8f <- i8042 (interrupt, 1, 12)
[ 956.665399] i8042: [238774] 00 <- i8042 (interrupt, 1, 12)
[ 956.666306] i8042: [238774] 00 <- i8042 (interrupt, 1, 12)
[ 956.667335] i8042: [238774] 08 <- i8042 (interrupt, 1, 12)
[ 956.668363] i8042: [238775] 00 <- i8042 (interrupt, 1, 12)
[ 956.669388] i8042: [238775] 00 <- i8042 (interrupt, 1, 12)
[ 956.674528] i8042: [238776] 8f <- i8042 (interrupt, 1, 12)
[ 956.675634] i8042: [238776] 00 <- i8042 (interrupt, 1, 12)
[ 956.676524] i8042: [238777] 00 <- i8042 (interrupt, 1, 12)
[ 956.677535] i8042: [238777] 08 <- i8042 (interrupt, 1, 12)
[ 956.678563] i8042: [238777] 00 <- i8042 (interrupt, 1, 12)
[ 956.679589] i8042: [238777] 00 <- i8042 (interrupt, 1, 12)
[ 956.684665] i8042: [238779] 8f <- i8042 (interrupt, 1, 12)
[ 956.685770] i8042: [238779] 00 <- i8042 (interrupt, 1, 12)
[ 956.686651] i8042: [238779] 00 <- i8042 (interrupt, 1, 12)
[ 956.687647] i8042: [238779] 08 <- i8042 (interrupt, 1, 12)
[ 956.688730] i8042: [238780] 00 <- i8042 (interrupt, 1, 12)
[ 956.689758] i8042: [238780] 00 <- i8042 (interrupt, 1, 12)
[ 956.694797] i8042: [238781] 8f <- i8042 (interrupt, 1, 12)
[ 956.695907] i8042: [238782] 00 <- i8042 (interrupt, 1, 12)
[ 956.696796] i8042: [238782] 00 <- i8042 (interrupt, 1, 12)
[ 956.697825] i8042: [238782] 08 <- i8042 (interrupt, 1, 12)
[ 956.698850] i8042: [238782] 00 <- i8042 (interrupt, 1, 12)
[ 956.699876] i8042: [238782] 00 <- i8042 (interrupt, 1, 12)
[ 956.705106] i8042: [238784] 8f <- i8042 (interrupt, 1, 12)
[ 956.706013] i8042: [238784] 00 <- i8042 (interrupt, 1, 12)
[ 956.707040] i8042: [238784] 00 <- i8042 (interrupt, 1, 12)
[ 956.708066] i8042: [238785] 08 <- i8042 (interrupt, 1, 12)
[ 956.709093] i8042: [238785] 00 <- i8042 (interrupt, 1, 12)
[ 956.710120] i8042: [238785] 00 <- i8042 (interrupt, 1, 12)
[ 956.715241] i8042: [238786] 8f <- i8042 (interrupt, 1, 12)
[ 956.716267] i8042: [238787] 00 <- i8042 (interrupt, 1, 12)
[ 956.717295] i8042: [238787] 00 <- i8042 (interrupt, 1, 12)
[ 956.718321] i8042: [238787] 08 <- i8042 (interrupt, 1, 12)
[ 956.719347] i8042: [238787] 00 <- i8042 (interrupt, 1, 12)
[ 956.720318] i8042: [238788] 00 <- i8042 (interrupt, 1, 12)
[ 956.725376] i8042: [238789] 8f <- i8042 (interrupt, 1, 12)
[ 956.726284] i8042: [238789] 00 <- i8042 (interrupt, 1, 12)
[ 956.727312] i8042: [238789] 00 <- i8042 (interrupt, 1, 12)
[ 956.728338] i8042: [238790] 08 <- i8042 (interrupt, 1, 12)
[ 956.729366] i8042: [238790] 00 <- i8042 (interrupt, 1, 12)
[ 956.731433] i8042: [238790] 00 <- i8042 (interrupt, 1, 12)
[ 956.735593] i8042: [238791] 8f <- i8042 (interrupt, 1, 12)
[ 956.736618] i8042: [238792] 00 <- i8042 (interrupt, 1, 12)
[ 956.737645] i8042: [238792] 00 <- i8042 (interrupt, 1, 12)
[ 956.738671] i8042: [238792] 08 <- i8042 (interrupt, 1, 12)
[ 956.739700] i8042: [238792] 00 <- i8042 (interrupt, 1, 12)
[ 956.740728] i8042: [238793] 00 <- i8042 (interrupt, 1, 12)
[ 956.745827] i8042: [238794] 8f <- i8042 (interrupt, 1, 12)
[ 956.746853] i8042: [238794] 00 <- i8042 (interrupt, 1, 12)
[ 956.747880] i8042: [238794] 00 <- i8042 (interrupt, 1, 12)
[ 956.748906] i8042: [238795] 08 <- i8042 (interrupt, 1, 12)
[ 956.749932] i8042: [238795] 00 <- i8042 (interrupt, 1, 12)
[ 956.750957] i8042: [238795] 00 <- i8042 (interrupt, 1, 12)
[ 956.755917] i8042: [238796] 8f <- i8042 (interrupt, 1, 12)
[ 956.756944] i8042: [238797] 00 <- i8042 (interrupt, 1, 12)
[ 956.757946] i8042: [238797] 00 <- i8042 (interrupt, 1, 12)
[ 956.758961] i8042: [238797] 08 <- i8042 (interrupt, 1, 12)
[ 956.759971] i8042: [238798] 00 <- i8042 (interrupt, 1, 12)
[ 956.761051] i8042: [238798] 00 <- i8042 (interrupt, 1, 12)
[ 956.766008] i8042: [238799] 8f <- i8042 (interrupt, 1, 12)
[ 956.767034] i8042: [238799] 00 <- i8042 (interrupt, 1, 12)
[ 956.768061] i8042: [238800] 00 <- i8042 (interrupt, 1, 12)
[ 956.769087] i8042: [238800] 08 <- i8042 (interrupt, 1, 12)
[ 956.770113] i8042: [238800] 00 <- i8042 (interrupt, 1, 12)
[ 956.771141] i8042: [238800] 00 <- i8042 (interrupt, 1, 12)
[ 956.776275] i8042: [238802] 8f <- i8042 (interrupt, 1, 12)
[ 956.777283] i8042: [238802] 00 <- i8042 (interrupt, 1, 12)
[ 956.778306] i8042: [238802] 00 <- i8042 (interrupt, 1, 12)
[ 956.779335] i8042: [238802] 08 <- i8042 (interrupt, 1, 12)
[ 956.780362] i8042: [238803] 00 <- i8042 (interrupt, 1, 12)
[ 956.781388] i8042: [238803] 00 <- i8042 (interrupt, 1, 12)
[ 956.786344] i8042: [238804] 8f <- i8042 (interrupt, 1, 12)
[ 956.787318] i8042: [238804] 00 <- i8042 (interrupt, 1, 12)
[ 956.788338] i8042: [238805] 00 <- i8042 (interrupt, 1, 12)
[ 956.789421] i8042: [238805] 08 <- i8042 (interrupt, 1, 12)
[ 956.790449] i8042: [238805] 00 <- i8042 (interrupt, 1, 12)
[ 956.791475] i8042: [238805] 00 <- i8042 (interrupt, 1, 12)
[ 957.132264] i8042: [238891] af <- i8042 (interrupt, 1, 12)
[ 957.133369] i8042: [238891] 53 <- i8042 (interrupt, 1, 12)
[ 957.134275] i8042: [238891] 31 <- i8042 (interrupt, 1, 12)
[ 957.135302] i8042: [238891] 08 <- i8042 (interrupt, 1, 12)
[ 957.136329] i8042: [238892] 60 <- i8042 (interrupt, 1, 12)
[ 957.137354] i8042: [238892] 00 <- i8042 (interrupt, 1, 12)
[ 957.142437] i8042: [238893] cf <- i8042 (interrupt, 1, 12)
[ 957.143545] i8042: [238893] 00 <- i8042 (interrupt, 1, 12)
[ 957.144455] i8042: [238894] 70 <- i8042 (interrupt, 1, 12)
[ 957.145479] i8042: [238894] 7f <- i8042 (interrupt, 1, 12)
[ 957.146505] i8042: [238894] 00 <- i8042 (interrupt, 1, 12)
[ 957.147533] i8042: [238894] ff <- i8042 (interrupt, 1, 12)
[ 957.147539] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.152643] i8042: [238896] af <- i8042 (interrupt, 1, 12)
[ 957.153553] i8042: [238896] 53 <- i8042 (interrupt, 1, 12)
[ 957.154567] i8042: [238896] 31 <- i8042 (interrupt, 1, 12)
[ 957.155604] i8042: [238896] 08 <- i8042 (interrupt, 1, 12)
[ 957.156631] i8042: [238897] 60 <- i8042 (interrupt, 1, 12)
[ 957.157656] i8042: [238897] 00 <- i8042 (interrupt, 1, 12)
[ 957.162760] i8042: [238898] cf <- i8042 (interrupt, 1, 12)
[ 957.163786] i8042: [238898] 00 <- i8042 (interrupt, 1, 12)
[ 957.164811] i8042: [238899] 70 <- i8042 (interrupt, 1, 12)
[ 957.165837] i8042: [238899] 7f <- i8042 (interrupt, 1, 12)
[ 957.166865] i8042: [238899] 00 <- i8042 (interrupt, 1, 12)
[ 957.167892] i8042: [238899] ff <- i8042 (interrupt, 1, 12)
[ 957.167898] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.173012] i8042: [238901] af <- i8042 (interrupt, 1, 12)
[ 957.174038] i8042: [238901] 53 <- i8042 (interrupt, 1, 12)
[ 957.175066] i8042: [238901] 31 <- i8042 (interrupt, 1, 12)
[ 957.176092] i8042: [238901] 08 <- i8042 (interrupt, 1, 12)
[ 957.177119] i8042: [238902] 60 <- i8042 (interrupt, 1, 12)
[ 957.178145] i8042: [238902] 00 <- i8042 (interrupt, 1, 12)
[ 957.183104] i8042: [238903] cf <- i8042 (interrupt, 1, 12)
[ 957.184130] i8042: [238903] 00 <- i8042 (interrupt, 1, 12)
[ 957.185157] i8042: [238904] 00 <- i8042 (interrupt, 1, 12)
[ 957.186183] i8042: [238904] 08 <- i8042 (interrupt, 1, 12)
[ 957.187209] i8042: [238904] 00 <- i8042 (interrupt, 1, 12)
[ 957.188241] i8042: [238905] 00 <- i8042 (interrupt, 1, 12)
[ 957.193295] i8042: [238906] af <- i8042 (interrupt, 1, 12)
[ 957.194270] i8042: [238906] 53 <- i8042 (interrupt, 1, 12)
[ 957.195290] i8042: [238906] 31 <- i8042 (interrupt, 1, 12)
[ 957.196346] i8042: [238907] 08 <- i8042 (interrupt, 1, 12)
[ 957.197401] i8042: [238907] 60 <- i8042 (interrupt, 1, 12)
[ 957.198428] i8042: [238907] 00 <- i8042 (interrupt, 1, 12)
[ 957.203402] i8042: [238908] cf <- i8042 (interrupt, 1, 12)
[ 957.204431] i8042: [238909] 00 <- i8042 (interrupt, 1, 12)
[ 957.205454] i8042: [238909] 78 <- i8042 (interrupt, 1, 12)
[ 957.206481] i8042: [238909] 7f <- i8042 (interrupt, 1, 12)
[ 957.207508] i8042: [238909] 06 <- i8042 (interrupt, 1, 12)
[ 957.208536] i8042: [238910] ff <- i8042 (interrupt, 1, 12)
[ 957.208542] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.213627] i8042: [238911] af <- i8042 (interrupt, 1, 12)
[ 957.214653] i8042: [238911] 53 <- i8042 (interrupt, 1, 12)
[ 957.215678] i8042: [238911] 31 <- i8042 (interrupt, 1, 12)
[ 957.216709] i8042: [238912] 08 <- i8042 (interrupt, 1, 12)
[ 957.217733] i8042: [238912] 60 <- i8042 (interrupt, 1, 12)
[ 957.218760] i8042: [238912] 00 <- i8042 (interrupt, 1, 12)
[ 957.223819] i8042: [238913] cf <- i8042 (interrupt, 1, 12)
[ 957.224843] i8042: [238914] 00 <- i8042 (interrupt, 1, 12)
[ 957.225869] i8042: [238914] 00 <- i8042 (interrupt, 1, 12)
[ 957.226896] i8042: [238914] 08 <- i8042 (interrupt, 1, 12)
[ 957.227922] i8042: [238914] 00 <- i8042 (interrupt, 1, 12)
[ 957.228948] i8042: [238915] 00 <- i8042 (interrupt, 1, 12)
[ 957.233923] i8042: [238916] af <- i8042 (interrupt, 1, 12)
[ 957.234949] i8042: [238916] 53 <- i8042 (interrupt, 1, 12)
[ 957.235977] i8042: [238916] 31 <- i8042 (interrupt, 1, 12)
[ 957.237004] i8042: [238917] 08 <- i8042 (interrupt, 1, 12)
[ 957.238029] i8042: [238917] 60 <- i8042 (interrupt, 1, 12)
[ 957.239058] i8042: [238917] 00 <- i8042 (interrupt, 1, 12)
[ 957.244150] i8042: [238918] cf <- i8042 (interrupt, 1, 12)
[ 957.245176] i8042: [238919] 40 <- i8042 (interrupt, 1, 12)
[ 957.246202] i8042: [238919] 78 <- i8042 (interrupt, 1, 12)
[ 957.247230] i8042: [238919] 7f <- i8042 (interrupt, 1, 12)
[ 957.248257] i8042: [238920] 16 <- i8042 (interrupt, 1, 12)
[ 957.249281] i8042: [238920] ff <- i8042 (interrupt, 1, 12)
[ 957.249287] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.254257] i8042: [238921] af <- i8042 (interrupt, 1, 12)
[ 957.255282] i8042: [238921] 53 <- i8042 (interrupt, 1, 12)
[ 957.256310] i8042: [238922] 31 <- i8042 (interrupt, 1, 12)
[ 957.257334] i8042: [238922] 08 <- i8042 (interrupt, 1, 12)
[ 957.258360] i8042: [238922] 60 <- i8042 (interrupt, 1, 12)
[ 957.259386] i8042: [238922] 00 <- i8042 (interrupt, 1, 12)
[ 957.264457] i8042: [238924] cf <- i8042 (interrupt, 1, 12)
[ 957.265482] i8042: [238924] 40 <- i8042 (interrupt, 1, 12)
[ 957.266566] i8042: [238924] 78 <- i8042 (interrupt, 1, 12)
[ 957.267539] i8042: [238924] 7f <- i8042 (interrupt, 1, 12)
[ 957.268560] i8042: [238925] 16 <- i8042 (interrupt, 1, 12)
[ 957.269644] i8042: [238925] ff <- i8042 (interrupt, 1, 12)
[ 957.269650] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.274619] i8042: [238926] af <- i8042 (interrupt, 1, 12)
[ 957.275646] i8042: [238926] 53 <- i8042 (interrupt, 1, 12)
[ 957.276673] i8042: [238927] 31 <- i8042 (interrupt, 1, 12)
[ 957.277699] i8042: [238927] 08 <- i8042 (interrupt, 1, 12)
[ 957.278725] i8042: [238927] 60 <- i8042 (interrupt, 1, 12)
[ 957.279750] i8042: [238927] 00 <- i8042 (interrupt, 1, 12)
[ 957.284844] i8042: [238929] ef <- i8042 (interrupt, 1, 12)
[ 957.285870] i8042: [238929] 7f <- i8042 (interrupt, 1, 12)
[ 957.286897] i8042: [238929] 7f <- i8042 (interrupt, 1, 12)
[ 957.287923] i8042: [238929] 7f <- i8042 (interrupt, 1, 12)
[ 957.288950] i8042: [238930] 7e <- i8042 (interrupt, 1, 12)
[ 957.289977] i8042: [238930] 67 <- i8042 (interrupt, 1, 12)
[ 957.295047] i8042: [238931] cf <- i8042 (interrupt, 1, 12)
[ 957.296073] i8042: [238931] 00 <- i8042 (interrupt, 1, 12)
[ 957.297106] i8042: [238932] 00 <- i8042 (interrupt, 1, 12)
[ 957.298054] i8042: [238932] 08 <- i8042 (interrupt, 1, 12)
[ 957.299081] i8042: [238932] 00 <- i8042 (interrupt, 1, 12)
[ 957.300165] i8042: [238932] 00 <- i8042 (interrupt, 1, 12)
[ 957.305121] i8042: [238934] 9f <- i8042 (interrupt, 1, 12)
[ 957.306147] i8042: [238934] 53 <- i8042 (interrupt, 1, 12)
[ 957.307175] i8042: [238934] 3a <- i8042 (interrupt, 1, 12)
[ 957.308202] i8042: [238934] 08 <- i8042 (interrupt, 1, 12)
[ 957.309194] i8042: [238935] 6a <- i8042 (interrupt, 1, 12)
[ 957.310253] i8042: [238935] 25 <- i8042 (interrupt, 1, 12)
[ 957.315329] i8042: [238936] cf <- i8042 (interrupt, 1, 12)
[ 957.316317] i8042: [238937] 7f <- i8042 (interrupt, 1, 12)
[ 957.317720] i8042: [238937] 7c <- i8042 (interrupt, 1, 12)
[ 957.318747] i8042: [238937] 7f <- i8042 (interrupt, 1, 12)
[ 957.319772] i8042: [238937] 1e <- i8042 (interrupt, 1, 12)
[ 957.320878] i8042: [238938] ff <- i8042 (interrupt, 1, 12)
[ 957.320884] psmouse serio1: alps: v3 discard packet[5] = ff
[ 957.325543] i8042: [238939] ef <- i8042 (interrupt, 1, 12)
[ 957.326569] i8042: [238939] 53 <- i8042 (interrupt, 1, 12)
[ 957.327593] i8042: [238939] 3b <- i8042 (interrupt, 1, 12)
[ 957.328567] i8042: [238940] 08 <- i8042 (interrupt, 1, 12)
[ 957.329588] i8042: [238940] 18 <- i8042 (interrupt, 1, 12)
[ 957.330753] i8042: [238940] 22 <- i8042 (interrupt, 1, 12)
[ 957.335676] i8042: [238941] af <- i8042 (interrupt, 1, 12)
[ 957.336687] i8042: [238942] 53 <- i8042 (interrupt, 1, 12)
[ 957.337693] i8042: [238942] 3b <- i8042 (interrupt, 1, 12)
[ 957.338722] i8042: [238942] 08 <- i8042 (interrupt, 1, 12)
[ 957.339747] i8042: [238942] 58 <- i8042 (interrupt, 1, 12)
[ 957.340853] i8042: [238943] 00 <- i8042 (interrupt, 1, 12)
[ 957.345891] i8042: [238944] cf <- i8042 (interrupt, 1, 12)
[ 957.346917] i8042: [238944] 7f <- i8042 (interrupt, 1, 12)
[ 957.347944] i8042: [238944] 7e <- i8042 (interrupt, 1, 12)
[ 957.348971] i8042: [238945] 7f <- i8042 (interrupt, 1, 12)
[ 957.350074] i8042: [238945] 7e <- i8042 (interrupt, 1, 12)
[ 957.350985] i8042: [238945] 60 <- i8042 (interrupt, 1, 12)
[ 957.356024] i8042: [238946] 8f <- i8042 (interrupt, 1, 12)
[ 957.357053] i8042: [238947] 53 <- i8042 (interrupt, 1, 12)
[ 957.358078] i8042: [238947] 3b <- i8042 (interrupt, 1, 12)
[ 957.359104] i8042: [238947] 08 <- i8042 (interrupt, 1, 12)
[ 957.360210] i8042: [238947] 6a <- i8042 (interrupt, 1, 12)
[ 957.361118] i8042: [238948] 00 <- i8042 (interrupt, 1, 12)
[ 957.366102] i8042: [238949] ef <- i8042 (interrupt, 1, 12)
[ 957.367126] i8042: [238949] 7f <- i8042 (interrupt, 1, 12)
[ 957.368183] i8042: [238949] 7f <- i8042 (interrupt, 1, 12)
[ 957.369237] i8042: [238950] 7f <- i8042 (interrupt, 1, 12)
[ 957.370342] i8042: [238950] 7e <- i8042 (interrupt, 1, 12)
[ 957.371251] i8042: [238950] 77 <- i8042 (interrupt, 1, 12)
[ 957.376410] i8042: [238952] 8f <- i8042 (interrupt, 1, 12)
[ 957.377416] i8042: [238952] 2c <- i8042 (interrupt, 1, 12)
[ 957.378445] i8042: [238952] 54 <- i8042 (interrupt, 1, 12)
[ 957.379469] i8042: [238952] 08 <- i8042 (interrupt, 1, 12)
[ 957.380577] i8042: [238953] 4b <- i8042 (interrupt, 1, 12)
[ 957.381483] i8042: [238953] 15 <- i8042 (interrupt, 1, 12)
[ 957.386567] i8042: [238954] cf <- i8042 (interrupt, 1, 12)
[ 957.387592] i8042: [238954] 7f <- i8042 (interrupt, 1, 12)
[ 957.388622] i8042: [238955] 7e <- i8042 (interrupt, 1, 12)
[ 957.389648] i8042: [238955] 7f <- i8042 (interrupt, 1, 12)
[ 957.390752] i8042: [238955] 7e <- i8042 (interrupt, 1, 12)
[ 957.391661] i8042: [238955] 65 <- i8042 (interrupt, 1, 12)
[ 957.396698] i8042: [238957] 9f <- i8042 (interrupt, 1, 12)
[ 957.397724] i8042: [238957] 53 <- i8042 (interrupt, 1, 12)
[ 957.398749] i8042: [238957] 54 <- i8042 (interrupt, 1, 12)
[ 957.399855] i8042: [238957] 08 <- i8042 (interrupt, 1, 12)
[ 957.400767] i8042: [238958] 7b <- i8042 (interrupt, 1, 12)
[ 957.401791] i8042: [238958] 16 <- i8042 (interrupt, 1, 12)
[ 957.406830] i8042: [238959] cf <- i8042 (interrupt, 1, 12)
[ 957.407833] i8042: [238959] 7f <- i8042 (interrupt, 1, 12)
[ 957.408881] i8042: [238960] 7e <- i8042 (interrupt, 1, 12)
[ 957.409988] i8042: [238960] 7f <- i8042 (interrupt, 1, 12)
[ 957.410898] i8042: [238960] 7e <- i8042 (interrupt, 1, 12)
[ 957.411925] i8042: [238960] 67 <- i8042 (interrupt, 1, 12)
[ 957.417995] i8042: [238962] bf <- i8042 (interrupt, 1, 12)
[ 957.419049] i8042: [238962] 53 <- i8042 (interrupt, 1, 12)
[ 957.420154] i8042: [238962] 54 <- i8042 (interrupt, 1, 12)
[ 957.421064] i8042: [238963] 08 <- i8042 (interrupt, 1, 12)
[ 957.422089] i8042: [238963] 6c <- i8042 (interrupt, 1, 12)
[ 957.423117] i8042: [238963] 17 <- i8042 (interrupt, 1, 12)
[ 957.427210] i8042: [238964] ef <- i8042 (interrupt, 1, 12)
[ 957.428236] i8042: [238964] 7f <- i8042 (interrupt, 1, 12)
[ 957.429264] i8042: [238965] 7f <- i8042 (interrupt, 1, 12)
[ 957.430371] i8042: [238965] 7f <- i8042 (interrupt, 1, 12)
[ 957.431279] i8042: [238965] 7e <- i8042 (interrupt, 1, 12)
[ 957.432306] i8042: [238965] 77 <- i8042 (interrupt, 1, 12)
[ 957.437441] i8042: [238967] bf <- i8042 (interrupt, 1, 12)
[ 957.438468] i8042: [238967] 53 <- i8042 (interrupt, 1, 12)
[ 957.439495] i8042: [238967] 54 <- i8042 (interrupt, 1, 12)
[ 957.440546] i8042: [238968] 08 <- i8042 (interrupt, 1, 12)
[ 957.441453] i8042: [238968] 6b <- i8042 (interrupt, 1, 12)
[ 957.442490] i8042: [238968] 18 <- i8042 (interrupt, 1, 12)
[ 957.447543] i8042: [238969] ef <- i8042 (interrupt, 1, 12)
[ 957.448570] i8042: [238970] 7f <- i8042 (interrupt, 1, 12)
[ 957.449676] i8042: [238970] 7f <- i8042 (interrupt, 1, 12)
[ 957.450583] i8042: [238970] 7f <- i8042 (interrupt, 1, 12)
[ 957.451611] i8042: [238970] 7e <- i8042 (interrupt, 1, 12)
[ 957.452638] i8042: [238971] 77 <- i8042 (interrupt, 1, 12)
[ 957.457709] i8042: [238972] bf <- i8042 (interrupt, 1, 12)
[ 957.458737] i8042: [238972] 53 <- i8042 (interrupt, 1, 12)
[ 957.459853] i8042: [238972] 54 <- i8042 (interrupt, 1, 12)
[ 957.460734] i8042: [238973] 08 <- i8042 (interrupt, 1, 12)
[ 957.461762] i8042: [238973] 6b <- i8042 (interrupt, 1, 12)
[ 957.462787] i8042: [238973] 18 <- i8042 (interrupt, 1, 12)
[ 957.467942] i8042: [238974] cf <- i8042 (interrupt, 1, 12)
[ 957.468972] i8042: [238975] 7f <- i8042 (interrupt, 1, 12)
[ 957.470081] i8042: [238975] 7e <- i8042 (interrupt, 1, 12)
[ 957.470987] i8042: [238975] 7f <- i8042 (interrupt, 1, 12)
[ 957.472014] i8042: [238975] 7e <- i8042 (interrupt, 1, 12)
[ 957.473042] i8042: [238976] 63 <- i8042 (interrupt, 1, 12)
[ 957.478057] i8042: [238977] bf <- i8042 (interrupt, 1, 12)
[ 957.479085] i8042: [238977] 6e <- i8042 (interrupt, 1, 12)
[ 957.480185] i8042: [238977] 54 <- i8042 (interrupt, 1, 12)
[ 957.481096] i8042: [238978] 08 <- i8042 (interrupt, 1, 12)
[ 957.482111] i8042: [238978] 7d <- i8042 (interrupt, 1, 12)
[ 957.483136] i8042: [238978] 1a <- i8042 (interrupt, 1, 12)
[ 957.488313] i8042: [238979] ef <- i8042 (interrupt, 1, 12)
[ 957.489339] i8042: [238980] 7f <- i8042 (interrupt, 1, 12)
[ 957.490447] i8042: [238980] 7f <- i8042 (interrupt, 1, 12)
[ 957.491355] i8042: [238980] 7f <- i8042 (interrupt, 1, 12)
[ 957.492382] i8042: [238981] 7e <- i8042 (interrupt, 1, 12)
[ 957.493406] i8042: [238981] 77 <- i8042 (interrupt, 1, 12)
[ 957.498446] i8042: [238982] 8f <- i8042 (interrupt, 1, 12)
[ 957.499553] i8042: [238982] 6f <- i8042 (interrupt, 1, 12)
[ 957.500464] i8042: [238983] 58 <- i8042 (interrupt, 1, 12)
[ 957.501490] i8042: [238983] 08 <- i8042 (interrupt, 1, 12)
[ 957.502517] i8042: [238983] 45 <- i8042 (interrupt, 1, 12)
[ 957.503542] i8042: [238983] 15 <- i8042 (interrupt, 1, 12)
[ 957.508623] i8042: [238985] ef <- i8042 (interrupt, 1, 12)
[ 957.509689] i8042: [238985] 7f <- i8042 (interrupt, 1, 12)
[ 957.510575] i8042: [238985] 7f <- i8042 (interrupt, 1, 12)
[ 957.511649] i8042: [238985] 7f <- i8042 (interrupt, 1, 12)
[ 957.513227] i8042: [238986] 7e <- i8042 (interrupt, 1, 12)
[ 957.514310] i8042: [238986] 73 <- i8042 (interrupt, 1, 12)
[ 957.518756] i8042: [238987] 9f <- i8042 (interrupt, 1, 12)
[ 957.519861] i8042: [238987] 53 <- i8042 (interrupt, 1, 12)
[ 957.520769] i8042: [238988] 54 <- i8042 (interrupt, 1, 12)
[ 957.521799] i8042: [238988] 08 <- i8042 (interrupt, 1, 12)
[ 957.522822] i8042: [238988] 7d <- i8042 (interrupt, 1, 12)
[ 957.523847] i8042: [238988] 19 <- i8042 (interrupt, 1, 12)
[ 957.529006] i8042: [238990] ef <- i8042 (interrupt, 1, 12)
[ 957.530108] i8042: [238990] 7f <- i8042 (interrupt, 1, 12)
[ 957.531017] i8042: [238990] 7f <- i8042 (interrupt, 1, 12)
[ 957.532043] i8042: [238990] 7f <- i8042 (interrupt, 1, 12)
[ 957.533068] i8042: [238991] 7e <- i8042 (interrupt, 1, 12)
[ 957.534100] i8042: [238991] 77 <- i8042 (interrupt, 1, 12)
[ 957.539120] i8042: [238992] 9f <- i8042 (interrupt, 1, 12)
[ 957.540223] i8042: [238992] 53 <- i8042 (interrupt, 1, 12)
[ 957.541132] i8042: [238993] 58 <- i8042 (interrupt, 1, 12)
[ 957.542157] i8042: [238993] 08 <- i8042 (interrupt, 1, 12)
[ 957.543160] i8042: [238993] 75 <- i8042 (interrupt, 1, 12)
[ 957.544211] i8042: [238993] 13 <- i8042 (interrupt, 1, 12)
[ 957.549395] i8042: [238995] ef <- i8042 (interrupt, 1, 12)
[ 957.550326] i8042: [238995] 7f <- i8042 (interrupt, 1, 12)
[ 957.551351] i8042: [238995] 7f <- i8042 (interrupt, 1, 12)
[ 957.552376] i8042: [238995] 7f <- i8042 (interrupt, 1, 12)
[ 957.553402] i8042: [238996] 7e <- i8042 (interrupt, 1, 12)
[ 957.554428] i8042: [238996] 73 <- i8042 (interrupt, 1, 12)
[ 957.559546] i8042: [238997] bf <- i8042 (interrupt, 1, 12)
[ 957.560574] i8042: [238998] 53 <- i8042 (interrupt, 1, 12)
[ 957.561599] i8042: [238998] 58 <- i8042 (interrupt, 1, 12)
[ 957.562624] i8042: [238998] 08 <- i8042 (interrupt, 1, 12)
[ 957.563651] i8042: [238998] 65 <- i8042 (interrupt, 1, 12)
[ 957.564679] i8042: [238999] 13 <- i8042 (interrupt, 1, 12)
[ 957.569777] i8042: [239000] ef <- i8042 (interrupt, 1, 12)
[ 957.570801] i8042: [239000] 7f <- i8042 (interrupt, 1, 12)
[ 957.571827] i8042: [239000] 7f <- i8042 (interrupt, 1, 12)
[ 957.572852] i8042: [239001] 7f <- i8042 (interrupt, 1, 12)
[ 957.573878] i8042: [239001] 7e <- i8042 (interrupt, 1, 12)
[ 957.574905] i8042: [239001] 77 <- i8042 (interrupt, 1, 12)
[ 957.579877] i8042: [239002] af <- i8042 (interrupt, 1, 12)
[ 957.580812] i8042: [239003] 6e <- i8042 (interrupt, 1, 12)
[ 957.581837] i8042: [239003] 3b <- i8042 (interrupt, 1, 12)
[ 957.582863] i8042: [239003] 08 <- i8042 (interrupt, 1, 12)
[ 957.583890] i8042: [239003] 6b <- i8042 (interrupt, 1, 12)
[ 957.584917] i8042: [239004] 33 <- i8042 (interrupt, 1, 12)
[ 957.590033] i8042: [239005] ef <- i8042 (interrupt, 1, 12)
[ 957.591059] i8042: [239005] 7f <- i8042 (interrupt, 1, 12)
[ 957.592085] i8042: [239005] 7f <- i8042 (interrupt, 1, 12)
[ 957.593091] i8042: [239006] 7f <- i8042 (interrupt, 1, 12)
[ 957.594136] i8042: [239006] 7e <- i8042 (interrupt, 1, 12)
[ 957.595162] i8042: [239006] 77 <- i8042 (interrupt, 1, 12)
[ 957.600122] i8042: [239007] 9f <- i8042 (interrupt, 1, 12)
[ 957.601147] i8042: [239008] 53 <- i8042 (interrupt, 1, 12)
[ 957.602173] i8042: [239008] 38 <- i8042 (interrupt, 1, 12)
[ 957.603198] i8042: [239008] 08 <- i8042 (interrupt, 1, 12)
[ 957.604171] i8042: [239008] 76 <- i8042 (interrupt, 1, 12)
[ 957.605193] i8042: [239009] 3e <- i8042 (interrupt, 1, 12)
[ 957.610825] i8042: [239010] ef <- i8042 (interrupt, 1, 12)
[ 957.611849] i8042: [239010] 7f <- i8042 (interrupt, 1, 12)
[ 957.612900] i8042: [239011] 7f <- i8042 (interrupt, 1, 12)
[ 957.613925] i8042: [239011] 7f <- i8042 (interrupt, 1, 12)
[ 957.614951] i8042: [239011] 7e <- i8042 (interrupt, 1, 12)
[ 957.615977] i8042: [239011] 77 <- i8042 (interrupt, 1, 12)
[ 957.620481] i8042: [239013] 9f <- i8042 (interrupt, 1, 12)
[ 957.621506] i8042: [239013] 6e <- i8042 (interrupt, 1, 12)
[ 957.622531] i8042: [239013] 38 <- i8042 (interrupt, 1, 12)
[ 957.623590] i8042: [239013] 08 <- i8042 (interrupt, 1, 12)
[ 957.624619] i8042: [239014] 7d <- i8042 (interrupt, 1, 12)
[ 957.625642] i8042: [239014] 3e <- i8042 (interrupt, 1, 12)
[ 957.630906] i8042: [239015] ef <- i8042 (interrupt, 1, 12)
[ 957.631816] i8042: [239015] 7f <- i8042 (interrupt, 1, 12)
[ 957.632842] i8042: [239016] 7f <- i8042 (interrupt, 1, 12)
[ 957.633869] i8042: [239016] 7f <- i8042 (interrupt, 1, 12)
[ 957.634894] i8042: [239016] 7e <- i8042 (interrupt, 1, 12)
[ 957.635938] i8042: [239016] 71 <- i8042 (interrupt, 1, 12)
[ 957.640907] i8042: [239018] af <- i8042 (interrupt, 1, 12)
[ 957.641815] i8042: [239018] 53 <- i8042 (interrupt, 1, 12)
[ 957.642840] i8042: [239018] 54 <- i8042 (interrupt, 1, 12)
[ 957.643868] i8042: [239018] 08 <- i8042 (interrupt, 1, 12)
[ 957.644895] i8042: [239019] 7e <- i8042 (interrupt, 1, 12)
[ 957.645865] i8042: [239019] 1b <- i8042 (interrupt, 1, 12)
[ 957.650998] i8042: [239020] ef <- i8042 (interrupt, 1, 12)
[ 957.652024] i8042: [239020] 7f <- i8042 (interrupt, 1, 12)
[ 957.653052] i8042: [239021] 7f <- i8042 (interrupt, 1, 12)
[ 957.654038] i8042: [239021] 7f <- i8042 (interrupt, 1, 12)
[ 957.655104] i8042: [239021] 7e <- i8042 (interrupt, 1, 12)
[ 957.656131] i8042: [239021] 77 <- i8042 (interrupt, 1, 12)
[ 957.661207] i8042: [239023] bf <- i8042 (interrupt, 1, 12)
[ 957.662236] i8042: [239023] 53 <- i8042 (interrupt, 1, 12)
[ 957.663262] i8042: [239023] 38 <- i8042 (interrupt, 1, 12)
[ 957.664289] i8042: [239023] 08 <- i8042 (interrupt, 1, 12)
[ 957.665318] i8042: [239024] 7d <- i8042 (interrupt, 1, 12)
[ 957.666342] i8042: [239024] 3e <- i8042 (interrupt, 1, 12)
[ 957.671421] i8042: [239025] ef <- i8042 (interrupt, 1, 12)
[ 957.672446] i8042: [239025] 7f <- i8042 (interrupt, 1, 12)
[ 957.673473] i8042: [239026] 7f <- i8042 (interrupt, 1, 12)
[ 957.674499] i8042: [239026] 7f <- i8042 (interrupt, 1, 12)
[ 957.675524] i8042: [239026] 7e <- i8042 (interrupt, 1, 12)
[ 957.676499] i8042: [239027] 77 <- i8042 (interrupt, 1, 12)
[ 957.681607] i8042: [239028] af <- i8042 (interrupt, 1, 12)
[ 957.682633] i8042: [239028] 53 <- i8042 (interrupt, 1, 12)
[ 957.683659] i8042: [239028] 38 <- i8042 (interrupt, 1, 12)
[ 957.684688] i8042: [239029] 08 <- i8042 (interrupt, 1, 12)
[ 957.685718] i8042: [239029] 7b <- i8042 (interrupt, 1, 12)
[ 957.686725] i8042: [239029] 3e <- i8042 (interrupt, 1, 12)
[ 957.691776] i8042: [239030] ef <- i8042 (interrupt, 1, 12)
[ 957.692823] i8042: [239031] 7f <- i8042 (interrupt, 1, 12)
[ 957.693849] i8042: [239031] 7f <- i8042 (interrupt, 1, 12)
[ 957.694876] i8042: [239031] 7f <- i8042 (interrupt, 1, 12)
[ 957.695905] i8042: [239031] 7e <- i8042 (interrupt, 1, 12)
[ 957.696930] i8042: [239032] 73 <- i8042 (interrupt, 1, 12)
[ 957.701905] i8042: [239033] 8f <- i8042 (interrupt, 1, 12)
[ 957.702941] i8042: [239033] 6e <- i8042 (interrupt, 1, 12)
[ 957.703943] i8042: [239033] 38 <- i8042 (interrupt, 1, 12)
[ 957.704972] i8042: [239034] 08 <- i8042 (interrupt, 1, 12)
[ 957.705996] i8042: [239034] 7c <- i8042 (interrupt, 1, 12)
[ 957.707023] i8042: [239034] 3e <- i8042 (interrupt, 1, 12)
[ 957.712090] i8042: [239035] ef <- i8042 (interrupt, 1, 12)
[ 957.713115] i8042: [239036] 7f <- i8042 (interrupt, 1, 12)
[ 957.714144] i8042: [239036] 7f <- i8042 (interrupt, 1, 12)
[ 957.715171] i8042: [239036] 7f <- i8042 (interrupt, 1, 12)
[ 957.716197] i8042: [239036] 7e <- i8042 (interrupt, 1, 12)
[ 957.717227] i8042: [239037] 76 <- i8042 (interrupt, 1, 12)
[ 957.722299] i8042: [239038] af <- i8042 (interrupt, 1, 12)
[ 957.723302] i8042: [239038] 6e <- i8042 (interrupt, 1, 12)
[ 957.724314] i8042: [239038] 54 <- i8042 (interrupt, 1, 12)
[ 957.725378] i8042: [239039] 08 <- i8042 (interrupt, 1, 12)
[ 957.726398] i8042: [239039] 7e <- i8042 (interrupt, 1, 12)
[ 957.727431] i8042: [239039] 1e <- i8042 (interrupt, 1, 12)
[ 957.732406] i8042: [239040] ef <- i8042 (interrupt, 1, 12)
[ 957.733433] i8042: [239041] 7f <- i8042 (interrupt, 1, 12)
[ 957.734460] i8042: [239041] 7f <- i8042 (interrupt, 1, 12)
[ 957.735486] i8042: [239041] 7f <- i8042 (interrupt, 1, 12)
[ 957.736515] i8042: [239042] 7e <- i8042 (interrupt, 1, 12)
[ 957.737540] i8042: [239042] 77 <- i8042 (interrupt, 1, 12)
[ 957.742636] i8042: [239043] 9f <- i8042 (interrupt, 1, 12)
[ 957.743659] i8042: [239043] 6e <- i8042 (interrupt, 1, 12)
[ 957.744686] i8042: [239044] 54 <- i8042 (interrupt, 1, 12)
[ 957.745713] i8042: [239044] 08 <- i8042 (interrupt, 1, 12)
[ 957.746740] i8042: [239044] 7f <- i8042 (interrupt, 1, 12)
[ 957.747768] i8042: [239044] 1e <- i8042 (interrupt, 1, 12)
[ 957.752767] i8042: [239046] ef <- i8042 (interrupt, 1, 12)
[ 957.753792] i8042: [239046] 7f <- i8042 (interrupt, 1, 12)
[ 957.754762] i8042: [239046] 7f <- i8042 (interrupt, 1, 12)
[ 957.755786] i8042: [239046] 7f <- i8042 (interrupt, 1, 12)
[ 957.756871] i8042: [239047] 7e <- i8042 (interrupt, 1, 12)
[ 957.757896] i8042: [239047] 77 <- i8042 (interrupt, 1, 12)
[ 957.762986] i8042: [239048] bf <- i8042 (interrupt, 1, 12)
[ 957.764014] i8042: [239048] 6e <- i8042 (interrupt, 1, 12)
[ 957.765043] i8042: [239049] 58 <- i8042 (interrupt, 1, 12)
[ 957.766067] i8042: [239049] 08 <- i8042 (interrupt, 1, 12)
[ 957.767094] i8042: [239049] 76 <- i8042 (interrupt, 1, 12)
[ 957.768159] i8042: [239049] 17 <- i8042 (interrupt, 1, 12)
[ 957.773122] i8042: [239051] ef <- i8042 (interrupt, 1, 12)
[ 957.774146] i8042: [239051] 7f <- i8042 (interrupt, 1, 12)
[ 957.775172] i8042: [239051] 7f <- i8042 (interrupt, 1, 12)
[ 957.776198] i8042: [239051] 7f <- i8042 (interrupt, 1, 12)
[ 957.777225] i8042: [239052] 7e <- i8042 (interrupt, 1, 12)
[ 957.778330] i8042: [239052] 76 <- i8042 (interrupt, 1, 12)
[ 957.783369] i8042: [239053] bf <- i8042 (interrupt, 1, 12)
[ 957.784395] i8042: [239053] 6e <- i8042 (interrupt, 1, 12)
[ 957.785382] i8042: [239054] 54 <- i8042 (interrupt, 1, 12)
[ 957.786446] i8042: [239054] 08 <- i8042 (interrupt, 1, 12)
[ 957.787473] i8042: [239054] 7e <- i8042 (interrupt, 1, 12)
[ 957.788524] i8042: [239054] 1e <- i8042 (interrupt, 1, 12)
[ 957.793264] i8042: [239056] ef <- i8042 (interrupt, 1, 12)
[ 957.794291] i8042: [239056] 7f <- i8042 (interrupt, 1, 12)
[ 957.795317] i8042: [239056] 7f <- i8042 (interrupt, 1, 12)
[ 957.796343] i8042: [239056] 7f <- i8042 (interrupt, 1, 12)
[ 957.797371] i8042: [239057] 7e <- i8042 (interrupt, 1, 12)
[ 957.798474] i8042: [239057] 73 <- i8042 (interrupt, 1, 12)
[ 957.803514] i8042: [239058] bf <- i8042 (interrupt, 1, 12)
[ 957.804542] i8042: [239058] 6e <- i8042 (interrupt, 1, 12)
[ 957.806360] i8042: [239059] 38 <- i8042 (interrupt, 1, 12)
[ 957.807388] i8042: [239059] 08 <- i8042 (interrupt, 1, 12)
[ 957.808494] i8042: [239059] 7a <- i8042 (interrupt, 1, 12)
[ 957.809402] i8042: [239060] 3e <- i8042 (interrupt, 1, 12)
[ 957.813733] i8042: [239061] ef <- i8042 (interrupt, 1, 12)
[ 957.814761] i8042: [239061] 7f <- i8042 (interrupt, 1, 12)
[ 957.815787] i8042: [239061] 7f <- i8042 (interrupt, 1, 12)
[ 957.816815] i8042: [239062] 7f <- i8042 (interrupt, 1, 12)
[ 957.817840] i8042: [239062] 7e <- i8042 (interrupt, 1, 12)
[ 957.818947] i8042: [239062] 73 <- i8042 (interrupt, 1, 12)
[ 957.824222] i8042: [239063] 8f <- i8042 (interrupt, 1, 12)
[ 957.825249] i8042: [239064] 00 <- i8042 (interrupt, 1, 12)
[ 957.826274] i8042: [239064] 00 <- i8042 (interrupt, 1, 12)
[ 957.827301] i8042: [239064] 08 <- i8042 (interrupt, 1, 12)
[ 957.828326] i8042: [239064] 00 <- i8042 (interrupt, 1, 12)
[ 957.829446] i8042: [239065] 00 <- i8042 (interrupt, 1, 12)
[ 957.834219] i8042: [239066] 8f <- i8042 (interrupt, 1, 12)
[ 957.835242] i8042: [239066] 00 <- i8042 (interrupt, 1, 12)
[ 957.836270] i8042: [239066] 00 <- i8042 (interrupt, 1, 12)
[ 957.837297] i8042: [239067] 08 <- i8042 (interrupt, 1, 12)
[ 957.838323] i8042: [239067] 00 <- i8042 (interrupt, 1, 12)
[ 957.839427] i8042: [239067] 00 <- i8042 (interrupt, 1, 12)
[ 957.844347] i8042: [239068] 8f <- i8042 (interrupt, 1, 12)
[ 957.845374] i8042: [239069] 00 <- i8042 (interrupt, 1, 12)
[ 957.846400] i8042: [239069] 00 <- i8042 (interrupt, 1, 12)
[ 957.847427] i8042: [239069] 08 <- i8042 (interrupt, 1, 12)
[ 957.848453] i8042: [239069] 00 <- i8042 (interrupt, 1, 12)
[ 957.849558] i8042: [239070] 00 <- i8042 (interrupt, 1, 12)
[ 957.854481] i8042: [239071] 8f <- i8042 (interrupt, 1, 12)
[ 957.855504] i8042: [239071] 00 <- i8042 (interrupt, 1, 12)
[ 957.856533] i8042: [239071] 00 <- i8042 (interrupt, 1, 12)
[ 957.857560] i8042: [239072] 08 <- i8042 (interrupt, 1, 12)
[ 957.858586] i8042: [239072] 00 <- i8042 (interrupt, 1, 12)
[ 957.859705] i8042: [239072] 00 <- i8042 (interrupt, 1, 12)
[ 957.864713] i8042: [239074] 8f <- i8042 (interrupt, 1, 12)
[ 957.865737] i8042: [239074] 00 <- i8042 (interrupt, 1, 12)
[ 957.866763] i8042: [239074] 00 <- i8042 (interrupt, 1, 12)
[ 957.867790] i8042: [239074] 08 <- i8042 (interrupt, 1, 12)
[ 957.868895] i8042: [239075] 00 <- i8042 (interrupt, 1, 12)
[ 957.869804] i8042: [239075] 00 <- i8042 (interrupt, 1, 12)
[ 957.874886] i8042: [239076] 8f <- i8042 (interrupt, 1, 12)
[ 957.875911] i8042: [239076] 00 <- i8042 (interrupt, 1, 12)
[ 957.876939] i8042: [239077] 00 <- i8042 (interrupt, 1, 12)
[ 957.877964] i8042: [239077] 08 <- i8042 (interrupt, 1, 12)
[ 957.879071] i8042: [239077] 00 <- i8042 (interrupt, 1, 12)
[ 957.879979] i8042: [239077] 00 <- i8042 (interrupt, 1, 12)
[ 957.884960] i8042: [239079] 8f <- i8042 (interrupt, 1, 12)
[ 957.885982] i8042: [239079] 00 <- i8042 (interrupt, 1, 12)
[ 957.887037] i8042: [239079] 00 <- i8042 (interrupt, 1, 12)
[ 957.888094] i8042: [239079] 08 <- i8042 (interrupt, 1, 12)
[ 957.889202] i8042: [239080] 00 <- i8042 (interrupt, 1, 12)
[ 957.890109] i8042: [239080] 00 <- i8042 (interrupt, 1, 12)
[ 957.895269] i8042: [239081] 8f <- i8042 (interrupt, 1, 12)
[ 957.896293] i8042: [239081] 00 <- i8042 (interrupt, 1, 12)
[ 957.897325] i8042: [239082] 00 <- i8042 (interrupt, 1, 12)
[ 957.898333] i8042: [239082] 08 <- i8042 (interrupt, 1, 12)
[ 957.899438] i8042: [239082] 00 <- i8042 (interrupt, 1, 12)
[ 957.900347] i8042: [239082] 00 <- i8042 (interrupt, 1, 12)
[ 957.905363] i8042: [239084] 8f <- i8042 (interrupt, 1, 12)
[ 957.906393] i8042: [239084] 00 <- i8042 (interrupt, 1, 12)
[ 957.907419] i8042: [239084] 00 <- i8042 (interrupt, 1, 12)
[ 957.908443] i8042: [239084] 08 <- i8042 (interrupt, 1, 12)
[ 957.909554] i8042: [239085] 00 <- i8042 (interrupt, 1, 12)
[ 957.910461] i8042: [239085] 00 <- i8042 (interrupt, 1, 12)
[ 957.915619] i8042: [239086] 8f <- i8042 (interrupt, 1, 12)
[ 957.916646] i8042: [239087] 00 <- i8042 (interrupt, 1, 12)
[ 957.917671] i8042: [239087] 00 <- i8042 (interrupt, 1, 12)
[ 957.918726] i8042: [239087] 08 <- i8042 (interrupt, 1, 12)
[ 957.919644] i8042: [239087] 00 <- i8042 (interrupt, 1, 12)
[ 957.920715] i8042: [239088] 00 <- i8042 (interrupt, 1, 12)
[ 957.925754] i8042: [239089] 8f <- i8042 (interrupt, 1, 12)
[ 957.926778] i8042: [239089] 00 <- i8042 (interrupt, 1, 12)
[ 957.927804] i8042: [239089] 00 <- i8042 (interrupt, 1, 12)
[ 957.928914] i8042: [239090] 08 <- i8042 (interrupt, 1, 12)
[ 957.929798] i8042: [239090] 00 <- i8042 (interrupt, 1, 12)
[ 957.930820] i8042: [239090] 00 <- i8042 (interrupt, 1, 12)
[ 957.935887] i8042: [239091] 8f <- i8042 (interrupt, 1, 12)
[ 957.936914] i8042: [239092] 00 <- i8042 (interrupt, 1, 12)
[ 957.937941] i8042: [239092] 00 <- i8042 (interrupt, 1, 12)
[ 957.939048] i8042: [239092] 08 <- i8042 (interrupt, 1, 12)
[ 957.939959] i8042: [239092] 00 <- i8042 (interrupt, 1, 12)
[ 957.940986] i8042: [239093] 00 <- i8042 (interrupt, 1, 12)
[ 957.946124] i8042: [239094] 8f <- i8042 (interrupt, 1, 12)
[ 957.947152] i8042: [239094] 00 <- i8042 (interrupt, 1, 12)
[ 957.948179] i8042: [239094] 00 <- i8042 (interrupt, 1, 12)
[ 957.949233] i8042: [239095] 08 <- i8042 (interrupt, 1, 12)
[ 957.950152] i8042: [239095] 00 <- i8042 (interrupt, 1, 12)
[ 957.951196] i8042: [239095] 00 <- i8042 (interrupt, 1, 12)
[ 957.956262] i8042: [239096] 8f <- i8042 (interrupt, 1, 12)
[ 957.957290] i8042: [239097] 00 <- i8042 (interrupt, 1, 12)
[ 957.958316] i8042: [239097] 00 <- i8042 (interrupt, 1, 12)
[ 957.959422] i8042: [239097] 08 <- i8042 (interrupt, 1, 12)
[ 957.960308] i8042: [239097] 00 <- i8042 (interrupt, 1, 12)
[ 957.961360] i8042: [239098] 00 <- i8042 (interrupt, 1, 12)
[ 957.966401] i8042: [239099] 8f <- i8042 (interrupt, 1, 12)
[ 957.967427] i8042: [239099] 00 <- i8042 (interrupt, 1, 12)
[ 957.968535] i8042: [239099] 00 <- i8042 (interrupt, 1, 12)
[ 957.969443] i8042: [239100] 08 <- i8042 (interrupt, 1, 12)
[ 957.970470] i8042: [239100] 00 <- i8042 (interrupt, 1, 12)
[ 957.971496] i8042: [239100] 00 <- i8042 (interrupt, 1, 12)
[ 957.976654] i8042: [239102] 8f <- i8042 (interrupt, 1, 12)
[ 957.977683] i8042: [239102] 00 <- i8042 (interrupt, 1, 12)
[ 957.978789] i8042: [239102] 00 <- i8042 (interrupt, 1, 12)
[ 957.979697] i8042: [239102] 08 <- i8042 (interrupt, 1, 12)
[ 957.980725] i8042: [239103] 00 <- i8042 (interrupt, 1, 12)
[ 957.981750] i8042: [239103] 00 <- i8042 (interrupt, 1, 12)
[ 957.986789] i8042: [239104] 8f <- i8042 (interrupt, 1, 12)
[ 957.987816] i8042: [239104] 00 <- i8042 (interrupt, 1, 12)
[ 957.988925] i8042: [239105] 00 <- i8042 (interrupt, 1, 12)
[ 957.989833] i8042: [239105] 08 <- i8042 (interrupt, 1, 12)
[ 957.990858] i8042: [239105] 00 <- i8042 (interrupt, 1, 12)
[ 957.991886] i8042: [239105] 00 <- i8042 (interrupt, 1, 12)
[ 957.996965] i8042: [239107] 8f <- i8042 (interrupt, 1, 12)
[ 957.997995] i8042: [239107] 00 <- i8042 (interrupt, 1, 12)
[ 957.999082] i8042: [239107] 00 <- i8042 (interrupt, 1, 12)
[ 957.999989] i8042: [239107] 08 <- i8042 (interrupt, 1, 12)
[ 958.001691] i8042: [239108] 00 <- i8042 (interrupt, 1, 12)
[ 958.002717] i8042: [239108] 00 <- i8042 (interrupt, 1, 12)
[ 958.007166] i8042: [239109] 8f <- i8042 (interrupt, 1, 12)
[ 958.008193] i8042: [239109] 00 <- i8042 (interrupt, 1, 12)
[ 958.009297] i8042: [239110] 00 <- i8042 (interrupt, 1, 12)
[ 958.010207] i8042: [239110] 08 <- i8042 (interrupt, 1, 12)
[ 958.011234] i8042: [239110] 00 <- i8042 (interrupt, 1, 12)
[ 958.012262] i8042: [239110] 00 <- i8042 (interrupt, 1, 12)
[ 958.017302] i8042: [239112] 8f <- i8042 (interrupt, 1, 12)
[ 958.018353] i8042: [239112] 00 <- i8042 (interrupt, 1, 12)
[ 958.019272] i8042: [239112] 00 <- i8042 (interrupt, 1, 12)
[ 958.020341] i8042: [239112] 08 <- i8042 (interrupt, 1, 12)
[ 958.021370] i8042: [239113] 00 <- i8042 (interrupt, 1, 12)
[ 958.022394] i8042: [239113] 00 <- i8042 (interrupt, 1, 12)
[ 958.027534] i8042: [239114] 8f <- i8042 (interrupt, 1, 12)
[ 958.028637] i8042: [239114] 00 <- i8042 (interrupt, 1, 12)
[ 958.029547] i8042: [239115] 00 <- i8042 (interrupt, 1, 12)
[ 958.030573] i8042: [239115] 08 <- i8042 (interrupt, 1, 12)
[ 958.031601] i8042: [239115] 00 <- i8042 (interrupt, 1, 12)
[ 958.032629] i8042: [239115] 00 <- i8042 (interrupt, 1, 12)
[ 958.037670] i8042: [239117] 8f <- i8042 (interrupt, 1, 12)
[ 958.038777] i8042: [239117] 00 <- i8042 (interrupt, 1, 12)
[ 958.039684] i8042: [239117] 00 <- i8042 (interrupt, 1, 12)
[ 958.040713] i8042: [239118] 08 <- i8042 (interrupt, 1, 12)
[ 958.041739] i8042: [239118] 00 <- i8042 (interrupt, 1, 12)
[ 958.042767] i8042: [239118] 00 <- i8042 (interrupt, 1, 12)
[ 958.047808] i8042: [239119] 8f <- i8042 (interrupt, 1, 12)
[ 958.048894] i8042: [239120] 00 <- i8042 (interrupt, 1, 12)
[ 958.049805] i8042: [239120] 00 <- i8042 (interrupt, 1, 12)
[ 958.050830] i8042: [239120] 08 <- i8042 (interrupt, 1, 12)
[ 958.051857] i8042: [239120] 00 <- i8042 (interrupt, 1, 12)
[ 958.052884] i8042: [239121] 00 <- i8042 (interrupt, 1, 12)
[ 958.058040] i8042: [239122] 8f <- i8042 (interrupt, 1, 12)
[ 958.059146] i8042: [239122] 00 <- i8042 (interrupt, 1, 12)
[ 958.060056] i8042: [239122] 00 <- i8042 (interrupt, 1, 12)
[ 958.061084] i8042: [239123] 08 <- i8042 (interrupt, 1, 12)
[ 958.062109] i8042: [239123] 00 <- i8042 (interrupt, 1, 12)
[ 958.063135] i8042: [239123] 00 <- i8042 (interrupt, 1, 12)
[ 958.068255] i8042: [239124] 8f <- i8042 (interrupt, 1, 12)
[ 958.069282] i8042: [239125] 00 <- i8042 (interrupt, 1, 12)
[ 958.070306] i8042: [239125] 00 <- i8042 (interrupt, 1, 12)
[ 958.071331] i8042: [239125] 08 <- i8042 (interrupt, 1, 12)
[ 958.072357] i8042: [239125] 00 <- i8042 (interrupt, 1, 12)
[ 958.073384] i8042: [239126] 00 <- i8042 (interrupt, 1, 12)
[ 958.078383] i8042: [239127] 8f <- i8042 (interrupt, 1, 12)
[ 958.079292] i8042: [239127] 00 <- i8042 (interrupt, 1, 12)
[ 958.080317] i8042: [239127] 00 <- i8042 (interrupt, 1, 12)
[ 958.081346] i8042: [239128] 08 <- i8042 (interrupt, 1, 12)
[ 958.082372] i8042: [239128] 00 <- i8042 (interrupt, 1, 12)
[ 958.083397] i8042: [239128] 00 <- i8042 (interrupt, 1, 12)
[ 958.088516] i8042: [239129] 8f <- i8042 (interrupt, 1, 12)
[ 958.089543] i8042: [239130] 00 <- i8042 (interrupt, 1, 12)
[ 958.090568] i8042: [239130] 00 <- i8042 (interrupt, 1, 12)
[ 958.091593] i8042: [239130] 08 <- i8042 (interrupt, 1, 12)
[ 958.092620] i8042: [239130] 00 <- i8042 (interrupt, 1, 12)
[ 958.093604] i8042: [239131] 00 <- i8042 (interrupt, 1, 12)
[ 958.099519] i8042: [239132] 8f <- i8042 (interrupt, 1, 12)
[ 958.100544] i8042: [239132] 00 <- i8042 (interrupt, 1, 12)
[ 958.101570] i8042: [239133] 00 <- i8042 (interrupt, 1, 12)
[ 958.102599] i8042: [239133] 08 <- i8042 (interrupt, 1, 12)
[ 958.103624] i8042: [239133] 00 <- i8042 (interrupt, 1, 12)
[ 958.104651] i8042: [239133] 00 <- i8042 (interrupt, 1, 12)
[ 958.108919] i8042: [239135] 8f <- i8042 (interrupt, 1, 12)
[ 958.109944] i8042: [239135] 00 <- i8042 (interrupt, 1, 12)
[ 958.110972] i8042: [239135] 00 <- i8042 (interrupt, 1, 12)
[ 958.111997] i8042: [239135] 08 <- i8042 (interrupt, 1, 12)
[ 958.113026] i8042: [239136] 00 <- i8042 (interrupt, 1, 12)
[ 958.114050] i8042: [239136] 00 <- i8042 (interrupt, 1, 12)
[ 958.119019] i8042: [239137] 8f <- i8042 (interrupt, 1, 12)
[ 958.120056] i8042: [239137] 00 <- i8042 (interrupt, 1, 12)
[ 958.121127] i8042: [239138] 00 <- i8042 (interrupt, 1, 12)
[ 958.122153] i8042: [239138] 08 <- i8042 (interrupt, 1, 12)
[ 958.123180] i8042: [239138] 00 <- i8042 (interrupt, 1, 12)
[ 958.124207] i8042: [239138] 00 <- i8042 (interrupt, 1, 12)
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply
* Re: [PATCH v3 4/4] input: alps: Fix trackstick detection
From: Pali Rohár @ 2014-11-09 11:30 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, Yunkang Tang, Tommy Will, linux-input,
linux-kernel
In-Reply-To: <20141109080504.GB34700@dtor-ws>
[-- Attachment #1: Type: Text/Plain, Size: 2182 bytes --]
On Sunday 09 November 2014 09:05:04 Dmitry Torokhov wrote:
> Hi Pali,
>
> On Sun, Nov 02, 2014 at 12:25:10AM +0100, Pali Rohár wrote:
> > int alps_detect(struct psmouse *psmouse, bool
> > set_properties) {
> >
> > - struct alps_data dummy;
> > + unsigned char e6[4];
> >
> > - if (alps_identify(psmouse, &dummy) < 0)
> > - return -1;
> > + /*
> > + * Try "E6 report".
> > + * ALPS should return 0,0,10 or 0,0,100 if no buttons are
> > pressed. + * The bits 0-2 of the first byte will be 1s if
> > some buttons are + * pressed.
> > + */
> > + if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
> > + PSMOUSE_CMD_SETSCALE11, e6))
> > + return -EIO;
> > +
> > + if ((e6[0] & 0xf8) != 0 || e6[1] != 0 || (e6[2] != 10 &&
> > e6[2] != 100)) + return -EINVAL;
> >
> > if (set_properties) {
> >
> > + /*
> > + * NOTE: To detect model and trackstick presence we
need
> > to do + * full device reset. To speed up
detection
> > and prevent + * calling duplicate initialization
> > sequence (both in + * alps_detect() and
> > alps_init()) we set model/protocol + * version and
> > correct name in alps_init() (which will + * do
full
> > device reset). For now set name to DualPoint. + */
> >
> > psmouse->vendor = "ALPS";
> >
> > - psmouse->name = dummy.flags & ALPS_DUALPOINT ?
> > - "DualPoint TouchPad" : "GlidePoint";
> > - psmouse->model = dummy.proto_version << 8;
> > + psmouse->name = "DualPoint TouchPad";
> >
> > }
> >
> > +
> >
> > return 0;
>
> We can't do this; going by e6 only will give us false
> positives and alps_detect is supposed to be authoritative.
>
> Thanks.
psmouse-base.c is calling alps_detect() and alps_init()
consecutively so it does not matter if code is in _detect or
_init function. Just need to make sure that correct order will be
used. So this patch could not bring any problems.
If psmouse-base.c detect device false-positive as ALPS (with
alps_detect()) then it immediately calls alps_init() which fails
and psmouse-base.c will try to use another protocol.
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply
* tsc2005 touchscreen: implement disable attribute
From: Pavel Machek @ 2014-11-09 11:56 UTC (permalink / raw)
To: pali.rohar, sre, sre, kernel list, linux-arm-kernel, linux-omap,
tony, khilman, aaro.koskinen, freemangordon, B38611, jg1.han,
linux-input
Implement disable attribute for tsc2005 touchscreen. It is useful to
avoid wakeups when phone is in the pocket.
Signed-off-by: Pavel Machek <pavel@ucw.cz>
---
[This is from Pali's n900 tree that is GPL, so that is okay, but maybe
I should get his sign-off here?]
diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c
index 52380b6..ec1c276 100644
--- a/drivers/input/touchscreen/tsc2005.c
+++ b/drivers/input/touchscreen/tsc2005.c
@@ -147,6 +147,7 @@ struct tsc2005 {
unsigned int x_plate_ohm;
+ bool disabled;
bool opened;
bool suspended;
@@ -384,6 +385,48 @@ static void __tsc2005_enable(struct tsc2005 *ts)
}
+static ssize_t tsc2005_disable_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct spi_device *spi = to_spi_device(dev);
+ struct tsc2005 *ts = spi_get_drvdata(spi);
+
+ return sprintf(buf, "%u\n", ts->disabled);
+}
+
+static ssize_t tsc2005_disable_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct spi_device *spi = to_spi_device(dev);
+ struct tsc2005 *ts = spi_get_drvdata(spi);
+ unsigned long val;
+ int error;
+
+ error = kstrtoul(buf, 10, &val);
+ if (error)
+ return error;
+
+ mutex_lock(&ts->mutex);
+
+ if (!ts->suspended && ts->opened) {
+ if (val) {
+ if (!ts->disabled)
+ __tsc2005_disable(ts);
+ } else {
+ if (ts->disabled)
+ __tsc2005_enable(ts);
+ }
+ }
+
+ ts->disabled = !!val;
+
+ mutex_unlock(&ts->mutex);
+
+ return count;
+}
+static DEVICE_ATTR(disable, 0664, tsc2005_disable_show, tsc2005_disable_store);
+
static ssize_t tsc2005_selftest_show(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -466,6 +509,7 @@ out:
static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
static struct attribute *tsc2005_attrs[] = {
+ &dev_attr_disable.attr,
&dev_attr_selftest.attr,
NULL
};
@@ -551,7 +595,7 @@ static int tsc2005_open(struct input_dev *input)
mutex_lock(&ts->mutex);
- if (!ts->suspended)
+ if (!ts->suspended && !ts->disabled)
__tsc2005_enable(ts);
ts->opened = true;
@@ -567,7 +611,7 @@ static void tsc2005_close(struct input_dev *input)
mutex_lock(&ts->mutex);
- if (!ts->suspended)
+ if (!ts->suspended && !ts->disabled)
__tsc2005_disable(ts);
ts->opened = false;
@@ -781,7 +825,7 @@ static int tsc2005_suspend(struct device *dev)
mutex_lock(&ts->mutex);
- if (!ts->suspended && ts->opened)
+ if (!ts->suspended && !ts->disabled && ts->opened)
__tsc2005_disable(ts);
ts->suspended = true;
@@ -798,7 +842,7 @@ static int tsc2005_resume(struct device *dev)
mutex_lock(&ts->mutex);
- if (ts->suspended && ts->opened)
+ if (ts->suspended && !ts->disabled && ts->opened)
__tsc2005_enable(ts);
ts->suspended = false;
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply related
* Re: tsc2005 touchscreen: implement disable attribute
From: Sebastian Reichel @ 2014-11-09 12:40 UTC (permalink / raw)
To: Pavel Machek
Cc: pali.rohar, kernel list, linux-arm-kernel, linux-omap, tony,
khilman, aaro.koskinen, freemangordon, B38611, jg1.han,
linux-input
In-Reply-To: <20141109115636.GA3106@amd>
[-- Attachment #1: Type: text/plain, Size: 326 bytes --]
Hi,
On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote:
> Implement disable attribute for tsc2005 touchscreen. It is useful to
> avoid wakeups when phone is in the pocket.
I don't think this should be some driver specific sysfs node.
Instead a generic method from the input subsystem should be
used.
-- Sebastian
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply
* Re: tsc2005 touchscreen: implement disable attribute
From: Pali Rohár @ 2014-11-09 12:49 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Pavel Machek, kernel list, linux-arm-kernel, linux-omap, tony,
khilman, aaro.koskinen, freemangordon, B38611, jg1.han,
linux-input, Dmitry Torokhov
In-Reply-To: <20141109124025.GA21763@earth.universe>
[-- Attachment #1: Type: Text/Plain, Size: 1017 bytes --]
On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:
> Hi,
>
> On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote:
> > Implement disable attribute for tsc2005 touchscreen. It is
> > useful to avoid wakeups when phone is in the pocket.
>
> I don't think this should be some driver specific sysfs node.
> Instead a generic method from the input subsystem should be
> used.
>
> -- Sebastian
Yes. I would like to see generic method to turn off input device
(or just "mute" it if device does not support turn off). Similar
problem is also on laptops or other portable devices. E.g when I
close LID of my laptop I want to turn off internal input devices
(keyboard, touchpad, trackstick) without need to unload evdev
Xserver drivers (or killing Xserver). Another use case is to turn
off keyboard (also from kernel tty on Ctrl+Alt+Fx) which cannot
be unplugged (internal laptop keyboard).
CCed Dmitry, what do you think about it?
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply
* Re: Help with input_report_key not reporting key
From: Jose Diez @ 2014-11-09 14:04 UTC (permalink / raw)
To: linux-input
In-Reply-To: <545F48AF.7040206@mediacru.sh>
Hi,
Just figured out the solution to my own problem.
Turns out the linux input system will only report a key event if the
value is different from the previous key report. In my case, I was only
sending the value '1'.
Duh. I should have known that.
On 09/11/14 10:57, Jose Diez wrote:
> Hello linux-input,
>
> Sorry to post about a similar question again, but I'm still stuck. So a
> bit of back story: I'm writing a custom HID driver which, among other
> things, will register several input devices.
>
> I'm able to read HID reports from the device using the raw_event
> callback, and I'm able to communicate with the device, but I seem to
> have hit an obstacle I can't get over. I've tried to add a proper input
> device to the driver, and while it registers it properly and shows up in
> /dev/input/*, the events seem to not go through.
>
> I found this simple kernel module, which indeed works properly and
> reports key events: http://sprunge.us/NLcD
>
> I then adapted it to work with my kernel module, shown here:
> http://sprunge.us/egIi
>
> It allocates the input device in fblng_probe(), sets the KEY_A bit in
> the keybit field, and registers it. Then, when a request comes to the
> device, in fblng_event(), I (try to) send a key with input_report_key.
> This doesn't seem to trigger a keypress.
>
> I'm looking at the relevant /dev/input/eventX with `evtest`. I know I'm
> getting events through, because I can see it in `dmesg`. However, it
> doesn't actually go through to the input handler.
>
> Any help, please?
>
> Thanks a lot,
> Jose
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: tsc2005 touchscreen: implement disable attribute
From: Dmitry Torokhov @ 2014-11-09 20:01 UTC (permalink / raw)
To: Pali Rohár
Cc: Sebastian Reichel, Pavel Machek, kernel list, linux-arm-kernel,
linux-omap, tony, khilman, aaro.koskinen, freemangordon, B38611,
jg1.han, linux-input
In-Reply-To: <201411091349.20116@pali>
On Sun, Nov 09, 2014 at 01:49:19PM +0100, Pali Rohár wrote:
> On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:
> > Hi,
> >
> > On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote:
> > > Implement disable attribute for tsc2005 touchscreen. It is
> > > useful to avoid wakeups when phone is in the pocket.
> >
> > I don't think this should be some driver specific sysfs node.
> > Instead a generic method from the input subsystem should be
> > used.
> >
> > -- Sebastian
>
> Yes. I would like to see generic method to turn off input device
> (or just "mute" it if device does not support turn off). Similar
> problem is also on laptops or other portable devices. E.g when I
> close LID of my laptop I want to turn off internal input devices
> (keyboard, touchpad, trackstick) without need to unload evdev
> Xserver drivers (or killing Xserver). Another use case is to turn
> off keyboard (also from kernel tty on Ctrl+Alt+Fx) which cannot
> be unplugged (internal laptop keyboard).
>
> CCed Dmitry, what do you think about it?
Actually I'd like it to be not limited to input devices but rater try
doing it at the device core level, if possible. I am sure there are IIO
and other devices that could be forcibly turned off/put into low power
mode under certain circumstances.
There were some talks about it with Rafael, but we never come with
anything concrete.
Thanks.
--
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH v3 3/4] input: alps: For protocol V3, do not process data when last packet's bit7 is set
From: Dmitry Torokhov @ 2014-11-09 20:34 UTC (permalink / raw)
To: Pali Rohár
Cc: Hans de Goede, Yunkang Tang, Tommy Will, linux-input,
linux-kernel
In-Reply-To: <201411091222.59595@pali>
On Sun, Nov 09, 2014 at 12:22:51PM +0100, Pali Rohár wrote:
> On Sunday 09 November 2014 08:50:39 Dmitry Torokhov wrote:
> > Hi Pali,
> >
> > On Sun, Nov 02, 2014 at 12:25:09AM +0100, Pali Rohár wrote:
> > > Sometimes on Dell Latitude laptops psmouse/alps driver
> > > receive invalid ALPS protocol V3 packets with bit7 set in
> > > last byte. More often it can be reproduced on Dell Latitude
> > > E6440 or E7440 with closed lid and pushing cover above
> > > touchpad.
> > >
> > > If bit7 in last packet byte is set then it is not valid ALPS
> > > packet. I was told that ALPS devices never send these
> > > packets. It is not know yet who send those packets, it
> > > could be Dell EC, bug in BIOS and also bug in touchpad
> > > firmware...
> > >
> > > With this patch alps driver does not process those invalid
> > > packets and drops it with PSMOUSE_FULL_PACKET so psmouse
> > > driver does not enter to out of sync state.
> > >
> > > This patch fix problem when psmouse driver still resetting
> > > ALPS device when laptop lid is closed because of receiving
> > > invalid packets in out of sync state.
> > >
> > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > > Tested-by: Pali Rohár <pali.rohar@gmail.com>
> > > Cc: stable@vger.kernel.org
> > > ---
> > >
> > > drivers/input/mouse/alps.c | 10 ++++++++++
> > > 1 file changed, 10 insertions(+)
> > >
> > > diff --git a/drivers/input/mouse/alps.c
> > > b/drivers/input/mouse/alps.c index 7c47e97..e802d28 100644
> > > --- a/drivers/input/mouse/alps.c
> > > +++ b/drivers/input/mouse/alps.c
> > > @@ -1181,6 +1181,16 @@ static psmouse_ret_t
> > > alps_process_byte(struct psmouse *psmouse)
> > >
> > > return PSMOUSE_BAD_DATA;
> > >
> > > }
> > >
> > > + if (priv->proto_version == ALPS_PROTO_V3 &&
> > > psmouse->pktcnt == psmouse->pktsize) { + // For protocol
> > > V3, do not process data when last packet's bit7 is set
> > > + if (psmouse->packet[psmouse->pktcnt - 1] & 0x80) {
> > > + psmouse_dbg(psmouse, "v3 discard packet[%i] =
> %x\n",
> > > + psmouse->pktcnt - 1,
> > > + psmouse->packet[psmouse->pktcnt - 1]);
> > > + return PSMOUSE_FULL_PACKET;
> > > + }
> > > + }
> >
> > I wanted to apply it, but I would like some more data. Could
> > you please send me the dmesg with i8042.debug wit this patch
> > in place?
> >
> > Thanks!
>
> See attachment. It contains debug log from both i8042.debug=1 and
> psmouse.ko with applied all 4 patches.
Thank you Pali.
OK, so it looks like the problematic byte is the last one and we should
be resynching right away. With your other patch increasing number of bad
packets before issuing resync this special handling is no longer needed,
right?
Thanks.
--
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH v9 01/18] input: cyapa: add device resource management infrastructure support
From: Dmitry Torokhov @ 2014-11-09 21:25 UTC (permalink / raw)
To: Dudley Du; +Cc: rydberg, Dudley Du, bleung, linux-input, linux-kernel
In-Reply-To: <1415003590-30485-2-git-send-email-dudl@cypress.com>
Hi Dudley,
On Mon, Nov 03, 2014 at 04:32:53PM +0800, Dudley Du wrote:
> Modify cyapa driver to support device resource management infrastructure
> to reduce the mistakes of resource management.
> TEST=test on Chromebooks.
>
> Signed-off-by: Dudley Du <dudl@cypress.com>
> ---
> drivers/input/mouse/cyapa.c | 48 ++++++++++++++++++---------------------------
> 1 file changed, 19 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> index b409c3d..b3d7a2a 100644
> --- a/drivers/input/mouse/cyapa.c
> +++ b/drivers/input/mouse/cyapa.c
> @@ -409,11 +409,11 @@ static ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values)
> cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> len = cyapa_smbus_cmds[cmd_idx].len;
> return cyapa_smbus_read_block(cyapa, cmd, len, values);
> - } else {
> - cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> - len = cyapa_i2c_cmds[cmd_idx].len;
> - return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
> }
> +
> + cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> + len = cyapa_i2c_cmds[cmd_idx].len;
> + return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
I am not sure why you are changing this code, it has nothing to do with
managed resources and the original was just fine.
> }
>
> /*
> @@ -762,7 +762,7 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
> if (!cyapa->physical_size_x || !cyapa->physical_size_y)
> return -EINVAL;
>
> - input = cyapa->input = input_allocate_device();
> + input = cyapa->input = devm_input_allocate_device(dev);
If you are using devm_* then you do not need to manually cal
input_free_device() (further down in this fucntion).
> if (!input) {
> dev_err(dev, "allocate memory for input device failed\n");
> return -ENOMEM;
> @@ -837,11 +837,9 @@ static int cyapa_probe(struct i2c_client *client,
> return -EIO;
> }
>
> - cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL);
> - if (!cyapa) {
> - dev_err(dev, "allocate memory for cyapa failed\n");
> + cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL);
> + if (!cyapa)
> return -ENOMEM;
> - }
>
> cyapa->gen = CYAPA_GEN3;
> cyapa->client = client;
> @@ -856,51 +854,43 @@ static int cyapa_probe(struct i2c_client *client,
> ret = cyapa_check_is_operational(cyapa);
> if (ret) {
> dev_err(dev, "device not operational, %d\n", ret);
> - goto err_mem_free;
> + return ret;
> }
>
> ret = cyapa_create_input_dev(cyapa);
> if (ret) {
> dev_err(dev, "create input_dev instance failed, %d\n", ret);
> - goto err_mem_free;
> + return ret;
> }
>
> ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> if (ret) {
> dev_err(dev, "set active power failed, %d\n", ret);
> - goto err_unregister_device;
> + return ret;
> }
>
> cyapa->irq = client->irq;
> - ret = request_threaded_irq(cyapa->irq,
> - NULL,
> - cyapa_irq,
> - IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> - "cyapa",
> - cyapa);
> + ret = devm_request_threaded_irq(dev,
> + cyapa->irq,
> + NULL,
> + cyapa_irq,
> + IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> + "cyapa",
> + cyapa);
> if (ret) {
> dev_err(dev, "IRQ request failed: %d\n, ", ret);
> - goto err_unregister_device;
> + return ret;
> }
>
> return 0;
> -
> -err_unregister_device:
> - input_unregister_device(cyapa->input);
> -err_mem_free:
> - kfree(cyapa);
> -
> - return ret;
> }
>
> static int cyapa_remove(struct i2c_client *client)
> {
> struct cyapa *cyapa = i2c_get_clientdata(client);
>
> - free_irq(cyapa->irq, cyapa);
> - input_unregister_device(cyapa->input);
> + disable_irq(cyapa->irq);
> cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> - kfree(cyapa);
I refer devm* conversions to completely eradicate ->remove() methods.
I took the liberty to edit the patch a bit, does the version below work
for you?
Thanks!
--
Dmitry
Input: cyapa - switch to using managed resources
From: Dudley Du <dudley.dulixin@gmail.com>
Use of managed resources simplifies error handling and device removal code.
Signed-off-by: Dudley Du <dudl@cypress.com>
[Dmitry: added open/close methods so cyapa_remove is no longer needed.]
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/mouse/cyapa.c | 184 +++++++++++++++++++++++++------------------
1 file changed, 105 insertions(+), 79 deletions(-)
diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
index 1d978c7..c84a9eb 100644
--- a/drivers/input/mouse/cyapa.c
+++ b/drivers/input/mouse/cyapa.c
@@ -577,10 +577,13 @@ static int cyapa_set_power_mode(struct cyapa *cyapa, u8 power_mode)
power = ret & ~PWR_MODE_MASK;
power |= power_mode & PWR_MODE_MASK;
ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
- if (ret < 0)
+ if (ret < 0) {
dev_err(dev, "failed to set power_mode 0x%02x err = %d\n",
power_mode, ret);
- return ret;
+ return ret;
+ }
+
+ return 0;
}
static int cyapa_get_query_data(struct cyapa *cyapa)
@@ -753,16 +756,40 @@ static u8 cyapa_check_adapter_functionality(struct i2c_client *client)
return ret;
}
+static int cyapa_open(struct input_dev *input)
+{
+ struct cyapa *cyapa = input_get_drvdata(input);
+ struct i2c_client *client = cyapa->client;
+ int error;
+
+ error = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
+ if (error) {
+ dev_err(&client->dev, "set active power failed: %d\n", error);
+ return error;
+ }
+
+ enable_irq(client->irq);
+ return 0;
+}
+
+static void cyapa_close(struct input_dev *input)
+{
+ struct cyapa *cyapa = input_get_drvdata(input);
+
+ disable_irq(cyapa->client->irq);
+ cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
+}
+
static int cyapa_create_input_dev(struct cyapa *cyapa)
{
struct device *dev = &cyapa->client->dev;
- int ret;
struct input_dev *input;
+ int error;
if (!cyapa->physical_size_x || !cyapa->physical_size_y)
return -EINVAL;
- input = cyapa->input = input_allocate_device();
+ input = devm_input_allocate_device(dev);
if (!input) {
dev_err(dev, "allocate memory for input device failed\n");
return -ENOMEM;
@@ -775,6 +802,9 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
input->id.product = 0; /* means any product in eventcomm. */
input->dev.parent = &cyapa->client->dev;
+ input->open = cyapa_open;
+ input->close = cyapa_close;
+
input_set_drvdata(input, cyapa);
__set_bit(EV_ABS, input->evbit);
@@ -802,34 +832,24 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
__set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
/* handle pointer emulation and unused slots in core */
- ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
- INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
- if (ret) {
- dev_err(dev, "allocate memory for MT slots failed, %d\n", ret);
- goto err_free_device;
+ error = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
+ INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
+ if (error) {
+ dev_err(dev, "failed to initialize MT slots: %d\n", error);
+ return error;
}
- /* Register the device in input subsystem */
- ret = input_register_device(input);
- if (ret) {
- dev_err(dev, "input device register failed, %d\n", ret);
- goto err_free_device;
- }
+ cyapa->input = input;
return 0;
-
-err_free_device:
- input_free_device(input);
- cyapa->input = NULL;
- return ret;
}
static int cyapa_probe(struct i2c_client *client,
const struct i2c_device_id *dev_id)
{
- int ret;
- u8 adapter_func;
- struct cyapa *cyapa;
struct device *dev = &client->dev;
+ struct cyapa *cyapa;
+ u8 adapter_func;
+ int error;
adapter_func = cyapa_check_adapter_functionality(client);
if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) {
@@ -837,11 +857,9 @@ static int cyapa_probe(struct i2c_client *client,
return -EIO;
}
- cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL);
- if (!cyapa) {
- dev_err(dev, "allocate memory for cyapa failed\n");
+ cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL);
+ if (!cyapa)
return -ENOMEM;
- }
cyapa->gen = CYAPA_GEN3;
cyapa->client = client;
@@ -852,66 +870,61 @@ static int cyapa_probe(struct i2c_client *client,
/* i2c isn't supported, use smbus */
if (adapter_func == CYAPA_ADAPTER_FUNC_SMBUS)
cyapa->smbus = true;
+
cyapa->state = CYAPA_STATE_NO_DEVICE;
- ret = cyapa_check_is_operational(cyapa);
- if (ret) {
- dev_err(dev, "device not operational, %d\n", ret);
- goto err_mem_free;
- }
- ret = cyapa_create_input_dev(cyapa);
- if (ret) {
- dev_err(dev, "create input_dev instance failed, %d\n", ret);
- goto err_mem_free;
+ error = cyapa_check_is_operational(cyapa);
+ if (error) {
+ dev_err(dev, "device not operational, %d\n", error);
+ return error;
}
- ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
- if (ret) {
- dev_err(dev, "set active power failed, %d\n", ret);
- goto err_unregister_device;
+ /* Power down the device until we need it */
+ error = cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
+ if (error) {
+ dev_err(dev, "failed to quiesce the device: %d\n", error);
+ return error;
}
- cyapa->irq = client->irq;
- ret = request_threaded_irq(cyapa->irq,
- NULL,
- cyapa_irq,
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "cyapa",
- cyapa);
- if (ret) {
- dev_err(dev, "IRQ request failed: %d\n, ", ret);
- goto err_unregister_device;
+ error = cyapa_create_input_dev(cyapa);
+ if (error)
+ return error;
+
+ error = devm_request_threaded_irq(dev, client->irq,
+ NULL, cyapa_irq,
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+ "cyapa", cyapa);
+ if (error) {
+ dev_err(dev, "IRQ request failed: %d\n, ", error);
+ return error;
}
- return 0;
-
-err_unregister_device:
- input_unregister_device(cyapa->input);
-err_mem_free:
- kfree(cyapa);
+ /* Disable IRQ until the device is opened */
+ disable_irq(client->irq);
- return ret;
-}
-
-static int cyapa_remove(struct i2c_client *client)
-{
- struct cyapa *cyapa = i2c_get_clientdata(client);
-
- free_irq(cyapa->irq, cyapa);
- input_unregister_device(cyapa->input);
- cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
- kfree(cyapa);
+ /* Register the device in input subsystem */
+ error = input_register_device(cyapa->input);
+ if (error) {
+ dev_err(dev, "failed to register input device: %d\n", error);
+ return error;
+ }
return 0;
}
static int __maybe_unused cyapa_suspend(struct device *dev)
{
- int ret;
+ struct i2c_client *client = to_i2c_client(dev);
+ struct cyapa *cyapa = i2c_get_clientdata(client);
+ struct input_dev *input = cyapa->input;
u8 power_mode;
- struct cyapa *cyapa = dev_get_drvdata(dev);
+ int error;
+
+ error = mutex_lock_interruptible(&input->mutex);
+ if (error)
+ return error;
- disable_irq(cyapa->irq);
+ disable_irq(client->irq);
/*
* Set trackpad device to idle mode if wakeup is allowed,
@@ -919,28 +932,42 @@ static int __maybe_unused cyapa_suspend(struct device *dev)
*/
power_mode = device_may_wakeup(dev) ? PWR_MODE_IDLE
: PWR_MODE_OFF;
- ret = cyapa_set_power_mode(cyapa, power_mode);
- if (ret < 0)
- dev_err(dev, "set power mode failed, %d\n", ret);
+ error = cyapa_set_power_mode(cyapa, power_mode);
+ if (error)
+ dev_err(dev, "resume: set power mode to %d failed: %d\n",
+ power_mode, error);
if (device_may_wakeup(dev))
cyapa->irq_wake = (enable_irq_wake(cyapa->irq) == 0);
+
+ mutex_unlock(&input->mutex);
+
return 0;
}
static int __maybe_unused cyapa_resume(struct device *dev)
{
- int ret;
- struct cyapa *cyapa = dev_get_drvdata(dev);
+ struct i2c_client *client = to_i2c_client(dev);
+ struct cyapa *cyapa = i2c_get_clientdata(client);
+ struct input_dev *input = cyapa->input;
+ u8 power_mode;
+ int error;
+
+ mutex_lock(&input->mutex);
if (device_may_wakeup(dev) && cyapa->irq_wake)
disable_irq_wake(cyapa->irq);
- ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
- if (ret)
- dev_warn(dev, "resume active power failed, %d\n", ret);
+ power_mode = input->users ? PWR_MODE_FULL_ACTIVE : PWR_MODE_OFF;
+ error = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
+ if (error)
+ dev_warn(dev, "resume: set power mode to %d failed: %d\n",
+ power_mode, error);
enable_irq(cyapa->irq);
+
+ mutex_unlock(&input->mutex);
+
return 0;
}
@@ -960,7 +987,6 @@ static struct i2c_driver cyapa_driver = {
},
.probe = cyapa_probe,
- .remove = cyapa_remove,
.id_table = cyapa_id_table,
};
^ permalink raw reply related
* [PATCH v2 0/3] support for the Fujitsu H730 laptop (update)
From: Ulrik De Bie @ 2014-11-09 21:38 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: linux-input, Hans de Goede, David Herrmann, ulrik.debie-os
In-Reply-To: <20141108082357.GC21475@dtor-ws>
This is an update of patch 3/5,4/5,5/5 of my previous submission.
If content looks good, I'll ask the testers to retest this modification.
The patch "report the middle button of the touchpad" is now made conditional
on the dmi check for the announcement of the middle button.
The patch "provide a sysfs knob for crc_enabled" is now simply 0/1, the autodetect is removed.
The patch "Update the documentation: trackpoint,v3/v4,crc_enabled" is now
updated according to those changes
Ulrik De Bie (3):
Input: elantech - report the middle button of the touchpad
Input: elantech - provide a sysfs knob for crc_enabled
Input: elantech - Update the documentation:
trackpoint,v3/v4,crc_enabled
Documentation/input/elantech.txt | 82 +++++++++++++++++++++++++++++++++++++---
drivers/input/mouse/elantech.c | 21 ++++++++++
2 files changed, 97 insertions(+), 6 deletions(-)
--
2.1.1
^ permalink raw reply
* [PATCH v2 1/3] Input: elantech - report the middle button of the touchpad
From: Ulrik De Bie @ 2014-11-09 21:38 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: linux-input, Hans de Goede, David Herrmann, ulrik.debie-os
In-Reply-To: <1415569117-29461-1-git-send-email-ulrik.debie-os@e2big.org>
In the past, no elantech was known with 3 touchpad mouse buttons.
Fujitsu H730 is the first known elantech with a middle button. This commit
enables this middle button. For backwards compatibility, the Fujitsu is
detected via DMI, and only for this one 3 buttons will be announced.
Reported-by: Stefan Valouch <stefan@valouch.com>
Signed-off-by: Ulrik De Bie <ulrik.debie-os@e2big.org>
---
drivers/input/mouse/elantech.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index ce699eb..8b04b71 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -563,6 +563,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse)
} else {
input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
+ input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04);
}
input_mt_report_pointer_emulation(dev, true);
@@ -1132,6 +1133,22 @@ static void elantech_set_buttonpad_prop(struct psmouse *psmouse)
}
/*
+ * Some hw_version 4 models do have a middle button
+ */
+static const struct dmi_system_id elantech_dmi_has_middle_button[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
+ {
+ /* Fujitsu H730 has a middle button */
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
+ },
+ },
+#endif
+ { }
+};
+
+/*
* Set the appropriate event bits for the input subsystem
*/
static int elantech_set_input_params(struct psmouse *psmouse)
@@ -1150,6 +1167,8 @@ static int elantech_set_input_params(struct psmouse *psmouse)
__clear_bit(EV_REL, dev->evbit);
__set_bit(BTN_LEFT, dev->keybit);
+ if (dmi_check_system(elantech_dmi_has_middle_button))
+ __set_bit(BTN_MIDDLE, dev->keybit);
__set_bit(BTN_RIGHT, dev->keybit);
__set_bit(BTN_TOUCH, dev->keybit);
@@ -1466,6 +1485,7 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
{ }
};
+
/*
* Some hw_version 3 models go into error state when we try to set
* bit 3 and/or bit 1 of r10.
--
2.1.1
^ permalink raw reply related
* [PATCH v2 2/3] Input: elantech - provide a sysfs knob for crc_enabled
From: Ulrik De Bie @ 2014-11-09 21:38 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: linux-input, Hans de Goede, David Herrmann, ulrik.debie-os
In-Reply-To: <1415569117-29461-1-git-send-email-ulrik.debie-os@e2big.org>
The detection of crc_enabled is known to fail for Fujitsu H730. A DMI
blacklist is added for that, but it can be expected that other laptops
will pop up with this.
Here a sysfs knob is provided to alter the behaviour of crc_enabled.
Writing 0 or 1 to it sets the variable to 0 or 1.
Reading it will show the crc_enabled variable (0 or 1).
Reported-by: Stefan Valouch <stefan@valouch.com>
Signed-off-by: Ulrik De Bie <ulrik.debie-os@e2big.org>
---
drivers/input/mouse/elantech.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 8b04b71..3fcb6b3 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -1330,6 +1330,7 @@ ELANTECH_INT_ATTR(reg_25, 0x25);
ELANTECH_INT_ATTR(reg_26, 0x26);
ELANTECH_INT_ATTR(debug, 0);
ELANTECH_INT_ATTR(paritycheck, 0);
+ELANTECH_INT_ATTR(crc_enabled, 0);
static struct attribute *elantech_attrs[] = {
&psmouse_attr_reg_07.dattr.attr,
@@ -1344,6 +1345,7 @@ static struct attribute *elantech_attrs[] = {
&psmouse_attr_reg_26.dattr.attr,
&psmouse_attr_debug.dattr.attr,
&psmouse_attr_paritycheck.dattr.attr,
+ &psmouse_attr_crc_enabled.dattr.attr,
NULL
};
@@ -1485,7 +1487,6 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
{ }
};
-
/*
* Some hw_version 3 models go into error state when we try to set
* bit 3 and/or bit 1 of r10.
--
2.1.1
^ permalink raw reply related
* [PATCH v2 3/3] Input: elantech - Update the documentation: trackpoint,v3/v4,crc_enabled
From: Ulrik De Bie @ 2014-11-09 21:38 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: linux-input, Hans de Goede, David Herrmann, ulrik.debie-os
In-Reply-To: <1415569117-29461-1-git-send-email-ulrik.debie-os@e2big.org>
A chapter is added to describe the trackpoint packets.
A section is added to describe the behaviour of the knob crc_enabled in
sysfs.
The introduction of the documentation only mentioned v1/v2, but in the
last part it already contains explanation of v3 and v4. The introduction
is updated.
Signed-off-by: Ulrik De Bie <ulrik.debie-os@e2big.org>
---
Documentation/input/elantech.txt | 82 +++++++++++++++++++++++++++++++++++++---
1 file changed, 76 insertions(+), 6 deletions(-)
diff --git a/Documentation/input/elantech.txt b/Documentation/input/elantech.txt
index e1ae127..9e74a4e 100644
--- a/Documentation/input/elantech.txt
+++ b/Documentation/input/elantech.txt
@@ -38,22 +38,38 @@ Contents
7.2.1 Status packet
7.2.2 Head packet
7.2.3 Motion packet
+ 8. Trackpoint (for Hardware version 3 and 4)
+ 8.1 Registers
+ 8.2 Native relative mode 6 byte packet format
+ 8.2.1 Status Packet
1. Introduction
~~~~~~~~~~~~
-Currently the Linux Elantech touchpad driver is aware of two different
-hardware versions unimaginatively called version 1 and version 2. Version 1
-is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to
-be introduced with the EeePC and uses 6 bytes per packet, and provides
-additional features such as position of two fingers, and width of the touch.
+Currently the Linux Elantech touchpad driver is aware of four different
+hardware versions unimaginatively called version 1,version 2, version 3
+and version 4. Version 1 is found in "older" laptops and uses 4 bytes per
+packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes
+per packet, and provides additional features such as position of two fingers,
+and width of the touch. Hardware version 3 uses 6 bytes per packet (and
+for 2 fingers the concatenation of two 6 bytes packets) and allows tracking
+of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can
+combine a status packet with multiple head or motion packets. Hardware version
+4 allows tracking up to 5 fingers.
+
+Some Hardware version 3 and version 4 also have a trackpoint which uses a
+separate packet format. It is also 6 bytes per packet.
The driver tries to support both hardware versions and should be compatible
with the Xorg Synaptics touchpad driver and its graphical configuration
utilities.
+Note that a mouse button is also associated with either the touchpad or the
+trackpoint when a trackpoint is available. Disabling the Touchpad in xorg
+(TouchPadOff=0) will also disable the buttons associated with the touchpad.
+
Additionally the operation of the touchpad can be altered by adjusting the
contents of some of its internal registers. These registers are represented
by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio?
@@ -78,7 +94,7 @@ completeness sake.
2. Extra knobs
~~~~~~~~~~~
-Currently the Linux Elantech touchpad driver provides two extra knobs under
+Currently the Linux Elantech touchpad driver provides three extra knobs under
/sys/bus/serio/drivers/psmouse/serio? for the user.
* debug
@@ -112,6 +128,20 @@ Currently the Linux Elantech touchpad driver provides two extra knobs under
data consistency checking can be done. For now checking is disabled by
default. Currently even turning it on will do nothing.
+* crc_enabled
+
+ Sets crc_enabled to 0/1. The name "crc_enabled" is the official name of
+ this integrity check, even though it is not an actual cyclic redundancy
+ check.
+
+ Depending on the state of crc_enabled, certain basic data integrity
+ verification is done by the driver on hardware version 3 and 4. The
+ driver will reject any packet that appears corrupted. Using this knob,
+ The state of crc_enabled can be altered with this knob.
+
+ Reading the crc_enabled value will show the active value. Echoing
+ "0" or "1" to this file will set the state to "0" or "1".
+
/////////////////////////////////////////////////////////////////////////////
3. Differentiating hardware versions
@@ -746,3 +776,43 @@ byte 5:
byte 0 ~ 2 for one finger
byte 3 ~ 5 for another
+
+
+8. Trackpoint (for Hardware version 3 and 4)
+ =========================================
+8.1 Registers
+ ~~~~~~~~~
+No special registers have been identified.
+
+8.2 Native relative mode 6 byte packet format
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+8.2.1 Status Packet
+ ~~~~~~~~~~~~~
+
+byte 0:
+ bit 7 6 5 4 3 2 1 0
+ 0 0 sx sy 0 M R L
+byte 1:
+ bit 7 6 5 4 3 2 1 0
+ ~sx 0 0 0 0 0 0 0
+byte 2:
+ bit 7 6 5 4 3 2 1 0
+ ~sy 0 0 0 0 0 0 0
+byte 3:
+ bit 7 6 5 4 3 2 1 0
+ 0 0 ~sy ~sx 0 1 1 0
+byte 4:
+ bit 7 6 5 4 3 2 1 0
+ x7 x6 x5 x4 x3 x2 x1 x0
+byte 5:
+ bit 7 6 5 4 3 2 1 0
+ y7 y6 y5 y4 y3 y2 y1 y0
+
+
+ x and y are written in two's complement spread
+ over 9 bits with sx/sy the relative top bit and
+ x7..x0 and y7..y0 the lower bits.
+ ~sx is the inverse of sx, ~sy is the inverse of sy.
+ The sign of y is opposite to what the input driver
+ expects for a relative movement
+
--
2.1.1
^ permalink raw reply related
* Re: [PATCH] Input: gpio_keys: Make sure wake-up buttons work.
From: NeilBrown @ 2014-11-08 5:17 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Dmitry Torokhov, linux-input, linux-kernel, GTA04 owners
In-Reply-To: <23209922.Rp3elUvURv@vostro.rjw.lan>
[-- Attachment #1: Type: text/plain, Size: 2373 bytes --]
On Sat, 08 Nov 2014 01:49:06 +0100 "Rafael J. Wysocki" <rjw@rjwysocki.net>
wrote:
> On Saturday, November 08, 2014 11:00:58 AM NeilBrown wrote:
> > On Fri, 7 Nov 2014 15:45:07 -0800 Dmitry Torokhov <dmitry.torokhov@gmail.com>
> > wrote:
> >
> > > Hi Neil,
> > >
> > > On Sat, Nov 08, 2014 at 10:37:07AM +1100, NeilBrown wrote:
> > > >
> > > >
> > > > If a key is to be used for wake-up, we must not disable
> > > > the interrupt during suspend.
> > > >
> > > > Signed-off-by: NeilBrown <neilb@suse.de>
> > > >
> > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
> > > > index 8c98e97f8e41..0b5e54ae343e 100644
> > > > --- a/drivers/input/keyboard/gpio_keys.c
> > > > +++ b/drivers/input/keyboard/gpio_keys.c
> > > > @@ -526,6 +526,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
> > > > */
> > > > if (!button->can_disable)
> > > > irqflags |= IRQF_SHARED;
> > > > + if (button->wakeup)
> > > > + irqflags |= IRQF_NO_SUSPEND;
> > >
> > > No, enable_irq_wake() should be enough. I believe Rafael has fixed that
> > > in the core, right?
> > >
> >
> > Interesting... you seem to be right, but I was having wakeup problems until
> > I added that patch.
>
> This was a fairly recent change made in 3.18-rc1.
>
> > I didn't test exhaustively, but the first time my device entered suspend, the
> > gpio-key didn't wake it up. Subsequent suspends did...
> >
> > After I applied this patch, it would reliably wake up even on the first
> > suspend.
> >
> > So there seems to be something wrong, but maybe it is more subtle.
> >
> > Is there a good reason why enable_irq_wake() is only called just as the
> > device is being suspended, and why disable_irq_wake() is called on resume?
> > To me it would make more sense to just enable it once (if required) and leave
> > it enabled....
>
> On some platforms it actually changes the configuration of interrupt
> controllers in to a "suspend mode" which is not appropriate for run time
> AFAICS.
>
> > I'll see what I can find.
>
> Yes, please.
Hmmm.. that's frustrating. I cannot reproduce the problem at all now. I
wonder what changed..
And I see there are lots of changes in 3.18.
I'll discard my patch and wait to see if the problem recurs.
Thanks for your time,
NeilBrown
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]
^ permalink raw reply
* RE: [PATCH v9 01/18] input: cyapa: add device resource management infrastructure support
From: Dudley Du @ 2014-11-10 2:48 UTC (permalink / raw)
To: Dmitry Torokhov, Dudley Du
Cc: rydberg@euromail.se, bleung@google.com,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <20141109212541.GC37384@dtor-ws>
Thanks, Dmitry.
I will fix this patch as shown below.
Should I need to fix and resubmit the patches immedaitely or wait for other pathces' comments and submit together?
Thanks,
Dudley
> -----Original Message-----
> From: Dmitry Torokhov [mailto:dmitry.torokhov@gmail.com]
> Sent: 2014?11?10? 5:26
> To: Dudley Du
> Cc: rydberg@euromail.se; Dudley Du; bleung@google.com;
> linux-input@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH v9 01/18] input: cyapa: add device resource management
> infrastructure support
>
> Hi Dudley,
>
> On Mon, Nov 03, 2014 at 04:32:53PM +0800, Dudley Du wrote:
> > Modify cyapa driver to support device resource management infrastructure
> > to reduce the mistakes of resource management.
> > TEST=test on Chromebooks.
> >
> > Signed-off-by: Dudley Du <dudl@cypress.com>
> > ---
> > drivers/input/mouse/cyapa.c | 48 ++++++++++++++++++---------------------------
> > 1 file changed, 19 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> > index b409c3d..b3d7a2a 100644
> > --- a/drivers/input/mouse/cyapa.c
> > +++ b/drivers/input/mouse/cyapa.c
> > @@ -409,11 +409,11 @@ static ssize_t cyapa_read_block(struct cyapa *cyapa,
> u8 cmd_idx, u8 *values)
> > cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> > len = cyapa_smbus_cmds[cmd_idx].len;
> > return cyapa_smbus_read_block(cyapa, cmd, len, values);
> > -} else {
> > -cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> > -len = cyapa_i2c_cmds[cmd_idx].len;
> > -return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
> > }
> > +
> > +cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> > +len = cyapa_i2c_cmds[cmd_idx].len;
> > +return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
>
> I am not sure why you are changing this code, it has nothing to do with
> managed resources and the original was just fine.
It's changed just to fix the warning when running the patch checking script.
>
> > }
> >
> > /*
> > @@ -762,7 +762,7 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
> > if (!cyapa->physical_size_x || !cyapa->physical_size_y)
> > return -EINVAL;
> >
> > -input = cyapa->input = input_allocate_device();
> > +input = cyapa->input = devm_input_allocate_device(dev);
>
> If you are using devm_* then you do not need to manually cal
> input_free_device() (further down in this fucntion).
Yes, it's correct. It's my mistake to lot the code here.
>
> > if (!input) {
> > dev_err(dev, "allocate memory for input device failed\n");
> > return -ENOMEM;
> > @@ -837,11 +837,9 @@ static int cyapa_probe(struct i2c_client *client,
> > return -EIO;
> > }
> >
> > -cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL);
> > -if (!cyapa) {
> > -dev_err(dev, "allocate memory for cyapa failed\n");
> > +cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL);
> > +if (!cyapa)
> > return -ENOMEM;
> > -}
> >
> > cyapa->gen = CYAPA_GEN3;
> > cyapa->client = client;
> > @@ -856,51 +854,43 @@ static int cyapa_probe(struct i2c_client *client,
> > ret = cyapa_check_is_operational(cyapa);
> > if (ret) {
> > dev_err(dev, "device not operational, %d\n", ret);
> > -goto err_mem_free;
> > +return ret;
> > }
> >
> > ret = cyapa_create_input_dev(cyapa);
> > if (ret) {
> > dev_err(dev, "create input_dev instance failed, %d\n", ret);
> > -goto err_mem_free;
> > +return ret;
> > }
> >
> > ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> > if (ret) {
> > dev_err(dev, "set active power failed, %d\n", ret);
> > -goto err_unregister_device;
> > +return ret;
> > }
> >
> > cyapa->irq = client->irq;
> > -ret = request_threaded_irq(cyapa->irq,
> > - NULL,
> > - cyapa_irq,
> > - IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> > - "cyapa",
> > - cyapa);
> > +ret = devm_request_threaded_irq(dev,
> > +cyapa->irq,
> > +NULL,
> > +cyapa_irq,
> > +IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> > +"cyapa",
> > +cyapa);
> > if (ret) {
> > dev_err(dev, "IRQ request failed: %d\n, ", ret);
> > -goto err_unregister_device;
> > +return ret;
> > }
> >
> > return 0;
> > -
> > -err_unregister_device:
> > -input_unregister_device(cyapa->input);
> > -err_mem_free:
> > -kfree(cyapa);
> > -
> > -return ret;
> > }
> >
> > static int cyapa_remove(struct i2c_client *client)
> > {
> > struct cyapa *cyapa = i2c_get_clientdata(client);
> >
> > -free_irq(cyapa->irq, cyapa);
> > -input_unregister_device(cyapa->input);
> > +disable_irq(cyapa->irq);
> > cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> > -kfree(cyapa);
>
> I refer devm* conversions to completely eradicate ->remove() methods.
> I took the liberty to edit the patch a bit, does the version below work
> for you?
Yes, it's working in the below version.
The code in ->remove() method is just to turn the device off, and it can be controlled through open()/close().
Thanks.
>
> Thanks!
>
> --
> Dmitry
>
>
> Input: cyapa - switch to using managed resources
>
> From: Dudley Du <dudley.dulixin@gmail.com>
>
> Use of managed resources simplifies error handling and device removal code.
>
> Signed-off-by: Dudley Du <dudl@cypress.com>
> [Dmitry: added open/close methods so cyapa_remove is no longer needed.]
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> ---
> drivers/input/mouse/cyapa.c | 184 +++++++++++++++++++++++++------------------
> 1 file changed, 105 insertions(+), 79 deletions(-)
>
> diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> index 1d978c7..c84a9eb 100644
> --- a/drivers/input/mouse/cyapa.c
> +++ b/drivers/input/mouse/cyapa.c
> @@ -577,10 +577,13 @@ static int cyapa_set_power_mode(struct cyapa *cyapa,
> u8 power_mode)
> power = ret & ~PWR_MODE_MASK;
> power |= power_mode & PWR_MODE_MASK;
> ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
> -if (ret < 0)
> +if (ret < 0) {
> dev_err(dev, "failed to set power_mode 0x%02x err = %d\n",
> power_mode, ret);
> -return ret;
> +return ret;
> +}
> +
> +return 0;
> }
>
> static int cyapa_get_query_data(struct cyapa *cyapa)
> @@ -753,16 +756,40 @@ static u8 cyapa_check_adapter_functionality(struct
> i2c_client *client)
> return ret;
> }
>
> +static int cyapa_open(struct input_dev *input)
> +{
> +struct cyapa *cyapa = input_get_drvdata(input);
> +struct i2c_client *client = cyapa->client;
> +int error;
> +
> +error = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> +if (error) {
> +dev_err(&client->dev, "set active power failed: %d\n", error);
> +return error;
> +}
> +
> +enable_irq(client->irq);
> +return 0;
> +}
> +
> +static void cyapa_close(struct input_dev *input)
> +{
> +struct cyapa *cyapa = input_get_drvdata(input);
> +
> +disable_irq(cyapa->client->irq);
> +cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> +}
> +
> static int cyapa_create_input_dev(struct cyapa *cyapa)
> {
> struct device *dev = &cyapa->client->dev;
> -int ret;
> struct input_dev *input;
> +int error;
>
> if (!cyapa->physical_size_x || !cyapa->physical_size_y)
> return -EINVAL;
>
> -input = cyapa->input = input_allocate_device();
> +input = devm_input_allocate_device(dev);
> if (!input) {
> dev_err(dev, "allocate memory for input device failed\n");
> return -ENOMEM;
> @@ -775,6 +802,9 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
> input->id.product = 0; /* means any product in eventcomm. */
> input->dev.parent = &cyapa->client->dev;
>
> +input->open = cyapa_open;
> +input->close = cyapa_close;
> +
> input_set_drvdata(input, cyapa);
>
> __set_bit(EV_ABS, input->evbit);
> @@ -802,34 +832,24 @@ static int cyapa_create_input_dev(struct cyapa *cyapa)
> __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
>
> /* handle pointer emulation and unused slots in core */
> -ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
> - INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
> -if (ret) {
> -dev_err(dev, "allocate memory for MT slots failed, %d\n", ret);
> -goto err_free_device;
> +error = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
> + INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
> +if (error) {
> +dev_err(dev, "failed to initialize MT slots: %d\n", error);
> +return error;
> }
>
> -/* Register the device in input subsystem */
> -ret = input_register_device(input);
> -if (ret) {
> -dev_err(dev, "input device register failed, %d\n", ret);
> -goto err_free_device;
> -}
> +cyapa->input = input;
> return 0;
> -
> -err_free_device:
> -input_free_device(input);
> -cyapa->input = NULL;
> -return ret;
> }
>
> static int cyapa_probe(struct i2c_client *client,
> const struct i2c_device_id *dev_id)
> {
> -int ret;
> -u8 adapter_func;
> -struct cyapa *cyapa;
> struct device *dev = &client->dev;
> +struct cyapa *cyapa;
> +u8 adapter_func;
> +int error;
>
> adapter_func = cyapa_check_adapter_functionality(client);
> if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) {
> @@ -837,11 +857,9 @@ static int cyapa_probe(struct i2c_client *client,
> return -EIO;
> }
>
> -cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL);
> -if (!cyapa) {
> -dev_err(dev, "allocate memory for cyapa failed\n");
> +cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL);
> +if (!cyapa)
> return -ENOMEM;
> -}
>
> cyapa->gen = CYAPA_GEN3;
> cyapa->client = client;
> @@ -852,66 +870,61 @@ static int cyapa_probe(struct i2c_client *client,
> /* i2c isn't supported, use smbus */
> if (adapter_func == CYAPA_ADAPTER_FUNC_SMBUS)
> cyapa->smbus = true;
> +
> cyapa->state = CYAPA_STATE_NO_DEVICE;
> -ret = cyapa_check_is_operational(cyapa);
> -if (ret) {
> -dev_err(dev, "device not operational, %d\n", ret);
> -goto err_mem_free;
> -}
>
> -ret = cyapa_create_input_dev(cyapa);
> -if (ret) {
> -dev_err(dev, "create input_dev instance failed, %d\n", ret);
> -goto err_mem_free;
> +error = cyapa_check_is_operational(cyapa);
> +if (error) {
> +dev_err(dev, "device not operational, %d\n", error);
> +return error;
> }
>
> -ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> -if (ret) {
> -dev_err(dev, "set active power failed, %d\n", ret);
> -goto err_unregister_device;
> +/* Power down the device until we need it */
> +error = cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> +if (error) {
> +dev_err(dev, "failed to quiesce the device: %d\n", error);
> +return error;
> }
>
> -cyapa->irq = client->irq;
> -ret = request_threaded_irq(cyapa->irq,
> - NULL,
> - cyapa_irq,
> - IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> - "cyapa",
> - cyapa);
> -if (ret) {
> -dev_err(dev, "IRQ request failed: %d\n, ", ret);
> -goto err_unregister_device;
> +error = cyapa_create_input_dev(cyapa);
> +if (error)
> +return error;
> +
> +error = devm_request_threaded_irq(dev, client->irq,
> + NULL, cyapa_irq,
> + IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> + "cyapa", cyapa);
> +if (error) {
> +dev_err(dev, "IRQ request failed: %d\n, ", error);
> +return error;
> }
>
> -return 0;
> -
> -err_unregister_device:
> -input_unregister_device(cyapa->input);
> -err_mem_free:
> -kfree(cyapa);
> +/* Disable IRQ until the device is opened */
> +disable_irq(client->irq);
>
> -return ret;
> -}
> -
> -static int cyapa_remove(struct i2c_client *client)
> -{
> -struct cyapa *cyapa = i2c_get_clientdata(client);
> -
> -free_irq(cyapa->irq, cyapa);
> -input_unregister_device(cyapa->input);
> -cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> -kfree(cyapa);
> +/* Register the device in input subsystem */
> +error = input_register_device(cyapa->input);
> +if (error) {
> +dev_err(dev, "failed to register input device: %d\n", error);
> +return error;
> +}
>
> return 0;
> }
>
> static int __maybe_unused cyapa_suspend(struct device *dev)
> {
> -int ret;
> +struct i2c_client *client = to_i2c_client(dev);
> +struct cyapa *cyapa = i2c_get_clientdata(client);
> +struct input_dev *input = cyapa->input;
> u8 power_mode;
> -struct cyapa *cyapa = dev_get_drvdata(dev);
> +int error;
> +
> +error = mutex_lock_interruptible(&input->mutex);
> +if (error)
> +return error;
>
> -disable_irq(cyapa->irq);
> +disable_irq(client->irq);
>
> /*
> * Set trackpad device to idle mode if wakeup is allowed,
> @@ -919,28 +932,42 @@ static int __maybe_unused cyapa_suspend(struct device
> *dev)
> */
> power_mode = device_may_wakeup(dev) ? PWR_MODE_IDLE
> : PWR_MODE_OFF;
> -ret = cyapa_set_power_mode(cyapa, power_mode);
> -if (ret < 0)
> -dev_err(dev, "set power mode failed, %d\n", ret);
> +error = cyapa_set_power_mode(cyapa, power_mode);
> +if (error)
> +dev_err(dev, "resume: set power mode to %d failed: %d\n",
> + power_mode, error);
>
> if (device_may_wakeup(dev))
> cyapa->irq_wake = (enable_irq_wake(cyapa->irq) == 0);
> +
> +mutex_unlock(&input->mutex);
> +
> return 0;
> }
>
> static int __maybe_unused cyapa_resume(struct device *dev)
> {
> -int ret;
> -struct cyapa *cyapa = dev_get_drvdata(dev);
> +struct i2c_client *client = to_i2c_client(dev);
> +struct cyapa *cyapa = i2c_get_clientdata(client);
> +struct input_dev *input = cyapa->input;
> +u8 power_mode;
> +int error;
> +
> +mutex_lock(&input->mutex);
>
> if (device_may_wakeup(dev) && cyapa->irq_wake)
> disable_irq_wake(cyapa->irq);
>
> -ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> -if (ret)
> -dev_warn(dev, "resume active power failed, %d\n", ret);
> +power_mode = input->users ? PWR_MODE_FULL_ACTIVE : PWR_MODE_OFF;
> +error = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> +if (error)
> +dev_warn(dev, "resume: set power mode to %d failed: %d\n",
> + power_mode, error);
>
> enable_irq(cyapa->irq);
> +
> +mutex_unlock(&input->mutex);
> +
> return 0;
> }
>
> @@ -960,7 +987,6 @@ static struct i2c_driver cyapa_driver = {
> },
>
> .probe = cyapa_probe,
> -.remove = cyapa_remove,
> .id_table = cyapa_id_table,
> };
>
This message and any attachments may contain Cypress (or its subsidiaries) confidential information. If it has been received in error, please advise the sender and immediately delete this message.
^ permalink raw reply
* RE: [PATCH v9 01/18] input: cyapa: add device resource management infrastructure support
From: Dmitry Torokhov @ 2014-11-10 3:30 UTC (permalink / raw)
To: Dudley Du, Dudley Du
Cc: rydberg@euromail.se, bleung@google.com,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <a3a1f76316f24d42b0f95fbda9565d9f@BN1PR06MB070.namprd06.prod.outlook.com>
On November 9, 2014 6:48:08 PM PST, Dudley Du <dudl@cypress.com> wrote:
>Thanks, Dmitry.
>I will fix this patch as shown below.
>Should I need to fix and resubmit the patches immedaitely or wait for
>other pathces' comments and submit together?
No, if the version that I sent you works you do not need to resubmit, I'll apply it as is. I will have comments on other patches later tonight.
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH 1/1] Input: xpad - update docs to reflect current state
From: Daniel Dressler @ 2014-11-10 8:06 UTC (permalink / raw)
To: Jonathan Corbet
Cc: Dmitry Torokhov, Tommi Rantala, Ted Mielczarek, Paul Gortmaker,
Frank Razenberg, Benjamin Valentin, Petr Sebor,
Thomaz de Oliveira dos Reis, open list:DOCUMENTATION, open list,
linux-input
In-Reply-To: <20141107134854.56305dbb@lwn.net>
Thanks Jon
I've sent a second version of the patch without the TODO list edits.
Now I would like to ask about a backwards compact issue related to this driver.
Eons ago in patch 99de0912b [0] when support for the wireless 360
controllers were added the decision was made to map their Dpad to the
discrete buttons.
There is reasonable justification for this behavior since the Dpad has
never functioned like an analog stick on Xbox hardware.
Except support for wired 360 controllers had been added a year earlier
and used the opposite behavior. In fact the wireless 360 controllers
are the only controllers which use the dpad_to_button behavior.
Original Xbox, wired Xbox 360, and all Xbox One controllers all expose
the dpad as a set of axises.
This has caused pain for downstream developers. It means two
controllers have wildly different behavior. Many developers have just
ignored the issue or suggested users unload xpand and use the userland
replacement. Even Arch's wiki suggests such [1]. Which to be honest is
all one can do. The xpad driver does not expose the information
developers need to even incorporate a workaround without nasty hacks.
As a downstream developer I've been bitten by this twice. The first
time I didn't even know that wired vs wireless made a difference and I
was disturbed to learn the truth.
So here is what I want to hear opinions on: should the wireless 360's
dpad be exposed as both axises _and_ buttons?
[0]: https://github.com/torvalds/linux/commit/99de0912b when t
[1]: https://wiki.archlinux.org/index.php/joystick#Xbox_360_controllers
Daniel
2014-11-08 3:48 GMT+09:00 Jonathan Corbet <corbet@lwn.net>:
> On Mon, 3 Nov 2014 17:53:06 +0900
> Daniel Dressler <danieru.dressler@gmail.com> wrote:
>
>> The last time this documentation was accurate was
>> just over 8 years ago. In this time we've added
>> support for two new generations of Xbox console
>> controllers and dozens of third-party controllers.
>>
>> This patch unifies terminology and makes it explicit
>> which model of controller a sentence refers to.
>
> So this seems like a useful update, and I was looking at pulling it into
> the docs tree. But this hunk:
>
>> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
>> index 2ed7905..7e2e047 100644
>> --- a/drivers/input/joystick/xpad.c
>> +++ b/drivers/input/joystick/xpad.c
>> @@ -40,8 +40,8 @@
>> *
>> * TODO:
>> * - fine tune axes (especially trigger axes)
>> - * - fix "analog" buttons (reported as digital now)
>> - * - get rumble working
>> + * - add original xbox rumble pack support
>> + * - add xbox one rumble support
>> * - need USB IDs for other dance pads
>> *
>> * History:
>
> Seems like a different change that shouldn't be mixed up with the doc
> update. Send me a version without that change and, in the absence
> of complaints, I'll apply it.
>
> Thanks,
>
> jon
^ permalink raw reply
* Re: [PATCH v9 02/18] input: cyapa: re-design driver to support multi-trackpad in one driver
From: Dmitry Torokhov @ 2014-11-10 8:18 UTC (permalink / raw)
To: Dudley Du; +Cc: rydberg, Dudley Du, bleung, linux-input, linux-kernel
In-Reply-To: <1415003590-30485-3-git-send-email-dudl@cypress.com>
Hi Dudley,
On Mon, Nov 03, 2014 at 04:32:54PM +0800, Dudley Du wrote:
> In order to support multiple different chipsets and communication protocols
> trackpad devices in one cyapa driver, the new cyapa driver is re-designed
> with one cyapa driver core and multiple device specific functions component.
> The cyapa driver core is contained in this patch, it supplies basic functions
> that working with kernel and input subsystem, and also supplies the interfaces
> that the specific devices' component can connect and work together with as
> one driver.
>
> Signed-off-by: Dudley Du <dudl@cypress.com>
Thank you for addressing my previous comments, the driver looks much
better now. Still, a few comments.
We should try to avoid breaking the driver withing the patch series, so
please merge this change together with the next patch re-adding the gen3
support. The gen5 is new functionality and can stay in separate
patch(es).
> ---
> drivers/input/mouse/cyapa.c | 1087 ++++++++++++++-----------------------------
> drivers/input/mouse/cyapa.h | 321 +++++++++++++
> 2 files changed, 682 insertions(+), 726 deletions(-)
> create mode 100644 drivers/input/mouse/cyapa.h
>
> diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> index b3d7a2a..5029618 100644
> --- a/drivers/input/mouse/cyapa.c
> +++ b/drivers/input/mouse/cyapa.c
> @@ -6,7 +6,7 @@
> * Daniel Kurtz <djkurtz@chromium.org>
> * Benson Leung <bleung@chromium.org>
> *
> - * Copyright (C) 2011-2012 Cypress Semiconductor, Inc.
> + * Copyright (C) 2011-2014 Cypress Semiconductor, Inc.
> * Copyright (C) 2011-2012 Google, Inc.
> *
> * This file is subject to the terms and conditions of the GNU General Public
> @@ -20,601 +20,193 @@
> #include <linux/input/mt.h>
> #include <linux/interrupt.h>
> #include <linux/module.h>
> +#include <linux/mutex.h>
> #include <linux/slab.h>
> +#include <linux/uaccess.h>
> +#include "cyapa.h"
>
> -/* APA trackpad firmware generation */
> -#define CYAPA_GEN3 0x03 /* support MT-protocol B with tracking ID. */
> -
> -#define CYAPA_NAME "Cypress APA Trackpad (cyapa)"
> -
> -/* commands for read/write registers of Cypress trackpad */
> -#define CYAPA_CMD_SOFT_RESET 0x00
> -#define CYAPA_CMD_POWER_MODE 0x01
> -#define CYAPA_CMD_DEV_STATUS 0x02
> -#define CYAPA_CMD_GROUP_DATA 0x03
> -#define CYAPA_CMD_GROUP_CMD 0x04
> -#define CYAPA_CMD_GROUP_QUERY 0x05
> -#define CYAPA_CMD_BL_STATUS 0x06
> -#define CYAPA_CMD_BL_HEAD 0x07
> -#define CYAPA_CMD_BL_CMD 0x08
> -#define CYAPA_CMD_BL_DATA 0x09
> -#define CYAPA_CMD_BL_ALL 0x0a
> -#define CYAPA_CMD_BLK_PRODUCT_ID 0x0b
> -#define CYAPA_CMD_BLK_HEAD 0x0c
> -
> -/* report data start reg offset address. */
> -#define DATA_REG_START_OFFSET 0x0000
> -
> -#define BL_HEAD_OFFSET 0x00
> -#define BL_DATA_OFFSET 0x10
> -
> -/*
> - * Operational Device Status Register
> - *
> - * bit 7: Valid interrupt source
> - * bit 6 - 4: Reserved
> - * bit 3 - 2: Power status
> - * bit 1 - 0: Device status
> - */
> -#define REG_OP_STATUS 0x00
> -#define OP_STATUS_SRC 0x80
> -#define OP_STATUS_POWER 0x0c
> -#define OP_STATUS_DEV 0x03
> -#define OP_STATUS_MASK (OP_STATUS_SRC | OP_STATUS_POWER | OP_STATUS_DEV)
> -
> -/*
> - * Operational Finger Count/Button Flags Register
> - *
> - * bit 7 - 4: Number of touched finger
> - * bit 3: Valid data
> - * bit 2: Middle Physical Button
> - * bit 1: Right Physical Button
> - * bit 0: Left physical Button
> - */
> -#define REG_OP_DATA1 0x01
> -#define OP_DATA_VALID 0x08
> -#define OP_DATA_MIDDLE_BTN 0x04
> -#define OP_DATA_RIGHT_BTN 0x02
> -#define OP_DATA_LEFT_BTN 0x01
> -#define OP_DATA_BTN_MASK (OP_DATA_MIDDLE_BTN | OP_DATA_RIGHT_BTN | \
> - OP_DATA_LEFT_BTN)
> -
> -/*
> - * Bootloader Status Register
> - *
> - * bit 7: Busy
> - * bit 6 - 5: Reserved
> - * bit 4: Bootloader running
> - * bit 3 - 1: Reserved
> - * bit 0: Checksum valid
> - */
> -#define REG_BL_STATUS 0x01
> -#define BL_STATUS_BUSY 0x80
> -#define BL_STATUS_RUNNING 0x10
> -#define BL_STATUS_DATA_VALID 0x08
> -#define BL_STATUS_CSUM_VALID 0x01
> -
> -/*
> - * Bootloader Error Register
> - *
> - * bit 7: Invalid
> - * bit 6: Invalid security key
> - * bit 5: Bootloading
> - * bit 4: Command checksum
> - * bit 3: Flash protection error
> - * bit 2: Flash checksum error
> - * bit 1 - 0: Reserved
> - */
> -#define REG_BL_ERROR 0x02
> -#define BL_ERROR_INVALID 0x80
> -#define BL_ERROR_INVALID_KEY 0x40
> -#define BL_ERROR_BOOTLOADING 0x20
> -#define BL_ERROR_CMD_CSUM 0x10
> -#define BL_ERROR_FLASH_PROT 0x08
> -#define BL_ERROR_FLASH_CSUM 0x04
> -
> -#define BL_STATUS_SIZE 3 /* length of bootloader status registers */
> -#define BLK_HEAD_BYTES 32
> -
> -#define PRODUCT_ID_SIZE 16
> -#define QUERY_DATA_SIZE 27
> -#define REG_PROTOCOL_GEN_QUERY_OFFSET 20
> -
> -#define REG_OFFSET_DATA_BASE 0x0000
> -#define REG_OFFSET_COMMAND_BASE 0x0028
> -#define REG_OFFSET_QUERY_BASE 0x002a
> -
> -#define CAPABILITY_LEFT_BTN_MASK (0x01 << 3)
> -#define CAPABILITY_RIGHT_BTN_MASK (0x01 << 4)
> -#define CAPABILITY_MIDDLE_BTN_MASK (0x01 << 5)
> -#define CAPABILITY_BTN_MASK (CAPABILITY_LEFT_BTN_MASK | \
> - CAPABILITY_RIGHT_BTN_MASK | \
> - CAPABILITY_MIDDLE_BTN_MASK)
> -
> -#define CYAPA_OFFSET_SOFT_RESET REG_OFFSET_COMMAND_BASE
> -
> -#define REG_OFFSET_POWER_MODE (REG_OFFSET_COMMAND_BASE + 1)
> -
> -#define PWR_MODE_MASK 0xfc
> -#define PWR_MODE_FULL_ACTIVE (0x3f << 2)
> -#define PWR_MODE_IDLE (0x05 << 2) /* default sleep time is 50 ms. */
> -#define PWR_MODE_OFF (0x00 << 2)
> -
> -#define PWR_STATUS_MASK 0x0c
> -#define PWR_STATUS_ACTIVE (0x03 << 2)
> -#define PWR_STATUS_IDLE (0x02 << 2)
> -#define PWR_STATUS_OFF (0x00 << 2)
> -
> -/*
> - * CYAPA trackpad device states.
> - * Used in register 0x00, bit1-0, DeviceStatus field.
> - * Other values indicate device is in an abnormal state and must be reset.
> - */
> -#define CYAPA_DEV_NORMAL 0x03
> -#define CYAPA_DEV_BUSY 0x01
> -
> -enum cyapa_state {
> - CYAPA_STATE_OP,
> - CYAPA_STATE_BL_IDLE,
> - CYAPA_STATE_BL_ACTIVE,
> - CYAPA_STATE_BL_BUSY,
> - CYAPA_STATE_NO_DEVICE,
> -};
> -
> -
> -struct cyapa_touch {
> - /*
> - * high bits or x/y position value
> - * bit 7 - 4: high 4 bits of x position value
> - * bit 3 - 0: high 4 bits of y position value
> - */
> - u8 xy_hi;
> - u8 x_lo; /* low 8 bits of x position value. */
> - u8 y_lo; /* low 8 bits of y position value. */
> - u8 pressure;
> - /* id range is 1 - 15. It is incremented with every new touch. */
> - u8 id;
> -} __packed;
> -
> -/* The touch.id is used as the MT slot id, thus max MT slot is 15 */
> -#define CYAPA_MAX_MT_SLOTS 15
> -
> -struct cyapa_reg_data {
> - /*
> - * bit 0 - 1: device status
> - * bit 3 - 2: power mode
> - * bit 6 - 4: reserved
> - * bit 7: interrupt valid bit
> - */
> - u8 device_status;
> - /*
> - * bit 7 - 4: number of fingers currently touching pad
> - * bit 3: valid data check bit
> - * bit 2: middle mechanism button state if exists
> - * bit 1: right mechanism button state if exists
> - * bit 0: left mechanism button state if exists
> - */
> - u8 finger_btn;
> - /* CYAPA reports up to 5 touches per packet. */
> - struct cyapa_touch touches[5];
> -} __packed;
> -
> -/* The main device structure */
> -struct cyapa {
> - enum cyapa_state state;
> -
> - struct i2c_client *client;
> - struct input_dev *input;
> - char phys[32]; /* device physical location */
> - int irq;
> - bool irq_wake; /* irq wake is enabled */
> - bool smbus;
> -
> - /* read from query data region. */
> - char product_id[16];
> - u8 btn_capability;
> - u8 gen;
> - int max_abs_x;
> - int max_abs_y;
> - int physical_size_x;
> - int physical_size_y;
> -};
> -
> -static const u8 bl_deactivate[] = { 0x00, 0xff, 0x3b, 0x00, 0x01, 0x02, 0x03,
> - 0x04, 0x05, 0x06, 0x07 };
> -static const u8 bl_exit[] = { 0x00, 0xff, 0xa5, 0x00, 0x01, 0x02, 0x03, 0x04,
> - 0x05, 0x06, 0x07 };
> -
> -struct cyapa_cmd_len {
> - u8 cmd;
> - u8 len;
> -};
>
> #define CYAPA_ADAPTER_FUNC_NONE 0
> #define CYAPA_ADAPTER_FUNC_I2C 1
> #define CYAPA_ADAPTER_FUNC_SMBUS 2
> #define CYAPA_ADAPTER_FUNC_BOTH 3
>
> -/*
> - * macros for SMBus communication
> - */
> -#define SMBUS_READ 0x01
> -#define SMBUS_WRITE 0x00
> -#define SMBUS_ENCODE_IDX(cmd, idx) ((cmd) | (((idx) & 0x03) << 1))
> -#define SMBUS_ENCODE_RW(cmd, rw) ((cmd) | ((rw) & 0x01))
> -#define SMBUS_BYTE_BLOCK_CMD_MASK 0x80
> -#define SMBUS_GROUP_BLOCK_CMD_MASK 0x40
> -
> - /* for byte read/write command */
> -#define CMD_RESET 0
> -#define CMD_POWER_MODE 1
> -#define CMD_DEV_STATUS 2
> -#define SMBUS_BYTE_CMD(cmd) (((cmd) & 0x3f) << 1)
> -#define CYAPA_SMBUS_RESET SMBUS_BYTE_CMD(CMD_RESET)
> -#define CYAPA_SMBUS_POWER_MODE SMBUS_BYTE_CMD(CMD_POWER_MODE)
> -#define CYAPA_SMBUS_DEV_STATUS SMBUS_BYTE_CMD(CMD_DEV_STATUS)
> -
> - /* for group registers read/write command */
> -#define REG_GROUP_DATA 0
> -#define REG_GROUP_CMD 2
> -#define REG_GROUP_QUERY 3
> -#define SMBUS_GROUP_CMD(grp) (0x80 | (((grp) & 0x07) << 3))
> -#define CYAPA_SMBUS_GROUP_DATA SMBUS_GROUP_CMD(REG_GROUP_DATA)
> -#define CYAPA_SMBUS_GROUP_CMD SMBUS_GROUP_CMD(REG_GROUP_CMD)
> -#define CYAPA_SMBUS_GROUP_QUERY SMBUS_GROUP_CMD(REG_GROUP_QUERY)
> -
> - /* for register block read/write command */
> -#define CMD_BL_STATUS 0
> -#define CMD_BL_HEAD 1
> -#define CMD_BL_CMD 2
> -#define CMD_BL_DATA 3
> -#define CMD_BL_ALL 4
> -#define CMD_BLK_PRODUCT_ID 5
> -#define CMD_BLK_HEAD 6
> -#define SMBUS_BLOCK_CMD(cmd) (0xc0 | (((cmd) & 0x1f) << 1))
> -
> -/* register block read/write command in bootloader mode */
> -#define CYAPA_SMBUS_BL_STATUS SMBUS_BLOCK_CMD(CMD_BL_STATUS)
> -#define CYAPA_SMBUS_BL_HEAD SMBUS_BLOCK_CMD(CMD_BL_HEAD)
> -#define CYAPA_SMBUS_BL_CMD SMBUS_BLOCK_CMD(CMD_BL_CMD)
> -#define CYAPA_SMBUS_BL_DATA SMBUS_BLOCK_CMD(CMD_BL_DATA)
> -#define CYAPA_SMBUS_BL_ALL SMBUS_BLOCK_CMD(CMD_BL_ALL)
> -
> -/* register block read/write command in operational mode */
> -#define CYAPA_SMBUS_BLK_PRODUCT_ID SMBUS_BLOCK_CMD(CMD_BLK_PRODUCT_ID)
> -#define CYAPA_SMBUS_BLK_HEAD SMBUS_BLOCK_CMD(CMD_BLK_HEAD)
> -
> -static const struct cyapa_cmd_len cyapa_i2c_cmds[] = {
> - { CYAPA_OFFSET_SOFT_RESET, 1 },
> - { REG_OFFSET_COMMAND_BASE + 1, 1 },
> - { REG_OFFSET_DATA_BASE, 1 },
> - { REG_OFFSET_DATA_BASE, sizeof(struct cyapa_reg_data) },
> - { REG_OFFSET_COMMAND_BASE, 0 },
> - { REG_OFFSET_QUERY_BASE, QUERY_DATA_SIZE },
> - { BL_HEAD_OFFSET, 3 },
> - { BL_HEAD_OFFSET, 16 },
> - { BL_HEAD_OFFSET, 16 },
> - { BL_DATA_OFFSET, 16 },
> - { BL_HEAD_OFFSET, 32 },
> - { REG_OFFSET_QUERY_BASE, PRODUCT_ID_SIZE },
> - { REG_OFFSET_DATA_BASE, 32 }
> -};
> +#define CYAPA_DEBUGFS_READ_FW "read_fw"
> +#define CYAPA_DEBUGFS_RAW_DATA "raw_data"
> +#define CYAPA_FW_NAME "cyapa.bin"
These do not seem to belong to the current patch, please introduce them
only when you need them.
> +
> +const char unique_str[] = "CYTRA";
>
> -static const struct cyapa_cmd_len cyapa_smbus_cmds[] = {
> - { CYAPA_SMBUS_RESET, 1 },
> - { CYAPA_SMBUS_POWER_MODE, 1 },
> - { CYAPA_SMBUS_DEV_STATUS, 1 },
> - { CYAPA_SMBUS_GROUP_DATA, sizeof(struct cyapa_reg_data) },
> - { CYAPA_SMBUS_GROUP_CMD, 2 },
> - { CYAPA_SMBUS_GROUP_QUERY, QUERY_DATA_SIZE },
> - { CYAPA_SMBUS_BL_STATUS, 3 },
> - { CYAPA_SMBUS_BL_HEAD, 16 },
> - { CYAPA_SMBUS_BL_CMD, 16 },
> - { CYAPA_SMBUS_BL_DATA, 16 },
> - { CYAPA_SMBUS_BL_ALL, 32 },
> - { CYAPA_SMBUS_BLK_PRODUCT_ID, PRODUCT_ID_SIZE },
> - { CYAPA_SMBUS_BLK_HEAD, 16 },
> -};
>
> -static ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len,
> +ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len,
> u8 *values)
> {
> return i2c_smbus_read_i2c_block_data(cyapa->client, reg, len, values);
> }
>
> -static ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg,
> +ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg,
> size_t len, const u8 *values)
> {
> return i2c_smbus_write_i2c_block_data(cyapa->client, reg, len, values);
> }
>
> -/*
> - * cyapa_smbus_read_block - perform smbus block read command
> - * @cyapa - private data structure of the driver
> - * @cmd - the properly encoded smbus command
> - * @len - expected length of smbus command result
> - * @values - buffer to store smbus command result
> - *
> - * Returns negative errno, else the number of bytes written.
> - *
> - * Note:
> - * In trackpad device, the memory block allocated for I2C register map
> - * is 256 bytes, so the max read block for I2C bus is 256 bytes.
> - */
> -static ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
> - u8 *values)
> -{
> - ssize_t ret;
> - u8 index;
> - u8 smbus_cmd;
> - u8 *buf;
> - struct i2c_client *client = cyapa->client;
> -
> - if (!(SMBUS_BYTE_BLOCK_CMD_MASK & cmd))
> - return -EINVAL;
> -
> - if (SMBUS_GROUP_BLOCK_CMD_MASK & cmd) {
> - /* read specific block registers command. */
> - smbus_cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
> - ret = i2c_smbus_read_block_data(client, smbus_cmd, values);
> - goto out;
> - }
> -
> - ret = 0;
> - for (index = 0; index * I2C_SMBUS_BLOCK_MAX < len; index++) {
> - smbus_cmd = SMBUS_ENCODE_IDX(cmd, index);
> - smbus_cmd = SMBUS_ENCODE_RW(smbus_cmd, SMBUS_READ);
> - buf = values + I2C_SMBUS_BLOCK_MAX * index;
> - ret = i2c_smbus_read_block_data(client, smbus_cmd, buf);
> - if (ret < 0)
> - goto out;
> - }
> -
> -out:
> - return ret > 0 ? len : ret;
> -}
> -
> -static s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx)
> -{
> - u8 cmd;
> -
> - if (cyapa->smbus) {
> - cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> - cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
> - } else {
> - cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> - }
> - return i2c_smbus_read_byte_data(cyapa->client, cmd);
> -}
> -
> -static s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value)
> -{
> - u8 cmd;
> -
> - if (cyapa->smbus) {
> - cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> - cmd = SMBUS_ENCODE_RW(cmd, SMBUS_WRITE);
> - } else {
> - cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> - }
> - return i2c_smbus_write_byte_data(cyapa->client, cmd, value);
> -}
> -
> -static ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values)
> -{
> - u8 cmd;
> - size_t len;
> -
> - if (cyapa->smbus) {
> - cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> - len = cyapa_smbus_cmds[cmd_idx].len;
> - return cyapa_smbus_read_block(cyapa, cmd, len, values);
> - }
> -
> - cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> - len = cyapa_i2c_cmds[cmd_idx].len;
> - return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
> -}
> -
> -/*
> - * Query device for its current operating state.
> - *
> - */
> -static int cyapa_get_state(struct cyapa *cyapa)
> +/* Returns 0 on success, else negative errno on failure. */
> +ssize_t cyapa_i2c_read(struct cyapa *cyapa, u8 reg, size_t len,
> + u8 *values)
> {
> int ret;
> - u8 status[BL_STATUS_SIZE];
> -
> - cyapa->state = CYAPA_STATE_NO_DEVICE;
> -
> - /*
> - * Get trackpad status by reading 3 registers starting from 0.
> - * If the device is in the bootloader, this will be BL_HEAD.
> - * If the device is in operation mode, this will be the DATA regs.
> - *
> - */
> - ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE,
> - status);
> -
> - /*
> - * On smbus systems in OP mode, the i2c_reg_read will fail with
> - * -ETIMEDOUT. In this case, try again using the smbus equivalent
> - * command. This should return a BL_HEAD indicating CYAPA_STATE_OP.
> - */
> - if (cyapa->smbus && (ret == -ETIMEDOUT || ret == -ENXIO))
> - ret = cyapa_read_block(cyapa, CYAPA_CMD_BL_STATUS, status);
> -
> - if (ret != BL_STATUS_SIZE)
> - goto error;
> -
> - if ((status[REG_OP_STATUS] & OP_STATUS_SRC) == OP_STATUS_SRC) {
> - switch (status[REG_OP_STATUS] & OP_STATUS_DEV) {
> - case CYAPA_DEV_NORMAL:
> - case CYAPA_DEV_BUSY:
> - cyapa->state = CYAPA_STATE_OP;
> - break;
> - default:
> - ret = -EAGAIN;
> - goto error;
> - }
> - } else {
> - if (status[REG_BL_STATUS] & BL_STATUS_BUSY)
> - cyapa->state = CYAPA_STATE_BL_BUSY;
> - else if (status[REG_BL_ERROR] & BL_ERROR_BOOTLOADING)
> - cyapa->state = CYAPA_STATE_BL_ACTIVE;
> - else
> - cyapa->state = CYAPA_STATE_BL_IDLE;
> - }
> + struct i2c_client *client = cyapa->client;
> + struct i2c_msg msgs[] = {
> + {
> + .addr = client->addr,
> + .flags = 0,
> + .len = 1,
> + .buf = ®,
> + },
> + {
> + .addr = client->addr,
> + .flags = I2C_M_RD,
> + .len = len,
> + .buf = values,
> + },
> + };
> +
> + ret = i2c_transfer(client->adapter, msgs, 2);
> +
> + if (ret != ARRAY_SIZE(msgs))
> + return ret < 0 ? ret : -EIO;
>
> return 0;
> -error:
> - return (ret < 0) ? ret : -EAGAIN;
> }
>
> -/*
> - * Poll device for its status in a loop, waiting up to timeout for a response.
> - *
> - * When the device switches state, it usually takes ~300 ms.
> - * However, when running a new firmware image, the device must calibrate its
> - * sensors, which can take as long as 2 seconds.
> +/**
> + * cyapa_i2c_write - Execute i2c block data write operation
> + * @cyapa: Handle to this driver
> + * @ret: Offset of the data to written in the register map
> + * @len: number of bytes to write
> + * @values: Data to be written
> *
> - * Note: The timeout has granularity of the polling rate, which is 100 ms.
> - *
> - * Returns:
> - * 0 when the device eventually responds with a valid non-busy state.
> - * -ETIMEDOUT if device never responds (too many -EAGAIN)
> - * < 0 other errors
> + * Return negative errno code on error; return zero when success.
> */
> -static int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout)
> +ssize_t cyapa_i2c_write(struct cyapa *cyapa, u8 reg,
> + size_t len, const void *values)
> {
> int ret;
> - int tries = timeout / 100;
> -
> - ret = cyapa_get_state(cyapa);
> - while ((ret || cyapa->state >= CYAPA_STATE_BL_BUSY) && tries--) {
> - msleep(100);
> - ret = cyapa_get_state(cyapa);
> - }
> - return (ret == -EAGAIN || ret == -ETIMEDOUT) ? -ETIMEDOUT : ret;
> -}
> -
> -static int cyapa_bl_deactivate(struct cyapa *cyapa)
> -{
> - int ret;
> -
> - ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_deactivate),
> - bl_deactivate);
> - if (ret < 0)
> - return ret;
> -
> - /* wait for bootloader to switch to idle state; should take < 100ms */
> - msleep(100);
> - ret = cyapa_poll_state(cyapa, 500);
> - if (ret < 0)
> - return ret;
> - if (cyapa->state != CYAPA_STATE_BL_IDLE)
> - return -EAGAIN;
> - return 0;
> + struct i2c_client *client = cyapa->client;
> + char data[32], *buf;
> +
> + if (len > 31) {
> + buf = kzalloc(len + 1, GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> + } else
> + buf = data;
> +
> + buf[0] = reg;
> + memcpy(&buf[1], values, len);
> + ret = i2c_master_send(client, buf, len + 1);
> +
> + if (buf != data)
> + kfree(buf);
> + return (ret == (len + 1)) ? 0 : ((ret < 0) ? ret : -EIO);
> }
>
> -/*
> - * Exit bootloader
> - *
> - * Send bl_exit command, then wait 50 - 100 ms to let device transition to
> - * operational mode. If this is the first time the device's firmware is
> - * running, it can take up to 2 seconds to calibrate its sensors. So, poll
> - * the device's new state for up to 2 seconds.
> - *
> - * Returns:
> - * -EIO failure while reading from device
> - * -EAGAIN device is stuck in bootloader, b/c it has invalid firmware
> - * 0 device is supported and in operational mode
> - */
> -static int cyapa_bl_exit(struct cyapa *cyapa)
> +static u8 cyapa_check_adapter_functionality(struct i2c_client *client)
> {
> - int ret;
> -
> - ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_exit), bl_exit);
> - if (ret < 0)
> - return ret;
> -
> - /*
> - * Wait for bootloader to exit, and operation mode to start.
> - * Normally, this takes at least 50 ms.
> - */
> - usleep_range(50000, 100000);
> - /*
> - * In addition, when a device boots for the first time after being
> - * updated to new firmware, it must first calibrate its sensors, which
> - * can take up to an additional 2 seconds.
> - */
> - ret = cyapa_poll_state(cyapa, 2000);
> - if (ret < 0)
> - return ret;
> - if (cyapa->state != CYAPA_STATE_OP)
> - return -EAGAIN;
> + u8 ret = CYAPA_ADAPTER_FUNC_NONE;
>
> - return 0;
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
> + ret |= CYAPA_ADAPTER_FUNC_I2C;
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> + I2C_FUNC_SMBUS_BLOCK_DATA |
> + I2C_FUNC_SMBUS_I2C_BLOCK))
> + ret |= CYAPA_ADAPTER_FUNC_SMBUS;
> + return ret;
> }
>
> -/*
> - * Set device power mode
> - *
> - */
> -static int cyapa_set_power_mode(struct cyapa *cyapa, u8 power_mode)
> +static int cyapa_create_input_dev(struct cyapa *cyapa)
> {
> struct device *dev = &cyapa->client->dev;
> int ret;
> - u8 power;
> + struct input_dev *input;
>
> - if (cyapa->state != CYAPA_STATE_OP)
> - return 0;
> + if (!cyapa->physical_size_x || !cyapa->physical_size_y)
> + return -EINVAL;
>
> - ret = cyapa_read_byte(cyapa, CYAPA_CMD_POWER_MODE);
> - if (ret < 0)
> - return ret;
> + input = cyapa->input = devm_input_allocate_device(dev);
> + if (!input) {
> + dev_err(dev, "failed to allocate memory for input device.\n");
> + return -ENOMEM;
> + }
>
> - power = ret & ~PWR_MODE_MASK;
> - power |= power_mode & PWR_MODE_MASK;
> - ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
> - if (ret < 0)
> - dev_err(dev, "failed to set power_mode 0x%02x err = %d\n",
> - power_mode, ret);
> - return ret;
> -}
> + input->name = CYAPA_NAME;
> + input->phys = cyapa->phys;
> + input->id.bustype = BUS_I2C;
> + input->id.version = 1;
> + input->id.product = 0; /* Means any product in eventcomm. */
> + input->dev.parent = &cyapa->client->dev;
>
> -static int cyapa_get_query_data(struct cyapa *cyapa)
> -{
> - u8 query_data[QUERY_DATA_SIZE];
> - int ret;
> + input_set_drvdata(input, cyapa);
>
> - if (cyapa->state != CYAPA_STATE_OP)
> - return -EBUSY;
> + __set_bit(EV_ABS, input->evbit);
>
> - ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_QUERY, query_data);
> - if (ret < 0)
> - return ret;
> - if (ret != QUERY_DATA_SIZE)
> - return -EIO;
> + /* Finger position */
> + input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0,
> + 0);
> + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0,
> + 0);
> + input_set_abs_params(input, ABS_MT_PRESSURE, 0, cyapa->max_z, 0, 0);
> + if (cyapa->gen > CYAPA_GEN3) {
> + input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
> + input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0);
> + /*
> + * Orientation is the angle between the vertical axis and
> + * the major axis of the contact ellipse.
> + * The range is -127 to 127.
> + * the positive direction is clockwise form the vertical axis.
> + * If the ellipse of contact degenerates into a circle,
> + * orientation is reported as 0.
> + *
> + * Also, for Gen5 trackpad the accurate of this orientation
> + * value is value + (-30 ~ 30).
> + */
> + input_set_abs_params(input, ABS_MT_ORIENTATION,
> + -127, 127, 0, 0);
> + }
> + if (cyapa->gen >= CYAPA_GEN5) {
> + input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
> + input_set_abs_params(input, ABS_MT_WIDTH_MINOR, 0, 255, 0, 0);
> + }
>
> - memcpy(&cyapa->product_id[0], &query_data[0], 5);
> - cyapa->product_id[5] = '-';
> - memcpy(&cyapa->product_id[6], &query_data[5], 6);
> - cyapa->product_id[12] = '-';
> - memcpy(&cyapa->product_id[13], &query_data[11], 2);
> - cyapa->product_id[15] = '\0';
> + input_abs_set_res(input, ABS_MT_POSITION_X,
> + cyapa->max_abs_x / cyapa->physical_size_x);
> + input_abs_set_res(input, ABS_MT_POSITION_Y,
> + cyapa->max_abs_y / cyapa->physical_size_y);
>
> - cyapa->btn_capability = query_data[19] & CAPABILITY_BTN_MASK;
> + if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK)
> + __set_bit(BTN_LEFT, input->keybit);
> + if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK)
> + __set_bit(BTN_MIDDLE, input->keybit);
> + if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK)
> + __set_bit(BTN_RIGHT, input->keybit);
>
> - cyapa->gen = query_data[20] & 0x0f;
> + if (cyapa->btn_capability == CAPABILITY_LEFT_BTN_MASK)
> + __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
>
> - cyapa->max_abs_x = ((query_data[21] & 0xf0) << 4) | query_data[22];
> - cyapa->max_abs_y = ((query_data[21] & 0x0f) << 8) | query_data[23];
> + /* Handle pointer emulation and unused slots in core */
> + ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
> + INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
> + if (ret) {
> + dev_err(dev, "failed to initialize MT slots, %d\n", ret);
> + return ret;
> + }
>
> - cyapa->physical_size_x =
> - ((query_data[24] & 0xf0) << 4) | query_data[25];
> - cyapa->physical_size_y =
> - ((query_data[24] & 0x0f) << 8) | query_data[26];
> + /* Register the device in input subsystem */
> + ret = input_register_device(input);
> + if (ret) {
> + dev_err(dev, "failed to register input device, %d\n", ret);
> + return ret;
> + }
>
> return 0;
> }
> @@ -635,192 +227,213 @@ static int cyapa_get_query_data(struct cyapa *cyapa)
> */
> static int cyapa_check_is_operational(struct cyapa *cyapa)
> {
> - struct device *dev = &cyapa->client->dev;
> - static const char unique_str[] = "CYTRA";
> int ret;
>
> - ret = cyapa_poll_state(cyapa, 2000);
> - if (ret < 0)
> + ret = cyapa_poll_state(cyapa, 4000);
> + if (ret)
> return ret;
> - switch (cyapa->state) {
> - case CYAPA_STATE_BL_ACTIVE:
> - ret = cyapa_bl_deactivate(cyapa);
> - if (ret)
> - return ret;
> -
> - /* Fallthrough state */
> - case CYAPA_STATE_BL_IDLE:
> - ret = cyapa_bl_exit(cyapa);
> - if (ret)
> - return ret;
> -
> - /* Fallthrough state */
> - case CYAPA_STATE_OP:
> - ret = cyapa_get_query_data(cyapa);
> - if (ret < 0)
> - return ret;
> -
> - /* only support firmware protocol gen3 */
> - if (cyapa->gen != CYAPA_GEN3) {
> - dev_err(dev, "unsupported protocol version (%d)",
> - cyapa->gen);
> - return -EINVAL;
> - }
> -
> - /* only support product ID starting with CYTRA */
> - if (memcmp(cyapa->product_id, unique_str,
> - sizeof(unique_str) - 1) != 0) {
> - dev_err(dev, "unsupported product ID (%s)\n",
> - cyapa->product_id);
> - return -EINVAL;
> - }
> - return 0;
>
> + switch (cyapa->gen) {
> default:
> - return -EIO;
> + return -ENODEV;
> }
> - return 0;
> +
> + if (cyapa->ops->operational_check)
> + ret = cyapa->ops->operational_check(cyapa);
> +
> + return ret;
> }
>
> +
> static irqreturn_t cyapa_irq(int irq, void *dev_id)
> {
> struct cyapa *cyapa = dev_id;
> struct device *dev = &cyapa->client->dev;
> struct input_dev *input = cyapa->input;
> - struct cyapa_reg_data data;
> - int i;
> + bool cont;
> int ret;
> - int num_fingers;
>
> if (device_may_wakeup(dev))
> pm_wakeup_event(dev, 0);
>
> - ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data);
> - if (ret != sizeof(data))
> - goto out;
> -
> - if ((data.device_status & OP_STATUS_SRC) != OP_STATUS_SRC ||
> - (data.device_status & OP_STATUS_DEV) != CYAPA_DEV_NORMAL ||
> - (data.finger_btn & OP_DATA_VALID) != OP_DATA_VALID) {
> - goto out;
> - }
> -
> - num_fingers = (data.finger_btn >> 4) & 0x0f;
> - for (i = 0; i < num_fingers; i++) {
> - const struct cyapa_touch *touch = &data.touches[i];
> - /* Note: touch->id range is 1 to 15; slots are 0 to 14. */
> - int slot = touch->id - 1;
> -
> - input_mt_slot(input, slot);
> - input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
> - input_report_abs(input, ABS_MT_POSITION_X,
> - ((touch->xy_hi & 0xf0) << 4) | touch->x_lo);
> - input_report_abs(input, ABS_MT_POSITION_Y,
> - ((touch->xy_hi & 0x0f) << 8) | touch->y_lo);
> - input_report_abs(input, ABS_MT_PRESSURE, touch->pressure);
> + /* Interrupt event maybe cuased by host command to trackpad device. */
> + cont = true;
> + if (cyapa->ops->irq_cmd_handler)
> + cont = cyapa->ops->irq_cmd_handler(cyapa);
> +
> + /* Interrupt event maybe from trackpad device input reporting. */
> + if (cont && cyapa->ops->irq_handler) {
> + if (!input || cyapa->ops->irq_handler(cyapa)) {
> + ret = mutex_lock_interruptible(&cyapa->state_sync_lock);
> + if (ret && cyapa->ops->sort_empty_output_data) {
> + cyapa->ops->sort_empty_output_data(cyapa,
> + NULL, NULL, NULL);
> + goto out;
> + }
> + cyapa_detect(cyapa);
> + mutex_unlock(&cyapa->state_sync_lock);
> + }
> }
>
> - input_mt_sync_frame(input);
> -
> - if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK)
> - input_report_key(input, BTN_LEFT,
> - data.finger_btn & OP_DATA_LEFT_BTN);
> -
> - if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK)
> - input_report_key(input, BTN_MIDDLE,
> - data.finger_btn & OP_DATA_MIDDLE_BTN);
> -
> - if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK)
> - input_report_key(input, BTN_RIGHT,
> - data.finger_btn & OP_DATA_RIGHT_BTN);
> -
> - input_sync(input);
> -
> out:
> return IRQ_HANDLED;
> }
>
> -static u8 cyapa_check_adapter_functionality(struct i2c_client *client)
> +/*
> + * Query device for its current operating state.
> + */
> +static int cyapa_get_state(struct cyapa *cyapa)
> {
> - u8 ret = CYAPA_ADAPTER_FUNC_NONE;
> + return -ENODEV;
> +}
>
> - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
> - ret |= CYAPA_ADAPTER_FUNC_I2C;
> - if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> - I2C_FUNC_SMBUS_BLOCK_DATA |
> - I2C_FUNC_SMBUS_I2C_BLOCK))
> - ret |= CYAPA_ADAPTER_FUNC_SMBUS;
> - return ret;
> +/*
> + * Poll device for its status in a loop, waiting up to timeout for a response.
> + *
> + * When the device switches state, it usually takes ~300 ms.
> + * However, when running a new firmware image, the device must calibrate its
> + * sensors, which can take as long as 2 seconds.
> + *
> + * Note: The timeout has granularity of the polling rate, which is 100 ms.
> + *
> + * Returns:
> + * 0 when the device eventually responds with a valid non-busy state.
> + * -ETIMEDOUT if device never responds (too many -EAGAIN)
> + * < 0 other errors
> + */
> +int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout)
> +{
> + int ret;
> + int tries = timeout / 100;
> +
> + ret = cyapa_get_state(cyapa);
> + while ((ret || cyapa->state <= CYAPA_STATE_BL_BUSY) && tries--) {
> + msleep(100);
> + ret = cyapa_get_state(cyapa);
> + }
> +
> + return (ret == -EAGAIN || ret == -ETIMEDOUT) ? -ETIMEDOUT : ret;
> }
>
> -static int cyapa_create_input_dev(struct cyapa *cyapa)
> +/*
> + * Returns:
> + * 0 when device is detected, and operatioinal.
> + * > 0 when device is detected, but not operational.
> + * < 0 when device is not detected, or other errors.
> + * e.g.: IO communication error with the device.
> + */
> +int cyapa_detect(struct cyapa *cyapa)
We have cyapa->state. Can we check it to see if device is operational or
not? Or introduce another variable instead of returning tristate from
cyapa_detect?
> {
> struct device *dev = &cyapa->client->dev;
> + char *envp[2] = {"ERROR=1", NULL};
> int ret;
> - struct input_dev *input;
>
> - if (!cyapa->physical_size_x || !cyapa->physical_size_y)
> - return -EINVAL;
> + ret = cyapa_check_is_operational(cyapa);
> + if (ret) {
> + if (ret != -ETIMEDOUT && ret != -ENODEV &&
> + ((cyapa->gen == CYAPA_GEN3 &&
> + cyapa->state >= CYAPA_STATE_BL_BUSY &&
> + cyapa->state <= CYAPA_STATE_BL_ACTIVE) ||
> + (cyapa->gen == CYAPA_GEN5 &&
> + cyapa->state == CYAPA_STATE_GEN5_BL))) {
> + dev_warn(dev, "device detected, but no operatinal.\n");
> + dev_warn(dev, "device gen=%d, state=0x%02x\n",
> + cyapa->gen, cyapa->state);
> + dev_warn(dev, "munually fw image recover required.\n");
> + return 1;
Hmm, what userspace uses this kind of notification?
> + }
>
> - input = cyapa->input = devm_input_allocate_device(dev);
> - if (!input) {
> - dev_err(dev, "allocate memory for input device failed\n");
> - return -ENOMEM;
> + dev_err(dev, "no device detected, (%d)\n", ret);
> + kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
> + return ret;
> }
>
> - input->name = CYAPA_NAME;
> - input->phys = cyapa->phys;
> - input->id.bustype = BUS_I2C;
> - input->id.version = 1;
> - input->id.product = 0; /* means any product in eventcomm. */
> - input->dev.parent = &cyapa->client->dev;
> + if (!cyapa->input) {
> + ret = cyapa_create_input_dev(cyapa);
> + if (ret) {
> + dev_err(dev, "create input_dev instance failed, (%d)\n",
> + ret);
> + return ret;
> + }
>
> - input_set_drvdata(input, cyapa);
> + /*
> + * On some systems, a system crash / warm boot does not reset
> + * the device's current power mode to FULL_ACTIVE.
> + * If such an event happens during suspend, after the device
> + * has been put in a low power mode, the device will still be
> + * in low power mode on a subsequent boot, since there was
> + * never a matching resume().
> + * Handle this by always forcing full power here, when a
> + * device is first detected to be in operational mode.
> + */
> + if (cyapa->ops->set_power_mode) {
> + ret = cyapa->ops->set_power_mode(cyapa,
> + PWR_MODE_FULL_ACTIVE, 0);
> + if (ret)
> + dev_warn(dev, "set active power failed, (%d)\n",
> + ret);
> + }
> + }
>
> - __set_bit(EV_ABS, input->evbit);
> + return 0;
> +}
>
> - /* finger position */
> - input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0,
> - 0);
> - input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0,
> - 0);
> - input_set_abs_params(input, ABS_MT_PRESSURE, 0, 255, 0, 0);
> +/*
> + * Sysfs Interface.
> + */
>
> - input_abs_set_res(input, ABS_MT_POSITION_X,
> - cyapa->max_abs_x / cyapa->physical_size_x);
> - input_abs_set_res(input, ABS_MT_POSITION_Y,
> - cyapa->max_abs_y / cyapa->physical_size_y);
> +/*
> + * cyapa_sleep_time_to_pwr_cmd and cyapa_pwr_cmd_to_sleep_time
> + *
> + * These are helper functions that convert to and from integer idle
> + * times and register settings to write to the PowerMode register.
> + * The trackpad supports between 20ms to 1000ms scan intervals.
> + * The time will be increased in increments of 10ms from 20ms to 100ms.
> + * From 100ms to 1000ms, time will be increased in increments of 20ms.
> + *
> + * When Idle_Time < 100, the format to convert Idle_Time to Idle_Command is:
> + * Idle_Command = Idle Time / 10;
> + * When Idle_Time >= 100, the format to convert Idle_Time to Idle_Command is:
> + * Idle_Command = Idle Time / 20 + 5;
> + */
> +u8 cyapa_sleep_time_to_pwr_cmd(u16 sleep_time)
> +{
> + sleep_time = clamp_val(sleep_time, 20, 1000);
>
> - if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK)
> - __set_bit(BTN_LEFT, input->keybit);
> - if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK)
> - __set_bit(BTN_MIDDLE, input->keybit);
> - if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK)
> - __set_bit(BTN_RIGHT, input->keybit);
> + if (sleep_time < 100)
> + return ((sleep_time / 10) << 2) & PWR_MODE_MASK;
> + return ((sleep_time / 20 + 5) << 2) & PWR_MODE_MASK;
> +}
Maybe:
encoded_time = sleep_time < 100 ?
sleep_time / 10 : sleep_time / 20 + 5;
return (encode_time << 2) & PWR_MODE_MASK;
>
> - if (cyapa->btn_capability == CAPABILITY_LEFT_BTN_MASK)
> - __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
> +u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode)
> +{
> + u8 encoded_time = pwr_mode >> 2;
>
> - /* handle pointer emulation and unused slots in core */
> - ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS,
> - INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED);
> - if (ret) {
> - dev_err(dev, "allocate memory for MT slots failed, %d\n", ret);
> - goto err_free_device;
> - }
> + return (encoded_time < 10) ? encoded_time * 10
> + : (encoded_time - 5) * 20;
> +}
>
> - /* Register the device in input subsystem */
> - ret = input_register_device(input);
> - if (ret) {
> - dev_err(dev, "input device register failed, %d\n", ret);
> - goto err_free_device;
> - }
> - return 0;
> +/*
> + * Returns:
> + * 0 Driver and device initialization successfully done.
> + * > 0 Driver initialized and device is detected, but not operational yet.
> + * < 0 Device is not detected, or driver initialization failed.
> + */
> +static int cyapa_initialize(struct cyapa *cyapa)
> +{
> + cyapa->state = CYAPA_STATE_NO_DEVICE;
> + cyapa->gen = CYAPA_GEN_UNKNOWN;
> + mutex_init(&cyapa->state_sync_lock);
>
> -err_free_device:
> - input_free_device(input);
> - cyapa->input = NULL;
> - return ret;
> + /*
> + * Set to hard code default, they will be updated with trackpad set
> + * default values after probe and initialized.
> + */
> + cyapa->suspend_power_mode = PWR_MODE_SLEEP;
> + cyapa->suspend_sleep_time =
> + cyapa_pwr_cmd_to_sleep_time(cyapa->suspend_power_mode);
> +
> + return cyapa_detect(cyapa);
> }
>
> static int cyapa_probe(struct i2c_client *client,
> @@ -830,6 +443,7 @@ static int cyapa_probe(struct i2c_client *client,
> u8 adapter_func;
> struct cyapa *cyapa;
> struct device *dev = &client->dev;
> + union i2c_smbus_data dummy;
>
> adapter_func = cyapa_check_adapter_functionality(client);
> if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) {
> @@ -837,48 +451,39 @@ static int cyapa_probe(struct i2c_client *client,
> return -EIO;
> }
>
> + /* Make sure there is something at this address */
> + if (i2c_smbus_xfer(client->adapter, client->addr, 0,
> + I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &dummy) < 0)
> + return -ENODEV;
> +
> cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL);
> if (!cyapa)
> return -ENOMEM;
>
> - cyapa->gen = CYAPA_GEN3;
> - cyapa->client = client;
> - i2c_set_clientdata(client, cyapa);
> - sprintf(cyapa->phys, "i2c-%d-%04x/input0", client->adapter->nr,
> - client->addr);
> -
> /* i2c isn't supported, use smbus */
> if (adapter_func == CYAPA_ADAPTER_FUNC_SMBUS)
> cyapa->smbus = true;
> - cyapa->state = CYAPA_STATE_NO_DEVICE;
> - ret = cyapa_check_is_operational(cyapa);
> - if (ret) {
> - dev_err(dev, "device not operational, %d\n", ret);
> - return ret;
> - }
>
> - ret = cyapa_create_input_dev(cyapa);
> - if (ret) {
> - dev_err(dev, "create input_dev instance failed, %d\n", ret);
> - return ret;
> - }
> + cyapa->client = client;
> + i2c_set_clientdata(client, cyapa);
> + sprintf(cyapa->phys, "i2c-%d-%04x/input0", client->adapter->nr,
> + client->addr);
>
> - ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> - if (ret) {
> - dev_err(dev, "set active power failed, %d\n", ret);
> + ret = cyapa_initialize(cyapa);
> + if (ret < 0) {
> + dev_err(dev, "failed to detect and initialize tp device.\n");
> return ret;
> }
>
> - cyapa->irq = client->irq;
> ret = devm_request_threaded_irq(dev,
> - cyapa->irq,
> + client->irq,
> NULL,
> cyapa_irq,
> IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> "cyapa",
> cyapa);
> if (ret) {
> - dev_err(dev, "IRQ request failed: %d\n, ", ret);
> + dev_err(dev, "failed to request threaded irq, (%d)\n, ", ret);
> return ret;
> }
>
> @@ -889,8 +494,10 @@ static int cyapa_remove(struct i2c_client *client)
> {
> struct cyapa *cyapa = i2c_get_clientdata(client);
>
> - disable_irq(cyapa->irq);
> - cyapa_set_power_mode(cyapa, PWR_MODE_OFF);
> + disable_irq(cyapa->client->irq);
> +
> + if (cyapa->ops->set_power_mode)
> + cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0);
>
> return 0;
> }
> @@ -902,20 +509,38 @@ static int cyapa_suspend(struct device *dev)
> u8 power_mode;
> struct cyapa *cyapa = dev_get_drvdata(dev);
>
> - disable_irq(cyapa->irq);
> + ret = mutex_lock_interruptible(&cyapa->state_sync_lock);
> + if (ret) {
> + dev_err(dev, "suspend interrupted by signal, (%d)\n", ret);
> + return ret;
> + }
For patterns:
var = action();
if (var) {
.. error handling ...
return var;
}
return 0;
i.e. when value of 'var' ony used in error handling path I strongly
prefer to call 'var' error. If you do return value of 'var' in both
error and success paths then 'ret' or 'retval' are preferred names.
> +
> + /*
> + * Disable IRQ to avoid the command response interrupt cause system
> + * suspending process interrupted and failed.
> + * Because the gen5 devices will always assert interrupt to host after
> + * executed the set power mode command.
> + */
> + disable_irq(cyapa->client->irq);
>
> /*
> * Set trackpad device to idle mode if wakeup is allowed,
> * otherwise turn off.
> */
> - power_mode = device_may_wakeup(dev) ? PWR_MODE_IDLE
> + power_mode = device_may_wakeup(dev) ? cyapa->suspend_power_mode
> : PWR_MODE_OFF;
> - ret = cyapa_set_power_mode(cyapa, power_mode);
> - if (ret < 0)
> - dev_err(dev, "set power mode failed, %d\n", ret);
> + if (cyapa->input && cyapa->ops->set_power_mode) {
The gating on cyapa->input is not obvious. Should we check the device
status (or introduce one to indicate that the device in fully
initialized state). Also, instead of checking presence of various
methods I'd rather have providers supply stubs if they do not implement
something.
> + ret = cyapa->ops->set_power_mode(cyapa, power_mode,
> + cyapa->suspend_sleep_time);
> + if (ret < 0)
> + dev_err(dev, "suspend set power mode failed, %d\n",
> + ret);
> + }
>
> if (device_may_wakeup(dev))
> - cyapa->irq_wake = (enable_irq_wake(cyapa->irq) == 0);
> + cyapa->irq_wake = (enable_irq_wake(cyapa->client->irq) == 0);
> +
> + mutex_unlock(&cyapa->state_sync_lock);
> return 0;
> }
>
> @@ -924,19 +549,29 @@ static int cyapa_resume(struct device *dev)
> int ret;
> struct cyapa *cyapa = dev_get_drvdata(dev);
>
> - if (device_may_wakeup(dev) && cyapa->irq_wake)
> - disable_irq_wake(cyapa->irq);
> -
> - ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
> + ret = mutex_lock_interruptible(&cyapa->state_sync_lock);
> if (ret)
> - dev_warn(dev, "resume active power failed, %d\n", ret);
> + dev_err(dev, "resume interrupted by signal, (%d)\n", ret);
>
> - enable_irq(cyapa->irq);
> + if (cyapa->irq_wake) {
> + disable_irq_wake(cyapa->client->irq);
> + cyapa->irq_wake = false;
> + }
> +
> + /* Reset to active power state after re-detected. */
> + cyapa_detect(cyapa);
> +
> + enable_irq(cyapa->client->irq);
> +
> + if (!ret)
> + mutex_unlock(&cyapa->state_sync_lock);
> return 0;
> }
> #endif /* CONFIG_PM_SLEEP */
>
> -static SIMPLE_DEV_PM_OPS(cyapa_pm_ops, cyapa_suspend, cyapa_resume);
> +static const struct dev_pm_ops cyapa_pm_ops = {
> + SET_SYSTEM_SLEEP_PM_OPS(cyapa_suspend, cyapa_resume)
> +};
>
> static const struct i2c_device_id cyapa_id_table[] = {
> { "cyapa", 0 },
> diff --git a/drivers/input/mouse/cyapa.h b/drivers/input/mouse/cyapa.h
> new file mode 100644
> index 0000000..ee97d7c
> --- /dev/null
> +++ b/drivers/input/mouse/cyapa.h
> @@ -0,0 +1,321 @@
> +/*
> + * Cypress APA trackpad with I2C interface
> + *
> + * Author: Dudley Du <dudl@cypress.com>
> + *
> + * Copyright (C) 2014 Cypress Semiconductor, Inc.
> + *
> + * 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
> + * more details.
> + */
> +
> +#ifndef _CYAPA_H
> +#define _CYAPA_H
> +
> +#include <linux/async.h>
> +#include <linux/firmware.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/regulator/driver.h>
> +
> +/* APA trackpad firmware generation number. */
> +#define CYAPA_GEN_UNKNOWN 0x00 /* unknown protocol. */
> +#define CYAPA_GEN3 0x03 /* support MT-protocol B with tracking ID. */
> +#define CYAPA_GEN5 0x05 /* support TrueTouch GEN5 trackpad device. */
> +
> +#define CYAPA_NAME "Cypress APA Trackpad (cyapa)"
> +
> +/*
> + * Macros for SMBus communication
> + */
> +#define SMBUS_READ 0x01
> +#define SMBUS_WRITE 0x00
> +#define SMBUS_ENCODE_IDX(cmd, idx) ((cmd) | (((idx) & 0x03) << 1))
> +#define SMBUS_ENCODE_RW(cmd, rw) ((cmd) | ((rw) & 0x01))
> +#define SMBUS_BYTE_BLOCK_CMD_MASK 0x80
> +#define SMBUS_GROUP_BLOCK_CMD_MASK 0x40
> +
> +/* Commands for read/write registers of Cypress trackpad */
> +#define CYAPA_CMD_SOFT_RESET 0x00
> +#define CYAPA_CMD_POWER_MODE 0x01
> +#define CYAPA_CMD_DEV_STATUS 0x02
> +#define CYAPA_CMD_GROUP_DATA 0x03
> +#define CYAPA_CMD_GROUP_CMD 0x04
> +#define CYAPA_CMD_GROUP_QUERY 0x05
> +#define CYAPA_CMD_BL_STATUS 0x06
> +#define CYAPA_CMD_BL_HEAD 0x07
> +#define CYAPA_CMD_BL_CMD 0x08
> +#define CYAPA_CMD_BL_DATA 0x09
> +#define CYAPA_CMD_BL_ALL 0x0a
> +#define CYAPA_CMD_BLK_PRODUCT_ID 0x0b
> +#define CYAPA_CMD_BLK_HEAD 0x0c
> +#define CYAPA_CMD_MAX_BASELINE 0x0d
> +#define CYAPA_CMD_MIN_BASELINE 0x0e
> +
> +#define BL_HEAD_OFFSET 0x00
> +#define BL_DATA_OFFSET 0x10
> +
> +#define BL_STATUS_SIZE 3 /* Length of gen3 bootloader status registers */
> +#define CYAPA_REG_MAP_SIZE 256
> +
> +/*
> + * Gen3 Operational Device Status Register
> + *
> + * bit 7: Valid interrupt source
> + * bit 6 - 4: Reserved
> + * bit 3 - 2: Power status
> + * bit 1 - 0: Device status
> + */
> +#define REG_OP_STATUS 0x00
> +#define OP_STATUS_SRC 0x80
> +#define OP_STATUS_POWER 0x0c
> +#define OP_STATUS_DEV 0x03
> +#define OP_STATUS_MASK (OP_STATUS_SRC | OP_STATUS_POWER | OP_STATUS_DEV)
> +
> +/*
> + * Operational Finger Count/Button Flags Register
> + *
> + * bit 7 - 4: Number of touched finger
> + * bit 3: Valid data
> + * bit 2: Middle Physical Button
> + * bit 1: Right Physical Button
> + * bit 0: Left physical Button
> + */
> +#define REG_OP_DATA1 0x01
> +#define OP_DATA_VALID 0x08
> +#define OP_DATA_MIDDLE_BTN 0x04
> +#define OP_DATA_RIGHT_BTN 0x02
> +#define OP_DATA_LEFT_BTN 0x01
> +#define OP_DATA_BTN_MASK (OP_DATA_MIDDLE_BTN | OP_DATA_RIGHT_BTN | \
> + OP_DATA_LEFT_BTN)
> +
> +/*
> + * Write-only command file register used to issue commands and
> + * parameters to the bootloader.
> + * The default value read from it is always 0x00.
> + */
> +#define REG_BL_FILE 0x00
> +#define BL_FILE 0x00
> +
> +/*
> + * Bootloader Status Register
> + *
> + * bit 7: Busy
> + * bit 6 - 5: Reserved
> + * bit 4: Bootloader running
> + * bit 3 - 2: Reserved
> + * bit 1: Watchdog Reset
> + * bit 0: Checksum valid
> + */
> +#define REG_BL_STATUS 0x01
> +#define BL_STATUS_REV_6_5 0x60
> +#define BL_STATUS_BUSY 0x80
> +#define BL_STATUS_RUNNING 0x10
> +#define BL_STATUS_REV_3_2 0x0c
> +#define BL_STATUS_WATCHDOG 0x02
> +#define BL_STATUS_CSUM_VALID 0x01
> +#define BL_STATUS_REV_MASK (BL_STATUS_WATCHDOG | BL_STATUS_REV_3_2 | \
> + BL_STATUS_REV_6_5)
> +
> +/*
> + * Bootloader Error Register
> + *
> + * bit 7: Invalid
> + * bit 6: Invalid security key
> + * bit 5: Bootloading
> + * bit 4: Command checksum
> + * bit 3: Flash protection error
> + * bit 2: Flash checksum error
> + * bit 1 - 0: Reserved
> + */
> +#define REG_BL_ERROR 0x02
> +#define BL_ERROR_INVALID 0x80
> +#define BL_ERROR_INVALID_KEY 0x40
> +#define BL_ERROR_BOOTLOADING 0x20
> +#define BL_ERROR_CMD_CSUM 0x10
> +#define BL_ERROR_FLASH_PROT 0x08
> +#define BL_ERROR_FLASH_CSUM 0x04
> +#define BL_ERROR_RESERVED 0x03
> +#define BL_ERROR_NO_ERR_IDLE 0x00
> +#define BL_ERROR_NO_ERR_ACTIVE (BL_ERROR_BOOTLOADING)
> +
> +#define CAPABILITY_BTN_SHIFT 3
> +#define CAPABILITY_LEFT_BTN_MASK (0x01 << 3)
> +#define CAPABILITY_RIGHT_BTN_MASK (0x01 << 4)
> +#define CAPABILITY_MIDDLE_BTN_MASK (0x01 << 5)
> +#define CAPABILITY_BTN_MASK (CAPABILITY_LEFT_BTN_MASK | \
> + CAPABILITY_RIGHT_BTN_MASK | \
> + CAPABILITY_MIDDLE_BTN_MASK)
> +
> +#define PWR_MODE_MASK 0xfc
> +#define PWR_MODE_FULL_ACTIVE (0x3f << 2)
> +#define PWR_MODE_IDLE (0x03 << 2) /* Default rt suspend scanrate: 30ms */
> +#define PWR_MODE_SLEEP (0x05 << 2) /* Default suspend scanrate: 50ms */
> +#define PWR_MODE_BTN_ONLY (0x01 << 2)
> +#define PWR_MODE_OFF (0x00 << 2)
> +
> +#define PWR_STATUS_MASK 0x0c
> +#define PWR_STATUS_ACTIVE (0x03 << 2)
> +#define PWR_STATUS_IDLE (0x02 << 2)
> +#define PWR_STATUS_BTN_ONLY (0x01 << 2)
> +#define PWR_STATUS_OFF (0x00 << 2)
> +
> +#define AUTOSUSPEND_DELAY 2000 /* unit : ms */
> +
> +#define UNINIT_SLEEP_TIME 0xFFFF
> +#define UNINIT_PWR_MODE 0xFF
> +
> +#define BTN_ONLY_MODE_NAME "buttononly"
> +#define OFF_MODE_NAME "off"
> +
> +/* The touch.id is used as the MT slot id, thus max MT slot is 15 */
> +#define CYAPA_MAX_MT_SLOTS 15
> +
> +struct cyapa;
> +
> +typedef bool (*cb_sort)(struct cyapa *, u8 *, int);
> +
> +struct cyapa_dev_ops {
> + int (*check_fw)(struct cyapa *, const struct firmware *);
> + int (*bl_enter)(struct cyapa *);
> + int (*bl_activate)(struct cyapa *);
> + int (*bl_initiate)(struct cyapa *, const struct firmware *);
> + int (*update_fw)(struct cyapa *, const struct firmware *);
> + int (*bl_verify_app_integrity)(struct cyapa *);
> + int (*bl_deactivate)(struct cyapa *);
> +
> + ssize_t (*show_baseline)(struct device *,
> + struct device_attribute *, char *);
> + ssize_t (*calibrate_store)(struct device *,
> + struct device_attribute *, const char *, size_t);
> +
> + int (*initialize)(struct cyapa *cyapa);
> +
> + int (*state_parse)(struct cyapa *cyapa, u8 *reg_status, int len);
> + int (*operational_check)(struct cyapa *cyapa);
> +
> + int (*irq_handler)(struct cyapa *);
> + bool (*irq_cmd_handler)(struct cyapa *);
> + int (*sort_empty_output_data)(struct cyapa *,
> + u8 *, int *, cb_sort);
> +
> + int (*set_power_mode)(struct cyapa *, u8, u16);
> +};
> +
> +struct cyapa_gen5_cmd_states {
> + struct mutex cmd_lock;
> + struct completion cmd_ready;
> + atomic_t cmd_issued;
> + u8 in_progress_cmd;
> + bool is_irq_mode;
> +
> + cb_sort resp_sort_func;
> + u8 *resp_data;
> + int *resp_len;
> +
> + u8 irq_cmd_buf[CYAPA_REG_MAP_SIZE];
> + u8 empty_buf[CYAPA_REG_MAP_SIZE];
> +};
> +
> +union cyapa_cmd_states {
> + struct cyapa_gen5_cmd_states gen5;
> +};
> +
> +enum cyapa_state {
> + CYAPA_STATE_NO_DEVICE,
> + CYAPA_STATE_BL_BUSY,
> + CYAPA_STATE_BL_IDLE,
> + CYAPA_STATE_BL_ACTIVE,
> + CYAPA_STATE_OP,
> + CYAPA_STATE_GEN5_BL,
> + CYAPA_STATE_GEN5_APP,
> +};
> +
> +struct cyapa_tsg_bin_image_head {
> + u8 head_size; /* Unit: bytes, including itself. */
> + u8 ttda_driver_major_version; /* Reserved as 0. */
> + u8 ttda_driver_minor_version; /* Reserved as 0. */
> + u8 fw_major_version;
> + u8 fw_minor_version;
> + u8 fw_revision_control_number[8];
> +} __packed;
> +
> +/* The main device structure */
> +struct cyapa {
> + enum cyapa_state state;
> + u8 status[BL_STATUS_SIZE];
> +
> + struct i2c_client *client;
> + struct input_dev *input;
> + char phys[32]; /* Device physical location */
> + bool irq_wake; /* Irq wake is enabled */
> + bool smbus;
> +
> + /* power mode settings */
> + u8 suspend_power_mode;
> + u16 suspend_sleep_time;
> +#ifdef CONFIG_PM_RUNTIME
> + u8 runtime_suspend_power_mode;
> + u16 runtime_suspend_sleep_time;
> +#endif /* CONFIG_PM_RUNTIME */
This I think should be introduce later, with runtime PM changes.
> + u8 dev_pwr_mode;
> + u16 dev_sleep_time;
> +
> + /* Read from query data region. */
> + char product_id[16];
> + u8 fw_maj_ver; /* Firmware major version. */
> + u8 fw_min_ver; /* Firmware minor version. */
> + u8 btn_capability;
> + u8 gen;
> + int max_abs_x;
> + int max_abs_y;
> + int physical_size_x;
> + int physical_size_y;
> +
> + /* Used in ttsp and truetouch based trackpad devices. */
> + u8 x_origin; /* X Axis Origin: 0 = left side; 1 = rigth side. */
> + u8 y_origin; /* Y Axis Origin: 0 = top; 1 = bottom. */
> + int electrodes_x; /* Number of electrodes on the X Axis*/
> + int electrodes_y; /* Number of electrodes on the Y Axis*/
> + int electrodes_rx; /* Number of Rx electrodes */
> + int max_z;
> +
> + /*
> + * Used to synchronize the access or update the device state.
> + * And since update firmware and read firmware image process will take
> + * quite long time, maybe more than 10 seconds, so use mutex_lock
> + * to sync and wait other interface and detecting are done or ready.
> + */
> + struct mutex state_sync_lock;
> +
> + const struct cyapa_dev_ops *ops;
> +
> + union cyapa_cmd_states cmd_states;
> +};
> +
> +
> +ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len,
> + u8 *values);
> +ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg,
> + size_t len, const u8 *values);
> +ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
> + u8 *values);
> +
> +s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx);
> +s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value);
Do we still use these 2 fucntions?
> +ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values);
> +
> +ssize_t cyapa_i2c_read(struct cyapa *cyapa, u8 reg, size_t len, u8 *values);
> +ssize_t cyapa_i2c_write(struct cyapa *cyapa, u8 reg,
> + size_t len, const void *values);
> +
> +int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout);
> +int cyapa_detect(struct cyapa *cyapa);
> +
> +u8 cyapa_sleep_time_to_pwr_cmd(u16 sleep_time);
> +u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode);
> +
> +
> +extern const char unique_str[];
> +
> +#endif
> --
> 1.9.1
>
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH v9 03/18] input: cyapa: add gen3 trackpad device basic functions support
From: Dmitry Torokhov @ 2014-11-10 8:30 UTC (permalink / raw)
To: Dudley Du; +Cc: rydberg, Dudley Du, bleung, linux-input, linux-kernel
In-Reply-To: <1415003590-30485-4-git-send-email-dudl@cypress.com>
On Mon, Nov 03, 2014 at 04:32:55PM +0800, Dudley Du wrote:
> Based on the cyapa core, add the gen3 trackpad device's basic functions
> supported, so gen3 trackpad device can work with kernel input system.
> The basic function is absolutely same as previous cyapa driver.
> TEST=test on Chromebooks.
>
> Signed-off-by: Dudley Du <dudl@cypress.com>
> ---
> drivers/input/mouse/Makefile | 3 +-
> drivers/input/mouse/cyapa.c | 90 ++++-
> drivers/input/mouse/cyapa.h | 1 +
> drivers/input/mouse/cyapa_gen3.c | 788 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 880 insertions(+), 2 deletions(-)
> create mode 100644 drivers/input/mouse/cyapa_gen3.c
>
> diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
> index dda507f..4bf6c83 100644
> --- a/drivers/input/mouse/Makefile
> +++ b/drivers/input/mouse/Makefile
> @@ -8,7 +8,7 @@ obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o
> obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o
> obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o
> obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o
> -obj-$(CONFIG_MOUSE_CYAPA) += cyapa.o
> +obj-$(CONFIG_MOUSE_CYAPA) += cyapatp.o
> obj-$(CONFIG_MOUSE_GPIO) += gpio_mouse.o
> obj-$(CONFIG_MOUSE_INPORT) += inport.o
> obj-$(CONFIG_MOUSE_LOGIBM) += logibm.o
> @@ -23,6 +23,7 @@ obj-$(CONFIG_MOUSE_SYNAPTICS_I2C) += synaptics_i2c.o
> obj-$(CONFIG_MOUSE_SYNAPTICS_USB) += synaptics_usb.o
> obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o
>
> +cyapatp-objs := cyapa.o cyapa_gen3.o
> psmouse-objs := psmouse-base.o synaptics.o focaltech.o
>
> psmouse-$(CONFIG_MOUSE_PS2_ALPS) += alps.o
> diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> index 5029618..cb81baf 100644
> --- a/drivers/input/mouse/cyapa.c
> +++ b/drivers/input/mouse/cyapa.c
> @@ -234,6 +234,9 @@ static int cyapa_check_is_operational(struct cyapa *cyapa)
> return ret;
>
> switch (cyapa->gen) {
> + case CYAPA_GEN3:
> + cyapa->ops = &cyapa_gen3_ops;
> + break;
> default:
> return -ENODEV;
> }
> @@ -284,7 +287,85 @@ out:
> */
> static int cyapa_get_state(struct cyapa *cyapa)
> {
> - return -ENODEV;
> + int ret;
> + u8 status[BL_STATUS_SIZE];
> + u8 cmd[32];
> + /* The i2c address of gen4 and gen5 trackpad device must be even. */
> + bool even_addr = ((cyapa->client->addr & 0x0001) == 0);
> + bool smbus = false;
> + int retries = 2;
> +
> + cyapa->state = CYAPA_STATE_NO_DEVICE;
> +
> + /*
> + * Get trackpad status by reading 3 registers starting from 0.
> + * If the device is in the bootloader, this will be BL_HEAD.
> + * If the device is in operation mode, this will be the DATA regs.
> + *
> + */
> + ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE,
> + status);
> +
> + /*
> + * On smbus systems in OP mode, the i2c_reg_read will fail with
> + * -ETIMEDOUT. In this case, try again using the smbus equivalent
> + * command. This should return a BL_HEAD indicating CYAPA_STATE_OP.
> + */
> + if (cyapa->smbus && (ret == -ETIMEDOUT || ret == -ENXIO)) {
> + if (!even_addr)
> + ret = cyapa_read_block(cyapa,
> + CYAPA_CMD_BL_STATUS, status);
> + smbus = true;
> + }
> + if (ret != BL_STATUS_SIZE)
> + goto error;
> +
> + /*
> + * Detect trackpad protocol based on characristic registers and bits.
> + */
> + do {
> + cyapa->status[REG_OP_STATUS] = status[REG_OP_STATUS];
> + cyapa->status[REG_BL_STATUS] = status[REG_BL_STATUS];
> + cyapa->status[REG_BL_ERROR] = status[REG_BL_ERROR];
> +
> + if (cyapa->gen == CYAPA_GEN_UNKNOWN ||
> + cyapa->gen == CYAPA_GEN3) {
> + ret = cyapa_gen3_ops.state_parse(cyapa,
> + status, BL_STATUS_SIZE);
> + if (ret == 0)
> + goto out_detected;
> + }
> +
> + /*
> + * Cannot detect communication protocol based on current
> + * charateristic registers and bits.
> + * So write error command to do further detection.
> + * this method only valid on I2C bus.
> + * for smbus interface, it won't have overwrite issue.
> + */
I do not quite understand this, can you re-phrase?
> + if (!smbus) {
> + cmd[0] = 0x00;
> + cmd[1] = 0x00;
> + ret = cyapa_i2c_write(cyapa, 0, 2, cmd);
> + if (ret)
> + goto error;
> +
> + msleep(50);
> +
> + ret = cyapa_i2c_read(cyapa, BL_HEAD_OFFSET,
> + BL_STATUS_SIZE, status);
> + if (ret < 0)
> + goto error;
> + }
> + } while (--retries > 0 && !smbus);
> +
> + goto error;
> +
> +out_detected:
> + return 0;
> +
> +error:
> + return (ret < 0) ? ret : -EAGAIN;
> }
>
> /*
> @@ -421,6 +502,8 @@ u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode)
> */
> static int cyapa_initialize(struct cyapa *cyapa)
> {
> + int ret = 0;
> +
> cyapa->state = CYAPA_STATE_NO_DEVICE;
> cyapa->gen = CYAPA_GEN_UNKNOWN;
> mutex_init(&cyapa->state_sync_lock);
> @@ -433,6 +516,11 @@ static int cyapa_initialize(struct cyapa *cyapa)
> cyapa->suspend_sleep_time =
> cyapa_pwr_cmd_to_sleep_time(cyapa->suspend_power_mode);
>
> + if (cyapa_gen3_ops.initialize)
> + ret = cyapa_gen3_ops.initialize(cyapa);
> + if (ret)
> + return ret;
> +
> return cyapa_detect(cyapa);
> }
>
> diff --git a/drivers/input/mouse/cyapa.h b/drivers/input/mouse/cyapa.h
> index ee97d7c..b281dcb 100644
> --- a/drivers/input/mouse/cyapa.h
> +++ b/drivers/input/mouse/cyapa.h
> @@ -317,5 +317,6 @@ u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode);
>
>
> extern const char unique_str[];
> +extern const struct cyapa_dev_ops cyapa_gen3_ops;
>
> #endif
> diff --git a/drivers/input/mouse/cyapa_gen3.c b/drivers/input/mouse/cyapa_gen3.c
> new file mode 100644
> index 0000000..bd00c6e
> --- /dev/null
> +++ b/drivers/input/mouse/cyapa_gen3.c
> @@ -0,0 +1,788 @@
> +/*
> + * Cypress APA trackpad with I2C interface
> + *
> + * Author: Dudley Du <dudl@cypress.com>
> + * Further cleanup and restructuring by:
> + * Daniel Kurtz <djkurtz@chromium.org>
> + * Benson Leung <bleung@chromium.org>
> + *
> + * Copyright (C) 2011-2014 Cypress Semiconductor, Inc.
> + * Copyright (C) 2011-2012 Google, Inc.
> + *
> + * 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
> + * more details.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/i2c.h>
> +#include <linux/input.h>
> +#include <linux/input/mt.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include "cyapa.h"
> +
> +
> +#define GEN3_MAX_FINGERS 5
> +#define GEN3_FINGER_NUM(x) (((x) >> 4) & 0x07)
> +
> +#define BLK_HEAD_BYTES 32
> +
> +/* Macro for register map group offset. */
> +#define PRODUCT_ID_SIZE 16
> +#define QUERY_DATA_SIZE 27
> +#define REG_PROTOCOL_GEN_QUERY_OFFSET 20
> +
> +#define REG_OFFSET_DATA_BASE 0x0000
> +#define REG_OFFSET_COMMAND_BASE 0x0028
> +#define REG_OFFSET_QUERY_BASE 0x002a
> +
> +#define CYAPA_OFFSET_SOFT_RESET REG_OFFSET_COMMAND_BASE
> +#define OP_RECALIBRATION_MASK 0x80
> +#define OP_REPORT_BASELINE_MASK 0x40
> +#define REG_OFFSET_MAX_BASELINE 0x0026
> +#define REG_OFFSET_MIN_BASELINE 0x0027
> +
> +#define REG_OFFSET_POWER_MODE (REG_OFFSET_COMMAND_BASE + 1)
> +#define SET_POWER_MODE_DELAY 10000 /* unit: us */
> +#define SET_POWER_MODE_TRIES 5
> +
> +/*
> + * CYAPA trackpad device states.
> + * Used in register 0x00, bit1-0, DeviceStatus field.
> + * Other values indicate device is in an abnormal state and must be reset.
> + */
> +#define CYAPA_DEV_NORMAL 0x03
> +#define CYAPA_DEV_BUSY 0x01
> +
> +#define CYAPA_FW_BLOCK_SIZE 64
> +#define CYAPA_FW_READ_SIZE 16
> +#define CYAPA_FW_HDR_START 0x0780
> +#define CYAPA_FW_HDR_BLOCK_COUNT 2
> +#define CYAPA_FW_HDR_BLOCK_START (CYAPA_FW_HDR_START / CYAPA_FW_BLOCK_SIZE)
> +#define CYAPA_FW_HDR_SIZE (CYAPA_FW_HDR_BLOCK_COUNT * \
> + CYAPA_FW_BLOCK_SIZE)
> +#define CYAPA_FW_DATA_START 0x0800
> +#define CYAPA_FW_DATA_BLOCK_COUNT 480
> +#define CYAPA_FW_DATA_BLOCK_START (CYAPA_FW_DATA_START / CYAPA_FW_BLOCK_SIZE)
> +#define CYAPA_FW_DATA_SIZE (CYAPA_FW_DATA_BLOCK_COUNT * \
> + CYAPA_FW_BLOCK_SIZE)
> +#define CYAPA_FW_SIZE (CYAPA_FW_HDR_SIZE + CYAPA_FW_DATA_SIZE)
> +#define CYAPA_CMD_LEN 16
> +
> +#define GEN3_BL_IDLE_FW_MAJ_VER_OFFSET 0x0b
> +#define GEN3_BL_IDLE_FW_MIN_VER_OFFSET (GEN3_BL_IDLE_FW_MAJ_VER_OFFSET + 1)
> +
> +
> +struct cyapa_touch {
> + /*
> + * high bits or x/y position value
> + * bit 7 - 4: high 4 bits of x position value
> + * bit 3 - 0: high 4 bits of y position value
> + */
> + u8 xy_hi;
> + u8 x_lo; /* low 8 bits of x position value. */
> + u8 y_lo; /* low 8 bits of y position value. */
> + u8 pressure;
> + /* id range is 1 - 15. It is incremented with every new touch. */
> + u8 id;
> +} __packed;
> +
> +struct cyapa_reg_data {
> + /*
> + * bit 0 - 1: device status
> + * bit 3 - 2: power mode
> + * bit 6 - 4: reserved
> + * bit 7: interrupt valid bit
> + */
> + u8 device_status;
> + /*
> + * bit 7 - 4: number of fingers currently touching pad
> + * bit 3: valid data check bit
> + * bit 2: middle mechanism button state if exists
> + * bit 1: right mechanism button state if exists
> + * bit 0: left mechanism button state if exists
> + */
> + u8 finger_btn;
> + /* CYAPA reports up to 5 touches per packet. */
> + struct cyapa_touch touches[5];
> +} __packed;
> +
> +static const u8 bl_activate[] = { 0x00, 0xff, 0x38, 0x00, 0x01, 0x02, 0x03,
> + 0x04, 0x05, 0x06, 0x07 };
> +static const u8 bl_deactivate[] = { 0x00, 0xff, 0x3b, 0x00, 0x01, 0x02, 0x03,
> + 0x04, 0x05, 0x06, 0x07 };
> +static const u8 bl_exit[] = { 0x00, 0xff, 0xa5, 0x00, 0x01, 0x02, 0x03, 0x04,
> + 0x05, 0x06, 0x07 };
> +
> +
> + /* for byte read/write command */
> +#define CMD_RESET 0
> +#define CMD_POWER_MODE 1
> +#define CMD_DEV_STATUS 2
> +#define CMD_REPORT_MAX_BASELINE 3
> +#define CMD_REPORT_MIN_BASELINE 4
> +#define SMBUS_BYTE_CMD(cmd) (((cmd) & 0x3f) << 1)
> +#define CYAPA_SMBUS_RESET SMBUS_BYTE_CMD(CMD_RESET)
> +#define CYAPA_SMBUS_POWER_MODE SMBUS_BYTE_CMD(CMD_POWER_MODE)
> +#define CYAPA_SMBUS_DEV_STATUS SMBUS_BYTE_CMD(CMD_DEV_STATUS)
> +#define CYAPA_SMBUS_MAX_BASELINE SMBUS_BYTE_CMD(CMD_REPORT_MAX_BASELINE)
> +#define CYAPA_SMBUS_MIN_BASELINE SMBUS_BYTE_CMD(CMD_REPORT_MIN_BASELINE)
> +
> + /* for group registers read/write command */
> +#define REG_GROUP_DATA 0
> +#define REG_GROUP_CMD 2
> +#define REG_GROUP_QUERY 3
> +#define SMBUS_GROUP_CMD(grp) (0x80 | (((grp) & 0x07) << 3))
> +#define CYAPA_SMBUS_GROUP_DATA SMBUS_GROUP_CMD(REG_GROUP_DATA)
> +#define CYAPA_SMBUS_GROUP_CMD SMBUS_GROUP_CMD(REG_GROUP_CMD)
> +#define CYAPA_SMBUS_GROUP_QUERY SMBUS_GROUP_CMD(REG_GROUP_QUERY)
> +
> + /* for register block read/write command */
> +#define CMD_BL_STATUS 0
> +#define CMD_BL_HEAD 1
> +#define CMD_BL_CMD 2
> +#define CMD_BL_DATA 3
> +#define CMD_BL_ALL 4
> +#define CMD_BLK_PRODUCT_ID 5
> +#define CMD_BLK_HEAD 6
> +#define SMBUS_BLOCK_CMD(cmd) (0xc0 | (((cmd) & 0x1f) << 1))
> +
> +/* register block read/write command in bootloader mode */
> +#define CYAPA_SMBUS_BL_STATUS SMBUS_BLOCK_CMD(CMD_BL_STATUS)
> +#define CYAPA_SMBUS_BL_HEAD SMBUS_BLOCK_CMD(CMD_BL_HEAD)
> +#define CYAPA_SMBUS_BL_CMD SMBUS_BLOCK_CMD(CMD_BL_CMD)
> +#define CYAPA_SMBUS_BL_DATA SMBUS_BLOCK_CMD(CMD_BL_DATA)
> +#define CYAPA_SMBUS_BL_ALL SMBUS_BLOCK_CMD(CMD_BL_ALL)
> +
> +/* register block read/write command in operational mode */
> +#define CYAPA_SMBUS_BLK_PRODUCT_ID SMBUS_BLOCK_CMD(CMD_BLK_PRODUCT_ID)
> +#define CYAPA_SMBUS_BLK_HEAD SMBUS_BLOCK_CMD(CMD_BLK_HEAD)
> +
> + /* for byte read/write command */
> +#define CMD_RESET 0
> +#define CMD_POWER_MODE 1
> +#define CMD_DEV_STATUS 2
> +#define CMD_REPORT_MAX_BASELINE 3
> +#define CMD_REPORT_MIN_BASELINE 4
> +#define SMBUS_BYTE_CMD(cmd) (((cmd) & 0x3f) << 1)
> +#define CYAPA_SMBUS_RESET SMBUS_BYTE_CMD(CMD_RESET)
> +#define CYAPA_SMBUS_POWER_MODE SMBUS_BYTE_CMD(CMD_POWER_MODE)
> +#define CYAPA_SMBUS_DEV_STATUS SMBUS_BYTE_CMD(CMD_DEV_STATUS)
> +#define CYAPA_SMBUS_MAX_BASELINE SMBUS_BYTE_CMD(CMD_REPORT_MAX_BASELINE)
> +#define CYAPA_SMBUS_MIN_BASELINE SMBUS_BYTE_CMD(CMD_REPORT_MIN_BASELINE)
> +
> + /* for group registers read/write command */
> +#define REG_GROUP_DATA 0
> +#define REG_GROUP_CMD 2
> +#define REG_GROUP_QUERY 3
> +#define SMBUS_GROUP_CMD(grp) (0x80 | (((grp) & 0x07) << 3))
> +#define CYAPA_SMBUS_GROUP_DATA SMBUS_GROUP_CMD(REG_GROUP_DATA)
> +#define CYAPA_SMBUS_GROUP_CMD SMBUS_GROUP_CMD(REG_GROUP_CMD)
> +#define CYAPA_SMBUS_GROUP_QUERY SMBUS_GROUP_CMD(REG_GROUP_QUERY)
> +
> + /* for register block read/write command */
> +#define CMD_BL_STATUS 0
> +#define CMD_BL_HEAD 1
> +#define CMD_BL_CMD 2
> +#define CMD_BL_DATA 3
> +#define CMD_BL_ALL 4
> +#define CMD_BLK_PRODUCT_ID 5
> +#define CMD_BLK_HEAD 6
> +#define SMBUS_BLOCK_CMD(cmd) (0xc0 | (((cmd) & 0x1f) << 1))
> +
> +/* register block read/write command in bootloader mode */
> +#define CYAPA_SMBUS_BL_STATUS SMBUS_BLOCK_CMD(CMD_BL_STATUS)
> +#define CYAPA_SMBUS_BL_HEAD SMBUS_BLOCK_CMD(CMD_BL_HEAD)
> +#define CYAPA_SMBUS_BL_CMD SMBUS_BLOCK_CMD(CMD_BL_CMD)
> +#define CYAPA_SMBUS_BL_DATA SMBUS_BLOCK_CMD(CMD_BL_DATA)
> +#define CYAPA_SMBUS_BL_ALL SMBUS_BLOCK_CMD(CMD_BL_ALL)
> +
> +/* register block read/write command in operational mode */
> +#define CYAPA_SMBUS_BLK_PRODUCT_ID SMBUS_BLOCK_CMD(CMD_BLK_PRODUCT_ID)
> +#define CYAPA_SMBUS_BLK_HEAD SMBUS_BLOCK_CMD(CMD_BLK_HEAD)
> +
> +struct cyapa_cmd_len {
> + u8 cmd;
> + u8 len;
> +};
> +
> +/* maps generic CYAPA_CMD_* code to the I2C equivalent */
> +static const struct cyapa_cmd_len cyapa_i2c_cmds[] = {
> + { CYAPA_OFFSET_SOFT_RESET, 1 }, /* CYAPA_CMD_SOFT_RESET */
> + { REG_OFFSET_COMMAND_BASE + 1, 1 }, /* CYAPA_CMD_POWER_MODE */
> + { REG_OFFSET_DATA_BASE, 1 }, /* CYAPA_CMD_DEV_STATUS */
> + { REG_OFFSET_DATA_BASE, sizeof(struct cyapa_reg_data) },
> + /* CYAPA_CMD_GROUP_DATA */
> + { REG_OFFSET_COMMAND_BASE, 0 }, /* CYAPA_CMD_GROUP_CMD */
> + { REG_OFFSET_QUERY_BASE, QUERY_DATA_SIZE }, /* CYAPA_CMD_GROUP_QUERY */
> + { BL_HEAD_OFFSET, 3 }, /* CYAPA_CMD_BL_STATUS */
> + { BL_HEAD_OFFSET, 16 }, /* CYAPA_CMD_BL_HEAD */
> + { BL_HEAD_OFFSET, 16 }, /* CYAPA_CMD_BL_CMD */
> + { BL_DATA_OFFSET, 16 }, /* CYAPA_CMD_BL_DATA */
> + { BL_HEAD_OFFSET, 32 }, /* CYAPA_CMD_BL_ALL */
> + { REG_OFFSET_QUERY_BASE, PRODUCT_ID_SIZE },
> + /* CYAPA_CMD_BLK_PRODUCT_ID */
> + { REG_OFFSET_DATA_BASE, 32 }, /* CYAPA_CMD_BLK_HEAD */
> + { REG_OFFSET_MAX_BASELINE, 1 }, /* CYAPA_CMD_MAX_BASELINE */
> + { REG_OFFSET_MIN_BASELINE, 1 }, /* CYAPA_CMD_MIN_BASELINE */
> +};
> +
> +static const struct cyapa_cmd_len cyapa_smbus_cmds[] = {
> + { CYAPA_SMBUS_RESET, 1 }, /* CYAPA_CMD_SOFT_RESET */
> + { CYAPA_SMBUS_POWER_MODE, 1 }, /* CYAPA_CMD_POWER_MODE */
> + { CYAPA_SMBUS_DEV_STATUS, 1 }, /* CYAPA_CMD_DEV_STATUS */
> + { CYAPA_SMBUS_GROUP_DATA, sizeof(struct cyapa_reg_data) },
> + /* CYAPA_CMD_GROUP_DATA */
> + { CYAPA_SMBUS_GROUP_CMD, 2 }, /* CYAPA_CMD_GROUP_CMD */
> + { CYAPA_SMBUS_GROUP_QUERY, QUERY_DATA_SIZE },
> + /* CYAPA_CMD_GROUP_QUERY */
> + { CYAPA_SMBUS_BL_STATUS, 3 }, /* CYAPA_CMD_BL_STATUS */
> + { CYAPA_SMBUS_BL_HEAD, 16 }, /* CYAPA_CMD_BL_HEAD */
> + { CYAPA_SMBUS_BL_CMD, 16 }, /* CYAPA_CMD_BL_CMD */
> + { CYAPA_SMBUS_BL_DATA, 16 }, /* CYAPA_CMD_BL_DATA */
> + { CYAPA_SMBUS_BL_ALL, 32 }, /* CYAPA_CMD_BL_ALL */
> + { CYAPA_SMBUS_BLK_PRODUCT_ID, PRODUCT_ID_SIZE },
> + /* CYAPA_CMD_BLK_PRODUCT_ID */
> + { CYAPA_SMBUS_BLK_HEAD, 16 }, /* CYAPA_CMD_BLK_HEAD */
> + { CYAPA_SMBUS_MAX_BASELINE, 1 }, /* CYAPA_CMD_MAX_BASELINE */
> + { CYAPA_SMBUS_MIN_BASELINE, 1 }, /* CYAPA_CMD_MIN_BASELINE */
> +};
> +
> +static bool data_reporting_started;
Why is this a global?
> +
> +
> +/*
> + * cyapa_smbus_read_block - perform smbus block read command
> + * @cyapa - private data structure of the driver
> + * @cmd - the properly encoded smbus command
> + * @len - expected length of smbus command result
> + * @values - buffer to store smbus command result
> + *
> + * Returns negative errno, else the number of bytes written.
> + *
> + * Note:
> + * In trackpad device, the memory block allocated for I2C register map
> + * is 256 bytes, so the max read block for I2C bus is 256 bytes.
> + */
> +ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
> + u8 *values)
> +{
> + ssize_t ret;
> + u8 index;
> + u8 smbus_cmd;
> + u8 *buf;
> + struct i2c_client *client = cyapa->client;
> +
> + if (!(SMBUS_BYTE_BLOCK_CMD_MASK & cmd))
> + return -EINVAL;
> +
> + if (SMBUS_GROUP_BLOCK_CMD_MASK & cmd) {
> + /* read specific block registers command. */
> + smbus_cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
> + ret = i2c_smbus_read_block_data(client, smbus_cmd, values);
> + goto out;
> + }
> +
> + ret = 0;
> + for (index = 0; index * I2C_SMBUS_BLOCK_MAX < len; index++) {
> + smbus_cmd = SMBUS_ENCODE_IDX(cmd, index);
> + smbus_cmd = SMBUS_ENCODE_RW(smbus_cmd, SMBUS_READ);
> + buf = values + I2C_SMBUS_BLOCK_MAX * index;
> + ret = i2c_smbus_read_block_data(client, smbus_cmd, buf);
> + if (ret < 0)
> + goto out;
> + }
> +
> +out:
> + return ret > 0 ? len : ret;
> +}
> +
> +s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx)
> +{
> + u8 cmd;
> +
> + if (cyapa->smbus) {
> + cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> + cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
> + } else {
> + cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> + }
> + return i2c_smbus_read_byte_data(cyapa->client, cmd);
> +}
> +
> +s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value)
> +{
> + u8 cmd;
> +
> + if (cyapa->smbus) {
> + cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> + cmd = SMBUS_ENCODE_RW(cmd, SMBUS_WRITE);
> + } else {
> + cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> + }
> + return i2c_smbus_write_byte_data(cyapa->client, cmd, value);
> +}
> +
> +ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values)
> +{
> + u8 cmd;
> + size_t len;
> +
> + if (cyapa->smbus) {
> + cmd = cyapa_smbus_cmds[cmd_idx].cmd;
> + len = cyapa_smbus_cmds[cmd_idx].len;
> + return cyapa_smbus_read_block(cyapa, cmd, len, values);
> + }
> + cmd = cyapa_i2c_cmds[cmd_idx].cmd;
> + len = cyapa_i2c_cmds[cmd_idx].len;
> + return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
> +}
> +
> +/*
> + * Determine the Gen3 trackpad device's current operating state.
> + *
> + */
> +static int cyapa_gen3_state_parse(struct cyapa *cyapa, u8 *reg_data, int len)
> +{
> + /*
> + * Must be in detecting and should not do data reporting.
> + * It will be reenabled when all detecting done and lauched into
> + * applicaiton mode successfully.
> + */
> + data_reporting_started = false;
> + cyapa->state = CYAPA_STATE_NO_DEVICE;
> +
> + /* Parse based on Gen3 characteristic registers and bits */
> + if (reg_data[REG_BL_FILE] == BL_FILE &&
> + reg_data[REG_BL_ERROR] == BL_ERROR_NO_ERR_IDLE &&
> + (reg_data[REG_BL_STATUS] ==
> + (BL_STATUS_RUNNING | BL_STATUS_CSUM_VALID) ||
> + reg_data[REG_BL_STATUS] == BL_STATUS_RUNNING)) {
> + /*
> + * Normal state after power on or reset,
> + * REG_BL_STATUS == 0x11, firmware image checksum is valid.
> + * REG_BL_STATUS == 0x10, firmware image checksum is invalid.
> + */
> + cyapa->gen = CYAPA_GEN3;
> + cyapa->state = CYAPA_STATE_BL_IDLE;
> + } else if (reg_data[REG_BL_FILE] == BL_FILE &&
> + (reg_data[REG_BL_STATUS] & BL_STATUS_RUNNING) ==
> + BL_STATUS_RUNNING) {
> + cyapa->gen = CYAPA_GEN3;
> + if (reg_data[REG_BL_STATUS] & BL_STATUS_BUSY) {
> + cyapa->state = CYAPA_STATE_BL_BUSY;
> + } else {
> + if ((reg_data[REG_BL_ERROR] & BL_ERROR_BOOTLOADING) ==
> + BL_ERROR_BOOTLOADING)
> + cyapa->state = CYAPA_STATE_BL_ACTIVE;
> + else
> + cyapa->state = CYAPA_STATE_BL_IDLE;
> + }
> + } else if ((reg_data[REG_OP_STATUS] & OP_STATUS_SRC) &&
> + (reg_data[REG_OP_DATA1] & OP_DATA_VALID)) {
> + /*
> + * Normal state when running in operaitonal mode,
> + * may also not in full power state or
> + * busying in command process.
> + */
> + if (GEN3_FINGER_NUM(reg_data[REG_OP_DATA1]) <=
> + GEN3_MAX_FINGERS) {
> + /* Finger number data is valid. */
> + cyapa->gen = CYAPA_GEN3;
> + cyapa->state = CYAPA_STATE_OP;
> + }
> + } else if (reg_data[REG_OP_STATUS] == 0x0C &&
> + reg_data[REG_OP_DATA1] == 0x08) {
> + /* Op state when first two registers overwritten with 0x00 */
> + cyapa->gen = CYAPA_GEN3;
> + cyapa->state = CYAPA_STATE_OP;
> + } else if (reg_data[REG_BL_STATUS] &
> + (BL_STATUS_RUNNING | BL_STATUS_BUSY)) {
> + cyapa->gen = CYAPA_GEN3;
> + cyapa->state = CYAPA_STATE_BL_BUSY;
> + }
> +
> + if (cyapa->gen == CYAPA_GEN3 && (cyapa->state == CYAPA_STATE_OP ||
> + cyapa->state == CYAPA_STATE_BL_IDLE ||
> + cyapa->state == CYAPA_STATE_BL_ACTIVE ||
> + cyapa->state == CYAPA_STATE_BL_BUSY))
> + return 0;
> +
> + return -EAGAIN;
> +}
> +
> +static int cyapa_gen3_bl_deactivate(struct cyapa *cyapa)
> +{
> + int ret;
> +
> + ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_deactivate),
> + bl_deactivate);
> + if (ret < 0)
> + return ret;
> +
> + /* Wait for bootloader to switch to idle state; should take < 100ms */
> + msleep(100);
> + ret = cyapa_poll_state(cyapa, 500);
> + if (ret < 0)
> + return ret;
> + if (cyapa->state != CYAPA_STATE_BL_IDLE)
> + return -EAGAIN;
> + return 0;
> +}
> +
> +/*
> + * Exit bootloader
> + *
> + * Send bl_exit command, then wait 50 - 100 ms to let device transition to
> + * operational mode. If this is the first time the device's firmware is
> + * running, it can take up to 2 seconds to calibrate its sensors. So, poll
> + * the device's new state for up to 2 seconds.
> + *
> + * Returns:
> + * -EIO failure while reading from device
> + * -EAGAIN device is stuck in bootloader, b/c it has invalid firmware
> + * 0 device is supported and in operational mode
> + */
> +static int cyapa_gen3_bl_exit(struct cyapa *cyapa)
> +{
> + int ret;
> +
> + ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_exit), bl_exit);
> + if (ret < 0)
> + return ret;
> +
> + /*
> + * Wait for bootloader to exit, and operation mode to start.
> + * Normally, this takes at least 50 ms.
> + */
> + usleep_range(50000, 100000);
> + /*
> + * In addition, when a device boots for the first time after being
> + * updated to new firmware, it must first calibrate its sensors, which
> + * can take up to an additional 2 seconds. If the device power is
> + * running low, this may take even longer.
> + */
> + ret = cyapa_poll_state(cyapa, 4000);
> + if (ret < 0)
> + return ret;
> + if (cyapa->state != CYAPA_STATE_OP)
> + return -EAGAIN;
> +
> + return 0;
> +}
> +
> +/*
> + * cyapa_get_wait_time_for_pwr_cmd
> + *
> + * Compute the amount of time we need to wait after updating the touchpad
> + * power mode. The touchpad needs to consume the incoming power mode set
> + * command at the current clock rate.
> + */
> +
> +static u16 cyapa_get_wait_time_for_pwr_cmd(u8 pwr_mode)
> +{
> + switch (pwr_mode) {
> + case PWR_MODE_FULL_ACTIVE: return 20;
> + case PWR_MODE_BTN_ONLY: return 20;
> + case PWR_MODE_OFF: return 20;
> + default: return cyapa_pwr_cmd_to_sleep_time(pwr_mode) + 50;
> + }
> +}
> +
> +/*
> + * Set device power mode
> + *
> + * Write to the field to configure power state. Power states include :
> + * Full : Max scans and report rate.
> + * Idle : Report rate set by user specified time.
> + * ButtonOnly : No scans for fingers. When the button is triggered,
> + * a slave interrupt is asserted to notify host to wake up.
> + * Off : Only awake for i2c commands from host. No function for button
> + * or touch sensors.
> + *
> + * The power_mode command should conform to the following :
> + * Full : 0x3f
> + * Idle : Configurable from 20 to 1000ms. See note below for
> + * cyapa_sleep_time_to_pwr_cmd and cyapa_pwr_cmd_to_sleep_time
> + * ButtonOnly : 0x01
> + * Off : 0x00
> + *
> + * Device power mode can only be set when device is in operational mode.
> + */
> +static int cyapa_gen3_set_power_mode(struct cyapa *cyapa, u8 power_mode,
> + u16 always_unused)
> +{
> + int ret;
> + u8 power;
> + int tries = SET_POWER_MODE_TRIES;
> + u16 sleep_time;
> +
> + always_unused = 0;
> + if (cyapa->state != CYAPA_STATE_OP)
> + return 0;
> +
> + while (true) {
> + ret = cyapa_read_byte(cyapa, CYAPA_CMD_POWER_MODE);
> + if (ret >= 0 || --tries < 1)
> + break;
> + usleep_range(SET_POWER_MODE_DELAY, 2 * SET_POWER_MODE_DELAY);
> + }
> + if (ret < 0)
> + return ret;
> +
> + /*
> + * Return early if the power mode to set is the same as the current
> + * one.
> + */
> + if ((ret & PWR_MODE_MASK) == power_mode)
> + return 0;
> +
> + sleep_time = cyapa_get_wait_time_for_pwr_cmd(ret & PWR_MODE_MASK);
> + power = ret;
> + power &= ~PWR_MODE_MASK;
> + power |= power_mode & PWR_MODE_MASK;
> + while (true) {
> + ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
> + if (!ret || --tries < 1)
> + break;
> + usleep_range(SET_POWER_MODE_DELAY, 2 * SET_POWER_MODE_DELAY);
> + }
> +
> + /*
> + * Wait for the newly set power command to go in at the previous
> + * clock speed (scanrate) used by the touchpad firmware. Not
> + * doing so before issuing the next command may result in errors
> + * depending on the command's content.
> + */
> + msleep(sleep_time);
> + return ret;
> +}
> +
> +static int cyapa_gen3_get_query_data(struct cyapa *cyapa)
> +{
> + u8 query_data[QUERY_DATA_SIZE];
> + int ret;
> +
> + if (cyapa->state != CYAPA_STATE_OP)
> + return -EBUSY;
> +
> + ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_QUERY, query_data);
> + if (ret != QUERY_DATA_SIZE)
> + return (ret < 0) ? ret : -EIO;
> +
> + memcpy(&cyapa->product_id[0], &query_data[0], 5);
> + cyapa->product_id[5] = '-';
> + memcpy(&cyapa->product_id[6], &query_data[5], 6);
> + cyapa->product_id[12] = '-';
> + memcpy(&cyapa->product_id[13], &query_data[11], 2);
> + cyapa->product_id[15] = '\0';
> +
> + cyapa->fw_maj_ver = query_data[15];
> + cyapa->fw_min_ver = query_data[16];
> +
> + cyapa->btn_capability = query_data[19] & CAPABILITY_BTN_MASK;
> +
> + cyapa->gen = query_data[20] & 0x0f;
> +
> + cyapa->max_abs_x = ((query_data[21] & 0xf0) << 4) | query_data[22];
> + cyapa->max_abs_y = ((query_data[21] & 0x0f) << 8) | query_data[23];
> +
> + cyapa->physical_size_x =
> + ((query_data[24] & 0xf0) << 4) | query_data[25];
> + cyapa->physical_size_y =
> + ((query_data[24] & 0x0f) << 8) | query_data[26];
> +
> + cyapa->max_z = 255;
> +
> + return 0;
> +}
> +
> +static int cyapa_gen3_bl_query_data(struct cyapa *cyapa)
> +{
> + u8 bl_data[CYAPA_CMD_LEN];
> + int ret;
> +
> + ret = cyapa_i2c_reg_read_block(cyapa, 0, CYAPA_CMD_LEN, bl_data);
> + if (ret != CYAPA_CMD_LEN)
> + return (ret < 0) ? ret : -EIO;
> +
> + /*
> + * This value will be updated again when entered application mode.
> + * If TP failed to enter application mode, this fw version values
> + * can be used as a reference.
> + * This firmware version valid when fw image checksum is valid.
> + */
> + if (bl_data[REG_BL_STATUS] ==
> + (BL_STATUS_RUNNING | BL_STATUS_CSUM_VALID)) {
> + cyapa->fw_maj_ver = bl_data[GEN3_BL_IDLE_FW_MAJ_VER_OFFSET];
> + cyapa->fw_min_ver = bl_data[GEN3_BL_IDLE_FW_MIN_VER_OFFSET];
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Check if device is operational.
> + *
> + * An operational device is responding, has exited bootloader, and has
> + * firmware supported by this driver.
> + *
> + * Returns:
> + * -EBUSY no device or in bootloader
> + * -EIO failure while reading from device
> + * -EAGAIN device is still in bootloader
> + * if ->state = CYAPA_STATE_BL_IDLE, device has invalid firmware
> + * -EINVAL device is in operational mode, but not supported by this driver
> + * 0 device is supported
> + */
> +static int cyapa_gen3_do_operational_check(struct cyapa *cyapa)
> +{
> + struct device *dev = &cyapa->client->dev;
> + int ret;
> +
> + switch (cyapa->state) {
> + case CYAPA_STATE_BL_ACTIVE:
> + ret = cyapa_gen3_bl_deactivate(cyapa);
> + if (ret) {
> + dev_err(dev, "failed to bl_deactivate. %d\n", ret);
> + return ret;
> + }
> +
> + /* Fallthrough state */
> + case CYAPA_STATE_BL_IDLE:
> + /* Try to get firmware version in bootloader mode. */
> + cyapa_gen3_bl_query_data(cyapa);
> +
> + ret = cyapa_gen3_bl_exit(cyapa);
> + if (ret) {
> + dev_err(dev, "failed to bl_exit. %d\n", ret);
> + return ret;
> + }
> +
> + /* Fallthrough state */
> + case CYAPA_STATE_OP:
> + /*
> + * Reading query data before going back to the full mode
> + * may cause problems, so we set the power mode first here.
> + */
> + ret = cyapa_gen3_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE, 0);
> + if (ret)
> + dev_err(dev, "%s: set full power mode failed, (%d)\n",
> + __func__, ret);
> + ret = cyapa_gen3_get_query_data(cyapa);
> + if (ret < 0)
> + return ret;
> +
> + /* Only support firmware protocol gen3 */
> + if (cyapa->gen != CYAPA_GEN3) {
> + dev_err(dev, "unsupported protocol version (%d)",
> + cyapa->gen);
> + return -EINVAL;
> + }
> +
> + /* Only support product ID starting with CYTRA */
> + if (memcmp(cyapa->product_id, unique_str,
> + strlen(unique_str)) != 0) {
> + dev_err(dev, "unsupported product ID (%s)\n",
> + cyapa->product_id);
> + return -EINVAL;
> + }
> +
> + data_reporting_started = true;
> + return 0;
> +
> + default:
> + return -EIO;
> + }
> + return 0;
> +}
> +
> +/*
> + * Return false, do not continue process
> + * Return true, continue process.
> + */
> +static bool cyapa_gen3_irq_cmd_handler(struct cyapa *cyapa)
> +{
> + /* Not gen3 irq command response, skip for continue. */
> + if (cyapa->gen != CYAPA_GEN3)
> + return true;
> +
> + if (cyapa->input && data_reporting_started)
> + return true;
> +
> + /*
> + * Driver in detecting or other interface function processing,
> + * so, stop cyapa_gen3_irq_handler to continue process to
> + * avoid unwanted to error detecting and processing.
> + *
> + * And also, avoid the periodicly accerted interrupts to be processed
> + * as touch inputs when gen3 failed to launch into application mode,
> + * which will cause gen3 stays in bootloader mode.
> + */
> + return false;
> +}
> +
> +static int cyapa_gen3_irq_handler(struct cyapa *cyapa)
> +{
> + struct input_dev *input = cyapa->input;
> + struct device *dev = &cyapa->client->dev;
> + struct cyapa_reg_data data;
> + int i;
> + int ret;
> + int num_fingers;
> +
> + ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data);
> + if (ret != sizeof(data)) {
> + dev_err(dev, "failed to read report data, (%d)\n", ret);
> + return -EINVAL;
> + }
> +
> + if ((data.device_status & OP_STATUS_SRC) != OP_STATUS_SRC ||
> + (data.device_status & OP_STATUS_DEV) != CYAPA_DEV_NORMAL ||
> + (data.finger_btn & OP_DATA_VALID) != OP_DATA_VALID) {
> + dev_err(dev, "invalid device state bytes, %02x %02x\n",
> + data.device_status, data.finger_btn);
> + return -EINVAL;
> + }
> +
> + num_fingers = (data.finger_btn >> 4) & 0x0f;
> + for (i = 0; i < num_fingers; i++) {
> + const struct cyapa_touch *touch = &data.touches[i];
> + /* Note: touch->id range is 1 to 15; slots are 0 to 14. */
> + int slot = touch->id - 1;
> +
> + input_mt_slot(input, slot);
> + input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
> + input_report_abs(input, ABS_MT_POSITION_X,
> + ((touch->xy_hi & 0xf0) << 4) | touch->x_lo);
> + input_report_abs(input, ABS_MT_POSITION_Y,
> + ((touch->xy_hi & 0x0f) << 8) | touch->y_lo);
> + input_report_abs(input, ABS_MT_PRESSURE, touch->pressure);
> + }
> +
> + input_mt_sync_frame(input);
> +
> + if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK)
> + input_report_key(input, BTN_LEFT,
> + !!(data.finger_btn & OP_DATA_LEFT_BTN));
> + if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK)
> + input_report_key(input, BTN_MIDDLE,
> + !!(data.finger_btn & OP_DATA_MIDDLE_BTN));
> + if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK)
> + input_report_key(input, BTN_RIGHT,
> + !!(data.finger_btn & OP_DATA_RIGHT_BTN));
> + input_sync(input);
> +
> + return 0;
> +}
> +
> +const struct cyapa_dev_ops cyapa_gen3_ops = {
> + .state_parse = cyapa_gen3_state_parse,
> + .operational_check = cyapa_gen3_do_operational_check,
> +
> + .irq_handler = cyapa_gen3_irq_handler,
> + .irq_cmd_handler = cyapa_gen3_irq_cmd_handler,
> +
> + .set_power_mode = cyapa_gen3_set_power_mode,
> +};
> --
> 1.9.1
>
--
Dmitry
^ permalink raw reply
* Re: [PATCH v9 05/18] input: cyapa: add power management interfaces supported for the device
From: Dmitry Torokhov @ 2014-11-10 8:38 UTC (permalink / raw)
To: Dudley Du; +Cc: rydberg, Dudley Du, bleung, linux-input, linux-kernel
In-Reply-To: <1415003590-30485-6-git-send-email-dudl@cypress.com>
On Mon, Nov 03, 2014 at 04:32:57PM +0800, Dudley Du wrote:
> Add suspend_scanrate_ms power management interfaces in device's
> power group, so users or applications can control the power management
> strategy of trackpad device as their requirements.
> TEST=test on Chromebooks.
>
> Signed-off-by: Dudley Du <dudl@cypress.com>
> ---
> drivers/input/mouse/cyapa.c | 112 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 112 insertions(+)
>
> diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
> index fac361a..420696d 100644
> --- a/drivers/input/mouse/cyapa.c
> +++ b/drivers/input/mouse/cyapa.c
> @@ -505,6 +505,96 @@ u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode)
> : (encoded_time - 5) * 20;
> }
>
> +#ifdef CONFIG_PM_SLEEP
> +static ssize_t cyapa_show_suspend_scanrate(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct cyapa *cyapa = dev_get_drvdata(dev);
> + u8 pwr_cmd = cyapa->suspend_power_mode;
> + u16 sleep_time;
> + int len;
> + int ret;
> +
> + ret = mutex_lock_interruptible(&cyapa->state_sync_lock);
> + if (ret)
> + return ret;
> + pwr_cmd = cyapa->suspend_power_mode;
> + sleep_time = cyapa->suspend_sleep_time;
> + mutex_unlock(&cyapa->state_sync_lock);
> +
> + if (pwr_cmd == PWR_MODE_BTN_ONLY)
> + len = scnprintf(buf, PAGE_SIZE, "%s\n", BTN_ONLY_MODE_NAME);
> + else if (pwr_cmd == PWR_MODE_OFF)
> + len = scnprintf(buf, PAGE_SIZE, "%s\n", OFF_MODE_NAME);
> + else {
> + if (cyapa->gen == CYAPA_GEN3)
> + sleep_time = cyapa_pwr_cmd_to_sleep_time(pwr_cmd);
> + len = scnprintf(buf, PAGE_SIZE, "%u\n", sleep_time);
> + }
> +
> + return len;
> +}
> +
> +static u16 cyapa_clamp_sleep_time(u16 sleep_time)
> +{
> + if (sleep_time > 1000)
> + sleep_time = 1000;
> + return sleep_time;
> +}
> +
> +static ssize_t cyapa_update_suspend_scanrate(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct cyapa *cyapa = dev_get_drvdata(dev);
> + u16 sleep_time;
> + int ret;
> +
> + ret = mutex_lock_interruptible(&cyapa->state_sync_lock);
> + if (ret)
> + return ret;
> +
> + if (sysfs_streq(buf, BTN_ONLY_MODE_NAME))
> + cyapa->suspend_power_mode = PWR_MODE_BTN_ONLY;
> + else if (sysfs_streq(buf, OFF_MODE_NAME))
> + cyapa->suspend_power_mode = PWR_MODE_OFF;
> + else if (!kstrtou16(buf, 10, &sleep_time)) {
> + cyapa->suspend_sleep_time = cyapa_clamp_sleep_time(sleep_time);
I'd simply do
cyapa->suspend_sleep_time = max_t(u16, sleep_time, 1000);
here.
> + cyapa->suspend_power_mode =
> + cyapa_sleep_time_to_pwr_cmd(cyapa->suspend_sleep_time);
> + } else
> + count = 0;
> +
If one branch uses curly braces then all branches shoudl use them, even
if they contain only one statement.
> + mutex_unlock(&cyapa->state_sync_lock);
> + if (!count)
> + dev_err(dev, "invalid suspend scanrate ms parameters\n");
> + return count ? count : -EINVAL;
> +}
> +
> +static DEVICE_ATTR(suspend_scanrate_ms, S_IRUGO|S_IWUSR,
> + cyapa_show_suspend_scanrate,
> + cyapa_update_suspend_scanrate);
> +
> +static struct attribute *cyapa_power_wakeup_entries[] = {
> + &dev_attr_suspend_scanrate_ms.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group cyapa_power_wakeup_group = {
> + .name = power_group_name,
> + .attrs = cyapa_power_wakeup_entries,
> +};
> +
> +static void cyapa_remove_power_wakeup_group(void *data)
> +{
> + struct cyapa *cyapa = data;
> +
> + sysfs_unmerge_group(&cyapa->client->dev.kobj,
> + &cyapa_power_wakeup_group);
> +}
> +#endif /* CONFIG_PM_SLEEP */
> +
> /*
> * Returns:
> * 0 Driver and device initialization successfully done.
> @@ -588,6 +678,28 @@ static int cyapa_probe(struct i2c_client *client,
> return ret;
> }
>
> +#ifdef CONFIG_PM_SLEEP
> + if (device_can_wakeup(dev)) {
> + ret = sysfs_merge_group(&client->dev.kobj,
> + &cyapa_power_wakeup_group);
> + if (ret) {
> + dev_err(dev, "failed to add power wakeup group, (%d)\n",
> + ret);
> + return ret;
> + }
> +
> + ret = devm_add_action(dev,
> + cyapa_remove_power_wakeup_group, cyapa);
> + if (ret) {
> + cyapa_remove_power_wakeup_group(cyapa);
> + dev_err(dev,
> + "failed to add power cleanup action, (%d)\n",
> + ret);
> + return ret;
> + }
> + }
> +#endif /* CONFIG_PM_SLEEP */
> +
> return 0;
> }
>
> --
> 1.9.1
>
--
Dmitry
^ permalink raw reply
* Re: [PATCH v9 15/18] input: cyapa: add gen3 trackpad device read firmware image function support
From: Dmitry Torokhov @ 2014-11-10 8:39 UTC (permalink / raw)
To: Dudley Du; +Cc: rydberg, Dudley Du, bleung, linux-input, linux-kernel
In-Reply-To: <1415003590-30485-16-git-send-email-dudl@cypress.com>
On Mon, Nov 03, 2014 at 04:33:07PM +0800, Dudley Du wrote:
> Add read firmware image function supported for gen3 trackpad device,
> it can be used through debugfs read_fw interface.
Why do we need this? Can we do the same via usespace program accessing
the i2c device through /dev/i2c-N?
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH 2/5] input: touchscreen: ti_am335x_tsc: Remove udelay in interrupt handler
From: Lee Jones @ 2014-11-10 9:11 UTC (permalink / raw)
To: Vignesh R
Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
Benoit Cousson, Tony Lindgren, Russell King, Jonathan Cameron,
Hartmut Knaack, Dmitry Torokhov, Sebastian Andrzej Siewior,
Lars-Peter Clausen, Peter Meerwald, Samuel Ortiz, Felipe Balbi,
Brad Griffis, Sanjeev Sharma, Paul Gortmaker, Jan Kardell,
devicetree, linux-kernel, linux-omap, linux-arm-kernel
In-Reply-To: <1415339350-17679-3-git-send-email-vigneshr@ti.com>
On Fri, 07 Nov 2014, Vignesh R wrote:
> From: Brad Griffis <bgriffis@ti.com>
>
> TSC interrupt handler had udelay to avoid reporting of false pen-up
> interrupt to user space. This patch implements workaround suggesting in
> Advisory 1.0.31 of silicon errata for am335x, thus eliminating udelay
> and touchscreen lag. This also improves performance of touchscreen and
> eliminates sudden jump of cursor at touch release.
>
> IDLECONFIG and CHARGECONFIG registers are to be configured
> with same values in order to eliminate false pen-up events. This
> workaround may result in false pen-down to be detected, hence considerable
> charge step delay needs to be added. The charge delay is set to 0xB000
> (in terms of ADC clock cycles) by default.
>
> TSC steps are disabled at the end of every sampling cycle and EOS bit is
> set. Once the EOS bit is set, the TSC steps need to be re-enabled to begin
> next sampling cycle.
>
> Signed-off-by: Brad Griffis <bgriffis@ti.com>
> [vigneshr@ti.com: Ported the patch from v3.12 to v3.18rc2]
>
> Signed-off-by: Vignesh R <vigneshr@ti.com>
> ---
> drivers/input/touchscreen/ti_am335x_tsc.c | 56 ++++++++++++-------------------
> include/linux/mfd/ti_am335x_tscadc.h | 3 +-
Acked-by: Lee Jones <lee.jones@linaro.org>
> 2 files changed, 24 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
> index 1aeac9675fe7..483fd97c0e0c 100644
> --- a/drivers/input/touchscreen/ti_am335x_tsc.c
> +++ b/drivers/input/touchscreen/ti_am335x_tsc.c
> @@ -173,11 +173,9 @@ static void titsc_step_config(struct titsc *ts_dev)
> titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
> }
>
> - /* Charge step configuration */
> - config = ts_dev->bit_xp | ts_dev->bit_yn |
> - STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
> - STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_yp);
> + /* Make CHARGECONFIG same as IDLECONFIG */
>
> + config = titsc_readl(ts_dev, REG_IDLECONFIG);
> titsc_writel(ts_dev, REG_CHARGECONFIG, config);
> titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
>
> @@ -264,9 +262,26 @@ static irqreturn_t titsc_irq(int irq, void *dev)
> unsigned int status, irqclr = 0;
> unsigned int x = 0, y = 0;
> unsigned int z1, z2, z;
> - unsigned int fsm;
>
> - status = titsc_readl(ts_dev, REG_IRQSTATUS);
> + status = titsc_readl(ts_dev, REG_RAWIRQSTATUS);
> + if (status & IRQENB_HW_PEN) {
> + ts_dev->pen_down = true;
> + titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
> + titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
> + irqclr |= IRQENB_HW_PEN;
> + }
> +
> + if (status & IRQENB_PENUP) {
> + ts_dev->pen_down = false;
> + input_report_key(input_dev, BTN_TOUCH, 0);
> + input_report_abs(input_dev, ABS_PRESSURE, 0);
> + input_sync(input_dev);
> + irqclr |= IRQENB_PENUP;
> + }
> +
> + if (status & IRQENB_EOS)
> + irqclr |= IRQENB_EOS;
> +
> /*
> * ADC and touchscreen share the IRQ line.
> * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
> @@ -297,34 +312,6 @@ static irqreturn_t titsc_irq(int irq, void *dev)
> }
> irqclr |= IRQENB_FIFO0THRES;
> }
> -
> - /*
> - * Time for sequencer to settle, to read
> - * correct state of the sequencer.
> - */
> - udelay(SEQ_SETTLE);
> -
> - status = titsc_readl(ts_dev, REG_RAWIRQSTATUS);
> - if (status & IRQENB_PENUP) {
> - /* Pen up event */
> - fsm = titsc_readl(ts_dev, REG_ADCFSM);
> - if (fsm == ADCFSM_STEPID) {
> - ts_dev->pen_down = false;
> - input_report_key(input_dev, BTN_TOUCH, 0);
> - input_report_abs(input_dev, ABS_PRESSURE, 0);
> - input_sync(input_dev);
> - } else {
> - ts_dev->pen_down = true;
> - }
> - irqclr |= IRQENB_PENUP;
> - }
> -
> - if (status & IRQENB_HW_PEN) {
> -
> - titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
> - titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
> - }
> -
> if (irqclr) {
> titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
> am335x_tsc_se_set_cache(ts_dev->mfd_tscadc, ts_dev->step_mask);
> @@ -417,6 +404,7 @@ static int titsc_probe(struct platform_device *pdev)
> }
>
> titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES);
> + titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS);
> err = titsc_config_wires(ts_dev);
> if (err) {
> dev_err(&pdev->dev, "wrong i/p wire configuration\n");
> diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
> index e2e70053470e..c99be5dc0f5c 100644
> --- a/include/linux/mfd/ti_am335x_tscadc.h
> +++ b/include/linux/mfd/ti_am335x_tscadc.h
> @@ -52,6 +52,7 @@
>
> /* IRQ enable */
> #define IRQENB_HW_PEN BIT(0)
> +#define IRQENB_EOS BIT(1)
> #define IRQENB_FIFO0THRES BIT(2)
> #define IRQENB_FIFO0OVRRUN BIT(3)
> #define IRQENB_FIFO0UNDRFLW BIT(4)
> @@ -107,7 +108,7 @@
> /* Charge delay */
> #define CHARGEDLY_OPEN_MASK (0x3FFFF << 0)
> #define CHARGEDLY_OPEN(val) ((val) << 0)
> -#define CHARGEDLY_OPENDLY CHARGEDLY_OPEN(1)
> +#define CHARGEDLY_OPENDLY CHARGEDLY_OPEN(0xB000)
>
> /* Control register */
> #define CNTRLREG_TSCSSENB BIT(0)
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply
* Re: tsc2005 touchscreen: implement disable attribute
From: Pali Rohár @ 2014-11-10 9:14 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Sebastian Reichel, Pavel Machek, kernel list, linux-arm-kernel,
linux-omap, tony, khilman, aaro.koskinen, freemangordon, B38611,
jg1.han, linux-input
In-Reply-To: <20141109200142.GA37384@dtor-ws>
[-- Attachment #1: Type: Text/Plain, Size: 1678 bytes --]
On Sunday 09 November 2014 21:01:42 Dmitry Torokhov wrote:
> On Sun, Nov 09, 2014 at 01:49:19PM +0100, Pali Rohár wrote:
> > On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:
> > > Hi,
> > >
> > > On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek
wrote:
> > > > Implement disable attribute for tsc2005 touchscreen. It
> > > > is useful to avoid wakeups when phone is in the pocket.
> > >
> > > I don't think this should be some driver specific sysfs
> > > node. Instead a generic method from the input subsystem
> > > should be used.
> > >
> > > -- Sebastian
> >
> > Yes. I would like to see generic method to turn off input
> > device (or just "mute" it if device does not support turn
> > off). Similar problem is also on laptops or other portable
> > devices. E.g when I close LID of my laptop I want to turn
> > off internal input devices (keyboard, touchpad, trackstick)
> > without need to unload evdev Xserver drivers (or killing
> > Xserver). Another use case is to turn off keyboard (also
> > from kernel tty on Ctrl+Alt+Fx) which cannot be unplugged
> > (internal laptop keyboard).
> >
> > CCed Dmitry, what do you think about it?
>
> Actually I'd like it to be not limited to input devices but
> rater try doing it at the device core level, if possible. I
> am sure there are IIO and other devices that could be
> forcibly turned off/put into low power mode under certain
> circumstances.
>
> There were some talks about it with Rafael, but we never come
> with anything concrete.
>
> Thanks.
Ok. What about adding sysfs node disable which accept value 0/1?
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox