An I2C device tree node can contain a 'cell-index' property that can be used to enumerate the I2C devices. If such a property exists, use it to specify the I2C adapter number.
This feature is necessary for the Freescale PowerPC audio drivers (e.g. on the P1022DS). The "machine driver" needs to know the adapter number for each I2C adapter, but it only has access to the device tree. Previously, the I2C nodes always appeared in cell-index order, so the dynamic numbering coincided with the cell-index property. With commit ab827d97 ("powerpc/85xx: Rework P1022DS device tree"), the I2C nodes are unintentionally reversed in the device tree, and so the machine driver guesses the wrong I2C adapter number. Signed-off-by: Timur Tabi <ti...@freescale.com> --- drivers/i2c/busses/i2c-mpc.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 107397a..8551c34 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -632,7 +632,19 @@ static int __devinit fsl_i2c_probe(struct platform_device *op) i2c->adap.dev.parent = &op->dev; i2c->adap.dev.of_node = of_node_get(op->dev.of_node); - result = i2c_add_adapter(&i2c->adap); + /* + * If the I2C node has a "cell-index" property, use it to enumerate + * the I2C adapter. + */ + prop = of_get_property(i2c->adap.dev.of_node, "cell-index", &plen); + if (prop && plen == sizeof(u32)) { + dev_dbg(i2c->dev, "using cell-index property %u", *prop); + i2c->adap.nr = *prop; + result = i2c_add_numbered_adapter(&i2c->adap); + } else { + result = i2c_add_adapter(&i2c->adap); + } + if (result < 0) { dev_err(i2c->dev, "failed to add adapter\n"); goto fail_add; -- 1.7.3.4 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev