static int tps80031_dcdc_set_voltage_sel(struct regulator_dev *rdev, unsigned vsel) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret; u8 reg_val; if (ri->rinfo->force_reg) { ret = tps80031_read(parent, ri->rinfo->volt_id, ri->rinfo->force_reg, ®_val); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", ri->rinfo->force_reg, ret); return ret; } if (!(reg_val & SMPS_CMD_MASK)) { ret = tps80031_update(parent, ri->rinfo->volt_id, ri->rinfo->force_reg, vsel, SMPS_VSEL_MASK); if (ret < 0) dev_err(ri->dev, "reg 0x%02x update failed, e = %d\n", ri->rinfo->force_reg, ret); return ret; } } ret = tps80031_update(parent, ri->rinfo->volt_id, ri->rinfo->volt_reg, vsel, SMPS_VSEL_MASK); if (ret < 0) dev_err(ri->dev, "reg 0x%02x update failed, e = %d\n", ri->rinfo->volt_reg, ret); return ret; }
static int tps80031_vbus_is_enabled(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret = -EIO; uint8_t ctrl1 = 0; uint8_t ctrl3 = 0; ret = tps80031_read(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL1, &ctrl1); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", TPS80031_CHARGERUSB_CTRL1, ret); return ret; } ret = tps80031_read(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL3, &ctrl3); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", TPS80031_CHARGERUSB_CTRL3, ret); return ret; } if ((ctrl1 & OPA_MODE_EN) && (ctrl3 & BOOST_HW_PWR_EN)) return 1; return ret; }
static int tps80031_dcdc_get_voltage_sel(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); uint8_t vsel = 0; int ret; if (ri->rinfo->force_reg) { ret = tps80031_read(parent, ri->rinfo->volt_id, ri->rinfo->force_reg, &vsel); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", ri->rinfo->force_reg, ret); return ret; } if (!(vsel & SMPS_CMD_MASK)) return vsel & SMPS_VSEL_MASK; } ret = tps80031_read(parent, ri->rinfo->volt_id, ri->rinfo->volt_reg, &vsel); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", ri->rinfo->volt_reg, ret); return ret; } return vsel & SMPS_VSEL_MASK; }
static int tps80031_ldo_set_voltage_sel(struct regulator_dev *rdev, unsigned sel) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret; /* Check for valid setting for TPS80031 or TPS80032-ES1.0 */ if ((ri->rinfo->desc.id == TPS80031_REGULATOR_LDO2) && (ri->device_flags & TRACK_MODE_ENABLE)) { unsigned nvsel = (sel) & 0x1F; if (((tps80031_get_chip_info(parent) == TPS80031) || ((tps80031_get_chip_info(parent) == TPS80032) && (tps80031_get_pmu_version(parent) == 0x0))) && ((nvsel == 0x0) || (nvsel >= 0x19 && nvsel <= 0x1F))) { dev_err(ri->dev, "Invalid sel %d in track mode LDO2\n", nvsel); return -EINVAL; } } ret = tps80031_write(parent, ri->rinfo->volt_id, ri->rinfo->volt_reg, sel); if (ret < 0) dev_err(ri->dev, "Error in writing reg 0x%02x, e = %d\n", ri->rinfo->volt_reg, ret); return ret; }
static int tps80031_vbus_is_enabled(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret = -EIO; uint8_t ctrl1 = 0; uint8_t ctrl3 = 0; ret = tps80031_read(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CT
static int tps80031_ldo_get_voltage_sel(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); uint8_t vsel; int ret; ret = tps80031_read(parent, ri->rinfo->volt_id, ri->rinfo->volt_reg, &vsel); if (ret < 0) { dev_err(ri->dev, "Error in writing the Voltage register\n"); return ret; } return vsel & rdev->desc->vsel_mask; }
static int tps80031_reg_disable(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret; if (ri->ext_ctrl_flag & TPS80031_EXT_PWR_REQ) return 0; ret = tps80031_update(parent, TPS80031_SLAVE_ID1, ri->rinfo->state_reg, TPS80031_STATE_OFF, TPS80031_STATE_MASK); if (ret < 0) dev_err(&rdev->dev, "Reg 0x%02x update failed, err = %d\n", ri->rinfo->state_reg, ret); return ret; }
static int tps80031_vbus_disable(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret = 0; if (ri->config_flags & TPS80031_VBUS_DISCHRG_EN_PDN) { ret = tps80031_write(parent, TPS80031_SLAVE_ID2, USB_VBUS_CTRL_SET, VBUS_DISCHRG); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x write failed, e = %d\n", USB_VBUS_CTRL_SET, ret); return ret; } } ret = tps80031_clr_bits(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL1, OPA_MODE_EN); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x clearbit failed, e = %d\n", TPS80031_CHARGERUSB_CTRL1, ret); return ret; } ret = tps80031_clr_bits(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL3, BOOST_HW_PWR_EN); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x clearbit failed, e = %d\n", TPS80031_CHARGERUSB_CTRL3, ret); return ret; } mdelay(DIV_ROUND_UP(ri->rinfo->desc.enable_time, 1000)); if (ri->config_flags & TPS80031_VBUS_DISCHRG_EN_PDN) { ret = tps80031_write(parent, TPS80031_SLAVE_ID2, USB_VBUS_CTRL_CLR, VBUS_DISCHRG); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x write failed, e = %d\n", USB_VBUS_CTRL_CLR, ret); return ret; } } return ret; }
static int tps80031_ldo_map_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); /* Check for valid setting for TPS80031 or TPS80032-ES1.0 */ if ((ri->rinfo->desc.id == TPS80031_REGULATOR_LDO2) && (ri->device_flags & TRACK_MODE_ENABLE)) { if (((tps80031_get_chip_info(parent) == TPS80031) || ((tps80031_get_chip_info(parent) == TPS80032) && (tps80031_get_pmu_version(parent) == 0x0)))) { return regulator_map_voltage_iterate(rdev, min_uV, max_uV); } } return regulator_map_voltage_linear(rdev, min_uV, max_uV); }
static int tps80031_reg_is_enabled(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); u8 reg_val; int ret; if (ri->ext_ctrl_flag & TPS80031_EXT_PWR_REQ) return true; ret = tps80031_read(parent, TPS80031_SLAVE_ID1, ri->rinfo->state_reg, ®_val); if (ret < 0) { dev_err(&rdev->dev, "Reg 0x%02x read failed, err = %d\n", ri->rinfo->state_reg, ret); return ret; } return ((reg_val & TPS80031_STATE_MASK) == TPS80031_STATE_ON); }
static int tps80031_vbus_enable(struct regulator_dev *rdev) { struct tps80031_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps80031_dev(rdev); int ret; ret = tps80031_set_bits(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL1, OPA_MODE_EN); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", TPS80031_CHARGERUSB_CTRL1, ret); return ret; } ret = tps80031_set_bits(parent, TPS80031_SLAVE_ID2, TPS80031_CHARGERUSB_CTRL3, BOOST_HW_PWR_EN); if (ret < 0) { dev_err(ri->dev, "reg 0x%02x read failed, e = %d\n", TPS80031_CHARGERUSB_CTRL3, ret); return ret; } return ret; }