Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad2e92f9 authored by Dmitry Antipov's avatar Dmitry Antipov
Browse files

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: default avatarDmitry Antipov <dmanti@microsoft.com>
Change-Id: I413022a7a2e8151c002f3fb92f9e902a29f0974c
parent 63fec064
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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
+13 −2
Original line number Diff line number Diff line
@@ -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 },
	{ }
+2 −0
Original line number Diff line number Diff line
@@ -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) },
+2 −0
Original line number Diff line number Diff line
@@ -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)