static void podgov_set_user_ctl(struct device *dev, int user) { struct nvhost_device *d = to_nvhost_device(dev); struct devfreq *df = d->power_manager; struct podgov_info_rec *podgov; if (!df) return; mutex_lock(&df->lock); podgov = df->data; trace_podgov_set_user_ctl(user); if (podgov->enable && user && !podgov->p_user) { cancel_work_sync(&podgov->work); cancel_delayed_work(&podgov->idle_timer); podgov->adjustment_frequency = podgov->p_freq_request; podgov->adjustment_type = ADJUSTMENT_LOCAL; update_devfreq(df); } podgov->p_user = user; mutex_unlock(&df->lock); }
static void podgov_set_user_ctl(struct device *dev, int user) { struct platform_device *d = to_platform_device(dev); struct nvhost_device_data *pdata = platform_get_drvdata(d); struct devfreq *df = pdata->power_manager; struct podgov_info_rec *podgov; int old_user; if (!df) return; /* make sure the device is alive before doing any scaling */ nvhost_module_busy_noresume(d); mutex_lock(&df->lock); podgov = df->data; trace_podgov_set_user_ctl(user); /* store the new user value */ old_user = podgov->p_user; podgov->p_user = user; /* skip scaling, if scaling (or the whole device) is turned off * - or the scaling already was in user mode */ if (!pm_runtime_active(&d->dev) || !podgov->enable || !(user && !old_user)) goto exit_unlock; /* write request */ podgov->adjustment_frequency = podgov->p_freq_request; podgov->adjustment_type = ADJUSTMENT_LOCAL; update_devfreq(df); mutex_unlock(&df->lock); nvhost_module_idle(d); stop_podgov_workers(podgov); return; exit_unlock: mutex_unlock(&df->lock); nvhost_module_idle(d); }