Skip to content

Commit 2a5d46c

Browse files
stephan-ghvireshk
authored andcommitted
cpufreq: qcom-nvmem: Simplify driver data allocation
Simplify the allocation and cleanup of driver data by using devm together with a flexible array. Prepare for adding additional per-CPU data by defining a struct qcom_cpufreq_drv_cpu instead of storing the opp_tokens directly. Signed-off-by: Stephan Gerhold <stephan.gerhold@kernkonzept.com> Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
1 parent dce13a2 commit 2a5d46c

File tree

1 file changed

+18
-31
lines changed

1 file changed

+18
-31
lines changed

drivers/cpufreq/qcom-cpufreq-nvmem.c

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4347
struct 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

4953
static 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

326320
free_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

350337
static struct platform_driver qcom_cpufreq_driver = {

0 commit comments

Comments
 (0)