static int d2041_regulator_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) { struct d2041 *d2041 = rdev_get_drvdata(rdev); int mV_val; int min_mV = uV_to_mV(min_uV); int max_mV = uV_to_mV(max_uV); unsigned int reg_num, regulator_id = rdev_get_id(rdev); u8 val; int ret = 0; /* before we do anything check the lock bit */ ret = d2041_reg_read(d2041, D2041_SUPPLY_REG, &val); if(val & D2041_SUPPLY_VLOCK) d2041_clear_bits(d2041, D2041_SUPPLY_REG, D2041_SUPPLY_VLOCK); mV_val = d2041_regulator_mvolts_to_val(min_mV, regulator_id, rdev); /* Sanity check for maximum value */ if (d2041_regulator_val_to_mvolts(mV_val, regulator_id, rdev) > max_mV) return -EINVAL; reg_num = get_regulator_reg(regulator_id); ret = d2041_reg_read(d2041, reg_num, &val); val &= ~D2041_MAX_VSEL; d2041_reg_write(d2041, reg_num, (val | mV_val)); /* For BUCKs enable the ramp */ if (regulator_id <= D2041_BUCK_4) d2041_set_bits(d2041, D2041_SUPPLY_REG, (D2041_SUPPLY_VBUCK1GO << regulator_id)); return ret; }
static unsigned int d2041_regulator_mvolts_to_val(int mV, int regulator_id, struct regulator_dev *rdev) { struct regulation_constraints *constraints = rdev->constraints; int min_mV = uV_to_mV(constraints->min_uV); if ( (regulator_id >= D2041_BUCK_1) && (regulator_id <= D2041_BUCK_4) ) return ((mV - min_mV) / D2041_BUCK_VOLT_STEP); return ((mV - min_mV) / D2041_LDO_VOLT_STEP); }
static int d2083_regulator_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV,unsigned *selector) { struct d2083 *d2083 = rdev_get_drvdata(rdev); int mV_val; int min_mV = uV_to_mV(min_uV); int max_mV = uV_to_mV(max_uV); unsigned int reg_num, regulator_id = rdev_get_id(rdev); u8 val; int ret = 0; *selector = -1; // Neet to implement parameter *selector : reference v_table / num_voltages /* before we do anything check the lock bit */ ret = d2083_reg_read(d2083, D2083_SUPPLY_REG, &val); if(val & D2083_SUPPLY_VLOCK) d2083_clear_bits(d2083, D2083_SUPPLY_REG, D2083_SUPPLY_VLOCK); mV_val = d2083_regulator_mvolts_to_val(min_mV, regulator_id, rdev); /* Sanity check for maximum value */ if (d2083_regulator_val_to_mvolts(mV_val, regulator_id, rdev) > max_mV) return -EINVAL; reg_num = get_regulator_reg(regulator_id); ret = d2083_reg_read(d2083, reg_num, &val); val &= ~D2083_MAX_VSEL; d2083_reg_write(d2083, reg_num, (val | mV_val)); /* For BUCKs enable the ramp */ if (regulator_id <= D2083_BUCK_4) d2083_set_bits(d2083, D2083_SUPPLY_REG, (D2083_SUPPLY_VBUCK1GO << regulator_id)); *selector = regulator_id; return ret; }
static int d2041_regulator_val_to_mvolts(unsigned int val, int regulator_id, struct regulator_dev *rdev) { struct regulation_constraints *constraints; int min_mV, mvolts; constraints = rdev->constraints; min_mV = uV_to_mV(constraints->min_uV); if ( (regulator_id >= D2041_BUCK_1) && (regulator_id <= D2041_BUCK_4) ) return ((val * D2041_BUCK_VOLT_STEP) + min_mV ); mvolts = (val * D2041_LDO_VOLT_STEP) + min_mV; if(mvolts > MAX_MILLI_VOLT) mvolts = MAX_MILLI_VOLT; return mvolts; }