aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/power/domain.c20
-rw-r--r--include/linux/pm_domain.h1
2 files changed, 11 insertions, 10 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index da1c99178943..3d899e8abd58 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -1499,10 +1499,11 @@ static int genpd_get_cpu(struct generic_pm_domain *genpd, struct device *dev)
1499 return -1; 1499 return -1;
1500} 1500}
1501 1501
1502static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) 1502static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
1503 struct device *base_dev)
1503{ 1504{
1504 struct generic_pm_domain_data *gpd_data; 1505 struct generic_pm_domain_data *gpd_data;
1505 int ret, cpu; 1506 int ret;
1506 1507
1507 dev_dbg(dev, "%s()\n", __func__); 1508 dev_dbg(dev, "%s()\n", __func__);
1508 1509
@@ -1513,7 +1514,7 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
1513 if (IS_ERR(gpd_data)) 1514 if (IS_ERR(gpd_data))
1514 return PTR_ERR(gpd_data); 1515 return PTR_ERR(gpd_data);
1515 1516
1516 cpu = genpd_get_cpu(genpd, dev); 1517 gpd_data->cpu = genpd_get_cpu(genpd, base_dev);
1517 1518
1518 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; 1519 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0;
1519 if (ret) 1520 if (ret)
@@ -1521,7 +1522,7 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
1521 1522
1522 genpd_lock(genpd); 1523 genpd_lock(genpd);
1523 1524
1524 genpd_set_cpumask(genpd, cpu); 1525 genpd_set_cpumask(genpd, gpd_data->cpu);
1525 dev_pm_domain_set(dev, &genpd->domain); 1526 dev_pm_domain_set(dev, &genpd->domain);
1526 1527
1527 genpd->device_count++; 1528 genpd->device_count++;
@@ -1549,7 +1550,7 @@ int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
1549 int ret; 1550 int ret;
1550 1551
1551 mutex_lock(&gpd_list_lock); 1552 mutex_lock(&gpd_list_lock);
1552 ret = genpd_add_device(genpd, dev); 1553 ret = genpd_add_device(genpd, dev, dev);
1553 mutex_unlock(&gpd_list_lock); 1554 mutex_unlock(&gpd_list_lock);
1554 1555
1555 return ret; 1556 return ret;
@@ -1561,14 +1562,13 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
1561{ 1562{
1562 struct generic_pm_domain_data *gpd_data; 1563 struct generic_pm_domain_data *gpd_data;
1563 struct pm_domain_data *pdd; 1564 struct pm_domain_data *pdd;
1564 int cpu, ret = 0; 1565 int ret = 0;
1565 1566
1566 dev_dbg(dev, "%s()\n", __func__); 1567 dev_dbg(dev, "%s()\n", __func__);
1567 1568
1568 pdd = dev->power.subsys_data->domain_data; 1569 pdd = dev->power.subsys_data->domain_data;
1569 gpd_data = to_gpd_data(pdd); 1570 gpd_data = to_gpd_data(pdd);
1570 dev_pm_qos_remove_notifier(dev, &gpd_data->nb); 1571 dev_pm_qos_remove_notifier(dev, &gpd_data->nb);
1571 cpu = genpd_get_cpu(genpd, dev);
1572 1572
1573 genpd_lock(genpd); 1573 genpd_lock(genpd);
1574 1574
@@ -1580,7 +1580,7 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
1580 genpd->device_count--; 1580 genpd->device_count--;
1581 genpd->max_off_time_changed = true; 1581 genpd->max_off_time_changed = true;
1582 1582
1583 genpd_clear_cpumask(genpd, cpu); 1583 genpd_clear_cpumask(genpd, gpd_data->cpu);
1584 dev_pm_domain_set(dev, NULL); 1584 dev_pm_domain_set(dev, NULL);
1585 1585
1586 list_del_init(&pdd->list_node); 1586 list_del_init(&pdd->list_node);
@@ -2256,7 +2256,7 @@ int of_genpd_add_device(struct of_phandle_args *genpdspec, struct device *dev)
2256 goto out; 2256 goto out;
2257 } 2257 }
2258 2258
2259 ret = genpd_add_device(genpd, dev); 2259 ret = genpd_add_device(genpd, dev, dev);
2260 2260
2261out: 2261out:
2262 mutex_unlock(&gpd_list_lock); 2262 mutex_unlock(&gpd_list_lock);
@@ -2426,7 +2426,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
2426 2426
2427 dev_dbg(dev, "adding to PM domain %s\n", pd->name); 2427 dev_dbg(dev, "adding to PM domain %s\n", pd->name);
2428 2428
2429 ret = genpd_add_device(pd, dev); 2429 ret = genpd_add_device(pd, dev, base_dev);
2430 mutex_unlock(&gpd_list_lock); 2430 mutex_unlock(&gpd_list_lock);
2431 2431
2432 if (ret < 0) { 2432 if (ret < 0) {
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index bc82e74560ee..0e8e356bed6a 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -175,6 +175,7 @@ struct generic_pm_domain_data {
175 struct pm_domain_data base; 175 struct pm_domain_data base;
176 struct gpd_timing_data td; 176 struct gpd_timing_data td;
177 struct notifier_block nb; 177 struct notifier_block nb;
178 int cpu;
178 unsigned int performance_state; 179 unsigned int performance_state;
179 void *data; 180 void *data;
180}; 181};