Messages in this thread |  | | | Date | Wed, 1 Apr 2009 10:28:30 +0200 | | From | Haavard Skinnemoen <> | | Subject | Re: [PATCH 2/2] dw_dmac: add cyclic API to DW DMA driver |
| |
Sosnowski, Maciej wrote: > > +void dw_dma_cyclic_stop(struct dma_chan *chan) > > +{ > > + struct dw_dma_chan *dwc = to_dw_dma_chan(chan); > > + struct dw_dma *dw = to_dw_dma(dwc->chan.device); > > + > > + channel_clear_bit(dw, CH_EN, dwc->mask); > > + while (dma_readl(dw, CH_EN) & dwc->mask) > > + cpu_relax(); > > +} > > Don't you need locks in dw_dma_cyclic_stop?
Good question. On one hand, if cyclic_start() can race with cyclic_stop(), the client probably has more serious issues to deal with. On the other hand, if something ever manages to set the CH_EN bit at the wrong moment, the loop may never finish.
So it's probably safest to wrap it in spin_lock_bh(). You should probably add a note that this function can not be called from interrupt context too.
Haavard
|  |