Path: blob/master/drivers/input/mouse/psmouse-base.c
15109 views
/*1* PS/2 mouse driver2*3* Copyright (c) 1999-2002 Vojtech Pavlik4* Copyright (c) 2003-2004 Dmitry Torokhov5*/67/*8* This program is free software; you can redistribute it and/or modify it9* under the terms of the GNU General Public License version 2 as published by10* the Free Software Foundation.11*/1213#include <linux/delay.h>14#include <linux/module.h>15#include <linux/slab.h>16#include <linux/interrupt.h>17#include <linux/input.h>18#include <linux/serio.h>19#include <linux/init.h>20#include <linux/libps2.h>21#include <linux/mutex.h>2223#include "psmouse.h"24#include "synaptics.h"25#include "logips2pp.h"26#include "alps.h"27#include "hgpk.h"28#include "lifebook.h"29#include "trackpoint.h"30#include "touchkit_ps2.h"31#include "elantech.h"32#include "sentelic.h"3334#define DRIVER_DESC "PS/2 mouse driver"3536MODULE_AUTHOR("Vojtech Pavlik <[email protected]>");37MODULE_DESCRIPTION(DRIVER_DESC);38MODULE_LICENSE("GPL");3940static unsigned int psmouse_max_proto = PSMOUSE_AUTO;41static int psmouse_set_maxproto(const char *val, const struct kernel_param *);42static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp);43static struct kernel_param_ops param_ops_proto_abbrev = {44.set = psmouse_set_maxproto,45.get = psmouse_get_maxproto,46};47#define param_check_proto_abbrev(name, p) __param_check(name, p, unsigned int)48module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644);49MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches.");5051static unsigned int psmouse_resolution = 200;52module_param_named(resolution, psmouse_resolution, uint, 0644);53MODULE_PARM_DESC(resolution, "Resolution, in dpi.");5455static unsigned int psmouse_rate = 100;56module_param_named(rate, psmouse_rate, uint, 0644);57MODULE_PARM_DESC(rate, "Report rate, in reports per second.");5859static unsigned int psmouse_smartscroll = 1;60module_param_named(smartscroll, psmouse_smartscroll, bool, 0644);61MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");6263static unsigned int psmouse_resetafter = 5;64module_param_named(resetafter, psmouse_resetafter, uint, 0644);65MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");6667static unsigned int psmouse_resync_time;68module_param_named(resync_time, psmouse_resync_time, uint, 0644);69MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");7071PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO,72NULL,73psmouse_attr_show_protocol, psmouse_attr_set_protocol);74PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO,75(void *) offsetof(struct psmouse, rate),76psmouse_show_int_attr, psmouse_attr_set_rate);77PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO,78(void *) offsetof(struct psmouse, resolution),79psmouse_show_int_attr, psmouse_attr_set_resolution);80PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO,81(void *) offsetof(struct psmouse, resetafter),82psmouse_show_int_attr, psmouse_set_int_attr);83PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO,84(void *) offsetof(struct psmouse, resync_time),85psmouse_show_int_attr, psmouse_set_int_attr);8687static struct attribute *psmouse_attributes[] = {88&psmouse_attr_protocol.dattr.attr,89&psmouse_attr_rate.dattr.attr,90&psmouse_attr_resolution.dattr.attr,91&psmouse_attr_resetafter.dattr.attr,92&psmouse_attr_resync_time.dattr.attr,93NULL94};9596static struct attribute_group psmouse_attribute_group = {97.attrs = psmouse_attributes,98};99100/*101* psmouse_mutex protects all operations changing state of mouse102* (connecting, disconnecting, changing rate or resolution via103* sysfs). We could use a per-device semaphore but since there104* rarely more than one PS/2 mouse connected and since semaphore105* is taken in "slow" paths it is not worth it.106*/107static DEFINE_MUTEX(psmouse_mutex);108109static struct workqueue_struct *kpsmoused_wq;110111struct psmouse_protocol {112enum psmouse_type type;113bool maxproto;114bool ignore_parity; /* Protocol should ignore parity errors from KBC */115const char *name;116const char *alias;117int (*detect)(struct psmouse *, bool);118int (*init)(struct psmouse *);119};120121/*122* psmouse_process_byte() analyzes the PS/2 data stream and reports123* relevant events to the input module once full packet has arrived.124*/125126static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse)127{128struct input_dev *dev = psmouse->dev;129unsigned char *packet = psmouse->packet;130131if (psmouse->pktcnt < psmouse->pktsize)132return PSMOUSE_GOOD_DATA;133134/*135* Full packet accumulated, process it136*/137138/*139* Scroll wheel on IntelliMice, scroll buttons on NetMice140*/141142if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS)143input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]);144145/*146* Scroll wheel and buttons on IntelliMouse Explorer147*/148149if (psmouse->type == PSMOUSE_IMEX) {150switch (packet[3] & 0xC0) {151case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */152input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));153break;154case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */155input_report_rel(dev, REL_HWHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));156break;157case 0x00:158case 0xC0:159input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7));160input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1);161input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1);162break;163}164}165166/*167* Extra buttons on Genius NewNet 3D168*/169170if (psmouse->type == PSMOUSE_GENPS) {171input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1);172input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1);173}174175/*176* Extra button on ThinkingMouse177*/178if (psmouse->type == PSMOUSE_THINKPS) {179input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1);180/* Without this bit of weirdness moving up gives wildly high Y changes. */181packet[1] |= (packet[0] & 0x40) << 1;182}183184/*185* Cortron PS2 Trackball reports SIDE button on the 4th bit of the first186* byte.187*/188if (psmouse->type == PSMOUSE_CORTRON) {189input_report_key(dev, BTN_SIDE, (packet[0] >> 3) & 1);190packet[0] |= 0x08;191}192193/*194* Generic PS/2 Mouse195*/196197input_report_key(dev, BTN_LEFT, packet[0] & 1);198input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);199input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1);200201input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);202input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);203204input_sync(dev);205206return PSMOUSE_FULL_PACKET;207}208209void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,210unsigned long delay)211{212queue_delayed_work(kpsmoused_wq, work, delay);213}214215/*216* __psmouse_set_state() sets new psmouse state and resets all flags.217*/218219static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)220{221psmouse->state = new_state;222psmouse->pktcnt = psmouse->out_of_sync_cnt = 0;223psmouse->ps2dev.flags = 0;224psmouse->last = jiffies;225}226227228/*229* psmouse_set_state() sets new psmouse state and resets all flags and230* counters while holding serio lock so fighting with interrupt handler231* is not a concern.232*/233234void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)235{236serio_pause_rx(psmouse->ps2dev.serio);237__psmouse_set_state(psmouse, new_state);238serio_continue_rx(psmouse->ps2dev.serio);239}240241/*242* psmouse_handle_byte() processes one byte of the input data stream243* by calling corresponding protocol handler.244*/245246static int psmouse_handle_byte(struct psmouse *psmouse)247{248psmouse_ret_t rc = psmouse->protocol_handler(psmouse);249250switch (rc) {251case PSMOUSE_BAD_DATA:252if (psmouse->state == PSMOUSE_ACTIVATED) {253printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",254psmouse->name, psmouse->phys, psmouse->pktcnt);255if (++psmouse->out_of_sync_cnt == psmouse->resetafter) {256__psmouse_set_state(psmouse, PSMOUSE_IGNORE);257printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");258serio_reconnect(psmouse->ps2dev.serio);259return -1;260}261}262psmouse->pktcnt = 0;263break;264265case PSMOUSE_FULL_PACKET:266psmouse->pktcnt = 0;267if (psmouse->out_of_sync_cnt) {268psmouse->out_of_sync_cnt = 0;269printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",270psmouse->name, psmouse->phys);271}272break;273274case PSMOUSE_GOOD_DATA:275break;276}277return 0;278}279280/*281* psmouse_interrupt() handles incoming characters, either passing them282* for normal processing or gathering them as command response.283*/284285static irqreturn_t psmouse_interrupt(struct serio *serio,286unsigned char data, unsigned int flags)287{288struct psmouse *psmouse = serio_get_drvdata(serio);289290if (psmouse->state == PSMOUSE_IGNORE)291goto out;292293if (unlikely((flags & SERIO_TIMEOUT) ||294((flags & SERIO_PARITY) && !psmouse->ignore_parity))) {295296if (psmouse->state == PSMOUSE_ACTIVATED)297printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",298flags & SERIO_TIMEOUT ? " timeout" : "",299flags & SERIO_PARITY ? " bad parity" : "");300ps2_cmd_aborted(&psmouse->ps2dev);301goto out;302}303304if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))305if (ps2_handle_ack(&psmouse->ps2dev, data))306goto out;307308if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD))309if (ps2_handle_response(&psmouse->ps2dev, data))310goto out;311312if (psmouse->state <= PSMOUSE_RESYNCING)313goto out;314315if (psmouse->state == PSMOUSE_ACTIVATED &&316psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {317printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",318psmouse->name, psmouse->phys, psmouse->pktcnt);319psmouse->badbyte = psmouse->packet[0];320__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);321psmouse_queue_work(psmouse, &psmouse->resync_work, 0);322goto out;323}324325psmouse->packet[psmouse->pktcnt++] = data;326/*327* Check if this is a new device announcement (0xAA 0x00)328*/329if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {330if (psmouse->pktcnt == 1) {331psmouse->last = jiffies;332goto out;333}334335if (psmouse->packet[1] == PSMOUSE_RET_ID ||336(psmouse->type == PSMOUSE_HGPK &&337psmouse->packet[1] == PSMOUSE_RET_BAT)) {338__psmouse_set_state(psmouse, PSMOUSE_IGNORE);339serio_reconnect(serio);340goto out;341}342/*343* Not a new device, try processing first byte normally344*/345psmouse->pktcnt = 1;346if (psmouse_handle_byte(psmouse))347goto out;348349psmouse->packet[psmouse->pktcnt++] = data;350}351352/*353* See if we need to force resync because mouse was idle for too long354*/355if (psmouse->state == PSMOUSE_ACTIVATED &&356psmouse->pktcnt == 1 && psmouse->resync_time &&357time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) {358psmouse->badbyte = psmouse->packet[0];359__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);360psmouse_queue_work(psmouse, &psmouse->resync_work, 0);361goto out;362}363364psmouse->last = jiffies;365psmouse_handle_byte(psmouse);366367out:368return IRQ_HANDLED;369}370371372/*373* psmouse_sliced_command() sends an extended PS/2 command to the mouse374* using sliced syntax, understood by advanced devices, such as Logitech375* or Synaptics touchpads. The command is encoded as:376* 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu377* is the command.378*/379int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command)380{381int i;382383if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))384return -1;385386for (i = 6; i >= 0; i -= 2) {387unsigned char d = (command >> i) & 3;388if (ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES))389return -1;390}391392return 0;393}394395396/*397* psmouse_reset() resets the mouse into power-on state.398*/399int psmouse_reset(struct psmouse *psmouse)400{401unsigned char param[2];402403if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT))404return -1;405406if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)407return -1;408409return 0;410}411412413/*414* Genius NetMouse magic init.415*/416static int genius_detect(struct psmouse *psmouse, bool set_properties)417{418struct ps2dev *ps2dev = &psmouse->ps2dev;419unsigned char param[4];420421param[0] = 3;422ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);423ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);424ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);425ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);426ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);427428if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55)429return -1;430431if (set_properties) {432__set_bit(BTN_MIDDLE, psmouse->dev->keybit);433__set_bit(BTN_EXTRA, psmouse->dev->keybit);434__set_bit(BTN_SIDE, psmouse->dev->keybit);435__set_bit(REL_WHEEL, psmouse->dev->relbit);436437psmouse->vendor = "Genius";438psmouse->name = "Mouse";439psmouse->pktsize = 4;440}441442return 0;443}444445/*446* IntelliMouse magic init.447*/448static int intellimouse_detect(struct psmouse *psmouse, bool set_properties)449{450struct ps2dev *ps2dev = &psmouse->ps2dev;451unsigned char param[2];452453param[0] = 200;454ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);455param[0] = 100;456ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);457param[0] = 80;458ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);459ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);460461if (param[0] != 3)462return -1;463464if (set_properties) {465__set_bit(BTN_MIDDLE, psmouse->dev->keybit);466__set_bit(REL_WHEEL, psmouse->dev->relbit);467468if (!psmouse->vendor)469psmouse->vendor = "Generic";470if (!psmouse->name)471psmouse->name = "Wheel Mouse";472psmouse->pktsize = 4;473}474475return 0;476}477478/*479* Try IntelliMouse/Explorer magic init.480*/481static int im_explorer_detect(struct psmouse *psmouse, bool set_properties)482{483struct ps2dev *ps2dev = &psmouse->ps2dev;484unsigned char param[2];485486intellimouse_detect(psmouse, 0);487488param[0] = 200;489ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);490param[0] = 200;491ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);492param[0] = 80;493ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);494ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);495496if (param[0] != 4)497return -1;498499/* Magic to enable horizontal scrolling on IntelliMouse 4.0 */500param[0] = 200;501ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);502param[0] = 80;503ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);504param[0] = 40;505ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);506507if (set_properties) {508__set_bit(BTN_MIDDLE, psmouse->dev->keybit);509__set_bit(REL_WHEEL, psmouse->dev->relbit);510__set_bit(REL_HWHEEL, psmouse->dev->relbit);511__set_bit(BTN_SIDE, psmouse->dev->keybit);512__set_bit(BTN_EXTRA, psmouse->dev->keybit);513514if (!psmouse->vendor)515psmouse->vendor = "Generic";516if (!psmouse->name)517psmouse->name = "Explorer Mouse";518psmouse->pktsize = 4;519}520521return 0;522}523524/*525* Kensington ThinkingMouse / ExpertMouse magic init.526*/527static int thinking_detect(struct psmouse *psmouse, bool set_properties)528{529struct ps2dev *ps2dev = &psmouse->ps2dev;530unsigned char param[2];531static const unsigned char seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20 };532int i;533534param[0] = 10;535ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);536param[0] = 0;537ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);538for (i = 0; i < ARRAY_SIZE(seq); i++) {539param[0] = seq[i];540ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);541}542ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);543544if (param[0] != 2)545return -1;546547if (set_properties) {548__set_bit(BTN_MIDDLE, psmouse->dev->keybit);549__set_bit(BTN_EXTRA, psmouse->dev->keybit);550551psmouse->vendor = "Kensington";552psmouse->name = "ThinkingMouse";553}554555return 0;556}557558/*559* Bare PS/2 protocol "detection". Always succeeds.560*/561static int ps2bare_detect(struct psmouse *psmouse, bool set_properties)562{563if (set_properties) {564if (!psmouse->vendor)565psmouse->vendor = "Generic";566if (!psmouse->name)567psmouse->name = "Mouse";568569/*570* We have no way of figuring true number of buttons so let's571* assume that the device has 3.572*/573__set_bit(BTN_MIDDLE, psmouse->dev->keybit);574}575576return 0;577}578579/*580* Cortron PS/2 protocol detection. There's no special way to detect it, so it581* must be forced by sysfs protocol writing.582*/583static int cortron_detect(struct psmouse *psmouse, bool set_properties)584{585if (set_properties) {586psmouse->vendor = "Cortron";587psmouse->name = "PS/2 Trackball";588589__set_bit(BTN_MIDDLE, psmouse->dev->keybit);590__set_bit(BTN_SIDE, psmouse->dev->keybit);591}592593return 0;594}595596/*597* psmouse_extensions() probes for any extensions to the basic PS/2 protocol598* the mouse may have.599*/600601static int psmouse_extensions(struct psmouse *psmouse,602unsigned int max_proto, bool set_properties)603{604bool synaptics_hardware = false;605606/*607* We always check for lifebook because it does not disturb mouse608* (it only checks DMI information).609*/610if (lifebook_detect(psmouse, set_properties) == 0) {611if (max_proto > PSMOUSE_IMEX) {612if (!set_properties || lifebook_init(psmouse) == 0)613return PSMOUSE_LIFEBOOK;614}615}616617/*618* Try Kensington ThinkingMouse (we try first, because synaptics probe619* upsets the thinkingmouse).620*/621622if (max_proto > PSMOUSE_IMEX && thinking_detect(psmouse, set_properties) == 0)623return PSMOUSE_THINKPS;624625/*626* Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol627* support is disabled in config - we need to know if it is synaptics so we628* can reset it properly after probing for intellimouse.629*/630if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse, set_properties) == 0) {631synaptics_hardware = true;632633if (max_proto > PSMOUSE_IMEX) {634/*635* Try activating protocol, but check if support is enabled first, since636* we try detecting Synaptics even when protocol is disabled.637*/638if (synaptics_supported() &&639(!set_properties || synaptics_init(psmouse) == 0)) {640return PSMOUSE_SYNAPTICS;641}642643/*644* Some Synaptics touchpads can emulate extended protocols (like IMPS/2).645* Unfortunately Logitech/Genius probes confuse some firmware versions so646* we'll have to skip them.647*/648max_proto = PSMOUSE_IMEX;649}650/*651* Make sure that touchpad is in relative mode, gestures (taps) are enabled652*/653synaptics_reset(psmouse);654}655656/*657* Try ALPS TouchPad658*/659if (max_proto > PSMOUSE_IMEX) {660ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);661if (alps_detect(psmouse, set_properties) == 0) {662if (!set_properties || alps_init(psmouse) == 0)663return PSMOUSE_ALPS;664/*665* Init failed, try basic relative protocols666*/667max_proto = PSMOUSE_IMEX;668}669}670671/*672* Try OLPC HGPK touchpad.673*/674if (max_proto > PSMOUSE_IMEX &&675hgpk_detect(psmouse, set_properties) == 0) {676if (!set_properties || hgpk_init(psmouse) == 0)677return PSMOUSE_HGPK;678/*679* Init failed, try basic relative protocols680*/681max_proto = PSMOUSE_IMEX;682}683684/*685* Try Elantech touchpad.686*/687if (max_proto > PSMOUSE_IMEX &&688elantech_detect(psmouse, set_properties) == 0) {689if (!set_properties || elantech_init(psmouse) == 0)690return PSMOUSE_ELANTECH;691/*692* Init failed, try basic relative protocols693*/694max_proto = PSMOUSE_IMEX;695}696697698if (max_proto > PSMOUSE_IMEX) {699if (genius_detect(psmouse, set_properties) == 0)700return PSMOUSE_GENPS;701702if (ps2pp_init(psmouse, set_properties) == 0)703return PSMOUSE_PS2PP;704705if (trackpoint_detect(psmouse, set_properties) == 0)706return PSMOUSE_TRACKPOINT;707708if (touchkit_ps2_detect(psmouse, set_properties) == 0)709return PSMOUSE_TOUCHKIT_PS2;710}711712/*713* Try Finger Sensing Pad. We do it here because its probe upsets714* Trackpoint devices (causing TP_READ_ID command to time out).715*/716if (max_proto > PSMOUSE_IMEX) {717if (fsp_detect(psmouse, set_properties) == 0) {718if (!set_properties || fsp_init(psmouse) == 0)719return PSMOUSE_FSP;720/*721* Init failed, try basic relative protocols722*/723max_proto = PSMOUSE_IMEX;724}725}726727/*728* Reset to defaults in case the device got confused by extended729* protocol probes. Note that we follow up with full reset because730* some mice put themselves to sleep when they see PSMOUSE_RESET_DIS.731*/732ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);733psmouse_reset(psmouse);734735if (max_proto >= PSMOUSE_IMEX && im_explorer_detect(psmouse, set_properties) == 0)736return PSMOUSE_IMEX;737738if (max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse, set_properties) == 0)739return PSMOUSE_IMPS;740741/*742* Okay, all failed, we have a standard mouse here. The number of the buttons743* is still a question, though. We assume 3.744*/745ps2bare_detect(psmouse, set_properties);746747if (synaptics_hardware) {748/*749* We detected Synaptics hardware but it did not respond to IMPS/2 probes.750* We need to reset the touchpad because if there is a track point on the751* pass through port it could get disabled while probing for protocol752* extensions.753*/754psmouse_reset(psmouse);755}756757return PSMOUSE_PS2;758}759760static const struct psmouse_protocol psmouse_protocols[] = {761{762.type = PSMOUSE_PS2,763.name = "PS/2",764.alias = "bare",765.maxproto = true,766.ignore_parity = true,767.detect = ps2bare_detect,768},769#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP770{771.type = PSMOUSE_PS2PP,772.name = "PS2++",773.alias = "logitech",774.detect = ps2pp_init,775},776#endif777{778.type = PSMOUSE_THINKPS,779.name = "ThinkPS/2",780.alias = "thinkps",781.detect = thinking_detect,782},783{784.type = PSMOUSE_GENPS,785.name = "GenPS/2",786.alias = "genius",787.detect = genius_detect,788},789{790.type = PSMOUSE_IMPS,791.name = "ImPS/2",792.alias = "imps",793.maxproto = true,794.ignore_parity = true,795.detect = intellimouse_detect,796},797{798.type = PSMOUSE_IMEX,799.name = "ImExPS/2",800.alias = "exps",801.maxproto = true,802.ignore_parity = true,803.detect = im_explorer_detect,804},805#ifdef CONFIG_MOUSE_PS2_SYNAPTICS806{807.type = PSMOUSE_SYNAPTICS,808.name = "SynPS/2",809.alias = "synaptics",810.detect = synaptics_detect,811.init = synaptics_init,812},813#endif814#ifdef CONFIG_MOUSE_PS2_ALPS815{816.type = PSMOUSE_ALPS,817.name = "AlpsPS/2",818.alias = "alps",819.detect = alps_detect,820.init = alps_init,821},822#endif823#ifdef CONFIG_MOUSE_PS2_LIFEBOOK824{825.type = PSMOUSE_LIFEBOOK,826.name = "LBPS/2",827.alias = "lifebook",828.init = lifebook_init,829},830#endif831#ifdef CONFIG_MOUSE_PS2_TRACKPOINT832{833.type = PSMOUSE_TRACKPOINT,834.name = "TPPS/2",835.alias = "trackpoint",836.detect = trackpoint_detect,837},838#endif839#ifdef CONFIG_MOUSE_PS2_TOUCHKIT840{841.type = PSMOUSE_TOUCHKIT_PS2,842.name = "touchkitPS/2",843.alias = "touchkit",844.detect = touchkit_ps2_detect,845},846#endif847#ifdef CONFIG_MOUSE_PS2_OLPC848{849.type = PSMOUSE_HGPK,850.name = "OLPC HGPK",851.alias = "hgpk",852.detect = hgpk_detect,853},854#endif855#ifdef CONFIG_MOUSE_PS2_ELANTECH856{857.type = PSMOUSE_ELANTECH,858.name = "ETPS/2",859.alias = "elantech",860.detect = elantech_detect,861.init = elantech_init,862},863#endif864#ifdef CONFIG_MOUSE_PS2_SENTELIC865{866.type = PSMOUSE_FSP,867.name = "FSPPS/2",868.alias = "fsp",869.detect = fsp_detect,870.init = fsp_init,871},872#endif873{874.type = PSMOUSE_CORTRON,875.name = "CortronPS/2",876.alias = "cortps",877.detect = cortron_detect,878},879{880.type = PSMOUSE_AUTO,881.name = "auto",882.alias = "any",883.maxproto = true,884},885};886887static const struct psmouse_protocol *psmouse_protocol_by_type(enum psmouse_type type)888{889int i;890891for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++)892if (psmouse_protocols[i].type == type)893return &psmouse_protocols[i];894895WARN_ON(1);896return &psmouse_protocols[0];897}898899static const struct psmouse_protocol *psmouse_protocol_by_name(const char *name, size_t len)900{901const struct psmouse_protocol *p;902int i;903904for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++) {905p = &psmouse_protocols[i];906907if ((strlen(p->name) == len && !strncmp(p->name, name, len)) ||908(strlen(p->alias) == len && !strncmp(p->alias, name, len)))909return &psmouse_protocols[i];910}911912return NULL;913}914915916/*917* psmouse_probe() probes for a PS/2 mouse.918*/919920static int psmouse_probe(struct psmouse *psmouse)921{922struct ps2dev *ps2dev = &psmouse->ps2dev;923unsigned char param[2];924925/*926* First, we check if it's a mouse. It should send 0x00 or 0x03927* in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.928* Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and subsequent929* ID queries, probably due to a firmware bug.930*/931932param[0] = 0xa5;933if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETID))934return -1;935936if (param[0] != 0x00 && param[0] != 0x03 &&937param[0] != 0x04 && param[0] != 0xff)938return -1;939940/*941* Then we reset and disable the mouse so that it doesn't generate events.942*/943944if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS))945printk(KERN_WARNING "psmouse.c: Failed to reset mouse on %s\n", ps2dev->serio->phys);946947return 0;948}949950/*951* Here we set the mouse resolution.952*/953954void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution)955{956static const unsigned char params[] = { 0, 1, 2, 2, 3 };957unsigned char p;958959if (resolution == 0 || resolution > 200)960resolution = 200;961962p = params[resolution / 50];963ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES);964psmouse->resolution = 25 << p;965}966967/*968* Here we set the mouse report rate.969*/970971static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate)972{973static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 };974unsigned char r;975int i = 0;976977while (rates[i] > rate) i++;978r = rates[i];979ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE);980psmouse->rate = r;981}982983/*984* psmouse_initialize() initializes the mouse to a sane state.985*/986987static void psmouse_initialize(struct psmouse *psmouse)988{989/*990* We set the mouse report rate, resolution and scaling.991*/992993if (psmouse_max_proto != PSMOUSE_PS2) {994psmouse->set_rate(psmouse, psmouse->rate);995psmouse->set_resolution(psmouse, psmouse->resolution);996ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);997}998}9991000/*1001* psmouse_activate() enables the mouse so that we get motion reports from it.1002*/10031004static void psmouse_activate(struct psmouse *psmouse)1005{1006if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE))1007printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n",1008psmouse->ps2dev.serio->phys);10091010psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);1011}101210131014/*1015* psmouse_deactivate() puts the mouse into poll mode so that we don't get motion1016* reports from it unless we explicitly request it.1017*/10181019static void psmouse_deactivate(struct psmouse *psmouse)1020{1021if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))1022printk(KERN_WARNING "psmouse.c: Failed to deactivate mouse on %s\n",1023psmouse->ps2dev.serio->phys);10241025psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);1026}10271028/*1029* psmouse_poll() - default poll hanlder. Everyone except for ALPS uses it.1030*/10311032static int psmouse_poll(struct psmouse *psmouse)1033{1034return ps2_command(&psmouse->ps2dev, psmouse->packet,1035PSMOUSE_CMD_POLL | (psmouse->pktsize << 8));1036}103710381039/*1040* psmouse_resync() attempts to re-validate current protocol.1041*/10421043static void psmouse_resync(struct work_struct *work)1044{1045struct psmouse *parent = NULL, *psmouse =1046container_of(work, struct psmouse, resync_work.work);1047struct serio *serio = psmouse->ps2dev.serio;1048psmouse_ret_t rc = PSMOUSE_GOOD_DATA;1049bool failed = false, enabled = false;1050int i;10511052mutex_lock(&psmouse_mutex);10531054if (psmouse->state != PSMOUSE_RESYNCING)1055goto out;10561057if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1058parent = serio_get_drvdata(serio->parent);1059psmouse_deactivate(parent);1060}10611062/*1063* Some mice don't ACK commands sent while they are in the middle of1064* transmitting motion packet. To avoid delay we use ps2_sendbyte()1065* instead of ps2_command() which would wait for 200ms for an ACK1066* that may never come.1067* As an additional quirk ALPS touchpads may not only forget to ACK1068* disable command but will stop reporting taps, so if we see that1069* mouse at least once ACKs disable we will do full reconnect if ACK1070* is missing.1071*/1072psmouse->num_resyncs++;10731074if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) {1075if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command)1076failed = true;1077} else1078psmouse->acks_disable_command = true;10791080/*1081* Poll the mouse. If it was reset the packet will be shorter than1082* psmouse->pktsize and ps2_command will fail. We do not expect and1083* do not handle scenario when mouse "upgrades" its protocol while1084* disconnected since it would require additional delay. If we ever1085* see a mouse that does it we'll adjust the code.1086*/1087if (!failed) {1088if (psmouse->poll(psmouse))1089failed = true;1090else {1091psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);1092for (i = 0; i < psmouse->pktsize; i++) {1093psmouse->pktcnt++;1094rc = psmouse->protocol_handler(psmouse);1095if (rc != PSMOUSE_GOOD_DATA)1096break;1097}1098if (rc != PSMOUSE_FULL_PACKET)1099failed = true;1100psmouse_set_state(psmouse, PSMOUSE_RESYNCING);1101}1102}1103/*1104* Now try to enable mouse. We try to do that even if poll failed and also1105* repeat our attempts 5 times, otherwise we may be left out with disabled1106* mouse.1107*/1108for (i = 0; i < 5; i++) {1109if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {1110enabled = true;1111break;1112}1113msleep(200);1114}11151116if (!enabled) {1117printk(KERN_WARNING "psmouse.c: failed to re-enable mouse on %s\n",1118psmouse->ps2dev.serio->phys);1119failed = true;1120}11211122if (failed) {1123psmouse_set_state(psmouse, PSMOUSE_IGNORE);1124printk(KERN_INFO "psmouse.c: resync failed, issuing reconnect request\n");1125serio_reconnect(serio);1126} else1127psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);11281129if (parent)1130psmouse_activate(parent);1131out:1132mutex_unlock(&psmouse_mutex);1133}11341135/*1136* psmouse_cleanup() resets the mouse into power-on state.1137*/11381139static void psmouse_cleanup(struct serio *serio)1140{1141struct psmouse *psmouse = serio_get_drvdata(serio);1142struct psmouse *parent = NULL;11431144mutex_lock(&psmouse_mutex);11451146if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1147parent = serio_get_drvdata(serio->parent);1148psmouse_deactivate(parent);1149}11501151psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);11521153/*1154* Disable stream mode so cleanup routine can proceed undisturbed.1155*/1156if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))1157printk(KERN_WARNING "psmouse.c: Failed to disable mouse on %s\n",1158psmouse->ps2dev.serio->phys);11591160if (psmouse->cleanup)1161psmouse->cleanup(psmouse);11621163/*1164* Reset the mouse to defaults (bare PS/2 protocol).1165*/1166ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);11671168/*1169* Some boxes, such as HP nx7400, get terribly confused if mouse1170* is not fully enabled before suspending/shutting down.1171*/1172ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);11731174if (parent) {1175if (parent->pt_deactivate)1176parent->pt_deactivate(parent);11771178psmouse_activate(parent);1179}11801181mutex_unlock(&psmouse_mutex);1182}11831184/*1185* psmouse_disconnect() closes and frees.1186*/11871188static void psmouse_disconnect(struct serio *serio)1189{1190struct psmouse *psmouse, *parent = NULL;11911192psmouse = serio_get_drvdata(serio);11931194sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group);11951196mutex_lock(&psmouse_mutex);11971198psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);11991200/* make sure we don't have a resync in progress */1201mutex_unlock(&psmouse_mutex);1202flush_workqueue(kpsmoused_wq);1203mutex_lock(&psmouse_mutex);12041205if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1206parent = serio_get_drvdata(serio->parent);1207psmouse_deactivate(parent);1208}12091210if (psmouse->disconnect)1211psmouse->disconnect(psmouse);12121213if (parent && parent->pt_deactivate)1214parent->pt_deactivate(parent);12151216psmouse_set_state(psmouse, PSMOUSE_IGNORE);12171218serio_close(serio);1219serio_set_drvdata(serio, NULL);1220input_unregister_device(psmouse->dev);1221kfree(psmouse);12221223if (parent)1224psmouse_activate(parent);12251226mutex_unlock(&psmouse_mutex);1227}12281229static int psmouse_switch_protocol(struct psmouse *psmouse,1230const struct psmouse_protocol *proto)1231{1232const struct psmouse_protocol *selected_proto;1233struct input_dev *input_dev = psmouse->dev;12341235input_dev->dev.parent = &psmouse->ps2dev.serio->dev;12361237input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);1238input_dev->keybit[BIT_WORD(BTN_MOUSE)] =1239BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT);1240input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);12411242psmouse->set_rate = psmouse_set_rate;1243psmouse->set_resolution = psmouse_set_resolution;1244psmouse->poll = psmouse_poll;1245psmouse->protocol_handler = psmouse_process_byte;1246psmouse->pktsize = 3;12471248if (proto && (proto->detect || proto->init)) {1249if (proto->detect && proto->detect(psmouse, true) < 0)1250return -1;12511252if (proto->init && proto->init(psmouse) < 0)1253return -1;12541255psmouse->type = proto->type;1256selected_proto = proto;1257} else {1258psmouse->type = psmouse_extensions(psmouse,1259psmouse_max_proto, true);1260selected_proto = psmouse_protocol_by_type(psmouse->type);1261}12621263psmouse->ignore_parity = selected_proto->ignore_parity;12641265/*1266* If mouse's packet size is 3 there is no point in polling the1267* device in hopes to detect protocol reset - we won't get less1268* than 3 bytes response anyhow.1269*/1270if (psmouse->pktsize == 3)1271psmouse->resync_time = 0;12721273/*1274* Some smart KVMs fake response to POLL command returning just1275* 3 bytes and messing up our resync logic, so if initial poll1276* fails we won't try polling the device anymore. Hopefully1277* such KVM will maintain initially selected protocol.1278*/1279if (psmouse->resync_time && psmouse->poll(psmouse))1280psmouse->resync_time = 0;12811282snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s",1283selected_proto->name, psmouse->vendor, psmouse->name);12841285input_dev->name = psmouse->devname;1286input_dev->phys = psmouse->phys;1287input_dev->id.bustype = BUS_I8042;1288input_dev->id.vendor = 0x0002;1289input_dev->id.product = psmouse->type;1290input_dev->id.version = psmouse->model;12911292return 0;1293}12941295/*1296* psmouse_connect() is a callback from the serio module when1297* an unhandled serio port is found.1298*/1299static int psmouse_connect(struct serio *serio, struct serio_driver *drv)1300{1301struct psmouse *psmouse, *parent = NULL;1302struct input_dev *input_dev;1303int retval = 0, error = -ENOMEM;13041305mutex_lock(&psmouse_mutex);13061307/*1308* If this is a pass-through port deactivate parent so the device1309* connected to this port can be successfully identified1310*/1311if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1312parent = serio_get_drvdata(serio->parent);1313psmouse_deactivate(parent);1314}13151316psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL);1317input_dev = input_allocate_device();1318if (!psmouse || !input_dev)1319goto err_free;13201321ps2_init(&psmouse->ps2dev, serio);1322INIT_DELAYED_WORK(&psmouse->resync_work, psmouse_resync);1323psmouse->dev = input_dev;1324snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys);13251326psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);13271328serio_set_drvdata(serio, psmouse);13291330error = serio_open(serio, drv);1331if (error)1332goto err_clear_drvdata;13331334if (psmouse_probe(psmouse) < 0) {1335error = -ENODEV;1336goto err_close_serio;1337}13381339psmouse->rate = psmouse_rate;1340psmouse->resolution = psmouse_resolution;1341psmouse->resetafter = psmouse_resetafter;1342psmouse->resync_time = parent ? 0 : psmouse_resync_time;1343psmouse->smartscroll = psmouse_smartscroll;13441345psmouse_switch_protocol(psmouse, NULL);13461347psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);1348psmouse_initialize(psmouse);13491350error = input_register_device(psmouse->dev);1351if (error)1352goto err_protocol_disconnect;13531354if (parent && parent->pt_activate)1355parent->pt_activate(parent);13561357error = sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group);1358if (error)1359goto err_pt_deactivate;13601361psmouse_activate(psmouse);13621363out:1364/* If this is a pass-through port the parent needs to be re-activated */1365if (parent)1366psmouse_activate(parent);13671368mutex_unlock(&psmouse_mutex);1369return retval;13701371err_pt_deactivate:1372if (parent && parent->pt_deactivate)1373parent->pt_deactivate(parent);1374input_unregister_device(psmouse->dev);1375input_dev = NULL; /* so we don't try to free it below */1376err_protocol_disconnect:1377if (psmouse->disconnect)1378psmouse->disconnect(psmouse);1379psmouse_set_state(psmouse, PSMOUSE_IGNORE);1380err_close_serio:1381serio_close(serio);1382err_clear_drvdata:1383serio_set_drvdata(serio, NULL);1384err_free:1385input_free_device(input_dev);1386kfree(psmouse);13871388retval = error;1389goto out;1390}139113921393static int psmouse_reconnect(struct serio *serio)1394{1395struct psmouse *psmouse = serio_get_drvdata(serio);1396struct psmouse *parent = NULL;1397struct serio_driver *drv = serio->drv;1398unsigned char type;1399int rc = -1;14001401if (!drv || !psmouse) {1402printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");1403return -1;1404}14051406mutex_lock(&psmouse_mutex);14071408if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1409parent = serio_get_drvdata(serio->parent);1410psmouse_deactivate(parent);1411}14121413psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);14141415if (psmouse->reconnect) {1416if (psmouse->reconnect(psmouse))1417goto out;1418} else {1419psmouse_reset(psmouse);14201421if (psmouse_probe(psmouse) < 0)1422goto out;14231424type = psmouse_extensions(psmouse, psmouse_max_proto, false);1425if (psmouse->type != type)1426goto out;1427}14281429/* ok, the device type (and capabilities) match the old one,1430* we can continue using it, complete intialization1431*/1432psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);14331434psmouse_initialize(psmouse);14351436if (parent && parent->pt_activate)1437parent->pt_activate(parent);14381439psmouse_activate(psmouse);1440rc = 0;14411442out:1443/* If this is a pass-through port the parent waits to be activated */1444if (parent)1445psmouse_activate(parent);14461447mutex_unlock(&psmouse_mutex);1448return rc;1449}14501451static struct serio_device_id psmouse_serio_ids[] = {1452{1453.type = SERIO_8042,1454.proto = SERIO_ANY,1455.id = SERIO_ANY,1456.extra = SERIO_ANY,1457},1458{1459.type = SERIO_PS_PSTHRU,1460.proto = SERIO_ANY,1461.id = SERIO_ANY,1462.extra = SERIO_ANY,1463},1464{ 0 }1465};14661467MODULE_DEVICE_TABLE(serio, psmouse_serio_ids);14681469static struct serio_driver psmouse_drv = {1470.driver = {1471.name = "psmouse",1472},1473.description = DRIVER_DESC,1474.id_table = psmouse_serio_ids,1475.interrupt = psmouse_interrupt,1476.connect = psmouse_connect,1477.reconnect = psmouse_reconnect,1478.disconnect = psmouse_disconnect,1479.cleanup = psmouse_cleanup,1480};14811482ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr,1483char *buf)1484{1485struct serio *serio = to_serio_port(dev);1486struct psmouse_attribute *attr = to_psmouse_attr(devattr);1487struct psmouse *psmouse;14881489psmouse = serio_get_drvdata(serio);14901491return attr->show(psmouse, attr->data, buf);1492}14931494ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr,1495const char *buf, size_t count)1496{1497struct serio *serio = to_serio_port(dev);1498struct psmouse_attribute *attr = to_psmouse_attr(devattr);1499struct psmouse *psmouse, *parent = NULL;1500int retval;15011502retval = mutex_lock_interruptible(&psmouse_mutex);1503if (retval)1504goto out;15051506psmouse = serio_get_drvdata(serio);15071508if (attr->protect) {1509if (psmouse->state == PSMOUSE_IGNORE) {1510retval = -ENODEV;1511goto out_unlock;1512}15131514if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1515parent = serio_get_drvdata(serio->parent);1516psmouse_deactivate(parent);1517}15181519psmouse_deactivate(psmouse);1520}15211522retval = attr->set(psmouse, attr->data, buf, count);15231524if (attr->protect) {1525if (retval != -ENODEV)1526psmouse_activate(psmouse);15271528if (parent)1529psmouse_activate(parent);1530}15311532out_unlock:1533mutex_unlock(&psmouse_mutex);1534out:1535return retval;1536}15371538static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf)1539{1540unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);15411542return sprintf(buf, "%u\n", *field);1543}15441545static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count)1546{1547unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);1548unsigned long value;15491550if (strict_strtoul(buf, 10, &value))1551return -EINVAL;15521553if ((unsigned int)value != value)1554return -EINVAL;15551556*field = value;15571558return count;1559}15601561static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf)1562{1563return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name);1564}15651566static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count)1567{1568struct serio *serio = psmouse->ps2dev.serio;1569struct psmouse *parent = NULL;1570struct input_dev *old_dev, *new_dev;1571const struct psmouse_protocol *proto, *old_proto;1572int error;1573int retry = 0;15741575proto = psmouse_protocol_by_name(buf, count);1576if (!proto)1577return -EINVAL;15781579if (psmouse->type == proto->type)1580return count;15811582new_dev = input_allocate_device();1583if (!new_dev)1584return -ENOMEM;15851586while (!list_empty(&serio->children)) {1587if (++retry > 3) {1588printk(KERN_WARNING1589"psmouse: failed to destroy children ports, "1590"protocol change aborted.\n");1591input_free_device(new_dev);1592return -EIO;1593}15941595mutex_unlock(&psmouse_mutex);1596serio_unregister_child_port(serio);1597mutex_lock(&psmouse_mutex);15981599if (serio->drv != &psmouse_drv) {1600input_free_device(new_dev);1601return -ENODEV;1602}16031604if (psmouse->type == proto->type) {1605input_free_device(new_dev);1606return count; /* switched by other thread */1607}1608}16091610if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {1611parent = serio_get_drvdata(serio->parent);1612if (parent->pt_deactivate)1613parent->pt_deactivate(parent);1614}16151616old_dev = psmouse->dev;1617old_proto = psmouse_protocol_by_type(psmouse->type);16181619if (psmouse->disconnect)1620psmouse->disconnect(psmouse);16211622psmouse_set_state(psmouse, PSMOUSE_IGNORE);16231624psmouse->dev = new_dev;1625psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);16261627if (psmouse_switch_protocol(psmouse, proto) < 0) {1628psmouse_reset(psmouse);1629/* default to PSMOUSE_PS2 */1630psmouse_switch_protocol(psmouse, &psmouse_protocols[0]);1631}16321633psmouse_initialize(psmouse);1634psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);16351636error = input_register_device(psmouse->dev);1637if (error) {1638if (psmouse->disconnect)1639psmouse->disconnect(psmouse);16401641psmouse_set_state(psmouse, PSMOUSE_IGNORE);1642input_free_device(new_dev);1643psmouse->dev = old_dev;1644psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);1645psmouse_switch_protocol(psmouse, old_proto);1646psmouse_initialize(psmouse);1647psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);16481649return error;1650}16511652input_unregister_device(old_dev);16531654if (parent && parent->pt_activate)1655parent->pt_activate(parent);16561657return count;1658}16591660static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count)1661{1662unsigned long value;16631664if (strict_strtoul(buf, 10, &value))1665return -EINVAL;16661667psmouse->set_rate(psmouse, value);1668return count;1669}16701671static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count)1672{1673unsigned long value;16741675if (strict_strtoul(buf, 10, &value))1676return -EINVAL;16771678psmouse->set_resolution(psmouse, value);1679return count;1680}168116821683static int psmouse_set_maxproto(const char *val, const struct kernel_param *kp)1684{1685const struct psmouse_protocol *proto;16861687if (!val)1688return -EINVAL;16891690proto = psmouse_protocol_by_name(val, strlen(val));16911692if (!proto || !proto->maxproto)1693return -EINVAL;16941695*((unsigned int *)kp->arg) = proto->type;16961697return 0;1698}16991700static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp)1701{1702int type = *((unsigned int *)kp->arg);17031704return sprintf(buffer, "%s", psmouse_protocol_by_type(type)->name);1705}17061707static int __init psmouse_init(void)1708{1709int err;17101711lifebook_module_init();1712synaptics_module_init();1713hgpk_module_init();17141715kpsmoused_wq = create_singlethread_workqueue("kpsmoused");1716if (!kpsmoused_wq) {1717printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");1718return -ENOMEM;1719}17201721err = serio_register_driver(&psmouse_drv);1722if (err)1723destroy_workqueue(kpsmoused_wq);17241725return err;1726}17271728static void __exit psmouse_exit(void)1729{1730serio_unregister_driver(&psmouse_drv);1731destroy_workqueue(kpsmoused_wq);1732}17331734module_init(psmouse_init);1735module_exit(psmouse_exit);173617371738