diff options
-rw-r--r-- | drivers/base/power/domain.c | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 93298b7db408..da1c99178943 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
@@ -1450,8 +1450,8 @@ static void genpd_free_dev_data(struct device *dev, | |||
1450 | dev_pm_put_subsys_data(dev); | 1450 | dev_pm_put_subsys_data(dev); |
1451 | } | 1451 | } |
1452 | 1452 | ||
1453 | static void __genpd_update_cpumask(struct generic_pm_domain *genpd, | 1453 | static void genpd_update_cpumask(struct generic_pm_domain *genpd, |
1454 | int cpu, bool set, unsigned int depth) | 1454 | int cpu, bool set, unsigned int depth) |
1455 | { | 1455 | { |
1456 | struct gpd_link *link; | 1456 | struct gpd_link *link; |
1457 | 1457 | ||
@@ -1462,7 +1462,7 @@ static void __genpd_update_cpumask(struct generic_pm_domain *genpd, | |||
1462 | struct generic_pm_domain *master = link->master; | 1462 | struct generic_pm_domain *master = link->master; |
1463 | 1463 | ||
1464 | genpd_lock_nested(master, depth + 1); | 1464 | genpd_lock_nested(master, depth + 1); |
1465 | __genpd_update_cpumask(master, cpu, set, depth + 1); | 1465 | genpd_update_cpumask(master, cpu, set, depth + 1); |
1466 | genpd_unlock(master); | 1466 | genpd_unlock(master); |
1467 | } | 1467 | } |
1468 | 1468 | ||
@@ -1472,38 +1472,37 @@ static void __genpd_update_cpumask(struct generic_pm_domain *genpd, | |||
1472 | cpumask_clear_cpu(cpu, genpd->cpus); | 1472 | cpumask_clear_cpu(cpu, genpd->cpus); |
1473 | } | 1473 | } |
1474 | 1474 | ||
1475 | static void genpd_update_cpumask(struct generic_pm_domain *genpd, | 1475 | static void genpd_set_cpumask(struct generic_pm_domain *genpd, int cpu) |
1476 | struct device *dev, bool set) | 1476 | { |
1477 | if (cpu >= 0) | ||
1478 | genpd_update_cpumask(genpd, cpu, true, 0); | ||
1479 | } | ||
1480 | |||
1481 | static void genpd_clear_cpumask(struct generic_pm_domain *genpd, int cpu) | ||
1482 | { | ||
1483 | if (cpu >= 0) | ||
1484 | genpd_update_cpumask(genpd, cpu, false, 0); | ||
1485 | } | ||
1486 | |||
1487 | static int genpd_get_cpu(struct generic_pm_domain *genpd, struct device *dev) | ||
1477 | { | 1488 | { |
1478 | int cpu; | 1489 | int cpu; |
1479 | 1490 | ||
1480 | if (!genpd_is_cpu_domain(genpd)) | 1491 | if (!genpd_is_cpu_domain(genpd)) |
1481 | return; | 1492 | return -1; |
1482 | 1493 | ||
1483 | for_each_possible_cpu(cpu) { | 1494 | for_each_possible_cpu(cpu) { |
1484 | if (get_cpu_device(cpu) == dev) { | 1495 | if (get_cpu_device(cpu) == dev) |
1485 | __genpd_update_cpumask(genpd, cpu, set, 0); | 1496 | return cpu; |
1486 | return; | ||
1487 | } | ||
1488 | } | 1497 | } |
1489 | } | ||
1490 | 1498 | ||
1491 | static void genpd_set_cpumask(struct generic_pm_domain *genpd, | 1499 | return -1; |
1492 | struct device *dev) | ||
1493 | { | ||
1494 | genpd_update_cpumask(genpd, dev, true); | ||
1495 | } | ||
1496 | |||
1497 | static void genpd_clear_cpumask(struct generic_pm_domain *genpd, | ||
1498 | struct device *dev) | ||
1499 | { | ||
1500 | genpd_update_cpumask(genpd, dev, false); | ||
1501 | } | 1500 | } |
1502 | 1501 | ||
1503 | 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) |
1504 | { | 1503 | { |
1505 | struct generic_pm_domain_data *gpd_data; | 1504 | struct generic_pm_domain_data *gpd_data; |
1506 | int ret; | 1505 | int ret, cpu; |
1507 | 1506 | ||
1508 | dev_dbg(dev, "%s()\n", __func__); | 1507 | dev_dbg(dev, "%s()\n", __func__); |
1509 | 1508 | ||
@@ -1514,13 +1513,15 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) | |||
1514 | if (IS_ERR(gpd_data)) | 1513 | if (IS_ERR(gpd_data)) |
1515 | return PTR_ERR(gpd_data); | 1514 | return PTR_ERR(gpd_data); |
1516 | 1515 | ||
1516 | cpu = genpd_get_cpu(genpd, dev); | ||
1517 | |||
1517 | ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; | 1518 | ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; |
1518 | if (ret) | 1519 | if (ret) |
1519 | goto out; | 1520 | goto out; |
1520 | 1521 | ||
1521 | genpd_lock(genpd); | 1522 | genpd_lock(genpd); |
1522 | 1523 | ||
1523 | genpd_set_cpumask(genpd, dev); | 1524 | genpd_set_cpumask(genpd, cpu); |
1524 | dev_pm_domain_set(dev, &genpd->domain); | 1525 | dev_pm_domain_set(dev, &genpd->domain); |
1525 | 1526 | ||
1526 | genpd->device_count++; | 1527 | genpd->device_count++; |
@@ -1560,13 +1561,14 @@ static int genpd_remove_device(struct generic_pm_domain *genpd, | |||
1560 | { | 1561 | { |
1561 | struct generic_pm_domain_data *gpd_data; | 1562 | struct generic_pm_domain_data *gpd_data; |
1562 | struct pm_domain_data *pdd; | 1563 | struct pm_domain_data *pdd; |
1563 | int ret = 0; | 1564 | int cpu, ret = 0; |
1564 | 1565 | ||
1565 | dev_dbg(dev, "%s()\n", __func__); | 1566 | dev_dbg(dev, "%s()\n", __func__); |
1566 | 1567 | ||
1567 | pdd = dev->power.subsys_data->domain_data; | 1568 | pdd = dev->power.subsys_data->domain_data; |
1568 | gpd_data = to_gpd_data(pdd); | 1569 | gpd_data = to_gpd_data(pdd); |
1569 | dev_pm_qos_remove_notifier(dev, &gpd_data->nb); | 1570 | dev_pm_qos_remove_notifier(dev, &gpd_data->nb); |
1571 | cpu = genpd_get_cpu(genpd, dev); | ||
1570 | 1572 | ||
1571 | genpd_lock(genpd); | 1573 | genpd_lock(genpd); |
1572 | 1574 | ||
@@ -1578,7 +1580,7 @@ static int genpd_remove_device(struct generic_pm_domain *genpd, | |||
1578 | genpd->device_count--; | 1580 | genpd->device_count--; |
1579 | genpd->max_off_time_changed = true; | 1581 | genpd->max_off_time_changed = true; |
1580 | 1582 | ||
1581 | genpd_clear_cpumask(genpd, dev); | 1583 | genpd_clear_cpumask(genpd, cpu); |
1582 | dev_pm_domain_set(dev, NULL); | 1584 | dev_pm_domain_set(dev, NULL); |
1583 | 1585 | ||
1584 | list_del_init(&pdd->list_node); | 1586 | list_del_init(&pdd->list_node); |