aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_encoder.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2014-06-18 07:19:48 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2014-07-04 04:17:59 -0400
commit4f930c0f273967b41f46ca84927ac0256bab4649 (patch)
treebef7910e661c8f361ae635a95841f8ab7b40c485 /drivers/gpu/drm/omapdrm/omap_encoder.c
parent3ddd605e8d51dbee991c45c262c0ee8016fc84e6 (diff)
drm/omap: Add infoframe & dvi/hdmi mode support
Make the omapdrm driver use the new HDMI ops when possible. omapdrm will call set_hdmi_mode (when available) to tell the encoder driver whether the monitor is a DVI or HDMI monitor, and if it's an HDMI monitor, omapdrm will call set_hdmi_infoframe to to set the AVI infoframe. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Cc: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_encoder.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_encoder.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 5290a88c681d..7445fb1491ae 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -17,6 +17,8 @@
17 * this program. If not, see <http://www.gnu.org/licenses/>. 17 * this program. If not, see <http://www.gnu.org/licenses/>.
18 */ 18 */
19 19
20#include <drm/drm_edid.h>
21
20#include "omap_drv.h" 22#include "omap_drv.h"
21 23
22#include "drm_crtc.h" 24#include "drm_crtc.h"
@@ -89,6 +91,31 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
89 struct drm_display_mode *mode, 91 struct drm_display_mode *mode,
90 struct drm_display_mode *adjusted_mode) 92 struct drm_display_mode *adjusted_mode)
91{ 93{
94 struct drm_device *dev = encoder->dev;
95 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
96 struct omap_dss_device *dssdev = omap_encoder->dssdev;
97 struct drm_connector *connector;
98 bool hdmi_mode;
99 int r;
100
101 hdmi_mode = false;
102 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
103 if (connector->encoder == encoder) {
104 hdmi_mode = omap_connector_get_hdmi_mode(connector);
105 break;
106 }
107 }
108
109 if (dssdev->driver->set_hdmi_mode)
110 dssdev->driver->set_hdmi_mode(dssdev, hdmi_mode);
111
112 if (hdmi_mode && dssdev->driver->set_hdmi_infoframe) {
113 struct hdmi_avi_infoframe avi;
114
115 r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode);
116 if (r == 0)
117 dssdev->driver->set_hdmi_infoframe(dssdev, &avi);
118 }
92} 119}
93 120
94static void omap_encoder_prepare(struct drm_encoder *encoder) 121static void omap_encoder_prepare(struct drm_encoder *encoder)