2 * Copyright (C) 2016 Stefan Roese <sr@denx.de>
4 * SPDX-License-Identifier: GPL-2.0+
11 #include <asm/arch/cpu.h>
12 #include <asm/arch/soc.h>
14 DECLARE_GLOBAL_DATA_PTR;
17 * Information specific to the DB-88F7040 eval board. We strive to use
18 * DT for such platform specfic configurations. At some point, this
19 * might be removed here and implemented via DT.
21 /* IO expander I2C device */
22 #define I2C_IO_EXP_ADDR 0x21
23 #define I2C_IO_CFG_REG_0 0x6
24 #define I2C_IO_DATA_OUT_REG_0 0x2
26 #define I2C_IO_REG_0_USB_H0_OFF 0
27 #define I2C_IO_REG_0_USB_H1_OFF 1
28 #define I2C_IO_REG_VBUS ((1 << I2C_IO_REG_0_USB_H0_OFF) | \
29 (1 << I2C_IO_REG_0_USB_H1_OFF))
31 #define I2C_IO_REG_0_USB_H0_CL 4
32 #define I2C_IO_REG_0_USB_H1_CL 5
33 #define I2C_IO_REG_CL ((1 << I2C_IO_REG_0_USB_H0_CL) | \
34 (1 << I2C_IO_REG_0_USB_H1_CL))
36 static int usb_enabled = 0;
38 /* Board specific xHCI dis-/enable code */
41 * Set USB VBUS signals (via I2C IO expander/GPIO) as output and set
42 * output value as disabled
44 * Set USB Current Limit signals (via I2C IO expander/GPIO) as output
45 * and set output value as enabled
47 int board_xhci_config(void)
53 if (of_machine_is_compatible("marvell,armada7040-db")) {
54 /* Configure IO exander PCA9555: 7bit address 0x21 */
55 ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
57 printf("Cannot find PCA9555: %d\n", ret);
62 * Read configuration (direction) and set VBUS pin as output
63 * (reset pin = output)
65 ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
67 printf("Failed to read IO expander value via I2C\n");
70 buf[0] &= ~I2C_IO_REG_VBUS;
71 buf[0] &= ~I2C_IO_REG_CL;
72 ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
74 printf("Failed to set IO expander via I2C\n");
78 /* Read output value and configure it */
79 ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
81 printf("Failed to read IO expander value via I2C\n");
84 buf[0] &= ~I2C_IO_REG_VBUS;
85 buf[0] |= I2C_IO_REG_CL;
86 ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
88 printf("Failed to set IO expander via I2C\n");
92 mdelay(500); /* required delay to let output value settle */
98 int board_xhci_enable(void)
104 if (of_machine_is_compatible("marvell,armada7040-db")) {
106 * This function enables all USB ports simultaniously,
107 * it only needs to get called once
112 /* Configure IO exander PCA9555: 7bit address 0x21 */
113 ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
115 printf("Cannot find PCA9555: %d\n", ret);
119 /* Read VBUS output value */
120 ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
122 printf("Failed to read IO expander value via I2C\n");
126 /* Enable VBUS power: Set output value of VBUS pin as enabled */
127 buf[0] |= I2C_IO_REG_VBUS;
128 ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
130 printf("Failed to set IO expander via I2C\n");
134 mdelay(500); /* required delay to let output value settle */
141 int board_early_init_f(void)
143 /* Nothing to do (yet), perhaps later some pin-muxing etc */
150 /* adress of boot parameters */
151 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
156 int board_late_init(void)
158 /* Pre-configure the USB ports (overcurrent, VBus) */