]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/freescale/mx6qsabrelite/mx6qsabrelite.c
mx6q: mx6qsabrelite: setup_spi() should be called in board_init to allow use for...
[karo-tx-uboot.git] / board / freescale / mx6qsabrelite / mx6qsabrelite.c
1 /*
2  * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
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  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #include <common.h>
24 #include <asm/io.h>
25 #include <asm/arch/imx-regs.h>
26 #include <asm/arch/mx6x_pins.h>
27 #include <asm/arch/iomux-v3.h>
28 #include <asm/errno.h>
29 #include <asm/gpio.h>
30 #include <mmc.h>
31 #include <fsl_esdhc.h>
32 #include <micrel.h>
33 #include <miiphy.h>
34 #include <netdev.h>
35 DECLARE_GLOBAL_DATA_PTR;
36
37 #define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
38        PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
39        PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
40
41 #define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
42        PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
43        PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
44
45 #define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |             \
46         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
47         PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
48
49 #define SPI_PAD_CTRL (PAD_CTL_HYS |                             \
50         PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
51         PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
52
53 int dram_init(void)
54 {
55        gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
56
57        return 0;
58 }
59
60 iomux_v3_cfg_t uart1_pads[] = {
61         MX6Q_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
62         MX6Q_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
63 };
64
65 iomux_v3_cfg_t uart2_pads[] = {
66        MX6Q_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
67        MX6Q_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
68 };
69
70 iomux_v3_cfg_t usdhc3_pads[] = {
71        MX6Q_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
72        MX6Q_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
73        MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
74        MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
75        MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
76        MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
77        MX6Q_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
78 };
79
80 iomux_v3_cfg_t usdhc4_pads[] = {
81        MX6Q_PAD_SD4_CLK__USDHC4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
82        MX6Q_PAD_SD4_CMD__USDHC4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
83        MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
84        MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
85        MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
86        MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
87        MX6Q_PAD_NANDF_D6__GPIO_2_6    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
88 };
89
90 iomux_v3_cfg_t enet_pads1[] = {
91         MX6Q_PAD_ENET_MDIO__ENET_MDIO           | MUX_PAD_CTRL(ENET_PAD_CTRL),
92         MX6Q_PAD_ENET_MDC__ENET_MDC             | MUX_PAD_CTRL(ENET_PAD_CTRL),
93         MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC      | MUX_PAD_CTRL(ENET_PAD_CTRL),
94         MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0      | MUX_PAD_CTRL(ENET_PAD_CTRL),
95         MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1      | MUX_PAD_CTRL(ENET_PAD_CTRL),
96         MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2      | MUX_PAD_CTRL(ENET_PAD_CTRL),
97         MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3      | MUX_PAD_CTRL(ENET_PAD_CTRL),
98         MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL     | MUX_PAD_CTRL(ENET_PAD_CTRL),
99         MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK      | MUX_PAD_CTRL(ENET_PAD_CTRL),
100         /* pin 35 - 1 (PHY_AD2) on reset */
101         MX6Q_PAD_RGMII_RXC__GPIO_6_30           | MUX_PAD_CTRL(NO_PAD_CTRL),
102         /* pin 32 - 1 - (MODE0) all */
103         MX6Q_PAD_RGMII_RD0__GPIO_6_25           | MUX_PAD_CTRL(NO_PAD_CTRL),
104         /* pin 31 - 1 - (MODE1) all */
105         MX6Q_PAD_RGMII_RD1__GPIO_6_27           | MUX_PAD_CTRL(NO_PAD_CTRL),
106         /* pin 28 - 1 - (MODE2) all */
107         MX6Q_PAD_RGMII_RD2__GPIO_6_28           | MUX_PAD_CTRL(NO_PAD_CTRL),
108         /* pin 27 - 1 - (MODE3) all */
109         MX6Q_PAD_RGMII_RD3__GPIO_6_29           | MUX_PAD_CTRL(NO_PAD_CTRL),
110         /* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
111         MX6Q_PAD_RGMII_RX_CTL__GPIO_6_24        | MUX_PAD_CTRL(NO_PAD_CTRL),
112         /* pin 42 PHY nRST */
113         MX6Q_PAD_EIM_D23__GPIO_3_23             | MUX_PAD_CTRL(NO_PAD_CTRL),
114 };
115
116 iomux_v3_cfg_t enet_pads2[] = {
117         MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC      | MUX_PAD_CTRL(ENET_PAD_CTRL),
118         MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0      | MUX_PAD_CTRL(ENET_PAD_CTRL),
119         MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1      | MUX_PAD_CTRL(ENET_PAD_CTRL),
120         MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2      | MUX_PAD_CTRL(ENET_PAD_CTRL),
121         MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3      | MUX_PAD_CTRL(ENET_PAD_CTRL),
122         MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL     | MUX_PAD_CTRL(ENET_PAD_CTRL),
123 };
124
125 static void setup_iomux_enet(void)
126 {
127         gpio_direction_output(87, 0);  /* GPIO 3-23 */
128         gpio_direction_output(190, 1); /* GPIO 6-30 */
129         gpio_direction_output(185, 1); /* GPIO 6-25 */
130         gpio_direction_output(187, 1); /* GPIO 6-27 */
131         gpio_direction_output(188, 1); /* GPIO 6-28*/
132         gpio_direction_output(189, 1); /* GPIO 6-29 */
133         imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
134         gpio_direction_output(184, 1); /* GPIO 6-24 */
135
136         /* Need delay 10ms according to KSZ9021 spec */
137         udelay(1000 * 10);
138         gpio_direction_output(87, 1);  /* GPIO 3-23 */
139
140         imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
141 }
142
143 iomux_v3_cfg_t usb_pads[] = {
144         MX6Q_PAD_GPIO_17__GPIO_7_12 | MUX_PAD_CTRL(NO_PAD_CTRL),
145 };
146
147 static void setup_iomux_uart(void)
148 {
149         imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
150        imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
151 }
152
153 #ifdef CONFIG_USB_EHCI_MX6
154 int board_ehci_hcd_init(int port)
155 {
156         imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
157
158         /* Reset USB hub */
159         gpio_direction_output(GPIO_NUMBER(7, 12), 0);
160         mdelay(2);
161         gpio_set_value(GPIO_NUMBER(7, 12), 1);
162
163         return 0;
164 }
165 #endif
166
167 #ifdef CONFIG_FSL_ESDHC
168 struct fsl_esdhc_cfg usdhc_cfg[2] = {
169        {USDHC3_BASE_ADDR, 1},
170        {USDHC4_BASE_ADDR, 1},
171 };
172
173 int board_mmc_getcd(struct mmc *mmc)
174 {
175        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
176        int ret;
177
178        if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
179                gpio_direction_input(192); /*GPIO7_0*/
180                ret = !gpio_get_value(192);
181        } else {
182                gpio_direction_input(38); /*GPIO2_6*/
183                ret = !gpio_get_value(38);
184        }
185
186        return ret;
187 }
188
189 int board_mmc_init(bd_t *bis)
190 {
191        s32 status = 0;
192        u32 index = 0;
193
194        for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
195                switch (index) {
196                case 0:
197                        imx_iomux_v3_setup_multiple_pads(
198                                usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
199                        break;
200                case 1:
201                        imx_iomux_v3_setup_multiple_pads(
202                                usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
203                        break;
204                default:
205                        printf("Warning: you configured more USDHC controllers"
206                                "(%d) then supported by the board (%d)\n",
207                                index + 1, CONFIG_SYS_FSL_USDHC_NUM);
208                        return status;
209                }
210
211                status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
212        }
213
214        return status;
215 }
216 #endif
217
218 #ifdef CONFIG_MXC_SPI
219 iomux_v3_cfg_t ecspi1_pads[] = {
220         /* SS1 */
221         MX6Q_PAD_EIM_D19__GPIO_3_19   | MUX_PAD_CTRL(SPI_PAD_CTRL),
222         MX6Q_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
223         MX6Q_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
224         MX6Q_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
225 };
226
227 void setup_spi(void)
228 {
229         gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
230         imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
231                                          ARRAY_SIZE(ecspi1_pads));
232 }
233 #endif
234
235 int board_phy_config(struct phy_device *phydev)
236 {
237         /* min rx data delay */
238         ksz9021_phy_extended_write(phydev,
239                         MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
240         /* min tx data delay */
241         ksz9021_phy_extended_write(phydev,
242                         MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
243         /* max rx/tx clock delay, min rx/tx control */
244         ksz9021_phy_extended_write(phydev,
245                         MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
246         if (phydev->drv->config)
247                 phydev->drv->config(phydev);
248  
249         return 0;
250 }
251
252 int board_eth_init(bd_t *bis)
253 {
254         int ret;
255
256         setup_iomux_enet();
257
258         ret = cpu_eth_init(bis);
259         if (ret)
260                 printf("FEC MXC: %s:failed\n", __func__);
261
262         return 0;
263 }
264
265 int board_early_init_f(void)
266 {
267        setup_iomux_uart();
268
269        return 0;
270 }
271
272 int board_init(void)
273 {
274        /* address of boot parameters */
275        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
276
277 #ifdef CONFIG_MXC_SPI
278         setup_spi();
279 #endif
280
281        return 0;
282 }
283
284 int checkboard(void)
285 {
286        puts("Board: MX6Q-Sabre Lite\n");
287
288        return 0;
289 }