• Johan Hovold's avatar
    driver core: add helper to reuse a device-tree node · 4e75e1d7
    Johan Hovold authored
    Add a helper function to be used when reusing the device-tree node of
    another device.
    
    It is fairly common for drivers to reuse the device-tree node of a
    parent (or other ancestor) device when creating class or bus devices
    (e.g. gpio chips, i2c adapters, iio chips, spi masters, serdev, phys,
    usb root hubs). But reusing a device-tree node may cause problems if the
    new device is later probed as for example driver core would currently
    attempt to reinitialise an already active associated pinmux
    configuration.
    
    Other potential issues include the platform-bus code unconditionally
    dropping the device-tree node reference in its device destructor,
    reinitialisation of other bus-managed resources such as clocks, and the
    recently added DMA-setup in driver core.
    
    Note that for most examples above this is currently not an issue as the
    devices are never probed, but this is a problem for the USB bus which
    has recently gained device-tree support. This was discovered and
    worked-around in a rather ad-hoc fashion by commit dc5878ab ("usb:
    core: move root hub's device node assignment after it is added to bus")
    by not setting the of_node pointer until after the root-hub device has
    been registered.
    
    Instead we can allow devices to reuse a device-tree node by setting a
    flag in their struct device that can be used by core, bus and driver
    code to avoid resources from being over-allocated.
    
    Note that the helper also grabs an extra reference to the device node,
    which specifically balances the unconditional put in the platform-device
    destructor.
    Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4e75e1d7
core.c 74.5 KB