• Vladimir Zapolskiy's avatar
    i2c: core: add and export of_get_i2c_adapter_by_node() interface · 48e9743d
    Vladimir Zapolskiy authored
    of_find_i2c_adapter_by_node() call requires quite often missing
    put_device(), and i2c_put_adapter() releases a device locked by
    i2c_get_adapter() only. In general module_put(adapter->owner) and
    put_device(dev) are not interchangeable.
    
    This is a common error reproduction scenario as a result of the
    misusage described above (for clearness this is run on iMX6 platform
    with HDMI and I2C bus drivers compiled as kernel modules):
    
        root@mx6q:~# lsmod | grep i2c
        i2c_imx                10213  0
        root@mx6q:~# lsmod | grep dw_hdmi_imx
        dw_hdmi_imx             3631  0
        dw_hdmi                11846  1 dw_hdmi_imx
        imxdrm                  8674  3 dw_hdmi_imx,imx_ipuv3_crtc,imx_ldb
        drm_kms_helper        113765  5 dw_hdmi,imxdrm,imx_ipuv3_crtc,imx_ldb
        root@mx6q:~# rmmod dw_hdmi_imx
        root@mx6q:~# lsmod | grep i2c
        i2c_imx                10213  -1
    
                                     ^^^^^
    
        root@mx6q:~# rmmod i2c_imx
        rmmod: ERROR: Module i2c_imx is in use
    
    To fix existing users of these interfaces and to avoid any further
    confusion and misusage in future, add one more interface
    of_get_i2c_adapter_by_node(), it is similar to i2c_get_adapter() in
    sense that an I2C bus device driver found and locked by user can be
    correctly unlocked by i2c_put_adapter().
    Signed-off-by: default avatarVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    48e9743d
i2c-core.c 80.2 KB