diff options
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk.c')
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk.c b/drivers/gpu/nvgpu/clk/clk.c index 918cd43c..ce071018 100644 --- a/drivers/gpu/nvgpu/clk/clk.c +++ b/drivers/gpu/nvgpu/clk/clk.c | |||
@@ -17,8 +17,12 @@ | |||
17 | #include "pmuif/gpmuifvolt.h" | 17 | #include "pmuif/gpmuifvolt.h" |
18 | #include "ctrl/ctrlclk.h" | 18 | #include "ctrl/ctrlclk.h" |
19 | #include "ctrl/ctrlvolt.h" | 19 | #include "ctrl/ctrlvolt.h" |
20 | #include "volt/volt.h" | ||
20 | #include "gk20a/pmu_gk20a.h" | 21 | #include "gk20a/pmu_gk20a.h" |
21 | 22 | ||
23 | #define BOOT_GPC2CLK_MHZ 2581 | ||
24 | #define BOOT_MCLK_MHZ 3003 | ||
25 | |||
22 | struct clkrpc_pmucmdhandler_params { | 26 | struct clkrpc_pmucmdhandler_params { |
23 | struct nv_pmu_clk_rpc *prpccall; | 27 | struct nv_pmu_clk_rpc *prpccall; |
24 | u32 success; | 28 | u32 success; |
@@ -382,15 +386,38 @@ int clk_set_boot_fll_clk(struct gk20a *g) | |||
382 | { | 386 | { |
383 | int status; | 387 | int status; |
384 | struct change_fll_clk bootfllclk; | 388 | struct change_fll_clk bootfllclk; |
389 | u16 gpc2clk_clkmhz = BOOT_GPC2CLK_MHZ; | ||
390 | u32 gpc2clk_voltuv = 0; | ||
391 | u16 mclk_clkmhz = BOOT_MCLK_MHZ; | ||
392 | u32 mclk_voltuv = 0; | ||
393 | u32 voltuv = 0; | ||
385 | 394 | ||
386 | mutex_init(&g->clk_pmu.changeclkmutex); | 395 | mutex_init(&g->clk_pmu.changeclkmutex); |
387 | 396 | ||
397 | clk_domain_get_f_or_v(g, CTRL_CLK_DOMAIN_GPC2CLK, &gpc2clk_clkmhz, | ||
398 | &gpc2clk_voltuv); | ||
399 | clk_domain_get_f_or_v(g, CTRL_CLK_DOMAIN_MCLK, &mclk_clkmhz, | ||
400 | &mclk_voltuv); | ||
401 | |||
402 | voltuv = ((gpc2clk_voltuv) > (mclk_voltuv)) ? (gpc2clk_voltuv) | ||
403 | : (mclk_voltuv); | ||
404 | |||
405 | status = volt_set_voltage(g, voltuv, voltuv); | ||
406 | if (status) | ||
407 | gk20a_err(dev_from_gk20a(g), "attempt to set boot voltage failed %d", | ||
408 | voltuv); | ||
409 | |||
388 | bootfllclk.api_clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; | 410 | bootfllclk.api_clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; |
389 | bootfllclk.clkmhz = 2581; | 411 | bootfllclk.clkmhz = gpc2clk_clkmhz; |
390 | bootfllclk.voltuv = 825000; | 412 | bootfllclk.voltuv = voltuv; |
391 | status = clk_program_fllclks(g, &bootfllclk); | 413 | status = clk_program_fllclks(g, &bootfllclk); |
392 | if (status) | 414 | if (status) |
393 | gk20a_err(dev_from_gk20a(g), "attemp to set boot clk failed"); | 415 | gk20a_err(dev_from_gk20a(g), "attempt to set boot gpc2clk failed"); |
416 | |||
417 | status = g->clk_pmu.clk_mclk.change(g, DEFAULT_BOOT_MCLK_SPEED); | ||
418 | if (status) | ||
419 | gk20a_err(dev_from_gk20a(g), "attempt to set boot mclk failed"); | ||
420 | |||
394 | return status; | 421 | return status; |
395 | } | 422 | } |
396 | 423 | ||