2012-02-29 10:38:12

by Chenhui Zhao

[permalink] [raw]
Subject: [PATCH] i2c-mpc: avoid I2C abnormal after resuming from deep sleep

When entering deep sleep, the value in the registers I2CFDR and
I2CDFSRR are lost. This causes I2C access to fail after resuming.

Add suspend/resume routines to save/restore the registers
I2CFDR and I2CDFSRR.

Signed-off-by: Zhao Chenhui <[email protected]>
Signed-off-by: Li Yang <[email protected]>
---
drivers/i2c/busses/i2c-mpc.c | 34 +++++++++++++++++++++++++++++++++-
1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index a8ebb84..f95a647 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -1,7 +1,9 @@
/*
* (C) Copyright 2003-2004
* Humboldt Solutions Ltd, [email protected].
-
+ *
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
* This is a combined i2c adapter and algorithm driver for the
* MPC107/Tsi107 PowerPC northbridge and processors that include
* the same I2C unit (8240, 8245, 85xx).
@@ -64,6 +66,9 @@ struct mpc_i2c {
struct i2c_adapter adap;
int irq;
u32 real_clk;
+#ifdef CONFIG_PM
+ u8 fdr, dfsrr;
+#endif
};

struct mpc_i2c_divider {
@@ -668,6 +673,30 @@ static int __devexit fsl_i2c_remove(struct platform_device *op)
return 0;
};

+#ifdef CONFIG_PM
+static int mpc_i2c_suspend(struct device *dev)
+{
+ struct mpc_i2c *i2c = dev_get_drvdata(dev);
+
+ i2c->fdr = readb(i2c->base + MPC_I2C_FDR);
+ i2c->dfsrr = readb(i2c->base + MPC_I2C_DFSRR);
+
+ return 0;
+}
+
+static int mpc_i2c_resume(struct device *dev)
+{
+ struct mpc_i2c *i2c = dev_get_drvdata(dev);
+
+ writeb(i2c->fdr, i2c->base + MPC_I2C_FDR);
+ writeb(i2c->dfsrr, i2c->base + MPC_I2C_DFSRR);
+
+ return 0;
+}
+
+SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume);
+#endif
+
static struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = {
.setup = mpc_i2c_setup_512x,
};
@@ -712,6 +741,9 @@ static struct platform_driver mpc_i2c_driver = {
.owner = THIS_MODULE,
.name = DRV_NAME,
.of_match_table = mpc_i2c_of_match,
+#ifdef CONFIG_PM
+ .pm = &mpc_i2c_pm_ops,
+#endif
},
};

--
1.6.4.1


2012-02-29 13:02:09

by Shubhrajyoti Datta

[permalink] [raw]
Subject: Re: [PATCH] i2c-mpc: avoid I2C abnormal after resuming from deep sleep

Hi Zhao,

On Wed, Feb 29, 2012 at 4:09 PM, Zhao Chenhui
<[email protected]> wrote:
> When entering deep sleep, the value in the registers I2CFDR and
> I2CDFSRR are lost. This causes I2C access to fail after resuming.
>
> Add suspend/resume routines to save/restore the registers
> I2CFDR and I2CDFSRR.
>
> Signed-off-by: Zhao Chenhui <[email protected]>
> Signed-off-by: Li Yang <[email protected]>
> ---
> ?drivers/i2c/busses/i2c-mpc.c | ? 34 +++++++++++++++++++++++++++++++++-
> ?1 files changed, 33 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index a8ebb84..f95a647 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -1,7 +1,9 @@
> ?/*
> ?* (C) Copyright 2003-2004
> ?* Humboldt Solutions Ltd, [email protected].
> -
> + *
> + * Copyright 2012 Freescale Semiconductor, Inc.
> + *
> ?* This is a combined i2c adapter and algorithm driver for the
> ?* MPC107/Tsi107 PowerPC northbridge and processors that include
> ?* the same I2C unit (8240, 8245, 85xx).
> @@ -64,6 +66,9 @@ struct mpc_i2c {
> ? ? ? ?struct i2c_adapter adap;
> ? ? ? ?int irq;
> ? ? ? ?u32 real_clk;
> +#ifdef CONFIG_PM
> + ? ? ? u8 fdr, dfsrr;
How about having a structure here ?
> +#endif
> ?};
>
> ?struct mpc_i2c_divider {
> @@ -668,6 +673,30 @@ static int __devexit fsl_i2c_remove(struct platform_device *op)
> ? ? ? ?return 0;
> ?};
>
> +#ifdef CONFIG_PM
> +static int mpc_i2c_suspend(struct device *dev)
> +{
> + ? ? ? struct mpc_i2c *i2c = dev_get_drvdata(dev);
> +
> + ? ? ? i2c->fdr = readb(i2c->base + MPC_I2C_FDR);
> + ? ? ? i2c->dfsrr = readb(i2c->base + MPC_I2C_DFSRR);
> +
> + ? ? ? return 0;
> +}
> +
> +static int mpc_i2c_resume(struct device *dev)
> +{
> + ? ? ? struct mpc_i2c *i2c = dev_get_drvdata(dev);
> +
> + ? ? ? writeb(i2c->fdr, i2c->base + MPC_I2C_FDR);
> + ? ? ? writeb(i2c->dfsrr, i2c->base + MPC_I2C_DFSRR);
> +
> + ? ? ? return 0;
> +}
> +
> +SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume);
> +#endif
> +
> ?static struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = {
> ? ? ? ?.setup = mpc_i2c_setup_512x,
> ?};
> @@ -712,6 +741,9 @@ static struct platform_driver mpc_i2c_driver = {
> ? ? ? ? ? ? ? ?.owner = THIS_MODULE,
> ? ? ? ? ? ? ? ?.name = DRV_NAME,
> ? ? ? ? ? ? ? ?.of_match_table = mpc_i2c_of_match,
> +#ifdef CONFIG_PM
> + ? ? ? ? ? ? ? .pm = &mpc_i2c_pm_ops,
> +#endif
> ? ? ? ?},
> ?};
>
> --
> 1.6.4.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html

2012-02-29 18:08:57

by Timur Tabi

[permalink] [raw]
Subject: Re: [PATCH] i2c-mpc: avoid I2C abnormal after resuming from deep sleep

On Wed, Feb 29, 2012 at 7:02 AM, Shubhrajyoti Datta
<[email protected]> wrote:
>
>> +#ifdef CONFIG_PM
>> + ? ? ? u8 fdr, dfsrr;

> How about having ?a structure here ?

Why? He's just adding two variables in an existing structure. Adding
a nested structure would unnecessarily complicate things.

--
Timur Tabi
Linux kernel developer at Freescale

2012-02-29 18:45:26

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH] i2c-mpc: avoid I2C abnormal after resuming from deep sleep

Hi,

On Wed, Feb 29, 2012 at 06:39:21PM +0800, Zhao Chenhui wrote:
> When entering deep sleep, the value in the registers I2CFDR and
> I2CDFSRR are lost. This causes I2C access to fail after resuming.
>
> Add suspend/resume routines to save/restore the registers
> I2CFDR and I2CDFSRR.
>
> Signed-off-by: Zhao Chenhui <[email protected]>
> Signed-off-by: Li Yang <[email protected]>
> ---
> drivers/i2c/busses/i2c-mpc.c | 34 +++++++++++++++++++++++++++++++++-
> 1 files changed, 33 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index a8ebb84..f95a647 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -1,7 +1,9 @@
> /*
> * (C) Copyright 2003-2004
> * Humboldt Solutions Ltd, [email protected].
> -
> + *
> + * Copyright 2012 Freescale Semiconductor, Inc.
> + *

I'd think the change is too trivial to claim copyright on the file.

Thanks for the contribution,

Wolfram

--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |


Attachments:
(No filename) (1.13 kB)
signature.asc (198.00 B)
Digital signature
Download all attachments