<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>i.MX ProcessorsのトピックRe: Conflict on 2 I2C buses</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208755#M12262</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The second choice is right if you choose 400kHz.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sam&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 16 Oct 2013 06:39:15 GMT</pubDate>
    <dc:creator>samuelsalas</dc:creator>
    <dc:date>2013-10-16T06:39:15Z</dc:date>
    <item>
      <title>Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208739#M12246</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It seems I have a communication conflict with between my touchscreen driver on the i2c-1 and my external board on i2c-0 which both are communicating with my imx28 board.&lt;/P&gt;&lt;P&gt;No hardware problem, but the kernel seems not to make the difference and stop randomly when both are connected.&lt;/P&gt;&lt;P&gt;When one is connected, no problem.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any idea?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 14 Dec 2012 17:09:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208739#M12246</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2012-12-14T17:09:10Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208740#M12247</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;There are some patches for i.MX28. Do you apply it all?&lt;/P&gt;&lt;P&gt;You can download the patches from here:&lt;/P&gt;&lt;P&gt;&amp;lt; &lt;A href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MCIMX28EVKJ"&gt;http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MCIMX28EVKJ&lt;/A&gt; &amp;gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="mce_paste_marker"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Dec 2012 03:16:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208740#M12247</guid>
      <dc:creator>jimmychan</dc:creator>
      <dc:date>2012-12-19T03:16:34Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208741#M12248</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I applied all the patches, but no chance.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Situation :&lt;/P&gt;&lt;P&gt;One touchscreen driver using i2c-core function "i2c_master_recv" on i2c-1. this driver works on an IRQ every 10 ms.&lt;/P&gt;&lt;P&gt;One User application crosscompiled using ioctl (so using i2c-dev.c) on i2c-0. this application is used randomly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If "i2c_master_recv" is disabled in my touchscreen driver, no problem.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My error message is :&lt;/P&gt;&lt;P&gt;--&lt;/P&gt;&lt;P&gt;noaliadebian login: kernel BUG at arch/arm/plat-mxs/dmaengine.c:223!&lt;/P&gt;&lt;P&gt;Unable to handle kernel NULL pointer dereference at virtual address 00000000&lt;/P&gt;&lt;P&gt;pgd = c73c0000&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;[00000000] *pgd=473a8031, *pte=00000000, *ppte=00000000&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Internal error: Oops: 817 [#1] PREEMPT&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;last sysfs file: /sys/devices/virtual/net/lo/operstate&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Modules linked in:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;CPU: 0&amp;nbsp;&amp;nbsp;&amp;nbsp; Not tainted&amp;nbsp; (2.6.35.3-571-gcca29a0 #661)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PC is at __bug+0x20/0x2c&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;LR is at release_console_sem+0x1b4/0x230&lt;/P&gt;&lt;P&gt;&lt;SPAN class="mce_paste_marker"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;(..to the kernel panic ...)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Kernel panic - not syncing: Fatal exception in interrupt&lt;/P&gt;&lt;P&gt;Backtrace: &lt;/P&gt;&lt;P&gt;[&amp;lt;c00524a8&amp;gt;] (dump_backtrace+0x0/0x114) from [&amp;lt;c03d5860&amp;gt;] (dump_stack+0x18/0x1c)&lt;/P&gt;&lt;P&gt; r7:c005213c r6:00000001 r5:c7393ac4 r4:c0535358&lt;/P&gt;&lt;P&gt;[&amp;lt;c03d5848&amp;gt;] (dump_stack+0x0/0x1c) from [&amp;lt;c03d58dc&amp;gt;] (panic+0x78/0xf4)&lt;/P&gt;&lt;P&gt;[&amp;lt;c03d5864&amp;gt;] (panic+0x0/0xf4) from [&amp;lt;c005288c&amp;gt;] (die+0x2d0/0x324)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="mce_paste_marker"&gt;(...)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="mce_paste_marker"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="mce_paste_marker"&gt;Any other idea ?&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Dec 2012 09:42:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208741#M12248</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2012-12-19T09:42:50Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208742#M12249</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Can you by any chance try with upstream 3.7 kernel? The i2c driver there is different. Be aware that the upstream kernel is in a good shape on mx28evk, but there are still some less interesting components missing (like DCP ... if you need it). From what I remember, the DMA actually works on the I2C even for very long transfers (&amp;gt;32k bytes) and there is a different DMA engine driver.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Otherwise, it seems you ought to check dmaengine.c at line 223 and that might give you a hint ;-)&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Dec 2012 19:37:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208742#M12249</guid>
      <dc:creator>MarekVasut</dc:creator>
      <dc:date>2012-12-19T19:37:59Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208743#M12250</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi we already have modifyed some features in the kernel and I prefer not to change the kernel.&lt;/P&gt;&lt;P&gt;But I will have a look at the i2c-mxs.c from this kernel and I will let you know.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 21 Dec 2012 08:09:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208743#M12250</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2012-12-21T08:09:14Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208744#M12251</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My issue was solved by removing the "BUG_ON" function in dmaengine.c as said the kernel trace (&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;kernel BUG at arch/arm/plat-mxs/dmaengine.c:223!&lt;/SPAN&gt;).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I read that BUG() shouldn't be used as a debugging function, and only when there is no other choice than killing the system. And when it's removed, it's working fine, so I wonder if this line really need to be there...&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 Jan 2013 08:00:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208744#M12251</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2013-01-15T08:00:29Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208745#M12252</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The correct solution is to switch to new kernel with the new driver or to apply the same modification (avoiding global values for DMA) in the 2.6.35 kernel.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;We did the second solution, if anyone is interested, we could give the patch.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The BUG_ON fixing is not the correct solution.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 26 Apr 2013 06:53:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208745#M12252</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2013-04-26T06:53:52Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208746#M12253</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi samuel,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Could you please post the patch here.? I am also facing the same issue when communicating with two i2c slaves..&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you&lt;/P&gt;&lt;P&gt;Binoy&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Jun 2013 11:53:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208746#M12253</guid>
      <dc:creator>binoyjayan</dc:creator>
      <dc:date>2013-06-12T11:53:04Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208747#M12254</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I would recommend you trying a mainline kernel from kernel.org.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Fabio Estevam&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Jun 2013 12:14:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208747#M12254</guid>
      <dc:creator>fabio_estevam</dc:creator>
      <dc:date>2013-06-12T12:14:21Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208748#M12255</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It finally worked for me by patching i2c-mxs.c and i2c-mxs.h.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Binoy&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 14 Jun 2013 05:02:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208748#M12255</guid>
      <dc:creator>binoyjayan</dc:creator>
      <dc:date>2013-06-14T05:02:52Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208749#M12256</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Binoy,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Even am using L2.6.35_10.12.01_ER_source &amp;amp; don't want to use latest kernels, &amp;amp; &lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;I am also facing the same issue when communicating with two i2c slaves. when using i2c-0 &amp;amp; i2c-1 buses for communicating with slaves, could you please post me the patch that is to be applied as early as possible&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Many Many Thanks in advance,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 02 Oct 2013 16:47:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208749#M12256</guid>
      <dc:creator>srinivasanshanm</dc:creator>
      <dc:date>2013-10-02T16:47:31Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208750#M12257</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi everyone,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As I saw it's not the first time someone is asking the patch, I prefer to publish it for the future. Here the patch we used on &lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;2.6.35 kernel&lt;/SPAN&gt; :&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;--------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;diff -Naur a/arch/arm/plat-mxs/include/mach/device.h b/arch/arm/plat-mxs/include/mach/device.h&lt;/P&gt;&lt;P&gt;--- a/arch/arm/plat-mxs/include/mach/device.h 2013-05-02 18:20:09.000000000 +0200&lt;/P&gt;&lt;P&gt;+++ b/arch/arm/plat-mxs/include/mach/device.h 2013-05-02 18:32:23.000000000 +0200&lt;/P&gt;&lt;P&gt;@@ -62,6 +62,7 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; struct mxs_i2c_plat_data {&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int pioqueue_mode:1;&lt;/P&gt;&lt;P&gt;+ unsigned int speed;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; struct mxs_lradc_plat_data {&lt;/P&gt;&lt;P&gt;@@ -128,7 +129,7 @@&lt;/P&gt;&lt;P&gt; struct mxs_spi_platform_data {&lt;/P&gt;&lt;P&gt;&amp;nbsp; int (*hw_pin_init)(void);&lt;/P&gt;&lt;P&gt;&amp;nbsp; int (*hw_pin_release)(void);&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;+ struct platform_device * cli;&lt;/P&gt;&lt;P&gt;&amp;nbsp; char *clk;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt;diff -Naur a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c&lt;/P&gt;&lt;P&gt;--- a/drivers/i2c/busses/i2c-mxs.c 2013-05-02 18:20:11.000000000 +0200&lt;/P&gt;&lt;P&gt;+++ b/drivers/i2c/busses/i2c-mxs.c 2013-05-02 18:32:23.000000000 +0200&lt;/P&gt;&lt;P&gt;@@ -35,15 +35,9 @@&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/regs-i2c.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/system.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/hardware.h&amp;gt;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;+#include &amp;lt;linux/spinlock.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include "i2c-mxs.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-/* 2 for read, 1 for write */&lt;/P&gt;&lt;P&gt;-#define NR_DESC 3&lt;/P&gt;&lt;P&gt;-static struct mxs_dma_desc *desc[NR_DESC];&lt;/P&gt;&lt;P&gt;-static dma_addr_t i2c_buf_phys;&lt;/P&gt;&lt;P&gt;-static u8 *i2c_buf_virt;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt; #define CMD_I2C_SELECT (BM_I2C_CTRL0_RETAIN_CLOCK | \&lt;/P&gt;&lt;P&gt;&amp;nbsp; BM_I2C_CTRL0_PRE_SEND_START | \&lt;/P&gt;&lt;P&gt;&amp;nbsp; BM_I2C_CTRL0_MASTER_MODE | \&lt;/P&gt;&lt;P&gt;@@ -67,6 +61,31 @@&lt;/P&gt;&lt;P&gt; #define HW_I2C_QUEUECTRL_CLR HW_I2C_VERSION&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+/*&lt;/P&gt;&lt;P&gt;+ * Timing values for the default 24MHz clock supplied into the i2c block.&lt;/P&gt;&lt;P&gt;+ *&lt;/P&gt;&lt;P&gt;+ * The bus can operate at 95kHz or at 400kHz with the following timing&lt;/P&gt;&lt;P&gt;+ * register configurations. The 100kHz mode isn't present because it's&lt;/P&gt;&lt;P&gt;+ * values are not stated in the i.MX233/i.MX28 datasheet. The 95kHz mode&lt;/P&gt;&lt;P&gt;+ * shall be close enough replacement. Therefore when the bus is configured&lt;/P&gt;&lt;P&gt;+ * for 100kHz operation, 95kHz timing settings are actually loaded.&lt;/P&gt;&lt;P&gt;+ *&lt;/P&gt;&lt;P&gt;+ * For details, see i.MX233 [25.4.2 - 25.4.4] and i.MX28 [27.5.2 - 27.5.4].&lt;/P&gt;&lt;P&gt;+ */&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+static const struct mxs_i2c_speed_config mxs_i2c_95kHz_config = {&lt;/P&gt;&lt;P&gt;+ .timing0 = 0x00780030,&lt;/P&gt;&lt;P&gt;+ .timing1 = 0x00800030,&lt;/P&gt;&lt;P&gt;+ .timing2 = 0x00300030,&lt;/P&gt;&lt;P&gt;+};&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+static const struct mxs_i2c_speed_config mxs_i2c_400kHz_config = {&lt;/P&gt;&lt;P&gt;+ .timing0 = 0x000f0007,&lt;/P&gt;&lt;P&gt;+ .timing1 = 0x001f000f,&lt;/P&gt;&lt;P&gt;+ .timing2 = 0x00300030,&lt;/P&gt;&lt;P&gt;+};&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; static void hw_i2c_dmachan_reset(struct mxs_i2c_dev *dev)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_dma_disable(dev-&amp;gt;dma_chan);&lt;/P&gt;&lt;P&gt;@@ -80,6 +99,10 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_dma_enable_irq(mxs_i2c-&amp;gt;dma_chan, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_reset_block((void __iomem *)mxs_i2c-&amp;gt;regbase, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; __raw_writel(0x0000FF00, mxs_i2c-&amp;gt;regbase + HW_I2C_CTRL1_SET);&lt;/P&gt;&lt;P&gt;+ writel(mxs_i2c-&amp;gt;speed.timing0, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING0);&lt;/P&gt;&lt;P&gt;+ writel(mxs_i2c-&amp;gt;speed.timing1, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING1);&lt;/P&gt;&lt;P&gt;+ writel(mxs_i2c-&amp;gt;speed.timing2, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING2);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; static int hw_i2c_dma_init(struct platform_device *pdev)&lt;/P&gt;&lt;P&gt;@@ -92,14 +115,14 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; return ret;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; NR_DESC; i++) {&lt;/P&gt;&lt;P&gt;- desc[i] = mxs_dma_alloc_desc();&lt;/P&gt;&lt;P&gt;- if (desc[i] == NULL)&lt;/P&gt;&lt;P&gt;+ mxs_i2c-&amp;gt;desc[i] = mxs_dma_alloc_desc();&lt;/P&gt;&lt;P&gt;+ if (mxs_i2c-&amp;gt;desc[i] == NULL)&lt;/P&gt;&lt;P&gt;&amp;nbsp; goto err;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- i2c_buf_virt = dma_alloc_coherent(&amp;amp;pdev-&amp;gt;dev,&lt;/P&gt;&lt;P&gt;-&amp;nbsp; PAGE_SIZE, &amp;amp;i2c_buf_phys, GFP_KERNEL);&lt;/P&gt;&lt;P&gt;- if (i2c_buf_virt == NULL)&lt;/P&gt;&lt;P&gt;+ mxs_i2c-&amp;gt;i2c_buf_virt = dma_alloc_coherent(&amp;amp;pdev-&amp;gt;dev,&lt;/P&gt;&lt;P&gt;+&amp;nbsp; PAGE_SIZE, &amp;amp;mxs_i2c-&amp;gt;i2c_buf_phys, GFP_KERNEL);&lt;/P&gt;&lt;P&gt;+ if (mxs_i2c-&amp;gt;i2c_buf_virt == NULL)&lt;/P&gt;&lt;P&gt;&amp;nbsp; goto err;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dmachan_reset(mxs_i2c);&lt;/P&gt;&lt;P&gt;@@ -109,7 +132,7 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; err:&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (--i &amp;gt;= 0)&lt;/P&gt;&lt;P&gt;- mxs_dma_free_desc(desc[i]);&lt;/P&gt;&lt;P&gt;+ mxs_dma_free_desc(mxs_i2c-&amp;gt;desc[i]);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return -ENOMEM;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;@@ -125,11 +148,11 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_dma_disable(mxs_i2c-&amp;gt;dma_chan);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; NR_DESC; i++)&lt;/P&gt;&lt;P&gt;- mxs_dma_free_desc(desc[i]);&lt;/P&gt;&lt;P&gt;+ mxs_dma_free_desc(mxs_i2c-&amp;gt;desc[i]);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dmachan_reset(mxs_i2c);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- dma_free_coherent(&amp;amp;pdev-&amp;gt;dev, PAGE_SIZE, i2c_buf_virt, i2c_buf_phys);&lt;/P&gt;&lt;P&gt;+ dma_free_coherent(&amp;amp;pdev-&amp;gt;dev, PAGE_SIZE, mxs_i2c-&amp;gt;i2c_buf_virt, mxs_i2c-&amp;gt;i2c_buf_phys);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_dma_release(mxs_i2c-&amp;gt;dma_chan, &amp;amp;pdev-&amp;gt;dev);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;@@ -157,34 +180,34 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-static void hw_i2c_dma_setup_read(u8 addr, void *buff, int len, int flags)&lt;/P&gt;&lt;P&gt;+static void hw_i2c_dma_setup_read(u8 addr, void *buff, int len, int flags,struct mxs_i2c_dev *dev)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (len &amp;gt; (PAGE_SIZE - 4))&lt;/P&gt;&lt;P&gt;&amp;nbsp; BUG();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- memset(&amp;amp;desc[0]-&amp;gt;cmd, 0, sizeof(desc[0]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;- memset(&amp;amp;desc[1]-&amp;gt;cmd, 0, sizeof(desc[1]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;+ memset(&amp;amp;dev-&amp;gt;desc[0]-&amp;gt;cmd, 0, sizeof(dev-&amp;gt;desc[0]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;+ memset(&amp;amp;dev-&amp;gt;desc[1]-&amp;gt;cmd, 0, sizeof(dev-&amp;gt;desc[1]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.bytes = 1;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.irq = 0;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.chain = 1;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.cmd.bits.command = DMA_READ;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.address = i2c_buf_phys;&lt;/P&gt;&lt;P&gt;- desc[0]-&amp;gt;cmd.pio_words[0] = CMD_I2C_SELECT;&lt;/P&gt;&lt;P&gt;- i2c_buf_virt[0] = (addr &amp;lt;&amp;lt; 1) | I2C_READ;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.bytes = len;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.irq = 1;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.cmd.bits.command = DMA_WRITE;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.address = (u32) i2c_buf_phys + 1;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.pio_words[0] = CMD_I2C_READ;&lt;/P&gt;&lt;P&gt;- desc[1]-&amp;gt;cmd.pio_words[0] |= BF_I2C_CTRL0_XFER_COUNT(len) | flags;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.bytes = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.irq = 0;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.chain = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.cmd.bits.command = DMA_READ;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.address = dev-&amp;gt;i2c_buf_phys;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[0]-&amp;gt;cmd.pio_words[0] = CMD_I2C_SELECT;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;i2c_buf_virt[0] = (addr &amp;lt;&amp;lt; 1) | I2C_READ;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.bytes = len;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.irq = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.cmd.bits.command = DMA_WRITE;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.address = (u32) dev-&amp;gt;i2c_buf_phys + 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.pio_words[0] = CMD_I2C_READ;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[1]-&amp;gt;cmd.pio_words[0] |= BF_I2C_CTRL0_XFER_COUNT(len) | flags;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; static void hw_i2c_pioq_setup_write(struct mxs_i2c_dev *dev,&lt;/P&gt;&lt;P&gt;@@ -219,23 +242,23 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; __raw_writel(*buf2++, dev-&amp;gt;regbase + HW_I2C_DATA);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-static void hw_i2c_dma_setup_write(u8 addr, void *buff, int len, int flags)&lt;/P&gt;&lt;P&gt;+static void hw_i2c_dma_setup_write(u8 addr, void *buff, int len, int flags,struct mxs_i2c_dev *dev)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;- memset(&amp;amp;desc[2]-&amp;gt;cmd, 0, sizeof(desc[2]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;+ memset(&amp;amp;dev-&amp;gt;desc[2]-&amp;gt;cmd, 0, sizeof(dev-&amp;gt;desc[2]-&amp;gt;cmd));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.bytes = len + 1;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.irq = 1;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.cmd.bits.command = DMA_READ;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.address = i2c_buf_phys;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.pio_words[0] = CMD_I2C_WRITE;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.pio_words[0] |= BM_I2C_CTRL0_POST_SEND_STOP;&lt;/P&gt;&lt;P&gt;- desc[2]-&amp;gt;cmd.pio_words[0] |= BF_I2C_CTRL0_XFER_COUNT(len + 1) | flags;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.bytes = len + 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.pio_words = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.wait4end = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.dec_sem = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.irq = 1;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.cmd.bits.command = DMA_READ;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.address = dev-&amp;gt;i2c_buf_phys;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.pio_words[0] = CMD_I2C_WRITE;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.pio_words[0] |= BM_I2C_CTRL0_POST_SEND_STOP;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;desc[2]-&amp;gt;cmd.pio_words[0] |= BF_I2C_CTRL0_XFER_COUNT(len + 1) | flags;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- i2c_buf_virt[0] = (addr &amp;lt;&amp;lt; 1) | I2C_WRITE;&lt;/P&gt;&lt;P&gt;- memcpy(&amp;amp;i2c_buf_virt[1], buff, len);&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;i2c_buf_virt[0] = (addr &amp;lt;&amp;lt; 1) | I2C_WRITE;&lt;/P&gt;&lt;P&gt;+ memcpy(&amp;amp;dev-&amp;gt;i2c_buf_virt[1], buff, len);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; static void hw_i2c_pioq_run(struct mxs_i2c_dev *dev)&lt;/P&gt;&lt;P&gt;@@ -246,10 +269,10 @@&lt;/P&gt;&lt;P&gt; static void hw_i2c_dma_run(struct mxs_i2c_dev *dev, int dir)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (dir == I2C_READ) {&lt;/P&gt;&lt;P&gt;- mxs_dma_desc_append(dev-&amp;gt;dma_chan, desc[0]);&lt;/P&gt;&lt;P&gt;- mxs_dma_desc_append(dev-&amp;gt;dma_chan, desc[1]);&lt;/P&gt;&lt;P&gt;+ mxs_dma_desc_append(dev-&amp;gt;dma_chan, dev-&amp;gt;desc[0]);&lt;/P&gt;&lt;P&gt;+ mxs_dma_desc_append(dev-&amp;gt;dma_chan, dev-&amp;gt;desc[1]);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else&lt;/P&gt;&lt;P&gt;- mxs_dma_desc_append(dev-&amp;gt;dma_chan, desc[2]);&lt;/P&gt;&lt;P&gt;+ mxs_dma_desc_append(dev-&amp;gt;dma_chan, dev-&amp;gt;desc[2]);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_dma_enable(dev-&amp;gt;dma_chan);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;@@ -276,7 +299,7 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; memcpy(buff, buf1, len);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else&lt;/P&gt;&lt;P&gt;- memcpy(buff, &amp;amp;i2c_buf_virt[1], len);&lt;/P&gt;&lt;P&gt;+ memcpy(buff, &amp;amp;dev-&amp;gt;i2c_buf_virt[1], len);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;@@ -288,7 +311,7 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct mxs_i2c_dev *dev = i2c_get_adapdata(adap);&lt;/P&gt;&lt;P&gt;&amp;nbsp; int err;&lt;/P&gt;&lt;P&gt;&amp;nbsp; int flags;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; init_completion(&amp;amp;dev-&amp;gt;cmd_complete);&lt;/P&gt;&lt;P&gt;&amp;nbsp; dev-&amp;gt;cmd_err = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;@@ -299,7 +322,6 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; return -EINVAL;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flags = stop ? BM_I2C_CTRL0_POST_SEND_STOP : 0;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (msg-&amp;gt;flags &amp;amp; I2C_M_RD) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (dev-&amp;gt;flags &amp;amp; MXS_I2C_PIOQUEUE_MODE) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_pioq_setup_read(dev,&lt;/P&gt;&lt;P&gt;@@ -307,8 +329,9 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;buf, msg-&amp;gt;len, flags);&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_pioq_run(dev);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dma_setup_read(msg-&amp;gt;addr,&lt;/P&gt;&lt;P&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;buf, msg-&amp;gt;len, flags);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;buf, msg-&amp;gt;len, flags,dev);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dma_run(dev, I2C_READ);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;@@ -320,53 +343,71 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_pioq_run(dev);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dma_setup_write(msg-&amp;gt;addr,&lt;/P&gt;&lt;P&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;buf, msg-&amp;gt;len, flags);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;buf, msg-&amp;gt;len, flags,dev);&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_dma_run(dev, I2C_WRITE);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; err = wait_for_completion_interruptible_timeout(&amp;amp;dev-&amp;gt;cmd_complete,&lt;/P&gt;&lt;P&gt;&amp;nbsp; msecs_to_jiffies(1000)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/P&gt;&lt;P&gt;- if (err &amp;lt;= 0) {&lt;/P&gt;&lt;P&gt;- mxs_i2c_reset(dev);&lt;/P&gt;&lt;P&gt;+ if (err == 0) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; dev_dbg(dev-&amp;gt;dev, "controller is timed out\n");&lt;/P&gt;&lt;P&gt;- return -ETIMEDOUT;&lt;/P&gt;&lt;P&gt;+ dev-&amp;gt;cmd_err = -ETIMEDOUT;&lt;/P&gt;&lt;P&gt;+ hw_i2c_dmachan_reset(dev);&lt;/P&gt;&lt;P&gt;+ mxs_i2c_reset(dev);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; goto done;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((!dev-&amp;gt;cmd_err) &amp;amp;&amp;amp; (msg-&amp;gt;flags &amp;amp; I2C_M_RD))&lt;/P&gt;&lt;P&gt;&amp;nbsp; hw_i2c_finish_read(dev, msg-&amp;gt;buf, msg-&amp;gt;len);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ /* No Slave ack */&lt;/P&gt;&lt;P&gt;+ if (dev-&amp;gt;cmd_err == -ENXIO) {&lt;/P&gt;&lt;P&gt;+ mxs_i2c_reset(dev);&lt;/P&gt;&lt;P&gt;+ hw_i2c_dmachan_reset(dev);&lt;/P&gt;&lt;P&gt;+ goto done;&lt;/P&gt;&lt;P&gt;+ } else if (dev-&amp;gt;cmd_err == -EIO) {&lt;/P&gt;&lt;P&gt;+ printk(KERN_WARNING "%s: I2C Fault!\n", __func__);&lt;/P&gt;&lt;P&gt;+ hw_i2c_dmachan_reset(dev);&lt;/P&gt;&lt;P&gt;+ mxs_i2c_reset(dev);&lt;/P&gt;&lt;P&gt;+ goto done;&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- dev_dbg(dev-&amp;gt;dev, "Done with err=%d\n", dev-&amp;gt;cmd_err);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+ if ((!dev-&amp;gt;cmd_err) &amp;amp;&amp;amp; (msg-&amp;gt;flags &amp;amp; I2C_M_RD))&lt;/P&gt;&lt;P&gt;+ {&lt;/P&gt;&lt;P&gt;+ hw_i2c_finish_read(dev, msg-&amp;gt;buf, msg-&amp;gt;len);&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+done:&lt;/P&gt;&lt;P&gt;+ dev_dbg(dev-&amp;gt;dev, "Done with err=%d\n", dev-&amp;gt;cmd_err);&lt;/P&gt;&lt;P&gt;&amp;nbsp; return dev-&amp;gt;cmd_err;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-static int&lt;/P&gt;&lt;P&gt;-mxs_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)&lt;/P&gt;&lt;P&gt;+static int mxs_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; int i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; int err;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!msgs-&amp;gt;len)&lt;/P&gt;&lt;P&gt;+ {&lt;/P&gt;&lt;P&gt;&amp;nbsp; return -EINVAL;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; num; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; err = mxs_i2c_xfer_msg(adap, &amp;amp;msgs[i], (i == (num - 1)));&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (err)&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (err == 0)&lt;/P&gt;&lt;P&gt;&amp;nbsp; err = num;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;- return err;&lt;/P&gt;&lt;P&gt;+ return err;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; static u32 mxs_i2c_func(struct i2c_adapter *adap)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL &amp;amp; ~I2C_FUNC_SMBUS_QUICK);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;+#define I2C_IRQ_MASK 0x000000FF&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; static irqreturn_t mxs_i2c_dma_isr(int this_irq, void *dev_id)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;@@ -389,20 +430,21 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; complete(&amp;amp;mxs_i2c-&amp;gt;cmd_complete);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-#define I2C_IRQ_MASK 0x000000FF&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct mxs_i2c_dev *mxs_i2c = dev_id;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 stat;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 done_mask =&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BM_I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ | BM_I2C_CTRL1_BUS_FREE_IRQ;&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; stat = __raw_readl(mxs_i2c-&amp;gt;regbase + HW_I2C_CTRL1) &amp;amp; I2C_IRQ_MASK;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!stat)&lt;/P&gt;&lt;P&gt;&amp;nbsp; return IRQ_NONE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (stat &amp;amp; BM_I2C_CTRL1_NO_SLAVE_ACK_IRQ) {&lt;/P&gt;&lt;P&gt;- mxs_i2c-&amp;gt;cmd_err = -EREMOTEIO;&lt;/P&gt;&lt;P&gt;+ mxs_i2c-&amp;gt;cmd_err = -ENXIO;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* it takes long time to reset i2c */&lt;/P&gt;&lt;P&gt;&amp;nbsp; schedule_work(&amp;amp;mxs_i2c-&amp;gt;work);&lt;/P&gt;&lt;P&gt;&amp;nbsp; goto done;&lt;/P&gt;&lt;P&gt;@@ -499,6 +541,13 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; goto no_dma_irq;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ if (pdata-&amp;gt;speed == 400000)&lt;/P&gt;&lt;P&gt;+ mxs_i2c-&amp;gt;speed = mxs_i2c_400kHz_config;&lt;/P&gt;&lt;P&gt;+ else&lt;/P&gt;&lt;P&gt;+ mxs_i2c-&amp;gt;speed = mxs_i2c_95kHz_config;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* reset I2C module */&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_reset_block((void __iomem *)mxs_i2c-&amp;gt;regbase, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; platform_set_drvdata(pdev, mxs_i2c);&lt;/P&gt;&lt;P&gt;@@ -537,7 +586,6 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; INIT_WORK(&amp;amp;mxs_i2c-&amp;gt;work, mxs_i2c_task);&lt;/P&gt;&lt;P&gt;-&lt;/P&gt;&lt;P&gt;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; no_i2c_adapter:&lt;/P&gt;&lt;P&gt;diff -Naur a/drivers/i2c/busses/i2c-mxs.h b/drivers/i2c/busses/i2c-mxs.h&lt;/P&gt;&lt;P&gt;--- a/drivers/i2c/busses/i2c-mxs.h 2013-05-02 18:20:08.000000000 +0200&lt;/P&gt;&lt;P&gt;+++ b/drivers/i2c/busses/i2c-mxs.h 2013-05-02 18:32:23.000000000 +0200&lt;/P&gt;&lt;P&gt;@@ -19,8 +19,16 @@&lt;/P&gt;&lt;P&gt; #ifndef _I2C_H&lt;/P&gt;&lt;P&gt; #define _I2C_H&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+/* 2 for read, 1 for write */&lt;/P&gt;&lt;P&gt; #define I2C_READ&amp;nbsp;&amp;nbsp; 1&lt;/P&gt;&lt;P&gt; #define I2C_WRITE&amp;nbsp; 0&lt;/P&gt;&lt;P&gt;+#define NR_DESC 3&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+struct mxs_i2c_speed_config {&lt;/P&gt;&lt;P&gt;+ u32 timing0;&lt;/P&gt;&lt;P&gt;+ u32 timing1;&lt;/P&gt;&lt;P&gt;+ u32 timing2;&lt;/P&gt;&lt;P&gt;+};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; struct mxs_i2c_dev {&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct device *dev;&lt;/P&gt;&lt;P&gt;@@ -38,5 +46,9 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; spinlock_t lock;&lt;/P&gt;&lt;P&gt;&amp;nbsp; wait_queue_head_t queue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct work_struct work;&lt;/P&gt;&lt;P&gt;+ struct mxs_i2c_speed_config speed;&lt;/P&gt;&lt;P&gt;+ u8 *i2c_buf_virt;&lt;/P&gt;&lt;P&gt;+ dma_addr_t i2c_buf_phys;&lt;/P&gt;&lt;P&gt;+ struct mxs_dma_desc *desc[NR_DESC];&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt; diff -Naur a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig&lt;/P&gt;&lt;P&gt;--- a/drivers/i2c/busses/Kconfig 2013-05-02 18:20:05.000000000 +0200&lt;/P&gt;&lt;P&gt;+++ b/drivers/i2c/busses/Kconfig 2013-05-02 18:32:23.000000000 +0200&lt;/P&gt;&lt;P&gt;@@ -470,6 +470,12 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; say yes if you are sure transfer length is eqaul to or less than 24 bytes.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Otherwise say no to use DMA mode by default.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+config I2C_MXS_SELECT0_400_MODE&lt;/P&gt;&lt;P&gt;+ bool "MXS I2C0 speed at 400kHz"&lt;/P&gt;&lt;P&gt;+ depends on (I2C_MXS_SELECT0 &amp;amp;&amp;amp; !ARCH_MX23)&lt;/P&gt;&lt;P&gt;+ help&lt;/P&gt;&lt;P&gt;+&amp;nbsp; say yes if you want to have 400kHz speed I2C.&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; config I2C_MXS_SELECT1&lt;/P&gt;&lt;P&gt;&amp;nbsp; bool "Enable I2C1 module"&lt;/P&gt;&lt;P&gt;&amp;nbsp; depends on (I2C_MXS &amp;amp;&amp;amp; !ARCH_MX23)&lt;/P&gt;&lt;P&gt;@@ -483,6 +489,12 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; say yes if you are sure transfer length is eqaul to or less than 24 bytes.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Otherwise say no to use DMA mode by default.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+config I2C_MXS_SELECT1_400_MODE&lt;/P&gt;&lt;P&gt;+ bool "MXS I2C1 speed at 400kHz"&lt;/P&gt;&lt;P&gt;+ depends on (I2C_MXS_SELECT1 &amp;amp;&amp;amp; !ARCH_MX23)&lt;/P&gt;&lt;P&gt;+ help&lt;/P&gt;&lt;P&gt;+&amp;nbsp; say yes if you want to have 400kHz speed I2C.&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; config I2C_STMP378X&lt;/P&gt;&lt;P&gt;&amp;nbsp; tristate "STMP378x I2C adapter"&lt;/P&gt;&lt;P&gt;&amp;nbsp; depends on MACH_STMP378X&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;--------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 03 Oct 2013 07:31:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208750#M12257</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2013-10-03T07:31:33Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208751#M12258</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks a lot Samuel, it really helped a lot where I was struggling from many days,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But now the issue is after applying the path which you mentioned above am getting more than 400Khz, ie.,  I am getting the I2C_SCL as 436.3902 Khz as shown in the above attachment , could you please let me know how this can be accurated to 400Khz, as am using "L2.6.35_10.12.01_ER_source" I.MX28 BSP and the above patch is applied on this source code, &amp;amp; am using i.Mx28 EVK PCB  REV D board&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Awaiting for your replies as early. &amp;amp; would really appreciate for your help&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Many Thanks a lot in advance&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 09 Oct 2013 13:06:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208751#M12258</guid>
      <dc:creator>srinivasanshanm</dc:creator>
      <dc:date>2013-10-09T13:06:45Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208752#M12259</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;Once again many thanks for the above patch&lt;/P&gt;&lt;P&gt;In the above patch, I suspect that the below highlighted code is required or not,&amp;nbsp; if am not wrong, could you please confirm &amp;amp; I suspect that the above patch configures.. I2C0 &amp;amp; I2C1 buses.. to 400 Khz, if possible could you please provide if any options of how to readback the the configured register values ie.,&lt;/P&gt;&lt;P style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #3d3d3d;"&gt;.timing0 = 0x000f0007, .timing1 = 0x001f000f, .timing2 = 0x00300030, because I suspect that am not getting 400khz even after configuring, hope this readback of these register values.. should help in order to verify whether my configuration is correct or not through I2C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static struct mxs_i2c_plat_data i2c1_platdata = {&lt;/P&gt;&lt;P&gt;#ifdef CONFIG_I2C_MXS_SELECT1_PIOQUEUE_MODE&lt;/P&gt;&lt;P&gt;&amp;nbsp; .pioqueue_mode = 1,&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#ifdef&amp;nbsp; CONFIG_I2C_MXS_SELECT1_400_MODE&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .speed =&amp;nbsp; 400000,&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#endif&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static struct mxs_i2c_plat_data i2c0_platdata = {&lt;/P&gt;&lt;P&gt;#ifdef CONFIG_I2C_MXS_SELECT0_PIOQUEUE_MODE&lt;/P&gt;&lt;P&gt;&amp;nbsp; .pioqueue_mode = 1,&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#ifdef&amp;nbsp; CONFIG_I2C_MXS_SELECT0_400_MODE&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .speed =&amp;nbsp; 400000,&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#endif&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Kindly do the needful if as early as possible, as only this is pending for my verification of the configures register values&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 11 Oct 2013 18:36:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208752#M12259</guid>
      <dc:creator>srinivasanshanm</dc:creator>
      <dc:date>2013-10-11T18:36:16Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208753#M12260</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;you find the maximum info in the chapter 27 of the document MCIMX28RM page 1729/2327&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://free-electrons.com/~maxime/pub/datasheet/MCIMX28RM.pdf" style="font-size: 10pt; line-height: 1.5em;"&gt;http://free-electrons.com/~maxime/pub/datasheet/MCIMX28RM.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And in chapter 27.5.2 or 27.5.3 you will find examples. I never try another frequencies, so if you try to understand the "bit" combination of the register, you will be able to change the frequency.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And I remeber if the bus make a reset, you will not have the modified values. Try to put these lines in i2c-mxs.c / function "mxs_i2c_reset" after "mxs_reset_block((void __iomem *)mxs_i2c-&amp;gt;regbase, 0);"&lt;/P&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing0, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING0);&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing1, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING1);&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing2, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING2);&lt;/P&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Another possibility is to ask freescale via you FAE or provider.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good luck and if you achieve you problem, please tell us what you did!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sam.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 Oct 2013 07:24:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208753#M12260</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2013-10-14T07:24:04Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208754#M12261</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Sam,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for your replies,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Even I suspect the bus is getting reset, could you please let me know should the below line is to be put as&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing0, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing1, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_95kHz_config.timing2, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;OR&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_400kHz_config.timing0, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_400kHz_config.timing1, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;writel(mxs_i2c_400kHz_config.timing2, mxs_i2c-&amp;gt;regbase + HW_I2C_TIMING2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 Oct 2013 05:52:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208754#M12261</guid>
      <dc:creator>srinivasanshanm</dc:creator>
      <dc:date>2013-10-15T05:52:51Z</dc:date>
    </item>
    <item>
      <title>Re: Conflict on 2 I2C buses</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208755#M12262</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The second choice is right if you choose 400kHz.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sam&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 16 Oct 2013 06:39:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Conflict-on-2-I2C-buses/m-p/208755#M12262</guid>
      <dc:creator>samuelsalas</dc:creator>
      <dc:date>2013-10-16T06:39:15Z</dc:date>
    </item>
  </channel>
</rss>

