Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 097cd83a authored by Andres Salomon's avatar Andres Salomon Committed by Greg Kroah-Hartman
Browse files

staging: olpc_dcon: add config options for XO_1 and XO_1_5, drop hardcoded XO-1 stuff



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: default avatarAndres Salomon <dilinger@queued.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8f2fb16a
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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'.
+6 −1
Original line number Diff line number Diff line
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

+17 −17
Original line number Diff line number Diff line
@@ -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)
{
#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);
}
+22 −0
Original line number Diff line number Diff line
@@ -44,4 +44,26 @@
/* 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
+1 −1
Original line number Diff line number Diff line
@@ -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,
Loading