@@ -40,10 +40,14 @@ struct qcom_cpufreq_match_data {
40
40
const char * * genpd_names ;
41
41
};
42
42
43
+ struct qcom_cpufreq_drv_cpu {
44
+ int opp_token ;
45
+ };
46
+
43
47
struct qcom_cpufreq_drv {
44
- int * opp_tokens ;
45
48
u32 versions ;
46
49
const struct qcom_cpufreq_match_data * data ;
50
+ struct qcom_cpufreq_drv_cpu cpus [];
47
51
};
48
52
49
53
static struct platform_device * cpufreq_dt_pdev , * cpufreq_pdev ;
@@ -243,42 +247,32 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
243
247
return - ENOENT ;
244
248
}
245
249
246
- drv = kzalloc (sizeof (* drv ), GFP_KERNEL );
250
+ drv = devm_kzalloc (& pdev -> dev , struct_size (drv , cpus , num_possible_cpus ()),
251
+ GFP_KERNEL );
247
252
if (!drv )
248
253
return - ENOMEM ;
249
254
250
255
match = pdev -> dev .platform_data ;
251
256
drv -> data = match -> data ;
252
- if (!drv -> data ) {
253
- ret = - ENODEV ;
254
- goto free_drv ;
255
- }
257
+ if (!drv -> data )
258
+ return - ENODEV ;
256
259
257
260
if (drv -> data -> get_version ) {
258
261
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" );
264
265
265
266
ret = drv -> data -> get_version (cpu_dev ,
266
267
speedbin_nvmem , & pvs_name , drv );
267
268
if (ret ) {
268
269
nvmem_cell_put (speedbin_nvmem );
269
- goto free_drv ;
270
+ return ret ;
270
271
}
271
272
nvmem_cell_put (speedbin_nvmem );
272
273
}
273
274
of_node_put (np );
274
275
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
-
282
276
for_each_possible_cpu (cpu ) {
283
277
struct dev_pm_opp_config config = {
284
278
.supported_hw = NULL ,
@@ -304,9 +298,9 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
304
298
}
305
299
306
300
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 ;
310
304
dev_err (cpu_dev , "Failed to set OPP config\n" );
311
305
goto free_opp ;
312
306
}
@@ -325,11 +319,7 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
325
319
326
320
free_opp :
327
321
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 );
333
323
return ret ;
334
324
}
335
325
@@ -341,10 +331,7 @@ static void qcom_cpufreq_remove(struct platform_device *pdev)
341
331
platform_device_unregister (cpufreq_dt_pdev );
342
332
343
333
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 );
348
335
}
349
336
350
337
static struct platform_driver qcom_cpufreq_driver = {
0 commit comments