if (pwrkey->shutdown_fn) {
error = pwrkey->shutdown_fn(pwrkey, reset); if (error) return;
}
/* * Select action to perform (reset or shutdown) when PS_HOLD goes low. * Also ensure that KPD, CBL0, and CBL1 pull ups are enabled and that * USB charging is enabled.
*/
mask = PON_CNTL_1_PULL_UP_EN | PON_CNTL_1_USB_PWR_EN;
mask |= PON_CNTL_1_WD_EN_RESET;
val = mask; if (!reset)
val &= ~PON_CNTL_1_WD_EN_RESET;
/* * Set an SMPS regulator to be disabled in its CTRL register, but enabled * in the master enable register. Also set it's pull down enable bit. * Take care to make sure that the output voltage doesn't change if switching * from advanced mode to legacy mode.
*/ staticint pm8058_disable_smps_locally_set_pull_down(struct regmap *regmap,
u16 ctrl_addr, u16 test2_addr, u16 master_enable_addr,
u8 master_enable_bit)
{ int error;
u8 vref_sel, vlow_sel, band, vprog, bank; unsignedint reg;
bank = PM8058_REGULATOR_BANK_SEL(7);
error = regmap_write(regmap, test2_addr, bank); if (error) return error;
error = regmap_read(regmap, test2_addr, ®); if (error) return error;
reg &= PM8058_SMPS_ADVANCED_MODE_MASK; /* Check if in advanced mode. */ if (reg == PM8058_SMPS_ADVANCED_MODE) { /* Determine current output voltage. */
error = regmap_read(regmap, ctrl_addr, ®); if (error) return error;
band = reg & PM8058_SMPS_ADVANCED_BAND_MASK;
band >>= PM8058_SMPS_ADVANCED_BAND_SHIFT; switch (band) { case 3:
vref_sel = 0;
vlow_sel = 0; break; case 2:
vref_sel = PM8058_SMPS_LEGACY_VREF_SEL;
vlow_sel = 0; break; case 1:
vref_sel = PM8058_SMPS_LEGACY_VREF_SEL;
vlow_sel = PM8058_SMPS_LEGACY_VLOW_SEL; break; default:
pr_err("%s: regulator already disabled\n", __func__); return -EPERM;
}
vprog = reg & PM8058_SMPS_ADVANCED_VPROG_MASK; /* Round up if fine step is in use. */
vprog = (vprog + 1) >> 1; if (vprog > PM8058_SMPS_LEGACY_VPROG_MASK)
vprog = PM8058_SMPS_LEGACY_VPROG_MASK;
/* Set VLOW_SEL bit. */
bank = PM8058_REGULATOR_BANK_SEL(1);
error = regmap_write(regmap, test2_addr, bank); if (error) return error;
/* When shutting down, enable active pulldowns on important rails. */ if (!reset) { /* Disable SMPS's 0,1,3 locally and set pulldown enable bits. */
pm8058_disable_smps_locally_set_pull_down(regmap,
PM8058_S0_CTRL, PM8058_S0_TEST2,
REG_PM8058_VREG_EN_MSM, BIT(7));
pm8058_disable_smps_locally_set_pull_down(regmap,
PM8058_S1_CTRL, PM8058_S1_TEST2,
REG_PM8058_VREG_EN_MSM, BIT(6));
pm8058_disable_smps_locally_set_pull_down(regmap,
PM8058_S3_CTRL, PM8058_S3_TEST2,
REG_PM8058_VREG_EN_GRP_5_4, BIT(7) | BIT(4)); /* Disable LDO 21 locally and set pulldown enable bit. */
pm8058_disable_ldo_locally_set_pull_down(regmap,
PM8058_L21_CTRL, REG_PM8058_VREG_EN_GRP_5_4,
BIT(1));
}
/* * Fix-up: Set regulator LDO22 to 1.225 V in high power mode. Leave its * pull-down state intact. This ensures a safe shutdown.
*/
error = regmap_update_bits(regmap, PM8058_L22_CTRL, 0xbf, 0x93); if (error) return error;
/* Enable SMPL if resetting is desired */
mask = SLEEP_CTRL_SMPL_EN_RESET;
val = 0; if (reset)
val = mask; return regmap_update_bits(regmap, PM8058_SLEEP_CTRL, mask, val);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.