rcar_gen3: plat: Add generic timer init
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Fri, 28 Dec 2018 19:12:13 +0000 (20:12 +0100)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Tue, 8 Jan 2019 13:08:44 +0000 (14:08 +0100)
Add code to determine the platform timer frequency and configure
the generic timer accordingly early in BL2.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
plat/renesas/rcar/bl2_plat_setup.c

index 52dfb40b3d414ebfbc0595945ff1a20487ea64c8..2debbf94e7a99c220d49822ff6c1dd3af8c1671b 100644 (file)
@@ -61,6 +61,8 @@ extern void rcar_rpc_init(void);
 extern void rcar_pfc_init(void);
 extern void rcar_dma_init(void);
 
+static void bl2_init_generic_timer(void);
+
 /* R-Car Gen3 product check */
 #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
 #define TARGET_PRODUCT                 RCAR_PRODUCT_H3
@@ -628,6 +630,8 @@ void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2,
        int fcnlnode;
 #endif
 
+       bl2_init_generic_timer();
+
        reg = mmio_read_32(RCAR_MODEMR);
        boot_dev = reg & MODEMR_BOOT_DEV_MASK;
        boot_cpu = reg & MODEMR_BOOT_CPU_MASK;
@@ -916,3 +920,52 @@ void bl2_platform_setup(void)
 {
 
 }
+
+static void bl2_init_generic_timer(void)
+{
+#if RCAR_LSI == RCAR_E3
+       uint32_t reg_cntfid = EXTAL_EBISU;
+#else /* RCAR_LSI == RCAR_E3 */
+       uint32_t reg;
+       uint32_t reg_cntfid;
+       uint32_t modemr;
+       uint32_t modemr_pll;
+       uint32_t board_type;
+       uint32_t board_rev;
+       uint32_t pll_table[] = {
+               EXTAL_MD14_MD13_TYPE_0, /* MD14/MD13 : 0b00 */
+               EXTAL_MD14_MD13_TYPE_1, /* MD14/MD13 : 0b01 */
+               EXTAL_MD14_MD13_TYPE_2, /* MD14/MD13 : 0b10 */
+               EXTAL_MD14_MD13_TYPE_3  /* MD14/MD13 : 0b11 */
+       };
+
+       modemr = mmio_read_32(RCAR_MODEMR);
+       modemr_pll = (modemr & MODEMR_BOOT_PLL_MASK);
+
+       /* Set frequency data in CNTFID0 */
+       reg_cntfid = pll_table[modemr_pll >> MODEMR_BOOT_PLL_SHIFT];
+       reg = mmio_read_32(RCAR_PRR) & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK);
+       switch (modemr_pll) {
+       case MD14_MD13_TYPE_0:
+               rcar_get_board_type(&board_type, &board_rev);
+               if (BOARD_SALVATOR_XS == board_type) {
+                       reg_cntfid = EXTAL_SALVATOR_XS;
+               }
+               break;
+       case MD14_MD13_TYPE_3:
+               if (RCAR_PRODUCT_H3_CUT10 == reg) {
+                       reg_cntfid = reg_cntfid >> 1U;
+               }
+               break;
+       default:
+               /* none */
+               break;
+       }
+#endif /* RCAR_LSI == RCAR_E3 */
+       /* Update memory mapped and register based freqency */
+       write_cntfrq_el0((u_register_t )reg_cntfid);
+       mmio_write_32(ARM_SYS_CNTCTL_BASE + (uintptr_t)CNTFID_OFF, reg_cntfid);
+       /* Enable counter */
+       mmio_setbits_32(RCAR_CNTC_BASE + (uintptr_t)CNTCR_OFF,
+                       (uint32_t)CNTCR_EN);
+}