diff options
| author | Dylan Reid <dgreid@chromium.org> | 2014-02-28 15:41:21 -0800 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2014-03-01 11:22:02 +0100 | 
| commit | 8769b278610c71a32ae9662219b2f450d48a828c (patch) | |
| tree | 14acefb270388d87170e44147222f714cf498bc4 | |
| 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>
| -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)  	spin_unlock_irq(&chip->reg_lock);  } -#ifdef CONFIG_X86  static int azx_pcm_mmap(struct snd_pcm_substream *substream,  			struct vm_area_struct *area)  {  	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); +	if (chip->ops->pcm_mmap_prepare) +		chip->ops->pcm_mmap_prepare(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 = {  	.open = azx_pcm_open, @@ -3508,6 +3504,17 @@ static int substream_free_pages(struct azx *chip,  	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 = {  	.writel = pci_azx_writel,  	.readl = pci_azx_readl, @@ -3520,6 +3527,7 @@ static const struct hda_controller_ops pci_hda_ops = {  	.dma_free_pages = dma_free_pages,  	.substream_alloc_pages = substream_alloc_pages,  	.substream_free_pages = substream_free_pages, +	.pcm_mmap_prepare = pcm_mmap_prepare,  };  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 {  				     size_t size);  	int (*substream_free_pages)(struct azx *chip,  				    struct snd_pcm_substream *substream); +	void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream, +				 struct vm_area_struct *area);  };  struct azx_pcm { | 
