|
@@ -50,7 +50,7 @@ static int i2c_setup_offset(struct dm_i2c_chip *chip, uint offset,
|
|
|
static int i2c_read_bytewise(struct udevice *dev, uint offset,
|
|
|
uint8_t *buffer, int len)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
struct udevice *bus = dev_get_parent(dev);
|
|
|
struct dm_i2c_ops *ops = i2c_get_ops(bus);
|
|
|
struct i2c_msg msg[2], *ptr;
|
|
@@ -79,7 +79,7 @@ static int i2c_read_bytewise(struct udevice *dev, uint offset,
|
|
|
static int i2c_write_bytewise(struct udevice *dev, uint offset,
|
|
|
const uint8_t *buffer, int len)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
struct udevice *bus = dev_get_parent(dev);
|
|
|
struct dm_i2c_ops *ops = i2c_get_ops(bus);
|
|
|
struct i2c_msg msg[1];
|
|
@@ -102,7 +102,7 @@ static int i2c_write_bytewise(struct udevice *dev, uint offset,
|
|
|
|
|
|
int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
struct udevice *bus = dev_get_parent(dev);
|
|
|
struct dm_i2c_ops *ops = i2c_get_ops(bus);
|
|
|
struct i2c_msg msg[2], *ptr;
|
|
@@ -133,7 +133,7 @@ int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len)
|
|
|
int dm_i2c_write(struct udevice *dev, uint offset, const uint8_t *buffer,
|
|
|
int len)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
struct udevice *bus = dev_get_parent(dev);
|
|
|
struct dm_i2c_ops *ops = i2c_get_ops(bus);
|
|
|
struct i2c_msg msg[1];
|
|
@@ -223,7 +223,7 @@ static int i2c_probe_chip(struct udevice *bus, uint chip_addr,
|
|
|
static int i2c_bind_driver(struct udevice *bus, uint chip_addr, uint offset_len,
|
|
|
struct udevice **devp)
|
|
|
{
|
|
|
- struct dm_i2c_chip chip;
|
|
|
+ struct dm_i2c_chip *chip;
|
|
|
char name[30], *str;
|
|
|
struct udevice *dev;
|
|
|
int ret;
|
|
@@ -236,11 +236,11 @@ static int i2c_bind_driver(struct udevice *bus, uint chip_addr, uint offset_len,
|
|
|
goto err_bind;
|
|
|
|
|
|
/* Tell the device what we know about it */
|
|
|
- memset(&chip, '\0', sizeof(chip));
|
|
|
- chip.chip_addr = chip_addr;
|
|
|
- chip.offset_len = offset_len;
|
|
|
- ret = device_probe_child(dev, &chip);
|
|
|
- debug("%s: device_probe_child: ret=%d\n", __func__, ret);
|
|
|
+ chip = dev_get_parent_platdata(dev);
|
|
|
+ chip->chip_addr = chip_addr;
|
|
|
+ chip->offset_len = offset_len;
|
|
|
+ ret = device_probe(dev);
|
|
|
+ debug("%s: device_probe: ret=%d\n", __func__, ret);
|
|
|
if (ret)
|
|
|
goto err_probe;
|
|
|
|
|
@@ -248,6 +248,10 @@ static int i2c_bind_driver(struct udevice *bus, uint chip_addr, uint offset_len,
|
|
|
return 0;
|
|
|
|
|
|
err_probe:
|
|
|
+ /*
|
|
|
+ * If the device failed to probe, unbind it. There is nothing there
|
|
|
+ * on the bus so we don't want to leave it lying around
|
|
|
+ */
|
|
|
device_unbind(dev);
|
|
|
err_bind:
|
|
|
free(str);
|
|
@@ -263,15 +267,9 @@ int i2c_get_chip(struct udevice *bus, uint chip_addr, uint offset_len,
|
|
|
bus->name, chip_addr);
|
|
|
for (device_find_first_child(bus, &dev); dev;
|
|
|
device_find_next_child(&dev)) {
|
|
|
- struct dm_i2c_chip store;
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
int ret;
|
|
|
|
|
|
- if (!chip) {
|
|
|
- chip = &store;
|
|
|
- i2c_chip_ofdata_to_platdata(gd->fdt_blob,
|
|
|
- dev->of_offset, chip);
|
|
|
- }
|
|
|
if (chip->chip_addr == chip_addr) {
|
|
|
ret = device_probe(dev);
|
|
|
debug("found, ret=%d\n", ret);
|
|
@@ -367,7 +365,7 @@ int i2c_get_bus_speed(struct udevice *bus)
|
|
|
int i2c_set_chip_flags(struct udevice *dev, uint flags)
|
|
|
{
|
|
|
struct udevice *bus = dev->parent;
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
struct dm_i2c_ops *ops = i2c_get_ops(bus);
|
|
|
int ret;
|
|
|
|
|
@@ -383,7 +381,7 @@ int i2c_set_chip_flags(struct udevice *dev, uint flags)
|
|
|
|
|
|
int i2c_get_chip_flags(struct udevice *dev, uint *flagsp)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
|
|
|
*flagsp = chip->flags;
|
|
|
|
|
@@ -392,7 +390,7 @@ int i2c_get_chip_flags(struct udevice *dev, uint *flagsp)
|
|
|
|
|
|
int i2c_set_chip_offset_len(struct udevice *dev, uint offset_len)
|
|
|
{
|
|
|
- struct dm_i2c_chip *chip = dev_get_parentdata(dev);
|
|
|
+ struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
|
|
|
|
|
|
if (offset_len > I2C_MAX_OFFSET_LEN)
|
|
|
return -EINVAL;
|
|
@@ -444,19 +442,31 @@ static int i2c_post_probe(struct udevice *dev)
|
|
|
return i2c_set_bus_speed(dev, i2c->speed_hz);
|
|
|
}
|
|
|
|
|
|
-int i2c_post_bind(struct udevice *dev)
|
|
|
+static int i2c_post_bind(struct udevice *dev)
|
|
|
{
|
|
|
/* Scan the bus for devices */
|
|
|
return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
|
|
|
}
|
|
|
|
|
|
+static int i2c_child_post_bind(struct udevice *dev)
|
|
|
+{
|
|
|
+ struct dm_i2c_chip *plat = dev_get_parent_platdata(dev);
|
|
|
+
|
|
|
+ if (dev->of_offset == -1)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return i2c_chip_ofdata_to_platdata(gd->fdt_blob, dev->of_offset, plat);
|
|
|
+}
|
|
|
+
|
|
|
UCLASS_DRIVER(i2c) = {
|
|
|
.id = UCLASS_I2C,
|
|
|
.name = "i2c",
|
|
|
.flags = DM_UC_FLAG_SEQ_ALIAS,
|
|
|
- .per_device_auto_alloc_size = sizeof(struct dm_i2c_bus),
|
|
|
.post_bind = i2c_post_bind,
|
|
|
.post_probe = i2c_post_probe,
|
|
|
+ .per_device_auto_alloc_size = sizeof(struct dm_i2c_bus),
|
|
|
+ .per_child_platdata_auto_alloc_size = sizeof(struct dm_i2c_chip),
|
|
|
+ .child_post_bind = i2c_child_post_bind,
|
|
|
};
|
|
|
|
|
|
UCLASS_DRIVER(i2c_generic) = {
|