|
@@ -81,8 +81,11 @@ struct rsnd_ctu {
|
|
|
struct rsnd_kctrl_cfg_m sv3;
|
|
|
struct rsnd_kctrl_cfg_s reset;
|
|
|
int channels;
|
|
|
+ u32 flags;
|
|
|
};
|
|
|
|
|
|
+#define KCTRL_INITIALIZED (1 << 0)
|
|
|
+
|
|
|
#define rsnd_ctu_nr(priv) ((priv)->ctu_nr)
|
|
|
#define for_each_rsnd_ctu(pos, priv, i) \
|
|
|
for ((i) = 0; \
|
|
@@ -130,7 +133,7 @@ static void rsnd_ctu_value_init(struct rsnd_dai_stream *io,
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < RSND_MAX_CHANNELS; i++) {
|
|
|
- u32 val = ctu->pass.val[i];
|
|
|
+ u32 val = rsnd_kctrl_valm(ctu->pass, i);
|
|
|
|
|
|
cpmdr |= val << (28 - (i * 4));
|
|
|
|
|
@@ -147,44 +150,44 @@ static void rsnd_ctu_value_init(struct rsnd_dai_stream *io,
|
|
|
rsnd_mod_write(mod, CTU_SCMDR, scmdr);
|
|
|
|
|
|
if (scmdr > 0) {
|
|
|
- rsnd_mod_write(mod, CTU_SV00R, ctu->sv0.val[0]);
|
|
|
- rsnd_mod_write(mod, CTU_SV01R, ctu->sv0.val[1]);
|
|
|
- rsnd_mod_write(mod, CTU_SV02R, ctu->sv0.val[2]);
|
|
|
- rsnd_mod_write(mod, CTU_SV03R, ctu->sv0.val[3]);
|
|
|
- rsnd_mod_write(mod, CTU_SV04R, ctu->sv0.val[4]);
|
|
|
- rsnd_mod_write(mod, CTU_SV05R, ctu->sv0.val[5]);
|
|
|
- rsnd_mod_write(mod, CTU_SV06R, ctu->sv0.val[6]);
|
|
|
- rsnd_mod_write(mod, CTU_SV07R, ctu->sv0.val[7]);
|
|
|
+ rsnd_mod_write(mod, CTU_SV00R, rsnd_kctrl_valm(ctu->sv0, 0));
|
|
|
+ rsnd_mod_write(mod, CTU_SV01R, rsnd_kctrl_valm(ctu->sv0, 1));
|
|
|
+ rsnd_mod_write(mod, CTU_SV02R, rsnd_kctrl_valm(ctu->sv0, 2));
|
|
|
+ rsnd_mod_write(mod, CTU_SV03R, rsnd_kctrl_valm(ctu->sv0, 3));
|
|
|
+ rsnd_mod_write(mod, CTU_SV04R, rsnd_kctrl_valm(ctu->sv0, 4));
|
|
|
+ rsnd_mod_write(mod, CTU_SV05R, rsnd_kctrl_valm(ctu->sv0, 5));
|
|
|
+ rsnd_mod_write(mod, CTU_SV06R, rsnd_kctrl_valm(ctu->sv0, 6));
|
|
|
+ rsnd_mod_write(mod, CTU_SV07R, rsnd_kctrl_valm(ctu->sv0, 7));
|
|
|
}
|
|
|
if (scmdr > 1) {
|
|
|
- rsnd_mod_write(mod, CTU_SV10R, ctu->sv1.val[0]);
|
|
|
- rsnd_mod_write(mod, CTU_SV11R, ctu->sv1.val[1]);
|
|
|
- rsnd_mod_write(mod, CTU_SV12R, ctu->sv1.val[2]);
|
|
|
- rsnd_mod_write(mod, CTU_SV13R, ctu->sv1.val[3]);
|
|
|
- rsnd_mod_write(mod, CTU_SV14R, ctu->sv1.val[4]);
|
|
|
- rsnd_mod_write(mod, CTU_SV15R, ctu->sv1.val[5]);
|
|
|
- rsnd_mod_write(mod, CTU_SV16R, ctu->sv1.val[6]);
|
|
|
- rsnd_mod_write(mod, CTU_SV17R, ctu->sv1.val[7]);
|
|
|
+ rsnd_mod_write(mod, CTU_SV10R, rsnd_kctrl_valm(ctu->sv1, 0));
|
|
|
+ rsnd_mod_write(mod, CTU_SV11R, rsnd_kctrl_valm(ctu->sv1, 1));
|
|
|
+ rsnd_mod_write(mod, CTU_SV12R, rsnd_kctrl_valm(ctu->sv1, 2));
|
|
|
+ rsnd_mod_write(mod, CTU_SV13R, rsnd_kctrl_valm(ctu->sv1, 3));
|
|
|
+ rsnd_mod_write(mod, CTU_SV14R, rsnd_kctrl_valm(ctu->sv1, 4));
|
|
|
+ rsnd_mod_write(mod, CTU_SV15R, rsnd_kctrl_valm(ctu->sv1, 5));
|
|
|
+ rsnd_mod_write(mod, CTU_SV16R, rsnd_kctrl_valm(ctu->sv1, 6));
|
|
|
+ rsnd_mod_write(mod, CTU_SV17R, rsnd_kctrl_valm(ctu->sv1, 7));
|
|
|
}
|
|
|
if (scmdr > 2) {
|
|
|
- rsnd_mod_write(mod, CTU_SV20R, ctu->sv2.val[0]);
|
|
|
- rsnd_mod_write(mod, CTU_SV21R, ctu->sv2.val[1]);
|
|
|
- rsnd_mod_write(mod, CTU_SV22R, ctu->sv2.val[2]);
|
|
|
- rsnd_mod_write(mod, CTU_SV23R, ctu->sv2.val[3]);
|
|
|
- rsnd_mod_write(mod, CTU_SV24R, ctu->sv2.val[4]);
|
|
|
- rsnd_mod_write(mod, CTU_SV25R, ctu->sv2.val[5]);
|
|
|
- rsnd_mod_write(mod, CTU_SV26R, ctu->sv2.val[6]);
|
|
|
- rsnd_mod_write(mod, CTU_SV27R, ctu->sv2.val[7]);
|
|
|
+ rsnd_mod_write(mod, CTU_SV20R, rsnd_kctrl_valm(ctu->sv2, 0));
|
|
|
+ rsnd_mod_write(mod, CTU_SV21R, rsnd_kctrl_valm(ctu->sv2, 1));
|
|
|
+ rsnd_mod_write(mod, CTU_SV22R, rsnd_kctrl_valm(ctu->sv2, 2));
|
|
|
+ rsnd_mod_write(mod, CTU_SV23R, rsnd_kctrl_valm(ctu->sv2, 3));
|
|
|
+ rsnd_mod_write(mod, CTU_SV24R, rsnd_kctrl_valm(ctu->sv2, 4));
|
|
|
+ rsnd_mod_write(mod, CTU_SV25R, rsnd_kctrl_valm(ctu->sv2, 5));
|
|
|
+ rsnd_mod_write(mod, CTU_SV26R, rsnd_kctrl_valm(ctu->sv2, 6));
|
|
|
+ rsnd_mod_write(mod, CTU_SV27R, rsnd_kctrl_valm(ctu->sv2, 7));
|
|
|
}
|
|
|
if (scmdr > 3) {
|
|
|
- rsnd_mod_write(mod, CTU_SV30R, ctu->sv3.val[0]);
|
|
|
- rsnd_mod_write(mod, CTU_SV31R, ctu->sv3.val[1]);
|
|
|
- rsnd_mod_write(mod, CTU_SV32R, ctu->sv3.val[2]);
|
|
|
- rsnd_mod_write(mod, CTU_SV33R, ctu->sv3.val[3]);
|
|
|
- rsnd_mod_write(mod, CTU_SV34R, ctu->sv3.val[4]);
|
|
|
- rsnd_mod_write(mod, CTU_SV35R, ctu->sv3.val[5]);
|
|
|
- rsnd_mod_write(mod, CTU_SV36R, ctu->sv3.val[6]);
|
|
|
- rsnd_mod_write(mod, CTU_SV37R, ctu->sv3.val[7]);
|
|
|
+ rsnd_mod_write(mod, CTU_SV30R, rsnd_kctrl_valm(ctu->sv3, 0));
|
|
|
+ rsnd_mod_write(mod, CTU_SV31R, rsnd_kctrl_valm(ctu->sv3, 1));
|
|
|
+ rsnd_mod_write(mod, CTU_SV32R, rsnd_kctrl_valm(ctu->sv3, 2));
|
|
|
+ rsnd_mod_write(mod, CTU_SV33R, rsnd_kctrl_valm(ctu->sv3, 3));
|
|
|
+ rsnd_mod_write(mod, CTU_SV34R, rsnd_kctrl_valm(ctu->sv3, 4));
|
|
|
+ rsnd_mod_write(mod, CTU_SV35R, rsnd_kctrl_valm(ctu->sv3, 5));
|
|
|
+ rsnd_mod_write(mod, CTU_SV36R, rsnd_kctrl_valm(ctu->sv3, 6));
|
|
|
+ rsnd_mod_write(mod, CTU_SV37R, rsnd_kctrl_valm(ctu->sv3, 7));
|
|
|
}
|
|
|
|
|
|
rsnd_mod_write(mod, CTU_CTUIR, 0);
|
|
@@ -196,17 +199,17 @@ static void rsnd_ctu_value_reset(struct rsnd_dai_stream *io,
|
|
|
struct rsnd_ctu *ctu = rsnd_mod_to_ctu(mod);
|
|
|
int i;
|
|
|
|
|
|
- if (!ctu->reset.val)
|
|
|
+ if (!rsnd_kctrl_vals(ctu->reset))
|
|
|
return;
|
|
|
|
|
|
for (i = 0; i < RSND_MAX_CHANNELS; i++) {
|
|
|
- ctu->pass.val[i] = 0;
|
|
|
- ctu->sv0.val[i] = 0;
|
|
|
- ctu->sv1.val[i] = 0;
|
|
|
- ctu->sv2.val[i] = 0;
|
|
|
- ctu->sv3.val[i] = 0;
|
|
|
+ rsnd_kctrl_valm(ctu->pass, i) = 0;
|
|
|
+ rsnd_kctrl_valm(ctu->sv0, i) = 0;
|
|
|
+ rsnd_kctrl_valm(ctu->sv1, i) = 0;
|
|
|
+ rsnd_kctrl_valm(ctu->sv2, i) = 0;
|
|
|
+ rsnd_kctrl_valm(ctu->sv3, i) = 0;
|
|
|
}
|
|
|
- ctu->reset.val = 0;
|
|
|
+ rsnd_kctrl_vals(ctu->reset) = 0;
|
|
|
}
|
|
|
|
|
|
static int rsnd_ctu_init(struct rsnd_mod *mod,
|
|
@@ -277,6 +280,9 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
|
|
|
struct rsnd_ctu *ctu = rsnd_mod_to_ctu(mod);
|
|
|
int ret;
|
|
|
|
|
|
+ if (rsnd_flags_has(ctu, KCTRL_INITIALIZED))
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* CTU Pass */
|
|
|
ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU Pass",
|
|
|
rsnd_kctrl_accept_anytime,
|
|
@@ -326,6 +332,8 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
|
|
|
rsnd_ctu_value_reset,
|
|
|
&ctu->reset, 1);
|
|
|
|
|
|
+ rsnd_flags_set(ctu, KCTRL_INITIALIZED);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|