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

Commit 4f205687 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: extract common CPU reset code into separate function



platform_restart implementatations do the same thing to reset CPU.
Don't duplicate that code, move it to a function and call it from
platform_restart.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 23c2b932
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -69,4 +69,10 @@ extern int platform_pcibios_fixup (void);
 */
extern void platform_calibrate_ccount (void);

/*
 * Flush and reset the mmu, simulate a processor reset, and
 * jump to the reset vector.
 */
void cpu_reset(void) __attribute__((noreturn));

#endif	/* _XTENSA_PLATFORM_H */
+23 −0
Original line number Diff line number Diff line
@@ -549,6 +549,29 @@ static int __init topology_init(void)
}
subsys_initcall(topology_init);

void cpu_reset(void)
{
	__asm__ __volatile__ ("movi	a2, 15\n\t"
			      "wsr	a2, icountlevel\n\t"
			      "movi	a2, 0\n\t"
			      "wsr	a2, icount\n\t"
#if XCHAL_NUM_IBREAK > 0
			      "wsr	a2, ibreakenable\n\t"
#endif
#if XCHAL_HAVE_LOOPS
			      "wsr	a2, lcount\n\t"
#endif
			      "movi	a2, 0x1f\n\t"
			      "wsr	a2, ps\n\t"
			      "isync\n\t"
			      "jx	%0\n\t"
			      :
			      : "a" (XCHAL_RESET_VECTOR_VADDR)
			      : "a2");
	for (;;)
		;
}

void machine_restart(char * cmd)
{
	platform_restart();
+1 −19
Original line number Diff line number Diff line
@@ -53,25 +53,7 @@ void platform_restart(void)
{
	/* Flush and reset the mmu, simulate a processor reset, and
	 * jump to the reset vector. */

	__asm__ __volatile__("movi	a2, 15\n\t"
			     "wsr	a2, icountlevel\n\t"
			     "movi	a2, 0\n\t"
			     "wsr	a2, icount\n\t"
#if XCHAL_NUM_IBREAK > 0
			     "wsr	a2, ibreakenable\n\t"
#endif
#if XCHAL_HAVE_LOOPS
			     "wsr	a2, lcount\n\t"
#endif
			     "movi	a2, 0x1f\n\t"
			     "wsr	a2, ps\n\t"
			     "isync\n\t"
			     "jx	%0\n\t"
			     :
			     : "a" (XCHAL_RESET_VECTOR_VADDR)
			     : "a2");

	cpu_reset();
	/* control never gets here */
}

+1 −20
Original line number Diff line number Diff line
@@ -64,26 +64,7 @@ void platform_restart(void)
{
	/* Flush and reset the mmu, simulate a processor reset, and
	 * jump to the reset vector. */

	__asm__ __volatile__ ("movi	a2, 15\n\t"
			      "wsr	a2, icountlevel\n\t"
			      "movi	a2, 0\n\t"
			      "wsr	a2, icount\n\t"
#if XCHAL_NUM_IBREAK > 0
			      "wsr	a2, ibreakenable\n\t"
#endif
#if XCHAL_HAVE_LOOPS
			      "wsr	a2, lcount\n\t"
#endif
			      "movi	a2, 0x1f\n\t"
			      "wsr	a2, ps\n\t"
			      "isync\n\t"
			      "jx	%0\n\t"
			      :
			      : "a" (XCHAL_RESET_VECTOR_VADDR)
			      : "a2"
			      );

	cpu_reset();
	/* control never gets here */
}

+1 −21
Original line number Diff line number Diff line
@@ -54,27 +54,7 @@ void platform_restart(void)
{
	/* Flush and reset the mmu, simulate a processor reset, and
	 * jump to the reset vector. */


	__asm__ __volatile__ ("movi	a2, 15\n\t"
			      "wsr	a2, icountlevel\n\t"
			      "movi	a2, 0\n\t"
			      "wsr	a2, icount\n\t"
#if XCHAL_NUM_IBREAK > 0
			      "wsr	a2, ibreakenable\n\t"
#endif
#if XCHAL_HAVE_LOOPS
			      "wsr	a2, lcount\n\t"
#endif
			      "movi	a2, 0x1f\n\t"
			      "wsr	a2, ps\n\t"
			      "isync\n\t"
			      "jx	%0\n\t"
			      :
			      : "a" (XCHAL_RESET_VECTOR_VADDR)
			      : "a2"
			      );

	cpu_reset();
	/* control never gets here */
}