On Mon, Jul 28, 2008 at 5:23 PM, Ben Dooks <[EMAIL PROTECTED]> wrote:
> On Sun, Jul 27, 2008 at 02:41:54PM +0800, Bryan Wu wrote:
>> From: Michael Hennerich <[EMAIL PROTECTED]>
>>
>> PM_SUSPEND_MEM: Blackfin does not maintain register state through
>> Hibernate. Save and restore peripheral base initialization during
>> PM transitions.
>>
>> Signed-off-by: Michael Hennerich <[EMAIL PROTECTED]>
>> Signed-off-by: Bryan Wu <[EMAIL PROTECTED]>
>> ---
>>  drivers/i2c/busses/i2c-bfin-twi.c |   35 ++++++++++++++++++++++++-----------
>>  1 files changed, 24 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-bfin-twi.c 
>> b/drivers/i2c/busses/i2c-bfin-twi.c
>> index 48d084b..3c855ff 100644
>> --- a/drivers/i2c/busses/i2c-bfin-twi.c
>> +++ b/drivers/i2c/busses/i2c-bfin-twi.c
>> @@ -49,6 +49,8 @@ struct bfin_twi_iface {
>>       struct i2c_msg          *pmsg;
>>       int                     msg_num;
>>       int                     cur_msg;
>> +     u16                     saved_clkdiv;
>> +     u16                     saved_control;
>>       void __iomem            *regs_base;
>>  };
>>
>> @@ -565,32 +567,43 @@ static u32 bfin_twi_functionality(struct i2c_adapter 
>> *adap)
>>              I2C_FUNC_I2C;
>>  }
>>
>> -
>>  static struct i2c_algorithm bfin_twi_algorithm = {
>>       .master_xfer   = bfin_twi_master_xfer,
>>       .smbus_xfer    = bfin_twi_smbus_xfer,
>>       .functionality = bfin_twi_functionality,
>>  };
>>
>> -
>> -static int i2c_bfin_twi_suspend(struct platform_device *dev, pm_message_t 
>> state)
>> +static int i2c_bfin_twi_suspend(struct platform_device *pdev, pm_message_t 
>> state)
>>  {
>> -     struct bfin_twi_iface *iface = platform_get_drvdata(dev);
>> +     struct bfin_twi_iface *iface = platform_get_drvdata(pdev);
>> +
>> +     iface->saved_clkdiv = read_CLKDIV(iface);
>> +     iface->saved_control = read_CONTROL(iface);
>> +
>> +     free_irq(iface->irq, iface);
>>
>>       /* Disable TWI */
>> -     write_CONTROL(iface, read_CONTROL(iface) & ~TWI_ENA);
>> -     SSYNC();
>> +     write_CONTROL(iface, iface->saved_control & ~TWI_ENA);
>
> I assume removing the SSYNC() call is valid?
>

Yes, I think it is OK for that. We tested on our platform.
Actually, keeping the SSYNC() is not a big deal for this driver.
How do you think Michael?

>>       return 0;
>>  }
>>
>> -static int i2c_bfin_twi_resume(struct platform_device *dev)
>> +static int i2c_bfin_twi_resume(struct platform_device *pdev)
>>  {
>> -     struct bfin_twi_iface *iface = platform_get_drvdata(dev);
>> +     struct bfin_twi_iface *iface = platform_get_drvdata(pdev);
>>
>> -     /* Enable TWI */
>> -     write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
>> -     SSYNC();
>> +     int rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
>> +             IRQF_DISABLED, pdev->name, iface);
>> +     if (rc) {
>> +             dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq);
>> +             return -ENODEV;
>> +     }
>> +
>> +     /* Resume TWI interface clock as specified */
>> +     write_CLKDIV(iface, iface->saved_clkdiv);
>> +
>> +     /* Resume TWI */
>> +     write_CONTROL(iface, iface->saved_control);
>>
>>       return 0;
>>  }
>> --
>> 1.5.6
>
> if removing the SSYNC() call is ok, then I'll queue this into
> my tree which I will be requesting a pull asap.
>

Thanks lot, I'd like to see that.
-Bryan

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c

Reply via email to