All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dzianis Kahanovich <mahatma@bspu.unibel.by>
To: linux-fbdev@vger.kernel.org
Subject: [PATCH] (new way) I2C/DDC defaults & I2C/DDC detection for VIA framebuffer.
Date: Wed, 08 Dec 2010 15:30:15 +0000	[thread overview]
Message-ID: <4CFFA487.5020003@bspu.unibel.by> (raw)

I2C/DDC defaults & I2C/DDC detection for VIA framebuffer.

Adding defaults & legacy I2C/DDC support for VIA framebuffer.
Detecting legacy I2C/DDC outputs (if undetected else) and
set autodetected defaults on empty "viafb_active_dev".

Signed-off-by: Dzianis Kahanovich <mahatma@eu.by>
---
diff -pruN a/viafbdev.c c/viafbdev.c
--- a/drivers/video/via/viafbdev.c	2010-12-07 18:35:22.000000000 +0200
+++ c/drivers/video/via/viafbdev.c	2010-12-08 17:15:54.000000000 +0200
@@ -1485,6 +1485,123 @@ static int parse_mode(const char *str, u
 	return 0;
 }

+/* stage=0: count devices to set dual and/or SAMM;
+   stage=1: add devices, detected only via i2c legacy;
+   set LCD/DVI/CRT if viafb_active_dev unset */
+static void viafb_detect_dev(int stage, struct viafb_dev *vdev)
+{
+	u8 *edid;
+	struct fb_var_screeninfo var;
+	int i, t, ndev = 0;
+	struct i2c_adapter *adapter;
+	struct lvds_setting_information *inf;
+
+	/* FIXME: viaparinfo1->chip_info looks equal to viaparinfo */
+	i = !viafb_active_dev && stage;
+	if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name) {
+		ndev++;
+		if (i)
+			viafb_DVI_ON = STATE_ON;
+	}
+	if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
+		ndev++;
+		if (i)
+			viafb_LCD_ON = STATE_ON;
+	}
+	if (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
+		ndev++;
+		if (i)
+			viafb_LCD2_ON = STATE_ON;
+	}
+	/* enabling CRT in textmode is at least no bad */
+	if (viafb_CRT_ON) {
+		ndev++;
+		viafb_crt_enable();
+	}
+	for (i = 0; i < VIAFB_NUM_PORTS; i++) {
+		t = vdev->port_cfg[i].type;
+		/* detect only i2c ports, undetected in other places */
+		if ((viaparinfo && viaparinfo->chip_info && (
+		    (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name &&
+		    viaparinfo->chip_info->tmds_chip_info.i2c_port = t) ||
+		    (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name &&
+		    viaparinfo->chip_info->lvds_chip_info.i2c_port = t) ||
+		    (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name &&
+		    viaparinfo->chip_info->lvds_chip_info2.i2c_port = t)
+		    )) || (viaparinfo1 && viaparinfo1->chip_info && (
+		    (viaparinfo1->chip_info->tmds_chip_info.tmds_chip_name &&
+		    viaparinfo1->chip_info->tmds_chip_info.i2c_port = t) ||
+		    (viaparinfo1->chip_info->lvds_chip_info.lvds_chip_name &&
+		    viaparinfo1->chip_info->lvds_chip_info.i2c_port = t) ||
+		    (viaparinfo1->chip_info->lvds_chip_info2.lvds_chip_name &&
+		    viaparinfo1->chip_info->lvds_chip_info2.i2c_port = t)
+		    )) || !(adapter = viafb_find_i2c_adapter(i)) ||
+		    !(edid = fb_ddc_read(adapter)))
+			continue;
+		memset(&var, 0, sizeof(var));
+		if (fb_parse_edid(edid, &var))
+			goto free_edid;
+		if (!viafb_active_dev)
+			printk(KERN_INFO "viafb: %48s\n", adapter->name);
+		if (!stage) {
+			inf = NULL;
+		} else if (!viafb_LCD_ON) {
+			fb_edid_to_monspecs(edid, &viafbinfo->monspecs);
+			inf = viaparinfo->lvds_setting_info;
+			if (!viafb_active_dev &&
+			    (viafbinfo->monspecs.input & FB_DISP_DDI))
+				viafb_LCD_ON = STATE_ON;
+		} else if (viafb_LCD2_ON) {
+			/* ??? */
+		} else if (viafb_dual_fb) {
+			fb_edid_to_monspecs(edid, &viafbinfo1->monspecs);
+			inf = viaparinfo1->lvds_setting_info;
+			if (!viafb_active_dev &&
+			    (viafbinfo1->monspecs.input & FB_DISP_DDI))
+				viafb_LCD2_ON = STATE_ON;
+		} else {
+			fb_edid_to_monspecs(edid, &viafbinfo->monspecs);
+			inf = viaparinfo->lvds_setting_info2;
+			if (!viafb_active_dev &&
+			    (viafbinfo->monspecs.input & FB_DISP_DDI))
+				viafb_LCD2_ON = STATE_ON;
+		}
+		if (inf) {
+			if (var.xres)
+				inf->lcd_panel_hres = var.xres;
+			if (var.yres)
+				inf->lcd_panel_vres = var.yres;
+		}
+		ndev++;
+free_edid:
+		kfree(edid);
+	}
+	if (!viafb_active_dev) {
+		/* SAMM on Chrome9 LCD+CRT is wrong here
+		   then keep CRT OFF & dual detection together */
+#if 1		
+		if (ndev > 1 && viafb_CRT_ON) {
+			viafb_CRT_ON = STATE_OFF;
+			viafb_crt_disable();
+			ndev--;
+		}
+		/* SAMM may be detected on stage 1,
+		   but troubles coming together */
+		if (ndev > 1 && !stage)
+			viafb_SAMM_ON = viafb_dual_fb = STATE_ON;
+#endif
+		if (viafb_DVI_ON)
+			viafb_primary_dev = DVI_Device;
+		else if (viafb_LCD_ON)
+			viafb_primary_dev = LCD_Device;
+		else if (viafb_CRT_ON)
+			viafb_primary_dev = CRT_Device;
+		viafb_DeviceStatus = viafb_primary_dev;
+		if (stage)
+			viafb_set_iga_path();
+	}
+}
+

 int __devinit via_fb_pci_probe(struct viafb_dev *vdev)
 {
@@ -1526,6 +1643,10 @@ int __devinit via_fb_pci_probe(struct vi
 	parse_dvi_port();

 	viafb_init_chip_info(vdev->chip_type);
+	/* detect dual_fb & SAMM_ON, but let's keep it to options */
+#if 0
+	viafb_detect_dev(0, vdev);
+#endif
 	/*
 	 * The framebuffer will have been successfully mapped by
 	 * the core (or we'd not be here), but we still need to
@@ -1675,6 +1796,8 @@ int __devinit via_fb_pci_probe(struct vi
 	viafb_init_proc(&viaparinfo->shared->proc_entry);
 #endif
 	viafb_init_dac(IGA2);
+	/* update from legacy i2c DDC info */
+	viafb_detect_dev(1, vdev);
 	return 0;

 out_fb_unreg:
diff -pruN a/via_i2c.c c/via_i2c.c
--- a/drivers/video/via/via_i2c.c	2010-12-08 15:12:05.000000000 +0200
+++ c/drivers/video/via/via_i2c.c	2010-11-29 18:04:24.000000000 +0200
@@ -167,7 +167,7 @@ struct i2c_adapter *viafb_find_i2c_adapt
 {
 	struct via_i2c_stuff *stuff = &via_i2c_par[which];

-	return &stuff->adapter;
+	return stuff->is_active ? &stuff->adapter : NULL;
 }
 EXPORT_SYMBOL_GPL(viafb_find_i2c_adapter);

--
PS 0x21 still not working, forcing DVP1 on my 0x31 is wrong idea (visually).
Then I only switch off CRT by default if another device present (to save power
vs. full device capabilities). In theory, iteration for every port is not
required, only i=1, but let it keep so to easy adding new ports. Early enabling
CRT texmode may force (future) DDC detection and no bad to non-fb purposes too.

                 reply	other threads:[~2010-12-08 15:30 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CFFA487.5020003@bspu.unibel.by \
    --to=mahatma@bspu.unibel.by \
    --cc=linux-fbdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.