int da9053_suspend_cmd_sw(void) { unsigned char buf[2] = {0, 0}; struct clk *i2c_clk; u8 data; buf[0] = 29; i2c_clk = clk_get(NULL, "i2c_clk"); if (IS_ERR(i2c_clk)) { pr_err("unable to get i2c clk\n"); return PTR_ERR(i2c_clk); } clk_enable(i2c_clk); pm_da9053_preset_voltage(); pm_da9053_read_reg(DA9052_ID01_REG, &data); data &= ~(DA9052_ID01_DEFSUPPLY | DA9052_ID01_nRESMODE); pm_da9053_write_reg(DA9052_ID01_REG, data); pm_da9053_write_reg(DA9052_SEQB_REG, DA9053_SLEEP_DELAY); pm_da9053_read_reg(DA9052_CONTROLB_REG, &data); data |= DA9052_CONTROLB_DEEPSLEEP; pm_da9053_write_reg(DA9052_CONTROLB_REG, data); clk_disable(i2c_clk); clk_put(i2c_clk); return 0; }
int da9053_suspend_cmd_hw(void) { unsigned char buf[2] = {0, 0}; struct clk *i2c_clk; u8 data; buf[0] = 29; i2c_clk = clk_get(NULL, "i2c_clk"); if (IS_ERR(i2c_clk)) { pr_err("unable to get i2c clk\n"); return PTR_ERR(i2c_clk); } clk_enable(i2c_clk); pm_da9053_read_reg(DA9052_IRQMASKB_REG, &data); data |= DA9052_IRQ_MASKB_ONKEY; pm_da9053_write_reg(DA9052_IRQMASKB_REG, data); pm_da9053_preset_voltage(); pm_da9053_write_reg(DA9052_CONTROLC_REG, DA9052_CONTROLC_SMD_SET); pm_da9053_read_reg(DA9052_ID01_REG, &data); data &= ~(DA9052_ID01_DEFSUPPLY | DA9052_ID01_nRESMODE); pm_da9053_write_reg(DA9052_ID01_REG, data); pm_da9053_write_reg(DA9052_GPIO0809_REG, DA9052_GPIO0809_SMD_SET); pm_da9053_read_reg(DA9052_IRQMASKD_REG, &data); data |= DA9052_GPI9_IRQ_MASK; pm_da9053_write_reg(DA9052_IRQMASKD_REG, data); pm_da9053_read_reg(DA9052_ID1415_REG, &data); data &= 0xf0; data |= DA9052_ID1415_SMD_SET; pm_da9053_write_reg(DA9052_ID1415_REG, data); pm_da9053_write_reg(DA9052_SEQTIMER_REG, 0); /* pm_da9053_write_reg(DA9052_SEQB_REG, 0x1f); */ pm_da9053_read_reg(DA9052_IRQMASKB_REG, &data); data &= ~DA9052_IRQ_MASKB_ONKEY; pm_da9053_write_reg(DA9052_IRQMASKB_REG, data); clk_disable(i2c_clk); clk_put(i2c_clk); return 0; }
static void pm_da9053_dump(int start, int end) { u8 reg, data; for (reg = start; reg <= end; reg++) { pm_da9053_read_reg(reg, &data); pr_info("reg %u = 0x%2x\n", reg, data); } }
static void pm_da9053_preset_voltage(void) { u8 reg, data; for (reg = DA9052_BUCKCORE_REG; reg <= DA9052_LDO10_REG; reg++) { pm_da9053_read_reg(reg, &data); volt_settings[reg - DA9052_BUCKCORE_REG] = data; data |= CONF_BIT; pm_da9053_write_reg(reg, data); } pm_da9053_write_reg(DA9052_BUCKCORE_REG, BUCKCORE_SUSPEND_PRESET); pm_da9053_write_reg(DA9052_BUCKPRO_REG, BUCKPRO_SUSPEND_PRESET); pm_da9053_write_reg(DA9052_LDO6_REG, LDO6_SUSPEND_PRESET); pm_da9053_write_reg(DA9052_LDO10_REG, iLDO10_SUSPEND_PRESET); }
int da9053_restore_volt_settings(void) { u8 data; struct clk *i2c_clk; i2c_clk = clk_get(NULL, "i2c_clk"); if (IS_ERR(i2c_clk)) { pr_err("unable to get i2c clk\n"); return PTR_ERR(i2c_clk); } clk_enable(i2c_clk); pm_da9053_write_reg(DA9052_ID1213_REG, BUCKPERI_RESTORE_SW_STEP); pm_da9053_read_reg(DA9052_SUPPLY_REG, &data); data |= SUPPLY_RESTORE_VPERISW_EN; pm_da9053_write_reg(DA9052_SUPPLY_REG, data); clk_disable(i2c_clk); clk_put(i2c_clk); return 0; }
int da9053_poweroff_cmd(void) { unsigned char buf[2] = {0, 0}; struct clk *i2c_clk; u8 data; buf[0] = 29; i2c_clk = clk_get(NULL, "i2c_clk"); if (IS_ERR(i2c_clk)) { pr_err("unable to get i2c clk\n"); return PTR_ERR(i2c_clk); } clk_enable(i2c_clk); pm_da9053_read_reg(DA9052_CONTROLB_REG, &data); data |= DA9052_CONTROLB_SHUTDOWN; pm_da9053_write_reg(DA9052_CONTROLB_REG, data); clk_disable(i2c_clk); clk_put(i2c_clk); return 0; }