@@ -46,6 +46,7 @@ struct gr3d {
46
46
unsigned int nclocks ;
47
47
struct reset_control_bulk_data resets [RST_GR3D_MAX ];
48
48
unsigned int nresets ;
49
+ struct dev_pm_domain_list * pd_list ;
49
50
50
51
DECLARE_BITMAP (addr_regs , GR3D_NUM_REGS );
51
52
};
@@ -369,18 +370,12 @@ static int gr3d_power_up_legacy_domain(struct device *dev, const char *name,
369
370
return 0 ;
370
371
}
371
372
372
- static void gr3d_del_link (void * link )
373
- {
374
- device_link_del (link );
375
- }
376
-
377
373
static int gr3d_init_power (struct device * dev , struct gr3d * gr3d )
378
374
{
379
- static const char * const opp_genpd_names [] = { "3d0" , "3d1" , NULL };
380
- const u32 link_flags = DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME ;
381
- struct device * * opp_virt_devs , * pd_dev ;
382
- struct device_link * link ;
383
- unsigned int i ;
375
+ struct dev_pm_domain_attach_data pd_data = {
376
+ .pd_names = (const char * []) { "3d0" , "3d1" },
377
+ .num_pd_names = 2 ,
378
+ };
384
379
int err ;
385
380
386
381
err = of_count_phandle_with_args (dev -> of_node , "power-domains" ,
@@ -414,29 +409,10 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)
414
409
if (dev -> pm_domain )
415
410
return 0 ;
416
411
417
- err = devm_pm_opp_attach_genpd (dev , opp_genpd_names , & opp_virt_devs );
418
- if (err )
412
+ err = dev_pm_domain_attach_list (dev , & pd_data , & gr3d -> pd_list );
413
+ if (err < 0 )
419
414
return err ;
420
415
421
- for (i = 0 ; opp_genpd_names [i ]; i ++ ) {
422
- pd_dev = opp_virt_devs [i ];
423
- if (!pd_dev ) {
424
- dev_err (dev , "failed to get %s power domain\n" ,
425
- opp_genpd_names [i ]);
426
- return - EINVAL ;
427
- }
428
-
429
- link = device_link_add (dev , pd_dev , link_flags );
430
- if (!link ) {
431
- dev_err (dev , "failed to link to %s\n" , dev_name (pd_dev ));
432
- return - EINVAL ;
433
- }
434
-
435
- err = devm_add_action_or_reset (dev , gr3d_del_link , link );
436
- if (err )
437
- return err ;
438
- }
439
-
440
416
return 0 ;
441
417
}
442
418
@@ -527,20 +503,23 @@ static int gr3d_probe(struct platform_device *pdev)
527
503
528
504
err = devm_tegra_core_dev_init_opp_table_common (& pdev -> dev );
529
505
if (err )
530
- return err ;
506
+ goto err ;
531
507
532
508
err = host1x_client_register (& gr3d -> client .base );
533
509
if (err < 0 ) {
534
510
dev_err (& pdev -> dev , "failed to register host1x client: %d\n" ,
535
511
err );
536
- return err ;
512
+ goto err ;
537
513
}
538
514
539
515
/* initialize address register map */
540
516
for (i = 0 ; i < ARRAY_SIZE (gr3d_addr_regs ); i ++ )
541
517
set_bit (gr3d_addr_regs [i ], gr3d -> addr_regs );
542
518
543
519
return 0 ;
520
+ err :
521
+ dev_pm_domain_detach_list (gr3d -> pd_list );
522
+ return err ;
544
523
}
545
524
546
525
static void gr3d_remove (struct platform_device * pdev )
@@ -549,6 +528,7 @@ static void gr3d_remove(struct platform_device *pdev)
549
528
550
529
pm_runtime_disable (& pdev -> dev );
551
530
host1x_client_unregister (& gr3d -> client .base );
531
+ dev_pm_domain_detach_list (gr3d -> pd_list );
552
532
}
553
533
554
534
static int __maybe_unused gr3d_runtime_suspend (struct device * dev )
0 commit comments