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_power_req_config(struct device *parent, struct tps80031_regulator *ri, struct tps80031_regulator_platform_data *tps80031_pdata) { int ret = 0; if (ri->rinfo->preq_bit < 0) goto skip_pwr_req_config; ret = tps80031_ext_power_req_config(parent, ri->ext_ctrl_flag, ri->rinfo->preq_bit, ri->rinfo->state_reg, ri->rinfo->trans_reg); if (ret < 0) { dev_err(ri->dev, "ext powerreq config failed, err = %d\n", ret); return ret; } skip_pwr_req_config: if (tps80031_pdata->ext_ctrl_flag & TPS80031_PWR_ON_ON_SLEEP) { ret = tps80031_update(parent, TPS80031_SLAVE_ID1, ri->rinfo->trans_reg, TPS80031_TRANS_SLEEP_ON, TPS80031_TRANS_SLEEP_MASK); if (ret < 0) { dev_err(ri->dev, "Reg 0x%02x update failed, e %d\n", ri->rinfo->trans_reg, ret); return ret; } } return ret; }
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_regulator_config(struct device *parent, struct tps80031_regulator *ri, struct tps80031_regulator_platform_data *tps80031_pdata) { int ret = 0; switch (ri->rinfo->desc.id) { case TPS80031_REGULATOR_LDOUSB: if (ri->config_flags & (TPS80031_USBLDO_INPUT_VSYS | TPS80031_USBLDO_INPUT_PMID)) { unsigned val = 0; if (ri->config_flags & TPS80031_USBLDO_INPUT_VSYS) val = MISC2_LDOUSB_IN_VSYS; else val = MISC2_LDOUSB_IN_PMID; ret = tps80031_update(parent, TPS80031_SLAVE_ID1, TPS80031_MISC2, val, MISC2_LDOUSB_IN_MASK); if (ret < 0) { dev_err(ri->dev, "LDOUSB config failed, e= %d\n", ret); return ret; } } break; case TPS80031_REGULATOR_LDO3: if (ri->config_flags & TPS80031_LDO3_OUTPUT_VIB) { ret = tps80031_update(parent, TPS80031_SLAVE_ID1, TPS80031_MISC2, MISC2_LDO3_SEL_VIB_VAL, MISC2_LDO3_SEL_VIB_MASK); if (ret < 0) { dev_err(ri->dev, "LDO3 config failed, e = %d\n", ret); return ret; } } break; case TPS80031_REGULATOR_VBUS: /* Provide SW control Ops if VBUS is SW control */ if (!(ri->config_flags & TPS80031_VBUS_SW_ONLY)) ri->rinfo->desc.ops = &tps80031_vbus_sw_ops; break; default: break; } /* Configure Active state to ON, SLEEP to OFF and OFF_state to OFF */ ret = tps80031_update(parent, TPS80031_SLAVE_ID1, ri->rinfo->trans_reg, TPS80031_TRANS_ACTIVE_ON | TPS80031_TRANS_SLEEP_OFF | TPS80031_TRANS_OFF_OFF, TPS80031_TRANS_ACTIVE_MASK | TPS80031_TRANS_SLEEP_MASK | TPS80031_TRANS_OFF_MASK); if (ret < 0) { dev_err(ri->dev, "trans reg update failed, e %d\n", ret); return ret; } return ret; }
static int set_charge_current_limit(struct regulator_dev *rdev, int min_uA, int max_uA) { struct tps80031_charger *charger = rdev_get_drvdata(rdev); int max_vbus_current = 1500; int max_charge_current = 1500; int ret; dev_info(charger->dev, "%s(): Min curr %dmA and max current %dmA\n", __func__, min_uA/1000, max_uA/1000); if (!max_uA) { ret = tps80031_write(charger->dev->parent, SLAVE_ID2, CONTROLLER_CTRL1, 0x0); if (ret < 0) dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CONTROLLER_CTRL1); ret = tps80031_write(charger->dev->parent, SLAVE_ID2, CONTROLLER_WDG, 0x0); if (ret < 0) dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CONTROLLER_WDG); charger->state = charging_state_charging_stopped; if (charger->charger_cb) charger->charger_cb(charger->state, charger->charger_cb_data); return ret; } max_vbus_current = min(max_uA/1000, max_vbus_current); max_vbus_current = max_vbus_current/50; if (max_vbus_current) max_vbus_current--; ret = tps80031_update(charger->dev->parent, SLAVE_ID2, CHARGERUSB_CINLIMIT, charging_current_val_code[max_vbus_current], 0x3F); if (ret < 0) { dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CHARGERUSB_CINLIMIT); return ret; } max_charge_current = min(max_uA/1000, max_charge_current); if (max_charge_current <= 300) max_charge_current = 0; else if ((max_charge_current > 300) && (max_charge_current <= 500)) max_charge_current = (max_charge_current - 300)/50; else max_charge_current = (max_charge_current - 500) / 100 + 4; ret = tps80031_update(charger->dev->parent, SLAVE_ID2, CHARGERUSB_VICHRG, (uint8_t)max_charge_current, 0xF); if (ret < 0) { dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CHARGERUSB_VICHRG); return ret; } /* Enable watchdog timer */ ret = tps80031_write(charger->dev->parent, SLAVE_ID2, CONTROLLER_WDG, charger->watch_time_sec); if (ret < 0) { dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CONTROLLER_WDG); return ret; } /* Enable the charging */ ret = tps80031_write(charger->dev->parent, SLAVE_ID2, CONTROLLER_CTRL1, 0x30); if (ret < 0) { dev_err(charger->dev, "%s(): Failed in writing register 0x%02x\n", __func__, CONTROLLER_CTRL1); return ret; } charger->state = charging_state_charging_in_progress; if (charger->charger_cb) charger->charger_cb(charger->state, charger->charger_cb_data); return 0; }