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

Commit efe4e06d authored by Nishanth Menon's avatar Nishanth Menon Committed by Kevin Hilman
Browse files

PM / AVS: SmartReflex: disable errgen before vpbound disable



vpboundsintr_en is available inside the IP block as an re-sycned
version and one which is not. Due to this, there is an 1 sysclk
cycle window where the SR_SInterruptz signal could be asserted low.
IF, intr_en is cleared on the exact same cycle as the irqclr, an
additional pulse is generated which indicates for VP that
an additional adjustment of voltage is required.

This results in VP doing two voltage adjustments for the SRERR
(based on configuration, upto 4 steps), instead of the needed
1 step.
Due to the unexpected pulse from AVS which breaks the AVS-VP
communication protocol, VP also ends up in a stuck condition by
entering a state where VP module remains non-responsive
to any futher AVS adjustment events. This creates the symptom
called "TRANXDONE Timeout" scenario.

By disabling errgen prior to disable of intr_en, this situation
can be avoided.

Signed-off-by: default avatarVincent Bour <v-bour@ti.com>
Signed-off-by: default avatarLeonardo Affortunati <l-affortunati@ti.com>
Signed-off-by: default avatarNishanth Menon <nm@ti.com>
Signed-off-by: default avatarAndrii.Tseglytskyi <andrii.tseglytskyi@ti.com>
Signed-off-by: default avatarKevin Hilman <khilman@linaro.org>
parent 317ddd25
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -449,12 +449,17 @@ int sr_disable_errgen(struct voltagedomain *voltdm)
		return -EINVAL;
	}

	/* Disable the interrupts of ERROR module */
	sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0);

	/* Disable the Sensor and errorgen */
	sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0);

	/*
	 * Disable the interrupts of ERROR module
	 * NOTE: modify is a read, modify,write - an implicit OCP barrier
	 * which is required is present here - sequencing is critical
	 * at this point (after errgen is disabled, vpboundint disable)
	 */
	sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0);

	return 0;
}