• Stephen Warren's avatar
    arm/tegra: Don't create duplicate gpio and pinmux devices · 4b91b6fb
    Stephen Warren authored
    *_pinmux_init() register the GPIO and pinmux devices so that they're ready
    before any other device needs them.
    
    *_pinmux_init() are also called by board-dt.c in order to set up the GPIO
    and pinmux configurations. In this case, if we register the devices, they
    end up being probed once due to this registration, and a second time due
    to a device-tree node (or vice-versa). The second probe fails since the
    memory regions are already requested. Besides, we don't actually want the
    duplicated devices.
    
    To avoid this duplicate registration, modify *_pinmux_init() to check
    whether it's running on a DT machine. If not, register the pinmux devices.
    If so, don't register them.
    
    Finally, modify board-dt.c to call the *_pinmux_init() after all devices have
    been instantiated from device-tree. This allows the GPIO and pinmux devices
    to be instantiated and initialized before calling functions to configure the
    hardware.
    
    This has one disadvantage: The pinmux and GPIO initialization now happens
    after /all/ devices are instantiated, rather than after just gpio and
    pinmux but before anything else. So the correct HW configuration is not
    in place when e.g. the SD/MMC device is probed. Long-term, this should be
    solved by doing both:
    
    a) Initializing the HW state from DT nodes during GPIO and pinmux device
       probe.
    b) Using the deferred driver probe mechanism, so that drivers can defer
       their probe until after the gpio and pinmux drivers have probed.
    
    v2: s/int is_dt/bool is_dt/
    v3: Use of_machine_is_compatible inside *_pinmux_init() rather than passing
    an explicit parameter into the function from outside.
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
    4b91b6fb
board-dt.c 3.94 KB