Skip to contentSkip to conversation

I2C cleanups

PATCH Superseded Shubhrajyoti D 5 participants 23 messages Jun 28, 2012 – Jul 13, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v11 cover I2C cleanups

This is a minimal cleanup series.

The patch series does the following

- Bus busy recovery mechanism.
- Make the i2c use SET_RUNTIME_PM_OPS
- Use INIT_COMPLETION instead of init_completion
- the reset patch is dropped will try to rework it as per the review comments recieved.

This applies on Wolfram's i2c-embedded/for-next branch.

Functional testing on omap4430 , 4460 panda and omap3sdp.

The following changes since commit 0f009a914b40be8786fa67b1f4345cacc263b48c:

i2c: tegra: make all resource allocation through devm_* (2012-06-13 16:01:38 +0200)

are available in the git repository at:
git://gitorious.org/linus-tree/linus-tree.git for_next/omap/minimal_cleanup

Jon Hunter (1):
i2c: omap: Correct I2C revision for OMAP3

Shubhrajyoti D (4):
i2c: omap: Optimise the remove code
i2c: omap: Use SET_RUNTIME_PM_OPS
i2c: omap: Do not initialise the completion everytime
i2c: omap: Remove the definition of SYSS_RESETDONE_MASK

Vikram Pandita (1):
i2c: omap: Recover from Bus Busy condition

 drivers/i2c/busses/i2c-omap.c |   60 ++++++++++++++++++++++++++++------------
 1 files changed, 42 insertions(+), 18 deletions(-)
Signature · 1 line
1.7.5.4
#1 lore raw

PATCH v11 1/6 i2c: omap: Optimise the remove code

The omap_i2c_remove function may not be needed after device exit so the memory could be freed.

---
 drivers/i2c/busses/i2c-omap.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-omap.c +2 -3
index 9895fa7..b086076 100644
@@ -1102,8 +1102,7 @@ err_release_region:
 	return r;
 }
 
-static int
-omap_i2c_remove(struct platform_device *pdev)
+static int __devexit omap_i2c_remove(struct platform_device *pdev)
 {
 	struct omap_i2c_dev	*dev = platform_get_drvdata(pdev);
 	struct resource		*mem;
@@ -1187,7 +1186,7 @@ static struct dev_pm_ops omap_i2c_pm_ops = {
 
 static struct platform_driver omap_i2c_driver = {
 	.probe		= omap_i2c_probe,
-	.remove		= omap_i2c_remove,
+	.remove		= __devexit_p(omap_i2c_remove),
 	.driver		= {
 		.name	= "omap_i2c",
 		.owner	= THIS_MODULE,
Signature · 1 line
1.7.5.4
#2 lore raw

PATCH v11 1/6 i2c: omap: Optimise the remove code

Quoted 4 lines · Shubhrajyoti D

The omap_i2c_remove function may not be needed after device exit so the memory could be freed.

Changed the title from "optimise" to "annotate" and pushed to next.

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/ce7bebb4/attachment.sig>
#3 lore raw

PATCH v11 1/6 i2c: omap: Optimise the remove code

Quoted 6 lines · Wolfram Sang
Quoted 4 lines · Shubhrajyoti D

The omap_i2c_remove function may not be needed after device exit so the memory could be freed.

Changed the title from "optimise" to "annotate" and pushed to next.

Thanks for fixing that.

Quoted 1 line
#4 lore raw

PATCH v11 2/6 i2c: omap: Use SET_RUNTIME_PM_OPS

In reply to Shubhrajyoti D

Use SET_RUNTIME_PM_OPS macro to set runtime functions.

---
 drivers/i2c/busses/i2c-omap.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-omap.c +5 -3
index b086076..b9915bb 100644
@@ -1126,6 +1126,7 @@ static int __devexit omap_i2c_remove(struct platform_device *pdev)
 	return 0;
 }
 
+#ifdef CONFIG_PM
 #ifdef CONFIG_PM_RUNTIME
 static int omap_i2c_runtime_suspend(struct device *dev)
 {
@@ -1174,15 +1175,16 @@ static int omap_i2c_runtime_resume(struct device *dev)
 
 	return 0;
 }
+#endif /* CONFIG_PM_RUNTIME */
 
 static struct dev_pm_ops omap_i2c_pm_ops = {
-	.runtime_suspend = omap_i2c_runtime_suspend,
-	.runtime_resume = omap_i2c_runtime_resume,
+	SET_RUNTIME_PM_OPS(omap_i2c_runtime_suspend,
+			   omap_i2c_runtime_resume, NULL)
 };
 #define OMAP_I2C_PM_OPS (&omap_i2c_pm_ops)
 #else
 #define OMAP_I2C_PM_OPS NULL
-#endif
+#endif /* CONFIG_PM */
 
 static struct platform_driver omap_i2c_driver = {
 	.probe		= omap_i2c_probe,
Signature · 1 line
1.7.5.4
Applied
#5 lore raw

PATCH v11 2/6 i2c: omap: Use SET_RUNTIME_PM_OPS

Quoted 4 lines · Shubhrajyoti D

Use SET_RUNTIME_PM_OPS macro to set runtime functions.

Applied to next, thanks.

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/2c3e2dd4/attachment.sig>
#6 lore raw

PATCH v11 3/6 i2c: omap: Do not initialise the completion everytime

In reply to Shubhrajyoti D

Use INIT_COMPLETION instead of init_completion in transfer.

---
- Add Felipe's reviewed-by tag

 drivers/i2c/busses/i2c-omap.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/i2c/busses/i2c-omap.c +2 -1
index b9915bb..6d05f18 100644
@@ -490,7 +490,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
 	w |= OMAP_I2C_BUF_RXFIF_CLR | OMAP_I2C_BUF_TXFIF_CLR;
 	omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, w);
 
-	init_completion(&dev->cmd_complete);
+	INIT_COMPLETION(dev->cmd_complete);
 	dev->cmd_err = 0;
 
 	w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT;
@@ -999,6 +999,7 @@ omap_i2c_probe(struct platform_device *pdev)
 	}
 
 	platform_set_drvdata(pdev, dev);
+	init_completion(&dev->cmd_complete);
 
 	dev->reg_shift = (dev->flags >> OMAP_I2C_FLAG_BUS_SHIFT__SHIFT) & 3;
 
Signature · 1 line
1.7.5.4
#7 lore raw

PATCH v11 3/6 i2c: omap: Do not initialise the completion everytime

Hi,

Quoted 24 lines · Shubhrajyoti D

Use INIT_COMPLETION instead of init_completion in transfer.

---
- Add Felipe's reviewed-by tag

?drivers/i2c/busses/i2c-omap.c | ? ?3 ++-
?1 files changed, 2 insertions(+), 1 deletions(-)

drivers/i2c/busses/i2c-omap.c +1 -1
index b9915bb..6d05f18 100644
@@ -490,7 +490,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
 ? ? ? ?w |= OMAP_I2C_BUF_RXFIF_CLR | OMAP_I2C_BUF_TXFIF_CLR;
 ? ? ? ?omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, w);
 
- ? ? ? init_completion(&dev->cmd_complete);
+ ? ? ? INIT_COMPLETION(dev->cmd_complete);
 ? ? ? ?dev->cmd_err = 0;
 
 ? ? ? ?w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT;

drivers/i2c/busses/i2c-omap.c omap_i2c_probe(struct platform_device *pdev) · line 1002

Quoted 4 lines
drivers/i2c/busses/i2c-omap.c +1 -0
@@ -999,6 +999,7 @@ omap_i2c_probe(struct platform_device *pdev)
 ? ? ? ?}
 
 ? ? ? ?platform_set_drvdata(pdev, dev);
+ ? ? ? init_completion(&dev->cmd_complete);

It should be INIT_COMPLETION here too.

Thanks
Kishon

#8 lore raw

PATCH v11 3/6 i2c: omap: Do not initialise the completion everytime

No, it should be init_completion(&dev->cmd_complete); in probe, we need to initialize the wait queue, which will be used when using "complete(......)"

-----Original Message-----
From: [email protected] [mailto:linux-i2c-owner at vger.kernel.org] On Behalf Of ABRAHAM, KISHON VIJAY
Sent: Friday, June 29, 2012 12:03 AM
To: Shubhrajyoti D
Cc: linux-omap at vger.kernel.org; linux-i2c at vger.kernel.org; linux-arm-kernel at lists.infradead.org; ben-linux at fluff.org; tony at atomide.com; w.sang at pengutronix.de
Subject: Re: [PATCHv11 3/6] i2c: omap: Do not initialise the completion everytime

Hi,

Quoted 27 lines · Shubhrajyoti D

Use INIT_COMPLETION instead of init_completion in transfer.

---
- Add Felipe's reviewed-by tag

?drivers/i2c/busses/i2c-omap.c | ? ?3 ++-
?1 files changed, 2 insertions(+), 1 deletions(-)

(quoted diff) +0 -0

b/drivers/i2c/busses/i2c-omap.c index b9915bb..6d05f18 100644

drivers/i2c/busses/i2c-omap.c +1 -1
@@ -490,7 +490,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter 
 *adap,
 ? ? ? ?w |= OMAP_I2C_BUF_RXFIF_CLR | OMAP_I2C_BUF_TXFIF_CLR;
 ? ? ? ?omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, w);
 
- ? ? ? init_completion(&dev->cmd_complete);
+ ? ? ? INIT_COMPLETION(dev->cmd_complete);
 ? ? ? ?dev->cmd_err = 0;
 

? ? ? ?w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT; @@ -999,6 +999,7 @@ omap_i2c_probe(struct platform_device *pdev) ? ? ? ?}

Quoted 2 lines

? ? ? ?platform_set_drvdata(pdev, dev);
+ ? ? ? init_completion(&dev->cmd_complete);

It should be INIT_COMPLETION here too.

Thanks
Kishon
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html

Applied
#9 lore raw

PATCH v11 3/6 i2c: omap: Do not initialise the completion everytime

In reply to Shubhrajyoti D
Quoted 4 lines · Shubhrajyoti D

Use INIT_COMPLETION instead of init_completion in transfer.

Applied to next, thanks.

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/a025b696/attachment.sig>
#11 lore raw

PATCH v11 4/6 i2c: omap: Remove the definition of SYSS_RESETDONE_MASK

In reply to Shubhrajyoti D

Remove the definition of SYSS_RESETDONE_MASK and use the one in omap_hwmod.h.

---
- Add Felipe's reviewed by tag

 drivers/i2c/busses/i2c-omap.c |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-omap.c +1 -3
index 6d05f18..4bbf288 100644
@@ -43,6 +43,7 @@
 #include <linux/slab.h>
 #include <linux/i2c-omap.h>
 #include <linux/pm_runtime.h>
+#include <plat/omap_hwmod.h>
 
 /* I2C controller revisions */
 #define OMAP_I2C_OMAP1_REV_2		0x20
@@ -158,9 +159,6 @@ enum {
 #define OMAP_I2C_SYSTEST_SDA_O		(1 << 0)	/* SDA line drive out */
 #endif
 
-/* OCP_SYSSTATUS bit definitions */
-#define SYSS_RESETDONE_MASK		(1 << 0)
-
 /* OCP_SYSCONFIG bit definitions */
 #define SYSC_CLOCKACTIVITY_MASK		(0x3 << 8)
 #define SYSC_SIDLEMODE_MASK		(0x3 << 3)
Signature · 1 line
1.7.5.4
#12 lore raw

PATCH v11 4/6 i2c: omap: Remove the definition of SYSS_RESETDONE_MASK

Quoted 16 lines · Shubhrajyoti D

Remove the definition of SYSS_RESETDONE_MASK and use the one in omap_hwmod.h.

---
- Add Felipe's reviewed by tag

 drivers/i2c/busses/i2c-omap.c |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-omap.c +0 -0
index 6d05f18..4bbf288 100644

drivers/i2c/busses/i2c-omap.c line 46

Quoted 4 lines
drivers/i2c/busses/i2c-omap.c +1 -0
@@ -43,6 +43,7 @@
 #include <linux/slab.h>
 #include <linux/i2c-omap.h>
 #include <linux/pm_runtime.h>
+#include <plat/omap_hwmod.h>

Hmmm, so far the driver has no plat/mach dependencies and now this gets added. Need to think about it a bit more...

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/898892f0/attachment.sig>
#13 lore raw

PATCH v11 4/6 i2c: omap: Remove the definition of SYSS_RESETDONE_MASK

Quoted 3 lines · Wolfram Sang
Quoted 1 line

+#include <plat/omap_hwmod.h>

Hmmm, so far the driver has no plat/mach dependencies and now this gets added. Need to think about it a bit more...

OK .

#14 lore raw

PATCH v11 5/6 i2c: omap: Correct I2C revision for OMAP3

In reply to Shubhrajyoti D

From: Jon Hunter <[email protected]>

The OMAP3530 is based upon the same silicon as the OMAP3430 and so the I2C revision is the same for 3430 and 3530. However, the OMAP3630 device has the same I2C revision as OMAP4. Correct the revision definition to reflect this.

This patch is based on work done by Jon Hunter <[email protected]> Changes from his patch
- Update OMAP_I2C_REV_ON_3430 also to reflect that it is same as 3530

---
- Add Felipe's Reviewed by tag

 drivers/i2c/busses/i2c-omap.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)
drivers/i2c/busses/i2c-omap.c +5 -5
index 4bbf288..5058dfc 100644
@@ -50,8 +50,8 @@
 
 /* I2C controller revisions present on specific hardware */
 #define OMAP_I2C_REV_ON_2430		0x36
-#define OMAP_I2C_REV_ON_3430		0x3C
-#define OMAP_I2C_REV_ON_3530_4430	0x40
+#define OMAP_I2C_REV_ON_3430_3530	0x3C
+#define OMAP_I2C_REV_ON_3630_4430	0x40
 
 /* timeout waiting for the controller to respond */
 #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000))
@@ -303,7 +303,7 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
 			omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG,
 					   SYSC_AUTOIDLE_MASK);
 
-		} else if (dev->rev >= OMAP_I2C_REV_ON_3430) {
+		} else if (dev->rev >= OMAP_I2C_REV_ON_3430_3530) {
 			dev->syscstate = SYSC_AUTOIDLE_MASK;
 			dev->syscstate |= SYSC_ENAWAKEUP_MASK;
 			dev->syscstate |= (SYSC_IDLEMODE_SMART <<
@@ -1018,7 +1018,7 @@ omap_i2c_probe(struct platform_device *pdev)
 	if (dev->flags & OMAP_I2C_FLAG_APPLY_ERRATA_I207)
 		dev->errata |= I2C_OMAP_ERRATA_I207;
 
-	if (dev->rev <= OMAP_I2C_REV_ON_3430)
+	if (dev->rev <= OMAP_I2C_REV_ON_3430_3530)
 		dev->errata |= I2C_OMAP_ERRATA_I462;
 
 	if (!(dev->flags & OMAP_I2C_FLAG_NO_FIFO)) {
@@ -1036,7 +1036,7 @@ omap_i2c_probe(struct platform_device *pdev)
 
 		dev->fifo_size = (dev->fifo_size / 2);
 
-		if (dev->rev >= OMAP_I2C_REV_ON_3530_4430)
+		if (dev->rev >= OMAP_I2C_REV_ON_3630_4430)
 			dev->b_hw = 0; /* Disable hardware fixes */
 		else
 			dev->b_hw = 1; /* Enable hardware fixes */
Signature · 1 line
1.7.5.4
Applied
#15 lore raw

PATCH v11 5/6 i2c: omap: Correct I2C revision for OMAP3

Quoted 6 lines · Shubhrajyoti D

From: Jon Hunter <[email protected]>

The OMAP3530 is based upon the same silicon as the OMAP3430 and so the I2C revision is the same for 3430 and 3530. However, the OMAP3630 device has the same I2C revision as OMAP4. Correct the revision definition to reflect this.

Quoted 7 lines

This patch is based on work done by Jon Hunter <[email protected]> Changes from his patch
- Update OMAP_I2C_REV_ON_3430 also to reflect that it is same as 3530

Applied to next, thanks.

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/3b5239b1/attachment.sig>
#17 lore raw

PATCH v11 6/6 i2c: omap: Recover from Bus Busy condition

In reply to Shubhrajyoti D

From: Vikram Pandita <[email protected]>

In case a peripheral is driving SDA bus low (ie. a start condition), provide a constant clock output using the test mode of the OMAP I2C controller to try and clear the bus. Soft reset I2C controller after attempting the bus clear to ensure that controller is in a good state.

Based upon Vikram Pandita's patch from TI Android 3.0. I acknowledge the contributions and suggestions of Jon and Hemant.

A couple differences from the original patch ...
1. Add a new function for bus clear
2. Ensure that the CON.I2C_EN bit is set when using the SYSTEST feature to output a permanent clock. This bit needs to be set and typically it would be set by the unidle function but this is not the case for all OMAP generations.
3. Program the SYSTEST setting only the bits we care about. However, restore SYSTEST registers to there original state as some OMAP generations do not implement perform a soft-reset.
4. Clear the CON register after performing the bus clear, so when we call the init function the controller is disabled and the init function will re-enable later.

Original patch can be found here:
http://git.omapzoom.org/?p=kernel/omap.git;a=commit;h=a2ab04192ba25e60f95ba1ff3af5601a2d7b5bd1

---
 drivers/i2c/busses/i2c-omap.c |   30 +++++++++++++++++++++++++++---
 1 files changed, 27 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-omap.c +27 -3
index 5058dfc..2500f19 100644
@@ -148,16 +148,15 @@ enum {
 #define OMAP_I2C_SCLH_HSSCLH	8
 
 /* I2C System Test Register (OMAP_I2C_SYSTEST): */
-#ifdef DEBUG
 #define OMAP_I2C_SYSTEST_ST_EN		(1 << 15)	/* System test enable */
 #define OMAP_I2C_SYSTEST_FREE		(1 << 14)	/* Free running mode */
 #define OMAP_I2C_SYSTEST_TMODE_MASK	(3 << 12)	/* Test mode select */
-#define OMAP_I2C_SYSTEST_TMODE_SHIFT	(12)		/* Test mode select */
+#define OMAP_I2C_SYSTEST_TMODE_TEST	(2 << 12)	/* Test mode select */
+#define OMAP_I2C_SYSTEST_TMODE_LOOP	(3 << 12)	/* Test mode select */
 #define OMAP_I2C_SYSTEST_SCL_I		(1 << 3)	/* SCL line sense in */
 #define OMAP_I2C_SYSTEST_SCL_O		(1 << 2)	/* SCL line drive out */
 #define OMAP_I2C_SYSTEST_SDA_I		(1 << 1)	/* SDA line sense in */
 #define OMAP_I2C_SYSTEST_SDA_O		(1 << 0)	/* SDA line drive out */
-#endif
 
 /* OCP_SYSCONFIG bit definitions */
 #define SYSC_CLOCKACTIVITY_MASK		(0x3 << 8)
@@ -458,6 +457,29 @@ static int omap_i2c_wait_for_bb(struct omap_i2c_dev *dev)
 
 	return 0;
 }
+/*
+ * Bus Clear
+ */
+static int omap_i2c_bus_clear(struct omap_i2c_dev *dev)
+{
+	u16 w;
+
+	/*
+	 * Per the I2C specification, if we are stuck in a bus busy state
+	 * we can attempt a bus clear to try and recover the bus by sending
+	 *@least 9 clock pulses on SCL. Put the I2C in a test mode so it
+	 * will output a continuous clock on SCL.
+	 */
+	w = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
+	omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
+	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, (OMAP_I2C_SYSTEST_ST_EN
+			   | OMAP_I2C_SYSTEST_TMODE_TEST));
+	msleep(1);
+	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, w);
+	omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
+	omap_i2c_init(dev);
+	return omap_i2c_wait_for_bb(dev);
+}
 
 /*
  * Low level master read/write transaction.
@@ -584,6 +606,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 
 	r = omap_i2c_wait_for_bb(dev);
 	if (r < 0)
+		r = omap_i2c_bus_clear(dev);
+	if (r < 0)
 		goto out;
 
 	if (dev->set_mpu_wkup_lat != NULL)
Signature · 1 line
1.7.5.4
#18 lore raw

PATCH v11 6/6 i2c: omap: Recover from Bus Busy condition

Quoted 23 lines · Shubhrajyoti D

From: Vikram Pandita <[email protected]>

In case a peripheral is driving SDA bus low (ie. a start condition), provide a constant clock output using the test mode of the OMAP I2C controller to try and clear the bus. Soft reset I2C controller after attempting the bus clear to ensure that controller is in a good state.

Based upon Vikram Pandita's patch from TI Android 3.0. I acknowledge the contributions and suggestions of Jon and Hemant.

A couple differences from the original patch ...
1. Add a new function for bus clear
2. Ensure that the CON.I2C_EN bit is set when using the SYSTEST feature to output a permanent clock. This bit needs to be set and typically it would be set by the unidle function but this is not the case for all OMAP generations.
3. Program the SYSTEST setting only the bits we care about. However, restore SYSTEST registers to there original state as some OMAP generations do not implement perform a soft-reset.
4. Clear the CON register after performing the bus clear, so when we call the init function the controller is disabled and the init function will re-enable later.

Quoted 6 lines

Original patch can be found here:
http://git.omapzoom.org/?p=kernel/omap.git;a=commit;h=a2ab04192ba25e60f95ba1ff3af5601a2d7b5bd1

This has to wait a little bit until I can spend time on the recovery framework (which is still in the queue, sadly :( ). There might be some consolidation.

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/ce96a453/attachment-0001.sig>
#20 lore raw

v11 cover I2C cleanups

In reply to Shubhrajyoti D
Quoted 1 line · Shubhrajyoti D

This is a minimal cleanup series.

If there are no further comments can this series be queued?

Quoted 44 lines

The patch series does the following

- Bus busy recovery mechanism.
- Make the i2c use SET_RUNTIME_PM_OPS
- Use INIT_COMPLETION instead of init_completion
- the reset patch is dropped will try to rework it as per the review comments recieved.

This applies on Wolfram's i2c-embedded/for-next branch.

Functional testing on omap4430 , 4460 panda and omap3sdp.

The following changes since commit 0f009a914b40be8786fa67b1f4345cacc263b48c:

i2c: tegra: make all resource allocation through devm_* (2012-06-13 16:01:38 +0200)

are available in the git repository at:
git://gitorious.org/linus-tree/linus-tree.git for_next/omap/minimal_cleanup

Jon Hunter (1):
i2c: omap: Correct I2C revision for OMAP3

Shubhrajyoti D (4):
i2c: omap: Optimise the remove code
i2c: omap: Use SET_RUNTIME_PM_OPS
i2c: omap: Do not initialise the completion everytime
i2c: omap: Remove the definition of SYSS_RESETDONE_MASK

Vikram Pandita (1):
i2c: omap: Recover from Bus Busy condition

 drivers/i2c/busses/i2c-omap.c |   60 ++++++++++++++++++++++++++++------------
 1 files changed, 42 insertions(+), 18 deletions(-)

--
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#21 lore raw

v11 cover I2C cleanups

Quoted 4 lines · Shubhrajyoti Datta
Quoted 1 line · Shubhrajyoti D

This is a minimal cleanup series.

If there are no further comments can this series be queued?

I just applied a few of them. BTW I get a build warning when compiling the kernel, maybe someone is interested. It is not related to the patches, though.

===

WARNING: arch/arm/mach-omap2/built-in.o(.data+0x2b5c0): Section mismatch in reference from the variable rx51_si4713_dev to the (unknown reference) .init.data:(unknown) The variable rx51_si4713_dev references
the (unknown reference) __initdata (unknown)
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

===

I think this is what I'll pull in for the next merge window. The big OMAP cleanup (latest version from 3. July) would then go in early into -next for 3.7. Is that OK with the omap-people?

Also, thanks to Shubhrajyoti Datta for reviewing other patches on the i2c-list, much appreciated.

Thanks,

Wolfram

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120712/7065ea3b/attachment.sig>
#22 lore raw

v11 cover I2C cleanups

Quoted 6 lines · Wolfram Sang
Quoted 3 lines · Shubhrajyoti Datta
Quoted 1 line · Shubhrajyoti D

This is a minimal cleanup series.

If there are no further comments can this series be queued?

I just applied a few of them. BTW I get a build warning when compiling the kernel, maybe someone is interested. It is not related to the patches, though.

OK could check that.

Quoted 10 lines

===

WARNING: arch/arm/mach-omap2/built-in.o(.data+0x2b5c0): Section mismatch in reference from the variable rx51_si4713_dev to the (unknown reference) .init.data:(unknown) The variable rx51_si4713_dev references
the (unknown reference) __initdata (unknown)
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

Quoted 8 lines

===

I think this is what I'll pull in for the next merge window. The big OMAP cleanup (latest version from 3. July) would then go in early into -next for 3.7. Is that OK with the omap-people?

Also, thanks to Shubhrajyoti Datta for reviewing other patches on the i2c-list, much appreciated.

Thanks,

Quoted 4 lines

Thanks,

Wolfram