]>
Commit | Line | Data |
---|---|---|
b09bf723 IG |
1 | /* |
2 | * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il> | |
3 | * | |
4 | * Authors: Igor Grinberg <grinberg@compulab.co.il> | |
5 | * | |
6 | * SPDX-License-Identifier: GPL-2.0+ | |
7 | */ | |
8 | ||
9 | #include <common.h> | |
10 | #include <status_led.h> | |
a8a78c74 IG |
11 | #include <net.h> |
12 | #include <netdev.h> | |
011f5c13 | 13 | #include <usb.h> |
b09bf723 IG |
14 | #include <mmc.h> |
15 | #include <linux/compiler.h> | |
011f5c13 | 16 | #include <linux/usb/musb.h> |
b09bf723 IG |
17 | |
18 | #include <asm/io.h> | |
19 | #include <asm/arch/mem.h> | |
20 | #include <asm/arch/am35x_def.h> | |
21 | #include <asm/arch/mmc_host_def.h> | |
22 | #include <asm/arch/sys_proto.h> | |
011f5c13 IG |
23 | #include <asm/arch/musb.h> |
24 | #include <asm/omap_musb.h> | |
25 | #include <asm/ehci-omap.h> | |
b09bf723 IG |
26 | |
27 | #include "../common/common.h" | |
a8a78c74 | 28 | #include "../common/eeprom.h" |
b09bf723 IG |
29 | |
30 | DECLARE_GLOBAL_DATA_PTR; | |
31 | ||
32 | const omap3_sysinfo sysinfo = { | |
33 | DDR_DISCRETE, | |
34 | "CM-T3517 board", | |
35 | "NAND 128/512M", | |
36 | }; | |
37 | ||
011f5c13 IG |
38 | #ifdef CONFIG_USB_MUSB_AM35X |
39 | static struct musb_hdrc_config cm_t3517_musb_config = { | |
40 | .multipoint = 1, | |
41 | .dyn_fifo = 1, | |
42 | .num_eps = 16, | |
43 | .ram_bits = 12, | |
44 | }; | |
45 | ||
46 | static struct omap_musb_board_data cm_t3517_musb_board_data = { | |
47 | .set_phy_power = am35x_musb_phy_power, | |
48 | .clear_irq = am35x_musb_clear_irq, | |
49 | .reset = am35x_musb_reset, | |
50 | }; | |
51 | ||
52 | static struct musb_hdrc_platform_data cm_t3517_musb_pdata = { | |
95de1e2f | 53 | #if defined(CONFIG_USB_MUSB_HOST) |
011f5c13 | 54 | .mode = MUSB_HOST, |
95de1e2f | 55 | #elif defined(CONFIG_USB_MUSB_GADGET) |
011f5c13 IG |
56 | .mode = MUSB_PERIPHERAL, |
57 | #else | |
95de1e2f | 58 | #error "Please define either CONFIG_USB_MUSB_HOST or CONFIG_USB_MUSB_GADGET" |
011f5c13 IG |
59 | #endif |
60 | .config = &cm_t3517_musb_config, | |
61 | .power = 250, | |
62 | .platform_ops = &am35x_ops, | |
63 | .board_data = &cm_t3517_musb_board_data, | |
64 | }; | |
65 | ||
66 | static void cm_t3517_musb_init(void) | |
67 | { | |
68 | /* | |
69 | * Set up USB clock/mode in the DEVCONF2 register. | |
70 | * USB2.0 PHY reference clock is 13 MHz | |
71 | */ | |
72 | clrsetbits_le32(&am35x_scm_general_regs->devconf2, | |
73 | CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE, | |
74 | CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | | |
75 | CONF2_VBDTCTEN | CONF2_DATPOL); | |
76 | ||
77 | if (musb_register(&cm_t3517_musb_pdata, &cm_t3517_musb_board_data, | |
78 | (void *)AM35XX_IPSS_USBOTGSS_BASE)) | |
79 | printf("Failed initializing AM35x MUSB!\n"); | |
80 | } | |
81 | #else | |
82 | static inline void am3517_evm_musb_init(void) {} | |
83 | #endif | |
84 | ||
b09bf723 IG |
85 | int board_init(void) |
86 | { | |
87 | gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ | |
88 | ||
89 | /* boot param addr */ | |
90 | gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); | |
91 | ||
2d8d190c UM |
92 | #if defined(CONFIG_LED_STATUS) && defined(CONFIG_LED_STATUS_BOOT_ENABLE) |
93 | status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_ON); | |
b09bf723 IG |
94 | #endif |
95 | ||
011f5c13 IG |
96 | cm_t3517_musb_init(); |
97 | ||
b09bf723 IG |
98 | return 0; |
99 | } | |
100 | ||
0a57c037 DL |
101 | /* |
102 | * Routine: get_board_rev | |
103 | * Description: read system revision | |
104 | */ | |
105 | u32 get_board_rev(void) | |
106 | { | |
107 | return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS); | |
108 | }; | |
109 | ||
b09bf723 IG |
110 | int misc_init_r(void) |
111 | { | |
112 | cl_print_pcb_info(); | |
679f82c3 | 113 | omap_die_id_display(); |
b09bf723 IG |
114 | |
115 | return 0; | |
116 | } | |
117 | ||
4aa2ba3a | 118 | #if defined(CONFIG_MMC) |
b09bf723 IG |
119 | #define SB_T35_CD_GPIO 144 |
120 | #define SB_T35_WP_GPIO 59 | |
121 | ||
122 | int board_mmc_init(bd_t *bis) | |
123 | { | |
124 | return omap_mmc_init(0, 0, 0, SB_T35_CD_GPIO, SB_T35_WP_GPIO); | |
125 | } | |
126 | #endif | |
011f5c13 | 127 | |
a8a78c74 IG |
128 | #ifdef CONFIG_DRIVER_TI_EMAC |
129 | #define CONTROL_EFUSE_EMAC_LSB 0x48002380 | |
130 | #define CONTROL_EFUSE_EMAC_MSB 0x48002384 | |
131 | ||
132 | static int am3517_get_efuse_enetaddr(u8 *enetaddr) | |
133 | { | |
134 | u32 lsb = __raw_readl(CONTROL_EFUSE_EMAC_LSB); | |
135 | u32 msb = __raw_readl(CONTROL_EFUSE_EMAC_MSB); | |
136 | ||
137 | enetaddr[0] = (u8)((msb >> 16) & 0xff); | |
138 | enetaddr[1] = (u8)((msb >> 8) & 0xff); | |
139 | enetaddr[2] = (u8)(msb & 0xff); | |
140 | enetaddr[3] = (u8)((lsb >> 16) & 0xff); | |
141 | enetaddr[4] = (u8)((lsb >> 8) & 0xff); | |
142 | enetaddr[5] = (u8)(lsb & 0xff); | |
143 | ||
0adb5b76 | 144 | return is_valid_ethaddr(enetaddr); |
a8a78c74 IG |
145 | } |
146 | ||
147 | static inline int cm_t3517_init_emac(bd_t *bis) | |
148 | { | |
149 | int ret = cpu_eth_init(bis); | |
150 | ||
151 | if (ret > 0) | |
152 | return ret; | |
153 | ||
154 | printf("Failed initializing EMAC! "); | |
155 | return 0; | |
156 | } | |
157 | #else /* !CONFIG_DRIVER_TI_EMAC */ | |
158 | static inline int am3517_get_efuse_enetaddr(u8 *enetaddr) { return 1; } | |
159 | static inline int cm_t3517_init_emac(bd_t *bis) { return 0; } | |
160 | #endif /* CONFIG_DRIVER_TI_EMAC */ | |
161 | ||
162 | /* | |
163 | * Routine: handle_mac_address | |
164 | * Description: prepare MAC address for on-board Ethernet. | |
165 | */ | |
166 | static int cm_t3517_handle_mac_address(void) | |
167 | { | |
168 | unsigned char enetaddr[6]; | |
169 | int ret; | |
170 | ||
171 | ret = eth_getenv_enetaddr("ethaddr", enetaddr); | |
172 | if (ret) | |
173 | return 0; | |
174 | ||
e7a2447b | 175 | ret = cl_eeprom_read_mac_addr(enetaddr, CONFIG_SYS_I2C_EEPROM_BUS); |
a8a78c74 IG |
176 | if (ret) { |
177 | ret = am3517_get_efuse_enetaddr(enetaddr); | |
178 | if (ret) | |
179 | return ret; | |
180 | } | |
181 | ||
0adb5b76 | 182 | if (!is_valid_ethaddr(enetaddr)) |
a8a78c74 IG |
183 | return -1; |
184 | ||
185 | return eth_setenv_enetaddr("ethaddr", enetaddr); | |
186 | } | |
187 | ||
188 | #define SB_T35_ETH_RST_GPIO 164 | |
189 | ||
190 | /* | |
191 | * Routine: board_eth_init | |
192 | * Description: initialize module and base-board Ethernet chips | |
193 | */ | |
194 | int board_eth_init(bd_t *bis) | |
195 | { | |
196 | int rc = 0, rc1 = 0; | |
197 | ||
198 | rc1 = cm_t3517_handle_mac_address(); | |
199 | if (rc1) | |
200 | printf("No MAC address found! "); | |
201 | ||
202 | rc1 = cm_t3517_init_emac(bis); | |
203 | if (rc1 > 0) | |
204 | rc++; | |
205 | ||
206 | rc1 = cl_omap3_smc911x_init(0, 4, CONFIG_SMC911X_BASE, | |
207 | NULL, SB_T35_ETH_RST_GPIO); | |
208 | if (rc1 > 0) | |
209 | rc++; | |
210 | ||
211 | return rc; | |
212 | } | |
213 | ||
011f5c13 IG |
214 | #ifdef CONFIG_USB_EHCI_OMAP |
215 | static struct omap_usbhs_board_data cm_t3517_usbhs_bdata = { | |
216 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | |
217 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | |
218 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | |
219 | }; | |
220 | ||
221 | #define CM_T3517_USB_HUB_RESET_GPIO 152 | |
222 | #define SB_T35_USB_HUB_RESET_GPIO 98 | |
223 | ||
224 | int ehci_hcd_init(int index, enum usb_init_type init, | |
225 | struct ehci_hccr **hccr, struct ehci_hcor **hcor) | |
226 | { | |
227 | cl_usb_hub_init(CM_T3517_USB_HUB_RESET_GPIO, "cm-t3517 hub rst"); | |
228 | cl_usb_hub_init(SB_T35_USB_HUB_RESET_GPIO, "sb-t35 hub rst"); | |
229 | ||
230 | return omap_ehci_hcd_init(index, &cm_t3517_usbhs_bdata, hccr, hcor); | |
231 | } | |
232 | ||
233 | int ehci_hcd_stop(void) | |
234 | { | |
235 | cl_usb_hub_deinit(CM_T3517_USB_HUB_RESET_GPIO); | |
236 | cl_usb_hub_deinit(SB_T35_USB_HUB_RESET_GPIO); | |
237 | ||
238 | return omap_ehci_hcd_stop(); | |
239 | } | |
240 | #endif /* CONFIG_USB_EHCI_OMAP */ |