Skip to content

Commit f836e0d

Browse files
committed
drm/vc4: hdmi: Move packet RAM enable to pm_runtime
Audio can be triggered by the HPD handler and start up before video has been restored, calling vc4_hdmi_write_infoframe for the audio infoframe. vc4_hdmi_write_infoframe checks that the packet RAM to store the infoframes is enabled, but that is only enabled when video is enabled in vc4_hdmi_encoder_post_crtc_enable. The packet RAM enable is only a power saving thing, so move enabling/disabling to the runtime_pm hooks. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
1 parent e26615c commit f836e0d

1 file changed

Lines changed: 13 additions & 8 deletions

File tree

drivers/gpu/drm/vc4/vc4_hdmi.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder,
846846

847847
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
848848

849-
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
849+
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, VC4_HDMI_RAM_PACKET_ENABLE);
850850

851851
HDMI_WRITE(HDMI_VID_CTL, HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_CLRRGB);
852852

@@ -1620,9 +1620,6 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
16201620
WARN_ONCE(ret, "Timeout waiting for "
16211621
"VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
16221622
} else {
1623-
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
1624-
HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
1625-
~(VC4_HDMI_RAM_PACKET_ENABLE));
16261623
HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
16271624
HDMI_READ(HDMI_SCHEDULER_CONTROL) &
16281625
~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
@@ -1641,9 +1638,6 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
16411638
WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
16421639
VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE));
16431640

1644-
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
1645-
VC4_HDMI_RAM_PACKET_ENABLE);
1646-
16471641
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
16481642

16491643
drm_atomic_helper_connector_hdmi_update_infoframes(connector, state);
@@ -3104,6 +3098,12 @@ static int vc5_hdmi_init_resources(struct drm_device *drm,
31043098
static int vc4_hdmi_runtime_suspend(struct device *dev)
31053099
{
31063100
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
3101+
unsigned long flags;
3102+
3103+
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
3104+
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
3105+
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
3106+
31073107

31083108
clk_disable_unprepare(vc4_hdmi->audio_clock);
31093109
/* we no longer require a minimum clock rate */
@@ -3116,7 +3116,7 @@ static int vc4_hdmi_runtime_suspend(struct device *dev)
31163116
static int vc4_hdmi_runtime_resume(struct device *dev)
31173117
{
31183118
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
3119-
unsigned long __maybe_unused flags;
3119+
unsigned long flags;
31203120
u32 __maybe_unused value;
31213121
unsigned long rate;
31223122
int ret;
@@ -3164,6 +3164,11 @@ static int vc4_hdmi_runtime_resume(struct device *dev)
31643164
}
31653165
#endif
31663166

3167+
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
3168+
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
3169+
VC4_HDMI_RAM_PACKET_ENABLE);
3170+
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
3171+
31673172
return 0;
31683173

31693174
err_disable_clk:

0 commit comments

Comments
 (0)