summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/tegra/linux/clk.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-05-16 09:33:02 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-05-24 07:55:53 -0400
commit6d2d3a3d9345661bc14af06a8b4462495205b743 (patch)
tree0d8317f78658296c3ecb85027dc3529918516222 /drivers/gpu/nvgpu/tegra/linux/clk.c
parent1eace20876b4136a1edf8287a9f37a693218efa8 (diff)
gpu: nvgpu: move linux clk calls to tegra specific file
clk_gm20b.c has number of calls specific to linux and tegra-soc environment In order to unify the driver, move all of those calls to tegra/linux specific file tegra/linux/clk.c All the clk_*() and tegra_dvfs_*() calls are now abstracted behind GPU's clock operations and shoule be accessed using g->ops.clk.<API> format Remove <linux/clk.h> and <soc/tegra/tegra-dvfs.h> from clk_gm20b.c Remove <linux/version.h> from clk_gm20b.c too since we only support k4.4 and higher version only Jira NVGPU-49 Change-Id: Ib26811e0423bbd3868b9a46e662b80a8ca088dc5 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1483092 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/tegra/linux/clk.c')
-rw-r--r--drivers/gpu/nvgpu/tegra/linux/clk.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/tegra/linux/clk.c b/drivers/gpu/nvgpu/tegra/linux/clk.c
index a82076c7..775e5661 100644
--- a/drivers/gpu/nvgpu/tegra/linux/clk.c
+++ b/drivers/gpu/nvgpu/tegra/linux/clk.c
@@ -17,6 +17,9 @@
17 */ 17 */
18 18
19#include <linux/clk.h> 19#include <linux/clk.h>
20#include <linux/version.h>
21
22#include <soc/tegra/tegra-dvfs.h>
20 23
21#include "clk.h" 24#include "clk.h"
22#include "gk20a/gk20a.h" 25#include "gk20a/gk20a.h"
@@ -71,8 +74,60 @@ static int nvgpu_linux_clk_set_rate(struct gk20a *g,
71 return ret; 74 return ret;
72} 75}
73 76
77static unsigned long nvgpu_linux_get_fmax_at_vmin_safe(struct clk_gk20a *clk)
78{
79 /*
80 * On Tegra GPU clock exposed to frequency governor is a shared user on
81 * GPCPLL bus (gbus). The latter can be accessed as GPU clock parent.
82 * Respectively the grandparent is PLL reference clock.
83 */
84 return tegra_dvfs_get_fmax_at_vmin_safe_t(
85 clk_get_parent(clk->tegra_clk));
86}
87
88static u32 nvgpu_linux_get_ref_clock_rate(struct gk20a *g)
89{
90 struct clk *c;
91
92 c = clk_get_sys("gpu_ref", "gpu_ref");
93 if (IS_ERR(c)) {
94 nvgpu_err(g, "failed to get GPCPLL reference clock");
95 return 0;
96 }
97
98 return clk_get_rate(c);
99}
100
101static int nvgpu_linux_predict_mv_at_hz_cur_tfloor(struct clk_gk20a *clk,
102 unsigned long rate)
103{
104 return tegra_dvfs_predict_mv_at_hz_cur_tfloor(
105 clk_get_parent(clk->tegra_clk), rate);
106}
107
108static unsigned long nvgpu_linux_get_maxrate(struct clk_gk20a *clk)
109{
110 return tegra_dvfs_get_maxrate(clk_get_parent(clk->tegra_clk));
111}
112
113static int nvgpu_linux_prepare_enable(struct clk_gk20a *clk)
114{
115 return clk_prepare_enable(clk->tegra_clk);
116}
117
118static void nvgpu_linux_disable_unprepare(struct clk_gk20a *clk)
119{
120 clk_disable_unprepare(clk->tegra_clk);
121}
122
74void nvgpu_linux_init_clk_support(struct gk20a *g) 123void nvgpu_linux_init_clk_support(struct gk20a *g)
75{ 124{
76 g->ops.clk.get_rate = nvgpu_linux_clk_get_rate; 125 g->ops.clk.get_rate = nvgpu_linux_clk_get_rate;
77 g->ops.clk.set_rate = nvgpu_linux_clk_set_rate; 126 g->ops.clk.set_rate = nvgpu_linux_clk_set_rate;
127 g->ops.clk.get_fmax_at_vmin_safe = nvgpu_linux_get_fmax_at_vmin_safe;
128 g->ops.clk.get_ref_clock_rate = nvgpu_linux_get_ref_clock_rate;
129 g->ops.clk.predict_mv_at_hz_cur_tfloor = nvgpu_linux_predict_mv_at_hz_cur_tfloor;
130 g->ops.clk.get_maxrate = nvgpu_linux_get_maxrate;
131 g->ops.clk.prepare_enable = nvgpu_linux_prepare_enable;
132 g->ops.clk.disable_unprepare = nvgpu_linux_disable_unprepare;
78} 133}