1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
8 * This file contains the implementation of the device resource management
22 #include <linux/delay.h>
23 #include <linux/slab.h>
24 #include <sound/pcm.h>
25 #include <sound/control.h>
26 #include <sound/asoundef.h>
28 #define MONO_SUM_SCALE 0x19a8 /* 2^(-0.5) in 14-bit floating format */
29 #define MAX_MULTI_CHN 8
31 #define IEC958_DEFAULT_CON ((IEC958_AES0_NONAUDIO \
32 | IEC958_AES0_CON_NOT_COPYRIGHT) \
33 | ((IEC958_AES1_CON_MIXER \
34 | IEC958_AES1_CON_ORIGINAL) << 8) \
36 | ((IEC958_AES3_CON_FS_48000) << 24))
38 static const struct snd_pci_quirk subsys_20k1_list
[] = {
39 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0022, "SB055x", CTSB055X
),
40 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x002f, "SB055x", CTSB055X
),
41 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0029, "SB073x", CTSB073X
),
42 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0031, "SB073x", CTSB073X
),
43 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE
, 0xf000, 0x6000,
48 static const struct snd_pci_quirk subsys_20k2_list
[] = {
49 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB0760
,
51 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB1270
,
53 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08801
,
55 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08802
,
57 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08803
,
59 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE
, 0xf000,
60 PCI_SUBDEVICE_ID_CREATIVE_HENDRIX
, "HENDRIX",
65 static const char *ct_subsys_name
[NUM_CTCARDS
] = {
67 [CTSB055X
] = "SB055x",
68 [CTSB073X
] = "SB073x",
70 [CT20K1_UNKNOWN
] = "Unknown",
72 [CTSB0760
] = "SB076x",
73 [CTHENDRIX
] = "Hendrix",
74 [CTSB0880
] = "SB0880",
75 [CTSB1270
] = "SB1270",
76 [CT20K2_UNKNOWN
] = "Unknown",
80 int (*create
)(struct ct_atc
*atc
,
81 enum CTALSADEVS device
, const char *device_name
);
82 int (*destroy
)(void *alsa_dev
);
83 const char *public_name
;
84 } alsa_dev_funcs
[NUM_CTALSADEVS
] = {
85 [FRONT
] = { .create
= ct_alsa_pcm_create
,
87 .public_name
= "Front/WaveIn"},
88 [SURROUND
] = { .create
= ct_alsa_pcm_create
,
90 .public_name
= "Surround"},
91 [CLFE
] = { .create
= ct_alsa_pcm_create
,
93 .public_name
= "Center/LFE"},
94 [SIDE
] = { .create
= ct_alsa_pcm_create
,
96 .public_name
= "Side"},
97 [IEC958
] = { .create
= ct_alsa_pcm_create
,
99 .public_name
= "IEC958 Non-audio"},
101 [MIXER
] = { .create
= ct_alsa_mix_create
,
103 .public_name
= "Mixer"}
106 typedef int (*create_t
)(struct hw
*, void **);
107 typedef int (*destroy_t
)(void *);
110 int (*create
)(struct hw
*hw
, void **rmgr
);
111 int (*destroy
)(void *mgr
);
112 } rsc_mgr_funcs
[NUM_RSCTYP
] = {
113 [SRC
] = { .create
= (create_t
)src_mgr_create
,
114 .destroy
= (destroy_t
)src_mgr_destroy
},
115 [SRCIMP
] = { .create
= (create_t
)srcimp_mgr_create
,
116 .destroy
= (destroy_t
)srcimp_mgr_destroy
},
117 [AMIXER
] = { .create
= (create_t
)amixer_mgr_create
,
118 .destroy
= (destroy_t
)amixer_mgr_destroy
},
119 [SUM
] = { .create
= (create_t
)sum_mgr_create
,
120 .destroy
= (destroy_t
)sum_mgr_destroy
},
121 [DAIO
] = { .create
= (create_t
)daio_mgr_create
,
122 .destroy
= (destroy_t
)daio_mgr_destroy
}
126 atc_pcm_release_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
);
129 * Only mono and interleaved modes are supported now.
130 * Always allocates a contiguous channel block.
133 static int ct_map_audio_buffer(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
135 struct snd_pcm_runtime
*runtime
;
138 if (!apcm
->substream
)
141 runtime
= apcm
->substream
->runtime
;
144 apcm
->vm_block
= vm
->map(vm
, apcm
->substream
, runtime
->dma_bytes
);
152 static void ct_unmap_audio_buffer(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
161 vm
->unmap(vm
, apcm
->vm_block
);
163 apcm
->vm_block
= NULL
;
166 static unsigned long atc_get_ptp_phys(struct ct_atc
*atc
, int index
)
168 return atc
->vm
->get_ptp_phys(atc
->vm
, index
);
171 static unsigned int convert_format(snd_pcm_format_t snd_format
,
172 struct snd_card
*card
)
174 switch (snd_format
) {
175 case SNDRV_PCM_FORMAT_U8
:
177 case SNDRV_PCM_FORMAT_S16_LE
:
179 case SNDRV_PCM_FORMAT_S24_3LE
:
181 case SNDRV_PCM_FORMAT_S32_LE
:
183 case SNDRV_PCM_FORMAT_FLOAT_LE
:
186 dev_err(card
->dev
, "not recognized snd format is %d\n",
193 atc_get_pitch(unsigned int input_rate
, unsigned int output_rate
)
198 /* get pitch and convert to fixed-point 8.24 format. */
199 pitch
= (input_rate
/ output_rate
) << 24;
200 input_rate
%= output_rate
;
203 for (b
= 31; ((b
>= 0) && !(input_rate
>> b
)); )
207 input_rate
<<= (31 - b
);
208 input_rate
/= output_rate
;
221 static int select_rom(unsigned int pitch
)
223 if (pitch
> 0x00428f5c && pitch
< 0x01b851ec) {
224 /* 0.26 <= pitch <= 1.72 */
226 } else if (pitch
== 0x01d66666 || pitch
== 0x01d66667) {
227 /* pitch == 1.8375 */
229 } else if (pitch
== 0x02000000) {
232 } else if (pitch
<= 0x08000000) {
233 /* 0 <= pitch <= 8 */
240 static int atc_pcm_playback_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
242 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
243 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
244 struct src_desc desc
= {0};
245 struct amixer_desc mix_dsc
= {0};
247 struct amixer
*amixer
;
249 int n_amixer
= apcm
->substream
->runtime
->channels
, i
= 0;
250 int device
= apcm
->substream
->pcm
->device
;
253 /* first release old resources */
254 atc_pcm_release_resources(atc
, apcm
);
256 /* Get SRC resource */
257 desc
.multi
= apcm
->substream
->runtime
->channels
;
260 err
= src_mgr
->get_src(src_mgr
, &desc
, (struct src
**)&apcm
->src
);
264 pitch
= atc_get_pitch(apcm
->substream
->runtime
->rate
,
265 (atc
->rsr
* atc
->msr
));
267 src
->ops
->set_pitch(src
, pitch
);
268 src
->ops
->set_rom(src
, select_rom(pitch
));
269 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
271 src
->ops
->set_pm(src
, (src
->ops
->next_interleave(src
) != NULL
));
273 /* Get AMIXER resource */
274 n_amixer
= (n_amixer
< 2) ? 2 : n_amixer
;
275 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
276 if (!apcm
->amixers
) {
280 mix_dsc
.msr
= atc
->msr
;
281 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
282 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
283 (struct amixer
**)&apcm
->amixers
[i
]);
290 /* Set up device virtual mem map */
291 err
= ct_map_audio_buffer(atc
, apcm
);
295 /* Connect resources */
297 for (i
= 0; i
< n_amixer
; i
++) {
298 amixer
= apcm
->amixers
[i
];
299 mutex_lock(&atc
->atc_mutex
);
300 amixer
->ops
->setup(amixer
, &src
->rsc
,
301 INIT_VOL
, atc
->pcm
[i
+device
*2]);
302 mutex_unlock(&atc
->atc_mutex
);
303 src
= src
->ops
->next_interleave(src
);
308 ct_timer_prepare(apcm
->timer
);
313 atc_pcm_release_resources(atc
, apcm
);
318 atc_pcm_release_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
320 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
321 struct srcimp_mgr
*srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
322 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
323 struct sum_mgr
*sum_mgr
= atc
->rsc_mgrs
[SUM
];
324 struct srcimp
*srcimp
;
328 for (i
= 0; i
< apcm
->n_srcimp
; i
++) {
329 srcimp
= apcm
->srcimps
[i
];
330 srcimp
->ops
->unmap(srcimp
);
331 srcimp_mgr
->put_srcimp(srcimp_mgr
, srcimp
);
332 apcm
->srcimps
[i
] = NULL
;
334 kfree(apcm
->srcimps
);
335 apcm
->srcimps
= NULL
;
339 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
340 src_mgr
->put_src(src_mgr
, apcm
->srccs
[i
]);
341 apcm
->srccs
[i
] = NULL
;
348 for (i
= 0; i
< apcm
->n_amixer
; i
++) {
349 amixer_mgr
->put_amixer(amixer_mgr
, apcm
->amixers
[i
]);
350 apcm
->amixers
[i
] = NULL
;
352 kfree(apcm
->amixers
);
353 apcm
->amixers
= NULL
;
357 sum_mgr
->put_sum(sum_mgr
, apcm
->mono
);
362 src_mgr
->put_src(src_mgr
, apcm
->src
);
366 if (apcm
->vm_block
) {
367 /* Undo device virtual mem map */
368 ct_unmap_audio_buffer(atc
, apcm
);
369 apcm
->vm_block
= NULL
;
375 static int atc_pcm_playback_start(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
377 unsigned int max_cisz
;
378 struct src
*src
= apcm
->src
;
384 max_cisz
= src
->multi
* src
->rsc
.msr
;
385 max_cisz
= 0x80 * (max_cisz
< 8 ? max_cisz
: 8);
387 src
->ops
->set_sa(src
, apcm
->vm_block
->addr
);
388 src
->ops
->set_la(src
, apcm
->vm_block
->addr
+ apcm
->vm_block
->size
);
389 src
->ops
->set_ca(src
, apcm
->vm_block
->addr
+ max_cisz
);
390 src
->ops
->set_cisz(src
, max_cisz
);
392 src
->ops
->set_bm(src
, 1);
393 src
->ops
->set_state(src
, SRC_STATE_INIT
);
394 src
->ops
->commit_write(src
);
396 ct_timer_start(apcm
->timer
);
400 static int atc_pcm_stop(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
405 ct_timer_stop(apcm
->timer
);
408 src
->ops
->set_bm(src
, 0);
409 src
->ops
->set_state(src
, SRC_STATE_OFF
);
410 src
->ops
->commit_write(src
);
413 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
414 src
= apcm
->srccs
[i
];
415 src
->ops
->set_bm(src
, 0);
416 src
->ops
->set_state(src
, SRC_STATE_OFF
);
417 src
->ops
->commit_write(src
);
427 atc_pcm_playback_position(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
429 struct src
*src
= apcm
->src
;
435 position
= src
->ops
->get_ca(src
);
437 if (position
< apcm
->vm_block
->addr
) {
438 dev_dbg(atc
->card
->dev
,
439 "bad ca - ca=0x%08x, vba=0x%08x, vbs=0x%08x\n",
440 position
, apcm
->vm_block
->addr
, apcm
->vm_block
->size
);
441 position
= apcm
->vm_block
->addr
;
444 size
= apcm
->vm_block
->size
;
445 max_cisz
= src
->multi
* src
->rsc
.msr
;
446 max_cisz
= 128 * (max_cisz
< 8 ? max_cisz
: 8);
448 return (position
+ size
- max_cisz
- apcm
->vm_block
->addr
) % size
;
451 struct src_node_conf_t
{
454 unsigned int mix_msr
:8;
455 unsigned int imp_msr
:8;
459 static void setup_src_node_conf(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
,
460 struct src_node_conf_t
*conf
, int *n_srcc
)
464 /* get pitch and convert to fixed-point 8.24 format. */
465 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
466 apcm
->substream
->runtime
->rate
);
469 if (1 == atc
->msr
) { /* FIXME: do we really need SRC here if pitch==1 */
470 *n_srcc
= apcm
->substream
->runtime
->channels
;
471 conf
[0].pitch
= pitch
;
472 conf
[0].mix_msr
= conf
[0].imp_msr
= conf
[0].msr
= 1;
474 } else if (2 <= atc
->msr
) {
475 if (0x8000000 < pitch
) {
476 /* Need two-stage SRCs, SRCIMPs and
477 * AMIXERs for converting format */
478 conf
[0].pitch
= (atc
->msr
<< 24);
479 conf
[0].msr
= conf
[0].mix_msr
= 1;
480 conf
[0].imp_msr
= atc
->msr
;
482 conf
[1].pitch
= atc_get_pitch(atc
->rsr
,
483 apcm
->substream
->runtime
->rate
);
484 conf
[1].msr
= conf
[1].mix_msr
= conf
[1].imp_msr
= 1;
486 *n_srcc
= apcm
->substream
->runtime
->channels
* 2;
487 } else if (0x1000000 < pitch
) {
488 /* Need one-stage SRCs, SRCIMPs and
489 * AMIXERs for converting format */
490 conf
[0].pitch
= pitch
;
491 conf
[0].msr
= conf
[0].mix_msr
492 = conf
[0].imp_msr
= atc
->msr
;
494 *n_srcc
= apcm
->substream
->runtime
->channels
;
500 atc_pcm_capture_get_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
502 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
503 struct srcimp_mgr
*srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
504 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
505 struct sum_mgr
*sum_mgr
= atc
->rsc_mgrs
[SUM
];
506 struct src_desc src_dsc
= {0};
508 struct srcimp_desc srcimp_dsc
= {0};
509 struct srcimp
*srcimp
;
510 struct amixer_desc mix_dsc
= {0};
511 struct sum_desc sum_dsc
= {0};
514 int n_srcimp
, n_amixer
, n_srcc
, n_sum
;
515 struct src_node_conf_t src_node_conf
[2] = {{0} };
517 /* first release old resources */
518 atc_pcm_release_resources(atc
, apcm
);
520 /* The numbers of converting SRCs and SRCIMPs should be determined
523 multi
= apcm
->substream
->runtime
->channels
;
525 /* get pitch and convert to fixed-point 8.24 format. */
526 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
527 apcm
->substream
->runtime
->rate
);
529 setup_src_node_conf(atc
, apcm
, src_node_conf
, &n_srcc
);
530 n_sum
= (1 == multi
) ? 1 : 0;
531 n_amixer
= n_sum
* 2 + n_srcc
;
533 if ((multi
> 1) && (0x8000000 >= pitch
)) {
534 /* Need extra AMIXERs and SRCIMPs for special treatment
535 * of interleaved recording of conjugate channels */
536 n_amixer
+= multi
* atc
->msr
;
537 n_srcimp
+= multi
* atc
->msr
;
543 apcm
->srccs
= kcalloc(n_srcc
, sizeof(void *), GFP_KERNEL
);
548 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
549 if (!apcm
->amixers
) {
554 apcm
->srcimps
= kcalloc(n_srcimp
, sizeof(void *), GFP_KERNEL
);
555 if (!apcm
->srcimps
) {
560 /* Allocate SRCs for sample rate conversion if needed */
562 src_dsc
.mode
= ARCRW
;
563 for (i
= 0, apcm
->n_srcc
= 0; i
< n_srcc
; i
++) {
564 src_dsc
.msr
= src_node_conf
[i
/multi
].msr
;
565 err
= src_mgr
->get_src(src_mgr
, &src_dsc
,
566 (struct src
**)&apcm
->srccs
[i
]);
570 src
= apcm
->srccs
[i
];
571 pitch
= src_node_conf
[i
/multi
].pitch
;
572 src
->ops
->set_pitch(src
, pitch
);
573 src
->ops
->set_rom(src
, select_rom(pitch
));
574 src
->ops
->set_vo(src
, src_node_conf
[i
/multi
].vo
);
579 /* Allocate AMIXERs for routing SRCs of conversion if needed */
580 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
582 mix_dsc
.msr
= atc
->msr
;
583 else if (i
< (n_sum
*2+n_srcc
))
584 mix_dsc
.msr
= src_node_conf
[(i
-n_sum
*2)/multi
].mix_msr
;
588 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
589 (struct amixer
**)&apcm
->amixers
[i
]);
596 /* Allocate a SUM resource to mix all input channels together */
597 sum_dsc
.msr
= atc
->msr
;
598 err
= sum_mgr
->get_sum(sum_mgr
, &sum_dsc
, (struct sum
**)&apcm
->mono
);
602 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
603 apcm
->substream
->runtime
->rate
);
604 /* Allocate SRCIMP resources */
605 for (i
= 0, apcm
->n_srcimp
= 0; i
< n_srcimp
; i
++) {
607 srcimp_dsc
.msr
= src_node_conf
[i
/multi
].imp_msr
;
609 srcimp_dsc
.msr
= (pitch
<= 0x8000000) ? atc
->msr
: 1;
613 err
= srcimp_mgr
->get_srcimp(srcimp_mgr
, &srcimp_dsc
, &srcimp
);
617 apcm
->srcimps
[i
] = srcimp
;
621 /* Allocate a SRC for writing data to host memory */
622 src_dsc
.multi
= apcm
->substream
->runtime
->channels
;
624 src_dsc
.mode
= MEMWR
;
625 err
= src_mgr
->get_src(src_mgr
, &src_dsc
, (struct src
**)&apcm
->src
);
630 src
->ops
->set_pitch(src
, pitch
);
632 /* Set up device virtual mem map */
633 err
= ct_map_audio_buffer(atc
, apcm
);
640 atc_pcm_release_resources(atc
, apcm
);
644 static int atc_pcm_capture_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
647 struct amixer
*amixer
;
648 struct srcimp
*srcimp
;
649 struct ct_mixer
*mixer
= atc
->mixer
;
651 struct rsc
*out_ports
[8] = {NULL
};
652 int err
, i
, j
, n_sum
, multi
;
654 int mix_base
= 0, imp_base
= 0;
656 atc_pcm_release_resources(atc
, apcm
);
658 /* Get needed resources. */
659 err
= atc_pcm_capture_get_resources(atc
, apcm
);
663 /* Connect resources */
664 mixer
->get_output_ports(mixer
, MIX_PCMO_FRONT
,
665 &out_ports
[0], &out_ports
[1]);
667 multi
= apcm
->substream
->runtime
->channels
;
670 for (i
= 0; i
< 2; i
++) {
671 amixer
= apcm
->amixers
[i
];
672 amixer
->ops
->setup(amixer
, out_ports
[i
],
673 MONO_SUM_SCALE
, mono
);
675 out_ports
[0] = &mono
->rsc
;
677 mix_base
= n_sum
* 2;
680 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
681 src
= apcm
->srccs
[i
];
682 srcimp
= apcm
->srcimps
[imp_base
+i
];
683 amixer
= apcm
->amixers
[mix_base
+i
];
684 srcimp
->ops
->map(srcimp
, src
, out_ports
[i
%multi
]);
685 amixer
->ops
->setup(amixer
, &src
->rsc
, INIT_VOL
, NULL
);
686 out_ports
[i
%multi
] = &amixer
->rsc
;
689 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
690 apcm
->substream
->runtime
->rate
);
692 if ((multi
> 1) && (pitch
<= 0x8000000)) {
693 /* Special connection for interleaved
694 * recording with conjugate channels */
695 for (i
= 0; i
< multi
; i
++) {
696 out_ports
[i
]->ops
->master(out_ports
[i
]);
697 for (j
= 0; j
< atc
->msr
; j
++) {
698 amixer
= apcm
->amixers
[apcm
->n_srcc
+j
*multi
+i
];
699 amixer
->ops
->set_input(amixer
, out_ports
[i
]);
700 amixer
->ops
->set_scale(amixer
, INIT_VOL
);
701 amixer
->ops
->set_sum(amixer
, NULL
);
702 amixer
->ops
->commit_raw_write(amixer
);
703 out_ports
[i
]->ops
->next_conj(out_ports
[i
]);
705 srcimp
= apcm
->srcimps
[apcm
->n_srcc
+j
*multi
+i
];
706 srcimp
->ops
->map(srcimp
, apcm
->src
,
711 for (i
= 0; i
< multi
; i
++) {
712 srcimp
= apcm
->srcimps
[apcm
->n_srcc
+i
];
713 srcimp
->ops
->map(srcimp
, apcm
->src
, out_ports
[i
]);
717 ct_timer_prepare(apcm
->timer
);
722 static int atc_pcm_capture_start(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
725 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
732 multi
= apcm
->substream
->runtime
->channels
;
733 /* Set up converting SRCs */
734 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
735 src
= apcm
->srccs
[i
];
736 src
->ops
->set_pm(src
, ((i
%multi
) != (multi
-1)));
737 src_mgr
->src_disable(src_mgr
, src
);
740 /* Set up recording SRC */
742 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
744 src
->ops
->set_sa(src
, apcm
->vm_block
->addr
);
745 src
->ops
->set_la(src
, apcm
->vm_block
->addr
+ apcm
->vm_block
->size
);
746 src
->ops
->set_ca(src
, apcm
->vm_block
->addr
);
747 src_mgr
->src_disable(src_mgr
, src
);
749 /* Disable relevant SRCs firstly */
750 src_mgr
->commit_write(src_mgr
);
752 /* Enable SRCs respectively */
753 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
754 src
= apcm
->srccs
[i
];
755 src
->ops
->set_state(src
, SRC_STATE_RUN
);
756 src
->ops
->commit_write(src
);
757 src_mgr
->src_enable_s(src_mgr
, src
);
760 src
->ops
->set_bm(src
, 1);
761 src
->ops
->set_state(src
, SRC_STATE_RUN
);
762 src
->ops
->commit_write(src
);
763 src_mgr
->src_enable_s(src_mgr
, src
);
765 /* Enable relevant SRCs synchronously */
766 src_mgr
->commit_write(src_mgr
);
768 ct_timer_start(apcm
->timer
);
773 atc_pcm_capture_position(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
775 struct src
*src
= apcm
->src
;
779 return src
->ops
->get_ca(src
) - apcm
->vm_block
->addr
;
782 static int spdif_passthru_playback_get_resources(struct ct_atc
*atc
,
783 struct ct_atc_pcm
*apcm
)
785 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
786 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
787 struct src_desc desc
= {0};
788 struct amixer_desc mix_dsc
= {0};
791 int n_amixer
= apcm
->substream
->runtime
->channels
, i
;
792 unsigned int pitch
, rsr
= atc
->pll_rate
;
794 /* first release old resources */
795 atc_pcm_release_resources(atc
, apcm
);
797 /* Get SRC resource */
798 desc
.multi
= apcm
->substream
->runtime
->channels
;
800 while (apcm
->substream
->runtime
->rate
> (rsr
* desc
.msr
))
804 err
= src_mgr
->get_src(src_mgr
, &desc
, (struct src
**)&apcm
->src
);
808 pitch
= atc_get_pitch(apcm
->substream
->runtime
->rate
, (rsr
* desc
.msr
));
810 src
->ops
->set_pitch(src
, pitch
);
811 src
->ops
->set_rom(src
, select_rom(pitch
));
812 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
814 src
->ops
->set_pm(src
, (src
->ops
->next_interleave(src
) != NULL
));
815 src
->ops
->set_bp(src
, 1);
817 /* Get AMIXER resource */
818 n_amixer
= (n_amixer
< 2) ? 2 : n_amixer
;
819 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
820 if (!apcm
->amixers
) {
824 mix_dsc
.msr
= desc
.msr
;
825 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
826 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
827 (struct amixer
**)&apcm
->amixers
[i
]);
834 /* Set up device virtual mem map */
835 err
= ct_map_audio_buffer(atc
, apcm
);
842 atc_pcm_release_resources(atc
, apcm
);
846 static int atc_pll_init(struct ct_atc
*atc
, int rate
)
848 struct hw
*hw
= atc
->hw
;
850 err
= hw
->pll_init(hw
, rate
);
851 atc
->pll_rate
= err
? 0 : rate
;
856 spdif_passthru_playback_setup(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
858 struct dao
*dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
859 unsigned int rate
= apcm
->substream
->runtime
->rate
;
862 unsigned char iec958_con_fs
;
866 iec958_con_fs
= IEC958_AES3_CON_FS_48000
;
869 iec958_con_fs
= IEC958_AES3_CON_FS_44100
;
872 iec958_con_fs
= IEC958_AES3_CON_FS_32000
;
878 mutex_lock(&atc
->atc_mutex
);
879 dao
->ops
->get_spos(dao
, &status
);
880 if (((status
>> 24) & IEC958_AES3_CON_FS
) != iec958_con_fs
) {
881 status
&= ~(IEC958_AES3_CON_FS
<< 24);
882 status
|= (iec958_con_fs
<< 24);
883 dao
->ops
->set_spos(dao
, status
);
884 dao
->ops
->commit_write(dao
);
886 if ((rate
!= atc
->pll_rate
) && (32000 != rate
))
887 err
= atc_pll_init(atc
, rate
);
888 mutex_unlock(&atc
->atc_mutex
);
894 spdif_passthru_playback_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
897 struct amixer
*amixer
;
902 atc_pcm_release_resources(atc
, apcm
);
904 /* Configure SPDIFOO and PLL to passthrough mode;
905 * determine pll_rate. */
906 err
= spdif_passthru_playback_setup(atc
, apcm
);
910 /* Get needed resources. */
911 err
= spdif_passthru_playback_get_resources(atc
, apcm
);
915 /* Connect resources */
917 for (i
= 0; i
< apcm
->n_amixer
; i
++) {
918 amixer
= apcm
->amixers
[i
];
919 amixer
->ops
->setup(amixer
, &src
->rsc
, INIT_VOL
, NULL
);
920 src
= src
->ops
->next_interleave(src
);
924 /* Connect to SPDIFOO */
925 mutex_lock(&atc
->atc_mutex
);
926 dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
927 amixer
= apcm
->amixers
[0];
928 dao
->ops
->set_left_input(dao
, &amixer
->rsc
);
929 amixer
= apcm
->amixers
[1];
930 dao
->ops
->set_right_input(dao
, &amixer
->rsc
);
931 mutex_unlock(&atc
->atc_mutex
);
933 ct_timer_prepare(apcm
->timer
);
938 static int atc_select_line_in(struct ct_atc
*atc
)
940 struct hw
*hw
= atc
->hw
;
941 struct ct_mixer
*mixer
= atc
->mixer
;
944 if (hw
->is_adc_source_selected(hw
, ADC_LINEIN
))
947 mixer
->set_input_left(mixer
, MIX_MIC_IN
, NULL
);
948 mixer
->set_input_right(mixer
, MIX_MIC_IN
, NULL
);
950 hw
->select_adc_source(hw
, ADC_LINEIN
);
953 mixer
->set_input_left(mixer
, MIX_LINE_IN
, &src
->rsc
);
955 mixer
->set_input_right(mixer
, MIX_LINE_IN
, &src
->rsc
);
960 static int atc_select_mic_in(struct ct_atc
*atc
)
962 struct hw
*hw
= atc
->hw
;
963 struct ct_mixer
*mixer
= atc
->mixer
;
966 if (hw
->is_adc_source_selected(hw
, ADC_MICIN
))
969 mixer
->set_input_left(mixer
, MIX_LINE_IN
, NULL
);
970 mixer
->set_input_right(mixer
, MIX_LINE_IN
, NULL
);
972 hw
->select_adc_source(hw
, ADC_MICIN
);
975 mixer
->set_input_left(mixer
, MIX_MIC_IN
, &src
->rsc
);
977 mixer
->set_input_right(mixer
, MIX_MIC_IN
, &src
->rsc
);
982 static struct capabilities
atc_capabilities(struct ct_atc
*atc
)
984 struct hw
*hw
= atc
->hw
;
986 return hw
->capabilities(hw
);
989 static int atc_output_switch_get(struct ct_atc
*atc
)
991 struct hw
*hw
= atc
->hw
;
993 return hw
->output_switch_get(hw
);
996 static int atc_output_switch_put(struct ct_atc
*atc
, int position
)
998 struct hw
*hw
= atc
->hw
;
1000 return hw
->output_switch_put(hw
, position
);
1003 static int atc_mic_source_switch_get(struct ct_atc
*atc
)
1005 struct hw
*hw
= atc
->hw
;
1007 return hw
->mic_source_switch_get(hw
);
1010 static int atc_mic_source_switch_put(struct ct_atc
*atc
, int position
)
1012 struct hw
*hw
= atc
->hw
;
1014 return hw
->mic_source_switch_put(hw
, position
);
1017 static int atc_select_digit_io(struct ct_atc
*atc
)
1019 struct hw
*hw
= atc
->hw
;
1021 if (hw
->is_adc_source_selected(hw
, ADC_NONE
))
1024 hw
->select_adc_source(hw
, ADC_NONE
);
1029 static int atc_daio_unmute(struct ct_atc
*atc
, unsigned char state
, int type
)
1031 struct daio_mgr
*daio_mgr
= atc
->rsc_mgrs
[DAIO
];
1034 daio_mgr
->daio_enable(daio_mgr
, atc
->daios
[type
]);
1036 daio_mgr
->daio_disable(daio_mgr
, atc
->daios
[type
]);
1038 daio_mgr
->commit_write(daio_mgr
);
1044 atc_dao_get_status(struct ct_atc
*atc
, unsigned int *status
, int type
)
1046 struct dao
*dao
= container_of(atc
->daios
[type
], struct dao
, daio
);
1047 return dao
->ops
->get_spos(dao
, status
);
1051 atc_dao_set_status(struct ct_atc
*atc
, unsigned int status
, int type
)
1053 struct dao
*dao
= container_of(atc
->daios
[type
], struct dao
, daio
);
1055 dao
->ops
->set_spos(dao
, status
);
1056 dao
->ops
->commit_write(dao
);
1060 static int atc_line_front_unmute(struct ct_atc
*atc
, unsigned char state
)
1062 return atc_daio_unmute(atc
, state
, LINEO1
);
1065 static int atc_line_surround_unmute(struct ct_atc
*atc
, unsigned char state
)
1067 return atc_daio_unmute(atc
, state
, LINEO2
);
1070 static int atc_line_clfe_unmute(struct ct_atc
*atc
, unsigned char state
)
1072 return atc_daio_unmute(atc
, state
, LINEO3
);
1075 static int atc_line_rear_unmute(struct ct_atc
*atc
, unsigned char state
)
1077 return atc_daio_unmute(atc
, state
, LINEO4
);
1080 static int atc_line_in_unmute(struct ct_atc
*atc
, unsigned char state
)
1082 return atc_daio_unmute(atc
, state
, LINEIM
);
1085 static int atc_mic_unmute(struct ct_atc
*atc
, unsigned char state
)
1087 return atc_daio_unmute(atc
, state
, MIC
);
1090 static int atc_spdif_out_unmute(struct ct_atc
*atc
, unsigned char state
)
1092 return atc_daio_unmute(atc
, state
, SPDIFOO
);
1095 static int atc_spdif_in_unmute(struct ct_atc
*atc
, unsigned char state
)
1097 return atc_daio_unmute(atc
, state
, SPDIFIO
);
1100 static int atc_spdif_out_get_status(struct ct_atc
*atc
, unsigned int *status
)
1102 return atc_dao_get_status(atc
, status
, SPDIFOO
);
1105 static int atc_spdif_out_set_status(struct ct_atc
*atc
, unsigned int status
)
1107 return atc_dao_set_status(atc
, status
, SPDIFOO
);
1110 static int atc_spdif_out_passthru(struct ct_atc
*atc
, unsigned char state
)
1112 struct dao_desc da_dsc
= {0};
1115 struct ct_mixer
*mixer
= atc
->mixer
;
1116 struct rsc
*rscs
[2] = {NULL
};
1117 unsigned int spos
= 0;
1119 mutex_lock(&atc
->atc_mutex
);
1120 dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
1121 da_dsc
.msr
= state
? 1 : atc
->msr
;
1122 da_dsc
.passthru
= state
? 1 : 0;
1123 err
= dao
->ops
->reinit(dao
, &da_dsc
);
1125 spos
= IEC958_DEFAULT_CON
;
1127 mixer
->get_output_ports(mixer
, MIX_SPDIF_OUT
,
1128 &rscs
[0], &rscs
[1]);
1129 dao
->ops
->set_left_input(dao
, rscs
[0]);
1130 dao
->ops
->set_right_input(dao
, rscs
[1]);
1131 /* Restore PLL to atc->rsr if needed. */
1132 if (atc
->pll_rate
!= atc
->rsr
)
1133 err
= atc_pll_init(atc
, atc
->rsr
);
1135 dao
->ops
->set_spos(dao
, spos
);
1136 dao
->ops
->commit_write(dao
);
1137 mutex_unlock(&atc
->atc_mutex
);
1142 static int atc_release_resources(struct ct_atc
*atc
)
1145 struct daio_mgr
*daio_mgr
= NULL
;
1146 struct dao
*dao
= NULL
;
1147 struct daio
*daio
= NULL
;
1148 struct sum_mgr
*sum_mgr
= NULL
;
1149 struct src_mgr
*src_mgr
= NULL
;
1150 struct srcimp_mgr
*srcimp_mgr
= NULL
;
1151 struct srcimp
*srcimp
= NULL
;
1152 struct ct_mixer
*mixer
= NULL
;
1154 /* disconnect internal mixer objects */
1157 mixer
->set_input_left(mixer
, MIX_LINE_IN
, NULL
);
1158 mixer
->set_input_right(mixer
, MIX_LINE_IN
, NULL
);
1159 mixer
->set_input_left(mixer
, MIX_MIC_IN
, NULL
);
1160 mixer
->set_input_right(mixer
, MIX_MIC_IN
, NULL
);
1161 mixer
->set_input_left(mixer
, MIX_SPDIF_IN
, NULL
);
1162 mixer
->set_input_right(mixer
, MIX_SPDIF_IN
, NULL
);
1166 daio_mgr
= (struct daio_mgr
*)atc
->rsc_mgrs
[DAIO
];
1167 for (i
= 0; i
< atc
->n_daio
; i
++) {
1168 daio
= atc
->daios
[i
];
1169 if (daio
->type
< LINEIM
) {
1170 dao
= container_of(daio
, struct dao
, daio
);
1171 dao
->ops
->clear_left_input(dao
);
1172 dao
->ops
->clear_right_input(dao
);
1174 daio_mgr
->put_daio(daio_mgr
, daio
);
1181 sum_mgr
= atc
->rsc_mgrs
[SUM
];
1182 for (i
= 0; i
< atc
->n_pcm
; i
++)
1183 sum_mgr
->put_sum(sum_mgr
, atc
->pcm
[i
]);
1190 src_mgr
= atc
->rsc_mgrs
[SRC
];
1191 for (i
= 0; i
< atc
->n_src
; i
++)
1192 src_mgr
->put_src(src_mgr
, atc
->srcs
[i
]);
1199 srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
1200 for (i
= 0; i
< atc
->n_srcimp
; i
++) {
1201 srcimp
= atc
->srcimps
[i
];
1202 srcimp
->ops
->unmap(srcimp
);
1203 srcimp_mgr
->put_srcimp(srcimp_mgr
, atc
->srcimps
[i
]);
1205 kfree(atc
->srcimps
);
1206 atc
->srcimps
= NULL
;
1212 static int ct_atc_destroy(struct ct_atc
*atc
)
1220 ct_timer_free(atc
->timer
);
1224 atc_release_resources(atc
);
1226 /* Destroy internal mixer objects */
1228 ct_mixer_destroy(atc
->mixer
);
1230 for (i
= 0; i
< NUM_RSCTYP
; i
++) {
1231 if (rsc_mgr_funcs
[i
].destroy
&& atc
->rsc_mgrs
[i
])
1232 rsc_mgr_funcs
[i
].destroy(atc
->rsc_mgrs
[i
]);
1237 destroy_hw_obj(atc
->hw
);
1239 /* Destroy device virtual memory manager object */
1241 ct_vm_destroy(atc
->vm
);
1250 static int atc_dev_free(struct snd_device
*dev
)
1252 struct ct_atc
*atc
= dev
->device_data
;
1253 return ct_atc_destroy(atc
);
1256 static int atc_identify_card(struct ct_atc
*atc
, unsigned int ssid
)
1258 const struct snd_pci_quirk
*p
;
1259 const struct snd_pci_quirk
*list
;
1260 u16 vendor_id
, device_id
;
1262 switch (atc
->chip_type
) {
1264 atc
->chip_name
= "20K1";
1265 list
= subsys_20k1_list
;
1268 atc
->chip_name
= "20K2";
1269 list
= subsys_20k2_list
;
1275 vendor_id
= ssid
>> 16;
1276 device_id
= ssid
& 0xffff;
1278 vendor_id
= atc
->pci
->subsystem_vendor
;
1279 device_id
= atc
->pci
->subsystem_device
;
1281 p
= snd_pci_quirk_lookup_id(vendor_id
, device_id
, list
);
1284 dev_err(atc
->card
->dev
,
1285 "Device %04x:%04x is on the denylist\n",
1286 vendor_id
, device_id
);
1289 atc
->model
= p
->value
;
1291 if (atc
->chip_type
== ATC20K1
)
1292 atc
->model
= CT20K1_UNKNOWN
;
1294 atc
->model
= CT20K2_UNKNOWN
;
1296 atc
->model_name
= ct_subsys_name
[atc
->model
];
1297 dev_info(atc
->card
->dev
, "chip %s model %s (%04x:%04x) is found\n",
1298 atc
->chip_name
, atc
->model_name
,
1299 vendor_id
, device_id
);
1303 int ct_atc_create_alsa_devs(struct ct_atc
*atc
)
1308 alsa_dev_funcs
[MIXER
].public_name
= atc
->chip_name
;
1310 for (i
= 0; i
< NUM_CTALSADEVS
; i
++) {
1311 if (!alsa_dev_funcs
[i
].create
)
1314 err
= alsa_dev_funcs
[i
].create(atc
, i
,
1315 alsa_dev_funcs
[i
].public_name
);
1317 dev_err(atc
->card
->dev
,
1318 "Creating alsa device %d failed!\n", i
);
1326 static int atc_create_hw_devs(struct ct_atc
*atc
)
1329 struct card_conf info
= {0};
1332 err
= create_hw_obj(atc
->pci
, atc
->chip_type
, atc
->model
, &hw
);
1334 dev_err(atc
->card
->dev
, "Failed to create hw obj!!!\n");
1337 hw
->card
= atc
->card
;
1340 /* Initialize card hardware. */
1341 info
.rsr
= atc
->rsr
;
1342 info
.msr
= atc
->msr
;
1343 info
.vm_pgt_phys
= atc_get_ptp_phys(atc
, 0);
1344 err
= hw
->card_init(hw
, &info
);
1348 for (i
= 0; i
< NUM_RSCTYP
; i
++) {
1349 if (!rsc_mgr_funcs
[i
].create
)
1352 err
= rsc_mgr_funcs
[i
].create(atc
->hw
, &atc
->rsc_mgrs
[i
]);
1354 dev_err(atc
->card
->dev
,
1355 "Failed to create rsc_mgr %d!!!\n", i
);
1363 static int atc_get_resources(struct ct_atc
*atc
)
1365 struct daio_desc da_desc
= {0};
1366 struct daio_mgr
*daio_mgr
;
1367 struct src_desc src_dsc
= {0};
1368 struct src_mgr
*src_mgr
;
1369 struct srcimp_desc srcimp_dsc
= {0};
1370 struct srcimp_mgr
*srcimp_mgr
;
1371 struct sum_desc sum_dsc
= {0};
1372 struct sum_mgr
*sum_mgr
;
1373 int err
, i
, num_srcs
, num_daios
;
1375 num_daios
= ((atc
->model
== CTSB1270
) ? 8 : 7);
1376 num_srcs
= ((atc
->model
== CTSB1270
) ? 6 : 4);
1378 atc
->daios
= kcalloc(num_daios
, sizeof(void *), GFP_KERNEL
);
1382 atc
->srcs
= kcalloc(num_srcs
, sizeof(void *), GFP_KERNEL
);
1386 atc
->srcimps
= kcalloc(num_srcs
, sizeof(void *), GFP_KERNEL
);
1390 atc
->pcm
= kcalloc(2 * 4, sizeof(void *), GFP_KERNEL
);
1394 daio_mgr
= (struct daio_mgr
*)atc
->rsc_mgrs
[DAIO
];
1395 da_desc
.msr
= atc
->msr
;
1396 for (i
= 0, atc
->n_daio
= 0; i
< num_daios
; i
++) {
1397 da_desc
.type
= (atc
->model
!= CTSB073X
) ? i
:
1398 ((i
== SPDIFIO
) ? SPDIFI1
: i
);
1399 err
= daio_mgr
->get_daio(daio_mgr
, &da_desc
,
1400 (struct daio
**)&atc
->daios
[i
]);
1402 dev_err(atc
->card
->dev
,
1403 "Failed to get DAIO resource %d!!!\n",
1410 src_mgr
= atc
->rsc_mgrs
[SRC
];
1412 src_dsc
.msr
= atc
->msr
;
1413 src_dsc
.mode
= ARCRW
;
1414 for (i
= 0, atc
->n_src
= 0; i
< num_srcs
; i
++) {
1415 err
= src_mgr
->get_src(src_mgr
, &src_dsc
,
1416 (struct src
**)&atc
->srcs
[i
]);
1423 srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
1425 for (i
= 0, atc
->n_srcimp
= 0; i
< num_srcs
; i
++) {
1426 err
= srcimp_mgr
->get_srcimp(srcimp_mgr
, &srcimp_dsc
,
1427 (struct srcimp
**)&atc
->srcimps
[i
]);
1434 sum_mgr
= atc
->rsc_mgrs
[SUM
];
1435 sum_dsc
.msr
= atc
->msr
;
1436 for (i
= 0, atc
->n_pcm
= 0; i
< (2*4); i
++) {
1437 err
= sum_mgr
->get_sum(sum_mgr
, &sum_dsc
,
1438 (struct sum
**)&atc
->pcm
[i
]);
1449 atc_connect_dai(struct src_mgr
*src_mgr
, struct dai
*dai
,
1450 struct src
**srcs
, struct srcimp
**srcimps
)
1452 struct rsc
*rscs
[2] = {NULL
};
1454 struct srcimp
*srcimp
;
1457 rscs
[0] = &dai
->daio
.rscl
;
1458 rscs
[1] = &dai
->daio
.rscr
;
1459 for (i
= 0; i
< 2; i
++) {
1461 srcimp
= srcimps
[i
];
1462 srcimp
->ops
->map(srcimp
, src
, rscs
[i
]);
1463 src_mgr
->src_disable(src_mgr
, src
);
1466 src_mgr
->commit_write(src_mgr
); /* Actually disable SRCs */
1469 src
->ops
->set_pm(src
, 1);
1470 for (i
= 0; i
< 2; i
++) {
1472 src
->ops
->set_state(src
, SRC_STATE_RUN
);
1473 src
->ops
->commit_write(src
);
1474 src_mgr
->src_enable_s(src_mgr
, src
);
1477 dai
->ops
->set_srt_srcl(dai
, &(srcs
[0]->rsc
));
1478 dai
->ops
->set_srt_srcr(dai
, &(srcs
[1]->rsc
));
1480 dai
->ops
->set_enb_src(dai
, 1);
1481 dai
->ops
->set_enb_srt(dai
, 1);
1482 dai
->ops
->commit_write(dai
);
1484 src_mgr
->commit_write(src_mgr
); /* Synchronously enable SRCs */
1487 static void atc_connect_resources(struct ct_atc
*atc
)
1493 struct ct_mixer
*mixer
;
1494 struct rsc
*rscs
[2] = {NULL
};
1499 for (i
= MIX_WAVE_FRONT
, j
= LINEO1
; i
<= MIX_SPDIF_OUT
; i
++, j
++) {
1500 mixer
->get_output_ports(mixer
, i
, &rscs
[0], &rscs
[1]);
1501 dao
= container_of(atc
->daios
[j
], struct dao
, daio
);
1502 dao
->ops
->set_left_input(dao
, rscs
[0]);
1503 dao
->ops
->set_right_input(dao
, rscs
[1]);
1506 dai
= container_of(atc
->daios
[LINEIM
], struct dai
, daio
);
1507 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1508 (struct src
**)&atc
->srcs
[2],
1509 (struct srcimp
**)&atc
->srcimps
[2]);
1511 mixer
->set_input_left(mixer
, MIX_LINE_IN
, &src
->rsc
);
1513 mixer
->set_input_right(mixer
, MIX_LINE_IN
, &src
->rsc
);
1515 if (atc
->model
== CTSB1270
) {
1516 /* Titanium HD has a dedicated ADC for the Mic. */
1517 dai
= container_of(atc
->daios
[MIC
], struct dai
, daio
);
1518 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1519 (struct src
**)&atc
->srcs
[4],
1520 (struct srcimp
**)&atc
->srcimps
[4]);
1522 mixer
->set_input_left(mixer
, MIX_MIC_IN
, &src
->rsc
);
1524 mixer
->set_input_right(mixer
, MIX_MIC_IN
, &src
->rsc
);
1527 dai
= container_of(atc
->daios
[SPDIFIO
], struct dai
, daio
);
1528 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1529 (struct src
**)&atc
->srcs
[0],
1530 (struct srcimp
**)&atc
->srcimps
[0]);
1533 mixer
->set_input_left(mixer
, MIX_SPDIF_IN
, &src
->rsc
);
1535 mixer
->set_input_right(mixer
, MIX_SPDIF_IN
, &src
->rsc
);
1537 for (i
= MIX_PCMI_FRONT
, j
= 0; i
<= MIX_PCMI_SURROUND
; i
++, j
+= 2) {
1539 mixer
->set_input_left(mixer
, i
, &sum
->rsc
);
1540 sum
= atc
->pcm
[j
+1];
1541 mixer
->set_input_right(mixer
, i
, &sum
->rsc
);
1545 #ifdef CONFIG_PM_SLEEP
1546 static int atc_suspend(struct ct_atc
*atc
)
1548 struct hw
*hw
= atc
->hw
;
1550 snd_power_change_state(atc
->card
, SNDRV_CTL_POWER_D3hot
);
1552 atc_release_resources(atc
);
1559 static int atc_hw_resume(struct ct_atc
*atc
)
1561 struct hw
*hw
= atc
->hw
;
1562 struct card_conf info
= {0};
1564 /* Re-initialize card hardware. */
1565 info
.rsr
= atc
->rsr
;
1566 info
.msr
= atc
->msr
;
1567 info
.vm_pgt_phys
= atc_get_ptp_phys(atc
, 0);
1568 return hw
->resume(hw
, &info
);
1571 static int atc_resources_resume(struct ct_atc
*atc
)
1573 struct ct_mixer
*mixer
;
1577 err
= atc_get_resources(atc
);
1579 atc_release_resources(atc
);
1583 /* Build topology */
1584 atc_connect_resources(atc
);
1587 mixer
->resume(mixer
);
1592 static int atc_resume(struct ct_atc
*atc
)
1596 /* Do hardware resume. */
1597 err
= atc_hw_resume(atc
);
1599 dev_err(atc
->card
->dev
,
1600 "pci_enable_device failed, disabling device\n");
1601 snd_card_disconnect(atc
->card
);
1605 err
= atc_resources_resume(atc
);
1609 snd_power_change_state(atc
->card
, SNDRV_CTL_POWER_D0
);
1615 static const struct ct_atc atc_preset
= {
1616 .map_audio_buffer
= ct_map_audio_buffer
,
1617 .unmap_audio_buffer
= ct_unmap_audio_buffer
,
1618 .pcm_playback_prepare
= atc_pcm_playback_prepare
,
1619 .pcm_release_resources
= atc_pcm_release_resources
,
1620 .pcm_playback_start
= atc_pcm_playback_start
,
1621 .pcm_playback_stop
= atc_pcm_stop
,
1622 .pcm_playback_position
= atc_pcm_playback_position
,
1623 .pcm_capture_prepare
= atc_pcm_capture_prepare
,
1624 .pcm_capture_start
= atc_pcm_capture_start
,
1625 .pcm_capture_stop
= atc_pcm_stop
,
1626 .pcm_capture_position
= atc_pcm_capture_position
,
1627 .spdif_passthru_playback_prepare
= spdif_passthru_playback_prepare
,
1628 .get_ptp_phys
= atc_get_ptp_phys
,
1629 .select_line_in
= atc_select_line_in
,
1630 .select_mic_in
= atc_select_mic_in
,
1631 .select_digit_io
= atc_select_digit_io
,
1632 .line_front_unmute
= atc_line_front_unmute
,
1633 .line_surround_unmute
= atc_line_surround_unmute
,
1634 .line_clfe_unmute
= atc_line_clfe_unmute
,
1635 .line_rear_unmute
= atc_line_rear_unmute
,
1636 .line_in_unmute
= atc_line_in_unmute
,
1637 .mic_unmute
= atc_mic_unmute
,
1638 .spdif_out_unmute
= atc_spdif_out_unmute
,
1639 .spdif_in_unmute
= atc_spdif_in_unmute
,
1640 .spdif_out_get_status
= atc_spdif_out_get_status
,
1641 .spdif_out_set_status
= atc_spdif_out_set_status
,
1642 .spdif_out_passthru
= atc_spdif_out_passthru
,
1643 .capabilities
= atc_capabilities
,
1644 .output_switch_get
= atc_output_switch_get
,
1645 .output_switch_put
= atc_output_switch_put
,
1646 .mic_source_switch_get
= atc_mic_source_switch_get
,
1647 .mic_source_switch_put
= atc_mic_source_switch_put
,
1648 #ifdef CONFIG_PM_SLEEP
1649 .suspend
= atc_suspend
,
1650 .resume
= atc_resume
,
1655 * ct_atc_create - create and initialize a hardware manager
1656 * @card: corresponding alsa card object
1657 * @pci: corresponding kernel pci device object
1658 * @rsr: reference sampling rate
1659 * @msr: master sampling rate
1660 * @chip_type: CHIPTYP enum values
1661 * @ssid: vendor ID (upper 16 bits) and device ID (lower 16 bits)
1662 * @ratc: return created object address in it
1664 * Creates and initializes a hardware manager.
1666 * Creates kmallocated ct_atc structure. Initializes hardware.
1667 * Returns 0 if succeeds, or negative error code if fails.
1670 int ct_atc_create(struct snd_card
*card
, struct pci_dev
*pci
,
1671 unsigned int rsr
, unsigned int msr
,
1672 int chip_type
, unsigned int ssid
,
1673 struct ct_atc
**ratc
)
1676 static const struct snd_device_ops ops
= {
1677 .dev_free
= atc_dev_free
,
1683 atc
= kzalloc(sizeof(*atc
), GFP_KERNEL
);
1687 /* Set operations */
1694 atc
->chip_type
= chip_type
;
1696 mutex_init(&atc
->atc_mutex
);
1698 /* Find card model */
1699 err
= atc_identify_card(atc
, ssid
);
1701 dev_err(card
->dev
, "ctatc: Card not recognised\n");
1705 /* Set up device virtual memory management object */
1706 err
= ct_vm_create(&atc
->vm
, pci
);
1710 /* Create all atc hw devices */
1711 err
= atc_create_hw_devs(atc
);
1715 err
= ct_mixer_create(atc
, (struct ct_mixer
**)&atc
->mixer
);
1717 dev_err(card
->dev
, "Failed to create mixer obj!!!\n");
1722 err
= atc_get_resources(atc
);
1726 /* Build topology */
1727 atc_connect_resources(atc
);
1729 atc
->timer
= ct_timer_new(atc
);
1735 err
= snd_device_new(card
, SNDRV_DEV_LOWLEVEL
, atc
, &ops
);
1743 ct_atc_destroy(atc
);
1744 dev_err(card
->dev
, "Something wrong!!!\n");