diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-08 21:09:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-08 21:09:33 -0400 |
commit | 9e9ac896667a55ae9a3df119611ee5322abe2890 (patch) | |
tree | 82d486ff50b822aff5691bd396247f8cbc1aa800 /drivers/gpu/drm/omapdrm | |
parent | 34b20e6df6970e36b93f445669ba5ef7a05fe01a (diff) | |
parent | e4e42b8ad24cabf4d6d3c20a63f18dd6b954d9c2 (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.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 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 | ||
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 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); |
188 | void omap_connector_flush(struct drm_connector *connector, | 188 | void 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); |
190 | bool omap_connector_get_hdmi_mode(struct drm_connector *connector); | ||
190 | 191 | ||
191 | void copy_timings_omap_to_drm(struct drm_display_mode *mode, | 192 | void 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 | ||
94 | static void omap_encoder_prepare(struct drm_encoder *encoder) | 121 | static void omap_encoder_prepare(struct drm_encoder *encoder) |