• Maxime Ripard's avatar
    drm/vc4: hdmi: Avoid sleeping in atomic context · 58d04369
    Maxime Ripard authored
    When running the trigger hook, ALSA by default will take a spinlock, and
    thus will run the trigger hook in atomic context.
    
    However, our HDMI driver will send the infoframes as part of the trigger
    hook, and part of that process is to wait for a bit to be cleared for up to
    100ms. To be nicer to the system, that wait has some usleep_range that
    interact poorly with the atomic context.
    
    There's several ways we can fix this, but the more obvious one is to make
    ALSA take a mutex instead by setting the nonatomic flag on the DAI link.
    That doesn't work though, since now the cyclic callback installed by the
    dmaengine helpers in ALSA will take a mutex, while that callback is run by
    dmaengine's virt-chan code in a tasklet where sleeping is not allowed
    either.
    
    Given the delay we need to poll the bit for, changing the usleep_range for
    a udelay and keep running it from a context where interrupts are disabled
    is not really a good option either.
    
    However, we can move the infoframe setup code in the hw_params hook, like
    is usually done in other HDMI controllers, that isn't protected by a
    spinlock and thus where we can sleep. Infoframes will be sent on a regular
    basis anyway, and since hw_params is where the audio parameters that end up
    in the infoframes are setup, this also makes a bit more sense.
    
    Fixes: bb7d7856 ("drm/vc4: Add HDMI audio support")
    Suggested-by: default avatarMark Brown <broonie@kernel.org>
    Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
    Reviewed-by: default avatarMark Brown <broonie@kernel.org>
    Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201027101558.427256-1-maxime@cerno.tech
    58d04369
vc4_hdmi.c 54.3 KB