int ps3av_set_audio_mode(u32 ch, u32 fs, u32 word_bits, u32 format, u32 source) { struct ps3av_pkt_avb_param avb_param; int i, num_of_audio, vid, res; struct ps3av_pkt_audio_mode audio_mode; u32 len = 0; num_of_audio = ps3av->av_hw_conf.num_of_hdmi + ps3av->av_hw_conf.num_of_avmulti + ps3av->av_hw_conf.num_of_spdif; avb_param.num_of_video_pkt = 0; avb_param.num_of_audio_pkt = PS3AV_AVB_NUM_AUDIO; /* always 0 */ avb_param.num_of_av_video_pkt = 0; avb_param.num_of_av_audio_pkt = ps3av->av_hw_conf.num_of_hdmi; vid = video_mode_table[ps3av->ps3av_mode].vid; /* audio mute */ ps3av_set_audio_mute(PS3AV_CMD_MUTE_ON); /* audio inactive */ res = ps3av_cmd_audio_active(0, ps3av->audio_port); if (res < 0) dev_dbg(&ps3av->dev->core, "ps3av_cmd_audio_active OFF failed\n"); /* audio_pkt */ for (i = 0; i < num_of_audio; i++) { ps3av_cmd_set_audio_mode(&audio_mode, ps3av->av_port[i], ch, fs, word_bits, format, source); if (i < ps3av->av_hw_conf.num_of_hdmi) { /* hdmi only */ len += ps3av_cmd_set_av_audio_param(&avb_param.buf[len], ps3av->av_port[i], &audio_mode, vid); } /* audio_mode pkt should be sent separately */ res = ps3av_cmd_audio_mode(&audio_mode); if (res < 0) dev_dbg(&ps3av->dev->core, "ps3av_cmd_audio_mode failed, port:%x\n", i); } /* send command using avb pkt */ len += offsetof(struct ps3av_pkt_avb_param, buf); res = ps3av_cmd_avb_param(&avb_param, len); if (res < 0) dev_dbg(&ps3av->dev->core, "ps3av_cmd_avb_param failed\n"); /* audio mute */ ps3av_set_audio_mute(PS3AV_CMD_MUTE_OFF); /* audio active */ res = ps3av_cmd_audio_active(1, ps3av->audio_port); if (res < 0) dev_dbg(&ps3av->dev->core, "ps3av_cmd_audio_active ON failed\n"); return 0; }
int ps3av_audio_mute(int mute) { return ps3av_set_audio_mute(mute ? PS3AV_CMD_MUTE_ON : PS3AV_CMD_MUTE_OFF); }