Re: [PATCH v8 1/2] i2c: mux: Factor out channel node lookup
From: Andy Shevchenko
Date: Tue Sep 01 2026 - 04:56:38 EST
On Mon, Aug 31, 2026 at 10:22:06AM -0700, Ahmad Byagowi wrote:
> Move the existing Device Tree channel-node lookup into a helper in
> preparation for using generic firmware-node operations.
>
> This is a pure refactoring with no functional change.
...
> +static struct device_node *
> +i2c_mux_get_channel_node(struct i2c_mux_core *muxc, u32 chan_id)
> +{
> + struct device_node *dev_node = muxc->dev->of_node;
It's better for maintenance to split assignment (due to validation below).
struct device_node *dev_node;
> + struct device_node *mux_node, *child;
> + u32 reg;
> + int ret;
// also use getter
dev_node = dev_of_node(dev);
> + if (!dev_node)
> + return NULL;
Looking at the code, it's NULL-aware as far as I can see and this check is just
a shortcut.
> + if (muxc->arbitrator)
> + mux_node = of_get_child_by_name(dev_node, "i2c-arb");
> + else if (muxc->gate)
> + mux_node = of_get_child_by_name(dev_node, "i2c-gate");
> + else
> + mux_node = of_get_child_by_name(dev_node, "i2c-mux");
> +
> + if (mux_node) {
> + /* A "reg" property indicates an old-style DT entry */
> + if (!of_property_read_u32(mux_node, "reg", ®)) {
> + of_node_put(mux_node);
> + mux_node = NULL;
> + }
> + }
> +
> + if (!mux_node)
> + mux_node = of_node_get(dev_node);
> + else if (muxc->arbitrator || muxc->gate)
> + return mux_node;
> +
> + for_each_child_of_node(mux_node, child) {
> + ret = of_property_read_u32(child, "reg", ®);
> + if (ret)
> + continue;
> + if (chan_id == reg)
> + break;
> + }
> +
> + of_node_put(mux_node);
> + return child;
> +}
--
With Best Regards,
Andy Shevchenko