Hi Daniel One comment below. "Daniel J. Ogorchock" <djogorchock@xxxxxxxxx> wrote: > 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@xxxxxxxxx> > --- > 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; This should be err_mutex otherwise we don't unlock the mutex on error. Note that a later patch changes the hid_err error format string but the error is introduced here. Cheers, Silvan > + } > + > mutex_unlock(&ctlr->output_mutex); > > /* Initialize the leds */