Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | /* * * * 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" #include <media/cx25840.h> #include <linux/videodev2.h> #include <media/v4l2-common.h> #include <linux/errno.h> 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, }, }; static const struct routing_scheme routing_def0 = { .def = routing_scheme0, .cnt = ARRAY_SIZE(routing_scheme0), }; /* Specific to gotview device */ static const struct routing_scheme_item routing_schemegv[] = { [PVR2_CVAL_INPUT_TV] = { .vid = CX25840_COMPOSITE2, .aud = CX25840_AUDIO5, }, [PVR2_CVAL_INPUT_RADIO] = { /* line-in is used for radio and composite. A GPIO is used to switch between the two choices. */ .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, }, }; static const struct routing_scheme routing_defgv = { .def = routing_schemegv, .cnt = ARRAY_SIZE(routing_schemegv), }; /* 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), }; static const struct routing_scheme *routing_schemes[] = { [PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0, [PVR2_ROUTING_SCHEME_GOTVIEW] = &routing_defgv, [PVR2_ROUTING_SCHEME_AV400] = &routing_defav400, }; void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) { pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update..."); if (hdw->input_dirty || hdw->force_dirty) { 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; sp = (sid < ARRAY_SIZE(routing_schemes)) ? routing_schemes[sid] : NULL; if ((sp == NULL) || (hdw->input_val < 0) || (hdw->input_val >= sp->cnt)) { pvr2_trace(PVR2_TRACE_ERROR_LEGS, "*** WARNING *** subdev cx2584x set_input:" " Invalid routing scheme (%u)" " and/or input (%d)", sid, hdw->input_val); return; } vid_input = sp->def[hdw->input_val].vid; aud_input = sp->def[hdw->input_val].aud; pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x set_input vid=0x%x aud=0x%x", vid_input, aud_input); sd->ops->video->s_routing(sd, (u32)vid_input, 0, 0); sd->ops->audio->s_routing(sd, (u32)aud_input, 0, 0); } } /* Stuff for Emacs to see, in order to encourage consistent editing style: *** Local Variables: *** *** mode: c *** *** fill-column: 70 *** *** tab-width: 8 *** *** c-basic-offset: 8 *** *** End: *** */ |