Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *
0004  *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
0005  *  Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
0006  */
0007 
0008 /*
0009 
0010    This source file is specifically designed to interface with the
0011    cx2584x, in kernels 2.6.16 or newer.
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] = { /* Treat the same as composite */
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 /* Specific to gotview device */
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         /* line-in is used for radio and composite.  A GPIO is
0068            used to switch between the two choices. */
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 /* Specific to grabster av400 device */
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 }