Commit a0affb367ad638e1e6f51ed3678d3daad5724a40
Committed by
Priyanka Jain
1 parent
6089d8ab31
Exists in
smarc_8mq_lf_v2020.04
and in
9 other branches
dm: arm64: ls1012a: add i2c DM support
This supports i2c DM and enables CONFIG_DM_I2C for SoC LS1012A Signed-off-by: Biwen Li <biwen.li@nxp.com> Signed-off-by: Priyanka Jain <priyanka.jain@nxp.com>
Showing 21 changed files with 230 additions and 28 deletions Side-by-side Diff
- arch/arm/cpu/armv8/fsl-layerscape/Kconfig
- arch/arm/include/asm/gpio.h
- board/freescale/ls1012aqds/ls1012aqds.c
- board/freescale/ls1012ardb/eth.c
- board/freescale/ls1012ardb/ls1012ardb.c
- configs/ls1012a2g5rdb_qspi_defconfig
- configs/ls1012a2g5rdb_tfa_defconfig
- configs/ls1012afrdm_qspi_defconfig
- configs/ls1012afrdm_tfa_defconfig
- configs/ls1012afrwy_qspi_SECURE_BOOT_defconfig
- configs/ls1012afrwy_qspi_defconfig
- configs/ls1012afrwy_tfa_SECURE_BOOT_defconfig
- configs/ls1012afrwy_tfa_defconfig
- configs/ls1012aqds_qspi_defconfig
- configs/ls1012aqds_tfa_SECURE_BOOT_defconfig
- configs/ls1012aqds_tfa_defconfig
- configs/ls1012ardb_qspi_SECURE_BOOT_defconfig
- configs/ls1012ardb_qspi_defconfig
- configs/ls1012ardb_tfa_SECURE_BOOT_defconfig
- configs/ls1012ardb_tfa_defconfig
- include/configs/ls1012a_common.h
arch/arm/cpu/armv8/fsl-layerscape/Kconfig
... | ... | @@ -16,8 +16,8 @@ |
16 | 16 | select ARCH_EARLY_INIT_R |
17 | 17 | select BOARD_EARLY_INIT_F |
18 | 18 | select SYS_I2C_MXC |
19 | - select SYS_I2C_MXC_I2C1 | |
20 | - select SYS_I2C_MXC_I2C2 | |
19 | + select SYS_I2C_MXC_I2C1 if !DM_I2C | |
20 | + select SYS_I2C_MXC_I2C2 if !DM_I2C | |
21 | 21 | imply PANIC_HANG |
22 | 22 | |
23 | 23 | config ARCH_LS1028A |
arch/arm/include/asm/gpio.h
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | !defined(CONFIG_ARCH_ROCKCHIP) && !defined(CONFIG_ARCH_LX2160A) && \ |
5 | 5 | !defined(CONFIG_ARCH_LS1028A) && !defined(CONFIG_ARCH_LS2080A) && \ |
6 | 6 | !defined(CONFIG_ARCH_LS1088A) && !defined(CONFIG_ARCH_ASPEED) && \ |
7 | + !defined(CONFIG_ARCH_LS1012A) && \ | |
7 | 8 | !defined(CONFIG_ARCH_U8500) |
8 | 9 | #include <asm/arch/gpio.h> |
9 | 10 | #endif |
board/freescale/ls1012aqds/ls1012aqds.c
... | ... | @@ -107,10 +107,26 @@ |
107 | 107 | int misc_init_r(void) |
108 | 108 | { |
109 | 109 | u8 mux_sdhc_cd = 0x80; |
110 | + int bus_num = 0; | |
110 | 111 | |
111 | - i2c_set_bus_num(0); | |
112 | +#ifdef CONFIG_DM_I2C | |
113 | + struct udevice *dev; | |
114 | + int ret; | |
112 | 115 | |
116 | + ret = i2c_get_chip_for_busnum(bus_num, CONFIG_SYS_I2C_FPGA_ADDR, | |
117 | + 1, &dev); | |
118 | + if (ret) { | |
119 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
120 | + bus_num); | |
121 | + return ret; | |
122 | + } | |
123 | + dm_i2c_write(dev, 0x5a, &mux_sdhc_cd, 1); | |
124 | +#else | |
125 | + i2c_set_bus_num(bus_num); | |
126 | + | |
113 | 127 | i2c_write(CONFIG_SYS_I2C_FPGA_ADDR, 0x5a, 1, &mux_sdhc_cd, 1); |
128 | +#endif | |
129 | + | |
114 | 130 | return 0; |
115 | 131 | } |
116 | 132 | #endif |
board/freescale/ls1012ardb/eth.c
... | ... | @@ -28,12 +28,47 @@ |
28 | 28 | { |
29 | 29 | #ifdef CONFIG_TARGET_LS1012ARDB |
30 | 30 | /* Through reset IO expander reset both RGMII and SGMII PHYs */ |
31 | +#ifdef CONFIG_DM_I2C | |
32 | + struct udevice *dev; | |
33 | + int ret; | |
34 | + | |
35 | + /* | |
36 | + * The I2C IO-expander PCAL9555A is mouted on I2C1 bus(bus number is 0). | |
37 | + */ | |
38 | + ret = i2c_get_chip_for_busnum(0, I2C_MUX_IO2_ADDR, | |
39 | + 1, &dev); | |
40 | + if (ret) { | |
41 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
42 | + 0); | |
43 | + return; | |
44 | + } | |
45 | + /* Config port 0 | |
46 | + * - config pin IOXP_RST_ETH1_B and IOXP_RST_ETH2_B | |
47 | + * are enabled as an output. | |
48 | + */ | |
49 | + dm_i2c_reg_write(dev, 6, __PHY_MASK); | |
50 | + | |
51 | + /* | |
52 | + * Set port 0 output a value to reset ETH2 interface | |
53 | + * - pin IOXP_RST_ETH2_B output 0b0 | |
54 | + */ | |
55 | + dm_i2c_reg_write(dev, 2, __PHY_ETH2_MASK); | |
56 | + mdelay(10); | |
57 | + dm_i2c_reg_write(dev, 2, __PHY_ETH1_MASK); | |
58 | + /* | |
59 | + * Set port 0 output a value to reset ETH1 interface | |
60 | + * - pin IOXP_RST_ETH1_B output 0b0 | |
61 | + */ | |
62 | + mdelay(10); | |
63 | + dm_i2c_reg_write(dev, 2, 0xFF); | |
64 | +#else | |
31 | 65 | i2c_reg_write(I2C_MUX_IO2_ADDR, 6, __PHY_MASK); |
32 | 66 | i2c_reg_write(I2C_MUX_IO2_ADDR, 2, __PHY_ETH2_MASK); |
33 | 67 | mdelay(10); |
34 | 68 | i2c_reg_write(I2C_MUX_IO2_ADDR, 2, __PHY_ETH1_MASK); |
35 | 69 | mdelay(10); |
36 | 70 | i2c_reg_write(I2C_MUX_IO2_ADDR, 2, 0xFF); |
71 | +#endif | |
37 | 72 | mdelay(50); |
38 | 73 | #endif |
39 | 74 | } |
board/freescale/ls1012ardb/ls1012ardb.c
... | ... | @@ -34,13 +34,27 @@ |
34 | 34 | { |
35 | 35 | #ifdef CONFIG_TARGET_LS1012ARDB |
36 | 36 | u8 in1; |
37 | + int ret, bus_num = 0; | |
37 | 38 | |
38 | 39 | puts("Board: LS1012ARDB "); |
39 | 40 | |
40 | 41 | /* Initialize i2c early for Serial flash bank information */ |
41 | - i2c_set_bus_num(0); | |
42 | +#if defined(CONFIG_DM_I2C) | |
43 | + struct udevice *dev; | |
42 | 44 | |
43 | - if (i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &in1, 1) < 0) { | |
45 | + ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR, | |
46 | + 1, &dev); | |
47 | + if (ret) { | |
48 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
49 | + bus_num); | |
50 | + return -ENXIO; | |
51 | + } | |
52 | + ret = dm_i2c_read(dev, I2C_MUX_IO_1, &in1, 1); | |
53 | +#else /* Non DM I2C support - will be removed */ | |
54 | + i2c_set_bus_num(bus_num); | |
55 | + ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &in1, 1); | |
56 | +#endif | |
57 | + if (ret < 0) { | |
44 | 58 | printf("Error reading i2c boot information!\n"); |
45 | 59 | return 0; /* Don't want to hang() on this error */ |
46 | 60 | } |
47 | 61 | |
48 | 62 | |
49 | 63 | |
... | ... | @@ -175,11 +189,25 @@ |
175 | 189 | bool sdhc2_en = false; |
176 | 190 | u8 mux_sdhc2; |
177 | 191 | u8 io = 0; |
192 | + int ret, bus_num = 0; | |
178 | 193 | |
179 | - i2c_set_bus_num(0); | |
194 | +#if defined(CONFIG_DM_I2C) | |
195 | + struct udevice *dev; | |
180 | 196 | |
197 | + ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR, | |
198 | + 1, &dev); | |
199 | + if (ret) { | |
200 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
201 | + bus_num); | |
202 | + return -ENXIO; | |
203 | + } | |
204 | + ret = dm_i2c_read(dev, I2C_MUX_IO_1, &io, 1); | |
205 | +#else | |
206 | + i2c_set_bus_num(bus_num); | |
181 | 207 | /* IO1[7:3] is the field of board revision info. */ |
182 | - if (i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &io, 1) < 0) { | |
208 | + ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &io, 1); | |
209 | +#endif | |
210 | + if (ret < 0) { | |
183 | 211 | printf("Error reading i2c boot information!\n"); |
184 | 212 | return 0; |
185 | 213 | } |
... | ... | @@ -202,7 +230,12 @@ |
202 | 230 | * 10 - eMMC Memory |
203 | 231 | * 11 - SPI |
204 | 232 | */ |
205 | - if (i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_0, 1, &io, 1) < 0) { | |
233 | +#if defined(CONFIG_DM_I2C) | |
234 | + ret = dm_i2c_read(dev, I2C_MUX_IO_0, &io, 1); | |
235 | +#else | |
236 | + ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_0, 1, &io, 1); | |
237 | +#endif | |
238 | + if (ret < 0) { | |
206 | 239 | printf("Error reading i2c boot information!\n"); |
207 | 240 | return 0; |
208 | 241 | } |
209 | 242 | |
210 | 243 | |
211 | 244 | |
212 | 245 | |
... | ... | @@ -233,16 +266,63 @@ |
233 | 266 | |
234 | 267 | static int switch_to_bank1(void) |
235 | 268 | { |
236 | - u8 data; | |
237 | - int ret; | |
269 | + u8 data = 0xf4, chip_addr = 0x24, offset_addr = 0x03; | |
270 | + int ret, bus_num = 0; | |
238 | 271 | |
239 | - i2c_set_bus_num(0); | |
272 | +#if defined(CONFIG_DM_I2C) | |
273 | + struct udevice *dev; | |
240 | 274 | |
241 | - data = 0xf4; | |
242 | - ret = i2c_write(0x24, 0x3, 1, &data, 1); | |
275 | + ret = i2c_get_chip_for_busnum(bus_num, chip_addr, | |
276 | + 1, &dev); | |
243 | 277 | if (ret) { |
278 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
279 | + bus_num); | |
280 | + return -ENXIO; | |
281 | + } | |
282 | + /* | |
283 | + * -------------------------------------------------------------------- | |
284 | + * |bus |I2C address| Device | Notes | | |
285 | + * -------------------------------------------------------------------- | |
286 | + * |I2C1|0x24, 0x25,| IO expander (CFG,| Provides 16bits of General | | |
287 | + * | |0x26 | RESET, and INT/ | Purpose parallel Input/Output| | |
288 | + * | | | KW41GPIO) - NXP | (GPIO) expansion for the | | |
289 | + * | | | PCAL9555AHF | I2C bus | | |
290 | + * ----- -------------------------------------------------------------- | |
291 | + * - mount three IO expander(PCAL9555AHF) on I2C1 | |
292 | + * | |
293 | + * PCAL9555A device address | |
294 | + * slave address | |
295 | + * -------------------------------------- | |
296 | + * | 0 | 1 | 0 | 0 | A2 | A1 | A0 | R/W | | |
297 | + * -------------------------------------- | |
298 | + * | fixed | hardware selectable| | |
299 | + * | |
300 | + * Output port 1(Pinter register bits = 0x03) | |
301 | + * | |
302 | + * P1_[7~0] = 0xf4 | |
303 | + * P1_0 <---> CFG_MUX_QSPI_S0 | |
304 | + * P1_1 <---> CFG_MUX_QSPI_S1 | |
305 | + * CFG_MUX_QSPI_S[1:0] = 0b00 | |
306 | + * | |
307 | + * QSPI chip-select demultiplexer select | |
308 | + * --------------------------------------------------------------------- | |
309 | + * CFG_MUX_QSPI_S1|CFG_MUX_QSPI_S0| Values | |
310 | + * --------------------------------------------------------------------- | |
311 | + * 0 | 0 |CS routed to SPI memory bank1(default) | |
312 | + * --------------------------------------------------------------------- | |
313 | + * 0 | 1 |CS routed to SPI memory bank2 | |
314 | + * --------------------------------------------------------------------- | |
315 | + * | |
316 | + */ | |
317 | + ret = dm_i2c_write(dev, offset_addr, &data, 1); | |
318 | +#else /* Non DM I2C support - will be removed */ | |
319 | + i2c_set_bus_num(bus_num); | |
320 | + ret = i2c_write(chip_addr, offset_addr, 1, &data, 1); | |
321 | +#endif | |
322 | + | |
323 | + if (ret) { | |
244 | 324 | printf("i2c write error to chip : %u, addr : %u, data : %u\n", |
245 | - 0x24, 0x3, data); | |
325 | + chip_addr, offset_addr, data); | |
246 | 326 | } |
247 | 327 | |
248 | 328 | return ret; |
249 | 329 | |
250 | 330 | |
251 | 331 | |
252 | 332 | |
253 | 333 | |
254 | 334 | |
... | ... | @@ -250,25 +330,45 @@ |
250 | 330 | |
251 | 331 | static int switch_to_bank2(void) |
252 | 332 | { |
253 | - u8 data; | |
254 | - int ret; | |
333 | + u8 data[2] = {0xfc, 0xf5}, offset_addr[2] = {0x7, 0x3}; | |
334 | + u8 chip_addr = 0x24; | |
335 | + int ret, i, bus_num = 0; | |
255 | 336 | |
256 | - i2c_set_bus_num(0); | |
337 | +#if defined(CONFIG_DM_I2C) | |
338 | + struct udevice *dev; | |
257 | 339 | |
258 | - data = 0xfc; | |
259 | - ret = i2c_write(0x24, 0x7, 1, &data, 1); | |
340 | + ret = i2c_get_chip_for_busnum(bus_num, chip_addr, | |
341 | + 1, &dev); | |
260 | 342 | if (ret) { |
261 | - printf("i2c write error to chip : %u, addr : %u, data : %u\n", | |
262 | - 0x24, 0x7, data); | |
263 | - goto err; | |
343 | + printf("%s: Cannot find udev for a bus %d\n", __func__, | |
344 | + bus_num); | |
345 | + return -ENXIO; | |
264 | 346 | } |
347 | +#else /* Non DM I2C support - will be removed */ | |
348 | + i2c_set_bus_num(bus_num); | |
349 | +#endif | |
265 | 350 | |
266 | - data = 0xf5; | |
267 | - ret = i2c_write(0x24, 0x3, 1, &data, 1); | |
268 | - if (ret) { | |
269 | - printf("i2c write error to chip : %u, addr : %u, data : %u\n", | |
270 | - 0x24, 0x3, data); | |
351 | + /* | |
352 | + * 1th step: config port 1 | |
353 | + * - the port 1 pin is enabled as an output | |
354 | + * 2th step: output port 1 | |
355 | + * - P1_[7:0] output 0xf5, | |
356 | + * then CFG_MUX_QSPI_S[1:0] equal to 0b01, | |
357 | + * CS routed to SPI memory bank2 | |
358 | + */ | |
359 | + for (i = 0; i < sizeof(data); i++) { | |
360 | +#if defined(CONFIG_DM_I2C) | |
361 | + ret = dm_i2c_write(dev, offset_addr[i], &data[i], 1); | |
362 | +#else /* Non DM I2C support - will be removed */ | |
363 | + ret = i2c_write(chip_addr, offset_addr[i], 1, &data[i], 1); | |
364 | +#endif | |
365 | + if (ret) { | |
366 | + printf("i2c write error to chip : %u, addr : %u, data : %u\n", | |
367 | + chip_addr, offset_addr[i], data[i]); | |
368 | + goto err; | |
369 | + } | |
271 | 370 | } |
371 | + | |
272 | 372 | err: |
273 | 373 | return ret; |
274 | 374 | } |
configs/ls1012a2g5rdb_qspi_defconfig
configs/ls1012a2g5rdb_tfa_defconfig
configs/ls1012afrdm_qspi_defconfig
configs/ls1012afrdm_tfa_defconfig
configs/ls1012afrwy_qspi_SECURE_BOOT_defconfig
configs/ls1012afrwy_qspi_defconfig
configs/ls1012afrwy_tfa_SECURE_BOOT_defconfig
configs/ls1012afrwy_tfa_defconfig
configs/ls1012aqds_qspi_defconfig
configs/ls1012aqds_tfa_SECURE_BOOT_defconfig
configs/ls1012aqds_tfa_defconfig
configs/ls1012ardb_qspi_SECURE_BOOT_defconfig
configs/ls1012ardb_qspi_defconfig
configs/ls1012ardb_tfa_SECURE_BOOT_defconfig
configs/ls1012ardb_tfa_defconfig
include/configs/ls1012a_common.h
... | ... | @@ -66,7 +66,12 @@ |
66 | 66 | CONFIG_SYS_SCSI_MAX_LUN) |
67 | 67 | |
68 | 68 | /* I2C */ |
69 | +#ifndef CONFIG_DM_I2C | |
69 | 70 | #define CONFIG_SYS_I2C |
71 | +#else | |
72 | +#define CONFIG_I2C_SET_DEFAULT_BUS_NUM | |
73 | +#define CONFIG_I2C_DEFAULT_BUS_NUMBER 0 | |
74 | +#endif | |
70 | 75 | |
71 | 76 | #define CONFIG_SYS_NS16550_SERIAL |
72 | 77 | #define CONFIG_SYS_NS16550_REG_SIZE 1 |