浏览代码

Merge tag 'fbdev-fixes-for-3.3-2' of git://github.com/schandinat/linux-2.6

fbdev fixes for 3.3 from Florian Tobias Schandinat

It includes:
 - two fixes for OMAP HDMI
 - one fix to make new OMAP functions behave as they are supposed to
 - one Kconfig dependency fix
 - two fixes for viafb for modesetting on VX900 hardware

* tag 'fbdev-fixes-for-3.3-2' of git://github.com/schandinat/linux-2.6:
  OMAPDSS: APPLY: make ovl_enable/disable synchronous
  OMAPDSS: panel-dvi: Add Kconfig dependency on I2C
  viafb: fix IGA1 modesetting on VX900
  viafb: select HW scaling on VX900 for IGA2
  OMAPDSS: HDMI: hot plug detect fix
  OMAPDSS: HACK: Ensure DSS clock domain gets out of idle when HDMI is enabled
Linus Torvalds 13 年之前
父节点
当前提交
d085a09cf3

+ 1 - 1
drivers/video/omap2/displays/Kconfig

@@ -12,7 +12,7 @@ config PANEL_GENERIC_DPI
 
 
 config PANEL_DVI
 config PANEL_DVI
 	tristate "DVI output"
 	tristate "DVI output"
-	depends on OMAP2_DSS_DPI
+	depends on OMAP2_DSS_DPI && I2C
 	help
 	help
 	  Driver for external monitors, connected via DVI. The driver uses i2c
 	  Driver for external monitors, connected via DVI. The driver uses i2c
 	  to read EDID information from the monitor.
 	  to read EDID information from the monitor.

+ 6 - 0
drivers/video/omap2/dss/apply.c

@@ -1276,6 +1276,9 @@ int dss_ovl_enable(struct omap_overlay *ovl)
 
 
 	spin_unlock_irqrestore(&data_lock, flags);
 	spin_unlock_irqrestore(&data_lock, flags);
 
 
+	/* wait for overlay to be enabled */
+	wait_pending_extra_info_updates();
+
 	mutex_unlock(&apply_lock);
 	mutex_unlock(&apply_lock);
 
 
 	return 0;
 	return 0;
@@ -1313,6 +1316,9 @@ int dss_ovl_disable(struct omap_overlay *ovl)
 
 
 	spin_unlock_irqrestore(&data_lock, flags);
 	spin_unlock_irqrestore(&data_lock, flags);
 
 
+	/* wait for the overlay to be disabled */
+	wait_pending_extra_info_updates();
+
 	mutex_unlock(&apply_lock);
 	mutex_unlock(&apply_lock);
 
 
 	return 0;
 	return 0;

+ 23 - 1
drivers/video/omap2/dss/hdmi.c

@@ -165,9 +165,25 @@ static int hdmi_runtime_get(void)
 
 
 	DSSDBG("hdmi_runtime_get\n");
 	DSSDBG("hdmi_runtime_get\n");
 
 
+	/*
+	 * HACK: Add dss_runtime_get() to ensure DSS clock domain is enabled.
+	 * This should be removed later.
+	 */
+	r = dss_runtime_get();
+	if (r < 0)
+		goto err_get_dss;
+
 	r = pm_runtime_get_sync(&hdmi.pdev->dev);
 	r = pm_runtime_get_sync(&hdmi.pdev->dev);
 	WARN_ON(r < 0);
 	WARN_ON(r < 0);
-	return r < 0 ? r : 0;
+	if (r < 0)
+		goto err_get_hdmi;
+
+	return 0;
+
+err_get_hdmi:
+	dss_runtime_put();
+err_get_dss:
+	return r;
 }
 }
 
 
 static void hdmi_runtime_put(void)
 static void hdmi_runtime_put(void)
@@ -178,6 +194,12 @@ static void hdmi_runtime_put(void)
 
 
 	r = pm_runtime_put_sync(&hdmi.pdev->dev);
 	r = pm_runtime_put_sync(&hdmi.pdev->dev);
 	WARN_ON(r < 0);
 	WARN_ON(r < 0);
+
+	/*
+	 * HACK: This is added to complement the dss_runtime_get() call in
+	 * hdmi_runtime_get(). This should be removed later.
+	 */
+	dss_runtime_put();
 }
 }
 
 
 int hdmi_init_display(struct omap_dss_device *dssdev)
 int hdmi_init_display(struct omap_dss_device *dssdev)

+ 1 - 8
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c

@@ -479,14 +479,7 @@ int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data,
 
 
 bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data)
 bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data)
 {
 {
-	int r;
-
-	void __iomem *base = hdmi_core_sys_base(ip_data);
-
-	/* HPD */
-	r = REG_GET(base, HDMI_CORE_SYS_SYS_STAT, 1, 1);
-
-	return r == 1;
+	return gpio_get_value(ip_data->hpd_gpio);
 }
 }
 
 
 static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
 static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,

+ 4 - 0
drivers/video/via/hw.c

@@ -1810,7 +1810,11 @@ static void hw_init(void)
 		break;
 		break;
 	}
 	}
 
 
+	/* magic required on VX900 for correct modesetting on IGA1 */
+	via_write_reg_mask(VIACR, 0x45, 0x00, 0x01);
+
 	/* probably this should go to the scaling code one day */
 	/* probably this should go to the scaling code one day */
+	via_write_reg_mask(VIACR, 0xFD, 0, 0x80); /* VX900 hw scale on IGA2 */
 	viafb_write_regx(scaling_parameters, ARRAY_SIZE(scaling_parameters));
 	viafb_write_regx(scaling_parameters, ARRAY_SIZE(scaling_parameters));
 
 
 	/* Fill VPIT Parameters */
 	/* Fill VPIT Parameters */