Merge tag 'v3.19-rc4' into next
Merge with mainline to bring in the latest thermal and other changes.
This commit is contained in:
@@ -846,8 +846,8 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
|
||||
f->fingers = alps_process_bitmap(priv, f);
|
||||
}
|
||||
|
||||
f->left = packet[4] & 0x01;
|
||||
f->right = packet[4] & 0x02;
|
||||
f->left = !!(packet[4] & 0x01);
|
||||
f->right = !!(packet[4] & 0x02);
|
||||
|
||||
f->st.x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) |
|
||||
((packet[0] & 0x30) >> 4);
|
||||
@@ -1238,7 +1238,13 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
||||
{
|
||||
struct alps_data *priv = psmouse->private;
|
||||
|
||||
if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */
|
||||
/*
|
||||
* Check if we are dealing with a bare PS/2 packet, presumably from
|
||||
* a device connected to the external PS/2 port. Because bare PS/2
|
||||
* protocol does not have enough constant bits to self-synchronize
|
||||
* properly we only do this if the device is fully synchronized.
|
||||
*/
|
||||
if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) {
|
||||
if (psmouse->pktcnt == 3) {
|
||||
alps_report_bare_ps2_packet(psmouse, psmouse->packet,
|
||||
true);
|
||||
@@ -1262,12 +1268,27 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
||||
}
|
||||
|
||||
/* Bytes 2 - pktsize should have 0 in the highest bit */
|
||||
if ((priv->proto_version < ALPS_PROTO_V5) &&
|
||||
if (priv->proto_version < ALPS_PROTO_V5 &&
|
||||
psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&
|
||||
(psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
|
||||
psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
|
||||
psmouse->pktcnt - 1,
|
||||
psmouse->packet[psmouse->pktcnt - 1]);
|
||||
|
||||
if (priv->proto_version == ALPS_PROTO_V3 &&
|
||||
psmouse->pktcnt == psmouse->pktsize) {
|
||||
/*
|
||||
* Some Dell boxes, such as Latitude E6440 or E7440
|
||||
* with closed lid, quite often smash last byte of
|
||||
* otherwise valid packet with 0xff. Given that the
|
||||
* next packet is very likely to be valid let's
|
||||
* report PSMOUSE_FULL_PACKET but not process data,
|
||||
* rather than reporting PSMOUSE_BAD_DATA and
|
||||
* filling the logs.
|
||||
*/
|
||||
return PSMOUSE_FULL_PACKET;
|
||||
}
|
||||
|
||||
return PSMOUSE_BAD_DATA;
|
||||
}
|
||||
|
||||
@@ -2481,6 +2502,9 @@ int alps_init(struct psmouse *psmouse)
|
||||
/* We are having trouble resyncing ALPS touchpads so disable it for now */
|
||||
psmouse->resync_time = 0;
|
||||
|
||||
/* Allow 2 invalid packets without resetting device */
|
||||
psmouse->resetafter = psmouse->pktsize * 2;
|
||||
|
||||
return 0;
|
||||
|
||||
init_fail:
|
||||
|
@@ -141,7 +141,6 @@ static struct platform_driver amimouse_driver = {
|
||||
.remove = __exit_p(amimouse_remove),
|
||||
.driver = {
|
||||
.name = "amiga-mouse",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
|
@@ -428,14 +428,6 @@ static void elantech_report_trackpoint(struct psmouse *psmouse,
|
||||
int x, y;
|
||||
u32 t;
|
||||
|
||||
if (dev_WARN_ONCE(&psmouse->ps2dev.serio->dev,
|
||||
!tp_dev,
|
||||
psmouse_fmt("Unexpected trackpoint message\n"))) {
|
||||
if (etd->debug == 1)
|
||||
elantech_packet_dump(psmouse);
|
||||
return;
|
||||
}
|
||||
|
||||
t = get_unaligned_le32(&packet[0]);
|
||||
|
||||
switch (t & ~7U) {
|
||||
@@ -563,6 +555,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);
|
||||
@@ -792,6 +785,9 @@ static int elantech_packet_check_v4(struct psmouse *psmouse)
|
||||
unsigned char packet_type = packet[3] & 0x03;
|
||||
bool sanity_check;
|
||||
|
||||
if (etd->tp_dev && (packet[3] & 0x0f) == 0x06)
|
||||
return PACKET_TRACKPOINT;
|
||||
|
||||
/*
|
||||
* Sanity check based on the constant bits of a packet.
|
||||
* The constant bits change depending on the value of
|
||||
@@ -877,10 +873,19 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse)
|
||||
|
||||
case 4:
|
||||
packet_type = elantech_packet_check_v4(psmouse);
|
||||
if (packet_type == PACKET_UNKNOWN)
|
||||
switch (packet_type) {
|
||||
case PACKET_UNKNOWN:
|
||||
return PSMOUSE_BAD_DATA;
|
||||
|
||||
elantech_report_absolute_v4(psmouse, packet_type);
|
||||
case PACKET_TRACKPOINT:
|
||||
elantech_report_trackpoint(psmouse, packet_type);
|
||||
break;
|
||||
|
||||
default:
|
||||
elantech_report_absolute_v4(psmouse, packet_type);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1119,6 +1124,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
|
||||
*/
|
||||
@@ -1138,6 +1159,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);
|
||||
@@ -1299,6 +1322,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,
|
||||
@@ -1313,6 +1337,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
|
||||
};
|
||||
|
||||
@@ -1438,6 +1463,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some hw_version 4 models do not work with crc_disabled
|
||||
*/
|
||||
static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
|
||||
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
||||
{
|
||||
/* Fujitsu H730 does not work with crc_enabled == 0 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
||||
/*
|
||||
* Some hw_version 3 models go into error state when we try to set
|
||||
* bit 3 and/or bit 1 of r10.
|
||||
@@ -1513,7 +1554,8 @@ static int elantech_set_properties(struct elantech_data *etd)
|
||||
* The signatures of v3 and v4 packets change depending on the
|
||||
* value of this hardware flag.
|
||||
*/
|
||||
etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
|
||||
etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 ||
|
||||
dmi_check_system(elantech_dmi_force_crc_enabled);
|
||||
|
||||
/* Enable real hardware resolution on hw_version 3 ? */
|
||||
etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
|
||||
|
@@ -171,7 +171,6 @@ static struct platform_driver gpio_mouse_device_driver = {
|
||||
.remove = gpio_mouse_remove,
|
||||
.driver = {
|
||||
.name = "gpio_mouse",
|
||||
.owner = THIS_MODULE,
|
||||
}
|
||||
};
|
||||
module_platform_driver(gpio_mouse_device_driver);
|
||||
|
@@ -353,7 +353,6 @@ static struct platform_driver navpoint_driver = {
|
||||
.remove = navpoint_remove,
|
||||
.driver = {
|
||||
.name = "navpoint",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &navpoint_pm_ops,
|
||||
},
|
||||
};
|
||||
|
@@ -1548,16 +1548,9 @@ static int psmouse_reconnect(struct serio *serio)
|
||||
{
|
||||
struct psmouse *psmouse = serio_get_drvdata(serio);
|
||||
struct psmouse *parent = NULL;
|
||||
struct serio_driver *drv = serio->drv;
|
||||
unsigned char type;
|
||||
int rc = -1;
|
||||
|
||||
if (!drv || !psmouse) {
|
||||
psmouse_dbg(psmouse,
|
||||
"reconnect request, but serio is disconnected, ignoring...\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
mutex_lock(&psmouse_mutex);
|
||||
|
||||
if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
|
||||
|
@@ -135,14 +135,18 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
|
||||
1232, 5710, 1156, 4696
|
||||
},
|
||||
{
|
||||
(const char * const []){"LEN0034", "LEN0036", "LEN2002",
|
||||
"LEN2004", NULL},
|
||||
(const char * const []){"LEN0034", "LEN0036", "LEN0039",
|
||||
"LEN2002", "LEN2004", NULL},
|
||||
1024, 5112, 2024, 4832
|
||||
},
|
||||
{
|
||||
(const char * const []){"LEN2001", NULL},
|
||||
1024, 5022, 2508, 4832
|
||||
},
|
||||
{
|
||||
(const char * const []){"LEN2006", NULL},
|
||||
1264, 5675, 1171, 4688
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -163,6 +167,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
||||
"LEN0036", /* T440 */
|
||||
"LEN0037",
|
||||
"LEN0038",
|
||||
"LEN0039", /* T440s */
|
||||
"LEN0041",
|
||||
"LEN0042", /* Yoga */
|
||||
"LEN0045",
|
||||
|
@@ -128,7 +128,7 @@ static void vsxxxaa_drop_bytes(struct vsxxxaa *mouse, int num)
|
||||
if (num >= mouse->count) {
|
||||
mouse->count = 0;
|
||||
} else {
|
||||
memmove(mouse->buf, mouse->buf + num - 1, BUFLEN - num);
|
||||
memmove(mouse->buf, mouse->buf + num, BUFLEN - num);
|
||||
mouse->count -= num;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user