diff options
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 1 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss_features.c | 1 | ||||
-rw-r--r-- | drivers/video/omap2/dss/hdmi.c | 17 | ||||
-rw-r--r-- | drivers/video/omap2/dss/hdmi_panel.c | 25 | ||||
-rw-r--r-- | drivers/video/omap2/dss/ti_hdmi.h | 3 | ||||
-rw-r--r-- | drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | 12 |
6 files changed, 59 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 2e7799c82960..f58c302b730d 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -495,6 +495,7 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev); | |||
495 | int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, | 495 | int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, |
496 | struct omap_video_timings *timings); | 496 | struct omap_video_timings *timings); |
497 | int omapdss_hdmi_read_edid(u8 *buf, int len); | 497 | int omapdss_hdmi_read_edid(u8 *buf, int len); |
498 | bool omapdss_hdmi_detect(void); | ||
498 | int hdmi_panel_init(void); | 499 | int hdmi_panel_init(void); |
499 | void hdmi_panel_exit(void); | 500 | void hdmi_panel_exit(void); |
500 | 501 | ||
diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c index 076f399a9153..ab4166590a74 100644 --- a/drivers/video/omap2/dss/dss_features.c +++ b/drivers/video/omap2/dss/dss_features.c | |||
@@ -440,6 +440,7 @@ static const struct ti_hdmi_ip_ops omap4_hdmi_functions = { | |||
440 | .phy_enable = ti_hdmi_4xxx_phy_enable, | 440 | .phy_enable = ti_hdmi_4xxx_phy_enable, |
441 | .phy_disable = ti_hdmi_4xxx_phy_disable, | 441 | .phy_disable = ti_hdmi_4xxx_phy_disable, |
442 | .read_edid = ti_hdmi_4xxx_read_edid, | 442 | .read_edid = ti_hdmi_4xxx_read_edid, |
443 | .detect = ti_hdmi_4xxx_detect, | ||
443 | .pll_enable = ti_hdmi_4xxx_pll_enable, | 444 | .pll_enable = ti_hdmi_4xxx_pll_enable, |
444 | .pll_disable = ti_hdmi_4xxx_pll_disable, | 445 | .pll_disable = ti_hdmi_4xxx_pll_disable, |
445 | .video_enable = ti_hdmi_4xxx_wp_video_start, | 446 | .video_enable = ti_hdmi_4xxx_wp_video_start, |
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index fb85ce5a8ab4..781867002662 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c | |||
@@ -449,6 +449,23 @@ int omapdss_hdmi_read_edid(u8 *buf, int len) | |||
449 | return r; | 449 | return r; |
450 | } | 450 | } |
451 | 451 | ||
452 | bool omapdss_hdmi_detect(void) | ||
453 | { | ||
454 | int r; | ||
455 | |||
456 | mutex_lock(&hdmi.lock); | ||
457 | |||
458 | r = hdmi_runtime_get(); | ||
459 | BUG_ON(r); | ||
460 | |||
461 | r = hdmi.ip_data.ops->detect(&hdmi.ip_data); | ||
462 | |||
463 | hdmi_runtime_put(); | ||
464 | mutex_unlock(&hdmi.lock); | ||
465 | |||
466 | return r == 1; | ||
467 | } | ||
468 | |||
452 | int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) | 469 | int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) |
453 | { | 470 | { |
454 | int r = 0; | 471 | int r = 0; |
diff --git a/drivers/video/omap2/dss/hdmi_panel.c b/drivers/video/omap2/dss/hdmi_panel.c index 71aa8134f4fb..533d5dc634d2 100644 --- a/drivers/video/omap2/dss/hdmi_panel.c +++ b/drivers/video/omap2/dss/hdmi_panel.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/mutex.h> | 25 | #include <linux/mutex.h> |
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <video/omapdss.h> | 27 | #include <video/omapdss.h> |
28 | #include <linux/slab.h> | ||
28 | 29 | ||
29 | #include "dss.h" | 30 | #include "dss.h" |
30 | 31 | ||
@@ -198,6 +199,29 @@ err: | |||
198 | return r; | 199 | return r; |
199 | } | 200 | } |
200 | 201 | ||
202 | static bool hdmi_detect(struct omap_dss_device *dssdev) | ||
203 | { | ||
204 | int r; | ||
205 | |||
206 | mutex_lock(&hdmi.hdmi_lock); | ||
207 | |||
208 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) { | ||
209 | r = omapdss_hdmi_display_enable(dssdev); | ||
210 | if (r) | ||
211 | goto err; | ||
212 | } | ||
213 | |||
214 | r = omapdss_hdmi_detect(); | ||
215 | |||
216 | if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED || | ||
217 | dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED) | ||
218 | omapdss_hdmi_display_disable(dssdev); | ||
219 | err: | ||
220 | mutex_unlock(&hdmi.hdmi_lock); | ||
221 | |||
222 | return r; | ||
223 | } | ||
224 | |||
201 | static struct omap_dss_driver hdmi_driver = { | 225 | static struct omap_dss_driver hdmi_driver = { |
202 | .probe = hdmi_panel_probe, | 226 | .probe = hdmi_panel_probe, |
203 | .remove = hdmi_panel_remove, | 227 | .remove = hdmi_panel_remove, |
@@ -209,6 +233,7 @@ static struct omap_dss_driver hdmi_driver = { | |||
209 | .set_timings = hdmi_set_timings, | 233 | .set_timings = hdmi_set_timings, |
210 | .check_timings = hdmi_check_timings, | 234 | .check_timings = hdmi_check_timings, |
211 | .read_edid = hdmi_read_edid, | 235 | .read_edid = hdmi_read_edid, |
236 | .detect = hdmi_detect, | ||
212 | .driver = { | 237 | .driver = { |
213 | .name = "hdmi_panel", | 238 | .name = "hdmi_panel", |
214 | .owner = THIS_MODULE, | 239 | .owner = THIS_MODULE, |
diff --git a/drivers/video/omap2/dss/ti_hdmi.h b/drivers/video/omap2/dss/ti_hdmi.h index 390cd85b122f..d48603c8e23d 100644 --- a/drivers/video/omap2/dss/ti_hdmi.h +++ b/drivers/video/omap2/dss/ti_hdmi.h | |||
@@ -94,6 +94,8 @@ struct ti_hdmi_ip_ops { | |||
94 | 94 | ||
95 | int (*read_edid)(struct hdmi_ip_data *ip_data, u8 *edid, int len); | 95 | int (*read_edid)(struct hdmi_ip_data *ip_data, u8 *edid, int len); |
96 | 96 | ||
97 | bool (*detect)(struct hdmi_ip_data *ip_data); | ||
98 | |||
97 | int (*pll_enable)(struct hdmi_ip_data *ip_data); | 99 | int (*pll_enable)(struct hdmi_ip_data *ip_data); |
98 | 100 | ||
99 | void (*pll_disable)(struct hdmi_ip_data *ip_data); | 101 | void (*pll_disable)(struct hdmi_ip_data *ip_data); |
@@ -114,6 +116,7 @@ struct hdmi_ip_data { | |||
114 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data); | 116 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data); |
115 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data); | 117 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data); |
116 | int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data, u8 *edid, int len); | 118 | int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data, u8 *edid, int len); |
119 | bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data); | ||
117 | void ti_hdmi_4xxx_wp_video_start(struct hdmi_ip_data *ip_data, bool start); | 120 | void ti_hdmi_4xxx_wp_video_start(struct hdmi_ip_data *ip_data, bool start); |
118 | int ti_hdmi_4xxx_pll_enable(struct hdmi_ip_data *ip_data); | 121 | int ti_hdmi_4xxx_pll_enable(struct hdmi_ip_data *ip_data); |
119 | void ti_hdmi_4xxx_pll_disable(struct hdmi_ip_data *ip_data); | 122 | void ti_hdmi_4xxx_pll_disable(struct hdmi_ip_data *ip_data); |
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c index e9885dcc4122..da7fe50fc127 100644 --- a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c +++ b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | |||
@@ -416,6 +416,18 @@ int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data, | |||
416 | return l; | 416 | return l; |
417 | } | 417 | } |
418 | 418 | ||
419 | bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data) | ||
420 | { | ||
421 | int r; | ||
422 | |||
423 | void __iomem *base = hdmi_core_sys_base(ip_data); | ||
424 | |||
425 | /* HPD */ | ||
426 | r = REG_GET(base, HDMI_CORE_SYS_SYS_STAT, 1, 1); | ||
427 | |||
428 | return r == 1; | ||
429 | } | ||
430 | |||
419 | static void hdmi_core_init(struct hdmi_core_video_config *video_cfg, | 431 | static void hdmi_core_init(struct hdmi_core_video_config *video_cfg, |
420 | struct hdmi_core_infoframe_avi *avi_cfg, | 432 | struct hdmi_core_infoframe_avi *avi_cfg, |
421 | struct hdmi_core_packet_enable_repeat *repeat_cfg) | 433 | struct hdmi_core_packet_enable_repeat *repeat_cfg) |