aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-08 21:09:33 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-08 21:09:33 -0400
commit9e9ac896667a55ae9a3df119611ee5322abe2890 (patch)
tree82d486ff50b822aff5691bd396247f8cbc1aa800 /drivers/gpu/drm/omapdrm
parent34b20e6df6970e36b93f445669ba5ef7a05fe01a (diff)
parente4e42b8ad24cabf4d6d3c20a63f18dd6b954d9c2 (diff)
Merge tag 'fbdev-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux
Pull fbdev updates from Tomi Valkeinen: - much better HDMI infoframe support for OMAP - Cirrus Logic CLPS711X framebuffer driver - DT support for PL11x CLCD driver - various small fixes * tag 'fbdev-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux: (35 commits) OMAPDSS: DSI: fix depopulating dsi peripherals video: hyperv: hyperv_fb: refresh the VM screen by force on VM panic video: ARM CLCD: Fix DT-related build problems drivers: video: fbdev: atmel_lcdfb.c: Add ability to inverted backlight PWM. video: ARM CLCD: Add DT support drm/omap: Add infoframe & dvi/hdmi mode support OMAPDSS: HDMI: remove the unused code OMAPDSS: HDMI5: add support to set infoframe & HDMI mode OMAPDSS: HDMI4: add support to set infoframe & HDMI mode OMAPDSS: HDMI: add infoframe and hdmi_dvi_mode fields OMAPDSS: add hdmi ops to hdmi-connector and tpd12s015 OMAPDSS: add hdmi ops to hdmi_ops and omap_dss_driver OMAPDSS: HDMI: remove custom avi infoframe OMAPDSS: HDMI5: use common AVI infoframe support OMAPDSS: HDMI4: use common AVI infoframe support OMAPDSS: Kconfig: select HDMI OMAPDSS: HDMI: fix name conflict OMAPDSS: DISPC: clean up dispc_mgr_timings_ok OMAPDSS: DISPC: reject interlace for lcd out OMAPDSS: DISPC: fix debugfs reg dump ...
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
-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 36bc5cc80816..a94b11f7859d 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 b08a450d1b5d..84d73a61b34b 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -187,6 +187,7 @@ struct drm_encoder *omap_connector_attached_encoder(
187 struct drm_connector *connector); 187 struct drm_connector *connector);
188void omap_connector_flush(struct drm_connector *connector, 188void omap_connector_flush(struct drm_connector *connector,
189 int x, int y, int w, int h); 189 int x, int y, int w, int h);
190bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
190 191
191void copy_timings_omap_to_drm(struct drm_display_mode *mode, 192void copy_timings_omap_to_drm(struct drm_display_mode *mode,
192 struct omap_video_timings *timings); 193 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)