Hi Maxime On Wed, 8 Jul 2020 at 18:43, Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > 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@xxxxxxxxxx> Reviewed-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/vc4/vc4_hdmi.c | 31 ++++++++++++++++++------------- > drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++ > 2 files changed, 21 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c > index a4fed1439bf3..80bc3dd9d4a8 100644 > --- a/drivers/gpu/drm/vc4/vc4_hdmi.c > +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c > @@ -69,6 +69,21 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) > return 0; > } > > +static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi) > +{ > + HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_SW_RST); > + udelay(1); > + HDMI_WRITE(HDMI_M_CTL, 0); > + > + HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_ENABLE); > + > + 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) > { > @@ -363,11 +378,8 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) > 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. > @@ -1292,14 +1304,6 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) > vc4_hdmi->hpd_active_low = hpd_gpio_flags & OF_GPIO_ACTIVE_LOW; > } > > - /* HDMI core must be enabled. */ > - if (!(HDMI_READ(HDMI_M_CTL) & VC4_HD_M_ENABLE)) { > - HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_SW_RST); > - udelay(1); > - HDMI_WRITE(HDMI_M_CTL, 0); > - > - HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_ENABLE); > - } > pm_runtime_enable(dev); > > drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); > @@ -1428,6 +1432,7 @@ static const struct vc4_hdmi_variant bcm2835_variant = { > .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[] = { > diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h > index b36e0210671f..17a30589f39c 100644 > --- 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 */ > -- > git-series 0.9.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel