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;
}
示例#2
0
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);
}
示例#4
0
static inline int pm8901_tm_write_ctrl(struct pm8901_chip *chip, u8 reg)
{
	int rc;

	rc = pm8901_write(chip, SSBI_REG_TEMP_ALRM_CTRL, &reg, 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(&reg, 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, &reg, 1);
	if (!rc)
		*reg_save = reg;
	return rc;
}
示例#7
0
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, &reg, 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;
}