diff mbox

i915: Skip wrong TV outputs on HP laptop

Message ID 20100421080146.GA30452@zhen-devel.sh.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhenyu Wang April 21, 2010, 8:01 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 081cb90..a96a14f 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1612,6 +1612,71 @@  static int tv_is_present_in_vbt(struct drm_device *dev)
 	return ret;
 }
 
+struct intel_tv_quirk {
+	int pci_device;
+	int subsys_vendor;
+	int subsys_device;
+};
+
+struct intel_tv_quirk intel_tv_quirk_list[] = {
+	/* Clevo M720R has no tv output */
+	{ 0x2a02, 0x1558, 0x0721 },
+	/* Dell Latitude X1 */
+	{ 0x2592, 0x1028, 0x01a3 },
+	/* Dell Latitude X1 / D630 (LP: #197740) */
+	{ 0x2592, 0x1028, 0x01f9 },
+	/* Dell XPS 1330 */
+	{ 0x2a02, 0x1028, 0x0209 },
+	/* Dell Inspiron 1535 */
+	{ 0x2a02, 0x1028, 0x0254 },
+	/* Dell Inspiron 1735 */
+	{ 0x2a02, 0x1028, 0x0256 },
+	/* Dell Inspiron 1318 */
+	{ 0x2a02, 0x1028, 0x0286 },
+	/* Dell Vostro A840 (LP: #235155) */
+	{ 0x2a02, 0x1028, 0x0298 },
+	/* Lenovo 3000 v200 */
+	{ 0x2a02, 0x17aa, 0x3c18 },
+	/* Panasonic Toughbook CF-Y4 has no TV output */
+	{ 0x2592, 0x10f7, 0x8338 },
+	/* Panasonic Toughbook CF-Y7 has no TV output */
+	{ 0x2a02, 0x10f7, 0x8338 },
+	/* Toshiba Satellite U300 has no TV output */
+	{ 0x2a02, 0x1179, 0xff50 },
+	/* Samsung Q35 has no TV output */
+	{ 0x27a2, 0x144d, 0xc504 },
+	/* Samsung Q45 has no TV output */
+	{ 0x2a02, 0x144d, 0xc510 },
+	/* HP Compaq nx6110 has no TV output */
+	{ 0x2592, 0x103c, 0x099c },
+	/* HP Compaq nx6310 has no TV output */
+	{ 0x27a2, 0x103c, 0x30aa },
+	/* HP Compaq 6730s has no TV output */
+	{ 0x2a42, 0x103c, 0x30e8 },
+	/* Ordi Enduro UW31 (See LP: #152416) */
+	{ 0x27a2, 0x1584, 0x9900 },
+	/* Littlebit Sepia X35 (rebranded Asus Z37E) (See LP: #201257) */
+	{ 0x2a02, 0x1043, 0x8265 },
+	/* end mark */
+	{ 0, 0, 0 }
+};
+
+static bool
+intel_tv_check(struct drm_device *dev)
+{
+	struct pci_dev *pdev = dev->pdev;
+	struct intel_tv_quirk *q = intel_tv_quirk_list;
+
+	while (q && q->pci_device) {
+		if (q->pci_device == dev->pci_device &&
+		    q->subsys_vendor == pdev->subsystem_vendor &&
+		    q->subsys_device == pdev->subsystem_device)
+			return true;
+		++q;
+	}
+	return false;
+}
+
 void
 intel_tv_init(struct drm_device *dev)
 {
@@ -1635,6 +1700,10 @@  intel_tv_init(struct drm_device *dev)
 	if (!dev_priv->int_tv_support)
 		return;
 
+	/* No real TV output quirks */
+	if (intel_tv_check(dev))
+		return;
+
 	/*
 	 * Sanity check the TV output by checking to see if the
 	 * DAC register holds a value