mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
ALSA: ctxfi: Refactor resource alloc for sparse mappings
Refactor atc_get_resources(), atc_connect_resources(), and atc_release_resources() to allocate resources based on maximum type definitions. This allows specific resources to be conditionally skipped based on capabilities. This is necessary for hardware variants where resource allocations do not follow a sequential order. Signed-off-by: Harin Lee <me@harin.net> Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/20251124180501.2760421-5-me@harin.net
This commit is contained in:
parent
9bb003a1f9
commit
a2dbaeb5c6
|
|
@ -25,6 +25,9 @@
|
||||||
#include <sound/control.h>
|
#include <sound/control.h>
|
||||||
#include <sound/asoundef.h>
|
#include <sound/asoundef.h>
|
||||||
|
|
||||||
|
#define NUM_ATC_SRCS 6
|
||||||
|
#define NUM_ATC_PCM (2 * 4)
|
||||||
|
|
||||||
#define MONO_SUM_SCALE 0x19a8 /* 2^(-0.5) in 14-bit floating format */
|
#define MONO_SUM_SCALE 0x19a8 /* 2^(-0.5) in 14-bit floating format */
|
||||||
#define MAX_MULTI_CHN 8
|
#define MAX_MULTI_CHN 8
|
||||||
|
|
||||||
|
|
@ -1161,8 +1164,10 @@ static int atc_release_resources(struct ct_atc *atc)
|
||||||
|
|
||||||
if (atc->daios) {
|
if (atc->daios) {
|
||||||
daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
|
daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
|
||||||
for (i = 0; i < atc->n_daio; i++) {
|
for (i = 0; i < NUM_DAIOTYP; i++) {
|
||||||
daio = atc->daios[i];
|
daio = atc->daios[i];
|
||||||
|
if (!daio)
|
||||||
|
continue;
|
||||||
if (daio->output) {
|
if (daio->output) {
|
||||||
dao = container_of(daio, struct dao, daio);
|
dao = container_of(daio, struct dao, daio);
|
||||||
dao->ops->clear_left_input(dao);
|
dao->ops->clear_left_input(dao);
|
||||||
|
|
@ -1176,7 +1181,8 @@ static int atc_release_resources(struct ct_atc *atc)
|
||||||
|
|
||||||
if (atc->pcm) {
|
if (atc->pcm) {
|
||||||
sum_mgr = atc->rsc_mgrs[SUM];
|
sum_mgr = atc->rsc_mgrs[SUM];
|
||||||
for (i = 0; i < atc->n_pcm; i++)
|
for (i = 0; i < NUM_ATC_PCM; i++)
|
||||||
|
if (atc->pcm[i])
|
||||||
sum_mgr->put_sum(sum_mgr, atc->pcm[i]);
|
sum_mgr->put_sum(sum_mgr, atc->pcm[i]);
|
||||||
|
|
||||||
kfree(atc->pcm);
|
kfree(atc->pcm);
|
||||||
|
|
@ -1185,7 +1191,8 @@ static int atc_release_resources(struct ct_atc *atc)
|
||||||
|
|
||||||
if (atc->srcs) {
|
if (atc->srcs) {
|
||||||
src_mgr = atc->rsc_mgrs[SRC];
|
src_mgr = atc->rsc_mgrs[SRC];
|
||||||
for (i = 0; i < atc->n_src; i++)
|
for (i = 0; i < NUM_ATC_SRCS; i++)
|
||||||
|
if (atc->srcs[i])
|
||||||
src_mgr->put_src(src_mgr, atc->srcs[i]);
|
src_mgr->put_src(src_mgr, atc->srcs[i]);
|
||||||
|
|
||||||
kfree(atc->srcs);
|
kfree(atc->srcs);
|
||||||
|
|
@ -1194,7 +1201,9 @@ static int atc_release_resources(struct ct_atc *atc)
|
||||||
|
|
||||||
if (atc->srcimps) {
|
if (atc->srcimps) {
|
||||||
srcimp_mgr = atc->rsc_mgrs[SRCIMP];
|
srcimp_mgr = atc->rsc_mgrs[SRCIMP];
|
||||||
for (i = 0; i < atc->n_srcimp; i++) {
|
for (i = 0; i < NUM_ATC_SRCS; i++) {
|
||||||
|
if (!atc->srcimps[i])
|
||||||
|
continue;
|
||||||
srcimp = atc->srcimps[i];
|
srcimp = atc->srcimps[i];
|
||||||
srcimp->ops->unmap(srcimp);
|
srcimp->ops->unmap(srcimp);
|
||||||
srcimp_mgr->put_srcimp(srcimp_mgr, atc->srcimps[i]);
|
srcimp_mgr->put_srcimp(srcimp_mgr, atc->srcimps[i]);
|
||||||
|
|
@ -1367,30 +1376,32 @@ static int atc_get_resources(struct ct_atc *atc)
|
||||||
struct srcimp_mgr *srcimp_mgr;
|
struct srcimp_mgr *srcimp_mgr;
|
||||||
struct sum_desc sum_dsc = {0};
|
struct sum_desc sum_dsc = {0};
|
||||||
struct sum_mgr *sum_mgr;
|
struct sum_mgr *sum_mgr;
|
||||||
int err, i, num_srcs, num_daios;
|
struct capabilities cap;
|
||||||
|
int err, i;
|
||||||
|
|
||||||
num_daios = ((atc->model == CTSB1270) ? 8 : 7);
|
cap = atc->capabilities(atc);
|
||||||
num_srcs = ((atc->model == CTSB1270) ? 6 : 4);
|
|
||||||
|
|
||||||
atc->daios = kcalloc(num_daios, sizeof(void *), GFP_KERNEL);
|
atc->daios = kcalloc(NUM_DAIOTYP, sizeof(void *), GFP_KERNEL);
|
||||||
if (!atc->daios)
|
if (!atc->daios)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
atc->srcs = kcalloc(num_srcs, sizeof(void *), GFP_KERNEL);
|
atc->srcs = kcalloc(NUM_ATC_SRCS, sizeof(void *), GFP_KERNEL);
|
||||||
if (!atc->srcs)
|
if (!atc->srcs)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
atc->srcimps = kcalloc(num_srcs, sizeof(void *), GFP_KERNEL);
|
atc->srcimps = kcalloc(NUM_ATC_SRCS, sizeof(void *), GFP_KERNEL);
|
||||||
if (!atc->srcimps)
|
if (!atc->srcimps)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
atc->pcm = kcalloc(2 * 4, sizeof(void *), GFP_KERNEL);
|
atc->pcm = kcalloc(NUM_ATC_PCM, sizeof(void *), GFP_KERNEL);
|
||||||
if (!atc->pcm)
|
if (!atc->pcm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
|
daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
|
||||||
da_desc.msr = atc->msr;
|
da_desc.msr = atc->msr;
|
||||||
for (i = 0, atc->n_daio = 0; i < num_daios; i++) {
|
for (i = 0; i < NUM_DAIOTYP; i++) {
|
||||||
|
if ((i == MIC) && !cap.dedicated_mic)
|
||||||
|
continue;
|
||||||
da_desc.type = (atc->model != CTSB073X) ? i :
|
da_desc.type = (atc->model != CTSB073X) ? i :
|
||||||
((i == SPDIFIO) ? SPDIFI1 : i);
|
((i == SPDIFIO) ? SPDIFI1 : i);
|
||||||
da_desc.output = i < LINEIM;
|
da_desc.output = i < LINEIM;
|
||||||
|
|
@ -1402,42 +1413,39 @@ static int atc_get_resources(struct ct_atc *atc)
|
||||||
i);
|
i);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
atc->n_daio++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src_mgr = atc->rsc_mgrs[SRC];
|
src_mgr = atc->rsc_mgrs[SRC];
|
||||||
src_dsc.multi = 1;
|
src_dsc.multi = 1;
|
||||||
src_dsc.msr = atc->msr;
|
src_dsc.msr = atc->msr;
|
||||||
src_dsc.mode = ARCRW;
|
src_dsc.mode = ARCRW;
|
||||||
for (i = 0, atc->n_src = 0; i < num_srcs; i++) {
|
for (i = 0; i < NUM_ATC_SRCS; i++) {
|
||||||
|
if (((i > 3) && !cap.dedicated_mic))
|
||||||
|
continue;
|
||||||
err = src_mgr->get_src(src_mgr, &src_dsc,
|
err = src_mgr->get_src(src_mgr, &src_dsc,
|
||||||
(struct src **)&atc->srcs[i]);
|
(struct src **)&atc->srcs[i]);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
atc->n_src++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
srcimp_mgr = atc->rsc_mgrs[SRCIMP];
|
srcimp_mgr = atc->rsc_mgrs[SRCIMP];
|
||||||
srcimp_dsc.msr = 8;
|
srcimp_dsc.msr = 8;
|
||||||
for (i = 0, atc->n_srcimp = 0; i < num_srcs; i++) {
|
for (i = 0; i < NUM_ATC_SRCS; i++) {
|
||||||
|
if (((i > 3) && !cap.dedicated_mic))
|
||||||
|
continue;
|
||||||
err = srcimp_mgr->get_srcimp(srcimp_mgr, &srcimp_dsc,
|
err = srcimp_mgr->get_srcimp(srcimp_mgr, &srcimp_dsc,
|
||||||
(struct srcimp **)&atc->srcimps[i]);
|
(struct srcimp **)&atc->srcimps[i]);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
atc->n_srcimp++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sum_mgr = atc->rsc_mgrs[SUM];
|
sum_mgr = atc->rsc_mgrs[SUM];
|
||||||
sum_dsc.msr = atc->msr;
|
sum_dsc.msr = atc->msr;
|
||||||
for (i = 0, atc->n_pcm = 0; i < (2*4); i++) {
|
for (i = 0; i < NUM_ATC_PCM; i++) {
|
||||||
err = sum_mgr->get_sum(sum_mgr, &sum_dsc,
|
err = sum_mgr->get_sum(sum_mgr, &sum_dsc,
|
||||||
(struct sum **)&atc->pcm[i]);
|
(struct sum **)&atc->pcm[i]);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
atc->n_pcm++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1490,9 +1498,11 @@ static void atc_connect_resources(struct ct_atc *atc)
|
||||||
struct sum *sum;
|
struct sum *sum;
|
||||||
struct ct_mixer *mixer;
|
struct ct_mixer *mixer;
|
||||||
struct rsc *rscs[2] = {NULL};
|
struct rsc *rscs[2] = {NULL};
|
||||||
|
struct capabilities cap;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
mixer = atc->mixer;
|
mixer = atc->mixer;
|
||||||
|
cap = atc->capabilities(atc);
|
||||||
|
|
||||||
for (i = MIX_WAVE_FRONT, j = LINEO1; i <= MIX_SPDIF_OUT; i++, j++) {
|
for (i = MIX_WAVE_FRONT, j = LINEO1; i <= MIX_SPDIF_OUT; i++, j++) {
|
||||||
mixer->get_output_ports(mixer, i, &rscs[0], &rscs[1]);
|
mixer->get_output_ports(mixer, i, &rscs[0], &rscs[1]);
|
||||||
|
|
@ -1510,7 +1520,7 @@ static void atc_connect_resources(struct ct_atc *atc)
|
||||||
src = atc->srcs[3];
|
src = atc->srcs[3];
|
||||||
mixer->set_input_right(mixer, MIX_LINE_IN, &src->rsc);
|
mixer->set_input_right(mixer, MIX_LINE_IN, &src->rsc);
|
||||||
|
|
||||||
if (atc->model == CTSB1270) {
|
if (cap.dedicated_mic) {
|
||||||
/* Titanium HD has a dedicated ADC for the Mic. */
|
/* Titanium HD has a dedicated ADC for the Mic. */
|
||||||
dai = container_of(atc->daios[MIC], struct dai, daio);
|
dai = container_of(atc->daios[MIC], struct dai, daio);
|
||||||
atc_connect_dai(atc->rsc_mgrs[SRC], dai,
|
atc_connect_dai(atc->rsc_mgrs[SRC], dai,
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,6 @@ struct ct_atc {
|
||||||
void **pcm; /* SUMs for collecting all pcm stream */
|
void **pcm; /* SUMs for collecting all pcm stream */
|
||||||
void **srcs; /* Sample Rate Converters for input signal */
|
void **srcs; /* Sample Rate Converters for input signal */
|
||||||
void **srcimps; /* input mappers for SRCs */
|
void **srcimps; /* input mappers for SRCs */
|
||||||
unsigned char n_daio;
|
|
||||||
unsigned char n_src;
|
|
||||||
unsigned char n_srcimp;
|
|
||||||
unsigned char n_pcm;
|
|
||||||
|
|
||||||
struct ct_timer *timer;
|
struct ct_timer *timer;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user