i2c: designware_i2c: Check if the device is powered

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@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Tested on chromebook_coral:
Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Raul E Rangel 2020-04-22 10:13:54 -06:00 committed by Heiko Schocher
parent bcf08503f5
commit f6f9a01689

View file

@ -18,6 +18,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)
{
@ -766,6 +772,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);
}