Example #1
0
void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device,
                                  unsigned int new_level)
{
    struct kgsl_pwrctrl *pwr = &device->pwrctrl;
    if (new_level < (pwr->num_pwrlevels - 1) &&
            new_level >= pwr->thermal_pwrlevel &&
            new_level != pwr->active_pwrlevel) {
        struct kgsl_pwrlevel *pwrlevel = &pwr->pwrlevels[new_level];
        pwr->active_pwrlevel = new_level;
        if ((test_bit(KGSL_PWRFLAGS_CLK_ON, &pwr->power_flags)) ||
                (device->state == KGSL_STATE_NAP)) {
            /*
             * On some platforms, instability is caused on
             * changing clock freq when the core is busy.
             * Idle the gpu core before changing the clock freq.
             */
            if (pwr->idle_needed == true)
                device->ftbl->idle(device,
                                   KGSL_TIMEOUT_DEFAULT);
            clk_set_rate(pwr->grp_clks[0], pwrlevel->gpu_freq);
        }
        if (test_bit(KGSL_PWRFLAGS_AXI_ON, &pwr->power_flags)) {
            if (pwr->pcl)
                msm_bus_scale_client_update_request(pwr->pcl,
                                                    pwrlevel->bus_freq);
            else if (pwr->ebi1_clk)
                clk_set_rate(pwr->ebi1_clk, pwrlevel->bus_freq);
        }
        trace_kgsl_pwrlevel(device, pwr->active_pwrlevel,
                            pwrlevel->gpu_freq);
    }
}
static void tz_sleep(struct kgsl_device *device,
	struct kgsl_pwrscale *pwrscale)
{
	struct tz_priv *priv = pwrscale->priv;

	trace_kgsl_pwrlevel(device, 0, 0);

	__secure_tz_entry(TZ_RESET_ID, 0, device->id);
	priv->no_switch_cnt = 0;
}
static void tz_wake(struct kgsl_device *device, struct kgsl_pwrscale *pwrscale)
{
	struct tz_priv *priv = pwrscale->priv;
	if (device->state != KGSL_STATE_NAP &&
		priv->governor == TZ_GOVERNOR_ONDEMAND) {
		trace_kgsl_pwrlevel(device, device->pwrctrl.default_pwrlevel,
			device->pwrctrl.pwrlevels[device->pwrctrl.default_pwrlevel].gpu_freq);
		kgsl_pwrctrl_pwrlevel_change(device,
					device->pwrctrl.default_pwrlevel);
	}
}
void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device,
				unsigned int new_level)
{
	struct kgsl_pwrctrl *pwr = &device->pwrctrl;
	if (new_level < (pwr->num_pwrlevels - 1) &&
		new_level >= pwr->thermal_pwrlevel &&
		new_level != pwr->active_pwrlevel) {
		struct kgsl_pwrlevel *pwrlevel = &pwr->pwrlevels[new_level];
		pwr->active_pwrlevel = new_level;
		if ((test_bit(KGSL_PWRFLAGS_CLK_ON, &pwr->power_flags)) ||
			(device->state == KGSL_STATE_NAP))
			clk_set_rate(pwr->grp_clks[0], pwrlevel->gpu_freq);
		if (test_bit(KGSL_PWRFLAGS_AXI_ON, &pwr->power_flags)) {
			if (pwr->pcl)
				msm_bus_scale_client_update_request(pwr->pcl,
					pwrlevel->bus_freq);
			else if (pwr->ebi1_clk)
				clk_set_rate(pwr->ebi1_clk, pwrlevel->bus_freq);
		}
		trace_kgsl_pwrlevel(device, pwr->active_pwrlevel,
				    pwrlevel->gpu_freq);
	}
}