Loading drivers/clk/qcom/gdsc-regulator.c +35 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,8 @@ struct gdsc { struct regmap *domain_addr; struct regmap *hw_ctrl; struct regmap *sw_reset; struct regmap *acd_reset; struct regmap *acd_misc_reset; struct collapse_vote collapse_vote; struct clk **clocks; struct reset_control **reset_clocks; Loading Loading @@ -195,6 +197,13 @@ static int gdsc_enable(struct regulator_dev *rdev) regmap_read(sc->sw_reset, REG_OFFSET, ®val); regval |= BCR_BLK_ARES_BIT; regmap_write(sc->sw_reset, REG_OFFSET, regval); if (sc->acd_reset) regmap_write(sc->acd_reset, REG_OFFSET, regval); if (sc->acd_misc_reset) regmap_write(sc->acd_misc_reset, REG_OFFSET, regval); /* * BLK_ARES should be kept asserted for 1us before * being de-asserted. Loading @@ -204,6 +213,13 @@ static int gdsc_enable(struct regulator_dev *rdev) regval &= ~BCR_BLK_ARES_BIT; regmap_write(sc->sw_reset, REG_OFFSET, regval); if (sc->acd_reset) regmap_write(sc->acd_reset, REG_OFFSET, regval); if (sc->acd_misc_reset) regmap_write(sc->acd_misc_reset, REG_OFFSET, regval); /* Make sure de-assert goes through before continuing */ gdsc_mb(sc); } Loading Loading @@ -357,6 +373,12 @@ static int gdsc_disable(struct regulator_dev *rdev) udelay(1); if (sc->toggle_logic) { if (sc->sw_reset) { if (sc->acd_misc_reset) regmap_update_bits(sc->acd_misc_reset, REG_OFFSET, BCR_BLK_ARES_BIT, BCR_BLK_ARES_BIT); } /* Disable gdsc */ if (sc->collapse_vote.regmap) { regmap_update_bits(sc->collapse_vote.regmap, REG_OFFSET, Loading Loading @@ -582,6 +604,19 @@ static int gdsc_parse_dt_data(struct gdsc *sc, struct device *dev, return PTR_ERR(sc->sw_reset); } if (of_find_property(dev->of_node, "acd-reset", NULL)) { sc->acd_reset = syscon_regmap_lookup_by_phandle(dev->of_node, "acd-reset"); if (IS_ERR(sc->acd_reset)) return PTR_ERR(sc->acd_reset); } if (of_find_property(dev->of_node, "acd-misc-reset", NULL)) { sc->acd_misc_reset = syscon_regmap_lookup_by_phandle(dev->of_node, "acd-misc-reset"); if (IS_ERR(sc->acd_misc_reset)) return PTR_ERR(sc->acd_misc_reset); } if (of_find_property(dev->of_node, "hw-ctrl-addr", NULL)) { sc->hw_ctrl = syscon_regmap_lookup_by_phandle(dev->of_node, "hw-ctrl-addr"); Loading Loading
drivers/clk/qcom/gdsc-regulator.c +35 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,8 @@ struct gdsc { struct regmap *domain_addr; struct regmap *hw_ctrl; struct regmap *sw_reset; struct regmap *acd_reset; struct regmap *acd_misc_reset; struct collapse_vote collapse_vote; struct clk **clocks; struct reset_control **reset_clocks; Loading Loading @@ -195,6 +197,13 @@ static int gdsc_enable(struct regulator_dev *rdev) regmap_read(sc->sw_reset, REG_OFFSET, ®val); regval |= BCR_BLK_ARES_BIT; regmap_write(sc->sw_reset, REG_OFFSET, regval); if (sc->acd_reset) regmap_write(sc->acd_reset, REG_OFFSET, regval); if (sc->acd_misc_reset) regmap_write(sc->acd_misc_reset, REG_OFFSET, regval); /* * BLK_ARES should be kept asserted for 1us before * being de-asserted. Loading @@ -204,6 +213,13 @@ static int gdsc_enable(struct regulator_dev *rdev) regval &= ~BCR_BLK_ARES_BIT; regmap_write(sc->sw_reset, REG_OFFSET, regval); if (sc->acd_reset) regmap_write(sc->acd_reset, REG_OFFSET, regval); if (sc->acd_misc_reset) regmap_write(sc->acd_misc_reset, REG_OFFSET, regval); /* Make sure de-assert goes through before continuing */ gdsc_mb(sc); } Loading Loading @@ -357,6 +373,12 @@ static int gdsc_disable(struct regulator_dev *rdev) udelay(1); if (sc->toggle_logic) { if (sc->sw_reset) { if (sc->acd_misc_reset) regmap_update_bits(sc->acd_misc_reset, REG_OFFSET, BCR_BLK_ARES_BIT, BCR_BLK_ARES_BIT); } /* Disable gdsc */ if (sc->collapse_vote.regmap) { regmap_update_bits(sc->collapse_vote.regmap, REG_OFFSET, Loading Loading @@ -582,6 +604,19 @@ static int gdsc_parse_dt_data(struct gdsc *sc, struct device *dev, return PTR_ERR(sc->sw_reset); } if (of_find_property(dev->of_node, "acd-reset", NULL)) { sc->acd_reset = syscon_regmap_lookup_by_phandle(dev->of_node, "acd-reset"); if (IS_ERR(sc->acd_reset)) return PTR_ERR(sc->acd_reset); } if (of_find_property(dev->of_node, "acd-misc-reset", NULL)) { sc->acd_misc_reset = syscon_regmap_lookup_by_phandle(dev->of_node, "acd-misc-reset"); if (IS_ERR(sc->acd_misc_reset)) return PTR_ERR(sc->acd_misc_reset); } if (of_find_property(dev->of_node, "hw-ctrl-addr", NULL)) { sc->hw_ctrl = syscon_regmap_lookup_by_phandle(dev->of_node, "hw-ctrl-addr"); Loading