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

Commit 309ef2a2 authored by Andres Salomon's avatar Andres Salomon Committed by Greg Kroah-Hartman
Browse files

staging: olpc_dcon: move more global variables into dcon_priv



Global variables dcon_switched, dcon_irq_time, and dcon_load_time can all be moved
into the dcon_priv struct now that dcon_interrupt has access to dcon_priv.

Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent bbe963f1
Loading
Loading
Loading
Loading
+17 −22
Original line number Diff line number Diff line
@@ -53,11 +53,6 @@ static struct platform_device *dcon_device;
/* Backlight device */
static struct backlight_device *dcon_bl_dev;

/* Variables used during switches */
static int dcon_switched;
static struct timespec dcon_irq_time;
static struct timespec dcon_load_time;

static DECLARE_WAIT_QUEUE_HEAD(dcon_wait_queue);

static unsigned short normal_i2c[] = { 0x0d, I2C_CLIENT_END };
@@ -297,12 +292,12 @@ static void dcon_sleep(struct dcon_priv *dcon, bool sleep)
 * normally we don't change it this fast, so in general we won't
 * delay here.
 */
void dcon_load_holdoff(void)
static void dcon_load_holdoff(struct dcon_priv *dcon)
{
	struct timespec delta_t, now;
	while (1) {
		getnstimeofday(&now);
		delta_t = timespec_sub(now, dcon_load_time);
		delta_t = timespec_sub(now, dcon->load_time);
		if (delta_t.tv_sec != 0 ||
			delta_t.tv_nsec > NSEC_PER_MSEC * 20) {
			break;
@@ -346,9 +341,9 @@ static void dcon_source_switch(struct work_struct *work)
	if (dcon->curr_src == source)
		return;

	dcon_load_holdoff();
	dcon_load_holdoff(dcon);

	dcon_switched = 0;
	dcon->switched = false;

	switch (source) {
	case DCON_SOURCE_CPU:
@@ -361,10 +356,10 @@ static void dcon_source_switch(struct work_struct *work)
		else {
			/* Wait up to one second for the scanline interrupt */
			wait_event_timeout(dcon_wait_queue,
					   dcon_switched == 1, HZ);
					   dcon->switched == true, HZ);
		}

		if (!dcon_switched)
		if (!dcon->switched)
			printk(KERN_ERR "olpc-dcon:  Timeout entering CPU mode; expect a screen glitch.\n");

		/* Turn off the scanline interrupt */
@@ -387,7 +382,7 @@ static void dcon_source_switch(struct work_struct *work)

		/* And turn off the DCON */
		pdata->set_dconload(1);
		getnstimeofday(&dcon_load_time);
		getnstimeofday(&dcon->load_time);

		printk(KERN_INFO "olpc-dcon: The CPU has control\n");
		break;
@@ -403,13 +398,13 @@ static void dcon_source_switch(struct work_struct *work)

		/* Clear DCONLOAD - this implies that the DCON is in control */
		pdata->set_dconload(0);
		getnstimeofday(&dcon_load_time);
		getnstimeofday(&dcon->load_time);

		t = schedule_timeout(HZ/2);
		remove_wait_queue(&dcon_wait_queue, &wait);
		set_current_state(TASK_RUNNING);

		if (!dcon_switched) {
		if (!dcon->switched) {
			printk(KERN_ERR "olpc-dcon: Timeout entering DCON mode; expect a screen glitch.\n");
		} else {
			/* sometimes the DCON doesn't follow its own rules,
@@ -423,14 +418,14 @@ static void dcon_source_switch(struct work_struct *work)
			 * deassert and reassert, and hope for the best.
			 * see http://dev.laptop.org/ticket/9664
			 */
			delta_t = timespec_sub(dcon_irq_time, dcon_load_time);
			if (dcon_switched && delta_t.tv_sec == 0 &&
			delta_t = timespec_sub(dcon->irq_time, dcon->load_time);
			if (dcon->switched && delta_t.tv_sec == 0 &&
					delta_t.tv_nsec < NSEC_PER_MSEC * 20) {
				printk(KERN_ERR "olpc-dcon: missed loading, retrying\n");
				pdata->set_dconload(1);
				mdelay(41);
				pdata->set_dconload(0);
				getnstimeofday(&dcon_load_time);
				getnstimeofday(&dcon->load_time);
				mdelay(41);
			}
		}
@@ -815,8 +810,8 @@ irqreturn_t dcon_interrupt(int irq, void *id)

	case 2:	/* switch to DCON mode */
	case 1: /* switch to CPU mode */
		dcon_switched = 1;
		getnstimeofday(&dcon_irq_time);
		dcon->switched = true;
		getnstimeofday(&dcon->irq_time);
		wake_up(&dcon_wait_queue);
		break;

@@ -828,9 +823,9 @@ irqreturn_t dcon_interrupt(int irq, void *id)
		 * of the DCON happened long before this point.
		 * see http://dev.laptop.org/ticket/9869
		 */
		if (dcon->curr_src != dcon->pending_src && !dcon_switched) {
			dcon_switched = 1;
			getnstimeofday(&dcon_irq_time);
		if (dcon->curr_src != dcon->pending_src && !dcon->switched) {
			dcon->switched = true;
			getnstimeofday(&dcon->irq_time);
			wake_up(&dcon_wait_queue);
			printk(KERN_DEBUG "olpc-dcon: switching w/ status 0/0\n");
		} else {
+5 −0
Original line number Diff line number Diff line
@@ -64,6 +64,11 @@ struct dcon_priv {
	/* Desired source */
	int pending_src;

	/* Variables used during switches */
	bool switched;
	struct timespec irq_time;
	struct timespec load_time;

	/* Current output type; true == mono, false == color */
	bool mono;
	bool asleep;