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: Xi Wang <xi.wang@gmail.com>
Acked-by: Andres Salomon <dilinger@queued.net>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Xi Wang 2011-12-02 16:28:43 -05:00 committed by Greg Kroah-Hartman
parent fb927284e4
commit 91762057f4
4 changed files with 11 additions and 15 deletions

View File

@ -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) {

View File

@ -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>

View File

@ -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 = {

View File

@ -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 = {