Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/tegra: nvdec: Support multiple clocks

NVDEC on Tegra234 requires multiple clocks. Add support for that.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>

authored by

Mikko Perttunen and committed by
Thierry Reding
95ffcb4c 97b93b7a

+21 -10
+21 -10
drivers/gpu/drm/tegra/nvdec.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* 3 - * Copyright (c) 2015-2021, NVIDIA Corporation. 3 + * Copyright (c) 2015-2022, NVIDIA Corporation. 4 4 */ 5 5 6 6 #include <linux/clk.h> ··· 28 28 const char *firmware; 29 29 unsigned int version; 30 30 bool supports_sid; 31 + bool has_extra_clocks; 31 32 }; 32 33 33 34 struct nvdec { ··· 38 37 struct tegra_drm_client client; 39 38 struct host1x_channel *channel; 40 39 struct device *dev; 41 - struct clk *clk; 40 + struct clk_bulk_data clks[3]; 41 + unsigned int num_clks; 42 42 43 43 /* Platform configuration */ 44 44 const struct nvdec_config *config; ··· 260 258 struct nvdec *nvdec = dev_get_drvdata(dev); 261 259 int err; 262 260 263 - err = clk_prepare_enable(nvdec->clk); 261 + err = clk_bulk_prepare_enable(nvdec->num_clks, nvdec->clks); 264 262 if (err < 0) 265 263 return err; 266 264 ··· 277 275 return 0; 278 276 279 277 disable: 280 - clk_disable_unprepare(nvdec->clk); 278 + clk_bulk_disable_unprepare(nvdec->num_clks, nvdec->clks); 281 279 return err; 282 280 } 283 281 ··· 287 285 288 286 host1x_channel_stop(nvdec->channel); 289 287 290 - clk_disable_unprepare(nvdec->clk); 288 + clk_bulk_disable_unprepare(nvdec->num_clks, nvdec->clks); 291 289 292 290 return 0; 293 291 } ··· 385 383 if (IS_ERR(nvdec->regs)) 386 384 return PTR_ERR(nvdec->regs); 387 385 388 - nvdec->clk = devm_clk_get(dev, NULL); 389 - if (IS_ERR(nvdec->clk)) { 390 - dev_err(&pdev->dev, "failed to get clock\n"); 391 - return PTR_ERR(nvdec->clk); 386 + nvdec->clks[0].id = "nvdec"; 387 + nvdec->num_clks = 1; 388 + 389 + if (nvdec->config->has_extra_clocks) { 390 + nvdec->num_clks = 3; 391 + nvdec->clks[1].id = "fuse"; 392 + nvdec->clks[2].id = "tsec_pka"; 392 393 } 393 394 394 - err = clk_set_rate(nvdec->clk, ULONG_MAX); 395 + err = devm_clk_bulk_get(dev, nvdec->num_clks, nvdec->clks); 396 + if (err) { 397 + dev_err(&pdev->dev, "failed to get clock(s)\n"); 398 + return err; 399 + } 400 + 401 + err = clk_set_rate(nvdec->clks[0].clk, ULONG_MAX); 395 402 if (err < 0) { 396 403 dev_err(&pdev->dev, "failed to set clock rate\n"); 397 404 return err;