static int rsnd_dvc_pcm_new(struct rsnd_mod *mod, struct rsnd_dai_stream *io, struct snd_soc_pcm_runtime *rtd) { struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); int is_play = rsnd_io_is_play(io); int slots = rsnd_get_slot(io); int ret; /* Volume */ ret = rsnd_kctrl_new_m(mod, io, rtd, is_play ? "DVC Out Playback Volume" : "DVC In Capture Volume", rsnd_dvc_volume_update, &dvc->volume, slots, 0x00800000 - 1); if (ret < 0) return ret; /* Mute */ ret = rsnd_kctrl_new_m(mod, io, rtd, is_play ? "DVC Out Mute Switch" : "DVC In Mute Switch", rsnd_dvc_volume_update, &dvc->mute, slots, 1); if (ret < 0) return ret; /* Ramp */ ret = rsnd_kctrl_new_s(mod, io, rtd, is_play ? "DVC Out Ramp Switch" : "DVC In Ramp Switch", rsnd_dvc_volume_update, &dvc->ren, 1); if (ret < 0) return ret; ret = rsnd_kctrl_new_e(mod, io, rtd, is_play ? "DVC Out Ramp Up Rate" : "DVC In Ramp Up Rate", &dvc->rup, rsnd_dvc_volume_update, dvc_ramp_rate, ARRAY_SIZE(dvc_ramp_rate)); if (ret < 0) return ret; ret = rsnd_kctrl_new_e(mod, io, rtd, is_play ? "DVC Out Ramp Down Rate" : "DVC In Ramp Down Rate", &dvc->rdown, rsnd_dvc_volume_update, dvc_ramp_rate, ARRAY_SIZE(dvc_ramp_rate)); if (ret < 0) return ret; return 0; }
static int rsnd_mix_pcm_new(struct rsnd_mod *mod, struct rsnd_dai_stream *io, struct snd_soc_pcm_runtime *rtd) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct device *dev = rsnd_priv_to_dev(priv); struct rsnd_mix *mix = rsnd_mod_to_mix(mod); struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io); struct rsnd_kctrl_cfg_s *volume; int ret; switch (rsnd_mod_id(src_mod)) { case 3: case 6: /* MDBAR */ volume = &mix->volumeA; rsnd_flags_set(mix, HAS_VOLA); break; case 4: case 9: /* MDBBR */ volume = &mix->volumeB; rsnd_flags_set(mix, HAS_VOLB); break; case 0: case 1: /* MDBCR */ volume = &mix->volumeC; rsnd_flags_set(mix, HAS_VOLC); break; case 2: case 5: /* MDBDR */ volume = &mix->volumeD; rsnd_flags_set(mix, HAS_VOLD); break; default: dev_err(dev, "unknown SRC is connected\n"); return -EINVAL; } /* Volume */ ret = rsnd_kctrl_new_s(mod, io, rtd, "MIX Playback Volume", rsnd_kctrl_accept_anytime, rsnd_mix_volume_update, volume, VOL_MAX); if (ret < 0) return ret; rsnd_kctrl_vals(*volume) = VOL_MAX; if (rsnd_flags_has(mix, ONCE_KCTRL_INITIALIZED)) return ret; /* Ramp */ ret = rsnd_kctrl_new_s(mod, io, rtd, "MIX Ramp Switch", rsnd_kctrl_accept_anytime, rsnd_mix_volume_update, &mix->ren, 1); if (ret < 0) return ret; ret = rsnd_kctrl_new_e(mod, io, rtd, "MIX Ramp Up Rate", rsnd_kctrl_accept_anytime, rsnd_mix_volume_update, &mix->rup, volume_ramp_rate, VOLUME_RAMP_MAX_MIX); if (ret < 0) return ret; ret = rsnd_kctrl_new_e(mod, io, rtd, "MIX Ramp Down Rate", rsnd_kctrl_accept_anytime, rsnd_mix_volume_update, &mix->rdw, volume_ramp_rate, VOLUME_RAMP_MAX_MIX); rsnd_flags_set(mix, ONCE_KCTRL_INITIALIZED); return ret; }