ALSA: hda - Add pcm_mmap_prepare op.
Adding this op allows the X86 specific mmap operation to help in hda_intel without needing a CONFIG_X86 in future non-PCI hda drivers. Signed-off-by: Dylan Reid <dgreid@chromium.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
b419b35be4
commit
8769b27861
@ -2190,19 +2190,15 @@ static void azx_clear_irq_pending(struct azx *chip)
|
|||||||
spin_unlock_irq(&chip->reg_lock);
|
spin_unlock_irq(&chip->reg_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86
|
|
||||||
static int azx_pcm_mmap(struct snd_pcm_substream *substream,
|
static int azx_pcm_mmap(struct snd_pcm_substream *substream,
|
||||||
struct vm_area_struct *area)
|
struct vm_area_struct *area)
|
||||||
{
|
{
|
||||||
struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
|
struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
|
||||||
struct azx *chip = apcm->chip;
|
struct azx *chip = apcm->chip;
|
||||||
if (!azx_snoop(chip))
|
if (chip->ops->pcm_mmap_prepare)
|
||||||
area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
|
chip->ops->pcm_mmap_prepare(substream, area);
|
||||||
return snd_pcm_lib_default_mmap(substream, area);
|
return snd_pcm_lib_default_mmap(substream, area);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define azx_pcm_mmap NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct snd_pcm_ops azx_pcm_ops = {
|
static struct snd_pcm_ops azx_pcm_ops = {
|
||||||
.open = azx_pcm_open,
|
.open = azx_pcm_open,
|
||||||
@ -3508,6 +3504,17 @@ static int substream_free_pages(struct azx *chip,
|
|||||||
return snd_pcm_lib_free_pages(substream);
|
return snd_pcm_lib_free_pages(substream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pcm_mmap_prepare(struct snd_pcm_substream *substream,
|
||||||
|
struct vm_area_struct *area)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
|
||||||
|
struct azx *chip = apcm->chip;
|
||||||
|
if (!azx_snoop(chip))
|
||||||
|
area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static const struct hda_controller_ops pci_hda_ops = {
|
static const struct hda_controller_ops pci_hda_ops = {
|
||||||
.writel = pci_azx_writel,
|
.writel = pci_azx_writel,
|
||||||
.readl = pci_azx_readl,
|
.readl = pci_azx_readl,
|
||||||
@ -3520,6 +3527,7 @@ static const struct hda_controller_ops pci_hda_ops = {
|
|||||||
.dma_free_pages = dma_free_pages,
|
.dma_free_pages = dma_free_pages,
|
||||||
.substream_alloc_pages = substream_alloc_pages,
|
.substream_alloc_pages = substream_alloc_pages,
|
||||||
.substream_free_pages = substream_free_pages,
|
.substream_free_pages = substream_free_pages,
|
||||||
|
.pcm_mmap_prepare = pcm_mmap_prepare,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int azx_probe(struct pci_dev *pci,
|
static int azx_probe(struct pci_dev *pci,
|
||||||
|
@ -309,6 +309,8 @@ struct hda_controller_ops {
|
|||||||
size_t size);
|
size_t size);
|
||||||
int (*substream_free_pages)(struct azx *chip,
|
int (*substream_free_pages)(struct azx *chip,
|
||||||
struct snd_pcm_substream *substream);
|
struct snd_pcm_substream *substream);
|
||||||
|
void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream,
|
||||||
|
struct vm_area_struct *area);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct azx_pcm {
|
struct azx_pcm {
|
||||||
|
Loading…
Reference in New Issue
Block a user