diff options
| -rw-r--r-- | drivers/base/power/domain.c | 20 | ||||
| -rw-r--r-- | include/linux/pm_domain.h | 1 |
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 | ||
| 1502 | static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) | 1502 | static 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 | ||
| 2261 | out: | 2261 | out: |
| 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 | }; |
