2 * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il>
4 * Authors: Igor Grinberg <grinberg@compulab.co.il>
6 * SPDX-License-Identifier: GPL-2.0+
10 #include <status_led.h>
15 #include <linux/compiler.h>
16 #include <linux/usb/musb.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>
23 #include <asm/arch/musb.h>
24 #include <asm/omap_musb.h>
25 #include <asm/ehci-omap.h>
27 #include "../common/common.h"
28 #include "../common/eeprom.h"
30 DECLARE_GLOBAL_DATA_PTR
;
32 const omap3_sysinfo sysinfo
= {
38 #ifdef CONFIG_USB_MUSB_AM35X
39 static struct musb_hdrc_config cm_t3517_musb_config
= {
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
,
52 static struct musb_hdrc_platform_data cm_t3517_musb_pdata
= {
53 #if defined(CONFIG_USB_MUSB_HOST)
55 #elif defined(CONFIG_USB_MUSB_GADGET)
56 .mode
= MUSB_PERIPHERAL
,
58 #error "Please define either CONFIG_USB_MUSB_HOST or CONFIG_USB_MUSB_GADGET"
60 .config
= &cm_t3517_musb_config
,
62 .platform_ops
= &am35x_ops
,
63 .board_data
= &cm_t3517_musb_board_data
,
66 static void cm_t3517_musb_init(void)
69 * Set up USB clock/mode in the DEVCONF2 register.
70 * USB2.0 PHY reference clock is 13 MHz
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
);
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");
82 static inline void am3517_evm_musb_init(void) {}
87 gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
90 gd
->bd
->bi_boot_params
= (OMAP34XX_SDRC_CS0
+ 0x100);
92 #if defined(CONFIG_LED_STATUS) && defined(CONFIG_LED_STATUS_BOOT_ENABLE)
93 status_led_set(CONFIG_LED_STATUS_BOOT
, CONFIG_LED_STATUS_ON
);
102 * Routine: get_board_rev
103 * Description: read system revision
105 u32
get_board_rev(void)
107 return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS
);
110 int misc_init_r(void)
113 omap_die_id_display();
118 #if defined(CONFIG_MMC)
119 #define SB_T35_CD_GPIO 144
120 #define SB_T35_WP_GPIO 59
122 int board_mmc_init(bd_t
*bis
)
124 return omap_mmc_init(0, 0, 0, SB_T35_CD_GPIO
, SB_T35_WP_GPIO
);
128 #ifdef CONFIG_DRIVER_TI_EMAC
129 #define CONTROL_EFUSE_EMAC_LSB 0x48002380
130 #define CONTROL_EFUSE_EMAC_MSB 0x48002384
132 static int am3517_get_efuse_enetaddr(u8
*enetaddr
)
134 u32 lsb
= __raw_readl(CONTROL_EFUSE_EMAC_LSB
);
135 u32 msb
= __raw_readl(CONTROL_EFUSE_EMAC_MSB
);
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);
144 return is_valid_ethaddr(enetaddr
);
147 static inline int cm_t3517_init_emac(bd_t
*bis
)
149 int ret
= cpu_eth_init(bis
);
154 printf("Failed initializing EMAC! ");
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 */
163 * Routine: handle_mac_address
164 * Description: prepare MAC address for on-board Ethernet.
166 static int cm_t3517_handle_mac_address(void)
168 unsigned char enetaddr
[6];
171 ret
= eth_env_get_enetaddr("ethaddr", enetaddr
);
175 ret
= cl_eeprom_read_mac_addr(enetaddr
, CONFIG_SYS_I2C_EEPROM_BUS
);
177 ret
= am3517_get_efuse_enetaddr(enetaddr
);
182 if (!is_valid_ethaddr(enetaddr
))
185 return eth_env_set_enetaddr("ethaddr", enetaddr
);
188 #define SB_T35_ETH_RST_GPIO 164
191 * Routine: board_eth_init
192 * Description: initialize module and base-board Ethernet chips
194 int board_eth_init(bd_t
*bis
)
198 rc1
= cm_t3517_handle_mac_address();
200 printf("No MAC address found! ");
202 rc1
= cm_t3517_init_emac(bis
);
206 rc1
= cl_omap3_smc911x_init(0, 4, CONFIG_SMC911X_BASE
,
207 NULL
, SB_T35_ETH_RST_GPIO
);
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
,
221 #define CM_T3517_USB_HUB_RESET_GPIO 152
222 #define SB_T35_USB_HUB_RESET_GPIO 98
224 int ehci_hcd_init(int index
, enum usb_init_type init
,
225 struct ehci_hccr
**hccr
, struct ehci_hcor
**hcor
)
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");
230 return omap_ehci_hcd_init(index
, &cm_t3517_usbhs_bdata
, hccr
, hcor
);
233 int ehci_hcd_stop(void)
235 cl_usb_hub_deinit(CM_T3517_USB_HUB_RESET_GPIO
);
236 cl_usb_hub_deinit(SB_T35_USB_HUB_RESET_GPIO
);
238 return omap_ehci_hcd_stop();
240 #endif /* CONFIG_USB_EHCI_OMAP */