static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod, struct rsnd_dai_stream *io, struct rsnd_priv *priv) { int ret; ret = rsnd_ssiu_init(mod, io, priv); if (ret < 0) return ret; if (rsnd_runtime_is_ssi_tdm(io)) { /* * TDM Extend Mode * see * rsnd_ssi_config_init() */ rsnd_mod_write(mod, SSI_MODE, 0x1); } if (rsnd_ssi_use_busif(io)) { rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_get_adinr_bit(mod, io) | (rsnd_io_is_play(io) ? rsnd_runtime_channel_after_ctu(io) : rsnd_runtime_channel_original(io))); rsnd_mod_write(mod, SSI_BUSIF_MODE, 1); rsnd_mod_write(mod, SSI_BUSIF_DALIGN, rsnd_get_dalign(mod, io)); } return 0; }
static void rsnd_dvc_volume_init(struct rsnd_dai_stream *io, struct rsnd_mod *mod) { struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); u32 adinr = 0; u32 dvucr = 0; u32 vrctr = 0; u32 vrpdr = 0; u32 vrdbr = 0; adinr = rsnd_get_adinr_bit(mod, io) | rsnd_runtime_channel_after_ctu(io); /* Enable Digital Volume, Zero Cross Mute Mode */ dvucr |= 0x101; /* Enable Ramp */ if (dvc->ren.val) { dvucr |= 0x10; /* * FIXME !! * use scale-downed Digital Volume * as Volume Ramp * 7F FFFF -> 3FF */ vrctr = 0xff; vrpdr = rsnd_dvc_get_vrpdr(dvc); vrdbr = rsnd_dvc_get_vrdbr(dvc); } /* Initialize operation */ rsnd_mod_write(mod, DVC_DVUIR, 1); /* General Information */ rsnd_mod_write(mod, DVC_ADINR, adinr); rsnd_mod_write(mod, DVC_DVUCR, dvucr); /* Volume Ramp Parameter */ rsnd_mod_write(mod, DVC_VRCTR, vrctr); rsnd_mod_write(mod, DVC_VRPDR, vrpdr); rsnd_mod_write(mod, DVC_VRDBR, vrdbr); /* Digital Volume Function Parameter */ rsnd_dvc_volume_parameter(io, mod); /* cancel operation */ rsnd_mod_write(mod, DVC_DVUIR, 0); }
static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod, struct rsnd_dai_stream *io, struct rsnd_priv *priv) { int hdmi = rsnd_ssi_hdmi_port(io); int ret; u32 mode = 0; ret = rsnd_ssiu_init(mod, io, priv); if (ret < 0) return ret; if (rsnd_runtime_is_ssi_tdm(io)) { /* * TDM Extend Mode * see * rsnd_ssi_config_init() */ mode = 0x1; } rsnd_mod_write(mod, SSI_MODE, mode); if (rsnd_ssi_use_busif(io)) { rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_get_adinr_bit(mod, io) | (rsnd_io_is_play(io) ? rsnd_runtime_channel_after_ctu(io) : rsnd_runtime_channel_original(io))); rsnd_mod_write(mod, SSI_BUSIF_MODE, rsnd_get_busif_shift(io, mod) | 1); rsnd_mod_write(mod, SSI_BUSIF_DALIGN, rsnd_get_dalign(mod, io)); } if (hdmi) { enum rsnd_mod_type rsnd_ssi_array[] = { RSND_MOD_SSIM1, RSND_MOD_SSIM2, RSND_MOD_SSIM3, }; struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io); struct rsnd_mod *pos; u32 val; int i, shift; i = rsnd_mod_id(ssi_mod); /* output all same SSI as default */ val = i << 16 | i << 20 | i << 24 | i << 28 | i; for_each_rsnd_mod_array(i, pos, io, rsnd_ssi_array) { shift = (i * 4) + 16; val = (val & ~(0xF << shift)) | rsnd_mod_id(pos) << shift; } switch (hdmi) { case RSND_SSI_HDMI_PORT0: rsnd_mod_write(mod, HDMI0_SEL, val); break; case RSND_SSI_HDMI_PORT1: rsnd_mod_write(mod, HDMI1_SEL, val); break; } }