<p><br>
On Feb 4, 2014 12:00 AM, &quot;m silverstri&quot; &lt;<a href="mailto:michael.j.silverstri@gmail.com">michael.j.silverstri@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Thanks Arun,<br>
&gt;<br>
&gt; But why not just use mutex and remove the completion?<br>
&gt; i.e. do this:<br>
&gt;<br>
&gt; struct mutex dev_lock;<br>
&gt;<br>
&gt; some_func()<br>
&gt; {<br>
&gt; mutex_lock(&amp;dev_lock);<br>
&gt; set_register_value<br>
&gt;<br>
&gt;<br>
&gt; }<br>
&gt;<br>
You&#39;ll block all tasks until your handler unlock the mutex. </p>
<p>The idea is to let the tasks block on driver code and let them submit request to your driver.</p>
<p>This mutex should be private to your driver code and not visible to upper layer tasks. </p>
<p>&gt; interrupt_handler(){<br>
&gt; mutex_unloc(&amp;dev_lock);<br>
&gt; }</p>
<p>What if the interrupt never happens? Or is lost?.</p>
<p>Whatever your task want to do with device it should be like a private binding. Like for example the input buffer would be per task and the output as well.</p>
<p>Your device may handle multiple functions so setting register values should also be per task. So it can be like each task sets the desired value in the request structure and when driver gets to this request it would call the appropriate function to set the values for register. I would recommend keeping register setting functions private to your driver code and only expose some integers corresponding to functions provided by your device.</p>

<p>Keeping it clean will help you manage your code.<br>
&gt;<br>
&gt; mutex_init(&amp;dev_lock);<br>
&gt; request_irq(interrupt_handler);<br>
&gt;<br>
&gt; On Mon, Feb 3, 2014 at 1:54 AM, Arun KS &lt;<a href="mailto:getarunks@gmail.com">getarunks@gmail.com</a>&gt; wrote:<br>
&gt; &gt; Hi Silverstri,<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; On Sun, Feb 2, 2014 at 1:19 PM, m silverstri<br>
&gt; &gt; &lt;<a href="mailto:michael.j.silverstri@gmail.com">michael.j.silverstri@gmail.com</a>&gt; wrote:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; On Sat, Feb 1, 2014 at 5:34 AM, Josh Cartwright &lt;<a href="mailto:joshc@eso.teric.us">joshc@eso.teric.us</a>&gt;<br>
&gt; &gt;&gt; wrote:<br>
&gt; &gt;&gt; &gt; On Sat, Feb 01, 2014 at 01:32:49AM -0800, anish singh wrote:<br>
&gt; &gt;&gt; &gt;&gt; On Sat, Feb 1, 2014 at 1:15 AM, m silverstri<br>
&gt; &gt;&gt; &gt;&gt; &lt;<a href="mailto:michael.j.silverstri@gmail.com">michael.j.silverstri@gmail.com</a>&gt; wrote:<br>
&gt; &gt;&gt; &gt;&gt; &gt; By driver code , I mean the code which set the register values and<br>
&gt; &gt;&gt; &gt;&gt; &gt; wait till the values is set (via an interrupt handler) before<br>
&gt; &gt;&gt; &gt;&gt; &gt; continues doing something else<br>
&gt; &gt;&gt; &gt;&gt; ok so you are looking for below code:<br>
&gt; &gt;&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt;&gt; some_func()<br>
&gt; &gt;&gt; &gt;&gt; {<br>
&gt; &gt;&gt; &gt;&gt; set_register_value<br>
&gt; &gt;&gt; &gt;&gt; x_variable=0<br>
&gt; &gt;&gt; &gt;&gt; wait_for_event*(x_variable);<br>
&gt; &gt;&gt; &gt;&gt; }<br>
&gt; &gt;&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt;&gt; interrupt_handler(){<br>
&gt; &gt;&gt; &gt;&gt; x_variable=1<br>
&gt; &gt;&gt; &gt;&gt; wake_up();<br>
&gt; &gt;&gt; &gt;&gt; }<br>
&gt; &gt;&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt;&gt; request_irq(interrupt_handler);<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt; Please investigate the usage of completions in your driver.  See<br>
&gt; &gt;&gt; &gt; include/linux/completion.h.  It sounds like it fits your usecase nicely.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt;   Josh<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; I have loooked at linux completion for my usecase<br>
&gt; &gt;&gt; So I think I can do<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; DECLARE_COMPLETION(my_completion);<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; some_func()<br>
&gt; &gt;&gt; {<br>
&gt; &gt;&gt; set_register_value<br>
&gt; &gt;&gt; wait_for_completion(my_completion);<br>
&gt; &gt;&gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; interrupt_handler(){<br>
&gt; &gt;&gt; complete(my_completion);<br>
&gt; &gt;&gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; request_irq(interrupt_handler);<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; My question now is what if 1 kernel thread execute some_funct(), but<br>
&gt; &gt;&gt; before interrupt_handler() get invoked (from HW), another kernel<br>
&gt; &gt;&gt; thread executes some_func(). In essence, set_register_value is execute<br>
&gt; &gt;&gt; twice before interrupt_handler() return once.<br>
&gt; &gt;<br>
&gt; &gt; Use a mutex_lock().<br>
&gt; &gt; So your code will be as follows:<br>
&gt; &gt;<br>
&gt; &gt; DECLARE_COMPLETION(my_completion);<br>
&gt; &gt; struct mutex dev_lock;<br>
&gt; &gt;<br>
&gt; &gt; some_func()<br>
&gt; &gt; {<br>
&gt; &gt; mutex_lock(&amp;dev_lock);<br>
&gt; &gt; set_register_value<br>
&gt; &gt; wait_for_completion(my_completion);<br>
&gt; &gt; mutex_unloc(&amp;dev_lock);<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; interrupt_handler(){<br>
&gt; &gt; complete(my_completion);<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; mutex_init(&amp;dev_lock);<br>
&gt; &gt; request_irq(interrupt_handler);<br>
&gt; &gt;<br>
&gt; &gt; Thanks,<br>
&gt; &gt; Arun<br>
&gt; &gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; how can I prevent another kernel thread from executing<br>
&gt; &gt;&gt; &quot;set_register_value()&quot; when 1 is wait_for_completion?<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">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a></p>
<p>   ---P.K.S</p>