diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c index c5464d5b..5fdcb05c 100644 --- a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c +++ b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c | |||
@@ -55,6 +55,9 @@ | |||
55 | static unsigned long | 55 | static unsigned long |
56 | gp10b_freq_table[GP10B_MAX_SUPPORTED_FREQS / GP10B_FREQ_SELECT_STEP]; | 56 | gp10b_freq_table[GP10B_MAX_SUPPORTED_FREQS / GP10B_FREQ_SELECT_STEP]; |
57 | 57 | ||
58 | static bool freq_table_init_complete; | ||
59 | static int num_supported_freq; | ||
60 | |||
58 | #define TEGRA_GP10B_BW_PER_FREQ 64 | 61 | #define TEGRA_GP10B_BW_PER_FREQ 64 |
59 | #define TEGRA_DDR4_BW_PER_FREQ 16 | 62 | #define TEGRA_DDR4_BW_PER_FREQ 16 |
60 | 63 | ||
@@ -166,6 +169,8 @@ static int gp10b_tegra_probe(struct device *dev) | |||
166 | gp10b_tegra_get_clocks(dev); | 169 | gp10b_tegra_get_clocks(dev); |
167 | nvgpu_linux_init_clk_support(platform->g); | 170 | nvgpu_linux_init_clk_support(platform->g); |
168 | 171 | ||
172 | nvgpu_mutex_init(&platform->clk_get_freq_lock); | ||
173 | |||
169 | return 0; | 174 | return 0; |
170 | } | 175 | } |
171 | 176 | ||
@@ -176,6 +181,8 @@ static int gp10b_tegra_late_probe(struct device *dev) | |||
176 | 181 | ||
177 | static int gp10b_tegra_remove(struct device *dev) | 182 | static int gp10b_tegra_remove(struct device *dev) |
178 | { | 183 | { |
184 | struct gk20a_platform *platform = gk20a_get_platform(dev); | ||
185 | |||
179 | /* deinitialise tegra specific scaling quirks */ | 186 | /* deinitialise tegra specific scaling quirks */ |
180 | gp10b_tegra_scale_exit(dev); | 187 | gp10b_tegra_scale_exit(dev); |
181 | 188 | ||
@@ -183,6 +190,8 @@ static int gp10b_tegra_remove(struct device *dev) | |||
183 | nvgpu_free_nvhost_dev(get_gk20a(dev)); | 190 | nvgpu_free_nvhost_dev(get_gk20a(dev)); |
184 | #endif | 191 | #endif |
185 | 192 | ||
193 | nvgpu_mutex_destroy(&platform->clk_get_freq_lock); | ||
194 | |||
186 | return 0; | 195 | return 0; |
187 | } | 196 | } |
188 | 197 | ||
@@ -342,6 +351,18 @@ int gp10b_clk_get_freqs(struct device *dev, | |||
342 | int sel_freq_cnt; | 351 | int sel_freq_cnt; |
343 | unsigned long loc_freq_table[GP10B_MAX_SUPPORTED_FREQS]; | 352 | unsigned long loc_freq_table[GP10B_MAX_SUPPORTED_FREQS]; |
344 | 353 | ||
354 | nvgpu_mutex_acquire(&platform->clk_get_freq_lock); | ||
355 | |||
356 | if (freq_table_init_complete) { | ||
357 | |||
358 | *freqs = gp10b_freq_table; | ||
359 | *num_freqs = num_supported_freq; | ||
360 | |||
361 | nvgpu_mutex_release(&platform->clk_get_freq_lock); | ||
362 | |||
363 | return 0; | ||
364 | } | ||
365 | |||
345 | max_rate = clk_round_rate(platform->clk[0], (UINT_MAX - 1)); | 366 | max_rate = clk_round_rate(platform->clk[0], (UINT_MAX - 1)); |
346 | 367 | ||
347 | /* | 368 | /* |
@@ -392,10 +413,15 @@ int gp10b_clk_get_freqs(struct device *dev, | |||
392 | /* Fill freq table */ | 413 | /* Fill freq table */ |
393 | *freqs = gp10b_freq_table; | 414 | *freqs = gp10b_freq_table; |
394 | *num_freqs = sel_freq_cnt; | 415 | *num_freqs = sel_freq_cnt; |
416 | num_supported_freq = sel_freq_cnt; | ||
417 | |||
418 | freq_table_init_complete = true; | ||
395 | 419 | ||
396 | nvgpu_log_info(g, "min rate: %ld max rate: %ld num_of_freq %d\n", | 420 | nvgpu_log_info(g, "min rate: %ld max rate: %ld num_of_freq %d\n", |
397 | gp10b_freq_table[0], max_rate, *num_freqs); | 421 | gp10b_freq_table[0], max_rate, *num_freqs); |
398 | 422 | ||
423 | nvgpu_mutex_release(&platform->clk_get_freq_lock); | ||
424 | |||
399 | return 0; | 425 | return 0; |
400 | } | 426 | } |
401 | 427 | ||