Skip to content

Commit

Permalink
HID: nintendo: set controller uniq to MAC
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Daniel J. Ogorchock authored and Jiri Kosina committed Oct 27, 2021
1 parent 012bd52 commit 1425247
Showing 1 changed file with 45 additions and 0 deletions.
45 changes: 45 additions & 0 deletions drivers/hid/hid-nintendo.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,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;
Expand Down Expand Up @@ -1012,6 +1014,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);

Expand Down Expand Up @@ -1322,6 +1325,41 @@ static int joycon_power_supply_create(struct joycon_ctlr *ctlr)
return power_supply_powers(ctlr->battery, &hdev->dev);
}

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)
Expand Down Expand Up @@ -1498,6 +1536,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_mutex;
}

mutex_unlock(&ctlr->output_mutex);

/* Initialize the leds */
Expand Down

0 comments on commit 1425247

Please sign in to comment.