drm/bridge: adv7511: Enable connector polling when no interrupt is specified
[linux-2.6-block.git] / drivers / gpu / drm / bridge / adv7511 / adv7511_drv.c
index f75ab627811349beb55180a2c651e1c666da08a7..bd7dbae1119efc5895e93c89a0053936d1e50b11 100644 (file)
@@ -199,17 +199,14 @@ static const uint16_t adv7511_csc_ycbcr_to_rgb[] = {
 
 static void adv7511_set_config_csc(struct adv7511 *adv7511,
                                   struct drm_connector *connector,
-                                  bool rgb)
+                                  bool rgb, bool hdmi_mode)
 {
        struct adv7511_video_config config;
        bool output_format_422, output_format_ycbcr;
        unsigned int mode;
        uint8_t infoframe[17];
 
-       if (adv7511->edid)
-               config.hdmi_mode = drm_detect_hdmi_monitor(adv7511->edid);
-       else
-               config.hdmi_mode = false;
+       config.hdmi_mode = hdmi_mode;
 
        hdmi_avi_infoframe_init(&config.avi_infoframe);
 
@@ -589,15 +586,14 @@ static int adv7511_get_modes(struct adv7511 *adv7511,
        if (!adv7511->powered)
                __adv7511_power_off(adv7511);
 
-       kfree(adv7511->edid);
-       adv7511->edid = edid;
-       if (!edid)
-               return 0;
 
        drm_mode_connector_update_edid_property(connector, edid);
        count = drm_add_edid_modes(connector, edid);
 
-       adv7511_set_config_csc(adv7511, connector, adv7511->rgb);
+       adv7511_set_config_csc(adv7511, connector, adv7511->rgb,
+                              drm_detect_hdmi_monitor(edid));
+
+       kfree(edid);
 
        return count;
 }
@@ -785,8 +781,7 @@ adv7511_connector_detect(struct drm_connector *connector, bool force)
        return adv7511_detect(adv, connector);
 }
 
-static struct drm_connector_funcs adv7511_connector_funcs = {
-       .dpms = drm_atomic_helper_connector_dpms,
+static const struct drm_connector_funcs adv7511_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
        .detect = adv7511_connector_detect,
        .destroy = drm_connector_cleanup,
@@ -834,7 +829,11 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
                return -ENODEV;
        }
 
-       adv->connector.polled = DRM_CONNECTOR_POLL_HPD;
+       if (adv->i2c_main->irq)
+               adv->connector.polled = DRM_CONNECTOR_POLL_HPD;
+       else
+               adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
+                               DRM_CONNECTOR_POLL_DISCONNECT;
 
        ret = drm_connector_init(bridge->dev, &adv->connector,
                                 &adv7511_connector_funcs,
@@ -857,7 +856,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
        return ret;
 }
 
-static struct drm_bridge_funcs adv7511_bridge_funcs = {
+static const struct drm_bridge_funcs adv7511_bridge_funcs = {
        .enable = adv7511_bridge_enable,
        .disable = adv7511_bridge_disable,
        .mode_set = adv7511_bridge_mode_set,
@@ -1126,11 +1125,7 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
        adv7511->bridge.funcs = &adv7511_bridge_funcs;
        adv7511->bridge.of_node = dev->of_node;
 
-       ret = drm_bridge_add(&adv7511->bridge);
-       if (ret) {
-               dev_err(dev, "failed to add adv7511 bridge\n");
-               goto err_unregister_cec;
-       }
+       drm_bridge_add(&adv7511->bridge);
 
        adv7511_audio_init(dev, adv7511);
 
@@ -1163,8 +1158,6 @@ static int adv7511_remove(struct i2c_client *i2c)
 
        i2c_unregister_device(adv7511->i2c_edid);
 
-       kfree(adv7511->edid);
-
        return 0;
 }