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
3334struct 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
277279disable :
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