[PATCH] i810fb: Do not probe the third i2c bus by default
authorManuel Lauss <mano@roarinelk.homelinux.net>
Wed, 1 Feb 2006 11:06:54 +0000 (03:06 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 1 Feb 2006 16:53:27 +0000 (08:53 -0800)
Some time before 2.6.15, a third DDC channel was added to i810fb.  On
systems where these ddc pins are not connected, the probe takes about 10
seconds.

Add a boot/module option for i810fb to explicitly probe for the 3rd ddc bus
if needed.

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/video/i810/i810-i2c.c
drivers/video/i810/i810.h
drivers/video/i810/i810_main.c

index bd410e06db73f1f267071450eba64d23a605a053..e3c8b5f1ca764261f9a89c44ebcc7040399da3c7 100644 (file)
@@ -191,11 +191,11 @@ int i810_probe_i2c_connector(struct fb_info *info, u8 **out_edid, int conn)
         u8 *edid = NULL;
         int i;
 
-       DPRINTK("i810-i2c: Probe DDC%i Bus\n", conn);
-       if (conn < 4) {
+       DPRINTK("i810-i2c: Probe DDC%i Bus\n", conn+1);
+       if (conn < par->ddc_num) {
                for (i = 0; i < 3; i++) {
                        /* Do the real work */
-                       edid = i810_do_probe_i2c_edid(&par->chan[conn-1]);
+                       edid = i810_do_probe_i2c_edid(&par->chan[conn]);
                        if (edid)
                                break;
                }
index 6c187d5fe95170e337ccc09f86457d993d98e207..579195c2bea3030bbd2922158cd3289c683d67cf 100644 (file)
@@ -280,6 +280,7 @@ struct i810fb_par {
        u32 blit_bpp;
        u32 ovract;
        u32 cur_state;
+       u32 ddc_num;
        int mtrr_reg;
        u16 bltcntl;
        u8 interlace;
index 266d0ab926635fe760f646b00dbe8fe974d8124b..d8467c03b49f69d608a7aa506735cfdc5cf53f76 100644 (file)
@@ -149,6 +149,7 @@ static int vyres      __devinitdata;
 static int sync       __devinitdata;
 static int extvga     __devinitdata;
 static int dcolor     __devinitdata;
+static int ddc3       __devinitdata = 2;
 
 /*------------------------------------------------------------*/
 
@@ -1763,6 +1764,8 @@ static void __devinit i810_init_defaults(struct i810fb_par *par,
        if (sync) 
                par->dev_flags |= ALWAYS_SYNC;
 
+       par->ddc_num = ddc3;
+
        if (bpp < 8)
                bpp = 8;
        
@@ -1885,7 +1888,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
        int found = 0;
 #ifdef CONFIG_FB_I810_I2C
        int i;
-       int err;
+       int err = 1;
        struct i810fb_par *par = info->par;
 #endif
 
@@ -1895,8 +1898,8 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
 #ifdef CONFIG_FB_I810_I2C
        i810_create_i2c_busses(par);
 
-       for (i = 0; i < 4; i++) {
-               err = i810_probe_i2c_connector(info, &par->edid, i+1);
+       for (i = 0; i < par->ddc_num + 1; i++) {
+               err = i810_probe_i2c_connector(info, &par->edid, i);
                if (!err)
                        break;
        }
@@ -1983,6 +1986,8 @@ static int __devinit i810fb_setup(char *options)
                        vsync2 = simple_strtoul(this_opt+7, NULL, 0);
                else if (!strncmp(this_opt, "dcolor", 6))
                        dcolor = 1;
+               else if (!strncmp(this_opt, "ddc3", 4))
+                       ddc3 = 3;
                else
                        mode_option = this_opt;
        }
@@ -2190,6 +2195,8 @@ MODULE_PARM_DESC(sync, "wait for accel engine to finish drawing"
 module_param(dcolor, bool, 0);
 MODULE_PARM_DESC(dcolor, "use DirectColor visuals"
                 " (default = 0 = TrueColor)");
+module_param(ddc3, bool, 0);
+MODULE_PARM_DESC(ddc3, "Probe DDC bus 3 (default = 0 = no)");
 module_param(mode_option, charp, 0);
 MODULE_PARM_DESC(mode_option, "Specify initial video mode");