* [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20
@ 2018-10-12 10:12 Hans de Goede
2018-10-12 10:12 ` [PATCH 1/6] ACPI / PM: Export acpi_device_get_power() for use by modular build drivers Hans de Goede
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
Hi Thierry,
I've 3 different pwm-lpss patch-sets outstanding, 2 of which have seen
multiple revisions.
For your convenience here is a series which collects the latest version
of them all including all the acks and reviews they have received.
This series superceeds / replaces all my other outstanding pwm patches.
The first patch is an ACPI patch, which is a dependency for the fourth
patch in the series. This has an Acked-by from Rafael, indicating that
he is ok with merging this simple one-line patch through your PWM tree.
Regards,
Hans
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/6] ACPI / PM: Export acpi_device_get_power() for use by modular build drivers
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:12 ` [PATCH 2/6] pwm: lpss: Add ACPI HID for second PWM controller on Cherry Trail devices Hans de Goede
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
Export acpi_device_get_power() for use by modular build drivers.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v4:
-New patch in v4 of this patch-set
---
drivers/acpi/device_pm.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index a7c2673ffd36..824ae985ad93 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -126,6 +126,7 @@ int acpi_device_get_power(struct acpi_device *device, int *state)
return 0;
}
+EXPORT_SYMBOL(acpi_device_get_power);
static int acpi_dev_pm_explicit_set(struct acpi_device *adev, int state)
{
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/6] pwm: lpss: Add ACPI HID for second PWM controller on Cherry Trail devices
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
2018-10-12 10:12 ` [PATCH 1/6] ACPI / PM: Export acpi_device_get_power() for use by modular build drivers Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:12 ` [PATCH 3/6] pwm: lpss: Move struct pwm_lpss_chip definition to the header file Hans de Goede
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
The second PWM controller on Cherry Trail devices uses a separate ACPI
HID: "80862289", add this so that the driver will properly bind to the
second PWM controller.
The second PWM controller is usually not used, the main thing gained by
this is properly putting the PWM controller in D3 on suspend.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/pwm/pwm-lpss-platform.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/pwm/pwm-lpss-platform.c b/drivers/pwm/pwm-lpss-platform.c
index 5561b9e190f8..7304f36ee715 100644
--- a/drivers/pwm/pwm-lpss-platform.c
+++ b/drivers/pwm/pwm-lpss-platform.c
@@ -81,6 +81,7 @@ static SIMPLE_DEV_PM_OPS(pwm_lpss_platform_pm_ops,
static const struct acpi_device_id pwm_lpss_acpi_match[] = {
{ "80860F09", (unsigned long)&pwm_lpss_byt_info },
{ "80862288", (unsigned long)&pwm_lpss_bsw_info },
+ { "80862289", (unsigned long)&pwm_lpss_bsw_info },
{ "80865AC8", (unsigned long)&pwm_lpss_bxt_info },
{ },
};
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/6] pwm: lpss: Move struct pwm_lpss_chip definition to the header file
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
2018-10-12 10:12 ` [PATCH 1/6] ACPI / PM: Export acpi_device_get_power() for use by modular build drivers Hans de Goede
2018-10-12 10:12 ` [PATCH 2/6] pwm: lpss: Add ACPI HID for second PWM controller on Cherry Trail devices Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:12 ` [PATCH 4/6] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices Hans de Goede
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
Move struct pwm_lpss_chip definition from pwm-lpss.c to pwm-lpss.h,
so that the pci/platform drivers can access the info member
(struct pwm_lpss_boardinfo *).
This is a preparation patch for adding platform specific quirks, which
the drivers need access to, to pwm_lpss_boardinfo.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v4:
-No changes in v4 of this patch-set
Changes in v3:
-There was no v3, but I accidentally put v3 in the Subject of the v2
patches, so lets skip v3
Changes in v2:
-No changes in v2 of this patch-set
---
drivers/pwm/pwm-lpss.c | 9 ---------
drivers/pwm/pwm-lpss.h | 9 ++++++++-
2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c
index 4721a264bac2..e602835fd6de 100644
--- a/drivers/pwm/pwm-lpss.c
+++ b/drivers/pwm/pwm-lpss.c
@@ -32,15 +32,6 @@
/* Size of each PWM register space if multiple */
#define PWM_SIZE 0x400
-#define MAX_PWMS 4
-
-struct pwm_lpss_chip {
- struct pwm_chip chip;
- void __iomem *regs;
- const struct pwm_lpss_boardinfo *info;
- u32 saved_ctrl[MAX_PWMS];
-};
-
static inline struct pwm_lpss_chip *to_lpwm(struct pwm_chip *chip)
{
return container_of(chip, struct pwm_lpss_chip, chip);
diff --git a/drivers/pwm/pwm-lpss.h b/drivers/pwm/pwm-lpss.h
index 7a4238ad1fcb..8f029ed263af 100644
--- a/drivers/pwm/pwm-lpss.h
+++ b/drivers/pwm/pwm-lpss.h
@@ -16,7 +16,14 @@
#include <linux/device.h>
#include <linux/pwm.h>
-struct pwm_lpss_chip;
+#define MAX_PWMS 4
+
+struct pwm_lpss_chip {
+ struct pwm_chip chip;
+ void __iomem *regs;
+ const struct pwm_lpss_boardinfo *info;
+ u32 saved_ctrl[MAX_PWMS];
+};
struct pwm_lpss_boardinfo {
unsigned long clk_rate;
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/6] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
` (2 preceding siblings ...)
2018-10-12 10:12 ` [PATCH 3/6] pwm: lpss: Move struct pwm_lpss_chip definition to the header file Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:12 ` [PATCH 5/6] pwm: lpss: Release runtime-pm reference from the driver's remove callback Hans de Goede
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
The _PS0 method for the integrated graphics on some Cherry Trail devices
(observed on a HP Pavilion X2 10-p0XX) turns on the PWM chip (puts it in
D0), causing an inconsistency between the state the pm-core thinks it is
in (left runtime suspended as it was before the suspend/resume) and the
state it actually is in.
Interestingly enough this is done on a device where the pwm controller is
not used for the backlight at all, since it uses an eDP panel. On devices
where the PWM is used this is not a problem since we will resume it
ourselves anyways.
This inconsistency causes us to never suspend the pwm controller again,
which causes the device to not be able to reach S0ix states when suspended.
This commit adds a resume-complete handler, which when we think the device
is still run-time suspended checks the actual power-state and if necessary
updates the rpm-core's internal state.
This fixes the Pavilion X2 10-p0XX not reaching S0ix states when suspended.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v4:
-Use acpi_device_get_power() instead of manually calling _PSC
Changes in v3:
-There was no v3, but I accidentally put v3 in the Subject of the v2
patches, so lets skip v3
Changes in v2:
-Do the pm_runtime_en/disable before/after checking the power-state
---
drivers/pwm/pwm-lpss-platform.c | 25 ++++++++++++++++++++++---
drivers/pwm/pwm-lpss.h | 2 ++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/drivers/pwm/pwm-lpss-platform.c b/drivers/pwm/pwm-lpss-platform.c
index 7304f36ee715..b6edf8af26cc 100644
--- a/drivers/pwm/pwm-lpss-platform.c
+++ b/drivers/pwm/pwm-lpss-platform.c
@@ -30,6 +30,7 @@ static const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = {
.clk_rate = 19200000,
.npwm = 1,
.base_unit_bits = 16,
+ .check_power_on_resume = true,
};
/* Broxton */
@@ -74,9 +75,27 @@ static int pwm_lpss_remove_platform(struct platform_device *pdev)
return pwm_lpss_remove(lpwm);
}
-static SIMPLE_DEV_PM_OPS(pwm_lpss_platform_pm_ops,
- pwm_lpss_suspend,
- pwm_lpss_resume);
+static void pwm_lpss_complete(struct device *dev)
+{
+ struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev);
+ int ret, state;
+
+ /* 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) {
+ pm_runtime_disable(dev);
+
+ ret = acpi_device_get_power(ACPI_COMPANION(dev), &state);
+ if (ret == 0 && state == ACPI_STATE_D0)
+ pm_runtime_set_active(dev);
+
+ pm_runtime_enable(dev);
+ }
+}
+
+static const struct dev_pm_ops pwm_lpss_platform_pm_ops = {
+ .complete = pwm_lpss_complete,
+ SET_SYSTEM_SLEEP_PM_OPS(pwm_lpss_suspend, pwm_lpss_resume)
+};
static const struct acpi_device_id pwm_lpss_acpi_match[] = {
{ "80860F09", (unsigned long)&pwm_lpss_byt_info },
diff --git a/drivers/pwm/pwm-lpss.h b/drivers/pwm/pwm-lpss.h
index 8f029ed263af..1a2575d25bea 100644
--- a/drivers/pwm/pwm-lpss.h
+++ b/drivers/pwm/pwm-lpss.h
@@ -30,6 +30,8 @@ struct pwm_lpss_boardinfo {
unsigned int npwm;
unsigned long base_unit_bits;
bool bypass;
+ /* Some devices have AML code messing with the state underneath us */
+ bool check_power_on_resume;
};
struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r,
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/6] pwm: lpss: Release runtime-pm reference from the driver's remove callback
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
` (3 preceding siblings ...)
2018-10-12 10:12 ` [PATCH 4/6] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:12 ` [PATCH 6/6] pwm: lpss: Add get_state callback Hans de Goede
2018-10-12 10:33 ` [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Thierry Reding
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
For each pwm output which gets enabled through pwm_lpss_apply(), we do a
pm_runtime_get_sync().
This commit adds pm_runtime_put() calls to pwm_lpss_remove() to balance
these when the driver gets removed with some of the outputs still enabled.
Fixes: f080be27d7d9 ("pwm: lpss: Add support for runtime PM")
Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
-New patch in v2 of this patch-set replacing "pwm: lpss: Add
pwm_lpss_get_put_runtime_pm helper function"
---
drivers/pwm/pwm-lpss.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c
index e602835fd6de..723ca9de8325 100644
--- a/drivers/pwm/pwm-lpss.c
+++ b/drivers/pwm/pwm-lpss.c
@@ -205,6 +205,12 @@ EXPORT_SYMBOL_GPL(pwm_lpss_probe);
int pwm_lpss_remove(struct pwm_lpss_chip *lpwm)
{
+ int i;
+
+ for (i = 0; i < lpwm->info->npwm; i++) {
+ if (pwm_is_enabled(&lpwm->chip.pwms[i]))
+ pm_runtime_put(lpwm->chip.dev);
+ }
return pwmchip_remove(&lpwm->chip);
}
EXPORT_SYMBOL_GPL(pwm_lpss_remove);
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/6] pwm: lpss: Add get_state callback
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
` (4 preceding siblings ...)
2018-10-12 10:12 ` [PATCH 5/6] pwm: lpss: Release runtime-pm reference from the driver's remove callback Hans de Goede
@ 2018-10-12 10:12 ` Hans de Goede
2018-10-12 10:33 ` [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Thierry Reding
6 siblings, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2018-10-12 10:12 UTC (permalink / raw)
To: Thierry Reding, Andy Shevchenko, Rafael J . Wysocki
Cc: Hans de Goede, linux-pwm, linux-acpi
Add a get_state callback so that the initial state correctly reflects
the actual hardware state.
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
-Stop using the dropped pwm_lpss_get_put_runtime_pm() helper
---
drivers/pwm/pwm-lpss.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c
index 723ca9de8325..ea93ef9f3672 100644
--- a/drivers/pwm/pwm-lpss.c
+++ b/drivers/pwm/pwm-lpss.c
@@ -159,8 +159,42 @@ static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm,
return 0;
}
+/* This function gets called once from pwmchip_add to get the initial state */
+static void pwm_lpss_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
+ struct pwm_state *state)
+{
+ struct pwm_lpss_chip *lpwm = to_lpwm(chip);
+ unsigned long base_unit_range;
+ unsigned long long base_unit, freq, on_time_div;
+ u32 ctrl;
+
+ base_unit_range = BIT(lpwm->info->base_unit_bits);
+
+ ctrl = pwm_lpss_read(pwm);
+ on_time_div = 255 - (ctrl & PWM_ON_TIME_DIV_MASK);
+ base_unit = (ctrl >> PWM_BASE_UNIT_SHIFT) & (base_unit_range - 1);
+
+ freq = base_unit * lpwm->info->clk_rate;
+ do_div(freq, base_unit_range);
+ if (freq == 0)
+ state->period = NSEC_PER_SEC;
+ else
+ state->period = NSEC_PER_SEC / (unsigned long)freq;
+
+ on_time_div *= state->period;
+ do_div(on_time_div, 255);
+ state->duty_cycle = on_time_div;
+
+ state->polarity = PWM_POLARITY_NORMAL;
+ state->enabled = !!(ctrl & PWM_ENABLE);
+
+ if (state->enabled)
+ pm_runtime_get(chip->dev);
+}
+
static const struct pwm_ops pwm_lpss_ops = {
.apply = pwm_lpss_apply,
+ .get_state = pwm_lpss_get_state,
.owner = THIS_MODULE,
};
--
2.19.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
` (5 preceding siblings ...)
2018-10-12 10:12 ` [PATCH 6/6] pwm: lpss: Add get_state callback Hans de Goede
@ 2018-10-12 10:33 ` Thierry Reding
6 siblings, 0 replies; 8+ messages in thread
From: Thierry Reding @ 2018-10-12 10:33 UTC (permalink / raw)
To: Hans de Goede; +Cc: Andy Shevchenko, Rafael J . Wysocki, linux-pwm, linux-acpi
[-- Attachment #1: Type: text/plain, Size: 670 bytes --]
On Fri, Oct 12, 2018 at 12:12:23PM +0200, Hans de Goede wrote:
> Hi Thierry,
>
> I've 3 different pwm-lpss patch-sets outstanding, 2 of which have seen
> multiple revisions.
>
> For your convenience here is a series which collects the latest version
> of them all including all the acks and reviews they have received.
>
> This series superceeds / replaces all my other outstanding pwm patches.
>
> The first patch is an ACPI patch, which is a dependency for the fourth
> patch in the series. This has an Acked-by from Rafael, indicating that
> he is ok with merging this simple one-line patch through your PWM tree.
All applied, thanks.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-10-12 10:33 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-12 10:12 [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Hans de Goede
2018-10-12 10:12 ` [PATCH 1/6] ACPI / PM: Export acpi_device_get_power() for use by modular build drivers Hans de Goede
2018-10-12 10:12 ` [PATCH 2/6] pwm: lpss: Add ACPI HID for second PWM controller on Cherry Trail devices Hans de Goede
2018-10-12 10:12 ` [PATCH 3/6] pwm: lpss: Move struct pwm_lpss_chip definition to the header file Hans de Goede
2018-10-12 10:12 ` [PATCH 4/6] pwm: lpss: Check PWM powerstate after resume on Cherry Trail devices Hans de Goede
2018-10-12 10:12 ` [PATCH 5/6] pwm: lpss: Release runtime-pm reference from the driver's remove callback Hans de Goede
2018-10-12 10:12 ` [PATCH 6/6] pwm: lpss: Add get_state callback Hans de Goede
2018-10-12 10:33 ` [PATCH 0/6] pwm: Collected LPSS-pwm patches for 4.20 Thierry Reding
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).