static int kgsl_pwrctrl_pwrnap_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char temp[20]; unsigned long val; struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; int rc; snprintf(temp, sizeof(temp), "%.*s", (int)min(count, sizeof(temp) - 1), buf); rc = strict_strtoul(temp, 0, &val); if (rc) return rc; mutex_lock(&device->mutex); if (val == 1) pwr->nap_allowed = true; else if (val == 0) pwr->nap_allowed = false; mutex_unlock(&device->mutex); return count; }
static int kgsl_pwrctrl_idle_timer_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char temp[20]; unsigned long val; struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; const long div = 1000/HZ; static unsigned int org_interval_timeout = 1; int rc; snprintf(temp, sizeof(temp), "%.*s", (int)min(count, sizeof(temp) - 1), buf); rc = strict_strtoul(temp, 0, &val); if (rc) return rc; if (org_interval_timeout == 1) org_interval_timeout = pwr->interval_timeout; mutex_lock(&device->mutex); /* Let the timeout be requested in ms, but convert to jiffies. */ val /= div; if (val >= org_interval_timeout) pwr->interval_timeout = val; mutex_unlock(&device->mutex); return count; }
static int kgsl_pwrctrl_idle_timer_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; return sprintf(buf, "%d\n", pwr->interval_timeout); }
static int kgsl_pwrctrl_pwrnap_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; return sprintf(buf, "%d\n", pwr->nap_allowed); }
static int kgsl_pwrctrl_max_gpuclk_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; return snprintf(buf, PAGE_SIZE, "%d\n", pwr->pwrlevels[pwr->thermal_pwrlevel].gpu_freq); }
static int kgsl_pwrctrl_pwrnap_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); if (device == NULL) return 0; return snprintf(buf, PAGE_SIZE, "%d\n", device->pwrctrl.nap_allowed); }
static int kgsl_pwrctrl_idle_timer_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); if (device == NULL) return 0; return snprintf(buf, PAGE_SIZE, "%d\n", device->pwrctrl.interval_timeout); }
static int kgsl_pwrctrl_gpuclk_show(struct device *dev, struct device_attribute *attr, char *buf) { struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = (device) ? (&device->pwrctrl):NULL; BUG_ON(pwr == NULL); return snprintf(buf, PAGE_SIZE, "%d\n", pwr->pwrlevels[pwr->active_pwrlevel].gpu_freq); }
static int kgsl_pwrctrl_gpubusy_show(struct device *dev, struct device_attribute *attr, char *buf) { int ret; struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_busy *b = &device->pwrctrl.busy; ret = snprintf(buf, 17, "%7d %7d\n", b->on_time_old, b->time_old); if (!test_bit(KGSL_PWRFLAGS_AXI_ON, &device->pwrctrl.power_flags)) { b->on_time_old = 0; b->time_old = 0; } return ret; }
static int __gpuclk_store(int max, struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int ret, i, delta = 5000000; unsigned long val; struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr; if (device == NULL) return 0; pwr = &device->pwrctrl; ret = sscanf(buf, "%ld", &val); if (ret != 1) return count; mutex_lock(&device->mutex); for (i = 0; i < pwr->num_pwrlevels; i++) { if (abs(pwr->pwrlevels[i].gpu_freq - val) < delta) { if (max) pwr->thermal_pwrlevel = i; break; } } if (i == pwr->num_pwrlevels) goto done; /* * If the current or requested clock speed is greater than the * thermal limit, bump down immediately. */ if (pwr->pwrlevels[pwr->active_pwrlevel].gpu_freq > pwr->pwrlevels[pwr->thermal_pwrlevel].gpu_freq) kgsl_pwrctrl_pwrlevel_change(device, pwr->thermal_pwrlevel); else if (!max) kgsl_pwrctrl_pwrlevel_change(device, i); done: mutex_unlock(&device->mutex); return count; }
static int kgsl_pwrctrl_fraction_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long val; char temp[20]; struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr = &device->pwrctrl; snprintf(temp, sizeof(temp), "%.*s", (int)min(count, sizeof(temp) - 1), buf); strict_strtoul(temp, 0, &val); mutex_lock(&device->mutex); if (val < 100) pwr->io_fraction = (unsigned int)val; else pwr->io_fraction = 100; mutex_unlock(&device->mutex); return count; }