/* * av setting * NOTE: calling this function may generate audio interrupt. */ static int snd_ps3_change_avsetting(struct snd_ps3_card_info *card) { int ret, retries, i; pr_debug("%s: start\n", __func__); ret = ps3av_set_audio_mode(card->avs.avs_audio_ch, card->avs.avs_audio_rate, card->avs.avs_audio_width, card->avs.avs_audio_format, card->avs.avs_audio_source); /* * Reset the following unwanted settings: */ /* disable all 3wire buffers */ update_mask_reg(PS3_AUDIO_AO_3WMCTRL, ~(PS3_AUDIO_AO_3WMCTRL_ASOEN(0) | PS3_AUDIO_AO_3WMCTRL_ASOEN(1) | PS3_AUDIO_AO_3WMCTRL_ASOEN(2) | PS3_AUDIO_AO_3WMCTRL_ASOEN(3)), 0); wmb(); /* ensure the hardware sees the change */ /* wait for actually stopped */ retries = 1000; while ((read_reg(PS3_AUDIO_AO_3WMCTRL) & (PS3_AUDIO_AO_3WMCTRL_ASORUN(0) | PS3_AUDIO_AO_3WMCTRL_ASORUN(1) | PS3_AUDIO_AO_3WMCTRL_ASORUN(2) | PS3_AUDIO_AO_3WMCTRL_ASORUN(3))) && --retries) { udelay(1); } /* reset buffer pointer */ for (i = 0; i < 4; i++) { update_reg(PS3_AUDIO_AO_3WCTRL(i), PS3_AUDIO_AO_3WCTRL_ASOBRST_RESET); udelay(10); } wmb(); /* ensure the hardware actually start resetting */ /* enable 3wire#0 buffer */ update_reg(PS3_AUDIO_AO_3WMCTRL, PS3_AUDIO_AO_3WMCTRL_ASOEN(0)); /* In 24bit mode,ALSA inserts a zero byte at first byte of per sample */ update_mask_reg(PS3_AUDIO_AO_3WCTRL(0), ~PS3_AUDIO_AO_3WCTRL_ASODF, PS3_AUDIO_AO_3WCTRL_ASODF_LSB); update_mask_reg(PS3_AUDIO_AO_SPDCTRL(0), ~PS3_AUDIO_AO_SPDCTRL_SPODF, PS3_AUDIO_AO_SPDCTRL_SPODF_LSB); /* ensure all the setting above is written back to register */ wmb(); /* avsetting driver altered AX_IE, caller must reset it if you want */ pr_debug("%s: end\n", __func__); return ret; }
static int snd_ps3_change_avsetting(struct snd_ps3_card_info *card) { int ret, retries, i; pr_debug("%s: start\n", __func__); ret = ps3av_set_audio_mode(card->avs.avs_audio_ch, card->avs.avs_audio_rate, card->avs.avs_audio_width, card->avs.avs_audio_format, card->avs.avs_audio_source); update_mask_reg(PS3_AUDIO_AO_3WMCTRL, ~(PS3_AUDIO_AO_3WMCTRL_ASOEN(0) | PS3_AUDIO_AO_3WMCTRL_ASOEN(1) | PS3_AUDIO_AO_3WMCTRL_ASOEN(2) | PS3_AUDIO_AO_3WMCTRL_ASOEN(3)), 0); wmb(); retries = 1000; while ((read_reg(PS3_AUDIO_AO_3WMCTRL) & (PS3_AUDIO_AO_3WMCTRL_ASORUN(0) | PS3_AUDIO_AO_3WMCTRL_ASORUN(1) | PS3_AUDIO_AO_3WMCTRL_ASORUN(2) | PS3_AUDIO_AO_3WMCTRL_ASORUN(3))) && --retries) { udelay(1); } for (i = 0; i < 4; i++) { update_reg(PS3_AUDIO_AO_3WCTRL(i), PS3_AUDIO_AO_3WCTRL_ASOBRST_RESET); udelay(10); } wmb(); update_reg(PS3_AUDIO_AO_3WMCTRL, PS3_AUDIO_AO_3WMCTRL_ASOEN(0)); update_mask_reg(PS3_AUDIO_AO_3WCTRL(0), ~PS3_AUDIO_AO_3WCTRL_ASODF, PS3_AUDIO_AO_3WCTRL_ASODF_LSB); update_mask_reg(PS3_AUDIO_AO_SPDCTRL(0), ~PS3_AUDIO_AO_SPDCTRL_SPODF, PS3_AUDIO_AO_SPDCTRL_SPODF_LSB); /* ensure all the setting above is written back to register */ wmb(); pr_debug("%s: end\n", __func__); return ret; }
int ps3av_set_mode(u32 id, int boot) { int res; res = ps3av_set_video_mode(id, boot); if (res) return res; res = ps3av_set_audio_mode(PS3AV_CMD_AUDIO_NUM_OF_CH_2, PS3AV_CMD_AUDIO_FS_48K, PS3AV_CMD_AUDIO_WORD_BITS_16, PS3AV_CMD_AUDIO_FORMAT_PCM, PS3AV_CMD_AUDIO_SOURCE_SERIAL); if (res) return res; return 0; }