static int pm8901_init_regulator(struct pm8901_chip *chip, struct pm8901_vreg *vreg) { int rc, i; u8 bank; if (vreg->type == REGULATOR_TYPE_LDO) { for (i = 0; i < LDO_TEST_BANKS; i++) { bank = REGULATOR_BANK_SEL(i); rc = pm8901_write(chip, vreg->test_addr, &bank, 1); if (rc) goto bail; rc = pm8901_read(chip, vreg->test_addr, &vreg->test_reg[i], 1); if (rc) goto bail; } } rc = pm8901_read(chip, vreg->ctrl_addr, &vreg->ctrl_reg, 1); if (rc) goto bail; rc = pm8901_read(chip, vreg->pmr_addr, &vreg->pmr_reg, 1); bail: if (rc) pr_err("%s: pm8901_read failed\n", __func__); return rc; }
int pm8901_reset_pwr_off(int reset) { int rc = 0, i; uint8_t pmr; uint8_t pmr_addr[4] = { SSBI_REG_ADDR_S2_PMR, SSBI_REG_ADDR_S3_PMR, SSBI_REG_ADDR_S4_PMR, SSBI_REG_ADDR_S1_PMR, }; /* Turn off regulators S1, S2, S3, S4 when shutting down. */ if (!reset) { for (i = 0; i < 4; i++) { rc = pm8901_read(&pmr, 1, pmr_addr[i]); if (rc) { goto get_out; } pmr &= ~REGULATOR_PMR_STATE_MASK; pmr |= REGULATOR_PMR_STATE_OFF; rc = pm8901_write(&pmr, 1, pmr_addr[i]); if (rc) { goto get_out; } } } get_out: return rc; }
/* * PMIC 8901 LDO vreg read. */ int pm8901_test_bank_read(uint8_t * buffer, uint8_t bank, uint16_t addr) { int ret = pm8901_write(&bank, 1, addr); /* if the write does not work we can't read. */ if (ret) { return ret; } return pm8901_read(buffer, 1, addr); }
static inline int pm8901_tm_write_ctrl(struct pm8901_chip *chip, u8 reg) { int rc; rc = pm8901_write(chip, SSBI_REG_TEMP_ALRM_CTRL, ®, 1); if (rc) pr_err("%s: pm8901_write FAIL: rc=%d\n", __func__, rc); return rc; }
/* * PMIC 8901 LDO vreg write. */ int pm8901_vreg_write(uint8_t * buffer, uint8_t mask, uint16_t addr, uint8_t prev_val) { uint8_t reg; /* Clear the bits we want to try and set. */ reg = (prev_val & ~mask); /* Set the bits we want to set, before writing them to addr */ reg |= (*buffer & mask); return pm8901_write(®, 1, addr); }
static int pm8901_vreg_write(struct pm8901_chip *chip, u16 addr, u8 val, u8 mask, u8 *reg_save) { int rc; u8 reg; reg = (*reg_save & ~mask) | (val & mask); rc = pm8901_write(chip, addr, ®, 1); if (!rc) *reg_save = reg; return rc; }
static int data_set(void *data, u64 val) { struct pm8901_dbg_device *dbgdev = data; u8 reg = val; int rc; mutex_lock(&dbgdev->dbg_mutex); rc = check_addr(dbgdev->addr, __func__); if (rc) goto done; rc = pm8901_write(dbgdev->pm_chip, dbgdev->addr, ®, 1); if (rc) pr_err("%s: FAIL pm8901_write(0x%03X)=0x%02X: rc=%d\n", __func__, dbgdev->addr, reg, rc); done: mutex_unlock(&dbgdev->dbg_mutex); return rc; }