2525
2626static int panthor_clk_init (struct panthor_device * ptdev )
2727{
28- ptdev -> clks .core = devm_clk_get (ptdev -> base .dev , NULL );
28+ ptdev -> clks .core = devm_clk_get (ptdev -> base .dev , "gpu_clk_core" );
2929 if (IS_ERR (ptdev -> clks .core ))
3030 return dev_err_probe (ptdev -> base .dev ,
3131 PTR_ERR (ptdev -> clks .core ),
3232 "get 'core' clock failed" );
3333
34- ptdev -> clks .stacks = devm_clk_get_optional (ptdev -> base .dev , "gpu_clk_stacks" );
34+ ptdev -> clks .stacks = devm_clk_get (ptdev -> base .dev , "gpu_clk_stacks" );
3535 if (IS_ERR (ptdev -> clks .stacks ))
3636 return dev_err_probe (ptdev -> base .dev ,
3737 PTR_ERR (ptdev -> clks .stacks ),
3838 "get 'stacks' clock failed" );
3939
40- ptdev -> clks .coregroup = devm_clk_get_optional (ptdev -> base .dev , "coregroup" );
41- if (IS_ERR (ptdev -> clks .coregroup ))
40+ /* CIX SKY1 needs additional backup clocks */
41+ ptdev -> clks .backup [0 ] = devm_clk_get_optional (ptdev -> base .dev , "gpu_clk_200M" );
42+ if (IS_ERR (ptdev -> clks .backup [0 ]))
4243 return dev_err_probe (ptdev -> base .dev ,
43- PTR_ERR (ptdev -> clks .coregroup ),
44- "get 'coregroup ' clock failed" );
44+ PTR_ERR (ptdev -> clks .backup [ 0 ] ),
45+ "get 'gpu_clk_200M ' clock failed" );
4546
46- /* CIX SKY1 needs additional backup clocks */
47- if (of_device_is_compatible (ptdev -> base .dev -> of_node , "arm,mali-valhall" )) {
48- ptdev -> clks .backup [0 ] = devm_clk_get_optional (ptdev -> base .dev , "gpu_clk_200M" );
49- if (IS_ERR (ptdev -> clks .backup [0 ]))
50- return dev_err_probe (ptdev -> base .dev ,
51- PTR_ERR (ptdev -> clks .backup [0 ]),
52- "get 'gpu_clk_200M' clock failed" );
53-
54- ptdev -> clks .backup [1 ] = devm_clk_get_optional (ptdev -> base .dev , "gpu_clk_400M" );
55- if (IS_ERR (ptdev -> clks .backup [1 ]))
56- return dev_err_probe (ptdev -> base .dev ,
57- PTR_ERR (ptdev -> clks .backup [1 ]),
58- "get 'gpu_clk_400M' clock failed" );
59- }
47+ ptdev -> clks .backup [1 ] = devm_clk_get_optional (ptdev -> base .dev , "gpu_clk_400M" );
48+ if (IS_ERR (ptdev -> clks .backup [1 ]))
49+ return dev_err_probe (ptdev -> base .dev ,
50+ PTR_ERR (ptdev -> clks .backup [1 ]),
51+ "get 'gpu_clk_400M' clock failed" );
6052
6153 drm_info (& ptdev -> base , "clock rate = %lu\n" , clk_get_rate (ptdev -> clks .core ));
6254 return 0 ;
@@ -68,7 +60,7 @@ static void panthor_pm_domain_fini(struct panthor_device *ptdev)
6860
6961 for (i = 0 ; i < ARRAY_SIZE (ptdev -> pm_domain_devs ); i ++ ) {
7062 if (!ptdev -> pm_domain_devs [i ])
71- break ;
63+ continue ;
7264
7365 if (ptdev -> pm_domain_links [i ])
7466 device_link_del (ptdev -> pm_domain_links [i ]);
@@ -82,39 +74,78 @@ static int panthor_pm_domain_init(struct panthor_device *ptdev)
8274 int err ;
8375 int i , num_domains ;
8476
85- num_domains = of_count_phandle_with_args (ptdev -> base .dev -> of_node ,
86- "power-domains" ,
87- "#power-domain-cells" );
77+ if (!has_acpi_companion (ptdev -> base .dev )) {
78+ num_domains = of_count_phandle_with_args (ptdev -> base .dev -> of_node ,
79+ "power-domains" ,
80+ "#power-domain-cells" );
8881
89- /*
90- * Single domain is handled by the core, and, if only a single power
91- * the power domain is requested, the property is optional.
92- */
93- if (num_domains < 2 )
94- return 0 ;
95-
96- if (WARN (num_domains > ARRAY_SIZE (ptdev -> pm_domain_devs ),
97- "Too many supplies in compatible structure.\n" ))
98- return - EINVAL ;
82+ /*
83+ * Single domain is handled by the core, and, if only a single power
84+ * the power domain is requested, the property is optional.
85+ */
86+ if (num_domains < 2 )
87+ return 0 ;
88+
89+ if (WARN (num_domains > ARRAY_SIZE (ptdev -> pm_domain_devs ),
90+ "Too many supplies in compatible structure.\n" ))
91+ return - EINVAL ;
9992
100- for (i = 0 ; i < num_domains ; i ++ ) {
101- ptdev -> pm_domain_devs [i ] =
102- dev_pm_domain_attach_by_id (ptdev -> base .dev , i );
103- if (IS_ERR_OR_NULL (ptdev -> pm_domain_devs [i ])) {
104- err = PTR_ERR (ptdev -> pm_domain_devs [i ]) ? : - ENODATA ;
105- ptdev -> pm_domain_devs [i ] = NULL ;
93+ for (i = 0 ; i < num_domains ; i ++ ) {
94+ ptdev -> pm_domain_devs [i ] =
95+ dev_pm_domain_attach_by_id (ptdev -> base .dev , i );
96+ if (IS_ERR_OR_NULL (ptdev -> pm_domain_devs [i ])) {
97+ err = PTR_ERR (ptdev -> pm_domain_devs [i ]) ? : - ENODATA ;
98+ ptdev -> pm_domain_devs [i ] = NULL ;
99+ dev_err (ptdev -> base .dev ,
100+ "failed to get pm-domain %d: %d\n" ,
101+ i , err );
102+ goto err ;
103+ }
104+
105+ ptdev -> pm_domain_links [i ] = device_link_add (ptdev -> base .dev ,
106+ ptdev -> pm_domain_devs [i ], DL_FLAG_PM_RUNTIME |
107+ DL_FLAG_STATELESS | DL_FLAG_RPM_ACTIVE );
108+ if (!ptdev -> pm_domain_links [i ]) {
109+ dev_err (ptdev -> pm_domain_devs [i ],
110+ "adding device link failed!\n" );
111+ err = - ENODEV ;
112+ goto err ;
113+ }
114+ }
115+ } else {
116+ ptdev -> pm_domain_devs [1 ]= fwnode_dev_pm_domain_attach_by_name (ptdev -> base .dev , "perf" );
117+ if (IS_ERR_OR_NULL (ptdev -> pm_domain_devs [1 ])) {
118+ err = PTR_ERR (ptdev -> pm_domain_devs [1 ]) ? : - ENODATA ;
119+ ptdev -> pm_domain_devs [1 ] = NULL ;
106120 dev_err (ptdev -> base .dev ,
107- "failed to get pm-domain %d: %d\n" ,
108- i , err );
121+ "failed to get acpi perf domain %d\n" , err );
109122 goto err ;
110123 }
111124
112- ptdev -> pm_domain_links [i ] = device_link_add (ptdev -> base .dev ,
113- ptdev -> pm_domain_devs [i ], DL_FLAG_PM_RUNTIME |
114- DL_FLAG_STATELESS | DL_FLAG_RPM_ACTIVE );
115- if (!ptdev -> pm_domain_links [i ]) {
116- dev_err (ptdev -> pm_domain_devs [i ],
117- "adding device link failed!\n" );
125+ ptdev -> pm_domain_links [1 ] = device_link_add (ptdev -> base .dev ,
126+ ptdev -> pm_domain_devs [1 ], DL_FLAG_PM_RUNTIME |
127+ DL_FLAG_STATELESS | DL_FLAG_RPM_ACTIVE );
128+ if (!ptdev -> pm_domain_links [1 ]) {
129+ dev_err (ptdev -> base .dev , "Failed to add device_link to gpu perf domain.\n" );
130+ err = - ENODEV ;
131+ goto err ;
132+ }
133+
134+ struct fwnode_handle * fwnode = fwnode_find_reference (ptdev -> base .dev -> fwnode , "power-supply" , 0 );
135+ if (IS_ERR_OR_NULL (fwnode )) {
136+ dev_warn (ptdev -> base .dev , "Failed to get power-supply property, using single power domain.\n" );
137+ return 0 ;
138+ }
139+ ptdev -> pm_domain_devs [0 ] = bus_find_device_by_fwnode (& platform_bus_type , fwnode );
140+ pm_runtime_enable (ptdev -> pm_domain_devs [0 ]);
141+ dev_pm_domain_attach (ptdev -> pm_domain_devs [0 ], true);
142+ fwnode_handle_put (fwnode );
143+
144+ ptdev -> pm_domain_links [0 ] = device_link_add (ptdev -> base .dev ,
145+ ptdev -> pm_domain_devs [0 ], DL_FLAG_PM_RUNTIME |
146+ DL_FLAG_STATELESS | DL_FLAG_RPM_ACTIVE );
147+ if (!ptdev -> pm_domain_links [0 ]) {
148+ dev_err (ptdev -> base .dev , "Failed to add device_link to gpu power domain.\n" );
118149 err = - ENODEV ;
119150 goto err ;
120151 }
@@ -567,9 +598,7 @@ int panthor_device_resume(struct device *dev)
567598 reset_control_deassert (ptdev -> gpu_reset );
568599
569600 /* CIX SKY1 have custom devfreq, let's force max for now (XXX: devfreq) */
570- if (of_device_is_compatible (ptdev -> base .dev -> of_node , "arm,mali-valhall" )) {
571- dev_pm_genpd_set_performance_state (ptdev -> pm_domain_devs [1 ], 1000 );
572- }
601+ dev_pm_genpd_set_performance_state (ptdev -> pm_domain_devs [1 ], 1000 );
573602
574603 ret = panthor_devfreq_resume (ptdev );
575604 if (ret )
0 commit comments