894ebae9d8a78797c48e92bc67a1ac63ff1c5493
[platform/kernel/u-boot.git] / board / freescale / titanium / titanium.c
1 /*
2  * Copyright (C) 2013 Stefan Roese <sr@denx.de>
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  */
17
18 #include <common.h>
19 #include <asm/io.h>
20 #include <asm/arch/clock.h>
21 #include <asm/arch/imx-regs.h>
22 #include <asm/arch/iomux.h>
23 #include <asm/arch/mx6q_pins.h>
24 #include <asm/arch/crm_regs.h>
25 #include <asm/arch/sys_proto.h>
26 #include <asm/gpio.h>
27 #include <asm/imx-common/iomux-v3.h>
28 #include <asm/imx-common/mxc_i2c.h>
29 #include <asm/imx-common/boot_mode.h>
30 #include <mmc.h>
31 #include <fsl_esdhc.h>
32 #include <micrel.h>
33 #include <miiphy.h>
34 #include <netdev.h>
35
36 DECLARE_GLOBAL_DATA_PTR;
37
38 #define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |                     \
39                         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |       \
40                         PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
41
42 #define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |                     \
43                         PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |       \
44                         PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
45
46 #define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |                     \
47                         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |     \
48                         PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
49
50 #define SPI_PAD_CTRL (PAD_CTL_HYS |                                     \
51                       PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |       \
52                       PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
53
54 #define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |                    \
55                          PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |    \
56                          PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
57
58 #define I2C_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_PUE |                    \
59                          PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |      \
60                          PAD_CTL_DSE_40ohm | PAD_CTL_HYS |              \
61                          PAD_CTL_ODE | PAD_CTL_SRE_FAST)
62
63 int dram_init(void)
64 {
65         gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
66
67         return 0;
68 }
69
70 iomux_v3_cfg_t const uart1_pads[] = {
71         MX6_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
72         MX6_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
73 };
74
75 iomux_v3_cfg_t const uart2_pads[] = {
76         MX6_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
77         MX6_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
78 };
79
80 iomux_v3_cfg_t const uart4_pads[] = {
81         MX6_PAD_CSI0_DAT12__UART4_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
82         MX6_PAD_CSI0_DAT13__UART4_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
83 };
84
85 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
86
87 struct i2c_pads_info i2c_pad_info0 = {
88         .scl = {
89                 .i2c_mode  = MX6_PAD_CSI0_DAT9__I2C1_SCL | PC,
90                 .gpio_mode = MX6_PAD_CSI0_DAT9__GPIO_5_27 | PC,
91                 .gp = IMX_GPIO_NR(5, 27)
92         },
93         .sda = {
94                  .i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA | PC,
95                  .gpio_mode = MX6_PAD_CSI0_DAT8__GPIO_5_26 | PC,
96                  .gp = IMX_GPIO_NR(5, 26)
97          }
98 };
99
100 struct i2c_pads_info i2c_pad_info2 = {
101         .scl = {
102                 .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
103                 .gpio_mode = MX6_PAD_GPIO_3__GPIO_1_3 | PC,
104                 .gp = IMX_GPIO_NR(1, 3)
105         },
106         .sda = {
107                  .i2c_mode = MX6_PAD_GPIO_16__I2C3_SDA | PC,
108                  .gpio_mode = MX6_PAD_GPIO_16__GPIO_7_11 | PC,
109                  .gp = IMX_GPIO_NR(7, 11)
110          }
111 };
112
113 iomux_v3_cfg_t const usdhc3_pads[] = {
114         MX6_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
115         MX6_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
116         MX6_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
117         MX6_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
118         MX6_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
119         MX6_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
120         MX6_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
121 };
122
123 iomux_v3_cfg_t const enet_pads1[] = {
124         MX6_PAD_ENET_MDIO__ENET_MDIO            | MUX_PAD_CTRL(ENET_PAD_CTRL),
125         MX6_PAD_ENET_MDC__ENET_MDC              | MUX_PAD_CTRL(ENET_PAD_CTRL),
126         MX6_PAD_RGMII_TXC__ENET_RGMII_TXC       | MUX_PAD_CTRL(ENET_PAD_CTRL),
127         MX6_PAD_RGMII_TD0__ENET_RGMII_TD0       | MUX_PAD_CTRL(ENET_PAD_CTRL),
128         MX6_PAD_RGMII_TD1__ENET_RGMII_TD1       | MUX_PAD_CTRL(ENET_PAD_CTRL),
129         MX6_PAD_RGMII_TD2__ENET_RGMII_TD2       | MUX_PAD_CTRL(ENET_PAD_CTRL),
130         MX6_PAD_RGMII_TD3__ENET_RGMII_TD3       | MUX_PAD_CTRL(ENET_PAD_CTRL),
131         MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
132         MX6_PAD_ENET_REF_CLK__ENET_TX_CLK       | MUX_PAD_CTRL(ENET_PAD_CTRL),
133         /* pin 35 - 1 (PHY_AD2) on reset */
134         MX6_PAD_RGMII_RXC__GPIO_6_30            | MUX_PAD_CTRL(NO_PAD_CTRL),
135         /* pin 32 - 1 - (MODE0) all */
136         MX6_PAD_RGMII_RD0__GPIO_6_25            | MUX_PAD_CTRL(NO_PAD_CTRL),
137         /* pin 31 - 1 - (MODE1) all */
138         MX6_PAD_RGMII_RD1__GPIO_6_27            | MUX_PAD_CTRL(NO_PAD_CTRL),
139         /* pin 28 - 1 - (MODE2) all */
140         MX6_PAD_RGMII_RD2__GPIO_6_28            | MUX_PAD_CTRL(NO_PAD_CTRL),
141         /* pin 27 - 1 - (MODE3) all */
142         MX6_PAD_RGMII_RD3__GPIO_6_29            | MUX_PAD_CTRL(NO_PAD_CTRL),
143         /* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
144         MX6_PAD_RGMII_RX_CTL__GPIO_6_24         | MUX_PAD_CTRL(NO_PAD_CTRL),
145         /* pin 42 PHY nRST */
146         MX6_PAD_EIM_D23__GPIO_3_23              | MUX_PAD_CTRL(NO_PAD_CTRL),
147 };
148
149 iomux_v3_cfg_t const enet_pads2[] = {
150         MX6_PAD_RGMII_RXC__ENET_RGMII_RXC       | MUX_PAD_CTRL(ENET_PAD_CTRL),
151         MX6_PAD_RGMII_RD0__ENET_RGMII_RD0       | MUX_PAD_CTRL(ENET_PAD_CTRL),
152         MX6_PAD_RGMII_RD1__ENET_RGMII_RD1       | MUX_PAD_CTRL(ENET_PAD_CTRL),
153         MX6_PAD_RGMII_RD2__ENET_RGMII_RD2       | MUX_PAD_CTRL(ENET_PAD_CTRL),
154         MX6_PAD_RGMII_RD3__ENET_RGMII_RD3       | MUX_PAD_CTRL(ENET_PAD_CTRL),
155         MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
156 };
157
158 iomux_v3_cfg_t nfc_pads[] = {
159         MX6_PAD_NANDF_CLE__RAWNAND_CLE          | MUX_PAD_CTRL(NO_PAD_CTRL),
160         MX6_PAD_NANDF_ALE__RAWNAND_ALE          | MUX_PAD_CTRL(NO_PAD_CTRL),
161         MX6_PAD_NANDF_WP_B__RAWNAND_RESETN      | MUX_PAD_CTRL(NO_PAD_CTRL),
162         MX6_PAD_NANDF_RB0__RAWNAND_READY0       | MUX_PAD_CTRL(NO_PAD_CTRL),
163         MX6_PAD_NANDF_CS0__RAWNAND_CE0N         | MUX_PAD_CTRL(NO_PAD_CTRL),
164         MX6_PAD_NANDF_CS1__RAWNAND_CE1N         | MUX_PAD_CTRL(NO_PAD_CTRL),
165         MX6_PAD_NANDF_CS2__RAWNAND_CE2N         | MUX_PAD_CTRL(NO_PAD_CTRL),
166         MX6_PAD_NANDF_CS3__RAWNAND_CE3N         | MUX_PAD_CTRL(NO_PAD_CTRL),
167         MX6_PAD_SD4_CMD__RAWNAND_RDN            | MUX_PAD_CTRL(NO_PAD_CTRL),
168         MX6_PAD_SD4_CLK__RAWNAND_WRN            | MUX_PAD_CTRL(NO_PAD_CTRL),
169         MX6_PAD_NANDF_D0__RAWNAND_D0            | MUX_PAD_CTRL(NO_PAD_CTRL),
170         MX6_PAD_NANDF_D1__RAWNAND_D1            | MUX_PAD_CTRL(NO_PAD_CTRL),
171         MX6_PAD_NANDF_D2__RAWNAND_D2            | MUX_PAD_CTRL(NO_PAD_CTRL),
172         MX6_PAD_NANDF_D3__RAWNAND_D3            | MUX_PAD_CTRL(NO_PAD_CTRL),
173         MX6_PAD_NANDF_D4__RAWNAND_D4            | MUX_PAD_CTRL(NO_PAD_CTRL),
174         MX6_PAD_NANDF_D5__RAWNAND_D5            | MUX_PAD_CTRL(NO_PAD_CTRL),
175         MX6_PAD_NANDF_D6__RAWNAND_D6            | MUX_PAD_CTRL(NO_PAD_CTRL),
176         MX6_PAD_NANDF_D7__RAWNAND_D7            | MUX_PAD_CTRL(NO_PAD_CTRL),
177         MX6_PAD_SD4_DAT0__RAWNAND_DQS           | MUX_PAD_CTRL(NO_PAD_CTRL),
178 };
179
180 static void setup_gpmi_nand(void)
181 {
182         struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
183
184         /* config gpmi nand iomux */
185         imx_iomux_v3_setup_multiple_pads(nfc_pads,
186                                          ARRAY_SIZE(nfc_pads));
187
188         /* config gpmi and bch clock to 100 MHz */
189         clrsetbits_le32(&mxc_ccm->cs2cdr,
190                         MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
191                         MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
192                         MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
193                         MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
194                         MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
195                         MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
196
197         /* enable gpmi and bch clock gating */
198         setbits_le32(&mxc_ccm->CCGR4,
199                      MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
200                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
201                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
202                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
203                      MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
204
205         /* enable apbh clock gating */
206         setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
207 }
208
209 static void setup_iomux_enet(void)
210 {
211         gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
212         gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
213         gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
214         gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
215         gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
216         gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
217         imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
218         gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
219
220         /* Need delay 10ms according to KSZ9021 spec */
221         udelay(1000 * 10);
222         gpio_set_value(IMX_GPIO_NR(3, 23), 1);
223
224         imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
225 }
226
227 static void setup_iomux_uart(void)
228 {
229         imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
230         imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
231         imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
232 }
233
234 #ifdef CONFIG_USB_EHCI_MX6
235 int board_ehci_hcd_init(int port)
236 {
237         return 0;
238 }
239
240 #endif
241
242 #ifdef CONFIG_FSL_ESDHC
243 struct fsl_esdhc_cfg usdhc_cfg[1] = {
244         { USDHC3_BASE_ADDR },
245 };
246
247 int board_mmc_getcd(struct mmc *mmc)
248 {
249         struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
250
251         if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
252                 gpio_direction_input(IMX_GPIO_NR(7, 0));
253                 return !gpio_get_value(IMX_GPIO_NR(7, 0));
254         }
255
256         return 0;
257 }
258
259 int board_mmc_init(bd_t *bis)
260 {
261         /*
262          * Only one USDHC controller on titianium
263          */
264         imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
265         usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
266
267         return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
268 }
269 #endif
270
271 int board_phy_config(struct phy_device *phydev)
272 {
273         /* min rx data delay */
274         ksz9021_phy_extended_write(phydev,
275                                    MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
276         /* min tx data delay */
277         ksz9021_phy_extended_write(phydev,
278                                    MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
279         /* max rx/tx clock delay, min rx/tx control */
280         ksz9021_phy_extended_write(phydev,
281                                    MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
282         if (phydev->drv->config)
283                 phydev->drv->config(phydev);
284
285         return 0;
286 }
287
288 int board_eth_init(bd_t *bis)
289 {
290         int ret;
291
292         setup_iomux_enet();
293
294         ret = cpu_eth_init(bis);
295         if (ret)
296                 printf("FEC MXC: %s:failed\n", __func__);
297
298         return 0;
299 }
300
301 int board_early_init_f(void)
302 {
303         setup_iomux_uart();
304
305         return 0;
306 }
307
308 int board_init(void)
309 {
310         /* address of boot parameters */
311         gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
312
313         setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
314         setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
315
316         setup_gpmi_nand();
317
318         return 0;
319 }
320
321 int checkboard(void)
322 {
323         puts("Board: Titanium\n");
324
325         return 0;
326 }
327
328 #ifdef CONFIG_CMD_BMODE
329 static const struct boot_mode board_boot_modes[] = {
330         /* NAND */
331         { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
332         /* 4 bit bus width */
333         { "mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00) },
334         { "mmc1", MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00) },
335         { NULL, 0 },
336 };
337 #endif
338
339 int misc_init_r(void)
340 {
341 #ifdef CONFIG_CMD_BMODE
342         add_board_boot_modes(board_boot_modes);
343 #endif
344
345         return 0;
346 }