Inter-revision diff: patch 11

Comparing v1 (message) to v2 (message)

--- v1
+++ v2
@@ -6,22 +6,22 @@
 
 Signed-off-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
 ---
- drivers/hid/hid-playstation.c | 64 ++++++++++++++++++++++++++++++++++-
- 1 file changed, 63 insertions(+), 1 deletion(-)
+ drivers/hid/hid-playstation.c | 60 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 59 insertions(+), 1 deletion(-)
 
 diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
-index ad8eedd3d2bf..384449e3095d 100644
+index ebf8a6550308..183f011f081b 100644
 --- a/drivers/hid/hid-playstation.c
 +++ b/drivers/hid/hid-playstation.c
-@@ -90,6 +90,7 @@ struct ps_led_info {
+@@ -100,6 +100,7 @@ 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)
- 
-@@ -134,6 +135,11 @@ struct dualsense {
+ #define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1)
+@@ -145,6 +146,11 @@ struct dualsense {
  	bool last_btn_mic_state;
  	struct led_classdev mute_led;
  
@@ -33,37 +33,33 @@
  	struct work_struct output_worker;
  	void *output_report_dmabuf;
  	uint8_t output_seq; /* Sequence number for output report. */
-@@ -707,6 +713,39 @@ static enum led_brightness dualsense_mute_led_get_brightness(struct led_classdev
- 	return ds->mic_muted;
+@@ -730,6 +736,35 @@ 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);
-+	int i;
 +
-+	for (i = 0; i < ARRAY_SIZE(ds->player_leds); i++) {
-+		if (&ds->player_leds[i] == led)
-+			return !!(ds->player_leds_state & BIT(i));
-+	}
-+
-+	return LED_OFF;
++	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);
-+	uint8_t player_leds_state = 0;
 +	unsigned long flags;
-+	int i;
-+
-+	for (i = 0; i < ARRAY_SIZE(ds->player_leds); i++)
-+		player_leds_state |= (ds->player_leds[i].brightness << i);
++	unsigned int led_index;
 +
 +	spin_lock_irqsave(&ds->base.lock, flags);
-+	ds->player_leds_state = player_leds_state;
++
++	led_index = led - ds->player_leds;
++	if (value == LED_OFF)
++		ds->player_leds_state &= ~(1 << led_index);
++	else
++		ds->player_leds_state |= (1 << led_index);
++
 +	ds->update_player_leds = true;
 +	spin_unlock_irqrestore(&ds->base.lock, flags);
 +
@@ -73,13 +69,13 @@
  static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp,
  		void *buf)
  {
-@@ -797,6 +836,13 @@ static void dualsense_output_worker(struct work_struct *work)
+@@ -820,6 +855,13 @@ static void dualsense_output_worker(struct work_struct *work)
  		ds->update_lightbar = false;
  	}
  
 +	if (ds->update_player_leds) {
-+		r->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE;
-+		r->player_leds = ds->player_leds_state;
++		common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE;
++		common->player_leds = ds->player_leds_state;
 +
 +		ds->update_player_leds = false;
 +	}
@@ -87,14 +83,16 @@
  	if (ds->update_mic_mute) {
  		if (ds->mic_muted) {
  			common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE;
-@@ -1042,10 +1088,18 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
- {
+@@ -1065,12 +1107,20 @@ 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 ret;
 +	int i, ret;
  
- 	struct ps_led_info mute_led_info = { "micmute", dualsense_mute_led_get_brightness, NULL };
+ 	struct ps_led_info mute_led_info = {
+ 		"micmute", dualsense_mute_led_get_brightness, dualsense_mute_led_set_brightness
+ 	};
  
 +	struct ps_led_info player_leds_info[] = {
 +		{ "led1", dualsense_player_led_get_brightness, dualsense_player_led_set_brightness },
@@ -107,19 +105,19 @@
  	ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL);
  	if (!ds)
  		return ERR_PTR(-ENOMEM);
-@@ -1126,6 +1180,14 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
+@@ -1149,6 +1199,14 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
  	if (ret < 0)
  		goto err;
  
 +	for (i = 0; i < ARRAY_SIZE(player_leds_info); i++) {
 +		struct ps_led_info *led_info = &player_leds_info[i];
 +
-+		ret = ps_led_register((struct ps_device *)ds, &ds->player_leds[i], led_info);
++		ret = ps_led_register(ps_dev, &ds->player_leds[i], led_info);
 +		if (ret < 0)
 +			goto err;
 +	}
 +
- 	return (struct ps_device *)ds;
+ 	return &ds->base;
  
  err:
 -- 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help