viafb: Automatic OLPC XO-1.5 configuration
authorDaniel Drake <dsd@laptop.org>
Tue, 10 May 2011 21:34:11 +0000 (22:34 +0100)
committerFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Wed, 11 May 2011 07:27:37 +0000 (07:27 +0000)
Currently, a long set of viafb options are needed to get the XO-1.5
laptop to output video (there is only 1 configuration that works, that
can't really be autodetected).

This patch automatically detects and configures viafb for the XO-1.5
laptop, meaning all that is required for working display is that
viafb is loaded.

Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
drivers/video/via/viafbdev.c

index eace9a4..3114a87 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/slab.h>
 #include <linux/stat.h>
 #include <linux/via-core.h>
+#include <asm/olpc.h>
 
 #define _MASTER_FILE
 #include "global.h"
@@ -1011,8 +1012,13 @@ static int __init parse_active_dev(void)
        /*    Note: The previous of active_dev is primary device,
           and the following is secondary device. */
        if (!viafb_active_dev) {
-               viafb_CRT_ON = STATE_ON;
-               viafb_SAMM_ON = STATE_OFF;
+               if (machine_is_olpc()) { /* LCD only */
+                       viafb_LCD_ON = STATE_ON;
+                       viafb_SAMM_ON = STATE_OFF;
+               } else {
+                       viafb_CRT_ON = STATE_ON;
+                       viafb_SAMM_ON = STATE_OFF;
+               }
        } else if (!strcmp(viafb_active_dev, "CRT+DVI")) {
                /* CRT+DVI */
                viafb_CRT_ON = STATE_ON;
@@ -1665,8 +1671,13 @@ static int parse_mode(const char *str, u32 *xres, u32 *yres)
        char *ptr;
 
        if (!str) {
-               *xres = 640;
-               *yres = 480;
+               if (machine_is_olpc()) {
+                       *xres = 1200;
+                       *yres = 900;
+               } else {
+                       *xres = 640;
+                       *yres = 480;
+               }
                return 0;
        }
 
@@ -1922,11 +1933,16 @@ void __devexit via_fb_pci_remove(struct pci_dev *pdev)
 }
 
 #ifndef MODULE
-static int __init viafb_setup(char *options)
+static int __init viafb_setup(void)
 {
        char *this_opt;
+       char *options;
+
        DEBUG_MSG(KERN_INFO "viafb_setup!\n");
 
+       if (fb_get_options("viafb", &options))
+               return -ENODEV;
+
        if (!options || !*options)
                return 0;
 
@@ -2000,11 +2016,16 @@ static int __init viafb_setup(char *options)
 int __init viafb_init(void)
 {
        u32 dummy_x, dummy_y;
+       int r;
+
+       if (machine_is_olpc())
+               /* Apply XO-1.5-specific configuration. */
+               viafb_lcd_panel_id = 23;
+
 #ifndef MODULE
-       char *option = NULL;
-       if (fb_get_options("viafb", &option))
-               return -ENODEV;
-       viafb_setup(option);
+       r = viafb_setup();
+       if (r < 0)
+               return r;
 #endif
        if (parse_mode(viafb_mode, &dummy_x, &dummy_y)
                || !viafb_get_mode(dummy_x, dummy_y)