diff --git a/arch/sh/drivers/dma/dma-api.c b/arch/sh/drivers/dma/dma-api.c index cf8e119..0c9b3bc 100644 --- a/arch/sh/drivers/dma/dma-api.c +++ b/arch/sh/drivers/dma/dma-api.c @@ -31,8 +31,8 @@ struct dma_info *get_dma_info(unsigned int chan) * the channel is. */ list_for_each_entry(info, ®istered_dmac_list, list) { - if ((chan < info->first_channel_nr) || - (chan >= info->first_channel_nr + info->nr_channels)) + if ((chan < info->first_vchannel_nr) || + (chan >= info->first_vchannel_nr + info->nr_channels)) continue; return info; @@ -82,7 +82,7 @@ struct dma_channel *get_dma_channel(unsigned int chan) for (i = 0; i < info->nr_channels; i++) { channel = &info->channels[i]; - if (channel->chan == chan) + if (channel->chan == (chan - info->first_vchannel_nr)) return channel; } @@ -183,6 +183,7 @@ int dmac_search_free_channel(const char *dev_id) return result; atomic_set(&channel->busy, 1); + return channel->chan; } @@ -194,7 +195,6 @@ int request_dma(unsigned int chan, const char *dev_id) struct dma_channel *channel = { 0 }; struct dma_info *info = get_dma_info(chan); int result; - channel = get_dma_channel(chan); if (atomic_xchg(&channel->busy, 1)) return -EBUSY; @@ -369,6 +369,7 @@ int register_dmac(struct dma_info *info) } total_channels = get_nr_channels(); + info->first_vchannel_nr = total_channels; for (i = 0; i < info->nr_channels; i++) { struct dma_channel *chan = &info->channels[i]; @@ -387,7 +388,7 @@ int register_dmac(struct dma_info *info) } list_add(&info->list, ®istered_dmac_list); - + return 0; } EXPORT_SYMBOL(register_dmac); diff --git a/include/asm-sh/dma.h b/include/asm-sh/dma.h index 6034d4a..4c75b70 100644 --- a/include/asm-sh/dma.h +++ b/include/asm-sh/dma.h @@ -111,6 +111,7 @@ struct dma_info { struct list_head list; int first_channel_nr; + int first_vchannel_nr; }; struct dma_chan_caps {