mirror of
https://github.com/libretro/Lakka-LibreELEC.git
synced 2025-03-01 06:51:22 +00:00
93 lines
2.8 KiB
Diff
93 lines
2.8 KiB
Diff
From 9cf3dabcbd08f2ae1aac8e74432728d8721bfce1 Mon Sep 17 00:00:00 2001
|
|
From: "Daniel J. Ogorchock" <djogorchock@gmail.com>
|
|
Date: Sat, 2 Nov 2019 18:19:47 -0500
|
|
Subject: [PATCH] HID: nintendo: set controller uniq to MAC
|
|
|
|
This patch sets the input device's uniq identifier to the controller's
|
|
MAC address. This is useful for future association between an IMU input
|
|
device with the normal input device as well as associating the
|
|
controller with any serial joy-con driver.
|
|
|
|
Signed-off-by: Daniel J. Ogorchock <djogorchock@gmail.com>
|
|
---
|
|
drivers/hid/hid-nintendo.c | 45 ++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 45 insertions(+)
|
|
|
|
diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c
|
|
index c2f7dc83d875..85870569cb49 100644
|
|
--- a/drivers/hid/hid-nintendo.c
|
|
+++ b/drivers/hid/hid-nintendo.c
|
|
@@ -319,6 +319,8 @@ struct joycon_ctlr {
|
|
struct led_classdev home_led;
|
|
enum joycon_ctlr_state ctlr_state;
|
|
spinlock_t lock;
|
|
+ u8 mac_addr[6];
|
|
+ char *mac_addr_str;
|
|
|
|
/* The following members are used for synchronous sends/receives */
|
|
enum joycon_msg_type msg_type;
|
|
@@ -1005,6 +1007,7 @@ static int joycon_input_create(struct joycon_ctlr *ctlr)
|
|
ctlr->input->id.vendor = hdev->vendor;
|
|
ctlr->input->id.product = hdev->product;
|
|
ctlr->input->id.version = hdev->version;
|
|
+ ctlr->input->uniq = ctlr->mac_addr_str;
|
|
ctlr->input->name = name;
|
|
input_set_drvdata(ctlr->input, ctlr);
|
|
|
|
@@ -1317,6 +1320,41 @@ static int joycon_power_supply_create(struct joycon_ctlr *ctlr)
|
|
return 0;
|
|
}
|
|
|
|
+static int joycon_read_mac(struct joycon_ctlr *ctlr)
|
|
+{
|
|
+ int ret;
|
|
+ int i;
|
|
+ int j;
|
|
+ struct joycon_subcmd_request req = { 0 };
|
|
+ struct joycon_input_report *report;
|
|
+
|
|
+ req.subcmd_id = JC_SUBCMD_REQ_DEV_INFO;
|
|
+ ret = joycon_send_subcmd(ctlr, &req, 0, HZ);
|
|
+ if (ret) {
|
|
+ hid_err(ctlr->hdev, "Failed to get joycon info; ret=%d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ report = (struct joycon_input_report *)ctlr->input_buf;
|
|
+
|
|
+ for (i = 4, j = 0; j < 6; i++, j++)
|
|
+ ctlr->mac_addr[j] = report->reply.data[i];
|
|
+
|
|
+ ctlr->mac_addr_str = devm_kasprintf(&ctlr->hdev->dev, GFP_KERNEL,
|
|
+ "%02X:%02X:%02X:%02X:%02X:%02X",
|
|
+ ctlr->mac_addr[0],
|
|
+ ctlr->mac_addr[1],
|
|
+ ctlr->mac_addr[2],
|
|
+ ctlr->mac_addr[3],
|
|
+ ctlr->mac_addr[4],
|
|
+ ctlr->mac_addr[5]);
|
|
+ if (!ctlr->mac_addr_str)
|
|
+ return -ENOMEM;
|
|
+ hid_info(ctlr->hdev, "controller MAC = %s\n", ctlr->mac_addr_str);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
/* Common handler for parsing inputs */
|
|
static int joycon_ctlr_read_handler(struct joycon_ctlr *ctlr, u8 *data,
|
|
int size)
|
|
@@ -1495,6 +1533,13 @@ static int nintendo_hid_probe(struct hid_device *hdev,
|
|
goto err_mutex;
|
|
}
|
|
|
|
+ ret = joycon_read_mac(ctlr);
|
|
+ if (ret) {
|
|
+ hid_err(hdev, "Failed to retrieve controller MAC; ret=%d\n",
|
|
+ ret);
|
|
+ goto err_close;
|
|
+ }
|
|
+
|
|
mutex_unlock(&ctlr->output_mutex);
|
|
|
|
/* Initialize the leds */
|