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