10c0d06caSMauro Carvalho Chehab /* 20c0d06caSMauro Carvalho Chehab * 30c0d06caSMauro Carvalho Chehab * 40c0d06caSMauro Carvalho Chehab * Copyright (C) 2005 Mike Isely <isely@pobox.com> 50c0d06caSMauro Carvalho Chehab * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> 60c0d06caSMauro Carvalho Chehab * 70c0d06caSMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify 80c0d06caSMauro Carvalho Chehab * it under the terms of the GNU General Public License as published by 90c0d06caSMauro Carvalho Chehab * the Free Software Foundation; either version 2 of the License 100c0d06caSMauro Carvalho Chehab * 110c0d06caSMauro Carvalho Chehab * This program is distributed in the hope that it will be useful, 120c0d06caSMauro Carvalho Chehab * but WITHOUT ANY WARRANTY; without even the implied warranty of 130c0d06caSMauro Carvalho Chehab * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 140c0d06caSMauro Carvalho Chehab * GNU General Public License for more details. 150c0d06caSMauro Carvalho Chehab * 160c0d06caSMauro Carvalho Chehab * You should have received a copy of the GNU General Public License 170c0d06caSMauro Carvalho Chehab * along with this program; if not, write to the Free Software 180c0d06caSMauro Carvalho Chehab * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 190c0d06caSMauro Carvalho Chehab * 200c0d06caSMauro Carvalho Chehab */ 210c0d06caSMauro Carvalho Chehab 220c0d06caSMauro Carvalho Chehab #include "pvrusb2-audio.h" 230c0d06caSMauro Carvalho Chehab #include "pvrusb2-hdw-internal.h" 240c0d06caSMauro Carvalho Chehab #include "pvrusb2-debug.h" 250c0d06caSMauro Carvalho Chehab #include <linux/videodev2.h> 26*d647f0b7SMauro Carvalho Chehab #include <media/drv-intf/msp3400.h> 270c0d06caSMauro Carvalho Chehab #include <media/v4l2-common.h> 280c0d06caSMauro Carvalho Chehab 290c0d06caSMauro Carvalho Chehab 300c0d06caSMauro Carvalho Chehab struct routing_scheme { 310c0d06caSMauro Carvalho Chehab const int *def; 320c0d06caSMauro Carvalho Chehab unsigned int cnt; 330c0d06caSMauro Carvalho Chehab }; 340c0d06caSMauro Carvalho Chehab 350c0d06caSMauro Carvalho Chehab static const int routing_scheme0[] = { 360c0d06caSMauro Carvalho Chehab [PVR2_CVAL_INPUT_TV] = MSP_INPUT_DEFAULT, 370c0d06caSMauro Carvalho Chehab [PVR2_CVAL_INPUT_RADIO] = MSP_INPUT(MSP_IN_SCART2, 380c0d06caSMauro Carvalho Chehab MSP_IN_TUNER1, 390c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART, 400c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART), 410c0d06caSMauro Carvalho Chehab [PVR2_CVAL_INPUT_COMPOSITE] = MSP_INPUT(MSP_IN_SCART1, 420c0d06caSMauro Carvalho Chehab MSP_IN_TUNER1, 430c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART, 440c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART), 450c0d06caSMauro Carvalho Chehab [PVR2_CVAL_INPUT_SVIDEO] = MSP_INPUT(MSP_IN_SCART1, 460c0d06caSMauro Carvalho Chehab MSP_IN_TUNER1, 470c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART, 480c0d06caSMauro Carvalho Chehab MSP_DSP_IN_SCART), 490c0d06caSMauro Carvalho Chehab }; 500c0d06caSMauro Carvalho Chehab 510c0d06caSMauro Carvalho Chehab static const struct routing_scheme routing_def0 = { 520c0d06caSMauro Carvalho Chehab .def = routing_scheme0, 530c0d06caSMauro Carvalho Chehab .cnt = ARRAY_SIZE(routing_scheme0), 540c0d06caSMauro Carvalho Chehab }; 550c0d06caSMauro Carvalho Chehab 560c0d06caSMauro Carvalho Chehab static const struct routing_scheme *routing_schemes[] = { 570c0d06caSMauro Carvalho Chehab [PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0, 580c0d06caSMauro Carvalho Chehab }; 590c0d06caSMauro Carvalho Chehab 600c0d06caSMauro Carvalho Chehab void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) 610c0d06caSMauro Carvalho Chehab { 620c0d06caSMauro Carvalho Chehab if (hdw->input_dirty || hdw->force_dirty) { 630c0d06caSMauro Carvalho Chehab const struct routing_scheme *sp; 640c0d06caSMauro Carvalho Chehab unsigned int sid = hdw->hdw_desc->signal_routing_scheme; 650c0d06caSMauro Carvalho Chehab u32 input; 660c0d06caSMauro Carvalho Chehab 670c0d06caSMauro Carvalho Chehab pvr2_trace(PVR2_TRACE_CHIPS, "subdev msp3400 v4l2 set_stereo"); 680c0d06caSMauro Carvalho Chehab sp = (sid < ARRAY_SIZE(routing_schemes)) ? 690c0d06caSMauro Carvalho Chehab routing_schemes[sid] : NULL; 700c0d06caSMauro Carvalho Chehab 710c0d06caSMauro Carvalho Chehab if ((sp != NULL) && 720c0d06caSMauro Carvalho Chehab (hdw->input_val >= 0) && 730c0d06caSMauro Carvalho Chehab (hdw->input_val < sp->cnt)) { 740c0d06caSMauro Carvalho Chehab input = sp->def[hdw->input_val]; 750c0d06caSMauro Carvalho Chehab } else { 760c0d06caSMauro Carvalho Chehab pvr2_trace(PVR2_TRACE_ERROR_LEGS, 770c0d06caSMauro Carvalho Chehab "*** WARNING *** subdev msp3400 set_input:" 780c0d06caSMauro Carvalho Chehab " Invalid routing scheme (%u)" 790c0d06caSMauro Carvalho Chehab " and/or input (%d)", 800c0d06caSMauro Carvalho Chehab sid, hdw->input_val); 810c0d06caSMauro Carvalho Chehab return; 820c0d06caSMauro Carvalho Chehab } 830c0d06caSMauro Carvalho Chehab sd->ops->audio->s_routing(sd, input, 840c0d06caSMauro Carvalho Chehab MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0); 850c0d06caSMauro Carvalho Chehab } 860c0d06caSMauro Carvalho Chehab } 87