static int snd_ps3_pcm_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream); unsigned long irqsave; if (!snd_ps3_set_avsetting(substream)) { /* some parameter changed */ write_reg(PS3_AUDIO_AX_IE, PS3_AUDIO_AX_IE_ASOBEIE(0) | PS3_AUDIO_AX_IE_ASOBUIE(0)); /* * let SPDIF device re-lock with SPDIF signal, * start with some silence */ card->silent = snd_ps3_delay_to_bytes(substream, card->start_delay) / (PS3_AUDIO_FIFO_STAGE_SIZE * 4); /* every 4 times */ } /* restart ring buffer pointer */ spin_lock_irqsave(&card->dma_lock, irqsave); { card->dma_buffer_size = runtime->dma_bytes; card->dma_last_transfer_vaddr[SND_PS3_CH_L] = card->dma_next_transfer_vaddr[SND_PS3_CH_L] = card->dma_start_vaddr[SND_PS3_CH_L] = runtime->dma_area; card->dma_start_bus_addr[SND_PS3_CH_L] = runtime->dma_addr; card->dma_last_transfer_vaddr[SND_PS3_CH_R] = card->dma_next_transfer_vaddr[SND_PS3_CH_R] = card->dma_start_vaddr[SND_PS3_CH_R] = runtime->dma_area + (runtime->dma_bytes / 2); card->dma_start_bus_addr[SND_PS3_CH_R] = runtime->dma_addr + (runtime->dma_bytes / 2); pr_debug("%s: vaddr=%p bus=%#llx\n", __func__, card->dma_start_vaddr[SND_PS3_CH_L], card->dma_start_bus_addr[SND_PS3_CH_L]); } spin_unlock_irqrestore(&card->dma_lock, irqsave); /* ensure the hardware sees the change */ mb(); return 0; };
static int snd_ps3_pcm_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream); unsigned long irqsave; if (!snd_ps3_set_avsetting(substream)) { write_reg(PS3_AUDIO_AX_IE, PS3_AUDIO_AX_IE_ASOBEIE(0) | PS3_AUDIO_AX_IE_ASOBUIE(0)); card->silent = snd_ps3_delay_to_bytes(substream, card->start_delay) / (PS3_AUDIO_FIFO_STAGE_SIZE * 4); } spin_lock_irqsave(&card->dma_lock, irqsave); { card->dma_buffer_size = runtime->dma_bytes; card->dma_last_transfer_vaddr[SND_PS3_CH_L] = card->dma_next_transfer_vaddr[SND_PS3_CH_L] = card->dma_start_vaddr[SND_PS3_CH_L] = runtime->dma_area; card->dma_start_bus_addr[SND_PS3_CH_L] = runtime->dma_addr; card->dma_last_transfer_vaddr[SND_PS3_CH_R] = card->dma_next_transfer_vaddr[SND_PS3_CH_R] = card->dma_start_vaddr[SND_PS3_CH_R] = runtime->dma_area + (runtime->dma_bytes / 2); card->dma_start_bus_addr[SND_PS3_CH_R] = runtime->dma_addr + (runtime->dma_bytes / 2); pr_debug("%s: vaddr=%p bus=%#llx\n", __func__, card->dma_start_vaddr[SND_PS3_CH_L], card->dma_start_bus_addr[SND_PS3_CH_L]); } spin_unlock_irqrestore(&card->dma_lock, irqsave); mb(); return 0; };