From c96b850a977e3b7018c5ef1b145a3c11cb160265 Mon Sep 17 00:00:00 2001 From: mokopatches Date: Wed, 16 Jul 2008 14:44:50 +0100 Subject: [PATCH] pcf50633-suspend-hacks.patch --- drivers/i2c/chips/pcf50633.c | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c index 5488084..0cf5e53 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -567,8 +567,26 @@ static void pcf50633_work(struct work_struct *work) */ ret = i2c_smbus_read_i2c_block_data(&pcf->client, PCF50633_REG_INT1, 5, pcfirq); - if (ret != 5) - DEBUGP("Oh crap PMU IRQ register read failed %d\n", ret); + if (ret != 5) { + DEBUGP("Oh crap PMU IRQ register read failed -- " + "retrying later %d\n", ret); + /* + * this situation can happen during resume, just defer + * handling the interrupt until enough I2C is up we can + * actually talk to the PMU. We can't just ignore this + * because we are on a falling edge interrupt and our + * PMU interrupt source does not clear until we read these + * interrupt source registers. + */ + if (!schedule_work(&pcf->work) && !pcf->working) + dev_dbg(&pcf->client.dev, "work item may be lost\n"); + + /* we don't put the device here, hold it for next time */ + mutex_unlock(&pcf->working_lock); + /* don't spew, delaying whatever else is happening */ + msleep(1); + return; + } if (!pcf->coldplug_done) { DEBUGP("PMU Coldplug init\n"); -- 1.5.6.3