From: Jeeja KP jeeja.kp@intel.com
Moved azx_alloc_stream_pages and azx_free_stream_pages to controller library.
Signed-off-by: Jeeja KP jeeja.kp@intel.com Signed-off-by: Subhransu S. Prusty subhransu.s.prusty@intel.com Signed-off-by: Vinod Koul vinod.koul@intel.com --- include/sound/hdaudio.h | 3 +++ sound/hda/hdac_controller.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h index 4eebc31..5fc6d81 100644 --- a/include/sound/hdaudio.h +++ b/include/sound/hdaudio.h @@ -294,6 +294,9 @@ void snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status, void (*ack)(struct hdac_bus *, struct hdac_stream *));
+int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus); +void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); + /* * HD-audio stream */ diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c index 23aec0e..4d4e0d6 100644 --- a/sound/hda/hdac_controller.c +++ b/sound/hda/hdac_controller.c @@ -401,3 +401,47 @@ void snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status, } } EXPORT_SYMBOL_GPL(snd_hdac_bus_handle_stream_irq); + +int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus) +{ + struct hdac_stream *hstream; + int num_streams = 0; + int err; + + list_for_each_entry(hstream, &bus->stream_list, list) { + dsp_lock_init(&hstream); + /* allocate memory for the BDL for each stream */ + err = bus->ops->dma_alloc_pages(bus, SNDRV_DMA_TYPE_DEV, + BDL_SIZE, + &hstream->bdl); + num_streams++; + if (err < 0) + return -ENOMEM; + } + /* allocate memory for the position buffer */ + err = bus->ops->dma_alloc_pages(bus, SNDRV_DMA_TYPE_DEV, + num_streams * 8, &bus->posbuf); + if (err < 0) + return -ENOMEM; + + /* single page (at least 4096 bytes) must suffice for both ringbuffes */ + return bus->ops->dma_alloc_pages(bus, SNDRV_DMA_TYPE_DEV, + PAGE_SIZE, &bus->rb); +} +EXPORT_SYMBOL_GPL(snd_hdac_bus_alloc_stream_pages); + +void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus) +{ + struct hdac_stream *hstream; + + list_for_each_entry(hstream, &bus->stream_list, list) { + if (hstream->bdl.area) + bus->ops->dma_free_pages( + bus, &hstream->bdl); + } + if (bus->rb.area) + bus->ops->dma_free_pages(bus, &bus->rb); + if (bus->posbuf.area) + bus->ops->dma_free_pages(bus, &bus->posbuf); +} +EXPORT_SYMBOL_GPL(snd_hdac_bus_free_stream_pages);