This is a cx88 driver update, changes:
* adapt to video-buf changes.
* add support for a new card.
* use the new video-buf-dvb module.
The dvb stuff doesn't build yet as it depends on some cutting-edge
code from the linuxtv cvs and is tagged as 'BROKEN' because of that.
The patch also removes all trailing whitespaces. I've a script to
remove them from my sources now, that should kill those no-op
whitespace changes in my patches after merging this initial cleanup.
Signed-off-by: Gerd Knorr <[email protected]>
---
drivers/media/video/Kconfig | 13
drivers/media/video/cx88/Makefile | 4
drivers/media/video/cx88/cx88-blackbird.c | 51 +--
drivers/media/video/cx88/cx88-cards.c | 32 +-
drivers/media/video/cx88/cx88-core.c | 23 -
drivers/media/video/cx88/cx88-dvb.c | 343 ++++++++--------------
drivers/media/video/cx88/cx88-i2c.c | 6
drivers/media/video/cx88/cx88-mpeg.c | 5
drivers/media/video/cx88/cx88-reg.h | 66 ++--
drivers/media/video/cx88/cx88-tvaudio.c | 28 +
drivers/media/video/cx88/cx88-vbi.c | 22 -
drivers/media/video/cx88/cx88-video.c | 153 +++++----
drivers/media/video/cx88/cx88.h | 28 -
13 files changed, 350 insertions(+), 424 deletions(-)
Index: linux-2004-11-05/drivers/media/video/cx88/cx88.h
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88.h 2004-11-07 12:24:30.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88.h 2004-11-07 16:01:04.547277171 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88.h,v 1.37 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88.h,v 1.40 2004/11/03 09:04:51 kraxel Exp $
*
* v4l2 device driver for cx2388x based TV cards
*
@@ -26,15 +26,10 @@
#include <linux/videodev.h>
#include <linux/kdev_t.h>
-#include <dvbdev.h>
-#include <dmxdev.h>
-#include <dvb_demux.h>
-#include <dvb_net.h>
-#include <dvb_frontend.h>
-
-#include <media/video-buf.h>
#include <media/tuner.h>
#include <media/audiochip.h>
+#include <media/video-buf.h>
+#include <media/video-buf-dvb.h>
#include "btcx-risc.h"
#include "cx88-reg.h"
@@ -160,6 +155,7 @@ extern struct sram_channel cx88_sram_cha
#define CX88_BOARD_HAUPPAUGE_DVB_T1 18
#define CX88_BOARD_CONEXANT_DVB_T1 19
#define CX88_BOARD_PROVIDEO_PV259 20
+#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS 21
enum cx88_itype {
CX88_VMUX_COMPOSITE1 = 1,
@@ -351,7 +347,6 @@ struct cx8802_fh {
};
struct cx8802_suspend_state {
- u32 pci_cfg[64 / sizeof(u32)];
int disabled;
};
@@ -369,11 +364,6 @@ struct cx8802_dev {
u32 ts_packet_size;
u32 ts_packet_count;
- /* error stats */
- u32 stopper_count;
- u32 error_count;
- u32 timeout_count;
-
/* other global state info */
struct cx8802_suspend_state state;
@@ -383,15 +373,7 @@ struct cx8802_dev {
u32 mailbox;
/* for dvb only */
- struct dvb_adapter *dvb_adapter;
- struct videobuf_queue dvbq;
- struct task_struct *dvb_thread;
- struct dvb_demux demux;
- struct dmxdev dmxdev;
- struct dmx_frontend fe_hw;
- struct dmx_frontend fe_mem;
- struct dvb_net dvbnet;
- int nfeeds;
+ struct videobuf_dvb dvb;
void* fe_handle;
int (*fe_release)(void *handle);
};
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-reg.h
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-reg.h 2004-11-07 12:22:32.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-reg.h 2004-11-07 16:01:04.548276982 +0100
@@ -1,5 +1,5 @@
-/*
- $Id: cx88-reg.h,v 1.5 2004/09/15 16:15:24 kraxel Exp $
+/*
+ $Id: cx88-reg.h,v 1.6 2004/10/13 10:39:00 kraxel Exp $
cx88x-hw.h - CX2388x register offsets
@@ -559,11 +559,11 @@
/* ---------------------------------------------------------------------- */
/* various constants */
-#define SEL_BTSC 0x01
-#define SEL_EIAJ 0x02
-#define SEL_A2 0x04
+#define SEL_BTSC 0x01
+#define SEL_EIAJ 0x02
+#define SEL_A2 0x04
#define SEL_SAP 0x08
-#define SEL_NICAM 0x10
+#define SEL_NICAM 0x10
#define SEL_FMRADIO 0x20
// AUD_CTL
@@ -618,7 +618,7 @@
#define EN_DMTRX_BYPASS (1 << 11)
#endif
-// Video
+// Video
#define VID_CAPTURE_CONTROL 0x310180
#define CX23880_CAP_CTL_CAPTURE_VBI_ODD (1<<3)
@@ -630,10 +630,10 @@
#define VideoInputMux1 0x1
#define VideoInputMux2 0x2
#define VideoInputMux3 0x3
-#define VideoInputTuner 0x0
-#define VideoInputComposite 0x1
+#define VideoInputTuner 0x0
+#define VideoInputComposite 0x1
#define VideoInputSVideo 0x2
-#define VideoInputOther 0x3
+#define VideoInputOther 0x3
#define Xtal0 0x1
#define Xtal1 0x2
@@ -644,12 +644,12 @@
#define VideoFormatNTSCJapan 0x2
#define VideoFormatNTSC443 0x3
#define VideoFormatPAL 0x4
-#define VideoFormatPALB 0x4
-#define VideoFormatPALD 0x4
-#define VideoFormatPALG 0x4
-#define VideoFormatPALH 0x4
-#define VideoFormatPALI 0x4
-#define VideoFormatPALBDGHI 0x4
+#define VideoFormatPALB 0x4
+#define VideoFormatPALD 0x4
+#define VideoFormatPALG 0x4
+#define VideoFormatPALH 0x4
+#define VideoFormatPALI 0x4
+#define VideoFormatPALBDGHI 0x4
#define VideoFormatPALM 0x5
#define VideoFormatPALN 0x6
#define VideoFormatPALNC 0x7
@@ -661,12 +661,12 @@
#define VideoFormatNTSCJapan27MHz 0x12
#define VideoFormatNTSC44327MHz 0x13
#define VideoFormatPAL27MHz 0x14
-#define VideoFormatPALB27MHz 0x14
-#define VideoFormatPALD27MHz 0x14
-#define VideoFormatPALG27MHz 0x14
-#define VideoFormatPALH27MHz 0x14
-#define VideoFormatPALI27MHz 0x14
-#define VideoFormatPALBDGHI27MHz 0x14
+#define VideoFormatPALB27MHz 0x14
+#define VideoFormatPALD27MHz 0x14
+#define VideoFormatPALG27MHz 0x14
+#define VideoFormatPALH27MHz 0x14
+#define VideoFormatPALI27MHz 0x14
+#define VideoFormatPALBDGHI27MHz 0x14
#define VideoFormatPALM27MHz 0x15
#define VideoFormatPALN27MHz 0x16
#define VideoFormatPALNC27MHz 0x17
@@ -745,8 +745,8 @@
#define CHANNEL_VIP_UP 0xA
#define CHANNEL_HOST_DN 0xB
#define CHANNEL_HOST_UP 0xC
-#define CHANNEL_FIRST 0x1
-#define CHANNEL_LAST 0xC
+#define CHANNEL_FIRST 0x1
+#define CHANNEL_LAST 0xC
#define GP_COUNT_CONTROL_NONE 0x0
#define GP_COUNT_CONTROL_INC 0x1
@@ -773,15 +773,15 @@
#define DEFAULT_SAT_U_NTSC 0x7F
#define DEFAULT_SAT_V_NTSC 0x5A
-typedef enum
-{
- SOURCE_TUNER = 0,
- SOURCE_COMPOSITE,
- SOURCE_SVIDEO,
- SOURCE_OTHER1,
- SOURCE_OTHER2,
- SOURCE_COMPVIASVIDEO,
- SOURCE_CCIR656
+typedef enum
+{
+ SOURCE_TUNER = 0,
+ SOURCE_COMPOSITE,
+ SOURCE_SVIDEO,
+ SOURCE_OTHER1,
+ SOURCE_OTHER2,
+ SOURCE_COMPVIASVIDEO,
+ SOURCE_CCIR656
} VIDEOSOURCETYPE;
#endif /* _CX88_REG_H_ */
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-cards.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-cards.c 2004-11-07 12:23:44.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-cards.c 2004-11-07 16:01:04.548276982 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-cards.c,v 1.44 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-cards.c,v 1.47 2004/11/03 09:04:50 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* card-specific stuff.
@@ -336,11 +336,11 @@ struct cx88_board cx88_boards[] = {
.tuner_type = TUNER_ABSENT, /* No analog tuner */
.input = {{
.type = CX88_VMUX_COMPOSITE1,
- .vmux = 0,
+ .vmux = 1,
.gpio0 = 0x000027df,
},{
.type = CX88_VMUX_SVIDEO,
- .vmux = 1,
+ .vmux = 2,
.gpio0 = 0x000027df,
}},
.dvb = 1,
@@ -438,6 +438,20 @@ struct cx88_board cx88_boards[] = {
}},
.blackbird = 1,
},
+ [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
+ .name = "DVICO FusionHDTV DVB-T Plus",
+ .tuner_type = TUNER_ABSENT, /* No analog tuner */
+ .input = {{
+ .type = CX88_VMUX_COMPOSITE1,
+ .vmux = 1,
+ .gpio0 = 0x000027df,
+ },{
+ .type = CX88_VMUX_SVIDEO,
+ .vmux = 2,
+ .gpio0 = 0x000027df,
+ }},
+ .dvb = 1,
+ },
};
const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
@@ -525,6 +539,10 @@ struct cx88_subid cx88_subids[] = {
.subvendor = 0x1540,
.subdevice = 0x2580,
.card = CX88_BOARD_PROVIDEO_PV259,
+ },{
+ .subvendor = 0x18AC,
+ .subdevice = 0xDB10,
+ .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
}
};
const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
@@ -612,7 +630,7 @@ static struct {
{ TUNER_ABSENT, "Philips TD1536D_FH_44"},
{ TUNER_LG_NTSC_FM, "LG TPI8NSR01F"},
{ TUNER_LG_PAL_FM, "LG TPI8PSB01D"},
- { TUNER_LG_PAL, "LG TPI8PSB11D"},
+ { TUNER_LG_PAL, "LG TPI8PSB11D"},
{ TUNER_LG_PAL_I_FM, "LG TAPC-I001D"},
{ TUNER_LG_PAL_I, "LG TAPC-I701D"}
};
@@ -634,12 +652,12 @@ static void hauppauge_eeprom(struct cx88
model = eeprom_data[12] << 8 | eeprom_data[11];
tuner = eeprom_data[9];
radio = eeprom_data[blk2-1] & 0x01;
-
+
if (tuner < ARRAY_SIZE(hauppauge_tuner))
core->tuner_type = hauppauge_tuner[tuner].id;
if (radio)
core->has_radio = 1;
-
+
printk(KERN_INFO "%s: hauppauge eeprom: model=%d, "
"tuner=%s (%d), radio=%s\n",
core->name, model, (tuner < ARRAY_SIZE(hauppauge_tuner)
@@ -804,7 +822,7 @@ void cx88_card_list(struct cx88_core *co
void cx88_card_setup(struct cx88_core *core)
{
static u8 eeprom[128];
-
+
switch (core->board) {
case CX88_BOARD_HAUPPAUGE:
if (0 == core->i2c_rc)
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-core.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-core.c 2004-11-07 12:22:08.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-core.c 2004-11-07 16:01:04.549276793 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-core.c,v 1.13 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-core.c,v 1.15 2004/10/25 11:26:36 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* driver core
@@ -50,13 +50,12 @@ module_param(latency,int,0444);
MODULE_PARM_DESC(latency,"pci latency timer");
static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static int tuner_num;
-module_param_array(tuner,int,&tuner_num,0444);
-MODULE_PARM_DESC(tuner,"tuner type");
+static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
+
+module_param_array(tuner, int, NULL, 0444);
+module_param_array(card, int, NULL, 0444);
-static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static int card_num;
-module_param_array(card,int,&card_num,0444);
+MODULE_PARM_DESC(tuner,"tuner type");
MODULE_PARM_DESC(card,"card type");
static unsigned int nicam = 0;
@@ -137,7 +136,7 @@ static u32* cx88_risc_field(u32 *rp, str
/* sync instruction */
if (sync_line != NO_SYNC_LINE)
*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
-
+
/* scan lines */
sg = sglist;
for (line = 0; line < lines; line++) {
@@ -291,7 +290,7 @@ cx88_free_buffer(struct pci_dev *pci, st
*
* Every channel has 160 bytes control data (64 bytes instruction
* queue and 6 CDT entries), which is close to 2k total.
- *
+ *
* Address layout:
* 0x0000 - 0x03ff CMDs / reserved
* 0x0400 - 0x0bff instruction queues + CDs
@@ -467,7 +466,7 @@ void cx88_risc_disasm(struct cx88_core *
struct btcx_riscmem *risc)
{
unsigned int i,j,n;
-
+
printk("%s: risc disasm: %p [dma=0x%08lx]\n",
core->name, risc->cpu, (unsigned long)risc->dma);
for (i = 0; i < (risc->size >> 2); i += n) {
@@ -537,13 +536,13 @@ void cx88_sram_channel_dump(struct cx88_
}
char *cx88_pci_irqs[32] = {
- "vid", "aud", "ts", "vip", "hst", "5", "6", "tm1",
+ "vid", "aud", "ts", "vip", "hst", "5", "6", "tm1",
"src_dma", "dst_dma", "risc_rd_err", "risc_wr_err",
"brdg_err", "src_dma_err", "dst_dma_err", "ipb_dma_err",
"i2c", "i2c_rack", "ir_smp", "gpio0", "gpio1"
};
char *cx88_vid_irqs[32] = {
- "y_risci1", "u_risci1", "v_risci1", "vbi_risc1",
+ "y_risci1", "u_risci1", "v_risci1", "vbi_risc1",
"y_risci2", "u_risci2", "v_risci2", "vbi_risc2",
"y_oflow", "u_oflow", "v_oflow", "vbi_oflow",
"y_sync", "u_sync", "v_sync", "vbi_sync",
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-i2c.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-i2c.c 2004-11-07 12:22:20.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-i2c.c 2004-11-07 16:01:04.549276793 +0100
@@ -1,5 +1,5 @@
/*
- $Id: cx88-i2c.c,v 1.17 2004/10/11 13:45:51 kraxel Exp $
+ $Id: cx88-i2c.c,v 1.18 2004/10/13 10:39:00 kraxel Exp $
cx88-i2c.c -- all the i2c code is here
@@ -21,7 +21,7 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
+
*/
#include <linux/module.h>
@@ -72,7 +72,7 @@ static int cx8800_bit_getscl(void *data)
{
struct cx88_core *core = data;
u32 state;
-
+
state = cx_read(MO_I2C);
return state & 0x02 ? 1 : 0;
}
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-tvaudio.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-tvaudio.c 2004-11-07 12:22:29.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-tvaudio.c 2004-11-07 16:01:04.550276604 +0100
@@ -1,5 +1,5 @@
/*
- $Id: cx88-tvaudio.c,v 1.22 2004/10/11 13:45:51 kraxel Exp $
+ $Id: cx88-tvaudio.c,v 1.24 2004/10/25 11:51:00 kraxel Exp $
cx88x-audio.c - Conexant CX23880/23881 audio downstream driver driver
@@ -18,9 +18,9 @@
Some comes from the dscaler sources, one of the dscaler driver guy works
for Conexant ...
-
+
-----------------------------------------------------------------------
-
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
@@ -553,6 +553,13 @@ static void set_audio_standard_A2(struct
set_audio_start(core, 0x0004, EN_DMTRX_SUMDIFF | EN_A2_AUTO_STEREO);
set_audio_registers(core, a2_common);
switch (core->tvaudio) {
+ case WW_NICAM_I:
+ /* gives at least mono according to the dscaler guys */
+ /* so use use that while nicam is broken ... */
+ dprintk("%s PAL-I mono (status: unknown)\n",__FUNCTION__);
+ set_audio_registers(core, a2_table1);
+ cx_write(AUD_CTL, EN_A2_FORCE_MONO1);
+ break;
case WW_A2_BG:
dprintk("%s PAL-BG A2 (status: known-good)\n",__FUNCTION__);
set_audio_registers(core, a2_table1);
@@ -601,7 +608,7 @@ static void set_audio_standard_FM(struct
cx_write(AUD_DEEMPH1_B0, 0x1C29);
cx_write(AUD_DEEMPH1_A1, 0x3FC66);
cx_write(AUD_DEEMPH1_B1, 0x399A);
-
+
break;
case WW_FM_DEEMPH_75:
@@ -639,10 +646,11 @@ void cx88_set_tvaudio(struct cx88_core *
case WW_BTSC:
set_audio_standard_BTSC(core,0);
break;
- case WW_NICAM_I:
+ // case WW_NICAM_I:
case WW_NICAM_BGDKL:
set_audio_standard_NICAM(core);
break;
+ case WW_NICAM_I:
case WW_A2_BG:
case WW_A2_DK:
case WW_A2_M:
@@ -750,7 +758,7 @@ void cx88_set_stereo(struct cx88_core *c
case WW_A2_DK:
case WW_A2_M:
switch (mode) {
- case V4L2_TUNER_MODE_MONO:
+ case V4L2_TUNER_MODE_MONO:
case V4L2_TUNER_MODE_LANG1:
ctl = EN_A2_FORCE_MONO1;
mask = 0x3f;
@@ -767,7 +775,7 @@ void cx88_set_stereo(struct cx88_core *c
break;
case WW_NICAM_BGDKL:
switch (mode) {
- case V4L2_TUNER_MODE_MONO:
+ case V4L2_TUNER_MODE_MONO:
ctl = EN_NICAM_FORCE_MONO1;
mask = 0x3f;
break;
@@ -780,10 +788,10 @@ void cx88_set_stereo(struct cx88_core *c
mask = 0x93f;
break;
}
- break;
+ break;
case WW_FM:
switch (mode) {
- case V4L2_TUNER_MODE_MONO:
+ case V4L2_TUNER_MODE_MONO:
ctl = EN_FMRADIO_FORCE_MONO;
mask = 0x3f;
break;
@@ -792,7 +800,7 @@ void cx88_set_stereo(struct cx88_core *c
mask = 0x3f;
break;
}
- break;
+ break;
}
if (UNSET != ctl) {
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-video.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-video.c 2004-11-07 12:22:59.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-video.c 2004-11-07 16:01:04.551276416 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-video.c,v 1.40 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-video.c,v 1.46 2004/11/07 14:44:59 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* video4linux video interface
@@ -41,18 +41,15 @@ MODULE_LICENSE("GPL");
/* ------------------------------------------------------------------ */
static unsigned int video_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int video_nr_num;
-module_param_array(video_nr,int,&video_nr_num,0444);
-MODULE_PARM_DESC(video_nr,"video device numbers");
+static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
+static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int vbi_nr_num;
-module_param_array(vbi_nr,int,&vbi_nr_num,0444);
-MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
+module_param_array(video_nr, int, NULL, 0444);
+module_param_array(vbi_nr, int, NULL, 0444);
+module_param_array(radio_nr, int, NULL, 0444);
-static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int radio_nr_num;
-module_param_array(radio_nr,int,&radio_nr_num,0444);
+MODULE_PARM_DESC(video_nr,"video device numbers");
+MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
MODULE_PARM_DESC(radio_nr,"radio device numbers");
static unsigned int video_debug = 0;
@@ -210,7 +207,7 @@ static struct cx8800_fmt formats[] = {
static struct cx8800_fmt* format_by_fourcc(unsigned int fourcc)
{
unsigned int i;
-
+
for (i = 0; i < ARRAY_SIZE(formats); i++)
if (formats[i].fourcc == fourcc)
return formats+i;
@@ -433,10 +430,10 @@ static int start_video_dma(struct cx8800
/* enable irqs */
cx_set(MO_PCI_INTMSK, 0x00fc01);
cx_set(MO_VID_INTMSK, 0x0f0011);
-
+
/* enable capture */
cx_set(VID_CAPTURE_CONTROL,0x06);
-
+
/* start dma */
cx_set(MO_DEV_CNTRL2, (1<<5));
cx_set(MO_VID_DMACNTRL, 0x11);
@@ -465,7 +462,7 @@ static int restart_video_queue(struct cx
{
struct cx88_buffer *buf, *prev;
struct list_head *item;
-
+
if (!list_empty(&q->active)) {
buf = list_entry(q->active.next, struct cx88_buffer, vb.queue);
dprintk(2,"restart_queue [%p/%d]: restart dma\n",
@@ -514,10 +511,10 @@ static int restart_video_queue(struct cx
/* ------------------------------------------------------------------ */
static int
-buffer_setup(void *priv, unsigned int *count, unsigned int *size)
+buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
{
- struct cx8800_fh *fh = priv;
-
+ struct cx8800_fh *fh = q->priv_data;
+
*size = fh->fmt->depth*fh->width*fh->height >> 3;
if (0 == *count)
*count = 32;
@@ -527,12 +524,12 @@ buffer_setup(void *priv, unsigned int *c
}
static int
-buffer_prepare(void *priv, struct videobuf_buffer *vb,
+buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
enum v4l2_field field)
{
- struct cx8800_fh *fh = priv;
+ struct cx8800_fh *fh = q->priv_data;
struct cx8800_dev *dev = fh->dev;
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
int rc, init_buffer = 0;
BUG_ON(NULL == fh->fmt);
@@ -611,11 +608,11 @@ buffer_prepare(void *priv, struct videob
}
static void
-buffer_queue(void *priv, struct videobuf_buffer *vb)
+buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
struct cx88_buffer *prev;
- struct cx8800_fh *fh = priv;
+ struct cx8800_fh *fh = vq->priv_data;
struct cx8800_dev *dev = fh->dev;
struct cx88_dmaqueue *q = &dev->vidq;
@@ -659,10 +656,10 @@ buffer_queue(void *priv, struct videobuf
}
}
-static void buffer_release(void *priv, struct videobuf_buffer *vb)
+static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
- struct cx8800_fh *fh = priv;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
+ struct cx8800_fh *fh = q->priv_data;
cx88_free_buffer(fh->dev->pci,buf);
}
@@ -722,7 +719,7 @@ static u32* ov_risc_field(struct cx8800_
ra = addr + (fh->fmt->depth>>3)*start;
else
ra = 0;
-
+
if (0 == start)
ri |= RISC_SOL;
if (fh->win.w.width == end)
@@ -745,11 +742,11 @@ static int ov_risc_frame(struct cx8800_d
u32 instructions,fields;
u32 *rp;
int rc;
-
+
/* skip list for window clipping */
if (NULL == (skips = kmalloc(sizeof(*skips) * fh->nclips,GFP_KERNEL)))
return -ENOMEM;
-
+
fields = 0;
if (V4L2_FIELD_HAS_TOP(fh->win.field))
fields++;
@@ -875,7 +872,7 @@ static int setup_window(struct cx8800_de
default:
BUG();
}
-
+
down(&fh->vidq.lock);
if (fh->clips)
kfree(fh->clips);
@@ -885,13 +882,13 @@ static int setup_window(struct cx8800_de
#if 0
fh->ov.setup_ok = 1;
#endif
-
+
/* update overlay if needed */
retval = 0;
#if 0
if (check_btres(fh, RESOURCE_OVERLAY)) {
struct bttv_buffer *new;
-
+
new = videobuf_alloc(sizeof(*new));
bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
retval = bttv_switch_overlay(btv,fh,new);
@@ -938,7 +935,7 @@ static int video_open(struct inode *inod
struct list_head *list;
enum v4l2_buf_type type = 0;
int radio = 0;
-
+
list_for_each(list,&cx8800_devlist) {
h = list_entry(list, struct cx8800_dev, devlist);
if (h->video_dev->minor == minor) {
@@ -978,14 +975,14 @@ static int video_open(struct inode *inod
dev->pci, &dev->slock,
V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_FIELD_INTERLACED,
- sizeof(struct cx88_buffer));
+ sizeof(struct cx88_buffer),
+ fh);
videobuf_queue_init(&fh->vbiq, &cx8800_vbi_qops,
dev->pci, &dev->slock,
V4L2_BUF_TYPE_VBI_CAPTURE,
V4L2_FIELD_SEQ_TB,
- sizeof(struct cx88_buffer));
- init_MUTEX(&fh->vidq.lock);
- init_MUTEX(&fh->vbiq.lock);
+ sizeof(struct cx88_buffer),
+ fh);
if (fh->radio) {
struct cx88_core *core = dev->core;
@@ -1013,14 +1010,12 @@ video_read(struct file *file, char *data
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
if (res_locked(fh->dev,RESOURCE_VIDEO))
return -EBUSY;
- return videobuf_read_one(file->private_data,
- &fh->vidq, data, count, ppos,
+ return videobuf_read_one(&fh->vidq, data, count, ppos,
file->f_flags & O_NONBLOCK);
case V4L2_BUF_TYPE_VBI_CAPTURE:
if (!res_get(fh->dev,fh,RESOURCE_VBI))
return -EBUSY;
- return videobuf_read_stream(file->private_data,
- &fh->vbiq, data, count, ppos, 1,
+ return videobuf_read_stream(&fh->vbiq, data, count, ppos, 1,
file->f_flags & O_NONBLOCK);
default:
BUG();
@@ -1032,16 +1027,30 @@ static unsigned int
video_poll(struct file *file, struct poll_table_struct *wait)
{
struct cx8800_fh *fh = file->private_data;
+ struct cx88_buffer *buf;
if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
if (!res_get(fh->dev,fh,RESOURCE_VBI))
return POLLERR;
- return videobuf_poll_stream(file, file->private_data,
- &fh->vbiq, wait);
+ return videobuf_poll_stream(file, &fh->vbiq, wait);
}
- /* FIXME */
- return POLLERR;
+ if (res_check(fh,RESOURCE_VIDEO)) {
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,struct cx88_buffer,vb.stream);
+ } else {
+ /* read() capture */
+ buf = (struct cx88_buffer*)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
+ }
+ poll_wait(file, &buf->vb.done, wait);
+ if (buf->vb.state == STATE_DONE ||
+ buf->vb.state == STATE_ERROR)
+ return POLLIN|POLLRDNORM;
+ return 0;
}
static int video_release(struct inode *inode, struct file *file)
@@ -1057,7 +1066,7 @@ static int video_release(struct inode *i
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO)) {
- videobuf_queue_cancel(file->private_data,&fh->vidq);
+ videobuf_queue_cancel(&fh->vidq);
res_free(dev,fh,RESOURCE_VIDEO);
}
if (fh->vidq.read_buf) {
@@ -1068,9 +1077,9 @@ static int video_release(struct inode *i
/* stop vbi capture */
if (res_check(fh, RESOURCE_VBI)) {
if (fh->vbiq.streaming)
- videobuf_streamoff(file->private_data,&fh->vbiq);
+ videobuf_streamoff(&fh->vbiq);
if (fh->vbiq.reading)
- videobuf_read_stop(file->private_data,&fh->vbiq);
+ videobuf_read_stop(&fh->vbiq);
res_free(dev,fh,RESOURCE_VBI);
}
@@ -1084,7 +1093,7 @@ video_mmap(struct file *file, struct vm_
{
struct cx8800_fh *fh = file->private_data;
- return videobuf_mmap_mapper(vma, get_queue(fh));
+ return videobuf_mmap_mapper(get_queue(fh), vma);
}
/* ------------------------------------------------------------------ */
@@ -1095,7 +1104,7 @@ static int get_control(struct cx8800_dev
struct cx88_ctrl *c = NULL;
u32 value;
int i;
-
+
for (i = 0; i < CX8800_CTLS; i++)
if (cx8800_ctls[i].v.id == ctl->id)
c = &cx8800_ctls[i];
@@ -1269,7 +1278,7 @@ static int cx8800_s_fmt(struct cx8800_de
struct v4l2_format *f)
{
int err;
-
+
switch (f->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
err = cx8800_try_fmt(dev,fh,f);
@@ -1311,7 +1320,7 @@ static int video_do_ioctl(struct inode *
case VIDIOC_QUERYCAP:
{
struct v4l2_capability *cap = arg;
-
+
memset(cap,0,sizeof(*cap));
strcpy(cap->driver, "cx8800");
strlcpy(cap->card, cx88_boards[core->board].name,
@@ -1416,7 +1425,7 @@ static int video_do_ioctl(struct inode *
case VIDIOC_S_INPUT:
{
unsigned int *i = arg;
-
+
if (*i >= 4)
return -EINVAL;
down(&dev->lock);
@@ -1520,13 +1529,13 @@ static int video_do_ioctl(struct inode *
return get_control(dev,arg);
case VIDIOC_S_CTRL:
return set_control(dev,arg);
-
+
/* --- tuner ioctls ------------------------------------------ */
case VIDIOC_G_TUNER:
{
struct v4l2_tuner *t = arg;
u32 reg;
-
+
if (UNSET == core->tuner_type)
return -EINVAL;
if (0 != t->index)
@@ -1603,7 +1612,7 @@ static int video_do_ioctl(struct inode *
req.type = q->type;
req.count = 8;
req.memory = V4L2_MEMORY_MMAP;
- err = videobuf_reqbufs(file->private_data,q,&req);
+ err = videobuf_reqbufs(q,&req);
if (err < 0)
return err;
memset(mbuf,0,sizeof(*mbuf));
@@ -1616,16 +1625,16 @@ static int video_do_ioctl(struct inode *
return 0;
}
case VIDIOC_REQBUFS:
- return videobuf_reqbufs(file->private_data, get_queue(fh), arg);
+ return videobuf_reqbufs(get_queue(fh), arg);
case VIDIOC_QUERYBUF:
return videobuf_querybuf(get_queue(fh), arg);
case VIDIOC_QBUF:
- return videobuf_qbuf(file->private_data, get_queue(fh), arg);
+ return videobuf_qbuf(get_queue(fh), arg);
case VIDIOC_DQBUF:
- return videobuf_dqbuf(file->private_data, get_queue(fh), arg,
+ return videobuf_dqbuf(get_queue(fh), arg,
file->f_flags & O_NONBLOCK);
case VIDIOC_STREAMON:
@@ -1634,13 +1643,13 @@ static int video_do_ioctl(struct inode *
if (!res_get(dev,fh,res))
return -EBUSY;
- return videobuf_streamon(file->private_data, get_queue(fh));
+ return videobuf_streamon(get_queue(fh));
}
case VIDIOC_STREAMOFF:
{
int res = get_ressource(fh);
- err = videobuf_streamoff(file->private_data, get_queue(fh));
+ err = videobuf_streamoff(get_queue(fh));
if (err < 0)
return err;
res_free(dev,fh,res);
@@ -1668,7 +1677,7 @@ static int radio_do_ioctl(struct inode *
struct cx8800_fh *fh = file->private_data;
struct cx8800_dev *dev = fh->dev;
struct cx88_core *core = dev->core;
-
+
if (video_debug > 1)
cx88_print_ioctl(core->name,cmd);
@@ -1676,7 +1685,7 @@ static int radio_do_ioctl(struct inode *
case VIDIOC_QUERYCAP:
{
struct v4l2_capability *cap = arg;
-
+
memset(cap,0,sizeof(*cap));
strcpy(cap->driver, "cx8800");
strlcpy(cap->card, cx88_boards[core->board].name,
@@ -1697,7 +1706,7 @@ static int radio_do_ioctl(struct inode *
strcpy(t->name, "Radio");
t->rangelow = (int)(65*16);
t->rangehigh = (int)(108*16);
-
+
#ifdef V4L2_I2C_CLIENTS
cx88_call_i2c_clients(dev->core,VIDIOC_G_TUNER,t);
#else
@@ -1713,7 +1722,7 @@ static int radio_do_ioctl(struct inode *
case VIDIOC_ENUMINPUT:
{
struct v4l2_input *i = arg;
-
+
if (i->index != 0)
return -EINVAL;
strcpy(i->name,"Radio");
@@ -1770,7 +1779,7 @@ static int radio_do_ioctl(struct inode *
case VIDIOC_G_FREQUENCY:
case VIDIOC_S_FREQUENCY:
return video_do_ioctl(inode,file,cmd,arg);
-
+
default:
return v4l_compat_translate_ioctl(inode,file,cmd,arg,
radio_do_ioctl);
@@ -1795,7 +1804,7 @@ static void cx8800_vid_timeout(unsigned
unsigned long flags;
cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH21]);
-
+
cx_clear(MO_VID_DMACNTRL, 0x11);
cx_clear(VID_CAPTURE_CONTROL, 0x06);
@@ -1833,7 +1842,7 @@ static void cx8800_vid_irq(struct cx8800
cx_clear(VID_CAPTURE_CONTROL, 0x06);
cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH21]);
}
-
+
/* risc1 y */
if (status & 0x01) {
spin_lock(&dev->slock);
@@ -1892,7 +1901,7 @@ static irqreturn_t cx8800_irq(int irq, v
core->name);
cx_write(MO_PCI_INTMSK,0);
}
-
+
out:
return IRQ_RETVAL(handled);
}
@@ -2134,7 +2143,7 @@ static void __devexit cx8800_finidev(str
cx88_shutdown(dev->core); /* FIXME */
pci_disable_device(pci_dev);
- /* unregister stuff */
+ /* unregister stuff */
free_irq(pci_dev->irq, dev);
cx8800_unregister_video(dev);
@@ -2170,7 +2179,7 @@ static int cx8800_suspend(struct pci_dev
/* FIXME -- shutdown device */
cx88_shutdown(dev->core);
#endif
-
+
pci_save_state(pci_dev);
if (0 != pci_set_power_state(pci_dev, state)) {
pci_disable_device(pci_dev);
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-vbi.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-vbi.c 2004-11-07 12:22:41.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-vbi.c 2004-11-07 16:01:04.551276416 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-vbi.c,v 1.12 2004/10/11 13:45:51 kraxel Exp $
+ * $Id: cx88-vbi.c,v 1.14 2004/11/07 13:17:15 kraxel Exp $
*/
#include <linux/kernel.h>
#include <linux/module.h>
@@ -143,7 +143,7 @@ void cx8800_vbi_timeout(unsigned long da
/* ------------------------------------------------------------------ */
static int
-vbi_setup(void *priv, unsigned int *count, unsigned int *size)
+vbi_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
{
*size = VBI_LINE_COUNT * VBI_LINE_LENGTH * 2;
if (0 == *count)
@@ -156,12 +156,12 @@ vbi_setup(void *priv, unsigned int *coun
}
static int
-vbi_prepare(void *priv, struct videobuf_buffer *vb,
+vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
enum v4l2_field field)
{
- struct cx8800_fh *fh = priv;
+ struct cx8800_fh *fh = q->priv_data;
struct cx8800_dev *dev = fh->dev;
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
unsigned int size;
int rc;
@@ -192,11 +192,11 @@ vbi_prepare(void *priv, struct videobuf_
}
static void
-vbi_queue(void *priv, struct videobuf_buffer *vb)
+vbi_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
struct cx88_buffer *prev;
- struct cx8800_fh *fh = priv;
+ struct cx8800_fh *fh = vq->priv_data;
struct cx8800_dev *dev = fh->dev;
struct cx88_dmaqueue *q = &dev->vbiq;
@@ -224,10 +224,10 @@ vbi_queue(void *priv, struct videobuf_bu
}
}
-static void vbi_release(void *priv, struct videobuf_buffer *vb)
+static void vbi_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx88_buffer *buf = (struct cx88_buffer*)vb;
- struct cx8800_fh *fh = priv;
+ struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
+ struct cx8800_fh *fh = q->priv_data;
cx88_free_buffer(fh->dev->pci,buf);
}
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-mpeg.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-mpeg.c 2004-11-07 12:24:38.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-mpeg.c 2004-11-07 16:01:04.552276227 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-mpeg.c,v 1.11 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-mpeg.c,v 1.14 2004/10/25 11:26:36 kraxel Exp $
*
* Support for the mpeg transport stream transfers
* PCI function #2 of the cx2388x.
@@ -239,7 +239,6 @@ static void cx8802_timeout(unsigned long
if (debug)
cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH28]);
cx8802_stop_dma(dev);
- dev->timeout_count++;
do_cancel_buffers(dev,"timeout",1);
}
@@ -276,7 +275,6 @@ static void cx8802_mpeg_irq(struct cx880
/* risc2 y */
if (status & 0x10) {
spin_lock(&dev->slock);
- dev->stopper_count++;
cx8802_restart_queue(dev,&dev->mpegq);
spin_unlock(&dev->slock);
}
@@ -284,7 +282,6 @@ static void cx8802_mpeg_irq(struct cx880
/* other general errors */
if (status & 0x1f0100) {
spin_lock(&dev->slock);
- dev->error_count++;
cx8802_stop_dma(dev);
cx8802_restart_queue(dev,&dev->mpegq);
spin_unlock(&dev->slock);
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-dvb.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-dvb.c 2004-11-07 12:23:11.639793830 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-dvb.c 2004-11-07 16:01:04.552276227 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-dvb.c,v 1.12 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-dvb.c,v 1.19 2004/11/07 14:44:59 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* MPEG Transport Stream (DVB) routines
@@ -32,6 +32,8 @@
#include "cx88.h"
#include "cx22702.h"
+#include "mt352.h"
+#include "mt352_priv.h" /* FIXME */
MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
MODULE_AUTHOR("Chris Pascoe <[email protected]>");
@@ -47,9 +49,10 @@ MODULE_PARM_DESC(debug,"enable debug mes
/* ------------------------------------------------------------------ */
-static int dvb_buf_setup(void *priv, unsigned int *count, unsigned int *size)
+static int dvb_buf_setup(struct videobuf_queue *q,
+ unsigned int *count, unsigned int *size)
{
- struct cx8802_dev *dev = priv;
+ struct cx8802_dev *dev = q->priv_data;
dev->ts_packet_size = 188 * 4;
dev->ts_packet_count = 32;
@@ -59,22 +62,22 @@ static int dvb_buf_setup(void *priv, uns
return 0;
}
-static int dvb_buf_prepare(void *priv, struct videobuf_buffer *vb,
+static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
enum v4l2_field field)
{
- struct cx8802_dev *dev = priv;
+ struct cx8802_dev *dev = q->priv_data;
return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb);
}
-static void dvb_buf_queue(void *priv, struct videobuf_buffer *vb)
+static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx8802_dev *dev = priv;
+ struct cx8802_dev *dev = q->priv_data;
cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
}
-static void dvb_buf_release(void *priv, struct videobuf_buffer *vb)
+static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx8802_dev *dev = priv;
+ struct cx8802_dev *dev = q->priv_data;
cx88_free_buffer(dev->pci, (struct cx88_buffer*)vb);
}
@@ -85,233 +88,141 @@ struct videobuf_queue_ops dvb_qops = {
.buf_release = dvb_buf_release,
};
-static int dvb_thread(void *data)
-{
- struct cx8802_dev *dev = data;
- struct videobuf_buffer *buf;
- unsigned long flags;
- int err;
-
- dprintk(1,"dvb thread started\n");
- videobuf_read_start(dev, &dev->dvbq);
-
- for (;;) {
- /* fetch next buffer */
- buf = list_entry(dev->dvbq.stream.next,
- struct videobuf_buffer, stream);
- list_del(&buf->stream);
- err = videobuf_waiton(buf,0,1);
- BUG_ON(0 != err);
-
- /* no more feeds left or stop_feed() asked us to quit */
- if (0 == dev->nfeeds)
- break;
- if (kthread_should_stop())
- break;
- if (current->flags & PF_FREEZE)
- refrigerator(PF_FREEZE);
-
- /* feed buffer data to demux */
- if (buf->state == STATE_DONE)
- dvb_dmx_swfilter(&dev->demux, buf->dma.vmalloc,
- buf->size);
-
- /* requeue buffer */
- list_add_tail(&buf->stream,&dev->dvbq.stream);
- spin_lock_irqsave(dev->dvbq.irqlock,flags);
- dev->dvbq.ops->buf_queue(dev,buf);
- spin_unlock_irqrestore(dev->dvbq.irqlock,flags);
-
- /* log errors if any */
- if (dev->error_count || dev->stopper_count) {
- printk("%s: error=%d stopper=%d\n",
- dev->core->name, dev->error_count,
- dev->stopper_count);
- dev->error_count = 0;
- dev->stopper_count = 0;
- }
- if (debug && dev->timeout_count) {
- printk("%s: timeout=%d (FE not locked?)\n",
- dev->core->name, dev->timeout_count);
- dev->timeout_count = 0;
- }
- }
-
- videobuf_read_stop(dev, &dev->dvbq);
- dprintk(1,"dvb thread stopped\n");
+/* ------------------------------------------------------------------ */
- /* Hmm, linux becomes *very* unhappy without this ... */
- while (!kthread_should_stop()) {
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule();
- }
+static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
+{
+ static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 };
+ static u8 reset [] = { RESET, 0x80 };
+ static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
+ static u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
+ static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
+ static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
+
+ mt352_write(fe, clock_config, sizeof(clock_config));
+ udelay(200);
+ mt352_write(fe, reset, sizeof(reset));
+ mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
+
+ mt352_write(fe, agc_cfg, sizeof(agc_cfg));
+ mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
+ mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
return 0;
}
-/* ---------------------------------------------------------------------------- */
+#define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */
-static int dvb_start_feed(struct dvb_demux_feed *feed)
+static int lg_z201_pll_set(struct dvb_frontend* fe,
+ struct dvb_frontend_parameters* params, u8* pllbuf)
{
- struct dvb_demux *demux = feed->demux;
- struct cx8802_dev *dev = demux->priv;
- int rc;
+ u32 div;
+ unsigned char cp = 0;
+ unsigned char bs = 0;
+
+ div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
+
+ if (params->frequency < 542000000) cp = 0xbc;
+ else if (params->frequency < 830000000) cp = 0xf4;
+ else cp = 0xfc;
+
+ if (params->frequency == 0) bs = 0x03;
+ else if (params->frequency < 157500000) bs = 0x01;
+ else if (params->frequency < 443250000) bs = 0x02;
+ else bs = 0x04;
+
+ pllbuf[0] = 0xC2; /* Note: non-linux standard PLL I2C address */
+ pllbuf[1] = div >> 8;
+ pllbuf[2] = div & 0xff;
+ pllbuf[3] = cp;
+ pllbuf[4] = bs;
- if (!demux->dmx.frontend)
- return -EINVAL;
+ return 0;
+}
- down(&dev->lock);
- dev->nfeeds++;
- rc = dev->nfeeds;
-
- if (NULL != dev->dvb_thread)
- goto out;
- dev->dvb_thread = kthread_run(dvb_thread, dev, "%s dvb", dev->core->name);
- if (IS_ERR(dev->dvb_thread)) {
- rc = PTR_ERR(dev->dvb_thread);
- dev->dvb_thread = NULL;
- }
+static int thomson_dtt7579_pll_set(struct dvb_frontend* fe,
+ struct dvb_frontend_parameters* params,
+ u8* pllbuf)
+{
+ u32 div;
+ unsigned char cp = 0;
+ unsigned char bs = 0;
+
+ div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
+
+ if (params->frequency < 542000000) cp = 0xb4;
+ else if (params->frequency < 771000000) cp = 0xbc;
+ else cp = 0xf4;
+
+ if (params->frequency == 0) bs = 0x03;
+ else if (params->frequency < 443250000) bs = 0x02;
+ else bs = 0x08;
+
+ pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address
+ pllbuf[1] = div >> 8;
+ pllbuf[2] = div & 0xff;
+ pllbuf[3] = cp;
+ pllbuf[4] = bs;
-out:
- up(&dev->lock);
- dprintk(2, "%s rc=%d\n",__FUNCTION__,rc);
- return rc;
-}
-
-static int dvb_stop_feed(struct dvb_demux_feed *feed)
-{
- struct dvb_demux *demux = feed->demux;
- struct cx8802_dev *dev = demux->priv;
- int err = 0;
-
- dprintk(2, "%s\n",__FUNCTION__);
-
- down(&dev->lock);
- dev->nfeeds--;
- if (0 == dev->nfeeds && NULL != dev->dvb_thread) {
- cx8802_cancel_buffers(dev);
- err = kthread_stop(dev->dvb_thread);
- dev->dvb_thread = NULL;
- }
- up(&dev->lock);
- return err;
+ return 0;
}
-static void dvb_unregister(struct cx8802_dev *dev)
-{
-#if 1 /* really needed? */
- down(&dev->lock);
- if (NULL != dev->dvb_thread) {
- kthread_stop(dev->dvb_thread);
- BUG();
- }
- up(&dev->lock);
-#endif
+struct mt352_config dvico_fusionhdtv_dvbt1 = {
+ .demod_address = 0x0F,
+ .demod_init = dvico_fusionhdtv_demod_init,
+ .pll_set = lg_z201_pll_set,
+};
- dvb_net_release(&dev->dvbnet);
- dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_mem);
- dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_hw);
- dvb_dmxdev_release(&dev->dmxdev);
- dvb_dmx_release(&dev->demux);
- if (dev->fe_handle)
- dev->fe_release(dev->fe_handle);
- dvb_unregister_adapter(dev->dvb_adapter);
- return;
-}
+struct mt352_config dvico_fusionhdtv_dvbt_plus = {
+ .demod_address = 0x0F,
+ .demod_init = dvico_fusionhdtv_demod_init,
+ .pll_set = thomson_dtt7579_pll_set,
+};
static int dvb_register(struct cx8802_dev *dev)
{
- int result;
+ /* init struct videobuf_dvb */
+ dev->dvb.name = dev->core->name;
- /* adapter */
- result = dvb_register_adapter(&dev->dvb_adapter, dev->core->name,
- THIS_MODULE);
- if (result < 0) {
- printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n",
- dev->core->name, result);
- goto fail1;
- }
-
- /* frontend */
+ /* init frontend */
switch (dev->core->board) {
case CX88_BOARD_HAUPPAUGE_DVB_T1:
case CX88_BOARD_CONEXANT_DVB_T1:
- dev->fe_handle = cx22702_create(&dev->core->i2c_adap,
- dev->dvb_adapter,
- dev->core->pll_addr,
- dev->core->pll_type,
- dev->core->demod_addr);
- dev->fe_release = cx22702_destroy;
+ dev->dvb.frontend = cx22702_create(&dev->core->i2c_adap,
+ dev->core->pll_addr,
+ dev->core->pll_type,
+ dev->core->demod_addr);
+ break;
+ case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
+ dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dvbt1,
+ &dev->core->i2c_adap);
+ if (dev->dvb.frontend) {
+ dev->dvb.frontend->ops->info.frequency_min = 174000000;
+ dev->dvb.frontend->ops->info.frequency_max = 862000000;
+ }
+ break;
+ case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
+ dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dvbt_plus,
+ &dev->core->i2c_adap);
+ if (dev->dvb.frontend) {
+ dev->dvb.frontend->ops->info.frequency_min = 174000000;
+ dev->dvb.frontend->ops->info.frequency_max = 862000000;
+ }
break;
default:
- printk("%s: FIXME: frontend handing not here yet ...\n",
+ printk("%s: FIXME: frontend handling not here yet ...\n",
dev->core->name);
break;
}
+ if (NULL == dev->dvb.frontend)
+ return -1;
- /* demux */
- dev->demux.dmx.capabilities =
- DMX_TS_FILTERING | DMX_SECTION_FILTERING |
- DMX_MEMORY_BASED_FILTERING;
- dev->demux.priv = dev;
- dev->demux.filternum = 256;
- dev->demux.feednum = 256;
- dev->demux.start_feed = dvb_start_feed;
- dev->demux.stop_feed = dvb_stop_feed;
- result = dvb_dmx_init(&dev->demux);
- if (result < 0) {
- printk(KERN_WARNING "%s: dvb_dmx_init failed (errno = %d)\n",
- dev->core->name, result);
- goto fail2;
- }
+ /* Copy the board name into the DVB structure */
+ strlcpy(dev->dvb.frontend->ops->info.name,
+ cx88_boards[dev->core->board].name,
+ sizeof(dev->dvb.frontend->ops->info.name));
- dev->dmxdev.filternum = 256;
- dev->dmxdev.demux = &dev->demux.dmx;
- dev->dmxdev.capabilities = 0;
- result = dvb_dmxdev_init(&dev->dmxdev, dev->dvb_adapter);
- if (result < 0) {
- printk(KERN_WARNING "%s: dvb_dmxdev_init failed (errno = %d)\n",
- dev->core->name, result);
- goto fail3;
- }
-
- dev->fe_hw.source = DMX_FRONTEND_0;
- result = dev->demux.dmx.add_frontend(&dev->demux.dmx, &dev->fe_hw);
- if (result < 0) {
- printk(KERN_WARNING "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
- dev->core->name, result);
- goto fail4;
- }
-
- dev->fe_mem.source = DMX_MEMORY_FE;
- result = dev->demux.dmx.add_frontend(&dev->demux.dmx, &dev->fe_mem);
- if (result < 0) {
- printk(KERN_WARNING "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
- dev->core->name, result);
- goto fail5;
- }
-
- result = dev->demux.dmx.connect_frontend(&dev->demux.dmx, &dev->fe_hw);
- if (result < 0) {
- printk(KERN_WARNING "%s: connect_frontend failed (errno = %d)\n",
- dev->core->name, result);
- goto fail6;
- }
-
- dvb_net_init(dev->dvb_adapter, &dev->dvbnet, &dev->demux.dmx);
- return 0;
-
-fail6:
- dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_mem);
-fail5:
- dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_hw);
-fail4:
- dvb_dmxdev_release(&dev->dmxdev);
-fail3:
- dvb_dmx_release(&dev->demux);
-fail2:
- dvb_unregister_adapter(dev->dvb_adapter);
-fail1:
- return result;
+ /* register everything */
+ return videobuf_dvb_register(&dev->dvb);
}
/* ----------------------------------------------------------- */
@@ -346,13 +257,12 @@ static int __devinit dvb_probe(struct pc
/* dvb stuff */
printk("%s/2: cx2388x based dvb card\n", core->name);
- videobuf_queue_init(&dev->dvbq, &dvb_qops,
+ videobuf_queue_init(&dev->dvb.dvbq, &dvb_qops,
dev->pci, &dev->slock,
V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_FIELD_TOP,
- sizeof(struct cx88_buffer));
- init_MUTEX(&dev->dvbq.lock);
-
+ sizeof(struct cx88_buffer),
+ dev);
err = dvb_register(dev);
if (0 != err)
goto fail_free;
@@ -370,7 +280,7 @@ static void __devexit dvb_remove(struct
struct cx8802_dev *dev = pci_get_drvdata(pci_dev);
/* dvb */
- dvb_unregister(dev);
+ videobuf_dvb_unregister(&dev->dvb);
/* common */
cx8802_fini_common(dev);
@@ -394,7 +304,7 @@ static struct pci_driver dvb_pci_driver
.name = "cx88-dvb",
.id_table = cx8802_pci_tbl,
.probe = dvb_probe,
- .remove = dvb_remove,
+ .remove = __devexit_p(dvb_remove),
.suspend = cx8802_suspend_common,
.resume = cx8802_resume_common,
};
@@ -423,5 +333,6 @@ module_exit(dvb_fini);
/*
* Local variables:
* c-basic-offset: 8
+ * compile-command: "make DVB=1"
* End:
*/
Index: linux-2004-11-05/drivers/media/video/cx88/cx88-blackbird.c
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/cx88-blackbird.c 2004-11-07 12:23:49.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/cx88-blackbird.c 2004-11-07 16:01:04.553276038 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-blackbird.c,v 1.14 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-blackbird.c,v 1.17 2004/11/07 13:17:15 kraxel Exp $
*
* Support for a cx23416 mpeg encoder via cx2388x host port.
* "blackbird" reference design.
@@ -543,9 +543,10 @@ static int blackbird_initialize_codec(st
/* ------------------------------------------------------------------ */
-static int bb_buf_setup(void *priv, unsigned int *count, unsigned int *size)
+static int bb_buf_setup(struct videobuf_queue *q,
+ unsigned int *count, unsigned int *size)
{
- struct cx8802_fh *fh = priv;
+ struct cx8802_fh *fh = q->priv_data;
fh->dev->ts_packet_size = 512;
fh->dev->ts_packet_count = 100;
@@ -561,23 +562,24 @@ static int bb_buf_setup(void *priv, unsi
}
static int
-bb_buf_prepare(void *priv, struct videobuf_buffer *vb,
- enum v4l2_field field)
+bb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
+ enum v4l2_field field)
{
- struct cx8802_fh *fh = priv;
+ struct cx8802_fh *fh = q->priv_data;
return cx8802_buf_prepare(fh->dev, (struct cx88_buffer*)vb);
}
static void
-bb_buf_queue(void *priv, struct videobuf_buffer *vb)
+bb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx8802_fh *fh = priv;
+ struct cx8802_fh *fh = q->priv_data;
cx8802_buf_queue(fh->dev, (struct cx88_buffer*)vb);
}
-static void bb_buf_release(void *priv, struct videobuf_buffer *vb)
+static void
+bb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct cx8802_fh *fh = priv;
+ struct cx8802_fh *fh = q->priv_data;
cx88_free_buffer(fh->dev->pci, (struct cx88_buffer*)vb);
}
@@ -635,23 +637,23 @@ static int mpeg_do_ioctl(struct inode *i
/* --- streaming capture ------------------------------------- */
case VIDIOC_REQBUFS:
- return videobuf_reqbufs(file->private_data, &fh->mpegq, arg);
+ return videobuf_reqbufs(&fh->mpegq, arg);
case VIDIOC_QUERYBUF:
return videobuf_querybuf(&fh->mpegq, arg);
case VIDIOC_QBUF:
- return videobuf_qbuf(file->private_data, &fh->mpegq, arg);
+ return videobuf_qbuf(&fh->mpegq, arg);
case VIDIOC_DQBUF:
- return videobuf_dqbuf(file->private_data, &fh->mpegq, arg,
+ return videobuf_dqbuf(&fh->mpegq, arg,
file->f_flags & O_NONBLOCK);
case VIDIOC_STREAMON:
- return videobuf_streamon(file->private_data, &fh->mpegq);
+ return videobuf_streamon(&fh->mpegq);
case VIDIOC_STREAMOFF:
- return videobuf_streamoff(file->private_data, &fh->mpegq);
+ return videobuf_streamoff(&fh->mpegq);
default:
return -EINVAL;
@@ -696,9 +698,8 @@ static int mpeg_open(struct inode *inode
dev->pci, &dev->slock,
V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_FIELD_TOP,
- sizeof(struct cx88_buffer));
- init_MUTEX(&fh->mpegq.lock);
-
+ sizeof(struct cx88_buffer),
+ fh);
return 0;
}
@@ -710,9 +711,9 @@ static int mpeg_release(struct inode *in
/* stop mpeg capture */
if (fh->mpegq.streaming)
- videobuf_streamoff(file->private_data,&fh->mpegq);
+ videobuf_streamoff(&fh->mpegq);
if (fh->mpegq.reading)
- videobuf_read_stop(file->private_data,&fh->mpegq);
+ videobuf_read_stop(&fh->mpegq);
file->private_data = NULL;
kfree(fh);
@@ -724,8 +725,7 @@ mpeg_read(struct file *file, char *data,
{
struct cx8802_fh *fh = file->private_data;
- return videobuf_read_stream(file->private_data,
- &fh->mpegq, data, count, ppos, 0,
+ return videobuf_read_stream(&fh->mpegq, data, count, ppos, 0,
file->f_flags & O_NONBLOCK);
}
@@ -734,8 +734,7 @@ mpeg_poll(struct file *file, struct poll
{
struct cx8802_fh *fh = file->private_data;
- return videobuf_poll_stream(file, file->private_data,
- &fh->mpegq, wait);
+ return videobuf_poll_stream(file, &fh->mpegq, wait);
}
static int
@@ -743,7 +742,7 @@ mpeg_mmap(struct file *file, struct vm_a
{
struct cx8802_fh *fh = file->private_data;
- return videobuf_mmap_mapper(vma, &fh->mpegq);
+ return videobuf_mmap_mapper(&fh->mpegq, vma);
}
static struct file_operations mpeg_fops =
@@ -871,7 +870,7 @@ static struct pci_driver blackbird_pci_d
.name = "cx88-blackbird",
.id_table = cx8802_pci_tbl,
.probe = blackbird_probe,
- .remove = blackbird_remove,
+ .remove = __devexit_p(blackbird_remove),
.suspend = cx8802_suspend_common,
.resume = cx8802_resume_common,
};
Index: linux-2004-11-05/drivers/media/video/Kconfig
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/Kconfig 2004-11-07 16:00:38.239242292 +0100
+++ linux-2004-11-05/drivers/media/video/Kconfig 2004-11-07 16:01:28.435768837 +0100
@@ -315,12 +315,13 @@ config VIDEO_CX88
To compile this driver as a module, choose M here: the
module will be called cx8800
-#config VIDEO_CX88_DVB
-# tristate "DVB Support for cx2388x based TV cards"
-# depends on VIDEO_CX88 && DVB_CORE
-# ---help---
-# This adds support for DVB cards based on the
-# Connexant 2388x chip.
+config VIDEO_CX88_DVB
+ tristate "DVB Support for cx2388x based TV cards"
+ depends on VIDEO_CX88 && DVB_CORE && BROKEN
+ select VIDEO_BUF_DVB
+ ---help---
+ This adds support for DVB cards based on the
+ Connexant 2388x chip.
config VIDEO_OVCAMCHIP
tristate "OmniVision Camera Chip support"
Index: linux-2004-11-05/drivers/media/video/cx88/Makefile
===================================================================
--- linux-2004-11-05.orig/drivers/media/video/cx88/Makefile 2004-11-07 12:21:50.000000000 +0100
+++ linux-2004-11-05/drivers/media/video/cx88/Makefile 2004-11-07 16:01:04.554275850 +0100
@@ -5,4 +5,6 @@ cx8802-objs := cx88-mpeg.o
obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o
obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
-EXTRA_CFLAGS = -I$(src)/.. -I$(srctree)/drivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -I$(src)/..
+EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
--
#define printk(args...) fprintf(stderr, ## args)