| From 3cf4a365b833d7a2e7622ad5569b9d54aebbe593 Mon Sep 17 00:00:00 2001 |
| From: Maxime Ripard <maxime@cerno.tech> |
| Date: Thu, 19 Dec 2019 16:25:26 +0100 |
| Subject: [PATCH] drm/vc4: hdmi: Add reset callback |
| |
| The BCM2711 and BCM283x HDMI controllers use a slightly different reset |
| sequence, so let's add a callback to reset the controller. |
| |
| Signed-off-by: Maxime Ripard <maxime@cerno.tech> |
| --- |
| drivers/gpu/drm/vc4/vc4_hdmi.c | 17 ++++++++++++----- |
| drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++ |
| 2 files changed, 15 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/gpu/drm/vc4/vc4_hdmi.c |
| +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c |
| @@ -68,6 +68,15 @@ static int vc4_hdmi_debugfs_regs(struct |
| return 0; |
| } |
| |
| +static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi) |
| +{ |
| + HDMI_WRITE(HDMI_SW_RESET_CONTROL, |
| + VC4_HDMI_SW_RESET_HDMI | |
| + VC4_HDMI_SW_RESET_FORMAT_DETECT); |
| + |
| + HDMI_WRITE(HDMI_SW_RESET_CONTROL, 0); |
| +} |
| + |
| static enum drm_connector_status |
| vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) |
| { |
| @@ -372,11 +381,8 @@ static void vc4_hdmi_encoder_enable(stru |
| return; |
| } |
| |
| - HDMI_WRITE(HDMI_SW_RESET_CONTROL, |
| - VC4_HDMI_SW_RESET_HDMI | |
| - VC4_HDMI_SW_RESET_FORMAT_DETECT); |
| - |
| - HDMI_WRITE(HDMI_SW_RESET_CONTROL, 0); |
| + if (vc4_hdmi->variant->reset) |
| + vc4_hdmi->variant->reset(vc4_hdmi); |
| |
| /* PHY should be in reset, like |
| * vc4_hdmi_encoder_disable() does. |
| @@ -1422,6 +1428,7 @@ static const struct vc4_hdmi_variant bcm |
| .num_registers = ARRAY_SIZE(vc4_hdmi_fields), |
| |
| .init_resources = vc4_hdmi_init_resources, |
| + .reset = vc4_hdmi_reset, |
| }; |
| |
| static const struct of_device_id vc4_hdmi_dt_match[] = { |
| --- a/drivers/gpu/drm/vc4/vc4_hdmi.h |
| +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h |
| @@ -35,6 +35,9 @@ struct vc4_hdmi_variant { |
| * clocks, etc) for that variant. |
| */ |
| int (*init_resources)(struct vc4_hdmi *vc4_hdmi); |
| + |
| + /* Callback to reset the HDMI block */ |
| + void (*reset)(struct vc4_hdmi *vc4_hdmi); |
| }; |
| |
| /* HDMI audio information */ |