]> git.sur5r.net Git - u-boot/blobdiff - drivers/i2c/imx_lpi2c.c
imx: lpi2c: fix clock issue when NACK detected
[u-boot] / drivers / i2c / imx_lpi2c.c
index 937410fa2c2cd684e6b26732f0ea8ea070a5dbd8..d2e11b411babf0d969dc55f67fe75a84e5277b94 100644 (file)
@@ -1,7 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2016 Freescale Semiconductors, Inc.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -9,13 +8,14 @@
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/imx_lpi2c.h>
+#include <imx_lpi2c.h>
 #include <asm/arch/sys_proto.h>
 #include <dm.h>
 #include <fdtdec.h>
 #include <i2c.h>
 
 #define LPI2C_FIFO_SIZE 4
+#define LPI2C_NACK_TOUT_MS 1
 #define LPI2C_TIMEOUT_MS 100
 
 /* Weak linked function for overridden by some SoC power function */
@@ -185,6 +185,7 @@ static int bus_i2c_stop(struct imx_lpi2c_reg *regs)
 {
        lpi2c_status_t result;
        u32 status;
+       ulong start_time;
 
        result = bus_i2c_wait_for_tx_ready(regs);
        if (result) {
@@ -195,7 +196,8 @@ static int bus_i2c_stop(struct imx_lpi2c_reg *regs)
        /* send stop command */
        writel(LPI2C_MTDR_CMD(0x2), &regs->mtdr);
 
-       while (result == LPI2C_SUCESS) {
+       start_time = get_timer(0);
+       while (1) {
                status = readl(&regs->msr);
                result = imx_lpci2c_check_clear_error(regs);
                /* stop detect flag */
@@ -205,6 +207,11 @@ static int bus_i2c_stop(struct imx_lpi2c_reg *regs)
                        writel(status, &regs->msr);
                        break;
                }
+
+               if (get_timer(start_time) > LPI2C_NACK_TOUT_MS) {
+                       debug("stop timeout\n");
+                       return -ETIMEDOUT;
+               }
        }
 
        return result;
@@ -364,10 +371,8 @@ static int imx_lpi2c_probe_chip(struct udevice *bus, u32 chip,
        }
 
        result = bus_i2c_stop(regs);
-       if (result) {
+       if (result)
                bus_i2c_init(bus, 100000);
-               return -result;
-       }
 
        return result;
 }
@@ -448,6 +453,7 @@ static const struct dm_i2c_ops imx_lpi2c_ops = {
 
 static const struct udevice_id imx_lpi2c_ids[] = {
        { .compatible = "fsl,imx7ulp-lpi2c", },
+       { .compatible = "fsl,imx8qm-lpi2c", },
        {}
 };