diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index d4891190..5dec1ec8 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -33,6 +33,8 @@ #define UPDATE_BUSY_VAL 1000000 #define UPDATE_BUSY 50 +unsigned long internal_max = 450000000; + struct clk_pair { const char *name; uint map; @@ -371,6 +373,9 @@ static int _get_nearest_pwrlevel(struct kgsl_pwrctrl *pwr, unsigned int clock) return -ERANGE; } +extern void SetGPUpll_config(u32 loc, unsigned long freq); +extern void SetMAXGPUFreq(unsigned long freq); + static int kgsl_pwrctrl_max_gpuclk_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -389,6 +394,39 @@ static int kgsl_pwrctrl_max_gpuclk_store(struct device *dev, if (ret != 1) return count; + if (val == 450000000) + { + //pwr->pwrlevels[0].gpu_freq = val; + //SetMAXGPUFreq(val); + SetGPUpll_config(0x21, val); + } + else if (val == 504000000) + { + //pwr->pwrlevels[0].gpu_freq = val; + //SetMAXGPUFreq(val); + SetGPUpll_config(0x25, val); + } + else if (val == 545000000) + { + //pwr->pwrlevels[0].gpu_freq = val; + //SetMAXGPUFreq(val); + SetGPUpll_config(0x28, val); + } + else if (val == 600000000) + { + //pwr->pwrlevels[0].gpu_freq = val; + //SetMAXGPUFreq(val); + SetGPUpll_config(0x2C, val); + } + else if (val == 627000000) + { + //pwr->pwrlevels[0].gpu_freq = val; + //SetMAXGPUFreq(val); + SetGPUpll_config(0x2E, val); + } + + internal_max = val; + mutex_lock(&device->mutex); level = _get_nearest_pwrlevel(pwr, val); if (level < 0) @@ -403,7 +441,7 @@ static int kgsl_pwrctrl_max_gpuclk_store(struct device *dev, if (pwr->thermal_pwrlevel > pwr->active_pwrlevel) kgsl_pwrctrl_pwrlevel_change(device, pwr->thermal_pwrlevel); - + done: mutex_unlock(&device->mutex); return count; @@ -419,8 +457,8 @@ static int kgsl_pwrctrl_max_gpuclk_show(struct device *dev, if (device == NULL) return 0; pwr = &device->pwrctrl; - return snprintf(buf, PAGE_SIZE, "%d\n", - pwr->pwrlevels[pwr->thermal_pwrlevel].gpu_freq); + return snprintf(buf, PAGE_SIZE, "%ld\n", + internal_max); } static int kgsl_pwrctrl_gpuclk_store(struct device *dev, @@ -459,8 +497,12 @@ static int kgsl_pwrctrl_gpuclk_show(struct device *dev, if (device == NULL) return 0; pwr = &device->pwrctrl; - return snprintf(buf, PAGE_SIZE, "%d\n", + if (pwr->active_pwrlevel != 0) + return snprintf(buf, PAGE_SIZE, "%d\n", pwr->pwrlevels[pwr->active_pwrlevel].gpu_freq); + else + return snprintf(buf, PAGE_SIZE, "%ld\n", + internal_max); } static int kgsl_pwrctrl_pwrnap_store(struct device *dev, @@ -609,8 +651,16 @@ static int kgsl_pwrctrl_gpu_available_frequencies_show( return 0; pwr = &device->pwrctrl; for (index = 0; index < pwr->num_pwrlevels - 1; index++) - num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ", - pwr->pwrlevels[index].gpu_freq); + if (index == 0) + { + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",627000000); + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",600000000); + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",545000000); + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",504000000); + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",450000000); + } + else + num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ",pwr->pwrlevels[index].gpu_freq); buf[num_chars++] = '\n'; return num_chars; } @@ -861,6 +911,7 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) struct kgsl_pwrctrl *pwr = &device->pwrctrl; struct kgsl_device_platform_data *pdata = pdev->dev.platform_data; + /*acquire clocks */ for (i = 0; i < KGSL_MAX_CLKS; i++) { if (pdata->clk_map & clks[i].map) {