int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *src_mod, struct rsnd_dai_stream *io) { u32 val = rsnd_adg_ssi_ws_timing_gen2(io); rsnd_mod_confirm_src(src_mod); return rsnd_adg_set_src_timsel_gen2(src_mod, io, val); }
static int rsnd_adg_set_src_timsel_gen2(struct rsnd_mod *src_mod, struct rsnd_dai_stream *io, u32 timsel) { struct rsnd_priv *priv = rsnd_mod_to_priv(src_mod); struct rsnd_adg *adg = rsnd_priv_to_adg(priv); struct rsnd_mod *adg_mod = rsnd_mod_get(adg); int is_play = rsnd_io_is_play(io); int id = rsnd_mod_id(src_mod); int shift = (id % 2) ? 16 : 0; u32 mask, ws; u32 in, out; rsnd_mod_confirm_src(src_mod); ws = rsnd_adg_ssi_ws_timing_gen2(io); in = (is_play) ? timsel : ws; out = (is_play) ? ws : timsel; in = in << shift; out = out << shift; mask = 0xffff << shift; switch (id / 2) { case 0: rsnd_mod_bset(adg_mod, SRCIN_TIMSEL0, mask, in); rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL0, mask, out); break; case 1: rsnd_mod_bset(adg_mod, SRCIN_TIMSEL1, mask, in); rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL1, mask, out); break; case 2: rsnd_mod_bset(adg_mod, SRCIN_TIMSEL2, mask, in); rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL2, mask, out); break; case 3: rsnd_mod_bset(adg_mod, SRCIN_TIMSEL3, mask, in); rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL3, mask, out); break; case 4: rsnd_mod_bset(adg_mod, SRCIN_TIMSEL4, mask, in); rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL4, mask, out); break; } return 0; }
int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct rsnd_adg *adg = rsnd_priv_to_adg(priv); struct rsnd_mod *adg_mod = rsnd_mod_get(adg); int id = rsnd_mod_id(mod); int shift = (id % 2) ? 16 : 0; u32 mask, val; val = rsnd_adg_ssi_ws_timing_gen2(io); val = val << shift; mask = 0xffff << shift; rsnd_mod_bset(adg_mod, CMDOUT_TIMSEL, mask, val); return 0; }
static void rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv, struct rsnd_dai_stream *io, unsigned int in_rate, unsigned int out_rate, u32 *in, u32 *out, u32 *en) { struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); unsigned int target_rate; u32 *target_val; u32 _in; u32 _out; u32 _en; /* default = SSI WS */ _in = _out = rsnd_adg_ssi_ws_timing_gen2(io); target_rate = 0; target_val = NULL; _en = 0; if (runtime->rate != in_rate) { target_rate = out_rate; target_val = &_out; } else if (runtime->rate != out_rate) { target_rate = in_rate; target_val = &_in; } if (target_rate) __rsnd_adg_get_timesel_ratio(priv, io, target_rate, target_val, &_en); if (in) *in = _in; if (out) *out = _out; if (en) *en = _en; }