if (adv7511->connector.status != status) {
                adv7511->connector.status = status;
-               if (status == connector_status_disconnected)
-                       cec_phys_addr_invalidate(adv7511->cec_adap);
-               drm_kms_helper_hotplug_event(adv7511->connector.dev);
+
+               if (adv7511->connector.dev) {
+                       if (status == connector_status_disconnected)
+                               cec_phys_addr_invalidate(adv7511->cec_adap);
+                       drm_kms_helper_hotplug_event(adv7511->connector.dev);
+               } else {
+                       drm_bridge_hpd_notify(&adv7511->bridge, status);
+               }
        }
 }
 
        if (status == connector_status_connected && hpd && adv7511->powered) {
                regcache_mark_dirty(adv7511->regmap);
                adv7511_power_on(adv7511);
-               adv7511_get_modes(adv7511, connector);
+               if (connector)
+                       adv7511_get_modes(adv7511, connector);
                if (adv7511->status == connector_status_connected)
                        status = connector_status_disconnected;
        } else {
        return ret;
 }
 
+static enum drm_connector_status adv7511_bridge_detect(struct drm_bridge *bridge)
+{
+       struct adv7511 *adv = bridge_to_adv7511(bridge);
+
+       return adv7511_detect(adv, NULL);
+}
+
+static struct edid *adv7511_bridge_get_edid(struct drm_bridge *bridge,
+                                           struct drm_connector *connector)
+{
+       struct adv7511 *adv = bridge_to_adv7511(bridge);
+
+       return adv7511_get_edid(adv, connector);
+}
+
+static void adv7511_bridge_hpd_notify(struct drm_bridge *bridge,
+                                     enum drm_connector_status status)
+{
+       struct adv7511 *adv = bridge_to_adv7511(bridge);
+
+       if (status == connector_status_disconnected)
+               cec_phys_addr_invalidate(adv->cec_adap);
+}
+
 static const struct drm_bridge_funcs adv7511_bridge_funcs = {
        .enable = adv7511_bridge_enable,
        .disable = adv7511_bridge_disable,
        .mode_set = adv7511_bridge_mode_set,
        .attach = adv7511_bridge_attach,
+       .detect = adv7511_bridge_detect,
+       .get_edid = adv7511_bridge_get_edid,
+       .hpd_notify = adv7511_bridge_hpd_notify,
 };
 
 /* -----------------------------------------------------------------------------
                goto err_unregister_cec;
 
        adv7511->bridge.funcs = &adv7511_bridge_funcs;
+       adv7511->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID
+                           | DRM_BRIDGE_OP_HPD;
        adv7511->bridge.of_node = dev->of_node;
 
        drm_bridge_add(&adv7511->bridge);