From patchwork Wed Jul 13 16:05:55 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 9227951 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5BFB06088F for ; Wed, 13 Jul 2016 16:18:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48AE026E64 for ; Wed, 13 Jul 2016 16:18:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D76527F9E; Wed, 13 Jul 2016 16:18:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AF82427F94 for ; Wed, 13 Jul 2016 16:18:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751304AbcGMQPC (ORCPT ); Wed, 13 Jul 2016 12:15:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51736 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751865AbcGMQGl (ORCPT ); Wed, 13 Jul 2016 12:06:41 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D8143356AE; Wed, 13 Jul 2016 16:06:36 +0000 (UTC) Received: from plouf.banquise.eu.com (ovpn-116-194.phx2.redhat.com [10.3.116.194]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u6DG6JwD004508; Wed, 13 Jul 2016 12:06:34 -0400 From: Benjamin Tissoires To: Jiri Kosina , Ping Cheng , Jason Gerecke , Aaron Skomra , Peter Hutterer Cc: linux-kernel@vger.kernel.org, linux-input@vger.kernel.org Subject: [PATCH v2 08/30] HID: wacom: put the managed resources in a group Date: Wed, 13 Jul 2016 18:05:55 +0200 Message-Id: <1468425977-4819-9-git-send-email-benjamin.tissoires@redhat.com> In-Reply-To: <1468425977-4819-1-git-send-email-benjamin.tissoires@redhat.com> References: <1468425977-4819-1-git-send-email-benjamin.tissoires@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 13 Jul 2016 16:06:36 +0000 (UTC) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We currently have a complex clean_inputs() function while this can be handled all by devres. Set a group that we can destroy in wireless_work(). Signed-off-by: Benjamin Tissoires --- No changes in v2 --- drivers/hid/wacom.h | 1 + drivers/hid/wacom_sys.c | 69 +++++++++++++++++++++---------------------------- drivers/hid/wacom_wac.c | 2 +- drivers/hid/wacom_wac.h | 3 --- 4 files changed, 32 insertions(+), 43 deletions(-) diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h index a968fbb..6f5555f 100644 --- a/drivers/hid/wacom.h +++ b/drivers/hid/wacom.h @@ -131,6 +131,7 @@ struct wacom { struct power_supply_desc ac_desc; struct kobject *remote_dir; struct attribute_group remote_group[5]; + bool resources; }; static inline void wacom_schedule_work(struct wacom_wac *wacom_wac, diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index da2fccf..08f6d1f 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -1394,34 +1394,6 @@ static struct input_dev *wacom_allocate_input(struct wacom *wacom) return input_dev; } -static void wacom_clean_inputs(struct wacom *wacom) -{ - if (wacom->wacom_wac.pen_input) { - if (wacom->wacom_wac.pen_registered) - input_unregister_device(wacom->wacom_wac.pen_input); - else - input_free_device(wacom->wacom_wac.pen_input); - } - if (wacom->wacom_wac.touch_input) { - if (wacom->wacom_wac.touch_registered) - input_unregister_device(wacom->wacom_wac.touch_input); - else - input_free_device(wacom->wacom_wac.touch_input); - } - if (wacom->wacom_wac.pad_input) { - if (wacom->wacom_wac.pad_registered) - input_unregister_device(wacom->wacom_wac.pad_input); - else - input_free_device(wacom->wacom_wac.pad_input); - } - wacom->wacom_wac.pen_input = NULL; - wacom->wacom_wac.touch_input = NULL; - wacom->wacom_wac.pad_input = NULL; - wacom->wacom_wac.pen_registered = false; - wacom->wacom_wac.touch_registered = false; - wacom->wacom_wac.pad_registered = false; -} - static int wacom_allocate_inputs(struct wacom *wacom) { struct wacom_wac *wacom_wac = &(wacom->wacom_wac); @@ -1464,7 +1436,6 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(pen_input_dev); if (error) goto fail; - wacom_wac->pen_registered = true; } error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac); @@ -1477,7 +1448,6 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(touch_input_dev); if (error) goto fail; - wacom_wac->touch_registered = true; } error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); @@ -1490,18 +1460,14 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(pad_input_dev); if (error) goto fail; - wacom_wac->pad_registered = true; } return 0; fail: wacom_wac->pad_input = NULL; - wacom_wac->pad_registered = false; wacom_wac->touch_input = NULL; - wacom_wac->touch_registered = false; wacom_wac->pen_input = NULL; - wacom_wac->pen_registered = false; return error; } @@ -1612,6 +1578,22 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) "%s%s Pad", name, suffix); } +static void wacom_release_resources(struct wacom *wacom) +{ + struct hid_device *hdev = wacom->hdev; + + if (!wacom->resources) + return; + + devres_release_group(&hdev->dev, wacom); + + wacom->resources = false; + + wacom->wacom_wac.pen_input = NULL; + wacom->wacom_wac.touch_input = NULL; + wacom->wacom_wac.pad_input = NULL; +} + static int wacom_parse_and_register(struct wacom *wacom, bool wireless) { struct wacom_wac *wacom_wac = &wacom->wacom_wac; @@ -1624,9 +1606,14 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) if (features->pktlen > WACOM_PKGLEN_MAX) return -EINVAL; + if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL)) + return -ENOMEM; + + wacom->resources = true; + error = wacom_allocate_inputs(wacom); if (error) - return error; + goto fail_open_group; /* * Bamboo Pad has a generic hid handling for the Pen, and we switch it @@ -1733,6 +1720,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) wacom_wac->shared->touch_input = wacom_wac->touch_input; } + devres_close_group(&hdev->dev, wacom); + return 0; fail_quirks: @@ -1748,6 +1737,8 @@ fail_battery: fail_shared_data: fail_parsed: fail_allocate_inputs: +fail_open_group: + wacom_release_resources(wacom); return error; } @@ -1773,14 +1764,14 @@ static void wacom_wireless_work(struct work_struct *work) wacom1 = hid_get_drvdata(hdev1); wacom_wac1 = &(wacom1->wacom_wac); wacom_destroy_leds(wacom1); - wacom_clean_inputs(wacom1); + wacom_release_resources(wacom1); /* Touch interface */ hdev2 = usb_get_intfdata(usbdev->config->interface[2]); wacom2 = hid_get_drvdata(hdev2); wacom_wac2 = &(wacom2->wacom_wac); wacom_destroy_leds(wacom2); - wacom_clean_inputs(wacom2); + wacom_release_resources(wacom2); if (wacom_wac->pid == 0) { hid_info(wacom->hdev, "wireless tablet disconnected\n"); @@ -1835,9 +1826,9 @@ static void wacom_wireless_work(struct work_struct *work) fail: wacom_destroy_leds(wacom1); - wacom_clean_inputs(wacom1); + wacom_release_resources(wacom1); wacom_destroy_leds(wacom2); - wacom_clean_inputs(wacom2); + wacom_release_resources(wacom2); return; } diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index c7707b2..3e2c903 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -1941,7 +1941,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) } /* only update touch if we actually have a touchpad and touch data changed */ - if (wacom->touch_registered && touch_changed) { + if (wacom->touch_input && touch_changed) { input_mt_sync_frame(wacom->touch_input); wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); } diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index 53d1653..d5b973d 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h @@ -234,9 +234,6 @@ struct wacom_wac { struct input_dev *pen_input; struct input_dev *touch_input; struct input_dev *pad_input; - bool pen_registered; - bool touch_registered; - bool pad_registered; int pid; int battery_capacity; int num_contacts_left;