2006-06-26 20:58:46 -03:00
/*
*
*
* Copyright ( C ) 2005 Mike Isely < isely @ pobox . com >
* Copyright ( C ) 2004 Aurelien Alleaume < slts @ free . fr >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
/*
This source file is specifically designed to interface with the
cx2584x , in kernels 2.6 .16 or newer .
*/
# include "pvrusb2-cx2584x-v4l.h"
# include "pvrusb2-video-v4l.h"
# include "pvrusb2-hdw-internal.h"
# include "pvrusb2-debug.h"
2015-11-13 19:40:07 -02:00
# include <media/drv-intf/cx25840.h>
2006-06-26 20:58:46 -03:00
# include <linux/videodev2.h>
# include <media/v4l2-common.h>
# include <linux/errno.h>
2007-11-26 02:07:26 -03:00
struct routing_scheme_item {
int vid ;
int aud ;
} ;
struct routing_scheme {
const struct routing_scheme_item * def ;
unsigned int cnt ;
} ;
static const struct routing_scheme_item routing_scheme0 [ ] = {
[ PVR2_CVAL_INPUT_TV ] = {
. vid = CX25840_COMPOSITE7 ,
. aud = CX25840_AUDIO8 ,
} ,
[ PVR2_CVAL_INPUT_RADIO ] = { /* Treat the same as composite */
. vid = CX25840_COMPOSITE3 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
[ PVR2_CVAL_INPUT_COMPOSITE ] = {
. vid = CX25840_COMPOSITE3 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
[ PVR2_CVAL_INPUT_SVIDEO ] = {
. vid = CX25840_SVIDEO1 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
} ;
2009-06-20 14:55:31 -03:00
static const struct routing_scheme routing_def0 = {
. def = routing_scheme0 ,
. cnt = ARRAY_SIZE ( routing_scheme0 ) ,
} ;
2007-11-26 02:14:23 -03:00
/* Specific to gotview device */
static const struct routing_scheme_item routing_schemegv [ ] = {
[ PVR2_CVAL_INPUT_TV ] = {
. vid = CX25840_COMPOSITE2 ,
. aud = CX25840_AUDIO5 ,
} ,
2008-04-21 03:50:39 -03:00
[ PVR2_CVAL_INPUT_RADIO ] = {
/* line-in is used for radio and composite. A GPIO is
used to switch between the two choices . */
2007-11-26 02:14:23 -03:00
. vid = CX25840_COMPOSITE1 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
[ PVR2_CVAL_INPUT_COMPOSITE ] = {
. vid = CX25840_COMPOSITE1 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
[ PVR2_CVAL_INPUT_SVIDEO ] = {
. vid = ( CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 ) ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
} ;
2009-06-20 14:55:31 -03:00
static const struct routing_scheme routing_defgv = {
. def = routing_schemegv ,
. cnt = ARRAY_SIZE ( routing_schemegv ) ,
} ;
2011-03-13 20:37:11 -03:00
/* Specific to grabster av400 device */
static const struct routing_scheme_item routing_schemeav400 [ ] = {
[ PVR2_CVAL_INPUT_COMPOSITE ] = {
. vid = CX25840_COMPOSITE1 ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
[ PVR2_CVAL_INPUT_SVIDEO ] = {
. vid = ( CX25840_SVIDEO_LUMA2 | CX25840_SVIDEO_CHROMA4 ) ,
. aud = CX25840_AUDIO_SERIAL ,
} ,
} ;
static const struct routing_scheme routing_defav400 = {
. def = routing_schemeav400 ,
. cnt = ARRAY_SIZE ( routing_schemeav400 ) ,
} ;
2009-06-20 14:55:31 -03:00
static const struct routing_scheme * routing_schemes [ ] = {
[ PVR2_ROUTING_SCHEME_HAUPPAUGE ] = & routing_def0 ,
[ PVR2_ROUTING_SCHEME_GOTVIEW ] = & routing_defgv ,
2011-03-13 20:37:11 -03:00
[ PVR2_ROUTING_SCHEME_AV400 ] = & routing_defav400 ,
2007-11-26 02:07:26 -03:00
} ;
2009-03-07 00:54:02 -03:00
void pvr2_cx25840_subdev_update ( struct pvr2_hdw * hdw , struct v4l2_subdev * sd )
{
2009-03-07 01:51:54 -03:00
pvr2_trace ( PVR2_TRACE_CHIPS , " subdev cx2584x update... " ) ;
2009-03-07 01:57:25 -03:00
if ( hdw - > input_dirty | | hdw - > force_dirty ) {
2009-03-07 00:54:02 -03:00
enum cx25840_video_input vid_input ;
enum cx25840_audio_input aud_input ;
const struct routing_scheme * sp ;
unsigned int sid = hdw - > hdw_desc - > signal_routing_scheme ;
2009-06-20 14:57:24 -03:00
sp = ( sid < ARRAY_SIZE ( routing_schemes ) ) ?
routing_schemes [ sid ] : NULL ;
if ( ( sp = = NULL ) | |
( hdw - > input_val < 0 ) | |
( hdw - > input_val > = sp - > cnt ) ) {
2009-03-07 00:54:02 -03:00
pvr2_trace ( PVR2_TRACE_ERROR_LEGS ,
" *** WARNING *** subdev cx2584x set_input: "
" Invalid routing scheme (%u) "
" and/or input (%d) " ,
sid , hdw - > input_val ) ;
return ;
}
2009-06-20 14:57:24 -03:00
vid_input = sp - > def [ hdw - > input_val ] . vid ;
aud_input = sp - > def [ hdw - > input_val ] . aud ;
2009-03-07 00:54:02 -03:00
pvr2_trace ( PVR2_TRACE_CHIPS ,
2009-03-07 01:51:54 -03:00
" subdev cx2584x set_input vid=0x%x aud=0x%x " ,
2009-03-07 00:54:02 -03:00
vid_input , aud_input ) ;
2009-04-02 11:26:22 -03:00
sd - > ops - > video - > s_routing ( sd , ( u32 ) vid_input , 0 , 0 ) ;
sd - > ops - > audio - > s_routing ( sd , ( u32 ) aud_input , 0 , 0 ) ;
2009-03-07 00:54:02 -03:00
}
}