Received: by 10.192.165.156 with SMTP id m28csp1335358imm; Wed, 18 Apr 2018 08:06:26 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+xMEN//vsBFLeuJvqNAZAPQPQOt3XzW/niYT2io46DAdriWKlpWI7uLDctgMURFAytAqYK X-Received: by 10.99.97.16 with SMTP id v16mr2021315pgb.292.1524063986903; Wed, 18 Apr 2018 08:06:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524063986; cv=none; d=google.com; s=arc-20160816; b=xH7EifK/xDZXJDFkjdzzNJOcd/B81LrvrCBAs2Z6iLtIC6CGsTkGN3vTapHLHdHFEe O1+CdQ4x1B09oKj6yKRfFH9bWgBvEFxrV60Bi41lEizQhdIz3mxKEbAOqR5Rcecp4GyX Z/BMf+S4lfOQioCkSgZGEio+A9hJ7e03oUM7XNo/tgeKPGh1DJcK0DiqDDnoIVXIiTAD ilMM0N6uLKEriQWu/pjSBCs3rdQ7AGz8TV0LJgQvE8f6eMkZwOIBBPr3tQYEAIlrY3Ja Rmg21O25p5SVijol9UsQSW5qqPjBSfO3EKLnVSBY5x9Y89saLeo+TuPkRqtPNpttqaAR 2R+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=Z+fsO43P9isVtwejpXLJ8Lz1wAu4Jt1MPJXTgBOwTbU=; b=eokob6rbIc/4hLriOg8iMlURiMQ3nIn6aQ9tCiIBPF1pWJluIiBYucIwIW1HvYo2OD NMEENi5AGIQzGM/z3Ji88qBJIAiq/PNUZJU/OK/JCeHyP2ikkp3iRv1waRzuZP2Hr8vf cJky1MyZTN8+VVB0k99BjJy0F2P6ylTTYRS5DtTLFZ5sssDG4ionnFJG7vo16EIDp/U1 zmFWCexp+kywI5TSH0vH2P2jrXcXikrvTp2vB1SSMsPMR2ddeRwV/tjnoZ9qSRF4WQwA LG8NZUhb0lShilrSml9Z5LW1uKhDZotdG9M51yZAEGaVXc7oMSco4mgWJiEFgloOAlg9 Z6eA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=GJ8Usidv; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y10si1245628pgc.588.2018.04.18.08.06.09; Wed, 18 Apr 2018 08:06:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=GJ8Usidv; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752749AbeDRPE5 (ORCPT + 99 others); Wed, 18 Apr 2018 11:04:57 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:33025 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751204AbeDRPEz (ORCPT ); Wed, 18 Apr 2018 11:04:55 -0400 Received: by mail-lf0-f66.google.com with SMTP id d79-v6so3158493lfd.0; Wed, 18 Apr 2018 08:04:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Z+fsO43P9isVtwejpXLJ8Lz1wAu4Jt1MPJXTgBOwTbU=; b=GJ8UsidvkXIH2ZWuF4oyOsVZvnVWZ8kS7F//+pCDjTZIeEYr4FM4a/QBiCtJkQaiC2 Fr/1HfJztX+nuyWcMMlzjVLqozAOAaaKsNJrVOxTM2zwE3QYtFYGyKWqxESRVHvPaSIB Os1gpup8tIkyd7566auVskm066ljypSblZGp+g2RUy5VNEIvYJPrDXqIu7bVIkEZV02Y 7Nq1lEZ7hxFJeqqrIWdYFaH43RWyhAP/E4HkGRsLECB/Ipo7LTPiWFtzbkYMeuomZMjR FHIQfLN7jHpgNyIzo9S7mo2p/0t14cgSF5hWfBlfHLz+cvH5/Xx+cFXDnnIUt3qx0T8M xb2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Z+fsO43P9isVtwejpXLJ8Lz1wAu4Jt1MPJXTgBOwTbU=; b=qrvmVi0SGyPtmMMaCbztfWs8DZ505f7WOTRp6Woi33lYkhDzbrM3G5GAUg9o35FEvB 2ZWyedLjk98k0bIA8blmRDHz8vatM9/4Vp/9eNCByiEeSY555PFLwVYLsOdlMjwrFW5i rIygvnMEZh4R1OaNBWkRImED+X/LyO9oH6JolIp7JUpaZGUWE+cuKnbRq6FTvVZfeycV g/gwXoKzUngbYdX8bB4+NctuVLOb214d2N2ulpcC5mlD6omqF8kl5I03UDIYuslx8ODD NYUvhvCPnyeSa5mpTmgq5q6hK6IFYqBH5ppjXW3hgES0Fnanq4mL5MGuVTmAbGBqzGFZ m7MA== X-Gm-Message-State: ALQs6tCVJjM3SABwWRtYj2o95ICpP1yiERZ52nl1yd306sfc8SvsYWqN 2gubdwEkmp7ieQN95hOprVk= X-Received: by 10.46.104.8 with SMTP id c8mr1854633lja.20.1524063893769; Wed, 18 Apr 2018 08:04:53 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id q23sm235548ljh.10.2018.04.18.08.04.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Apr 2018 08:04:52 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, dmitry.torokhov@gmail.com, jgross@suse.com, lyan@suse.com, boris.ostrovsky@oracle.com Cc: andr2000@gmail.com, andrii_chepurnyi@epam.com, Oleksandr Andrushchenko Subject: [PATCH] Input: xen-kbdfront - allow better run-time configuration Date: Wed, 18 Apr 2018 18:04:45 +0300 Message-Id: <20180418150445.9805-1-andr2000@gmail.com> X-Mailer: git-send-email 2.17.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksandr Andrushchenko It is now only possible to control if multi-touch virtual device is created or not (via the corresponding XenStore entries), but keyboard and pointer devices are always created. In some cases this is not desirable. For example, if virtual keyboard device is exposed to Android then the latter won't automatically show on-screen keyboard as it expects that a physical keyboard device can be used for typing. Make it possible to configure which virtual devices are created with module parameters: - no_ptr_dev=1 if no pointer device needs to be created - no_kbd_dev=1 if no keyboard device needs to be created Keep old behavior by default. Signed-off-by: Oleksandr Andrushchenko Suggested-by: Andrii Chepurnyi Tested-by: Andrii Chepurnyi --- drivers/input/misc/xen-kbdfront.c | 159 +++++++++++++++++------------- 1 file changed, 92 insertions(+), 67 deletions(-) diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c index d91f3b1c5375..a3306aad40b0 100644 --- a/drivers/input/misc/xen-kbdfront.c +++ b/drivers/input/misc/xen-kbdfront.c @@ -51,6 +51,16 @@ module_param_array(ptr_size, int, NULL, 0444); MODULE_PARM_DESC(ptr_size, "Pointing device width, height in pixels (default 800,600)"); +static unsigned int no_ptr_dev; +module_param(no_ptr_dev, uint, 0); +MODULE_PARM_DESC(no_ptr_dev, + "If set then no virtual pointing device exposed to the guest"); + +static unsigned int no_kbd_dev; +module_param(no_kbd_dev, uint, 0); +MODULE_PARM_DESC(no_kbd_dev, + "If set then no virtual keyboard device exposed to the guest"); + static int xenkbd_remove(struct xenbus_device *); static int xenkbd_connect_backend(struct xenbus_device *, struct xenkbd_info *); static void xenkbd_disconnect_backend(struct xenkbd_info *); @@ -63,6 +73,9 @@ static void xenkbd_disconnect_backend(struct xenkbd_info *); static void xenkbd_handle_motion_event(struct xenkbd_info *info, struct xenkbd_motion *motion) { + if (unlikely(!info->ptr)) + return; + input_report_rel(info->ptr, REL_X, motion->rel_x); input_report_rel(info->ptr, REL_Y, motion->rel_y); if (motion->rel_z) @@ -73,6 +86,9 @@ static void xenkbd_handle_motion_event(struct xenkbd_info *info, static void xenkbd_handle_position_event(struct xenkbd_info *info, struct xenkbd_position *pos) { + if (unlikely(!info->ptr)) + return; + input_report_abs(info->ptr, ABS_X, pos->abs_x); input_report_abs(info->ptr, ABS_Y, pos->abs_y); if (pos->rel_z) @@ -97,6 +113,9 @@ static void xenkbd_handle_key_event(struct xenkbd_info *info, return; } + if (unlikely(!dev)) + return; + input_event(dev, EV_KEY, key->keycode, value); input_sync(dev); } @@ -192,7 +211,7 @@ static int xenkbd_probe(struct xenbus_device *dev, const struct xenbus_device_id *id) { int ret, i; - unsigned int abs, touch; + unsigned int touch; struct xenkbd_info *info; struct input_dev *kbd, *ptr, *mtouch; @@ -211,24 +230,6 @@ static int xenkbd_probe(struct xenbus_device *dev, if (!info->page) goto error_nomem; - /* Set input abs params to match backend screen res */ - abs = xenbus_read_unsigned(dev->otherend, - XENKBD_FIELD_FEAT_ABS_POINTER, 0); - ptr_size[KPARAM_X] = xenbus_read_unsigned(dev->otherend, - XENKBD_FIELD_WIDTH, - ptr_size[KPARAM_X]); - ptr_size[KPARAM_Y] = xenbus_read_unsigned(dev->otherend, - XENKBD_FIELD_HEIGHT, - ptr_size[KPARAM_Y]); - if (abs) { - ret = xenbus_write(XBT_NIL, dev->nodename, - XENKBD_FIELD_REQ_ABS_POINTER, "1"); - if (ret) { - pr_warn("xenkbd: can't request abs-pointer\n"); - abs = 0; - } - } - touch = xenbus_read_unsigned(dev->nodename, XENKBD_FIELD_FEAT_MTOUCH, 0); if (touch) { @@ -241,60 +242,84 @@ static int xenkbd_probe(struct xenbus_device *dev, } /* keyboard */ - kbd = input_allocate_device(); - if (!kbd) - goto error_nomem; - kbd->name = "Xen Virtual Keyboard"; - kbd->phys = info->phys; - kbd->id.bustype = BUS_PCI; - kbd->id.vendor = 0x5853; - kbd->id.product = 0xffff; - - __set_bit(EV_KEY, kbd->evbit); - for (i = KEY_ESC; i < KEY_UNKNOWN; i++) - __set_bit(i, kbd->keybit); - for (i = KEY_OK; i < KEY_MAX; i++) - __set_bit(i, kbd->keybit); - - ret = input_register_device(kbd); - if (ret) { - input_free_device(kbd); - xenbus_dev_fatal(dev, ret, "input_register_device(kbd)"); - goto error; + if (!no_kbd_dev) { + kbd = input_allocate_device(); + if (!kbd) + goto error_nomem; + kbd->name = "Xen Virtual Keyboard"; + kbd->phys = info->phys; + kbd->id.bustype = BUS_PCI; + kbd->id.vendor = 0x5853; + kbd->id.product = 0xffff; + + __set_bit(EV_KEY, kbd->evbit); + for (i = KEY_ESC; i < KEY_UNKNOWN; i++) + __set_bit(i, kbd->keybit); + for (i = KEY_OK; i < KEY_MAX; i++) + __set_bit(i, kbd->keybit); + + ret = input_register_device(kbd); + if (ret) { + input_free_device(kbd); + xenbus_dev_fatal(dev, ret, "input_register_device(kbd)"); + goto error; + } + info->kbd = kbd; } - info->kbd = kbd; /* pointing device */ - ptr = input_allocate_device(); - if (!ptr) - goto error_nomem; - ptr->name = "Xen Virtual Pointer"; - ptr->phys = info->phys; - ptr->id.bustype = BUS_PCI; - ptr->id.vendor = 0x5853; - ptr->id.product = 0xfffe; - - if (abs) { - __set_bit(EV_ABS, ptr->evbit); - input_set_abs_params(ptr, ABS_X, 0, ptr_size[KPARAM_X], 0, 0); - input_set_abs_params(ptr, ABS_Y, 0, ptr_size[KPARAM_Y], 0, 0); - } else { - input_set_capability(ptr, EV_REL, REL_X); - input_set_capability(ptr, EV_REL, REL_Y); - } - input_set_capability(ptr, EV_REL, REL_WHEEL); + if (!no_ptr_dev) { + unsigned int abs; + + /* Set input abs params to match backend screen res */ + abs = xenbus_read_unsigned(dev->otherend, + XENKBD_FIELD_FEAT_ABS_POINTER, 0); + ptr_size[KPARAM_X] = xenbus_read_unsigned(dev->otherend, + XENKBD_FIELD_WIDTH, + ptr_size[KPARAM_X]); + ptr_size[KPARAM_Y] = xenbus_read_unsigned(dev->otherend, + XENKBD_FIELD_HEIGHT, + ptr_size[KPARAM_Y]); + if (abs) { + ret = xenbus_write(XBT_NIL, dev->nodename, + XENKBD_FIELD_REQ_ABS_POINTER, "1"); + if (ret) { + pr_warn("xenkbd: can't request abs-pointer\n"); + abs = 0; + } + } - __set_bit(EV_KEY, ptr->evbit); - for (i = BTN_LEFT; i <= BTN_TASK; i++) - __set_bit(i, ptr->keybit); + ptr = input_allocate_device(); + if (!ptr) + goto error_nomem; + ptr->name = "Xen Virtual Pointer"; + ptr->phys = info->phys; + ptr->id.bustype = BUS_PCI; + ptr->id.vendor = 0x5853; + ptr->id.product = 0xfffe; + + if (abs) { + __set_bit(EV_ABS, ptr->evbit); + input_set_abs_params(ptr, ABS_X, 0, ptr_size[KPARAM_X], 0, 0); + input_set_abs_params(ptr, ABS_Y, 0, ptr_size[KPARAM_Y], 0, 0); + } else { + input_set_capability(ptr, EV_REL, REL_X); + input_set_capability(ptr, EV_REL, REL_Y); + } + input_set_capability(ptr, EV_REL, REL_WHEEL); - ret = input_register_device(ptr); - if (ret) { - input_free_device(ptr); - xenbus_dev_fatal(dev, ret, "input_register_device(ptr)"); - goto error; + __set_bit(EV_KEY, ptr->evbit); + for (i = BTN_LEFT; i <= BTN_TASK; i++) + __set_bit(i, ptr->keybit); + + ret = input_register_device(ptr); + if (ret) { + input_free_device(ptr); + xenbus_dev_fatal(dev, ret, "input_register_device(ptr)"); + goto error; + } + info->ptr = ptr; } - info->ptr = ptr; /* multi-touch device */ if (touch) { -- 2.17.0