From d3b4aa519c2c916c76ce7d83fa7288a6fd9ad9ac Mon Sep 17 00:00:00 2001 From: Ricardo Neri Date: Mon, 30 Jul 2012 19:12:02 -0500 Subject: OMAPDSS: HDMI: Disable PLL properly in case of error at power_on Small patch to disable the PLL appropriately before runtime_put in case an error occurs while enabling the PHY. Signed-off-by: Ricardo Neri Signed-off-by: Tomi Valkeinen --- drivers/video/omap2/dss/hdmi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/video/omap2/dss/hdmi.c') diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index 060216fdc578..a65dafaa0d72 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c @@ -501,7 +501,7 @@ static int hdmi_power_on(struct omap_dss_device *dssdev) r = hdmi.ip_data.ops->phy_enable(&hdmi.ip_data); if (r) { DSSDBG("Failed to start PHY\n"); - goto err; + goto err_phy_enable; } hdmi.ip_data.ops->video_configure(&hdmi.ip_data); @@ -537,6 +537,7 @@ err_mgr_enable: hdmi.ip_data.ops->video_disable(&hdmi.ip_data); err_vid_enable: hdmi.ip_data.ops->phy_disable(&hdmi.ip_data); +err_phy_enable: hdmi.ip_data.ops->pll_disable(&hdmi.ip_data); err: hdmi_runtime_put(); -- cgit v1.2.3 From 7849398fa28c21dad24292b838b059a862f99f16 Mon Sep 17 00:00:00 2001 From: Archit Taneja Date: Wed, 8 Aug 2012 16:50:42 +0530 Subject: OMAPDSS: HDMI: Use our own omap_video_timings field when setting interface timings The hdmi driver currently updates only the 'code' member of hdmi_config when the op omapdss_hdmi_display_set_timing() is called by the hdmi panel driver. The 'timing' field of hdmi_config is updated only when hdmi_power_on is called. It makes more sense to configure the whole hdmi_config field in the set_timing op called by the panel driver. This way, we don't need to call both functions to ensure that our hdmi_config is configured correctly. Also, we don't need to calculate hdmi_config during hdmi_power_on, or rely on the omap_video_timings in the panel's omap_dss_device struct. The default timings of the hdmi panel are represented in a cleaner form. Since the hdmi output is now configured by it's own copy of timings (in hdmi.ip_data.cfg), the panel driver needs to set it to a valid value before enabling hdmi output. We now call omapdss_hdmi_set_timing() before enabling hdmi output, this is done to atleast have the hdmi output configured to the panel's default timings if the DSS user didn't call panel driver's set_timings() op explicitly. Signed-off-by: Archit Taneja --- drivers/video/omap2/dss/hdmi.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) (limited to 'drivers/video/omap2/dss/hdmi.c') diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index a65dafaa0d72..964a19500c0e 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c @@ -459,7 +459,6 @@ static void hdmi_compute_pll(struct omap_dss_device *dssdev, int phy, static int hdmi_power_on(struct omap_dss_device *dssdev) { int r; - const struct hdmi_config *timing; struct omap_video_timings *p; unsigned long phy; @@ -469,22 +468,10 @@ static int hdmi_power_on(struct omap_dss_device *dssdev) dss_mgr_disable(dssdev->manager); - p = &dssdev->panel.timings; + p = &hdmi.ip_data.cfg.timings; - DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", - dssdev->panel.timings.x_res, - dssdev->panel.timings.y_res); + DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res); - timing = hdmi_get_timings(); - if (timing == NULL) { - /* HDMI code 4 corresponds to 640 * 480 VGA */ - hdmi.ip_data.cfg.cm.code = 4; - /* DVI mode 1 corresponds to HDMI 0 to DVI */ - hdmi.ip_data.cfg.cm.mode = HDMI_DVI; - hdmi.ip_data.cfg = vesa_timings[0]; - } else { - hdmi.ip_data.cfg = *timing; - } phy = p->pixel_clock; hdmi_compute_pll(dssdev, phy, &hdmi.ip_data.pll_data); @@ -521,7 +508,7 @@ static int hdmi_power_on(struct omap_dss_device *dssdev) dispc_enable_gamma_table(0); /* tv size */ - dss_mgr_set_timings(dssdev->manager, &dssdev->panel.timings); + dss_mgr_set_timings(dssdev->manager, p); r = hdmi.ip_data.ops->video_enable(&hdmi.ip_data); if (r) @@ -568,13 +555,18 @@ int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, } -void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev) +void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev, + struct omap_video_timings *timings) { struct hdmi_cm cm; + const struct hdmi_config *t; - cm = hdmi_get_code(&dssdev->panel.timings); - hdmi.ip_data.cfg.cm.code = cm.code; - hdmi.ip_data.cfg.cm.mode = cm.mode; + cm = hdmi_get_code(timings); + hdmi.ip_data.cfg.cm = cm; + + t = hdmi_get_timings(); + if (t != NULL) + hdmi.ip_data.cfg = *t; if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { int r; @@ -585,7 +577,7 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev) if (r) DSSERR("failed to power on device\n"); } else { - dss_mgr_set_timings(dssdev->manager, &dssdev->panel.timings); + dss_mgr_set_timings(dssdev->manager, &t->timings); } } @@ -930,6 +922,7 @@ static int __init omapdss_hdmihw_probe(struct platform_device *pdev) hdmi.ip_data.core_av_offset = HDMI_CORE_AV; hdmi.ip_data.pll_offset = HDMI_PLLCTRL; hdmi.ip_data.phy_offset = HDMI_PHY; + mutex_init(&hdmi.ip_data.lock); hdmi_panel_init(); -- cgit v1.2.3 From ed1aa9003bc359a3139cbd6c31eb834fa71b26d9 Mon Sep 17 00:00:00 2001 From: Archit Taneja Date: Wed, 15 Aug 2012 00:40:31 +0530 Subject: OMAPDSS: HDMI: Add locking for hdmi interface set timing functions The hdmi interface driver exposes functions to the hdmi panel driver to configure the interface timings maintained by the hdmi driver. These timings(stored in hdmi.ip_data.cfg) should be protected by the hdmi lock to ensure they are called sequentially, this is similar to how hdmi enable and disable functions need locking. Signed-off-by: Archit Taneja --- drivers/video/omap2/dss/hdmi.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/video/omap2/dss/hdmi.c') diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index 964a19500c0e..0cdf24673d48 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c @@ -561,6 +561,8 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev, struct hdmi_cm cm; const struct hdmi_config *t; + mutex_lock(&hdmi.lock); + cm = hdmi_get_code(timings); hdmi.ip_data.cfg.cm = cm; @@ -579,6 +581,8 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev, } else { dss_mgr_set_timings(dssdev->manager, &t->timings); } + + mutex_unlock(&hdmi.lock); } static void hdmi_dump_regs(struct seq_file *s) -- cgit v1.2.3 From cca35017ca0dadae632ced71a11a7e0b7083af6c Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 26 Apr 2012 14:48:32 +0300 Subject: OMAPDSS: HDMI: Move GPIO handling to HDMI driver We currently manage HDMI GPIOs in the board files via platform_enable/disable calls. This won't work with device tree, and in any case the correct place to manage the GPIOs is in the HDMI driver. This patch moves the handling of the GPIOs to the HDMI driver. The GPIO handling is moved to the common hdmi.c file, and this probably needs to be revisited when adding OMAP5 HDMI support to see if the GPIO handling needs to be moved to IP specific files. Signed-off-by: Tomi Valkeinen Acked-by: Tony Lindgren --- drivers/video/omap2/dss/hdmi.c | 75 +++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 20 deletions(-) (limited to 'drivers/video/omap2/dss/hdmi.c') diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index 0cdf24673d48..4fbe27191de5 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c @@ -32,6 +32,7 @@ #include #include #include +#include #include