Perfect, thank you! Acked-by: Andres Salomon <dilinger@xxxxxxxxxx> On Thu, 1 Dec 2011 19:54:55 -0500 Xi Wang <xi.wang@xxxxxxxxx> wrote: > Change ->read_status() by separating the error handling and the > status bits. This also fixes a signedness bug in dcon_interrupt(). > > Signed-off-by: Xi Wang <xi.wang@xxxxxxxxx> > Cc: Andres Salomon <dilinger@xxxxxxxxxx> > --- > drivers/staging/olpc_dcon/olpc_dcon.c | 4 ++-- > drivers/staging/olpc_dcon/olpc_dcon.h | 2 +- > drivers/staging/olpc_dcon/olpc_dcon_xo_1.c | 10 ++++------ > drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c | 10 ++++------ > 4 files changed, 11 insertions(+), 15 deletions(-) > > diff --git a/drivers/staging/olpc_dcon/olpc_dcon.c > b/drivers/staging/olpc_dcon/olpc_dcon.c index af24ddf..c379bba 100644 > --- a/drivers/staging/olpc_dcon/olpc_dcon.c > +++ b/drivers/staging/olpc_dcon/olpc_dcon.c > @@ -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) == -1) > return IRQ_NONE; > > switch (status & 3) { > diff --git a/drivers/staging/olpc_dcon/olpc_dcon.h > b/drivers/staging/olpc_dcon/olpc_dcon.h index 0264c94..167a417 100644 > --- a/drivers/staging/olpc_dcon/olpc_dcon.h > +++ b/drivers/staging/olpc_dcon/olpc_dcon.h > @@ -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> > diff --git a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c > b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c index 2245213..cb6ce0c > 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c > +++ b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c > @@ -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 = { > diff --git a/drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c > b/drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c index a6a6cf2..69415ee > 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c > +++ b/drivers/staging/olpc_dcon/olpc_dcon_xo_1_5.c > @@ -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 = { _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel