Commit eb695dbf authored by Adrian McMenamin's avatar Adrian McMenamin Committed by Paul Mundt

sh: Fix Dreamcast DMA issues.

The current SH DMA API is somewhat broken, not correctly matching
virtual channel to the correct SH DMAC. This wasn't noticeable when
using g2 DMA for the sound driver - one channel 0 is as good as any
other! - but caused the pvr2 driver to fail.

This patch fixes the pvr2 problem and consequently fixes the sound
driver to ensure it continues to function.

Signed-off by: Adrian McMenamin <adrian@mcmen.demon.co.uk>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 8cf1a743
...@@ -31,8 +31,8 @@ struct dma_info *get_dma_info(unsigned int chan) ...@@ -31,8 +31,8 @@ struct dma_info *get_dma_info(unsigned int chan)
* the channel is. * the channel is.
*/ */
list_for_each_entry(info, &registered_dmac_list, list) { list_for_each_entry(info, &registered_dmac_list, list) {
if ((chan < info->first_channel_nr) || if ((chan < info->first_vchannel_nr) ||
(chan >= info->first_channel_nr + info->nr_channels)) (chan >= info->first_vchannel_nr + info->nr_channels))
continue; continue;
return info; return info;
...@@ -82,7 +82,7 @@ struct dma_channel *get_dma_channel(unsigned int chan) ...@@ -82,7 +82,7 @@ struct dma_channel *get_dma_channel(unsigned int chan)
for (i = 0; i < info->nr_channels; i++) { for (i = 0; i < info->nr_channels; i++) {
channel = &info->channels[i]; channel = &info->channels[i];
if (channel->chan == chan) if (channel->vchan == chan)
return channel; return channel;
} }
...@@ -369,6 +369,7 @@ int register_dmac(struct dma_info *info) ...@@ -369,6 +369,7 @@ int register_dmac(struct dma_info *info)
} }
total_channels = get_nr_channels(); total_channels = get_nr_channels();
info->first_vchannel_nr = total_channels;
for (i = 0; i < info->nr_channels; i++) { for (i = 0; i < info->nr_channels; i++) {
struct dma_channel *chan = &info->channels[i]; struct dma_channel *chan = &info->channels[i];
......
...@@ -111,6 +111,7 @@ struct dma_info { ...@@ -111,6 +111,7 @@ struct dma_info {
struct list_head list; struct list_head list;
int first_channel_nr; int first_channel_nr;
int first_vchannel_nr;
}; };
struct dma_chan_caps { struct dma_chan_caps {
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
#define AICA_CHANNEL1_OFFSET 0x21000 #define AICA_CHANNEL1_OFFSET 0x21000
#define CHANNEL_OFFSET 0x10000 #define CHANNEL_OFFSET 0x10000
#define AICA_DMA_CHANNEL 0 #define AICA_DMA_CHANNEL 5
#define AICA_DMA_MODE 5 #define AICA_DMA_MODE 5
#define SND_AICA_DRIVER "AICA" #define SND_AICA_DRIVER "AICA"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment