int axp209_set_dcdc2(int mvolt) { int cfg = (mvolt - 700) / 25; int rc; u8 current; if (cfg < 0) cfg = 0; if (cfg > (1 << 6) - 1) cfg = (1 << 6) - 1; /* Do we really need to be this gentle? It has built-in voltage slope */ while ((rc = axp209_read(AXP209_DCDC2_VOLTAGE, ¤t)) == 0 && current != cfg) { if (current < cfg) current++; else current--; rc = axp209_write(AXP209_DCDC2_VOLTAGE, current); if (rc) break; } return rc; }
int axp209_set_ldo4(int mvolt) { int cfg = (mvolt - 1800) / 100; int rc; static const int vindex[] = { 1250, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2500, 2700, 2800, 3000, 3100, 3200, 3300 }; u8 reg; /* Translate mvolt to register cfg value, requested <= selected */ for (cfg = 0; mvolt < vindex[cfg] && cfg < 15; cfg++); rc = axp209_read(AXP209_LDO24_VOLTAGE, ®); if (rc) return rc; /* LDO4 configuration is in lower 4 bits */ reg = (reg & 0xf0) | (cfg << 0); rc = axp209_write(AXP209_LDO24_VOLTAGE, reg); if (rc) return rc; return 0; }
int axp209_poweron_by_dc(void) { u8 v; if (axp209_read(AXP209_POWER_STATUS, &v)) return 0; return (v & AXP209_POWER_STATUS_ON_BY_DC); }
int axp209_power_button(void) { u8 v; if (axp209_read(AXP209_IRQ_STATUS5, &v)) return 0; axp209_write(AXP209_IRQ_STATUS5, AXP209_IRQ5_PEK_DOWN); return v & AXP209_IRQ5_PEK_DOWN; }
int axp209_init(void) { u8 ver; int rc; rc = axp209_read(AXP209_CHIP_VERSION, &ver); if (rc) return rc; return 0; }
void axp209_poweroff(void) { u8 val; if (axp209_read(AXP209_SHUTDOWN, &val) != 0) return; val |= 1 << 7; if (axp209_write(AXP209_SHUTDOWN, val) != 0) return; udelay(10000); /* wait for power to drain */ }
int axp209_set_dcdc3(int mvolt) { int cfg = (mvolt - 700) / 25; u8 reg; int rc; if (cfg < 0) cfg = 0; if (cfg > (1 << 7) - 1) cfg = (1 << 7) - 1; rc = axp209_write(AXP209_DCDC3_VOLTAGE, cfg); rc |= axp209_read(AXP209_DCDC3_VOLTAGE, ®); return rc; }
int axp209_init(void) { u8 ver; int rc; rc = axp209_read(AXP209_CHIP_VERSION, &ver); if (rc) return rc; /* Low 4 bits is chip version */ ver &= 0x0f; if (ver != 0x1) return -1; return 0; }
int axp209_set_ldo2(int mvolt) { int cfg = (mvolt - 1800) / 100; int rc; u8 reg; if (cfg < 0) cfg = 0; if (cfg > 15) cfg = 15; rc = axp209_read(AXP209_LDO24_VOLTAGE, ®); if (rc) return rc; reg = (reg & 0x0f) | (cfg << 4); rc = axp209_write(AXP209_LDO24_VOLTAGE, reg); if (rc) return rc; return 0; }