staging: olpc_dcon: add config options for XO_1 and XO_1_5, drop hardcoded XO-1 stuff
authorAndres Salomon <dilinger@queued.net>
Fri, 11 Feb 2011 01:53:24 +0000 (17:53 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 18 Feb 2011 20:33:21 +0000 (12:33 -0800)
This adds CONFIG_FB_OLPC_DCON_1 and CONFIG_FB_OLPC_DCON_1_5 options for
allowing selection of XO-1 and/or XO-1.5 DCON support.  In the process,
it also forces the xo_1.c and xo_1_5.c files to build as separate units,
correctly selects between XO-1 and XO-1.5 at runtime, and adds some
hacks to allow xo_1_5.c to build.

This isn't the cleanest patch, but it'll get better as more global
variables are dropped.

Signed-off-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/olpc_dcon/Kconfig
drivers/staging/olpc_dcon/Makefile
drivers/staging/olpc_dcon/olpc_dcon.c
drivers/staging/olpc_dcon/olpc_dcon.h
drivers/staging/olpc_dcon/olpc_dcon_xo_1.c
drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c

index 8be87166b54b1940f1cf8f067a8136bf0c00bda7..982273cf354fb276b76edfc75e516c143acc7dfb 100644 (file)
@@ -6,3 +6,23 @@ config FB_OLPC_DCON
          Add support for the OLPC XO DCON controller.  This controller is
          only available on OLPC platforms.   Unless you have one of these
          platforms, you will want to say 'N'.
+
+config FB_OLPC_DCON_1
+       bool "OLPC XO-1 DCON support"
+       depends on FB_OLPC_DCON
+       default y
+       ---help---
+         Enable support for the DCON in XO-1 model laptops.  The kernel
+         communicates with the DCON using model-specific code.  If you
+         have an XO-1 (or if you're unsure what model you have), you should
+         say 'Y'.
+
+config FB_OLPC_DCON_1_5
+       bool "OLPC XO-1.5 DCON support"
+       depends on FB_OLPC_DCON
+       default y
+       ---help---
+         Enable support for the DCON in XO-1.5 model laptops.  The kernel
+         communicates with the DCON using model-specific code.  If you
+         have an XO-1.5 (or if you're unsure what model you have), you
+         should say 'Y'.
index cd8f2898947d59510563de42360ec87bd18b5950..36c7e67fec20c7ed20a2329c681bd6a9f896096c 100644 (file)
@@ -1 +1,6 @@
-obj-$(CONFIG_FB_OLPC_DCON)     += olpc_dcon.o
+olpc-dcon-objs += olpc_dcon.o
+olpc-dcon-$(CONFIG_FB_OLPC_DCON_1)     += olpc_dcon_xo_1.o
+olpc-dcon-$(CONFIG_FB_OLPC_DCON_1_5)   += olpc_dcon_xo_1_5.o
+obj-$(CONFIG_FB_OLPC_DCON)     += olpc-dcon.o
+
+
index 52b7b306a575f0f41c1e835de9ff1dcc292c4278..96b6fd26791b641c52653b0e019d6e27f923967a 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright © 2006-2007  Red Hat, Inc.
  * Copyright © 2006-2007  Advanced Micro Devices, Inc.
  * Copyright © 2009       VIA Technology, Inc.
- * Copyright (c) 2010  Andres Salomon <dilinger@queued.net>
+ * Copyright (c) 2010-2011  Andres Salomon <dilinger@queued.net>
  *
  * This program is free software.  You can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public
@@ -44,13 +44,6 @@ module_param(noinit, int, 0444);
 static int useaa = 1;
 module_param(useaa, int, 0444);
 
-struct dcon_platform_data {
-       int (*init)(void);
-       void (*bus_stabilize_wiggle)(void);
-       void (*set_dconload)(int);
-       u8 (*read_status)(void);
-};
-
 static struct dcon_platform_data *pdata;
 
 struct dcon_priv {
@@ -73,8 +66,6 @@ struct dcon_priv {
 
 /* I2C structures */
 
-static struct i2c_driver dcon_driver;
-
 /* Platform devices */
 static struct platform_device *dcon_device;
 
@@ -82,10 +73,10 @@ static struct platform_device *dcon_device;
 static struct backlight_device *dcon_bl_dev;
 
 /* Current source, initialized at probe time */
-static int dcon_source;
+int dcon_source;
 
 /* Desired source */
-static int dcon_pending;
+int dcon_pending;
 
 /* Variables used during switches */
 static int dcon_switched;
@@ -693,6 +684,9 @@ static int dcon_probe(struct i2c_client *client, const struct i2c_device_id *id)
        struct dcon_priv *dcon;
        int rc, i, j;
 
+       if (!pdata)
+               return -ENXIO;
+
        dcon = kzalloc(sizeof(*dcon), GFP_KERNEL);
        if (!dcon)
                return -ENOMEM;
@@ -830,7 +824,7 @@ static int dcon_resume(struct i2c_client *client)
 #endif
 
 
-static irqreturn_t dcon_interrupt(int irq, void *id)
+irqreturn_t dcon_interrupt(int irq, void *id)
 {
        int status = pdata->read_status();
 
@@ -877,7 +871,7 @@ static const struct i2c_device_id dcon_idtable[] = {
 
 MODULE_DEVICE_TABLE(i2c, dcon_idtable);
 
-static struct i2c_driver dcon_driver = {
+struct i2c_driver dcon_driver = {
        .driver = {
                .name   = "olpc_dcon",
        },
@@ -893,11 +887,17 @@ static struct i2c_driver dcon_driver = {
 #endif
 };
 
-#include "olpc_dcon_xo_1.c"
-
 static int __init olpc_dcon_init(void)
 {
-       pdata = &dcon_pdata_xo_1;
+#ifdef CONFIG_FB_OLPC_DCON_1_5
+       /* XO-1.5 */
+       if (olpc_board_at_least(olpc_board(0xd0)))
+               pdata = &dcon_pdata_xo_1_5;
+#endif
+#ifdef CONFIG_FB_OLPC_DCON_1
+       if (!pdata)
+               pdata = &dcon_pdata_xo_1;
+#endif
 
        return i2c_add_driver(&dcon_driver);
 }
index cef2473bccf3ef6302222b041bde87b29eb503a8..03ac42c5e3ca6a9bd7fef7e7434a75fe9f0cff95 100644 (file)
 /* Interrupt */
 #define DCON_IRQ                6
 
+struct dcon_platform_data {
+       int (*init)(void);
+       void (*bus_stabilize_wiggle)(void);
+       void (*set_dconload)(int);
+       u8 (*read_status)(void);
+};
+
+#include <linux/interrupt.h>
+
+extern int dcon_source;
+extern int dcon_pending;
+extern irqreturn_t dcon_interrupt(int irq, void *id);
+extern struct i2c_driver dcon_driver;
+
+#ifdef CONFIG_FB_OLPC_DCON_1
+extern struct dcon_platform_data dcon_pdata_xo_1;
+#endif
+
+#ifdef CONFIG_FB_OLPC_DCON_1_5
+extern struct dcon_platform_data dcon_pdata_xo_1_5;
+#endif
+
 #endif
index 043198dc6ff79616d70298c800b2d4f500f6b8b2..be52b6c9c50e3c017a3da7747498c5041521d912 100644 (file)
@@ -195,7 +195,7 @@ static u8 dcon_read_status_xo_1(void)
        return status;
 }
 
-static struct dcon_platform_data dcon_pdata_xo_1 = {
+struct dcon_platform_data dcon_pdata_xo_1 = {
        .init = dcon_init_xo_1,
        .bus_stabilize_wiggle = dcon_wiggle_xo_1,
        .set_dconload = dcon_set_dconload_1,
index 5ef05406a8b8c50adbe9d8a0312e70da969ba123..d4c2d7482c327f825fd102d1be842b9727627268 100644 (file)
@@ -7,6 +7,20 @@
  */
 
 #include <linux/acpi.h>
+#include <linux/pci.h>
+#include <linux/gpio.h>
+#include <asm/olpc.h>
+
+/* TODO: this eventually belongs in linux/vx855.h */
+#define NR_VX855_GPI    14
+#define NR_VX855_GPO    13
+#define NR_VX855_GPIO   15
+
+#define VX855_GPI(n)    (n)
+#define VX855_GPO(n)    (NR_VX855_GPI + (n))
+#define VX855_GPIO(n)   (NR_VX855_GPI + NR_VX855_GPO + (n))
+
+#include "olpc_dcon.h"
 
 /* Hardware setup on the XO 1.5:
  *     DCONLOAD connects to
@@ -26,8 +40,6 @@
 
 #define PREFIX "OLPC DCON:"
 
-static struct dcon_platform_data dcon_pdata_xo_1_5;
-
 static void dcon_clear_irq(void)
 {
        /* irq status will appear in PMIO_Rx50[6] (RW1C) on gpio12 */
@@ -173,7 +185,7 @@ static u8 dcon_read_status_xo_1_5(void)
        return status;
 }
 
-static struct dcon_platform_data dcon_pdata_xo_1_5 = {
+struct dcon_platform_data dcon_pdata_xo_1_5 = {
        .init = dcon_init_xo_1_5,
        .bus_stabilize_wiggle = dcon_wiggle_xo_1_5,
        .set_dconload = dcon_set_dconload_xo_1_5,