static int g2_xfer_dma(struct dma_channel *chan) { unsigned int chan_nr = chan->chan; if (chan->sar & 31) { printk("g2dma: unaligned source 0x%lx\n", chan->sar); return -EINVAL; } if (chan->dar & 31) { printk("g2dma: unaligned dest 0x%lx\n", chan->dar); return -EINVAL; } /* Align the count */ if (chan->count & 31) chan->count = (chan->count + (32 - 1)) & ~(32 - 1); /* Fixup destination */ chan->dar += 0xa0800000; /* Fixup direction */ chan->mode = !chan->mode; flush_icache_range((unsigned long)chan->sar, chan->count); g2_disable_dma(chan); g2_dma->channel[chan_nr].g2_addr = chan->dar & 0x1fffffe0; g2_dma->channel[chan_nr].root_addr = chan->sar & 0x1fffffe0; g2_dma->channel[chan_nr].size = (chan->count & ~31) | 0x80000000; g2_dma->channel[chan_nr].direction = chan->mode; /* * bit 0 - ??? * bit 1 - if set, generate a hardware event on transfer completion * bit 2 - ??? something to do with suspend? */ g2_dma->channel[chan_nr].ctrl = 5; /* ?? */ g2_enable_dma(chan); /* debug cruft */ pr_debug("count, sar, dar, mode, ctrl, chan, xfer: %ld, 0x%08lx, " "0x%08lx, %ld, %ld, %ld, %ld\n", g2_dma->channel[chan_nr].size, g2_dma->channel[chan_nr].root_addr, g2_dma->channel[chan_nr].g2_addr, g2_dma->channel[chan_nr].direction, g2_dma->channel[chan_nr].ctrl, g2_dma->channel[chan_nr].chan_enable, g2_dma->channel[chan_nr].xfer_enable); return 0; }
static int g2_xfer_dma(struct dma_channel *chan) { unsigned int chan_nr = chan->chan; if (chan->sar & 31) { printk("g2dma: unaligned source 0x%lx\n", chan->sar); return -EINVAL; } if (chan->dar & 31) { printk("g2dma: unaligned dest 0x%lx\n", chan->dar); return -EINVAL; } if (chan->count & 31) chan->count = (chan->count + (32 - 1)) & ~(32 - 1); chan->dar += 0xa0800000; chan->mode = !chan->mode; flush_icache_range((unsigned long)chan->sar, chan->count); g2_disable_dma(chan); g2_dma->channel[chan_nr].g2_addr = chan->dar & 0x1fffffe0; g2_dma->channel[chan_nr].root_addr = chan->sar & 0x1fffffe0; g2_dma->channel[chan_nr].size = (chan->count & ~31) | 0x80000000; g2_dma->channel[chan_nr].direction = chan->mode; g2_dma->channel[chan_nr].ctrl = 5; g2_enable_dma(chan); pr_debug("count, sar, dar, mode, ctrl, chan, xfer: %ld, 0x%08lx, " "0x%08lx, %ld, %ld, %ld, %ld\n", g2_dma->channel[chan_nr].size, g2_dma->channel[chan_nr].root_addr, g2_dma->channel[chan_nr].g2_addr, g2_dma->channel[chan_nr].direction, g2_dma->channel[chan_nr].ctrl, g2_dma->channel[chan_nr].chan_enable, g2_dma->channel[chan_nr].xfer_enable); return 0; }