colibri_imx6: migrate i2c to using driver model
authorMarcel Ziswiler <marcel.ziswiler@toradex.com>
Fri, 8 Feb 2019 17:42:12 +0000 (18:42 +0100)
committerStefano Babic <sbabic@denx.de>
Sat, 13 Apr 2019 18:30:09 +0000 (20:30 +0200)
Migrate I2C to using driver model.

Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
board/toradex/colibri_imx6/colibri_imx6.c
board/toradex/colibri_imx6/pf0100.c
configs/colibri_imx6_defconfig
include/configs/colibri_imx6.h

index 0c2fa65cfe8fa4edaf93789f519c50b5428b2251..0131d9a6357bfba3927f7b4fc8eb255fd7440e30 100644 (file)
 #include <asm/gpio.h>
 #include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/iomux-v3.h>
-#include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/sata.h>
 #include <asm/mach-imx/video.h>
 #include <dm/platform_data/serial_mxc.h>
 #include <environment.h>
 #include <fsl_esdhc.h>
-#include <i2c.h>
 #include <imx_thermal.h>
 #include <micrel.h>
 #include <miiphy.h>
@@ -50,16 +48,6 @@ DECLARE_GLOBAL_DATA_PTR;
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED |                \
-       PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
-
-#define BUTTON_PAD_CTRL (PAD_CTL_PUS_100K_UP |                 \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
-
-#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
-
 #define WEAK_PULLUP    (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_SRE_SLOW)
@@ -72,8 +60,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_HYS | PAD_CTL_SRE_SLOW)
 
-#define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
-
 #define OUTPUT_RGB (PAD_CTL_SPEED_MED|PAD_CTL_DSE_60ohm|PAD_CTL_SRE_FAST)
 
 int dram_init(void)
@@ -91,36 +77,7 @@ iomux_v3_cfg_t const uart1_pads[] = {
        MX6_PAD_CSI0_DAT11__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
-#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
-/* Colibri I2C */
-struct i2c_pads_info i2c_pad_info1 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
-               .gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03 | PC,
-               .gp = IMX_GPIO_NR(1, 3)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA | PC,
-               .gpio_mode = MX6_PAD_GPIO_6__GPIO1_IO06 | PC,
-               .gp = IMX_GPIO_NR(1, 6)
-       }
-};
-
-/* Colibri local, PMIC, SGTL5000, STMPE811 */
-struct i2c_pads_info i2c_pad_info_loc = {
-       .scl = {
-               .i2c_mode = MX6_PAD_EIM_EB2__I2C2_SCL | PC,
-               .gpio_mode = MX6_PAD_EIM_EB2__GPIO2_IO30 | PC,
-               .gp = IMX_GPIO_NR(2, 30)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_EIM_D16__I2C2_SDA | PC,
-               .gpio_mode = MX6_PAD_EIM_D16__GPIO3_IO16 | PC,
-               .gp = IMX_GPIO_NR(3, 16)
-       }
-};
-
-/* Apalis MMC */
+/* Colibri MMC */
 iomux_v3_cfg_t const usdhc1_pads[] = {
        MX6_PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
        MX6_PAD_SD1_CMD__SD1_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -715,9 +672,6 @@ int board_init(void)
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
-       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info_loc);
-
 #if defined(CONFIG_VIDEO_IPUV3)
        setup_display();
 #endif
@@ -1150,7 +1104,7 @@ void board_init_f(ulong dummy)
        ccgr_init();
        gpr_init();
 
-       /* iomux and setup of i2c */
+       /* iomux */
        board_early_init_f();
 
        /* setup GP timer */
index fa63865670f40e84d4056c8c98fce68ca8cb68f0..5e411f1743bd6af5206fa60387ac223d2960d8f2 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  */
 
 /*
@@ -29,22 +29,25 @@ static __maybe_unused iomux_v3_cfg_t const pmic_prog_pads[] = {
 
 unsigned pmic_init(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned programmed = 0;
        uchar bus = 1;
        uchar devid, revid, val;
 
        puts("PMIC: ");
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
                return 0;
        }
        /* get device ident */
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_DEVICEID, 1, &devid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_DEVICEID, &devid, 1) < 0) {
                puts("i2c pmic devid read failed\n");
                return 0;
        }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_REVID, 1, &revid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_REVID, &revid, 1) < 0) {
                puts("i2c pmic revid read failed\n");
                return 0;
        }
@@ -52,14 +55,14 @@ unsigned pmic_init(void)
 
 #ifdef DEBUG
        {
-               unsigned i, j;
+               unsigned int i, j;
 
                for (i = 0; i < 16; i++)
                        printf("\t%x", i);
                for (j = 0; j < 0x80; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
@@ -67,8 +70,7 @@ unsigned pmic_init(void)
                printf("\nEXT Page 1");
 
                val = PFUZE100_PAGE_REGISTER_PAGE1;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                        puts("i2c write failed\n");
                        return 0;
                }
@@ -76,7 +78,7 @@ unsigned pmic_init(void)
                for (j = 0x80; j < 0x100; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
@@ -84,8 +86,7 @@ unsigned pmic_init(void)
                printf("\nEXT Page 2");
 
                val = PFUZE100_PAGE_REGISTER_PAGE2;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                        puts("i2c write failed\n");
                        return 0;
                }
@@ -93,35 +94,36 @@ unsigned pmic_init(void)
                for (j = 0x80; j < 0x100; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
                }
                printf("\n");
        }
-#endif
+#endif /* DEBUG */
+
        /* get device programmed state */
        val = PFUZE100_PAGE_REGISTER_PAGE1;
-       if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1, &val, 1)) {
+       if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                puts("i2c write failed\n");
                return 0;
        }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR1, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR1, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return 0;
        }
        if (val & PFUZE100_FUSE_POR_M)
                programmed++;
 
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR2, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR2, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return programmed;
        }
        if (val & PFUZE100_FUSE_POR_M)
                programmed++;
 
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR3, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR3, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return programmed;
        }
@@ -146,6 +148,8 @@ unsigned pmic_init(void)
 #ifndef CONFIG_SPL_BUILD
 static int pf0100_prog(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned char bus = 1;
        unsigned char val;
        unsigned int i;
@@ -159,9 +163,10 @@ static int pf0100_prog(void)
                                         ARRAY_SIZE(pmic_prog_pads));
        gpio_direction_output(PMIC_PROG_VOLTAGE, 0);
 
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
                return CMD_RET_FAILURE;
        }
 
@@ -169,8 +174,7 @@ static int pf0100_prog(void)
                switch (pmic_otp_prog[i].cmd) {
                case pmic_i2c:
                        val = (unsigned char) (pmic_otp_prog[i].value & 0xff);
-                       if (i2c_write(PFUZE100_I2C_ADDR, pmic_otp_prog[i].reg,
-                                     1, &val, 1)) {
+                       if (dm_i2c_write(dev, pmic_otp_prog[i].reg, &val, 1)) {
                                printf("i2c write failed, reg 0x%2x, value 0x%2x\n",
                                       pmic_otp_prog[i].reg, val);
                                return CMD_RET_FAILURE;
@@ -209,4 +213,4 @@ U_BOOT_CMD(
        "Program the OTP fuses on the PMIC PF0100",
        ""
 );
-#endif
+#endif /* CONFIG_SPL_BUILD */
index 481d65329fd86678edbe4feadac5a42ca22e9637..dea6ca62702a88ae0dd06db14bf83652ec7ec3d7 100644 (file)
@@ -51,6 +51,7 @@ CONFIG_ENV_IS_IN_MMC=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DFU_MMC=y
 CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
index f029a885d28e1e097f1b0b905b63f7a752ab1781..e51ec8516fe9c17efe8fe7c7152fb8524e67213d 100644 (file)
 #define CONFIG_MXC_UART_BASE           UART1_BASE
 
 /* I2C Configs */
-#define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_I2C_MXC_I2C1         /* enable I2C bus 1 */
-#define CONFIG_SYS_I2C_MXC_I2C2         /* enable I2C bus 2 */
-#define CONFIG_SYS_I2C_MXC_I2C3         /* enable I2C bus 3 */
+#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
+#define CONFIG_SYS_MXC_I2C3_SPEED      400000
 
 /* OCOTP Configs */
 #ifdef CONFIG_CMD_FUSE