/** * sr_class1p5_reset_calib() - reset all calibrated voltages * @voltdm: configure for which voltage domain * @reset: reset voltage before we recal? * @recal: should I recalibrate my current opp? * * if we call this, it means either periodic calibration trigger was * fired(either from sysfs or other mechanisms) or we have disabled class 1p5, * meaning we cant trust the calib voltages anymore, it is better to use * nominal in the system */ static void sr_class1p5_reset_calib(struct voltagedomain *voltdm, bool reset, bool recal) { struct sr_class1p5_work_data *work_data; /* I dont need to go further if sr is not present */ if (!is_sr_enabled(voltdm)) return; work_data = get_sr1p5_work(voltdm); if (work_data->work_active) sr_class1p5_disable(voltdm, work_data->vdata, 0); omap_voltage_calib_reset(voltdm); /* * I should now reset the voltages to my nominal to be safe */ if (reset) omap_voltage_reset(voltdm); /* * I should fire a recalibration for current opp if needed * Note: i have just reset my calibrated voltages, and if * i call sr_enable equivalent, I will cause a recalibration * loop, even though the function is called sr_enable.. we * are in class 1.5 ;) */ if (reset && recal) sr_class1p5_enable(voltdm, work_data->vdata); }
static int sr_class3_disable(struct voltagedomain *voltdm, int is_volt_reset) { omap_vp_disable(voltdm); sr_disable(voltdm); if (is_volt_reset) omap_voltage_reset(voltdm); return 0; }
/** * sr_class1p5_disable() - disable for class 1p5 * @voltdm: voltage domain for the sr which needs disabling * @volt_data: voltagedata to disable * @is_volt_reset: reset the voltage? * * we dont do anything if the class 1p5 is being used. this is because we * already disable sr at the end of calibration and no h/w loop is actually * active when this is called. */ static int sr_class1p5_disable(struct voltagedomain *voltdm, struct omap_volt_data *volt_data, int is_volt_reset) { struct sr_class1p5_work_data *work_data; if (IS_ERR_OR_NULL(voltdm) || IS_ERR_OR_NULL(volt_data)) { pr_err("%s: bad parameters!\n", __func__); return -EINVAL; } work_data = get_sr1p5_work(voltdm); if (work_data->work_active) { /* if volt reset and work is active, we dont allow this */ if (is_volt_reset) return -EBUSY; /* flag work is dead and remove the old work */ work_data->work_active = false; cancel_delayed_work_sync(&work_data->work); sr_notifier_control(voltdm, false); omap_vp_disable(voltdm); sr_disable(voltdm); /* Release c-state constraint */ omap_pm_set_max_mpu_wakeup_lat(&work_data->qos_request, -1); pr_debug("%s - %s: release c-state\n", __func__, voltdm->name); } /* if already calibrated, nothin special to do here.. */ if (volt_data->volt_calibrated) return 0; if (is_volt_reset) omap_voltage_reset(voltdm); return 0; }