On Sat, Feb 1, 2014 at 1:15 AM, m silverstri <michael.j.silverstri@xxxxxxxxx> wrote: > By driver code , I mean the code which set the register values and > wait till the values is set (via an interrupt handler) before > continues doing something else ok so you are looking for below code: some_func() { set_register_value x_variable=0 wait_for_event*(x_variable); } interrupt_handler(){ x_variable=1 wake_up(); } request_irq(interrupt_handler); > > > On Sat, Feb 1, 2014 at 1:06 AM, anish singh <anish198519851985@xxxxxxxxx> wrote: >> On Sat, Feb 1, 2014 at 1:03 AM, m silverstri >> <michael.j.silverstri@xxxxxxxxx> wrote: >>> On Sat, Feb 1, 2014 at 12:48 AM, anish singh >>> <anish198519851985@xxxxxxxxx> wrote: >>>> On Sat, Feb 1, 2014 at 12:32 AM, m silverstri >>>> <michael.j.silverstri@xxxxxxxxx> wrote: >>>> don't top-post >>>> >>>>> In my driver code, >>>>> I want to set a bit in a HW Register 1. HW will send an interrupt >>>> Yes this is how most drivers work. >>>> >>>>> when setting the register is done. >>>>> I don't want my driver code to block until the interrupt is sent from the HW. >>>> so i suppose this is what you want to do. >>>> >>>> >>>> write ->register->interrupt happens->disable register ->handle interrupt >>>> --->enable register. >>>> Look at any driver code from linux kernel code and it mostly does this. >>>>> >>> >>> Thanks. >>> But I want my driver code to block until I get the interrupt from HW. >> >> if (driver code == interrupt handler) { >> it_is_not_running_anyway_as_there_is_no_interrupt >> } else { >> i don't know what you mean by driver code here? >> } >>> >>> >>> >>>>> >>>>> >>>>> On Sat, Feb 1, 2014 at 12:06 AM, anish singh >>>>> <anish198519851985@xxxxxxxxx> wrote: >>>>>> On Fri, Jan 31, 2014 at 11:55 PM, m silverstri >>>>>> <michael.j.silverstri@xxxxxxxxx> wrote: >>>>>>> Hi, >>>>>>> >>>>>>> I read this article http://www.linuxjournal.com/article/5833 to learn >>>>>>> about spinlock. I try this to use it in my kernel driver. >>>>>>> >>>>>>> Here is what my driver code needs to do: >>>>>>> In f1(), it will get the spin lock, and caller can call f2() will wait >>>>>>> for the lock since the spin lock is not being unlock. The spin lock >>>>>>> will be unlock in my interrupt handler (triggered by the HW). >>>>>> Wrong design!!! >>>>>>> >>>>>>> void f1() { >>>>>>> spin_lock(&mylock); >>>>>>> // write hardware >>>>>>> REG_ADDR += FLAG_A; >>>>>> So here you take spinlock and release in interrupt handler.What >>>>>> if there is no interrupt handler and someone calls this fucntion >>>>>> he will blocked forever. >>>>>>> >>>>>>> } >>>>>>> >>>>>>> void f2() { >>>>>>> spin_lock(&mylock); >>>>>>> //... >>>>>>> } >>>>>>> >>>>>>> The hardware will send the application an interrupt and my interrupt >>>>>>> handler will call spin_unlock(&mylock); >>>>>>> >>>>>>> My question is if I call >>>>>>> f1() >>>>>>> f2() // i want this to block until the interrupt return saying settingyou >>>>>>> REG_ADDR is done. >>>>>>> >>>>>>> when I run this, I get an exception in kernel saying a deadlock " >>>>>>> INFO: possible recursive locking detected" >>>>>>> >>>>>>> How can I re-write my code so that kernel does not think I have a deadlock? >>>>>>> >>>>>>> I want my driver code to wait until HW sends me an interrupt saying >>>>>>> setting REG_ADDR is done. >>>>>> Let us know what is your requirement?I am sure there must be a simple >>>>>> way to handle than this magic done here. >>>>>> Explain what are you trying to do in detail and I am sure lot of >>>>>> people will jump >>>>>> to help. >>>>>>> >>>>>>> Thank you. >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Kernelnewbies mailing list >>>>>>> Kernelnewbies@xxxxxxxxxxxxxxxxx >>>>>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies