diff options
Diffstat (limited to '0004-HID-nintendo-add-home-led-support.patch')
-rw-r--r-- | 0004-HID-nintendo-add-home-led-support.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/0004-HID-nintendo-add-home-led-support.patch b/0004-HID-nintendo-add-home-led-support.patch new file mode 100644 index 000000000000..e14a5d525ee5 --- /dev/null +++ b/0004-HID-nintendo-add-home-led-support.patch @@ -0,0 +1,131 @@ +From f4686d401c09c84764bab89c92da0556cf37cc98 Mon Sep 17 00:00:00 2001 +From: "Daniel J. Ogorchock" <djogorchock@gmail.com> +Date: Sat, 23 Feb 2019 23:03:57 -0600 +Subject: [PATCH 04/14] HID: nintendo: add home led support + +This patch adds the ability to set the intensity level of the home +button's LED. + +Signed-off-by: Daniel J. Ogorchock <djogorchock@gmail.com> +--- + drivers/hid/hid-nintendo.c | 69 +++++++++++++++++++++++++++++++++++--- + 1 file changed, 65 insertions(+), 4 deletions(-) + +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +index adecd6790fe9..e5afe360c676 100644 +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -192,7 +192,8 @@ struct joycon_input_report { + struct joycon_ctlr { + struct hid_device *hdev; + struct input_dev *input; +- struct led_classdev leds[JC_NUM_LEDS]; ++ struct led_classdev leds[JC_NUM_LEDS]; /* player leds */ ++ struct led_classdev home_led; + enum joycon_ctlr_state ctlr_state; + spinlock_t lock; + +@@ -726,6 +727,40 @@ static int joycon_player_led_brightness_set(struct led_classdev *led, + return ret; + } + ++static int joycon_home_led_brightness_set(struct led_classdev *led, ++ enum led_brightness brightness) ++{ ++ struct device *dev = led->dev->parent; ++ struct hid_device *hdev = to_hid_device(dev); ++ struct joycon_ctlr *ctlr; ++ struct joycon_subcmd_request *req; ++ u8 buffer[sizeof(*req) + 5] = { 0 }; ++ u8 *data; ++ int ret; ++ ++ ctlr = hid_get_drvdata(hdev); ++ if (!ctlr) { ++ hid_err(hdev, "No controller data\n"); ++ return -ENODEV; ++ } ++ ++ req = (struct joycon_subcmd_request *)buffer; ++ req->subcmd_id = JC_SUBCMD_SET_HOME_LIGHT; ++ data = req->data; ++ data[0] = 0x01; ++ data[1] = brightness << 4; ++ data[2] = brightness | (brightness << 4); ++ data[3] = 0x11; ++ data[4] = 0x11; ++ ++ hid_dbg(hdev, "setting home led brightness\n"); ++ mutex_lock(&ctlr->output_mutex); ++ ret = joycon_send_subcmd(ctlr, req, 5); ++ mutex_unlock(&ctlr->output_mutex); ++ ++ return ret; ++} ++ + static const char * const joycon_player_led_names[] = { + "player1", + "player2", +@@ -734,7 +769,7 @@ static const char * const joycon_player_led_names[] = { + }; + + static DEFINE_MUTEX(joycon_input_num_mutex); +-static int joycon_player_leds_create(struct joycon_ctlr *ctlr) ++static int joycon_leds_create(struct joycon_ctlr *ctlr) + { + struct hid_device *hdev = ctlr->hdev; + struct device *dev = &hdev->dev; +@@ -771,7 +806,7 @@ static int joycon_player_leds_create(struct joycon_ctlr *ctlr) + ret = devm_led_classdev_register(&hdev->dev, led); + if (ret) { + hid_err(hdev, "Failed registering %s LED\n", led->name); +- break; ++ return ret; + } + } + +@@ -779,6 +814,32 @@ static int joycon_player_leds_create(struct joycon_ctlr *ctlr) + input_num = 1; + mutex_unlock(&joycon_input_num_mutex); + ++ /* configure the home LED */ ++ if (ctlr->hdev->product != USB_DEVICE_ID_NINTENDO_JOYCONL) { ++ name = devm_kasprintf(dev, GFP_KERNEL, "%s:%s", d_name, "home"); ++ if (!name) ++ return ret; ++ ++ led = &ctlr->home_led; ++ led->name = name; ++ led->brightness = 0; ++ led->max_brightness = 0xF; ++ led->brightness_set_blocking = joycon_home_led_brightness_set; ++ led->flags = LED_CORE_SUSPENDRESUME | LED_HW_PLUGGABLE; ++ ret = devm_led_classdev_register(&hdev->dev, led); ++ if (ret) { ++ hid_err(hdev, "Failed registering home led\n"); ++ return ret; ++ } ++ /* Set the home LED to 0 as default state */ ++ ret = joycon_home_led_brightness_set(led, 0); ++ if (ret) { ++ hid_err(hdev, "Failed to set home LED dflt; ret=%d\n", ++ ret); ++ return ret; ++ } ++ } ++ + return 0; + } + +@@ -1027,7 +1088,7 @@ static int nintendo_hid_probe(struct hid_device *hdev, + mutex_unlock(&ctlr->output_mutex); + + /* Initialize the leds */ +- ret = joycon_player_leds_create(ctlr); ++ ret = joycon_leds_create(ctlr); + if (ret) { + hid_err(hdev, "Failed to create leds; ret=%d\n", ret); + goto err_close; +-- +2.28.0 + |