Merge branch 'for-5.14/amd-sfh' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Wed, 30 Jun 2021 07:02:28 +0000 (09:02 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 30 Jun 2021 07:02:28 +0000 (09:02 +0200)
- support for Renoir and Cezanne SoCs
- support for Ambient Light Sensor
- support for Human Presence Detection sensor

all from Basavaraj Natikar

MAINTAINERS
drivers/hid/hid-ids.h
drivers/hid/hid-input.c
drivers/hid/hid-sony.c
drivers/hid/hid-thrustmaster.c
drivers/hid/intel-ish-hid/ishtp-fw-loader.c
drivers/hid/surface-hid/surface_hid.c
drivers/hid/usbhid/usbkbd.c
drivers/hid/wacom_wac.h

index 673cadd..324b9bf 100644 (file)
@@ -973,7 +973,7 @@ F:  drivers/net/ethernet/amd/xgbe/
 
 AMD SENSOR FUSION HUB DRIVER
 M:     Nehal Shah <nehal-bakulchandra.shah@amd.com>
-M:     Sandeep Singh <sandeep.singh@amd.com>
+M:     Basavaraj Natikar <basavaraj.natikar@amd.com>
 L:     linux-input@vger.kernel.org
 S:     Maintained
 F:     Documentation/hid/amd-sfh*
index b84a0a1..63ca595 100644 (file)
 #define USB_DEVICE_ID_HP_X2_10_COVER   0x0755
 #define I2C_DEVICE_ID_HP_SPECTRE_X360_15       0x2817
 #define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN   0x2706
+#define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN   0x261A
 
 #define USB_VENDOR_ID_ELECOM           0x056e
 #define USB_DEVICE_ID_ELECOM_BM084     0x0061
index abbfa91..68c8644 100644 (file)
@@ -326,6 +326,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
          HID_BATTERY_QUIRK_IGNORE },
        { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15),
          HID_BATTERY_QUIRK_IGNORE },
+       { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN),
+         HID_BATTERY_QUIRK_IGNORE },
        {}
 };
 
index 8319b0c..b3722c5 100644 (file)
@@ -597,9 +597,8 @@ struct sony_sc {
        /* DS4 calibration data */
        struct ds4_calibration_data ds4_calib_data[6];
        /* GH Live */
+       struct urb *ghl_urb;
        struct timer_list ghl_poke_timer;
-       struct usb_ctrlrequest *ghl_cr;
-       u8 *ghl_databuf;
 };
 
 static void sony_set_leds(struct sony_sc *sc);
@@ -625,66 +624,54 @@ static inline void sony_schedule_work(struct sony_sc *sc,
 
 static void ghl_magic_poke_cb(struct urb *urb)
 {
-       if (urb) {
-               /* Free sc->ghl_cr and sc->ghl_databuf allocated in
-                * ghl_magic_poke()
-                */
-               kfree(urb->setup_packet);
-               kfree(urb->transfer_buffer);
-       }
+       struct sony_sc *sc = urb->context;
+
+       if (urb->status < 0)
+               hid_err(sc->hdev, "URB transfer failed : %d", urb->status);
+
+       mod_timer(&sc->ghl_poke_timer, jiffies + GHL_GUITAR_POKE_INTERVAL*HZ);
 }
 
 static void ghl_magic_poke(struct timer_list *t)
 {
+       int ret;
        struct sony_sc *sc = from_timer(sc, t, ghl_poke_timer);
 
-       int ret;
+       ret = usb_submit_urb(sc->ghl_urb, GFP_ATOMIC);
+       if (ret < 0)
+               hid_err(sc->hdev, "usb_submit_urb failed: %d", ret);
+}
+
+static int ghl_init_urb(struct sony_sc *sc, struct usb_device *usbdev)
+{
+       struct usb_ctrlrequest *cr;
+       u16 poke_size;
+       u8 *databuf;
        unsigned int pipe;
-       struct urb *urb;
-       struct usb_device *usbdev = to_usb_device(sc->hdev->dev.parent->parent);
-       const u16 poke_size =
-               ARRAY_SIZE(ghl_ps3wiiu_magic_data);
 
+       poke_size = ARRAY_SIZE(ghl_ps3wiiu_magic_data);
        pipe = usb_sndctrlpipe(usbdev, 0);
 
-       if (!sc->ghl_cr) {
-               sc->ghl_cr = kzalloc(sizeof(*sc->ghl_cr), GFP_ATOMIC);
-               if (!sc->ghl_cr)
-                       goto resched;
-       }
-
-       if (!sc->ghl_databuf) {
-               sc->ghl_databuf = kzalloc(poke_size, GFP_ATOMIC);
-               if (!sc->ghl_databuf)
-                       goto resched;
-       }
+       cr = devm_kzalloc(&sc->hdev->dev, sizeof(*cr), GFP_ATOMIC);
+       if (cr == NULL)
+               return -ENOMEM;
 
-       urb = usb_alloc_urb(0, GFP_ATOMIC);
-       if (!urb)
-               goto resched;
+       databuf = devm_kzalloc(&sc->hdev->dev, poke_size, GFP_ATOMIC);
+       if (databuf == NULL)
+               return -ENOMEM;
 
-       sc->ghl_cr->bRequestType =
+       cr->bRequestType =
                USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT;
-       sc->ghl_cr->bRequest = USB_REQ_SET_CONFIGURATION;
-       sc->ghl_cr->wValue = cpu_to_le16(ghl_ps3wiiu_magic_value);
-       sc->ghl_cr->wIndex = 0;
-       sc->ghl_cr->wLength = cpu_to_le16(poke_size);
-       memcpy(sc->ghl_databuf, ghl_ps3wiiu_magic_data, poke_size);
-
+       cr->bRequest = USB_REQ_SET_CONFIGURATION;
+       cr->wValue = cpu_to_le16(ghl_ps3wiiu_magic_value);
+       cr->wIndex = 0;
+       cr->wLength = cpu_to_le16(poke_size);
+       memcpy(databuf, ghl_ps3wiiu_magic_data, poke_size);
        usb_fill_control_urb(
-               urb, usbdev, pipe,
-               (unsigned char *) sc->ghl_cr, sc->ghl_databuf,
-               poke_size, ghl_magic_poke_cb, NULL);
-       ret = usb_submit_urb(urb, GFP_ATOMIC);
-       if (ret < 0) {
-               kfree(sc->ghl_databuf);
-               kfree(sc->ghl_cr);
-       }
-       usb_free_urb(urb);
-
-resched:
-       /* Reschedule for next time */
-       mod_timer(&sc->ghl_poke_timer, jiffies + GHL_GUITAR_POKE_INTERVAL*HZ);
+               sc->ghl_urb, usbdev, pipe,
+               (unsigned char *) cr, databuf, poke_size,
+               ghl_magic_poke_cb, sc);
+       return 0;
 }
 
 static int guitar_mapping(struct hid_device *hdev, struct hid_input *hi,
@@ -2981,6 +2968,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
        int ret;
        unsigned long quirks = id->driver_data;
        struct sony_sc *sc;
+       struct usb_device *usbdev;
        unsigned int connect_mask = HID_CONNECT_DEFAULT;
 
        if (!strcmp(hdev->name, "FutureMax Dance Mat"))
@@ -3000,6 +2988,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
        sc->quirks = quirks;
        hid_set_drvdata(hdev, sc);
        sc->hdev = hdev;
+       usbdev = to_usb_device(sc->hdev->dev.parent->parent);
 
        ret = hid_parse(hdev);
        if (ret) {
@@ -3042,6 +3031,15 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
        }
 
        if (sc->quirks & GHL_GUITAR_PS3WIIU) {
+               sc->ghl_urb = usb_alloc_urb(0, GFP_ATOMIC);
+               if (!sc->ghl_urb)
+                       return -ENOMEM;
+               ret = ghl_init_urb(sc, usbdev);
+               if (ret) {
+                       hid_err(hdev, "error preparing URB\n");
+                       return ret;
+               }
+
                timer_setup(&sc->ghl_poke_timer, ghl_magic_poke, 0);
                mod_timer(&sc->ghl_poke_timer,
                          jiffies + GHL_GUITAR_POKE_INTERVAL*HZ);
@@ -3054,8 +3052,10 @@ static void sony_remove(struct hid_device *hdev)
 {
        struct sony_sc *sc = hid_get_drvdata(hdev);
 
-       if (sc->quirks & GHL_GUITAR_PS3WIIU)
+       if (sc->quirks & GHL_GUITAR_PS3WIIU) {
                del_timer_sync(&sc->ghl_poke_timer);
+               usb_free_urb(sc->ghl_urb);
+       }
 
        hid_hw_close(hdev);
 
index f643b1c..cdc7d82 100644 (file)
@@ -311,12 +311,13 @@ static int thrustmaster_probe(struct hid_device *hdev, const struct hid_device_i
                goto error4;
        }
 
-       tm_wheel->change_request = kzalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
+       tm_wheel->change_request = kmemdup(&change_request,
+                                          sizeof(struct usb_ctrlrequest),
+                                          GFP_KERNEL);
        if (!tm_wheel->change_request) {
                ret = -ENOMEM;
                goto error5;
        }
-       memcpy(tm_wheel->change_request, &change_request, sizeof(struct usb_ctrlrequest));
 
        tm_wheel->usb_dev = interface_to_usbdev(to_usb_interface(hdev->dev.parent));
        hid_set_drvdata(hdev, tm_wheel);
index 6cf59fd..a8fe893 100644 (file)
@@ -455,7 +455,7 @@ static void loader_cl_event_cb(struct ishtp_cl_device *cl_device)
 /**
  * ish_query_loader_prop() -  Query ISH Shim firmware loader
  * @client_data:       Client data instance
- * @fw:                        Poiner to firmware data struct in host memory
+ * @fw:                        Pointer to firmware data struct in host memory
  * @fw_info:           Loader firmware properties
  *
  * This function queries the ISH Shim firmware loader for capabilities.
index 3477b31..a3a70e4 100644 (file)
@@ -143,7 +143,7 @@ static int ssam_hid_get_raw_report(struct surface_hid_device *shid, u8 rprt_id,
        rqst.target_id = shid->uid.target;
        rqst.instance_id = shid->uid.instance;
        rqst.command_id = SURFACE_HID_CID_GET_FEATURE_REPORT;
-       rqst.flags = 0;
+       rqst.flags = SSAM_REQUEST_HAS_RESPONSE;
        rqst.length = sizeof(rprt_id);
        rqst.payload = &rprt_id;
 
index e22434d..df02002 100644 (file)
@@ -239,11 +239,11 @@ static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd)
                return -1;
        if (!(kbd->led = usb_alloc_urb(0, GFP_KERNEL)))
                return -1;
-       if (!(kbd->new = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &kbd->new_dma)))
+       if (!(kbd->new = usb_alloc_coherent(dev, 8, GFP_KERNEL, &kbd->new_dma)))
                return -1;
        if (!(kbd->cr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL)))
                return -1;
-       if (!(kbd->leds = usb_alloc_coherent(dev, 1, GFP_ATOMIC, &kbd->leds_dma)))
+       if (!(kbd->leds = usb_alloc_coherent(dev, 1, GFP_KERNEL, &kbd->leds_dma)))
                return -1;
 
        return 0;
index 71c8862..8f16654 100644 (file)
 #define WACOM_HID_WD_TOUCHONOFF         (WACOM_HID_UP_WACOMDIGITIZER | 0x0454)
 #define WACOM_HID_WD_BATTERY_LEVEL      (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
 #define WACOM_HID_WD_EXPRESSKEY00       (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
-#define WACOM_HID_WD_EXPRESSKEYCAP00    (WACOM_HID_UP_WACOMDIGITIZER | 0x0950)
+#define WACOM_HID_WD_EXPRESSKEYCAP00    (WACOM_HID_UP_WACOMDIGITIZER | 0x0940)
 #define WACOM_HID_WD_MODE_CHANGE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0980)
 #define WACOM_HID_WD_MUTE_DEVICE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0981)
 #define WACOM_HID_WD_CONTROLPANEL       (WACOM_HID_UP_WACOMDIGITIZER | 0x0982)