Commit 6433fe06 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'input-for-v6.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull input fixes from Dmitry Torokhov:

 - GT1158 ID added to Goodix touchscreen driver

 - Boeder Force Feedback Wheel USB added to iforce joystick driver

 - fixup for iforce driver to avoid hangups

 - fix autoloading of rk805-pwrkey driver.

* tag 'input-for-v6.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: iforce - add support for Boeder Force Feedback Wheel
  Input: iforce - wake up after clearing IFORCE_XMIT_RUNNING flag
  Input: goodix - add compatible string for GT1158
  MAINTAINERS: add include/dt-bindings/input to INPUT DRIVERS
  Input: rk805-pwrkey - fix module autoloading
  Input: goodix - add support for GT1158
  dt-bindings: input: touchscreen: add compatible string for Goodix GT1158
parents 42cf58c2 9c9c7116
...@@ -16,6 +16,7 @@ properties: ...@@ -16,6 +16,7 @@ properties:
compatible: compatible:
enum: enum:
- goodix,gt1151 - goodix,gt1151
- goodix,gt1158
- goodix,gt5663 - goodix,gt5663
- goodix,gt5688 - goodix,gt5688
- goodix,gt911 - goodix,gt911
......
...@@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes: ...@@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes:
* AVB Mag Turbo Force * AVB Mag Turbo Force
* AVB Top Shot Pegasus * AVB Top Shot Pegasus
* AVB Top Shot Force Feedback Racing Wheel * AVB Top Shot Force Feedback Racing Wheel
* Boeder Force Feedback Wheel
* Logitech WingMan Force * Logitech WingMan Force
* Logitech WingMan Force Wheel * Logitech WingMan Force Wheel
* Guillemot Race Leader Force Feedback * Guillemot Race Leader Force Feedback
......
...@@ -10032,6 +10032,7 @@ F: Documentation/devicetree/bindings/input/ ...@@ -10032,6 +10032,7 @@ F: Documentation/devicetree/bindings/input/
F: Documentation/devicetree/bindings/serio/ F: Documentation/devicetree/bindings/serio/
F: Documentation/input/ F: Documentation/input/
F: drivers/input/ F: drivers/input/
F: include/dt-bindings/input/
F: include/linux/input.h F: include/linux/input.h
F: include/linux/input/ F: include/linux/input/
F: include/uapi/linux/input-event-codes.h F: include/uapi/linux/input-event-codes.h
......
...@@ -50,6 +50,7 @@ static struct iforce_device iforce_device[] = { ...@@ -50,6 +50,7 @@ static struct iforce_device iforce_device[] = {
{ 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce }, { 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce },
{ 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_joystick_avb, abs_avb_pegasus, ff_iforce }, { 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_joystick_avb, abs_avb_pegasus, ff_iforce },
{ 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_wheel, abs_wheel, ff_iforce }, { 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_wheel, abs_wheel, ff_iforce },
{ 0x05ef, 0x8886, "Boeder Force Feedback Wheel", btn_wheel, abs_wheel, ff_iforce },
{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? { 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //?
{ 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //?
{ 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce },
......
...@@ -39,7 +39,7 @@ static void iforce_serio_xmit(struct iforce *iforce) ...@@ -39,7 +39,7 @@ static void iforce_serio_xmit(struct iforce *iforce)
again: again:
if (iforce->xmit.head == iforce->xmit.tail) { if (iforce->xmit.head == iforce->xmit.tail) {
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); iforce_clear_xmit_and_wake(iforce);
spin_unlock_irqrestore(&iforce->xmit_lock, flags); spin_unlock_irqrestore(&iforce->xmit_lock, flags);
return; return;
} }
...@@ -64,7 +64,7 @@ static void iforce_serio_xmit(struct iforce *iforce) ...@@ -64,7 +64,7 @@ static void iforce_serio_xmit(struct iforce *iforce)
if (test_and_clear_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags)) if (test_and_clear_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags))
goto again; goto again;
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); iforce_clear_xmit_and_wake(iforce);
spin_unlock_irqrestore(&iforce->xmit_lock, flags); spin_unlock_irqrestore(&iforce->xmit_lock, flags);
} }
...@@ -169,7 +169,7 @@ static irqreturn_t iforce_serio_irq(struct serio *serio, ...@@ -169,7 +169,7 @@ static irqreturn_t iforce_serio_irq(struct serio *serio,
iforce_serio->cmd_response_len = iforce_serio->len; iforce_serio->cmd_response_len = iforce_serio->len;
/* Signal that command is done */ /* Signal that command is done */
wake_up(&iforce->wait); wake_up_all(&iforce->wait);
} else if (likely(iforce->type)) { } else if (likely(iforce->type)) {
iforce_process_packet(iforce, iforce_serio->id, iforce_process_packet(iforce, iforce_serio->id,
iforce_serio->data_in, iforce_serio->data_in,
......
...@@ -30,7 +30,7 @@ static void __iforce_usb_xmit(struct iforce *iforce) ...@@ -30,7 +30,7 @@ static void __iforce_usb_xmit(struct iforce *iforce)
spin_lock_irqsave(&iforce->xmit_lock, flags); spin_lock_irqsave(&iforce->xmit_lock, flags);
if (iforce->xmit.head == iforce->xmit.tail) { if (iforce->xmit.head == iforce->xmit.tail) {
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); iforce_clear_xmit_and_wake(iforce);
spin_unlock_irqrestore(&iforce->xmit_lock, flags); spin_unlock_irqrestore(&iforce->xmit_lock, flags);
return; return;
} }
...@@ -58,9 +58,9 @@ static void __iforce_usb_xmit(struct iforce *iforce) ...@@ -58,9 +58,9 @@ static void __iforce_usb_xmit(struct iforce *iforce)
XMIT_INC(iforce->xmit.tail, n); XMIT_INC(iforce->xmit.tail, n);
if ( (n=usb_submit_urb(iforce_usb->out, GFP_ATOMIC)) ) { if ( (n=usb_submit_urb(iforce_usb->out, GFP_ATOMIC)) ) {
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags);
dev_warn(&iforce_usb->intf->dev, dev_warn(&iforce_usb->intf->dev,
"usb_submit_urb failed %d\n", n); "usb_submit_urb failed %d\n", n);
iforce_clear_xmit_and_wake(iforce);
} }
/* The IFORCE_XMIT_RUNNING bit is not cleared here. That's intended. /* The IFORCE_XMIT_RUNNING bit is not cleared here. That's intended.
...@@ -175,15 +175,15 @@ static void iforce_usb_out(struct urb *urb) ...@@ -175,15 +175,15 @@ static void iforce_usb_out(struct urb *urb)
struct iforce *iforce = &iforce_usb->iforce; struct iforce *iforce = &iforce_usb->iforce;
if (urb->status) { if (urb->status) {
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags);
dev_dbg(&iforce_usb->intf->dev, "urb->status %d, exiting\n", dev_dbg(&iforce_usb->intf->dev, "urb->status %d, exiting\n",
urb->status); urb->status);
iforce_clear_xmit_and_wake(iforce);
return; return;
} }
__iforce_usb_xmit(iforce); __iforce_usb_xmit(iforce);
wake_up(&iforce->wait); wake_up_all(&iforce->wait);
} }
static int iforce_usb_probe(struct usb_interface *intf, static int iforce_usb_probe(struct usb_interface *intf,
......
...@@ -119,6 +119,12 @@ static inline int iforce_get_id_packet(struct iforce *iforce, u8 id, ...@@ -119,6 +119,12 @@ static inline int iforce_get_id_packet(struct iforce *iforce, u8 id,
response_data, response_len); response_data, response_len);
} }
static inline void iforce_clear_xmit_and_wake(struct iforce *iforce)
{
clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags);
wake_up_all(&iforce->wait);
}
/* Public functions */ /* Public functions */
/* iforce-main.c */ /* iforce-main.c */
int iforce_init_device(struct device *parent, u16 bustype, int iforce_init_device(struct device *parent, u16 bustype,
......
...@@ -98,6 +98,7 @@ static struct platform_driver rk805_pwrkey_driver = { ...@@ -98,6 +98,7 @@ static struct platform_driver rk805_pwrkey_driver = {
}; };
module_platform_driver(rk805_pwrkey_driver); module_platform_driver(rk805_pwrkey_driver);
MODULE_ALIAS("platform:rk805-pwrkey");
MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>"); MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>");
MODULE_DESCRIPTION("RK805 PMIC Power Key driver"); MODULE_DESCRIPTION("RK805 PMIC Power Key driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -95,6 +95,7 @@ static const struct goodix_chip_data gt9x_chip_data = { ...@@ -95,6 +95,7 @@ static const struct goodix_chip_data gt9x_chip_data = {
static const struct goodix_chip_id goodix_chip_ids[] = { static const struct goodix_chip_id goodix_chip_ids[] = {
{ .id = "1151", .data = &gt1x_chip_data }, { .id = "1151", .data = &gt1x_chip_data },
{ .id = "1158", .data = &gt1x_chip_data },
{ .id = "5663", .data = &gt1x_chip_data }, { .id = "5663", .data = &gt1x_chip_data },
{ .id = "5688", .data = &gt1x_chip_data }, { .id = "5688", .data = &gt1x_chip_data },
{ .id = "917S", .data = &gt1x_chip_data }, { .id = "917S", .data = &gt1x_chip_data },
...@@ -1508,6 +1509,7 @@ MODULE_DEVICE_TABLE(acpi, goodix_acpi_match); ...@@ -1508,6 +1509,7 @@ MODULE_DEVICE_TABLE(acpi, goodix_acpi_match);
#ifdef CONFIG_OF #ifdef CONFIG_OF
static const struct of_device_id goodix_of_match[] = { static const struct of_device_id goodix_of_match[] = {
{ .compatible = "goodix,gt1151" }, { .compatible = "goodix,gt1151" },
{ .compatible = "goodix,gt1158" },
{ .compatible = "goodix,gt5663" }, { .compatible = "goodix,gt5663" },
{ .compatible = "goodix,gt5688" }, { .compatible = "goodix,gt5688" },
{ .compatible = "goodix,gt911" }, { .compatible = "goodix,gt911" },
......
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