[sending those patches on behalf of Roderick]
There is a current thread on LED LKML which basically means that
we have to revert the LED class exposure until things are settled.
I am sending here the full series that will end up in linux-next.
But with some git magic, the final PR to Linus will not have the
reverts in it, just the plain patches.
I am queuing in for-5.12/playstation patches 1 to 6 immediately
(the reverts).
I am also queuing in for-5.12/playstation-v2 patches 7 and 8 on
top of 51151098d7ab8 immediately. Those 2 patches have already
been reviewed the usual process.
I am waiting 1 day for others to chime in regarding patches 9 to
11 before applying them to for-5.12/playstation-v2. They are
basically the same patches that were already reviewed on the
linux-input LKML, but without the LED class bits.
With all that, we should have more room to discuss the exposure
of the LEDs to userspace through the LED class.
Roderick, I made small adjustments compared to the series you sent
me privately:
- added the 2 missing reverts/re-add, so I can have clean merges
for our for-next branch,
- re-ordered the `if (ds->update_rumble)` block in
`dualsense_output_worker()` to match was was in linux-next
- removed an extra new line to match the current linux-next tree.
Cheers,
Benjamin
Benjamin Tissoires (2):
Revert "HID: playstation: fix unused variable in
ps_battery_get_property."
Revert "HID: playstation: report DualSense hardware and firmware
version."
Roderick Colenbrander (9):
Revert "HID: playstation: DualSense set LEDs to default player id."
Revert "HID: playstation: add DualSense player LEDs support."
Revert "HID: playstation: add microphone mute support for DualSense."
Revert "HID: playstation: add DualSense lightbar support"
HID: playstation: report DualSense hardware and firmware version.
HID: playstation: fix unused variable in ps_battery_get_property.
HID: playstation: add initial DualSense lightbar support.
HID: playstation: add microphone mute support for DualSense.
HID: playstation: add DualSense player LED support.
drivers/hid/Kconfig | 3 -
drivers/hid/hid-playstation.c | 177 +++-------------------------------
2 files changed, 12 insertions(+), 168 deletions(-)
--
2.29.2
From: Roderick Colenbrander <[email protected]>
This reverts commit c240f0cb88ec ("HID: playstation: add
DualSense player LEDs support.")
There is currently an ongoing discussion on linux-leds LKML,
and so to give us more room, we need to revert those related
patches from linux-next.
This is not a big deal, they are still not pushed to Linus.
Signed-off-by: Roderick Colenbrander <[email protected]>
Signed-off-by: Benjamin Tissoires <[email protected]>
---
drivers/hid/hid-playstation.c | 60 +----------------------------------
1 file changed, 1 insertion(+), 59 deletions(-)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 2d96785c397d..c436ac8f7a6f 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -112,7 +112,6 @@ struct ps_led_info {
#define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1)
#define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2)
#define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3)
-#define DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE BIT(4)
#define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1)
#define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4)
#define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1)
@@ -158,11 +157,6 @@ struct dualsense {
bool last_btn_mic_state;
struct led_classdev mute_led;
- /* Player leds */
- bool update_player_leds;
- uint8_t player_leds_state;
- struct led_classdev player_leds[5];
-
struct work_struct output_worker;
void *output_report_dmabuf;
uint8_t output_seq; /* Sequence number for output report. */
@@ -784,35 +778,6 @@ static void dualsense_mute_led_set_brightness(struct led_classdev *led, enum led
}
-static enum led_brightness dualsense_player_led_get_brightness(struct led_classdev *led)
-{
- struct hid_device *hdev = to_hid_device(led->dev->parent);
- struct dualsense *ds = hid_get_drvdata(hdev);
-
- return !!(ds->player_leds_state & BIT(led - ds->player_leds));
-}
-
-static void dualsense_player_led_set_brightness(struct led_classdev *led, enum led_brightness value)
-{
- struct hid_device *hdev = to_hid_device(led->dev->parent);
- struct dualsense *ds = hid_get_drvdata(hdev);
- unsigned long flags;
- unsigned int led_index;
-
- spin_lock_irqsave(&ds->base.lock, flags);
-
- led_index = led - ds->player_leds;
- if (value == LED_OFF)
- ds->player_leds_state &= ~BIT(led_index);
- else
- ds->player_leds_state |= BIT(led_index);
-
- ds->update_player_leds = true;
- spin_unlock_irqrestore(&ds->base.lock, flags);
-
- schedule_work(&ds->output_worker);
-}
-
static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp,
void *buf)
{
@@ -905,13 +870,6 @@ static void dualsense_output_worker(struct work_struct *work)
ds->update_lightbar = false;
}
- if (ds->update_player_leds) {
- common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE;
- common->player_leds = ds->player_leds_state;
-
- ds->update_player_leds = false;
- }
-
if (ds->update_mic_mute) {
common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE;
common->mute_button_led = ds->mic_muted;
@@ -1161,20 +1119,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
struct dualsense *ds;
struct ps_device *ps_dev;
uint8_t max_output_report_size;
- int i, ret;
+ int ret;
static const struct ps_led_info mute_led_info = {
"micmute", dualsense_mute_led_get_brightness, dualsense_mute_led_set_brightness
};
- static const struct ps_led_info player_leds_info[] = {
- { "led1", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness },
- { "led2", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness },
- { "led3", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness },
- { "led4", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness },
- { "led5", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness }
- };
-
ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL);
if (!ds)
return ERR_PTR(-ENOMEM);
@@ -1256,14 +1206,6 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
if (ret)
goto err;
- for (i = 0; i < ARRAY_SIZE(player_leds_info); i++) {
- const struct ps_led_info *led_info = &player_leds_info[i];
-
- ret = ps_led_register(ps_dev, &ds->player_leds[i], led_info);
- if (ret < 0)
- goto err;
- }
-
return &ds->base;
err:
--
2.29.2
From: Roderick Colenbrander <[email protected]>
The ret variable in ps_battery_get_property is set in an error path,
but never actually returned. Change the function to return ret.
Reported-by: kernel test robot <[email protected]>
Signed-off-by: Roderick Colenbrander <[email protected]>
Signed-off-by: Benjamin Tissoires <[email protected]>
---
drivers/hid/hid-playstation.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 84f484fce1ee..f279064e74a5 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -333,7 +333,7 @@ static int ps_battery_get_property(struct power_supply *psy,
uint8_t battery_capacity;
int battery_status;
unsigned long flags;
- int ret;
+ int ret = 0;
spin_lock_irqsave(&dev->lock, flags);
battery_capacity = dev->battery_capacity;
@@ -358,7 +358,7 @@ static int ps_battery_get_property(struct power_supply *psy,
break;
}
- return 0;
+ return ret;
}
static int ps_device_register_battery(struct ps_device *dev)
--
2.29.2
From: Roderick Colenbrander <[email protected]>
The DualSense controller has a built-in microphone exposed as an
audio device over USB (or HID using Bluetooth). A dedicated
button on the controller handles mute, but software has to configure
the device to mute the audio stream.
This patch captures the mute button and schedules an output report
to mute/unmute the audio stream as well as toggle the mute LED.
Signed-off-by: Roderick Colenbrander <[email protected]>
Reviewed-by: Barnabás Pőcze <[email protected]>
Signed-off-by: Benjamin Tissoires <[email protected]>
---
drivers/hid/hid-playstation.c | 44 +++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index b141b1be6453..04743fa0e03d 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -85,6 +85,7 @@ struct ps_calibration_data {
#define DS_BUTTONS1_R3 BIT(7)
#define DS_BUTTONS2_PS_HOME BIT(0)
#define DS_BUTTONS2_TOUCHPAD BIT(1)
+#define DS_BUTTONS2_MIC_MUTE BIT(2)
/* Status field of DualSense input report. */
#define DS_STATUS_BATTERY_CAPACITY GENMASK(3, 0)
@@ -103,9 +104,12 @@ struct ps_calibration_data {
/* Flags for DualSense output report. */
#define DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION BIT(0)
#define DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT BIT(1)
+#define DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE BIT(0)
+#define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1)
#define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2)
#define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3)
#define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1)
+#define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4)
#define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1)
/* DualSense hardware limits */
@@ -142,6 +146,11 @@ struct dualsense {
uint8_t lightbar_green;
uint8_t lightbar_blue;
+ /* Microphone */
+ bool update_mic_mute;
+ bool mic_muted;
+ bool last_btn_mic_state;
+
struct work_struct output_worker;
void *output_report_dmabuf;
uint8_t output_seq; /* Sequence number for output report. */
@@ -815,6 +824,23 @@ static void dualsense_output_worker(struct work_struct *work)
ds->update_lightbar = false;
}
+ if (ds->update_mic_mute) {
+ common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE;
+ common->mute_button_led = ds->mic_muted;
+
+ if (ds->mic_muted) {
+ /* Disable microphone */
+ common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE;
+ common->power_save_control |= DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE;
+ } else {
+ /* Enable microphone */
+ common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE;
+ common->power_save_control &= ~DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE;
+ }
+
+ ds->update_mic_mute = false;
+ }
+
spin_unlock_irqrestore(&ds->base.lock, flags);
dualsense_send_output_report(ds, &report);
@@ -829,6 +855,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
uint8_t battery_data, battery_capacity, charging_status, value;
int battery_status;
uint32_t sensor_timestamp;
+ bool btn_mic_state;
unsigned long flags;
int i;
@@ -884,6 +911,23 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME);
input_sync(ds->gamepad);
+ /*
+ * The DualSense has an internal microphone, which can be muted through a mute button
+ * on the device. The driver is expected to read the button state and program the device
+ * to mute/unmute audio at the hardware level.
+ */
+ btn_mic_state = !!(ds_report->buttons[2] & DS_BUTTONS2_MIC_MUTE);
+ if (btn_mic_state && !ds->last_btn_mic_state) {
+ spin_lock_irqsave(&ps_dev->lock, flags);
+ ds->update_mic_mute = true;
+ ds->mic_muted = !ds->mic_muted; /* toggle */
+ spin_unlock_irqrestore(&ps_dev->lock, flags);
+
+ /* Schedule updating of microphone state at hardware level. */
+ schedule_work(&ds->output_worker);
+ }
+ ds->last_btn_mic_state = btn_mic_state;
+
/* Parse and calibrate gyroscope data. */
for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) {
int raw_data = (short)le16_to_cpu(ds_report->gyro[i]);
--
2.29.2
From: Roderick Colenbrander <[email protected]>
The DualSense features 5 player LEDs below its touchpad, which are
meant as player id indications. The LEDs are configured with a
player ID determined by an ID allocator, which assign player ids
to ps_device instances.
This patch is a combination of the following original patches
minus use of LED framework APIs:
- HID: playstation: add DualSense player LEDs support.
- HID: playstation: DualSense set LEDs to default player id.
Signed-off-by: Roderick Colenbrander <[email protected]>
Reviewed-by: Barnabás Pőcze <[email protected]>
Signed-off-by: Benjamin Tissoires <[email protected]>
---
drivers/hid/hid-playstation.c | 83 ++++++++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 04743fa0e03d..7f65d30ca77c 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -9,6 +9,7 @@
#include <linux/crc32.h>
#include <linux/device.h>
#include <linux/hid.h>
+#include <linux/idr.h>
#include <linux/input/mt.h>
#include <linux/module.h>
@@ -20,6 +21,8 @@
static DEFINE_MUTEX(ps_devices_lock);
static LIST_HEAD(ps_devices_list);
+static DEFINE_IDA(ps_player_id_allocator);
+
#define HID_PLAYSTATION_VERSION_PATCH 0x8000
/* Base class for playstation devices. */
@@ -28,6 +31,8 @@ struct ps_device {
struct hid_device *hdev;
spinlock_t lock;
+ uint32_t player_id;
+
struct power_supply_desc battery_desc;
struct power_supply *battery;
uint8_t battery_capacity;
@@ -108,6 +113,7 @@ struct ps_calibration_data {
#define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1)
#define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2)
#define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3)
+#define DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE BIT(4)
#define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1)
#define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4)
#define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1)
@@ -151,6 +157,11 @@ struct dualsense {
bool mic_muted;
bool last_btn_mic_state;
+ /* Player leds */
+ bool update_player_leds;
+ uint8_t player_leds_state;
+ struct led_classdev player_leds[5];
+
struct work_struct output_worker;
void *output_report_dmabuf;
uint8_t output_seq; /* Sequence number for output report. */
@@ -309,6 +320,24 @@ static int ps_devices_list_remove(struct ps_device *dev)
return 0;
}
+static int ps_device_set_player_id(struct ps_device *dev)
+{
+ int ret = ida_alloc(&ps_player_id_allocator, GFP_KERNEL);
+
+ if (ret < 0)
+ return ret;
+
+ dev->player_id = ret;
+ return 0;
+}
+
+static void ps_device_release_player_id(struct ps_device *dev)
+{
+ ida_free(&ps_player_id_allocator, dev->player_id);
+
+ dev->player_id = U32_MAX;
+}
+
static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix)
{
struct input_dev *input_dev;
@@ -824,6 +853,13 @@ static void dualsense_output_worker(struct work_struct *work)
ds->update_lightbar = false;
}
+ if (ds->update_player_leds) {
+ common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE;
+ common->player_leds = ds->player_leds_state;
+
+ ds->update_player_leds = false;
+ }
+
if (ds->update_mic_mute) {
common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE;
common->mute_button_led = ds->mic_muted;
@@ -1078,6 +1114,29 @@ static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t gr
schedule_work(&ds->output_worker);
}
+static void dualsense_set_player_leds(struct dualsense *ds)
+{
+ /*
+ * The DualSense controller has a row of 5 LEDs used for player ids.
+ * Behavior on the PlayStation 5 console is to center the player id
+ * across the LEDs, so e.g. player 1 would be "--x--" with x being 'on'.
+ * Follow a similar mapping here.
+ */
+ static const int player_ids[5] = {
+ BIT(2),
+ BIT(3) | BIT(1),
+ BIT(4) | BIT(2) | BIT(0),
+ BIT(4) | BIT(3) | BIT(1) | BIT(0),
+ BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)
+ };
+
+ uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids);
+
+ ds->update_player_leds = true;
+ ds->player_leds_state = player_ids[player_id];
+ schedule_work(&ds->output_worker);
+}
+
static struct ps_device *dualsense_create(struct hid_device *hdev)
{
struct dualsense *ds;
@@ -1166,6 +1225,15 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
dualsense_set_lightbar(ds, 0, 0, 128); /* blue */
+ ret = ps_device_set_player_id(ps_dev);
+ if (ret) {
+ hid_err(hdev, "Failed to assign player id for DualSense: %d\n", ret);
+ goto err;
+ }
+
+ /* Set player LEDs to our player id. */
+ dualsense_set_player_leds(ds);
+
/*
* Reporting hardware and firmware is important as there are frequent updates, which
* can change behavior.
@@ -1243,6 +1311,7 @@ static void ps_remove(struct hid_device *hdev)
struct ps_device *dev = hid_get_drvdata(hdev);
ps_devices_list_remove(dev);
+ ps_device_release_player_id(dev);
hid_hw_close(hdev);
hid_hw_stop(hdev);
@@ -1263,7 +1332,19 @@ static struct hid_driver ps_driver = {
.raw_event = ps_raw_event,
};
-module_hid_driver(ps_driver);
+static int __init ps_init(void)
+{
+ return hid_register_driver(&ps_driver);
+}
+
+static void __exit ps_exit(void)
+{
+ hid_unregister_driver(&ps_driver);
+ ida_destroy(&ps_player_id_allocator);
+}
+
+module_init(ps_init);
+module_exit(ps_exit);
MODULE_AUTHOR("Sony Interactive Entertainment");
MODULE_DESCRIPTION("HID Driver for PlayStation peripherals.");
--
2.29.2
On Wed 2021-02-17 18:31:47, Benjamin Tissoires wrote:
> [sending those patches on behalf of Roderick]
>
> There is a current thread on LED LKML which basically means that
> we have to revert the LED class exposure until things are settled.
>
> I am sending here the full series that will end up in linux-next.
> But with some git magic, the final PR to Linus will not have the
> reverts in it, just the plain patches.
Thank you!
Pavel
--
http://www.livejournal.com/~pavelmachek
On Wed, 17 Feb 2021, Benjamin Tissoires wrote:
> [sending those patches on behalf of Roderick]
>
> There is a current thread on LED LKML which basically means that
> we have to revert the LED class exposure until things are settled.
>
> I am sending here the full series that will end up in linux-next.
> But with some git magic, the final PR to Linus will not have the
> reverts in it, just the plain patches.
>
> I am queuing in for-5.12/playstation patches 1 to 6 immediately
> (the reverts).
>
> I am also queuing in for-5.12/playstation-v2 patches 7 and 8 on
> top of 51151098d7ab8 immediately. Those 2 patches have already
> been reviewed the usual process.
>
> I am waiting 1 day for others to chime in regarding patches 9 to
> 11 before applying them to for-5.12/playstation-v2. They are
> basically the same patches that were already reviewed on the
> linux-input LKML, but without the LED class bits.
FWIW, as discussed elsewhere, I am fully in favor of this solution.
Thanks!
--
Jiri Kosina
SUSE Labs
On Wed, Feb 17, 2021 at 6:32 PM Benjamin Tissoires
<[email protected]> wrote:
>
> [sending those patches on behalf of Roderick]
>
> There is a current thread on LED LKML which basically means that
> we have to revert the LED class exposure until things are settled.
>
> I am sending here the full series that will end up in linux-next.
> But with some git magic, the final PR to Linus will not have the
> reverts in it, just the plain patches.
>
> I am queuing in for-5.12/playstation patches 1 to 6 immediately
> (the reverts).
>
> I am also queuing in for-5.12/playstation-v2 patches 7 and 8 on
> top of 51151098d7ab8 immediately. Those 2 patches have already
> been reviewed the usual process.
>
> I am waiting 1 day for others to chime in regarding patches 9 to
> 11 before applying them to for-5.12/playstation-v2. They are
> basically the same patches that were already reviewed on the
> linux-input LKML, but without the LED class bits.
And I just pushed those 3 patches to for-5.12/playstation-v2.
Cheers,
Benjamin
>
> With all that, we should have more room to discuss the exposure
> of the LEDs to userspace through the LED class.
>
> Roderick, I made small adjustments compared to the series you sent
> me privately:
> - added the 2 missing reverts/re-add, so I can have clean merges
> for our for-next branch,
> - re-ordered the `if (ds->update_rumble)` block in
> `dualsense_output_worker()` to match was was in linux-next
> - removed an extra new line to match the current linux-next tree.
>
> Cheers,
> Benjamin
>
> Benjamin Tissoires (2):
> Revert "HID: playstation: fix unused variable in
> ps_battery_get_property."
> Revert "HID: playstation: report DualSense hardware and firmware
> version."
>
> Roderick Colenbrander (9):
> Revert "HID: playstation: DualSense set LEDs to default player id."
> Revert "HID: playstation: add DualSense player LEDs support."
> Revert "HID: playstation: add microphone mute support for DualSense."
> Revert "HID: playstation: add DualSense lightbar support"
> HID: playstation: report DualSense hardware and firmware version.
> HID: playstation: fix unused variable in ps_battery_get_property.
> HID: playstation: add initial DualSense lightbar support.
> HID: playstation: add microphone mute support for DualSense.
> HID: playstation: add DualSense player LED support.
>
> drivers/hid/Kconfig | 3 -
> drivers/hid/hid-playstation.c | 177 +++-------------------------------
> 2 files changed, 12 insertions(+), 168 deletions(-)
>
> --
> 2.29.2
>