i2c: mux: Allow muxes to work as children of i2c bus without i2c-parent
authorMoritz Fischer <moritz.fischer@ettus.com>
Mon, 16 Jan 2017 17:46:06 +0000 (09:46 -0800)
committerHeiko Schocher <hs@denx.de>
Wed, 18 Jan 2017 05:37:57 +0000 (06:37 +0100)
For mux check if the parent is already a device of UCLASS_I2C and if yes
just use that. Otherwise see if someone specified an i2c-parent phandle.
This mimics the behavior found in the Kernel, as it removes the
requirement to explicitly specify a i2c-parent phandle.

Signed-off-by: Moritz Fischer <moritz.fischer@ettus.com>
Cc: Heiko Schocher <hs@denx.de>
Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: u-boot@lists.denx.de
drivers/i2c/muxes/i2c-mux-uclass.c

index 7a698b62b5aa4c6a91ed509774ebdb39b1bf0077..db086efe61240f3d7f93d67bc4ba72a0ebb1e5f2 100644 (file)
@@ -86,6 +86,16 @@ static int i2c_mux_post_probe(struct udevice *mux)
        debug("%s: %s\n", __func__, mux->name);
        priv->selected = -1;
 
+       /* if parent is of i2c uclass already, we'll take that, otherwise
+        * look if we find an i2c-parent phandle
+        */
+       if (UCLASS_I2C == device_get_uclass_id(mux->parent)) {
+               priv->i2c_bus = dev_get_parent(mux);
+               debug("%s: bus=%p/%s\n", __func__, priv->i2c_bus,
+                     priv->i2c_bus->name);
+               return 0;
+       }
+
        ret = uclass_get_device_by_phandle(UCLASS_I2C, mux, "i2c-parent",
                                           &priv->i2c_bus);
        if (ret)