All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roderick Colenbrander <roderick@gaikai.com>
To: Jiri Kosina <jikos@kernel.org>,
	Benjamin Tissoires <benjamin.tissoires@redhat.com>
Cc: linux-input@vger.kernel.org, "Chris Ye" <lzye@google.com>,
	"Barnabás Pőcze" <pobrn@protonmail.com>,
	"Samuel Čavoj" <sammko@sammserver.com>,
	"Florian Märkl" <linux@florianmaerkl.de>,
	"Roderick Colenbrander" <roderick.colenbrander@sony.com>
Subject: [PATCH v5 06/13] HID: playstation: track devices in list.
Date: Thu, 28 Jan 2021 09:26:50 -0800	[thread overview]
Message-ID: <20210128172657.24516-7-roderick@gaikai.com> (raw)
In-Reply-To: <20210128172657.24516-1-roderick@gaikai.com>

From: Roderick Colenbrander <roderick.colenbrander@sony.com>

Track devices in a list, so we can detect when a device is connected
twice when using Bluetooth and USB.

Signed-off-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
---
 drivers/hid/hid-playstation.c | 46 +++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index bcdeb2fd45d7..0c3956756bf0 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -15,10 +15,15 @@
 
 #include "hid-ids.h"
 
+/* List of connected playstation devices. */
+static DEFINE_MUTEX(ps_devices_lock);
+static LIST_HEAD(ps_devices_list);
+
 #define HID_PLAYSTATION_VERSION_PATCH 0x8000
 
 /* Base class for playstation devices. */
 struct ps_device {
+	struct list_head list;
 	struct hid_device *hdev;
 	spinlock_t lock;
 
@@ -160,6 +165,38 @@ static const struct {int x; int y; } ps_gamepad_hat_mapping[] = {
 	{0, 0},
 };
 
+/*
+ * Add a new ps_device to ps_devices if it doesn't exist.
+ * Return error on duplicate device, which can happen if the same
+ * device is connected using both Bluetooth and USB.
+ */
+static int ps_devices_list_add(struct ps_device *dev)
+{
+	struct ps_device *entry;
+
+	mutex_lock(&ps_devices_lock);
+	list_for_each_entry(entry, &ps_devices_list, list) {
+		if (!memcmp(entry->mac_address, dev->mac_address, sizeof(dev->mac_address))) {
+			hid_err(dev->hdev, "Duplicate device found for MAC address %pMR.\n",
+					dev->mac_address);
+			mutex_unlock(&ps_devices_lock);
+			return -EEXIST;
+		}
+	}
+
+	list_add_tail(&dev->list, &ps_devices_list);
+	mutex_unlock(&ps_devices_lock);
+	return 0;
+}
+
+static int ps_devices_list_remove(struct ps_device *dev)
+{
+	mutex_lock(&ps_devices_lock);
+	list_del(&dev->list);
+	mutex_unlock(&ps_devices_lock);
+	return 0;
+}
+
 static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix)
 {
 	struct input_dev *input_dev;
@@ -666,6 +703,10 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
 	}
 	snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address);
 
+	ret = ps_devices_list_add(ps_dev);
+	if (ret)
+		return ERR_PTR(ret);
+
 	ret = dualsense_get_calibration_data(ds);
 	if (ret) {
 		hid_err(hdev, "Failed to get calibration data from DualSense\n");
@@ -698,6 +739,7 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
 	return &ds->base;
 
 err:
+	ps_devices_list_remove(ps_dev);
 	return ERR_PTR(ret);
 }
 
@@ -755,6 +797,10 @@ static int ps_probe(struct hid_device *hdev, const struct hid_device_id *id)
 
 static void ps_remove(struct hid_device *hdev)
 {
+	struct ps_device *dev = hid_get_drvdata(hdev);
+
+	ps_devices_list_remove(dev);
+
 	hid_hw_close(hdev);
 	hid_hw_stop(hdev);
 }
-- 
2.26.2


  parent reply	other threads:[~2021-01-28 17:30 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-28 17:26 [PATCH v5 00/13] HID: new driver for PS5 'DualSense' controller Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 01/13] HID: playstation: initial DualSense USB support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 02/13] HID: playstation: use DualSense MAC address as unique identifier Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 03/13] HID: playstation: add DualSense battery support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 04/13] HID: playstation: add DualSense touchpad support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 05/13] HID: playstation: add DualSense accelerometer and gyroscope support Roderick Colenbrander
2021-01-28 17:26 ` Roderick Colenbrander [this message]
2021-01-28 17:26 ` [PATCH v5 07/13] HID: playstation: add DualSense Bluetooth support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 08/13] HID: playstation: add DualSense classic rumble support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 09/13] HID: playstation: add DualSense lightbar support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 10/13] HID: playstation: add microphone mute support for DualSense Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 11/13] HID: playstation: add DualSense player LEDs support Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 12/13] HID: playstation: DualSense set LEDs to default player id Roderick Colenbrander
2021-01-28 17:26 ` [PATCH v5 13/13] HID: playstation: report DualSense hardware and firmware version Roderick Colenbrander
2021-02-05 17:01 ` [PATCH v5 00/13] HID: new driver for PS5 'DualSense' controller Benjamin Tissoires
2021-02-06  4:03   ` Barnabás Pőcze
2021-02-07  6:05     ` Roderick Colenbrander

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=20210128172657.24516-7-roderick@gaikai.com \
    --to=roderick@gaikai.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux@florianmaerkl.de \
    --cc=lzye@google.com \
    --cc=pobrn@protonmail.com \
    --cc=roderick.colenbrander@sony.com \
    --cc=sammko@sammserver.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.