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;
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);
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)
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 */