All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans de Goede <hdegoede@redhat.com>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	linux-pwm@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: Re: [PATCH 2/2] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices
Date: Sat, 6 Oct 2018 10:55:41 +0200	[thread overview]
Message-ID: <db4f6771-9ce3-9793-a2e4-b317909cd06b@redhat.com> (raw)
In-Reply-To: <2073706.oZqG2eVWq3@aspire.rjw.lan>

Hi,

On 03-10-18 11:22, Rafael J. Wysocki wrote:
> On Monday, September 24, 2018 11:40:14 AM CEST Hans de Goede wrote:
>> Hi,
>>
>> On 24-09-18 11:18, Andy Shevchenko wrote:
>>> On Mon, Sep 24, 2018 at 11:10:28AM +0200, Hans de Goede wrote:
>>>
>>>>>> +	/* The PWM may be turned on by AML code, update our state to match */
>>>>>> +	if (pm_runtime_suspended(dev) && lpwm->info->check_power_on_resume) {
>>>>>
>>>>>> +		status = acpi_evaluate_integer(ACPI_HANDLE(dev), "_PSC",
>>>>>> +					       NULL, &psc);
>>>>>
>>>>> AFAIU this is a standard power source method for ACPI, shouldn't ACPI core take
>>>>> care of being in sync?
>>>>
>>>> This is not about ACPI power-resources, this is about the power state (D0 or D3)
>>>> of the device itself. The ACPI core does not expect the state of devices to
>>>> magically change underneath it when using s2idle, since then everything is
>>>> under the kernel's control. But the _PS0 method of the GPU messing with the PWM
>>>> controller (hurray for firmware) messes things up.
>>>
>>> What I mean is shouldn't we care about this on a ACPI core level to be sure
>>> that states are kept in sync on OS level?
>>
>> The ACPI / pm core does care about this when doing a firmware supported suspend/resume
>> (so going to regular S3) because the firmware can then make all sort of changes
>> to the device state.
>>
>> But with s2idle the kernel is fully in control and we never hand control over to the
>> firmware, so checking the device state then should not be necessary and is a somewhat
>> expensive operation (esp. to do on all devices), while one of the advantages of s2idle
>> is supposed to be shorter suspend/resume times.
>>
>> IOW for s2idle it is undesirable for the core to check the power-state of all
>> devices after a resume, since it simply should not have changed, with the PWM
>> device being a nasty exception because of the _PS0 method for *another* device
>> mucking with it.
>>
>> Anyways lets see what Rafael has to say about this.
> 
> It is OK to check the device power state in the driver in that case IMO,
> although I would add a comment explaining why it is needed to the code.

There already are comments:

drivers/pwm/pwm-lpss.h

         /* Some devices have AML code messing with the state underneath us */
         bool check_power_on_resume;

drivers/pwm/pwm-lpss-platform.c: pwm_lpss_complete():

         /* The PWM may be turned on by AML code, update our state to match */
         if (pm_runtime_suspended(dev) && lpwm->info->check_power_on_resume) {
                 status = acpi_evaluate_integer(ACPI_HANDLE(dev), "_PSC",
                                                NULL, &psc);
                 if (ACPI_SUCCESS(status) && psc == ACPI_STATE_D0) {
                         pm_runtime_disable(dev);
                         pm_runtime_set_active(dev);
                         pm_runtime_enable(dev);
                 }
         }
	
Or do you want the comment to go into more detail ?

> Also, why don't you use acpi_device_get_power() instead of evaluating
> _PSC directly?  It should make no difference if there are no power
> resources, should it?

2 reasons:

1) I really want to check the D3 enabled bit from the devices configs regs,
as that is what block S0ix, this is exactly what the _PSC method does

2) acpi_device_get_power() is not exported to modules

> In addition, I would disable runtime PM before checking the power state,
> then check it, set the correct runtime PM status and re-enable runtime PM.

Ok I will send a v2 with this changed.

Regards,

Hans

  reply	other threads:[~2018-10-06  8:55 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-11 17:30 [PATCH 1/2] pwm: lpss: Move struct pwm_lpss_chip definition to the header file Hans de Goede
2018-09-11 17:30 ` [PATCH 2/2] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices Hans de Goede
2018-09-24  9:02   ` Andy Shevchenko
2018-09-24  9:10     ` Hans de Goede
2018-09-24  9:18       ` Andy Shevchenko
2018-09-24  9:40         ` Hans de Goede
2018-10-03  9:22           ` Rafael J. Wysocki
2018-10-06  8:55             ` Hans de Goede [this message]
2018-10-06 14:16               ` Andy Shevchenko
2018-10-10 11:14                 ` Hans de Goede
2018-10-11 12:07                   ` Andy Shevchenko
2018-10-11 14:00                   ` Rafael J. Wysocki
2018-10-11 14:11                     ` Hans de Goede

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=db4f6771-9ce3-9793-a2e4-b317909cd06b@redhat.com \
    --to=hdegoede@redhat.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.