aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2014-02-28 18:41:21 -0500
committerTakashi Iwai <tiwai@suse.de>2014-03-01 05:22:02 -0500
commit8769b278610c71a32ae9662219b2f450d48a828c (patch)
tree14acefb270388d87170e44147222f714cf498bc4 /sound/pci/hda
parentb419b35be45f858830e9e0e44741d8de91b3df07 (diff)
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>
Diffstat (limited to 'sound/pci/hda')
-rw-r--r--sound/pci/hda/hda_intel.c20
-rw-r--r--sound/pci/hda/hda_priv.h2
2 files changed, 16 insertions, 6 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index fa3a04c7771e..aa8b765c9299 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -2190,19 +2190,15 @@ static void azx_clear_irq_pending(struct azx *chip)
2190 spin_unlock_irq(&chip->reg_lock); 2190 spin_unlock_irq(&chip->reg_lock);
2191} 2191}
2192 2192
2193#ifdef CONFIG_X86
2194static int azx_pcm_mmap(struct snd_pcm_substream *substream, 2193static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2195 struct vm_area_struct *area) 2194 struct vm_area_struct *area)
2196{ 2195{
2197 struct azx_pcm *apcm = snd_pcm_substream_chip(substream); 2196 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2198 struct azx *chip = apcm->chip; 2197 struct azx *chip = apcm->chip;
2199 if (!azx_snoop(chip)) 2198 if (chip->ops->pcm_mmap_prepare)
2200 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot); 2199 chip->ops->pcm_mmap_prepare(substream, area);
2201 return snd_pcm_lib_default_mmap(substream, area); 2200 return snd_pcm_lib_default_mmap(substream, area);
2202} 2201}
2203#else
2204#define azx_pcm_mmap NULL
2205#endif
2206 2202
2207static struct snd_pcm_ops azx_pcm_ops = { 2203static struct snd_pcm_ops azx_pcm_ops = {
2208 .open = azx_pcm_open, 2204 .open = azx_pcm_open,
@@ -3508,6 +3504,17 @@ static int substream_free_pages(struct azx *chip,
3508 return snd_pcm_lib_free_pages(substream); 3504 return snd_pcm_lib_free_pages(substream);
3509} 3505}
3510 3506
3507static void pcm_mmap_prepare(struct snd_pcm_substream *substream,
3508 struct vm_area_struct *area)
3509{
3510#ifdef CONFIG_X86
3511 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
3512 struct azx *chip = apcm->chip;
3513 if (!azx_snoop(chip))
3514 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
3515#endif
3516}
3517
3511static const struct hda_controller_ops pci_hda_ops = { 3518static const struct hda_controller_ops pci_hda_ops = {
3512 .writel = pci_azx_writel, 3519 .writel = pci_azx_writel,
3513 .readl = pci_azx_readl, 3520 .readl = pci_azx_readl,
@@ -3520,6 +3527,7 @@ static const struct hda_controller_ops pci_hda_ops = {
3520 .dma_free_pages = dma_free_pages, 3527 .dma_free_pages = dma_free_pages,
3521 .substream_alloc_pages = substream_alloc_pages, 3528 .substream_alloc_pages = substream_alloc_pages,
3522 .substream_free_pages = substream_free_pages, 3529 .substream_free_pages = substream_free_pages,
3530 .pcm_mmap_prepare = pcm_mmap_prepare,
3523}; 3531};
3524 3532
3525static int azx_probe(struct pci_dev *pci, 3533static int azx_probe(struct pci_dev *pci,
diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h
index 10bcec127319..edbe2ebac025 100644
--- a/sound/pci/hda/hda_priv.h
+++ b/sound/pci/hda/hda_priv.h
@@ -309,6 +309,8 @@ struct hda_controller_ops {
309 size_t size); 309 size_t size);
310 int (*substream_free_pages)(struct azx *chip, 310 int (*substream_free_pages)(struct azx *chip,
311 struct snd_pcm_substream *substream); 311 struct snd_pcm_substream *substream);
312 void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream,
313 struct vm_area_struct *area);
312}; 314};
313 315
314struct azx_pcm { 316struct azx_pcm {