| .. | .. |
|---|
| 23 | 23 | unsigned long flags; |
|---|
| 24 | 24 | dma_cookie_t cookie; |
|---|
| 25 | 25 | |
|---|
| 26 | | - spin_lock_irqsave(&vc->lock, flags); |
|---|
| 26 | + vchan_lock_irqsave(vc, flags); |
|---|
| 27 | 27 | cookie = dma_cookie_assign(tx); |
|---|
| 28 | 28 | |
|---|
| 29 | 29 | list_move_tail(&vd->node, &vc->desc_submitted); |
|---|
| 30 | | - spin_unlock_irqrestore(&vc->lock, flags); |
|---|
| 30 | + vchan_unlock_irqrestore(vc, flags); |
|---|
| 31 | 31 | |
|---|
| 32 | 32 | dev_dbg(vc->chan.device->dev, "vchan %p: txd %p[%x]: submitted\n", |
|---|
| 33 | 33 | vc, vd, cookie); |
|---|
| .. | .. |
|---|
| 52 | 52 | struct virt_dma_desc *vd = to_virt_desc(tx); |
|---|
| 53 | 53 | unsigned long flags; |
|---|
| 54 | 54 | |
|---|
| 55 | | - spin_lock_irqsave(&vc->lock, flags); |
|---|
| 55 | + vchan_lock_irqsave(vc, flags); |
|---|
| 56 | 56 | list_del(&vd->node); |
|---|
| 57 | | - spin_unlock_irqrestore(&vc->lock, flags); |
|---|
| 57 | + vchan_unlock_irqrestore(vc, flags); |
|---|
| 58 | 58 | |
|---|
| 59 | 59 | dev_dbg(vc->chan.device->dev, "vchan %p: txd %p[%x]: freeing\n", |
|---|
| 60 | 60 | vc, vd, vd->tx.cookie); |
|---|
| .. | .. |
|---|
| 87 | 87 | struct dmaengine_desc_callback cb; |
|---|
| 88 | 88 | LIST_HEAD(head); |
|---|
| 89 | 89 | |
|---|
| 90 | | - spin_lock_irq(&vc->lock); |
|---|
| 90 | + vchan_lock_irq(vc); |
|---|
| 91 | 91 | list_splice_tail_init(&vc->desc_completed, &head); |
|---|
| 92 | 92 | vd = vc->cyclic; |
|---|
| 93 | 93 | if (vd) { |
|---|
| .. | .. |
|---|
| 96 | 96 | } else { |
|---|
| 97 | 97 | memset(&cb, 0, sizeof(cb)); |
|---|
| 98 | 98 | } |
|---|
| 99 | | - spin_unlock_irq(&vc->lock); |
|---|
| 99 | + vchan_unlock_irq(vc); |
|---|
| 100 | 100 | |
|---|
| 101 | 101 | dmaengine_desc_callback_invoke(&cb, &vd->tx_result); |
|---|
| 102 | 102 | |
|---|
| .. | .. |
|---|
| 120 | 120 | } |
|---|
| 121 | 121 | EXPORT_SYMBOL_GPL(vchan_dma_desc_free_list); |
|---|
| 122 | 122 | |
|---|
| 123 | +#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB |
|---|
| 124 | + |
|---|
| 125 | +static void inband_init_chan_lock(struct virt_dma_chan *vc) |
|---|
| 126 | +{ |
|---|
| 127 | + spin_lock_init(&vc->lock); |
|---|
| 128 | +} |
|---|
| 129 | + |
|---|
| 130 | +static void inband_lock_chan(struct virt_dma_chan *vc) |
|---|
| 131 | +{ |
|---|
| 132 | + spin_lock(&vc->lock); |
|---|
| 133 | +} |
|---|
| 134 | + |
|---|
| 135 | +static void inband_unlock_chan(struct virt_dma_chan *vc) |
|---|
| 136 | +{ |
|---|
| 137 | + spin_unlock(&vc->lock); |
|---|
| 138 | +} |
|---|
| 139 | + |
|---|
| 140 | +static void inband_lock_irq_chan(struct virt_dma_chan *vc) |
|---|
| 141 | +{ |
|---|
| 142 | + spin_lock_irq(&vc->lock); |
|---|
| 143 | +} |
|---|
| 144 | + |
|---|
| 145 | +static void inband_unlock_irq_chan(struct virt_dma_chan *vc) |
|---|
| 146 | +{ |
|---|
| 147 | + spin_unlock_irq(&vc->lock); |
|---|
| 148 | +} |
|---|
| 149 | + |
|---|
| 150 | +static unsigned long inband_lock_irqsave_chan(struct virt_dma_chan *vc) |
|---|
| 151 | +{ |
|---|
| 152 | + unsigned long flags; |
|---|
| 153 | + |
|---|
| 154 | + spin_lock_irqsave(&vc->lock, flags); |
|---|
| 155 | + |
|---|
| 156 | + return flags; |
|---|
| 157 | +} |
|---|
| 158 | + |
|---|
| 159 | +static void inband_unlock_irqrestore_chan(struct virt_dma_chan *vc, |
|---|
| 160 | + unsigned long flags) |
|---|
| 161 | +{ |
|---|
| 162 | + spin_unlock_irqrestore(&vc->lock, flags); |
|---|
| 163 | +} |
|---|
| 164 | + |
|---|
| 165 | +static struct virt_dma_lockops inband_lock_ops = { |
|---|
| 166 | + .init = inband_init_chan_lock, |
|---|
| 167 | + .lock = inband_lock_chan, |
|---|
| 168 | + .unlock = inband_unlock_chan, |
|---|
| 169 | + .lock_irq = inband_lock_irq_chan, |
|---|
| 170 | + .unlock_irq = inband_unlock_irq_chan, |
|---|
| 171 | + .lock_irqsave = inband_lock_irqsave_chan, |
|---|
| 172 | + .unlock_irqrestore = inband_unlock_irqrestore_chan, |
|---|
| 173 | +}; |
|---|
| 174 | + |
|---|
| 175 | +static void oob_init_chan_lock(struct virt_dma_chan *vc) |
|---|
| 176 | +{ |
|---|
| 177 | + raw_spin_lock_init(&vc->oob_lock); |
|---|
| 178 | +} |
|---|
| 179 | + |
|---|
| 180 | +static void oob_lock_chan(struct virt_dma_chan *vc) |
|---|
| 181 | +{ |
|---|
| 182 | + raw_spin_lock(&vc->oob_lock); |
|---|
| 183 | +} |
|---|
| 184 | + |
|---|
| 185 | +static void oob_unlock_chan(struct virt_dma_chan *vc) |
|---|
| 186 | +{ |
|---|
| 187 | + raw_spin_unlock(&vc->oob_lock); |
|---|
| 188 | +} |
|---|
| 189 | + |
|---|
| 190 | +static void oob_lock_irq_chan(struct virt_dma_chan *vc) |
|---|
| 191 | +{ |
|---|
| 192 | + raw_spin_lock_irq(&vc->oob_lock); |
|---|
| 193 | +} |
|---|
| 194 | + |
|---|
| 195 | +static void oob_unlock_irq_chan(struct virt_dma_chan *vc) |
|---|
| 196 | +{ |
|---|
| 197 | + raw_spin_unlock_irq(&vc->oob_lock); |
|---|
| 198 | +} |
|---|
| 199 | + |
|---|
| 200 | +static unsigned long oob_lock_irqsave_chan(struct virt_dma_chan *vc) |
|---|
| 201 | +{ |
|---|
| 202 | + unsigned long flags; |
|---|
| 203 | + |
|---|
| 204 | + raw_spin_lock_irqsave(&vc->oob_lock, flags); |
|---|
| 205 | + |
|---|
| 206 | + return flags; |
|---|
| 207 | +} |
|---|
| 208 | + |
|---|
| 209 | +static void oob_unlock_irqrestore_chan(struct virt_dma_chan *vc, |
|---|
| 210 | + unsigned long flags) |
|---|
| 211 | +{ |
|---|
| 212 | + raw_spin_unlock_irqrestore(&vc->oob_lock, flags); |
|---|
| 213 | +} |
|---|
| 214 | + |
|---|
| 215 | +static struct virt_dma_lockops oob_lock_ops = { |
|---|
| 216 | + .init = oob_init_chan_lock, |
|---|
| 217 | + .lock = oob_lock_chan, |
|---|
| 218 | + .unlock = oob_unlock_chan, |
|---|
| 219 | + .lock_irq = oob_lock_irq_chan, |
|---|
| 220 | + .unlock_irq = oob_unlock_irq_chan, |
|---|
| 221 | + .lock_irqsave = oob_lock_irqsave_chan, |
|---|
| 222 | + .unlock_irqrestore = oob_unlock_irqrestore_chan, |
|---|
| 223 | +}; |
|---|
| 224 | + |
|---|
| 225 | +#endif |
|---|
| 226 | + |
|---|
| 123 | 227 | void vchan_init(struct virt_dma_chan *vc, struct dma_device *dmadev) |
|---|
| 124 | 228 | { |
|---|
| 125 | 229 | dma_cookie_init(&vc->chan); |
|---|
| 126 | 230 | |
|---|
| 127 | | - spin_lock_init(&vc->lock); |
|---|
| 231 | +#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB |
|---|
| 232 | + vc->lock_ops = test_bit(DMA_OOB, dmadev->cap_mask.bits) ? |
|---|
| 233 | + &oob_lock_ops : &inband_lock_ops; |
|---|
| 234 | +#endif |
|---|
| 235 | + vchan_lock_init(vc); |
|---|
| 128 | 236 | INIT_LIST_HEAD(&vc->desc_allocated); |
|---|
| 129 | 237 | INIT_LIST_HEAD(&vc->desc_submitted); |
|---|
| 130 | 238 | INIT_LIST_HEAD(&vc->desc_issued); |
|---|