From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linux PM mailing list <linux-pm@lists.linux-foundation.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Linux-sh list <linux-sh@vger.kernel.org>,
Magnus Damm <magnus.damm@gmail.com>,
Kevin Hilman <khilman@ti.com>,
jean.pihet@newoldbits.com
Subject: [PATCH 1/5] PM / Domains: Split device PM domain data into base and need_restore
Date: Tue, 30 Aug 2011 22:18:43 +0000 [thread overview]
Message-ID: <201108310018.43385.rjw@sisk.pl> (raw)
In-Reply-To: <201108310017.03103.rjw@sisk.pl>
From: Rafael J. Wysocki <rjw@sisk.pl>
The struct pm_domain_data data type is defined in such a way that
adding new fields specific to the generic PM domains code will
require include/linux/pm.h to be modified. As a result, data types
used only by the generic PM domains code will be defined in two
headers, although they all should be defined in pm_domain.h and
pm.h will need to include more headers, which won't be very nice.
For this reason change the definition of struct pm_subsys_data
so that its domain_data member is a pointer, which will allow
struct pm_domain_data to be subclassed by various PM domains
implementations. Remove the need_restore member from
struct pm_domain_data and make the generic PM domains code
subclass it by adding the need_restore member to the new data type.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/base/power/domain.c | 28 +++++++++++++++++++---------
include/linux/pm.h | 3 +--
include/linux/pm_domain.h | 10 ++++++++++
3 files changed, 30 insertions(+), 11 deletions(-)
Index: linux/include/linux/pm.h
=================================--- linux.orig/include/linux/pm.h
+++ linux/include/linux/pm.h
@@ -433,7 +433,6 @@ struct wakeup_source;
struct pm_domain_data {
struct list_head list_node;
struct device *dev;
- bool need_restore;
};
struct pm_subsys_data {
@@ -443,7 +442,7 @@ struct pm_subsys_data {
struct list_head clock_list;
#endif
#ifdef CONFIG_PM_GENERIC_DOMAINS
- struct pm_domain_data domain_data;
+ struct pm_domain_data *domain_data;
#endif
};
Index: linux/include/linux/pm_domain.h
=================================--- linux.orig/include/linux/pm_domain.h
+++ linux/include/linux/pm_domain.h
@@ -62,6 +62,16 @@ struct gpd_link {
struct list_head slave_node;
};
+struct generic_pm_domain_data {
+ struct pm_domain_data base;
+ bool need_restore;
+};
+
+static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd)
+{
+ return container_of(pdd, struct generic_pm_domain_data, base);
+}
+
#ifdef CONFIG_PM_GENERIC_DOMAINS
extern int pm_genpd_add_device(struct generic_pm_domain *genpd,
struct device *dev);
Index: linux/drivers/base/power/domain.c
=================================--- linux.orig/drivers/base/power/domain.c
+++ linux/drivers/base/power/domain.c
@@ -188,11 +188,12 @@ static int __pm_genpd_save_device(struct
struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock)
{
+ struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver;
int ret = 0;
- if (pdd->need_restore)
+ if (gpd_data->need_restore)
return 0;
mutex_unlock(&genpd->lock);
@@ -210,7 +211,7 @@ static int __pm_genpd_save_device(struct
mutex_lock(&genpd->lock);
if (!ret)
- pdd->need_restore = true;
+ gpd_data->need_restore = true;
return ret;
}
@@ -224,10 +225,11 @@ static void __pm_genpd_restore_device(st
struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock)
{
+ struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver;
- if (!pdd->need_restore)
+ if (!gpd_data->need_restore)
return;
mutex_unlock(&genpd->lock);
@@ -244,7 +246,7 @@ static void __pm_genpd_restore_device(st
mutex_lock(&genpd->lock);
- pdd->need_restore = false;
+ gpd_data->need_restore = false;
}
/**
@@ -493,7 +495,7 @@ static int pm_genpd_runtime_resume(struc
mutex_lock(&genpd->lock);
}
finish_wait(&genpd->status_wait_queue, &wait);
- __pm_genpd_restore_device(&dev->power.subsys_data->domain_data, genpd);
+ __pm_genpd_restore_device(dev->power.subsys_data->domain_data, genpd);
genpd->resume_count--;
genpd_set_active(genpd);
wake_up_all(&genpd->status_wait_queue);
@@ -1080,6 +1082,7 @@ static void pm_genpd_complete(struct dev
*/
int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
{
+ struct generic_pm_domain_data *gpd_data;
struct pm_domain_data *pdd;
int ret = 0;
@@ -1106,14 +1109,20 @@ int pm_genpd_add_device(struct generic_p
goto out;
}
+ gpd_data = kzalloc(sizeof(*gpd_data), GFP_KERNEL);
+ if (!gpd_data) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
genpd->device_count++;
dev->pm_domain = &genpd->domain;
dev_pm_get_subsys_data(dev);
- pdd = &dev->power.subsys_data->domain_data;
- pdd->dev = dev;
- pdd->need_restore = false;
- list_add_tail(&pdd->list_node, &genpd->dev_list);
+ dev->power.subsys_data->domain_data = &gpd_data->base;
+ gpd_data->base.dev = dev;
+ gpd_data->need_restore = false;
+ list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
out:
genpd_release_lock(genpd);
@@ -1152,6 +1161,7 @@ int pm_genpd_remove_device(struct generi
pdd->dev = NULL;
dev_pm_put_subsys_data(dev);
dev->pm_domain = NULL;
+ kfree(to_gpd_data(pdd));
genpd->device_count--;
WARNING: multiple messages have this Message-ID (diff)
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linux PM mailing list <linux-pm@lists.linux-foundation.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
"Linux-sh list" <linux-sh@vger.kernel.org>,
Magnus Damm <magnus.damm@gmail.com>,
Kevin Hilman <khilman@ti.com>,
jean.pihet@newoldbits.com
Subject: [PATCH 1/5] PM / Domains: Split device PM domain data into base and need_restore
Date: Wed, 31 Aug 2011 00:18:43 +0200 [thread overview]
Message-ID: <201108310018.43385.rjw@sisk.pl> (raw)
In-Reply-To: <201108310017.03103.rjw@sisk.pl>
From: Rafael J. Wysocki <rjw@sisk.pl>
The struct pm_domain_data data type is defined in such a way that
adding new fields specific to the generic PM domains code will
require include/linux/pm.h to be modified. As a result, data types
used only by the generic PM domains code will be defined in two
headers, although they all should be defined in pm_domain.h and
pm.h will need to include more headers, which won't be very nice.
For this reason change the definition of struct pm_subsys_data
so that its domain_data member is a pointer, which will allow
struct pm_domain_data to be subclassed by various PM domains
implementations. Remove the need_restore member from
struct pm_domain_data and make the generic PM domains code
subclass it by adding the need_restore member to the new data type.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/base/power/domain.c | 28 +++++++++++++++++++---------
include/linux/pm.h | 3 +--
include/linux/pm_domain.h | 10 ++++++++++
3 files changed, 30 insertions(+), 11 deletions(-)
Index: linux/include/linux/pm.h
===================================================================
--- linux.orig/include/linux/pm.h
+++ linux/include/linux/pm.h
@@ -433,7 +433,6 @@ struct wakeup_source;
struct pm_domain_data {
struct list_head list_node;
struct device *dev;
- bool need_restore;
};
struct pm_subsys_data {
@@ -443,7 +442,7 @@ struct pm_subsys_data {
struct list_head clock_list;
#endif
#ifdef CONFIG_PM_GENERIC_DOMAINS
- struct pm_domain_data domain_data;
+ struct pm_domain_data *domain_data;
#endif
};
Index: linux/include/linux/pm_domain.h
===================================================================
--- linux.orig/include/linux/pm_domain.h
+++ linux/include/linux/pm_domain.h
@@ -62,6 +62,16 @@ struct gpd_link {
struct list_head slave_node;
};
+struct generic_pm_domain_data {
+ struct pm_domain_data base;
+ bool need_restore;
+};
+
+static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd)
+{
+ return container_of(pdd, struct generic_pm_domain_data, base);
+}
+
#ifdef CONFIG_PM_GENERIC_DOMAINS
extern int pm_genpd_add_device(struct generic_pm_domain *genpd,
struct device *dev);
Index: linux/drivers/base/power/domain.c
===================================================================
--- linux.orig/drivers/base/power/domain.c
+++ linux/drivers/base/power/domain.c
@@ -188,11 +188,12 @@ static int __pm_genpd_save_device(struct
struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock)
{
+ struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver;
int ret = 0;
- if (pdd->need_restore)
+ if (gpd_data->need_restore)
return 0;
mutex_unlock(&genpd->lock);
@@ -210,7 +211,7 @@ static int __pm_genpd_save_device(struct
mutex_lock(&genpd->lock);
if (!ret)
- pdd->need_restore = true;
+ gpd_data->need_restore = true;
return ret;
}
@@ -224,10 +225,11 @@ static void __pm_genpd_restore_device(st
struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock)
{
+ struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver;
- if (!pdd->need_restore)
+ if (!gpd_data->need_restore)
return;
mutex_unlock(&genpd->lock);
@@ -244,7 +246,7 @@ static void __pm_genpd_restore_device(st
mutex_lock(&genpd->lock);
- pdd->need_restore = false;
+ gpd_data->need_restore = false;
}
/**
@@ -493,7 +495,7 @@ static int pm_genpd_runtime_resume(struc
mutex_lock(&genpd->lock);
}
finish_wait(&genpd->status_wait_queue, &wait);
- __pm_genpd_restore_device(&dev->power.subsys_data->domain_data, genpd);
+ __pm_genpd_restore_device(dev->power.subsys_data->domain_data, genpd);
genpd->resume_count--;
genpd_set_active(genpd);
wake_up_all(&genpd->status_wait_queue);
@@ -1080,6 +1082,7 @@ static void pm_genpd_complete(struct dev
*/
int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
{
+ struct generic_pm_domain_data *gpd_data;
struct pm_domain_data *pdd;
int ret = 0;
@@ -1106,14 +1109,20 @@ int pm_genpd_add_device(struct generic_p
goto out;
}
+ gpd_data = kzalloc(sizeof(*gpd_data), GFP_KERNEL);
+ if (!gpd_data) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
genpd->device_count++;
dev->pm_domain = &genpd->domain;
dev_pm_get_subsys_data(dev);
- pdd = &dev->power.subsys_data->domain_data;
- pdd->dev = dev;
- pdd->need_restore = false;
- list_add_tail(&pdd->list_node, &genpd->dev_list);
+ dev->power.subsys_data->domain_data = &gpd_data->base;
+ gpd_data->base.dev = dev;
+ gpd_data->need_restore = false;
+ list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
out:
genpd_release_lock(genpd);
@@ -1152,6 +1161,7 @@ int pm_genpd_remove_device(struct generi
pdd->dev = NULL;
dev_pm_put_subsys_data(dev);
dev->pm_domain = NULL;
+ kfree(to_gpd_data(pdd));
genpd->device_count--;
next prev parent reply other threads:[~2011-08-30 22:18 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-30 22:17 [PATCH 0/5] PM: Generic PM domains and device PM QoS Rafael J. Wysocki
2011-08-30 22:17 ` Rafael J. Wysocki
2011-08-30 22:18 ` Rafael J. Wysocki [this message]
2011-08-30 22:18 ` [PATCH 1/5] PM / Domains: Split device PM domain data into base and need_restore Rafael J. Wysocki
2011-08-30 22:18 ` Rafael J. Wysocki
2011-08-30 22:20 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for power.irq_safe set Rafael J. Wysocki
2011-08-30 22:20 ` Rafael J. Wysocki
2011-08-30 22:20 ` Rafael J. Wysocki
2011-09-12 8:26 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for Ming Lei
2011-09-12 8:26 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for power.irq_safe set Ming Lei
2011-09-12 21:52 ` Rafael J. Wysocki
2011-09-12 21:52 ` Rafael J. Wysocki
[not found] ` <201109122344.02386.rjw@sisk.pl>
2011-09-13 1:22 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for Ming Lei
2011-09-13 1:22 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for power.irq_safe set Ming Lei
2011-09-13 16:06 ` Rafael J. Wysocki
2011-09-13 16:06 ` Rafael J. Wysocki
2011-09-14 1:12 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for Ming Lei
2011-09-14 1:12 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for power.irq_safe set Ming Lei
2011-09-14 20:45 ` Rafael J. Wysocki
2011-09-14 20:45 ` Rafael J. Wysocki
2011-09-15 10:55 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for Ming Lei
2011-09-15 10:55 ` [PATCH 2/5] PM / Runtime: Do not run callbacks under lock for power.irq_safe set Ming Lei
2011-08-30 22:21 ` [PATCH 3/5] PM / QoS: Add function dev_pm_qos_read_value() Rafael J. Wysocki
2011-08-30 22:21 ` Rafael J. Wysocki
2011-08-30 22:21 ` Rafael J. Wysocki
2011-09-01 15:13 ` Jean Pihet
2011-09-01 15:13 ` Jean Pihet
2011-09-01 22:07 ` Rafael J. Wysocki
2011-09-01 22:07 ` Rafael J. Wysocki
2011-09-01 22:07 ` Rafael J. Wysocki
2011-09-02 6:49 ` Jean Pihet
2011-09-02 6:49 ` Jean Pihet
2011-09-02 6:49 ` Jean Pihet
2011-09-02 23:55 ` Rafael J. Wysocki
2011-09-02 23:55 ` Rafael J. Wysocki
2011-09-03 8:02 ` Rafael J. Wysocki
2011-09-03 8:02 ` Rafael J. Wysocki
2011-09-05 7:51 ` Jean Pihet
2011-09-05 7:51 ` Jean Pihet
2011-09-05 15:30 ` Rafael J. Wysocki
2011-09-05 15:30 ` Rafael J. Wysocki
2011-09-05 15:30 ` Rafael J. Wysocki
2011-09-05 7:51 ` Jean Pihet
2011-09-03 8:02 ` Rafael J. Wysocki
2011-09-05 7:44 ` Jean Pihet
2011-09-05 7:44 ` Jean Pihet
2011-09-05 7:44 ` Jean Pihet
2011-09-02 23:55 ` Rafael J. Wysocki
2011-09-01 15:13 ` Jean Pihet
2011-08-30 22:21 ` [RFC][PATCH 4/5] PM / Domains: Add device stop governor function Rafael J. Wysocki
2011-08-30 22:21 ` Rafael J. Wysocki
2011-08-30 22:21 ` Rafael J. Wysocki
2011-08-30 22:22 ` [RFC][PATCH 5/5] PM / Domains: Add default power off " Rafael J. Wysocki
2011-08-30 22:22 ` Rafael J. Wysocki
2011-08-30 22:22 ` Rafael J. Wysocki
2011-09-01 15:17 ` Jean Pihet
2011-09-01 15:17 ` Jean Pihet
2011-09-01 22:11 ` Rafael J. Wysocki
2011-09-01 22:11 ` Rafael J. Wysocki
2011-09-01 22:11 ` Rafael J. Wysocki
2011-09-01 15:17 ` Jean Pihet
2011-09-01 15:28 ` [PATCH 0/5] PM: Generic PM domains and device PM QoS Jean Pihet
2011-09-01 15:28 ` Jean Pihet
2011-09-01 22:14 ` Rafael J. Wysocki
2011-09-01 22:14 ` Rafael J. Wysocki
2011-09-01 22:14 ` Rafael J. Wysocki
2011-09-01 15:28 ` Jean Pihet
2011-09-24 21:23 ` [PATCH 0/3] PM: Runtime PM and device PM QoS refinements Rafael J. Wysocki
2011-09-24 21:23 ` Rafael J. Wysocki
2011-09-24 21:24 ` [PATCH 1/3] PM / Domains: Split device PM domain data into base and need_restore Rafael J. Wysocki
2011-09-24 21:24 ` Rafael J. Wysocki
2011-09-24 21:25 ` [PATCH 2/3] PM / Runtime: Don't run callbacks under lock for power.irq_safe set Rafael J. Wysocki
2011-09-24 21:25 ` Rafael J. Wysocki
2011-09-25 8:24 ` [PATCH 2/3] PM / Runtime: Don't run callbacks under lock for Ming Lei
2011-09-25 8:24 ` [PATCH 2/3] PM / Runtime: Don't run callbacks under lock for power.irq_safe set Ming Lei
2011-09-26 23:59 ` Kevin Hilman
2011-09-26 23:59 ` Kevin Hilman
2011-09-27 17:16 ` Rafael J. Wysocki
2011-09-27 17:16 ` Rafael J. Wysocki
2011-09-27 19:50 ` Rafael J. Wysocki
2011-09-27 19:50 ` Rafael J. Wysocki
2011-09-29 0:17 ` Kevin Hilman
2011-09-29 0:17 ` Kevin Hilman
2011-09-24 21:26 ` [PATCH 3/3] PM / QoS: Add function dev_pm_qos_read_value() (v2) Rafael J. Wysocki
2011-09-24 21:26 ` Rafael J. Wysocki
2011-09-29 8:11 ` Jean Pihet
2011-09-29 8:11 ` Jean Pihet
2011-09-29 20:33 ` Rafael J. Wysocki
2011-09-29 20:33 ` Rafael J. Wysocki
2011-09-30 8:08 ` Jean Pihet
2011-09-30 8:08 ` Jean Pihet
2011-09-30 16:46 ` Rafael J. Wysocki
2011-09-30 16:46 ` Rafael J. Wysocki
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=201108310018.43385.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=jean.pihet@newoldbits.com \
--cc=khilman@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=linux-sh@vger.kernel.org \
--cc=magnus.damm@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.