162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci    Functions to query card hardware
462306a36Sopenharmony_ci    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
562306a36Sopenharmony_ci    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "ivtv-driver.h"
1062306a36Sopenharmony_ci#include "ivtv-cards.h"
1162306a36Sopenharmony_ci#include "ivtv-i2c.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <media/drv-intf/msp3400.h>
1462306a36Sopenharmony_ci#include <media/i2c/m52790.h>
1562306a36Sopenharmony_ci#include <media/i2c/wm8775.h>
1662306a36Sopenharmony_ci#include <media/i2c/cs53l32a.h>
1762306a36Sopenharmony_ci#include <media/drv-intf/cx25840.h>
1862306a36Sopenharmony_ci#include <media/i2c/upd64031a.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define MSP_TUNER  MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
2162306a36Sopenharmony_ci				MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER)
2262306a36Sopenharmony_ci#define MSP_SCART1 MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
2362306a36Sopenharmony_ci				MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
2462306a36Sopenharmony_ci#define MSP_SCART2 MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1, \
2562306a36Sopenharmony_ci				MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
2662306a36Sopenharmony_ci#define MSP_SCART3 MSP_INPUT(MSP_IN_SCART3, MSP_IN_TUNER1, \
2762306a36Sopenharmony_ci				MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
2862306a36Sopenharmony_ci#define MSP_MONO   MSP_INPUT(MSP_IN_MONO, MSP_IN_TUNER1, \
2962306a36Sopenharmony_ci				MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define V4L2_STD_PAL_SECAM (V4L2_STD_PAL|V4L2_STD_SECAM)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* usual i2c tuner addresses to probe */
3462306a36Sopenharmony_cistatic struct ivtv_card_tuner_i2c ivtv_i2c_std = {
3562306a36Sopenharmony_ci	.radio = { I2C_CLIENT_END },
3662306a36Sopenharmony_ci	.demod = { 0x43, I2C_CLIENT_END },
3762306a36Sopenharmony_ci	.tv    = { 0x61, 0x60, I2C_CLIENT_END },
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* as above, but with possible radio tuner */
4162306a36Sopenharmony_cistatic struct ivtv_card_tuner_i2c ivtv_i2c_radio = {
4262306a36Sopenharmony_ci	.radio = { 0x60, I2C_CLIENT_END },
4362306a36Sopenharmony_ci	.demod = { 0x43, I2C_CLIENT_END },
4462306a36Sopenharmony_ci	.tv    = { 0x61, I2C_CLIENT_END },
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* using the tda8290+75a combo */
4862306a36Sopenharmony_cistatic struct ivtv_card_tuner_i2c ivtv_i2c_tda8290 = {
4962306a36Sopenharmony_ci	.radio = { I2C_CLIENT_END },
5062306a36Sopenharmony_ci	.demod = { I2C_CLIENT_END },
5162306a36Sopenharmony_ci	.tv    = { 0x4b, I2C_CLIENT_END },
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/********************** card configuration *******************************/
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* Please add new PCI IDs to: https://pci-ids.ucw.cz/
5762306a36Sopenharmony_ci   This keeps the PCI ID database up to date. Note that the entries
5862306a36Sopenharmony_ci   must be added under vendor 0x4444 (Conexant) as subsystem IDs.
5962306a36Sopenharmony_ci   New vendor IDs should still be added to the vendor ID list. */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Hauppauge PVR-250 cards */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* Note: for Hauppauge cards the tveeprom information is used instead of PCI IDs */
6462306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pvr250 = {
6562306a36Sopenharmony_ci	.type = IVTV_CARD_PVR_250,
6662306a36Sopenharmony_ci	.name = "Hauppauge WinTV PVR-250",
6762306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
6862306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
6962306a36Sopenharmony_ci	.hw_audio = IVTV_HW_MSP34XX,
7062306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_MSP34XX,
7162306a36Sopenharmony_ci	.hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
7262306a36Sopenharmony_ci		  IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
7362306a36Sopenharmony_ci	.video_inputs = {
7462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
7562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
7662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
7762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
7862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
7962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
8062306a36Sopenharmony_ci	},
8162306a36Sopenharmony_ci	.audio_inputs = {
8262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  MSP_TUNER  },
8362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
8462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
8562306a36Sopenharmony_ci	},
8662306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
8762306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci/* Hauppauge PVR-350 cards */
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* Outputs for Hauppauge PVR350 cards */
9562306a36Sopenharmony_cistatic struct ivtv_card_output ivtv_pvr350_outputs[] = {
9662306a36Sopenharmony_ci	{
9762306a36Sopenharmony_ci		.name = "S-Video + Composite",
9862306a36Sopenharmony_ci		.video_output = 0,
9962306a36Sopenharmony_ci	}, {
10062306a36Sopenharmony_ci		.name = "Composite",
10162306a36Sopenharmony_ci		.video_output = 1,
10262306a36Sopenharmony_ci	}, {
10362306a36Sopenharmony_ci		.name = "S-Video",
10462306a36Sopenharmony_ci		.video_output = 2,
10562306a36Sopenharmony_ci	}, {
10662306a36Sopenharmony_ci		.name = "RGB",
10762306a36Sopenharmony_ci		.video_output = 3,
10862306a36Sopenharmony_ci	}, {
10962306a36Sopenharmony_ci		.name = "YUV C",
11062306a36Sopenharmony_ci		.video_output = 4,
11162306a36Sopenharmony_ci	}, {
11262306a36Sopenharmony_ci		.name = "YUV V",
11362306a36Sopenharmony_ci		.video_output = 5,
11462306a36Sopenharmony_ci	}
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pvr350 = {
11862306a36Sopenharmony_ci	.type = IVTV_CARD_PVR_350,
11962306a36Sopenharmony_ci	.name = "Hauppauge WinTV PVR-350",
12062306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
12162306a36Sopenharmony_ci	.video_outputs = ivtv_pvr350_outputs,
12262306a36Sopenharmony_ci	.nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
12362306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
12462306a36Sopenharmony_ci	.hw_audio = IVTV_HW_MSP34XX,
12562306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_MSP34XX,
12662306a36Sopenharmony_ci	.hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
12762306a36Sopenharmony_ci		  IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER |
12862306a36Sopenharmony_ci		  IVTV_HW_I2C_IR_RX_HAUP_EXT | IVTV_HW_I2C_IR_RX_HAUP_INT,
12962306a36Sopenharmony_ci	.video_inputs = {
13062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
13162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
13262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
13362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
13462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
13562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
13662306a36Sopenharmony_ci	},
13762306a36Sopenharmony_ci	.audio_inputs = {
13862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  MSP_TUNER  },
13962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
14062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
14162306a36Sopenharmony_ci	},
14262306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
14362306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci/* PVR-350 V1 boards have a different audio tuner input and use a
14762306a36Sopenharmony_ci   saa7114 instead of a saa7115.
14862306a36Sopenharmony_ci   Note that the info below comes from a pre-production model so it may
14962306a36Sopenharmony_ci   not be correct. Especially the audio behaves strangely (mono only it seems) */
15062306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pvr350_v1 = {
15162306a36Sopenharmony_ci	.type = IVTV_CARD_PVR_350_V1,
15262306a36Sopenharmony_ci	.name = "Hauppauge WinTV PVR-350 (V1)",
15362306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
15462306a36Sopenharmony_ci	.video_outputs = ivtv_pvr350_outputs,
15562306a36Sopenharmony_ci	.nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
15662306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7114,
15762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_MSP34XX,
15862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_MSP34XX,
15962306a36Sopenharmony_ci	.hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7114 |
16062306a36Sopenharmony_ci		  IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
16162306a36Sopenharmony_ci	.video_inputs = {
16262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
16362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
16462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
16562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
16662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
16762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
16862306a36Sopenharmony_ci	},
16962306a36Sopenharmony_ci	.audio_inputs = {
17062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  MSP_MONO   },
17162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
17262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
17362306a36Sopenharmony_ci	},
17462306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
17562306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
17662306a36Sopenharmony_ci};
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci/* Hauppauge PVR-150/PVR-500 cards */
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pvr150 = {
18362306a36Sopenharmony_ci	.type = IVTV_CARD_PVR_150,
18462306a36Sopenharmony_ci	.name = "Hauppauge WinTV PVR-150",
18562306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
18662306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
18762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
18862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
18962306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_WM8775,
19062306a36Sopenharmony_ci	.hw_all = IVTV_HW_WM8775 | IVTV_HW_CX25840 |
19162306a36Sopenharmony_ci		  IVTV_HW_TVEEPROM | IVTV_HW_TUNER |
19262306a36Sopenharmony_ci		  IVTV_HW_I2C_IR_RX_HAUP_EXT | IVTV_HW_I2C_IR_RX_HAUP_INT |
19362306a36Sopenharmony_ci		  IVTV_HW_Z8F0811_IR_HAUP,
19462306a36Sopenharmony_ci	.video_inputs = {
19562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE7 },
19662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO1    },
19762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE3 },
19862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO2,    2, CX25840_SVIDEO2    },
19962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE2, 2, CX25840_COMPOSITE4 },
20062306a36Sopenharmony_ci	},
20162306a36Sopenharmony_ci	.audio_inputs = {
20262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,
20362306a36Sopenharmony_ci		  CX25840_AUDIO8, WM8775_AIN2 },
20462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,
20562306a36Sopenharmony_ci		  CX25840_AUDIO_SERIAL, WM8775_AIN2 },
20662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN2,
20762306a36Sopenharmony_ci		  CX25840_AUDIO_SERIAL, WM8775_AIN3 },
20862306a36Sopenharmony_ci	},
20962306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER,
21062306a36Sopenharmony_ci			 CX25840_AUDIO_SERIAL, WM8775_AIN4 },
21162306a36Sopenharmony_ci	/* apparently needed for the IR blaster */
21262306a36Sopenharmony_ci	.gpio_init = { .direction = 0x1f01, .initial_value = 0x26f3 },
21362306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
21462306a36Sopenharmony_ci};
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci/* AVerMedia M179 cards */
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_m179[] = {
22162306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3cf },
22262306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3ce },
22362306a36Sopenharmony_ci	{ 0, 0, 0 }
22462306a36Sopenharmony_ci};
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_m179 = {
22762306a36Sopenharmony_ci	.type = IVTV_CARD_M179,
22862306a36Sopenharmony_ci	.name = "AVerMedia M179",
22962306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
23062306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7114,
23162306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
23262306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
23362306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
23462306a36Sopenharmony_ci	.video_inputs = {
23562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
23662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
23762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
23862306a36Sopenharmony_ci	},
23962306a36Sopenharmony_ci	.audio_inputs = {
24062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
24162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
24262306a36Sopenharmony_ci	},
24362306a36Sopenharmony_ci	.gpio_init = { .direction = 0xe380, .initial_value = 0x8290 },
24462306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x8040, .tuner  = 0x8000, .linein = 0x0000 },
24562306a36Sopenharmony_ci	.gpio_audio_mute   = { .mask = 0x2000, .mute   = 0x2000 },
24662306a36Sopenharmony_ci	.gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
24762306a36Sopenharmony_ci			      .lang1 = 0x0200, .lang2  = 0x0100, .both   = 0x0000 },
24862306a36Sopenharmony_ci	.gpio_audio_freq   = { .mask = 0x0018, .f32000 = 0x0000,
24962306a36Sopenharmony_ci			     .f44100 = 0x0008, .f48000 = 0x0010 },
25062306a36Sopenharmony_ci	.gpio_audio_detect = { .mask = 0x4000, .stereo = 0x0000 },
25162306a36Sopenharmony_ci	.tuners = {
25262306a36Sopenharmony_ci		/* As far as we know all M179 cards use this tuner */
25362306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_NTSC },
25462306a36Sopenharmony_ci	},
25562306a36Sopenharmony_ci	.pci_list = ivtv_pci_m179,
25662306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
25762306a36Sopenharmony_ci};
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/* Yuan MPG600/Kuroutoshikou ITVC16-STVLP cards */
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_mpg600[] = {
26462306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xfff3 },
26562306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xffff },
26662306a36Sopenharmony_ci	{ 0, 0, 0 }
26762306a36Sopenharmony_ci};
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_mpg600 = {
27062306a36Sopenharmony_ci	.type = IVTV_CARD_MPG600,
27162306a36Sopenharmony_ci	.name = "Yuan MPG600, Kuroutoshikou ITVC16-STVLP",
27262306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
27362306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
27462306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
27562306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
27662306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER,
27762306a36Sopenharmony_ci	.video_inputs = {
27862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
27962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
28062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
28162306a36Sopenharmony_ci	},
28262306a36Sopenharmony_ci	.audio_inputs = {
28362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
28462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
28562306a36Sopenharmony_ci	},
28662306a36Sopenharmony_ci	.gpio_init = { .direction = 0x3080, .initial_value = 0x0004 },
28762306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x3000, .tuner  = 0x0000, .linein = 0x2000 },
28862306a36Sopenharmony_ci	.gpio_audio_mute   = { .mask = 0x0001, .mute   = 0x0001 },
28962306a36Sopenharmony_ci	.gpio_audio_mode   = { .mask = 0x000e, .mono   = 0x0006, .stereo = 0x0004,
29062306a36Sopenharmony_ci			      .lang1 = 0x0004, .lang2  = 0x0000, .both   = 0x0008 },
29162306a36Sopenharmony_ci	.gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
29262306a36Sopenharmony_ci	.tuners = {
29362306a36Sopenharmony_ci		/* The PAL tuner is confirmed */
29462306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
29562306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
29662306a36Sopenharmony_ci	},
29762306a36Sopenharmony_ci	.pci_list = ivtv_pci_mpg600,
29862306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci/* Yuan MPG160/Kuroutoshikou ITVC15-STVLP cards */
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_mpg160[] = {
30662306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_YUAN1, 0 },
30762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_IODATA, 0x40a0 },
30862306a36Sopenharmony_ci	{ 0, 0, 0 }
30962306a36Sopenharmony_ci};
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_mpg160 = {
31262306a36Sopenharmony_ci	.type = IVTV_CARD_MPG160,
31362306a36Sopenharmony_ci	.name = "YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCI",
31462306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
31562306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7114,
31662306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
31762306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
31862306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
31962306a36Sopenharmony_ci	.video_inputs = {
32062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
32162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
32262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
32362306a36Sopenharmony_ci	},
32462306a36Sopenharmony_ci	.audio_inputs = {
32562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
32662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
32762306a36Sopenharmony_ci	},
32862306a36Sopenharmony_ci	.gpio_init = { .direction = 0x7080, .initial_value = 0x400c },
32962306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x3000, .tuner  = 0x0000, .linein = 0x2000 },
33062306a36Sopenharmony_ci	.gpio_audio_mute   = { .mask = 0x0001, .mute   = 0x0001 },
33162306a36Sopenharmony_ci	.gpio_audio_mode   = { .mask = 0x000e, .mono   = 0x0006, .stereo = 0x0004,
33262306a36Sopenharmony_ci			      .lang1 = 0x0004, .lang2  = 0x0000, .both   = 0x0008 },
33362306a36Sopenharmony_ci	.gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
33462306a36Sopenharmony_ci	.tuners = {
33562306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
33662306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
33762306a36Sopenharmony_ci	},
33862306a36Sopenharmony_ci	.pci_list = ivtv_pci_mpg160,
33962306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
34062306a36Sopenharmony_ci};
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci/* Yuan PG600/Diamond PVR-550 cards */
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_pg600[] = {
34762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_DIAMONDMM, 0x0070 },
34862306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
34962306a36Sopenharmony_ci	{ 0, 0, 0 }
35062306a36Sopenharmony_ci};
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pg600 = {
35362306a36Sopenharmony_ci	.type = IVTV_CARD_PG600,
35462306a36Sopenharmony_ci	.name = "Yuan PG600, Diamond PVR-550",
35562306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
35662306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
35762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
35862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
35962306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
36062306a36Sopenharmony_ci	.video_inputs = {
36162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
36262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
36362306a36Sopenharmony_ci		  CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
36462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
36562306a36Sopenharmony_ci	},
36662306a36Sopenharmony_ci	.audio_inputs = {
36762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
36862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
36962306a36Sopenharmony_ci	},
37062306a36Sopenharmony_ci	.tuners = {
37162306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
37262306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
37362306a36Sopenharmony_ci	},
37462306a36Sopenharmony_ci	.pci_list = ivtv_pci_pg600,
37562306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
37662306a36Sopenharmony_ci};
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci/* Adaptec VideOh! AVC-2410 card */
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_avc2410[] = {
38362306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0093 },
38462306a36Sopenharmony_ci	{ 0, 0, 0 }
38562306a36Sopenharmony_ci};
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_avc2410 = {
38862306a36Sopenharmony_ci	.type = IVTV_CARD_AVC2410,
38962306a36Sopenharmony_ci	.name = "Adaptec VideOh! AVC-2410",
39062306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
39162306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
39262306a36Sopenharmony_ci	.hw_audio = IVTV_HW_MSP34XX,
39362306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_MSP34XX,
39462306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_CS53L32A,
39562306a36Sopenharmony_ci	.hw_all = IVTV_HW_MSP34XX | IVTV_HW_CS53L32A |
39662306a36Sopenharmony_ci		  IVTV_HW_SAA7115 | IVTV_HW_TUNER |
39762306a36Sopenharmony_ci		  IVTV_HW_I2C_IR_RX_ADAPTEC,
39862306a36Sopenharmony_ci	.video_inputs = {
39962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
40062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
40162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
40262306a36Sopenharmony_ci	},
40362306a36Sopenharmony_ci	.audio_inputs = {
40462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,
40562306a36Sopenharmony_ci		  MSP_TUNER, CS53L32A_IN0 },
40662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,
40762306a36Sopenharmony_ci		  MSP_SCART1, CS53L32A_IN2 },
40862306a36Sopenharmony_ci	},
40962306a36Sopenharmony_ci	/* This card has no eeprom and in fact the Windows driver relies
41062306a36Sopenharmony_ci	   on the country/region setting of the user to decide which tuner
41162306a36Sopenharmony_ci	   is available. */
41262306a36Sopenharmony_ci	.tuners = {
41362306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
41462306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL - V4L2_STD_NTSC_M_JP,
41562306a36Sopenharmony_ci			.tuner = TUNER_PHILIPS_FM1236_MK3 },
41662306a36Sopenharmony_ci		{ .std = V4L2_STD_NTSC_M_JP, .tuner = TUNER_PHILIPS_FQ1286 },
41762306a36Sopenharmony_ci	},
41862306a36Sopenharmony_ci	.pci_list = ivtv_pci_avc2410,
41962306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
42062306a36Sopenharmony_ci};
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci/* Adaptec VideOh! AVC-2010 card */
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_avc2010[] = {
42762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0092 },
42862306a36Sopenharmony_ci	{ 0, 0, 0 }
42962306a36Sopenharmony_ci};
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_avc2010 = {
43262306a36Sopenharmony_ci	.type = IVTV_CARD_AVC2010,
43362306a36Sopenharmony_ci	.name = "Adaptec VideOh! AVC-2010",
43462306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
43562306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
43662306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CS53L32A,
43762306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CS53L32A,
43862306a36Sopenharmony_ci	.hw_all = IVTV_HW_CS53L32A | IVTV_HW_SAA7115,
43962306a36Sopenharmony_ci	.video_inputs = {
44062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    0, IVTV_SAA71XX_SVIDEO0    },
44162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 0, IVTV_SAA71XX_COMPOSITE3 },
44262306a36Sopenharmony_ci	},
44362306a36Sopenharmony_ci	.audio_inputs = {
44462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CS53L32A_IN2 },
44562306a36Sopenharmony_ci	},
44662306a36Sopenharmony_ci	/* Does not have a tuner */
44762306a36Sopenharmony_ci	.pci_list = ivtv_pci_avc2010,
44862306a36Sopenharmony_ci};
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci/* Nagase Transgear 5000TV card */
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_tg5000tv[] = {
45562306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
45662306a36Sopenharmony_ci	{ 0, 0, 0 }
45762306a36Sopenharmony_ci};
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_tg5000tv = {
46062306a36Sopenharmony_ci	.type = IVTV_CARD_TG5000TV,
46162306a36Sopenharmony_ci	.name = "Nagase Transgear 5000TV",
46262306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
46362306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7114 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
46462306a36Sopenharmony_ci	IVTV_HW_GPIO,
46562306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
46662306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
46762306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER |
46862306a36Sopenharmony_ci		  IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
46962306a36Sopenharmony_ci	.video_inputs = {
47062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0 },
47162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO2 },
47262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
47362306a36Sopenharmony_ci	},
47462306a36Sopenharmony_ci	.audio_inputs = {
47562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
47662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
47762306a36Sopenharmony_ci	},
47862306a36Sopenharmony_ci	.gr_config = UPD64031A_VERTICAL_EXTERNAL,
47962306a36Sopenharmony_ci	.gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
48062306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x8080, .tuner  = 0x8000, .linein = 0x0080 },
48162306a36Sopenharmony_ci	.gpio_audio_mute   = { .mask = 0x6000, .mute   = 0x6000 },
48262306a36Sopenharmony_ci	.gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
48362306a36Sopenharmony_ci			      .lang1 = 0x0300, .lang2  = 0x0000, .both   = 0x0200 },
48462306a36Sopenharmony_ci	.gpio_video_input  = { .mask = 0x0030, .tuner  = 0x0000,
48562306a36Sopenharmony_ci			  .composite = 0x0010, .svideo = 0x0020 },
48662306a36Sopenharmony_ci	.tuners = {
48762306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
48862306a36Sopenharmony_ci	},
48962306a36Sopenharmony_ci	.pci_list = ivtv_pci_tg5000tv,
49062306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
49162306a36Sopenharmony_ci};
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci/* AOpen VA2000MAX-SNT6 card */
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_va2000[] = {
49862306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, 0, 0xff5f },
49962306a36Sopenharmony_ci	{ 0, 0, 0 }
50062306a36Sopenharmony_ci};
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_va2000 = {
50362306a36Sopenharmony_ci	.type = IVTV_CARD_VA2000MAX_SNT6,
50462306a36Sopenharmony_ci	.name = "AOpen VA2000MAX-SNT6",
50562306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
50662306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD6408X,
50762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_MSP34XX,
50862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_MSP34XX,
50962306a36Sopenharmony_ci	.hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
51062306a36Sopenharmony_ci		  IVTV_HW_UPD6408X | IVTV_HW_TUNER,
51162306a36Sopenharmony_ci	.video_inputs = {
51262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
51362306a36Sopenharmony_ci	},
51462306a36Sopenharmony_ci	.audio_inputs = {
51562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER, MSP_TUNER },
51662306a36Sopenharmony_ci	},
51762306a36Sopenharmony_ci	.tuners = {
51862306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
51962306a36Sopenharmony_ci	},
52062306a36Sopenharmony_ci	.pci_list = ivtv_pci_va2000,
52162306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
52262306a36Sopenharmony_ci};
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci/* Yuan MPG600GR/Kuroutoshikou CX23416GYC-STVLP cards */
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_cx23416gyc[] = {
52962306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
53062306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN4, 0x0600 },
53162306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_MELCO, 0x0523 },
53262306a36Sopenharmony_ci	{ 0, 0, 0 }
53362306a36Sopenharmony_ci};
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_cx23416gyc = {
53662306a36Sopenharmony_ci	.type = IVTV_CARD_CX23416GYC,
53762306a36Sopenharmony_ci	.name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP",
53862306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
53962306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO |
54062306a36Sopenharmony_ci		IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
54162306a36Sopenharmony_ci	.hw_audio = IVTV_HW_SAA717X,
54262306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_SAA717X,
54362306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
54462306a36Sopenharmony_ci		  IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
54562306a36Sopenharmony_ci	.video_inputs = {
54662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO3 |
54762306a36Sopenharmony_ci						 IVTV_SAA717X_TUNER_FLAG },
54862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0 },
54962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO3 },
55062306a36Sopenharmony_ci	},
55162306a36Sopenharmony_ci	.audio_inputs = {
55262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
55362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
55462306a36Sopenharmony_ci	},
55562306a36Sopenharmony_ci	.gr_config = UPD64031A_VERTICAL_EXTERNAL,
55662306a36Sopenharmony_ci	.gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
55762306a36Sopenharmony_ci	.gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
55862306a36Sopenharmony_ci			       .composite = 0x0020, .svideo = 0x0020 },
55962306a36Sopenharmony_ci	.gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
56062306a36Sopenharmony_ci			     .f44100 = 0x4000, .f48000 = 0x8000 },
56162306a36Sopenharmony_ci	.tuners = {
56262306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
56362306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
56462306a36Sopenharmony_ci	},
56562306a36Sopenharmony_ci	.pci_list = ivtv_pci_cx23416gyc,
56662306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
56762306a36Sopenharmony_ci};
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_cx23416gyc_nogr = {
57062306a36Sopenharmony_ci	.type = IVTV_CARD_CX23416GYC_NOGR,
57162306a36Sopenharmony_ci	.name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR)",
57262306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
57362306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO | IVTV_HW_UPD6408X,
57462306a36Sopenharmony_ci	.hw_audio = IVTV_HW_SAA717X,
57562306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_SAA717X,
57662306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
57762306a36Sopenharmony_ci		  IVTV_HW_UPD6408X,
57862306a36Sopenharmony_ci	.video_inputs = {
57962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 |
58062306a36Sopenharmony_ci						 IVTV_SAA717X_TUNER_FLAG },
58162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
58262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
58362306a36Sopenharmony_ci	},
58462306a36Sopenharmony_ci	.audio_inputs = {
58562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
58662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
58762306a36Sopenharmony_ci	},
58862306a36Sopenharmony_ci	.gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
58962306a36Sopenharmony_ci	.gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
59062306a36Sopenharmony_ci			       .composite = 0x0020, .svideo = 0x0020 },
59162306a36Sopenharmony_ci	.gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
59262306a36Sopenharmony_ci			     .f44100 = 0x4000, .f48000 = 0x8000 },
59362306a36Sopenharmony_ci	.tuners = {
59462306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
59562306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
59662306a36Sopenharmony_ci	},
59762306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
59862306a36Sopenharmony_ci};
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_cx23416gyc_nogrycs = {
60162306a36Sopenharmony_ci	.type = IVTV_CARD_CX23416GYC_NOGRYCS,
60262306a36Sopenharmony_ci	.name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR/YCS)",
60362306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
60462306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO,
60562306a36Sopenharmony_ci	.hw_audio = IVTV_HW_SAA717X,
60662306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_SAA717X,
60762306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER,
60862306a36Sopenharmony_ci	.video_inputs = {
60962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 |
61062306a36Sopenharmony_ci						 IVTV_SAA717X_TUNER_FLAG },
61162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
61262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
61362306a36Sopenharmony_ci	},
61462306a36Sopenharmony_ci	.audio_inputs = {
61562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
61662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
61762306a36Sopenharmony_ci	},
61862306a36Sopenharmony_ci	.gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
61962306a36Sopenharmony_ci	.gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
62062306a36Sopenharmony_ci			       .composite = 0x0020, .svideo = 0x0020 },
62162306a36Sopenharmony_ci	.gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
62262306a36Sopenharmony_ci			     .f44100 = 0x4000, .f48000 = 0x8000 },
62362306a36Sopenharmony_ci	.tuners = {
62462306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
62562306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
62662306a36Sopenharmony_ci	},
62762306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
62862306a36Sopenharmony_ci};
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci/* I/O Data GV-MVP/RX & GV-MVP/RX2W (dual tuner) cards */
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_gv_mvprx[] = {
63562306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd01e },
63662306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd038 }, /* 2W unit #1 */
63762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd039 }, /* 2W unit #2 */
63862306a36Sopenharmony_ci	{ 0, 0, 0 }
63962306a36Sopenharmony_ci};
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_gv_mvprx = {
64262306a36Sopenharmony_ci	.type = IVTV_CARD_GV_MVPRX,
64362306a36Sopenharmony_ci	.name = "I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner)",
64462306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
64562306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
64662306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
64762306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_WM8739,
64862306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_VP27SMPX |
64962306a36Sopenharmony_ci		  IVTV_HW_TUNER | IVTV_HW_WM8739 |
65062306a36Sopenharmony_ci		  IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
65162306a36Sopenharmony_ci	.video_inputs = {
65262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0    },
65362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO1    },
65462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2    },
65562306a36Sopenharmony_ci	},
65662306a36Sopenharmony_ci	.audio_inputs = {
65762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
65862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
65962306a36Sopenharmony_ci	},
66062306a36Sopenharmony_ci	.gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
66162306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0xffff, .tuner  = 0x0200, .linein = 0x0300 },
66262306a36Sopenharmony_ci	.tuners = {
66362306a36Sopenharmony_ci		/* This card has the Panasonic VP27 tuner */
66462306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PANASONIC_VP27 },
66562306a36Sopenharmony_ci	},
66662306a36Sopenharmony_ci	.pci_list = ivtv_pci_gv_mvprx,
66762306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
66862306a36Sopenharmony_ci};
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_ci/* I/O Data GV-MVP/RX2E card */
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_gv_mvprx2e[] = {
67562306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd025 },
67662306a36Sopenharmony_ci	{0, 0, 0}
67762306a36Sopenharmony_ci};
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_gv_mvprx2e = {
68062306a36Sopenharmony_ci	.type = IVTV_CARD_GV_MVPRX2E,
68162306a36Sopenharmony_ci	.name = "I/O Data GV-MVP/RX2E",
68262306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
68362306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
68462306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
68562306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_WM8739,
68662306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
68762306a36Sopenharmony_ci		  IVTV_HW_VP27SMPX | IVTV_HW_WM8739,
68862306a36Sopenharmony_ci	.video_inputs = {
68962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
69062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
69162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
69262306a36Sopenharmony_ci	},
69362306a36Sopenharmony_ci	.audio_inputs = {
69462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
69562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
69662306a36Sopenharmony_ci	},
69762306a36Sopenharmony_ci	.gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
69862306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0xffff, .tuner  = 0x0200, .linein = 0x0300 },
69962306a36Sopenharmony_ci	.tuners = {
70062306a36Sopenharmony_ci		/* This card has the Panasonic VP27 tuner */
70162306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PANASONIC_VP27 },
70262306a36Sopenharmony_ci	},
70362306a36Sopenharmony_ci	.pci_list = ivtv_pci_gv_mvprx2e,
70462306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
70562306a36Sopenharmony_ci};
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci/* GotVIEW PCI DVD card */
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd[] = {
71262306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
71362306a36Sopenharmony_ci	{ 0, 0, 0 }
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_gotview_pci_dvd = {
71762306a36Sopenharmony_ci	.type = IVTV_CARD_GOTVIEW_PCI_DVD,
71862306a36Sopenharmony_ci	.name = "GotView PCI DVD",
71962306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
72062306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA717X,
72162306a36Sopenharmony_ci	.hw_audio = IVTV_HW_SAA717X,
72262306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_SAA717X,
72362306a36Sopenharmony_ci	.hw_all = IVTV_HW_SAA717X | IVTV_HW_TUNER,
72462306a36Sopenharmony_ci	.video_inputs = {
72562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE1 },  /* pin 116 */
72662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0 },     /* pin 114/109 */
72762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },  /* pin 118 */
72862306a36Sopenharmony_ci	},
72962306a36Sopenharmony_ci	.audio_inputs = {
73062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN0 },
73162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN2 },
73262306a36Sopenharmony_ci	},
73362306a36Sopenharmony_ci	.gpio_init = { .direction = 0xf000, .initial_value = 0xA000 },
73462306a36Sopenharmony_ci	.tuners = {
73562306a36Sopenharmony_ci		/* This card has a Philips FQ1216ME MK3 tuner */
73662306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
73762306a36Sopenharmony_ci	},
73862306a36Sopenharmony_ci	.pci_list = ivtv_pci_gotview_pci_dvd,
73962306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
74062306a36Sopenharmony_ci};
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci/* GotVIEW PCI DVD2 Deluxe card */
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd2[] = {
74762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW1, 0x0600 },
74862306a36Sopenharmony_ci	{ 0, 0, 0 }
74962306a36Sopenharmony_ci};
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_gotview_pci_dvd2 = {
75262306a36Sopenharmony_ci	.type = IVTV_CARD_GOTVIEW_PCI_DVD2,
75362306a36Sopenharmony_ci	.name = "GotView PCI DVD2 Deluxe",
75462306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
75562306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
75662306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
75762306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
75862306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_GPIO,
75962306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
76062306a36Sopenharmony_ci	.video_inputs = {
76162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
76262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
76362306a36Sopenharmony_ci		  CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
76462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
76562306a36Sopenharmony_ci	},
76662306a36Sopenharmony_ci	.audio_inputs = {
76762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5,       0 },
76862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
76962306a36Sopenharmony_ci	},
77062306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
77162306a36Sopenharmony_ci	.gpio_init = { .direction = 0x0800, .initial_value = 0 },
77262306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x0800, .tuner = 0, .linein = 0, .radio = 0x0800 },
77362306a36Sopenharmony_ci	.tuners = {
77462306a36Sopenharmony_ci		/* This card has a Philips FQ1216ME MK5 tuner */
77562306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
77662306a36Sopenharmony_ci	},
77762306a36Sopenharmony_ci	.pci_list = ivtv_pci_gotview_pci_dvd2,
77862306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
77962306a36Sopenharmony_ci};
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci/* Yuan MPC622 miniPCI card */
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_yuan_mpc622[] = {
78662306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN2, 0xd998 },
78762306a36Sopenharmony_ci	{ 0, 0, 0 }
78862306a36Sopenharmony_ci};
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_yuan_mpc622 = {
79162306a36Sopenharmony_ci	.type = IVTV_CARD_YUAN_MPC622,
79262306a36Sopenharmony_ci	.name = "Yuan MPC622",
79362306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
79462306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
79562306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
79662306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
79762306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
79862306a36Sopenharmony_ci	.video_inputs = {
79962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
80062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
80162306a36Sopenharmony_ci		  CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
80262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
80362306a36Sopenharmony_ci	},
80462306a36Sopenharmony_ci	.audio_inputs = {
80562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
80662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
80762306a36Sopenharmony_ci	},
80862306a36Sopenharmony_ci	.gpio_init = { .direction = 0x00ff, .initial_value = 0x0002 },
80962306a36Sopenharmony_ci	.tuners = {
81062306a36Sopenharmony_ci		/* This card has the TDA8290/TDA8275 tuner chips */
81162306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_TDA8290 },
81262306a36Sopenharmony_ci	},
81362306a36Sopenharmony_ci	.pci_list = ivtv_pci_yuan_mpc622,
81462306a36Sopenharmony_ci	.i2c = &ivtv_i2c_tda8290,
81562306a36Sopenharmony_ci};
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci/* DIGITAL COWBOY DCT-MTVP1 card */
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_dctmvtvp1[] = {
82262306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
82362306a36Sopenharmony_ci	{ 0, 0, 0 }
82462306a36Sopenharmony_ci};
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_dctmvtvp1 = {
82762306a36Sopenharmony_ci	.type = IVTV_CARD_DCTMTVP1,
82862306a36Sopenharmony_ci	.name = "Digital Cowboy DCT-MTVP1",
82962306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
83062306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
83162306a36Sopenharmony_ci		IVTV_HW_GPIO,
83262306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
83362306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
83462306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
83562306a36Sopenharmony_ci		IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
83662306a36Sopenharmony_ci	.video_inputs = {
83762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0    },
83862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO2    },
83962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
84062306a36Sopenharmony_ci	},
84162306a36Sopenharmony_ci	.audio_inputs = {
84262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
84362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
84462306a36Sopenharmony_ci	},
84562306a36Sopenharmony_ci	.gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
84662306a36Sopenharmony_ci	.gpio_audio_input  = { .mask = 0x8080, .tuner  = 0x8000, .linein = 0x0080 },
84762306a36Sopenharmony_ci	.gpio_audio_mute   = { .mask = 0x6000, .mute   = 0x6000 },
84862306a36Sopenharmony_ci	.gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
84962306a36Sopenharmony_ci			      .lang1 = 0x0300, .lang2  = 0x0000, .both   = 0x0200 },
85062306a36Sopenharmony_ci	.gpio_video_input  = { .mask = 0x0030, .tuner  = 0x0000,
85162306a36Sopenharmony_ci			       .composite = 0x0010, .svideo = 0x0020},
85262306a36Sopenharmony_ci	.tuners = {
85362306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
85462306a36Sopenharmony_ci	},
85562306a36Sopenharmony_ci	.pci_list = ivtv_pci_dctmvtvp1,
85662306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
85762306a36Sopenharmony_ci};
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci/* Yuan PG600-2/GotView PCI DVD Lite cards */
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_pg600v2[] = {
86462306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
86562306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW2,  0x0600 },
86662306a36Sopenharmony_ci	{ 0, 0, 0 }
86762306a36Sopenharmony_ci};
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_pg600v2 = {
87062306a36Sopenharmony_ci	.type = IVTV_CARD_PG600V2,
87162306a36Sopenharmony_ci	.name = "Yuan PG600-2, GotView PCI DVD Lite",
87262306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
87362306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
87462306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
87562306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
87662306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
87762306a36Sopenharmony_ci	/* XC2028 support apparently works for the Yuan, it's still
87862306a36Sopenharmony_ci	   uncertain whether it also works with the GotView. */
87962306a36Sopenharmony_ci	.video_inputs = {
88062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
88162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
88262306a36Sopenharmony_ci		  CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
88362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
88462306a36Sopenharmony_ci	},
88562306a36Sopenharmony_ci	.audio_inputs = {
88662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
88762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
88862306a36Sopenharmony_ci	},
88962306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
89062306a36Sopenharmony_ci	.xceive_pin = 12,
89162306a36Sopenharmony_ci	.tuners = {
89262306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
89362306a36Sopenharmony_ci	},
89462306a36Sopenharmony_ci	.pci_list = ivtv_pci_pg600v2,
89562306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
89662306a36Sopenharmony_ci};
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci/* Club3D ZAP-TV1x01 cards */
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_club3d[] = {
90362306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
90462306a36Sopenharmony_ci	{ 0, 0, 0 }
90562306a36Sopenharmony_ci};
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_club3d = {
90862306a36Sopenharmony_ci	.type = IVTV_CARD_CLUB3D,
90962306a36Sopenharmony_ci	.name = "Club3D ZAP-TV1x01",
91062306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
91162306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
91262306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
91362306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
91462306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
91562306a36Sopenharmony_ci	.video_inputs = {
91662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
91762306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
91862306a36Sopenharmony_ci		  CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
91962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE3 },
92062306a36Sopenharmony_ci	},
92162306a36Sopenharmony_ci	.audio_inputs = {
92262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
92362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
92462306a36Sopenharmony_ci	},
92562306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
92662306a36Sopenharmony_ci	.xceive_pin = 12,
92762306a36Sopenharmony_ci	.tuners = {
92862306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
92962306a36Sopenharmony_ci	},
93062306a36Sopenharmony_ci	.pci_list = ivtv_pci_club3d,
93162306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
93262306a36Sopenharmony_ci};
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_ci/* AVerTV MCE 116 Plus (M116) card */
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_avertv_mce116[] = {
93962306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc439 },
94062306a36Sopenharmony_ci	{ 0, 0, 0 }
94162306a36Sopenharmony_ci};
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_avertv_mce116 = {
94462306a36Sopenharmony_ci	.type = IVTV_CARD_AVERTV_MCE116,
94562306a36Sopenharmony_ci	.name = "AVerTV MCE 116 Plus",
94662306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
94762306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
94862306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
94962306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
95062306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER | IVTV_HW_WM8739 |
95162306a36Sopenharmony_ci		  IVTV_HW_I2C_IR_RX_AVER,
95262306a36Sopenharmony_ci	.video_inputs = {
95362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
95462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO3    },
95562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
95662306a36Sopenharmony_ci	},
95762306a36Sopenharmony_ci	.audio_inputs = {
95862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
95962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
96062306a36Sopenharmony_ci	},
96162306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5 },
96262306a36Sopenharmony_ci	/* enable line-in */
96362306a36Sopenharmony_ci	.gpio_init = { .direction = 0xe000, .initial_value = 0x4000 },
96462306a36Sopenharmony_ci	.xceive_pin = 10,
96562306a36Sopenharmony_ci	.tuners = {
96662306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
96762306a36Sopenharmony_ci	},
96862306a36Sopenharmony_ci	.pci_list = ivtv_pci_avertv_mce116,
96962306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
97062306a36Sopenharmony_ci};
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_ci/* AVerMedia PVR-150 Plus / AVerTV M113 cards with a Daewoo/Partsnic Tuner */
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_aver_pvr150[] = {
97762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc034 }, /* NTSC */
97862306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc035 }, /* NTSC FM */
97962306a36Sopenharmony_ci	{ 0, 0, 0 }
98062306a36Sopenharmony_ci};
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_aver_pvr150 = {
98362306a36Sopenharmony_ci	.type = IVTV_CARD_AVER_PVR150PLUS,
98462306a36Sopenharmony_ci	.name = "AVerMedia PVR-150 Plus / AVerTV M113 Partsnic (Daewoo) Tuner",
98562306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
98662306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
98762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
98862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
98962306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_GPIO,
99062306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER |
99162306a36Sopenharmony_ci		  IVTV_HW_WM8739 | IVTV_HW_GPIO,
99262306a36Sopenharmony_ci	.video_inputs = {
99362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
99462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO3    },
99562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
99662306a36Sopenharmony_ci	},
99762306a36Sopenharmony_ci	.audio_inputs = {
99862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5,       0 },
99962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
100062306a36Sopenharmony_ci	},
100162306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
100262306a36Sopenharmony_ci	/* The 74HC4052 Dual 4:1 multiplexer is controlled by 2 GPIO lines */
100362306a36Sopenharmony_ci	.gpio_init = { .direction = 0xc000, .initial_value = 0 },
100462306a36Sopenharmony_ci	.gpio_audio_input  = { .mask   = 0xc000,
100562306a36Sopenharmony_ci			       .tuner  = 0x0000,
100662306a36Sopenharmony_ci			       .linein = 0x4000,
100762306a36Sopenharmony_ci			       .radio  = 0x8000 },
100862306a36Sopenharmony_ci	.tuners = {
100962306a36Sopenharmony_ci		/* Subsystem ID's 0xc03[45] have a Partsnic PTI-5NF05 tuner */
101062306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PARTSNIC_PTI_5NF05 },
101162306a36Sopenharmony_ci	},
101262306a36Sopenharmony_ci	.pci_list = ivtv_pci_aver_pvr150,
101362306a36Sopenharmony_ci	/* Subsystem ID 0xc035 has a TEA5767(?) FM tuner, 0xc034 does not */
101462306a36Sopenharmony_ci	.i2c = &ivtv_i2c_radio,
101562306a36Sopenharmony_ci};
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci/* AVerMedia UltraTV 1500 MCE (newer non-cx88 version, M113 variant) card */
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_aver_ultra1500mce[] = {
102262306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc019 }, /* NTSC */
102362306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc01b }, /* PAL/SECAM */
102462306a36Sopenharmony_ci	{ 0, 0, 0 }
102562306a36Sopenharmony_ci};
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_aver_ultra1500mce = {
102862306a36Sopenharmony_ci	.type = IVTV_CARD_AVER_ULTRA1500MCE,
102962306a36Sopenharmony_ci	.name = "AVerMedia UltraTV 1500 MCE / AVerTV M113 Philips Tuner",
103062306a36Sopenharmony_ci	.comment = "For non-NTSC tuners, use the pal= or secam= module options",
103162306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
103262306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
103362306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
103462306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
103562306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_GPIO,
103662306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER |
103762306a36Sopenharmony_ci		  IVTV_HW_WM8739 | IVTV_HW_GPIO,
103862306a36Sopenharmony_ci	.video_inputs = {
103962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
104062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO3    },
104162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
104262306a36Sopenharmony_ci	},
104362306a36Sopenharmony_ci	.audio_inputs = {
104462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5,       0 },
104562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
104662306a36Sopenharmony_ci	},
104762306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
104862306a36Sopenharmony_ci	/* The 74HC4052 Dual 4:1 multiplexer is controlled by 2 GPIO lines */
104962306a36Sopenharmony_ci	.gpio_init = { .direction = 0xc000, .initial_value = 0 },
105062306a36Sopenharmony_ci	.gpio_audio_input  = { .mask   = 0xc000,
105162306a36Sopenharmony_ci			       .tuner  = 0x0000,
105262306a36Sopenharmony_ci			       .linein = 0x4000,
105362306a36Sopenharmony_ci			       .radio  = 0x8000 },
105462306a36Sopenharmony_ci	.tuners = {
105562306a36Sopenharmony_ci		/* The UltraTV 1500 MCE has a Philips FM1236 MK5 TV/FM tuner */
105662306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FM1236_MK3 },
105762306a36Sopenharmony_ci		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216MK5 },
105862306a36Sopenharmony_ci	},
105962306a36Sopenharmony_ci	.pci_list = ivtv_pci_aver_ultra1500mce,
106062306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
106162306a36Sopenharmony_ci};
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci/* AVerMedia EZMaker PCI Deluxe card */
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_aver_ezmaker[] = {
106862306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc03f },
106962306a36Sopenharmony_ci	{ 0, 0, 0 }
107062306a36Sopenharmony_ci};
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_aver_ezmaker = {
107362306a36Sopenharmony_ci	.type = IVTV_CARD_AVER_EZMAKER,
107462306a36Sopenharmony_ci	.name = "AVerMedia EZMaker PCI Deluxe",
107562306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
107662306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
107762306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
107862306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
107962306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_WM8739,
108062306a36Sopenharmony_ci	.video_inputs = {
108162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    0, CX25840_SVIDEO3 },
108262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
108362306a36Sopenharmony_ci	},
108462306a36Sopenharmony_ci	.audio_inputs = {
108562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 0 },
108662306a36Sopenharmony_ci	},
108762306a36Sopenharmony_ci	.gpio_init = { .direction = 0x4000, .initial_value = 0x4000 },
108862306a36Sopenharmony_ci	/* Does not have a tuner */
108962306a36Sopenharmony_ci	.pci_list = ivtv_pci_aver_ezmaker,
109062306a36Sopenharmony_ci};
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci/* ASUS Falcon2 */
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_asus_falcon2[] = {
109762306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b66 },
109862306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x462e },
109962306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b2e },
110062306a36Sopenharmony_ci	{ 0, 0, 0 }
110162306a36Sopenharmony_ci};
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_asus_falcon2 = {
110462306a36Sopenharmony_ci	.type = IVTV_CARD_ASUS_FALCON2,
110562306a36Sopenharmony_ci	.name = "ASUS Falcon2",
110662306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
110762306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
110862306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
110962306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
111062306a36Sopenharmony_ci	.hw_muxer = IVTV_HW_M52790,
111162306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_M52790 | IVTV_HW_TUNER,
111262306a36Sopenharmony_ci	.video_inputs = {
111362306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
111462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO3    },
111562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 2, CX25840_COMPOSITE2 },
111662306a36Sopenharmony_ci	},
111762306a36Sopenharmony_ci	.audio_inputs = {
111862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, M52790_IN_TUNER },
111962306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL,
112062306a36Sopenharmony_ci			M52790_IN_V2 | M52790_SW1_YCMIX | M52790_SW2_YCMIX },
112162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, M52790_IN_V2 },
112262306a36Sopenharmony_ci	},
112362306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, M52790_IN_TUNER },
112462306a36Sopenharmony_ci	.tuners = {
112562306a36Sopenharmony_ci		{ .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FM1236_MK3 },
112662306a36Sopenharmony_ci	},
112762306a36Sopenharmony_ci	.pci_list = ivtv_pci_asus_falcon2,
112862306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
112962306a36Sopenharmony_ci};
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_ci/* AVerMedia M104 miniPCI card */
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_aver_m104[] = {
113662306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc136 },
113762306a36Sopenharmony_ci	{ 0, 0, 0 }
113862306a36Sopenharmony_ci};
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_aver_m104 = {
114162306a36Sopenharmony_ci	.type = IVTV_CARD_AVER_M104,
114262306a36Sopenharmony_ci	.name = "AVerMedia M104",
114362306a36Sopenharmony_ci	.comment = "Not yet supported!\n",
114462306a36Sopenharmony_ci	.v4l2_capabilities = 0, /*IVTV_CAP_ENCODER,*/
114562306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
114662306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
114762306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
114862306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER | IVTV_HW_WM8739,
114962306a36Sopenharmony_ci	.video_inputs = {
115062306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    0, CX25840_SVIDEO3    },
115162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
115262306a36Sopenharmony_ci	},
115362306a36Sopenharmony_ci	.audio_inputs = {
115462306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
115562306a36Sopenharmony_ci	},
115662306a36Sopenharmony_ci	.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
115762306a36Sopenharmony_ci	/* enable line-in + reset tuner */
115862306a36Sopenharmony_ci	.gpio_init = { .direction = 0xe000, .initial_value = 0x4000 },
115962306a36Sopenharmony_ci	.xceive_pin = 10,
116062306a36Sopenharmony_ci	.tuners = {
116162306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
116262306a36Sopenharmony_ci	},
116362306a36Sopenharmony_ci	.pci_list = ivtv_pci_aver_m104,
116462306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
116562306a36Sopenharmony_ci};
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_ci/* Buffalo PC-MV5L/PCI cards */
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_buffalo[] = {
117262306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_MELCO, 0x052b },
117362306a36Sopenharmony_ci	{ 0, 0, 0 }
117462306a36Sopenharmony_ci};
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_buffalo = {
117762306a36Sopenharmony_ci	.type = IVTV_CARD_BUFFALO_MV5L,
117862306a36Sopenharmony_ci	.name = "Buffalo PC-MV5L/PCI",
117962306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
118062306a36Sopenharmony_ci	.hw_video = IVTV_HW_CX25840,
118162306a36Sopenharmony_ci	.hw_audio = IVTV_HW_CX25840,
118262306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_CX25840,
118362306a36Sopenharmony_ci	.hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
118462306a36Sopenharmony_ci	.video_inputs = {
118562306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
118662306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_SVIDEO1,    1,
118762306a36Sopenharmony_ci			CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
118862306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
118962306a36Sopenharmony_ci	},
119062306a36Sopenharmony_ci	.audio_inputs = {
119162306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
119262306a36Sopenharmony_ci		{ IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
119362306a36Sopenharmony_ci	},
119462306a36Sopenharmony_ci	.xceive_pin = 12,
119562306a36Sopenharmony_ci	.tuners = {
119662306a36Sopenharmony_ci		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
119762306a36Sopenharmony_ci	},
119862306a36Sopenharmony_ci	.pci_list = ivtv_pci_buffalo,
119962306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
120062306a36Sopenharmony_ci};
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */
120362306a36Sopenharmony_ci/* Sony Kikyou */
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_cistatic const struct ivtv_card_pci_info ivtv_pci_kikyou[] = {
120662306a36Sopenharmony_ci	{ PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_SONY, 0x813d },
120762306a36Sopenharmony_ci	{ 0, 0, 0 }
120862306a36Sopenharmony_ci};
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_cistatic const struct ivtv_card ivtv_card_kikyou = {
121162306a36Sopenharmony_ci	.type = IVTV_CARD_KIKYOU,
121262306a36Sopenharmony_ci	.name = "Sony VAIO Giga Pocket (ENX Kikyou)",
121362306a36Sopenharmony_ci	.v4l2_capabilities = IVTV_CAP_ENCODER,
121462306a36Sopenharmony_ci	.hw_video = IVTV_HW_SAA7115,
121562306a36Sopenharmony_ci	.hw_audio = IVTV_HW_GPIO,
121662306a36Sopenharmony_ci	.hw_audio_ctrl = IVTV_HW_GPIO,
121762306a36Sopenharmony_ci	.hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER,
121862306a36Sopenharmony_ci	.video_inputs = {
121962306a36Sopenharmony_ci	{ IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE1 },
122062306a36Sopenharmony_ci	{ IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE1 },
122162306a36Sopenharmony_ci	{ IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO1 },
122262306a36Sopenharmony_ci	},
122362306a36Sopenharmony_ci	.audio_inputs = {
122462306a36Sopenharmony_ci	     { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER },
122562306a36Sopenharmony_ci	     { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
122662306a36Sopenharmony_ci	     { IVTV_CARD_INPUT_LINE_IN2,   IVTV_GPIO_LINE_IN },
122762306a36Sopenharmony_ci	},
122862306a36Sopenharmony_ci	.gpio_init = { .direction = 0x03e1, .initial_value = 0x0320 },
122962306a36Sopenharmony_ci	.gpio_audio_input = { .mask   = 0x0060,
123062306a36Sopenharmony_ci			      .tuner  = 0x0020,
123162306a36Sopenharmony_ci			      .linein = 0x0000,
123262306a36Sopenharmony_ci			      .radio  = 0x0060 },
123362306a36Sopenharmony_ci	.gpio_audio_mute  = { .mask = 0x0000,
123462306a36Sopenharmony_ci			      .mute = 0x0000 }, /* 0x200? Disable for now. */
123562306a36Sopenharmony_ci	.gpio_audio_mode  = { .mask   = 0x0080,
123662306a36Sopenharmony_ci			      .mono   = 0x0000,
123762306a36Sopenharmony_ci			      .stereo = 0x0000, /* SAP */
123862306a36Sopenharmony_ci			      .lang1  = 0x0080,
123962306a36Sopenharmony_ci			      .lang2  = 0x0000,
124062306a36Sopenharmony_ci			      .both   = 0x0080 },
124162306a36Sopenharmony_ci	.tuners = {
124262306a36Sopenharmony_ci	     { .std = V4L2_STD_ALL, .tuner = TUNER_SONY_BTF_PXN01Z },
124362306a36Sopenharmony_ci	},
124462306a36Sopenharmony_ci	.pci_list = ivtv_pci_kikyou,
124562306a36Sopenharmony_ci	.i2c = &ivtv_i2c_std,
124662306a36Sopenharmony_ci};
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_cistatic const struct ivtv_card *ivtv_card_list[] = {
125062306a36Sopenharmony_ci	&ivtv_card_pvr250,
125162306a36Sopenharmony_ci	&ivtv_card_pvr350,
125262306a36Sopenharmony_ci	&ivtv_card_pvr150,
125362306a36Sopenharmony_ci	&ivtv_card_m179,
125462306a36Sopenharmony_ci	&ivtv_card_mpg600,
125562306a36Sopenharmony_ci	&ivtv_card_mpg160,
125662306a36Sopenharmony_ci	&ivtv_card_pg600,
125762306a36Sopenharmony_ci	&ivtv_card_avc2410,
125862306a36Sopenharmony_ci	&ivtv_card_avc2010,
125962306a36Sopenharmony_ci	&ivtv_card_tg5000tv,
126062306a36Sopenharmony_ci	&ivtv_card_va2000,
126162306a36Sopenharmony_ci	&ivtv_card_cx23416gyc,
126262306a36Sopenharmony_ci	&ivtv_card_gv_mvprx,
126362306a36Sopenharmony_ci	&ivtv_card_gv_mvprx2e,
126462306a36Sopenharmony_ci	&ivtv_card_gotview_pci_dvd,
126562306a36Sopenharmony_ci	&ivtv_card_gotview_pci_dvd2,
126662306a36Sopenharmony_ci	&ivtv_card_yuan_mpc622,
126762306a36Sopenharmony_ci	&ivtv_card_dctmvtvp1,
126862306a36Sopenharmony_ci	&ivtv_card_pg600v2,
126962306a36Sopenharmony_ci	&ivtv_card_club3d,
127062306a36Sopenharmony_ci	&ivtv_card_avertv_mce116,
127162306a36Sopenharmony_ci	&ivtv_card_asus_falcon2,
127262306a36Sopenharmony_ci	&ivtv_card_aver_pvr150,
127362306a36Sopenharmony_ci	&ivtv_card_aver_ezmaker,
127462306a36Sopenharmony_ci	&ivtv_card_aver_m104,
127562306a36Sopenharmony_ci	&ivtv_card_buffalo,
127662306a36Sopenharmony_ci	&ivtv_card_aver_ultra1500mce,
127762306a36Sopenharmony_ci	&ivtv_card_kikyou,
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci	/* Variations of standard cards but with the same PCI IDs.
128062306a36Sopenharmony_ci	   These cards must come last in this list. */
128162306a36Sopenharmony_ci	&ivtv_card_pvr350_v1,
128262306a36Sopenharmony_ci	&ivtv_card_cx23416gyc_nogr,
128362306a36Sopenharmony_ci	&ivtv_card_cx23416gyc_nogrycs,
128462306a36Sopenharmony_ci};
128562306a36Sopenharmony_ci
128662306a36Sopenharmony_ciconst struct ivtv_card *ivtv_get_card(u16 index)
128762306a36Sopenharmony_ci{
128862306a36Sopenharmony_ci	if (index >= ARRAY_SIZE(ivtv_card_list))
128962306a36Sopenharmony_ci		return NULL;
129062306a36Sopenharmony_ci	return ivtv_card_list[index];
129162306a36Sopenharmony_ci}
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_ciint ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input)
129462306a36Sopenharmony_ci{
129562306a36Sopenharmony_ci	const struct ivtv_card_video_input *card_input = itv->card->video_inputs + index;
129662306a36Sopenharmony_ci	static const char * const input_strs[] = {
129762306a36Sopenharmony_ci		"Tuner 1",
129862306a36Sopenharmony_ci		"S-Video 1",
129962306a36Sopenharmony_ci		"S-Video 2",
130062306a36Sopenharmony_ci		"Composite 1",
130162306a36Sopenharmony_ci		"Composite 2",
130262306a36Sopenharmony_ci		"Composite 3"
130362306a36Sopenharmony_ci	};
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci	if (index >= itv->nof_inputs)
130662306a36Sopenharmony_ci		return -EINVAL;
130762306a36Sopenharmony_ci	input->index = index;
130862306a36Sopenharmony_ci	strscpy(input->name, input_strs[card_input->video_type - 1],
130962306a36Sopenharmony_ci		sizeof(input->name));
131062306a36Sopenharmony_ci	input->type = (card_input->video_type == IVTV_CARD_INPUT_VID_TUNER ?
131162306a36Sopenharmony_ci			V4L2_INPUT_TYPE_TUNER : V4L2_INPUT_TYPE_CAMERA);
131262306a36Sopenharmony_ci	input->audioset = (1 << itv->nof_audio_inputs) - 1;
131362306a36Sopenharmony_ci	input->std = (input->type == V4L2_INPUT_TYPE_TUNER) ?
131462306a36Sopenharmony_ci				itv->tuner_std : V4L2_STD_ALL;
131562306a36Sopenharmony_ci	return 0;
131662306a36Sopenharmony_ci}
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ciint ivtv_get_output(struct ivtv *itv, u16 index, struct v4l2_output *output)
131962306a36Sopenharmony_ci{
132062306a36Sopenharmony_ci	const struct ivtv_card_output *card_output = itv->card->video_outputs + index;
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	if (index >= itv->card->nof_outputs)
132362306a36Sopenharmony_ci		return -EINVAL;
132462306a36Sopenharmony_ci	output->index = index;
132562306a36Sopenharmony_ci	strscpy(output->name, card_output->name, sizeof(output->name));
132662306a36Sopenharmony_ci	output->type = V4L2_OUTPUT_TYPE_ANALOG;
132762306a36Sopenharmony_ci	output->audioset = 1;
132862306a36Sopenharmony_ci	output->std = V4L2_STD_ALL;
132962306a36Sopenharmony_ci	return 0;
133062306a36Sopenharmony_ci}
133162306a36Sopenharmony_ci
133262306a36Sopenharmony_ciint ivtv_get_audio_input(struct ivtv *itv, u16 index, struct v4l2_audio *audio)
133362306a36Sopenharmony_ci{
133462306a36Sopenharmony_ci	const struct ivtv_card_audio_input *aud_input = itv->card->audio_inputs + index;
133562306a36Sopenharmony_ci	static const char * const input_strs[] = {
133662306a36Sopenharmony_ci		"Tuner 1",
133762306a36Sopenharmony_ci		"Line In 1",
133862306a36Sopenharmony_ci		"Line In 2"
133962306a36Sopenharmony_ci	};
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci	memset(audio, 0, sizeof(*audio));
134262306a36Sopenharmony_ci	if (index >= itv->nof_audio_inputs)
134362306a36Sopenharmony_ci		return -EINVAL;
134462306a36Sopenharmony_ci	strscpy(audio->name, input_strs[aud_input->audio_type - 1],
134562306a36Sopenharmony_ci		sizeof(audio->name));
134662306a36Sopenharmony_ci	audio->index = index;
134762306a36Sopenharmony_ci	audio->capability = V4L2_AUDCAP_STEREO;
134862306a36Sopenharmony_ci	return 0;
134962306a36Sopenharmony_ci}
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ciint ivtv_get_audio_output(struct ivtv *itv, u16 index, struct v4l2_audioout *aud_output)
135262306a36Sopenharmony_ci{
135362306a36Sopenharmony_ci	memset(aud_output, 0, sizeof(*aud_output));
135462306a36Sopenharmony_ci	if (itv->card->video_outputs == NULL || index != 0)
135562306a36Sopenharmony_ci		return -EINVAL;
135662306a36Sopenharmony_ci	strscpy(aud_output->name, "A/V Audio Out", sizeof(aud_output->name));
135762306a36Sopenharmony_ci	return 0;
135862306a36Sopenharmony_ci}
1359