[2/2] i2c: designware_i2c: Check if the device is powered

Message ID 20200422101349.2.If5527972508e0f4b35cc9ecdb1491b1ce85ff3af@changeid
State New
Headers show
Series
  • [1/2] i2c: designware_i2c: Tidy up use of NULL priv
Related show

Commit Message

Simon Glass April 22, 2020, 4:13 p.m.
From: Raul E Rangel <rrangel at chromium.org>

If the device doesn't return a version that means the device is
non-functional.

The dw_i2c_regs had invalid offsets for the version field. I got the
correct value from the DesignWare databook. It also matches what the
Picasso PPR says.

Signed-off-by: Raul E Rangel <rrangel at chromium.org>
Reviewed-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Furquan Shaikh <furquan at chromium.org>
Tested on chromebook_coral:
Signed-off-by: Simon Glass <sjg at chromium.org>
---

 drivers/i2c/designware_i2c.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Comments

Heiko Schocher May 30, 2020, 3:47 a.m. | #1
Hello Simon,

Am 22.04.2020 um 18:13 schrieb Simon Glass:
> From: Raul E Rangel <rrangel at chromium.org>
> 
> If the device doesn't return a version that means the device is
> non-functional.
> 
> The dw_i2c_regs had invalid offsets for the version field. I got the
> correct value from the DesignWare databook. It also matches what the
> Picasso PPR says.
> 
> Signed-off-by: Raul E Rangel <rrangel at chromium.org>
> Reviewed-by: Simon Glass <sjg at chromium.org>
> Reviewed-by: Furquan Shaikh <furquan at chromium.org>
> Tested on chromebook_coral:
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
>   drivers/i2c/designware_i2c.c | 17 +++++++++++++++++
>   1 file changed, 17 insertions(+)

Applied to u-boot-i2c master

Thanks!

bye,
HEiko

Patch

diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
index ac170769f4..f7a48f6225 100644
--- a/drivers/i2c/designware_i2c.c
+++ b/drivers/i2c/designware_i2c.c
@@ -16,6 +16,12 @@ 
 #include <dm/device_compat.h>
 #include <linux/err.h>
 
+/*
+ * This assigned unique hex value is constant and is derived from the two ASCII
+ * letters 'DW' followed by a 16-bit unsigned number
+ */
+#define DW_I2C_COMP_TYPE	0x44570140
+
 #ifdef CONFIG_SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED
 static int  dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
 {
@@ -764,6 +770,17 @@  int designware_i2c_ofdata_to_platdata(struct udevice *bus)
 int designware_i2c_probe(struct udevice *bus)
 {
 	struct dw_i2c *priv = dev_get_priv(bus);
+	uint comp_type;
+
+	comp_type = readl(&priv->regs->comp_type);
+	if (comp_type != DW_I2C_COMP_TYPE) {
+		log_err("I2C bus %s has unknown type %#x\n", bus->name,
+			comp_type);
+		return -ENXIO;
+	}
+
+	log_info("I2C bus %s version %#x\n", bus->name,
+		 readl(&priv->regs->comp_version));
 
 	return __dw_i2c_init(priv->regs, 0, 0);
 }