<br><br><div class="gmail_quote">On Tue, Apr 5, 2011 at 11:57 PM, Kevin Hilman <span dir="ltr">&lt;<a href="mailto:khilman@ti.com">khilman@ti.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">&quot;Avinash.H.M&quot; &lt;<a href="mailto:avinashhm@ti.com">avinashhm@ti.com</a>&gt; writes:<br>
<br>
&gt; The i2c module has a special reset sequence. The sequence is<br>
&gt; - Disable the I2C.<br>
&gt; - Write to SOFTRESET bit.<br>
&gt; - Enable the I2C.<br>
&gt; - Poll on the RESETDONE bit.<br>
&gt; This sequence must be followed for i2c reset in omap2, omap3. The sequence is<br>
&gt; implemented as a function and the i2c_class is updated with the correct<br>
&gt; &#39;reset&#39; pointer.<br>
&gt;<br>
&gt; Cc: Rajendra Nayak &lt;<a href="mailto:rnayak@ti.com">rnayak@ti.com</a>&gt;<br>
&gt; Cc: Paul Walmsley &lt;<a href="mailto:paul@pwsan.com">paul@pwsan.com</a>&gt;<br>
&gt; Cc: Benoit Cousson &lt;<a href="mailto:b-cousson@ti.com">b-cousson@ti.com</a>&gt;<br>
&gt; Cc: Kevin Hilman &lt;<a href="mailto:khilman@ti.com">khilman@ti.com</a>&gt;<br>
&gt; Signed-off-by: Avinash.H.M &lt;<a href="mailto:avinashhm@ti.com">avinashhm@ti.com</a>&gt;<br>
<br>
</div>[...]<br>
<div class="im"><br>
&gt; +<br>
&gt; +/**<br>
&gt; + * omap_i2c_reset- reset the omap i2c module.<br>
&gt; + * @oh: struct omap_hwmod *<br>
&gt; + *<br>
&gt; + * The i2c moudle in omap2, omap3 had a special sequence to reset. The<br>
&gt; + * sequence is:<br>
&gt; + * - Disable the I2C.<br>
&gt; + * - Write to SOFTRESET bit.<br>
&gt; + * - Enable the I2C.<br>
&gt; + * - Poll on the RESETDONE bit.<br>
&gt; + * The sequence is implemented in below function. This is called for 2420,<br>
&gt; + * 2430 and omap3.<br>
&gt; + */<br>
&gt; +int omap_i2c_reset(struct omap_hwmod *oh)<br>
&gt; +{<br>
&gt; +     u32 v;<br>
&gt; +     int c = 0;<br>
&gt; +<br>
&gt; +     /* Disable I2C */<br>
&gt; +     v = omap_hwmod_read(oh, I2C_CON_OFFSET);<br>
&gt; +     v = v &amp; ~I2C_EN;<br>
&gt; +     omap_hwmod_write(v, oh, I2C_CON_OFFSET);<br>
&gt; +<br>
&gt; +     /* Write to the SOFTRESET bit */<br>
&gt; +     v = oh-&gt;_sysc_cache;<br>
&gt; +     v |= (0x1 &lt;&lt; oh-&gt;class-&gt;sysc-&gt;sysc_fields-&gt;srst_shift);<br>
&gt; +<br>
&gt; +     oh-&gt;_sysc_cache = v;<br>
&gt; +     omap_hwmod_write(v, oh, oh-&gt;class-&gt;sysc-&gt;sysc_offs);<br>
<br>
</div>Direct SYSCONFIG access isn&#39;t right here.   This should go through<br>
omap_hwmod.<br>
<br>
What is probably needed is exposing _ocp_softreset to device code<br>
via something like omap_hwmod_ocp_softreset() and calling that here.<br>
<font color="#888888"><br></font></blockquote><div><br>Hi Kevin , <br><br>thanks for the review. <br><br>OK. I ll create a wrapper function &#39; omap_hwmod_ocp_softreset&#39;<br>around &#39;_ocp_softreset&#39; and call it here .<br>
</div><div><br>b r ,<br>- avinash.<br><br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><font color="#888888">
Kevin<br>
</font></blockquote></div><br>