<div dir="ltr"><div><div>I also found that we having problems with MCP supply, so this is it! Thanks anish for your reply!<br><br></div>Cheers,<br></div>- dhs<br><div><div><div><br><br><div><div class="gmail_extra"><div class="gmail_quote">2015-09-09 15:30 GMT-03:00 Daniel. <span dir="ltr">&lt;<a href="mailto:danielhilst@gmail.com" target="_blank">danielhilst@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I&#39;ve checked the iomux configuration, there was some pins miss<br>
configured. Anyway I&#39;m still losing IRQs. But now I have some hints<br>
from kernel. Now I see that I&#39;m hitting this line:<br>
<a href="https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L380" rel="noreferrer" target="_blank">https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L380</a><br>
which traces to:<br>
<br>
<br>
spi32766-72    [000] ....  1728.245798: mcp23s17_produce_complete:<br>
mcp23s08: Error on SPI transfer, -115<br>
<br>
>From errno.h 115 means &quot;operation in progress&quot;:<br>
<a href="http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h?v=3.10#L88" rel="noreferrer" target="_blank">http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h?v=3.10#L88</a><br>
<br>
So I need to take a look from ecspi (imx6 spi controller) code/clock/rates etc.<br>
<br>
Cheers,<br>
- dhs<br>
<div class="HOEnZb"><div class="h5"><br>
2015-09-08 18:23 GMT-03:00 Daniel. &lt;<a href="mailto:danielhilst@gmail.com">danielhilst@gmail.com</a>&gt;:<br>
&gt; Even spi_async sleeps? I thought that spi_async wouldn&#39;t sleep :/<br>
&gt;<br>
&gt; I have a board with an MCP23S17 gpio expander that is used as an<br>
&gt; digital input. I need to notify my application every time that any<br>
&gt; input status changes. The MCP triggers an interrupt every time that an<br>
&gt; input changes, but, the application may not be able to poll the MCP at<br>
&gt; the same rate that the input changes, so I used a circular queue at<br>
&gt; MCP driver. I need to add input changes (readed from INTCAP) as soon<br>
&gt; as they came, to be free to get new input changes as soon as possible.<br>
&gt; I&#39;m looking for 1ms resolution here, so, summarizing, I want to be<br>
&gt; able to enqueue input changes at each 1ms.<br>
&gt;<br>
&gt; The MCP works like this.<br>
&gt;<br>
&gt; 1 - Input changes (set IRQ flags)<br>
&gt; 2 - Raise IRQ<br>
&gt; 3 - IRS reads INTCAP (this clears IRQ flags)<br>
&gt;<br>
&gt; Okay, ... I was enqueing on the threaded IRQ, but was losing events.<br>
&gt; The &quot;losing events&quot; here means that I got two interrupts in a row,<br>
&gt; with same INTCAP values, so I got input changes notification (IRS<br>
&gt; called) with no input changes. I think that a new interrupt is being<br>
&gt; raised before I read INTCAP so it got masked. The big question is: How<br>
&gt; to read INTCAP as fast as possible?<br>
&gt;<br>
&gt; This is why I tried spi_async in interrupt context. (mcp_hard_irq),<br>
&gt; but I&#39;m still losing events at 1ms resolution.<br>
&gt;<br>
&gt; So, explaning the mess I did in the code :), first of all I&#39;ve updated<br>
&gt; the code, is still in the same link:<br>
&gt; <a href="https://gist.github.com/gkos/4cce494e90518077084a" rel="noreferrer" target="_blank">https://gist.github.com/gkos/4cce494e90518077084a</a><br>
&gt;<br>
&gt; I&#39;ve decided to use a producing/consuming aproach, since application<br>
&gt; will never be abble to poll input status at same rate that it changes<br>
&gt; I need to enqueue it. To do this I&#39;ve created a new function inside<br>
&gt; this module. mcp_getlast() should take the last element in queue, or<br>
&gt; wait for next event if is empty, is my consumer, here it is:<br>
&gt; <a href="https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L182" rel="noreferrer" target="_blank">https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L182</a><br>
&gt;<br>
&gt; The procucer is the mcp23s17_produce_complete handler, it should<br>
&gt; enqueue INTCAP and return. This is it!<br>
&gt; <a href="https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L346" rel="noreferrer" target="_blank">https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L346</a><br>
&gt;<br>
&gt; I&#39;ve enabled tracing on my kernel (3.10.53 running on an i.MX6 quad).<br>
&gt; At the trace file I got this lines:<br>
&gt;         spi32766-72    [000] d...  2589.220910:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff01<br>
&gt;         spi32766-72    [000] d...  2589.222973:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff00<br>
&gt;         spi32766-72    [000] d...  2589.223235:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff01<br>
&gt;         spi32766-72    [000] d...  2589.226119:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff00<br>
&gt;         spi32766-72    [000] d...  2589.227631:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff00<br>
&gt;         spi32766-72    [000] d...  2589.227898:<br>
&gt; mcp23s17_produce_complete: mcp23s08: produced ffffff01<br>
&gt;<br>
&gt; There is possible see that INTCAP repeated (..ff00). This my problem!<br>
&gt;<br>
&gt; Well, thanks anybody that readed that long, any ideia would be helpful<br>
&gt;<br>
&gt; Best regards,<br>
&gt;<br>
&gt;<br>
&gt; 2015-09-08 16:30 GMT-03:00 anish singh &lt;<a href="mailto:anish198519851985@gmail.com">anish198519851985@gmail.com</a>&gt;:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Sep 8, 2015 at 10:19 AM, Daniel. &lt;<a href="mailto:danielhilst@gmail.com">danielhilst@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Hi all,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I&#39;m dealing with a SPI driver and I have a doubt. I need to read and write<br>
&gt;&gt;&gt; data to spi (registers and values) inside interrupt handler. I want to know<br>
&gt;&gt;&gt; if this pattern is safe or if I&#39;ll face problems with it.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; AFAIK the spi calls sleep, so it is not safe.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This code is being added to gpio-mcp23s08.c driver to handle IRQ and save<br>
&gt;&gt;&gt; INTCAP at interruption time. INTCAP register keeps the input port status at<br>
&gt;&gt;&gt; interruption time. I want to capture this as fast as possible and put it at<br>
&gt;&gt;&gt; a circular queue. I write this code inspired by spi_sync function, but using<br>
&gt;&gt;&gt; spinlocks so it doesn&#39;t sleeps. But, these spin_(un)lock calls seems a bad<br>
&gt;&gt;&gt; ideia to me. Any better idea or guidelines?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Here is the code.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; <a href="https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L440" rel="noreferrer" target="_blank">https://gist.github.com/gkos/4cce494e90518077084a#file-gpio-mcp23s08-c-L440</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The functions are mcp23s17_read_irqsafe and mcp23s17_read_irqsafe_complete<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; PS: The code is a little messed up (because I&#39;ve been trying to optimize<br>
&gt;&gt;&gt; this INTCAP capturing by many means)<br>
&gt;&gt;&gt;<br>
&gt;&gt;  What exactly you are trying to optimize you have not mentioned. I looked at<br>
&gt;&gt; the driver code<br>
&gt;&gt; you pointed out in your mail and looks like they are using threaded irq and<br>
&gt;&gt; I am sure that you<br>
&gt;&gt; understand that threaded irq can perform sleeping operations as it is<br>
&gt;&gt; basically a kthread.<br>
&gt;&gt;<br>
&gt;&gt; <a href="http://lxr.free-electrons.com/source/drivers/gpio/gpio-mcp23s08.c#L494" rel="noreferrer" target="_blank">http://lxr.free-electrons.com/source/drivers/gpio/gpio-mcp23s08.c#L494</a> so<br>
&gt;&gt; you can easily use<br>
&gt;&gt; spinlock here. It is not interrupt context.<br>
&gt;&gt;<br>
&gt;&gt; Generally if you are trying to optimize something in linux kernel you should<br>
&gt;&gt; be very clear about your goal.<br>
&gt;&gt;<br>
&gt;&gt;&gt; Cheers<br>
&gt;&gt;&gt; - dhs<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; --<br>
&gt;&gt;&gt; &quot;Do or do not. There is no try&quot;<br>
&gt;&gt;&gt;   Yoda Master<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; Kernelnewbies mailing list<br>
&gt;&gt;&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt;&gt;&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; &quot;Do or do not. There is no try&quot;<br>
&gt;   Yoda Master<br>
<br>
<br>
<br>
--<br>
&quot;Do or do not. There is no try&quot;<br>
  Yoda Master<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div style="text-align:right"><i>&quot;Do or do not. There is no try&quot;</i><br><i>  </i><i><b>Yoda Master</b></i><br></div></div>
</div></div></div></div></div></div>