Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
9f5bbac5
Commit
9f5bbac5
authored
Sep 26, 2003
by
Dmitry Torokhov
Committed by
Linus Torvalds
Sep 26, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
input: Synaptics code cleanups.
parent
b9dbb222
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
85 additions
and
76 deletions
+85
-76
drivers/input/mouse/synaptics.c
drivers/input/mouse/synaptics.c
+85
-76
No files found.
drivers/input/mouse/synaptics.c
View file @
9f5bbac5
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
* Use the Synaptics extended ps/2 syntax to write a special command byte.
* Use the Synaptics extended ps/2 syntax to write a special command byte.
* special command: 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
* special command: 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
* is the command. A 0xF3 or 0xE9 must follow (see synaptics_send_cmd
* is the command. A 0xF3 or 0xE9 must follow (see synaptics_send_cmd
* and synaptics_
set_mode
)
* and synaptics_
mode_cmd
)
*/
*/
static
int
synaptics_special_cmd
(
struct
psmouse
*
psmouse
,
unsigned
char
command
)
static
int
synaptics_special_cmd
(
struct
psmouse
*
psmouse
,
unsigned
char
command
)
{
{
...
@@ -69,7 +69,7 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned
...
@@ -69,7 +69,7 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned
/*
/*
* Set the synaptics touchpad mode byte by special commands
* Set the synaptics touchpad mode byte by special commands
*/
*/
static
int
synaptics_
set_mode
(
struct
psmouse
*
psmouse
,
unsigned
char
mode
)
static
int
synaptics_
mode_cmd
(
struct
psmouse
*
psmouse
,
unsigned
char
mode
)
{
{
unsigned
char
param
[
1
];
unsigned
char
param
[
1
];
...
@@ -96,13 +96,14 @@ static int synaptics_reset(struct psmouse *psmouse)
...
@@ -96,13 +96,14 @@ static int synaptics_reset(struct psmouse *psmouse)
* Read the model-id bytes from the touchpad
* Read the model-id bytes from the touchpad
* see also SYN_MODEL_* macros
* see also SYN_MODEL_* macros
*/
*/
static
int
synaptics_model_id
(
struct
psmouse
*
psmouse
,
unsigned
long
int
*
model_id
)
static
int
synaptics_model_id
(
struct
psmouse
*
psmouse
)
{
{
struct
synaptics_data
*
priv
=
psmouse
->
private
;
unsigned
char
mi
[
3
];
unsigned
char
mi
[
3
];
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_MODEL
,
mi
))
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_MODEL
,
mi
))
return
-
1
;
return
-
1
;
*
model_id
=
(
mi
[
0
]
<<
16
)
|
(
mi
[
1
]
<<
8
)
|
mi
[
2
];
priv
->
model_id
=
(
mi
[
0
]
<<
16
)
|
(
mi
[
1
]
<<
8
)
|
mi
[
2
];
return
0
;
return
0
;
}
}
...
@@ -110,23 +111,24 @@ static int synaptics_model_id(struct psmouse *psmouse, unsigned long int *model_
...
@@ -110,23 +111,24 @@ static int synaptics_model_id(struct psmouse *psmouse, unsigned long int *model_
* Read the capability-bits from the touchpad
* Read the capability-bits from the touchpad
* see also the SYN_CAP_* macros
* see also the SYN_CAP_* macros
*/
*/
static
int
synaptics_capability
(
struct
psmouse
*
psmouse
,
unsigned
long
int
*
capability
,
unsigned
long
int
*
ext_cap
)
static
int
synaptics_capability
(
struct
psmouse
*
psmouse
)
{
{
struct
synaptics_data
*
priv
=
psmouse
->
private
;
unsigned
char
cap
[
3
];
unsigned
char
cap
[
3
];
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_CAPABILITIES
,
cap
))
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_CAPABILITIES
,
cap
))
return
-
1
;
return
-
1
;
*
capability
=
(
cap
[
0
]
<<
16
)
|
(
cap
[
1
]
<<
8
)
|
cap
[
2
];
priv
->
capabilities
=
(
cap
[
0
]
<<
16
)
|
(
cap
[
1
]
<<
8
)
|
cap
[
2
];
*
ext_cap
=
0
;
priv
->
ext_cap
=
0
;
if
(
!
SYN_CAP_VALID
(
*
capability
))
if
(
!
SYN_CAP_VALID
(
priv
->
capabilities
))
return
-
1
;
return
-
1
;
if
(
SYN_EXT_CAP_REQUESTS
(
*
capability
))
{
if
(
SYN_EXT_CAP_REQUESTS
(
priv
->
capabilities
))
{
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_EXT_CAPAB
,
cap
))
{
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_EXT_CAPAB
,
cap
))
{
printk
(
KERN_ERR
"Synaptics claims to have extended capabilities,"
printk
(
KERN_ERR
"Synaptics claims to have extended capabilities,"
" but I'm not able to read them."
);
" but I'm not able to read them."
);
}
else
}
else
*
ext_cap
=
(
cap
[
0
]
<<
16
)
|
(
cap
[
1
]
<<
8
)
|
cap
[
2
];
priv
->
ext_cap
=
(
cap
[
0
]
<<
16
)
|
(
cap
[
1
]
<<
8
)
|
cap
[
2
];
}
}
return
0
;
return
0
;
}
}
...
@@ -135,14 +137,15 @@ static int synaptics_capability(struct psmouse *psmouse, unsigned long int *capa
...
@@ -135,14 +137,15 @@ static int synaptics_capability(struct psmouse *psmouse, unsigned long int *capa
* Identify Touchpad
* Identify Touchpad
* See also the SYN_ID_* macros
* See also the SYN_ID_* macros
*/
*/
static
int
synaptics_identify
(
struct
psmouse
*
psmouse
,
unsigned
long
int
*
ident
)
static
int
synaptics_identify
(
struct
psmouse
*
psmouse
)
{
{
struct
synaptics_data
*
priv
=
psmouse
->
private
;
unsigned
char
id
[
3
];
unsigned
char
id
[
3
];
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_IDENTIFY
,
id
))
if
(
synaptics_send_cmd
(
psmouse
,
SYN_QUE_IDENTIFY
,
id
))
return
-
1
;
return
-
1
;
*
ident
=
(
id
[
0
]
<<
16
)
|
(
id
[
1
]
<<
8
)
|
id
[
2
];
priv
->
identity
=
(
id
[
0
]
<<
16
)
|
(
id
[
1
]
<<
8
)
|
id
[
2
];
if
(
SYN_ID_IS_SYNAPTICS
(
*
ident
))
if
(
SYN_ID_IS_SYNAPTICS
(
priv
->
identity
))
return
0
;
return
0
;
return
-
1
;
return
-
1
;
}
}
...
@@ -179,7 +182,7 @@ static void print_ident(struct synaptics_data *priv)
...
@@ -179,7 +182,7 @@ static void print_ident(struct synaptics_data *priv)
}
}
}
}
static
int
query_hardware
(
struct
psmouse
*
psmouse
)
static
int
synaptics_
query_hardware
(
struct
psmouse
*
psmouse
)
{
{
struct
synaptics_data
*
priv
=
psmouse
->
private
;
struct
synaptics_data
*
priv
=
psmouse
->
private
;
int
retries
=
0
;
int
retries
=
0
;
...
@@ -188,11 +191,11 @@ static int query_hardware(struct psmouse *psmouse)
...
@@ -188,11 +191,11 @@ static int query_hardware(struct psmouse *psmouse)
while
((
retries
++
<
3
)
&&
synaptics_reset
(
psmouse
))
while
((
retries
++
<
3
)
&&
synaptics_reset
(
psmouse
))
printk
(
KERN_ERR
"synaptics reset failed
\n
"
);
printk
(
KERN_ERR
"synaptics reset failed
\n
"
);
if
(
synaptics_identify
(
psmouse
,
&
priv
->
identity
))
if
(
synaptics_identify
(
psmouse
))
return
-
1
;
return
-
1
;
if
(
synaptics_model_id
(
psmouse
,
&
priv
->
model_id
))
if
(
synaptics_model_id
(
psmouse
))
return
-
1
;
return
-
1
;
if
(
synaptics_capability
(
psmouse
,
&
priv
->
capabilities
,
&
priv
->
ext_cap
))
if
(
synaptics_capability
(
psmouse
))
return
-
1
;
return
-
1
;
mode
=
SYN_BIT_ABSOLUTE_MODE
|
SYN_BIT_HIGH_RATE
;
mode
=
SYN_BIT_ABSOLUTE_MODE
|
SYN_BIT_HIGH_RATE
;
...
@@ -200,7 +203,7 @@ static int query_hardware(struct psmouse *psmouse)
...
@@ -200,7 +203,7 @@ static int query_hardware(struct psmouse *psmouse)
mode
|=
SYN_BIT_DISABLE_GESTURE
;
mode
|=
SYN_BIT_DISABLE_GESTURE
;
if
(
SYN_CAP_EXTENDED
(
priv
->
capabilities
))
if
(
SYN_CAP_EXTENDED
(
priv
->
capabilities
))
mode
|=
SYN_BIT_W_MODE
;
mode
|=
SYN_BIT_W_MODE
;
if
(
synaptics_
set_mode
(
psmouse
,
mode
))
if
(
synaptics_
mode_cmd
(
psmouse
,
mode
))
return
-
1
;
return
-
1
;
return
0
;
return
0
;
...
@@ -286,7 +289,7 @@ int synaptics_pt_init(struct psmouse *psmouse)
...
@@ -286,7 +289,7 @@ int synaptics_pt_init(struct psmouse *psmouse)
/* adjust the touchpad to child's choice of protocol */
/* adjust the touchpad to child's choice of protocol */
child
=
port
->
private
;
child
=
port
->
private
;
if
(
child
&&
child
->
type
>=
PSMOUSE_GENPS
)
{
if
(
child
&&
child
->
type
>=
PSMOUSE_GENPS
)
{
if
(
synaptics_
set_mode
(
psmouse
,
(
SYN_BIT_ABSOLUTE_MODE
|
if
(
synaptics_
mode_cmd
(
psmouse
,
(
SYN_BIT_ABSOLUTE_MODE
|
SYN_BIT_HIGH_RATE
|
SYN_BIT_HIGH_RATE
|
SYN_BIT_DISABLE_GESTURE
|
SYN_BIT_DISABLE_GESTURE
|
SYN_BIT_FOUR_BYTE_CLIENT
|
SYN_BIT_FOUR_BYTE_CLIENT
|
...
@@ -311,46 +314,27 @@ static inline void set_abs_params(struct input_dev *dev, int axis, int min, int
...
@@ -311,46 +314,27 @@ static inline void set_abs_params(struct input_dev *dev, int axis, int min, int
set_bit
(
axis
,
dev
->
absbit
);
set_bit
(
axis
,
dev
->
absbit
);
}
}
int
synaptics_init
(
struct
psmouse
*
psmouse
)
static
void
set_input_params
(
struct
input_dev
*
dev
,
struct
synaptics_data
*
priv
)
{
{
struct
synaptics_data
*
priv
;
#ifndef CONFIG_MOUSE_PS2_SYNAPTICS
return
-
1
;
#endif
psmouse
->
private
=
priv
=
kmalloc
(
sizeof
(
struct
synaptics_data
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
1
;
memset
(
priv
,
0
,
sizeof
(
struct
synaptics_data
));
priv
->
out_of_sync
=
0
;
if
(
query_hardware
(
psmouse
))
{
printk
(
KERN_ERR
"Unable to query/initialize Synaptics hardware.
\n
"
);
goto
init_fail
;
}
print_ident
(
priv
);
/*
/*
* The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
* The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
* which says that they should be valid regardless of the actual size of
* which says that they should be valid regardless of the actual size of
* the sensor.
* the sensor.
*/
*/
set_bit
(
EV_ABS
,
psmouse
->
dev
.
evbit
);
set_bit
(
EV_ABS
,
dev
->
evbit
);
set_abs_params
(
&
psmouse
->
dev
,
ABS_X
,
1472
,
5472
,
0
,
0
);
set_abs_params
(
dev
,
ABS_X
,
1472
,
5472
,
0
,
0
);
set_abs_params
(
&
psmouse
->
dev
,
ABS_Y
,
1408
,
4448
,
0
,
0
);
set_abs_params
(
dev
,
ABS_Y
,
1408
,
4448
,
0
,
0
);
set_abs_params
(
&
psmouse
->
dev
,
ABS_PRESSURE
,
0
,
255
,
0
,
0
);
set_abs_params
(
dev
,
ABS_PRESSURE
,
0
,
255
,
0
,
0
);
set_bit
(
EV_MSC
,
psmouse
->
dev
.
evbit
);
set_bit
(
EV_MSC
,
dev
->
evbit
);
set_bit
(
MSC_GESTURE
,
psmouse
->
dev
.
mscbit
);
set_bit
(
MSC_GESTURE
,
dev
->
mscbit
);
set_bit
(
EV_KEY
,
psmouse
->
dev
.
evbit
);
set_bit
(
EV_KEY
,
dev
->
evbit
);
set_bit
(
BTN_LEFT
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_LEFT
,
dev
->
keybit
);
set_bit
(
BTN_RIGHT
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_RIGHT
,
dev
->
keybit
);
set_bit
(
BTN_FORWARD
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_FORWARD
,
dev
->
keybit
);
set_bit
(
BTN_BACK
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_BACK
,
dev
->
keybit
);
if
(
SYN_CAP_MULTI_BUTTON_NO
(
priv
->
ext_cap
))
if
(
SYN_CAP_MULTI_BUTTON_NO
(
priv
->
ext_cap
))
{
switch
(
SYN_CAP_MULTI_BUTTON_NO
(
priv
->
ext_cap
)
&
~
0x01
)
{
switch
(
SYN_CAP_MULTI_BUTTON_NO
(
priv
->
ext_cap
)
&
~
0x01
)
{
default:
default:
/*
/*
...
@@ -359,22 +343,46 @@ int synaptics_init(struct psmouse *psmouse)
...
@@ -359,22 +343,46 @@ int synaptics_init(struct psmouse *psmouse)
*/
*/
break
;
break
;
case
8
:
case
8
:
set_bit
(
BTN_7
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_7
,
dev
->
keybit
);
set_bit
(
BTN_6
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_6
,
dev
->
keybit
);
case
6
:
case
6
:
set_bit
(
BTN_5
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_5
,
dev
->
keybit
);
set_bit
(
BTN_4
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_4
,
dev
->
keybit
);
case
4
:
case
4
:
set_bit
(
BTN_3
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_3
,
dev
->
keybit
);
set_bit
(
BTN_2
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_2
,
dev
->
keybit
);
case
2
:
case
2
:
set_bit
(
BTN_1
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_1
,
dev
->
keybit
);
set_bit
(
BTN_0
,
psmouse
->
dev
.
keybit
);
set_bit
(
BTN_0
,
dev
->
keybit
);
break
;
break
;
}
}
clear_bit
(
EV_REL
,
psmouse
->
dev
.
evbit
);
}
clear_bit
(
REL_X
,
psmouse
->
dev
.
relbit
);
clear_bit
(
REL_Y
,
psmouse
->
dev
.
relbit
);
clear_bit
(
EV_REL
,
dev
->
evbit
);
clear_bit
(
REL_X
,
dev
->
relbit
);
clear_bit
(
REL_Y
,
dev
->
relbit
);
}
int
synaptics_init
(
struct
psmouse
*
psmouse
)
{
struct
synaptics_data
*
priv
;
#ifndef CONFIG_MOUSE_PS2_SYNAPTICS
return
-
1
;
#endif
psmouse
->
private
=
priv
=
kmalloc
(
sizeof
(
struct
synaptics_data
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
1
;
memset
(
priv
,
0
,
sizeof
(
struct
synaptics_data
));
if
(
synaptics_query_hardware
(
psmouse
))
{
printk
(
KERN_ERR
"Unable to query/initialize Synaptics hardware.
\n
"
);
goto
init_fail
;
}
print_ident
(
priv
);
set_input_params
(
&
psmouse
->
dev
,
priv
);
return
0
;
return
0
;
...
@@ -388,7 +396,7 @@ void synaptics_disconnect(struct psmouse *psmouse)
...
@@ -388,7 +396,7 @@ void synaptics_disconnect(struct psmouse *psmouse)
struct
synaptics_data
*
priv
=
psmouse
->
private
;
struct
synaptics_data
*
priv
=
psmouse
->
private
;
if
(
psmouse
->
type
==
PSMOUSE_SYNAPTICS
&&
priv
)
{
if
(
psmouse
->
type
==
PSMOUSE_SYNAPTICS
&&
priv
)
{
synaptics_
set_mode
(
psmouse
,
0
);
synaptics_
mode_cmd
(
psmouse
,
0
);
if
(
priv
->
ptport
)
{
if
(
priv
->
ptport
)
{
serio_unregister_slave_port
(
priv
->
ptport
);
serio_unregister_slave_port
(
priv
->
ptport
);
kfree
(
priv
->
ptport
);
kfree
(
priv
->
ptport
);
...
@@ -582,19 +590,20 @@ void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
...
@@ -582,19 +590,20 @@ void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
}
}
break
;
break
;
default:
default:
if
(
psmouse
->
pktcnt
>=
6
)
{
/* Full packet received */
if
(
psmouse
->
pktcnt
<
6
)
if
(
priv
->
out_of_sync
)
{
break
;
/* Wait for full packet */
priv
->
out_of_sync
=
0
;
printk
(
KERN_NOTICE
"Synaptics driver resynced.
\n
"
);
}
if
(
priv
->
ptport
&&
synaptics_is_pt_packet
(
psmouse
->
packet
))
if
(
priv
->
out_of_sync
)
{
synaptics_pass_pt_packet
(
priv
->
ptport
,
psmouse
->
packet
);
priv
->
out_of_sync
=
0
;
else
printk
(
KERN_NOTICE
"Synaptics driver resynced.
\n
"
);
synaptics_process_packet
(
psmouse
);
psmouse
->
pktcnt
=
0
;
}
}
if
(
priv
->
ptport
&&
synaptics_is_pt_packet
(
psmouse
->
packet
))
synaptics_pass_pt_packet
(
priv
->
ptport
,
psmouse
->
packet
);
else
synaptics_process_packet
(
psmouse
);
psmouse
->
pktcnt
=
0
;
break
;
break
;
}
}
return
;
return
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment