]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - board/imgtec/malta/malta.c
malta: enable RTC support
[karo-tx-uboot.git] / board / imgtec / malta / malta.c
1 /*
2  * Copyright (C) 2013 Gabor Juhos <juhosg@openwrt.org>
3  * Copyright (C) 2013 Imagination Technologies
4  *
5  * SPDX-License-Identifier:     GPL-2.0
6  */
7
8 #include <common.h>
9 #include <netdev.h>
10 #include <pci_gt64120.h>
11 #include <pci_msc01.h>
12 #include <rtc.h>
13 #include <serial.h>
14
15 #include <asm/addrspace.h>
16 #include <asm/io.h>
17 #include <asm/malta.h>
18
19 #include "superio.h"
20
21 enum core_card {
22         CORE_UNKNOWN,
23         CORE_LV,
24         CORE_FPGA6,
25 };
26
27 enum sys_con {
28         SYSCON_UNKNOWN,
29         SYSCON_GT64120,
30         SYSCON_MSC01,
31 };
32
33 static void malta_lcd_puts(const char *str)
34 {
35         int i;
36         void *reg = (void *)CKSEG1ADDR(MALTA_ASCIIPOS0);
37
38         /* print up to 8 characters of the string */
39         for (i = 0; i < min(strlen(str), 8); i++) {
40                 __raw_writel(str[i], reg);
41                 reg += MALTA_ASCIIPOS1 - MALTA_ASCIIPOS0;
42         }
43
44         /* fill the rest of the display with spaces */
45         for (; i < 8; i++) {
46                 __raw_writel(' ', reg);
47                 reg += MALTA_ASCIIPOS1 - MALTA_ASCIIPOS0;
48         }
49 }
50
51 static enum core_card malta_core_card(void)
52 {
53         u32 corid, rev;
54
55         rev = __raw_readl(CKSEG1ADDR(MALTA_REVISION));
56         corid = (rev & MALTA_REVISION_CORID_MSK) >> MALTA_REVISION_CORID_SHF;
57
58         switch (corid) {
59         case MALTA_REVISION_CORID_CORE_LV:
60                 return CORE_LV;
61
62         case MALTA_REVISION_CORID_CORE_FPGA6:
63                 return CORE_FPGA6;
64
65         default:
66                 return CORE_UNKNOWN;
67         }
68 }
69
70 static enum sys_con malta_sys_con(void)
71 {
72         switch (malta_core_card()) {
73         case CORE_LV:
74                 return SYSCON_GT64120;
75
76         case CORE_FPGA6:
77                 return SYSCON_MSC01;
78
79         default:
80                 return SYSCON_UNKNOWN;
81         }
82 }
83
84 phys_size_t initdram(int board_type)
85 {
86         return CONFIG_SYS_MEM_SIZE;
87 }
88
89 int checkboard(void)
90 {
91         enum core_card core;
92
93         malta_lcd_puts("U-boot");
94         puts("Board: MIPS Malta");
95
96         core = malta_core_card();
97         switch (core) {
98         case CORE_LV:
99                 puts(" CoreLV");
100                 break;
101
102         case CORE_FPGA6:
103                 puts(" CoreFPGA6");
104                 break;
105
106         default:
107                 puts(" CoreUnknown");
108         }
109
110         putc('\n');
111         return 0;
112 }
113
114 int board_eth_init(bd_t *bis)
115 {
116         return pci_eth_init(bis);
117 }
118
119 void _machine_restart(void)
120 {
121         void __iomem *reset_base;
122
123         reset_base = (void __iomem *)CKSEG1ADDR(MALTA_RESET_BASE);
124         __raw_writel(GORESET, reset_base);
125 }
126
127 int board_early_init_f(void)
128 {
129         void *io_base;
130
131         /* choose correct PCI I/O base */
132         switch (malta_sys_con()) {
133         case SYSCON_GT64120:
134                 io_base = (void *)CKSEG1ADDR(MALTA_GT_PCIIO_BASE);
135                 break;
136
137         case SYSCON_MSC01:
138                 io_base = (void *)CKSEG1ADDR(MALTA_MSC01_PCIIO_BASE);
139                 break;
140
141         default:
142                 return -1;
143         }
144
145         /* setup FDC37M817 super I/O controller */
146         malta_superio_init(io_base);
147
148         return 0;
149 }
150
151 int misc_init_r(void)
152 {
153         rtc_reset();
154
155         return 0;
156 }
157
158 struct serial_device *default_serial_console(void)
159 {
160         switch (malta_sys_con()) {
161         case SYSCON_GT64120:
162                 return &eserial1_device;
163
164         default:
165         case SYSCON_MSC01:
166                 return &eserial2_device;
167         }
168 }
169
170 void pci_init_board(void)
171 {
172         switch (malta_sys_con()) {
173         case SYSCON_GT64120:
174                 set_io_port_base(CKSEG1ADDR(MALTA_GT_PCIIO_BASE));
175
176                 gt64120_pci_init((void *)CKSEG1ADDR(MALTA_GT_BASE),
177                                  0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
178                                  0x10000000, 0x10000000, 128 * 1024 * 1024,
179                                  0x00000000, 0x00000000, 0x20000);
180                 break;
181
182         default:
183         case SYSCON_MSC01:
184                 set_io_port_base(CKSEG1ADDR(MALTA_MSC01_PCIIO_BASE));
185
186                 msc01_pci_init((void *)CKSEG1ADDR(MALTA_MSC01_PCI_BASE),
187                                0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
188                                MALTA_MSC01_PCIMEM_MAP,
189                                CKSEG1ADDR(MALTA_MSC01_PCIMEM_BASE),
190                                MALTA_MSC01_PCIMEM_SIZE, MALTA_MSC01_PCIIO_MAP,
191                                0x00000000, MALTA_MSC01_PCIIO_SIZE);
192                 break;
193         }
194 }