[U-Boot] [PATCH] arm: lpc32xx: Add i2c DM support

Sylvain Lemieux slemieux.tyco at gmail.com
Tue Mar 14 15:31:40 UTC 2017


From: Liam Beguin <lbeguin at tycoint.com>

Since the driver does not yet support devicetree bindings,
the i2c buses need to be defined and probed when the bus
is initialized.

Signed-off-by: Liam Beguin <lbeguin at tycoint.com>
Signed-off-by: Sylvain Lemieux <slemieux at tycoint.com>
---
Note:
* In the init functions, we can only display a warning
  and not return an error because the board would reset.

* This patch is require as part of the DM support of the LPC32xx I2C driver.
  All I2C drivers should be converted, to DM, by the end of June 2017.

* This patch depend on the following patchset & patch:
  https://lists.denx.de/pipermail/u-boot/2017-March/283672.html (I2C)
  https://lists.denx.de/pipermail/u-boot/2017-March/283680.html (USB)

 arch/arm/cpu/arm926ejs/lpc32xx/devices.c | 55 ++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/devices.c b/arch/arm/cpu/arm926ejs/lpc32xx/devices.c
index f744398ca7..740ed774ba 100644
--- a/arch/arm/cpu/arm926ejs/lpc32xx/devices.c
+++ b/arch/arm/cpu/arm926ejs/lpc32xx/devices.c
@@ -12,12 +12,38 @@
 #include <asm/arch/clk.h>
 #include <asm/arch/uart.h>
 #include <asm/arch/mux.h>
+#include <asm/arch/i2c.h>
 #include <asm/io.h>
 
 static struct clk_pm_regs    *clk  = (struct clk_pm_regs *)CLK_PM_BASE;
 static struct uart_ctrl_regs *ctrl = (struct uart_ctrl_regs *)UART_CTRL_BASE;
 static struct mux_regs *mux = (struct mux_regs *)MUX_BASE;
 
+#ifdef CONFIG_DM_I2C
+static const struct lpc32xx_i2c_dev lpc32xx_i2cs[] = {
+	{
+		.base     = (struct lpc32xx_i2c_base *)I2C1_BASE,
+		.speed    = CONFIG_SYS_I2C_LPC32XX_SPEED,
+		.index    = I2C_0,
+	},
+	{
+		.base     = (struct lpc32xx_i2c_base *)I2C2_BASE,
+		.speed    = CONFIG_SYS_I2C_LPC32XX_SPEED,
+		.index    = I2C_1,
+	},
+	{
+		.base     = (struct lpc32xx_i2c_base *)(USB_BASE + 0x300),
+		.speed    = 100000,
+		.index    = I2C_2,
+	},
+};
+U_BOOT_DEVICES(lpc32xx_i2cs) = {
+	{ "i2c_lpc32xx", &lpc32xx_i2cs[0] },
+	{ "i2c_lpc32xx", &lpc32xx_i2cs[1] },
+	{ "i2c_lpc32xx", &lpc32xx_i2cs[2] },
+};
+#endif /* CONFIG_DM_I2C */
+
 void lpc32xx_uart_init(unsigned int uart_id)
 {
 	if (uart_id < 1 || uart_id > 7)
@@ -110,19 +136,48 @@ void lpc32xx_slc_nand_init(void)
 
 void lpc32xx_usb_init(void)
 {
+#ifdef CONFIG_DM_I2C
+	struct udevice *dev;
+	int ret;
+#endif /* CONFIG_DM_I2C */
+
 	/* Do not route the UART 5 Tx/Rx pins to the USB D+ and USB D- pins. */
 	clrbits_le32(&ctrl->ctrl, UART_CTRL_UART5_USB_MODE);
+
+#ifdef CONFIG_DM_I2C
+	ret = uclass_get_device(UCLASS_I2C, I2C_2, &dev);
+	if (ret)
+		debug("I2C_2 init failed: %d\n", ret);
+#endif /* CONFIG_DM_I2C */
 }
 
 void lpc32xx_i2c_init(unsigned int devnum)
 {
 	/* Enable I2C interface */
 	uint32_t ctrl = readl(&clk->i2cclk_ctrl);
+#ifdef CONFIG_DM_I2C
+	struct udevice *dev;
+	int ret;
+#endif /* CONFIG_DM_I2C */
+
 	if (devnum == 1)
 		ctrl |= CLK_I2C1_ENABLE;
 	if (devnum == 2)
 		ctrl |= CLK_I2C2_ENABLE;
 	writel(ctrl, &clk->i2cclk_ctrl);
+
+#ifdef CONFIG_DM_I2C
+	if (devnum == 1) {
+		ret = uclass_get_device(UCLASS_I2C, I2C_0, &dev);
+		if (ret)
+			debug("I2C_1 init failed: %d\n", ret);
+	}
+	if (devnum == 2) {
+		ret = uclass_get_device(UCLASS_I2C, I2C_1, &dev);
+		if (ret)
+			debug("I2C_2 init failed: %d\n", ret);
+	}
+#endif /* CONFIG_DM_I2C */
 }
 
 U_BOOT_DEVICE(lpc32xx_gpios) = {
-- 
2.11.0



More information about the U-Boot mailing list