static void podgov_enable(struct device *dev, int enable) { 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_enabled(enable); if (enable && df->min_freq != df->max_freq) { podgov->enable = 1; } else { cancel_work_sync(&podgov->work); cancel_delayed_work(&podgov->idle_timer); podgov->enable = 0; podgov->adjustment_frequency = df->max_freq; podgov->adjustment_type = ADJUSTMENT_LOCAL; update_devfreq(df); } mutex_unlock(&df->lock); }
static void podgov_enable(struct device *dev, int enable) { 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; 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_enabled(enable); /* bad configuration. quit. */ if (df->min_freq == df->max_freq) goto exit_unlock; /* store the enable information */ podgov->enable = enable; /* skip local adjustment if we are enabling or the device is * suspended */ if (enable || !pm_runtime_active(&d->dev)) goto exit_unlock; /* full speed */ podgov->adjustment_frequency = df->max_freq; 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); }