Commit e839ffab authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Dmitry Torokhov

Input: synaptics - add support for Intertouch devices

Most of the Synaptics devices are connected through PS/2 and a different
bus (SMBus or HID over I2C). The secondary bus capability is indicated by
the InterTouch bit in extended capability 0x0C.

We only enable the InterTouch device to be created for the laptops
registered with the top software button property or those we know that are
functional. In the future, we might change the default to always rely on
the InterTouch bus. Currently, users can enable/disable the feature with
the psmouse parameter synaptics_intertouch.
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 6c53694f
...@@ -78,6 +78,18 @@ config MOUSE_PS2_SYNAPTICS ...@@ -78,6 +78,18 @@ config MOUSE_PS2_SYNAPTICS
If unsure, say Y. If unsure, say Y.
config MOUSE_PS2_SYNAPTICS_SMBUS
bool "Synaptics PS/2 SMbus companion" if EXPERT
default y
depends on MOUSE_PS2
depends on I2C=y || I2C=MOUSE_PS2
select MOUSE_PS2_SMBUS
help
Say Y here if you have a Synaptics RMI4 touchpad connected to
to an SMBus, but enumerated through PS/2.
If unsure, say Y.
config MOUSE_PS2_CYPRESS config MOUSE_PS2_CYPRESS
bool "Cypress PS/2 mouse protocol extension" if EXPERT bool "Cypress PS/2 mouse protocol extension" if EXPERT
default y default y
......
...@@ -773,7 +773,7 @@ static const struct psmouse_protocol psmouse_protocols[] = { ...@@ -773,7 +773,7 @@ static const struct psmouse_protocol psmouse_protocols[] = {
.name = "SynPS/2", .name = "SynPS/2",
.alias = "synaptics", .alias = "synaptics",
.detect = synaptics_detect, .detect = synaptics_detect,
.init = synaptics_init, .init = synaptics_init_absolute,
}, },
{ {
.type = PSMOUSE_SYNAPTICS_RELATIVE, .type = PSMOUSE_SYNAPTICS_RELATIVE,
...@@ -783,6 +783,16 @@ static const struct psmouse_protocol psmouse_protocols[] = { ...@@ -783,6 +783,16 @@ static const struct psmouse_protocol psmouse_protocols[] = {
.init = synaptics_init_relative, .init = synaptics_init_relative,
}, },
#endif #endif
#ifdef CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS
{
.type = PSMOUSE_SYNAPTICS_SMBUS,
.name = "SynSMBus",
.alias = "synaptics-smbus",
.detect = synaptics_detect,
.init = synaptics_init_smbus,
.smbus_companion = true,
},
#endif
#ifdef CONFIG_MOUSE_PS2_ALPS #ifdef CONFIG_MOUSE_PS2_ALPS
{ {
.type = PSMOUSE_ALPS, .type = PSMOUSE_ALPS,
...@@ -1011,6 +1021,7 @@ static int psmouse_extensions(struct psmouse *psmouse, ...@@ -1011,6 +1021,7 @@ static int psmouse_extensions(struct psmouse *psmouse,
unsigned int max_proto, bool set_properties) unsigned int max_proto, bool set_properties)
{ {
bool synaptics_hardware = false; bool synaptics_hardware = false;
int ret;
/* /*
* Always check for focaltech, this is safe as it uses pnp-id * Always check for focaltech, this is safe as it uses pnp-id
...@@ -1073,9 +1084,14 @@ static int psmouse_extensions(struct psmouse *psmouse, ...@@ -1073,9 +1084,14 @@ static int psmouse_extensions(struct psmouse *psmouse,
* enabled first, since we try detecting Synaptics * enabled first, since we try detecting Synaptics
* even when protocol is disabled. * even when protocol is disabled.
*/ */
if (IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS) && if (IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS) ||
(!set_properties || synaptics_init(psmouse) == 0)) { IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)) {
if (!set_properties)
return PSMOUSE_SYNAPTICS; return PSMOUSE_SYNAPTICS;
ret = synaptics_init(psmouse);
if (ret >= 0)
return ret;
} }
/* /*
......
...@@ -66,6 +66,7 @@ enum psmouse_type { ...@@ -66,6 +66,7 @@ enum psmouse_type {
PSMOUSE_FOCALTECH, PSMOUSE_FOCALTECH,
PSMOUSE_VMMOUSE, PSMOUSE_VMMOUSE,
PSMOUSE_BYD, PSMOUSE_BYD,
PSMOUSE_SYNAPTICS_SMBUS,
PSMOUSE_AUTO /* This one should always be last */ PSMOUSE_AUTO /* This one should always be last */
}; };
......
This diff is collapsed.
...@@ -90,6 +90,7 @@ ...@@ -90,6 +90,7 @@
#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
#define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400)
#define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800)
#define SYN_CAP_INTERTOUCH(ex0c) ((ex0c) & 0x004000)
/* /*
* The following descibes response for the 0x10 query. * The following descibes response for the 0x10 query.
...@@ -204,8 +205,10 @@ struct synaptics_data { ...@@ -204,8 +205,10 @@ struct synaptics_data {
void synaptics_module_init(void); void synaptics_module_init(void);
int synaptics_detect(struct psmouse *psmouse, bool set_properties); int synaptics_detect(struct psmouse *psmouse, bool set_properties);
int synaptics_init(struct psmouse *psmouse); int synaptics_init_absolute(struct psmouse *psmouse);
int synaptics_init_relative(struct psmouse *psmouse); int synaptics_init_relative(struct psmouse *psmouse);
int synaptics_init_smbus(struct psmouse *psmouse);
int synaptics_init(struct psmouse *psmouse);
void synaptics_reset(struct psmouse *psmouse); void synaptics_reset(struct psmouse *psmouse);
#endif /* _SYNAPTICS_H */ #endif /* _SYNAPTICS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment