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
, 0x0021, "SB046x", CTSB046X
),
40 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0022, "SB055x", CTSB055X
),
41 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x002f, "SB055x", CTSB055X
),
42 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0029, "SB073x", CTSB073X
),
43 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, 0x0031, "SB073x", CTSB073X
),
44 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE
, 0xf000, 0x6000,
49 static const struct snd_pci_quirk subsys_20k2_list
[] = {
50 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB0760
,
52 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB1270
,
54 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08801
,
56 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08802
,
58 SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE
, PCI_SUBDEVICE_ID_CREATIVE_SB08803
,
60 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE
, 0xf000,
61 PCI_SUBDEVICE_ID_CREATIVE_HENDRIX
, "HENDRIX",
66 static const char *ct_subsys_name
[NUM_CTCARDS
] = {
68 [CTSB046X
] = "SB046x",
69 [CTSB055X
] = "SB055x",
70 [CTSB073X
] = "SB073x",
72 [CT20K1_UNKNOWN
] = "Unknown",
74 [CTSB0760
] = "SB076x",
75 [CTHENDRIX
] = "Hendrix",
76 [CTSB0880
] = "SB0880",
77 [CTSB1270
] = "SB1270",
78 [CT20K2_UNKNOWN
] = "Unknown",
82 int (*create
)(struct ct_atc
*atc
,
83 enum CTALSADEVS device
, const char *device_name
);
84 int (*destroy
)(void *alsa_dev
);
85 const char *public_name
;
86 } alsa_dev_funcs
[NUM_CTALSADEVS
] = {
87 [FRONT
] = { .create
= ct_alsa_pcm_create
,
89 .public_name
= "Front/WaveIn"},
90 [SURROUND
] = { .create
= ct_alsa_pcm_create
,
92 .public_name
= "Surround"},
93 [CLFE
] = { .create
= ct_alsa_pcm_create
,
95 .public_name
= "Center/LFE"},
96 [SIDE
] = { .create
= ct_alsa_pcm_create
,
98 .public_name
= "Side"},
99 [IEC958
] = { .create
= ct_alsa_pcm_create
,
101 .public_name
= "IEC958 Non-audio"},
103 [MIXER
] = { .create
= ct_alsa_mix_create
,
105 .public_name
= "Mixer"}
109 int (*create
)(struct hw
*hw
, void **rmgr
);
110 int (*destroy
)(void *mgr
);
111 } rsc_mgr_funcs
[NUM_RSCTYP
] = {
112 [SRC
] = { .create
= src_mgr_create
,
113 .destroy
= src_mgr_destroy
},
114 [SRCIMP
] = { .create
= srcimp_mgr_create
,
115 .destroy
= srcimp_mgr_destroy
},
116 [AMIXER
] = { .create
= amixer_mgr_create
,
117 .destroy
= amixer_mgr_destroy
},
118 [SUM
] = { .create
= sum_mgr_create
,
119 .destroy
= sum_mgr_destroy
},
120 [DAIO
] = { .create
= daio_mgr_create
,
121 .destroy
= daio_mgr_destroy
}
125 atc_pcm_release_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
);
128 * Only mono and interleaved modes are supported now.
129 * Always allocates a contiguous channel block.
132 static int ct_map_audio_buffer(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
134 struct snd_pcm_runtime
*runtime
;
137 if (!apcm
->substream
)
140 runtime
= apcm
->substream
->runtime
;
143 apcm
->vm_block
= vm
->map(vm
, apcm
->substream
, runtime
->dma_bytes
);
151 static void ct_unmap_audio_buffer(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
160 vm
->unmap(vm
, apcm
->vm_block
);
162 apcm
->vm_block
= NULL
;
165 static unsigned long atc_get_ptp_phys(struct ct_atc
*atc
, int index
)
167 return atc
->vm
->get_ptp_phys(atc
->vm
, index
);
170 static unsigned int convert_format(snd_pcm_format_t snd_format
,
171 struct snd_card
*card
)
173 switch (snd_format
) {
174 case SNDRV_PCM_FORMAT_U8
:
176 case SNDRV_PCM_FORMAT_S16_LE
:
178 case SNDRV_PCM_FORMAT_S24_3LE
:
180 case SNDRV_PCM_FORMAT_S32_LE
:
182 case SNDRV_PCM_FORMAT_FLOAT_LE
:
185 dev_err(card
->dev
, "not recognized snd format is %d\n",
192 atc_get_pitch(unsigned int input_rate
, unsigned int output_rate
)
197 /* get pitch and convert to fixed-point 8.24 format. */
198 pitch
= (input_rate
/ output_rate
) << 24;
199 input_rate
%= output_rate
;
202 for (b
= 31; ((b
>= 0) && !(input_rate
>> b
)); )
206 input_rate
<<= (31 - b
);
207 input_rate
/= output_rate
;
220 static int select_rom(unsigned int pitch
)
222 if (pitch
> 0x00428f5c && pitch
< 0x01b851ec) {
223 /* 0.26 <= pitch <= 1.72 */
225 } else if (pitch
== 0x01d66666 || pitch
== 0x01d66667) {
226 /* pitch == 1.8375 */
228 } else if (pitch
== 0x02000000) {
231 } else if (pitch
<= 0x08000000) {
232 /* 0 <= pitch <= 8 */
239 static int atc_pcm_playback_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
241 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
242 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
243 struct src_desc desc
= {0};
244 struct amixer_desc mix_dsc
= {0};
246 struct amixer
*amixer
;
248 int n_amixer
= apcm
->substream
->runtime
->channels
, i
= 0;
249 int device
= apcm
->substream
->pcm
->device
;
252 /* first release old resources */
253 atc_pcm_release_resources(atc
, apcm
);
255 /* Get SRC resource */
256 desc
.multi
= apcm
->substream
->runtime
->channels
;
259 err
= src_mgr
->get_src(src_mgr
, &desc
, (struct src
**)&apcm
->src
);
263 pitch
= atc_get_pitch(apcm
->substream
->runtime
->rate
,
264 (atc
->rsr
* atc
->msr
));
266 src
->ops
->set_pitch(src
, pitch
);
267 src
->ops
->set_rom(src
, select_rom(pitch
));
268 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
270 src
->ops
->set_pm(src
, (src
->ops
->next_interleave(src
) != NULL
));
272 /* Get AMIXER resource */
273 n_amixer
= (n_amixer
< 2) ? 2 : n_amixer
;
274 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
275 if (!apcm
->amixers
) {
279 mix_dsc
.msr
= atc
->msr
;
280 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
281 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
282 (struct amixer
**)&apcm
->amixers
[i
]);
289 /* Set up device virtual mem map */
290 err
= ct_map_audio_buffer(atc
, apcm
);
294 /* Connect resources */
296 for (i
= 0; i
< n_amixer
; i
++) {
297 amixer
= apcm
->amixers
[i
];
298 mutex_lock(&atc
->atc_mutex
);
299 amixer
->ops
->setup(amixer
, &src
->rsc
,
300 INIT_VOL
, atc
->pcm
[i
+device
*2]);
301 mutex_unlock(&atc
->atc_mutex
);
302 src
= src
->ops
->next_interleave(src
);
307 ct_timer_prepare(apcm
->timer
);
312 atc_pcm_release_resources(atc
, apcm
);
317 atc_pcm_release_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
319 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
320 struct srcimp_mgr
*srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
321 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
322 struct sum_mgr
*sum_mgr
= atc
->rsc_mgrs
[SUM
];
323 struct srcimp
*srcimp
;
327 for (i
= 0; i
< apcm
->n_srcimp
; i
++) {
328 srcimp
= apcm
->srcimps
[i
];
329 srcimp
->ops
->unmap(srcimp
);
330 srcimp_mgr
->put_srcimp(srcimp_mgr
, srcimp
);
331 apcm
->srcimps
[i
] = NULL
;
333 kfree(apcm
->srcimps
);
334 apcm
->srcimps
= NULL
;
338 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
339 src_mgr
->put_src(src_mgr
, apcm
->srccs
[i
]);
340 apcm
->srccs
[i
] = NULL
;
347 for (i
= 0; i
< apcm
->n_amixer
; i
++) {
348 amixer_mgr
->put_amixer(amixer_mgr
, apcm
->amixers
[i
]);
349 apcm
->amixers
[i
] = NULL
;
351 kfree(apcm
->amixers
);
352 apcm
->amixers
= NULL
;
356 sum_mgr
->put_sum(sum_mgr
, apcm
->mono
);
361 src_mgr
->put_src(src_mgr
, apcm
->src
);
365 if (apcm
->vm_block
) {
366 /* Undo device virtual mem map */
367 ct_unmap_audio_buffer(atc
, apcm
);
368 apcm
->vm_block
= NULL
;
374 static int atc_pcm_playback_start(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
376 unsigned int max_cisz
;
377 struct src
*src
= apcm
->src
;
383 max_cisz
= src
->multi
* src
->rsc
.msr
;
384 max_cisz
= 0x80 * (max_cisz
< 8 ? max_cisz
: 8);
386 src
->ops
->set_sa(src
, apcm
->vm_block
->addr
);
387 src
->ops
->set_la(src
, apcm
->vm_block
->addr
+ apcm
->vm_block
->size
);
388 src
->ops
->set_ca(src
, apcm
->vm_block
->addr
+ max_cisz
);
389 src
->ops
->set_cisz(src
, max_cisz
);
391 src
->ops
->set_bm(src
, 1);
392 src
->ops
->set_state(src
, SRC_STATE_INIT
);
393 src
->ops
->commit_write(src
);
395 ct_timer_start(apcm
->timer
);
399 static int atc_pcm_stop(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
404 ct_timer_stop(apcm
->timer
);
407 src
->ops
->set_bm(src
, 0);
408 src
->ops
->set_state(src
, SRC_STATE_OFF
);
409 src
->ops
->commit_write(src
);
412 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
413 src
= apcm
->srccs
[i
];
414 src
->ops
->set_bm(src
, 0);
415 src
->ops
->set_state(src
, SRC_STATE_OFF
);
416 src
->ops
->commit_write(src
);
426 atc_pcm_playback_position(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
428 struct src
*src
= apcm
->src
;
434 position
= src
->ops
->get_ca(src
);
436 if (position
< apcm
->vm_block
->addr
) {
437 dev_dbg(atc
->card
->dev
,
438 "bad ca - ca=0x%08x, vba=0x%08x, vbs=0x%08x\n",
439 position
, apcm
->vm_block
->addr
, apcm
->vm_block
->size
);
440 position
= apcm
->vm_block
->addr
;
443 size
= apcm
->vm_block
->size
;
444 max_cisz
= src
->multi
* src
->rsc
.msr
;
445 max_cisz
= 128 * (max_cisz
< 8 ? max_cisz
: 8);
447 return (position
+ size
- max_cisz
- apcm
->vm_block
->addr
) % size
;
450 struct src_node_conf_t
{
453 unsigned int mix_msr
:8;
454 unsigned int imp_msr
:8;
458 static void setup_src_node_conf(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
,
459 struct src_node_conf_t
*conf
, int *n_srcc
)
463 /* get pitch and convert to fixed-point 8.24 format. */
464 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
465 apcm
->substream
->runtime
->rate
);
468 if (1 == atc
->msr
) { /* FIXME: do we really need SRC here if pitch==1 */
469 *n_srcc
= apcm
->substream
->runtime
->channels
;
470 conf
[0].pitch
= pitch
;
471 conf
[0].mix_msr
= conf
[0].imp_msr
= conf
[0].msr
= 1;
473 } else if (2 <= atc
->msr
) {
474 if (0x8000000 < pitch
) {
475 /* Need two-stage SRCs, SRCIMPs and
476 * AMIXERs for converting format */
477 conf
[0].pitch
= (atc
->msr
<< 24);
478 conf
[0].msr
= conf
[0].mix_msr
= 1;
479 conf
[0].imp_msr
= atc
->msr
;
481 conf
[1].pitch
= atc_get_pitch(atc
->rsr
,
482 apcm
->substream
->runtime
->rate
);
483 conf
[1].msr
= conf
[1].mix_msr
= conf
[1].imp_msr
= 1;
485 *n_srcc
= apcm
->substream
->runtime
->channels
* 2;
486 } else if (0x1000000 < pitch
) {
487 /* Need one-stage SRCs, SRCIMPs and
488 * AMIXERs for converting format */
489 conf
[0].pitch
= pitch
;
490 conf
[0].msr
= conf
[0].mix_msr
491 = conf
[0].imp_msr
= atc
->msr
;
493 *n_srcc
= apcm
->substream
->runtime
->channels
;
499 atc_pcm_capture_get_resources(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
501 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
502 struct srcimp_mgr
*srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
503 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
504 struct sum_mgr
*sum_mgr
= atc
->rsc_mgrs
[SUM
];
505 struct src_desc src_dsc
= {0};
507 struct srcimp_desc srcimp_dsc
= {0};
508 struct srcimp
*srcimp
;
509 struct amixer_desc mix_dsc
= {0};
510 struct sum_desc sum_dsc
= {0};
513 int n_srcimp
, n_amixer
, n_srcc
, n_sum
;
514 struct src_node_conf_t src_node_conf
[2] = {{0} };
516 /* first release old resources */
517 atc_pcm_release_resources(atc
, apcm
);
519 /* The numbers of converting SRCs and SRCIMPs should be determined
522 multi
= apcm
->substream
->runtime
->channels
;
524 /* get pitch and convert to fixed-point 8.24 format. */
525 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
526 apcm
->substream
->runtime
->rate
);
528 setup_src_node_conf(atc
, apcm
, src_node_conf
, &n_srcc
);
529 n_sum
= (1 == multi
) ? 1 : 0;
530 n_amixer
= n_sum
* 2 + n_srcc
;
532 if ((multi
> 1) && (0x8000000 >= pitch
)) {
533 /* Need extra AMIXERs and SRCIMPs for special treatment
534 * of interleaved recording of conjugate channels */
535 n_amixer
+= multi
* atc
->msr
;
536 n_srcimp
+= multi
* atc
->msr
;
542 apcm
->srccs
= kcalloc(n_srcc
, sizeof(void *), GFP_KERNEL
);
547 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
548 if (!apcm
->amixers
) {
553 apcm
->srcimps
= kcalloc(n_srcimp
, sizeof(void *), GFP_KERNEL
);
554 if (!apcm
->srcimps
) {
559 /* Allocate SRCs for sample rate conversion if needed */
561 src_dsc
.mode
= ARCRW
;
562 for (i
= 0, apcm
->n_srcc
= 0; i
< n_srcc
; i
++) {
563 src_dsc
.msr
= src_node_conf
[i
/multi
].msr
;
564 err
= src_mgr
->get_src(src_mgr
, &src_dsc
,
565 (struct src
**)&apcm
->srccs
[i
]);
569 src
= apcm
->srccs
[i
];
570 pitch
= src_node_conf
[i
/multi
].pitch
;
571 src
->ops
->set_pitch(src
, pitch
);
572 src
->ops
->set_rom(src
, select_rom(pitch
));
573 src
->ops
->set_vo(src
, src_node_conf
[i
/multi
].vo
);
578 /* Allocate AMIXERs for routing SRCs of conversion if needed */
579 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
581 mix_dsc
.msr
= atc
->msr
;
582 else if (i
< (n_sum
*2+n_srcc
))
583 mix_dsc
.msr
= src_node_conf
[(i
-n_sum
*2)/multi
].mix_msr
;
587 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
588 (struct amixer
**)&apcm
->amixers
[i
]);
595 /* Allocate a SUM resource to mix all input channels together */
596 sum_dsc
.msr
= atc
->msr
;
597 err
= sum_mgr
->get_sum(sum_mgr
, &sum_dsc
, (struct sum
**)&apcm
->mono
);
601 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
602 apcm
->substream
->runtime
->rate
);
603 /* Allocate SRCIMP resources */
604 for (i
= 0, apcm
->n_srcimp
= 0; i
< n_srcimp
; i
++) {
606 srcimp_dsc
.msr
= src_node_conf
[i
/multi
].imp_msr
;
608 srcimp_dsc
.msr
= (pitch
<= 0x8000000) ? atc
->msr
: 1;
612 err
= srcimp_mgr
->get_srcimp(srcimp_mgr
, &srcimp_dsc
, &srcimp
);
616 apcm
->srcimps
[i
] = srcimp
;
620 /* Allocate a SRC for writing data to host memory */
621 src_dsc
.multi
= apcm
->substream
->runtime
->channels
;
623 src_dsc
.mode
= MEMWR
;
624 err
= src_mgr
->get_src(src_mgr
, &src_dsc
, (struct src
**)&apcm
->src
);
629 src
->ops
->set_pitch(src
, pitch
);
631 /* Set up device virtual mem map */
632 err
= ct_map_audio_buffer(atc
, apcm
);
639 atc_pcm_release_resources(atc
, apcm
);
643 static int atc_pcm_capture_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
646 struct amixer
*amixer
;
647 struct srcimp
*srcimp
;
648 struct ct_mixer
*mixer
= atc
->mixer
;
650 struct rsc
*out_ports
[8] = {NULL
};
651 int err
, i
, j
, n_sum
, multi
;
653 int mix_base
= 0, imp_base
= 0;
655 atc_pcm_release_resources(atc
, apcm
);
657 /* Get needed resources. */
658 err
= atc_pcm_capture_get_resources(atc
, apcm
);
662 /* Connect resources */
663 mixer
->get_output_ports(mixer
, MIX_PCMO_FRONT
,
664 &out_ports
[0], &out_ports
[1]);
666 multi
= apcm
->substream
->runtime
->channels
;
669 for (i
= 0; i
< 2; i
++) {
670 amixer
= apcm
->amixers
[i
];
671 amixer
->ops
->setup(amixer
, out_ports
[i
],
672 MONO_SUM_SCALE
, mono
);
674 out_ports
[0] = &mono
->rsc
;
676 mix_base
= n_sum
* 2;
679 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
680 src
= apcm
->srccs
[i
];
681 srcimp
= apcm
->srcimps
[imp_base
+i
];
682 amixer
= apcm
->amixers
[mix_base
+i
];
683 srcimp
->ops
->map(srcimp
, src
, out_ports
[i
%multi
]);
684 amixer
->ops
->setup(amixer
, &src
->rsc
, INIT_VOL
, NULL
);
685 out_ports
[i
%multi
] = &amixer
->rsc
;
688 pitch
= atc_get_pitch((atc
->rsr
* atc
->msr
),
689 apcm
->substream
->runtime
->rate
);
691 if ((multi
> 1) && (pitch
<= 0x8000000)) {
692 /* Special connection for interleaved
693 * recording with conjugate channels */
694 for (i
= 0; i
< multi
; i
++) {
695 out_ports
[i
]->ops
->master(out_ports
[i
]);
696 for (j
= 0; j
< atc
->msr
; j
++) {
697 amixer
= apcm
->amixers
[apcm
->n_srcc
+j
*multi
+i
];
698 amixer
->ops
->set_input(amixer
, out_ports
[i
]);
699 amixer
->ops
->set_scale(amixer
, INIT_VOL
);
700 amixer
->ops
->set_sum(amixer
, NULL
);
701 amixer
->ops
->commit_raw_write(amixer
);
702 out_ports
[i
]->ops
->next_conj(out_ports
[i
]);
704 srcimp
= apcm
->srcimps
[apcm
->n_srcc
+j
*multi
+i
];
705 srcimp
->ops
->map(srcimp
, apcm
->src
,
710 for (i
= 0; i
< multi
; i
++) {
711 srcimp
= apcm
->srcimps
[apcm
->n_srcc
+i
];
712 srcimp
->ops
->map(srcimp
, apcm
->src
, out_ports
[i
]);
716 ct_timer_prepare(apcm
->timer
);
721 static int atc_pcm_capture_start(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
724 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
731 multi
= apcm
->substream
->runtime
->channels
;
732 /* Set up converting SRCs */
733 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
734 src
= apcm
->srccs
[i
];
735 src
->ops
->set_pm(src
, ((i
%multi
) != (multi
-1)));
736 src_mgr
->src_disable(src_mgr
, src
);
739 /* Set up recording SRC */
741 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
743 src
->ops
->set_sa(src
, apcm
->vm_block
->addr
);
744 src
->ops
->set_la(src
, apcm
->vm_block
->addr
+ apcm
->vm_block
->size
);
745 src
->ops
->set_ca(src
, apcm
->vm_block
->addr
);
746 src_mgr
->src_disable(src_mgr
, src
);
748 /* Disable relevant SRCs firstly */
749 src_mgr
->commit_write(src_mgr
);
751 /* Enable SRCs respectively */
752 for (i
= 0; i
< apcm
->n_srcc
; i
++) {
753 src
= apcm
->srccs
[i
];
754 src
->ops
->set_state(src
, SRC_STATE_RUN
);
755 src
->ops
->commit_write(src
);
756 src_mgr
->src_enable_s(src_mgr
, src
);
759 src
->ops
->set_bm(src
, 1);
760 src
->ops
->set_state(src
, SRC_STATE_RUN
);
761 src
->ops
->commit_write(src
);
762 src_mgr
->src_enable_s(src_mgr
, src
);
764 /* Enable relevant SRCs synchronously */
765 src_mgr
->commit_write(src_mgr
);
767 ct_timer_start(apcm
->timer
);
772 atc_pcm_capture_position(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
774 struct src
*src
= apcm
->src
;
778 return src
->ops
->get_ca(src
) - apcm
->vm_block
->addr
;
781 static int spdif_passthru_playback_get_resources(struct ct_atc
*atc
,
782 struct ct_atc_pcm
*apcm
)
784 struct src_mgr
*src_mgr
= atc
->rsc_mgrs
[SRC
];
785 struct amixer_mgr
*amixer_mgr
= atc
->rsc_mgrs
[AMIXER
];
786 struct src_desc desc
= {0};
787 struct amixer_desc mix_dsc
= {0};
790 int n_amixer
= apcm
->substream
->runtime
->channels
, i
;
791 unsigned int pitch
, rsr
= atc
->pll_rate
;
793 /* first release old resources */
794 atc_pcm_release_resources(atc
, apcm
);
796 /* Get SRC resource */
797 desc
.multi
= apcm
->substream
->runtime
->channels
;
799 while (apcm
->substream
->runtime
->rate
> (rsr
* desc
.msr
))
803 err
= src_mgr
->get_src(src_mgr
, &desc
, (struct src
**)&apcm
->src
);
807 pitch
= atc_get_pitch(apcm
->substream
->runtime
->rate
, (rsr
* desc
.msr
));
809 src
->ops
->set_pitch(src
, pitch
);
810 src
->ops
->set_rom(src
, select_rom(pitch
));
811 src
->ops
->set_sf(src
, convert_format(apcm
->substream
->runtime
->format
,
813 src
->ops
->set_pm(src
, (src
->ops
->next_interleave(src
) != NULL
));
814 src
->ops
->set_bp(src
, 1);
816 /* Get AMIXER resource */
817 n_amixer
= (n_amixer
< 2) ? 2 : n_amixer
;
818 apcm
->amixers
= kcalloc(n_amixer
, sizeof(void *), GFP_KERNEL
);
819 if (!apcm
->amixers
) {
823 mix_dsc
.msr
= desc
.msr
;
824 for (i
= 0, apcm
->n_amixer
= 0; i
< n_amixer
; i
++) {
825 err
= amixer_mgr
->get_amixer(amixer_mgr
, &mix_dsc
,
826 (struct amixer
**)&apcm
->amixers
[i
]);
833 /* Set up device virtual mem map */
834 err
= ct_map_audio_buffer(atc
, apcm
);
841 atc_pcm_release_resources(atc
, apcm
);
845 static int atc_pll_init(struct ct_atc
*atc
, int rate
)
847 struct hw
*hw
= atc
->hw
;
849 err
= hw
->pll_init(hw
, rate
);
850 atc
->pll_rate
= err
? 0 : rate
;
855 spdif_passthru_playback_setup(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
857 struct dao
*dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
858 unsigned int rate
= apcm
->substream
->runtime
->rate
;
861 unsigned char iec958_con_fs
;
865 iec958_con_fs
= IEC958_AES3_CON_FS_48000
;
868 iec958_con_fs
= IEC958_AES3_CON_FS_44100
;
871 iec958_con_fs
= IEC958_AES3_CON_FS_32000
;
877 mutex_lock(&atc
->atc_mutex
);
878 dao
->ops
->get_spos(dao
, &status
);
879 if (((status
>> 24) & IEC958_AES3_CON_FS
) != iec958_con_fs
) {
880 status
&= ~(IEC958_AES3_CON_FS
<< 24);
881 status
|= (iec958_con_fs
<< 24);
882 dao
->ops
->set_spos(dao
, status
);
883 dao
->ops
->commit_write(dao
);
885 if ((rate
!= atc
->pll_rate
) && (32000 != rate
))
886 err
= atc_pll_init(atc
, rate
);
887 mutex_unlock(&atc
->atc_mutex
);
893 spdif_passthru_playback_prepare(struct ct_atc
*atc
, struct ct_atc_pcm
*apcm
)
896 struct amixer
*amixer
;
901 atc_pcm_release_resources(atc
, apcm
);
903 /* Configure SPDIFOO and PLL to passthrough mode;
904 * determine pll_rate. */
905 err
= spdif_passthru_playback_setup(atc
, apcm
);
909 /* Get needed resources. */
910 err
= spdif_passthru_playback_get_resources(atc
, apcm
);
914 /* Connect resources */
916 for (i
= 0; i
< apcm
->n_amixer
; i
++) {
917 amixer
= apcm
->amixers
[i
];
918 amixer
->ops
->setup(amixer
, &src
->rsc
, INIT_VOL
, NULL
);
919 src
= src
->ops
->next_interleave(src
);
923 /* Connect to SPDIFOO */
924 mutex_lock(&atc
->atc_mutex
);
925 dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
926 amixer
= apcm
->amixers
[0];
927 dao
->ops
->set_left_input(dao
, &amixer
->rsc
);
928 amixer
= apcm
->amixers
[1];
929 dao
->ops
->set_right_input(dao
, &amixer
->rsc
);
930 mutex_unlock(&atc
->atc_mutex
);
932 ct_timer_prepare(apcm
->timer
);
937 static int atc_select_line_in(struct ct_atc
*atc
)
939 struct hw
*hw
= atc
->hw
;
940 struct ct_mixer
*mixer
= atc
->mixer
;
943 if (hw
->is_adc_source_selected(hw
, ADC_LINEIN
))
946 mixer
->set_input_left(mixer
, MIX_MIC_IN
, NULL
);
947 mixer
->set_input_right(mixer
, MIX_MIC_IN
, NULL
);
949 hw
->select_adc_source(hw
, ADC_LINEIN
);
952 mixer
->set_input_left(mixer
, MIX_LINE_IN
, &src
->rsc
);
954 mixer
->set_input_right(mixer
, MIX_LINE_IN
, &src
->rsc
);
959 static int atc_select_mic_in(struct ct_atc
*atc
)
961 struct hw
*hw
= atc
->hw
;
962 struct ct_mixer
*mixer
= atc
->mixer
;
965 if (hw
->is_adc_source_selected(hw
, ADC_MICIN
))
968 mixer
->set_input_left(mixer
, MIX_LINE_IN
, NULL
);
969 mixer
->set_input_right(mixer
, MIX_LINE_IN
, NULL
);
971 hw
->select_adc_source(hw
, ADC_MICIN
);
974 mixer
->set_input_left(mixer
, MIX_MIC_IN
, &src
->rsc
);
976 mixer
->set_input_right(mixer
, MIX_MIC_IN
, &src
->rsc
);
981 static struct capabilities
atc_capabilities(struct ct_atc
*atc
)
983 struct hw
*hw
= atc
->hw
;
985 return hw
->capabilities(hw
);
988 static int atc_output_switch_get(struct ct_atc
*atc
)
990 struct hw
*hw
= atc
->hw
;
992 return hw
->output_switch_get(hw
);
995 static int atc_output_switch_put(struct ct_atc
*atc
, int position
)
997 struct hw
*hw
= atc
->hw
;
999 return hw
->output_switch_put(hw
, position
);
1002 static int atc_mic_source_switch_get(struct ct_atc
*atc
)
1004 struct hw
*hw
= atc
->hw
;
1006 return hw
->mic_source_switch_get(hw
);
1009 static int atc_mic_source_switch_put(struct ct_atc
*atc
, int position
)
1011 struct hw
*hw
= atc
->hw
;
1013 return hw
->mic_source_switch_put(hw
, position
);
1016 static int atc_select_digit_io(struct ct_atc
*atc
)
1018 struct hw
*hw
= atc
->hw
;
1020 if (hw
->is_adc_source_selected(hw
, ADC_NONE
))
1023 hw
->select_adc_source(hw
, ADC_NONE
);
1028 static int atc_daio_unmute(struct ct_atc
*atc
, unsigned char state
, int type
)
1030 struct daio_mgr
*daio_mgr
= atc
->rsc_mgrs
[DAIO
];
1033 daio_mgr
->daio_enable(daio_mgr
, atc
->daios
[type
]);
1035 daio_mgr
->daio_disable(daio_mgr
, atc
->daios
[type
]);
1037 daio_mgr
->commit_write(daio_mgr
);
1043 atc_dao_get_status(struct ct_atc
*atc
, unsigned int *status
, int type
)
1045 struct dao
*dao
= container_of(atc
->daios
[type
], struct dao
, daio
);
1046 return dao
->ops
->get_spos(dao
, status
);
1050 atc_dao_set_status(struct ct_atc
*atc
, unsigned int status
, int type
)
1052 struct dao
*dao
= container_of(atc
->daios
[type
], struct dao
, daio
);
1054 dao
->ops
->set_spos(dao
, status
);
1055 dao
->ops
->commit_write(dao
);
1059 static int atc_line_front_unmute(struct ct_atc
*atc
, unsigned char state
)
1061 return atc_daio_unmute(atc
, state
, LINEO1
);
1064 static int atc_line_surround_unmute(struct ct_atc
*atc
, unsigned char state
)
1066 return atc_daio_unmute(atc
, state
, LINEO2
);
1069 static int atc_line_clfe_unmute(struct ct_atc
*atc
, unsigned char state
)
1071 return atc_daio_unmute(atc
, state
, LINEO3
);
1074 static int atc_line_rear_unmute(struct ct_atc
*atc
, unsigned char state
)
1076 return atc_daio_unmute(atc
, state
, LINEO4
);
1079 static int atc_line_in_unmute(struct ct_atc
*atc
, unsigned char state
)
1081 return atc_daio_unmute(atc
, state
, LINEIM
);
1084 static int atc_mic_unmute(struct ct_atc
*atc
, unsigned char state
)
1086 return atc_daio_unmute(atc
, state
, MIC
);
1089 static int atc_spdif_out_unmute(struct ct_atc
*atc
, unsigned char state
)
1091 return atc_daio_unmute(atc
, state
, SPDIFOO
);
1094 static int atc_spdif_in_unmute(struct ct_atc
*atc
, unsigned char state
)
1096 return atc_daio_unmute(atc
, state
, SPDIFIO
);
1099 static int atc_spdif_out_get_status(struct ct_atc
*atc
, unsigned int *status
)
1101 return atc_dao_get_status(atc
, status
, SPDIFOO
);
1104 static int atc_spdif_out_set_status(struct ct_atc
*atc
, unsigned int status
)
1106 return atc_dao_set_status(atc
, status
, SPDIFOO
);
1109 static int atc_spdif_out_passthru(struct ct_atc
*atc
, unsigned char state
)
1111 struct dao_desc da_dsc
= {0};
1114 struct ct_mixer
*mixer
= atc
->mixer
;
1115 struct rsc
*rscs
[2] = {NULL
};
1116 unsigned int spos
= 0;
1118 mutex_lock(&atc
->atc_mutex
);
1119 dao
= container_of(atc
->daios
[SPDIFOO
], struct dao
, daio
);
1120 da_dsc
.msr
= state
? 1 : atc
->msr
;
1121 da_dsc
.passthru
= state
? 1 : 0;
1122 err
= dao
->ops
->reinit(dao
, &da_dsc
);
1124 spos
= IEC958_DEFAULT_CON
;
1126 mixer
->get_output_ports(mixer
, MIX_SPDIF_OUT
,
1127 &rscs
[0], &rscs
[1]);
1128 dao
->ops
->set_left_input(dao
, rscs
[0]);
1129 dao
->ops
->set_right_input(dao
, rscs
[1]);
1130 /* Restore PLL to atc->rsr if needed. */
1131 if (atc
->pll_rate
!= atc
->rsr
)
1132 err
= atc_pll_init(atc
, atc
->rsr
);
1134 dao
->ops
->set_spos(dao
, spos
);
1135 dao
->ops
->commit_write(dao
);
1136 mutex_unlock(&atc
->atc_mutex
);
1141 static int atc_release_resources(struct ct_atc
*atc
)
1144 struct daio_mgr
*daio_mgr
= NULL
;
1145 struct dao
*dao
= NULL
;
1146 struct daio
*daio
= NULL
;
1147 struct sum_mgr
*sum_mgr
= NULL
;
1148 struct src_mgr
*src_mgr
= NULL
;
1149 struct srcimp_mgr
*srcimp_mgr
= NULL
;
1150 struct srcimp
*srcimp
= NULL
;
1151 struct ct_mixer
*mixer
= NULL
;
1153 /* disconnect internal mixer objects */
1156 mixer
->set_input_left(mixer
, MIX_LINE_IN
, NULL
);
1157 mixer
->set_input_right(mixer
, MIX_LINE_IN
, NULL
);
1158 mixer
->set_input_left(mixer
, MIX_MIC_IN
, NULL
);
1159 mixer
->set_input_right(mixer
, MIX_MIC_IN
, NULL
);
1160 mixer
->set_input_left(mixer
, MIX_SPDIF_IN
, NULL
);
1161 mixer
->set_input_right(mixer
, MIX_SPDIF_IN
, NULL
);
1165 daio_mgr
= (struct daio_mgr
*)atc
->rsc_mgrs
[DAIO
];
1166 for (i
= 0; i
< atc
->n_daio
; i
++) {
1167 daio
= atc
->daios
[i
];
1168 if (daio
->type
< LINEIM
) {
1169 dao
= container_of(daio
, struct dao
, daio
);
1170 dao
->ops
->clear_left_input(dao
);
1171 dao
->ops
->clear_right_input(dao
);
1173 daio_mgr
->put_daio(daio_mgr
, daio
);
1180 sum_mgr
= atc
->rsc_mgrs
[SUM
];
1181 for (i
= 0; i
< atc
->n_pcm
; i
++)
1182 sum_mgr
->put_sum(sum_mgr
, atc
->pcm
[i
]);
1189 src_mgr
= atc
->rsc_mgrs
[SRC
];
1190 for (i
= 0; i
< atc
->n_src
; i
++)
1191 src_mgr
->put_src(src_mgr
, atc
->srcs
[i
]);
1198 srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
1199 for (i
= 0; i
< atc
->n_srcimp
; i
++) {
1200 srcimp
= atc
->srcimps
[i
];
1201 srcimp
->ops
->unmap(srcimp
);
1202 srcimp_mgr
->put_srcimp(srcimp_mgr
, atc
->srcimps
[i
]);
1204 kfree(atc
->srcimps
);
1205 atc
->srcimps
= NULL
;
1211 static int ct_atc_destroy(struct ct_atc
*atc
)
1219 ct_timer_free(atc
->timer
);
1223 atc_release_resources(atc
);
1225 /* Destroy internal mixer objects */
1227 ct_mixer_destroy(atc
->mixer
);
1229 for (i
= 0; i
< NUM_RSCTYP
; i
++) {
1230 if (rsc_mgr_funcs
[i
].destroy
&& atc
->rsc_mgrs
[i
])
1231 rsc_mgr_funcs
[i
].destroy(atc
->rsc_mgrs
[i
]);
1236 destroy_hw_obj(atc
->hw
);
1238 /* Destroy device virtual memory manager object */
1240 ct_vm_destroy(atc
->vm
);
1249 static int atc_dev_free(struct snd_device
*dev
)
1251 struct ct_atc
*atc
= dev
->device_data
;
1252 return ct_atc_destroy(atc
);
1255 static int atc_identify_card(struct ct_atc
*atc
, unsigned int ssid
)
1257 const struct snd_pci_quirk
*p
;
1258 const struct snd_pci_quirk
*list
;
1259 u16 vendor_id
, device_id
;
1261 switch (atc
->chip_type
) {
1263 atc
->chip_name
= "20K1";
1264 list
= subsys_20k1_list
;
1267 atc
->chip_name
= "20K2";
1268 list
= subsys_20k2_list
;
1274 vendor_id
= ssid
>> 16;
1275 device_id
= ssid
& 0xffff;
1277 vendor_id
= atc
->pci
->subsystem_vendor
;
1278 device_id
= atc
->pci
->subsystem_device
;
1280 p
= snd_pci_quirk_lookup_id(vendor_id
, device_id
, list
);
1283 dev_err(atc
->card
->dev
,
1284 "Device %04x:%04x is on the denylist\n",
1285 vendor_id
, device_id
);
1288 atc
->model
= p
->value
;
1290 if (atc
->chip_type
== ATC20K1
)
1291 atc
->model
= CT20K1_UNKNOWN
;
1293 atc
->model
= CT20K2_UNKNOWN
;
1295 atc
->model_name
= ct_subsys_name
[atc
->model
];
1296 dev_info(atc
->card
->dev
, "chip %s model %s (%04x:%04x) is found\n",
1297 atc
->chip_name
, atc
->model_name
,
1298 vendor_id
, device_id
);
1302 int ct_atc_create_alsa_devs(struct ct_atc
*atc
)
1307 alsa_dev_funcs
[MIXER
].public_name
= atc
->chip_name
;
1309 for (i
= 0; i
< NUM_CTALSADEVS
; i
++) {
1310 if (!alsa_dev_funcs
[i
].create
)
1313 err
= alsa_dev_funcs
[i
].create(atc
, i
,
1314 alsa_dev_funcs
[i
].public_name
);
1316 dev_err(atc
->card
->dev
,
1317 "Creating alsa device %d failed!\n", i
);
1325 static int atc_create_hw_devs(struct ct_atc
*atc
)
1328 struct card_conf info
= {0};
1331 err
= create_hw_obj(atc
->pci
, atc
->chip_type
, atc
->model
, &hw
);
1333 dev_err(atc
->card
->dev
, "Failed to create hw obj!!!\n");
1336 hw
->card
= atc
->card
;
1339 /* Initialize card hardware. */
1340 info
.rsr
= atc
->rsr
;
1341 info
.msr
= atc
->msr
;
1342 info
.vm_pgt_phys
= atc_get_ptp_phys(atc
, 0);
1343 err
= hw
->card_init(hw
, &info
);
1347 for (i
= 0; i
< NUM_RSCTYP
; i
++) {
1348 if (!rsc_mgr_funcs
[i
].create
)
1351 err
= rsc_mgr_funcs
[i
].create(atc
->hw
, &atc
->rsc_mgrs
[i
]);
1353 dev_err(atc
->card
->dev
,
1354 "Failed to create rsc_mgr %d!!!\n", i
);
1362 static int atc_get_resources(struct ct_atc
*atc
)
1364 struct daio_desc da_desc
= {0};
1365 struct daio_mgr
*daio_mgr
;
1366 struct src_desc src_dsc
= {0};
1367 struct src_mgr
*src_mgr
;
1368 struct srcimp_desc srcimp_dsc
= {0};
1369 struct srcimp_mgr
*srcimp_mgr
;
1370 struct sum_desc sum_dsc
= {0};
1371 struct sum_mgr
*sum_mgr
;
1372 int err
, i
, num_srcs
, num_daios
;
1374 num_daios
= ((atc
->model
== CTSB1270
) ? 8 : 7);
1375 num_srcs
= ((atc
->model
== CTSB1270
) ? 6 : 4);
1377 atc
->daios
= kcalloc(num_daios
, sizeof(void *), GFP_KERNEL
);
1381 atc
->srcs
= kcalloc(num_srcs
, sizeof(void *), GFP_KERNEL
);
1385 atc
->srcimps
= kcalloc(num_srcs
, sizeof(void *), GFP_KERNEL
);
1389 atc
->pcm
= kcalloc(2 * 4, sizeof(void *), GFP_KERNEL
);
1393 daio_mgr
= (struct daio_mgr
*)atc
->rsc_mgrs
[DAIO
];
1394 da_desc
.msr
= atc
->msr
;
1395 for (i
= 0, atc
->n_daio
= 0; i
< num_daios
; i
++) {
1396 da_desc
.type
= (atc
->model
!= CTSB073X
) ? i
:
1397 ((i
== SPDIFIO
) ? SPDIFI1
: i
);
1398 err
= daio_mgr
->get_daio(daio_mgr
, &da_desc
,
1399 (struct daio
**)&atc
->daios
[i
]);
1401 dev_err(atc
->card
->dev
,
1402 "Failed to get DAIO resource %d!!!\n",
1409 src_mgr
= atc
->rsc_mgrs
[SRC
];
1411 src_dsc
.msr
= atc
->msr
;
1412 src_dsc
.mode
= ARCRW
;
1413 for (i
= 0, atc
->n_src
= 0; i
< num_srcs
; i
++) {
1414 err
= src_mgr
->get_src(src_mgr
, &src_dsc
,
1415 (struct src
**)&atc
->srcs
[i
]);
1422 srcimp_mgr
= atc
->rsc_mgrs
[SRCIMP
];
1424 for (i
= 0, atc
->n_srcimp
= 0; i
< num_srcs
; i
++) {
1425 err
= srcimp_mgr
->get_srcimp(srcimp_mgr
, &srcimp_dsc
,
1426 (struct srcimp
**)&atc
->srcimps
[i
]);
1433 sum_mgr
= atc
->rsc_mgrs
[SUM
];
1434 sum_dsc
.msr
= atc
->msr
;
1435 for (i
= 0, atc
->n_pcm
= 0; i
< (2*4); i
++) {
1436 err
= sum_mgr
->get_sum(sum_mgr
, &sum_dsc
,
1437 (struct sum
**)&atc
->pcm
[i
]);
1448 atc_connect_dai(struct src_mgr
*src_mgr
, struct dai
*dai
,
1449 struct src
**srcs
, struct srcimp
**srcimps
)
1451 struct rsc
*rscs
[2] = {NULL
};
1453 struct srcimp
*srcimp
;
1456 rscs
[0] = &dai
->daio
.rscl
;
1457 rscs
[1] = &dai
->daio
.rscr
;
1458 for (i
= 0; i
< 2; i
++) {
1460 srcimp
= srcimps
[i
];
1461 srcimp
->ops
->map(srcimp
, src
, rscs
[i
]);
1462 src_mgr
->src_disable(src_mgr
, src
);
1465 src_mgr
->commit_write(src_mgr
); /* Actually disable SRCs */
1468 src
->ops
->set_pm(src
, 1);
1469 for (i
= 0; i
< 2; i
++) {
1471 src
->ops
->set_state(src
, SRC_STATE_RUN
);
1472 src
->ops
->commit_write(src
);
1473 src_mgr
->src_enable_s(src_mgr
, src
);
1476 dai
->ops
->set_srt_srcl(dai
, &(srcs
[0]->rsc
));
1477 dai
->ops
->set_srt_srcr(dai
, &(srcs
[1]->rsc
));
1479 dai
->ops
->set_enb_src(dai
, 1);
1480 dai
->ops
->set_enb_srt(dai
, 1);
1481 dai
->ops
->commit_write(dai
);
1483 src_mgr
->commit_write(src_mgr
); /* Synchronously enable SRCs */
1486 static void atc_connect_resources(struct ct_atc
*atc
)
1492 struct ct_mixer
*mixer
;
1493 struct rsc
*rscs
[2] = {NULL
};
1498 for (i
= MIX_WAVE_FRONT
, j
= LINEO1
; i
<= MIX_SPDIF_OUT
; i
++, j
++) {
1499 mixer
->get_output_ports(mixer
, i
, &rscs
[0], &rscs
[1]);
1500 dao
= container_of(atc
->daios
[j
], struct dao
, daio
);
1501 dao
->ops
->set_left_input(dao
, rscs
[0]);
1502 dao
->ops
->set_right_input(dao
, rscs
[1]);
1505 dai
= container_of(atc
->daios
[LINEIM
], struct dai
, daio
);
1506 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1507 (struct src
**)&atc
->srcs
[2],
1508 (struct srcimp
**)&atc
->srcimps
[2]);
1510 mixer
->set_input_left(mixer
, MIX_LINE_IN
, &src
->rsc
);
1512 mixer
->set_input_right(mixer
, MIX_LINE_IN
, &src
->rsc
);
1514 if (atc
->model
== CTSB1270
) {
1515 /* Titanium HD has a dedicated ADC for the Mic. */
1516 dai
= container_of(atc
->daios
[MIC
], struct dai
, daio
);
1517 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1518 (struct src
**)&atc
->srcs
[4],
1519 (struct srcimp
**)&atc
->srcimps
[4]);
1521 mixer
->set_input_left(mixer
, MIX_MIC_IN
, &src
->rsc
);
1523 mixer
->set_input_right(mixer
, MIX_MIC_IN
, &src
->rsc
);
1526 dai
= container_of(atc
->daios
[SPDIFIO
], struct dai
, daio
);
1527 atc_connect_dai(atc
->rsc_mgrs
[SRC
], dai
,
1528 (struct src
**)&atc
->srcs
[0],
1529 (struct srcimp
**)&atc
->srcimps
[0]);
1532 mixer
->set_input_left(mixer
, MIX_SPDIF_IN
, &src
->rsc
);
1534 mixer
->set_input_right(mixer
, MIX_SPDIF_IN
, &src
->rsc
);
1536 for (i
= MIX_PCMI_FRONT
, j
= 0; i
<= MIX_PCMI_SURROUND
; i
++, j
+= 2) {
1538 mixer
->set_input_left(mixer
, i
, &sum
->rsc
);
1539 sum
= atc
->pcm
[j
+1];
1540 mixer
->set_input_right(mixer
, i
, &sum
->rsc
);
1544 #ifdef CONFIG_PM_SLEEP
1545 static int atc_suspend(struct ct_atc
*atc
)
1547 struct hw
*hw
= atc
->hw
;
1549 snd_power_change_state(atc
->card
, SNDRV_CTL_POWER_D3hot
);
1551 atc_release_resources(atc
);
1558 static int atc_hw_resume(struct ct_atc
*atc
)
1560 struct hw
*hw
= atc
->hw
;
1561 struct card_conf info
= {0};
1563 /* Re-initialize card hardware. */
1564 info
.rsr
= atc
->rsr
;
1565 info
.msr
= atc
->msr
;
1566 info
.vm_pgt_phys
= atc_get_ptp_phys(atc
, 0);
1567 return hw
->resume(hw
, &info
);
1570 static int atc_resources_resume(struct ct_atc
*atc
)
1572 struct ct_mixer
*mixer
;
1576 err
= atc_get_resources(atc
);
1578 atc_release_resources(atc
);
1582 /* Build topology */
1583 atc_connect_resources(atc
);
1586 mixer
->resume(mixer
);
1591 static int atc_resume(struct ct_atc
*atc
)
1595 /* Do hardware resume. */
1596 err
= atc_hw_resume(atc
);
1598 dev_err(atc
->card
->dev
,
1599 "pci_enable_device failed, disabling device\n");
1600 snd_card_disconnect(atc
->card
);
1604 err
= atc_resources_resume(atc
);
1608 snd_power_change_state(atc
->card
, SNDRV_CTL_POWER_D0
);
1614 static const struct ct_atc atc_preset
= {
1615 .map_audio_buffer
= ct_map_audio_buffer
,
1616 .unmap_audio_buffer
= ct_unmap_audio_buffer
,
1617 .pcm_playback_prepare
= atc_pcm_playback_prepare
,
1618 .pcm_release_resources
= atc_pcm_release_resources
,
1619 .pcm_playback_start
= atc_pcm_playback_start
,
1620 .pcm_playback_stop
= atc_pcm_stop
,
1621 .pcm_playback_position
= atc_pcm_playback_position
,
1622 .pcm_capture_prepare
= atc_pcm_capture_prepare
,
1623 .pcm_capture_start
= atc_pcm_capture_start
,
1624 .pcm_capture_stop
= atc_pcm_stop
,
1625 .pcm_capture_position
= atc_pcm_capture_position
,
1626 .spdif_passthru_playback_prepare
= spdif_passthru_playback_prepare
,
1627 .get_ptp_phys
= atc_get_ptp_phys
,
1628 .select_line_in
= atc_select_line_in
,
1629 .select_mic_in
= atc_select_mic_in
,
1630 .select_digit_io
= atc_select_digit_io
,
1631 .line_front_unmute
= atc_line_front_unmute
,
1632 .line_surround_unmute
= atc_line_surround_unmute
,
1633 .line_clfe_unmute
= atc_line_clfe_unmute
,
1634 .line_rear_unmute
= atc_line_rear_unmute
,
1635 .line_in_unmute
= atc_line_in_unmute
,
1636 .mic_unmute
= atc_mic_unmute
,
1637 .spdif_out_unmute
= atc_spdif_out_unmute
,
1638 .spdif_in_unmute
= atc_spdif_in_unmute
,
1639 .spdif_out_get_status
= atc_spdif_out_get_status
,
1640 .spdif_out_set_status
= atc_spdif_out_set_status
,
1641 .spdif_out_passthru
= atc_spdif_out_passthru
,
1642 .capabilities
= atc_capabilities
,
1643 .output_switch_get
= atc_output_switch_get
,
1644 .output_switch_put
= atc_output_switch_put
,
1645 .mic_source_switch_get
= atc_mic_source_switch_get
,
1646 .mic_source_switch_put
= atc_mic_source_switch_put
,
1647 #ifdef CONFIG_PM_SLEEP
1648 .suspend
= atc_suspend
,
1649 .resume
= atc_resume
,
1654 * ct_atc_create - create and initialize a hardware manager
1655 * @card: corresponding alsa card object
1656 * @pci: corresponding kernel pci device object
1657 * @rsr: reference sampling rate
1658 * @msr: master sampling rate
1659 * @chip_type: CHIPTYP enum values
1660 * @ssid: vendor ID (upper 16 bits) and device ID (lower 16 bits)
1661 * @ratc: return created object address in it
1663 * Creates and initializes a hardware manager.
1665 * Creates kmallocated ct_atc structure. Initializes hardware.
1666 * Returns 0 if succeeds, or negative error code if fails.
1669 int ct_atc_create(struct snd_card
*card
, struct pci_dev
*pci
,
1670 unsigned int rsr
, unsigned int msr
,
1671 int chip_type
, unsigned int ssid
,
1672 struct ct_atc
**ratc
)
1675 static const struct snd_device_ops ops
= {
1676 .dev_free
= atc_dev_free
,
1682 atc
= kzalloc(sizeof(*atc
), GFP_KERNEL
);
1686 /* Set operations */
1693 atc
->chip_type
= chip_type
;
1695 mutex_init(&atc
->atc_mutex
);
1697 /* Find card model */
1698 err
= atc_identify_card(atc
, ssid
);
1700 dev_err(card
->dev
, "ctatc: Card not recognised\n");
1704 /* Set up device virtual memory management object */
1705 err
= ct_vm_create(&atc
->vm
, pci
);
1709 /* Create all atc hw devices */
1710 err
= atc_create_hw_devs(atc
);
1714 err
= ct_mixer_create(atc
, (struct ct_mixer
**)&atc
->mixer
);
1716 dev_err(card
->dev
, "Failed to create mixer obj!!!\n");
1721 err
= atc_get_resources(atc
);
1725 /* Build topology */
1726 atc_connect_resources(atc
);
1728 atc
->timer
= ct_timer_new(atc
);
1734 err
= snd_device_new(card
, SNDRV_DEV_LOWLEVEL
, atc
, &ops
);
1742 ct_atc_destroy(atc
);
1743 dev_err(card
->dev
, "Something wrong!!!\n");