Merge branch 'next' of https://source.denx.de/u-boot/custodians/u-boot-net
[platform/kernel/u-boot.git] / board / kontron / sl28 / sl28.c
1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include <common.h>
4 #include <dm.h>
5 #include <malloc.h>
6 #include <errno.h>
7 #include <fsl_ddr.h>
8 #include <fdt_support.h>
9 #include <asm/global_data.h>
10 #include <linux/libfdt.h>
11 #include <env_internal.h>
12 #include <asm/arch-fsl-layerscape/soc.h>
13 #include <asm/arch-fsl-layerscape/fsl_icid.h>
14 #include <i2c.h>
15 #include <asm/arch/soc.h>
16 #include <fsl_immap.h>
17 #include <netdev.h>
18 #include <wdt.h>
19
20 #include <sl28cpld.h>
21 #include <fdtdec.h>
22 #include <miiphy.h>
23
24 DECLARE_GLOBAL_DATA_PTR;
25
26 int board_early_init_f(void)
27 {
28         fsl_lsch3_early_init_f();
29         return 0;
30 }
31
32 int board_init(void)
33 {
34         return 0;
35 }
36
37 int board_eth_init(struct bd_info *bis)
38 {
39         return pci_eth_init(bis);
40 }
41
42 static int __sl28cpld_read(uint reg)
43 {
44         struct udevice *dev;
45         int ret;
46
47         ret = uclass_get_device_by_driver(UCLASS_NOP,
48                                           DM_DRIVER_GET(sl28cpld), &dev);
49         if (ret)
50                 return ret;
51
52         return sl28cpld_read(dev, reg);
53 }
54
55 static void print_cpld_version(void)
56 {
57         int version = __sl28cpld_read(SL28CPLD_VERSION);
58
59         if (version < 0)
60                 printf("CPLD:  error reading version (%d)\n", version);
61         else
62                 printf("CPLD:  v%d\n", version);
63 }
64
65 int checkboard(void)
66 {
67         printf("EL:    %d\n", current_el());
68         if (CONFIG_IS_ENABLED(SL28CPLD))
69                 print_cpld_version();
70
71         return 0;
72 }
73
74 static void stop_recovery_watchdog(void)
75 {
76         struct udevice *dev;
77         int ret;
78
79         ret = uclass_get_device_by_driver(UCLASS_WDT,
80                                           DM_DRIVER_GET(sl28cpld_wdt), &dev);
81         if (!ret)
82                 wdt_stop(dev);
83 }
84
85 int fsl_board_late_init(void)
86 {
87         /*
88          * Usually, the after a board reset, the watchdog is enabled by
89          * default. This is to supervise the bootloader boot-up. Therefore,
90          * to prevent a watchdog reset if we don't actively kick it, we have
91          * to disable it.
92          *
93          * If the watchdog isn't enabled at reset (which is a configuration
94          * option) disabling it doesn't hurt either.
95          */
96         if (!CONFIG_IS_ENABLED(WATCHDOG_AUTOSTART))
97                 stop_recovery_watchdog();
98
99         return 0;
100 }
101
102 void detail_board_ddr_info(void)
103 {
104         print_ddr_info(0);
105 }
106
107 int ft_board_setup(void *blob, struct bd_info *bd)
108 {
109         u64 base[CONFIG_NR_DRAM_BANKS];
110         u64 size[CONFIG_NR_DRAM_BANKS];
111         int nbanks = CONFIG_NR_DRAM_BANKS;
112         int node;
113         int i;
114
115         ft_cpu_setup(blob, bd);
116
117         /* fixup DT for the two GPP DDR banks */
118         for (i = 0; i < nbanks; i++) {
119                 base[i] = gd->bd->bi_dram[i].start;
120                 size[i] = gd->bd->bi_dram[i].size;
121         }
122
123         fdt_fixup_memory_banks(blob, base, size, nbanks);
124
125         fdt_fixup_icid(blob);
126
127         if (CONFIG_IS_ENABLED(SL28_SPL_LOADS_OPTEE_BL32)) {
128                 node = fdt_node_offset_by_compatible(blob, -1, "linaro,optee-tz");
129                 if (node)
130                         fdt_set_node_status(blob, node, FDT_STATUS_OKAY);
131         }
132
133         return 0;
134 }