From 427ee20610a7c252e99d08e08e70a4203c6059d0 Mon Sep 17 00:00:00 2001 From: Stephen Just Date: Fri, 27 May 2016 16:28:09 -0700 Subject: [PATCH] Input: surface3_spi - Prepare to add support for Surface Pen Surface Pens can be supported by handling a second report type. Prepare for this change. Signed-off-by: Stephen Just Reviewed-and-tested-by: Benjamin Tissoires Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/surface3_spi.c | 39 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/input/touchscreen/surface3_spi.c b/drivers/input/touchscreen/surface3_spi.c index e18e7425de8e..e6cea7ed3d0e 100644 --- a/drivers/input/touchscreen/surface3_spi.c +++ b/drivers/input/touchscreen/surface3_spi.c @@ -26,6 +26,8 @@ #define SURFACE3_PACKET_SIZE 264 +#define SURFACE3_REPORT_TOUCH 0xd2 + struct surface3_ts_data { struct spi_device *spi; struct gpio_desc *gpiod_rst[2]; @@ -83,19 +85,10 @@ static void surface3_spi_report_touch(struct surface3_ts_data *ts_data, } } -static void surface3_spi_process(struct surface3_ts_data *ts_data) +static void surface3_spi_process_touch(struct surface3_ts_data *ts_data, u8 *data) { - const char header[] = {0xff, 0xff, 0xff, 0xff, 0xa5, 0x5a, 0xe7, 0x7e, - 0x01, 0xd2, 0x00, 0x80, 0x01, 0x03, 0x03}; - u8 *data = ts_data->rd_buf; u16 timestamp; unsigned int i; - - if (memcmp(header, data, sizeof(header))) - dev_err(&ts_data->spi->dev, - "%s header error: %*ph, ignoring...\n", - __func__, (int)sizeof(header), data); - timestamp = get_unaligned_le16(&data[15]); for (i = 0; i < 13; i++) { @@ -120,6 +113,26 @@ static void surface3_spi_process(struct surface3_ts_data *ts_data) input_sync(ts_data->input_dev); } +static void surface3_spi_process(struct surface3_ts_data *ts_data) +{ + const char header[] = { + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x5a, 0xe7, 0x7e, 0x01 + }; + u8 *data = ts_data->rd_buf; + + if (memcmp(header, data, sizeof(header))) + dev_err(&ts_data->spi->dev, + "%s header error: %*ph, ignoring...\n", + __func__, (int)sizeof(header), data); + + if (data[9] == SURFACE3_REPORT_TOUCH) + surface3_spi_process_touch(ts_data, data); + else + dev_err(&ts_data->spi->dev, + "%s unknown packet type: %x, ignoring...\n", + __func__, data[9]); +} + static irqreturn_t surface3_spi_irq_handler(int irq, void *dev_id) { struct surface3_ts_data *data = dev_id; @@ -175,7 +188,7 @@ static int surface3_spi_get_gpio_config(struct surface3_ts_data *data) return 0; } -static int surface3_spi_create_input(struct surface3_ts_data *data) +static int surface3_spi_create_touch_input(struct surface3_ts_data *data) { struct input_dev *input; int error; @@ -198,7 +211,7 @@ static int surface3_spi_create_input(struct surface3_ts_data *data) input->phys = "input/ts"; input->id.bustype = BUS_SPI; input->id.vendor = 0x045e; /* Microsoft */ - input->id.product = 0x0000; + input->id.product = 0x0001; input->id.version = 0x0000; error = input_register_device(input); @@ -238,7 +251,7 @@ static int surface3_spi_probe(struct spi_device *spi) surface3_spi_power(data, false); surface3_spi_power(data, true); - error = surface3_spi_create_input(data); + error = surface3_spi_create_touch_input(data); if (error) return error;