summarylogtreecommitdiffstats
path: root/0010-HID-nintendo-set-controller-uniq-to-MAC.patch
diff options
context:
space:
mode:
authorLuca Stefani2020-08-25 12:19:53 +0200
committerLuca Stefani2020-08-25 12:20:17 +0200
commit882f3ff4cd1eed7a679b33803e5f5893c2c15a42 (patch)
tree866a827f449fd3efbb899bcd4adfe9168a87c2ae /0010-HID-nintendo-set-controller-uniq-to-MAC.patch
parent60f72f2a3d98d9abe77090384606d66e8141689f (diff)
downloadaur-882f3ff4cd1eed7a679b33803e5f5893c2c15a42.tar.gz
Enable HID Nitendo
Diffstat (limited to '0010-HID-nintendo-set-controller-uniq-to-MAC.patch')
-rw-r--r--0010-HID-nintendo-set-controller-uniq-to-MAC.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/0010-HID-nintendo-set-controller-uniq-to-MAC.patch b/0010-HID-nintendo-set-controller-uniq-to-MAC.patch
new file mode 100644
index 000000000000..ec5401f1d2f7
--- /dev/null
+++ b/0010-HID-nintendo-set-controller-uniq-to-MAC.patch
@@ -0,0 +1,95 @@
+From 0c4a9a01aae68896296b8456c09203643a5dcf01 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 10/14] 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 */
+--
+2.28.0
+