162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2005 Mike Isely <isely@pobox.com> 562306a36Sopenharmony_ci * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci This source file is specifically designed to interface with the 1162306a36Sopenharmony_ci cx2584x, in kernels 2.6.16 or newer. 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci*/ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "pvrusb2-cx2584x-v4l.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "pvrusb2-hdw-internal.h" 1962306a36Sopenharmony_ci#include "pvrusb2-debug.h" 2062306a36Sopenharmony_ci#include <media/drv-intf/cx25840.h> 2162306a36Sopenharmony_ci#include <linux/videodev2.h> 2262306a36Sopenharmony_ci#include <media/v4l2-common.h> 2362306a36Sopenharmony_ci#include <linux/errno.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct routing_scheme_item { 2762306a36Sopenharmony_ci int vid; 2862306a36Sopenharmony_ci int aud; 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct routing_scheme { 3262306a36Sopenharmony_ci const struct routing_scheme_item *def; 3362306a36Sopenharmony_ci unsigned int cnt; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic const struct routing_scheme_item routing_scheme0[] = { 3762306a36Sopenharmony_ci [PVR2_CVAL_INPUT_TV] = { 3862306a36Sopenharmony_ci .vid = CX25840_COMPOSITE7, 3962306a36Sopenharmony_ci .aud = CX25840_AUDIO8, 4062306a36Sopenharmony_ci }, 4162306a36Sopenharmony_ci [PVR2_CVAL_INPUT_RADIO] = { /* Treat the same as composite */ 4262306a36Sopenharmony_ci .vid = CX25840_COMPOSITE3, 4362306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 4462306a36Sopenharmony_ci }, 4562306a36Sopenharmony_ci [PVR2_CVAL_INPUT_COMPOSITE] = { 4662306a36Sopenharmony_ci .vid = CX25840_COMPOSITE3, 4762306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 4862306a36Sopenharmony_ci }, 4962306a36Sopenharmony_ci [PVR2_CVAL_INPUT_SVIDEO] = { 5062306a36Sopenharmony_ci .vid = CX25840_SVIDEO1, 5162306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 5262306a36Sopenharmony_ci }, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const struct routing_scheme routing_def0 = { 5662306a36Sopenharmony_ci .def = routing_scheme0, 5762306a36Sopenharmony_ci .cnt = ARRAY_SIZE(routing_scheme0), 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* Specific to gotview device */ 6162306a36Sopenharmony_cistatic const struct routing_scheme_item routing_schemegv[] = { 6262306a36Sopenharmony_ci [PVR2_CVAL_INPUT_TV] = { 6362306a36Sopenharmony_ci .vid = CX25840_COMPOSITE2, 6462306a36Sopenharmony_ci .aud = CX25840_AUDIO5, 6562306a36Sopenharmony_ci }, 6662306a36Sopenharmony_ci [PVR2_CVAL_INPUT_RADIO] = { 6762306a36Sopenharmony_ci /* line-in is used for radio and composite. A GPIO is 6862306a36Sopenharmony_ci used to switch between the two choices. */ 6962306a36Sopenharmony_ci .vid = CX25840_COMPOSITE1, 7062306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 7162306a36Sopenharmony_ci }, 7262306a36Sopenharmony_ci [PVR2_CVAL_INPUT_COMPOSITE] = { 7362306a36Sopenharmony_ci .vid = CX25840_COMPOSITE1, 7462306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 7562306a36Sopenharmony_ci }, 7662306a36Sopenharmony_ci [PVR2_CVAL_INPUT_SVIDEO] = { 7762306a36Sopenharmony_ci .vid = (CX25840_SVIDEO_LUMA3|CX25840_SVIDEO_CHROMA4), 7862306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 7962306a36Sopenharmony_ci }, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic const struct routing_scheme routing_defgv = { 8362306a36Sopenharmony_ci .def = routing_schemegv, 8462306a36Sopenharmony_ci .cnt = ARRAY_SIZE(routing_schemegv), 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* Specific to grabster av400 device */ 8862306a36Sopenharmony_cistatic const struct routing_scheme_item routing_schemeav400[] = { 8962306a36Sopenharmony_ci [PVR2_CVAL_INPUT_COMPOSITE] = { 9062306a36Sopenharmony_ci .vid = CX25840_COMPOSITE1, 9162306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 9262306a36Sopenharmony_ci }, 9362306a36Sopenharmony_ci [PVR2_CVAL_INPUT_SVIDEO] = { 9462306a36Sopenharmony_ci .vid = (CX25840_SVIDEO_LUMA2|CX25840_SVIDEO_CHROMA4), 9562306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 9662306a36Sopenharmony_ci }, 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic const struct routing_scheme routing_defav400 = { 10062306a36Sopenharmony_ci .def = routing_schemeav400, 10162306a36Sopenharmony_ci .cnt = ARRAY_SIZE(routing_schemeav400), 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic const struct routing_scheme_item routing_scheme160xxx[] = { 10562306a36Sopenharmony_ci [PVR2_CVAL_INPUT_TV] = { 10662306a36Sopenharmony_ci .vid = CX25840_COMPOSITE7, 10762306a36Sopenharmony_ci .aud = CX25840_AUDIO8, 10862306a36Sopenharmony_ci }, 10962306a36Sopenharmony_ci [PVR2_CVAL_INPUT_RADIO] = { 11062306a36Sopenharmony_ci .vid = CX25840_COMPOSITE4, 11162306a36Sopenharmony_ci .aud = CX25840_AUDIO6, 11262306a36Sopenharmony_ci }, 11362306a36Sopenharmony_ci [PVR2_CVAL_INPUT_COMPOSITE] = { 11462306a36Sopenharmony_ci .vid = CX25840_COMPOSITE3, 11562306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 11662306a36Sopenharmony_ci }, 11762306a36Sopenharmony_ci [PVR2_CVAL_INPUT_SVIDEO] = { 11862306a36Sopenharmony_ci .vid = CX25840_SVIDEO1, 11962306a36Sopenharmony_ci .aud = CX25840_AUDIO_SERIAL, 12062306a36Sopenharmony_ci }, 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic const struct routing_scheme routing_def160xxx = { 12462306a36Sopenharmony_ci .def = routing_scheme160xxx, 12562306a36Sopenharmony_ci .cnt = ARRAY_SIZE(routing_scheme160xxx), 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic const struct routing_scheme *routing_schemes[] = { 12962306a36Sopenharmony_ci [PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0, 13062306a36Sopenharmony_ci [PVR2_ROUTING_SCHEME_GOTVIEW] = &routing_defgv, 13162306a36Sopenharmony_ci [PVR2_ROUTING_SCHEME_AV400] = &routing_defav400, 13262306a36Sopenharmony_ci [PVR2_ROUTING_SCHEME_HAUP160XXX] = &routing_def160xxx, 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_civoid pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update..."); 13862306a36Sopenharmony_ci if (hdw->input_dirty || hdw->force_dirty) { 13962306a36Sopenharmony_ci enum cx25840_video_input vid_input; 14062306a36Sopenharmony_ci enum cx25840_audio_input aud_input; 14162306a36Sopenharmony_ci const struct routing_scheme *sp; 14262306a36Sopenharmony_ci unsigned int sid = hdw->hdw_desc->signal_routing_scheme; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci sp = (sid < ARRAY_SIZE(routing_schemes)) ? 14562306a36Sopenharmony_ci routing_schemes[sid] : NULL; 14662306a36Sopenharmony_ci if ((sp == NULL) || 14762306a36Sopenharmony_ci (hdw->input_val < 0) || 14862306a36Sopenharmony_ci (hdw->input_val >= sp->cnt)) { 14962306a36Sopenharmony_ci pvr2_trace(PVR2_TRACE_ERROR_LEGS, 15062306a36Sopenharmony_ci "*** WARNING *** subdev cx2584x set_input: Invalid routing scheme (%u) and/or input (%d)", 15162306a36Sopenharmony_ci sid, hdw->input_val); 15262306a36Sopenharmony_ci return; 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci vid_input = sp->def[hdw->input_val].vid; 15562306a36Sopenharmony_ci aud_input = sp->def[hdw->input_val].aud; 15662306a36Sopenharmony_ci pvr2_trace(PVR2_TRACE_CHIPS, 15762306a36Sopenharmony_ci "subdev cx2584x set_input vid=0x%x aud=0x%x", 15862306a36Sopenharmony_ci vid_input, aud_input); 15962306a36Sopenharmony_ci sd->ops->video->s_routing(sd, (u32)vid_input, 0, 0); 16062306a36Sopenharmony_ci sd->ops->audio->s_routing(sd, (u32)aud_input, 0, 0); 16162306a36Sopenharmony_ci } 16262306a36Sopenharmony_ci} 163