Skip to content

Commit 95ffcb4

Browse files
cyndisthierryreding
authored andcommitted
drm/tegra: nvdec: Support multiple clocks
NVDEC on Tegra234 requires multiple clocks. Add support for that. Signed-off-by: Mikko Perttunen <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
1 parent 97b93b7 commit 95ffcb4

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

drivers/gpu/drm/tegra/nvdec.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SPDX-License-Identifier: GPL-2.0-only
22
/*
3-
* Copyright (c) 2015-2021, NVIDIA Corporation.
3+
* Copyright (c) 2015-2022, NVIDIA Corporation.
44
*/
55

66
#include <linux/clk.h>
@@ -28,6 +28,7 @@ struct nvdec_config {
2828
const char *firmware;
2929
unsigned int version;
3030
bool supports_sid;
31+
bool has_extra_clocks;
3132
};
3233

3334
struct nvdec {
@@ -37,7 +38,8 @@ struct nvdec {
3738
struct tegra_drm_client client;
3839
struct host1x_channel *channel;
3940
struct device *dev;
40-
struct clk *clk;
41+
struct clk_bulk_data clks[3];
42+
unsigned int num_clks;
4143

4244
/* Platform configuration */
4345
const struct nvdec_config *config;
@@ -258,7 +260,7 @@ static __maybe_unused int nvdec_runtime_resume(struct device *dev)
258260
struct nvdec *nvdec = dev_get_drvdata(dev);
259261
int err;
260262

261-
err = clk_prepare_enable(nvdec->clk);
263+
err = clk_bulk_prepare_enable(nvdec->num_clks, nvdec->clks);
262264
if (err < 0)
263265
return err;
264266

@@ -275,7 +277,7 @@ static __maybe_unused int nvdec_runtime_resume(struct device *dev)
275277
return 0;
276278

277279
disable:
278-
clk_disable_unprepare(nvdec->clk);
280+
clk_bulk_disable_unprepare(nvdec->num_clks, nvdec->clks);
279281
return err;
280282
}
281283

@@ -285,7 +287,7 @@ static __maybe_unused int nvdec_runtime_suspend(struct device *dev)
285287

286288
host1x_channel_stop(nvdec->channel);
287289

288-
clk_disable_unprepare(nvdec->clk);
290+
clk_bulk_disable_unprepare(nvdec->num_clks, nvdec->clks);
289291

290292
return 0;
291293
}
@@ -383,13 +385,22 @@ static int nvdec_probe(struct platform_device *pdev)
383385
if (IS_ERR(nvdec->regs))
384386
return PTR_ERR(nvdec->regs);
385387

386-
nvdec->clk = devm_clk_get(dev, NULL);
387-
if (IS_ERR(nvdec->clk)) {
388-
dev_err(&pdev->dev, "failed to get clock\n");
389-
return PTR_ERR(nvdec->clk);
388+
nvdec->clks[0].id = "nvdec";
389+
nvdec->num_clks = 1;
390+
391+
if (nvdec->config->has_extra_clocks) {
392+
nvdec->num_clks = 3;
393+
nvdec->clks[1].id = "fuse";
394+
nvdec->clks[2].id = "tsec_pka";
395+
}
396+
397+
err = devm_clk_bulk_get(dev, nvdec->num_clks, nvdec->clks);
398+
if (err) {
399+
dev_err(&pdev->dev, "failed to get clock(s)\n");
400+
return err;
390401
}
391402

392-
err = clk_set_rate(nvdec->clk, ULONG_MAX);
403+
err = clk_set_rate(nvdec->clks[0].clk, ULONG_MAX);
393404
if (err < 0) {
394405
dev_err(&pdev->dev, "failed to set clock rate\n");
395406
return err;

0 commit comments

Comments
 (0)