• Ionut Nicu's avatar
    i2c: mux: gpio: use reg value for i2c_add_mux_adapter · 8c0ec250
    Ionut Nicu authored
    The i2c-mux driver requires that the chan_id parameter
    passed to the i2c_add_mux_adapter() function is equal
    to the reg value for that adapter:
    
    for_each_child_of_node(mux_dev->of_node, child) {
    	ret = of_property_read_u32(child, "reg", &reg);
    	if (ret)
    		continue;
    	if (chan_id == reg) {
    		priv->adap.dev.of_node = child;
    		break;
    	}
    }
    
    The i2c-mux-gpio driver uses an internal logical index
    for chan_id when calling i2c_add_mux_adapter() instead
    of using the reg value.
    
    Because of this, there will problems in selecting the
    right adapter when the i2c-mux-gpio's index into
    mux->data.values doesn't match the reg value.
    
    An example of such a case:
    
    mux->data.values = { 1, 0 }
    
    For chan_id = 0, i2c-mux will bind the adapter to the
    of_node with reg = <0>, but when it will call the
    select() callback with chan_id set to 0, the i2c-mux-gpio
    will use it as an index into mux->data.values and it will
    actually select the bus with reg = <1>.
    Signed-off-by: default avatarIonut Nicu <ioan.nicu.ext@nsn.com>
    Acked-by: default avatarAlexander Sverdlin <alexander.sverdlin@nsn.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    Cc: stable@kernel.org
    8c0ec250
i2c-mux-gpio.c 6.85 KB