diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-06-18 07:19:48 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-07-04 04:17:59 -0400 |
commit | 4f930c0f273967b41f46ca84927ac0256bab4649 (patch) | |
tree | bef7910e661c8f361ae635a95841f8ab7b40c485 | |
parent | 3ddd605e8d51dbee991c45c262c0ee8016fc84e6 (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.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_encoder.c | 27 |
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 | ||
38 | bool 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 | |||
37 | void copy_timings_omap_to_drm(struct drm_display_mode *mode, | 45 | void 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); |
195 | void omap_connector_flush(struct drm_connector *connector, | 195 | void 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); |
197 | bool omap_connector_get_hdmi_mode(struct drm_connector *connector); | ||
197 | 198 | ||
198 | void copy_timings_omap_to_drm(struct drm_display_mode *mode, | 199 | void 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 | ||
94 | static void omap_encoder_prepare(struct drm_encoder *encoder) | 121 | static void omap_encoder_prepare(struct drm_encoder *encoder) |