int msm_spm_set_vdd(unsigned int cpu, unsigned int vlevel) { struct msm_spm_vdd_info info; int ret; info.cpu = cpu; info.vlevel = vlevel; if ((smp_processor_id() != cpu) && cpu_online(cpu)) { /** * We do not want to set the voltage of another core from * this core, as its possible that we may race the vdd change * with the SPM state machine of that core, which could also * be changing the voltage of that core during power collapse. * Hence, set the function to be executed on that core and block * until the vdd change is complete. */ ret = smp_call_function_single(cpu, msm_spm_smp_set_vdd, &info, true); if (!ret) ret = info.err; } else { /** * Since the core is not online, it is safe to set the vdd * directly. */ msm_spm_smp_set_vdd(&info); ret = info.err; } return ret; }
int msm_spm_set_vdd(unsigned int cpu, unsigned int vlevel) { struct msm_spm_vdd_info info; int ret; info.cpu = cpu; info.vlevel = vlevel; info.err = -ENODEV; if (!msm_spm_L2_apcs_master && (smp_processor_id() != cpu) && cpu_online(cpu)) { ret = smp_call_function_single(cpu, msm_spm_smp_set_vdd, &info, true); if (!ret) ret = info.err; } else { msm_spm_smp_set_vdd(&info); ret = info.err; } return ret; }