diff options
author | Dylan Reid <dgreid@chromium.org> | 2014-02-28 18:41:21 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-03-01 05:22:02 -0500 |
commit | 8769b278610c71a32ae9662219b2f450d48a828c (patch) | |
tree | 14acefb270388d87170e44147222f714cf498bc4 /sound/pci/hda | |
parent | b419b35be45f858830e9e0e44741d8de91b3df07 (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.c | 20 | ||||
-rw-r--r-- | sound/pci/hda/hda_priv.h | 2 |
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 | ||
2194 | static int azx_pcm_mmap(struct snd_pcm_substream *substream, | 2193 | static 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 | ||
2207 | static struct snd_pcm_ops azx_pcm_ops = { | 2203 | static 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 | ||
3507 | static 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 | |||
3511 | static const struct hda_controller_ops pci_hda_ops = { | 3518 | static 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 | ||
3525 | static int azx_probe(struct pci_dev *pci, | 3533 | static 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 | ||
314 | struct azx_pcm { | 316 | struct azx_pcm { |