• Thierry Reding's avatar
    i2c: tegra: Restore pinmux on system resume · 44c99904
    Thierry Reding authored
    Depending on the board design, the I2C controllers found on Tegra SoCs
    may require pinmuxing in order to function. This is done as part of the
    driver's runtime suspend/resume operations. However, the PM core does
    not allow devices to go into runtime suspend during system sleep to
    avoid potential races with the suspend/resume of their parents.
    
    As a result of this, when Tegra SoCs resume from system suspend, their
    I2C controllers may have lost the pinmux state in hardware, whereas the
    pinctrl subsystem is not aware of this. To fix this, make sure that if
    the I2C controller is not runtime suspended, the runtime suspend code is
    still executed in order to disable the module clock (which we don't need
    to be enabled during sleep) and set the pinmux to the idle state.
    
    Conversely, make sure that the I2C controller is properly resumed when
    waking up from sleep so that pinmux settings are properly restored.
    
    This fixes a bug seen with DDC transactions to an HDMI monitor timing
    out when resuming from system suspend.
    Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
    44c99904
i2c-tegra.c 50.6 KB