4 * Board functions for Phytec phyCORE-AM335x (pcm051) based boards
6 * Copyright (C) 2013 Lemonage Software GmbH
7 * Author Lars Poeschel <poeschel@lemonage.de>
9 * SPDX-License-Identifier: GPL-2.0+
13 #include <environment.h>
16 #include <asm/arch/cpu.h>
17 #include <asm/arch/hardware.h>
18 #include <asm/arch/omap.h>
19 #include <asm/arch/ddr_defs.h>
20 #include <asm/arch/clock.h>
21 #include <asm/arch/gpio.h>
22 #include <asm/arch/mmc_host_def.h>
23 #include <asm/arch/sys_proto.h>
32 DECLARE_GLOBAL_DATA_PTR
;
34 /* MII mode defines */
35 #define RMII_RGMII2_MODE_ENABLE 0x49
37 static struct ctrl_dev
*cdev
= (struct ctrl_dev
*)CTRL_DEVICE_BASE
;
39 #ifdef CONFIG_SPL_BUILD
42 #define DDR_CLK_MHZ 303 /* DDR_DPLL_MULT value */
44 #define OSC (V_OSCK/1000000)
45 const struct dpll_params dpll_ddr
= {
46 DDR_CLK_MHZ
, OSC
-1, 1, -1, -1, -1, -1};
48 const struct dpll_params
*get_dpll_ddr_params(void)
54 const struct ctrl_ioregs ioregs
= {
55 .cm0ioctl
= MT41J256M8HX15E_IOCTRL_VALUE
,
56 .cm1ioctl
= MT41J256M8HX15E_IOCTRL_VALUE
,
57 .cm2ioctl
= MT41J256M8HX15E_IOCTRL_VALUE
,
58 .dt0ioctl
= MT41J256M8HX15E_IOCTRL_VALUE
,
59 .dt1ioctl
= MT41J256M8HX15E_IOCTRL_VALUE
,
62 static const struct ddr_data ddr3_data
= {
63 .datardsratio0
= MT41J256M8HX15E_RD_DQS
,
64 .datawdsratio0
= MT41J256M8HX15E_WR_DQS
,
65 .datafwsratio0
= MT41J256M8HX15E_PHY_FIFO_WE
,
66 .datawrsratio0
= MT41J256M8HX15E_PHY_WR_DATA
,
69 static const struct cmd_control ddr3_cmd_ctrl_data
= {
70 .cmd0csratio
= MT41J256M8HX15E_RATIO
,
71 .cmd0iclkout
= MT41J256M8HX15E_INVERT_CLKOUT
,
73 .cmd1csratio
= MT41J256M8HX15E_RATIO
,
74 .cmd1iclkout
= MT41J256M8HX15E_INVERT_CLKOUT
,
76 .cmd2csratio
= MT41J256M8HX15E_RATIO
,
77 .cmd2iclkout
= MT41J256M8HX15E_INVERT_CLKOUT
,
80 static struct emif_regs ddr3_emif_reg_data
= {
81 .sdram_config
= MT41J256M8HX15E_EMIF_SDCFG
,
82 .ref_ctrl
= MT41J256M8HX15E_EMIF_SDREF
,
83 .sdram_tim1
= MT41J256M8HX15E_EMIF_TIM1
,
84 .sdram_tim2
= MT41J256M8HX15E_EMIF_TIM2
,
85 .sdram_tim3
= MT41J256M8HX15E_EMIF_TIM3
,
86 .zq_config
= MT41J256M8HX15E_ZQ_CFG
,
87 .emif_ddr_phy_ctlr_1
= MT41J256M8HX15E_EMIF_READ_LATENCY
|
93 config_ddr(DDR_CLK_MHZ
, &ioregs
, &ddr3_data
,
94 &ddr3_cmd_ctrl_data
, &ddr3_emif_reg_data
, 0);
97 const struct ctrl_ioregs ioregs
= {
98 .cm0ioctl
= MT41K256M16HA125E_IOCTRL_VALUE
,
99 .cm1ioctl
= MT41K256M16HA125E_IOCTRL_VALUE
,
100 .cm2ioctl
= MT41K256M16HA125E_IOCTRL_VALUE
,
101 .dt0ioctl
= MT41K256M16HA125E_IOCTRL_VALUE
,
102 .dt1ioctl
= MT41K256M16HA125E_IOCTRL_VALUE
,
105 static const struct ddr_data ddr3_data
= {
106 .datardsratio0
= MT41K256M16HA125E_RD_DQS
,
107 .datawdsratio0
= MT41K256M16HA125E_WR_DQS
,
108 .datafwsratio0
= MT41K256M16HA125E_PHY_FIFO_WE
,
109 .datawrsratio0
= MT41K256M16HA125E_PHY_WR_DATA
,
112 static const struct cmd_control ddr3_cmd_ctrl_data
= {
113 .cmd0csratio
= MT41K256M16HA125E_RATIO
,
114 .cmd0iclkout
= MT41K256M16HA125E_INVERT_CLKOUT
,
116 .cmd1csratio
= MT41K256M16HA125E_RATIO
,
117 .cmd1iclkout
= MT41K256M16HA125E_INVERT_CLKOUT
,
119 .cmd2csratio
= MT41K256M16HA125E_RATIO
,
120 .cmd2iclkout
= MT41K256M16HA125E_INVERT_CLKOUT
,
123 static struct emif_regs ddr3_emif_reg_data
= {
124 .sdram_config
= MT41K256M16HA125E_EMIF_SDCFG
,
125 .ref_ctrl
= MT41K256M16HA125E_EMIF_SDREF
,
126 .sdram_tim1
= MT41K256M16HA125E_EMIF_TIM1
,
127 .sdram_tim2
= MT41K256M16HA125E_EMIF_TIM2
,
128 .sdram_tim3
= MT41K256M16HA125E_EMIF_TIM3
,
129 .zq_config
= MT41K256M16HA125E_ZQ_CFG
,
130 .emif_ddr_phy_ctlr_1
= MT41K256M16HA125E_EMIF_READ_LATENCY
|
134 void sdram_init(void)
136 config_ddr(DDR_CLK_MHZ
, &ioregs
, &ddr3_data
,
137 &ddr3_cmd_ctrl_data
, &ddr3_emif_reg_data
, 0);
141 void set_uart_mux_conf(void)
143 enable_uart0_pin_mux();
146 void set_mux_conf_regs(void)
148 /* Initalize the board header */
149 enable_i2c0_pin_mux();
150 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED
, CONFIG_SYS_OMAP24_I2C_SLAVE
);
152 enable_board_pin_mux();
157 * Basic board specific setup. Pinmux has been handled already.
161 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED
, CONFIG_SYS_OMAP24_I2C_SLAVE
);
163 gd
->bd
->bi_boot_params
= CONFIG_SYS_SDRAM_BASE
+ 0x100;
168 #ifdef CONFIG_DRIVER_TI_CPSW
169 static void cpsw_control(int enabled
)
171 /* VTP can be added here */
176 static struct cpsw_slave_data cpsw_slaves
[] = {
178 .slave_reg_ofs
= 0x208,
179 .sliver_reg_ofs
= 0xd80,
181 .phy_if
= PHY_INTERFACE_MODE_RGMII
,
184 .slave_reg_ofs
= 0x308,
185 .sliver_reg_ofs
= 0xdc0,
187 .phy_if
= PHY_INTERFACE_MODE_RGMII
,
191 static struct cpsw_platform_data cpsw_data
= {
192 .mdio_base
= CPSW_MDIO_BASE
,
193 .cpsw_base
= CPSW_BASE
,
196 .cpdma_reg_ofs
= 0x800,
198 .slave_data
= cpsw_slaves
,
199 .ale_reg_ofs
= 0xd00,
201 .host_port_reg_ofs
= 0x108,
202 .hw_stats_reg_ofs
= 0x900,
203 .bd_ram_ofs
= 0x2000,
204 .mac_control
= (1 << 5),
205 .control
= cpsw_control
,
207 .version
= CPSW_CTRL_VERSION_2
,
211 #if defined(CONFIG_DRIVER_TI_CPSW) || \
212 (defined(CONFIG_USB_ETHER) && defined(CONFIG_USB_MUSB_GADGET))
213 int board_eth_init(bd_t
*bis
)
216 #ifdef CONFIG_DRIVER_TI_CPSW
218 uint32_t mac_hi
, mac_lo
;
220 if (!eth_env_get_enetaddr("ethaddr", mac_addr
)) {
221 printf("<ethaddr> not set. Reading from E-fuse\n");
222 /* try reading mac address from efuse */
223 mac_lo
= readl(&cdev
->macid0l
);
224 mac_hi
= readl(&cdev
->macid0h
);
225 mac_addr
[0] = mac_hi
& 0xFF;
226 mac_addr
[1] = (mac_hi
& 0xFF00) >> 8;
227 mac_addr
[2] = (mac_hi
& 0xFF0000) >> 16;
228 mac_addr
[3] = (mac_hi
& 0xFF000000) >> 24;
229 mac_addr
[4] = mac_lo
& 0xFF;
230 mac_addr
[5] = (mac_lo
& 0xFF00) >> 8;
232 if (is_valid_ethaddr(mac_addr
))
233 eth_env_set_enetaddr("ethaddr", mac_addr
);
238 writel(RMII_RGMII2_MODE_ENABLE
, &cdev
->miisel
);
240 rv
= cpsw_register(&cpsw_data
);
242 printf("Error %d registering CPSW switch\n", rv
);
248 #if defined(CONFIG_USB_ETHER) && !defined(CONFIG_SPL_BUILD)
249 rv
= usb_eth_initialize(bis
);
251 printf("Error %d registering USB_ETHER\n", rv
);