common: Drop init.h from common header
[pandora-u-boot.git] / board / synopsys / emsdp / emsdp.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2018 Synopsys, Inc. All rights reserved.
4  */
5
6 #include <common.h>
7 #include <cpu_func.h>
8 #include <dwmmc.h>
9 #include <init.h>
10 #include <malloc.h>
11
12 #include <asm/arcregs.h>
13
14 DECLARE_GLOBAL_DATA_PTR;
15
16 #define ARC_PERIPHERAL_BASE             0xF0000000
17
18 #define CGU_ARC_FMEAS_ARC               (void *)(ARC_PERIPHERAL_BASE + 0x84)
19 #define CGU_ARC_FMEAS_ARC_START         BIT(31)
20 #define CGU_ARC_FMEAS_ARC_DONE          BIT(30)
21 #define CGU_ARC_FMEAS_ARC_CNT_MASK      GENMASK(14, 0)
22 #define CGU_ARC_FMEAS_ARC_RCNT_OFFSET   0
23 #define CGU_ARC_FMEAS_ARC_FCNT_OFFSET   15
24
25 #define SDIO_BASE                       (void *)(ARC_PERIPHERAL_BASE + 0x10000)
26
27 int mach_cpu_init(void)
28 {
29         int rcnt, fcnt;
30         u32 data;
31
32         /* Start frequency measurement */
33         writel(CGU_ARC_FMEAS_ARC_START, CGU_ARC_FMEAS_ARC);
34
35         /* Poll DONE bit */
36         do {
37                 data = readl(CGU_ARC_FMEAS_ARC);
38         } while (!(data & CGU_ARC_FMEAS_ARC_DONE));
39
40         /* Amount of reference 100 MHz clocks */
41         rcnt = ((data >> CGU_ARC_FMEAS_ARC_RCNT_OFFSET) &
42                CGU_ARC_FMEAS_ARC_CNT_MASK);
43
44         /* Amount of CPU clocks */
45         fcnt = ((data >> CGU_ARC_FMEAS_ARC_FCNT_OFFSET) &
46                CGU_ARC_FMEAS_ARC_CNT_MASK);
47
48         gd->cpu_clk = ((100 * fcnt) / rcnt) * 1000000;
49
50         return 0;
51 }
52
53 int board_early_init_r(void)
54 {
55 #define EMSDP_PSRAM_BASE                0xf2001000
56 #define PSRAM_FLASH_CONFIG_REG_0        (void *)(EMSDP_PSRAM_BASE + 0x10)
57 #define PSRAM_FLASH_CONFIG_REG_1        (void *)(EMSDP_PSRAM_BASE + 0x14)
58 #define CRE_ENABLE                      BIT(31)
59 #define CRE_DRIVE_CMD                   BIT(6)
60
61 #define PSRAM_RCR_DPD                   BIT(1)
62 #define PSRAM_RCR_PAGE_MODE             BIT(7)
63
64 /*
65  * PSRAM_FLASH_CONFIG_REG_x[30:15] to the address lines[16:1] of flash,
66  * thus "<< 1".
67  */
68 #define PSRAM_RCR_SETUP         ((PSRAM_RCR_DPD | PSRAM_RCR_PAGE_MODE) << 1)
69
70         // Switch PSRAM controller to command mode
71         writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_0);
72         // Program Refresh Configuration Register (RCR) for BANK0
73         writew(0, (void *)(0x10000000 + PSRAM_RCR_SETUP));
74         // Switch PSRAM controller back to memory mode
75         writel(0, PSRAM_FLASH_CONFIG_REG_0);
76
77
78         // Switch PSRAM controller to command mode
79         writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_1);
80         // Program Refresh Configuration Register (RCR) for BANK1
81         writew(0, (void *)(0x10800000 + PSRAM_RCR_SETUP));
82         // Switch PSRAM controller back to memory mode
83         writel(0, PSRAM_FLASH_CONFIG_REG_1);
84
85         printf("PSRAM initialized.\n");
86
87         return 0;
88 }
89
90 #define CREG_BASE               0xF0001000
91 #define CREG_BOOT               (void *)(CREG_BASE + 0x0FF0)
92 #define CREG_IP_SW_RESET        (void *)(CREG_BASE + 0x0FF0)
93 #define CREG_IP_VERSION         (void *)(CREG_BASE + 0x0FF8)
94
95 /* Bits in CREG_BOOT register */
96 #define CREG_BOOT_WP_BIT        BIT(8)
97
98 void reset_cpu(ulong addr)
99 {
100         writel(1, CREG_IP_SW_RESET);
101         while (1)
102                 ; /* loop forever till reset */
103 }
104
105 static int do_emsdp_rom(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
106 {
107         u32 creg_boot = readl(CREG_BOOT);
108
109         if (!strcmp(argv[1], "unlock"))
110                 creg_boot &= ~CREG_BOOT_WP_BIT;
111         else if (!strcmp(argv[1], "lock"))
112                 creg_boot |= CREG_BOOT_WP_BIT;
113         else
114                 return CMD_RET_USAGE;
115
116         writel(creg_boot, CREG_BOOT);
117
118         return CMD_RET_SUCCESS;
119 }
120
121 cmd_tbl_t cmd_emsdp[] = {
122         U_BOOT_CMD_MKENT(rom, 2, 0, do_emsdp_rom, "", ""),
123 };
124
125 static int do_emsdp(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
126 {
127         cmd_tbl_t *c;
128
129         c = find_cmd_tbl(argv[1], cmd_emsdp, ARRAY_SIZE(cmd_emsdp));
130
131         /* Strip off leading 'emsdp' command */
132         argc--;
133         argv++;
134
135         if (c == NULL || argc > c->maxargs)
136                 return CMD_RET_USAGE;
137
138         return c->cmd(cmdtp, flag, argc, argv);
139 }
140
141 U_BOOT_CMD(
142         emsdp, CONFIG_SYS_MAXARGS, 0, do_emsdp,
143         "Synopsys EMSDP specific commands",
144         "rom unlock - Unlock non-volatile memory for writing\n"
145         "emsdp rom lock - Lock non-volatile memory to prevent writing\n"
146 );
147
148 int checkboard(void)
149 {
150         int version = readl(CREG_IP_VERSION);
151
152         printf("Board: ARC EM Software Development Platform v%d.%d\n",
153                (version >> 16) & 0xff, version & 0xff);
154         return 0;
155 };