Commit 369776edfebf022130a2a8ed986e73ede62ec7cd

Authored by Ye Li
1 parent 5274ae1eb9

MLK-22851-3 imx8mq: Enable eMMC HS400 and SD UHS mode on EVK

iMX8MQ EVK board has a eMMC5.0 chip and supports SD3.0, so enable the UHS
and HS400 configs to enhance the eMMC/SD access.

The change also needs to set usdhc clock to 400Mhz, and add the off-on-delay-us
to SD reset pin, otherwise some SD cards will fail to select UHS mode in
re-initialization.

Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit 57e1bc5f634be231b2bfd10cf0cbbff86dadd2e1)

Showing 3 changed files with 6 additions and 4 deletions Inline Diff

arch/arm/dts/fsl-imx8mq-evk.dts
1 // SPDX-License-Identifier: GPL-2.0+ 1 // SPDX-License-Identifier: GPL-2.0+
2 /* 2 /*
3 * Copyright 2018 NXP 3 * Copyright 2018 NXP
4 */ 4 */
5 5
6 /dts-v1/; 6 /dts-v1/;
7 7
8 /* First 128KB is for PSCI ATF. */ 8 /* First 128KB is for PSCI ATF. */
9 /memreserve/ 0x40000000 0x00020000; 9 /memreserve/ 0x40000000 0x00020000;
10 10
11 #include "fsl-imx8mq.dtsi" 11 #include "fsl-imx8mq.dtsi"
12 12
13 / { 13 / {
14 model = "Freescale i.MX8MQ EVK"; 14 model = "Freescale i.MX8MQ EVK";
15 compatible = "fsl,imx8mq-evk", "fsl,imx8mq"; 15 compatible = "fsl,imx8mq-evk", "fsl,imx8mq";
16 16
17 chosen { 17 chosen {
18 bootargs = "console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200"; 18 bootargs = "console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200";
19 stdout-path = &uart1; 19 stdout-path = &uart1;
20 }; 20 };
21 21
22 firmware { 22 firmware {
23 optee { 23 optee {
24 compatible = "linaro,optee-tz"; 24 compatible = "linaro,optee-tz";
25 method = "smc"; 25 method = "smc";
26 }; 26 };
27 }; 27 };
28 28
29 regulators { 29 regulators {
30 compatible = "simple-bus"; 30 compatible = "simple-bus";
31 #address-cells = <1>; 31 #address-cells = <1>;
32 #size-cells = <0>; 32 #size-cells = <0>;
33 33
34 reg_usdhc2_vmmc: usdhc2_vmmc { 34 reg_usdhc2_vmmc: usdhc2_vmmc {
35 compatible = "regulator-fixed"; 35 compatible = "regulator-fixed";
36 regulator-name = "VSD_3V3"; 36 regulator-name = "VSD_3V3";
37 regulator-min-microvolt = <3300000>; 37 regulator-min-microvolt = <3300000>;
38 regulator-max-microvolt = <3300000>; 38 regulator-max-microvolt = <3300000>;
39 gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>; 39 gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
40 u-boot,off-on-delay-us = <20000>;
40 enable-active-high; 41 enable-active-high;
41 }; 42 };
42 }; 43 };
43 44
44 pwmleds { 45 pwmleds {
45 compatible = "pwm-leds"; 46 compatible = "pwm-leds";
46 47
47 ledpwm2 { 48 ledpwm2 {
48 label = "PWM2"; 49 label = "PWM2";
49 pwms = <&pwm2 0 50000>; 50 pwms = <&pwm2 0 50000>;
50 max-brightness = <255>; 51 max-brightness = <255>;
51 }; 52 };
52 }; 53 };
53 }; 54 };
54 55
55 &iomuxc { 56 &iomuxc {
56 pinctrl-names = "default"; 57 pinctrl-names = "default";
57 58
58 imx8mq-evk { 59 imx8mq-evk {
59 pinctrl_fec1: fec1grp { 60 pinctrl_fec1: fec1grp {
60 fsl,pins = < 61 fsl,pins = <
61 MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC 0x3 62 MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC 0x3
62 MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO 0x23 63 MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO 0x23
63 MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3 0x1f 64 MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3 0x1f
64 MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2 0x1f 65 MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2 0x1f
65 MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1 0x1f 66 MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1 0x1f
66 MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0 0x1f 67 MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0 0x1f
67 MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3 0x91 68 MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3 0x91
68 MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2 0x91 69 MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2 0x91
69 MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1 0x91 70 MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1 0x91
70 MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0 0x91 71 MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0 0x91
71 MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC 0x1f 72 MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC 0x1f
72 MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91 73 MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91
73 MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x91 74 MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x91
74 MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x1f 75 MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x1f
75 MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x19 76 MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x19
76 >; 77 >;
77 }; 78 };
78 79
79 pinctrl_i2c1: i2c1grp { 80 pinctrl_i2c1: i2c1grp {
80 fsl,pins = < 81 fsl,pins = <
81 MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x4000007f 82 MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x4000007f
82 MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA 0x4000007f 83 MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA 0x4000007f
83 >; 84 >;
84 }; 85 };
85 86
86 pinctrl_i2c2: i2c2grp { 87 pinctrl_i2c2: i2c2grp {
87 fsl,pins = < 88 fsl,pins = <
88 MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL 0x40000067 89 MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL 0x40000067
89 MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA 0x40000067 90 MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA 0x40000067
90 >; 91 >;
91 }; 92 };
92 93
93 pinctrl_i2c1_gpio: i2c1grp-gpio { 94 pinctrl_i2c1_gpio: i2c1grp-gpio {
94 fsl,pins = < 95 fsl,pins = <
95 MX8MQ_IOMUXC_I2C1_SCL_GPIO5_IO14 0x7f 96 MX8MQ_IOMUXC_I2C1_SCL_GPIO5_IO14 0x7f
96 MX8MQ_IOMUXC_I2C1_SDA_GPIO5_IO15 0x7f 97 MX8MQ_IOMUXC_I2C1_SDA_GPIO5_IO15 0x7f
97 >; 98 >;
98 }; 99 };
99 100
100 pinctrl_i2c2_gpio: i2c2grp-gpio { 101 pinctrl_i2c2_gpio: i2c2grp-gpio {
101 fsl,pins = < 102 fsl,pins = <
102 MX8MQ_IOMUXC_I2C2_SCL_GPIO5_IO16 0x7f 103 MX8MQ_IOMUXC_I2C2_SCL_GPIO5_IO16 0x7f
103 MX8MQ_IOMUXC_I2C2_SDA_GPIO5_IO17 0x7f 104 MX8MQ_IOMUXC_I2C2_SDA_GPIO5_IO17 0x7f
104 >; 105 >;
105 }; 106 };
106 107
107 pinctrl_pwm2: pwm2grp { 108 pinctrl_pwm2: pwm2grp {
108 fsl,pins = < 109 fsl,pins = <
109 MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT 0x16 110 MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT 0x16
110 >; 111 >;
111 }; 112 };
112 113
113 pinctrl_qspi: qspigrp { 114 pinctrl_qspi: qspigrp {
114 fsl,pins = < 115 fsl,pins = <
115 MX8MQ_IOMUXC_NAND_ALE_QSPI_A_SCLK 0x82 116 MX8MQ_IOMUXC_NAND_ALE_QSPI_A_SCLK 0x82
116 MX8MQ_IOMUXC_NAND_CE0_B_QSPI_A_SS0_B 0x82 117 MX8MQ_IOMUXC_NAND_CE0_B_QSPI_A_SS0_B 0x82
117 MX8MQ_IOMUXC_NAND_DATA00_QSPI_A_DATA0 0x82 118 MX8MQ_IOMUXC_NAND_DATA00_QSPI_A_DATA0 0x82
118 MX8MQ_IOMUXC_NAND_DATA01_QSPI_A_DATA1 0x82 119 MX8MQ_IOMUXC_NAND_DATA01_QSPI_A_DATA1 0x82
119 MX8MQ_IOMUXC_NAND_DATA02_QSPI_A_DATA2 0x82 120 MX8MQ_IOMUXC_NAND_DATA02_QSPI_A_DATA2 0x82
120 MX8MQ_IOMUXC_NAND_DATA03_QSPI_A_DATA3 0x82 121 MX8MQ_IOMUXC_NAND_DATA03_QSPI_A_DATA3 0x82
121 122
122 >; 123 >;
123 }; 124 };
124 125
125 pinctrl_uart1: uart1grp { 126 pinctrl_uart1: uart1grp {
126 fsl,pins = < 127 fsl,pins = <
127 MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX 0x49 128 MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX 0x49
128 MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX 0x49 129 MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX 0x49
129 >; 130 >;
130 }; 131 };
131 132
132 pinctrl_uart3: uart3grp { 133 pinctrl_uart3: uart3grp {
133 fsl,pins = < 134 fsl,pins = <
134 MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX 0x49 135 MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX 0x49
135 MX8MQ_IOMUXC_UART3_RXD_UART3_DCE_RX 0x49 136 MX8MQ_IOMUXC_UART3_RXD_UART3_DCE_RX 0x49
136 MX8MQ_IOMUXC_ECSPI1_MISO_UART3_DCE_CTS_B 0x49 137 MX8MQ_IOMUXC_ECSPI1_MISO_UART3_DCE_CTS_B 0x49
137 MX8MQ_IOMUXC_ECSPI1_SS0_UART3_DCE_RTS_B 0x49 138 MX8MQ_IOMUXC_ECSPI1_SS0_UART3_DCE_RTS_B 0x49
138 MX8MQ_IOMUXC_NAND_CLE_GPIO3_IO5 0x49 139 MX8MQ_IOMUXC_NAND_CLE_GPIO3_IO5 0x49
139 >; 140 >;
140 }; 141 };
141 142
142 pinctrl_usdhc1: usdhc1grp { 143 pinctrl_usdhc1: usdhc1grp {
143 fsl,pins = < 144 fsl,pins = <
144 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x83 145 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x83
145 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc3 146 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc3
146 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc3 147 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc3
147 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc3 148 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc3
148 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc3 149 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc3
149 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc3 150 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc3
150 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc3 151 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc3
151 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc3 152 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc3
152 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc3 153 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc3
153 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc3 154 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc3
154 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x83 155 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x83
155 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 156 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
156 >; 157 >;
157 }; 158 };
158 159
159 pinctrl_usdhc1_100mhz: usdhc1grp100mhz { 160 pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
160 fsl,pins = < 161 fsl,pins = <
161 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x8d 162 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x8d
162 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xcd 163 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xcd
163 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xcd 164 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xcd
164 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xcd 165 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xcd
165 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xcd 166 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xcd
166 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xcd 167 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xcd
167 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xcd 168 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xcd
168 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xcd 169 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xcd
169 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xcd 170 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xcd
170 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xcd 171 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xcd
171 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x8d 172 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x8d
172 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 173 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
173 >; 174 >;
174 }; 175 };
175 176
176 pinctrl_usdhc1_200mhz: usdhc1grp200mhz { 177 pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
177 fsl,pins = < 178 fsl,pins = <
178 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x9f 179 MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x9f
179 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xdf 180 MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xdf
180 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xdf 181 MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xdf
181 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xdf 182 MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xdf
182 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xdf 183 MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xdf
183 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xdf 184 MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xdf
184 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xdf 185 MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xdf
185 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xdf 186 MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xdf
186 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xdf 187 MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xdf
187 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xdf 188 MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xdf
188 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x9f 189 MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x9f
189 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 190 MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
190 >; 191 >;
191 }; 192 };
192 193
193 pinctrl_usdhc2_gpio: usdhc2grpgpio { 194 pinctrl_usdhc2_gpio: usdhc2grpgpio {
194 fsl,pins = < 195 fsl,pins = <
195 MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12 0x41 196 MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12 0x41
196 MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19 0x41 197 MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19 0x41
197 >; 198 >;
198 }; 199 };
199 200
200 pinctrl_usdhc2: usdhc2grp { 201 pinctrl_usdhc2: usdhc2grp {
201 fsl,pins = < 202 fsl,pins = <
202 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x83 203 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x83
203 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc3 204 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc3
204 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc3 205 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc3
205 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc3 206 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc3
206 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc3 207 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc3
207 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc3 208 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc3
208 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 209 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1
209 >; 210 >;
210 }; 211 };
211 212
212 pinctrl_usdhc2_100mhz: usdhc2grp100mhz { 213 pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
213 fsl,pins = < 214 fsl,pins = <
214 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x8d 215 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x8d
215 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xcd 216 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xcd
216 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xcd 217 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xcd
217 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xcd 218 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xcd
218 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xcd 219 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xcd
219 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xcd 220 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xcd
220 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 221 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1
221 >; 222 >;
222 }; 223 };
223 224
224 pinctrl_usdhc2_200mhz: usdhc2grp200mhz { 225 pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
225 fsl,pins = < 226 fsl,pins = <
226 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x9f 227 MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x9f
227 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xdf 228 MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xdf
228 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xdf 229 MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xdf
229 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xdf 230 MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xdf
230 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xdf 231 MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xdf
231 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xdf 232 MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xdf
232 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 233 MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1
233 >; 234 >;
234 }; 235 };
235 236
236 pinctrl_sai2: sai2grp { 237 pinctrl_sai2: sai2grp {
237 fsl,pins = < 238 fsl,pins = <
238 MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC 0xd6 239 MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC 0xd6
239 MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK 0xd6 240 MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK 0xd6
240 MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK 0xd6 241 MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK 0xd6
241 MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0 0xd6 242 MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0 0xd6
242 MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8 0xd6 243 MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8 0xd6
243 >; 244 >;
244 }; 245 };
245 246
246 pinctrl_wdog: wdoggrp { 247 pinctrl_wdog: wdoggrp {
247 fsl,pins = < 248 fsl,pins = <
248 MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0xc6 249 MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0xc6
249 >; 250 >;
250 }; 251 };
251 }; 252 };
252 }; 253 };
253 254
254 &fec1 { 255 &fec1 {
255 pinctrl-names = "default"; 256 pinctrl-names = "default";
256 pinctrl-0 = <&pinctrl_fec1>; 257 pinctrl-0 = <&pinctrl_fec1>;
257 phy-mode = "rgmii-id"; 258 phy-mode = "rgmii-id";
258 phy-handle = <&ethphy0>; 259 phy-handle = <&ethphy0>;
259 fsl,magic-packet; 260 fsl,magic-packet;
260 status = "okay"; 261 status = "okay";
261 262
262 mdio { 263 mdio {
263 #address-cells = <1>; 264 #address-cells = <1>;
264 #size-cells = <0>; 265 #size-cells = <0>;
265 266
266 ethphy0: ethernet-phy@0 { 267 ethphy0: ethernet-phy@0 {
267 compatible = "ethernet-phy-ieee802.3-c22"; 268 compatible = "ethernet-phy-ieee802.3-c22";
268 reg = <0>; 269 reg = <0>;
269 at803x,led-act-blind-workaround; 270 at803x,led-act-blind-workaround;
270 at803x,eee-disabled; 271 at803x,eee-disabled;
271 }; 272 };
272 }; 273 };
273 }; 274 };
274 275
275 &i2c1 { 276 &i2c1 {
276 clock-frequency = <100000>; 277 clock-frequency = <100000>;
277 pinctrl-names = "default", "gpio"; 278 pinctrl-names = "default", "gpio";
278 pinctrl-0 = <&pinctrl_i2c1>; 279 pinctrl-0 = <&pinctrl_i2c1>;
279 pinctrl-1 = <&pinctrl_i2c1_gpio>; 280 pinctrl-1 = <&pinctrl_i2c1_gpio>;
280 scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>; 281 scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>;
281 sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>; 282 sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
282 status = "okay"; 283 status = "okay";
283 284
284 pmic: pfuze100@08 { 285 pmic: pfuze100@08 {
285 compatible = "fsl,pfuze100"; 286 compatible = "fsl,pfuze100";
286 reg = <0x08>; 287 reg = <0x08>;
287 288
288 regulators { 289 regulators {
289 sw1a_reg: sw1ab { 290 sw1a_reg: sw1ab {
290 regulator-min-microvolt = <300000>; 291 regulator-min-microvolt = <300000>;
291 regulator-max-microvolt = <1875000>; 292 regulator-max-microvolt = <1875000>;
292 regulator-always-on; 293 regulator-always-on;
293 }; 294 };
294 295
295 sw1c_reg: sw1c { 296 sw1c_reg: sw1c {
296 regulator-min-microvolt = <300000>; 297 regulator-min-microvolt = <300000>;
297 regulator-max-microvolt = <1875000>; 298 regulator-max-microvolt = <1875000>;
298 regulator-always-on; 299 regulator-always-on;
299 }; 300 };
300 301
301 sw2_reg: sw2 { 302 sw2_reg: sw2 {
302 regulator-min-microvolt = <800000>; 303 regulator-min-microvolt = <800000>;
303 regulator-max-microvolt = <3300000>; 304 regulator-max-microvolt = <3300000>;
304 regulator-always-on; 305 regulator-always-on;
305 }; 306 };
306 307
307 sw3a_reg: sw3ab { 308 sw3a_reg: sw3ab {
308 regulator-min-microvolt = <400000>; 309 regulator-min-microvolt = <400000>;
309 regulator-max-microvolt = <1975000>; 310 regulator-max-microvolt = <1975000>;
310 regulator-always-on; 311 regulator-always-on;
311 }; 312 };
312 313
313 sw4_reg: sw4 { 314 sw4_reg: sw4 {
314 regulator-min-microvolt = <800000>; 315 regulator-min-microvolt = <800000>;
315 regulator-max-microvolt = <3300000>; 316 regulator-max-microvolt = <3300000>;
316 regulator-always-on; 317 regulator-always-on;
317 }; 318 };
318 319
319 swbst_reg: swbst { 320 swbst_reg: swbst {
320 regulator-min-microvolt = <5000000>; 321 regulator-min-microvolt = <5000000>;
321 regulator-max-microvolt = <5150000>; 322 regulator-max-microvolt = <5150000>;
322 }; 323 };
323 324
324 snvs_reg: vsnvs { 325 snvs_reg: vsnvs {
325 regulator-min-microvolt = <1000000>; 326 regulator-min-microvolt = <1000000>;
326 regulator-max-microvolt = <3000000>; 327 regulator-max-microvolt = <3000000>;
327 regulator-always-on; 328 regulator-always-on;
328 }; 329 };
329 330
330 vref_reg: vrefddr { 331 vref_reg: vrefddr {
331 regulator-always-on; 332 regulator-always-on;
332 }; 333 };
333 334
334 vgen1_reg: vgen1 { 335 vgen1_reg: vgen1 {
335 regulator-min-microvolt = <800000>; 336 regulator-min-microvolt = <800000>;
336 regulator-max-microvolt = <1550000>; 337 regulator-max-microvolt = <1550000>;
337 }; 338 };
338 339
339 vgen2_reg: vgen2 { 340 vgen2_reg: vgen2 {
340 regulator-min-microvolt = <800000>; 341 regulator-min-microvolt = <800000>;
341 regulator-max-microvolt = <1550000>; 342 regulator-max-microvolt = <1550000>;
342 regulator-always-on; 343 regulator-always-on;
343 }; 344 };
344 345
345 vgen3_reg: vgen3 { 346 vgen3_reg: vgen3 {
346 regulator-min-microvolt = <1800000>; 347 regulator-min-microvolt = <1800000>;
347 regulator-max-microvolt = <3300000>; 348 regulator-max-microvolt = <3300000>;
348 regulator-always-on; 349 regulator-always-on;
349 }; 350 };
350 351
351 vgen4_reg: vgen4 { 352 vgen4_reg: vgen4 {
352 regulator-min-microvolt = <1800000>; 353 regulator-min-microvolt = <1800000>;
353 regulator-max-microvolt = <3300000>; 354 regulator-max-microvolt = <3300000>;
354 regulator-always-on; 355 regulator-always-on;
355 }; 356 };
356 357
357 vgen5_reg: vgen5 { 358 vgen5_reg: vgen5 {
358 regulator-min-microvolt = <1800000>; 359 regulator-min-microvolt = <1800000>;
359 regulator-max-microvolt = <3300000>; 360 regulator-max-microvolt = <3300000>;
360 regulator-always-on; 361 regulator-always-on;
361 }; 362 };
362 363
363 vgen6_reg: vgen6 { 364 vgen6_reg: vgen6 {
364 regulator-min-microvolt = <1800000>; 365 regulator-min-microvolt = <1800000>;
365 regulator-max-microvolt = <3300000>; 366 regulator-max-microvolt = <3300000>;
366 }; 367 };
367 }; 368 };
368 }; 369 };
369 }; 370 };
370 371
371 &i2c2 { 372 &i2c2 {
372 clock-frequency = <100000>; 373 clock-frequency = <100000>;
373 pinctrl-names = "default", "gpio"; 374 pinctrl-names = "default", "gpio";
374 pinctrl-0 = <&pinctrl_i2c2>; 375 pinctrl-0 = <&pinctrl_i2c2>;
375 pinctrl-1 = <&pinctrl_i2c2_gpio>; 376 pinctrl-1 = <&pinctrl_i2c2_gpio>;
376 scl-gpios = <&gpio5 16 GPIO_ACTIVE_HIGH>; 377 scl-gpios = <&gpio5 16 GPIO_ACTIVE_HIGH>;
377 sda-gpios = <&gpio5 17 GPIO_ACTIVE_HIGH>; 378 sda-gpios = <&gpio5 17 GPIO_ACTIVE_HIGH>;
378 status = "disabled"; 379 status = "disabled";
379 }; 380 };
380 381
381 &pwm2 { 382 &pwm2 {
382 pinctrl-names = "default"; 383 pinctrl-names = "default";
383 pinctrl-0 = <&pinctrl_pwm2>; 384 pinctrl-0 = <&pinctrl_pwm2>;
384 status = "okay"; 385 status = "okay";
385 }; 386 };
386 387
387 &uart1 { /* console */ 388 &uart1 { /* console */
388 pinctrl-names = "default"; 389 pinctrl-names = "default";
389 pinctrl-0 = <&pinctrl_uart1>; 390 pinctrl-0 = <&pinctrl_uart1>;
390 assigned-clocks = <&clk IMX8MQ_CLK_UART1_SRC>; 391 assigned-clocks = <&clk IMX8MQ_CLK_UART1_SRC>;
391 assigned-clock-parents = <&clk IMX8MQ_CLK_25M>; 392 assigned-clock-parents = <&clk IMX8MQ_CLK_25M>;
392 status = "okay"; 393 status = "okay";
393 }; 394 };
394 395
395 &lcdif { 396 &lcdif {
396 status = "okay"; 397 status = "okay";
397 disp-dev = "mipi_dsi_northwest"; 398 disp-dev = "mipi_dsi_northwest";
398 display = <&display0>; 399 display = <&display0>;
399 400
400 display0: display@0 { 401 display0: display@0 {
401 bits-per-pixel = <24>; 402 bits-per-pixel = <24>;
402 bus-width = <24>; 403 bus-width = <24>;
403 404
404 display-timings { 405 display-timings {
405 native-mode = <&timing0>; 406 native-mode = <&timing0>;
406 timing0: timing0 { 407 timing0: timing0 {
407 clock-frequency = <9200000>; 408 clock-frequency = <9200000>;
408 hactive = <480>; 409 hactive = <480>;
409 vactive = <272>; 410 vactive = <272>;
410 hfront-porch = <8>; 411 hfront-porch = <8>;
411 hback-porch = <4>; 412 hback-porch = <4>;
412 hsync-len = <41>; 413 hsync-len = <41>;
413 vback-porch = <2>; 414 vback-porch = <2>;
414 vfront-porch = <4>; 415 vfront-porch = <4>;
415 vsync-len = <10>; 416 vsync-len = <10>;
416 417
417 hsync-active = <0>; 418 hsync-active = <0>;
418 vsync-active = <0>; 419 vsync-active = <0>;
419 de-active = <1>; 420 de-active = <1>;
420 pixelclk-active = <0>; 421 pixelclk-active = <0>;
421 }; 422 };
422 }; 423 };
423 }; 424 };
424 }; 425 };
425 426
426 &qspi { 427 &qspi {
427 pinctrl-names = "default"; 428 pinctrl-names = "default";
428 pinctrl-0 = <&pinctrl_qspi>; 429 pinctrl-0 = <&pinctrl_qspi>;
429 status = "okay"; 430 status = "okay";
430 431
431 flash0: n25q256a@0 { 432 flash0: n25q256a@0 {
432 reg = <0>; 433 reg = <0>;
433 #address-cells = <1>; 434 #address-cells = <1>;
434 #size-cells = <1>; 435 #size-cells = <1>;
435 compatible = "spi-flash"; 436 compatible = "spi-flash";
436 spi-max-frequency = <29000000>; 437 spi-max-frequency = <29000000>;
437 spi-nor,ddr-quad-read-dummy = <6>; 438 spi-nor,ddr-quad-read-dummy = <6>;
438 }; 439 };
439 }; 440 };
440 441
441 &usdhc1 { 442 &usdhc1 {
442 pinctrl-names = "default", "state_100mhz", "state_200mhz"; 443 pinctrl-names = "default", "state_100mhz", "state_200mhz";
443 pinctrl-0 = <&pinctrl_usdhc1>; 444 pinctrl-0 = <&pinctrl_usdhc1>;
444 pinctrl-1 = <&pinctrl_usdhc1_100mhz>; 445 pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
445 pinctrl-2 = <&pinctrl_usdhc1_200mhz>; 446 pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
446 bus-width = <8>; 447 bus-width = <8>;
447 non-removable; 448 non-removable;
448 status = "okay"; 449 status = "okay";
449 }; 450 };
450 451
451 &usdhc2 { 452 &usdhc2 {
452 pinctrl-names = "default", "state_100mhz", "state_200mhz"; 453 pinctrl-names = "default", "state_100mhz", "state_200mhz";
453 pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>; 454 pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
454 pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>; 455 pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
455 pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>; 456 pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
456 bus-width = <4>; 457 bus-width = <4>;
457 cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>; 458 cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
458 vmmc-supply = <&reg_usdhc2_vmmc>; 459 vmmc-supply = <&reg_usdhc2_vmmc>;
459 status = "okay"; 460 status = "okay";
460 }; 461 };
461 462
462 &usb3_phy0 { 463 &usb3_phy0 {
463 status = "okay"; 464 status = "okay";
464 }; 465 };
465 466
466 &usb3_0 { 467 &usb3_0 {
467 status = "okay"; 468 status = "okay";
468 }; 469 };
469 470
470 &usb_dwc3_0 { 471 &usb_dwc3_0 {
471 status = "okay"; 472 status = "okay";
472 dr_mode = "peripheral"; 473 dr_mode = "peripheral";
473 }; 474 };
474 475
475 &usb3_phy1 { 476 &usb3_phy1 {
476 status = "okay"; 477 status = "okay";
477 }; 478 };
478 479
479 &usb3_1 { 480 &usb3_1 {
480 status = "okay"; 481 status = "okay";
481 }; 482 };
482 483
483 &usb_dwc3_1 { 484 &usb_dwc3_1 {
484 status = "okay"; 485 status = "okay";
485 dr_mode = "host"; 486 dr_mode = "host";
486 }; 487 };
487 488
488 &wdog1 { 489 &wdog1 {
489 pinctrl-names = "default"; 490 pinctrl-names = "default";
490 pinctrl-0 = <&pinctrl_wdog>; 491 pinctrl-0 = <&pinctrl_wdog>;
491 fsl,ext-reset-output; 492 fsl,ext-reset-output;
492 status = "okay"; 493 status = "okay";
493 }; 494 };
494 495
arch/arm/mach-imx/imx8m/clock_imx8mq.c
1 // SPDX-License-Identifier: GPL-2.0+ 1 // SPDX-License-Identifier: GPL-2.0+
2 /* 2 /*
3 * Copyright 2017 NXP 3 * Copyright 2017 NXP
4 * 4 *
5 * Peng Fan <peng.fan@nxp.com> 5 * Peng Fan <peng.fan@nxp.com>
6 */ 6 */
7 7
8 #include <common.h> 8 #include <common.h>
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/io.h> 11 #include <asm/io.h>
12 #include <asm/arch/sys_proto.h> 12 #include <asm/arch/sys_proto.h>
13 #include <errno.h> 13 #include <errno.h>
14 #include <linux/iopoll.h> 14 #include <linux/iopoll.h>
15 15
16 static struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR; 16 static struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
17 17
18 static u32 decode_frac_pll(enum clk_root_src frac_pll) 18 static u32 decode_frac_pll(enum clk_root_src frac_pll)
19 { 19 {
20 u32 pll_cfg0, pll_cfg1, pllout; 20 u32 pll_cfg0, pll_cfg1, pllout;
21 u32 pll_refclk_sel, pll_refclk; 21 u32 pll_refclk_sel, pll_refclk;
22 u32 divr_val, divq_val, divf_val, divff, divfi; 22 u32 divr_val, divq_val, divf_val, divff, divfi;
23 u32 pllout_div_shift, pllout_div_mask, pllout_div; 23 u32 pllout_div_shift, pllout_div_mask, pllout_div;
24 24
25 switch (frac_pll) { 25 switch (frac_pll) {
26 case ARM_PLL_CLK: 26 case ARM_PLL_CLK:
27 pll_cfg0 = readl(&ana_pll->arm_pll_cfg0); 27 pll_cfg0 = readl(&ana_pll->arm_pll_cfg0);
28 pll_cfg1 = readl(&ana_pll->arm_pll_cfg1); 28 pll_cfg1 = readl(&ana_pll->arm_pll_cfg1);
29 pllout_div_shift = HW_FRAC_ARM_PLL_DIV_SHIFT; 29 pllout_div_shift = HW_FRAC_ARM_PLL_DIV_SHIFT;
30 pllout_div_mask = HW_FRAC_ARM_PLL_DIV_MASK; 30 pllout_div_mask = HW_FRAC_ARM_PLL_DIV_MASK;
31 break; 31 break;
32 default: 32 default:
33 printf("Frac PLL %d not supporte\n", frac_pll); 33 printf("Frac PLL %d not supporte\n", frac_pll);
34 return 0; 34 return 0;
35 } 35 }
36 36
37 pllout_div = readl(&ana_pll->frac_pllout_div_cfg); 37 pllout_div = readl(&ana_pll->frac_pllout_div_cfg);
38 pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift; 38 pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
39 39
40 /* Power down */ 40 /* Power down */
41 if (pll_cfg0 & FRAC_PLL_PD_MASK) 41 if (pll_cfg0 & FRAC_PLL_PD_MASK)
42 return 0; 42 return 0;
43 43
44 /* output not enabled */ 44 /* output not enabled */
45 if ((pll_cfg0 & FRAC_PLL_CLKE_MASK) == 0) 45 if ((pll_cfg0 & FRAC_PLL_CLKE_MASK) == 0)
46 return 0; 46 return 0;
47 47
48 pll_refclk_sel = pll_cfg0 & FRAC_PLL_REFCLK_SEL_MASK; 48 pll_refclk_sel = pll_cfg0 & FRAC_PLL_REFCLK_SEL_MASK;
49 49
50 if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_25M) 50 if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_25M)
51 pll_refclk = 25000000u; 51 pll_refclk = 25000000u;
52 else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_27M) 52 else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_27M)
53 pll_refclk = 27000000u; 53 pll_refclk = 27000000u;
54 else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M) 54 else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M)
55 pll_refclk = 27000000u; 55 pll_refclk = 27000000u;
56 else 56 else
57 pll_refclk = 0; 57 pll_refclk = 0;
58 58
59 if (pll_cfg0 & FRAC_PLL_BYPASS_MASK) 59 if (pll_cfg0 & FRAC_PLL_BYPASS_MASK)
60 return pll_refclk; 60 return pll_refclk;
61 61
62 divr_val = (pll_cfg0 & FRAC_PLL_REFCLK_DIV_VAL_MASK) >> 62 divr_val = (pll_cfg0 & FRAC_PLL_REFCLK_DIV_VAL_MASK) >>
63 FRAC_PLL_REFCLK_DIV_VAL_SHIFT; 63 FRAC_PLL_REFCLK_DIV_VAL_SHIFT;
64 divq_val = pll_cfg0 & FRAC_PLL_OUTPUT_DIV_VAL_MASK; 64 divq_val = pll_cfg0 & FRAC_PLL_OUTPUT_DIV_VAL_MASK;
65 65
66 divff = (pll_cfg1 & FRAC_PLL_FRAC_DIV_CTL_MASK) >> 66 divff = (pll_cfg1 & FRAC_PLL_FRAC_DIV_CTL_MASK) >>
67 FRAC_PLL_FRAC_DIV_CTL_SHIFT; 67 FRAC_PLL_FRAC_DIV_CTL_SHIFT;
68 divfi = pll_cfg1 & FRAC_PLL_INT_DIV_CTL_MASK; 68 divfi = pll_cfg1 & FRAC_PLL_INT_DIV_CTL_MASK;
69 69
70 divf_val = 1 + divfi + divff / (1 << 24); 70 divf_val = 1 + divfi + divff / (1 << 24);
71 71
72 pllout = pll_refclk / (divr_val + 1) * 8 * divf_val / 72 pllout = pll_refclk / (divr_val + 1) * 8 * divf_val /
73 ((divq_val + 1) * 2); 73 ((divq_val + 1) * 2);
74 74
75 return pllout / (pllout_div + 1); 75 return pllout / (pllout_div + 1);
76 } 76 }
77 77
78 static u32 decode_sscg_pll(enum clk_root_src sscg_pll) 78 static u32 decode_sscg_pll(enum clk_root_src sscg_pll)
79 { 79 {
80 u32 pll_cfg0, pll_cfg1, pll_cfg2; 80 u32 pll_cfg0, pll_cfg1, pll_cfg2;
81 u32 pll_refclk_sel, pll_refclk; 81 u32 pll_refclk_sel, pll_refclk;
82 u32 divr1, divr2, divf1, divf2, divq, div; 82 u32 divr1, divr2, divf1, divf2, divq, div;
83 u32 sse; 83 u32 sse;
84 u32 pll_clke; 84 u32 pll_clke;
85 u32 pllout_div_shift, pllout_div_mask, pllout_div; 85 u32 pllout_div_shift, pllout_div_mask, pllout_div;
86 u32 pllout; 86 u32 pllout;
87 87
88 switch (sscg_pll) { 88 switch (sscg_pll) {
89 case SYSTEM_PLL1_800M_CLK: 89 case SYSTEM_PLL1_800M_CLK:
90 case SYSTEM_PLL1_400M_CLK: 90 case SYSTEM_PLL1_400M_CLK:
91 case SYSTEM_PLL1_266M_CLK: 91 case SYSTEM_PLL1_266M_CLK:
92 case SYSTEM_PLL1_200M_CLK: 92 case SYSTEM_PLL1_200M_CLK:
93 case SYSTEM_PLL1_160M_CLK: 93 case SYSTEM_PLL1_160M_CLK:
94 case SYSTEM_PLL1_133M_CLK: 94 case SYSTEM_PLL1_133M_CLK:
95 case SYSTEM_PLL1_100M_CLK: 95 case SYSTEM_PLL1_100M_CLK:
96 case SYSTEM_PLL1_80M_CLK: 96 case SYSTEM_PLL1_80M_CLK:
97 case SYSTEM_PLL1_40M_CLK: 97 case SYSTEM_PLL1_40M_CLK:
98 pll_cfg0 = readl(&ana_pll->sys_pll1_cfg0); 98 pll_cfg0 = readl(&ana_pll->sys_pll1_cfg0);
99 pll_cfg1 = readl(&ana_pll->sys_pll1_cfg1); 99 pll_cfg1 = readl(&ana_pll->sys_pll1_cfg1);
100 pll_cfg2 = readl(&ana_pll->sys_pll1_cfg2); 100 pll_cfg2 = readl(&ana_pll->sys_pll1_cfg2);
101 pllout_div_shift = HW_SSCG_SYSTEM_PLL1_DIV_SHIFT; 101 pllout_div_shift = HW_SSCG_SYSTEM_PLL1_DIV_SHIFT;
102 pllout_div_mask = HW_SSCG_SYSTEM_PLL1_DIV_MASK; 102 pllout_div_mask = HW_SSCG_SYSTEM_PLL1_DIV_MASK;
103 break; 103 break;
104 case SYSTEM_PLL2_1000M_CLK: 104 case SYSTEM_PLL2_1000M_CLK:
105 case SYSTEM_PLL2_500M_CLK: 105 case SYSTEM_PLL2_500M_CLK:
106 case SYSTEM_PLL2_333M_CLK: 106 case SYSTEM_PLL2_333M_CLK:
107 case SYSTEM_PLL2_250M_CLK: 107 case SYSTEM_PLL2_250M_CLK:
108 case SYSTEM_PLL2_200M_CLK: 108 case SYSTEM_PLL2_200M_CLK:
109 case SYSTEM_PLL2_166M_CLK: 109 case SYSTEM_PLL2_166M_CLK:
110 case SYSTEM_PLL2_125M_CLK: 110 case SYSTEM_PLL2_125M_CLK:
111 case SYSTEM_PLL2_100M_CLK: 111 case SYSTEM_PLL2_100M_CLK:
112 case SYSTEM_PLL2_50M_CLK: 112 case SYSTEM_PLL2_50M_CLK:
113 pll_cfg0 = readl(&ana_pll->sys_pll2_cfg0); 113 pll_cfg0 = readl(&ana_pll->sys_pll2_cfg0);
114 pll_cfg1 = readl(&ana_pll->sys_pll2_cfg1); 114 pll_cfg1 = readl(&ana_pll->sys_pll2_cfg1);
115 pll_cfg2 = readl(&ana_pll->sys_pll2_cfg2); 115 pll_cfg2 = readl(&ana_pll->sys_pll2_cfg2);
116 pllout_div_shift = HW_SSCG_SYSTEM_PLL2_DIV_SHIFT; 116 pllout_div_shift = HW_SSCG_SYSTEM_PLL2_DIV_SHIFT;
117 pllout_div_mask = HW_SSCG_SYSTEM_PLL2_DIV_MASK; 117 pllout_div_mask = HW_SSCG_SYSTEM_PLL2_DIV_MASK;
118 break; 118 break;
119 case SYSTEM_PLL3_CLK: 119 case SYSTEM_PLL3_CLK:
120 pll_cfg0 = readl(&ana_pll->sys_pll3_cfg0); 120 pll_cfg0 = readl(&ana_pll->sys_pll3_cfg0);
121 pll_cfg1 = readl(&ana_pll->sys_pll3_cfg1); 121 pll_cfg1 = readl(&ana_pll->sys_pll3_cfg1);
122 pll_cfg2 = readl(&ana_pll->sys_pll3_cfg2); 122 pll_cfg2 = readl(&ana_pll->sys_pll3_cfg2);
123 pllout_div_shift = HW_SSCG_SYSTEM_PLL3_DIV_SHIFT; 123 pllout_div_shift = HW_SSCG_SYSTEM_PLL3_DIV_SHIFT;
124 pllout_div_mask = HW_SSCG_SYSTEM_PLL3_DIV_MASK; 124 pllout_div_mask = HW_SSCG_SYSTEM_PLL3_DIV_MASK;
125 break; 125 break;
126 case DRAM_PLL1_CLK: 126 case DRAM_PLL1_CLK:
127 pll_cfg0 = readl(&ana_pll->dram_pll_cfg0); 127 pll_cfg0 = readl(&ana_pll->dram_pll_cfg0);
128 pll_cfg1 = readl(&ana_pll->dram_pll_cfg1); 128 pll_cfg1 = readl(&ana_pll->dram_pll_cfg1);
129 pll_cfg2 = readl(&ana_pll->dram_pll_cfg2); 129 pll_cfg2 = readl(&ana_pll->dram_pll_cfg2);
130 pllout_div_shift = HW_SSCG_DRAM_PLL_DIV_SHIFT; 130 pllout_div_shift = HW_SSCG_DRAM_PLL_DIV_SHIFT;
131 pllout_div_mask = HW_SSCG_DRAM_PLL_DIV_MASK; 131 pllout_div_mask = HW_SSCG_DRAM_PLL_DIV_MASK;
132 break; 132 break;
133 default: 133 default:
134 printf("sscg pll %d not supporte\n", sscg_pll); 134 printf("sscg pll %d not supporte\n", sscg_pll);
135 return 0; 135 return 0;
136 } 136 }
137 137
138 switch (sscg_pll) { 138 switch (sscg_pll) {
139 case DRAM_PLL1_CLK: 139 case DRAM_PLL1_CLK:
140 pll_clke = SSCG_PLL_DRAM_PLL_CLKE_MASK; 140 pll_clke = SSCG_PLL_DRAM_PLL_CLKE_MASK;
141 div = 1; 141 div = 1;
142 break; 142 break;
143 case SYSTEM_PLL3_CLK: 143 case SYSTEM_PLL3_CLK:
144 pll_clke = SSCG_PLL_PLL3_CLKE_MASK; 144 pll_clke = SSCG_PLL_PLL3_CLKE_MASK;
145 div = 1; 145 div = 1;
146 break; 146 break;
147 case SYSTEM_PLL2_1000M_CLK: 147 case SYSTEM_PLL2_1000M_CLK:
148 case SYSTEM_PLL1_800M_CLK: 148 case SYSTEM_PLL1_800M_CLK:
149 pll_clke = SSCG_PLL_CLKE_MASK; 149 pll_clke = SSCG_PLL_CLKE_MASK;
150 div = 1; 150 div = 1;
151 break; 151 break;
152 case SYSTEM_PLL2_500M_CLK: 152 case SYSTEM_PLL2_500M_CLK:
153 case SYSTEM_PLL1_400M_CLK: 153 case SYSTEM_PLL1_400M_CLK:
154 pll_clke = SSCG_PLL_DIV2_CLKE_MASK; 154 pll_clke = SSCG_PLL_DIV2_CLKE_MASK;
155 div = 2; 155 div = 2;
156 break; 156 break;
157 case SYSTEM_PLL2_333M_CLK: 157 case SYSTEM_PLL2_333M_CLK:
158 case SYSTEM_PLL1_266M_CLK: 158 case SYSTEM_PLL1_266M_CLK:
159 pll_clke = SSCG_PLL_DIV3_CLKE_MASK; 159 pll_clke = SSCG_PLL_DIV3_CLKE_MASK;
160 div = 3; 160 div = 3;
161 break; 161 break;
162 case SYSTEM_PLL2_250M_CLK: 162 case SYSTEM_PLL2_250M_CLK:
163 case SYSTEM_PLL1_200M_CLK: 163 case SYSTEM_PLL1_200M_CLK:
164 pll_clke = SSCG_PLL_DIV4_CLKE_MASK; 164 pll_clke = SSCG_PLL_DIV4_CLKE_MASK;
165 div = 4; 165 div = 4;
166 break; 166 break;
167 case SYSTEM_PLL2_200M_CLK: 167 case SYSTEM_PLL2_200M_CLK:
168 case SYSTEM_PLL1_160M_CLK: 168 case SYSTEM_PLL1_160M_CLK:
169 pll_clke = SSCG_PLL_DIV5_CLKE_MASK; 169 pll_clke = SSCG_PLL_DIV5_CLKE_MASK;
170 div = 5; 170 div = 5;
171 break; 171 break;
172 case SYSTEM_PLL2_166M_CLK: 172 case SYSTEM_PLL2_166M_CLK:
173 case SYSTEM_PLL1_133M_CLK: 173 case SYSTEM_PLL1_133M_CLK:
174 pll_clke = SSCG_PLL_DIV6_CLKE_MASK; 174 pll_clke = SSCG_PLL_DIV6_CLKE_MASK;
175 div = 6; 175 div = 6;
176 break; 176 break;
177 case SYSTEM_PLL2_125M_CLK: 177 case SYSTEM_PLL2_125M_CLK:
178 case SYSTEM_PLL1_100M_CLK: 178 case SYSTEM_PLL1_100M_CLK:
179 pll_clke = SSCG_PLL_DIV8_CLKE_MASK; 179 pll_clke = SSCG_PLL_DIV8_CLKE_MASK;
180 div = 8; 180 div = 8;
181 break; 181 break;
182 case SYSTEM_PLL2_100M_CLK: 182 case SYSTEM_PLL2_100M_CLK:
183 case SYSTEM_PLL1_80M_CLK: 183 case SYSTEM_PLL1_80M_CLK:
184 pll_clke = SSCG_PLL_DIV10_CLKE_MASK; 184 pll_clke = SSCG_PLL_DIV10_CLKE_MASK;
185 div = 10; 185 div = 10;
186 break; 186 break;
187 case SYSTEM_PLL2_50M_CLK: 187 case SYSTEM_PLL2_50M_CLK:
188 case SYSTEM_PLL1_40M_CLK: 188 case SYSTEM_PLL1_40M_CLK:
189 pll_clke = SSCG_PLL_DIV20_CLKE_MASK; 189 pll_clke = SSCG_PLL_DIV20_CLKE_MASK;
190 div = 20; 190 div = 20;
191 break; 191 break;
192 default: 192 default:
193 printf("sscg pll %d not supporte\n", sscg_pll); 193 printf("sscg pll %d not supporte\n", sscg_pll);
194 return 0; 194 return 0;
195 } 195 }
196 196
197 /* Power down */ 197 /* Power down */
198 if (pll_cfg0 & SSCG_PLL_PD_MASK) 198 if (pll_cfg0 & SSCG_PLL_PD_MASK)
199 return 0; 199 return 0;
200 200
201 /* output not enabled */ 201 /* output not enabled */
202 if ((pll_cfg0 & pll_clke) == 0) 202 if ((pll_cfg0 & pll_clke) == 0)
203 return 0; 203 return 0;
204 204
205 pllout_div = readl(&ana_pll->sscg_pllout_div_cfg); 205 pllout_div = readl(&ana_pll->sscg_pllout_div_cfg);
206 pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift; 206 pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
207 207
208 pll_refclk_sel = pll_cfg0 & SSCG_PLL_REFCLK_SEL_MASK; 208 pll_refclk_sel = pll_cfg0 & SSCG_PLL_REFCLK_SEL_MASK;
209 209
210 if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_25M) 210 if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_25M)
211 pll_refclk = 25000000u; 211 pll_refclk = 25000000u;
212 else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_27M) 212 else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_27M)
213 pll_refclk = 27000000u; 213 pll_refclk = 27000000u;
214 else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M) 214 else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M)
215 pll_refclk = 27000000u; 215 pll_refclk = 27000000u;
216 else 216 else
217 pll_refclk = 0; 217 pll_refclk = 0;
218 218
219 /* We assume bypass1/2 are the same value */ 219 /* We assume bypass1/2 are the same value */
220 if ((pll_cfg0 & SSCG_PLL_BYPASS1_MASK) || 220 if ((pll_cfg0 & SSCG_PLL_BYPASS1_MASK) ||
221 (pll_cfg0 & SSCG_PLL_BYPASS2_MASK)) 221 (pll_cfg0 & SSCG_PLL_BYPASS2_MASK))
222 return pll_refclk; 222 return pll_refclk;
223 223
224 divr1 = (pll_cfg2 & SSCG_PLL_REF_DIVR1_MASK) >> 224 divr1 = (pll_cfg2 & SSCG_PLL_REF_DIVR1_MASK) >>
225 SSCG_PLL_REF_DIVR1_SHIFT; 225 SSCG_PLL_REF_DIVR1_SHIFT;
226 divr2 = (pll_cfg2 & SSCG_PLL_REF_DIVR2_MASK) >> 226 divr2 = (pll_cfg2 & SSCG_PLL_REF_DIVR2_MASK) >>
227 SSCG_PLL_REF_DIVR2_SHIFT; 227 SSCG_PLL_REF_DIVR2_SHIFT;
228 divf1 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F1_MASK) >> 228 divf1 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F1_MASK) >>
229 SSCG_PLL_FEEDBACK_DIV_F1_SHIFT; 229 SSCG_PLL_FEEDBACK_DIV_F1_SHIFT;
230 divf2 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F2_MASK) >> 230 divf2 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F2_MASK) >>
231 SSCG_PLL_FEEDBACK_DIV_F2_SHIFT; 231 SSCG_PLL_FEEDBACK_DIV_F2_SHIFT;
232 divq = (pll_cfg2 & SSCG_PLL_OUTPUT_DIV_VAL_MASK) >> 232 divq = (pll_cfg2 & SSCG_PLL_OUTPUT_DIV_VAL_MASK) >>
233 SSCG_PLL_OUTPUT_DIV_VAL_SHIFT; 233 SSCG_PLL_OUTPUT_DIV_VAL_SHIFT;
234 sse = pll_cfg1 & SSCG_PLL_SSE_MASK; 234 sse = pll_cfg1 & SSCG_PLL_SSE_MASK;
235 235
236 if (sse) 236 if (sse)
237 sse = 8; 237 sse = 8;
238 else 238 else
239 sse = 2; 239 sse = 2;
240 240
241 pllout = pll_refclk / (divr1 + 1) * sse * (divf1 + 1) / 241 pllout = pll_refclk / (divr1 + 1) * sse * (divf1 + 1) /
242 (divr2 + 1) * (divf2 + 1) / (divq + 1); 242 (divr2 + 1) * (divf2 + 1) / (divq + 1);
243 243
244 return pllout / (pllout_div + 1) / div; 244 return pllout / (pllout_div + 1) / div;
245 } 245 }
246 246
247 static u32 get_root_src_clk(enum clk_root_src root_src) 247 static u32 get_root_src_clk(enum clk_root_src root_src)
248 { 248 {
249 switch (root_src) { 249 switch (root_src) {
250 case OSC_25M_CLK: 250 case OSC_25M_CLK:
251 return 25000000; 251 return 25000000;
252 case OSC_27M_CLK: 252 case OSC_27M_CLK:
253 return 27000000; 253 return 27000000;
254 case OSC_32K_CLK: 254 case OSC_32K_CLK:
255 return 32768; 255 return 32768;
256 case ARM_PLL_CLK: 256 case ARM_PLL_CLK:
257 return decode_frac_pll(root_src); 257 return decode_frac_pll(root_src);
258 case SYSTEM_PLL1_800M_CLK: 258 case SYSTEM_PLL1_800M_CLK:
259 case SYSTEM_PLL1_400M_CLK: 259 case SYSTEM_PLL1_400M_CLK:
260 case SYSTEM_PLL1_266M_CLK: 260 case SYSTEM_PLL1_266M_CLK:
261 case SYSTEM_PLL1_200M_CLK: 261 case SYSTEM_PLL1_200M_CLK:
262 case SYSTEM_PLL1_160M_CLK: 262 case SYSTEM_PLL1_160M_CLK:
263 case SYSTEM_PLL1_133M_CLK: 263 case SYSTEM_PLL1_133M_CLK:
264 case SYSTEM_PLL1_100M_CLK: 264 case SYSTEM_PLL1_100M_CLK:
265 case SYSTEM_PLL1_80M_CLK: 265 case SYSTEM_PLL1_80M_CLK:
266 case SYSTEM_PLL1_40M_CLK: 266 case SYSTEM_PLL1_40M_CLK:
267 case SYSTEM_PLL2_1000M_CLK: 267 case SYSTEM_PLL2_1000M_CLK:
268 case SYSTEM_PLL2_500M_CLK: 268 case SYSTEM_PLL2_500M_CLK:
269 case SYSTEM_PLL2_333M_CLK: 269 case SYSTEM_PLL2_333M_CLK:
270 case SYSTEM_PLL2_250M_CLK: 270 case SYSTEM_PLL2_250M_CLK:
271 case SYSTEM_PLL2_200M_CLK: 271 case SYSTEM_PLL2_200M_CLK:
272 case SYSTEM_PLL2_166M_CLK: 272 case SYSTEM_PLL2_166M_CLK:
273 case SYSTEM_PLL2_125M_CLK: 273 case SYSTEM_PLL2_125M_CLK:
274 case SYSTEM_PLL2_100M_CLK: 274 case SYSTEM_PLL2_100M_CLK:
275 case SYSTEM_PLL2_50M_CLK: 275 case SYSTEM_PLL2_50M_CLK:
276 case SYSTEM_PLL3_CLK: 276 case SYSTEM_PLL3_CLK:
277 return decode_sscg_pll(root_src); 277 return decode_sscg_pll(root_src);
278 default: 278 default:
279 return 0; 279 return 0;
280 } 280 }
281 281
282 return 0; 282 return 0;
283 } 283 }
284 284
285 static u32 get_root_clk(enum clk_root_index clock_id) 285 static u32 get_root_clk(enum clk_root_index clock_id)
286 { 286 {
287 enum clk_root_src root_src; 287 enum clk_root_src root_src;
288 u32 post_podf, pre_podf, root_src_clk; 288 u32 post_podf, pre_podf, root_src_clk;
289 289
290 if (clock_root_enabled(clock_id) <= 0) 290 if (clock_root_enabled(clock_id) <= 0)
291 return 0; 291 return 0;
292 292
293 if (clock_get_prediv(clock_id, &pre_podf) < 0) 293 if (clock_get_prediv(clock_id, &pre_podf) < 0)
294 return 0; 294 return 0;
295 295
296 if (clock_get_postdiv(clock_id, &post_podf) < 0) 296 if (clock_get_postdiv(clock_id, &post_podf) < 0)
297 return 0; 297 return 0;
298 298
299 if (clock_get_src(clock_id, &root_src) < 0) 299 if (clock_get_src(clock_id, &root_src) < 0)
300 return 0; 300 return 0;
301 301
302 root_src_clk = get_root_src_clk(root_src); 302 root_src_clk = get_root_src_clk(root_src);
303 303
304 return root_src_clk / (post_podf + 1) / (pre_podf + 1); 304 return root_src_clk / (post_podf + 1) / (pre_podf + 1);
305 } 305 }
306 306
307 #ifdef CONFIG_SECURE_BOOT 307 #ifdef CONFIG_SECURE_BOOT
308 void hab_caam_clock_enable(unsigned char enable) 308 void hab_caam_clock_enable(unsigned char enable)
309 { 309 {
310 /* The CAAM clock is always on for iMX8M */ 310 /* The CAAM clock is always on for iMX8M */
311 } 311 }
312 #endif 312 #endif
313 313
314 #ifdef CONFIG_MXC_OCOTP 314 #ifdef CONFIG_MXC_OCOTP
315 void enable_ocotp_clk(unsigned char enable) 315 void enable_ocotp_clk(unsigned char enable)
316 { 316 {
317 clock_enable(CCGR_OCOTP, !!enable); 317 clock_enable(CCGR_OCOTP, !!enable);
318 } 318 }
319 #endif 319 #endif
320 320
321 int enable_i2c_clk(unsigned char enable, unsigned int i2c_num) 321 int enable_i2c_clk(unsigned char enable, unsigned int i2c_num)
322 { 322 {
323 /* 0 - 3 is valid i2c num */ 323 /* 0 - 3 is valid i2c num */
324 if (i2c_num > 3) 324 if (i2c_num > 3)
325 return -EINVAL; 325 return -EINVAL;
326 326
327 clock_enable(CCGR_I2C1 + i2c_num, !!enable); 327 clock_enable(CCGR_I2C1 + i2c_num, !!enable);
328 328
329 return 0; 329 return 0;
330 } 330 }
331 331
332 unsigned int mxc_get_clock(enum mxc_clock clk) 332 unsigned int mxc_get_clock(enum mxc_clock clk)
333 { 333 {
334 u32 val; 334 u32 val;
335 335
336 switch (clk) { 336 switch (clk) {
337 case MXC_ARM_CLK: 337 case MXC_ARM_CLK:
338 return get_root_clk(ARM_A53_CLK_ROOT); 338 return get_root_clk(ARM_A53_CLK_ROOT);
339 case MXC_IPG_CLK: 339 case MXC_IPG_CLK:
340 clock_get_target_val(IPG_CLK_ROOT, &val); 340 clock_get_target_val(IPG_CLK_ROOT, &val);
341 val = val & 0x3; 341 val = val & 0x3;
342 return get_root_clk(AHB_CLK_ROOT) / (val + 1); 342 return get_root_clk(AHB_CLK_ROOT) / (val + 1);
343 case MXC_CSPI_CLK: 343 case MXC_CSPI_CLK:
344 return get_root_clk(ECSPI1_CLK_ROOT); 344 return get_root_clk(ECSPI1_CLK_ROOT);
345 case MXC_ESDHC_CLK: 345 case MXC_ESDHC_CLK:
346 return get_root_clk(USDHC1_CLK_ROOT); 346 return get_root_clk(USDHC1_CLK_ROOT);
347 case MXC_ESDHC2_CLK: 347 case MXC_ESDHC2_CLK:
348 return get_root_clk(USDHC2_CLK_ROOT); 348 return get_root_clk(USDHC2_CLK_ROOT);
349 case MXC_I2C_CLK: 349 case MXC_I2C_CLK:
350 return get_root_clk(I2C1_CLK_ROOT); 350 return get_root_clk(I2C1_CLK_ROOT);
351 case MXC_UART_CLK: 351 case MXC_UART_CLK:
352 return get_root_clk(UART1_CLK_ROOT); 352 return get_root_clk(UART1_CLK_ROOT);
353 case MXC_QSPI_CLK: 353 case MXC_QSPI_CLK:
354 return get_root_clk(QSPI_CLK_ROOT); 354 return get_root_clk(QSPI_CLK_ROOT);
355 default: 355 default:
356 printf("Unsupported mxc_clock %d\n", clk); 356 printf("Unsupported mxc_clock %d\n", clk);
357 break; 357 break;
358 } 358 }
359 359
360 return 0; 360 return 0;
361 } 361 }
362 362
363 u32 imx_get_uartclk(void) 363 u32 imx_get_uartclk(void)
364 { 364 {
365 return mxc_get_clock(MXC_UART_CLK); 365 return mxc_get_clock(MXC_UART_CLK);
366 } 366 }
367 367
368 void mxs_set_lcdclk(u32 base_addr, u32 freq) 368 void mxs_set_lcdclk(u32 base_addr, u32 freq)
369 { 369 {
370 /* 370 /*
371 * LCDIF_PIXEL_CLK: select 800MHz root clock, 371 * LCDIF_PIXEL_CLK: select 800MHz root clock,
372 * select pre divider 8, output is 100 MHz 372 * select pre divider 8, output is 100 MHz
373 */ 373 */
374 clock_set_target_val(LCDIF_PIXEL_CLK_ROOT, CLK_ROOT_ON | 374 clock_set_target_val(LCDIF_PIXEL_CLK_ROOT, CLK_ROOT_ON |
375 CLK_ROOT_SOURCE_SEL(4) | 375 CLK_ROOT_SOURCE_SEL(4) |
376 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV8)); 376 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV8));
377 } 377 }
378 378
379 void init_wdog_clk(void) 379 void init_wdog_clk(void)
380 { 380 {
381 clock_enable(CCGR_WDOG1, 0); 381 clock_enable(CCGR_WDOG1, 0);
382 clock_enable(CCGR_WDOG2, 0); 382 clock_enable(CCGR_WDOG2, 0);
383 clock_enable(CCGR_WDOG3, 0); 383 clock_enable(CCGR_WDOG3, 0);
384 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON | 384 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
385 CLK_ROOT_SOURCE_SEL(0)); 385 CLK_ROOT_SOURCE_SEL(0));
386 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON | 386 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
387 CLK_ROOT_SOURCE_SEL(0)); 387 CLK_ROOT_SOURCE_SEL(0));
388 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON | 388 clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
389 CLK_ROOT_SOURCE_SEL(0)); 389 CLK_ROOT_SOURCE_SEL(0));
390 clock_enable(CCGR_WDOG1, 1); 390 clock_enable(CCGR_WDOG1, 1);
391 clock_enable(CCGR_WDOG2, 1); 391 clock_enable(CCGR_WDOG2, 1);
392 clock_enable(CCGR_WDOG3, 1); 392 clock_enable(CCGR_WDOG3, 1);
393 } 393 }
394 394
395 void init_usb_clk(void) 395 void init_usb_clk(void)
396 { 396 {
397 if (!is_usb_boot()) { 397 if (!is_usb_boot()) {
398 clock_enable(CCGR_USB_CTRL1, 0); 398 clock_enable(CCGR_USB_CTRL1, 0);
399 clock_enable(CCGR_USB_CTRL2, 0); 399 clock_enable(CCGR_USB_CTRL2, 0);
400 clock_enable(CCGR_USB_PHY1, 0); 400 clock_enable(CCGR_USB_PHY1, 0);
401 clock_enable(CCGR_USB_PHY2, 0); 401 clock_enable(CCGR_USB_PHY2, 0);
402 /* 500MHz */ 402 /* 500MHz */
403 clock_set_target_val(USB_BUS_CLK_ROOT, CLK_ROOT_ON | 403 clock_set_target_val(USB_BUS_CLK_ROOT, CLK_ROOT_ON |
404 CLK_ROOT_SOURCE_SEL(1)); 404 CLK_ROOT_SOURCE_SEL(1));
405 /* 100MHz */ 405 /* 100MHz */
406 clock_set_target_val(USB_CORE_REF_CLK_ROOT, CLK_ROOT_ON | 406 clock_set_target_val(USB_CORE_REF_CLK_ROOT, CLK_ROOT_ON |
407 CLK_ROOT_SOURCE_SEL(1)); 407 CLK_ROOT_SOURCE_SEL(1));
408 /* 100MHz */ 408 /* 100MHz */
409 clock_set_target_val(USB_PHY_REF_CLK_ROOT, CLK_ROOT_ON | 409 clock_set_target_val(USB_PHY_REF_CLK_ROOT, CLK_ROOT_ON |
410 CLK_ROOT_SOURCE_SEL(1)); 410 CLK_ROOT_SOURCE_SEL(1));
411 clock_enable(CCGR_USB_CTRL1, 1); 411 clock_enable(CCGR_USB_CTRL1, 1);
412 clock_enable(CCGR_USB_CTRL2, 1); 412 clock_enable(CCGR_USB_CTRL2, 1);
413 clock_enable(CCGR_USB_PHY1, 1); 413 clock_enable(CCGR_USB_PHY1, 1);
414 clock_enable(CCGR_USB_PHY2, 1); 414 clock_enable(CCGR_USB_PHY2, 1);
415 } 415 }
416 } 416 }
417 417
418 void init_nand_clk(void) 418 void init_nand_clk(void)
419 { 419 {
420 /* 420 /*
421 * set rawnand root 421 * set rawnand root
422 * sys pll1 400M 422 * sys pll1 400M
423 */ 423 */
424 clock_enable(CCGR_RAWNAND, 0); 424 clock_enable(CCGR_RAWNAND, 0);
425 clock_set_target_val(NAND_CLK_ROOT, CLK_ROOT_ON | 425 clock_set_target_val(NAND_CLK_ROOT, CLK_ROOT_ON |
426 CLK_ROOT_SOURCE_SEL(3) | CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4)); /* 100M */ 426 CLK_ROOT_SOURCE_SEL(3) | CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4)); /* 100M */
427 clock_enable(CCGR_RAWNAND, 1); 427 clock_enable(CCGR_RAWNAND, 1);
428 } 428 }
429 429
430 void init_uart_clk(u32 index) 430 void init_uart_clk(u32 index)
431 { 431 {
432 /* Set uart clock root 25M OSC */ 432 /* Set uart clock root 25M OSC */
433 switch (index) { 433 switch (index) {
434 case 0: 434 case 0:
435 clock_enable(CCGR_UART1, 0); 435 clock_enable(CCGR_UART1, 0);
436 clock_set_target_val(UART1_CLK_ROOT, CLK_ROOT_ON | 436 clock_set_target_val(UART1_CLK_ROOT, CLK_ROOT_ON |
437 CLK_ROOT_SOURCE_SEL(0)); 437 CLK_ROOT_SOURCE_SEL(0));
438 clock_enable(CCGR_UART1, 1); 438 clock_enable(CCGR_UART1, 1);
439 return; 439 return;
440 case 1: 440 case 1:
441 clock_enable(CCGR_UART2, 0); 441 clock_enable(CCGR_UART2, 0);
442 clock_set_target_val(UART2_CLK_ROOT, CLK_ROOT_ON | 442 clock_set_target_val(UART2_CLK_ROOT, CLK_ROOT_ON |
443 CLK_ROOT_SOURCE_SEL(0)); 443 CLK_ROOT_SOURCE_SEL(0));
444 clock_enable(CCGR_UART2, 1); 444 clock_enable(CCGR_UART2, 1);
445 return; 445 return;
446 case 2: 446 case 2:
447 clock_enable(CCGR_UART3, 0); 447 clock_enable(CCGR_UART3, 0);
448 clock_set_target_val(UART3_CLK_ROOT, CLK_ROOT_ON | 448 clock_set_target_val(UART3_CLK_ROOT, CLK_ROOT_ON |
449 CLK_ROOT_SOURCE_SEL(0)); 449 CLK_ROOT_SOURCE_SEL(0));
450 clock_enable(CCGR_UART3, 1); 450 clock_enable(CCGR_UART3, 1);
451 return; 451 return;
452 case 3: 452 case 3:
453 clock_enable(CCGR_UART4, 0); 453 clock_enable(CCGR_UART4, 0);
454 clock_set_target_val(UART4_CLK_ROOT, CLK_ROOT_ON | 454 clock_set_target_val(UART4_CLK_ROOT, CLK_ROOT_ON |
455 CLK_ROOT_SOURCE_SEL(0)); 455 CLK_ROOT_SOURCE_SEL(0));
456 clock_enable(CCGR_UART4, 1); 456 clock_enable(CCGR_UART4, 1);
457 return; 457 return;
458 default: 458 default:
459 printf("Invalid uart index\n"); 459 printf("Invalid uart index\n");
460 return; 460 return;
461 } 461 }
462 } 462 }
463 463
464 void init_clk_usdhc(u32 index) 464 void init_clk_usdhc(u32 index)
465 { 465 {
466 /* 466 /*
467 * set usdhc clock root 467 * set usdhc clock root
468 * sys pll1 400M 468 * sys pll1 400M
469 */ 469 */
470 switch (index) { 470 switch (index) {
471 case 0: 471 case 0:
472 clock_enable(CCGR_USDHC1, 0); 472 clock_enable(CCGR_USDHC1, 0);
473 clock_set_target_val(USDHC1_CLK_ROOT, CLK_ROOT_ON | 473 clock_set_target_val(USDHC1_CLK_ROOT, CLK_ROOT_ON |
474 CLK_ROOT_SOURCE_SEL(1) | 474 CLK_ROOT_SOURCE_SEL(1));
475 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
476 clock_enable(CCGR_USDHC1, 1); 475 clock_enable(CCGR_USDHC1, 1);
477 return; 476 return;
478 case 1: 477 case 1:
479 clock_enable(CCGR_USDHC2, 0); 478 clock_enable(CCGR_USDHC2, 0);
480 clock_set_target_val(USDHC2_CLK_ROOT, CLK_ROOT_ON | 479 clock_set_target_val(USDHC2_CLK_ROOT, CLK_ROOT_ON |
481 CLK_ROOT_SOURCE_SEL(1) | 480 CLK_ROOT_SOURCE_SEL(1));
482 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
483 clock_enable(CCGR_USDHC2, 1); 481 clock_enable(CCGR_USDHC2, 1);
484 return; 482 return;
485 default: 483 default:
486 printf("Invalid usdhc index\n"); 484 printf("Invalid usdhc index\n");
487 return; 485 return;
488 } 486 }
489 } 487 }
490 488
491 int set_clk_qspi(void) 489 int set_clk_qspi(void)
492 { 490 {
493 /* 491 /*
494 * set qspi root 492 * set qspi root
495 * sys pll1 100M 493 * sys pll1 100M
496 */ 494 */
497 clock_enable(CCGR_QSPI, 0); 495 clock_enable(CCGR_QSPI, 0);
498 clock_set_target_val(QSPI_CLK_ROOT, CLK_ROOT_ON | 496 clock_set_target_val(QSPI_CLK_ROOT, CLK_ROOT_ON |
499 CLK_ROOT_SOURCE_SEL(7)); 497 CLK_ROOT_SOURCE_SEL(7));
500 clock_enable(CCGR_QSPI, 1); 498 clock_enable(CCGR_QSPI, 1);
501 499
502 return 0; 500 return 0;
503 } 501 }
504 502
505 #ifdef CONFIG_FEC_MXC 503 #ifdef CONFIG_FEC_MXC
506 int set_clk_enet(enum enet_freq type) 504 int set_clk_enet(enum enet_freq type)
507 { 505 {
508 u32 target; 506 u32 target;
509 u32 enet1_ref; 507 u32 enet1_ref;
510 508
511 switch (type) { 509 switch (type) {
512 case ENET_125MHZ: 510 case ENET_125MHZ:
513 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK; 511 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
514 break; 512 break;
515 case ENET_50MHZ: 513 case ENET_50MHZ:
516 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK; 514 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
517 break; 515 break;
518 case ENET_25MHZ: 516 case ENET_25MHZ:
519 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK; 517 enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
520 break; 518 break;
521 default: 519 default:
522 return -EINVAL; 520 return -EINVAL;
523 } 521 }
524 522
525 /* disable the clock first */ 523 /* disable the clock first */
526 clock_enable(CCGR_ENET1, 0); 524 clock_enable(CCGR_ENET1, 0);
527 clock_enable(CCGR_SIM_ENET, 0); 525 clock_enable(CCGR_SIM_ENET, 0);
528 526
529 /* set enet axi clock 266Mhz */ 527 /* set enet axi clock 266Mhz */
530 target = CLK_ROOT_ON | ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M | 528 target = CLK_ROOT_ON | ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M |
531 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) | 529 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
532 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1); 530 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
533 clock_set_target_val(ENET_AXI_CLK_ROOT, target); 531 clock_set_target_val(ENET_AXI_CLK_ROOT, target);
534 532
535 target = CLK_ROOT_ON | enet1_ref | 533 target = CLK_ROOT_ON | enet1_ref |
536 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) | 534 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
537 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1); 535 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
538 clock_set_target_val(ENET_REF_CLK_ROOT, target); 536 clock_set_target_val(ENET_REF_CLK_ROOT, target);
539 537
540 target = CLK_ROOT_ON | 538 target = CLK_ROOT_ON |
541 ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK | 539 ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK |
542 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) | 540 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
543 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4); 541 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
544 clock_set_target_val(ENET_TIMER_CLK_ROOT, target); 542 clock_set_target_val(ENET_TIMER_CLK_ROOT, target);
545 543
546 /* enable clock */ 544 /* enable clock */
547 clock_enable(CCGR_SIM_ENET, 1); 545 clock_enable(CCGR_SIM_ENET, 1);
548 clock_enable(CCGR_ENET1, 1); 546 clock_enable(CCGR_ENET1, 1);
549 547
550 return 0; 548 return 0;
551 } 549 }
552 #endif 550 #endif
553 551
554 u32 imx_get_fecclk(void) 552 u32 imx_get_fecclk(void)
555 { 553 {
556 return get_root_clk(ENET_AXI_CLK_ROOT); 554 return get_root_clk(ENET_AXI_CLK_ROOT);
557 } 555 }
558 556
559 static struct dram_bypass_clk_setting imx8mq_dram_bypass_tbl[] = { 557 static struct dram_bypass_clk_setting imx8mq_dram_bypass_tbl[] = {
560 DRAM_BYPASS_ROOT_CONFIG(MHZ(100), 2, CLK_ROOT_PRE_DIV1, 2, 558 DRAM_BYPASS_ROOT_CONFIG(MHZ(100), 2, CLK_ROOT_PRE_DIV1, 2,
561 CLK_ROOT_PRE_DIV2), 559 CLK_ROOT_PRE_DIV2),
562 DRAM_BYPASS_ROOT_CONFIG(MHZ(250), 3, CLK_ROOT_PRE_DIV2, 2, 560 DRAM_BYPASS_ROOT_CONFIG(MHZ(250), 3, CLK_ROOT_PRE_DIV2, 2,
563 CLK_ROOT_PRE_DIV2), 561 CLK_ROOT_PRE_DIV2),
564 DRAM_BYPASS_ROOT_CONFIG(MHZ(400), 1, CLK_ROOT_PRE_DIV2, 3, 562 DRAM_BYPASS_ROOT_CONFIG(MHZ(400), 1, CLK_ROOT_PRE_DIV2, 3,
565 CLK_ROOT_PRE_DIV2), 563 CLK_ROOT_PRE_DIV2),
566 }; 564 };
567 565
568 void dram_enable_bypass(ulong clk_val) 566 void dram_enable_bypass(ulong clk_val)
569 { 567 {
570 int i; 568 int i;
571 struct dram_bypass_clk_setting *config; 569 struct dram_bypass_clk_setting *config;
572 570
573 for (i = 0; i < ARRAY_SIZE(imx8mq_dram_bypass_tbl); i++) { 571 for (i = 0; i < ARRAY_SIZE(imx8mq_dram_bypass_tbl); i++) {
574 if (clk_val == imx8mq_dram_bypass_tbl[i].clk) 572 if (clk_val == imx8mq_dram_bypass_tbl[i].clk)
575 break; 573 break;
576 } 574 }
577 575
578 if (i == ARRAY_SIZE(imx8mq_dram_bypass_tbl)) { 576 if (i == ARRAY_SIZE(imx8mq_dram_bypass_tbl)) {
579 printf("No matched freq table %lu\n", clk_val); 577 printf("No matched freq table %lu\n", clk_val);
580 return; 578 return;
581 } 579 }
582 580
583 config = &imx8mq_dram_bypass_tbl[i]; 581 config = &imx8mq_dram_bypass_tbl[i];
584 582
585 clock_set_target_val(DRAM_ALT_CLK_ROOT, CLK_ROOT_ON | 583 clock_set_target_val(DRAM_ALT_CLK_ROOT, CLK_ROOT_ON |
586 CLK_ROOT_SOURCE_SEL(config->alt_root_sel) | 584 CLK_ROOT_SOURCE_SEL(config->alt_root_sel) |
587 CLK_ROOT_PRE_DIV(config->alt_pre_div)); 585 CLK_ROOT_PRE_DIV(config->alt_pre_div));
588 clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON | 586 clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
589 CLK_ROOT_SOURCE_SEL(config->apb_root_sel) | 587 CLK_ROOT_SOURCE_SEL(config->apb_root_sel) |
590 CLK_ROOT_PRE_DIV(config->apb_pre_div)); 588 CLK_ROOT_PRE_DIV(config->apb_pre_div));
591 clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON | 589 clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON |
592 CLK_ROOT_SOURCE_SEL(1)); 590 CLK_ROOT_SOURCE_SEL(1));
593 } 591 }
594 592
595 void dram_disable_bypass(void) 593 void dram_disable_bypass(void)
596 { 594 {
597 clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON | 595 clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON |
598 CLK_ROOT_SOURCE_SEL(0)); 596 CLK_ROOT_SOURCE_SEL(0));
599 clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON | 597 clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
600 CLK_ROOT_SOURCE_SEL(4) | 598 CLK_ROOT_SOURCE_SEL(4) |
601 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV5)); 599 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV5));
602 } 600 }
603 601
604 #ifdef CONFIG_SPL_BUILD 602 #ifdef CONFIG_SPL_BUILD
605 void dram_pll_init(ulong pll_val) 603 void dram_pll_init(ulong pll_val)
606 { 604 {
607 u32 val; 605 u32 val;
608 void __iomem *pll_control_reg = &ana_pll->dram_pll_cfg0; 606 void __iomem *pll_control_reg = &ana_pll->dram_pll_cfg0;
609 void __iomem *pll_cfg_reg2 = &ana_pll->dram_pll_cfg2; 607 void __iomem *pll_cfg_reg2 = &ana_pll->dram_pll_cfg2;
610 608
611 /* Bypass */ 609 /* Bypass */
612 setbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK); 610 setbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK);
613 setbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK); 611 setbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK);
614 612
615 switch (pll_val) { 613 switch (pll_val) {
616 case MHZ(800): 614 case MHZ(800):
617 val = readl(pll_cfg_reg2); 615 val = readl(pll_cfg_reg2);
618 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | 616 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
619 SSCG_PLL_FEEDBACK_DIV_F2_MASK | 617 SSCG_PLL_FEEDBACK_DIV_F2_MASK |
620 SSCG_PLL_FEEDBACK_DIV_F1_MASK | 618 SSCG_PLL_FEEDBACK_DIV_F1_MASK |
621 SSCG_PLL_REF_DIVR2_MASK); 619 SSCG_PLL_REF_DIVR2_MASK);
622 val |= SSCG_PLL_OUTPUT_DIV_VAL(0); 620 val |= SSCG_PLL_OUTPUT_DIV_VAL(0);
623 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11); 621 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
624 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39); 622 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
625 val |= SSCG_PLL_REF_DIVR2_VAL(29); 623 val |= SSCG_PLL_REF_DIVR2_VAL(29);
626 writel(val, pll_cfg_reg2); 624 writel(val, pll_cfg_reg2);
627 break; 625 break;
628 case MHZ(600): 626 case MHZ(600):
629 val = readl(pll_cfg_reg2); 627 val = readl(pll_cfg_reg2);
630 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | 628 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
631 SSCG_PLL_FEEDBACK_DIV_F2_MASK | 629 SSCG_PLL_FEEDBACK_DIV_F2_MASK |
632 SSCG_PLL_FEEDBACK_DIV_F1_MASK | 630 SSCG_PLL_FEEDBACK_DIV_F1_MASK |
633 SSCG_PLL_REF_DIVR2_MASK); 631 SSCG_PLL_REF_DIVR2_MASK);
634 val |= SSCG_PLL_OUTPUT_DIV_VAL(1); 632 val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
635 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(17); 633 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(17);
636 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39); 634 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
637 val |= SSCG_PLL_REF_DIVR2_VAL(29); 635 val |= SSCG_PLL_REF_DIVR2_VAL(29);
638 writel(val, pll_cfg_reg2); 636 writel(val, pll_cfg_reg2);
639 break; 637 break;
640 case MHZ(400): 638 case MHZ(400):
641 val = readl(pll_cfg_reg2); 639 val = readl(pll_cfg_reg2);
642 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | 640 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
643 SSCG_PLL_FEEDBACK_DIV_F2_MASK | 641 SSCG_PLL_FEEDBACK_DIV_F2_MASK |
644 SSCG_PLL_FEEDBACK_DIV_F1_MASK | 642 SSCG_PLL_FEEDBACK_DIV_F1_MASK |
645 SSCG_PLL_REF_DIVR2_MASK); 643 SSCG_PLL_REF_DIVR2_MASK);
646 val |= SSCG_PLL_OUTPUT_DIV_VAL(1); 644 val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
647 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11); 645 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
648 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39); 646 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
649 val |= SSCG_PLL_REF_DIVR2_VAL(29); 647 val |= SSCG_PLL_REF_DIVR2_VAL(29);
650 writel(val, pll_cfg_reg2); 648 writel(val, pll_cfg_reg2);
651 break; 649 break;
652 case MHZ(167): 650 case MHZ(167):
653 val = readl(pll_cfg_reg2); 651 val = readl(pll_cfg_reg2);
654 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | 652 val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
655 SSCG_PLL_FEEDBACK_DIV_F2_MASK | 653 SSCG_PLL_FEEDBACK_DIV_F2_MASK |
656 SSCG_PLL_FEEDBACK_DIV_F1_MASK | 654 SSCG_PLL_FEEDBACK_DIV_F1_MASK |
657 SSCG_PLL_REF_DIVR2_MASK); 655 SSCG_PLL_REF_DIVR2_MASK);
658 val |= SSCG_PLL_OUTPUT_DIV_VAL(3); 656 val |= SSCG_PLL_OUTPUT_DIV_VAL(3);
659 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(8); 657 val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(8);
660 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(45); 658 val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(45);
661 val |= SSCG_PLL_REF_DIVR2_VAL(30); 659 val |= SSCG_PLL_REF_DIVR2_VAL(30);
662 writel(val, pll_cfg_reg2); 660 writel(val, pll_cfg_reg2);
663 break; 661 break;
664 default: 662 default:
665 break; 663 break;
666 } 664 }
667 665
668 /* Clear power down bit */ 666 /* Clear power down bit */
669 clrbits_le32(pll_control_reg, SSCG_PLL_PD_MASK); 667 clrbits_le32(pll_control_reg, SSCG_PLL_PD_MASK);
670 /* Eanble ARM_PLL/SYS_PLL */ 668 /* Eanble ARM_PLL/SYS_PLL */
671 setbits_le32(pll_control_reg, SSCG_PLL_DRAM_PLL_CLKE_MASK); 669 setbits_le32(pll_control_reg, SSCG_PLL_DRAM_PLL_CLKE_MASK);
672 670
673 /* Clear bypass */ 671 /* Clear bypass */
674 clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK); 672 clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK);
675 __udelay(100); 673 __udelay(100);
676 clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK); 674 clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK);
677 /* Wait lock */ 675 /* Wait lock */
678 while (!(readl(pll_control_reg) & SSCG_PLL_LOCK_MASK)) 676 while (!(readl(pll_control_reg) & SSCG_PLL_LOCK_MASK))
679 ; 677 ;
680 } 678 }
681 679
682 int frac_pll_init(u32 pll, enum frac_pll_out_val val) 680 int frac_pll_init(u32 pll, enum frac_pll_out_val val)
683 { 681 {
684 void __iomem *pll_cfg0, __iomem *pll_cfg1; 682 void __iomem *pll_cfg0, __iomem *pll_cfg1;
685 u32 val_cfg0, val_cfg1; 683 u32 val_cfg0, val_cfg1;
686 int ret; 684 int ret;
687 685
688 switch (pll) { 686 switch (pll) {
689 case ANATOP_ARM_PLL: 687 case ANATOP_ARM_PLL:
690 pll_cfg0 = &ana_pll->arm_pll_cfg0; 688 pll_cfg0 = &ana_pll->arm_pll_cfg0;
691 pll_cfg1 = &ana_pll->arm_pll_cfg1; 689 pll_cfg1 = &ana_pll->arm_pll_cfg1;
692 690
693 if (val == FRAC_PLL_OUT_1000M) 691 if (val == FRAC_PLL_OUT_1000M)
694 val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(49); 692 val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(49);
695 else 693 else
696 val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(79); 694 val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(79);
697 val_cfg0 = FRAC_PLL_CLKE_MASK | FRAC_PLL_REFCLK_SEL_OSC_25M | 695 val_cfg0 = FRAC_PLL_CLKE_MASK | FRAC_PLL_REFCLK_SEL_OSC_25M |
698 FRAC_PLL_LOCK_SEL_MASK | FRAC_PLL_NEWDIV_VAL_MASK | 696 FRAC_PLL_LOCK_SEL_MASK | FRAC_PLL_NEWDIV_VAL_MASK |
699 FRAC_PLL_REFCLK_DIV_VAL(4) | 697 FRAC_PLL_REFCLK_DIV_VAL(4) |
700 FRAC_PLL_OUTPUT_DIV_VAL(0); 698 FRAC_PLL_OUTPUT_DIV_VAL(0);
701 break; 699 break;
702 default: 700 default:
703 return -EINVAL; 701 return -EINVAL;
704 } 702 }
705 703
706 /* bypass the clock */ 704 /* bypass the clock */
707 setbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK); 705 setbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
708 /* Set the value */ 706 /* Set the value */
709 writel(val_cfg1, pll_cfg1); 707 writel(val_cfg1, pll_cfg1);
710 writel(val_cfg0 | FRAC_PLL_BYPASS_MASK, pll_cfg0); 708 writel(val_cfg0 | FRAC_PLL_BYPASS_MASK, pll_cfg0);
711 val_cfg0 = readl(pll_cfg0); 709 val_cfg0 = readl(pll_cfg0);
712 /* unbypass the clock */ 710 /* unbypass the clock */
713 clrbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK); 711 clrbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
714 ret = readl_poll_timeout(pll_cfg0, val_cfg0, 712 ret = readl_poll_timeout(pll_cfg0, val_cfg0,
715 val_cfg0 & FRAC_PLL_LOCK_MASK, 1); 713 val_cfg0 & FRAC_PLL_LOCK_MASK, 1);
716 if (ret) 714 if (ret)
717 printf("%s timeout\n", __func__); 715 printf("%s timeout\n", __func__);
718 clrbits_le32(pll_cfg0, FRAC_PLL_NEWDIV_VAL_MASK); 716 clrbits_le32(pll_cfg0, FRAC_PLL_NEWDIV_VAL_MASK);
719 717
720 return 0; 718 return 0;
721 } 719 }
722 720
723 int sscg_pll_init(u32 pll) 721 int sscg_pll_init(u32 pll)
724 { 722 {
725 void __iomem *pll_cfg0, __iomem *pll_cfg1, __iomem *pll_cfg2; 723 void __iomem *pll_cfg0, __iomem *pll_cfg1, __iomem *pll_cfg2;
726 u32 val_cfg0, val_cfg1, val_cfg2, val; 724 u32 val_cfg0, val_cfg1, val_cfg2, val;
727 u32 bypass1_mask = 0x20, bypass2_mask = 0x10; 725 u32 bypass1_mask = 0x20, bypass2_mask = 0x10;
728 int ret; 726 int ret;
729 727
730 switch (pll) { 728 switch (pll) {
731 case ANATOP_SYSTEM_PLL1: 729 case ANATOP_SYSTEM_PLL1:
732 pll_cfg0 = &ana_pll->sys_pll1_cfg0; 730 pll_cfg0 = &ana_pll->sys_pll1_cfg0;
733 pll_cfg1 = &ana_pll->sys_pll1_cfg1; 731 pll_cfg1 = &ana_pll->sys_pll1_cfg1;
734 pll_cfg2 = &ana_pll->sys_pll1_cfg2; 732 pll_cfg2 = &ana_pll->sys_pll1_cfg2;
735 /* 800MHz */ 733 /* 800MHz */
736 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) | 734 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
737 SSCG_PLL_FEEDBACK_DIV_F2_VAL(3); 735 SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
738 val_cfg1 = 0; 736 val_cfg1 = 0;
739 val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK | 737 val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
740 SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK | 738 SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
741 SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK | 739 SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
742 SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK | 740 SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
743 SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK | 741 SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
744 SSCG_PLL_REFCLK_SEL_OSC_25M; 742 SSCG_PLL_REFCLK_SEL_OSC_25M;
745 break; 743 break;
746 case ANATOP_SYSTEM_PLL2: 744 case ANATOP_SYSTEM_PLL2:
747 pll_cfg0 = &ana_pll->sys_pll2_cfg0; 745 pll_cfg0 = &ana_pll->sys_pll2_cfg0;
748 pll_cfg1 = &ana_pll->sys_pll2_cfg1; 746 pll_cfg1 = &ana_pll->sys_pll2_cfg1;
749 pll_cfg2 = &ana_pll->sys_pll2_cfg2; 747 pll_cfg2 = &ana_pll->sys_pll2_cfg2;
750 /* 1000MHz */ 748 /* 1000MHz */
751 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) | 749 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
752 SSCG_PLL_FEEDBACK_DIV_F2_VAL(4); 750 SSCG_PLL_FEEDBACK_DIV_F2_VAL(4);
753 val_cfg1 = 0; 751 val_cfg1 = 0;
754 val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK | 752 val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
755 SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK | 753 SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
756 SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK | 754 SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
757 SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK | 755 SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
758 SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK | 756 SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
759 SSCG_PLL_REFCLK_SEL_OSC_25M; 757 SSCG_PLL_REFCLK_SEL_OSC_25M;
760 break; 758 break;
761 case ANATOP_SYSTEM_PLL3: 759 case ANATOP_SYSTEM_PLL3:
762 pll_cfg0 = &ana_pll->sys_pll3_cfg0; 760 pll_cfg0 = &ana_pll->sys_pll3_cfg0;
763 pll_cfg1 = &ana_pll->sys_pll3_cfg1; 761 pll_cfg1 = &ana_pll->sys_pll3_cfg1;
764 pll_cfg2 = &ana_pll->sys_pll3_cfg2; 762 pll_cfg2 = &ana_pll->sys_pll3_cfg2;
765 /* 800MHz */ 763 /* 800MHz */
766 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) | 764 val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
767 SSCG_PLL_FEEDBACK_DIV_F2_VAL(3); 765 SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
768 val_cfg1 = 0; 766 val_cfg1 = 0;
769 val_cfg0 = SSCG_PLL_PLL3_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK | 767 val_cfg0 = SSCG_PLL_PLL3_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
770 SSCG_PLL_REFCLK_SEL_OSC_25M; 768 SSCG_PLL_REFCLK_SEL_OSC_25M;
771 break; 769 break;
772 default: 770 default:
773 return -EINVAL; 771 return -EINVAL;
774 } 772 }
775 773
776 /*bypass*/ 774 /*bypass*/
777 setbits_le32(pll_cfg0, bypass1_mask | bypass2_mask); 775 setbits_le32(pll_cfg0, bypass1_mask | bypass2_mask);
778 /* set value */ 776 /* set value */
779 writel(val_cfg2, pll_cfg2); 777 writel(val_cfg2, pll_cfg2);
780 writel(val_cfg1, pll_cfg1); 778 writel(val_cfg1, pll_cfg1);
781 /*unbypass1 and wait 70us */ 779 /*unbypass1 and wait 70us */
782 writel(val_cfg0 | bypass2_mask, pll_cfg1); 780 writel(val_cfg0 | bypass2_mask, pll_cfg1);
783 781
784 __udelay(70); 782 __udelay(70);
785 783
786 /* unbypass2 and wait lock */ 784 /* unbypass2 and wait lock */
787 writel(val_cfg0, pll_cfg1); 785 writel(val_cfg0, pll_cfg1);
788 ret = readl_poll_timeout(pll_cfg0, val, val & SSCG_PLL_LOCK_MASK, 1); 786 ret = readl_poll_timeout(pll_cfg0, val, val & SSCG_PLL_LOCK_MASK, 1);
789 if (ret) 787 if (ret)
790 printf("%s timeout\n", __func__); 788 printf("%s timeout\n", __func__);
791 789
792 return ret; 790 return ret;
793 } 791 }
794 792
795 int clock_init(void) 793 int clock_init(void)
796 { 794 {
797 u32 grade; 795 u32 grade;
798 796
799 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON | 797 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
800 CLK_ROOT_SOURCE_SEL(0)); 798 CLK_ROOT_SOURCE_SEL(0));
801 799
802 /* 800 /*
803 * 8MQ only supports two grades: consumer and industrial. 801 * 8MQ only supports two grades: consumer and industrial.
804 * We set ARM clock to 1Ghz for consumer, 800Mhz for industrial 802 * We set ARM clock to 1Ghz for consumer, 800Mhz for industrial
805 */ 803 */
806 grade = get_cpu_temp_grade(NULL, NULL); 804 grade = get_cpu_temp_grade(NULL, NULL);
807 if (!grade) { 805 if (!grade) {
808 frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1000M); 806 frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1000M);
809 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON | 807 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
810 CLK_ROOT_SOURCE_SEL(1) | 808 CLK_ROOT_SOURCE_SEL(1) |
811 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1)); 809 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1));
812 } else { 810 } else {
813 frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1600M); 811 frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1600M);
814 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON | 812 clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
815 CLK_ROOT_SOURCE_SEL(1) | 813 CLK_ROOT_SOURCE_SEL(1) |
816 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2)); 814 CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
817 } 815 }
818 /* 816 /*
819 * According to ANAMIX SPEC 817 * According to ANAMIX SPEC
820 * sys pll1 fixed at 800MHz 818 * sys pll1 fixed at 800MHz
821 * sys pll2 fixed at 1GHz 819 * sys pll2 fixed at 1GHz
822 * Here we only enable the outputs. 820 * Here we only enable the outputs.
823 */ 821 */
824 setbits_le32(&ana_pll->sys_pll1_cfg0, SSCG_PLL_CLKE_MASK | 822 setbits_le32(&ana_pll->sys_pll1_cfg0, SSCG_PLL_CLKE_MASK |
825 SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK | 823 SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
826 SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK | 824 SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
827 SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK | 825 SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
828 SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK); 826 SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
829 827
830 setbits_le32(&ana_pll->sys_pll2_cfg0, SSCG_PLL_CLKE_MASK | 828 setbits_le32(&ana_pll->sys_pll2_cfg0, SSCG_PLL_CLKE_MASK |
831 SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK | 829 SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
832 SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK | 830 SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
833 SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK | 831 SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
834 SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK); 832 SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
835 833
836 clock_set_target_val(NAND_USDHC_BUS_CLK_ROOT, CLK_ROOT_ON | 834 clock_set_target_val(NAND_USDHC_BUS_CLK_ROOT, CLK_ROOT_ON |
837 CLK_ROOT_SOURCE_SEL(1)); 835 CLK_ROOT_SOURCE_SEL(1));
838 836
839 init_wdog_clk(); 837 init_wdog_clk();
840 clock_enable(CCGR_TSENSOR, 1); 838 clock_enable(CCGR_TSENSOR, 1);
841 clock_enable(CCGR_OCOTP, 1); 839 clock_enable(CCGR_OCOTP, 1);
842 840
843 /* config GIC to sys_pll2_200m */ 841 /* config GIC to sys_pll2_200m */
844 clock_enable(CCGR_GIC, 0); 842 clock_enable(CCGR_GIC, 0);
845 clock_set_target_val(GIC_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(1)); 843 clock_set_target_val(GIC_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(1));
846 clock_enable(CCGR_GIC, 1); 844 clock_enable(CCGR_GIC, 1);
847 845
848 return 0; 846 return 0;
849 } 847 }
850 #endif 848 #endif
851 849
852 /* 850 /*
853 * Dump some clockes. 851 * Dump some clockes.
854 */ 852 */
855 #ifndef CONFIG_SPL_BUILD 853 #ifndef CONFIG_SPL_BUILD
856 int do_imx8m_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, 854 int do_imx8m_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
857 char * const argv[]) 855 char * const argv[])
858 { 856 {
859 u32 freq; 857 u32 freq;
860 858
861 freq = decode_frac_pll(ARM_PLL_CLK); 859 freq = decode_frac_pll(ARM_PLL_CLK);
862 printf("ARM_PLL %8d MHz\n", freq / 1000000); 860 printf("ARM_PLL %8d MHz\n", freq / 1000000);
863 freq = decode_sscg_pll(SYSTEM_PLL1_800M_CLK); 861 freq = decode_sscg_pll(SYSTEM_PLL1_800M_CLK);
864 printf("SYS_PLL1_800 %8d MHz\n", freq / 1000000); 862 printf("SYS_PLL1_800 %8d MHz\n", freq / 1000000);
865 freq = decode_sscg_pll(SYSTEM_PLL1_400M_CLK); 863 freq = decode_sscg_pll(SYSTEM_PLL1_400M_CLK);
866 printf("SYS_PLL1_400 %8d MHz\n", freq / 1000000); 864 printf("SYS_PLL1_400 %8d MHz\n", freq / 1000000);
867 freq = decode_sscg_pll(SYSTEM_PLL1_266M_CLK); 865 freq = decode_sscg_pll(SYSTEM_PLL1_266M_CLK);
868 printf("SYS_PLL1_266 %8d MHz\n", freq / 1000000); 866 printf("SYS_PLL1_266 %8d MHz\n", freq / 1000000);
869 freq = decode_sscg_pll(SYSTEM_PLL1_200M_CLK); 867 freq = decode_sscg_pll(SYSTEM_PLL1_200M_CLK);
870 printf("SYS_PLL1_200 %8d MHz\n", freq / 1000000); 868 printf("SYS_PLL1_200 %8d MHz\n", freq / 1000000);
871 freq = decode_sscg_pll(SYSTEM_PLL1_160M_CLK); 869 freq = decode_sscg_pll(SYSTEM_PLL1_160M_CLK);
872 printf("SYS_PLL1_160 %8d MHz\n", freq / 1000000); 870 printf("SYS_PLL1_160 %8d MHz\n", freq / 1000000);
873 freq = decode_sscg_pll(SYSTEM_PLL1_133M_CLK); 871 freq = decode_sscg_pll(SYSTEM_PLL1_133M_CLK);
874 printf("SYS_PLL1_133 %8d MHz\n", freq / 1000000); 872 printf("SYS_PLL1_133 %8d MHz\n", freq / 1000000);
875 freq = decode_sscg_pll(SYSTEM_PLL1_100M_CLK); 873 freq = decode_sscg_pll(SYSTEM_PLL1_100M_CLK);
876 printf("SYS_PLL1_100 %8d MHz\n", freq / 1000000); 874 printf("SYS_PLL1_100 %8d MHz\n", freq / 1000000);
877 freq = decode_sscg_pll(SYSTEM_PLL1_80M_CLK); 875 freq = decode_sscg_pll(SYSTEM_PLL1_80M_CLK);
878 printf("SYS_PLL1_80 %8d MHz\n", freq / 1000000); 876 printf("SYS_PLL1_80 %8d MHz\n", freq / 1000000);
879 freq = decode_sscg_pll(SYSTEM_PLL1_40M_CLK); 877 freq = decode_sscg_pll(SYSTEM_PLL1_40M_CLK);
880 printf("SYS_PLL1_40 %8d MHz\n", freq / 1000000); 878 printf("SYS_PLL1_40 %8d MHz\n", freq / 1000000);
881 freq = decode_sscg_pll(SYSTEM_PLL2_1000M_CLK); 879 freq = decode_sscg_pll(SYSTEM_PLL2_1000M_CLK);
882 printf("SYS_PLL2_1000 %8d MHz\n", freq / 1000000); 880 printf("SYS_PLL2_1000 %8d MHz\n", freq / 1000000);
883 freq = decode_sscg_pll(SYSTEM_PLL2_500M_CLK); 881 freq = decode_sscg_pll(SYSTEM_PLL2_500M_CLK);
884 printf("SYS_PLL2_500 %8d MHz\n", freq / 1000000); 882 printf("SYS_PLL2_500 %8d MHz\n", freq / 1000000);
885 freq = decode_sscg_pll(SYSTEM_PLL2_333M_CLK); 883 freq = decode_sscg_pll(SYSTEM_PLL2_333M_CLK);
886 printf("SYS_PLL2_333 %8d MHz\n", freq / 1000000); 884 printf("SYS_PLL2_333 %8d MHz\n", freq / 1000000);
887 freq = decode_sscg_pll(SYSTEM_PLL2_250M_CLK); 885 freq = decode_sscg_pll(SYSTEM_PLL2_250M_CLK);
888 printf("SYS_PLL2_250 %8d MHz\n", freq / 1000000); 886 printf("SYS_PLL2_250 %8d MHz\n", freq / 1000000);
889 freq = decode_sscg_pll(SYSTEM_PLL2_200M_CLK); 887 freq = decode_sscg_pll(SYSTEM_PLL2_200M_CLK);
890 printf("SYS_PLL2_200 %8d MHz\n", freq / 1000000); 888 printf("SYS_PLL2_200 %8d MHz\n", freq / 1000000);
891 freq = decode_sscg_pll(SYSTEM_PLL2_166M_CLK); 889 freq = decode_sscg_pll(SYSTEM_PLL2_166M_CLK);
892 printf("SYS_PLL2_166 %8d MHz\n", freq / 1000000); 890 printf("SYS_PLL2_166 %8d MHz\n", freq / 1000000);
893 freq = decode_sscg_pll(SYSTEM_PLL2_125M_CLK); 891 freq = decode_sscg_pll(SYSTEM_PLL2_125M_CLK);
894 printf("SYS_PLL2_125 %8d MHz\n", freq / 1000000); 892 printf("SYS_PLL2_125 %8d MHz\n", freq / 1000000);
895 freq = decode_sscg_pll(SYSTEM_PLL2_100M_CLK); 893 freq = decode_sscg_pll(SYSTEM_PLL2_100M_CLK);
896 printf("SYS_PLL2_100 %8d MHz\n", freq / 1000000); 894 printf("SYS_PLL2_100 %8d MHz\n", freq / 1000000);
897 freq = decode_sscg_pll(SYSTEM_PLL2_50M_CLK); 895 freq = decode_sscg_pll(SYSTEM_PLL2_50M_CLK);
898 printf("SYS_PLL2_50 %8d MHz\n", freq / 1000000); 896 printf("SYS_PLL2_50 %8d MHz\n", freq / 1000000);
899 freq = decode_sscg_pll(SYSTEM_PLL3_CLK); 897 freq = decode_sscg_pll(SYSTEM_PLL3_CLK);
900 printf("SYS_PLL3 %8d MHz\n", freq / 1000000); 898 printf("SYS_PLL3 %8d MHz\n", freq / 1000000);
901 freq = mxc_get_clock(MXC_UART_CLK); 899 freq = mxc_get_clock(MXC_UART_CLK);
902 printf("UART1 %8d MHz\n", freq / 1000000); 900 printf("UART1 %8d MHz\n", freq / 1000000);
903 freq = mxc_get_clock(MXC_ESDHC_CLK); 901 freq = mxc_get_clock(MXC_ESDHC_CLK);
904 printf("USDHC1 %8d MHz\n", freq / 1000000); 902 printf("USDHC1 %8d MHz\n", freq / 1000000);
905 freq = mxc_get_clock(MXC_QSPI_CLK); 903 freq = mxc_get_clock(MXC_QSPI_CLK);
906 printf("QSPI %8d MHz\n", freq / 1000000); 904 printf("QSPI %8d MHz\n", freq / 1000000);
907 return 0; 905 return 0;
908 } 906 }
909 907
910 U_BOOT_CMD( 908 U_BOOT_CMD(
911 clocks, CONFIG_SYS_MAXARGS, 1, do_imx8m_showclocks, 909 clocks, CONFIG_SYS_MAXARGS, 1, do_imx8m_showclocks,
912 "display clocks", 910 "display clocks",
913 "" 911 ""
914 ); 912 );
915 #endif 913 #endif
916 914
configs/imx8mq_evk_defconfig
1 CONFIG_ARM=y 1 CONFIG_ARM=y
2 CONFIG_ARCH_IMX8M=y 2 CONFIG_ARCH_IMX8M=y
3 CONFIG_SYS_TEXT_BASE=0x40200000 3 CONFIG_SYS_TEXT_BASE=0x40200000
4 CONFIG_SYS_MALLOC_F_LEN=0x2000 4 CONFIG_SYS_MALLOC_F_LEN=0x2000
5 CONFIG_TARGET_IMX8MQ_EVK=y 5 CONFIG_TARGET_IMX8MQ_EVK=y
6 CONFIG_SPL_SERIAL_SUPPORT=y 6 CONFIG_SPL_SERIAL_SUPPORT=y
7 CONFIG_ARCH_MISC_INIT=y 7 CONFIG_ARCH_MISC_INIT=y
8 CONFIG_SPL=y 8 CONFIG_SPL=y
9 CONFIG_FIT=y 9 CONFIG_FIT=y
10 CONFIG_FIT_EXTERNAL_OFFSET=0x3000 10 CONFIG_FIT_EXTERNAL_OFFSET=0x3000
11 CONFIG_SPL_LOAD_FIT=y 11 CONFIG_SPL_LOAD_FIT=y
12 CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh" 12 CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh"
13 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage.cfg" 13 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage.cfg"
14 CONFIG_SPL_BOARD_INIT=y 14 CONFIG_SPL_BOARD_INIT=y
15 CONFIG_HUSH_PARSER=y 15 CONFIG_HUSH_PARSER=y
16 CONFIG_CMD_GPIO=y 16 CONFIG_CMD_GPIO=y
17 CONFIG_CMD_I2C=y 17 CONFIG_CMD_I2C=y
18 CONFIG_CMD_CACHE=y 18 CONFIG_CMD_CACHE=y
19 CONFIG_CMD_REGULATOR=y 19 CONFIG_CMD_REGULATOR=y
20 CONFIG_CMD_EXT2=y 20 CONFIG_CMD_EXT2=y
21 CONFIG_CMD_EXT4=y 21 CONFIG_CMD_EXT4=y
22 CONFIG_CMD_EXT4_WRITE=y 22 CONFIG_CMD_EXT4_WRITE=y
23 CONFIG_CMD_FAT=y 23 CONFIG_CMD_FAT=y
24 CONFIG_CMD_MEMTEST=y 24 CONFIG_CMD_MEMTEST=y
25 CONFIG_OF_CONTROL=y 25 CONFIG_OF_CONTROL=y
26 CONFIG_DEFAULT_DEVICE_TREE="fsl-imx8mq-evk" 26 CONFIG_DEFAULT_DEVICE_TREE="fsl-imx8mq-evk"
27 CONFIG_ENV_IS_IN_MMC=y 27 CONFIG_ENV_IS_IN_MMC=y
28 CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000 28 CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
29 CONFIG_DM_GPIO=y 29 CONFIG_DM_GPIO=y
30 CONFIG_DM_I2C=y 30 CONFIG_DM_I2C=y
31 CONFIG_SYS_I2C_MXC=y 31 CONFIG_SYS_I2C_MXC=y
32 CONFIG_DM_MMC=y 32 CONFIG_DM_MMC=y
33 CONFIG_MMC_IO_VOLTAGE=y
34 CONFIG_MMC_UHS_SUPPORT=y
35 CONFIG_MMC_HS400_SUPPORT=y
33 CONFIG_DM_ETH=y 36 CONFIG_DM_ETH=y
34 CONFIG_PINCTRL=y 37 CONFIG_PINCTRL=y
35 CONFIG_PINCTRL_IMX8M=y 38 CONFIG_PINCTRL_IMX8M=y
36 CONFIG_DM_REGULATOR=y 39 CONFIG_DM_REGULATOR=y
37 CONFIG_DM_REGULATOR_FIXED=y 40 CONFIG_DM_REGULATOR_FIXED=y
38 CONFIG_DM_REGULATOR_GPIO=y 41 CONFIG_DM_REGULATOR_GPIO=y
39 CONFIG_DM_THERMAL=y 42 CONFIG_DM_THERMAL=y
40 CONFIG_NXP_TMU=y 43 CONFIG_NXP_TMU=y
41 CONFIG_USB_TCPC=y 44 CONFIG_USB_TCPC=y
42 CONFIG_USB=y 45 CONFIG_USB=y
43 CONFIG_DM_USB=y 46 CONFIG_DM_USB=y
44 47
45 CONFIG_SPI=y 48 CONFIG_SPI=y
46 CONFIG_DM_SPI=y 49 CONFIG_DM_SPI=y
47 CONFIG_DM_SPI_FLASH=y 50 CONFIG_DM_SPI_FLASH=y
48 CONFIG_FSL_QSPI=y 51 CONFIG_FSL_QSPI=y
49 CONFIG_CMD_SF=y 52 CONFIG_CMD_SF=y
50 CONFIG_SPI_FLASH=y 53 CONFIG_SPI_FLASH=y
51 CONFIG_SPI_FLASH_STMICRO=y 54 CONFIG_SPI_FLASH_STMICRO=y
52 CONFIG_SPI_FLASH_BAR=y 55 CONFIG_SPI_FLASH_BAR=y
53 CONFIG_SF_DEFAULT_BUS=0 56 CONFIG_SF_DEFAULT_BUS=0
54 CONFIG_SF_DEFAULT_CS=0 57 CONFIG_SF_DEFAULT_CS=0
55 CONFIG_SF_DEFAULT_SPEED=40000000 58 CONFIG_SF_DEFAULT_SPEED=40000000
56 CONFIG_SF_DEFAULT_MODE=0 59 CONFIG_SF_DEFAULT_MODE=0
57 60
58 CONFIG_VIDEO=y 61 CONFIG_VIDEO=y
59 CONFIG_VIDEO_IMX8_HDMI=y 62 CONFIG_VIDEO_IMX8_HDMI=y
60 CONFIG_USB_GADGET=y 63 CONFIG_USB_GADGET=y
61 CONFIG_FASTBOOT=y 64 CONFIG_FASTBOOT=y
62 CONFIG_USB_FUNCTION_FASTBOOT=y 65 CONFIG_USB_FUNCTION_FASTBOOT=y
63 CONFIG_CMD_FASTBOOT=y 66 CONFIG_CMD_FASTBOOT=y
64 CONFIG_ANDROID_BOOT_IMAGE=y 67 CONFIG_ANDROID_BOOT_IMAGE=y
65 CONFIG_FASTBOOT_UUU_SUPPORT=y 68 CONFIG_FASTBOOT_UUU_SUPPORT=y
66 CONFIG_FASTBOOT_BUF_ADDR=0x42800000 69 CONFIG_FASTBOOT_BUF_ADDR=0x42800000
67 CONFIG_FASTBOOT_BUF_SIZE=0x40000000 70 CONFIG_FASTBOOT_BUF_SIZE=0x40000000
68 CONFIG_FASTBOOT_FLASH=y 71 CONFIG_FASTBOOT_FLASH=y
69 CONFIG_EFI_PARTITION=y 72 CONFIG_EFI_PARTITION=y
70 CONFIG_SDP_LOADADDR=0x40400000 73 CONFIG_SDP_LOADADDR=0x40400000
71 CONFIG_USB_GADGET_VENDOR_NUM=0x0525 74 CONFIG_USB_GADGET_VENDOR_NUM=0x0525
72 CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5 75 CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
73 CONFIG_USB_GADGET_MANUFACTURER="FSL" 76 CONFIG_USB_GADGET_MANUFACTURER="FSL"
74 CONFIG_USB_GADGET_DOWNLOAD=y 77 CONFIG_USB_GADGET_DOWNLOAD=y
75 CONFIG_SPL_USB_GADGET=y 78 CONFIG_SPL_USB_GADGET=y
76 CONFIG_SPL_USB_SDP_SUPPORT=y 79 CONFIG_SPL_USB_SDP_SUPPORT=y
77 CONFIG_USB_XHCI_HCD=y 80 CONFIG_USB_XHCI_HCD=y
78 CONFIG_USB_XHCI_IMX8M=y 81 CONFIG_USB_XHCI_IMX8M=y
79 CONFIG_USB_XHCI_DWC3=y 82 CONFIG_USB_XHCI_DWC3=y
80 CONFIG_USB_DWC3=y 83 CONFIG_USB_DWC3=y
81 CONFIG_USB_DWC3_GADGET=y 84 CONFIG_USB_DWC3_GADGET=y
82 85