linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
To: Jiri Kosina <jikos@kernel.org>, Ping Cheng <pinglinux@gmail.com>,
	Jason Gerecke <killertofu@gmail.com>,
	Aaron Skomra <skomra@gmail.com>,
	Peter Hutterer <peter.hutterer@who-t.net>
Cc: linux-kernel@vger.kernel.org, linux-input@vger.kernel.org
Subject: [PATCH v2 24/30] HID: wacom: leds: actually release the LEDs on disconnect
Date: Wed, 13 Jul 2016 18:06:11 +0200	[thread overview]
Message-ID: <1468425977-4819-25-git-send-email-benjamin.tissoires@redhat.com> (raw)
In-Reply-To: <1468425977-4819-1-git-send-email-benjamin.tissoires@redhat.com>

There is a bug (?) in devm_led_classdev_register() in which its increments
the refcount of the parent. If the parent is an input device, that means
the ref count never reaches 0 when devm_input_device_release() gets called.
This means that the LEDs and all the devres resources attached to the
input device are not released.

Manually force the release of the group so that the leds are released once
we are done using them.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---

No changes in v2
---
 drivers/hid/wacom.h     |  1 +
 drivers/hid/wacom_sys.c | 27 ++++++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h
index 0c498c4..9159dd3 100644
--- a/drivers/hid/wacom.h
+++ b/drivers/hid/wacom.h
@@ -130,6 +130,7 @@ struct wacom_group_leds {
 	u8 select; /* status led selector (0..3) */
 	struct wacom_led *leds;
 	unsigned int count;
+	struct device *dev;
 };
 
 struct wacom_battery {
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index c5d518d..3a651e2 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -1068,6 +1068,13 @@ static int wacom_led_register_one(struct device *dev, struct wacom *wacom,
 	return 0;
 }
 
+static void wacom_led_groups_release_one(void *data)
+{
+	struct wacom_group_leds *group = data;
+
+	devres_release_group(group->dev, group);
+}
+
 static int wacom_led_groups_alloc_and_register_one(struct device *dev,
 						   struct wacom *wacom,
 						   int group_id, int count,
@@ -1098,7 +1105,25 @@ static int wacom_led_groups_alloc_and_register_one(struct device *dev,
 			goto err;
 	}
 
-	devres_remove_group(dev, &wacom->led.groups[group_id]);
+	wacom->led.groups[group_id].dev = dev;
+
+	devres_close_group(dev, &wacom->led.groups[group_id]);
+
+	/*
+	 * There is a bug (?) in devm_led_classdev_register() in which its
+	 * increments the refcount of the parent. If the parent is an input
+	 * device, that means the ref count never reaches 0 when
+	 * devm_input_device_release() gets called.
+	 * This means that the LEDs are still there after disconnect.
+	 * Manually force the release of the group so that the leds are released
+	 * once we are done using them.
+	 */
+	error = devm_add_action_or_reset(&wacom->hdev->dev,
+					 wacom_led_groups_release_one,
+					 &wacom->led.groups[group_id]);
+	if (error)
+		return error;
+
 	return 0;
 
 err:
-- 
2.5.5

  parent reply	other threads:[~2016-07-13 16:08 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-13 16:05 [PATCH v2 00/30] HID: wacom: cleanup/EKR/LED Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 01/30] HID: wacom: actually report the battery level for wireless connected Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 02/30] HID: wacom: store the type in wacom->shared for INTUOSHT and INTUOSHT2 Benjamin Tissoires
2016-07-15  4:14   ` Ping Cheng
2016-07-18 14:54     ` Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 03/30] HID: wacom: remove cleanup of wacom->remote_dir from wacom_clean_inputs() Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 04/30] HID: wacom: untie leds from inputs Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 05/30] HID: wacom: use one work queue per task Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 06/30] HID: wacom: switch battery to devres Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 07/30] HID: wacom: switch inputs " Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 08/30] HID: wacom: put the managed resources in a group Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 09/30] HID: wacom: convert LEDs to devres Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 10/30] HID: wacom: use devm_kasprintf for allocating the name of the remote Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 11/30] HID: wacom: use devres to allocate driver data Benjamin Tissoires
2016-07-13 16:05 ` [PATCH v2 12/30] HID: wacom: devres manage the shared data too Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 13/30] HID: wacom: leds: dynamically allocate LED groups Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 14/30] HID: wacom: EKR: add a worker to add/remove resources on addition/removal Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 15/30] HID: wacom: EKR: have the wacom resources dynamically allocated Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 16/30] HID: wacom: rework fail path in probe() and parse_and_register() Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 17/30] HID: wacom: EKR: have proper allocator and destructor Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 18/30] HID: wacom: EKR: use devres groups to manage resources Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 19/30] HID: wacom: EKR: have one array of struct remotes instead of many arrays Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 20/30] HID: wacom: EKR: allocate one input node per remote Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 21/30] HID: wacom: EKR: have one power_supply " Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 22/30] HID: wacom: EKR: attach the power_supply on first connection Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 23/30] HID: wacom: leds: use the ledclass instead of custom made sysfs files Benjamin Tissoires
2016-07-13 16:06 ` Benjamin Tissoires [this message]
2016-07-13 16:06 ` [PATCH v2 25/30] HID: wacom: leds: handle the switch of the LEDs directly in the kernel Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 26/30] HID: wacom: leds: make sure Cintiq 21UX2 and 24HD control the right LEDs Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 27/30] HID: wacom: leds: handle Cintiq 24HD leds buttons Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 28/30] HID: wacom: power_supply: mark the type as USB Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 29/30] HID: wacom: power_supply: remove ac information Benjamin Tissoires
2016-07-13 16:06 ` [PATCH v2 30/30] HID: wacom: power_supply: provide the actual model_name Benjamin Tissoires
2016-07-13 21:36 ` [PATCH v2 00/30] HID: wacom: cleanup/EKR/LED Aaron Armstrong Skomra
2016-08-01 23:17   ` Ping Cheng
2016-08-02  8:48     ` Jiri Kosina
2016-08-05 11:41 ` Jiri Kosina

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1468425977-4819-25-git-send-email-benjamin.tissoires@redhat.com \
    --to=benjamin.tissoires@redhat.com \
    --cc=jikos@kernel.org \
    --cc=killertofu@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peter.hutterer@who-t.net \
    --cc=pinglinux@gmail.com \
    --cc=skomra@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).