11a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/*
233c0fcad2160bc211272295e862c6f708118d006Hans Verkuil    Audio/video-routing-related ivtv functions.
333c0fcad2160bc211272295e862c6f708118d006Hans Verkuil    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
433c0fcad2160bc211272295e862c6f708118d006Hans Verkuil    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
51a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
61a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This program is free software; you can redistribute it and/or modify
71a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    it under the terms of the GNU General Public License as published by
81a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    the Free Software Foundation; either version 2 of the License, or
91a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    (at your option) any later version.
101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This program is distributed in the hope that it will be useful,
121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    but WITHOUT ANY WARRANTY; without even the implied warranty of
131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    GNU General Public License for more details.
151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    You should have received a copy of the GNU General Public License
171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    along with this program; if not, write to the Free Software
181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */
201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-driver.h"
221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-i2c.h"
231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-cards.h"
2433c0fcad2160bc211272295e862c6f708118d006Hans Verkuil#include "ivtv-gpio.h"
2533c0fcad2160bc211272295e862c6f708118d006Hans Verkuil#include "ivtv-routing.h"
2633c0fcad2160bc211272295e862c6f708118d006Hans Verkuil
2733c0fcad2160bc211272295e862c6f708118d006Hans Verkuil#include <media/msp3400.h>
28e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil#include <media/m52790.h>
291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include <media/upd64031a.h>
301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include <media/upd64083.h>
311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3233c0fcad2160bc211272295e862c6f708118d006Hans Verkuil/* Selects the audio input and output according to the current
3333c0fcad2160bc211272295e862c6f708118d006Hans Verkuil   settings. */
3433c0fcad2160bc211272295e862c6f708118d006Hans Verkuilvoid ivtv_audio_set_io(struct ivtv *itv)
351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
36e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	const struct ivtv_card_audio_input *in;
375325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	u32 input, output = 0;
381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3933c0fcad2160bc211272295e862c6f708118d006Hans Verkuil	/* Determine which input to use */
40e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
41e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil		in = &itv->card->radio_input;
42e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	else
43e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil		in = &itv->card->audio_inputs[itv->audio_input];
441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4533c0fcad2160bc211272295e862c6f708118d006Hans Verkuil	/* handle muxer chips */
465325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	input = in->muxer_input;
47e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	if (itv->card->hw_muxer & IVTV_HW_M52790)
485325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		output = M52790_OUT_STEREO;
495325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	v4l2_subdev_call(itv->sd_muxer, audio, s_routing,
505325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			input, output, 0);
511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
525325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	input = in->audio_input;
535325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	output = 0;
54e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	if (itv->card->hw_audio & IVTV_HW_MSP34XX)
555325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
565325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing,
575325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			input, output, 0);
581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6033c0fcad2160bc211272295e862c6f708118d006Hans Verkuil/* Selects the video input and output according to the current
6133c0fcad2160bc211272295e862c6f708118d006Hans Verkuil   settings. */
621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilvoid ivtv_video_set_io(struct ivtv *itv)
631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int inp = itv->active_input;
655325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	u32 input;
661a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	u32 type;
671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
685325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil	v4l2_subdev_call(itv->sd_video, video, s_routing,
695325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		itv->card->video_inputs[inp].video_input, 0, 0);
701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	type = itv->card->video_inputs[inp].video_type;
721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (type == IVTV_CARD_INPUT_VID_TUNER) {
745325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		input = 0;  /* Tuner */
751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	} else if (type < IVTV_CARD_INPUT_COMPOSITE1) {
765325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		input = 2;  /* S-Video */
771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	} else {
785325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		input = 1;  /* Composite */
791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (itv->card->hw_video & IVTV_HW_GPIO)
825325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing,
835325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil				input, 0, 0);
841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (itv->card->hw_video & IVTV_HW_UPD64031A) {
861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (type == IVTV_CARD_INPUT_VID_TUNER ||
871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		    type >= IVTV_CARD_INPUT_COMPOSITE1) {
881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			/* Composite: GR on, connect to 3DYCS */
895325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		} else {
911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			/* S-Video: GR bypassed, turn it off */
925325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
945325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		input |= itv->card->gr_config;
951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
965325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing,
975325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil				input, 0, 0);
981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
991a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
1001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (itv->card->hw_video & IVTV_HW_UPD6408X) {
1015325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		input = UPD64083_YCS_MODE;
1021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (type > IVTV_CARD_INPUT_VID_TUNER &&
1031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		    type < IVTV_CARD_INPUT_COMPOSITE1) {
1045325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			/* S-Video uses YCNR mode and internal Y-ADC, the
1055325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			   upd64031a is not used. */
1065325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			input |= UPD64083_YCNR_MODE;
1071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
1081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		else if (itv->card->hw_video & IVTV_HW_UPD64031A) {
1095325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			/* Use upd64031a output for tuner and
1105325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			   composite(CX23416GYC only) inputs */
1115325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			if (type == IVTV_CARD_INPUT_VID_TUNER ||
1125325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			    itv->card->type == IVTV_CARD_CX23416GYC) {
1135325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil				input |= UPD64083_EXT_Y_ADC;
1145325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil			}
1151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
1165325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil		ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing,
1175325b4272a53b43f55b82cc369c310c2fcacdca1Hans Verkuil				input, 0, 0);
1181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
1191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
120