From patchwork Tue Jun 23 19:17:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 6662921 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 2C2869F1C1 for ; Tue, 23 Jun 2015 19:20:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3530420652 for ; Tue, 23 Jun 2015 19:20:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 04D9F2062D for ; Tue, 23 Jun 2015 19:20:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932552AbbFWTUP (ORCPT ); Tue, 23 Jun 2015 15:20:15 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34575 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932801AbbFWTRi (ORCPT ); Tue, 23 Jun 2015 15:17:38 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 823DA36B1A6; Tue, 23 Jun 2015 19:17:38 +0000 (UTC) Received: from t540p.bos.redhat.com (dhcp-25-39.bos.redhat.com [10.18.25.39]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t5NJHZLo016968; Tue, 23 Jun 2015 15:17:37 -0400 From: Benjamin Tissoires To: Dmitry Torokhov , Andrew Duggan , Christopher Heiny , Allie Xiong Cc: Stephen Chandler Paul , benjamin.tissoires@gmail.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Benjamin Tissoires Subject: [PATCH 02/11] Input: synaptics-rmi4 - add a common input device in rmi_driver Date: Tue, 23 Jun 2015 15:17:21 -0400 Message-Id: <1435087050-11444-3-git-send-email-benjamin.tissoires@redhat.com> In-Reply-To: <1435087050-11444-1-git-send-email-benjamin.tissoires@redhat.com> References: <1435087050-11444-1-git-send-email-benjamin.tissoires@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When .unified_input is set to true in the platform data, the functions should rely on the common input node created by rmi_driver to forward events instead of having their own input node. This node is named "Synaptics PRODUCT_ID" to be able to differentiate the various models. Signed-off-by: Benjamin Tissoires Reviewed-by: Andrew Duggan --- drivers/input/rmi4/rmi_driver.c | 43 +++++++++++++++++++++++++++++++++++++++++ drivers/input/rmi4/rmi_driver.h | 6 ++++++ drivers/input/rmi4/rmi_f01.c | 7 +++++++ include/linux/rmi.h | 2 ++ 4 files changed, 58 insertions(+) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index b9db709..95f9386 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -310,6 +310,9 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev) if (entry->irq_mask) process_one_interrupt(data, entry); + if (data->input) + input_sync(data->input); + return 0; } @@ -330,6 +333,25 @@ static int rmi_driver_set_input_params(struct rmi_device *rmi_dev, return 0; } +static void rmi_driver_set_input_name(struct rmi_device *rmi_dev, + struct input_dev *input) +{ + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); + char *device_name = rmi_f01_get_product_ID(data->f01_container); + char *name; + + if (!device_name) + return; + + name = devm_kasprintf(&rmi_dev->dev, GFP_KERNEL, + "Synaptics %s", device_name); + if (!name) + return; + + input->name = name; +} + + static int rmi_driver_set_irq_bits(struct rmi_device *rmi_dev, unsigned long *mask) { @@ -720,6 +742,8 @@ static int rmi_driver_remove(struct device *dev) const struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); + if (data->input) + input_unregister_device(data->input); disable_sensor(rmi_dev); rmi_free_function_list(rmi_dev); @@ -832,6 +856,15 @@ static int rmi_driver_probe(struct device *dev) data->current_irq_mask = irq_memory + size * 2; data->new_irq_mask = irq_memory + size * 3; + if (pdata->unified_input) { + data->input = input_allocate_device(); + if (data->input) { + rmi_driver_set_input_params(rmi_dev, data->input); + sprintf(data->input_phys, "%s/input0", dev_name(dev)); + data->input->phys = data->input_phys; + } + } + irq_count = 0; dev_dbg(dev, "Creating functions."); retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function); @@ -866,6 +899,15 @@ static int rmi_driver_probe(struct device *dev) mutex_init(&data->suspend_mutex); } + if (data->input) { + rmi_driver_set_input_name(rmi_dev, data->input); + if (input_register_device(data->input)) { + dev_err(dev, "%s: Failed to register input device.\n", + __func__); + goto err_destroy_functions; + } + } + if (gpio_is_valid(pdata->attn_gpio)) { static const char GPIO_LABEL[] = "attn"; unsigned long gpio_flags = GPIOF_DIR_IN; @@ -921,6 +963,7 @@ static int rmi_driver_probe(struct device *dev) return 0; err_destroy_functions: + input_free_device(data->input); rmi_free_function_list(rmi_dev); kfree(irq_memory); err_free_mem: diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h index dda564f..36ca34b 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -13,6 +13,7 @@ #include #include #include +#include #include "rmi_bus.h" #define RMI_DRIVER_VERSION "1.6" @@ -29,6 +30,8 @@ #define RMI_PDT_PROPS_HAS_BSR 0x02 +#define NAME_BUFFER_SIZE 256 + struct rmi_driver_data { struct list_head function_list; @@ -49,6 +52,8 @@ struct rmi_driver_data { unsigned long *current_irq_mask; unsigned long *new_irq_mask; struct mutex irq_mutex; + struct input_dev *input; + char input_phys[NAME_BUFFER_SIZE]; /* Following are used when polling. */ struct hrtimer poll_timer; @@ -112,6 +117,7 @@ void rmi_unregister_physical_driver(void); int rmi_register_f01_handler(void); void rmi_unregister_f01_handler(void); +char *rmi_f01_get_product_ID(struct rmi_function *fn); #ifdef CONFIG_RMI4_F11 int rmi_register_f11_handler(void); diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c index ee5f4a1..2d72dc8 100644 --- a/drivers/input/rmi4/rmi_f01.c +++ b/drivers/input/rmi4/rmi_f01.c @@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev, return 0; } +char *rmi_f01_get_product_ID(struct rmi_function *fn) +{ + struct f01_data *f01 = dev_get_drvdata(&fn->dev); + + return f01->properties.product_id; +} + static int rmi_f01_probe(struct rmi_function *fn) { struct rmi_device *rmi_dev = fn->rmi_dev; diff --git a/include/linux/rmi.h b/include/linux/rmi.h index ca35b2f..1d22985 100644 --- a/include/linux/rmi.h +++ b/include/linux/rmi.h @@ -277,6 +277,8 @@ struct rmi_device_platform_data { struct rmi_f30_gpioled_map *gpioled_map; struct rmi_button_map *f41_button_map; + bool unified_input; + #ifdef CONFIG_RMI4_FWLIB char *firmware_name; #endif