ALSA: intel_hdmi: Use the new non-cached allocation
The HDMI LPE audio driver requires the non-cached page allocations for its buffers. With the recent support of SNDRV_DMA_TYPE_DEV_UC type, we can reduce lots of codes in the driver side and let the memalloc core doing it properly. Signed-off-by: Takashi Iwai <tiwai@suse.de>hifive-unleashed-5.1
parent
4985ddbf1e
commit
87246f7fd5
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <asm/set_memory.h>
|
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/asoundef.h>
|
#include <sound/asoundef.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -1141,8 +1140,7 @@ static int had_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *hw_params)
|
struct snd_pcm_hw_params *hw_params)
|
||||||
{
|
{
|
||||||
struct snd_intelhad *intelhaddata;
|
struct snd_intelhad *intelhaddata;
|
||||||
unsigned long addr;
|
int buf_size, retval;
|
||||||
int pages, buf_size, retval;
|
|
||||||
|
|
||||||
intelhaddata = snd_pcm_substream_chip(substream);
|
intelhaddata = snd_pcm_substream_chip(substream);
|
||||||
buf_size = params_buffer_bytes(hw_params);
|
buf_size = params_buffer_bytes(hw_params);
|
||||||
|
@ -1151,17 +1149,6 @@ static int had_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||||
return retval;
|
return retval;
|
||||||
dev_dbg(intelhaddata->dev, "%s:allocated memory = %d\n",
|
dev_dbg(intelhaddata->dev, "%s:allocated memory = %d\n",
|
||||||
__func__, buf_size);
|
__func__, buf_size);
|
||||||
/* mark the pages as uncached region */
|
|
||||||
addr = (unsigned long) substream->runtime->dma_area;
|
|
||||||
pages = (substream->runtime->dma_bytes + PAGE_SIZE - 1) / PAGE_SIZE;
|
|
||||||
retval = set_memory_uc(addr, pages);
|
|
||||||
if (retval) {
|
|
||||||
dev_err(intelhaddata->dev, "set_memory_uc failed.Error:%d\n",
|
|
||||||
retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
memset(substream->runtime->dma_area, 0, buf_size);
|
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1171,21 +1158,11 @@ static int had_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||||
static int had_pcm_hw_free(struct snd_pcm_substream *substream)
|
static int had_pcm_hw_free(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct snd_intelhad *intelhaddata;
|
struct snd_intelhad *intelhaddata;
|
||||||
unsigned long addr;
|
|
||||||
u32 pages;
|
|
||||||
|
|
||||||
intelhaddata = snd_pcm_substream_chip(substream);
|
intelhaddata = snd_pcm_substream_chip(substream);
|
||||||
had_do_reset(intelhaddata);
|
had_do_reset(intelhaddata);
|
||||||
|
|
||||||
/* mark back the pages as cached/writeback region before the free */
|
return snd_pcm_lib_free_pages(substream);
|
||||||
if (substream->runtime->dma_area != NULL) {
|
|
||||||
addr = (unsigned long) substream->runtime->dma_area;
|
|
||||||
pages = (substream->runtime->dma_bytes + PAGE_SIZE - 1) /
|
|
||||||
PAGE_SIZE;
|
|
||||||
set_memory_wb(addr, pages);
|
|
||||||
return snd_pcm_lib_free_pages(substream);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1860,7 +1837,7 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
|
||||||
* try to allocate 600k buffer as default which is large enough
|
* try to allocate 600k buffer as default which is large enough
|
||||||
*/
|
*/
|
||||||
snd_pcm_lib_preallocate_pages_for_all(pcm,
|
snd_pcm_lib_preallocate_pages_for_all(pcm,
|
||||||
SNDRV_DMA_TYPE_DEV, NULL,
|
SNDRV_DMA_TYPE_DEV_UC, NULL,
|
||||||
HAD_DEFAULT_BUFFER, HAD_MAX_BUFFER);
|
HAD_DEFAULT_BUFFER, HAD_MAX_BUFFER);
|
||||||
|
|
||||||
/* create controls */
|
/* create controls */
|
||||||
|
|
Loading…
Reference in New Issue