Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6da09c45 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "clk: qcom: gdsc-regulator: Extend the support for ACD reset"

parents e43996e3 2cc43ca9
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -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;
@@ -195,6 +197,13 @@ static int gdsc_enable(struct regulator_dev *rdev)
			regmap_read(sc->sw_reset, REG_OFFSET, &regval);
			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.
@@ -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);
		}
@@ -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,
@@ -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");