@@ -393,11 +393,9 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
393
393
if (unlikely (!genpd -> set_performance_state ))
394
394
return - EINVAL ;
395
395
396
- if (unlikely (!dev -> power .subsys_data ||
397
- !dev -> power .subsys_data -> domain_data )) {
398
- WARN_ON (1 );
396
+ if (WARN_ON (!dev -> power .subsys_data ||
397
+ !dev -> power .subsys_data -> domain_data ))
399
398
return - EINVAL ;
400
- }
401
399
402
400
genpd_lock (genpd );
403
401
@@ -1398,8 +1396,7 @@ EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweron);
1398
1396
1399
1397
#endif /* CONFIG_PM_SLEEP */
1400
1398
1401
- static struct generic_pm_domain_data * genpd_alloc_dev_data (struct device * dev ,
1402
- struct gpd_timing_data * td )
1399
+ static struct generic_pm_domain_data * genpd_alloc_dev_data (struct device * dev )
1403
1400
{
1404
1401
struct generic_pm_domain_data * gpd_data ;
1405
1402
int ret ;
@@ -1414,9 +1411,6 @@ static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev,
1414
1411
goto err_put ;
1415
1412
}
1416
1413
1417
- if (td )
1418
- gpd_data -> td = * td ;
1419
-
1420
1414
gpd_data -> base .dev = dev ;
1421
1415
gpd_data -> td .constraint_changed = true;
1422
1416
gpd_data -> td .effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS ;
@@ -1456,8 +1450,8 @@ static void genpd_free_dev_data(struct device *dev,
1456
1450
dev_pm_put_subsys_data (dev );
1457
1451
}
1458
1452
1459
- static void __genpd_update_cpumask (struct generic_pm_domain * genpd ,
1460
- int cpu , bool set , unsigned int depth )
1453
+ static void genpd_update_cpumask (struct generic_pm_domain * genpd ,
1454
+ int cpu , bool set , unsigned int depth )
1461
1455
{
1462
1456
struct gpd_link * link ;
1463
1457
@@ -1468,7 +1462,7 @@ static void __genpd_update_cpumask(struct generic_pm_domain *genpd,
1468
1462
struct generic_pm_domain * master = link -> master ;
1469
1463
1470
1464
genpd_lock_nested (master , depth + 1 );
1471
- __genpd_update_cpumask (master , cpu , set , depth + 1 );
1465
+ genpd_update_cpumask (master , cpu , set , depth + 1 );
1472
1466
genpd_unlock (master );
1473
1467
}
1474
1468
@@ -1478,36 +1472,35 @@ static void __genpd_update_cpumask(struct generic_pm_domain *genpd,
1478
1472
cpumask_clear_cpu (cpu , genpd -> cpus );
1479
1473
}
1480
1474
1481
- static void genpd_update_cpumask (struct generic_pm_domain * genpd ,
1482
- struct device * dev , bool set )
1475
+ static void genpd_set_cpumask (struct generic_pm_domain * genpd , int cpu )
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 )
1483
1488
{
1484
1489
int cpu ;
1485
1490
1486
1491
if (!genpd_is_cpu_domain (genpd ))
1487
- return ;
1492
+ return -1 ;
1488
1493
1489
1494
for_each_possible_cpu (cpu ) {
1490
- if (get_cpu_device (cpu ) == dev ) {
1491
- __genpd_update_cpumask (genpd , cpu , set , 0 );
1492
- return ;
1493
- }
1495
+ if (get_cpu_device (cpu ) == dev )
1496
+ return cpu ;
1494
1497
}
1495
- }
1496
1498
1497
- static void genpd_set_cpumask (struct generic_pm_domain * genpd ,
1498
- struct device * dev )
1499
- {
1500
- genpd_update_cpumask (genpd , dev , true);
1501
- }
1502
-
1503
- static void genpd_clear_cpumask (struct generic_pm_domain * genpd ,
1504
- struct device * dev )
1505
- {
1506
- genpd_update_cpumask (genpd , dev , false);
1499
+ return -1 ;
1507
1500
}
1508
1501
1509
1502
static int genpd_add_device (struct generic_pm_domain * genpd , struct device * dev ,
1510
- struct gpd_timing_data * td )
1503
+ struct device * base_dev )
1511
1504
{
1512
1505
struct generic_pm_domain_data * gpd_data ;
1513
1506
int ret ;
@@ -1517,17 +1510,19 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
1517
1510
if (IS_ERR_OR_NULL (genpd ) || IS_ERR_OR_NULL (dev ))
1518
1511
return - EINVAL ;
1519
1512
1520
- gpd_data = genpd_alloc_dev_data (dev , td );
1513
+ gpd_data = genpd_alloc_dev_data (dev );
1521
1514
if (IS_ERR (gpd_data ))
1522
1515
return PTR_ERR (gpd_data );
1523
1516
1517
+ gpd_data -> cpu = genpd_get_cpu (genpd , base_dev );
1518
+
1524
1519
ret = genpd -> attach_dev ? genpd -> attach_dev (genpd , dev ) : 0 ;
1525
1520
if (ret )
1526
1521
goto out ;
1527
1522
1528
1523
genpd_lock (genpd );
1529
1524
1530
- genpd_set_cpumask (genpd , dev );
1525
+ genpd_set_cpumask (genpd , gpd_data -> cpu );
1531
1526
dev_pm_domain_set (dev , & genpd -> domain );
1532
1527
1533
1528
genpd -> device_count ++ ;
@@ -1555,7 +1550,7 @@ int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
1555
1550
int ret ;
1556
1551
1557
1552
mutex_lock (& gpd_list_lock );
1558
- ret = genpd_add_device (genpd , dev , NULL );
1553
+ ret = genpd_add_device (genpd , dev , dev );
1559
1554
mutex_unlock (& gpd_list_lock );
1560
1555
1561
1556
return ret ;
@@ -1585,7 +1580,7 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
1585
1580
genpd -> device_count -- ;
1586
1581
genpd -> max_off_time_changed = true;
1587
1582
1588
- genpd_clear_cpumask (genpd , dev );
1583
+ genpd_clear_cpumask (genpd , gpd_data -> cpu );
1589
1584
dev_pm_domain_set (dev , NULL );
1590
1585
1591
1586
list_del_init (& pdd -> list_node );
@@ -2261,7 +2256,7 @@ int of_genpd_add_device(struct of_phandle_args *genpdspec, struct device *dev)
2261
2256
goto out ;
2262
2257
}
2263
2258
2264
- ret = genpd_add_device (genpd , dev , NULL );
2259
+ ret = genpd_add_device (genpd , dev , dev );
2265
2260
2266
2261
out :
2267
2262
mutex_unlock (& gpd_list_lock );
@@ -2345,6 +2340,7 @@ EXPORT_SYMBOL_GPL(of_genpd_remove_last);
2345
2340
2346
2341
static void genpd_release_dev (struct device * dev )
2347
2342
{
2343
+ of_node_put (dev -> of_node );
2348
2344
kfree (dev );
2349
2345
}
2350
2346
@@ -2406,14 +2402,14 @@ static void genpd_dev_pm_sync(struct device *dev)
2406
2402
genpd_queue_power_off_work (pd );
2407
2403
}
2408
2404
2409
- static int __genpd_dev_pm_attach (struct device * dev , struct device_node * np ,
2405
+ static int __genpd_dev_pm_attach (struct device * dev , struct device * base_dev ,
2410
2406
unsigned int index , bool power_on )
2411
2407
{
2412
2408
struct of_phandle_args pd_args ;
2413
2409
struct generic_pm_domain * pd ;
2414
2410
int ret ;
2415
2411
2416
- ret = of_parse_phandle_with_args (np , "power-domains" ,
2412
+ ret = of_parse_phandle_with_args (dev -> of_node , "power-domains" ,
2417
2413
"#power-domain-cells" , index , & pd_args );
2418
2414
if (ret < 0 )
2419
2415
return ret ;
@@ -2425,12 +2421,12 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np,
2425
2421
mutex_unlock (& gpd_list_lock );
2426
2422
dev_dbg (dev , "%s() failed to find PM domain: %ld\n" ,
2427
2423
__func__ , PTR_ERR (pd ));
2428
- return driver_deferred_probe_check_state (dev );
2424
+ return driver_deferred_probe_check_state (base_dev );
2429
2425
}
2430
2426
2431
2427
dev_dbg (dev , "adding to PM domain %s\n" , pd -> name );
2432
2428
2433
- ret = genpd_add_device (pd , dev , NULL );
2429
+ ret = genpd_add_device (pd , dev , base_dev );
2434
2430
mutex_unlock (& gpd_list_lock );
2435
2431
2436
2432
if (ret < 0 ) {
@@ -2481,7 +2477,7 @@ int genpd_dev_pm_attach(struct device *dev)
2481
2477
"#power-domain-cells" ) != 1 )
2482
2478
return 0 ;
2483
2479
2484
- return __genpd_dev_pm_attach (dev , dev -> of_node , 0 , true);
2480
+ return __genpd_dev_pm_attach (dev , dev , 0 , true);
2485
2481
}
2486
2482
EXPORT_SYMBOL_GPL (genpd_dev_pm_attach );
2487
2483
@@ -2511,10 +2507,10 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev,
2511
2507
if (!dev -> of_node )
2512
2508
return NULL ;
2513
2509
2514
- /* Deal only with devices using multiple PM domains . */
2510
+ /* Verify that the index is within a valid range . */
2515
2511
num_domains = of_count_phandle_with_args (dev -> of_node , "power-domains" ,
2516
2512
"#power-domain-cells" );
2517
- if (num_domains < 2 || index >= num_domains )
2513
+ if (index >= num_domains )
2518
2514
return NULL ;
2519
2515
2520
2516
/* Allocate and register device on the genpd bus. */
@@ -2525,15 +2521,16 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev,
2525
2521
dev_set_name (virt_dev , "genpd:%u:%s" , index , dev_name (dev ));
2526
2522
virt_dev -> bus = & genpd_bus_type ;
2527
2523
virt_dev -> release = genpd_release_dev ;
2524
+ virt_dev -> of_node = of_node_get (dev -> of_node );
2528
2525
2529
2526
ret = device_register (virt_dev );
2530
2527
if (ret ) {
2531
- kfree (virt_dev );
2528
+ put_device (virt_dev );
2532
2529
return ERR_PTR (ret );
2533
2530
}
2534
2531
2535
2532
/* Try to attach the device to the PM domain at the specified index. */
2536
- ret = __genpd_dev_pm_attach (virt_dev , dev -> of_node , index , false);
2533
+ ret = __genpd_dev_pm_attach (virt_dev , dev , index , false);
2537
2534
if (ret < 1 ) {
2538
2535
device_unregister (virt_dev );
2539
2536
return ret ? ERR_PTR (ret ) : NULL ;
0 commit comments