aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-12-22 18:21:12 -0500
committerDave Airlie <airlied@redhat.com>2015-12-22 18:21:12 -0500
commit9116199536878bb2fdd63d6064633d6e3f2cba22 (patch)
treeff99770d9aa59ae672230e03d489f336280aa578
parentf884a507e631a1d8b270c8bfd95dbde813a0f447 (diff)
parent9736e988d32807d5a186c722928a97f37346fec8 (diff)
Merge branch 'drm-tda998x-devel' of git://ftp.arm.linux.org.uk/~rmk/linux-arm into drm-next
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
-rw-r--r--drivers/gpu/drm/i2c/tda998x_drv.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index a46248f0c9c3..012d36d9a75b 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -22,6 +22,7 @@
22#include <sound/asoundef.h> 22#include <sound/asoundef.h>
23 23
24#include <drm/drmP.h> 24#include <drm/drmP.h>
25#include <drm/drm_atomic_helper.h>
25#include <drm/drm_crtc_helper.h> 26#include <drm/drm_crtc_helper.h>
26#include <drm/drm_edid.h> 27#include <drm/drm_edid.h>
27#include <drm/drm_of.h> 28#include <drm/drm_of.h>
@@ -866,7 +867,10 @@ tda998x_encoder_mode_fixup(struct drm_encoder *encoder,
866static int tda998x_connector_mode_valid(struct drm_connector *connector, 867static int tda998x_connector_mode_valid(struct drm_connector *connector,
867 struct drm_display_mode *mode) 868 struct drm_display_mode *mode)
868{ 869{
869 if (mode->clock > 150000) 870 /* TDA19988 dotclock can go up to 165MHz */
871 struct tda998x_priv *priv = conn_to_tda998x_priv(connector);
872
873 if (mode->clock > ((priv->rev == TDA19988) ? 165000 : 150000))
870 return MODE_CLOCK_HIGH; 874 return MODE_CLOCK_HIGH;
871 if (mode->htotal >= BIT(13)) 875 if (mode->htotal >= BIT(13))
872 return MODE_BAD_HVALUE; 876 return MODE_BAD_HVALUE;
@@ -1379,10 +1383,13 @@ static void tda998x_connector_destroy(struct drm_connector *connector)
1379} 1383}
1380 1384
1381static const struct drm_connector_funcs tda998x_connector_funcs = { 1385static const struct drm_connector_funcs tda998x_connector_funcs = {
1382 .dpms = drm_helper_connector_dpms, 1386 .dpms = drm_atomic_helper_connector_dpms,
1387 .reset = drm_atomic_helper_connector_reset,
1383 .fill_modes = drm_helper_probe_single_connector_modes, 1388 .fill_modes = drm_helper_probe_single_connector_modes,
1384 .detect = tda998x_connector_detect, 1389 .detect = tda998x_connector_detect,
1385 .destroy = tda998x_connector_destroy, 1390 .destroy = tda998x_connector_destroy,
1391 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1392 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1386}; 1393};
1387 1394
1388static int tda998x_bind(struct device *dev, struct device *master, void *data) 1395static int tda998x_bind(struct device *dev, struct device *master, void *data)
@@ -1458,6 +1465,7 @@ static void tda998x_unbind(struct device *dev, struct device *master,
1458{ 1465{
1459 struct tda998x_priv *priv = dev_get_drvdata(dev); 1466 struct tda998x_priv *priv = dev_get_drvdata(dev);
1460 1467
1468 drm_connector_unregister(&priv->connector);
1461 drm_connector_cleanup(&priv->connector); 1469 drm_connector_cleanup(&priv->connector);
1462 drm_encoder_cleanup(&priv->encoder); 1470 drm_encoder_cleanup(&priv->encoder);
1463 tda998x_destroy(priv); 1471 tda998x_destroy(priv);