提交 cd0ea672 编写于 作者: R Rafael J. Wysocki

PM / Domains: Split device PM domain data into base and need_restore

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: NRafael J. Wysocki <rjw@sisk.pl>
上级 0d41da2e
...@@ -188,11 +188,12 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, ...@@ -188,11 +188,12 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd,
struct generic_pm_domain *genpd) struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock) __releases(&genpd->lock) __acquires(&genpd->lock)
{ {
struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev; struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver; struct device_driver *drv = dev->driver;
int ret = 0; int ret = 0;
if (pdd->need_restore) if (gpd_data->need_restore)
return 0; return 0;
mutex_unlock(&genpd->lock); mutex_unlock(&genpd->lock);
...@@ -210,7 +211,7 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, ...@@ -210,7 +211,7 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd,
mutex_lock(&genpd->lock); mutex_lock(&genpd->lock);
if (!ret) if (!ret)
pdd->need_restore = true; gpd_data->need_restore = true;
return ret; return ret;
} }
...@@ -224,10 +225,11 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd, ...@@ -224,10 +225,11 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd,
struct generic_pm_domain *genpd) struct generic_pm_domain *genpd)
__releases(&genpd->lock) __acquires(&genpd->lock) __releases(&genpd->lock) __acquires(&genpd->lock)
{ {
struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
struct device *dev = pdd->dev; struct device *dev = pdd->dev;
struct device_driver *drv = dev->driver; struct device_driver *drv = dev->driver;
if (!pdd->need_restore) if (!gpd_data->need_restore)
return; return;
mutex_unlock(&genpd->lock); mutex_unlock(&genpd->lock);
...@@ -244,7 +246,7 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd, ...@@ -244,7 +246,7 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd,
mutex_lock(&genpd->lock); mutex_lock(&genpd->lock);
pdd->need_restore = false; gpd_data->need_restore = false;
} }
/** /**
...@@ -493,7 +495,7 @@ static int pm_genpd_runtime_resume(struct device *dev) ...@@ -493,7 +495,7 @@ static int pm_genpd_runtime_resume(struct device *dev)
mutex_lock(&genpd->lock); mutex_lock(&genpd->lock);
} }
finish_wait(&genpd->status_wait_queue, &wait); 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->resume_count--;
genpd_set_active(genpd); genpd_set_active(genpd);
wake_up_all(&genpd->status_wait_queue); wake_up_all(&genpd->status_wait_queue);
...@@ -1080,6 +1082,7 @@ static void pm_genpd_complete(struct device *dev) ...@@ -1080,6 +1082,7 @@ static void pm_genpd_complete(struct device *dev)
*/ */
int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *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; struct pm_domain_data *pdd;
int ret = 0; int ret = 0;
...@@ -1106,14 +1109,20 @@ int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) ...@@ -1106,14 +1109,20 @@ int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
goto out; goto out;
} }
gpd_data = kzalloc(sizeof(*gpd_data), GFP_KERNEL);
if (!gpd_data) {
ret = -ENOMEM;
goto out;
}
genpd->device_count++; genpd->device_count++;
dev->pm_domain = &genpd->domain; dev->pm_domain = &genpd->domain;
dev_pm_get_subsys_data(dev); dev_pm_get_subsys_data(dev);
pdd = &dev->power.subsys_data->domain_data; dev->power.subsys_data->domain_data = &gpd_data->base;
pdd->dev = dev; gpd_data->base.dev = dev;
pdd->need_restore = false; gpd_data->need_restore = false;
list_add_tail(&pdd->list_node, &genpd->dev_list); list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
out: out:
genpd_release_lock(genpd); genpd_release_lock(genpd);
...@@ -1152,6 +1161,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd, ...@@ -1152,6 +1161,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd,
pdd->dev = NULL; pdd->dev = NULL;
dev_pm_put_subsys_data(dev); dev_pm_put_subsys_data(dev);
dev->pm_domain = NULL; dev->pm_domain = NULL;
kfree(to_gpd_data(pdd));
genpd->device_count--; genpd->device_count--;
......
...@@ -424,7 +424,6 @@ struct wakeup_source; ...@@ -424,7 +424,6 @@ struct wakeup_source;
struct pm_domain_data { struct pm_domain_data {
struct list_head list_node; struct list_head list_node;
struct device *dev; struct device *dev;
bool need_restore;
}; };
struct pm_subsys_data { struct pm_subsys_data {
...@@ -434,7 +433,7 @@ struct pm_subsys_data { ...@@ -434,7 +433,7 @@ struct pm_subsys_data {
struct list_head clock_list; struct list_head clock_list;
#endif #endif
#ifdef CONFIG_PM_GENERIC_DOMAINS #ifdef CONFIG_PM_GENERIC_DOMAINS
struct pm_domain_data domain_data; struct pm_domain_data *domain_data;
#endif #endif
}; };
......
...@@ -62,6 +62,16 @@ struct gpd_link { ...@@ -62,6 +62,16 @@ struct gpd_link {
struct list_head slave_node; 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 #ifdef CONFIG_PM_GENERIC_DOMAINS
extern int pm_genpd_add_device(struct generic_pm_domain *genpd, extern int pm_genpd_add_device(struct generic_pm_domain *genpd,
struct device *dev); struct device *dev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册