0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "pvrusb2-cx2584x-v4l.h"
0016
0017
0018 #include "pvrusb2-hdw-internal.h"
0019 #include "pvrusb2-debug.h"
0020 #include <media/drv-intf/cx25840.h>
0021 #include <linux/videodev2.h>
0022 #include <media/v4l2-common.h>
0023 #include <linux/errno.h>
0024
0025
0026 struct routing_scheme_item {
0027 int vid;
0028 int aud;
0029 };
0030
0031 struct routing_scheme {
0032 const struct routing_scheme_item *def;
0033 unsigned int cnt;
0034 };
0035
0036 static const struct routing_scheme_item routing_scheme0[] = {
0037 [PVR2_CVAL_INPUT_TV] = {
0038 .vid = CX25840_COMPOSITE7,
0039 .aud = CX25840_AUDIO8,
0040 },
0041 [PVR2_CVAL_INPUT_RADIO] = {
0042 .vid = CX25840_COMPOSITE3,
0043 .aud = CX25840_AUDIO_SERIAL,
0044 },
0045 [PVR2_CVAL_INPUT_COMPOSITE] = {
0046 .vid = CX25840_COMPOSITE3,
0047 .aud = CX25840_AUDIO_SERIAL,
0048 },
0049 [PVR2_CVAL_INPUT_SVIDEO] = {
0050 .vid = CX25840_SVIDEO1,
0051 .aud = CX25840_AUDIO_SERIAL,
0052 },
0053 };
0054
0055 static const struct routing_scheme routing_def0 = {
0056 .def = routing_scheme0,
0057 .cnt = ARRAY_SIZE(routing_scheme0),
0058 };
0059
0060
0061 static const struct routing_scheme_item routing_schemegv[] = {
0062 [PVR2_CVAL_INPUT_TV] = {
0063 .vid = CX25840_COMPOSITE2,
0064 .aud = CX25840_AUDIO5,
0065 },
0066 [PVR2_CVAL_INPUT_RADIO] = {
0067
0068
0069 .vid = CX25840_COMPOSITE1,
0070 .aud = CX25840_AUDIO_SERIAL,
0071 },
0072 [PVR2_CVAL_INPUT_COMPOSITE] = {
0073 .vid = CX25840_COMPOSITE1,
0074 .aud = CX25840_AUDIO_SERIAL,
0075 },
0076 [PVR2_CVAL_INPUT_SVIDEO] = {
0077 .vid = (CX25840_SVIDEO_LUMA3|CX25840_SVIDEO_CHROMA4),
0078 .aud = CX25840_AUDIO_SERIAL,
0079 },
0080 };
0081
0082 static const struct routing_scheme routing_defgv = {
0083 .def = routing_schemegv,
0084 .cnt = ARRAY_SIZE(routing_schemegv),
0085 };
0086
0087
0088 static const struct routing_scheme_item routing_schemeav400[] = {
0089 [PVR2_CVAL_INPUT_COMPOSITE] = {
0090 .vid = CX25840_COMPOSITE1,
0091 .aud = CX25840_AUDIO_SERIAL,
0092 },
0093 [PVR2_CVAL_INPUT_SVIDEO] = {
0094 .vid = (CX25840_SVIDEO_LUMA2|CX25840_SVIDEO_CHROMA4),
0095 .aud = CX25840_AUDIO_SERIAL,
0096 },
0097 };
0098
0099 static const struct routing_scheme routing_defav400 = {
0100 .def = routing_schemeav400,
0101 .cnt = ARRAY_SIZE(routing_schemeav400),
0102 };
0103
0104 static const struct routing_scheme_item routing_scheme160xxx[] = {
0105 [PVR2_CVAL_INPUT_TV] = {
0106 .vid = CX25840_COMPOSITE7,
0107 .aud = CX25840_AUDIO8,
0108 },
0109 [PVR2_CVAL_INPUT_RADIO] = {
0110 .vid = CX25840_COMPOSITE4,
0111 .aud = CX25840_AUDIO6,
0112 },
0113 [PVR2_CVAL_INPUT_COMPOSITE] = {
0114 .vid = CX25840_COMPOSITE3,
0115 .aud = CX25840_AUDIO_SERIAL,
0116 },
0117 [PVR2_CVAL_INPUT_SVIDEO] = {
0118 .vid = CX25840_SVIDEO1,
0119 .aud = CX25840_AUDIO_SERIAL,
0120 },
0121 };
0122
0123 static const struct routing_scheme routing_def160xxx = {
0124 .def = routing_scheme160xxx,
0125 .cnt = ARRAY_SIZE(routing_scheme160xxx),
0126 };
0127
0128 static const struct routing_scheme *routing_schemes[] = {
0129 [PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0,
0130 [PVR2_ROUTING_SCHEME_GOTVIEW] = &routing_defgv,
0131 [PVR2_ROUTING_SCHEME_AV400] = &routing_defav400,
0132 [PVR2_ROUTING_SCHEME_HAUP160XXX] = &routing_def160xxx,
0133 };
0134
0135 void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
0136 {
0137 pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update...");
0138 if (hdw->input_dirty || hdw->force_dirty) {
0139 enum cx25840_video_input vid_input;
0140 enum cx25840_audio_input aud_input;
0141 const struct routing_scheme *sp;
0142 unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
0143
0144 sp = (sid < ARRAY_SIZE(routing_schemes)) ?
0145 routing_schemes[sid] : NULL;
0146 if ((sp == NULL) ||
0147 (hdw->input_val < 0) ||
0148 (hdw->input_val >= sp->cnt)) {
0149 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
0150 "*** WARNING *** subdev cx2584x set_input: Invalid routing scheme (%u) and/or input (%d)",
0151 sid, hdw->input_val);
0152 return;
0153 }
0154 vid_input = sp->def[hdw->input_val].vid;
0155 aud_input = sp->def[hdw->input_val].aud;
0156 pvr2_trace(PVR2_TRACE_CHIPS,
0157 "subdev cx2584x set_input vid=0x%x aud=0x%x",
0158 vid_input, aud_input);
0159 sd->ops->video->s_routing(sd, (u32)vid_input, 0, 0);
0160 sd->ops->audio->s_routing(sd, (u32)aud_input, 0, 0);
0161 }
0162 }