Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) 		      &param->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(&param->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)