pcmp
pcmp(regs, insn, opf);
struct jffs2_xattr_ref *ref, *cmp, **pref, **pcmp;
for (cmp=ref->next, pcmp=&ref->next; cmp; pcmp=&cmp->next, cmp=cmp->next) {
*pcmp = cmp->next;
*pcmp = cmp->next;
struct hdmi_pcm *pcmp = get_hdmi_pcm(spec, 0);
int pcmdev = pcmp->pcm->device;
pcmp->jack = jack;
jack->private_data = pcmp;
if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE)
pcmp->flags |= SNDRV_GF1_PCM_PFLG_ACTIVE;
pcmp->final_volume = 0;
if (pcmp->blocks == 1) {
for (voice = 0; voice < pcmp->voices; voice++) {
begin = pcmp->memory + voice * (pcmp->dma_size / runtime->channels);
curr = begin + (pcmp->bpos * pcmp->block_size) / runtime->channels;
end = curr + (pcmp->block_size / runtime->channels);
snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
for (voice = 0; voice < pcmp->voices; voice++) {
snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
for (voice = 0; voice < pcmp->voices; voice++) {
snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
struct gus_pcm_private * pcmp;
pcmp = pvoice->private_data;
if (pcmp == NULL) {
gus = pcmp->gus;
runtime = pcmp->substream->runtime;
snd_gf1_select_voice(gus, pcmp->pvoices[1]->number);
pcmp->bpos++;
pcmp->bpos %= pcmp->blocks;
if (pcmp->bpos + 1 >= pcmp->blocks) { /* last block? */
end = pcmp->memory + (((pcmp->bpos + 1) * pcmp->block_size) / runtime->channels);
step = pcmp->dma_size / runtime->channels;
if (!pcmp->final_volume) {
for (idx = 0; idx < pcmp->voices; idx++, end += step) {
snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number);
for (idx = 0; idx < pcmp->voices; idx++) {
snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number);
snd_pcm_period_elapsed(pcmp->substream);
end = pcmp->bpos * pcmp->block_size;
snd_gf1_pcm_block_change(pcmp->substream, end, pcmp->memory + (end / 2), pcmp->block_size / 2);
snd_gf1_pcm_block_change(pcmp->substream, end + (pcmp->block_size / 2), pcmp->memory + (pcmp->dma_size / 2) + (end / 2), pcmp->block_size / 2);
snd_gf1_pcm_block_change(pcmp->substream, end, pcmp->memory + end, pcmp->block_size);
struct gus_pcm_private *pcmp = pvoice->private_data;
if (pcmp == NULL)
if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
cvoice = pcmp->pvoices[0] == pvoice ? 0 : 1;
if (pcmp->substream == NULL)
pcmp->final_volume = 1;
static int get_bpos(struct gus_pcm_private *pcmp, int voice, unsigned int pos,
unsigned int bpos = pos + (voice * (pcmp->dma_size / 2));
if (snd_BUG_ON(bpos > pcmp->dma_size))
if (snd_BUG_ON(bpos + len > pcmp->dma_size))
struct gus_pcm_private *pcmp = runtime->private_data;
struct snd_gus_card *gus = pcmp->gus;
pcmp->memory + bpos, len);
pcmp->memory + bpos, len, w16, invert);
struct gus_pcm_private *pcmp = runtime->private_data;
bpos = get_bpos(pcmp, voice, pos, len);
struct gus_pcm_private *pcmp = runtime->private_data;
bpos = get_bpos(pcmp, voice, pos, len);
struct gus_pcm_private *pcmp = runtime->private_data;
if (pcmp->memory > 0) {
snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory);
pcmp->memory = 0;
pcmp->memory = block->ptr;
pcmp->voices = params_channels(hw_params);
if (pcmp->pvoices[0] == NULL) {
pcmp->pvoices[0] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0);
if (!pcmp->pvoices[0])
pcmp->pvoices[0]->handler_wave = snd_gf1_pcm_interrupt_wave;
pcmp->pvoices[0]->handler_volume = snd_gf1_pcm_interrupt_volume;
pcmp->pvoices[0]->volume_change = snd_gf1_pcm_volume_change;
pcmp->pvoices[0]->private_data = pcmp;
if (pcmp->voices > 1 && pcmp->pvoices[1] == NULL) {
pcmp->pvoices[1] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0);
if (!pcmp->pvoices[1])
pcmp->pvoices[1]->handler_wave = snd_gf1_pcm_interrupt_wave;
pcmp->pvoices[1]->handler_volume = snd_gf1_pcm_interrupt_volume;
pcmp->pvoices[1]->volume_change = snd_gf1_pcm_volume_change;
pcmp->pvoices[1]->private_data = pcmp;
} else if (pcmp->voices == 1) {
if (pcmp->pvoices[1]) {
snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
pcmp->pvoices[1] = NULL;
struct gus_pcm_private *pcmp = runtime->private_data;
if (pcmp->pvoices[0]) {
snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]);
pcmp->pvoices[0] = NULL;
if (pcmp->pvoices[1]) {
snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
pcmp->pvoices[1] = NULL;
if (pcmp->memory > 0) {
snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory);
pcmp->memory = 0;
struct gus_pcm_private *pcmp = runtime->private_data;
pcmp->bpos = 0;
pcmp->dma_size = snd_pcm_lib_buffer_bytes(substream);
pcmp->block_size = snd_pcm_lib_period_bytes(substream);
pcmp->blocks = pcmp->dma_size / pcmp->block_size;
struct gus_pcm_private *pcmp = runtime->private_data;
scoped_guard(spinlock, &pcmp->lock) {
pcmp->flags &= ~SNDRV_GF1_PCM_PFLG_ACTIVE;
voice = pcmp->pvoices[0]->number;
if (pcmp->pvoices[1]) {
voice = pcmp->pvoices[1]->number;
struct gus_pcm_private *pcmp = runtime->private_data;
if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE) {
snd_gf1_select_voice(gus, pcmp->pvoices[0]->number);
pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory;
struct gus_pcm_private *pcmp = private_data;
if (pcmp) {
atomic_dec(&pcmp->dma_count);
wake_up(&pcmp->sleep);
struct gus_pcm_private *pcmp;
pcmp = kzalloc_obj(*pcmp);
if (pcmp == NULL)
pcmp->gus = gus;
spin_lock_init(&pcmp->lock);
init_waitqueue_head(&pcmp->sleep);
atomic_set(&pcmp->dma_count, 0);
runtime->private_data = pcmp;
struct gus_pcm_private *pcmp = runtime->private_data;
pcmp->flags = SNDRV_GF1_PCM_PFLG_NONE;
pcmp->substream = substream;
struct gus_pcm_private *pcmp = runtime->private_data;
if (!wait_event_timeout(pcmp->sleep, (atomic_read(&pcmp->dma_count) <= 0), 2*HZ))
struct gus_pcm_private *pcmp;
pcmp = pvoice->private_data;
if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right;
pcmp->final_volume = 1;
block.private_data = pcmp;
if (!snd_gf1_dma_transfer_block(pcmp->gus, &block, 0, 0))
atomic_inc(&pcmp->dma_count);
struct gus_pcm_private *pcmp = runtime->private_data;
struct snd_gus_card * gus = pcmp->gus;
scoped_guard(spinlock_irqsave, &pcmp->lock) {