Commit 10a34367 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: cx25840: Address several coding style issues

As we did a major change on this file, let's take the moment
to cleanup several coding style issues on it.

This patch was partially done with the help of two tools:

	./scripts/checkpatch.pl --fix-inplace --strict
	astyle --indent=tab=8 --style=linux

But manually adjusted in order to fit our style.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 63f9fa92
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -76,17 +75,17 @@ MODULE_LICENSE("GPL"); ...@@ -76,17 +75,17 @@ MODULE_LICENSE("GPL");
static int cx25840_debug; static int cx25840_debug;
module_param_named(debug,cx25840_debug, int, 0644); module_param_named(debug, cx25840_debug, int, 0644);
MODULE_PARM_DESC(debug, "Debugging messages [0=Off (default) 1=On]"); MODULE_PARM_DESC(debug, "Debugging messages [0=Off (default) 1=On]");
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static void cx23888_std_setup(struct i2c_client *client); static void cx23888_std_setup(struct i2c_client *client);
int cx25840_write(struct i2c_client *client, u16 addr, u8 value) int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
{ {
u8 buffer[3]; u8 buffer[3];
buffer[0] = addr >> 8; buffer[0] = addr >> 8;
buffer[1] = addr & 0xff; buffer[1] = addr & 0xff;
buffer[2] = value; buffer[2] = value;
...@@ -96,6 +95,7 @@ int cx25840_write(struct i2c_client *client, u16 addr, u8 value) ...@@ -96,6 +95,7 @@ int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
int cx25840_write4(struct i2c_client *client, u16 addr, u32 value) int cx25840_write4(struct i2c_client *client, u16 addr, u32 value)
{ {
u8 buffer[6]; u8 buffer[6];
buffer[0] = addr >> 8; buffer[0] = addr >> 8;
buffer[1] = addr & 0xff; buffer[1] = addr & 0xff;
buffer[2] = value & 0xff; buffer[2] = value & 0xff;
...@@ -105,7 +105,7 @@ int cx25840_write4(struct i2c_client *client, u16 addr, u32 value) ...@@ -105,7 +105,7 @@ int cx25840_write4(struct i2c_client *client, u16 addr, u32 value)
return i2c_master_send(client, buffer, 6); return i2c_master_send(client, buffer, 6);
} }
u8 cx25840_read(struct i2c_client * client, u16 addr) u8 cx25840_read(struct i2c_client *client, u16 addr)
{ {
struct i2c_msg msgs[2]; struct i2c_msg msgs[2];
u8 tx_buf[2], rx_buf[1]; u8 tx_buf[2], rx_buf[1];
...@@ -116,13 +116,13 @@ u8 cx25840_read(struct i2c_client * client, u16 addr) ...@@ -116,13 +116,13 @@ u8 cx25840_read(struct i2c_client * client, u16 addr)
msgs[0].addr = client->addr; msgs[0].addr = client->addr;
msgs[0].flags = 0; msgs[0].flags = 0;
msgs[0].len = 2; msgs[0].len = 2;
msgs[0].buf = (char *) tx_buf; msgs[0].buf = (char *)tx_buf;
/* Read data from register */ /* Read data from register */
msgs[1].addr = client->addr; msgs[1].addr = client->addr;
msgs[1].flags = I2C_M_RD; msgs[1].flags = I2C_M_RD;
msgs[1].len = 1; msgs[1].len = 1;
msgs[1].buf = (char *) rx_buf; msgs[1].buf = (char *)rx_buf;
if (i2c_transfer(client->adapter, msgs, 2) < 2) if (i2c_transfer(client->adapter, msgs, 2) < 2)
return 0; return 0;
...@@ -130,7 +130,7 @@ u8 cx25840_read(struct i2c_client * client, u16 addr) ...@@ -130,7 +130,7 @@ u8 cx25840_read(struct i2c_client * client, u16 addr)
return rx_buf[0]; return rx_buf[0];
} }
u32 cx25840_read4(struct i2c_client * client, u16 addr) u32 cx25840_read4(struct i2c_client *client, u16 addr)
{ {
struct i2c_msg msgs[2]; struct i2c_msg msgs[2];
u8 tx_buf[2], rx_buf[4]; u8 tx_buf[2], rx_buf[4];
...@@ -141,13 +141,13 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr) ...@@ -141,13 +141,13 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr)
msgs[0].addr = client->addr; msgs[0].addr = client->addr;
msgs[0].flags = 0; msgs[0].flags = 0;
msgs[0].len = 2; msgs[0].len = 2;
msgs[0].buf = (char *) tx_buf; msgs[0].buf = (char *)tx_buf;
/* Read data from registers */ /* Read data from registers */
msgs[1].addr = client->addr; msgs[1].addr = client->addr;
msgs[1].flags = I2C_M_RD; msgs[1].flags = I2C_M_RD;
msgs[1].len = 4; msgs[1].len = 4;
msgs[1].buf = (char *) rx_buf; msgs[1].buf = (char *)rx_buf;
if (i2c_transfer(client->adapter, msgs, 2) < 2) if (i2c_transfer(client->adapter, msgs, 2) < 2)
return 0; return 0;
...@@ -156,7 +156,7 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr) ...@@ -156,7 +156,7 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr)
rx_buf[0]; rx_buf[0];
} }
int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask, int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned int and_mask,
u8 or_value) u8 or_value)
{ {
return cx25840_write(client, addr, return cx25840_write(client, addr,
...@@ -174,7 +174,8 @@ int cx25840_and_or4(struct i2c_client *client, u16 addr, u32 and_mask, ...@@ -174,7 +174,8 @@ int cx25840_and_or4(struct i2c_client *client, u16 addr, u32 and_mask,
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input, static int set_input(struct i2c_client *client,
enum cx25840_video_input vid_input,
enum cx25840_audio_input aud_input); enum cx25840_audio_input aud_input);
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
...@@ -411,7 +412,6 @@ static int cx25840_s_io_pin_config(struct v4l2_subdev *sd, size_t n, ...@@ -411,7 +412,6 @@ static int cx25840_s_io_pin_config(struct v4l2_subdev *sd, size_t n,
if (strength != CX25840_PIN_DRIVE_SLOW && if (strength != CX25840_PIN_DRIVE_SLOW &&
strength != CX25840_PIN_DRIVE_MEDIUM && strength != CX25840_PIN_DRIVE_MEDIUM &&
strength != CX25840_PIN_DRIVE_FAST) { strength != CX25840_PIN_DRIVE_FAST) {
v4l_err(client, v4l_err(client,
"invalid drive speed for pin %u (%u), assuming fast\n", "invalid drive speed for pin %u (%u), assuming fast\n",
(unsigned int)p[i].pin, (unsigned int)p[i].pin,
...@@ -546,8 +546,10 @@ static int common_s_io_pin_config(struct v4l2_subdev *sd, size_t n, ...@@ -546,8 +546,10 @@ static int common_s_io_pin_config(struct v4l2_subdev *sd, size_t n,
static void init_dll1(struct i2c_client *client) static void init_dll1(struct i2c_client *client)
{ {
/* This is the Hauppauge sequence used to /*
* initialize the Delay Lock Loop 1 (ADC DLL). */ * This is the Hauppauge sequence used to
* initialize the Delay Lock Loop 1 (ADC DLL).
*/
cx25840_write(client, 0x159, 0x23); cx25840_write(client, 0x159, 0x23);
cx25840_write(client, 0x15a, 0x87); cx25840_write(client, 0x15a, 0x87);
cx25840_write(client, 0x15b, 0x06); cx25840_write(client, 0x15b, 0x06);
...@@ -562,8 +564,10 @@ static void init_dll1(struct i2c_client *client) ...@@ -562,8 +564,10 @@ static void init_dll1(struct i2c_client *client)
static void init_dll2(struct i2c_client *client) static void init_dll2(struct i2c_client *client)
{ {
/* This is the Hauppauge sequence used to /*
* initialize the Delay Lock Loop 2 (ADC DLL). */ * This is the Hauppauge sequence used to
* initialize the Delay Lock Loop 2 (ADC DLL).
*/
cx25840_write(client, 0x15d, 0xe3); cx25840_write(client, 0x15d, 0xe3);
cx25840_write(client, 0x15e, 0x86); cx25840_write(client, 0x15e, 0x86);
cx25840_write(client, 0x15f, 0x06); cx25840_write(client, 0x15f, 0x06);
...@@ -575,7 +579,11 @@ static void init_dll2(struct i2c_client *client) ...@@ -575,7 +579,11 @@ static void init_dll2(struct i2c_client *client)
static void cx25836_initialize(struct i2c_client *client) static void cx25836_initialize(struct i2c_client *client)
{ {
/* reset configuration is described on page 3-77 of the CX25836 datasheet */ /*
*reset configuration is described on page 3-77
* of the CX25836 datasheet
*/
/* 2. */ /* 2. */
cx25840_and_or(client, 0x000, ~0x01, 0x01); cx25840_and_or(client, 0x000, ~0x01, 0x01);
cx25840_and_or(client, 0x000, ~0x01, 0x00); cx25840_and_or(client, 0x000, ~0x01, 0x00);
...@@ -601,6 +609,7 @@ static void cx25836_initialize(struct i2c_client *client) ...@@ -601,6 +609,7 @@ static void cx25836_initialize(struct i2c_client *client)
static void cx25840_work_handler(struct work_struct *work) static void cx25840_work_handler(struct work_struct *work)
{ {
struct cx25840_state *state = container_of(work, struct cx25840_state, fw_work); struct cx25840_state *state = container_of(work, struct cx25840_state, fw_work);
cx25840_loadfw(state->c); cx25840_loadfw(state->c);
wake_up(&state->fw_wait); wake_up(&state->fw_wait);
} }
...@@ -699,8 +708,10 @@ static void cx25840_initialize(struct i2c_client *client) ...@@ -699,8 +708,10 @@ static void cx25840_initialize(struct i2c_client *client)
/* datasheet startup in numbered steps, refer to page 3-77 */ /* datasheet startup in numbered steps, refer to page 3-77 */
/* 2. */ /* 2. */
cx25840_and_or(client, 0x803, ~0x10, 0x00); cx25840_and_or(client, 0x803, ~0x10, 0x00);
/* The default of this register should be 4, but I get 0 instead. /*
* Set this register to 4 manually. */ * The default of this register should be 4, but I get 0 instead.
* Set this register to 4 manually.
*/
cx25840_write(client, 0x000, 0x04); cx25840_write(client, 0x000, 0x04);
/* 3. */ /* 3. */
init_dll1(client); init_dll1(client);
...@@ -710,10 +721,12 @@ static void cx25840_initialize(struct i2c_client *client) ...@@ -710,10 +721,12 @@ static void cx25840_initialize(struct i2c_client *client)
cx25840_write(client, 0x13c, 0x01); cx25840_write(client, 0x13c, 0x01);
cx25840_write(client, 0x13c, 0x00); cx25840_write(client, 0x13c, 0x00);
/* 5. */ /* 5. */
/* Do the firmware load in a work handler to prevent. /*
Otherwise the kernel is blocked waiting for the * Do the firmware load in a work handler to prevent.
bit-banging i2c interface to finish uploading the * Otherwise the kernel is blocked waiting for the
firmware. */ * bit-banging i2c interface to finish uploading the
* firmware.
*/
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
...@@ -945,10 +958,12 @@ static void cx23885_initialize(struct i2c_client *client) ...@@ -945,10 +958,12 @@ static void cx23885_initialize(struct i2c_client *client)
cx25840_write(client, 0x160, 0x1d); cx25840_write(client, 0x160, 0x1d);
cx25840_write(client, 0x164, 0x00); cx25840_write(client, 0x164, 0x00);
/* Do the firmware load in a work handler to prevent. /*
Otherwise the kernel is blocked waiting for the * Do the firmware load in a work handler to prevent.
bit-banging i2c interface to finish uploading the * Otherwise the kernel is blocked waiting for the
firmware. */ * bit-banging i2c interface to finish uploading the
* firmware.
*/
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
...@@ -960,7 +975,8 @@ static void cx23885_initialize(struct i2c_client *client) ...@@ -960,7 +975,8 @@ static void cx23885_initialize(struct i2c_client *client)
destroy_workqueue(q); destroy_workqueue(q);
} }
/* Call the cx23888 specific std setup func, we no longer rely on /*
* Call the cx23888 specific std setup func, we no longer rely on
* the generic cx24840 func. * the generic cx24840 func.
*/ */
if (is_cx23888(state)) if (is_cx23888(state))
...@@ -982,7 +998,9 @@ static void cx23885_initialize(struct i2c_client *client) ...@@ -982,7 +998,9 @@ static void cx23885_initialize(struct i2c_client *client)
cx25840_write(client, CX25840_AUD_INT_STAT_REG, 0xff); cx25840_write(client, CX25840_AUD_INT_STAT_REG, 0xff);
/* CC raw enable */ /* CC raw enable */
/* - VIP 1.1 control codes - 10bit, blue field enable.
/*
* - VIP 1.1 control codes - 10bit, blue field enable.
* - enable raw data during vertical blanking. * - enable raw data during vertical blanking.
* - enable ancillary Data insertion for 656 or VIP. * - enable ancillary Data insertion for 656 or VIP.
*/ */
...@@ -1065,10 +1083,12 @@ static void cx231xx_initialize(struct i2c_client *client) ...@@ -1065,10 +1083,12 @@ static void cx231xx_initialize(struct i2c_client *client)
/* White crush, Chroma AGC & Chroma Killer enabled */ /* White crush, Chroma AGC & Chroma Killer enabled */
cx25840_write(client, 0x401, 0xe8); cx25840_write(client, 0x401, 0xe8);
/* Do the firmware load in a work handler to prevent. /*
Otherwise the kernel is blocked waiting for the * Do the firmware load in a work handler to prevent.
bit-banging i2c interface to finish uploading the * Otherwise the kernel is blocked waiting for the
firmware. */ * bit-banging i2c interface to finish uploading the
* firmware.
*/
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
...@@ -1164,8 +1184,9 @@ void cx25840_std_setup(struct i2c_client *client) ...@@ -1164,8 +1184,9 @@ void cx25840_std_setup(struct i2c_client *client)
vblank = 26; vblank = 26;
vblank656 = 26; vblank656 = 26;
burst = 0x5b; burst = 0x5b;
} else } else {
burst = 0x59; burst = 0x59;
}
luma_lpf = 2; luma_lpf = 2;
comb = 0x20; comb = 0x20;
sc = 688739; sc = 688739;
...@@ -1200,9 +1221,11 @@ void cx25840_std_setup(struct i2c_client *client) ...@@ -1200,9 +1221,11 @@ void cx25840_std_setup(struct i2c_client *client)
int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L; int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
pll /= pll_post; pll /= pll_post;
v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n", v4l_dbg(1, cx25840_debug, client,
"PLL = %d.%06d MHz\n",
pll / 1000000, pll % 1000000); pll / 1000000, pll % 1000000);
v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n", v4l_dbg(1, cx25840_debug, client,
"PLL/8 = %d.%06d MHz\n",
pll / 8000000, (pll / 8) % 1000000); pll / 8000000, (pll / 8) % 1000000);
fin = ((u64)src_decimation * pll) >> 12; fin = ((u64)src_decimation * pll) >> 12;
...@@ -1215,9 +1238,11 @@ void cx25840_std_setup(struct i2c_client *client) ...@@ -1215,9 +1238,11 @@ void cx25840_std_setup(struct i2c_client *client)
"Chroma sub-carrier freq = %d.%06d MHz\n", "Chroma sub-carrier freq = %d.%06d MHz\n",
fsc / 1000000, fsc % 1000000); fsc / 1000000, fsc % 1000000);
v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, vblank %i, vactive %i, vblank656 %i, src_dec %i, burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, sc 0x%06x\n", v4l_dbg(1, cx25840_debug, client,
"hblank %i, hactive %i, vblank %i, vactive %i, vblank656 %i, src_dec %i, burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, sc 0x%06x\n",
hblank, hactive, vblank, vactive, vblank656, hblank, hactive, vblank, vactive, vblank656,
src_decimation, burst, luma_lpf, uv_lpf, comb, sc); src_decimation, burst, luma_lpf, uv_lpf,
comb, sc);
} }
} }
...@@ -1272,10 +1297,10 @@ static void input_change(struct i2c_client *client) ...@@ -1272,10 +1297,10 @@ static void input_change(struct i2c_client *client)
/* Follow step 8c and 8d of section 3.16 in the cx25840 datasheet */ /* Follow step 8c and 8d of section 3.16 in the cx25840 datasheet */
if (std & V4L2_STD_SECAM) { if (std & V4L2_STD_SECAM) {
cx25840_write(client, 0x402, 0); cx25840_write(client, 0x402, 0);
} } else {
else {
cx25840_write(client, 0x402, 0x04); cx25840_write(client, 0x402, 0x04);
cx25840_write(client, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11); cx25840_write(client, 0x49f,
(std & V4L2_STD_NTSC) ? 0x14 : 0x11);
} }
cx25840_and_or(client, 0x401, ~0x60, 0); cx25840_and_or(client, 0x401, ~0x60, 0);
cx25840_and_or(client, 0x401, ~0x60, 0x60); cx25840_and_or(client, 0x401, ~0x60, 0x60);
...@@ -1289,13 +1314,14 @@ static void input_change(struct i2c_client *client) ...@@ -1289,13 +1314,14 @@ static void input_change(struct i2c_client *client)
if (state->radio) { if (state->radio) {
cx25840_write(client, 0x808, 0xf9); cx25840_write(client, 0x808, 0xf9);
cx25840_write(client, 0x80b, 0x00); cx25840_write(client, 0x80b, 0x00);
} } else if (std & V4L2_STD_525_60) {
else if (std & V4L2_STD_525_60) { /*
/* Certain Hauppauge PVR150 models have a hardware bug * Certain Hauppauge PVR150 models have a hardware bug
that causes audio to drop out. For these models the * that causes audio to drop out. For these models the
audio standard must be set explicitly. * audio standard must be set explicitly.
To be precise: it affects cards with tuner models * To be precise: it affects cards with tuner models
85, 99 and 112 (model numbers from tveeprom). */ * 85, 99 and 112 (model numbers from tveeprom).
*/
int hw_fix = state->pvr150_workaround; int hw_fix = state->pvr150_workaround;
if (std == V4L2_STD_NTSC_M_JP) { if (std == V4L2_STD_NTSC_M_JP) {
...@@ -1312,16 +1338,20 @@ static void input_change(struct i2c_client *client) ...@@ -1312,16 +1338,20 @@ static void input_change(struct i2c_client *client)
} else if (std & V4L2_STD_PAL) { } else if (std & V4L2_STD_PAL) {
/* Autodetect audio standard and audio system */ /* Autodetect audio standard and audio system */
cx25840_write(client, 0x808, 0xff); cx25840_write(client, 0x808, 0xff);
/* Since system PAL-L is pretty much non-existent and /*
not used by any public broadcast network, force * Since system PAL-L is pretty much non-existent and
6.5 MHz carrier to be interpreted as System DK, * not used by any public broadcast network, force
this avoids DK audio detection instability */ * 6.5 MHz carrier to be interpreted as System DK,
* this avoids DK audio detection instability
*/
cx25840_write(client, 0x80b, 0x00); cx25840_write(client, 0x80b, 0x00);
} else if (std & V4L2_STD_SECAM) { } else if (std & V4L2_STD_SECAM) {
/* Autodetect audio standard and audio system */ /* Autodetect audio standard and audio system */
cx25840_write(client, 0x808, 0xff); cx25840_write(client, 0x808, 0xff);
/* If only one of SECAM-DK / SECAM-L is required, then force /*
6.5MHz carrier, else autodetect it */ * If only one of SECAM-DK / SECAM-L is required, then force
* 6.5MHz carrier, else autodetect it
*/
if ((std & V4L2_STD_SECAM_DK) && if ((std & V4L2_STD_SECAM_DK) &&
!(std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC))) { !(std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC))) {
/* 6.5 MHz carrier to be interpreted as System DK */ /* 6.5 MHz carrier to be interpreted as System DK */
...@@ -1339,7 +1369,8 @@ static void input_change(struct i2c_client *client) ...@@ -1339,7 +1369,8 @@ static void input_change(struct i2c_client *client)
cx25840_and_or(client, 0x810, ~0x01, 0); cx25840_and_or(client, 0x810, ~0x01, 0);
} }
static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input, static int set_input(struct i2c_client *client,
enum cx25840_video_input vid_input,
enum cx25840_audio_input aud_input) enum cx25840_audio_input aud_input)
{ {
struct cx25840_state *state = to_state(i2c_get_clientdata(client)); struct cx25840_state *state = to_state(i2c_get_clientdata(client));
...@@ -1373,8 +1404,10 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1373,8 +1404,10 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
reg = 0xf0 + (vid_input - CX25840_COMPOSITE1); reg = 0xf0 + (vid_input - CX25840_COMPOSITE1);
} else { } else {
if ((vid_input & ~0xff0) || if ((vid_input & ~0xff0) ||
luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA8 || luma < CX25840_SVIDEO_LUMA1 ||
chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) { luma > CX25840_SVIDEO_LUMA8 ||
chroma < CX25840_SVIDEO_CHROMA4 ||
chroma > CX25840_SVIDEO_CHROMA8) {
v4l_err(client, "0x%04x is not a valid video input!\n", v4l_err(client, "0x%04x is not a valid video input!\n",
vid_input); vid_input);
return -EINVAL; return -EINVAL;
...@@ -1398,12 +1431,24 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1398,12 +1431,24 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
case CX25840_AUDIO_SERIAL: case CX25840_AUDIO_SERIAL:
/* do nothing, use serial audio input */ /* do nothing, use serial audio input */
break; break;
case CX25840_AUDIO4: reg &= ~0x30; break; case CX25840_AUDIO4:
case CX25840_AUDIO5: reg &= ~0x30; reg |= 0x10; break; reg &= ~0x30;
case CX25840_AUDIO6: reg &= ~0x30; reg |= 0x20; break; break;
case CX25840_AUDIO7: reg &= ~0xc0; break; case CX25840_AUDIO5:
case CX25840_AUDIO8: reg &= ~0xc0; reg |= 0x40; break; reg &= ~0x30;
reg |= 0x10;
break;
case CX25840_AUDIO6:
reg &= ~0x30;
reg |= 0x20;
break;
case CX25840_AUDIO7:
reg &= ~0xc0;
break;
case CX25840_AUDIO8:
reg &= ~0xc0;
reg |= 0x40;
break;
default: default:
v4l_err(client, "0x%04x is not a valid audio input!\n", v4l_err(client, "0x%04x is not a valid audio input!\n",
aud_input); aud_input);
...@@ -1420,7 +1465,6 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1420,7 +1465,6 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02); cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02);
if (is_cx2388x(state)) { if (is_cx2388x(state)) {
/* Enable or disable the DIF for tuner use */ /* Enable or disable the DIF for tuner use */
if (is_dif) { if (is_dif) {
cx25840_and_or(client, 0x102, ~0x80, 0x80); cx25840_and_or(client, 0x102, ~0x80, 0x80);
...@@ -1451,15 +1495,23 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1451,15 +1495,23 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
cx25840_write4(client, 0x410, 0xffff0dbf); cx25840_write4(client, 0x410, 0xffff0dbf);
cx25840_write4(client, 0x414, 0x00137d03); cx25840_write4(client, 0x414, 0x00137d03);
cx25840_write4(client, state->vbi_regs_offset + 0x42c, 0x42600000); cx25840_write4(client, state->vbi_regs_offset + 0x42c,
cx25840_write4(client, state->vbi_regs_offset + 0x430, 0x0000039b); 0x42600000);
cx25840_write4(client, state->vbi_regs_offset + 0x438, 0x00000000); cx25840_write4(client, state->vbi_regs_offset + 0x430,
0x0000039b);
cx25840_write4(client, state->vbi_regs_offset + 0x440, 0xF8E3E824); cx25840_write4(client, state->vbi_regs_offset + 0x438,
cx25840_write4(client, state->vbi_regs_offset + 0x444, 0x401040dc); 0x00000000);
cx25840_write4(client, state->vbi_regs_offset + 0x448, 0xcd3f02a0);
cx25840_write4(client, state->vbi_regs_offset + 0x44c, 0x161f1000); cx25840_write4(client, state->vbi_regs_offset + 0x440,
cx25840_write4(client, state->vbi_regs_offset + 0x450, 0x00000802); 0xF8E3E824);
cx25840_write4(client, state->vbi_regs_offset + 0x444,
0x401040dc);
cx25840_write4(client, state->vbi_regs_offset + 0x448,
0xcd3f02a0);
cx25840_write4(client, state->vbi_regs_offset + 0x44c,
0x161f1000);
cx25840_write4(client, state->vbi_regs_offset + 0x450,
0x00000802);
cx25840_write4(client, 0x91c, 0x01000000); cx25840_write4(client, 0x91c, 0x01000000);
cx25840_write4(client, 0x8e0, 0x03063870); cx25840_write4(client, 0x8e0, 0x03063870);
...@@ -1526,9 +1578,10 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1526,9 +1578,10 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
* Only one of the two will be in use. * Only one of the two will be in use.
*/ */
cx25840_write4(client, AFE_CTRL, val); cx25840_write4(client, AFE_CTRL, val);
} else } else {
cx25840_and_or(client, 0x102, ~0x2, 0); cx25840_and_or(client, 0x102, ~0x2, 0);
} }
}
state->vid_input = vid_input; state->vid_input = vid_input;
state->aud_input = aud_input; state->aud_input = aud_input;
...@@ -1566,29 +1619,32 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -1566,29 +1619,32 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
cx25840_write(client, 0x919, 0x01); cx25840_write(client, 0x919, 0x01);
} }
if (is_cx2388x(state) && ((aud_input == CX25840_AUDIO7) || if (is_cx2388x(state) &&
(aud_input == CX25840_AUDIO6))) { ((aud_input == CX25840_AUDIO7) || (aud_input == CX25840_AUDIO6))) {
/* Configure audio from LR1 or LR2 input */ /* Configure audio from LR1 or LR2 input */
cx25840_write4(client, 0x910, 0); cx25840_write4(client, 0x910, 0);
cx25840_write4(client, 0x8d0, 0x63073); cx25840_write4(client, 0x8d0, 0x63073);
} else } else if (is_cx2388x(state) && (aud_input == CX25840_AUDIO8)) {
if (is_cx2388x(state) && (aud_input == CX25840_AUDIO8)) {
/* Configure audio from tuner/sif input */ /* Configure audio from tuner/sif input */
cx25840_write4(client, 0x910, 0x12b000c9); cx25840_write4(client, 0x910, 0x12b000c9);
cx25840_write4(client, 0x8d0, 0x1f063870); cx25840_write4(client, 0x8d0, 0x1f063870);
} }
if (is_cx23888(state)) { if (is_cx23888(state)) {
/* HVR1850 */ /*
/* AUD_IO_CTRL - I2S Input, Parallel1*/ * HVR1850
/* - Channel 1 src - Parallel1 (Merlin out) */ *
/* - Channel 2 src - Parallel2 (Merlin out) */ * AUD_IO_CTRL - I2S Input, Parallel1
/* - Channel 3 src - Parallel3 (Merlin AC97 out) */ * - Channel 1 src - Parallel1 (Merlin out)
/* - I2S source and dir - Merlin, output */ * - Channel 2 src - Parallel2 (Merlin out)
* - Channel 3 src - Parallel3 (Merlin AC97 out)
* - I2S source and dir - Merlin, output
*/
cx25840_write4(client, 0x124, 0x100); cx25840_write4(client, 0x124, 0x100);
if (!is_dif) { if (!is_dif) {
/* Stop microcontroller if we don't need it /*
* Stop microcontroller if we don't need it
* to avoid audio popping on svideo/composite use. * to avoid audio popping on svideo/composite use.
*/ */
cx25840_and_or(client, 0x803, ~0x10, 0x00); cx25840_and_or(client, 0x803, ~0x10, 0x00);
...@@ -1630,11 +1686,14 @@ static int set_v4lstd(struct i2c_client *client) ...@@ -1630,11 +1686,14 @@ static int set_v4lstd(struct i2c_client *client)
fmt = 0xc; fmt = 0xc;
} }
v4l_dbg(1, cx25840_debug, client, "changing video std to fmt %i\n",fmt); v4l_dbg(1, cx25840_debug, client,
"changing video std to fmt %i\n", fmt);
/* Follow step 9 of section 3.16 in the cx25840 datasheet. /*
Without this PAL may display a vertical ghosting effect. * Follow step 9 of section 3.16 in the cx25840 datasheet.
This happens for example with the Yuan MPC622. */ * Without this PAL may display a vertical ghosting effect.
* This happens for example with the Yuan MPC622.
*/
if (fmt >= 4 && fmt < 8) { if (fmt >= 4 && fmt < 8) {
/* Set format to NTSC-M */ /* Set format to NTSC-M */
cx25840_and_or(client, 0x400, ~0xf, 1); cx25840_and_or(client, 0x400, ~0xf, 1);
...@@ -1702,9 +1761,9 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd, ...@@ -1702,9 +1761,9 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd,
struct v4l2_mbus_framefmt *fmt = &format->format; struct v4l2_mbus_framefmt *fmt = &format->format;
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
u32 HSC, VSC, Vsrc, Hsrc, Vadd; u32 hsc, vsc, v_src, h_src, v_add;
int filter; int filter;
int is_50Hz = !(state->std & V4L2_STD_525_60); int is_50hz = !(state->std & V4L2_STD_525_60);
if (format->pad || fmt->code != MEDIA_BUS_FMT_FIXED) if (format->pad || fmt->code != MEDIA_BUS_FMT_FIXED)
return -EINVAL; return -EINVAL;
...@@ -1713,23 +1772,23 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd, ...@@ -1713,23 +1772,23 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd,
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
if (is_cx23888(state)) { if (is_cx23888(state)) {
Vsrc = (cx25840_read(client, 0x42a) & 0x3f) << 4; v_src = (cx25840_read(client, 0x42a) & 0x3f) << 4;
Vsrc |= (cx25840_read(client, 0x429) & 0xf0) >> 4; v_src |= (cx25840_read(client, 0x429) & 0xf0) >> 4;
} else { } else {
Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4; v_src = (cx25840_read(client, 0x476) & 0x3f) << 4;
Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4; v_src |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
} }
if (is_cx23888(state)) { if (is_cx23888(state)) {
Hsrc = (cx25840_read(client, 0x426) & 0x3f) << 4; h_src = (cx25840_read(client, 0x426) & 0x3f) << 4;
Hsrc |= (cx25840_read(client, 0x425) & 0xf0) >> 4; h_src |= (cx25840_read(client, 0x425) & 0xf0) >> 4;
} else { } else {
Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4; h_src = (cx25840_read(client, 0x472) & 0x3f) << 4;
Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4; h_src |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
} }
if (!state->generic_mode) { if (!state->generic_mode) {
Vadd = is_50Hz ? 4 : 7; v_add = is_50hz ? 4 : 7;
/* /*
* cx23888 in 525-line mode is programmed for 486 active lines * cx23888 in 525-line mode is programmed for 486 active lines
...@@ -1738,16 +1797,17 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd, ...@@ -1738,16 +1797,17 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd,
* See reg 0x428 bits [21:12] in cx23888_std_setup() vs * See reg 0x428 bits [21:12] in cx23888_std_setup() vs
* vactive in cx25840_std_setup(). * vactive in cx25840_std_setup().
*/ */
if (is_cx23888(state) && !is_50Hz) if (is_cx23888(state) && !is_50hz)
Vadd--; v_add--;
} else } else {
Vadd = 0; v_add = 0;
}
if (Hsrc == 0 || if (h_src == 0 ||
Vsrc <= Vadd) { v_src <= v_add) {
v4l_err(client, v4l_err(client,
"chip reported picture size (%u x %u) is far too small\n", "chip reported picture size (%u x %u) is far too small\n",
(unsigned int)Hsrc, (unsigned int)Vsrc); (unsigned int)h_src, (unsigned int)v_src);
/* /*
* that's the best we can do since the output picture * that's the best we can do since the output picture
* size is completely unknown in this case * size is completely unknown in this case
...@@ -1755,20 +1815,20 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd, ...@@ -1755,20 +1815,20 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd,
return -EINVAL; return -EINVAL;
} }
fmt->width = clamp(fmt->width, (Hsrc + 15) / 16, Hsrc); fmt->width = clamp(fmt->width, (h_src + 15) / 16, h_src);
if (Vadd * 8 >= Vsrc) if (v_add * 8 >= v_src)
fmt->height = clamp(fmt->height, (u32)1, Vsrc - Vadd); fmt->height = clamp(fmt->height, (u32)1, v_src - v_add);
else else
fmt->height = clamp(fmt->height, (Vsrc - Vadd * 8 + 7) / 8, fmt->height = clamp(fmt->height, (v_src - v_add * 8 + 7) / 8,
Vsrc - Vadd); v_src - v_add);
if (format->which == V4L2_SUBDEV_FORMAT_TRY) if (format->which == V4L2_SUBDEV_FORMAT_TRY)
return 0; return 0;
HSC = (Hsrc * (1 << 20)) / fmt->width - (1 << 20); hsc = (h_src * (1 << 20)) / fmt->width - (1 << 20);
VSC = (1 << 16) - (Vsrc * (1 << 9) / (fmt->height + Vadd) - (1 << 9)); vsc = (1 << 16) - (v_src * (1 << 9) / (fmt->height + v_add) - (1 << 9));
VSC &= 0x1fff; vsc &= 0x1fff;
if (fmt->width >= 385) if (fmt->width >= 385)
filter = 0; filter = 0;
...@@ -1782,20 +1842,20 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd, ...@@ -1782,20 +1842,20 @@ static int cx25840_set_fmt(struct v4l2_subdev *sd,
v4l_dbg(1, cx25840_debug, client, v4l_dbg(1, cx25840_debug, client,
"decoder set size %u x %u with scale %x x %x\n", "decoder set size %u x %u with scale %x x %x\n",
(unsigned int)fmt->width, (unsigned int)fmt->height, (unsigned int)fmt->width, (unsigned int)fmt->height,
(unsigned int)HSC, (unsigned int)VSC); (unsigned int)hsc, (unsigned int)vsc);
/* HSCALE=HSC */ /* HSCALE=hsc */
if (is_cx23888(state)) { if (is_cx23888(state)) {
cx25840_write4(client, 0x434, HSC | (1 << 24)); cx25840_write4(client, 0x434, hsc | (1 << 24));
/* VSCALE=VSC VS_INTRLACE=1 VFILT=filter */ /* VSCALE=vsc VS_INTRLACE=1 VFILT=filter */
cx25840_write4(client, 0x438, VSC | (1 << 19) | (filter << 16)); cx25840_write4(client, 0x438, vsc | (1 << 19) | (filter << 16));
} else { } else {
cx25840_write(client, 0x418, HSC & 0xff); cx25840_write(client, 0x418, hsc & 0xff);
cx25840_write(client, 0x419, (HSC >> 8) & 0xff); cx25840_write(client, 0x419, (hsc >> 8) & 0xff);
cx25840_write(client, 0x41a, HSC >> 16); cx25840_write(client, 0x41a, hsc >> 16);
/* VSCALE=VSC */ /* VSCALE=vsc */
cx25840_write(client, 0x41c, VSC & 0xff); cx25840_write(client, 0x41c, vsc & 0xff);
cx25840_write(client, 0x41d, VSC >> 8); cx25840_write(client, 0x41d, vsc >> 8);
/* VS_INTRLACE=1 VFILT=filter */ /* VS_INTRLACE=1 VFILT=filter */
cx25840_write(client, 0x41e, 0x8 | filter); cx25840_write(client, 0x41e, 0x8 | filter);
} }
...@@ -1834,11 +1894,13 @@ static void log_video_status(struct i2c_client *client) ...@@ -1834,11 +1894,13 @@ static void log_video_status(struct i2c_client *client)
v4l_info(client, "Specified video input: Composite %d\n", v4l_info(client, "Specified video input: Composite %d\n",
vid_input - CX25840_COMPOSITE1 + 1); vid_input - CX25840_COMPOSITE1 + 1);
} else { } else {
v4l_info(client, "Specified video input: S-Video (Luma In%d, Chroma In%d)\n", v4l_info(client,
"Specified video input: S-Video (Luma In%d, Chroma In%d)\n",
(vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8); (vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8);
} }
v4l_info(client, "Specified audioclock freq: %d Hz\n", state->audclk_freq); v4l_info(client, "Specified audioclock freq: %d Hz\n",
state->audclk_freq);
} }
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
...@@ -1857,42 +1919,104 @@ static void log_audio_status(struct i2c_client *client) ...@@ -1857,42 +1919,104 @@ static void log_audio_status(struct i2c_client *client)
char *p; char *p;
switch (mod_det_stat0) { switch (mod_det_stat0) {
case 0x00: p = "mono"; break; case 0x00:
case 0x01: p = "stereo"; break; p = "mono";
case 0x02: p = "dual"; break; break;
case 0x04: p = "tri"; break; case 0x01:
case 0x10: p = "mono with SAP"; break; p = "stereo";
case 0x11: p = "stereo with SAP"; break; break;
case 0x12: p = "dual with SAP"; break; case 0x02:
case 0x14: p = "tri with SAP"; break; p = "dual";
case 0xfe: p = "forced mode"; break; break;
default: p = "not defined"; case 0x04:
p = "tri";
break;
case 0x10:
p = "mono with SAP";
break;
case 0x11:
p = "stereo with SAP";
break;
case 0x12:
p = "dual with SAP";
break;
case 0x14:
p = "tri with SAP";
break;
case 0xfe:
p = "forced mode";
break;
default:
p = "not defined";
} }
v4l_info(client, "Detected audio mode: %s\n", p); v4l_info(client, "Detected audio mode: %s\n", p);
switch (mod_det_stat1) { switch (mod_det_stat1) {
case 0x00: p = "not defined"; break; case 0x00:
case 0x01: p = "EIAJ"; break; p = "not defined";
case 0x02: p = "A2-M"; break; break;
case 0x03: p = "A2-BG"; break; case 0x01:
case 0x04: p = "A2-DK1"; break; p = "EIAJ";
case 0x05: p = "A2-DK2"; break; break;
case 0x06: p = "A2-DK3"; break; case 0x02:
case 0x07: p = "A1 (6.0 MHz FM Mono)"; break; p = "A2-M";
case 0x08: p = "AM-L"; break; break;
case 0x09: p = "NICAM-BG"; break; case 0x03:
case 0x0a: p = "NICAM-DK"; break; p = "A2-BG";
case 0x0b: p = "NICAM-I"; break; break;
case 0x0c: p = "NICAM-L"; break; case 0x04:
case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break; p = "A2-DK1";
case 0x0e: p = "IF FM Radio"; break; break;
case 0x0f: p = "BTSC"; break; case 0x05:
case 0x10: p = "high-deviation FM"; break; p = "A2-DK2";
case 0x11: p = "very high-deviation FM"; break; break;
case 0xfd: p = "unknown audio standard"; break; case 0x06:
case 0xfe: p = "forced audio standard"; break; p = "A2-DK3";
case 0xff: p = "no detected audio standard"; break; break;
default: p = "not defined"; case 0x07:
p = "A1 (6.0 MHz FM Mono)";
break;
case 0x08:
p = "AM-L";
break;
case 0x09:
p = "NICAM-BG";
break;
case 0x0a:
p = "NICAM-DK";
break;
case 0x0b:
p = "NICAM-I";
break;
case 0x0c:
p = "NICAM-L";
break;
case 0x0d:
p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)";
break;
case 0x0e:
p = "IF FM Radio";
break;
case 0x0f:
p = "BTSC";
break;
case 0x10:
p = "high-deviation FM";
break;
case 0x11:
p = "very high-deviation FM";
break;
case 0xfd:
p = "unknown audio standard";
break;
case 0xfe:
p = "forced audio standard";
break;
case 0xff:
p = "no detected audio standard";
break;
default:
p = "not defined";
} }
v4l_info(client, "Detected audio standard: %s\n", p); v4l_info(client, "Detected audio standard: %s\n", p);
v4l_info(client, "Audio microcontroller: %s\n", v4l_info(client, "Audio microcontroller: %s\n",
...@@ -1900,95 +2024,210 @@ static void log_audio_status(struct i2c_client *client) ...@@ -1900,95 +2024,210 @@ static void log_audio_status(struct i2c_client *client)
((mute_ctl & 0x2) ? "detecting" : "running") : "stopped"); ((mute_ctl & 0x2) ? "detecting" : "running") : "stopped");
switch (audio_config >> 4) { switch (audio_config >> 4) {
case 0x00: p = "undefined"; break; case 0x00:
case 0x01: p = "BTSC"; break; p = "undefined";
case 0x02: p = "EIAJ"; break; break;
case 0x03: p = "A2-M"; break; case 0x01:
case 0x04: p = "A2-BG"; break; p = "BTSC";
case 0x05: p = "A2-DK1"; break; break;
case 0x06: p = "A2-DK2"; break; case 0x02:
case 0x07: p = "A2-DK3"; break; p = "EIAJ";
case 0x08: p = "A1 (6.0 MHz FM Mono)"; break; break;
case 0x09: p = "AM-L"; break; case 0x03:
case 0x0a: p = "NICAM-BG"; break; p = "A2-M";
case 0x0b: p = "NICAM-DK"; break; break;
case 0x0c: p = "NICAM-I"; break; case 0x04:
case 0x0d: p = "NICAM-L"; break; p = "A2-BG";
case 0x0e: p = "FM radio"; break; break;
case 0x0f: p = "automatic detection"; break; case 0x05:
default: p = "undefined"; p = "A2-DK1";
break;
case 0x06:
p = "A2-DK2";
break;
case 0x07:
p = "A2-DK3";
break;
case 0x08:
p = "A1 (6.0 MHz FM Mono)";
break;
case 0x09:
p = "AM-L";
break;
case 0x0a:
p = "NICAM-BG";
break;
case 0x0b:
p = "NICAM-DK";
break;
case 0x0c:
p = "NICAM-I";
break;
case 0x0d:
p = "NICAM-L";
break;
case 0x0e:
p = "FM radio";
break;
case 0x0f:
p = "automatic detection";
break;
default:
p = "undefined";
} }
v4l_info(client, "Configured audio standard: %s\n", p); v4l_info(client, "Configured audio standard: %s\n", p);
if ((audio_config >> 4) < 0xF) { if ((audio_config >> 4) < 0xF) {
switch (audio_config & 0xF) { switch (audio_config & 0xF) {
case 0x00: p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)"; break; case 0x00:
case 0x01: p = "MONO2 (LANGUAGE B)"; break; p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)";
case 0x02: p = "MONO3 (STEREO forced MONO)"; break; break;
case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break; case 0x01:
case 0x04: p = "STEREO"; break; p = "MONO2 (LANGUAGE B)";
case 0x05: p = "DUAL1 (AB)"; break; break;
case 0x06: p = "DUAL2 (AC) (FM)"; break; case 0x02:
case 0x07: p = "DUAL3 (BC) (FM)"; break; p = "MONO3 (STEREO forced MONO)";
case 0x08: p = "DUAL4 (AC) (AM)"; break; break;
case 0x09: p = "DUAL5 (BC) (AM)"; break; case 0x03:
case 0x0a: p = "SAP"; break; p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)";
default: p = "undefined"; break;
case 0x04:
p = "STEREO";
break;
case 0x05:
p = "DUAL1 (AB)";
break;
case 0x06:
p = "DUAL2 (AC) (FM)";
break;
case 0x07:
p = "DUAL3 (BC) (FM)";
break;
case 0x08:
p = "DUAL4 (AC) (AM)";
break;
case 0x09:
p = "DUAL5 (BC) (AM)";
break;
case 0x0a:
p = "SAP";
break;
default:
p = "undefined";
} }
v4l_info(client, "Configured audio mode: %s\n", p); v4l_info(client, "Configured audio mode: %s\n", p);
} else { } else {
switch (audio_config & 0xF) { switch (audio_config & 0xF) {
case 0x00: p = "BG"; break; case 0x00:
case 0x01: p = "DK1"; break; p = "BG";
case 0x02: p = "DK2"; break; break;
case 0x03: p = "DK3"; break; case 0x01:
case 0x04: p = "I"; break; p = "DK1";
case 0x05: p = "L"; break; break;
case 0x06: p = "BTSC"; break; case 0x02:
case 0x07: p = "EIAJ"; break; p = "DK2";
case 0x08: p = "A2-M"; break; break;
case 0x09: p = "FM Radio"; break; case 0x03:
case 0x0f: p = "automatic standard and mode detection"; break; p = "DK3";
default: p = "undefined"; break;
case 0x04:
p = "I";
break;
case 0x05:
p = "L";
break;
case 0x06:
p = "BTSC";
break;
case 0x07:
p = "EIAJ";
break;
case 0x08:
p = "A2-M";
break;
case 0x09:
p = "FM Radio";
break;
case 0x0f:
p = "automatic standard and mode detection";
break;
default:
p = "undefined";
} }
v4l_info(client, "Configured audio system: %s\n", p); v4l_info(client, "Configured audio system: %s\n", p);
} }
if (aud_input) { if (aud_input) {
v4l_info(client, "Specified audio input: Tuner (In%d)\n", aud_input); v4l_info(client, "Specified audio input: Tuner (In%d)\n",
aud_input);
} else { } else {
v4l_info(client, "Specified audio input: External\n"); v4l_info(client, "Specified audio input: External\n");
} }
switch (pref_mode & 0xf) { switch (pref_mode & 0xf) {
case 0: p = "mono/language A"; break; case 0:
case 1: p = "language B"; break; p = "mono/language A";
case 2: p = "language C"; break; break;
case 3: p = "analog fallback"; break; case 1:
case 4: p = "stereo"; break; p = "language B";
case 5: p = "language AC"; break; break;
case 6: p = "language BC"; break; case 2:
case 7: p = "language AB"; break; p = "language C";
default: p = "undefined"; break;
case 3:
p = "analog fallback";
break;
case 4:
p = "stereo";
break;
case 5:
p = "language AC";
break;
case 6:
p = "language BC";
break;
case 7:
p = "language AB";
break;
default:
p = "undefined";
} }
v4l_info(client, "Preferred audio mode: %s\n", p); v4l_info(client, "Preferred audio mode: %s\n", p);
if ((audio_config & 0xf) == 0xf) { if ((audio_config & 0xf) == 0xf) {
switch ((afc0 >> 3) & 0x3) { switch ((afc0 >> 3) & 0x3) {
case 0: p = "system DK"; break; case 0:
case 1: p = "system L"; break; p = "system DK";
case 2: p = "autodetect"; break; break;
default: p = "undefined"; case 1:
p = "system L";
break;
case 2:
p = "autodetect";
break;
default:
p = "undefined";
} }
v4l_info(client, "Selected 65 MHz format: %s\n", p); v4l_info(client, "Selected 65 MHz format: %s\n", p);
switch (afc0 & 0x7) { switch (afc0 & 0x7) {
case 0: p = "chroma"; break; case 0:
case 1: p = "BTSC"; break; p = "chroma";
case 2: p = "EIAJ"; break; break;
case 3: p = "A2-M"; break; case 1:
case 4: p = "autodetect"; break; p = "BTSC";
default: p = "undefined"; break;
case 2:
p = "EIAJ";
break;
case 3:
p = "A2-M";
break;
case 4:
p = "autodetect";
break;
default:
p = "undefined";
} }
v4l_info(client, "Selected 45 MHz format: %s\n", p); v4l_info(client, "Selected 45 MHz format: %s\n", p);
} }
...@@ -2053,8 +2292,10 @@ static int cx25840_init(struct v4l2_subdev *sd, u32 val) ...@@ -2053,8 +2292,10 @@ static int cx25840_init(struct v4l2_subdev *sd, u32 val)
/* add additional settings */ /* add additional settings */
cx25840_vconfig_add(state, val); cx25840_vconfig_add(state, val);
} else /* TODO: generic mode needs to be developed for other chips */ } else {
/* TODO: generic mode needs to be developed for other chips */
WARN_ON(1); WARN_ON(1);
}
return 0; return 0;
} }
...@@ -2104,7 +2345,8 @@ static int cx25840_load_fw(struct v4l2_subdev *sd) ...@@ -2104,7 +2345,8 @@ static int cx25840_load_fw(struct v4l2_subdev *sd)
} }
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
static int cx25840_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) static int cx25840_g_register(struct v4l2_subdev *sd,
struct v4l2_dbg_register *reg)
{ {
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
...@@ -2113,7 +2355,8 @@ static int cx25840_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register * ...@@ -2113,7 +2355,8 @@ static int cx25840_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *
return 0; return 0;
} }
static int cx25840_s_register(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg) static int cx25840_s_register(struct v4l2_subdev *sd,
const struct v4l2_dbg_register *reg)
{ {
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
...@@ -2208,7 +2451,7 @@ static int cx25840_querystd(struct v4l2_subdev *sd, v4l2_std_id *std) ...@@ -2208,7 +2451,7 @@ static int cx25840_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
}; };
u32 fmt = (cx25840_read4(client, 0x40c) >> 8) & 0xf; u32 fmt = (cx25840_read4(client, 0x40c) >> 8) & 0xf;
*std = stds[ fmt ]; *std = stds[fmt];
v4l_dbg(1, cx25840_debug, client, v4l_dbg(1, cx25840_debug, client,
"querystd fmt = %x, v4l2_std_id = 0x%x\n", "querystd fmt = %x, v4l2_std_id = 0x%x\n",
...@@ -2221,7 +2464,8 @@ static int cx25840_g_input_status(struct v4l2_subdev *sd, u32 *status) ...@@ -2221,7 +2464,8 @@ static int cx25840_g_input_status(struct v4l2_subdev *sd, u32 *status)
{ {
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
/* A limited function that checks for signal status and returns /*
* A limited function that checks for signal status and returns
* the state. * the state.
*/ */
...@@ -2289,7 +2533,8 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd, ...@@ -2289,7 +2533,8 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
return set_input(client, state->vid_input, input); return set_input(client, state->vid_input, input);
} }
static int cx25840_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequency *freq) static int cx25840_s_frequency(struct v4l2_subdev *sd,
const struct v4l2_frequency *freq)
{ {
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
...@@ -2312,8 +2557,7 @@ static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) ...@@ -2312,8 +2557,7 @@ static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
if (is_cx2583x(state)) if (is_cx2583x(state))
return 0; return 0;
vt->capability |= vt->capability |= V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP; V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
mode = cx25840_read(client, 0x804); mode = cx25840_read(client, 0x804);
...@@ -2345,28 +2589,36 @@ static int cx25840_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *vt) ...@@ -2345,28 +2589,36 @@ static int cx25840_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *vt)
switch (vt->audmode) { switch (vt->audmode) {
case V4L2_TUNER_MODE_MONO: case V4L2_TUNER_MODE_MONO:
/* mono -> mono /*
stereo -> mono * mono -> mono
bilingual -> lang1 */ * stereo -> mono
* bilingual -> lang1
*/
cx25840_and_or(client, 0x809, ~0xf, 0x00); cx25840_and_or(client, 0x809, ~0xf, 0x00);
break; break;
case V4L2_TUNER_MODE_STEREO: case V4L2_TUNER_MODE_STEREO:
case V4L2_TUNER_MODE_LANG1: case V4L2_TUNER_MODE_LANG1:
/* mono -> mono /*
stereo -> stereo * mono -> mono
bilingual -> lang1 */ * stereo -> stereo
* bilingual -> lang1
*/
cx25840_and_or(client, 0x809, ~0xf, 0x04); cx25840_and_or(client, 0x809, ~0xf, 0x04);
break; break;
case V4L2_TUNER_MODE_LANG1_LANG2: case V4L2_TUNER_MODE_LANG1_LANG2:
/* mono -> mono /*
stereo -> stereo * mono -> mono
bilingual -> lang1/lang2 */ * stereo -> stereo
* bilingual -> lang1/lang2
*/
cx25840_and_or(client, 0x809, ~0xf, 0x07); cx25840_and_or(client, 0x809, ~0xf, 0x07);
break; break;
case V4L2_TUNER_MODE_LANG2: case V4L2_TUNER_MODE_LANG2:
/* mono -> mono /*
stereo -> stereo * mono -> mono
bilingual -> lang2 */ * stereo -> stereo
* bilingual -> lang2
*/
cx25840_and_or(client, 0x809, ~0xf, 0x01); cx25840_and_or(client, 0x809, ~0xf, 0x01);
break; break;
default: default:
...@@ -5545,22 +5797,28 @@ static u32 get_cx2388x_ident(struct i2c_client *client) ...@@ -5545,22 +5797,28 @@ static u32 get_cx2388x_ident(struct i2c_client *client)
/* Come out of digital power down */ /* Come out of digital power down */
cx25840_write(client, 0x000, 0); cx25840_write(client, 0x000, 0);
/* Detecting whether the part is cx23885/7/8 is more /*
* Detecting whether the part is cx23885/7/8 is more
* difficult than it needs to be. No ID register. Instead we * difficult than it needs to be. No ID register. Instead we
* probe certain registers indicated in the datasheets to look * probe certain registers indicated in the datasheets to look
* for specific defaults that differ between the silicon designs. */ * for specific defaults that differ between the silicon designs.
*/
/* It's either 885/7 if the IR Tx Clk Divider register exists */ /* It's either 885/7 if the IR Tx Clk Divider register exists */
if (cx25840_read4(client, 0x204) & 0xffff) { if (cx25840_read4(client, 0x204) & 0xffff) {
/* CX23885 returns bogus repetitive byte values for the DIF, /*
* which doesn't exist for it. (Ex. 8a8a8a8a or 31313131) */ * CX23885 returns bogus repetitive byte values for the DIF,
* which doesn't exist for it. (Ex. 8a8a8a8a or 31313131)
*/
ret = cx25840_read4(client, 0x300); ret = cx25840_read4(client, 0x300);
if (((ret & 0xffff0000) >> 16) == (ret & 0xffff)) { if (((ret & 0xffff0000) >> 16) == (ret & 0xffff)) {
/* No DIF */ /* No DIF */
ret = CX23885_AV; ret = CX23885_AV;
} else { } else {
/* CX23887 has a broken DIF, but the registers /*
* appear valid (but unused), good enough to detect. */ * CX23887 has a broken DIF, but the registers
* appear valid (but unused), good enough to detect.
*/
ret = CX23887_AV; ret = CX23887_AV;
} }
} else if (cx25840_read4(client, 0x300) & 0x0fffffff) { } else if (cx25840_read4(client, 0x300) & 0x0fffffff) {
...@@ -5592,14 +5850,18 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5592,14 +5850,18 @@ static int cx25840_probe(struct i2c_client *client,
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -EIO; return -EIO;
v4l_dbg(1, cx25840_debug, client, "detecting cx25840 client on address 0x%x\n", client->addr << 1); v4l_dbg(1, cx25840_debug, client,
"detecting cx25840 client on address 0x%x\n",
client->addr << 1);
device_id = cx25840_read(client, 0x101) << 8; device_id = cx25840_read(client, 0x101) << 8;
device_id |= cx25840_read(client, 0x100); device_id |= cx25840_read(client, 0x100);
v4l_dbg(1, cx25840_debug, client, "device_id = 0x%04x\n", device_id); v4l_dbg(1, cx25840_debug, client, "device_id = 0x%04x\n", device_id);
/* The high byte of the device ID should be /*
* 0x83 for the cx2583x and 0x84 for the cx2584x */ * The high byte of the device ID should be
* 0x83 for the cx2583x and 0x84 for the cx2584x
*/
if ((device_id & 0xff00) == 0x8300) { if ((device_id & 0xff00) == 0x8300) {
id = CX25836 + ((device_id >> 4) & 0xf) - 6; id = CX25836 + ((device_id >> 4) & 0xf) - 6;
} else if ((device_id & 0xff00) == 0x8400) { } else if ((device_id & 0xff00) == 0x8400) {
...@@ -5613,7 +5875,8 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5613,7 +5875,8 @@ static int cx25840_probe(struct i2c_client *client,
v4l_err(client, v4l_err(client,
"likely a confused/unresponsive cx2388[578] A/V decoder found @ 0x%x (%s)\n", "likely a confused/unresponsive cx2388[578] A/V decoder found @ 0x%x (%s)\n",
client->addr << 1, client->adapter->name); client->addr << 1, client->adapter->name);
v4l_err(client, "A method to reset it from the cx25840 driver software is not known at this time\n"); v4l_err(client,
"A method to reset it from the cx25840 driver software is not known at this time\n");
return -ENODEV; return -ENODEV;
} else { } else {
v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n"); v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n");
...@@ -5621,7 +5884,7 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5621,7 +5884,7 @@ static int cx25840_probe(struct i2c_client *client,
} }
state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL);
if (state == NULL) if (!state)
return -ENOMEM; return -ENOMEM;
sd = &state->sd; sd = &state->sd;
...@@ -5676,8 +5939,10 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5676,8 +5939,10 @@ static int cx25840_probe(struct i2c_client *client,
case CX25841: case CX25841:
case CX25842: case CX25842:
case CX25843: case CX25843:
/* Note: revision '(device_id & 0x0f) == 2' was never built. The /*
marking skips from 0x1 == 22 to 0x3 == 23. */ * Note: revision '(device_id & 0x0f) == 2' was never built.
* The marking skips from 0x1 == 22 to 0x3 == 23.
*/
v4l_info(client, "cx25%3x-2%x found @ 0x%x (%s)\n", v4l_info(client, "cx25%3x-2%x found @ 0x%x (%s)\n",
(device_id & 0xfff0) >> 4, (device_id & 0xfff0) >> 4,
(device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1 (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1
...@@ -5723,8 +5988,7 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5723,8 +5988,7 @@ static int cx25840_probe(struct i2c_client *client,
/* Bottom out at -96 dB, v4l2 vol range 0x2e00-0x2fff */ /* Bottom out at -96 dB, v4l2 vol range 0x2e00-0x2fff */
default_volume = 228; default_volume = 228;
cx25840_write(client, 0x8d4, 228); cx25840_write(client, 0x8d4, 228);
} } else if (default_volume < 20) {
else if (default_volume < 20) {
/* Top out at + 8 dB, v4l2 vol range 0xfe00-0xffff */ /* Top out at + 8 dB, v4l2 vol range 0xfe00-0xffff */
default_volume = 20; default_volume = 20;
cx25840_write(client, 0x8d4, 20); cx25840_write(client, 0x8d4, 20);
...@@ -5732,10 +5996,13 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -5732,10 +5996,13 @@ static int cx25840_probe(struct i2c_client *client,
default_volume = (((228 - default_volume) >> 1) + 23) << 9; default_volume = (((228 - default_volume) >> 1) + 23) << 9;
state->volume = v4l2_ctrl_new_std(&state->hdl, state->volume = v4l2_ctrl_new_std(&state->hdl,
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME, &cx25840_audio_ctrl_ops,
0, 65535, 65535 / 100, default_volume); V4L2_CID_AUDIO_VOLUME,
0, 65535, 65535 / 100,
default_volume);
state->mute = v4l2_ctrl_new_std(&state->hdl, state->mute = v4l2_ctrl_new_std(&state->hdl,
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_MUTE, &cx25840_audio_ctrl_ops,
V4L2_CID_AUDIO_MUTE,
0, 1, 1, 0); 0, 1, 1, 0);
v4l2_ctrl_new_std(&state->hdl, &cx25840_audio_ctrl_ops, v4l2_ctrl_new_std(&state->hdl, &cx25840_audio_ctrl_ops,
V4L2_CID_AUDIO_BALANCE, V4L2_CID_AUDIO_BALANCE,
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#ifndef _CX25840_CORE_H_ #ifndef _CX25840_CORE_H_
#define _CX25840_CORE_H_ #define _CX25840_CORE_H_
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
...@@ -100,7 +99,7 @@ struct cx25840_state { ...@@ -100,7 +99,7 @@ struct cx25840_state {
enum cx25840_model id; enum cx25840_model id;
u32 rev; u32 rev;
int is_initialized; int is_initialized;
unsigned vbi_regs_offset; unsigned int vbi_regs_offset;
wait_queue_head_t fw_wait; wait_queue_head_t fw_wait;
struct work_struct fw_work; struct work_struct fw_work;
struct cx25840_ir_state *ir_state; struct cx25840_ir_state *ir_state;
...@@ -166,7 +165,8 @@ int cx25840_write(struct i2c_client *client, u16 addr, u8 value); ...@@ -166,7 +165,8 @@ int cx25840_write(struct i2c_client *client, u16 addr, u8 value);
int cx25840_write4(struct i2c_client *client, u16 addr, u32 value); int cx25840_write4(struct i2c_client *client, u16 addr, u32 value);
u8 cx25840_read(struct i2c_client *client, u16 addr); u8 cx25840_read(struct i2c_client *client, u16 addr);
u32 cx25840_read4(struct i2c_client *client, u16 addr); u32 cx25840_read4(struct i2c_client *client, u16 addr);
int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned mask, u8 value); int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned int mask,
u8 value);
int cx25840_and_or4(struct i2c_client *client, u16 addr, u32 and_mask, int cx25840_and_or4(struct i2c_client *client, u16 addr, u32 and_mask,
u32 or_value); u32 or_value);
void cx25840_std_setup(struct i2c_client *client); void cx25840_std_setup(struct i2c_client *client);
...@@ -185,9 +185,12 @@ extern const struct v4l2_ctrl_ops cx25840_audio_ctrl_ops; ...@@ -185,9 +185,12 @@ extern const struct v4l2_ctrl_ops cx25840_audio_ctrl_ops;
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* cx25850-vbi.c */ /* cx25850-vbi.c */
int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt); int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt); int cx25840_s_sliced_fmt(struct v4l2_subdev *sd,
int cx25840_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt); struct v4l2_sliced_vbi_format *fmt);
int cx25840_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi); int cx25840_g_sliced_fmt(struct v4l2_subdev *sd,
struct v4l2_sliced_vbi_format *fmt);
int cx25840_decode_vbi_line(struct v4l2_subdev *sd,
struct v4l2_decode_vbi_line *vbi);
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* cx25850-ir.c */ /* cx25850-ir.c */
......
/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-License-Identifier: GPL-2.0-or-later */
/*
cx25840.h - definition for cx25840/1/2/3 inputs
Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
*/ /*
* cx25840.h - definition for cx25840/1/2/3 inputs
*
* Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
*/
#ifndef _CX25840_H_ #ifndef _CX25840_H_
#define _CX25840_H_ #define _CX25840_H_
...@@ -38,8 +38,10 @@ enum cx25840_video_input { ...@@ -38,8 +38,10 @@ enum cx25840_video_input {
CX25840_COMPOSITE7, CX25840_COMPOSITE7,
CX25840_COMPOSITE8, CX25840_COMPOSITE8,
/* S-Video inputs consist of one luma input (In1-In8) ORed with one /*
chroma input (In5-In8) */ * S-Video inputs consist of one luma input (In1-In8) ORed with one
* chroma input (In5-In8)
*/
CX25840_SVIDEO_LUMA1 = 0x10, CX25840_SVIDEO_LUMA1 = 0x10,
CX25840_SVIDEO_LUMA2 = 0x20, CX25840_SVIDEO_LUMA2 = 0x20,
CX25840_SVIDEO_LUMA3 = 0x30, CX25840_SVIDEO_LUMA3 = 0x30,
...@@ -243,13 +245,16 @@ enum cx23885_io_pad { ...@@ -243,13 +245,16 @@ enum cx23885_io_pad {
CX23885_PAD_GPIO16, CX23885_PAD_GPIO16,
}; };
/* pvr150_workaround activates a workaround for a hardware bug that is /*
present in Hauppauge PVR-150 (and possibly PVR-500) cards that have * pvr150_workaround activates a workaround for a hardware bug that is
certain NTSC tuners (tveeprom tuner model numbers 85, 99 and 112). The * present in Hauppauge PVR-150 (and possibly PVR-500) cards that have
audio autodetect fails on some channels for these models and the workaround * certain NTSC tuners (tveeprom tuner model numbers 85, 99 and 112). The
is to select the audio standard explicitly. Many thanks to Hauppauge for * audio autodetect fails on some channels for these models and the workaround
providing this information. * is to select the audio standard explicitly. Many thanks to Hauppauge for
This platform data only needs to be supplied by the ivtv driver. */ * providing this information.
*
* This platform data only needs to be supplied by the ivtv driver.
*/
struct cx25840_platform_data { struct cx25840_platform_data {
int pvr150_workaround; int pvr150_workaround;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment