cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ivtv-routing.c (2986B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3    Audio/video-routing-related ivtv functions.
      4    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
      5    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
      6
      7 */
      8
      9#include "ivtv-driver.h"
     10#include "ivtv-i2c.h"
     11#include "ivtv-cards.h"
     12#include "ivtv-gpio.h"
     13#include "ivtv-routing.h"
     14
     15#include <media/drv-intf/msp3400.h>
     16#include <media/i2c/m52790.h>
     17#include <media/i2c/upd64031a.h>
     18#include <media/i2c/upd64083.h>
     19
     20/* Selects the audio input and output according to the current
     21   settings. */
     22void ivtv_audio_set_io(struct ivtv *itv)
     23{
     24	const struct ivtv_card_audio_input *in;
     25	u32 input, output = 0;
     26
     27	/* Determine which input to use */
     28	if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
     29		in = &itv->card->radio_input;
     30	else
     31		in = &itv->card->audio_inputs[itv->audio_input];
     32
     33	/* handle muxer chips */
     34	input = in->muxer_input;
     35	if (itv->card->hw_muxer & IVTV_HW_M52790)
     36		output = M52790_OUT_STEREO;
     37	v4l2_subdev_call(itv->sd_muxer, audio, s_routing,
     38			input, output, 0);
     39
     40	input = in->audio_input;
     41	output = 0;
     42	if (itv->card->hw_audio & IVTV_HW_MSP34XX)
     43		output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
     44	ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing,
     45			input, output, 0);
     46}
     47
     48/* Selects the video input and output according to the current
     49   settings. */
     50void ivtv_video_set_io(struct ivtv *itv)
     51{
     52	int inp = itv->active_input;
     53	u32 input;
     54	u32 type;
     55
     56	v4l2_subdev_call(itv->sd_video, video, s_routing,
     57		itv->card->video_inputs[inp].video_input, 0, 0);
     58
     59	type = itv->card->video_inputs[inp].video_type;
     60
     61	if (type == IVTV_CARD_INPUT_VID_TUNER) {
     62		input = 0;  /* Tuner */
     63	} else if (type < IVTV_CARD_INPUT_COMPOSITE1) {
     64		input = 2;  /* S-Video */
     65	} else {
     66		input = 1;  /* Composite */
     67	}
     68
     69	if (itv->card->hw_video & IVTV_HW_GPIO)
     70		ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing,
     71				input, 0, 0);
     72
     73	if (itv->card->hw_video & IVTV_HW_UPD64031A) {
     74		if (type == IVTV_CARD_INPUT_VID_TUNER ||
     75		    type >= IVTV_CARD_INPUT_COMPOSITE1) {
     76			/* Composite: GR on, connect to 3DYCS */
     77			input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
     78		} else {
     79			/* S-Video: GR bypassed, turn it off */
     80			input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
     81		}
     82		input |= itv->card->gr_config;
     83
     84		ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing,
     85				input, 0, 0);
     86	}
     87
     88	if (itv->card->hw_video & IVTV_HW_UPD6408X) {
     89		input = UPD64083_YCS_MODE;
     90		if (type > IVTV_CARD_INPUT_VID_TUNER &&
     91		    type < IVTV_CARD_INPUT_COMPOSITE1) {
     92			/* S-Video uses YCNR mode and internal Y-ADC, the
     93			   upd64031a is not used. */
     94			input |= UPD64083_YCNR_MODE;
     95		}
     96		else if (itv->card->hw_video & IVTV_HW_UPD64031A) {
     97			/* Use upd64031a output for tuner and
     98			   composite(CX23416GYC only) inputs */
     99			if (type == IVTV_CARD_INPUT_VID_TUNER ||
    100			    itv->card->type == IVTV_CARD_CX23416GYC) {
    101				input |= UPD64083_EXT_Y_ADC;
    102			}
    103		}
    104		ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing,
    105				input, 0, 0);
    106	}
    107}