Lines Matching refs:idma
56 static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma) in iomd_get_next_sg() argument
60 if (idma->dma.sg) { in iomd_get_next_sg()
61 sg->dma_address = idma->dma_addr; in iomd_get_next_sg()
64 end = offset + idma->dma_len; in iomd_get_next_sg()
74 idma->dma_len -= end - offset; in iomd_get_next_sg()
75 idma->dma_addr += end - offset; in iomd_get_next_sg()
77 if (idma->dma_len == 0) { in iomd_get_next_sg()
78 if (idma->dma.sgcount > 1) { in iomd_get_next_sg()
79 idma->dma.sg = sg_next(idma->dma.sg); in iomd_get_next_sg()
80 idma->dma_addr = idma->dma.sg->dma_address; in iomd_get_next_sg()
81 idma->dma_len = idma->dma.sg->length; in iomd_get_next_sg()
82 idma->dma.sgcount--; in iomd_get_next_sg()
84 idma->dma.sg = NULL; in iomd_get_next_sg()
99 struct iomd_dma *idma = dev_id; in iomd_dma_handle() local
100 unsigned long base = idma->base; in iomd_dma_handle()
109 if ((idma->state ^ status) & DMA_ST_AB) in iomd_dma_handle()
110 iomd_get_next_sg(&idma->cur_sg, idma); in iomd_dma_handle()
115 iomd_writel(idma->cur_sg.dma_address, base + CURA); in iomd_dma_handle()
116 iomd_writel(idma->cur_sg.length, base + ENDA); in iomd_dma_handle()
117 idma->state = DMA_ST_AB; in iomd_dma_handle()
122 iomd_writel(idma->cur_sg.dma_address, base + CURB); in iomd_dma_handle()
123 iomd_writel(idma->cur_sg.length, base + ENDB); in iomd_dma_handle()
124 idma->state = 0; in iomd_dma_handle()
129 idma->cur_sg.length == (DMA_END_S|DMA_END_L)) in iomd_dma_handle()
133 idma->state = ~DMA_ST_AB; in iomd_dma_handle()
141 struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma); in iomd_request_dma() local
143 return request_irq(idma->irq, iomd_dma_handle, in iomd_request_dma()
144 0, idma->dma.device_id, idma); in iomd_request_dma()
149 struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma); in iomd_free_dma() local
151 free_irq(idma->irq, idma); in iomd_free_dma()
156 struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma); in iomd_enable_dma() local
157 unsigned long dma_base = idma->base; in iomd_enable_dma()
160 if (idma->dma.invalid) { in iomd_enable_dma()
161 idma->dma.invalid = 0; in iomd_enable_dma()
167 if (!idma->dma.sg) { in iomd_enable_dma()
168 idma->dma.sg = &idma->dma.buf; in iomd_enable_dma()
169 idma->dma.sgcount = 1; in iomd_enable_dma()
170 idma->dma.buf.length = idma->dma.count; in iomd_enable_dma()
171 idma->dma.buf.dma_address = dma_map_single(NULL, in iomd_enable_dma()
172 idma->dma.addr, idma->dma.count, in iomd_enable_dma()
173 idma->dma.dma_mode == DMA_MODE_READ ? in iomd_enable_dma()
178 idma->state = DMA_ST_AB; in iomd_enable_dma()
181 if (idma->dma.dma_mode == DMA_MODE_READ) in iomd_enable_dma()
185 enable_irq(idma->irq); in iomd_enable_dma()
190 struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma); in iomd_disable_dma() local
191 unsigned long dma_base = idma->base; in iomd_disable_dma()
195 if (idma->state != ~DMA_ST_AB) in iomd_disable_dma()
196 disable_irq(idma->irq); in iomd_disable_dma()