@@ -40,10 +40,14 @@ struct qcom_cpufreq_match_data {
4040 const char * * genpd_names ;
4141};
4242
43+ struct qcom_cpufreq_drv_cpu {
44+ int opp_token ;
45+ };
46+
4347struct qcom_cpufreq_drv {
44- int * opp_tokens ;
4548 u32 versions ;
4649 const struct qcom_cpufreq_match_data * data ;
50+ struct qcom_cpufreq_drv_cpu cpus [];
4751};
4852
4953static struct platform_device * cpufreq_dt_pdev , * cpufreq_pdev ;
@@ -243,42 +247,32 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
243247 return - ENOENT ;
244248 }
245249
246- drv = kzalloc (sizeof (* drv ), GFP_KERNEL );
250+ drv = devm_kzalloc (& pdev -> dev , struct_size (drv , cpus , num_possible_cpus ()),
251+ GFP_KERNEL );
247252 if (!drv )
248253 return - ENOMEM ;
249254
250255 match = pdev -> dev .platform_data ;
251256 drv -> data = match -> data ;
252- if (!drv -> data ) {
253- ret = - ENODEV ;
254- goto free_drv ;
255- }
257+ if (!drv -> data )
258+ return - ENODEV ;
256259
257260 if (drv -> data -> get_version ) {
258261 speedbin_nvmem = of_nvmem_cell_get (np , NULL );
259- if (IS_ERR (speedbin_nvmem )) {
260- ret = dev_err_probe (cpu_dev , PTR_ERR (speedbin_nvmem ),
261- "Could not get nvmem cell\n" );
262- goto free_drv ;
263- }
262+ if (IS_ERR (speedbin_nvmem ))
263+ return dev_err_probe (cpu_dev , PTR_ERR (speedbin_nvmem ),
264+ "Could not get nvmem cell\n" );
264265
265266 ret = drv -> data -> get_version (cpu_dev ,
266267 speedbin_nvmem , & pvs_name , drv );
267268 if (ret ) {
268269 nvmem_cell_put (speedbin_nvmem );
269- goto free_drv ;
270+ return ret ;
270271 }
271272 nvmem_cell_put (speedbin_nvmem );
272273 }
273274 of_node_put (np );
274275
275- drv -> opp_tokens = kcalloc (num_possible_cpus (), sizeof (* drv -> opp_tokens ),
276- GFP_KERNEL );
277- if (!drv -> opp_tokens ) {
278- ret = - ENOMEM ;
279- goto free_drv ;
280- }
281-
282276 for_each_possible_cpu (cpu ) {
283277 struct dev_pm_opp_config config = {
284278 .supported_hw = NULL ,
@@ -304,9 +298,9 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
304298 }
305299
306300 if (config .supported_hw || config .genpd_names ) {
307- drv -> opp_tokens [cpu ] = dev_pm_opp_set_config (cpu_dev , & config );
308- if (drv -> opp_tokens [cpu ] < 0 ) {
309- ret = drv -> opp_tokens [cpu ];
301+ drv -> cpus [cpu ]. opp_token = dev_pm_opp_set_config (cpu_dev , & config );
302+ if (drv -> cpus [cpu ]. opp_token < 0 ) {
303+ ret = drv -> cpus [cpu ]. opp_token ;
310304 dev_err (cpu_dev , "Failed to set OPP config\n" );
311305 goto free_opp ;
312306 }
@@ -325,11 +319,7 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
325319
326320free_opp :
327321 for_each_possible_cpu (cpu )
328- dev_pm_opp_clear_config (drv -> opp_tokens [cpu ]);
329- kfree (drv -> opp_tokens );
330- free_drv :
331- kfree (drv );
332-
322+ dev_pm_opp_clear_config (drv -> cpus [cpu ].opp_token );
333323 return ret ;
334324}
335325
@@ -341,10 +331,7 @@ static void qcom_cpufreq_remove(struct platform_device *pdev)
341331 platform_device_unregister (cpufreq_dt_pdev );
342332
343333 for_each_possible_cpu (cpu )
344- dev_pm_opp_clear_config (drv -> opp_tokens [cpu ]);
345-
346- kfree (drv -> opp_tokens );
347- kfree (drv );
334+ dev_pm_opp_clear_config (drv -> cpus [cpu ].opp_token );
348335}
349336
350337static struct platform_driver qcom_cpufreq_driver = {
0 commit comments