Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp4447195imm; Mon, 14 May 2018 07:42:28 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrD4gmVytqfPh8cep4xZmYP5m6YdvmueKnbDkk6GWkr+3Vozxp8+q3018S7SZL0Whk6Fo7H X-Received: by 2002:a62:4708:: with SMTP id u8-v6mr10908255pfa.89.1526308948023; Mon, 14 May 2018 07:42:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526308947; cv=none; d=google.com; s=arc-20160816; b=G3OHNKOzFngHsDFkk6jPq0TEp8eWiYPxun8gFeVTKeBzYF9Z8hQjouMMzKxSaoX/1B EHzNyuv5woSXTmTpiEKX20SBf5XoKrhNHXVPdusJJxMU+bagpO3wXqvdqpRCognEB49w BRryPN/zuHxFUzvzo787TlJzEigmJmx1owoKDku1rmGkoTOAA5JSFKr8k/3fcg5DFs+F NrBaJO/t2YyU3tCNB9411DyS1fbnVK7v0+SeQuCiWkEbya4o8NHpUNr3ZvCZL83TaQSY tIM2nsixlJSNffcQ6S4K0ovL5LOW4UG35UFI81fW3bOGVT3+DFt8Nwfs7sK8wi86cK8z 8LPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=HooTqZywv0xyYMeBWbO/kMyjj6WsuzdpGi6Lk7vjPcQ=; b=FMmKRBSbO7CmBj+ePpqqxnQkx5ZsCNArht0SnXU4lxAAoBE9NY49QQQpv75Vd9wCWg 8NLSQ/3WYVPRwYI6J3M9gvpMWg0KqtevLV2af/aKR2p3BH/LmW3tdPmdXAd0Y1uzOF/L 0YgkuOoLkNIjc8Mw5hDkbivhclia1F78By82YiadSPVyvSMGYS0Vi8zpGR9n+JNpz4E8 4JHiXYGTogm4E+UZxDQ8zKBqcpGDvzlvXt+QxVVZc0Tx6LYPGftYPMatICIEdb+FJ0M8 Fo5JKwY7Yew0apyAZNd/fa9sHXad4Sk2jr2HGzI2MhfWc5gWKkxg61a8+bFG+0Vae1vp NPVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Q1TyxDTD; 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 p13-v6si7114120pgv.182.2018.05.14.07.42.03; Mon, 14 May 2018 07:42:27 -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=Q1TyxDTD; 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 S1753920AbeENOkx (ORCPT + 99 others); Mon, 14 May 2018 10:40:53 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:37444 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753807AbeENOkk (ORCPT ); Mon, 14 May 2018 10:40:40 -0400 Received: by mail-lf0-f67.google.com with SMTP id r2-v6so18403195lff.4; Mon, 14 May 2018 07:40:39 -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:in-reply-to:references; bh=HooTqZywv0xyYMeBWbO/kMyjj6WsuzdpGi6Lk7vjPcQ=; b=Q1TyxDTDvpltg6u316jzzu2u60fguAmjVtX+Yy0P+nQqksgMCtewVej+EKJIbLHpbv FHLzH3bxSy+LSvHBUDGjC0amRZibHB9NycHZ/N6W8adXKdebPJKGdjfJQOheCDQotHya +Bjx/JPozMfI19xm3K2ub+08F3VU6e7JNC0IDGkO1sPsNKiLZ7cadkSkAxBWaJOfyaZ7 m4Dy8IwCdLatylMyY0Nj1DroHDQ4okU/ARdja8kG3byI74F/ptmOwHB5fiy1Hdh8c3ZM G+yLh9HnpsBn+hLUFl90rg7bHSOW6ZB8e+n6//oT/3gvn71r1D/F0g5MRxWEfOgRI9bf 9gjg== 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:in-reply-to :references; bh=HooTqZywv0xyYMeBWbO/kMyjj6WsuzdpGi6Lk7vjPcQ=; b=caXYcWBlQInHyZHzO4cIM3OBhFk9EKuwI3iXMtCSopvd+3kOQzjc2ssVuf4Tnx9oYH 2XwNE6Agbf0vRbeDV6scveAcIBGPlouJbtXLXBOSpwzYDUdeliXVUO1MNth7zP0vEXx7 2IOloahbK3u2xg9Za4zMoOW6znM1f4Y3cqvV3VrxpmiGC/tdmeuDgcCX5N4fpHOcUKbu EtavuHejM5WRd0votndOxnNp+VfBPgNBCVPA3GEcmts5EDcFnFSCUuwu9CrEv7btunJ5 VYEoUlYX8h9AD+hS+RdCkgNhBCz50uAOPSuzPi93cqayyrnMfceeTHeWXNzFNQiTnnx5 d5VA== X-Gm-Message-State: ALKqPwc/9/4W3nsN9kAOw8Bf2p2Q8nqcxar6u33un671B2TRUVaRbefN Ly02rh5eaboBxgo+mnR667grmeXy X-Received: by 2002:a19:1444:: with SMTP id k65-v6mr9465798lfi.80.1526308839038; Mon, 14 May 2018 07:40:39 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-54.209.223.85.sovam.net.ua. [85.223.209.54]) by smtp.gmail.com with ESMTPSA id d73-v6sm2424425lfd.50.2018.05.14.07.40.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 14 May 2018 07:40:38 -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: konrad.wilk@oracle.com, andr2000@gmail.com, andrii_chepurnyi@epam.com, Oleksandr Andrushchenko Subject: [PATCH v3 2/2] Input: xen-kbdfront - allow better run-time configuration Date: Mon, 14 May 2018 17:40:29 +0300 Message-Id: <20180514144029.16019-2-andr2000@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180514144029.16019-1-andr2000@gmail.com> References: <20180514144029.16019-1-andr2000@gmail.com> 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. Utilize keyboard and pointer device XenStore feature fields to configure which virtual devices are created: - set "feature-disable-keyboard" to 1 if no keyboard device needs to be created - set "feature-disable-pointer" to 1 if no pointer device needs to be created Keep old behavior by default. Signed-off-by: Oleksandr Andrushchenko Suggested-by: Andrii Chepurnyi Tested-by: Andrii Chepurnyi --- Changes since v2: - based on XenStore kbdif features to control which devices are exposed instead of module parameters. drivers/input/misc/xen-kbdfront.c | 172 ++++++++++++++++++------------ 1 file changed, 101 insertions(+), 71 deletions(-) diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c index d91f3b1c5375..0f166e11c421 100644 --- a/drivers/input/misc/xen-kbdfront.c +++ b/drivers/input/misc/xen-kbdfront.c @@ -63,6 +63,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 +76,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 +103,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 +201,7 @@ static int xenkbd_probe(struct xenbus_device *dev, const struct xenbus_device_id *id) { int ret, i; - unsigned int abs, touch; + bool with_mtouch, with_kbd, with_ptr; struct xenkbd_info *info; struct input_dev *kbd, *ptr, *mtouch; @@ -211,93 +220,114 @@ 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; - } - } + /* + * The below are reverse logic, e.g. if the feature is set, then + * do not expose the corresponding virtual device. + */ + with_kbd = !xenbus_read_unsigned(dev->nodename, + XENKBD_FIELD_FEAT_DSBL_KEYBRD, 0); - touch = xenbus_read_unsigned(dev->nodename, - XENKBD_FIELD_FEAT_MTOUCH, 0); - if (touch) { + with_ptr = !xenbus_read_unsigned(dev->nodename, + XENKBD_FIELD_FEAT_DSBL_POINTER, 0); + + /* Direct logic: if set, then create multi-touch device. */ + with_mtouch = xenbus_read_unsigned(dev->nodename, + XENKBD_FIELD_FEAT_MTOUCH, 0); + if (with_mtouch) { ret = xenbus_write(XBT_NIL, dev->nodename, XENKBD_FIELD_REQ_MTOUCH, "1"); if (ret) { pr_warn("xenkbd: can't request multi-touch"); - touch = 0; + with_mtouch = 0; } } /* 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 (with_kbd) { + 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 (with_ptr) { + 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) { + if (with_mtouch) { int num_cont, width, height; mtouch = input_allocate_device(); -- 2.17.0