FROMLIST: HID: Support Microsoft SPI touch digitizer driver
Microsoft uses a touch digitizer that communicates to the main SoC via SPI and presents itself as a HID device. This patch contains the changes needed for the driver to work as a module: HID Core affordances for SPI devices, addition of the new Device IDs, and a new quirk in hid-microsoft. Bug: 194673479 Link: https://lore.kernel.org/linux-input/20210812001250.1709418-1-dmanti@microsoft.com/ Signed-off-by: Dmitry Antipov <dmanti@microsoft.com> Change-Id: I413022a7a2e8151c002f3fb92f9e902a29f0974c
This commit is contained in:
@@ -1998,6 +1998,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
||||
case BUS_I2C:
|
||||
bus = "I2C";
|
||||
break;
|
||||
case BUS_SPI:
|
||||
bus = "SPI";
|
||||
break;
|
||||
case BUS_VIRTUAL:
|
||||
bus = "VIRTUAL";
|
||||
break;
|
||||
|
||||
@@ -860,6 +860,8 @@
|
||||
#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
||||
#define USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER 0x02fd
|
||||
#define USB_DEVICE_ID_MS_PIXART_MOUSE 0x00cb
|
||||
#define SPI_DEVICE_ID_MS_SURFACE_D6_0 0x0c1d
|
||||
#define SPI_DEVICE_ID_MS_SURFACE_D6_1 0x0c42
|
||||
#define USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS 0x02e0
|
||||
|
||||
#define USB_VENDOR_ID_MOJO 0x8282
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#define MS_DUPLICATE_USAGES BIT(5)
|
||||
#define MS_SURFACE_DIAL BIT(6)
|
||||
#define MS_QUIRK_FF BIT(7)
|
||||
#define MS_NOHIDINPUT BIT(8)
|
||||
|
||||
struct ms_data {
|
||||
unsigned long quirks;
|
||||
@@ -370,6 +371,7 @@ static int ms_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
unsigned long quirks = id->driver_data;
|
||||
struct ms_data *ms;
|
||||
int ret;
|
||||
unsigned int connect_mask;
|
||||
|
||||
ms = devm_kzalloc(&hdev->dev, sizeof(*ms), GFP_KERNEL);
|
||||
if (ms == NULL)
|
||||
@@ -379,20 +381,25 @@ static int ms_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
|
||||
hid_set_drvdata(hdev, ms);
|
||||
|
||||
connect_mask = HID_CONNECT_DEFAULT | ((quirks & MS_HIDINPUT) ?
|
||||
HID_CONNECT_HIDINPUT_FORCE : 0);
|
||||
|
||||
if (quirks & MS_NOGET)
|
||||
hdev->quirks |= HID_QUIRK_NOGET;
|
||||
|
||||
if (quirks & MS_SURFACE_DIAL)
|
||||
hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
|
||||
|
||||
if (quirks & MS_NOHIDINPUT)
|
||||
connect_mask &= ~HID_CONNECT_HIDINPUT;
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | ((quirks & MS_HIDINPUT) ?
|
||||
HID_CONNECT_HIDINPUT_FORCE : 0));
|
||||
ret = hid_hw_start(hdev, connect_mask);
|
||||
if (ret) {
|
||||
hid_err(hdev, "hw start failed\n");
|
||||
goto err_free;
|
||||
@@ -451,6 +458,10 @@ static const struct hid_device_id ms_devices[] = {
|
||||
.driver_data = MS_SURFACE_DIAL },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER),
|
||||
.driver_data = MS_QUIRK_FF },
|
||||
{ HID_SPI_DEVICE(USB_VENDOR_ID_MICROSOFT, SPI_DEVICE_ID_MS_SURFACE_D6_0),
|
||||
.driver_data = MS_NOHIDINPUT },
|
||||
{ HID_SPI_DEVICE(USB_VENDOR_ID_MICROSOFT, SPI_DEVICE_ID_MS_SURFACE_D6_1),
|
||||
.driver_data = MS_NOHIDINPUT },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS),
|
||||
.driver_data = MS_QUIRK_FF },
|
||||
{ }
|
||||
|
||||
@@ -513,6 +513,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
|
||||
{ HID_SPI_DEVICE(USB_VENDOR_ID_MICROSOFT, SPI_DEVICE_ID_MS_SURFACE_D6_0) },
|
||||
{ HID_SPI_DEVICE(USB_VENDOR_ID_MICROSOFT, SPI_DEVICE_ID_MS_SURFACE_D6_1) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_MONTEREY)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
|
||||
|
||||
@@ -681,6 +681,8 @@ struct hid_descriptor {
|
||||
.bus = BUS_BLUETOOTH, .vendor = (ven), .product = (prod)
|
||||
#define HID_I2C_DEVICE(ven, prod) \
|
||||
.bus = BUS_I2C, .vendor = (ven), .product = (prod)
|
||||
#define HID_SPI_DEVICE(ven, prod) \
|
||||
.bus = BUS_SPI, .vendor = (ven), .product = (prod)
|
||||
|
||||
#define HID_REPORT_ID(rep) \
|
||||
.report_type = (rep)
|
||||
|
||||
Reference in New Issue
Block a user