diff mbox

asus-wmi: restore kbd led level after resume

Message ID 1442222190-8591-1-git-send-email-linux@rempel-privat.de (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Oleksij Rempel Sept. 14, 2015, 9:16 a.m. UTC
Afters suspend/resume cycle with closed lid the kbd backlight level
is lost. This patch will will restore this value to last known level.

Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
---
 drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

Comments

Corentin Chary Sept. 15, 2015, 1:58 p.m. UTC | #1
On Tue, Sep 15, 2015 at 3:56 PM, Corentin Chary
<corentin.chary@gmail.com> wrote:
>
>
> On Mon, Sep 14, 2015 at 11:16 AM, Oleksij Rempel <linux@rempel-privat.de>
> wrote:
>>
>> Afters suspend/resume cycle with closed lid the kbd backlight level
>> is lost. This patch will will restore this value to last known level.
>>
>> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
>> ---
>>  drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
>>  1 file changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/platform/x86/asus-wmi.c
>> b/drivers/platform/x86/asus-wmi.c
>> index efbc3f0..1f7d80f 100644
>> --- a/drivers/platform/x86/asus-wmi.c
>> +++ b/drivers/platform/x86/asus-wmi.c
>> @@ -582,7 +582,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
>>
>>  static int asus_wmi_led_init(struct asus_wmi *asus)
>>  {
>> -       int rv = 0;
>> +       int rv = 0, led_val;
>>
>>         asus->led_workqueue =
>> create_singlethread_workqueue("led_workqueue");
>>         if (!asus->led_workqueue)
>> @@ -602,9 +602,11 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
>>                         goto error;
>>         }
>>
>> -       if (kbd_led_read(asus, NULL, NULL) >= 0) {
>> +       led_val = kbd_led_read(asus, NULL, NULL);
>> +       if (led_val >= 0) {
>>                 INIT_WORK(&asus->kbd_led_work, kbd_led_update);
>>
>> +               asus->kbd_led_wk = led_val;
>>                 asus->kbd_led.name = "asus::kbd_backlight";
>>                 asus->kbd_led.brightness_set = kbd_led_set;
>>                 asus->kbd_led.brightness_get = kbd_led_get;
>> @@ -2160,6 +2162,16 @@ static int asus_hotk_thaw(struct device *device)
>>         return 0;
>>  }
>>
>> +static int asus_hotk_resume(struct device *device)
>> +{
>> +       struct asus_wmi *asus = dev_get_drvdata(device);
>> +
>> +       if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
>> +               queue_work(asus->led_workqueue, &asus->kbd_led_work);
>> +
>> +       return 0;
>> +}
>> +
>>  static int asus_hotk_restore(struct device *device)
>>  {
>>         struct asus_wmi *asus = dev_get_drvdata(device);
>> @@ -2190,6 +2202,8 @@ static int asus_hotk_restore(struct device *device)
>>                 bl = !asus_wmi_get_devstate_simple(asus,
>> ASUS_WMI_DEVID_UWB);
>>                 rfkill_set_sw_state(asus->uwb.rfkill, bl);
>>         }
>> +       if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
>> +               queue_work(asus->led_workqueue, &asus->kbd_led_work);
>>
>>         return 0;
>>  }
>> @@ -2197,6 +2211,7 @@ static int asus_hotk_restore(struct device *device)
>>  static const struct dev_pm_ops asus_pm_ops = {
>>         .thaw = asus_hotk_thaw,
>>         .restore = asus_hotk_restore,
>> +       .resume = asus_hotk_resume,
>>  };
>>
>>  static int asus_wmi_probe(struct platform_device *pdev)
>> --
>> 2.5.0
>>
>
> Looks good to me.
>
> Reviewed-by: Corentin Chary <corentin.chary@gmail.com>

Again, without HTML, to the right address. Sorry for the mess.
Darren Hart Sept. 18, 2015, 10:31 p.m. UTC | #2
On Mon, Sep 14, 2015 at 11:16:30AM +0200, Oleksij Rempel wrote:
> Afters suspend/resume cycle with closed lid the kbd backlight level
> is lost. This patch will will restore this value to last known level.
> 
> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>

Hi Oleksij,

Please always run scripts/get_maintainer.pl -f path/to/files/changed

And include *all* the maintainers and lists on Cc. This will ensure a faster
response.

> ---
>  drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> index efbc3f0..1f7d80f 100644
> --- a/drivers/platform/x86/asus-wmi.c
> +++ b/drivers/platform/x86/asus-wmi.c
> @@ -582,7 +582,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
>  
>  static int asus_wmi_led_init(struct asus_wmi *asus)
>  {
> -	int rv = 0;
> +	int rv = 0, led_val;
>  
>  	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
>  	if (!asus->led_workqueue)
> @@ -602,9 +602,11 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
>  			goto error;
>  	}
>  
> -	if (kbd_led_read(asus, NULL, NULL) >= 0) {
> +	led_val = kbd_led_read(asus, NULL, NULL);
> +	if (led_val >= 0) {
>  		INIT_WORK(&asus->kbd_led_work, kbd_led_update);
>  
> +		asus->kbd_led_wk = led_val;
>  		asus->kbd_led.name = "asus::kbd_backlight";
>  		asus->kbd_led.brightness_set = kbd_led_set;
>  		asus->kbd_led.brightness_get = kbd_led_get;
> @@ -2160,6 +2162,16 @@ static int asus_hotk_thaw(struct device *device)
>  	return 0;
>  }
>  
> +static int asus_hotk_resume(struct device *device)
> +{
> +	struct asus_wmi *asus = dev_get_drvdata(device);
> +
> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))

	if (asus->kbd_led.dev)

	should be sufficient, I don't see the dev pointer being stored as an
	errno.

	Corentin?

> +		queue_work(asus->led_workqueue, &asus->kbd_led_work);
> +
> +	return 0;
> +}
> +
>  static int asus_hotk_restore(struct device *device)
>  {
>  	struct asus_wmi *asus = dev_get_drvdata(device);
> @@ -2190,6 +2202,8 @@ static int asus_hotk_restore(struct device *device)
>  		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
>  		rfkill_set_sw_state(asus->uwb.rfkill, bl);
>  	}
> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
> +		queue_work(asus->led_workqueue, &asus->kbd_led_work);

Ditto

>  
>  	return 0;
>  }
> @@ -2197,6 +2211,7 @@ static int asus_hotk_restore(struct device *device)
>  static const struct dev_pm_ops asus_pm_ops = {
>  	.thaw = asus_hotk_thaw,
>  	.restore = asus_hotk_restore,
> +	.resume = asus_hotk_resume,
>  };
>  
>  static int asus_wmi_probe(struct platform_device *pdev)
> -- 
> 2.5.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
Oleksij Rempel Sept. 19, 2015, 5:45 a.m. UTC | #3
Hi,

Am 19.09.2015 um 00:31 schrieb Darren Hart:
> On Mon, Sep 14, 2015 at 11:16:30AM +0200, Oleksij Rempel wrote:
>> Afters suspend/resume cycle with closed lid the kbd backlight level
>> is lost. This patch will will restore this value to last known level.
>>
>> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
> 
> Hi Oleksij,
> 
> Please always run scripts/get_maintainer.pl -f path/to/files/changed
> 
> And include *all* the maintainers and lists on Cc. This will ensure a faster
> response.
> 
>> ---
>>  drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
>>  1 file changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
>> index efbc3f0..1f7d80f 100644
>> --- a/drivers/platform/x86/asus-wmi.c
>> +++ b/drivers/platform/x86/asus-wmi.c
>> @@ -582,7 +582,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
>>  
>>  static int asus_wmi_led_init(struct asus_wmi *asus)
>>  {
>> -	int rv = 0;
>> +	int rv = 0, led_val;
>>  
>>  	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
>>  	if (!asus->led_workqueue)
>> @@ -602,9 +602,11 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
>>  			goto error;
>>  	}
>>  
>> -	if (kbd_led_read(asus, NULL, NULL) >= 0) {
>> +	led_val = kbd_led_read(asus, NULL, NULL);
>> +	if (led_val >= 0) {
>>  		INIT_WORK(&asus->kbd_led_work, kbd_led_update);
>>  
>> +		asus->kbd_led_wk = led_val;
>>  		asus->kbd_led.name = "asus::kbd_backlight";
>>  		asus->kbd_led.brightness_set = kbd_led_set;
>>  		asus->kbd_led.brightness_get = kbd_led_get;
>> @@ -2160,6 +2162,16 @@ static int asus_hotk_thaw(struct device *device)
>>  	return 0;
>>  }
>>  
>> +static int asus_hotk_resume(struct device *device)
>> +{
>> +	struct asus_wmi *asus = dev_get_drvdata(device);
>> +
>> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
> 
> 	if (asus->kbd_led.dev)
> 
> 	should be sufficient, I don't see the dev pointer being stored as an
> 	errno.
> 
> 	Corentin?

led_classdev_register
  led_classdev_next_name
    device_create_with_groups
      device_create_groups_vargs
        retval = -ENODEV;
        retval = -ENOMEM;
        return ERR_PTR(retval);
  if (IS_ERR(led_cdev->dev))

this is how dev pointer is stored as errno.

>> +		queue_work(asus->led_workqueue, &asus->kbd_led_work);
>> +
>> +	return 0;
>> +}
>> +
>>  static int asus_hotk_restore(struct device *device)
>>  {
>>  	struct asus_wmi *asus = dev_get_drvdata(device);
>> @@ -2190,6 +2202,8 @@ static int asus_hotk_restore(struct device *device)
>>  		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
>>  		rfkill_set_sw_state(asus->uwb.rfkill, bl);
>>  	}
>> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
>> +		queue_work(asus->led_workqueue, &asus->kbd_led_work);
> 
> Ditto
> 
>>  
>>  	return 0;
>>  }
>> @@ -2197,6 +2211,7 @@ static int asus_hotk_restore(struct device *device)
>>  static const struct dev_pm_ops asus_pm_ops = {
>>  	.thaw = asus_hotk_thaw,
>>  	.restore = asus_hotk_restore,
>> +	.resume = asus_hotk_resume,
>>  };
>>  
>>  static int asus_wmi_probe(struct platform_device *pdev)
>> -- 
>> 2.5.0
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
Darren Hart Sept. 21, 2015, 5:12 p.m. UTC | #4
On Sat, Sep 19, 2015 at 07:45:31AM +0200, Oleksij Rempel wrote:
> Hi,
> 
> Am 19.09.2015 um 00:31 schrieb Darren Hart:
> > On Mon, Sep 14, 2015 at 11:16:30AM +0200, Oleksij Rempel wrote:
> >> Afters suspend/resume cycle with closed lid the kbd backlight level
> >> is lost. This patch will will restore this value to last known level.
> >>
> >> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
> > 
> > Hi Oleksij,
> > 
> > Please always run scripts/get_maintainer.pl -f path/to/files/changed
> > 
> > And include *all* the maintainers and lists on Cc. This will ensure a faster
> > response.
> > 
> >> ---
> >>  drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
> >>  1 file changed, 17 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> >> index efbc3f0..1f7d80f 100644
> >> --- a/drivers/platform/x86/asus-wmi.c
> >> +++ b/drivers/platform/x86/asus-wmi.c
> >> @@ -582,7 +582,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
> >>  
> >>  static int asus_wmi_led_init(struct asus_wmi *asus)
> >>  {
> >> -	int rv = 0;
> >> +	int rv = 0, led_val;
> >>  
> >>  	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
> >>  	if (!asus->led_workqueue)
> >> @@ -602,9 +602,11 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
> >>  			goto error;
> >>  	}
> >>  
> >> -	if (kbd_led_read(asus, NULL, NULL) >= 0) {
> >> +	led_val = kbd_led_read(asus, NULL, NULL);
> >> +	if (led_val >= 0) {
> >>  		INIT_WORK(&asus->kbd_led_work, kbd_led_update);
> >>  
> >> +		asus->kbd_led_wk = led_val;
> >>  		asus->kbd_led.name = "asus::kbd_backlight";
> >>  		asus->kbd_led.brightness_set = kbd_led_set;
> >>  		asus->kbd_led.brightness_get = kbd_led_get;
> >> @@ -2160,6 +2162,16 @@ static int asus_hotk_thaw(struct device *device)
> >>  	return 0;
> >>  }
> >>  
> >> +static int asus_hotk_resume(struct device *device)
> >> +{
> >> +	struct asus_wmi *asus = dev_get_drvdata(device);
> >> +
> >> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
> > 
> > 	if (asus->kbd_led.dev)
> > 
> > 	should be sufficient, I don't see the dev pointer being stored as an
> > 	errno.
> > 
> > 	Corentin?
> 
> led_classdev_register
>   led_classdev_next_name
>     device_create_with_groups
>       device_create_groups_vargs
>         retval = -ENODEV;
>         retval = -ENOMEM;
>         return ERR_PTR(retval);
>   if (IS_ERR(led_cdev->dev))
> 
> this is how dev pointer is stored as errno.

Ah! Thank you for the correction. Noted.
Oleksij Rempel Sept. 21, 2015, 5:28 p.m. UTC | #5
Am 21.09.2015 um 19:12 schrieb Darren Hart:
> On Sat, Sep 19, 2015 at 07:45:31AM +0200, Oleksij Rempel wrote:
>> Hi,
>>
>> Am 19.09.2015 um 00:31 schrieb Darren Hart:
>>> On Mon, Sep 14, 2015 at 11:16:30AM +0200, Oleksij Rempel wrote:
>>>> Afters suspend/resume cycle with closed lid the kbd backlight level
>>>> is lost. This patch will will restore this value to last known level.
>>>>
>>>> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
>>>
>>> Hi Oleksij,
>>>
>>> Please always run scripts/get_maintainer.pl -f path/to/files/changed
>>>
>>> And include *all* the maintainers and lists on Cc. This will ensure a faster
>>> response.
>>>
>>>> ---
>>>>  drivers/platform/x86/asus-wmi.c | 19 +++++++++++++++++--
>>>>  1 file changed, 17 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
>>>> index efbc3f0..1f7d80f 100644
>>>> --- a/drivers/platform/x86/asus-wmi.c
>>>> +++ b/drivers/platform/x86/asus-wmi.c
>>>> @@ -582,7 +582,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
>>>>  
>>>>  static int asus_wmi_led_init(struct asus_wmi *asus)
>>>>  {
>>>> -	int rv = 0;
>>>> +	int rv = 0, led_val;
>>>>  
>>>>  	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
>>>>  	if (!asus->led_workqueue)
>>>> @@ -602,9 +602,11 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
>>>>  			goto error;
>>>>  	}
>>>>  
>>>> -	if (kbd_led_read(asus, NULL, NULL) >= 0) {
>>>> +	led_val = kbd_led_read(asus, NULL, NULL);
>>>> +	if (led_val >= 0) {
>>>>  		INIT_WORK(&asus->kbd_led_work, kbd_led_update);
>>>>  
>>>> +		asus->kbd_led_wk = led_val;
>>>>  		asus->kbd_led.name = "asus::kbd_backlight";
>>>>  		asus->kbd_led.brightness_set = kbd_led_set;
>>>>  		asus->kbd_led.brightness_get = kbd_led_get;
>>>> @@ -2160,6 +2162,16 @@ static int asus_hotk_thaw(struct device *device)
>>>>  	return 0;
>>>>  }
>>>>  
>>>> +static int asus_hotk_resume(struct device *device)
>>>> +{
>>>> +	struct asus_wmi *asus = dev_get_drvdata(device);
>>>> +
>>>> +	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
>>>
>>> 	if (asus->kbd_led.dev)
>>>
>>> 	should be sufficient, I don't see the dev pointer being stored as an
>>> 	errno.
>>>
>>> 	Corentin?
>>
>> led_classdev_register
>>   led_classdev_next_name
>>     device_create_with_groups
>>       device_create_groups_vargs
>>         retval = -ENODEV;
>>         retval = -ENOMEM;
>>         return ERR_PTR(retval);
>>   if (IS_ERR(led_cdev->dev))
>>
>> this is how dev pointer is stored as errno.
> 
> Ah! Thank you for the correction. Noted.
> 

No problem :)
probably it can be optimised in separate patch.
Darren Hart Sept. 25, 2015, 3:41 p.m. UTC | #6
On Mon, Sep 21, 2015 at 07:28:59PM +0200, Oleksij Rempel wrote:
> Am 21.09.2015 um 19:12 schrieb Darren Hart:
> > On Sat, Sep 19, 2015 at 07:45:31AM +0200, Oleksij Rempel wrote:
> >> Hi,
> >>
> >> Am 19.09.2015 um 00:31 schrieb Darren Hart:
> >>> On Mon, Sep 14, 2015 at 11:16:30AM +0200, Oleksij Rempel wrote:
> >>>> Afters suspend/resume cycle with closed lid the kbd backlight level
> >>>> is lost. This patch will will restore this value to last known level.
> >>>>
> >>>> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>

Queued to testing, will be in -next next week unless Corentin raises an
objection.
diff mbox

Patch

diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index efbc3f0..1f7d80f 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -582,7 +582,7 @@  static void asus_wmi_led_exit(struct asus_wmi *asus)
 
 static int asus_wmi_led_init(struct asus_wmi *asus)
 {
-	int rv = 0;
+	int rv = 0, led_val;
 
 	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
 	if (!asus->led_workqueue)
@@ -602,9 +602,11 @@  static int asus_wmi_led_init(struct asus_wmi *asus)
 			goto error;
 	}
 
-	if (kbd_led_read(asus, NULL, NULL) >= 0) {
+	led_val = kbd_led_read(asus, NULL, NULL);
+	if (led_val >= 0) {
 		INIT_WORK(&asus->kbd_led_work, kbd_led_update);
 
+		asus->kbd_led_wk = led_val;
 		asus->kbd_led.name = "asus::kbd_backlight";
 		asus->kbd_led.brightness_set = kbd_led_set;
 		asus->kbd_led.brightness_get = kbd_led_get;
@@ -2160,6 +2162,16 @@  static int asus_hotk_thaw(struct device *device)
 	return 0;
 }
 
+static int asus_hotk_resume(struct device *device)
+{
+	struct asus_wmi *asus = dev_get_drvdata(device);
+
+	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
+		queue_work(asus->led_workqueue, &asus->kbd_led_work);
+
+	return 0;
+}
+
 static int asus_hotk_restore(struct device *device)
 {
 	struct asus_wmi *asus = dev_get_drvdata(device);
@@ -2190,6 +2202,8 @@  static int asus_hotk_restore(struct device *device)
 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
 		rfkill_set_sw_state(asus->uwb.rfkill, bl);
 	}
+	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
+		queue_work(asus->led_workqueue, &asus->kbd_led_work);
 
 	return 0;
 }
@@ -2197,6 +2211,7 @@  static int asus_hotk_restore(struct device *device)
 static const struct dev_pm_ops asus_pm_ops = {
 	.thaw = asus_hotk_thaw,
 	.restore = asus_hotk_restore,
+	.resume = asus_hotk_resume,
 };
 
 static int asus_wmi_probe(struct platform_device *pdev)