Lines Matching +full:pcm +full:- +full:interface +full:- +full:rate

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Universal interface for Audio Codec '97
18 #include <sound/pcm.h>
26 * PCM support
144 static unsigned char get_slot_reg(struct ac97_pcm *pcm, unsigned short cidx,
151 if (pcm->spdif)
153 if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK)
154 return rate_reg_tables[dbl][pcm->r[dbl].rate_table[cidx]][slot - 3];
156 return rate_cregs[slot - 3];
159 static int set_spdif_rate(struct snd_ac97 *ac97, unsigned short rate)
164 if (! (ac97->ext_id & AC97_EI_SPDIF))
165 return -ENODEV;
167 /* TODO: double rate support */
168 if (ac97->flags & AC97_CS_SPDIF) {
169 switch (rate) {
172 default: /* invalid - disable output */
174 return -EINVAL;
179 if (ac97->id == AC97_ID_CM9739 && rate != 48000) {
181 return -EINVAL;
183 switch (rate) {
187 default: /* invalid - disable output */
189 return -EINVAL;
195 guard(mutex)(&ac97->reg_mutex);
201 sbits = ac97->spdif_status;
204 switch (rate) {
211 switch (rate) {
217 ac97->spdif_status = sbits;
224 * snd_ac97_set_rate - change the rate of the given input/output.
227 * @rate: the sample rate to set
229 * Changes the rate of the given input/output on the codec.
230 * If the codec doesn't support VAR, the rate must be 48000 (except
242 int snd_ac97_set_rate(struct snd_ac97 *ac97, int reg, unsigned int rate)
247 dbl = rate > 48000;
249 if (!(ac97->flags & AC97_DOUBLE_RATE))
250 return -EINVAL;
252 return -EINVAL;
258 if ((ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_VRM) == 0) /* MIC VRA */
259 if (rate != 48000)
260 return -EINVAL;
264 if ((ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_VRA) == 0) /* VRA */
265 if (rate != 48000 && rate != 96000)
266 return -EINVAL;
269 if (! (ac97->scaps & AC97_SCAP_SURROUND_DAC))
270 return -EINVAL;
273 if (! (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC))
274 return -EINVAL;
278 return set_spdif_rate(ac97, rate);
280 return -EINVAL;
283 rate /= 2;
284 tmp = (rate * ac97->bus->clock) / 48000;
286 return -EINVAL;
287 if ((ac97->ext_id & AC97_EI_DRA) && reg == AC97_PCM_FRONT_DAC_RATE)
292 if ((ac97->ext_id & AC97_EI_DRA) && reg == AC97_PCM_FRONT_DAC_RATE) {
293 /* Intel controllers require double rate data to be put in
315 es = ac97->regs[AC97_EXTENDED_ID] &= ~AC97_EI_DACS_SLOT_MASK;
316 switch (ac97->addr) {
323 switch (ac97->addr) {
326 if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
328 if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
330 if (ac97->ext_id & AC97_EI_SPDIF) {
331 if (!(ac97->scaps & AC97_SCAP_SURROUND_DAC))
333 else if (!(ac97->scaps & AC97_SCAP_CENTER_LFE_DAC))
343 if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
345 if (ac97->ext_id & AC97_EI_SPDIF) {
346 if (!(ac97->scaps & AC97_SCAP_SURROUND_DAC))
355 if (ac97->ext_id & AC97_EI_SPDIF)
364 if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
366 if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
368 if (ac97->ext_id & AC97_EI_SPDIF) {
369 if (!(ac97->scaps & AC97_SCAP_SURROUND_DAC))
371 else if (!(ac97->scaps & AC97_SCAP_CENTER_LFE_DAC))
392 static unsigned int get_rates(struct ac97_pcm *pcm, unsigned int cidx, unsigned short slots, int dbl)
401 reg = get_slot_reg(pcm, cidx, i, dbl);
410 rates &= pcm->r[dbl].codec[cidx]->rates[idx];
419 * snd_ac97_pcm_assign - assign AC97 slots to given PCM streams
425 * some slots are available, pcm->xxx.slots and pcm->xxx.rslots[] members
435 const struct ac97_pcm *pcm;
446 return -ENOMEM;
451 codec = bus->codec[i];
456 if (!(codec->scaps & AC97_SCAP_INDEP_SDIN)) {
458 if (bus->codec[j])
463 /* first step - exclusive devices */
465 pcm = &pcms[i];
467 /* low-level driver thinks that it's more clever */
468 if (pcm->copy_flag) {
469 *rpcm = *pcm;
472 rpcm->stream = pcm->stream;
473 rpcm->exclusive = pcm->exclusive;
474 rpcm->spdif = pcm->spdif;
475 rpcm->private_value = pcm->private_value;
476 rpcm->bus = bus;
477 rpcm->rates = ~0;
478 slots = pcm->r[0].slots;
480 if (!bus->codec[j])
483 if (pcm->spdif && pcm->stream == 0)
486 tmp = avail_slots[pcm->stream][j];
487 if (pcm->exclusive) {
491 if (rpcm->stream == rpcms[k].stream)
495 /* non-exclusive access */
496 tmp &= pcm->r[0].slots;
499 rpcm->r[0].rslots[j] = tmp;
500 rpcm->r[0].codec[j] = bus->codec[j];
501 rpcm->r[0].rate_table[j] = rate_table[pcm->stream][j];
502 if (bus->no_vra)
506 if (pcm->exclusive)
507 avail_slots[pcm->stream][j] &= ~tmp;
510 rpcm->r[0].slots |= tmp;
511 rpcm->rates &= rates;
513 /* for double rate, we check the first codec only */
514 if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK &&
515 bus->codec[0] && (bus->codec[0]->flags & AC97_DOUBLE_RATE) &&
516 rate_table[pcm->stream][0] == 0) {
519 if ((tmp & pcm->r[1].slots) == tmp) {
520 rpcm->r[1].slots = tmp;
521 rpcm->r[1].rslots[0] = tmp;
522 rpcm->r[1].rate_table[0] = 0;
523 rpcm->r[1].codec[0] = bus->codec[0];
524 if (pcm->exclusive)
525 avail_slots[pcm->stream][0] &= ~tmp;
526 if (bus->no_vra)
530 rpcm->rates |= rates;
533 if (rpcm->rates == ~0)
534 rpcm->rates = 0; /* not used */
536 bus->pcms_count = pcms_count;
537 bus->pcms = rpcms;
544 * snd_ac97_pcm_open - opens the given AC97 pcm
545 * @pcm: the ac97 pcm instance
546 * @rate: rate in Hz, if codec does not support VRA, this value must be 48000Hz
548 * @slots: a subset of allocated slots (snd_ac97_pcm_assign) for this pcm
550 * It locks the specified slots and sets the given rate to AC97 registers.
554 int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate,
563 r = rate > 48000;
564 bus = pcm->bus;
567 if (bus->codec[cidx] && (bus->codec[cidx]->ext_id & AC97_EI_SPDIF)) {
568 err = set_spdif_rate(bus->codec[cidx], rate);
573 scoped_guard(spinlock_irq, &pcm->bus->bus_lock) {
579 if (bus->used_slots[pcm->stream][cidx] & (1 << i)) {
580 err = -EBUSY;
583 if (pcm->r[r].rslots[cidx] & (1 << i)) {
584 bus->used_slots[pcm->stream][cidx] |= (1 << i);
589 dev_err(bus->card->dev,
592 err = -EAGAIN;
596 pcm->cur_dbl = r;
602 if (pcm->r[r].rslots[cidx] & (1 << i)) {
603 reg = get_slot_reg(pcm, cidx, i, r);
605 dev_err(bus->card->dev,
609 if (reg_ok[cidx] & (1 << (reg - AC97_PCM_FRONT_DAC_RATE)))
611 dev_dbg(bus->card->dev,
612 "setting ac97 reg 0x%x to rate %d\n",
613 reg, rate);
614 err = snd_ac97_set_rate(pcm->r[r].codec[cidx], reg, rate);
616 dev_err(bus->card->dev,
617 "error in snd_ac97_set_rate: cidx=%d, reg=0x%x, rate=%d, err=%d\n",
618 cidx, reg, rate, err);
620 reg_ok[cidx] |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE));
624 pcm->aslots = slots;
628 pcm->aslots = slots;
629 snd_ac97_pcm_close(pcm);
636 * snd_ac97_pcm_close - closes the given AC97 pcm
637 * @pcm: the ac97 pcm instance
643 int snd_ac97_pcm_close(struct ac97_pcm *pcm)
646 unsigned short slots = pcm->aslots;
650 int r = pcm->cur_dbl;
655 if (pcm->r[r].rslots[cidx] & (1 << i)) {
656 int reg = get_slot_reg(pcm, cidx, i, r);
657 snd_ac97_update_power(pcm->r[r].codec[cidx],
664 bus = pcm->bus;
665 guard(spinlock_irq)(&pcm->bus->bus_lock);
670 bus->used_slots[pcm->stream][cidx] &= ~(1 << i);
672 pcm->aslots = 0;
673 pcm->cur_dbl = 0;
683 if (channels->min > 2) {
688 struct snd_interval *rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
689 return snd_interval_refine(rate, &single_rates);
697 struct snd_interval *rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
698 if (rate->min > 48000) {
710 * snd_ac97_pcm_double_rate_rules - set double rate constraints
711 * @runtime: the runtime of the ac97 front playback pcm
724 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
729 SNDRV_PCM_HW_PARAM_RATE, -1);