rcar_gen3: drivers: delay: Rewrite from assembler to C

Rewrite the delay code from assembler to C.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
diff --git a/drivers/renesas/rcar/delay/micro_delay.S b/drivers/renesas/rcar/delay/micro_delay.S
deleted file mode 100644
index 978973c..0000000
--- a/drivers/renesas/rcar/delay/micro_delay.S
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch.h>
-#include <asm_macros.S>
-#include "micro_delay.h"
-
-#define CPG_BASE		(0xE6150000)
-#define CPG_SMSTPCR1		(0x0134)
-#define CPG_CPGWPR		(0x0900)
-
-/* Module bit for TMU ch3-5 */
-#define MSTPCR1_TMU1		(1 << 24)
-
-#define TMU3_BASE		(0xE6FC0000)
-#define TMU_TSTR		(0x0004)
-#define TMU_TCOR		(0x0008)
-#define TMU_TCNT		(0x000C)
-#define TMU_TCR		(0x0010)
-/* Start bit for TMU ch3 */
-#define TSTR1_TMU3		(1 << 0)
-
-#define MIDR_CA57		(0x0D07 << MIDR_PN_SHIFT)
-#define MIDR_CA53		(0x0D03 << MIDR_PN_SHIFT)
-
-	.globl	rcar_micro_delay
-#if (TMU3_MEASUREMENT == 1)
-	.globl	tmu3_init
-	.globl	tmu3_start
-	.globl	tmu3_stop
-	.globl	tcnt3_snapshot
-#endif
-	/* Aligned with the cache line */
-	.align	6
-
-func rcar_micro_delay
-	cbz	x0, micro_delay_e
-	mrs	x1, midr_el1
-	and	x1, x1, #MIDR_PN_MASK << MIDR_PN_SHIFT
-	mov	w2, #MIDR_CA53
-	cmp	w1, w2
-	b.eq	micro_delay_ca53
-	b	micro_delay_ca57
-micro_delay_e:
-	ret
-endfunc rcar_micro_delay
-
-func micro_delay_ca57
-ca57_loop_1:
-	mov	x1, #185
-ca57_loop_2:
-	subs	x1, x1, #1
-	b.ne	ca57_loop_2
-	subs	x0, x0, #1
-	b.ne	ca57_loop_1
-	ret
-endfunc micro_delay_ca57
-
-func micro_delay_ca53
-ca53_loop_1:
-	mov	x1, #134
-ca53_loop_2:
-	subs	x1, x1, #1
-	b.ne	ca53_loop_2
-	subs	x0, x0, #1
-	b.ne	ca53_loop_1
-	ret
-endfunc micro_delay_ca53
-
-#if (TMU3_MEASUREMENT == 1)
-func tmu3_init
-	ldr	x2, =CPG_BASE
-	ldr	w0, [x2, #CPG_SMSTPCR1]
-	ldr	w1, [x2, #CPG_MSTPSR1]
-	ldr	w2, #MSTPCR1_TMU1
-	bl	mstpcr_write
-	ret
-endfunc tmu3_init
-
-func tmu3_start
-	ldr	x0, =TMU3_BASE
-	mov	w1, #0xFFFFFFFF
-	str	w1, [x0, TMU_TCNT]
-
-	ldr	x0, =TMU3_BASE
-	ldrb	w1, [x0, TMU_TSTR]
-	orr	w1, w1, #TSTR1_TMU3
-	strb	w1, [x0, TMU_TSTR]
-	ret
-endfunc tmu3_start
-
-func tcnt3_snapshot
-	ldr	x0, =TMU3_BASE
-	ldr	w0, [x0, TMU_TCNT]
-	ret
-endfunc tcnt3_snapshot
-
-
-func tmu3_stop
-	ldr	x0, =TMU3_BASE
-	ldrb	w1, [x0, TMU_TSTR]
-	and	w1, w1, #~TSTR1_TMU3
-	strb	w1, [x0, TMU_TSTR]
-	ret
-endfunc tmu3_stop
-#endif
diff --git a/drivers/renesas/rcar/delay/micro_delay.c b/drivers/renesas/rcar/delay/micro_delay.c
new file mode 100644
index 0000000..aced589
--- /dev/null
+++ b/drivers/renesas/rcar/delay/micro_delay.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <arch_helpers.h>
+#include "micro_delay.h"
+
+#define RCAR_CONV_MICROSEC		1000000U
+
+void
+#if IMAGE_BL31
+	__attribute__ ((section (".system_ram")))
+#endif
+	rcar_micro_delay(uint64_t micro_sec)
+{
+	uint64_t freq;
+	uint64_t base_count;
+	uint64_t get_count;
+	uint64_t wait_time = 0U;
+
+	freq = read_cntfrq_el0();
+	base_count = read_cntpct_el0();
+	while (micro_sec > wait_time) {
+		get_count = read_cntpct_el0();
+		wait_time = ((get_count - base_count) * RCAR_CONV_MICROSEC) / freq;
+	}
+}
diff --git a/drivers/renesas/rcar/delay/micro_delay.h b/drivers/renesas/rcar/delay/micro_delay.h
index 4e4b28b..193daba 100644
--- a/drivers/renesas/rcar/delay/micro_delay.h
+++ b/drivers/renesas/rcar/delay/micro_delay.h
@@ -7,20 +7,9 @@
 #ifndef MICRO_DELAY_H
 #define MICRO_DELAY_H
 
-#define TMU3_MEASUREMENT	(0)
-
 #ifndef __ASSEMBLY__
 #include <stdint.h>
-void rcar_micro_delay(uint32_t count_us);
-
-#if (TMU3_MEASUREMENT == 1)
-void tmu3_start(void);
-void tmu3_init(void);
-void tmu3_stop(void);
-
-uint32_t tcnt3_snapshot(void);
-#endif
-
+void rcar_micro_delay(uint64_t micro_sec);
 #endif
 
 #endif /* MICRO_DELAY_H */