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

Commit 91762057 authored by Xi Wang's avatar Xi Wang Committed by Greg Kroah-Hartman
Browse files

staging: olpc_dcon: ->read_status() API change



Change ->read_status() by separating the error handling and the
status bits.  This also fixes a signedness bug in dcon_interrupt()
that would break the error handling.

Signed-off-by: default avatarXi Wang <xi.wang@gmail.com>
Acked-by: default avatarAndres Salomon <dilinger@queued.net>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fb927284
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -755,9 +755,9 @@ static int dcon_resume(struct i2c_client *client)
irqreturn_t dcon_interrupt(int irq, void *id)
{
	struct dcon_priv *dcon = id;
	int status = pdata->read_status();
	u8 status;

	if (status == -1)
	if (pdata->read_status(&status))
		return IRQ_NONE;

	switch (status & 3) {
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ struct dcon_platform_data {
	int (*init)(struct dcon_priv *);
	void (*bus_stabilize_wiggle)(void);
	void (*set_dconload)(int);
	u8 (*read_status)(void);
	int (*read_status)(u8 *);
};

#include <linux/interrupt.h>
+4 −6
Original line number Diff line number Diff line
@@ -183,17 +183,15 @@ static void dcon_set_dconload_1(int val)
	gpio_set_value(OLPC_GPIO_DCON_LOAD, val);
}

static u8 dcon_read_status_xo_1(void)
static int dcon_read_status_xo_1(u8 *status)
{
	u8 status;

	status = gpio_get_value(OLPC_GPIO_DCON_STAT0);
	status |= gpio_get_value(OLPC_GPIO_DCON_STAT1) << 1;
	*status = gpio_get_value(OLPC_GPIO_DCON_STAT0);
	*status |= gpio_get_value(OLPC_GPIO_DCON_STAT1) << 1;

	/* Clear the negative edge status for GPIO7 */
	cs5535_gpio_set(OLPC_GPIO_DCON_IRQ, GPIO_NEGATIVE_EDGE_STS);

	return status;
	return 0;
}

struct dcon_platform_data dcon_pdata_xo_1 = {
+4 −6
Original line number Diff line number Diff line
@@ -167,20 +167,18 @@ static void dcon_set_dconload_xo_1_5(int val)
	gpio_set_value(VX855_GPIO(1), val);
}

static u8 dcon_read_status_xo_1_5(void)
static int dcon_read_status_xo_1_5(u8 *status)
{
	u8 status;

	if (!dcon_was_irq())
		return -1;

	/* i believe this is the same as "inb(0x44b) & 3" */
	status = gpio_get_value(VX855_GPI(10));
	status |= gpio_get_value(VX855_GPI(11)) << 1;
	*status = gpio_get_value(VX855_GPI(10));
	*status |= gpio_get_value(VX855_GPI(11)) << 1;

	dcon_clear_irq();

	return status;
	return 0;
}

struct dcon_platform_data dcon_pdata_xo_1_5 = {