ASoC: fsl/powerpc: don't rely on the cell-index property
authorTimur Tabi <timur@freescale.com>
Fri, 2 Dec 2011 01:52:47 +0000 (19:52 -0600)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 2 Dec 2011 10:37:18 +0000 (10:37 +0000)
Instead of using the 'cell-index' property in the I2C adapter node to
determine the adapter number, just query the i2c_adapter object directly.

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 <timur@freescale.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/fsl/mpc8610_hpcd.c
sound/soc/fsl/p1022_ds.c

index ae49f1c78c6de797bd193946b1d350aa00bd8a40..0ea4a5a96e06533e53ae95e5bebd60cdc16e7832 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/interrupt.h>
 #include <linux/of_device.h>
 #include <linux/slab.h>
+#include <linux/of_i2c.h>
 #include <sound/soc.h>
 #include <asm/fsl_guts.h>
 
@@ -249,8 +250,9 @@ static int get_parent_cell_index(struct device_node *np)
 static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
 {
        const u32 *iprop;
-       int bus, addr;
+       int addr;
        char temp[DAI_NAME_SIZE];
+       struct i2c_client *i2c;
 
        of_modalias_node(np, temp, DAI_NAME_SIZE);
 
@@ -260,11 +262,12 @@ static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
 
        addr = be32_to_cpup(iprop);
 
-       bus = get_parent_cell_index(np);
-       if (bus < 0)
-               return bus;
+       /* We need the adapter number */
+       i2c = of_find_i2c_device_by_node(np);
+       if (!i2c)
+               return -ENODEV;
 
-       snprintf(buf, len, "%s-codec.%u-%04x", temp, bus, addr);
+       snprintf(buf, len, "%s-codec.%u-%04x", temp, i2c->adapter->nr, addr);
 
        return 0;
 }
index 309162652287394ffc1ae400921f2c4a18b751f3..a5d4e80a9cf441140d017c8a0228770761999661 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/interrupt.h>
 #include <linux/of_device.h>
 #include <linux/slab.h>
+#include <linux/of_i2c.h>
 #include <sound/soc.h>
 #include <asm/fsl_guts.h>
 
@@ -252,8 +253,9 @@ static int get_parent_cell_index(struct device_node *np)
 static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
 {
        const u32 *iprop;
-       int bus, addr;
+       int addr;
        char temp[DAI_NAME_SIZE];
+       struct i2c_client *i2c;
 
        of_modalias_node(np, temp, DAI_NAME_SIZE);
 
@@ -263,11 +265,12 @@ static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
 
        addr = be32_to_cpup(iprop);
 
-       bus = get_parent_cell_index(np);
-       if (bus < 0)
-               return bus;
+       /* We need the adapter number */
+       i2c = of_find_i2c_device_by_node(np);
+       if (!i2c)
+               return -ENODEV;
 
-       snprintf(buf, len, "%s.%u-%04x", temp, bus, addr);
+       snprintf(buf, len, "%s.%u-%04x", temp, i2c->adapter->nr, addr);
 
        return 0;
 }