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; }
static int data_get(void *data, u64 *val) { struct pm8901_dbg_device *dbgdev = data; int rc; u8 reg; mutex_lock(&dbgdev->dbg_mutex); rc = check_addr(dbgdev->addr, __func__); if (rc) goto done; rc = pm8901_read(dbgdev->pm_chip, dbgdev->addr, ®, 1); if (rc) { pr_err("%s: FAIL pm8901_read(0x%03X)=0x%02X: rc=%d\n", __func__, dbgdev->addr, reg, rc); goto done; } *val = reg; done: mutex_unlock(&dbgdev->dbg_mutex); 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_read_ctrl(struct pm8901_chip *chip, u8 *reg) { int rc; rc = pm8901_read(chip, SSBI_REG_TEMP_ALRM_CTRL, reg, 1); if (rc) pr_err("%s: pm8901_read FAIL: rc=%d\n", __func__, rc); return rc; }
static int lcd_power_on() { uint8_t buffer = 0x0, mask = 0x0, prev_val = 0x0; int ret = 0; /* Configure LDO L2 TEST Bank 2, to Range Select 0 */ /* Not updating reference voltage */ buffer = (0x80); /* Write mode */ buffer |= (PM8901_LDO_TEST_BANK(2)); /* Test Bank 2 */ mask = buffer | LDO_TEST_RANGE_SELECT_MASK; if ((ret = pm8901_test_bank_read(&prev_val, PM8901_LDO_TEST_BANK(2), PM8901_LDO_L2_TEST_BANK))) { return ret; } if ((ret = pm8901_vreg_write(&buffer, mask, PM8901_LDO_L2_TEST_BANK, prev_val))) { return ret; } /* Enable LDO L2 at Max Voltage (should be around 3.3v) */ buffer = (0x0 << PM8901_LDO_CTL_ENABLE__S); /* Disable Pull Down */ buffer |= (0x1 << PM8901_LDO_CTL_PULL_DOWN__S); /* Put LDO into normal mode instead of low power mode */ buffer |= (0x0 << PM8901_LDO_CTL_MODE__S); /* Set voltage programming to 3.3V or 2.85V(8660 fluid) */ if (board_machtype() == LINUX_MACHTYPE_8660_FLUID) buffer |= (0xB); else buffer |= (0xF); mask = buffer | LDO_CTL_ENABLE_MASK | LDO_CTL_PULL_DOWN_MASK | LDO_CTL_NORMAL_POWER_MODE_MASK | LDO_CTL_VOLTAGE_SET_MASK; /* Do a normal read here, as to not destroy the value in LDO control */ if ((ret = pm8901_read(&prev_val, 1, PM8901_LDO_L2))) { return ret; } /* Configure the LDO2 for 3.3V or 2.85V(8660 fluid) */ ret = pm8901_vreg_write(&buffer, mask, PM8901_LDO_L2, prev_val); /* Configure LDO L2 TEST Bank 4, for High Range Mode */ buffer = (0x80); /* Write mode */ buffer |= (PM8901_LDO_TEST_BANK(4)); /* Test Bank 4 */ buffer |= (0x01); /* Put into High Range Mode */ mask = buffer | LDO_TEST_OUTPUT_RANGE_MASK; if ((ret = pm8901_test_bank_read(&prev_val, PM8901_LDO_TEST_BANK(4), PM8901_LDO_L2_TEST_BANK))) { return ret; } if ((ret = pm8901_vreg_write(&buffer, mask, PM8901_LDO_L2_TEST_BANK, prev_val))) { return ret; } /* Configure LDO L2 TEST Bank 2, to Range Select 0 */ buffer = (0x80); /* Write mode */ buffer |= (PM8901_LDO_TEST_BANK(2)); /* Test Bank 2 */ buffer |= (1<<1); /* For fine step 50 mV */ buffer |= (1<<3); /* to update reference voltage */ mask = buffer | LDO_TEST_RANGE_SELECT_MASK; mask |= (1<<2); /* Setting mask to make ref voltage as 1.25 V */ if ((ret = pm8901_test_bank_read(&prev_val, PM8901_LDO_TEST_BANK(2), PM8901_LDO_L2_TEST_BANK))) { return ret; } if ((ret = pm8901_vreg_write(&buffer, mask, PM8901_LDO_L2_TEST_BANK, prev_val))) { return ret; } /* Enable PMR for LDO L2 */ buffer = 0x7F; mask = 0x7F; if ((ret = pm8901_read(&prev_val, 1, PM8901_PMR_7))) { return ret; } ret = pm8901_vreg_write(&buffer, mask, PM8901_PMR_7, prev_val); return ret; }