aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/power/domain.c52
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
1453static void __genpd_update_cpumask(struct generic_pm_domain *genpd, 1453static 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
1475static void genpd_update_cpumask(struct generic_pm_domain *genpd, 1475static 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
1481static 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
1487static 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
1491static 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
1497static 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
1503static 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)
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);