All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND 1/3] i2c: mxs: distinguish i.MX23 and i.MX28 based I2C controller
@ 2013-07-30 21:20 Marek Vasut
       [not found] ` <1375219237-9594-1-git-send-email-marex-ynQEQJNshbs@public.gmane.org>
  0 siblings, 1 reply; 18+ messages in thread
From: Marek Vasut @ 2013-07-30 21:20 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
  Cc: Juergen Beisert, Alexandre Belloni, Christoph Baumann,
	Fabio Estevam, Shawn Guo, Torsten Fleischer, Wolfram Sang

From: Juergen Beisert <jbe-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>

It seems the PIO mode does not work, or at least not like it works
on a i.MX28. Each short transfer needs about one second (without an
error message) but does not send anything on the I2C lines.

From: Juergen Beisert <jbe-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
Signed-off-by: Juergen Beisert <jbe-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
Cc: Alexandre Belloni <alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Cc: Christoph Baumann <cb-/RsSufbtIHM@public.gmane.org>
Cc: Fabio Estevam <r49496-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
Cc: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: Torsten Fleischer <to-fleischer-zqRNUXuvxA0b1SvskN2V4Q@public.gmane.org>
Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
---
 drivers/i2c/busses/i2c-mxs.c |   42 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
index df8ff5a..ca54ac4 100644
--- a/drivers/i2c/busses/i2c-mxs.c
+++ b/drivers/i2c/busses/i2c-mxs.c
@@ -96,10 +96,17 @@
 #define MXS_CMD_I2C_READ	(MXS_I2C_CTRL0_SEND_NAK_ON_LAST | \
 				 MXS_I2C_CTRL0_MASTER_MODE)
 
+enum mxs_i2c_devtype {
+	MXS_I2C_UNKNOWN = 0,
+	MXS_I2C_V1,
+	MXS_I2C_V2,
+};
+
 /**
  * struct mxs_i2c_dev - per device, private MXS-I2C data
  *
  * @dev: driver model device node
+ * @dev_type: distinguish i.MX23/i.MX28 features
  * @regs: IO registers pointer
  * @cmd_complete: completion object for transaction wait
  * @cmd_err: error code for last transaction
@@ -107,6 +114,7 @@
  */
 struct mxs_i2c_dev {
 	struct device *dev;
+	enum mxs_i2c_devtype dev_type;
 	void __iomem *regs;
 	struct completion cmd_complete;
 	int cmd_err;
@@ -491,9 +499,10 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg,
 	 * is set to 8 bytes, transfers shorter than 8 bytes are transfered
 	 * using PIO mode while longer transfers use DMA. The 8 byte border is
 	 * based on this empirical measurement and a lot of previous frobbing.
+	 * Note: this special feature only works on i.MX28 SoC
 	 */
 	i2c->cmd_err = 0;
-	if (msg->len < 8) {
+	if (i2c->dev_type == MXS_I2C_V2 && msg->len < 8) {
 		ret = mxs_i2c_pio_setup_xfer(adap, msg, flags);
 		if (ret)
 			mxs_i2c_reset(i2c);
@@ -632,8 +641,28 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c)
 	return 0;
 }
 
+static struct platform_device_id mxs_i2c_devtype[] = {
+	{
+		.name = "imx23-i2c",
+		.driver_data = MXS_I2C_V1,
+	}, {
+		.name = "imx28-i2c",
+		.driver_data = MXS_I2C_V2,
+	}, { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, mxs_i2c_devtype);
+
+static const struct of_device_id mxs_i2c_dt_ids[] = {
+	{ .compatible = "fsl,imx23-i2c", .data = &mxs_i2c_devtype[0], },
+	{ .compatible = "fsl,imx28-i2c", .data = &mxs_i2c_devtype[1], },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, mxs_i2c_dt_ids);
+
 static int mxs_i2c_probe(struct platform_device *pdev)
 {
+	const struct of_device_id *of_id =
+				of_match_device(mxs_i2c_dt_ids, &pdev->dev);
 	struct device *dev = &pdev->dev;
 	struct mxs_i2c_dev *i2c;
 	struct i2c_adapter *adap;
@@ -645,6 +674,11 @@ static int mxs_i2c_probe(struct platform_device *pdev)
 	if (!i2c)
 		return -ENOMEM;
 
+	if (of_id) {
+		const struct platform_device_id *device_id = of_id->data;
+		i2c->dev_type = device_id->driver_data;
+	}
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	irq = platform_get_irq(pdev, 0);
 
@@ -720,12 +754,6 @@ static int mxs_i2c_remove(struct platform_device *pdev)
 	return 0;
 }
 
-static const struct of_device_id mxs_i2c_dt_ids[] = {
-	{ .compatible = "fsl,imx28-i2c", },
-	{ /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, mxs_i2c_dt_ids);
-
 static struct platform_driver mxs_i2c_driver = {
 	.driver = {
 		   .name = DRIVER_NAME,
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2013-09-02 17:00 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-30 21:20 [PATCH RESEND 1/3] i2c: mxs: distinguish i.MX23 and i.MX28 based I2C controller Marek Vasut
     [not found] ` <1375219237-9594-1-git-send-email-marex-ynQEQJNshbs@public.gmane.org>
2013-07-30 21:20   ` [PATCH V2 2/3] i2c: mxs: Rework the PIO mode operation Marek Vasut
     [not found]     ` <1375219237-9594-2-git-send-email-marex-ynQEQJNshbs@public.gmane.org>
2013-08-05 10:36       ` Wolfram Sang
2013-08-05 11:11         ` Alexandre Belloni
2013-08-05 14:21         ` Marek Vasut
     [not found]           ` <201308051621.51146.marex-ynQEQJNshbs@public.gmane.org>
2013-08-06  8:20             ` Wolfram Sang
2013-08-06 13:35               ` Marek Vasut
     [not found]                 ` <201308061535.50470.marex-ynQEQJNshbs@public.gmane.org>
2013-08-06 21:13                   ` Wolfram Sang
2013-08-06 22:18                     ` Marek Vasut
     [not found]                       ` <201308070018.12773.marex-ynQEQJNshbs@public.gmane.org>
2013-08-07 14:14                         ` Wolfram Sang
2013-08-07 14:15                           ` Marek Vasut
2013-08-06  7:53         ` Shawn Guo
2013-08-15 17:08       ` Torsten Fleischer
     [not found]         ` <8771910.JgfUXiMKri-BVXpyJtzy6LO1Ldfs0Uenw@public.gmane.org>
2013-08-25 16:19           ` Marek Vasut
     [not found]             ` <201308251819.57351.marex-ynQEQJNshbs@public.gmane.org>
2013-08-26 15:32               ` Torsten Fleischer
     [not found]                 ` <11990305.k2WdFfCnhA-BVXpyJtzy6LO1Ldfs0Uenw@public.gmane.org>
2013-08-26 18:51                   ` Marek Vasut
     [not found]                     ` <201308262051.43123.marex-ynQEQJNshbs@public.gmane.org>
2013-09-02 17:00                       ` Torsten Fleischer
2013-07-30 21:20   ` [PATCH RESEND 3/3] i2c: mxs: Fix PIO mode on i.MX23 Marek Vasut

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.