^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2006 Sony Computer Entertainment Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright 2006, 2007 Sony Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * AV backend support for PS3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/ps3av.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/ps3.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/ps3gpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "vuart.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static const struct video_fmt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) u32 format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) u32 order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) } ps3av_video_fmt_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) { PS3AV_CMD_VIDEO_FORMAT_ARGB_8BIT, PS3AV_CMD_VIDEO_ORDER_RGB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) { PS3AV_CMD_VIDEO_FORMAT_ARGB_8BIT, PS3AV_CMD_VIDEO_ORDER_BGR },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) u32 av;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) u32 bl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) } ps3av_cs_video2av_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .cs = PS3AV_CMD_VIDEO_CS_RGB_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .av = PS3AV_CMD_AV_CS_RGB_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .bl = PS3AV_CMD_AV_CS_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .cs = PS3AV_CMD_VIDEO_CS_RGB_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .av = PS3AV_CMD_AV_CS_RGB_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .bl = PS3AV_CMD_AV_CS_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .cs = PS3AV_CMD_VIDEO_CS_RGB_12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .av = PS3AV_CMD_AV_CS_RGB_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .bl = PS3AV_CMD_AV_CS_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .cs = PS3AV_CMD_VIDEO_CS_YUV444_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .av = PS3AV_CMD_AV_CS_YUV444_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .bl = PS3AV_CMD_AV_CS_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .cs = PS3AV_CMD_VIDEO_CS_YUV444_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .av = PS3AV_CMD_AV_CS_YUV444_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .bl = PS3AV_CMD_AV_CS_10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .cs = PS3AV_CMD_VIDEO_CS_YUV444_12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .av = PS3AV_CMD_AV_CS_YUV444_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .bl = PS3AV_CMD_AV_CS_10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .cs = PS3AV_CMD_VIDEO_CS_YUV422_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .av = PS3AV_CMD_AV_CS_YUV422_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .bl = PS3AV_CMD_AV_CS_10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .cs = PS3AV_CMD_VIDEO_CS_YUV422_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .av = PS3AV_CMD_AV_CS_YUV422_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .bl = PS3AV_CMD_AV_CS_10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .cs = PS3AV_CMD_VIDEO_CS_YUV422_12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .av = PS3AV_CMD_AV_CS_YUV422_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .bl = PS3AV_CMD_AV_CS_12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .cs = PS3AV_CMD_VIDEO_CS_XVYCC_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .av = PS3AV_CMD_AV_CS_XVYCC_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .bl = PS3AV_CMD_AV_CS_12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .cs = PS3AV_CMD_VIDEO_CS_XVYCC_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .av = PS3AV_CMD_AV_CS_XVYCC_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .bl = PS3AV_CMD_AV_CS_12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .cs = PS3AV_CMD_VIDEO_CS_XVYCC_12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .av = PS3AV_CMD_AV_CS_XVYCC_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .bl = PS3AV_CMD_AV_CS_12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static u32 ps3av_cs_video2av(int cs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) for (i = 0; i < ARRAY_SIZE(ps3av_cs_video2av_table); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (ps3av_cs_video2av_table[i].cs == cs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return ps3av_cs_video2av_table[i].av;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return PS3AV_CMD_AV_CS_RGB_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static u32 ps3av_cs_video2av_bitlen(int cs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) for (i = 0; i < ARRAY_SIZE(ps3av_cs_video2av_table); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (ps3av_cs_video2av_table[i].cs == cs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return ps3av_cs_video2av_table[i].bl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return PS3AV_CMD_AV_CS_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) u32 av;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) } ps3av_vid_video2av_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) { PS3AV_CMD_VIDEO_VID_480I, PS3AV_CMD_AV_VID_480I },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { PS3AV_CMD_VIDEO_VID_480P, PS3AV_CMD_AV_VID_480P },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { PS3AV_CMD_VIDEO_VID_576I, PS3AV_CMD_AV_VID_576I },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) { PS3AV_CMD_VIDEO_VID_576P, PS3AV_CMD_AV_VID_576P },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) { PS3AV_CMD_VIDEO_VID_1080I_60HZ, PS3AV_CMD_AV_VID_1080I_60HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) { PS3AV_CMD_VIDEO_VID_720P_60HZ, PS3AV_CMD_AV_VID_720P_60HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) { PS3AV_CMD_VIDEO_VID_1080P_60HZ, PS3AV_CMD_AV_VID_1080P_60HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) { PS3AV_CMD_VIDEO_VID_1080I_50HZ, PS3AV_CMD_AV_VID_1080I_50HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) { PS3AV_CMD_VIDEO_VID_720P_50HZ, PS3AV_CMD_AV_VID_720P_50HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) { PS3AV_CMD_VIDEO_VID_1080P_50HZ, PS3AV_CMD_AV_VID_1080P_50HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) { PS3AV_CMD_VIDEO_VID_WXGA, PS3AV_CMD_AV_VID_WXGA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { PS3AV_CMD_VIDEO_VID_SXGA, PS3AV_CMD_AV_VID_SXGA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { PS3AV_CMD_VIDEO_VID_WUXGA, PS3AV_CMD_AV_VID_WUXGA }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static u32 ps3av_vid_video2av(int vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) for (i = 0; i < ARRAY_SIZE(ps3av_vid_video2av_table); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (ps3av_vid_video2av_table[i].vid == vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return ps3av_vid_video2av_table[i].av;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return PS3AV_CMD_AV_VID_480P;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static int ps3av_hdmi_range(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) if (ps3_compare_firmware_version(1, 8, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return 1; /* supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int ps3av_cmd_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct ps3av_pkt_av_init av_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct ps3av_pkt_video_init video_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) struct ps3av_pkt_audio_init audio_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* video init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) memset(&video_init, 0, sizeof(video_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) res = ps3av_do_pkt(PS3AV_CID_VIDEO_INIT, sizeof(video_init.send_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) sizeof(video_init), &video_init.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) res = get_status(&video_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) printk(KERN_ERR "PS3AV_CID_VIDEO_INIT: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* audio init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) memset(&audio_init, 0, sizeof(audio_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) res = ps3av_do_pkt(PS3AV_CID_AUDIO_INIT, sizeof(audio_init.send_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) sizeof(audio_init), &audio_init.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) res = get_status(&audio_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) printk(KERN_ERR "PS3AV_CID_AUDIO_INIT: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* av init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) memset(&av_init, 0, sizeof(av_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) av_init.event_bit = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) res = ps3av_do_pkt(PS3AV_CID_AV_INIT, sizeof(av_init), sizeof(av_init),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) &av_init.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) res = get_status(&av_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) printk(KERN_ERR "PS3AV_CID_AV_INIT: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int ps3av_cmd_fin(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) struct ps3av_pkt_av_fin av_fin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) memset(&av_fin, 0, sizeof(av_fin));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) res = ps3av_do_pkt(PS3AV_CID_AV_FIN, sizeof(av_fin.send_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) sizeof(av_fin), &av_fin.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) res = get_status(&av_fin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) printk(KERN_ERR "PS3AV_CID_AV_FIN: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) int ps3av_cmd_av_video_mute(int num_of_port, u32 *port, u32 mute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) int i, send_len, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct ps3av_pkt_av_video_mute av_video_mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (num_of_port > PS3AV_MUTE_PORT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) memset(&av_video_mute, 0, sizeof(av_video_mute));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) for (i = 0; i < num_of_port; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) av_video_mute.mute[i].avport = port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) av_video_mute.mute[i].mute = mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) send_len = sizeof(av_video_mute.send_hdr) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) sizeof(struct ps3av_av_mute) * num_of_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) res = ps3av_do_pkt(PS3AV_CID_AV_VIDEO_MUTE, send_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) sizeof(av_video_mute), &av_video_mute.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) res = get_status(&av_video_mute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) printk(KERN_ERR "PS3AV_CID_AV_VIDEO_MUTE: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) int ps3av_cmd_av_video_disable_sig(u32 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct ps3av_pkt_av_video_disable_sig av_video_sig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) memset(&av_video_sig, 0, sizeof(av_video_sig));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) av_video_sig.avport = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) res = ps3av_do_pkt(PS3AV_CID_AV_VIDEO_DISABLE_SIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) sizeof(av_video_sig), sizeof(av_video_sig),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) &av_video_sig.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) res = get_status(&av_video_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) "PS3AV_CID_AV_VIDEO_DISABLE_SIG: failed %x port:%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) res, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) int ps3av_cmd_av_tv_mute(u32 avport, u32 mute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct ps3av_pkt_av_tv_mute tv_mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) memset(&tv_mute, 0, sizeof(tv_mute));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) tv_mute.avport = avport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) tv_mute.mute = mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) res = ps3av_do_pkt(PS3AV_CID_AV_TV_MUTE, sizeof(tv_mute),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) sizeof(tv_mute), &tv_mute.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) res = get_status(&tv_mute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) printk(KERN_ERR "PS3AV_CID_AV_TV_MUTE: failed %x port:%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) res, avport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) int ps3av_cmd_enable_event(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct ps3av_pkt_av_event av_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) memset(&av_event, 0, sizeof(av_event));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) av_event.event_bit = PS3AV_CMD_EVENT_BIT_UNPLUGGED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) PS3AV_CMD_EVENT_BIT_PLUGGED | PS3AV_CMD_EVENT_BIT_HDCP_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) res = ps3av_do_pkt(PS3AV_CID_AV_ENABLE_EVENT, sizeof(av_event),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) sizeof(av_event), &av_event.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) res = get_status(&av_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) printk(KERN_ERR "PS3AV_CID_AV_ENABLE_EVENT: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) int ps3av_cmd_av_hdmi_mode(u8 mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct ps3av_pkt_av_hdmi_mode hdmi_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) memset(&hdmi_mode, 0, sizeof(hdmi_mode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) hdmi_mode.mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) res = ps3av_do_pkt(PS3AV_CID_AV_HDMI_MODE, sizeof(hdmi_mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) sizeof(hdmi_mode), &hdmi_mode.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) res = get_status(&hdmi_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (res && res != PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) printk(KERN_ERR "PS3AV_CID_AV_HDMI_MODE: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u32 ps3av_cmd_set_av_video_cs(void *p, u32 avport, int video_vid, int cs_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) int aspect, u32 id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) struct ps3av_pkt_av_video_cs *av_video_cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) av_video_cs = (struct ps3av_pkt_av_video_cs *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (video_vid == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) video_vid = PS3AV_CMD_VIDEO_VID_720P_60HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (cs_out == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) cs_out = PS3AV_CMD_VIDEO_CS_YUV444_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (aspect == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) aspect = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) memset(av_video_cs, 0, sizeof(*av_video_cs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ps3av_set_hdr(PS3AV_CID_AV_VIDEO_CS, sizeof(*av_video_cs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) &av_video_cs->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) av_video_cs->avport = avport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* should be same as video_mode.resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) av_video_cs->av_vid = ps3av_vid_video2av(video_vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) av_video_cs->av_cs_out = ps3av_cs_video2av(cs_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /* should be same as video_mode.video_cs_out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) av_video_cs->av_cs_in = ps3av_cs_video2av(PS3AV_CMD_VIDEO_CS_RGB_8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) av_video_cs->bitlen_out = ps3av_cs_video2av_bitlen(cs_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if ((id & PS3AV_MODE_WHITE) && ps3av_hdmi_range())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) else /* default off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) av_video_cs->aspect = aspect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (id & PS3AV_MODE_DITHER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) av_video_cs->dither = PS3AV_CMD_AV_DITHER_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) | PS3AV_CMD_AV_DITHER_8BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /* default off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) av_video_cs->dither = PS3AV_CMD_AV_DITHER_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return sizeof(*av_video_cs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) u32 ps3av_cmd_set_video_mode(void *p, u32 head, int video_vid, int video_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) u32 id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct ps3av_pkt_video_mode *video_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) u32 x, y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) video_mode = (struct ps3av_pkt_video_mode *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) if (video_vid == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) video_vid = PS3AV_CMD_VIDEO_VID_720P_60HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (video_fmt == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) video_fmt = PS3AV_CMD_VIDEO_FMT_X8R8G8B8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (ps3av_video_mode2res(id, &x, &y))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* video mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) memset(video_mode, 0, sizeof(*video_mode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ps3av_set_hdr(PS3AV_CID_VIDEO_MODE, sizeof(*video_mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) &video_mode->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) video_mode->video_head = head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (video_vid == PS3AV_CMD_VIDEO_VID_480I
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) && head == PS3AV_CMD_VIDEO_HEAD_B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) video_mode->video_vid = PS3AV_CMD_VIDEO_VID_480I_A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) video_mode->video_vid = video_vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) video_mode->width = (u16) x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) video_mode->height = (u16) y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) video_mode->pitch = video_mode->width * 4; /* line_length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) video_mode->video_out_format = PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) video_mode->video_format = ps3av_video_fmt_table[video_fmt].format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if ((id & PS3AV_MODE_COLOR) && ps3av_hdmi_range())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_DISABLE_LUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) else /* default enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_ENABLE_LUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) video_mode->video_order = ps3av_video_fmt_table[video_fmt].order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) pr_debug("%s: video_mode:vid:%x width:%d height:%d pitch:%d out_format:%d format:%x order:%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) __func__, video_vid, video_mode->width, video_mode->height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) video_mode->pitch, video_mode->video_out_format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) video_mode->video_format, video_mode->video_order);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) return sizeof(*video_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) int ps3av_cmd_video_format_black(u32 head, u32 video_fmt, u32 mute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) struct ps3av_pkt_video_format video_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) memset(&video_format, 0, sizeof(video_format));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) video_format.video_head = head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (mute != PS3AV_CMD_MUTE_OFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) video_format.video_format = PS3AV_CMD_VIDEO_FORMAT_BLACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) video_format.video_format =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) ps3av_video_fmt_table[video_fmt].format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) video_format.video_order = ps3av_video_fmt_table[video_fmt].order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) res = ps3av_do_pkt(PS3AV_CID_VIDEO_FORMAT, sizeof(video_format),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) sizeof(video_format), &video_format.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) res = get_status(&video_format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) printk(KERN_ERR "PS3AV_CID_VIDEO_FORMAT: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) int ps3av_cmd_av_audio_mute(int num_of_port, u32 *port, u32 mute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) int i, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) struct ps3av_pkt_av_audio_mute av_audio_mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) if (num_of_port > PS3AV_MUTE_PORT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* audio mute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) memset(&av_audio_mute, 0, sizeof(av_audio_mute));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) for (i = 0; i < num_of_port; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) av_audio_mute.mute[i].avport = port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) av_audio_mute.mute[i].mute = mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) res = ps3av_do_pkt(PS3AV_CID_AV_AUDIO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) sizeof(av_audio_mute.send_hdr) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) sizeof(struct ps3av_av_mute) * num_of_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) sizeof(av_audio_mute), &av_audio_mute.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) res = get_status(&av_audio_mute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) printk(KERN_ERR "PS3AV_CID_AV_AUDIO_MUTE: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) u32 fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) u8 mclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) } ps3av_cnv_mclk_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) { PS3AV_CMD_AUDIO_FS_44K, PS3AV_CMD_AV_MCLK_512 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) { PS3AV_CMD_AUDIO_FS_48K, PS3AV_CMD_AV_MCLK_512 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) { PS3AV_CMD_AUDIO_FS_88K, PS3AV_CMD_AV_MCLK_256 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) { PS3AV_CMD_AUDIO_FS_96K, PS3AV_CMD_AV_MCLK_256 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) { PS3AV_CMD_AUDIO_FS_176K, PS3AV_CMD_AV_MCLK_128 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) { PS3AV_CMD_AUDIO_FS_192K, PS3AV_CMD_AV_MCLK_128 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) static u8 ps3av_cnv_mclk(u32 fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) for (i = 0; i < ARRAY_SIZE(ps3av_cnv_mclk_table); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) if (ps3av_cnv_mclk_table[i].fs == fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) return ps3av_cnv_mclk_table[i].mclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) printk(KERN_ERR "%s failed, fs:%x\n", __func__, fs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) #define BASE PS3AV_CMD_AUDIO_FS_44K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) static const u32 ps3av_ns_table[][5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) /* D1, D2, D3, D4, D5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) [PS3AV_CMD_AUDIO_FS_44K-BASE] = { 6272, 6272, 17836, 17836, 8918 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) [PS3AV_CMD_AUDIO_FS_48K-BASE] = { 6144, 6144, 11648, 11648, 5824 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) [PS3AV_CMD_AUDIO_FS_88K-BASE] = { 12544, 12544, 35672, 35672, 17836 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) [PS3AV_CMD_AUDIO_FS_96K-BASE] = { 12288, 12288, 23296, 23296, 11648 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) [PS3AV_CMD_AUDIO_FS_176K-BASE] = { 25088, 25088, 71344, 71344, 35672 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) [PS3AV_CMD_AUDIO_FS_192K-BASE] = { 24576, 24576, 46592, 46592, 23296 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) u32 av_vid, ns_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) int d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) d = ns_val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) av_vid = ps3av_vid_video2av(video_vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) switch (av_vid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) case PS3AV_CMD_AV_VID_480I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) case PS3AV_CMD_AV_VID_576I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) d = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) case PS3AV_CMD_AV_VID_480P:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) case PS3AV_CMD_AV_VID_576P:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) d = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) case PS3AV_CMD_AV_VID_1080I_60HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) case PS3AV_CMD_AV_VID_1080I_50HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) d = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) case PS3AV_CMD_AV_VID_720P_60HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) case PS3AV_CMD_AV_VID_720P_50HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) d = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) case PS3AV_CMD_AV_VID_1080P_60HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) case PS3AV_CMD_AV_VID_1080P_50HZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) case PS3AV_CMD_AV_VID_WXGA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) case PS3AV_CMD_AV_VID_SXGA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) case PS3AV_CMD_AV_VID_WUXGA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) d = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) printk(KERN_ERR "%s failed, vid:%x\n", __func__, video_vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (fs < PS3AV_CMD_AUDIO_FS_44K || fs > PS3AV_CMD_AUDIO_FS_192K)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) printk(KERN_ERR "%s failed, fs:%x\n", __func__, fs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) ns_val = ps3av_ns_table[PS3AV_CMD_AUDIO_FS_44K-BASE][d];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) *ns++ = ns_val & 0x000000FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) *ns++ = (ns_val & 0x0000FF00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) *ns = (ns_val & 0x00FF0000) >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #undef BASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) static u8 ps3av_cnv_enable(u32 source, const u8 *enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) u8 ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) ret = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) } else if (source == PS3AV_CMD_AUDIO_SOURCE_SERIAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) ret = ((enable[0] << 4) + (enable[1] << 5) + (enable[2] << 6) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) (enable[3] << 7)) | 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) printk(KERN_ERR "%s failed, source:%x\n", __func__, source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) static u8 ps3av_cnv_fifomap(const u8 *map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) u8 ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) ret = map[0] + (map[1] << 2) + (map[2] << 4) + (map[3] << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) static u8 ps3av_cnv_inputlen(u32 word_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) u8 ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) switch (word_bits) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) case PS3AV_CMD_AUDIO_WORD_BITS_16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) ret = PS3AV_CMD_AV_INPUTLEN_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) case PS3AV_CMD_AUDIO_WORD_BITS_20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) ret = PS3AV_CMD_AV_INPUTLEN_20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) case PS3AV_CMD_AUDIO_WORD_BITS_24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) ret = PS3AV_CMD_AV_INPUTLEN_24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) printk(KERN_ERR "%s failed, word_bits:%x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) word_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) static u8 ps3av_cnv_layout(u32 num_of_ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (num_of_ch > PS3AV_CMD_AUDIO_NUM_OF_CH_8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) printk(KERN_ERR "%s failed, num_of_ch:%x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) num_of_ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) return num_of_ch == PS3AV_CMD_AUDIO_NUM_OF_CH_2 ? 0x0 : 0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static void ps3av_cnv_info(struct ps3av_audio_info_frame *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) const struct ps3av_pkt_audio_mode *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) info->pb1.cc = mode->audio_num_of_ch + 1; /* CH2:0x01 --- CH8:0x07 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) info->pb1.ct = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) info->pb2.sf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) info->pb2.ss = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) info->pb3 = 0; /* check mode->audio_format ?? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) info->pb4 = mode->audio_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) info->pb5.dm = mode->audio_downmix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) info->pb5.lsv = mode->audio_downmix_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) static void ps3av_cnv_chstat(u8 *chstat, const u8 *cs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) memcpy(chstat, cs_info, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) u32 ps3av_cmd_set_av_audio_param(void *p, u32 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) const struct ps3av_pkt_audio_mode *audio_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) u32 video_vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct ps3av_pkt_av_audio_param *param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) param = (struct ps3av_pkt_av_audio_param *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) memset(param, 0, sizeof(*param));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) ps3av_set_hdr(PS3AV_CID_AV_AUDIO_PARAM, sizeof(*param),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) ¶m->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) param->avport = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) param->mclk = ps3av_cnv_mclk(audio_mode->audio_fs) | 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) ps3av_cnv_ns(param->ns, audio_mode->audio_fs, video_vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) param->enable = ps3av_cnv_enable(audio_mode->audio_source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) audio_mode->audio_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) param->swaplr = 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) param->fifomap = ps3av_cnv_fifomap(audio_mode->audio_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) param->inputctrl = 0x49;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) param->inputlen = ps3av_cnv_inputlen(audio_mode->audio_word_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) param->layout = ps3av_cnv_layout(audio_mode->audio_num_of_ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) ps3av_cnv_info(¶m->info, audio_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) ps3av_cnv_chstat(param->chstat, audio_mode->audio_cs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return sizeof(*param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) /* default cs val */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u8 ps3av_mode_cs_info[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 0x00, 0x09, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) EXPORT_SYMBOL_GPL(ps3av_mode_cs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) #define CS_44 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) #define CS_48 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) #define CS_88 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) #define CS_96 0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) #define CS_176 0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) #define CS_192 0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) #define CS_MASK 0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #define CS_BIT 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) void ps3av_cmd_set_audio_mode(struct ps3av_pkt_audio_mode *audio, u32 avport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) u32 ch, u32 fs, u32 word_bits, u32 format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) u32 source)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) int spdif_through;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (!(ch | fs | format | word_bits | source)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) ch = PS3AV_CMD_AUDIO_NUM_OF_CH_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) fs = PS3AV_CMD_AUDIO_FS_48K;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) word_bits = PS3AV_CMD_AUDIO_WORD_BITS_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) format = PS3AV_CMD_AUDIO_FORMAT_PCM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) source = PS3AV_CMD_AUDIO_SOURCE_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /* audio mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) memset(audio, 0, sizeof(*audio));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) ps3av_set_hdr(PS3AV_CID_AUDIO_MODE, sizeof(*audio), &audio->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) audio->avport = (u8) avport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) audio->mask = 0x0FFF; /* XXX set all */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) audio->audio_num_of_ch = ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) audio->audio_fs = fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) audio->audio_word_bits = word_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) audio->audio_format = format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) audio->audio_source = source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) switch (ch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) case PS3AV_CMD_AUDIO_NUM_OF_CH_8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) audio->audio_enable[3] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) case PS3AV_CMD_AUDIO_NUM_OF_CH_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) audio->audio_enable[2] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) audio->audio_enable[1] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) case PS3AV_CMD_AUDIO_NUM_OF_CH_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) audio->audio_enable[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) /* audio swap L/R */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) audio->audio_swap[i] = PS3AV_CMD_AUDIO_SWAP_0; /* no swap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /* audio serial input mapping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) audio->audio_map[0] = PS3AV_CMD_AUDIO_MAP_OUTPUT_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) audio->audio_map[1] = PS3AV_CMD_AUDIO_MAP_OUTPUT_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) audio->audio_map[2] = PS3AV_CMD_AUDIO_MAP_OUTPUT_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) audio->audio_map[3] = PS3AV_CMD_AUDIO_MAP_OUTPUT_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) /* audio speaker layout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (avport == PS3AV_CMD_AVPORT_HDMI_0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) avport == PS3AV_CMD_AVPORT_HDMI_1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) switch (ch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) case PS3AV_CMD_AUDIO_NUM_OF_CH_8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_8CH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) case PS3AV_CMD_AUDIO_NUM_OF_CH_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_6CH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) case PS3AV_CMD_AUDIO_NUM_OF_CH_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_2CH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_2CH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) /* audio downmix permission */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) audio->audio_downmix = PS3AV_CMD_AUDIO_DOWNMIX_PERMITTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /* audio downmix level shift (0:0dB to 15:15dB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) audio->audio_downmix_level = 0; /* 0dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /* set ch status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) for (i = 0; i < 8; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) audio->audio_cs_info[i] = ps3av_mode_cs_info[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) switch (fs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) case PS3AV_CMD_AUDIO_FS_44K:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) audio->audio_cs_info[3] &= ~CS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) audio->audio_cs_info[3] |= CS_44;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) case PS3AV_CMD_AUDIO_FS_88K:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) audio->audio_cs_info[3] &= ~CS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) audio->audio_cs_info[3] |= CS_88;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) case PS3AV_CMD_AUDIO_FS_96K:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) audio->audio_cs_info[3] &= ~CS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) audio->audio_cs_info[3] |= CS_96;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) case PS3AV_CMD_AUDIO_FS_176K:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) audio->audio_cs_info[3] &= ~CS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) audio->audio_cs_info[3] |= CS_176;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) case PS3AV_CMD_AUDIO_FS_192K:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) audio->audio_cs_info[3] &= ~CS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) audio->audio_cs_info[3] |= CS_192;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* non-audio bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) spdif_through = audio->audio_cs_info[0] & 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) /* pass through setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) if (spdif_through &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) (avport == PS3AV_CMD_AVPORT_SPDIF_0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) avport == PS3AV_CMD_AVPORT_SPDIF_1 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) avport == PS3AV_CMD_AVPORT_HDMI_0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) avport == PS3AV_CMD_AVPORT_HDMI_1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) audio->audio_word_bits = PS3AV_CMD_AUDIO_WORD_BITS_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) audio->audio_format = PS3AV_CMD_AUDIO_FORMAT_BITSTREAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) int ps3av_cmd_audio_mode(struct ps3av_pkt_audio_mode *audio_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) res = ps3av_do_pkt(PS3AV_CID_AUDIO_MODE, sizeof(*audio_mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) sizeof(*audio_mode), &audio_mode->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) res = get_status(audio_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) printk(KERN_ERR "PS3AV_CID_AUDIO_MODE: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) int ps3av_cmd_audio_mute(int num_of_port, u32 *port, u32 mute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) int i, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) struct ps3av_pkt_audio_mute audio_mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (num_of_port > PS3AV_OPT_PORT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) /* audio mute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) memset(&audio_mute, 0, sizeof(audio_mute));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) for (i = 0; i < num_of_port; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) audio_mute.mute[i].avport = port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) audio_mute.mute[i].mute = mute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) res = ps3av_do_pkt(PS3AV_CID_AUDIO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) sizeof(audio_mute.send_hdr) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) sizeof(struct ps3av_audio_mute) * num_of_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) sizeof(audio_mute), &audio_mute.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) res = get_status(&audio_mute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) printk(KERN_ERR "PS3AV_CID_AUDIO_MUTE: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) int ps3av_cmd_audio_active(int active, u32 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) struct ps3av_pkt_audio_active audio_active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) u32 cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /* audio active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) memset(&audio_active, 0, sizeof(audio_active));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) audio_active.audio_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) cid = active ? PS3AV_CID_AUDIO_ACTIVE : PS3AV_CID_AUDIO_INACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) res = ps3av_do_pkt(cid, sizeof(audio_active), sizeof(audio_active),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) &audio_active.send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) res = get_status(&audio_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) printk(KERN_ERR "PS3AV_CID_AUDIO_ACTIVE:%x failed %x\n", cid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) int ps3av_cmd_avb_param(struct ps3av_pkt_avb_param *avb, u32 send_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) mutex_lock(&ps3_gpu_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) /* avb packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) res = ps3av_do_pkt(PS3AV_CID_AVB_PARAM, send_len, sizeof(*avb),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) &avb->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) res = get_status(avb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) pr_debug("%s: PS3AV_CID_AVB_PARAM: failed %x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) mutex_unlock(&ps3_gpu_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) int ps3av_cmd_av_get_hw_conf(struct ps3av_pkt_av_get_hw_conf *hw_conf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) memset(hw_conf, 0, sizeof(*hw_conf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) res = ps3av_do_pkt(PS3AV_CID_AV_GET_HW_CONF, sizeof(hw_conf->send_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) sizeof(*hw_conf), &hw_conf->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) res = get_status(hw_conf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) printk(KERN_ERR "PS3AV_CID_AV_GET_HW_CONF: failed %x\n", res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) int ps3av_cmd_video_get_monitor_info(struct ps3av_pkt_av_get_monitor_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) u32 avport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) memset(info, 0, sizeof(*info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) info->avport = avport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) res = ps3av_do_pkt(PS3AV_CID_AV_GET_MONITOR_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) sizeof(info->send_hdr) + sizeof(info->avport) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) sizeof(info->reserved),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) sizeof(*info), &info->send_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) res = get_status(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) printk(KERN_ERR "PS3AV_CID_AV_GET_MONITOR_INFO: failed %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) #define PS3AV_AV_LAYOUT_0 (PS3AV_CMD_AV_LAYOUT_32 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) | PS3AV_CMD_AV_LAYOUT_44 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) | PS3AV_CMD_AV_LAYOUT_48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) #define PS3AV_AV_LAYOUT_1 (PS3AV_AV_LAYOUT_0 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) | PS3AV_CMD_AV_LAYOUT_88 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) | PS3AV_CMD_AV_LAYOUT_96 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) | PS3AV_CMD_AV_LAYOUT_176 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) | PS3AV_CMD_AV_LAYOUT_192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)