aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/omapdrm/omap_connector.c12
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h1
-rw-r--r--drivers/gpu/drm/omapdrm/omap_encoder.c27
3 files changed, 40 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 86f4ead0441d..19492cd31f10 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -32,8 +32,16 @@ struct omap_connector {
32 struct drm_connector base; 32 struct drm_connector base;
33 struct omap_dss_device *dssdev; 33 struct omap_dss_device *dssdev;
34 struct drm_encoder *encoder; 34 struct drm_encoder *encoder;
35 bool hdmi_mode;
35}; 36};
36 37
38bool omap_connector_get_hdmi_mode(struct drm_connector *connector)
39{
40 struct omap_connector *omap_connector = to_omap_connector(connector);
41
42 return omap_connector->hdmi_mode;
43}
44
37void copy_timings_omap_to_drm(struct drm_display_mode *mode, 45void copy_timings_omap_to_drm(struct drm_display_mode *mode,
38 struct omap_video_timings *timings) 46 struct omap_video_timings *timings)
39{ 47{
@@ -162,10 +170,14 @@ static int omap_connector_get_modes(struct drm_connector *connector)
162 drm_mode_connector_update_edid_property( 170 drm_mode_connector_update_edid_property(
163 connector, edid); 171 connector, edid);
164 n = drm_add_edid_modes(connector, edid); 172 n = drm_add_edid_modes(connector, edid);
173
174 omap_connector->hdmi_mode =
175 drm_detect_hdmi_monitor(edid);
165 } else { 176 } else {
166 drm_mode_connector_update_edid_property( 177 drm_mode_connector_update_edid_property(
167 connector, NULL); 178 connector, NULL);
168 } 179 }
180
169 kfree(edid); 181 kfree(edid);
170 } else { 182 } else {
171 struct drm_display_mode *mode = drm_mode_create(dev); 183 struct drm_display_mode *mode = drm_mode_create(dev);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 284b80fc3c54..c204c1e7ce87 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -194,6 +194,7 @@ struct drm_encoder *omap_connector_attached_encoder(
194 struct drm_connector *connector); 194 struct drm_connector *connector);
195void omap_connector_flush(struct drm_connector *connector, 195void omap_connector_flush(struct drm_connector *connector,
196 int x, int y, int w, int h); 196 int x, int y, int w, int h);
197bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
197 198
198void copy_timings_omap_to_drm(struct drm_display_mode *mode, 199void copy_timings_omap_to_drm(struct drm_display_mode *mode,
199 struct omap_video_timings *timings); 200 struct omap_video_timings *timings);
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)