vc4_hdmi_connector_detect(struct drm_connector *connector, bool force)
{
struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
- bool connected = false;
if (vc4_hdmi->hpd_gpio) {
if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^
vc4_hdmi->hpd_active_low)
- connected = true;
- } else if (drm_probe_ddc(vc4_hdmi->ddc))
- connected = true;
+ return connector_status_connected;
+ cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
+ return connector_status_disconnected;
+ }
+
+ if (drm_probe_ddc(vc4_hdmi->ddc))
+ return connector_status_connected;
+
if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED)
- connected = true;
- if (connected) {
- if (connector->status != connector_status_connected) {
- struct edid *edid = drm_get_edid(connector, vc4_hdmi->ddc);
-
- if (edid) {
- cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
- vc4_hdmi->encoder.hdmi_monitor = drm_detect_hdmi_monitor(edid);
- drm_connector_update_edid_property(connector, edid);
- kfree(edid);
- }
- }
return connector_status_connected;
- }
cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
return connector_status_disconnected;
}