Commit 721193c18f248faa1c892cc64fc656b21b7320b8
1 parent
d7a3a0d519
Exists in
smarc-n7.1.2_2.0.0-ga
and in
2 other branches
MLK-15341 mx6qpsabresd: add PHY AR8031 hw reset
Currently mx6qpsabresd board file only add PHY AR8031 gpio reset in non-DM driver, then net DM driver PHY cannot work after stress reboot test. So also add gpio reset for DM driver. RGMII and PHY work at VDDIO 1.8V has better timing and to align the IO voltage with kernel, also set the IO voltage to 1.8V. Since i.MX6QP tx_clk can loop from SOC internal, no need to set PHY output 125Mhz clock that can save power. Signed-off-by: Fugang Duan <fugang.duan@nxp.com> Reviewed-by: Ye Li <ye.li@nxp.com>
Showing 1 changed file with 22 additions and 10 deletions Inline Diff
board/freescale/mx6sabresd/mx6sabresd.c
1 | /* | 1 | /* |
2 | * Copyright (C) 2012-2016 Freescale Semiconductor, Inc. | 2 | * Copyright (C) 2012-2016 Freescale Semiconductor, Inc. |
3 | * | 3 | * |
4 | * Author: Fabio Estevam <fabio.estevam@freescale.com> | 4 | * Author: Fabio Estevam <fabio.estevam@freescale.com> |
5 | * | 5 | * |
6 | * SPDX-License-Identifier: GPL-2.0+ | 6 | * SPDX-License-Identifier: GPL-2.0+ |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <asm/arch/clock.h> | 9 | #include <asm/arch/clock.h> |
10 | #include <asm/arch/imx-regs.h> | 10 | #include <asm/arch/imx-regs.h> |
11 | #include <asm/arch/iomux.h> | 11 | #include <asm/arch/iomux.h> |
12 | #include <asm/arch/mx6-pins.h> | 12 | #include <asm/arch/mx6-pins.h> |
13 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
14 | #include <asm/gpio.h> | 14 | #include <asm/gpio.h> |
15 | #include <asm/imx-common/mxc_i2c.h> | 15 | #include <asm/imx-common/mxc_i2c.h> |
16 | #include <asm/imx-common/iomux-v3.h> | 16 | #include <asm/imx-common/iomux-v3.h> |
17 | #include <asm/imx-common/boot_mode.h> | 17 | #include <asm/imx-common/boot_mode.h> |
18 | #include <asm/imx-common/video.h> | 18 | #include <asm/imx-common/video.h> |
19 | #include <mmc.h> | 19 | #include <mmc.h> |
20 | #include <fsl_esdhc.h> | 20 | #include <fsl_esdhc.h> |
21 | #include <miiphy.h> | 21 | #include <miiphy.h> |
22 | #include <netdev.h> | 22 | #include <netdev.h> |
23 | #include <asm/arch/mxc_hdmi.h> | 23 | #include <asm/arch/mxc_hdmi.h> |
24 | #include <asm/arch/crm_regs.h> | 24 | #include <asm/arch/crm_regs.h> |
25 | #include <asm/io.h> | 25 | #include <asm/io.h> |
26 | #include <asm/arch/sys_proto.h> | 26 | #include <asm/arch/sys_proto.h> |
27 | #include <i2c.h> | 27 | #include <i2c.h> |
28 | #include <power/pmic.h> | 28 | #include <power/pmic.h> |
29 | #include <power/pfuze100_pmic.h> | 29 | #include <power/pfuze100_pmic.h> |
30 | #include "../common/pfuze.h" | 30 | #include "../common/pfuze.h" |
31 | #include <asm/arch/mx6-ddr.h> | 31 | #include <asm/arch/mx6-ddr.h> |
32 | #include <usb.h> | 32 | #include <usb.h> |
33 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) | 33 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) |
34 | #include <lcd.h> | 34 | #include <lcd.h> |
35 | #include <mxc_epdc_fb.h> | 35 | #include <mxc_epdc_fb.h> |
36 | #endif | 36 | #endif |
37 | #ifdef CONFIG_CMD_SATA | 37 | #ifdef CONFIG_CMD_SATA |
38 | #include <asm/imx-common/sata.h> | 38 | #include <asm/imx-common/sata.h> |
39 | #endif | 39 | #endif |
40 | #ifdef CONFIG_FSL_FASTBOOT | 40 | #ifdef CONFIG_FSL_FASTBOOT |
41 | #include <fsl_fastboot.h> | 41 | #include <fsl_fastboot.h> |
42 | #ifdef CONFIG_ANDROID_RECOVERY | 42 | #ifdef CONFIG_ANDROID_RECOVERY |
43 | #include <recovery.h> | 43 | #include <recovery.h> |
44 | #endif | 44 | #endif |
45 | #endif /*CONFIG_FSL_FASTBOOT*/ | 45 | #endif /*CONFIG_FSL_FASTBOOT*/ |
46 | 46 | ||
47 | DECLARE_GLOBAL_DATA_PTR; | 47 | DECLARE_GLOBAL_DATA_PTR; |
48 | 48 | ||
49 | #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ | 49 | #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ |
50 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \ | 50 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \ |
51 | PAD_CTL_SRE_FAST | PAD_CTL_HYS) | 51 | PAD_CTL_SRE_FAST | PAD_CTL_HYS) |
52 | 52 | ||
53 | #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \ | 53 | #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \ |
54 | PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \ | 54 | PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \ |
55 | PAD_CTL_SRE_FAST | PAD_CTL_HYS) | 55 | PAD_CTL_SRE_FAST | PAD_CTL_HYS) |
56 | 56 | ||
57 | #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ | 57 | #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ |
58 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS) | 58 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS) |
59 | 59 | ||
60 | #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \ | 60 | #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \ |
61 | PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST) | 61 | PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST) |
62 | 62 | ||
63 | #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ | 63 | #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ |
64 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \ | 64 | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \ |
65 | PAD_CTL_ODE | PAD_CTL_SRE_FAST) | 65 | PAD_CTL_ODE | PAD_CTL_SRE_FAST) |
66 | 66 | ||
67 | #define EPDC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_SPEED_MED | \ | 67 | #define EPDC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_SPEED_MED | \ |
68 | PAD_CTL_DSE_40ohm | PAD_CTL_HYS) | 68 | PAD_CTL_DSE_40ohm | PAD_CTL_HYS) |
69 | 69 | ||
70 | #define OTG_ID_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \ | 70 | #define OTG_ID_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \ |
71 | PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW | \ | 71 | PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW | \ |
72 | PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS) | 72 | PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS) |
73 | 73 | ||
74 | 74 | ||
75 | #define I2C_PMIC 1 | 75 | #define I2C_PMIC 1 |
76 | 76 | ||
77 | #define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL) | 77 | #define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL) |
78 | 78 | ||
79 | #define DISP0_PWR_EN IMX_GPIO_NR(1, 21) | 79 | #define DISP0_PWR_EN IMX_GPIO_NR(1, 21) |
80 | 80 | ||
81 | #define KEY_VOL_UP IMX_GPIO_NR(1, 4) | 81 | #define KEY_VOL_UP IMX_GPIO_NR(1, 4) |
82 | 82 | ||
83 | int dram_init(void) | 83 | int dram_init(void) |
84 | { | 84 | { |
85 | gd->ram_size = imx_ddr_size(); | 85 | gd->ram_size = imx_ddr_size(); |
86 | return 0; | 86 | return 0; |
87 | } | 87 | } |
88 | 88 | ||
89 | static iomux_v3_cfg_t const uart1_pads[] = { | 89 | static iomux_v3_cfg_t const uart1_pads[] = { |
90 | MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL), | 90 | MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL), |
91 | MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL), | 91 | MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL), |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static iomux_v3_cfg_t const enet_pads[] = { | 94 | static iomux_v3_cfg_t const enet_pads[] = { |
95 | MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL), | 95 | MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL), |
96 | MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL), | 96 | MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL), |
97 | MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL), | 97 | MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL), |
98 | MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 98 | MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
99 | MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 99 | MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
100 | MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 100 | MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
101 | MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 101 | MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
102 | MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL), | 102 | MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL), |
103 | MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL), | 103 | MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL), |
104 | MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL), | 104 | MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL), |
105 | MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 105 | MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
106 | MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 106 | MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
107 | MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 107 | MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
108 | MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL), | 108 | MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL), |
109 | MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL), | 109 | MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL), |
110 | /* AR8031 PHY Reset */ | 110 | /* AR8031 PHY Reset */ |
111 | MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL), | 111 | MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL), |
112 | }; | 112 | }; |
113 | 113 | ||
114 | static void setup_iomux_enet(void) | 114 | static void fec_phy_reset(void) |
115 | { | 115 | { |
116 | imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads)); | ||
117 | |||
118 | /* Reset AR8031 PHY */ | 116 | /* Reset AR8031 PHY */ |
119 | gpio_request(IMX_GPIO_NR(1, 25), "ENET PHY Reset"); | 117 | gpio_request(IMX_GPIO_NR(1, 25), "ENET PHY Reset"); |
120 | gpio_direction_output(IMX_GPIO_NR(1, 25) , 0); | 118 | gpio_direction_output(IMX_GPIO_NR(1, 25) , 0); |
121 | mdelay(10); | 119 | mdelay(10); |
122 | gpio_set_value(IMX_GPIO_NR(1, 25), 1); | 120 | gpio_set_value(IMX_GPIO_NR(1, 25), 1); |
123 | udelay(100); | 121 | udelay(100); |
124 | } | 122 | } |
125 | 123 | ||
124 | static void setup_iomux_enet(void) | ||
125 | { | ||
126 | imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads)); | ||
127 | fec_phy_reset(); | ||
128 | } | ||
129 | |||
126 | static iomux_v3_cfg_t const usdhc2_pads[] = { | 130 | static iomux_v3_cfg_t const usdhc2_pads[] = { |
127 | MX6_PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 131 | MX6_PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
128 | MX6_PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 132 | MX6_PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
129 | MX6_PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 133 | MX6_PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
130 | MX6_PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 134 | MX6_PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
131 | MX6_PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 135 | MX6_PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
132 | MX6_PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 136 | MX6_PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
133 | MX6_PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 137 | MX6_PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
134 | MX6_PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 138 | MX6_PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
135 | MX6_PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 139 | MX6_PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
136 | MX6_PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 140 | MX6_PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
137 | MX6_PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */ | 141 | MX6_PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */ |
138 | }; | 142 | }; |
139 | 143 | ||
140 | static iomux_v3_cfg_t const usdhc3_pads[] = { | 144 | static iomux_v3_cfg_t const usdhc3_pads[] = { |
141 | MX6_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 145 | MX6_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
142 | MX6_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 146 | MX6_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
143 | MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 147 | MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
144 | MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 148 | MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
145 | MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 149 | MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
146 | MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 150 | MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
147 | MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 151 | MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
148 | MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 152 | MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
149 | MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 153 | MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
150 | MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 154 | MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
151 | MX6_PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */ | 155 | MX6_PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */ |
152 | }; | 156 | }; |
153 | 157 | ||
154 | static iomux_v3_cfg_t const usdhc4_pads[] = { | 158 | static iomux_v3_cfg_t const usdhc4_pads[] = { |
155 | MX6_PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 159 | MX6_PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
156 | MX6_PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 160 | MX6_PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
157 | MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 161 | MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
158 | MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 162 | MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
159 | MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 163 | MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
160 | MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 164 | MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
161 | MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 165 | MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
162 | MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 166 | MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
163 | MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 167 | MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
164 | MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), | 168 | MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), |
165 | }; | 169 | }; |
166 | 170 | ||
167 | #ifdef CONFIG_MXC_SPI | 171 | #ifdef CONFIG_MXC_SPI |
168 | static iomux_v3_cfg_t const ecspi1_pads[] = { | 172 | static iomux_v3_cfg_t const ecspi1_pads[] = { |
169 | MX6_PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL), | 173 | MX6_PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL), |
170 | MX6_PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL), | 174 | MX6_PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL), |
171 | MX6_PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL), | 175 | MX6_PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL), |
172 | MX6_PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL), | 176 | MX6_PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL), |
173 | }; | 177 | }; |
174 | 178 | ||
175 | static void setup_spi(void) | 179 | static void setup_spi(void) |
176 | { | 180 | { |
177 | imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads)); | 181 | imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads)); |
178 | gpio_request(IMX_GPIO_NR(4, 9), "ECSPI1 CS"); | 182 | gpio_request(IMX_GPIO_NR(4, 9), "ECSPI1 CS"); |
179 | } | 183 | } |
180 | 184 | ||
181 | int board_spi_cs_gpio(unsigned bus, unsigned cs) | 185 | int board_spi_cs_gpio(unsigned bus, unsigned cs) |
182 | { | 186 | { |
183 | return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1; | 187 | return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1; |
184 | } | 188 | } |
185 | #endif | 189 | #endif |
186 | 190 | ||
187 | static iomux_v3_cfg_t const rgb_pads[] = { | 191 | static iomux_v3_cfg_t const rgb_pads[] = { |
188 | MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL), | 192 | MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL), |
189 | MX6_PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL), | 193 | MX6_PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL), |
190 | MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL), | 194 | MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL), |
191 | MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL), | 195 | MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL), |
192 | MX6_PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL), | 196 | MX6_PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL), |
193 | MX6_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL), | 197 | MX6_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL), |
194 | MX6_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL), | 198 | MX6_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL), |
195 | MX6_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL), | 199 | MX6_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL), |
196 | MX6_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL), | 200 | MX6_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL), |
197 | MX6_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL), | 201 | MX6_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL), |
198 | MX6_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL), | 202 | MX6_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL), |
199 | MX6_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL), | 203 | MX6_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL), |
200 | MX6_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL), | 204 | MX6_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL), |
201 | MX6_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL), | 205 | MX6_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL), |
202 | MX6_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL), | 206 | MX6_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL), |
203 | MX6_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL), | 207 | MX6_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL), |
204 | MX6_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL), | 208 | MX6_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL), |
205 | MX6_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL), | 209 | MX6_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL), |
206 | MX6_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL), | 210 | MX6_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL), |
207 | MX6_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL), | 211 | MX6_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL), |
208 | MX6_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL), | 212 | MX6_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL), |
209 | MX6_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL), | 213 | MX6_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL), |
210 | MX6_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL), | 214 | MX6_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL), |
211 | MX6_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL), | 215 | MX6_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL), |
212 | MX6_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL), | 216 | MX6_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL), |
213 | MX6_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL), | 217 | MX6_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL), |
214 | MX6_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL), | 218 | MX6_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL), |
215 | MX6_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL), | 219 | MX6_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL), |
216 | MX6_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL), | 220 | MX6_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL), |
217 | }; | 221 | }; |
218 | 222 | ||
219 | static iomux_v3_cfg_t const bl_pads[] = { | 223 | static iomux_v3_cfg_t const bl_pads[] = { |
220 | MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL), | 224 | MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL), |
221 | }; | 225 | }; |
222 | 226 | ||
223 | static void enable_backlight(void) | 227 | static void enable_backlight(void) |
224 | { | 228 | { |
225 | imx_iomux_v3_setup_multiple_pads(bl_pads, ARRAY_SIZE(bl_pads)); | 229 | imx_iomux_v3_setup_multiple_pads(bl_pads, ARRAY_SIZE(bl_pads)); |
226 | gpio_request(DISP0_PWR_EN, "Display Power Enable"); | 230 | gpio_request(DISP0_PWR_EN, "Display Power Enable"); |
227 | gpio_direction_output(DISP0_PWR_EN, 1); | 231 | gpio_direction_output(DISP0_PWR_EN, 1); |
228 | } | 232 | } |
229 | 233 | ||
230 | static void enable_rgb(struct display_info_t const *dev) | 234 | static void enable_rgb(struct display_info_t const *dev) |
231 | { | 235 | { |
232 | imx_iomux_v3_setup_multiple_pads(rgb_pads, ARRAY_SIZE(rgb_pads)); | 236 | imx_iomux_v3_setup_multiple_pads(rgb_pads, ARRAY_SIZE(rgb_pads)); |
233 | enable_backlight(); | 237 | enable_backlight(); |
234 | } | 238 | } |
235 | 239 | ||
236 | static void enable_lvds(struct display_info_t const *dev) | 240 | static void enable_lvds(struct display_info_t const *dev) |
237 | { | 241 | { |
238 | enable_backlight(); | 242 | enable_backlight(); |
239 | } | 243 | } |
240 | 244 | ||
241 | #ifdef CONFIG_SYS_I2C | 245 | #ifdef CONFIG_SYS_I2C |
242 | static struct i2c_pads_info i2c_pad_info1 = { | 246 | static struct i2c_pads_info i2c_pad_info1 = { |
243 | .scl = { | 247 | .scl = { |
244 | .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | I2C_PAD, | 248 | .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | I2C_PAD, |
245 | .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD, | 249 | .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD, |
246 | .gp = IMX_GPIO_NR(4, 12) | 250 | .gp = IMX_GPIO_NR(4, 12) |
247 | }, | 251 | }, |
248 | .sda = { | 252 | .sda = { |
249 | .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD, | 253 | .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD, |
250 | .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD, | 254 | .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD, |
251 | .gp = IMX_GPIO_NR(4, 13) | 255 | .gp = IMX_GPIO_NR(4, 13) |
252 | } | 256 | } |
253 | }; | 257 | }; |
254 | #endif | 258 | #endif |
255 | 259 | ||
256 | #ifdef CONFIG_PCIE_IMX | 260 | #ifdef CONFIG_PCIE_IMX |
257 | iomux_v3_cfg_t const pcie_pads[] = { | 261 | iomux_v3_cfg_t const pcie_pads[] = { |
258 | MX6_PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL), /* POWER */ | 262 | MX6_PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL), /* POWER */ |
259 | MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL), /* RESET */ | 263 | MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL), /* RESET */ |
260 | }; | 264 | }; |
261 | 265 | ||
262 | static void setup_pcie(void) | 266 | static void setup_pcie(void) |
263 | { | 267 | { |
264 | imx_iomux_v3_setup_multiple_pads(pcie_pads, ARRAY_SIZE(pcie_pads)); | 268 | imx_iomux_v3_setup_multiple_pads(pcie_pads, ARRAY_SIZE(pcie_pads)); |
265 | gpio_request(CONFIG_PCIE_IMX_POWER_GPIO, "PCIE Power Enable"); | 269 | gpio_request(CONFIG_PCIE_IMX_POWER_GPIO, "PCIE Power Enable"); |
266 | gpio_request(CONFIG_PCIE_IMX_PERST_GPIO, "PCIE Reset"); | 270 | gpio_request(CONFIG_PCIE_IMX_PERST_GPIO, "PCIE Reset"); |
267 | } | 271 | } |
268 | #endif | 272 | #endif |
269 | 273 | ||
270 | iomux_v3_cfg_t const di0_pads[] = { | 274 | iomux_v3_cfg_t const di0_pads[] = { |
271 | MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK, /* DISP0_CLK */ | 275 | MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK, /* DISP0_CLK */ |
272 | MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02, /* DISP0_HSYNC */ | 276 | MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02, /* DISP0_HSYNC */ |
273 | MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03, /* DISP0_VSYNC */ | 277 | MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03, /* DISP0_VSYNC */ |
274 | }; | 278 | }; |
275 | 279 | ||
276 | static void setup_iomux_uart(void) | 280 | static void setup_iomux_uart(void) |
277 | { | 281 | { |
278 | imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads)); | 282 | imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads)); |
279 | } | 283 | } |
280 | 284 | ||
281 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) | 285 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) |
282 | static iomux_v3_cfg_t const epdc_enable_pads[] = { | 286 | static iomux_v3_cfg_t const epdc_enable_pads[] = { |
283 | MX6_PAD_EIM_A16__EPDC_DATA00 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 287 | MX6_PAD_EIM_A16__EPDC_DATA00 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
284 | MX6_PAD_EIM_DA10__EPDC_DATA01 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 288 | MX6_PAD_EIM_DA10__EPDC_DATA01 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
285 | MX6_PAD_EIM_DA12__EPDC_DATA02 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 289 | MX6_PAD_EIM_DA12__EPDC_DATA02 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
286 | MX6_PAD_EIM_DA11__EPDC_DATA03 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 290 | MX6_PAD_EIM_DA11__EPDC_DATA03 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
287 | MX6_PAD_EIM_LBA__EPDC_DATA04 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 291 | MX6_PAD_EIM_LBA__EPDC_DATA04 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
288 | MX6_PAD_EIM_EB2__EPDC_DATA05 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 292 | MX6_PAD_EIM_EB2__EPDC_DATA05 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
289 | MX6_PAD_EIM_CS0__EPDC_DATA06 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 293 | MX6_PAD_EIM_CS0__EPDC_DATA06 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
290 | MX6_PAD_EIM_RW__EPDC_DATA07 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 294 | MX6_PAD_EIM_RW__EPDC_DATA07 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
291 | MX6_PAD_EIM_A21__EPDC_GDCLK | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 295 | MX6_PAD_EIM_A21__EPDC_GDCLK | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
292 | MX6_PAD_EIM_A22__EPDC_GDSP | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 296 | MX6_PAD_EIM_A22__EPDC_GDSP | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
293 | MX6_PAD_EIM_A23__EPDC_GDOE | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 297 | MX6_PAD_EIM_A23__EPDC_GDOE | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
294 | MX6_PAD_EIM_A24__EPDC_GDRL | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 298 | MX6_PAD_EIM_A24__EPDC_GDRL | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
295 | MX6_PAD_EIM_D31__EPDC_SDCLK_P | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 299 | MX6_PAD_EIM_D31__EPDC_SDCLK_P | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
296 | MX6_PAD_EIM_D27__EPDC_SDOE | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 300 | MX6_PAD_EIM_D27__EPDC_SDOE | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
297 | MX6_PAD_EIM_DA1__EPDC_SDLE | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 301 | MX6_PAD_EIM_DA1__EPDC_SDLE | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
298 | MX6_PAD_EIM_EB1__EPDC_SDSHR | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 302 | MX6_PAD_EIM_EB1__EPDC_SDSHR | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
299 | MX6_PAD_EIM_DA2__EPDC_BDR0 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 303 | MX6_PAD_EIM_DA2__EPDC_BDR0 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
300 | MX6_PAD_EIM_DA4__EPDC_SDCE0 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 304 | MX6_PAD_EIM_DA4__EPDC_SDCE0 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
301 | MX6_PAD_EIM_DA5__EPDC_SDCE1 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 305 | MX6_PAD_EIM_DA5__EPDC_SDCE1 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
302 | MX6_PAD_EIM_DA6__EPDC_SDCE2 | MUX_PAD_CTRL(EPDC_PAD_CTRL), | 306 | MX6_PAD_EIM_DA6__EPDC_SDCE2 | MUX_PAD_CTRL(EPDC_PAD_CTRL), |
303 | }; | 307 | }; |
304 | 308 | ||
305 | static iomux_v3_cfg_t const epdc_disable_pads[] = { | 309 | static iomux_v3_cfg_t const epdc_disable_pads[] = { |
306 | MX6_PAD_EIM_A16__GPIO2_IO22, | 310 | MX6_PAD_EIM_A16__GPIO2_IO22, |
307 | MX6_PAD_EIM_DA10__GPIO3_IO10, | 311 | MX6_PAD_EIM_DA10__GPIO3_IO10, |
308 | MX6_PAD_EIM_DA12__GPIO3_IO12, | 312 | MX6_PAD_EIM_DA12__GPIO3_IO12, |
309 | MX6_PAD_EIM_DA11__GPIO3_IO11, | 313 | MX6_PAD_EIM_DA11__GPIO3_IO11, |
310 | MX6_PAD_EIM_LBA__GPIO2_IO27, | 314 | MX6_PAD_EIM_LBA__GPIO2_IO27, |
311 | MX6_PAD_EIM_EB2__GPIO2_IO30, | 315 | MX6_PAD_EIM_EB2__GPIO2_IO30, |
312 | MX6_PAD_EIM_CS0__GPIO2_IO23, | 316 | MX6_PAD_EIM_CS0__GPIO2_IO23, |
313 | MX6_PAD_EIM_RW__GPIO2_IO26, | 317 | MX6_PAD_EIM_RW__GPIO2_IO26, |
314 | MX6_PAD_EIM_A21__GPIO2_IO17, | 318 | MX6_PAD_EIM_A21__GPIO2_IO17, |
315 | MX6_PAD_EIM_A22__GPIO2_IO16, | 319 | MX6_PAD_EIM_A22__GPIO2_IO16, |
316 | MX6_PAD_EIM_A23__GPIO6_IO06, | 320 | MX6_PAD_EIM_A23__GPIO6_IO06, |
317 | MX6_PAD_EIM_A24__GPIO5_IO04, | 321 | MX6_PAD_EIM_A24__GPIO5_IO04, |
318 | MX6_PAD_EIM_D31__GPIO3_IO31, | 322 | MX6_PAD_EIM_D31__GPIO3_IO31, |
319 | MX6_PAD_EIM_D27__GPIO3_IO27, | 323 | MX6_PAD_EIM_D27__GPIO3_IO27, |
320 | MX6_PAD_EIM_DA1__GPIO3_IO01, | 324 | MX6_PAD_EIM_DA1__GPIO3_IO01, |
321 | MX6_PAD_EIM_EB1__GPIO2_IO29, | 325 | MX6_PAD_EIM_EB1__GPIO2_IO29, |
322 | MX6_PAD_EIM_DA2__GPIO3_IO02, | 326 | MX6_PAD_EIM_DA2__GPIO3_IO02, |
323 | MX6_PAD_EIM_DA4__GPIO3_IO04, | 327 | MX6_PAD_EIM_DA4__GPIO3_IO04, |
324 | MX6_PAD_EIM_DA5__GPIO3_IO05, | 328 | MX6_PAD_EIM_DA5__GPIO3_IO05, |
325 | MX6_PAD_EIM_DA6__GPIO3_IO06, | 329 | MX6_PAD_EIM_DA6__GPIO3_IO06, |
326 | }; | 330 | }; |
327 | #endif | 331 | #endif |
328 | 332 | ||
329 | #ifdef CONFIG_FSL_ESDHC | 333 | #ifdef CONFIG_FSL_ESDHC |
330 | struct fsl_esdhc_cfg usdhc_cfg[3] = { | 334 | struct fsl_esdhc_cfg usdhc_cfg[3] = { |
331 | {USDHC2_BASE_ADDR}, | 335 | {USDHC2_BASE_ADDR}, |
332 | {USDHC3_BASE_ADDR}, | 336 | {USDHC3_BASE_ADDR}, |
333 | {USDHC4_BASE_ADDR}, | 337 | {USDHC4_BASE_ADDR}, |
334 | }; | 338 | }; |
335 | 339 | ||
336 | #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2) | 340 | #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2) |
337 | #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0) | 341 | #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0) |
338 | 342 | ||
339 | int board_mmc_get_env_dev(int devno) | 343 | int board_mmc_get_env_dev(int devno) |
340 | { | 344 | { |
341 | return devno - 1; | 345 | return devno - 1; |
342 | } | 346 | } |
343 | 347 | ||
344 | int mmc_map_to_kernel_blk(int devno) | 348 | int mmc_map_to_kernel_blk(int devno) |
345 | { | 349 | { |
346 | return devno + 1; | 350 | return devno + 1; |
347 | } | 351 | } |
348 | 352 | ||
349 | int board_mmc_getcd(struct mmc *mmc) | 353 | int board_mmc_getcd(struct mmc *mmc) |
350 | { | 354 | { |
351 | struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; | 355 | struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; |
352 | int ret = 0; | 356 | int ret = 0; |
353 | 357 | ||
354 | switch (cfg->esdhc_base) { | 358 | switch (cfg->esdhc_base) { |
355 | case USDHC2_BASE_ADDR: | 359 | case USDHC2_BASE_ADDR: |
356 | ret = !gpio_get_value(USDHC2_CD_GPIO); | 360 | ret = !gpio_get_value(USDHC2_CD_GPIO); |
357 | break; | 361 | break; |
358 | case USDHC3_BASE_ADDR: | 362 | case USDHC3_BASE_ADDR: |
359 | ret = !gpio_get_value(USDHC3_CD_GPIO); | 363 | ret = !gpio_get_value(USDHC3_CD_GPIO); |
360 | break; | 364 | break; |
361 | case USDHC4_BASE_ADDR: | 365 | case USDHC4_BASE_ADDR: |
362 | ret = 1; /* eMMC/uSDHC4 is always present */ | 366 | ret = 1; /* eMMC/uSDHC4 is always present */ |
363 | break; | 367 | break; |
364 | } | 368 | } |
365 | 369 | ||
366 | return ret; | 370 | return ret; |
367 | } | 371 | } |
368 | 372 | ||
369 | int board_mmc_init(bd_t *bis) | 373 | int board_mmc_init(bd_t *bis) |
370 | { | 374 | { |
371 | #ifndef CONFIG_SPL_BUILD | 375 | #ifndef CONFIG_SPL_BUILD |
372 | int ret; | 376 | int ret; |
373 | int i; | 377 | int i; |
374 | 378 | ||
375 | /* | 379 | /* |
376 | * According to the board_mmc_init() the following map is done: | 380 | * According to the board_mmc_init() the following map is done: |
377 | * (U-Boot device node) (Physical Port) | 381 | * (U-Boot device node) (Physical Port) |
378 | * mmc0 SD2 | 382 | * mmc0 SD2 |
379 | * mmc1 SD3 | 383 | * mmc1 SD3 |
380 | * mmc2 eMMC | 384 | * mmc2 eMMC |
381 | */ | 385 | */ |
382 | for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { | 386 | for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { |
383 | switch (i) { | 387 | switch (i) { |
384 | case 0: | 388 | case 0: |
385 | imx_iomux_v3_setup_multiple_pads( | 389 | imx_iomux_v3_setup_multiple_pads( |
386 | usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); | 390 | usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); |
387 | gpio_request(USDHC2_CD_GPIO, "USDHC2 CD"); | 391 | gpio_request(USDHC2_CD_GPIO, "USDHC2 CD"); |
388 | gpio_direction_input(USDHC2_CD_GPIO); | 392 | gpio_direction_input(USDHC2_CD_GPIO); |
389 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); | 393 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); |
390 | break; | 394 | break; |
391 | case 1: | 395 | case 1: |
392 | imx_iomux_v3_setup_multiple_pads( | 396 | imx_iomux_v3_setup_multiple_pads( |
393 | usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); | 397 | usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); |
394 | gpio_request(USDHC3_CD_GPIO, "USDHC3 CD"); | 398 | gpio_request(USDHC3_CD_GPIO, "USDHC3 CD"); |
395 | gpio_direction_input(USDHC3_CD_GPIO); | 399 | gpio_direction_input(USDHC3_CD_GPIO); |
396 | usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); | 400 | usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); |
397 | break; | 401 | break; |
398 | case 2: | 402 | case 2: |
399 | imx_iomux_v3_setup_multiple_pads( | 403 | imx_iomux_v3_setup_multiple_pads( |
400 | usdhc4_pads, ARRAY_SIZE(usdhc4_pads)); | 404 | usdhc4_pads, ARRAY_SIZE(usdhc4_pads)); |
401 | usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); | 405 | usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); |
402 | break; | 406 | break; |
403 | default: | 407 | default: |
404 | printf("Warning: you configured more USDHC controllers" | 408 | printf("Warning: you configured more USDHC controllers" |
405 | "(%d) then supported by the board (%d)\n", | 409 | "(%d) then supported by the board (%d)\n", |
406 | i + 1, CONFIG_SYS_FSL_USDHC_NUM); | 410 | i + 1, CONFIG_SYS_FSL_USDHC_NUM); |
407 | return -EINVAL; | 411 | return -EINVAL; |
408 | } | 412 | } |
409 | 413 | ||
410 | ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]); | 414 | ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]); |
411 | if (ret) | 415 | if (ret) |
412 | return ret; | 416 | return ret; |
413 | } | 417 | } |
414 | 418 | ||
415 | return 0; | 419 | return 0; |
416 | #else | 420 | #else |
417 | struct src *psrc = (struct src *)SRC_BASE_ADDR; | 421 | struct src *psrc = (struct src *)SRC_BASE_ADDR; |
418 | unsigned reg = readl(&psrc->sbmr1) >> 11; | 422 | unsigned reg = readl(&psrc->sbmr1) >> 11; |
419 | /* | 423 | /* |
420 | * Upon reading BOOT_CFG register the following map is done: | 424 | * Upon reading BOOT_CFG register the following map is done: |
421 | * Bit 11 and 12 of BOOT_CFG register can determine the current | 425 | * Bit 11 and 12 of BOOT_CFG register can determine the current |
422 | * mmc port | 426 | * mmc port |
423 | * 0x1 SD1 | 427 | * 0x1 SD1 |
424 | * 0x2 SD2 | 428 | * 0x2 SD2 |
425 | * 0x3 SD4 | 429 | * 0x3 SD4 |
426 | */ | 430 | */ |
427 | 431 | ||
428 | switch (reg & 0x3) { | 432 | switch (reg & 0x3) { |
429 | case 0x1: | 433 | case 0x1: |
430 | imx_iomux_v3_setup_multiple_pads( | 434 | imx_iomux_v3_setup_multiple_pads( |
431 | usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); | 435 | usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); |
432 | usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR; | 436 | usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR; |
433 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); | 437 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); |
434 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; | 438 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; |
435 | break; | 439 | break; |
436 | case 0x2: | 440 | case 0x2: |
437 | imx_iomux_v3_setup_multiple_pads( | 441 | imx_iomux_v3_setup_multiple_pads( |
438 | usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); | 442 | usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); |
439 | usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR; | 443 | usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR; |
440 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); | 444 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); |
441 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; | 445 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; |
442 | break; | 446 | break; |
443 | case 0x3: | 447 | case 0x3: |
444 | imx_iomux_v3_setup_multiple_pads( | 448 | imx_iomux_v3_setup_multiple_pads( |
445 | usdhc4_pads, ARRAY_SIZE(usdhc4_pads)); | 449 | usdhc4_pads, ARRAY_SIZE(usdhc4_pads)); |
446 | usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR; | 450 | usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR; |
447 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); | 451 | usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); |
448 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; | 452 | gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; |
449 | break; | 453 | break; |
450 | } | 454 | } |
451 | 455 | ||
452 | return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); | 456 | return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); |
453 | #endif | 457 | #endif |
454 | } | 458 | } |
455 | #endif | 459 | #endif |
456 | 460 | ||
457 | static int ar8031_phy_fixup(struct phy_device *phydev) | 461 | static int ar8031_phy_fixup(struct phy_device *phydev) |
458 | { | 462 | { |
459 | unsigned short val; | 463 | unsigned short val; |
460 | 464 | ||
461 | /* To enable AR8031 ouput a 125MHz clk from CLK_25M */ | 465 | /* To enable AR8031 ouput a 125MHz clk from CLK_25M */ |
462 | phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7); | 466 | if (!is_mx6dqp()) { |
463 | phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); | 467 | phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7); |
464 | phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); | 468 | phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); |
469 | phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); | ||
465 | 470 | ||
466 | val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); | 471 | val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); |
467 | val &= 0xffe3; | 472 | val &= 0xffe3; |
468 | val |= 0x18; | 473 | val |= 0x18; |
469 | phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val); | 474 | phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val); |
475 | } | ||
470 | 476 | ||
477 | /* set the IO voltage to 1.8v */ | ||
478 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f); | ||
479 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8); | ||
480 | |||
471 | /* introduce tx clock delay */ | 481 | /* introduce tx clock delay */ |
472 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); | 482 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); |
473 | val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); | 483 | val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); |
474 | val |= 0x0100; | 484 | val |= 0x0100; |
475 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val); | 485 | phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val); |
476 | 486 | ||
477 | return 0; | 487 | return 0; |
478 | } | 488 | } |
479 | 489 | ||
480 | int board_phy_config(struct phy_device *phydev) | 490 | int board_phy_config(struct phy_device *phydev) |
481 | { | 491 | { |
482 | ar8031_phy_fixup(phydev); | 492 | ar8031_phy_fixup(phydev); |
483 | 493 | ||
484 | if (phydev->drv->config) | 494 | if (phydev->drv->config) |
485 | phydev->drv->config(phydev); | 495 | phydev->drv->config(phydev); |
486 | 496 | ||
487 | return 0; | 497 | return 0; |
488 | } | 498 | } |
489 | 499 | ||
490 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) | 500 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) |
491 | vidinfo_t panel_info = { | 501 | vidinfo_t panel_info = { |
492 | .vl_refresh = 85, | 502 | .vl_refresh = 85, |
493 | .vl_col = 800, | 503 | .vl_col = 800, |
494 | .vl_row = 600, | 504 | .vl_row = 600, |
495 | .vl_pixclock = 26666667, | 505 | .vl_pixclock = 26666667, |
496 | .vl_left_margin = 8, | 506 | .vl_left_margin = 8, |
497 | .vl_right_margin = 100, | 507 | .vl_right_margin = 100, |
498 | .vl_upper_margin = 4, | 508 | .vl_upper_margin = 4, |
499 | .vl_lower_margin = 8, | 509 | .vl_lower_margin = 8, |
500 | .vl_hsync = 4, | 510 | .vl_hsync = 4, |
501 | .vl_vsync = 1, | 511 | .vl_vsync = 1, |
502 | .vl_sync = 0, | 512 | .vl_sync = 0, |
503 | .vl_mode = 0, | 513 | .vl_mode = 0, |
504 | .vl_flag = 0, | 514 | .vl_flag = 0, |
505 | .vl_bpix = 3, | 515 | .vl_bpix = 3, |
506 | .cmap = 0, | 516 | .cmap = 0, |
507 | }; | 517 | }; |
508 | 518 | ||
509 | struct epdc_timing_params panel_timings = { | 519 | struct epdc_timing_params panel_timings = { |
510 | .vscan_holdoff = 4, | 520 | .vscan_holdoff = 4, |
511 | .sdoed_width = 10, | 521 | .sdoed_width = 10, |
512 | .sdoed_delay = 20, | 522 | .sdoed_delay = 20, |
513 | .sdoez_width = 10, | 523 | .sdoez_width = 10, |
514 | .sdoez_delay = 20, | 524 | .sdoez_delay = 20, |
515 | .gdclk_hp_offs = 419, | 525 | .gdclk_hp_offs = 419, |
516 | .gdsp_offs = 20, | 526 | .gdsp_offs = 20, |
517 | .gdoe_offs = 0, | 527 | .gdoe_offs = 0, |
518 | .gdclk_offs = 5, | 528 | .gdclk_offs = 5, |
519 | .num_ce = 1, | 529 | .num_ce = 1, |
520 | }; | 530 | }; |
521 | 531 | ||
522 | static void setup_epdc_power(void) | 532 | static void setup_epdc_power(void) |
523 | { | 533 | { |
524 | /* Setup epdc voltage */ | 534 | /* Setup epdc voltage */ |
525 | 535 | ||
526 | /* EIM_A17 - GPIO2[21] for PWR_GOOD status */ | 536 | /* EIM_A17 - GPIO2[21] for PWR_GOOD status */ |
527 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_A17__GPIO2_IO21 | | 537 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_A17__GPIO2_IO21 | |
528 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); | 538 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); |
529 | /* Set as input */ | 539 | /* Set as input */ |
530 | gpio_request(IMX_GPIO_NR(2, 21), "EPDC PWRSTAT"); | 540 | gpio_request(IMX_GPIO_NR(2, 21), "EPDC PWRSTAT"); |
531 | gpio_direction_input(IMX_GPIO_NR(2, 21)); | 541 | gpio_direction_input(IMX_GPIO_NR(2, 21)); |
532 | 542 | ||
533 | /* EIM_D17 - GPIO3[17] for VCOM control */ | 543 | /* EIM_D17 - GPIO3[17] for VCOM control */ |
534 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_D17__GPIO3_IO17 | | 544 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_D17__GPIO3_IO17 | |
535 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); | 545 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); |
536 | 546 | ||
537 | /* Set as output */ | 547 | /* Set as output */ |
538 | gpio_request(IMX_GPIO_NR(3, 17), "EPDC VCOM0"); | 548 | gpio_request(IMX_GPIO_NR(3, 17), "EPDC VCOM0"); |
539 | gpio_direction_output(IMX_GPIO_NR(3, 17), 1); | 549 | gpio_direction_output(IMX_GPIO_NR(3, 17), 1); |
540 | 550 | ||
541 | /* EIM_D20 - GPIO3[20] for EPD PMIC WAKEUP */ | 551 | /* EIM_D20 - GPIO3[20] for EPD PMIC WAKEUP */ |
542 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_D20__GPIO3_IO20 | | 552 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_D20__GPIO3_IO20 | |
543 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); | 553 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); |
544 | /* Set as output */ | 554 | /* Set as output */ |
545 | gpio_request(IMX_GPIO_NR(3, 20), "EPDC PWR WAKEUP"); | 555 | gpio_request(IMX_GPIO_NR(3, 20), "EPDC PWR WAKEUP"); |
546 | gpio_direction_output(IMX_GPIO_NR(3, 20), 1); | 556 | gpio_direction_output(IMX_GPIO_NR(3, 20), 1); |
547 | 557 | ||
548 | /* EIM_A18 - GPIO2[20] for EPD PWR CTL0 */ | 558 | /* EIM_A18 - GPIO2[20] for EPD PWR CTL0 */ |
549 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_A18__GPIO2_IO20 | | 559 | imx_iomux_v3_setup_pad(MX6_PAD_EIM_A18__GPIO2_IO20 | |
550 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); | 560 | MUX_PAD_CTRL(EPDC_PAD_CTRL)); |
551 | /* Set as output */ | 561 | /* Set as output */ |
552 | gpio_request(IMX_GPIO_NR(2, 20), "EPDC PWR CTRL0"); | 562 | gpio_request(IMX_GPIO_NR(2, 20), "EPDC PWR CTRL0"); |
553 | gpio_direction_output(IMX_GPIO_NR(2, 20), 1); | 563 | gpio_direction_output(IMX_GPIO_NR(2, 20), 1); |
554 | } | 564 | } |
555 | 565 | ||
556 | static void epdc_enable_pins(void) | 566 | static void epdc_enable_pins(void) |
557 | { | 567 | { |
558 | /* epdc iomux settings */ | 568 | /* epdc iomux settings */ |
559 | imx_iomux_v3_setup_multiple_pads(epdc_enable_pads, | 569 | imx_iomux_v3_setup_multiple_pads(epdc_enable_pads, |
560 | ARRAY_SIZE(epdc_enable_pads)); | 570 | ARRAY_SIZE(epdc_enable_pads)); |
561 | } | 571 | } |
562 | 572 | ||
563 | static void epdc_disable_pins(void) | 573 | static void epdc_disable_pins(void) |
564 | { | 574 | { |
565 | /* Configure MUX settings for EPDC pins to GPIO */ | 575 | /* Configure MUX settings for EPDC pins to GPIO */ |
566 | imx_iomux_v3_setup_multiple_pads(epdc_disable_pads, | 576 | imx_iomux_v3_setup_multiple_pads(epdc_disable_pads, |
567 | ARRAY_SIZE(epdc_disable_pads)); | 577 | ARRAY_SIZE(epdc_disable_pads)); |
568 | } | 578 | } |
569 | 579 | ||
570 | static void setup_epdc(void) | 580 | static void setup_epdc(void) |
571 | { | 581 | { |
572 | unsigned int reg; | 582 | unsigned int reg; |
573 | struct mxc_ccm_reg *ccm_regs = (struct mxc_ccm_reg *)CCM_BASE_ADDR; | 583 | struct mxc_ccm_reg *ccm_regs = (struct mxc_ccm_reg *)CCM_BASE_ADDR; |
574 | 584 | ||
575 | /*** Set pixel clock rates for EPDC ***/ | 585 | /*** Set pixel clock rates for EPDC ***/ |
576 | 586 | ||
577 | /* EPDC AXI clk (IPU2_CLK) from PFD_400M, set to 396/2 = 198MHz */ | 587 | /* EPDC AXI clk (IPU2_CLK) from PFD_400M, set to 396/2 = 198MHz */ |
578 | reg = readl(&ccm_regs->cscdr3); | 588 | reg = readl(&ccm_regs->cscdr3); |
579 | reg &= ~0x7C000; | 589 | reg &= ~0x7C000; |
580 | reg |= (1 << 16) | (1 << 14); | 590 | reg |= (1 << 16) | (1 << 14); |
581 | writel(reg, &ccm_regs->cscdr3); | 591 | writel(reg, &ccm_regs->cscdr3); |
582 | 592 | ||
583 | /* EPDC AXI clk enable */ | 593 | /* EPDC AXI clk enable */ |
584 | reg = readl(&ccm_regs->CCGR3); | 594 | reg = readl(&ccm_regs->CCGR3); |
585 | reg |= 0x00C0; | 595 | reg |= 0x00C0; |
586 | writel(reg, &ccm_regs->CCGR3); | 596 | writel(reg, &ccm_regs->CCGR3); |
587 | 597 | ||
588 | /* EPDC PIX clk (IPU2_DI1_CLK) from PLL5, set to 650/4/6 = ~27MHz */ | 598 | /* EPDC PIX clk (IPU2_DI1_CLK) from PLL5, set to 650/4/6 = ~27MHz */ |
589 | reg = readl(&ccm_regs->cscdr2); | 599 | reg = readl(&ccm_regs->cscdr2); |
590 | reg &= ~0x3FE00; | 600 | reg &= ~0x3FE00; |
591 | reg |= (2 << 15) | (5 << 12); | 601 | reg |= (2 << 15) | (5 << 12); |
592 | writel(reg, &ccm_regs->cscdr2); | 602 | writel(reg, &ccm_regs->cscdr2); |
593 | 603 | ||
594 | /* PLL5 enable (defaults to 650) */ | 604 | /* PLL5 enable (defaults to 650) */ |
595 | reg = readl(&ccm_regs->analog_pll_video); | 605 | reg = readl(&ccm_regs->analog_pll_video); |
596 | reg &= ~((1 << 16) | (1 << 12)); | 606 | reg &= ~((1 << 16) | (1 << 12)); |
597 | reg |= (1 << 13); | 607 | reg |= (1 << 13); |
598 | writel(reg, &ccm_regs->analog_pll_video); | 608 | writel(reg, &ccm_regs->analog_pll_video); |
599 | 609 | ||
600 | /* EPDC PIX clk enable */ | 610 | /* EPDC PIX clk enable */ |
601 | reg = readl(&ccm_regs->CCGR3); | 611 | reg = readl(&ccm_regs->CCGR3); |
602 | reg |= 0x0C00; | 612 | reg |= 0x0C00; |
603 | writel(reg, &ccm_regs->CCGR3); | 613 | writel(reg, &ccm_regs->CCGR3); |
604 | 614 | ||
605 | panel_info.epdc_data.wv_modes.mode_init = 0; | 615 | panel_info.epdc_data.wv_modes.mode_init = 0; |
606 | panel_info.epdc_data.wv_modes.mode_du = 1; | 616 | panel_info.epdc_data.wv_modes.mode_du = 1; |
607 | panel_info.epdc_data.wv_modes.mode_gc4 = 3; | 617 | panel_info.epdc_data.wv_modes.mode_gc4 = 3; |
608 | panel_info.epdc_data.wv_modes.mode_gc8 = 2; | 618 | panel_info.epdc_data.wv_modes.mode_gc8 = 2; |
609 | panel_info.epdc_data.wv_modes.mode_gc16 = 2; | 619 | panel_info.epdc_data.wv_modes.mode_gc16 = 2; |
610 | panel_info.epdc_data.wv_modes.mode_gc32 = 2; | 620 | panel_info.epdc_data.wv_modes.mode_gc32 = 2; |
611 | 621 | ||
612 | panel_info.epdc_data.epdc_timings = panel_timings; | 622 | panel_info.epdc_data.epdc_timings = panel_timings; |
613 | 623 | ||
614 | setup_epdc_power(); | 624 | setup_epdc_power(); |
615 | } | 625 | } |
616 | 626 | ||
617 | void epdc_power_on(void) | 627 | void epdc_power_on(void) |
618 | { | 628 | { |
619 | unsigned int reg; | 629 | unsigned int reg; |
620 | struct gpio_regs *gpio_regs = (struct gpio_regs *)GPIO2_BASE_ADDR; | 630 | struct gpio_regs *gpio_regs = (struct gpio_regs *)GPIO2_BASE_ADDR; |
621 | 631 | ||
622 | /* Set EPD_PWR_CTL0 to high - enable EINK_VDD (3.15) */ | 632 | /* Set EPD_PWR_CTL0 to high - enable EINK_VDD (3.15) */ |
623 | gpio_set_value(IMX_GPIO_NR(2, 20), 1); | 633 | gpio_set_value(IMX_GPIO_NR(2, 20), 1); |
624 | udelay(1000); | 634 | udelay(1000); |
625 | 635 | ||
626 | /* Enable epdc signal pin */ | 636 | /* Enable epdc signal pin */ |
627 | epdc_enable_pins(); | 637 | epdc_enable_pins(); |
628 | 638 | ||
629 | /* Set PMIC Wakeup to high - enable Display power */ | 639 | /* Set PMIC Wakeup to high - enable Display power */ |
630 | gpio_set_value(IMX_GPIO_NR(3, 20), 1); | 640 | gpio_set_value(IMX_GPIO_NR(3, 20), 1); |
631 | 641 | ||
632 | /* Wait for PWRGOOD == 1 */ | 642 | /* Wait for PWRGOOD == 1 */ |
633 | while (1) { | 643 | while (1) { |
634 | reg = readl(&gpio_regs->gpio_psr); | 644 | reg = readl(&gpio_regs->gpio_psr); |
635 | if (!(reg & (1 << 21))) | 645 | if (!(reg & (1 << 21))) |
636 | break; | 646 | break; |
637 | 647 | ||
638 | udelay(100); | 648 | udelay(100); |
639 | } | 649 | } |
640 | 650 | ||
641 | /* Enable VCOM */ | 651 | /* Enable VCOM */ |
642 | gpio_set_value(IMX_GPIO_NR(3, 17), 1); | 652 | gpio_set_value(IMX_GPIO_NR(3, 17), 1); |
643 | 653 | ||
644 | udelay(500); | 654 | udelay(500); |
645 | } | 655 | } |
646 | 656 | ||
647 | void epdc_power_off(void) | 657 | void epdc_power_off(void) |
648 | { | 658 | { |
649 | /* Set PMIC Wakeup to low - disable Display power */ | 659 | /* Set PMIC Wakeup to low - disable Display power */ |
650 | gpio_set_value(IMX_GPIO_NR(3, 20), 0); | 660 | gpio_set_value(IMX_GPIO_NR(3, 20), 0); |
651 | 661 | ||
652 | /* Disable VCOM */ | 662 | /* Disable VCOM */ |
653 | gpio_set_value(IMX_GPIO_NR(3, 17), 0); | 663 | gpio_set_value(IMX_GPIO_NR(3, 17), 0); |
654 | 664 | ||
655 | epdc_disable_pins(); | 665 | epdc_disable_pins(); |
656 | 666 | ||
657 | /* Set EPD_PWR_CTL0 to low - disable EINK_VDD (3.15) */ | 667 | /* Set EPD_PWR_CTL0 to low - disable EINK_VDD (3.15) */ |
658 | gpio_set_value(IMX_GPIO_NR(2, 20), 0); | 668 | gpio_set_value(IMX_GPIO_NR(2, 20), 0); |
659 | } | 669 | } |
660 | #endif | 670 | #endif |
661 | 671 | ||
662 | #if defined(CONFIG_VIDEO_IPUV3) | 672 | #if defined(CONFIG_VIDEO_IPUV3) |
663 | static void disable_lvds(struct display_info_t const *dev) | 673 | static void disable_lvds(struct display_info_t const *dev) |
664 | { | 674 | { |
665 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; | 675 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; |
666 | 676 | ||
667 | int reg = readl(&iomux->gpr[2]); | 677 | int reg = readl(&iomux->gpr[2]); |
668 | 678 | ||
669 | reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK | | 679 | reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK | |
670 | IOMUXC_GPR2_LVDS_CH1_MODE_MASK); | 680 | IOMUXC_GPR2_LVDS_CH1_MODE_MASK); |
671 | 681 | ||
672 | writel(reg, &iomux->gpr[2]); | 682 | writel(reg, &iomux->gpr[2]); |
673 | } | 683 | } |
674 | 684 | ||
675 | static void do_enable_hdmi(struct display_info_t const *dev) | 685 | static void do_enable_hdmi(struct display_info_t const *dev) |
676 | { | 686 | { |
677 | disable_lvds(dev); | 687 | disable_lvds(dev); |
678 | imx_enable_hdmi_phy(); | 688 | imx_enable_hdmi_phy(); |
679 | } | 689 | } |
680 | 690 | ||
681 | struct display_info_t const displays[] = {{ | 691 | struct display_info_t const displays[] = {{ |
682 | .bus = -1, | 692 | .bus = -1, |
683 | .addr = 0, | 693 | .addr = 0, |
684 | .pixfmt = IPU_PIX_FMT_RGB666, | 694 | .pixfmt = IPU_PIX_FMT_RGB666, |
685 | .detect = NULL, | 695 | .detect = NULL, |
686 | .enable = enable_lvds, | 696 | .enable = enable_lvds, |
687 | .mode = { | 697 | .mode = { |
688 | .name = "Hannstar-XGA", | 698 | .name = "Hannstar-XGA", |
689 | .refresh = 60, | 699 | .refresh = 60, |
690 | .xres = 1024, | 700 | .xres = 1024, |
691 | .yres = 768, | 701 | .yres = 768, |
692 | .pixclock = 15384, | 702 | .pixclock = 15384, |
693 | .left_margin = 160, | 703 | .left_margin = 160, |
694 | .right_margin = 24, | 704 | .right_margin = 24, |
695 | .upper_margin = 29, | 705 | .upper_margin = 29, |
696 | .lower_margin = 3, | 706 | .lower_margin = 3, |
697 | .hsync_len = 136, | 707 | .hsync_len = 136, |
698 | .vsync_len = 6, | 708 | .vsync_len = 6, |
699 | .sync = FB_SYNC_EXT, | 709 | .sync = FB_SYNC_EXT, |
700 | .vmode = FB_VMODE_NONINTERLACED | 710 | .vmode = FB_VMODE_NONINTERLACED |
701 | } }, { | 711 | } }, { |
702 | .bus = -1, | 712 | .bus = -1, |
703 | .addr = 0, | 713 | .addr = 0, |
704 | .pixfmt = IPU_PIX_FMT_RGB24, | 714 | .pixfmt = IPU_PIX_FMT_RGB24, |
705 | .detect = NULL, | 715 | .detect = NULL, |
706 | .enable = do_enable_hdmi, | 716 | .enable = do_enable_hdmi, |
707 | .mode = { | 717 | .mode = { |
708 | .name = "HDMI", | 718 | .name = "HDMI", |
709 | .refresh = 60, | 719 | .refresh = 60, |
710 | .xres = 640, | 720 | .xres = 640, |
711 | .yres = 480, | 721 | .yres = 480, |
712 | .pixclock = 39721, | 722 | .pixclock = 39721, |
713 | .left_margin = 48, | 723 | .left_margin = 48, |
714 | .right_margin = 16, | 724 | .right_margin = 16, |
715 | .upper_margin = 33, | 725 | .upper_margin = 33, |
716 | .lower_margin = 10, | 726 | .lower_margin = 10, |
717 | .hsync_len = 96, | 727 | .hsync_len = 96, |
718 | .vsync_len = 2, | 728 | .vsync_len = 2, |
719 | .sync = 0, | 729 | .sync = 0, |
720 | .vmode = FB_VMODE_NONINTERLACED | 730 | .vmode = FB_VMODE_NONINTERLACED |
721 | } }, { | 731 | } }, { |
722 | .bus = 0, | 732 | .bus = 0, |
723 | .addr = 0, | 733 | .addr = 0, |
724 | .pixfmt = IPU_PIX_FMT_RGB24, | 734 | .pixfmt = IPU_PIX_FMT_RGB24, |
725 | .detect = NULL, | 735 | .detect = NULL, |
726 | .enable = enable_rgb, | 736 | .enable = enable_rgb, |
727 | .mode = { | 737 | .mode = { |
728 | .name = "SEIKO-WVGA", | 738 | .name = "SEIKO-WVGA", |
729 | .refresh = 60, | 739 | .refresh = 60, |
730 | .xres = 800, | 740 | .xres = 800, |
731 | .yres = 480, | 741 | .yres = 480, |
732 | .pixclock = 29850, | 742 | .pixclock = 29850, |
733 | .left_margin = 89, | 743 | .left_margin = 89, |
734 | .right_margin = 164, | 744 | .right_margin = 164, |
735 | .upper_margin = 23, | 745 | .upper_margin = 23, |
736 | .lower_margin = 10, | 746 | .lower_margin = 10, |
737 | .hsync_len = 10, | 747 | .hsync_len = 10, |
738 | .vsync_len = 10, | 748 | .vsync_len = 10, |
739 | .sync = 0, | 749 | .sync = 0, |
740 | .vmode = FB_VMODE_NONINTERLACED | 750 | .vmode = FB_VMODE_NONINTERLACED |
741 | } } }; | 751 | } } }; |
742 | size_t display_count = ARRAY_SIZE(displays); | 752 | size_t display_count = ARRAY_SIZE(displays); |
743 | 753 | ||
744 | static void setup_display(void) | 754 | static void setup_display(void) |
745 | { | 755 | { |
746 | struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; | 756 | struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; |
747 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; | 757 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; |
748 | int reg; | 758 | int reg; |
749 | 759 | ||
750 | /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */ | 760 | /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */ |
751 | imx_iomux_v3_setup_multiple_pads(di0_pads, ARRAY_SIZE(di0_pads)); | 761 | imx_iomux_v3_setup_multiple_pads(di0_pads, ARRAY_SIZE(di0_pads)); |
752 | 762 | ||
753 | enable_ipu_clock(); | 763 | enable_ipu_clock(); |
754 | imx_setup_hdmi(); | 764 | imx_setup_hdmi(); |
755 | 765 | ||
756 | /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */ | 766 | /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */ |
757 | reg = readl(&mxc_ccm->CCGR3); | 767 | reg = readl(&mxc_ccm->CCGR3); |
758 | reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK; | 768 | reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK; |
759 | writel(reg, &mxc_ccm->CCGR3); | 769 | writel(reg, &mxc_ccm->CCGR3); |
760 | 770 | ||
761 | /* set LDB0, LDB1 clk select to 011/011 */ | 771 | /* set LDB0, LDB1 clk select to 011/011 */ |
762 | reg = readl(&mxc_ccm->cs2cdr); | 772 | reg = readl(&mxc_ccm->cs2cdr); |
763 | reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK | 773 | reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
764 | | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK); | 774 | | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK); |
765 | reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) | 775 | reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
766 | | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET); | 776 | | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET); |
767 | writel(reg, &mxc_ccm->cs2cdr); | 777 | writel(reg, &mxc_ccm->cs2cdr); |
768 | 778 | ||
769 | reg = readl(&mxc_ccm->cscmr2); | 779 | reg = readl(&mxc_ccm->cscmr2); |
770 | reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV; | 780 | reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV; |
771 | writel(reg, &mxc_ccm->cscmr2); | 781 | writel(reg, &mxc_ccm->cscmr2); |
772 | 782 | ||
773 | reg = readl(&mxc_ccm->chsccdr); | 783 | reg = readl(&mxc_ccm->chsccdr); |
774 | reg |= (CHSCCDR_CLK_SEL_LDB_DI0 | 784 | reg |= (CHSCCDR_CLK_SEL_LDB_DI0 |
775 | << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET); | 785 | << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET); |
776 | reg |= (CHSCCDR_CLK_SEL_LDB_DI0 | 786 | reg |= (CHSCCDR_CLK_SEL_LDB_DI0 |
777 | << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET); | 787 | << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET); |
778 | writel(reg, &mxc_ccm->chsccdr); | 788 | writel(reg, &mxc_ccm->chsccdr); |
779 | 789 | ||
780 | reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES | 790 | reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES |
781 | | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW | 791 | | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
782 | | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW | 792 | | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
783 | | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG | 793 | | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
784 | | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT | 794 | | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
785 | | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG | 795 | | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
786 | | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT | 796 | | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
787 | | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED | 797 | | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED |
788 | | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0; | 798 | | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0; |
789 | writel(reg, &iomux->gpr[2]); | 799 | writel(reg, &iomux->gpr[2]); |
790 | 800 | ||
791 | reg = readl(&iomux->gpr[3]); | 801 | reg = readl(&iomux->gpr[3]); |
792 | reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK | 802 | reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK |
793 | | IOMUXC_GPR3_HDMI_MUX_CTL_MASK)) | 803 | | IOMUXC_GPR3_HDMI_MUX_CTL_MASK)) |
794 | | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 | 804 | | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 |
795 | << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET); | 805 | << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET); |
796 | writel(reg, &iomux->gpr[3]); | 806 | writel(reg, &iomux->gpr[3]); |
797 | } | 807 | } |
798 | #endif /* CONFIG_VIDEO_IPUV3 */ | 808 | #endif /* CONFIG_VIDEO_IPUV3 */ |
799 | 809 | ||
800 | /* | 810 | /* |
801 | * Do not overwrite the console | 811 | * Do not overwrite the console |
802 | * Use always serial for U-Boot console | 812 | * Use always serial for U-Boot console |
803 | */ | 813 | */ |
804 | int overwrite_console(void) | 814 | int overwrite_console(void) |
805 | { | 815 | { |
806 | return 1; | 816 | return 1; |
807 | } | 817 | } |
808 | 818 | ||
809 | static void setup_fec(void) | 819 | static void setup_fec(void) |
810 | { | 820 | { |
811 | if (is_mx6dqp()) { | 821 | if (is_mx6dqp()) { |
812 | int ret; | 822 | int ret; |
813 | 823 | ||
814 | /* select ENET MAC0 TX clock from PLL */ | 824 | /* select ENET MAC0 TX clock from PLL */ |
815 | imx_iomux_set_gpr_register(5, 9, 1, 1); | 825 | imx_iomux_set_gpr_register(5, 9, 1, 1); |
816 | ret = enable_fec_anatop_clock(0, ENET_125MHZ); | 826 | ret = enable_fec_anatop_clock(0, ENET_125MHZ); |
817 | if (ret) | 827 | if (ret) |
818 | printf("Error fec anatop clock settings!\n"); | 828 | printf("Error fec anatop clock settings!\n"); |
819 | } | 829 | } |
830 | |||
831 | fec_phy_reset(); | ||
820 | } | 832 | } |
821 | 833 | ||
822 | int board_eth_init(bd_t *bis) | 834 | int board_eth_init(bd_t *bis) |
823 | { | 835 | { |
824 | setup_iomux_enet(); | 836 | setup_iomux_enet(); |
825 | 837 | ||
826 | return cpu_eth_init(bis); | 838 | return cpu_eth_init(bis); |
827 | } | 839 | } |
828 | 840 | ||
829 | #ifdef CONFIG_USB_EHCI_MX6 | 841 | #ifdef CONFIG_USB_EHCI_MX6 |
830 | #ifndef CONFIG_DM_USB | 842 | #ifndef CONFIG_DM_USB |
831 | 843 | ||
832 | #define USB_OTHERREGS_OFFSET 0x800 | 844 | #define USB_OTHERREGS_OFFSET 0x800 |
833 | #define UCTRL_PWR_POL (1 << 9) | 845 | #define UCTRL_PWR_POL (1 << 9) |
834 | 846 | ||
835 | static iomux_v3_cfg_t const usb_otg_pads[] = { | 847 | static iomux_v3_cfg_t const usb_otg_pads[] = { |
836 | MX6_PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL), | 848 | MX6_PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL), |
837 | MX6_PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(OTG_ID_PAD_CTRL), | 849 | MX6_PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(OTG_ID_PAD_CTRL), |
838 | }; | 850 | }; |
839 | 851 | ||
840 | static iomux_v3_cfg_t const usb_hc1_pads[] = { | 852 | static iomux_v3_cfg_t const usb_hc1_pads[] = { |
841 | MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL), | 853 | MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL), |
842 | }; | 854 | }; |
843 | 855 | ||
844 | static void setup_usb(void) | 856 | static void setup_usb(void) |
845 | { | 857 | { |
846 | imx_iomux_v3_setup_multiple_pads(usb_otg_pads, | 858 | imx_iomux_v3_setup_multiple_pads(usb_otg_pads, |
847 | ARRAY_SIZE(usb_otg_pads)); | 859 | ARRAY_SIZE(usb_otg_pads)); |
848 | 860 | ||
849 | /* | 861 | /* |
850 | * set daisy chain for otg_pin_id on 6q. | 862 | * set daisy chain for otg_pin_id on 6q. |
851 | * for 6dl, this bit is reserved | 863 | * for 6dl, this bit is reserved |
852 | */ | 864 | */ |
853 | imx_iomux_set_gpr_register(1, 13, 1, 0); | 865 | imx_iomux_set_gpr_register(1, 13, 1, 0); |
854 | 866 | ||
855 | imx_iomux_v3_setup_multiple_pads(usb_hc1_pads, | 867 | imx_iomux_v3_setup_multiple_pads(usb_hc1_pads, |
856 | ARRAY_SIZE(usb_hc1_pads)); | 868 | ARRAY_SIZE(usb_hc1_pads)); |
857 | gpio_request(IMX_GPIO_NR(1, 29), "USB HC1 Power Enable"); | 869 | gpio_request(IMX_GPIO_NR(1, 29), "USB HC1 Power Enable"); |
858 | } | 870 | } |
859 | 871 | ||
860 | int board_ehci_hcd_init(int port) | 872 | int board_ehci_hcd_init(int port) |
861 | { | 873 | { |
862 | u32 *usbnc_usb_ctrl; | 874 | u32 *usbnc_usb_ctrl; |
863 | 875 | ||
864 | if (port > 1) | 876 | if (port > 1) |
865 | return -EINVAL; | 877 | return -EINVAL; |
866 | 878 | ||
867 | usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET + | 879 | usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET + |
868 | port * 4); | 880 | port * 4); |
869 | 881 | ||
870 | setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL); | 882 | setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL); |
871 | 883 | ||
872 | return 0; | 884 | return 0; |
873 | } | 885 | } |
874 | 886 | ||
875 | int board_ehci_power(int port, int on) | 887 | int board_ehci_power(int port, int on) |
876 | { | 888 | { |
877 | switch (port) { | 889 | switch (port) { |
878 | case 0: | 890 | case 0: |
879 | break; | 891 | break; |
880 | case 1: | 892 | case 1: |
881 | if (on) | 893 | if (on) |
882 | gpio_direction_output(IMX_GPIO_NR(1, 29), 1); | 894 | gpio_direction_output(IMX_GPIO_NR(1, 29), 1); |
883 | else | 895 | else |
884 | gpio_direction_output(IMX_GPIO_NR(1, 29), 0); | 896 | gpio_direction_output(IMX_GPIO_NR(1, 29), 0); |
885 | break; | 897 | break; |
886 | default: | 898 | default: |
887 | printf("MXC USB port %d not yet supported\n", port); | 899 | printf("MXC USB port %d not yet supported\n", port); |
888 | return -EINVAL; | 900 | return -EINVAL; |
889 | } | 901 | } |
890 | 902 | ||
891 | return 0; | 903 | return 0; |
892 | } | 904 | } |
893 | #endif | 905 | #endif |
894 | #endif | 906 | #endif |
895 | 907 | ||
896 | int board_early_init_f(void) | 908 | int board_early_init_f(void) |
897 | { | 909 | { |
898 | setup_iomux_uart(); | 910 | setup_iomux_uart(); |
899 | #if defined(CONFIG_VIDEO_IPUV3) | 911 | #if defined(CONFIG_VIDEO_IPUV3) |
900 | setup_display(); | 912 | setup_display(); |
901 | #endif | 913 | #endif |
902 | 914 | ||
903 | return 0; | 915 | return 0; |
904 | } | 916 | } |
905 | 917 | ||
906 | int board_init(void) | 918 | int board_init(void) |
907 | { | 919 | { |
908 | /* address of boot parameters */ | 920 | /* address of boot parameters */ |
909 | gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; | 921 | gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; |
910 | 922 | ||
911 | #ifdef CONFIG_MXC_SPI | 923 | #ifdef CONFIG_MXC_SPI |
912 | setup_spi(); | 924 | setup_spi(); |
913 | #endif | 925 | #endif |
914 | 926 | ||
915 | #ifdef CONFIG_SYS_I2C | 927 | #ifdef CONFIG_SYS_I2C |
916 | setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1); | 928 | setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1); |
917 | #endif | 929 | #endif |
918 | 930 | ||
919 | #ifdef CONFIG_USB_EHCI_MX6 | 931 | #ifdef CONFIG_USB_EHCI_MX6 |
920 | #ifndef CONFIG_DM_USB | 932 | #ifndef CONFIG_DM_USB |
921 | setup_usb(); | 933 | setup_usb(); |
922 | #else | 934 | #else |
923 | /* | 935 | /* |
924 | * set daisy chain for otg_pin_id on 6q. | 936 | * set daisy chain for otg_pin_id on 6q. |
925 | * for 6dl, this bit is reserved | 937 | * for 6dl, this bit is reserved |
926 | */ | 938 | */ |
927 | imx_iomux_set_gpr_register(1, 13, 1, 0); | 939 | imx_iomux_set_gpr_register(1, 13, 1, 0); |
928 | #endif | 940 | #endif |
929 | #endif | 941 | #endif |
930 | 942 | ||
931 | #ifdef CONFIG_PCIE_IMX | 943 | #ifdef CONFIG_PCIE_IMX |
932 | setup_pcie(); | 944 | setup_pcie(); |
933 | #endif | 945 | #endif |
934 | 946 | ||
935 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) | 947 | #if defined(CONFIG_MX6DL) && defined(CONFIG_MXC_EPDC) |
936 | setup_epdc(); | 948 | setup_epdc(); |
937 | #endif | 949 | #endif |
938 | 950 | ||
939 | #ifdef CONFIG_CMD_SATA | 951 | #ifdef CONFIG_CMD_SATA |
940 | setup_sata(); | 952 | setup_sata(); |
941 | #endif | 953 | #endif |
942 | 954 | ||
943 | #ifdef CONFIG_FEC_MXC | 955 | #ifdef CONFIG_FEC_MXC |
944 | setup_fec(); | 956 | setup_fec(); |
945 | #endif | 957 | #endif |
946 | 958 | ||
947 | return 0; | 959 | return 0; |
948 | } | 960 | } |
949 | 961 | ||
950 | #ifdef CONFIG_POWER | 962 | #ifdef CONFIG_POWER |
951 | int power_init_board(void) | 963 | int power_init_board(void) |
952 | { | 964 | { |
953 | struct pmic *pfuze; | 965 | struct pmic *pfuze; |
954 | unsigned int reg; | 966 | unsigned int reg; |
955 | int ret; | 967 | int ret; |
956 | 968 | ||
957 | pfuze = pfuze_common_init(I2C_PMIC); | 969 | pfuze = pfuze_common_init(I2C_PMIC); |
958 | if (!pfuze) | 970 | if (!pfuze) |
959 | return -ENODEV; | 971 | return -ENODEV; |
960 | 972 | ||
961 | if (is_mx6dqp()) | 973 | if (is_mx6dqp()) |
962 | ret = pfuze_mode_init(pfuze, APS_APS); | 974 | ret = pfuze_mode_init(pfuze, APS_APS); |
963 | else | 975 | else |
964 | ret = pfuze_mode_init(pfuze, APS_PFM); | 976 | ret = pfuze_mode_init(pfuze, APS_PFM); |
965 | 977 | ||
966 | if (ret < 0) | 978 | if (ret < 0) |
967 | return ret; | 979 | return ret; |
968 | /* VGEN3 and VGEN5 corrected on i.mx6qp board */ | 980 | /* VGEN3 and VGEN5 corrected on i.mx6qp board */ |
969 | if (!is_mx6dqp()) { | 981 | if (!is_mx6dqp()) { |
970 | /* Increase VGEN3 from 2.5 to 2.8V */ | 982 | /* Increase VGEN3 from 2.5 to 2.8V */ |
971 | pmic_reg_read(pfuze, PFUZE100_VGEN3VOL, ®); | 983 | pmic_reg_read(pfuze, PFUZE100_VGEN3VOL, ®); |
972 | reg &= ~LDO_VOL_MASK; | 984 | reg &= ~LDO_VOL_MASK; |
973 | reg |= LDOB_2_80V; | 985 | reg |= LDOB_2_80V; |
974 | pmic_reg_write(pfuze, PFUZE100_VGEN3VOL, reg); | 986 | pmic_reg_write(pfuze, PFUZE100_VGEN3VOL, reg); |
975 | 987 | ||
976 | /* Increase VGEN5 from 2.8 to 3V */ | 988 | /* Increase VGEN5 from 2.8 to 3V */ |
977 | pmic_reg_read(pfuze, PFUZE100_VGEN5VOL, ®); | 989 | pmic_reg_read(pfuze, PFUZE100_VGEN5VOL, ®); |
978 | reg &= ~LDO_VOL_MASK; | 990 | reg &= ~LDO_VOL_MASK; |
979 | reg |= LDOB_3_00V; | 991 | reg |= LDOB_3_00V; |
980 | pmic_reg_write(pfuze, PFUZE100_VGEN5VOL, reg); | 992 | pmic_reg_write(pfuze, PFUZE100_VGEN5VOL, reg); |
981 | } | 993 | } |
982 | 994 | ||
983 | if (is_mx6dqp()) { | 995 | if (is_mx6dqp()) { |
984 | /* set SW1C staby volatage 1.075V*/ | 996 | /* set SW1C staby volatage 1.075V*/ |
985 | pmic_reg_read(pfuze, PFUZE100_SW1CSTBY, ®); | 997 | pmic_reg_read(pfuze, PFUZE100_SW1CSTBY, ®); |
986 | reg &= ~0x3f; | 998 | reg &= ~0x3f; |
987 | reg |= 0x1f; | 999 | reg |= 0x1f; |
988 | pmic_reg_write(pfuze, PFUZE100_SW1CSTBY, reg); | 1000 | pmic_reg_write(pfuze, PFUZE100_SW1CSTBY, reg); |
989 | 1001 | ||
990 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ | 1002 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ |
991 | pmic_reg_read(pfuze, PFUZE100_SW1CCONF, ®); | 1003 | pmic_reg_read(pfuze, PFUZE100_SW1CCONF, ®); |
992 | reg &= ~0xc0; | 1004 | reg &= ~0xc0; |
993 | reg |= 0x40; | 1005 | reg |= 0x40; |
994 | pmic_reg_write(pfuze, PFUZE100_SW1CCONF, reg); | 1006 | pmic_reg_write(pfuze, PFUZE100_SW1CCONF, reg); |
995 | 1007 | ||
996 | /* set SW2/VDDARM staby volatage 0.975V*/ | 1008 | /* set SW2/VDDARM staby volatage 0.975V*/ |
997 | pmic_reg_read(pfuze, PFUZE100_SW2STBY, ®); | 1009 | pmic_reg_read(pfuze, PFUZE100_SW2STBY, ®); |
998 | reg &= ~0x3f; | 1010 | reg &= ~0x3f; |
999 | reg |= 0x17; | 1011 | reg |= 0x17; |
1000 | pmic_reg_write(pfuze, PFUZE100_SW2STBY, reg); | 1012 | pmic_reg_write(pfuze, PFUZE100_SW2STBY, reg); |
1001 | 1013 | ||
1002 | /* set SW2/VDDARM step ramp up time to from 16us to 4us/25mV */ | 1014 | /* set SW2/VDDARM step ramp up time to from 16us to 4us/25mV */ |
1003 | pmic_reg_read(pfuze, PFUZE100_SW2CONF, ®); | 1015 | pmic_reg_read(pfuze, PFUZE100_SW2CONF, ®); |
1004 | reg &= ~0xc0; | 1016 | reg &= ~0xc0; |
1005 | reg |= 0x40; | 1017 | reg |= 0x40; |
1006 | pmic_reg_write(pfuze, PFUZE100_SW2CONF, reg); | 1018 | pmic_reg_write(pfuze, PFUZE100_SW2CONF, reg); |
1007 | } else { | 1019 | } else { |
1008 | /* set SW1AB staby volatage 0.975V*/ | 1020 | /* set SW1AB staby volatage 0.975V*/ |
1009 | pmic_reg_read(pfuze, PFUZE100_SW1ABSTBY, ®); | 1021 | pmic_reg_read(pfuze, PFUZE100_SW1ABSTBY, ®); |
1010 | reg &= ~0x3f; | 1022 | reg &= ~0x3f; |
1011 | reg |= 0x1b; | 1023 | reg |= 0x1b; |
1012 | pmic_reg_write(pfuze, PFUZE100_SW1ABSTBY, reg); | 1024 | pmic_reg_write(pfuze, PFUZE100_SW1ABSTBY, reg); |
1013 | 1025 | ||
1014 | /* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */ | 1026 | /* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */ |
1015 | pmic_reg_read(pfuze, PFUZE100_SW1ABCONF, ®); | 1027 | pmic_reg_read(pfuze, PFUZE100_SW1ABCONF, ®); |
1016 | reg &= ~0xc0; | 1028 | reg &= ~0xc0; |
1017 | reg |= 0x40; | 1029 | reg |= 0x40; |
1018 | pmic_reg_write(pfuze, PFUZE100_SW1ABCONF, reg); | 1030 | pmic_reg_write(pfuze, PFUZE100_SW1ABCONF, reg); |
1019 | 1031 | ||
1020 | /* set SW1C staby volatage 0.975V*/ | 1032 | /* set SW1C staby volatage 0.975V*/ |
1021 | pmic_reg_read(pfuze, PFUZE100_SW1CSTBY, ®); | 1033 | pmic_reg_read(pfuze, PFUZE100_SW1CSTBY, ®); |
1022 | reg &= ~0x3f; | 1034 | reg &= ~0x3f; |
1023 | reg |= 0x1b; | 1035 | reg |= 0x1b; |
1024 | pmic_reg_write(pfuze, PFUZE100_SW1CSTBY, reg); | 1036 | pmic_reg_write(pfuze, PFUZE100_SW1CSTBY, reg); |
1025 | 1037 | ||
1026 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ | 1038 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ |
1027 | pmic_reg_read(pfuze, PFUZE100_SW1CCONF, ®); | 1039 | pmic_reg_read(pfuze, PFUZE100_SW1CCONF, ®); |
1028 | reg &= ~0xc0; | 1040 | reg &= ~0xc0; |
1029 | reg |= 0x40; | 1041 | reg |= 0x40; |
1030 | pmic_reg_write(pfuze, PFUZE100_SW1CCONF, reg); | 1042 | pmic_reg_write(pfuze, PFUZE100_SW1CCONF, reg); |
1031 | } | 1043 | } |
1032 | 1044 | ||
1033 | return 0; | 1045 | return 0; |
1034 | } | 1046 | } |
1035 | 1047 | ||
1036 | #elif defined(CONFIG_DM_PMIC_PFUZE100) | 1048 | #elif defined(CONFIG_DM_PMIC_PFUZE100) |
1037 | int power_init_board(void) | 1049 | int power_init_board(void) |
1038 | { | 1050 | { |
1039 | struct udevice *dev; | 1051 | struct udevice *dev; |
1040 | unsigned int reg; | 1052 | unsigned int reg; |
1041 | int ret; | 1053 | int ret; |
1042 | 1054 | ||
1043 | dev = pfuze_common_init(); | 1055 | dev = pfuze_common_init(); |
1044 | if (!dev) | 1056 | if (!dev) |
1045 | return -ENODEV; | 1057 | return -ENODEV; |
1046 | 1058 | ||
1047 | if (is_mx6dqp()) | 1059 | if (is_mx6dqp()) |
1048 | ret = pfuze_mode_init(dev, APS_APS); | 1060 | ret = pfuze_mode_init(dev, APS_APS); |
1049 | else | 1061 | else |
1050 | ret = pfuze_mode_init(dev, APS_PFM); | 1062 | ret = pfuze_mode_init(dev, APS_PFM); |
1051 | if (ret < 0) | 1063 | if (ret < 0) |
1052 | return ret; | 1064 | return ret; |
1053 | 1065 | ||
1054 | /* VGEN3 and VGEN5 corrected on i.mx6qp board */ | 1066 | /* VGEN3 and VGEN5 corrected on i.mx6qp board */ |
1055 | if (!is_mx6dqp()) { | 1067 | if (!is_mx6dqp()) { |
1056 | /* Increase VGEN3 from 2.5 to 2.8V */ | 1068 | /* Increase VGEN3 from 2.5 to 2.8V */ |
1057 | reg = pmic_reg_read(dev, PFUZE100_VGEN3VOL); | 1069 | reg = pmic_reg_read(dev, PFUZE100_VGEN3VOL); |
1058 | reg &= ~LDO_VOL_MASK; | 1070 | reg &= ~LDO_VOL_MASK; |
1059 | reg |= LDOB_2_80V; | 1071 | reg |= LDOB_2_80V; |
1060 | pmic_reg_write(dev, PFUZE100_VGEN3VOL, reg); | 1072 | pmic_reg_write(dev, PFUZE100_VGEN3VOL, reg); |
1061 | 1073 | ||
1062 | /* Increase VGEN5 from 2.8 to 3V */ | 1074 | /* Increase VGEN5 from 2.8 to 3V */ |
1063 | reg = pmic_reg_read(dev, PFUZE100_VGEN5VOL); | 1075 | reg = pmic_reg_read(dev, PFUZE100_VGEN5VOL); |
1064 | reg &= ~LDO_VOL_MASK; | 1076 | reg &= ~LDO_VOL_MASK; |
1065 | reg |= LDOB_3_00V; | 1077 | reg |= LDOB_3_00V; |
1066 | pmic_reg_write(dev, PFUZE100_VGEN5VOL, reg); | 1078 | pmic_reg_write(dev, PFUZE100_VGEN5VOL, reg); |
1067 | } | 1079 | } |
1068 | 1080 | ||
1069 | if (is_mx6dqp()) { | 1081 | if (is_mx6dqp()) { |
1070 | /* set SW1C staby volatage 1.075V*/ | 1082 | /* set SW1C staby volatage 1.075V*/ |
1071 | reg = pmic_reg_read(dev, PFUZE100_SW1CSTBY); | 1083 | reg = pmic_reg_read(dev, PFUZE100_SW1CSTBY); |
1072 | reg &= ~0x3f; | 1084 | reg &= ~0x3f; |
1073 | reg |= 0x1f; | 1085 | reg |= 0x1f; |
1074 | pmic_reg_write(dev, PFUZE100_SW1CSTBY, reg); | 1086 | pmic_reg_write(dev, PFUZE100_SW1CSTBY, reg); |
1075 | 1087 | ||
1076 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ | 1088 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ |
1077 | reg = pmic_reg_read(dev, PFUZE100_SW1CCONF); | 1089 | reg = pmic_reg_read(dev, PFUZE100_SW1CCONF); |
1078 | reg &= ~0xc0; | 1090 | reg &= ~0xc0; |
1079 | reg |= 0x40; | 1091 | reg |= 0x40; |
1080 | pmic_reg_write(dev, PFUZE100_SW1CCONF, reg); | 1092 | pmic_reg_write(dev, PFUZE100_SW1CCONF, reg); |
1081 | 1093 | ||
1082 | /* set SW2/VDDARM staby volatage 0.975V*/ | 1094 | /* set SW2/VDDARM staby volatage 0.975V*/ |
1083 | reg = pmic_reg_read(dev, PFUZE100_SW2STBY); | 1095 | reg = pmic_reg_read(dev, PFUZE100_SW2STBY); |
1084 | reg &= ~0x3f; | 1096 | reg &= ~0x3f; |
1085 | reg |= 0x17; | 1097 | reg |= 0x17; |
1086 | pmic_reg_write(dev, PFUZE100_SW2STBY, reg); | 1098 | pmic_reg_write(dev, PFUZE100_SW2STBY, reg); |
1087 | 1099 | ||
1088 | /* set SW2/VDDARM step ramp up time to from 16us to 4us/25mV */ | 1100 | /* set SW2/VDDARM step ramp up time to from 16us to 4us/25mV */ |
1089 | reg = pmic_reg_read(dev, PFUZE100_SW2CONF); | 1101 | reg = pmic_reg_read(dev, PFUZE100_SW2CONF); |
1090 | reg &= ~0xc0; | 1102 | reg &= ~0xc0; |
1091 | reg |= 0x40; | 1103 | reg |= 0x40; |
1092 | pmic_reg_write(dev, PFUZE100_SW2CONF, reg); | 1104 | pmic_reg_write(dev, PFUZE100_SW2CONF, reg); |
1093 | } else { | 1105 | } else { |
1094 | /* set SW1AB staby volatage 0.975V*/ | 1106 | /* set SW1AB staby volatage 0.975V*/ |
1095 | reg = pmic_reg_read(dev, PFUZE100_SW1ABSTBY); | 1107 | reg = pmic_reg_read(dev, PFUZE100_SW1ABSTBY); |
1096 | reg &= ~0x3f; | 1108 | reg &= ~0x3f; |
1097 | reg |= 0x1b; | 1109 | reg |= 0x1b; |
1098 | pmic_reg_write(dev, PFUZE100_SW1ABSTBY, reg); | 1110 | pmic_reg_write(dev, PFUZE100_SW1ABSTBY, reg); |
1099 | 1111 | ||
1100 | /* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */ | 1112 | /* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */ |
1101 | reg = pmic_reg_read(dev, PFUZE100_SW1ABCONF); | 1113 | reg = pmic_reg_read(dev, PFUZE100_SW1ABCONF); |
1102 | reg &= ~0xc0; | 1114 | reg &= ~0xc0; |
1103 | reg |= 0x40; | 1115 | reg |= 0x40; |
1104 | pmic_reg_write(dev, PFUZE100_SW1ABCONF, reg); | 1116 | pmic_reg_write(dev, PFUZE100_SW1ABCONF, reg); |
1105 | 1117 | ||
1106 | /* set SW1C staby volatage 0.975V*/ | 1118 | /* set SW1C staby volatage 0.975V*/ |
1107 | reg = pmic_reg_read(dev, PFUZE100_SW1CSTBY); | 1119 | reg = pmic_reg_read(dev, PFUZE100_SW1CSTBY); |
1108 | reg &= ~0x3f; | 1120 | reg &= ~0x3f; |
1109 | reg |= 0x1b; | 1121 | reg |= 0x1b; |
1110 | pmic_reg_write(dev, PFUZE100_SW1CSTBY, reg); | 1122 | pmic_reg_write(dev, PFUZE100_SW1CSTBY, reg); |
1111 | 1123 | ||
1112 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ | 1124 | /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */ |
1113 | reg = pmic_reg_read(dev, PFUZE100_SW1CCONF); | 1125 | reg = pmic_reg_read(dev, PFUZE100_SW1CCONF); |
1114 | reg &= ~0xc0; | 1126 | reg &= ~0xc0; |
1115 | reg |= 0x40; | 1127 | reg |= 0x40; |
1116 | pmic_reg_write(dev, PFUZE100_SW1CCONF, reg); | 1128 | pmic_reg_write(dev, PFUZE100_SW1CCONF, reg); |
1117 | } | 1129 | } |
1118 | 1130 | ||
1119 | return 0; | 1131 | return 0; |
1120 | } | 1132 | } |
1121 | #endif | 1133 | #endif |
1122 | 1134 | ||
1123 | #ifdef CONFIG_LDO_BYPASS_CHECK | 1135 | #ifdef CONFIG_LDO_BYPASS_CHECK |
1124 | #ifdef CONFIG_POWER | 1136 | #ifdef CONFIG_POWER |
1125 | void ldo_mode_set(int ldo_bypass) | 1137 | void ldo_mode_set(int ldo_bypass) |
1126 | { | 1138 | { |
1127 | unsigned int value; | 1139 | unsigned int value; |
1128 | int is_400M; | 1140 | int is_400M; |
1129 | unsigned char vddarm; | 1141 | unsigned char vddarm; |
1130 | struct pmic *p = pmic_get("PFUZE100"); | 1142 | struct pmic *p = pmic_get("PFUZE100"); |
1131 | 1143 | ||
1132 | if (!p) { | 1144 | if (!p) { |
1133 | printf("No PMIC found!\n"); | 1145 | printf("No PMIC found!\n"); |
1134 | return; | 1146 | return; |
1135 | } | 1147 | } |
1136 | 1148 | ||
1137 | /* increase VDDARM/VDDSOC to support 1.2G chip */ | 1149 | /* increase VDDARM/VDDSOC to support 1.2G chip */ |
1138 | if (check_1_2G()) { | 1150 | if (check_1_2G()) { |
1139 | ldo_bypass = 0; /* ldo_enable on 1.2G chip */ | 1151 | ldo_bypass = 0; /* ldo_enable on 1.2G chip */ |
1140 | printf("1.2G chip, increase VDDARM_IN/VDDSOC_IN\n"); | 1152 | printf("1.2G chip, increase VDDARM_IN/VDDSOC_IN\n"); |
1141 | if (is_mx6dqp()) { | 1153 | if (is_mx6dqp()) { |
1142 | /* increase VDDARM to 1.425V */ | 1154 | /* increase VDDARM to 1.425V */ |
1143 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); | 1155 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); |
1144 | value &= ~0x3f; | 1156 | value &= ~0x3f; |
1145 | value |= 0x29; | 1157 | value |= 0x29; |
1146 | pmic_reg_write(p, PFUZE100_SW2VOL, value); | 1158 | pmic_reg_write(p, PFUZE100_SW2VOL, value); |
1147 | } else { | 1159 | } else { |
1148 | /* increase VDDARM to 1.425V */ | 1160 | /* increase VDDARM to 1.425V */ |
1149 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); | 1161 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); |
1150 | value &= ~0x3f; | 1162 | value &= ~0x3f; |
1151 | value |= 0x2d; | 1163 | value |= 0x2d; |
1152 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); | 1164 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); |
1153 | } | 1165 | } |
1154 | /* increase VDDSOC to 1.425V */ | 1166 | /* increase VDDSOC to 1.425V */ |
1155 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); | 1167 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); |
1156 | value &= ~0x3f; | 1168 | value &= ~0x3f; |
1157 | value |= 0x2d; | 1169 | value |= 0x2d; |
1158 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); | 1170 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); |
1159 | } | 1171 | } |
1160 | /* switch to ldo_bypass mode , boot on 800Mhz */ | 1172 | /* switch to ldo_bypass mode , boot on 800Mhz */ |
1161 | if (ldo_bypass) { | 1173 | if (ldo_bypass) { |
1162 | prep_anatop_bypass(); | 1174 | prep_anatop_bypass(); |
1163 | if (is_mx6dqp()) { | 1175 | if (is_mx6dqp()) { |
1164 | /* decrease VDDARM for 400Mhz DQP:1.1V*/ | 1176 | /* decrease VDDARM for 400Mhz DQP:1.1V*/ |
1165 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); | 1177 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); |
1166 | value &= ~0x3f; | 1178 | value &= ~0x3f; |
1167 | value |= 0x1c; | 1179 | value |= 0x1c; |
1168 | pmic_reg_write(p, PFUZE100_SW2VOL, value); | 1180 | pmic_reg_write(p, PFUZE100_SW2VOL, value); |
1169 | } else { | 1181 | } else { |
1170 | /* decrease VDDARM for 400Mhz DQ:1.1V, DL:1.275V */ | 1182 | /* decrease VDDARM for 400Mhz DQ:1.1V, DL:1.275V */ |
1171 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); | 1183 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); |
1172 | value &= ~0x3f; | 1184 | value &= ~0x3f; |
1173 | if (is_mx6dl()) | 1185 | if (is_mx6dl()) |
1174 | value |= 0x27; | 1186 | value |= 0x27; |
1175 | else | 1187 | else |
1176 | value |= 0x20; | 1188 | value |= 0x20; |
1177 | 1189 | ||
1178 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); | 1190 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); |
1179 | } | 1191 | } |
1180 | /* increase VDDSOC to 1.3V */ | 1192 | /* increase VDDSOC to 1.3V */ |
1181 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); | 1193 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); |
1182 | value &= ~0x3f; | 1194 | value &= ~0x3f; |
1183 | value |= 0x28; | 1195 | value |= 0x28; |
1184 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); | 1196 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); |
1185 | 1197 | ||
1186 | /* | 1198 | /* |
1187 | * MX6Q/DQP: | 1199 | * MX6Q/DQP: |
1188 | * VDDARM:1.15V@800M; VDDSOC:1.175V@800M | 1200 | * VDDARM:1.15V@800M; VDDSOC:1.175V@800M |
1189 | * VDDARM:0.975V@400M; VDDSOC:1.175V@400M | 1201 | * VDDARM:0.975V@400M; VDDSOC:1.175V@400M |
1190 | * MX6DL: | 1202 | * MX6DL: |
1191 | * VDDARM:1.175V@800M; VDDSOC:1.175V@800M | 1203 | * VDDARM:1.175V@800M; VDDSOC:1.175V@800M |
1192 | * VDDARM:1.075V@400M; VDDSOC:1.175V@400M | 1204 | * VDDARM:1.075V@400M; VDDSOC:1.175V@400M |
1193 | */ | 1205 | */ |
1194 | is_400M = set_anatop_bypass(2); | 1206 | is_400M = set_anatop_bypass(2); |
1195 | if (is_mx6dqp()) { | 1207 | if (is_mx6dqp()) { |
1196 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); | 1208 | pmic_reg_read(p, PFUZE100_SW2VOL, &value); |
1197 | value &= ~0x3f; | 1209 | value &= ~0x3f; |
1198 | if (is_400M) | 1210 | if (is_400M) |
1199 | value |= 0x17; | 1211 | value |= 0x17; |
1200 | else | 1212 | else |
1201 | value |= 0x1e; | 1213 | value |= 0x1e; |
1202 | pmic_reg_write(p, PFUZE100_SW2VOL, value); | 1214 | pmic_reg_write(p, PFUZE100_SW2VOL, value); |
1203 | } | 1215 | } |
1204 | 1216 | ||
1205 | if (is_400M) { | 1217 | if (is_400M) { |
1206 | if (is_mx6dl()) | 1218 | if (is_mx6dl()) |
1207 | vddarm = 0x1f; | 1219 | vddarm = 0x1f; |
1208 | else | 1220 | else |
1209 | vddarm = 0x1b; | 1221 | vddarm = 0x1b; |
1210 | } else { | 1222 | } else { |
1211 | if (is_mx6dl()) | 1223 | if (is_mx6dl()) |
1212 | vddarm = 0x23; | 1224 | vddarm = 0x23; |
1213 | else | 1225 | else |
1214 | vddarm = 0x22; | 1226 | vddarm = 0x22; |
1215 | } | 1227 | } |
1216 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); | 1228 | pmic_reg_read(p, PFUZE100_SW1ABVOL, &value); |
1217 | value &= ~0x3f; | 1229 | value &= ~0x3f; |
1218 | value |= vddarm; | 1230 | value |= vddarm; |
1219 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); | 1231 | pmic_reg_write(p, PFUZE100_SW1ABVOL, value); |
1220 | 1232 | ||
1221 | /* decrease VDDSOC to 1.175V */ | 1233 | /* decrease VDDSOC to 1.175V */ |
1222 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); | 1234 | pmic_reg_read(p, PFUZE100_SW1CVOL, &value); |
1223 | value &= ~0x3f; | 1235 | value &= ~0x3f; |
1224 | value |= 0x23; | 1236 | value |= 0x23; |
1225 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); | 1237 | pmic_reg_write(p, PFUZE100_SW1CVOL, value); |
1226 | 1238 | ||
1227 | finish_anatop_bypass(); | 1239 | finish_anatop_bypass(); |
1228 | printf("switch to ldo_bypass mode!\n"); | 1240 | printf("switch to ldo_bypass mode!\n"); |
1229 | } | 1241 | } |
1230 | } | 1242 | } |
1231 | #elif defined(CONFIG_DM_PMIC_PFUZE100) | 1243 | #elif defined(CONFIG_DM_PMIC_PFUZE100) |
1232 | void ldo_mode_set(int ldo_bypass) | 1244 | void ldo_mode_set(int ldo_bypass) |
1233 | { | 1245 | { |
1234 | int is_400M; | 1246 | int is_400M; |
1235 | unsigned char vddarm; | 1247 | unsigned char vddarm; |
1236 | struct udevice *dev; | 1248 | struct udevice *dev; |
1237 | int ret; | 1249 | int ret; |
1238 | 1250 | ||
1239 | ret = pmic_get("pfuze100", &dev); | 1251 | ret = pmic_get("pfuze100", &dev); |
1240 | if (ret == -ENODEV) { | 1252 | if (ret == -ENODEV) { |
1241 | printf("No PMIC found!\n"); | 1253 | printf("No PMIC found!\n"); |
1242 | return; | 1254 | return; |
1243 | } | 1255 | } |
1244 | 1256 | ||
1245 | /* increase VDDARM/VDDSOC to support 1.2G chip */ | 1257 | /* increase VDDARM/VDDSOC to support 1.2G chip */ |
1246 | if (check_1_2G()) { | 1258 | if (check_1_2G()) { |
1247 | ldo_bypass = 0; /* ldo_enable on 1.2G chip */ | 1259 | ldo_bypass = 0; /* ldo_enable on 1.2G chip */ |
1248 | printf("1.2G chip, increase VDDARM_IN/VDDSOC_IN\n"); | 1260 | printf("1.2G chip, increase VDDARM_IN/VDDSOC_IN\n"); |
1249 | if (is_mx6dqp()) { | 1261 | if (is_mx6dqp()) { |
1250 | /* increase VDDARM to 1.425V */ | 1262 | /* increase VDDARM to 1.425V */ |
1251 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x29); | 1263 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x29); |
1252 | } else { | 1264 | } else { |
1253 | /* increase VDDARM to 1.425V */ | 1265 | /* increase VDDARM to 1.425V */ |
1254 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x2d); | 1266 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x2d); |
1255 | } | 1267 | } |
1256 | /* increase VDDSOC to 1.425V */ | 1268 | /* increase VDDSOC to 1.425V */ |
1257 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x2d); | 1269 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x2d); |
1258 | } | 1270 | } |
1259 | /* switch to ldo_bypass mode , boot on 800Mhz */ | 1271 | /* switch to ldo_bypass mode , boot on 800Mhz */ |
1260 | if (ldo_bypass) { | 1272 | if (ldo_bypass) { |
1261 | prep_anatop_bypass(); | 1273 | prep_anatop_bypass(); |
1262 | if (is_mx6dqp()) { | 1274 | if (is_mx6dqp()) { |
1263 | /* decrease VDDARM for 400Mhz DQP:1.1V*/ | 1275 | /* decrease VDDARM for 400Mhz DQP:1.1V*/ |
1264 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x1c); | 1276 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x1c); |
1265 | } else { | 1277 | } else { |
1266 | /* decrease VDDARM for 400Mhz DQ:1.1V, DL:1.275V */ | 1278 | /* decrease VDDARM for 400Mhz DQ:1.1V, DL:1.275V */ |
1267 | if (is_mx6dl()) | 1279 | if (is_mx6dl()) |
1268 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x27); | 1280 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x27); |
1269 | else | 1281 | else |
1270 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x20); | 1282 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, 0x20); |
1271 | } | 1283 | } |
1272 | /* increase VDDSOC to 1.3V */ | 1284 | /* increase VDDSOC to 1.3V */ |
1273 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x28); | 1285 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x28); |
1274 | 1286 | ||
1275 | /* | 1287 | /* |
1276 | * MX6Q/DQP: | 1288 | * MX6Q/DQP: |
1277 | * VDDARM:1.15V@800M; VDDSOC:1.175V@800M | 1289 | * VDDARM:1.15V@800M; VDDSOC:1.175V@800M |
1278 | * VDDARM:0.975V@400M; VDDSOC:1.175V@400M | 1290 | * VDDARM:0.975V@400M; VDDSOC:1.175V@400M |
1279 | * MX6DL: | 1291 | * MX6DL: |
1280 | * VDDARM:1.175V@800M; VDDSOC:1.175V@800M | 1292 | * VDDARM:1.175V@800M; VDDSOC:1.175V@800M |
1281 | * VDDARM:1.075V@400M; VDDSOC:1.175V@400M | 1293 | * VDDARM:1.075V@400M; VDDSOC:1.175V@400M |
1282 | */ | 1294 | */ |
1283 | is_400M = set_anatop_bypass(2); | 1295 | is_400M = set_anatop_bypass(2); |
1284 | if (is_mx6dqp()) { | 1296 | if (is_mx6dqp()) { |
1285 | if (is_400M) | 1297 | if (is_400M) |
1286 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x17); | 1298 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x17); |
1287 | else | 1299 | else |
1288 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x1e); | 1300 | pmic_clrsetbits(dev, PFUZE100_SW2VOL, 0x3f, 0x1e); |
1289 | } | 1301 | } |
1290 | 1302 | ||
1291 | if (is_400M) { | 1303 | if (is_400M) { |
1292 | if (is_mx6dl()) | 1304 | if (is_mx6dl()) |
1293 | vddarm = 0x1f; | 1305 | vddarm = 0x1f; |
1294 | else | 1306 | else |
1295 | vddarm = 0x1b; | 1307 | vddarm = 0x1b; |
1296 | } else { | 1308 | } else { |
1297 | if (is_mx6dl()) | 1309 | if (is_mx6dl()) |
1298 | vddarm = 0x23; | 1310 | vddarm = 0x23; |
1299 | else | 1311 | else |
1300 | vddarm = 0x22; | 1312 | vddarm = 0x22; |
1301 | } | 1313 | } |
1302 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, vddarm); | 1314 | pmic_clrsetbits(dev, PFUZE100_SW1ABVOL, 0x3f, vddarm); |
1303 | 1315 | ||
1304 | /* decrease VDDSOC to 1.175V */ | 1316 | /* decrease VDDSOC to 1.175V */ |
1305 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x23); | 1317 | pmic_clrsetbits(dev, PFUZE100_SW1CVOL, 0x3f, 0x23); |
1306 | 1318 | ||
1307 | finish_anatop_bypass(); | 1319 | finish_anatop_bypass(); |
1308 | printf("switch to ldo_bypass mode!\n"); | 1320 | printf("switch to ldo_bypass mode!\n"); |
1309 | } | 1321 | } |
1310 | } | 1322 | } |
1311 | #endif | 1323 | #endif |
1312 | #endif | 1324 | #endif |
1313 | 1325 | ||
1314 | #ifdef CONFIG_CMD_BMODE | 1326 | #ifdef CONFIG_CMD_BMODE |
1315 | static const struct boot_mode board_boot_modes[] = { | 1327 | static const struct boot_mode board_boot_modes[] = { |
1316 | /* 4 bit bus width */ | 1328 | /* 4 bit bus width */ |
1317 | {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)}, | 1329 | {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)}, |
1318 | {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)}, | 1330 | {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)}, |
1319 | /* 8 bit bus width */ | 1331 | /* 8 bit bus width */ |
1320 | {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)}, | 1332 | {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)}, |
1321 | {NULL, 0}, | 1333 | {NULL, 0}, |
1322 | }; | 1334 | }; |
1323 | #endif | 1335 | #endif |
1324 | 1336 | ||
1325 | int board_late_init(void) | 1337 | int board_late_init(void) |
1326 | { | 1338 | { |
1327 | #ifdef CONFIG_CMD_BMODE | 1339 | #ifdef CONFIG_CMD_BMODE |
1328 | add_board_boot_modes(board_boot_modes); | 1340 | add_board_boot_modes(board_boot_modes); |
1329 | #endif | 1341 | #endif |
1330 | 1342 | ||
1331 | #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG | 1343 | #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG |
1332 | setenv("board_name", "SABRESD"); | 1344 | setenv("board_name", "SABRESD"); |
1333 | 1345 | ||
1334 | if (is_mx6dqp()) | 1346 | if (is_mx6dqp()) |
1335 | setenv("board_rev", "MX6QP"); | 1347 | setenv("board_rev", "MX6QP"); |
1336 | else if (is_mx6dq()) | 1348 | else if (is_mx6dq()) |
1337 | setenv("board_rev", "MX6Q"); | 1349 | setenv("board_rev", "MX6Q"); |
1338 | else if (is_mx6sdl()) | 1350 | else if (is_mx6sdl()) |
1339 | setenv("board_rev", "MX6DL"); | 1351 | setenv("board_rev", "MX6DL"); |
1340 | #endif | 1352 | #endif |
1341 | 1353 | ||
1342 | #ifdef CONFIG_ENV_IS_IN_MMC | 1354 | #ifdef CONFIG_ENV_IS_IN_MMC |
1343 | board_late_mmc_env_init(); | 1355 | board_late_mmc_env_init(); |
1344 | #endif | 1356 | #endif |
1345 | 1357 | ||
1346 | return 0; | 1358 | return 0; |
1347 | } | 1359 | } |
1348 | 1360 | ||
1349 | int checkboard(void) | 1361 | int checkboard(void) |
1350 | { | 1362 | { |
1351 | puts("Board: MX6-SabreSD\n"); | 1363 | puts("Board: MX6-SabreSD\n"); |
1352 | return 0; | 1364 | return 0; |
1353 | } | 1365 | } |
1354 | 1366 | ||
1355 | #ifdef CONFIG_FSL_FASTBOOT | 1367 | #ifdef CONFIG_FSL_FASTBOOT |
1356 | #ifdef CONFIG_ANDROID_RECOVERY | 1368 | #ifdef CONFIG_ANDROID_RECOVERY |
1357 | 1369 | ||
1358 | #define GPIO_VOL_DN_KEY IMX_GPIO_NR(1, 5) | 1370 | #define GPIO_VOL_DN_KEY IMX_GPIO_NR(1, 5) |
1359 | iomux_v3_cfg_t const recovery_key_pads[] = { | 1371 | iomux_v3_cfg_t const recovery_key_pads[] = { |
1360 | (MX6_PAD_GPIO_5__GPIO1_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)), | 1372 | (MX6_PAD_GPIO_5__GPIO1_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)), |
1361 | }; | 1373 | }; |
1362 | 1374 | ||
1363 | int is_recovery_key_pressing(void) | 1375 | int is_recovery_key_pressing(void) |
1364 | { | 1376 | { |
1365 | int button_pressed = 0; | 1377 | int button_pressed = 0; |
1366 | 1378 | ||
1367 | /* Check Recovery Combo Button press or not. */ | 1379 | /* Check Recovery Combo Button press or not. */ |
1368 | imx_iomux_v3_setup_multiple_pads(recovery_key_pads, | 1380 | imx_iomux_v3_setup_multiple_pads(recovery_key_pads, |
1369 | ARRAY_SIZE(recovery_key_pads)); | 1381 | ARRAY_SIZE(recovery_key_pads)); |
1370 | 1382 | ||
1371 | gpio_request(GPIO_VOL_DN_KEY, "volume_dn_key"); | 1383 | gpio_request(GPIO_VOL_DN_KEY, "volume_dn_key"); |
1372 | gpio_direction_input(GPIO_VOL_DN_KEY); | 1384 | gpio_direction_input(GPIO_VOL_DN_KEY); |
1373 | 1385 | ||
1374 | if (gpio_get_value(GPIO_VOL_DN_KEY) == 0) { /* VOL_DN key is low assert */ | 1386 | if (gpio_get_value(GPIO_VOL_DN_KEY) == 0) { /* VOL_DN key is low assert */ |
1375 | button_pressed = 1; | 1387 | button_pressed = 1; |
1376 | printf("Recovery key pressed\n"); | 1388 | printf("Recovery key pressed\n"); |
1377 | } | 1389 | } |
1378 | 1390 | ||
1379 | return button_pressed; | 1391 | return button_pressed; |
1380 | } | 1392 | } |
1381 | 1393 | ||
1382 | #endif /*CONFIG_ANDROID_RECOVERY*/ | 1394 | #endif /*CONFIG_ANDROID_RECOVERY*/ |
1383 | 1395 | ||
1384 | #endif /*CONFIG_FSL_FASTBOOT*/ | 1396 | #endif /*CONFIG_FSL_FASTBOOT*/ |
1385 | 1397 | ||
1386 | 1398 | ||
1387 | #ifdef CONFIG_SPL_BUILD | 1399 | #ifdef CONFIG_SPL_BUILD |
1388 | #include <spl.h> | 1400 | #include <spl.h> |
1389 | #include <libfdt.h> | 1401 | #include <libfdt.h> |
1390 | 1402 | ||
1391 | #ifdef CONFIG_SPL_OS_BOOT | 1403 | #ifdef CONFIG_SPL_OS_BOOT |
1392 | int spl_start_uboot(void) | 1404 | int spl_start_uboot(void) |
1393 | { | 1405 | { |
1394 | gpio_request(KEY_VOL_UP, "KEY Volume UP"); | 1406 | gpio_request(KEY_VOL_UP, "KEY Volume UP"); |
1395 | gpio_direction_input(KEY_VOL_UP); | 1407 | gpio_direction_input(KEY_VOL_UP); |
1396 | 1408 | ||
1397 | /* Only enter in Falcon mode if KEY_VOL_UP is pressed */ | 1409 | /* Only enter in Falcon mode if KEY_VOL_UP is pressed */ |
1398 | return gpio_get_value(KEY_VOL_UP); | 1410 | return gpio_get_value(KEY_VOL_UP); |
1399 | } | 1411 | } |
1400 | #endif | 1412 | #endif |
1401 | 1413 | ||
1402 | static void ccgr_init(void) | 1414 | static void ccgr_init(void) |
1403 | { | 1415 | { |
1404 | struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; | 1416 | struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; |
1405 | 1417 | ||
1406 | writel(0x00C03F3F, &ccm->CCGR0); | 1418 | writel(0x00C03F3F, &ccm->CCGR0); |
1407 | writel(0x0030FC03, &ccm->CCGR1); | 1419 | writel(0x0030FC03, &ccm->CCGR1); |
1408 | writel(0x0FFFC000, &ccm->CCGR2); | 1420 | writel(0x0FFFC000, &ccm->CCGR2); |
1409 | writel(0x3FF00000, &ccm->CCGR3); | 1421 | writel(0x3FF00000, &ccm->CCGR3); |
1410 | writel(0x00FFF300, &ccm->CCGR4); | 1422 | writel(0x00FFF300, &ccm->CCGR4); |
1411 | writel(0x0F0000C3, &ccm->CCGR5); | 1423 | writel(0x0F0000C3, &ccm->CCGR5); |
1412 | writel(0x000003FF, &ccm->CCGR6); | 1424 | writel(0x000003FF, &ccm->CCGR6); |
1413 | } | 1425 | } |
1414 | 1426 | ||
1415 | static void gpr_init(void) | 1427 | static void gpr_init(void) |
1416 | { | 1428 | { |
1417 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; | 1429 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; |
1418 | 1430 | ||
1419 | /* enable AXI cache for VDOA/VPU/IPU */ | 1431 | /* enable AXI cache for VDOA/VPU/IPU */ |
1420 | writel(0xF00000CF, &iomux->gpr[4]); | 1432 | writel(0xF00000CF, &iomux->gpr[4]); |
1421 | if (is_mx6dqp()) { | 1433 | if (is_mx6dqp()) { |
1422 | /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */ | 1434 | /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */ |
1423 | writel(0x007F007F, &iomux->gpr[6]); | 1435 | writel(0x007F007F, &iomux->gpr[6]); |
1424 | writel(0x007F007F, &iomux->gpr[7]); | 1436 | writel(0x007F007F, &iomux->gpr[7]); |
1425 | } else { | 1437 | } else { |
1426 | /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ | 1438 | /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ |
1427 | writel(0x007F007F, &iomux->gpr[6]); | 1439 | writel(0x007F007F, &iomux->gpr[6]); |
1428 | writel(0x007F007F, &iomux->gpr[7]); | 1440 | writel(0x007F007F, &iomux->gpr[7]); |
1429 | } | 1441 | } |
1430 | } | 1442 | } |
1431 | 1443 | ||
1432 | static int mx6q_dcd_table[] = { | 1444 | static int mx6q_dcd_table[] = { |
1433 | 0x020e0798, 0x000C0000, | 1445 | 0x020e0798, 0x000C0000, |
1434 | 0x020e0758, 0x00000000, | 1446 | 0x020e0758, 0x00000000, |
1435 | 0x020e0588, 0x00000030, | 1447 | 0x020e0588, 0x00000030, |
1436 | 0x020e0594, 0x00000030, | 1448 | 0x020e0594, 0x00000030, |
1437 | 0x020e056c, 0x00000030, | 1449 | 0x020e056c, 0x00000030, |
1438 | 0x020e0578, 0x00000030, | 1450 | 0x020e0578, 0x00000030, |
1439 | 0x020e074c, 0x00000030, | 1451 | 0x020e074c, 0x00000030, |
1440 | 0x020e057c, 0x00000030, | 1452 | 0x020e057c, 0x00000030, |
1441 | 0x020e058c, 0x00000000, | 1453 | 0x020e058c, 0x00000000, |
1442 | 0x020e059c, 0x00000030, | 1454 | 0x020e059c, 0x00000030, |
1443 | 0x020e05a0, 0x00000030, | 1455 | 0x020e05a0, 0x00000030, |
1444 | 0x020e078c, 0x00000030, | 1456 | 0x020e078c, 0x00000030, |
1445 | 0x020e0750, 0x00020000, | 1457 | 0x020e0750, 0x00020000, |
1446 | 0x020e05a8, 0x00000030, | 1458 | 0x020e05a8, 0x00000030, |
1447 | 0x020e05b0, 0x00000030, | 1459 | 0x020e05b0, 0x00000030, |
1448 | 0x020e0524, 0x00000030, | 1460 | 0x020e0524, 0x00000030, |
1449 | 0x020e051c, 0x00000030, | 1461 | 0x020e051c, 0x00000030, |
1450 | 0x020e0518, 0x00000030, | 1462 | 0x020e0518, 0x00000030, |
1451 | 0x020e050c, 0x00000030, | 1463 | 0x020e050c, 0x00000030, |
1452 | 0x020e05b8, 0x00000030, | 1464 | 0x020e05b8, 0x00000030, |
1453 | 0x020e05c0, 0x00000030, | 1465 | 0x020e05c0, 0x00000030, |
1454 | 0x020e0774, 0x00020000, | 1466 | 0x020e0774, 0x00020000, |
1455 | 0x020e0784, 0x00000030, | 1467 | 0x020e0784, 0x00000030, |
1456 | 0x020e0788, 0x00000030, | 1468 | 0x020e0788, 0x00000030, |
1457 | 0x020e0794, 0x00000030, | 1469 | 0x020e0794, 0x00000030, |
1458 | 0x020e079c, 0x00000030, | 1470 | 0x020e079c, 0x00000030, |
1459 | 0x020e07a0, 0x00000030, | 1471 | 0x020e07a0, 0x00000030, |
1460 | 0x020e07a4, 0x00000030, | 1472 | 0x020e07a4, 0x00000030, |
1461 | 0x020e07a8, 0x00000030, | 1473 | 0x020e07a8, 0x00000030, |
1462 | 0x020e0748, 0x00000030, | 1474 | 0x020e0748, 0x00000030, |
1463 | 0x020e05ac, 0x00000030, | 1475 | 0x020e05ac, 0x00000030, |
1464 | 0x020e05b4, 0x00000030, | 1476 | 0x020e05b4, 0x00000030, |
1465 | 0x020e0528, 0x00000030, | 1477 | 0x020e0528, 0x00000030, |
1466 | 0x020e0520, 0x00000030, | 1478 | 0x020e0520, 0x00000030, |
1467 | 0x020e0514, 0x00000030, | 1479 | 0x020e0514, 0x00000030, |
1468 | 0x020e0510, 0x00000030, | 1480 | 0x020e0510, 0x00000030, |
1469 | 0x020e05bc, 0x00000030, | 1481 | 0x020e05bc, 0x00000030, |
1470 | 0x020e05c4, 0x00000030, | 1482 | 0x020e05c4, 0x00000030, |
1471 | 0x021b0800, 0xa1390003, | 1483 | 0x021b0800, 0xa1390003, |
1472 | 0x021b080c, 0x001F001F, | 1484 | 0x021b080c, 0x001F001F, |
1473 | 0x021b0810, 0x001F001F, | 1485 | 0x021b0810, 0x001F001F, |
1474 | 0x021b480c, 0x001F001F, | 1486 | 0x021b480c, 0x001F001F, |
1475 | 0x021b4810, 0x001F001F, | 1487 | 0x021b4810, 0x001F001F, |
1476 | 0x021b083c, 0x43270338, | 1488 | 0x021b083c, 0x43270338, |
1477 | 0x021b0840, 0x03200314, | 1489 | 0x021b0840, 0x03200314, |
1478 | 0x021b483c, 0x431A032F, | 1490 | 0x021b483c, 0x431A032F, |
1479 | 0x021b4840, 0x03200263, | 1491 | 0x021b4840, 0x03200263, |
1480 | 0x021b0848, 0x4B434748, | 1492 | 0x021b0848, 0x4B434748, |
1481 | 0x021b4848, 0x4445404C, | 1493 | 0x021b4848, 0x4445404C, |
1482 | 0x021b0850, 0x38444542, | 1494 | 0x021b0850, 0x38444542, |
1483 | 0x021b4850, 0x4935493A, | 1495 | 0x021b4850, 0x4935493A, |
1484 | 0x021b081c, 0x33333333, | 1496 | 0x021b081c, 0x33333333, |
1485 | 0x021b0820, 0x33333333, | 1497 | 0x021b0820, 0x33333333, |
1486 | 0x021b0824, 0x33333333, | 1498 | 0x021b0824, 0x33333333, |
1487 | 0x021b0828, 0x33333333, | 1499 | 0x021b0828, 0x33333333, |
1488 | 0x021b481c, 0x33333333, | 1500 | 0x021b481c, 0x33333333, |
1489 | 0x021b4820, 0x33333333, | 1501 | 0x021b4820, 0x33333333, |
1490 | 0x021b4824, 0x33333333, | 1502 | 0x021b4824, 0x33333333, |
1491 | 0x021b4828, 0x33333333, | 1503 | 0x021b4828, 0x33333333, |
1492 | 0x021b08b8, 0x00000800, | 1504 | 0x021b08b8, 0x00000800, |
1493 | 0x021b48b8, 0x00000800, | 1505 | 0x021b48b8, 0x00000800, |
1494 | 0x021b0004, 0x00020036, | 1506 | 0x021b0004, 0x00020036, |
1495 | 0x021b0008, 0x09444040, | 1507 | 0x021b0008, 0x09444040, |
1496 | 0x021b000c, 0x555A7975, | 1508 | 0x021b000c, 0x555A7975, |
1497 | 0x021b0010, 0xFF538F64, | 1509 | 0x021b0010, 0xFF538F64, |
1498 | 0x021b0014, 0x01FF00DB, | 1510 | 0x021b0014, 0x01FF00DB, |
1499 | 0x021b0018, 0x00001740, | 1511 | 0x021b0018, 0x00001740, |
1500 | 0x021b001c, 0x00008000, | 1512 | 0x021b001c, 0x00008000, |
1501 | 0x021b002c, 0x000026d2, | 1513 | 0x021b002c, 0x000026d2, |
1502 | 0x021b0030, 0x005A1023, | 1514 | 0x021b0030, 0x005A1023, |
1503 | 0x021b0040, 0x00000027, | 1515 | 0x021b0040, 0x00000027, |
1504 | 0x021b0000, 0x831A0000, | 1516 | 0x021b0000, 0x831A0000, |
1505 | 0x021b001c, 0x04088032, | 1517 | 0x021b001c, 0x04088032, |
1506 | 0x021b001c, 0x00008033, | 1518 | 0x021b001c, 0x00008033, |
1507 | 0x021b001c, 0x00048031, | 1519 | 0x021b001c, 0x00048031, |
1508 | 0x021b001c, 0x09408030, | 1520 | 0x021b001c, 0x09408030, |
1509 | 0x021b001c, 0x04008040, | 1521 | 0x021b001c, 0x04008040, |
1510 | 0x021b0020, 0x00005800, | 1522 | 0x021b0020, 0x00005800, |
1511 | 0x021b0818, 0x00011117, | 1523 | 0x021b0818, 0x00011117, |
1512 | 0x021b4818, 0x00011117, | 1524 | 0x021b4818, 0x00011117, |
1513 | 0x021b0004, 0x00025576, | 1525 | 0x021b0004, 0x00025576, |
1514 | 0x021b0404, 0x00011006, | 1526 | 0x021b0404, 0x00011006, |
1515 | 0x021b001c, 0x00000000, | 1527 | 0x021b001c, 0x00000000, |
1516 | }; | 1528 | }; |
1517 | 1529 | ||
1518 | static int mx6qp_dcd_table[] = { | 1530 | static int mx6qp_dcd_table[] = { |
1519 | 0x020e0798, 0x000c0000, | 1531 | 0x020e0798, 0x000c0000, |
1520 | 0x020e0758, 0x00000000, | 1532 | 0x020e0758, 0x00000000, |
1521 | 0x020e0588, 0x00000030, | 1533 | 0x020e0588, 0x00000030, |
1522 | 0x020e0594, 0x00000030, | 1534 | 0x020e0594, 0x00000030, |
1523 | 0x020e056c, 0x00000030, | 1535 | 0x020e056c, 0x00000030, |
1524 | 0x020e0578, 0x00000030, | 1536 | 0x020e0578, 0x00000030, |
1525 | 0x020e074c, 0x00000030, | 1537 | 0x020e074c, 0x00000030, |
1526 | 0x020e057c, 0x00000030, | 1538 | 0x020e057c, 0x00000030, |
1527 | 0x020e058c, 0x00000000, | 1539 | 0x020e058c, 0x00000000, |
1528 | 0x020e059c, 0x00000030, | 1540 | 0x020e059c, 0x00000030, |
1529 | 0x020e05a0, 0x00000030, | 1541 | 0x020e05a0, 0x00000030, |
1530 | 0x020e078c, 0x00000030, | 1542 | 0x020e078c, 0x00000030, |
1531 | 0x020e0750, 0x00020000, | 1543 | 0x020e0750, 0x00020000, |
1532 | 0x020e05a8, 0x00000030, | 1544 | 0x020e05a8, 0x00000030, |
1533 | 0x020e05b0, 0x00000030, | 1545 | 0x020e05b0, 0x00000030, |
1534 | 0x020e0524, 0x00000030, | 1546 | 0x020e0524, 0x00000030, |
1535 | 0x020e051c, 0x00000030, | 1547 | 0x020e051c, 0x00000030, |
1536 | 0x020e0518, 0x00000030, | 1548 | 0x020e0518, 0x00000030, |
1537 | 0x020e050c, 0x00000030, | 1549 | 0x020e050c, 0x00000030, |
1538 | 0x020e05b8, 0x00000030, | 1550 | 0x020e05b8, 0x00000030, |
1539 | 0x020e05c0, 0x00000030, | 1551 | 0x020e05c0, 0x00000030, |
1540 | 0x020e0774, 0x00020000, | 1552 | 0x020e0774, 0x00020000, |
1541 | 0x020e0784, 0x00000030, | 1553 | 0x020e0784, 0x00000030, |
1542 | 0x020e0788, 0x00000030, | 1554 | 0x020e0788, 0x00000030, |
1543 | 0x020e0794, 0x00000030, | 1555 | 0x020e0794, 0x00000030, |
1544 | 0x020e079c, 0x00000030, | 1556 | 0x020e079c, 0x00000030, |
1545 | 0x020e07a0, 0x00000030, | 1557 | 0x020e07a0, 0x00000030, |
1546 | 0x020e07a4, 0x00000030, | 1558 | 0x020e07a4, 0x00000030, |
1547 | 0x020e07a8, 0x00000030, | 1559 | 0x020e07a8, 0x00000030, |
1548 | 0x020e0748, 0x00000030, | 1560 | 0x020e0748, 0x00000030, |
1549 | 0x020e05ac, 0x00000030, | 1561 | 0x020e05ac, 0x00000030, |
1550 | 0x020e05b4, 0x00000030, | 1562 | 0x020e05b4, 0x00000030, |
1551 | 0x020e0528, 0x00000030, | 1563 | 0x020e0528, 0x00000030, |
1552 | 0x020e0520, 0x00000030, | 1564 | 0x020e0520, 0x00000030, |
1553 | 0x020e0514, 0x00000030, | 1565 | 0x020e0514, 0x00000030, |
1554 | 0x020e0510, 0x00000030, | 1566 | 0x020e0510, 0x00000030, |
1555 | 0x020e05bc, 0x00000030, | 1567 | 0x020e05bc, 0x00000030, |
1556 | 0x020e05c4, 0x00000030, | 1568 | 0x020e05c4, 0x00000030, |
1557 | 0x021b0800, 0xa1390003, | 1569 | 0x021b0800, 0xa1390003, |
1558 | 0x021b080c, 0x001b001e, | 1570 | 0x021b080c, 0x001b001e, |
1559 | 0x021b0810, 0x002e0029, | 1571 | 0x021b0810, 0x002e0029, |
1560 | 0x021b480c, 0x001b002a, | 1572 | 0x021b480c, 0x001b002a, |
1561 | 0x021b4810, 0x0019002c, | 1573 | 0x021b4810, 0x0019002c, |
1562 | 0x021b083c, 0x43240334, | 1574 | 0x021b083c, 0x43240334, |
1563 | 0x021b0840, 0x0324031a, | 1575 | 0x021b0840, 0x0324031a, |
1564 | 0x021b483c, 0x43340344, | 1576 | 0x021b483c, 0x43340344, |
1565 | 0x021b4840, 0x03280276, | 1577 | 0x021b4840, 0x03280276, |
1566 | 0x021b0848, 0x44383A3E, | 1578 | 0x021b0848, 0x44383A3E, |
1567 | 0x021b4848, 0x3C3C3846, | 1579 | 0x021b4848, 0x3C3C3846, |
1568 | 0x021b0850, 0x2e303230, | 1580 | 0x021b0850, 0x2e303230, |
1569 | 0x021b4850, 0x38283E34, | 1581 | 0x021b4850, 0x38283E34, |
1570 | 0x021b081c, 0x33333333, | 1582 | 0x021b081c, 0x33333333, |
1571 | 0x021b0820, 0x33333333, | 1583 | 0x021b0820, 0x33333333, |
1572 | 0x021b0824, 0x33333333, | 1584 | 0x021b0824, 0x33333333, |
1573 | 0x021b0828, 0x33333333, | 1585 | 0x021b0828, 0x33333333, |
1574 | 0x021b481c, 0x33333333, | 1586 | 0x021b481c, 0x33333333, |
1575 | 0x021b4820, 0x33333333, | 1587 | 0x021b4820, 0x33333333, |
1576 | 0x021b4824, 0x33333333, | 1588 | 0x021b4824, 0x33333333, |
1577 | 0x021b4828, 0x33333333, | 1589 | 0x021b4828, 0x33333333, |
1578 | 0x021b08c0, 0x24912249, | 1590 | 0x021b08c0, 0x24912249, |
1579 | 0x021b48c0, 0x24914289, | 1591 | 0x021b48c0, 0x24914289, |
1580 | 0x021b08b8, 0x00000800, | 1592 | 0x021b08b8, 0x00000800, |
1581 | 0x021b48b8, 0x00000800, | 1593 | 0x021b48b8, 0x00000800, |
1582 | 0x021b0004, 0x00020036, | 1594 | 0x021b0004, 0x00020036, |
1583 | 0x021b0008, 0x24444040, | 1595 | 0x021b0008, 0x24444040, |
1584 | 0x021b000c, 0x555A7955, | 1596 | 0x021b000c, 0x555A7955, |
1585 | 0x021b0010, 0xFF320F64, | 1597 | 0x021b0010, 0xFF320F64, |
1586 | 0x021b0014, 0x01ff00db, | 1598 | 0x021b0014, 0x01ff00db, |
1587 | 0x021b0018, 0x00001740, | 1599 | 0x021b0018, 0x00001740, |
1588 | 0x021b001c, 0x00008000, | 1600 | 0x021b001c, 0x00008000, |
1589 | 0x021b002c, 0x000026d2, | 1601 | 0x021b002c, 0x000026d2, |
1590 | 0x021b0030, 0x005A1023, | 1602 | 0x021b0030, 0x005A1023, |
1591 | 0x021b0040, 0x00000027, | 1603 | 0x021b0040, 0x00000027, |
1592 | 0x021b0400, 0x14420000, | 1604 | 0x021b0400, 0x14420000, |
1593 | 0x021b0000, 0x831A0000, | 1605 | 0x021b0000, 0x831A0000, |
1594 | 0x021b0890, 0x00400C58, | 1606 | 0x021b0890, 0x00400C58, |
1595 | 0x00bb0008, 0x00000000, | 1607 | 0x00bb0008, 0x00000000, |
1596 | 0x00bb000c, 0x2891E41A, | 1608 | 0x00bb000c, 0x2891E41A, |
1597 | 0x00bb0038, 0x00000564, | 1609 | 0x00bb0038, 0x00000564, |
1598 | 0x00bb0014, 0x00000040, | 1610 | 0x00bb0014, 0x00000040, |
1599 | 0x00bb0028, 0x00000020, | 1611 | 0x00bb0028, 0x00000020, |
1600 | 0x00bb002c, 0x00000020, | 1612 | 0x00bb002c, 0x00000020, |
1601 | 0x021b001c, 0x04088032, | 1613 | 0x021b001c, 0x04088032, |
1602 | 0x021b001c, 0x00008033, | 1614 | 0x021b001c, 0x00008033, |
1603 | 0x021b001c, 0x00048031, | 1615 | 0x021b001c, 0x00048031, |
1604 | 0x021b001c, 0x09408030, | 1616 | 0x021b001c, 0x09408030, |
1605 | 0x021b001c, 0x04008040, | 1617 | 0x021b001c, 0x04008040, |
1606 | 0x021b0020, 0x00005800, | 1618 | 0x021b0020, 0x00005800, |
1607 | 0x021b0818, 0x00011117, | 1619 | 0x021b0818, 0x00011117, |
1608 | 0x021b4818, 0x00011117, | 1620 | 0x021b4818, 0x00011117, |
1609 | 0x021b0004, 0x00025576, | 1621 | 0x021b0004, 0x00025576, |
1610 | 0x021b0404, 0x00011006, | 1622 | 0x021b0404, 0x00011006, |
1611 | 0x021b001c, 0x00000000, | 1623 | 0x021b001c, 0x00000000, |
1612 | }; | 1624 | }; |
1613 | 1625 | ||
1614 | static void ddr_init(int *table, int size) | 1626 | static void ddr_init(int *table, int size) |
1615 | { | 1627 | { |
1616 | int i; | 1628 | int i; |
1617 | 1629 | ||
1618 | for (i = 0; i < size / 2 ; i++) | 1630 | for (i = 0; i < size / 2 ; i++) |
1619 | writel(table[2 * i + 1], table[2 * i]); | 1631 | writel(table[2 * i + 1], table[2 * i]); |
1620 | } | 1632 | } |
1621 | 1633 | ||
1622 | static void spl_dram_init(void) | 1634 | static void spl_dram_init(void) |
1623 | { | 1635 | { |
1624 | if (is_mx6dq()) | 1636 | if (is_mx6dq()) |
1625 | ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table)); | 1637 | ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table)); |
1626 | else if (is_mx6dqp()) | 1638 | else if (is_mx6dqp()) |
1627 | ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table)); | 1639 | ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table)); |
1628 | } | 1640 | } |
1629 | 1641 | ||
1630 | void board_init_f(ulong dummy) | 1642 | void board_init_f(ulong dummy) |
1631 | { | 1643 | { |
1632 | /* DDR initialization */ | 1644 | /* DDR initialization */ |
1633 | spl_dram_init(); | 1645 | spl_dram_init(); |
1634 | 1646 | ||
1635 | /* setup AIPS and disable watchdog */ | 1647 | /* setup AIPS and disable watchdog */ |
1636 | arch_cpu_init(); | 1648 | arch_cpu_init(); |
1637 | 1649 | ||
1638 | ccgr_init(); | 1650 | ccgr_init(); |
1639 | gpr_init(); | 1651 | gpr_init(); |
1640 | 1652 | ||
1641 | /* iomux and setup of i2c */ | 1653 | /* iomux and setup of i2c */ |
1642 | board_early_init_f(); | 1654 | board_early_init_f(); |
1643 | 1655 | ||
1644 | /* setup GP timer */ | 1656 | /* setup GP timer */ |
1645 | timer_init(); | 1657 | timer_init(); |
1646 | 1658 | ||
1647 | /* UART clocks enabled and gd valid - init serial console */ | 1659 | /* UART clocks enabled and gd valid - init serial console */ |
1648 | preloader_console_init(); | 1660 | preloader_console_init(); |
1649 | 1661 | ||
1650 | /* Clear the BSS. */ | 1662 | /* Clear the BSS. */ |
1651 | memset(__bss_start, 0, __bss_end - __bss_start); | 1663 | memset(__bss_start, 0, __bss_end - __bss_start); |
1652 | 1664 | ||
1653 | /* load/boot image from boot device */ | 1665 | /* load/boot image from boot device */ |
1654 | board_init_r(NULL, 0); | 1666 | board_init_r(NULL, 0); |
1655 | } | 1667 | } |