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>,
Roderick Colenbrander <roderick.colenbrander@sony.com>
Subject: [PATCH v3 05/12] HID: playstation: track devices in list.
Date: Sun, 17 Jan 2021 15:09:49 -0800 [thread overview]
Message-ID: <20210117230956.173031-6-roderick@gaikai.com> (raw)
In-Reply-To: <20210117230956.173031-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 cde7d7fe5bac..a14c33a52c8f 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
next prev parent reply other threads:[~2021-01-17 23:11 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-17 23:09 [PATCH v3 00/13] HID: new driver for PS5 'DualSense' controller Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 01/12] HID: playstation: initial DualSense USB support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 02/12] HID: playstation: use DualSense MAC address as unique identifier Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 03/12] HID: playstation: add DualSense battery support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 04/12] HID: playstation: add DualSense touchpad support Roderick Colenbrander
2021-01-17 23:09 ` Roderick Colenbrander [this message]
2021-01-17 23:09 ` [PATCH v3 06/12] HID: playstation: add DualSense Bluetooth support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 07/12] HID: playstation: add DualSense classic rumble support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 08/12] HID: playstation: add DualSense lightbar support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 09/12] HID: playstation: add microphone mute support for DualSense Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 10/12] HID: playstation: add DualSense player LEDs support Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 11/12] HID: playstation: DualSense set LEDs to default player id Roderick Colenbrander
2021-01-17 23:09 ` [PATCH v3 12/12] HID: playstation: report DualSense hardware and firmware version Roderick Colenbrander
2021-01-17 23:23 ` [PATCH v3 00/13] HID: new driver for PS5 'DualSense' controller 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=20210117230956.173031-6-roderick@gaikai.com \
--to=roderick@gaikai.com \
--cc=benjamin.tissoires@redhat.com \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=lzye@google.com \
--cc=roderick.colenbrander@sony.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).