Merge branch 'drm-tda998x-devel' of git://ftp.arm.linux.org.uk/~rmk/linux-arm into...
authorDave Airlie <airlied@redhat.com>
Tue, 22 Dec 2015 23:21:12 +0000 (09:21 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 22 Dec 2015 23:21:12 +0000 (09:21 +1000)
These changes from Liviu add support for atomic mode setting, add the
TMDS clock limitation according to the device, and ensure that we
correctly clean up in the unbind function.

* 'drm-tda998x-devel' of git://ftp.arm.linux.org.uk/~rmk/linux-arm:
  drm/i2c: tda998x: Add support for atomic modesetting
  drm/i2c: tda998x: increase the supported dotclock frequency to 165MHz for TDA19988
  drm/i2c: tda998x: unregister the connector in the unbind function

1  2 
drivers/gpu/drm/i2c/tda998x_drv.c

@@@ -22,6 -22,7 +22,7 @@@
  #include <sound/asoundef.h>
  
  #include <drm/drmP.h>
+ #include <drm/drm_atomic_helper.h>
  #include <drm/drm_crtc_helper.h>
  #include <drm/drm_edid.h>
  #include <drm/drm_of.h>
@@@ -855,6 -856,18 +856,6 @@@ static void tda998x_encoder_dpms(struc
        priv->dpms = mode;
  }
  
 -static void
 -tda998x_encoder_save(struct drm_encoder *encoder)
 -{
 -      DBG("");
 -}
 -
 -static void
 -tda998x_encoder_restore(struct drm_encoder *encoder)
 -{
 -      DBG("");
 -}
 -
  static bool
  tda998x_encoder_mode_fixup(struct drm_encoder *encoder,
                          const struct drm_display_mode *mode,
  static int tda998x_connector_mode_valid(struct drm_connector *connector,
                                        struct drm_display_mode *mode)
  {
-       if (mode->clock > 150000)
+       /* TDA19988 dotclock can go up to 165MHz */
+       struct tda998x_priv *priv = conn_to_tda998x_priv(connector);
+       if (mode->clock > ((priv->rev == TDA19988) ? 165000 : 150000))
                return MODE_CLOCK_HIGH;
        if (mode->htotal >= BIT(13))
                return MODE_BAD_HVALUE;
@@@ -1339,6 -1355,8 +1343,6 @@@ static void tda998x_encoder_commit(stru
  
  static const struct drm_encoder_helper_funcs tda998x_encoder_helper_funcs = {
        .dpms = tda998x_encoder_dpms,
 -      .save = tda998x_encoder_save,
 -      .restore = tda998x_encoder_restore,
        .mode_fixup = tda998x_encoder_mode_fixup,
        .prepare = tda998x_encoder_prepare,
        .commit = tda998x_encoder_commit,
@@@ -1379,10 -1397,13 +1383,13 @@@ static void tda998x_connector_destroy(s
  }
  
  static const struct drm_connector_funcs tda998x_connector_funcs = {
-       .dpms = drm_helper_connector_dpms,
+       .dpms = drm_atomic_helper_connector_dpms,
+       .reset = drm_atomic_helper_connector_reset,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .detect = tda998x_connector_detect,
        .destroy = tda998x_connector_destroy,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  };
  
  static int tda998x_bind(struct device *dev, struct device *master, void *data)
  
        drm_encoder_helper_add(&priv->encoder, &tda998x_encoder_helper_funcs);
        ret = drm_encoder_init(drm, &priv->encoder, &tda998x_encoder_funcs,
 -                             DRM_MODE_ENCODER_TMDS);
 +                             DRM_MODE_ENCODER_TMDS, NULL);
        if (ret)
                goto err_encoder;
  
@@@ -1458,6 -1479,7 +1465,7 @@@ static void tda998x_unbind(struct devic
  {
        struct tda998x_priv *priv = dev_get_drvdata(dev);
  
+       drm_connector_unregister(&priv->connector);
        drm_connector_cleanup(&priv->connector);
        drm_encoder_cleanup(&priv->encoder);
        tda998x_destroy(priv);