Commit e52e98a7 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Linus Torvalds

[PATCH] v4l: CX88 updates and card additions

- Remove $Id CVS logs for V4L files
- add ioctl indirection via cx88_ioctl_hook and cx88_ioctl_translator to
  cx88-blackbird.c.
- declare the indirection hooks from cx88-blackbird.c.
- dcprintk macro which uses core instead of dev->core on cx88-video.c.
- replace dev->core occurances with core on cx88-video.c.
- CodingStyle fixes.
- MaxInput replaced by a define.
- cx8801 structures moved from cx88.h.
- The output_mode needs to be set for the Hauppauge Nova-T DVB-T
  for versions after 2.6.12.
- Corrected GPIO values for cx88 cards #28 & #31 for s-video and composite.
- Updated DViCO FusionHDTV5 Gold & added DVB support.
- Fixed DViCO FusionHDTV 3 Gold-Q GPIO.
- Some clean up in cx88-tvaudio.c
- replaced hex values when writing to AUD_CTL to EN_xx for better reading.
- Allow select by hand between Mono, Lang1, Lang2 and Stereo for BTSC.
- Support for stereo NICAM and BTSC improved.
- Broken stereo check removed.
- Added support for remote control to Cinergy DVBT-1400.
- local var renamed from rc5 to a better name (ircode).
- LGDT330X QAM lock bug fixes.
- Some reorg: move some bits to struct cx88_core, factor out common ioctl's
  to cx88_do_ioctl.
- Get rid of '//' comments, replace them with #if 0 and /**/.
- Minor clean-ups: remove dcprintk and replace all instances of "dev->core"
  with "core".
- Added some registers to control PCI controller at CX2388x chips.
- New tuner standby API.
- Small mpeg fixes and cleanups for blackbird.
- fix mpeg packet size & count
- add VIDIOC_QUERYCAP ioctl for the mpeg stream
- return more information in struct v4l2_format
- fix default window height
- small cleanups
Signed-off-by: default avatarUli Luckas <luckas@musoft.de>
Signed-off-by: default avatarTorsten Seeboth <Torsten.Seeboth@t-online.de>
Signed-off-by: default avatarNickolay V. Shmyrev <nshmyrev@yandex.ru>
Signed-off-by: default avatarMichael Krufky <mkrufky@m1k.net>
Signed-off-by: default avatarPatrick Boettcher <patrick.boettcher@desy.de>
Signed-off-by: default avatarCatalin Climov <catalin@climov.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 24a70fdc
/* /*
* $Id: cx88-blackbird.c,v 1.27 2005/06/03 13:31:50 mchehab Exp $
* *
* Support for a cx23416 mpeg encoder via cx2388x host port. * Support for a cx23416 mpeg encoder via cx2388x host port.
* "blackbird" reference design. * "blackbird" reference design.
...@@ -62,7 +61,6 @@ static LIST_HEAD(cx8802_devlist); ...@@ -62,7 +61,6 @@ static LIST_HEAD(cx8802_devlist);
#define IVTV_CMD_HW_BLOCKS_RST 0xFFFFFFFF #define IVTV_CMD_HW_BLOCKS_RST 0xFFFFFFFF
/* Firmware API commands */ /* Firmware API commands */
/* #define IVTV_API_STD_TIMEOUT 0x00010000 // 65536, units?? */
#define IVTV_API_STD_TIMEOUT 500 #define IVTV_API_STD_TIMEOUT 500
#define BLACKBIRD_API_PING 0x80 #define BLACKBIRD_API_PING 0x80
...@@ -696,7 +694,6 @@ static void blackbird_codec_settings(struct cx8802_dev *dev) ...@@ -696,7 +694,6 @@ static void blackbird_codec_settings(struct cx8802_dev *dev)
/* assign stream type */ /* assign stream type */
blackbird_api_cmd(dev, BLACKBIRD_API_SET_STREAM_TYPE, 1, 0, BLACKBIRD_STREAM_PROGRAM); blackbird_api_cmd(dev, BLACKBIRD_API_SET_STREAM_TYPE, 1, 0, BLACKBIRD_STREAM_PROGRAM);
/* blackbird_api_cmd(dev, BLACKBIRD_API_SET_STREAM_TYPE, 1, 0, BLACKBIRD_STREAM_TRANSPORT); */
/* assign output port */ /* assign output port */
blackbird_api_cmd(dev, BLACKBIRD_API_SET_OUTPUT_PORT, 1, 0, BLACKBIRD_OUTPUT_PORT_STREAMING); /* Host */ blackbird_api_cmd(dev, BLACKBIRD_API_SET_OUTPUT_PORT, 1, 0, BLACKBIRD_OUTPUT_PORT_STREAMING); /* Host */
...@@ -824,7 +821,8 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) ...@@ -824,7 +821,8 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev)
BLACKBIRD_CUSTOM_EXTENSION_USR_DATA, BLACKBIRD_CUSTOM_EXTENSION_USR_DATA,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
blackbird_api_cmd(dev, BLACKBIRD_API_INIT_VIDEO_INPUT, 0, 0); /* initialize the video input */ /* initialize the video input */
blackbird_api_cmd(dev, BLACKBIRD_API_INIT_VIDEO_INPUT, 0, 0);
msleep(1); msleep(1);
...@@ -833,11 +831,12 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) ...@@ -833,11 +831,12 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev)
blackbird_api_cmd(dev, BLACKBIRD_API_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE); blackbird_api_cmd(dev, BLACKBIRD_API_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE);
msleep(1); msleep(1);
/* blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0, 0, 0x13); // start capturing to the host interface */ /* start capturing to the host interface */
/* blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0, 0, 0x13); */
blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0, blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0,
BLACKBIRD_MPEG_CAPTURE, BLACKBIRD_MPEG_CAPTURE,
BLACKBIRD_RAW_BITS_NONE BLACKBIRD_RAW_BITS_NONE
); /* start capturing to the host interface */ );
msleep(10); msleep(10);
blackbird_api_cmd(dev, BLACKBIRD_API_REFRESH_INPUT, 0,0); blackbird_api_cmd(dev, BLACKBIRD_API_REFRESH_INPUT, 0,0);
...@@ -851,8 +850,8 @@ static int bb_buf_setup(struct videobuf_queue *q, ...@@ -851,8 +850,8 @@ static int bb_buf_setup(struct videobuf_queue *q,
{ {
struct cx8802_fh *fh = q->priv_data; struct cx8802_fh *fh = q->priv_data;
fh->dev->ts_packet_size = 512; fh->dev->ts_packet_size = 188 * 4; /* was: 512 */
fh->dev->ts_packet_count = 100; fh->dev->ts_packet_count = 32; /* was: 100 */
*size = fh->dev->ts_packet_size * fh->dev->ts_packet_count; *size = fh->dev->ts_packet_size * fh->dev->ts_packet_count;
if (0 == *count) if (0 == *count)
...@@ -900,12 +899,36 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file, ...@@ -900,12 +899,36 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
{ {
struct cx8802_fh *fh = file->private_data; struct cx8802_fh *fh = file->private_data;
struct cx8802_dev *dev = fh->dev; struct cx8802_dev *dev = fh->dev;
struct cx88_core *core = dev->core;
if (debug > 1) if (debug > 1)
cx88_print_ioctl(dev->core->name,cmd); cx88_print_ioctl(core->name,cmd);
switch (cmd) { switch (cmd) {
/* --- capabilities ------------------------------------------ */
case VIDIOC_QUERYCAP:
{
struct v4l2_capability *cap = arg;
memset(cap,0,sizeof(*cap));
strcpy(cap->driver, "cx88_blackbird");
strlcpy(cap->card, cx88_boards[core->board].name,sizeof(cap->card));
sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
cap->version = CX88_VERSION_CODE;
cap->capabilities =
V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_READWRITE |
V4L2_CAP_STREAMING |
V4L2_CAP_VBI_CAPTURE |
V4L2_CAP_VIDEO_OVERLAY |
0;
if (UNSET != core->tuner_type)
cap->capabilities |= V4L2_CAP_TUNER;
return 0;
}
/* --- capture ioctls ---------------------------------------- */ /* --- capture ioctls ---------------------------------------- */
case VIDIOC_ENUM_FMT: case VIDIOC_ENUM_FMT:
{ {
...@@ -935,7 +958,11 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file, ...@@ -935,7 +958,11 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
f->fmt.pix.width = dev->width; f->fmt.pix.width = dev->width;
f->fmt.pix.height = dev->height; f->fmt.pix.height = dev->height;
f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
f->fmt.pix.sizeimage = 1024 * 512 /* FIXME: BUFFER_SIZE */; f->fmt.pix.field = V4L2_FIELD_NONE;
f->fmt.pix.bytesperline = 0;
f->fmt.pix.sizeimage = 188 * 4 * 1024; /* 1024 * 512 */ /* FIXME: BUFFER_SIZE */;
f->fmt.pix.colorspace = 0;
return 0;
} }
/* --- streaming capture ------------------------------------- */ /* --- streaming capture ------------------------------------- */
...@@ -959,15 +986,25 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file, ...@@ -959,15 +986,25 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
return videobuf_streamoff(&fh->mpegq); return videobuf_streamoff(&fh->mpegq);
default: default:
return -EINVAL; return cx88_do_ioctl( inode, file, 0, dev->core, cmd, arg, cx88_ioctl_hook );
} }
return 0; return 0;
} }
int (*cx88_ioctl_hook)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg);
unsigned int (*cx88_ioctl_translator)(unsigned int cmd);
static unsigned int mpeg_translate_ioctl(unsigned int cmd)
{
return cmd;
}
static int mpeg_ioctl(struct inode *inode, struct file *file, static int mpeg_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
return video_usercopy(inode, file, cmd, arg, mpeg_do_ioctl); cmd = cx88_ioctl_translator( cmd );
return video_usercopy(inode, file, cmd, arg, cx88_ioctl_hook);
} }
static int mpeg_open(struct inode *inode, struct file *file) static int mpeg_open(struct inode *inode, struct file *file)
...@@ -1135,7 +1172,7 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev, ...@@ -1135,7 +1172,7 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev,
dev->pci = pci_dev; dev->pci = pci_dev;
dev->core = core; dev->core = core;
dev->width = 720; dev->width = 720;
dev->height = 480; dev->height = 576;
err = cx8802_init_common(dev); err = cx8802_init_common(dev);
if (0 != err) if (0 != err)
...@@ -1148,6 +1185,9 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev, ...@@ -1148,6 +1185,9 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev,
list_add_tail(&dev->devlist,&cx8802_devlist); list_add_tail(&dev->devlist,&cx8802_devlist);
blackbird_register_video(dev); blackbird_register_video(dev);
/* initial device configuration: needed ? */
return 0; return 0;
fail_free: fail_free:
...@@ -1202,6 +1242,8 @@ static int blackbird_init(void) ...@@ -1202,6 +1242,8 @@ static int blackbird_init(void)
printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n", printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",
SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100); SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
#endif #endif
cx88_ioctl_hook = mpeg_do_ioctl;
cx88_ioctl_translator = mpeg_translate_ioctl;
return pci_register_driver(&blackbird_pci_driver); return pci_register_driver(&blackbird_pci_driver);
} }
...@@ -1213,6 +1255,9 @@ static void blackbird_fini(void) ...@@ -1213,6 +1255,9 @@ static void blackbird_fini(void)
module_init(blackbird_init); module_init(blackbird_init);
module_exit(blackbird_fini); module_exit(blackbird_fini);
EXPORT_SYMBOL(cx88_ioctl_hook);
EXPORT_SYMBOL(cx88_ioctl_translator);
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* /*
* Local variables: * Local variables:
......
/* /*
* $Id: cx88-cards.c,v 1.90 2005/07/28 02:47:42 mkrufky Exp $
* *
* device driver for Conexant 2388x based TV cards * device driver for Conexant 2388x based TV cards
* card-specific stuff. * card-specific stuff.
...@@ -499,9 +498,6 @@ struct cx88_board cx88_boards[] = { ...@@ -499,9 +498,6 @@ struct cx88_board cx88_boards[] = {
.input = {{ .input = {{
.type = CX88_VMUX_DVB, .type = CX88_VMUX_DVB,
.vmux = 0, .vmux = 0,
},{
.type = CX88_VMUX_SVIDEO,
.vmux = 2,
}}, }},
.dvb = 1, .dvb = 1,
}, },
...@@ -614,12 +610,12 @@ struct cx88_board cx88_boards[] = { ...@@ -614,12 +610,12 @@ struct cx88_board cx88_boards[] = {
.input = {{ .input = {{
.type = CX88_VMUX_TELEVISION, .type = CX88_VMUX_TELEVISION,
.vmux = 0, .vmux = 0,
.gpio0 = 0xed12, // internal decoder .gpio0 = 0xed12, /* internal decoder */
.gpio2 = 0x00ff, .gpio2 = 0x00ff,
},{ },{
.type = CX88_VMUX_DEBUG, .type = CX88_VMUX_DEBUG,
.vmux = 0, .vmux = 0,
.gpio0 = 0xff01, // mono from tuner chip .gpio0 = 0xff01, /* mono from tuner chip */
},{ },{
.type = CX88_VMUX_COMPOSITE1, .type = CX88_VMUX_COMPOSITE1,
.vmux = 1, .vmux = 1,
...@@ -715,19 +711,18 @@ struct cx88_board cx88_boards[] = { ...@@ -715,19 +711,18 @@ struct cx88_board cx88_boards[] = {
.radio_type = UNSET, .radio_type = UNSET,
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
/* See DViCO FusionHDTV 3 Gold-Q for GPIO documentation. */
.input = {{ .input = {{
.type = CX88_VMUX_TELEVISION, .type = CX88_VMUX_TELEVISION,
.vmux = 0, .vmux = 0,
.gpio0 = 0x0f0d, .gpio0 = 0x97ed,
},{ },{
.type = CX88_VMUX_COMPOSITE1, .type = CX88_VMUX_COMPOSITE1,
.vmux = 1, .vmux = 1,
.gpio0 = 0x0f00, .gpio0 = 0x97e9,
},{ },{
.type = CX88_VMUX_SVIDEO, .type = CX88_VMUX_SVIDEO,
.vmux = 2, .vmux = 2,
.gpio0 = 0x0f00, .gpio0 = 0x97e9,
}}, }},
.dvb = 1, .dvb = 1,
}, },
...@@ -765,20 +760,21 @@ struct cx88_board cx88_boards[] = { ...@@ -765,20 +760,21 @@ struct cx88_board cx88_boards[] = {
.radio_type = UNSET, .radio_type = UNSET,
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
/* See DViCO FusionHDTV 3 Gold-Q for GPIO documentation. */ .tda9887_conf = TDA9887_PRESENT,
.input = {{ .input = {{
.type = CX88_VMUX_TELEVISION, .type = CX88_VMUX_TELEVISION,
.vmux = 0, .vmux = 0,
.gpio0 = 0x0f0d, .gpio0 = 0x87fd,
},{ },{
.type = CX88_VMUX_COMPOSITE1, .type = CX88_VMUX_COMPOSITE1,
.vmux = 1, .vmux = 1,
.gpio0 = 0x0f00, .gpio0 = 0x87f9,
},{ },{
.type = CX88_VMUX_SVIDEO, .type = CX88_VMUX_SVIDEO,
.vmux = 2, .vmux = 2,
.gpio0 = 0x0f00, .gpio0 = 0x87f9,
}}, }},
.dvb = 1,
}, },
}; };
const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards); const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
......
/* /*
* $Id: cx88-core.c,v 1.33 2005/07/07 14:17:47 mchehab Exp $
* *
* device driver for Conexant 2388x based TV cards * device driver for Conexant 2388x based TV cards
* driver core * driver core
...@@ -876,7 +875,7 @@ static int set_tvaudio(struct cx88_core *core) ...@@ -876,7 +875,7 @@ static int set_tvaudio(struct cx88_core *core)
cx_andor(MO_AFECFG_IO, 0x1f, 0x0); cx_andor(MO_AFECFG_IO, 0x1f, 0x0);
cx88_set_tvaudio(core); cx88_set_tvaudio(core);
// cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */
cx_write(MO_AUDD_LNGTH, 128); /* fifo size */ cx_write(MO_AUDD_LNGTH, 128); /* fifo size */
cx_write(MO_AUDR_LNGTH, 128); /* fifo size */ cx_write(MO_AUDR_LNGTH, 128); /* fifo size */
...@@ -1087,10 +1086,17 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) ...@@ -1087,10 +1086,17 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
core->pci_bus = pci->bus->number; core->pci_bus = pci->bus->number;
core->pci_slot = PCI_SLOT(pci->devfn); core->pci_slot = PCI_SLOT(pci->devfn);
core->pci_irqmask = 0x00fc00; core->pci_irqmask = 0x00fc00;
init_MUTEX(&core->lock);
core->nr = cx88_devcount++; core->nr = cx88_devcount++;
sprintf(core->name,"cx88[%d]",core->nr); sprintf(core->name,"cx88[%d]",core->nr);
if (0 != get_ressources(core,pci)) { if (0 != get_ressources(core,pci)) {
printk(KERN_ERR "CORE %s No more PCI ressources for "
"subsystem: %04x:%04x, board: %s\n",
core->name,pci->subsystem_vendor,
pci->subsystem_device,
cx88_boards[core->board].name);
cx88_devcount--; cx88_devcount--;
goto fail_free; goto fail_free;
} }
...@@ -1114,11 +1120,11 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) ...@@ -1114,11 +1120,11 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
core->board = CX88_BOARD_UNKNOWN; core->board = CX88_BOARD_UNKNOWN;
cx88_card_list(core,pci); cx88_card_list(core,pci);
} }
printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", printk(KERN_INFO "CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
core->name,pci->subsystem_vendor, core->name,pci->subsystem_vendor,
pci->subsystem_device,cx88_boards[core->board].name, pci->subsystem_device,cx88_boards[core->board].name,
core->board, card[core->nr] == core->board ? core->board, card[core->nr] == core->board ?
"insmod option" : "autodetected"); "insmod option" : "autodetected");
core->tuner_type = tuner[core->nr]; core->tuner_type = tuner[core->nr];
core->radio_type = radio[core->nr]; core->radio_type = radio[core->nr];
...@@ -1202,4 +1208,5 @@ EXPORT_SYMBOL(cx88_core_put); ...@@ -1202,4 +1208,5 @@ EXPORT_SYMBOL(cx88_core_put);
* Local variables: * Local variables:
* c-basic-offset: 8 * c-basic-offset: 8
* End: * End:
* kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
*/ */
/* /*
* $Id: cx88-dvb.c,v 1.58 2005/08/07 09:24:08 mkrufky Exp $
* *
* device driver for Conexant 2388x based TV cards * device driver for Conexant 2388x based TV cards
* MPEG Transport Stream (DVB) routines * MPEG Transport Stream (DVB) routines
...@@ -31,6 +30,7 @@ ...@@ -31,6 +30,7 @@
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/config.h> #include <linux/config.h>
#include "cx88.h" #include "cx88.h"
#include "dvb-pll.h" #include "dvb-pll.h"
...@@ -210,16 +210,26 @@ static struct or51132_config pchdtv_hd3000 = { ...@@ -210,16 +210,26 @@ static struct or51132_config pchdtv_hd3000 = {
static int lgdt330x_pll_set(struct dvb_frontend* fe, static int lgdt330x_pll_set(struct dvb_frontend* fe,
struct dvb_frontend_parameters* params) struct dvb_frontend_parameters* params)
{ {
/* FIXME make this routine use the tuner-simple code.
* It could probably be shared with a number of ATSC
* frontends. Many share the same tuner with analog TV. */
struct cx8802_dev *dev= fe->dvb->priv; struct cx8802_dev *dev= fe->dvb->priv;
struct cx88_core *core = dev->core;
u8 buf[4]; u8 buf[4];
struct i2c_msg msg = struct i2c_msg msg =
{ .addr = dev->core->pll_addr, .flags = 0, .buf = buf, .len = 4 }; { .addr = dev->core->pll_addr, .flags = 0, .buf = buf, .len = 4 };
int err; int err;
dvb_pll_configure(dev->core->pll_desc, buf, params->frequency, 0); /* Put the analog decoder in standby to keep it quiet */
if (core->tda9887_conf) {
cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
}
dvb_pll_configure(core->pll_desc, buf, params->frequency, 0);
dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n",
__FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]); __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]);
if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) { if ((err = i2c_transfer(&core->i2c_adap, &msg, 1)) != 1) {
printk(KERN_WARNING "cx88-dvb: %s error " printk(KERN_WARNING "cx88-dvb: %s error "
"(addr %02x <- %02x, err = %i)\n", "(addr %02x <- %02x, err = %i)\n",
__FUNCTION__, buf[0], buf[1], err); __FUNCTION__, buf[0], buf[1], err);
...@@ -228,6 +238,13 @@ static int lgdt330x_pll_set(struct dvb_frontend* fe, ...@@ -228,6 +238,13 @@ static int lgdt330x_pll_set(struct dvb_frontend* fe,
else else
return -EREMOTEIO; return -EREMOTEIO;
} }
if (core->tuner_type == TUNER_LG_TDVS_H062F) {
/* Set the Auxiliary Byte. */
buf[2] &= ~0x20;
buf[2] |= 0x18;
buf[3] = 0x50;
i2c_transfer(&core->i2c_adap, &msg, 1);
}
return 0; return 0;
} }
...@@ -261,6 +278,14 @@ static struct lgdt330x_config fusionhdtv_3_gold = { ...@@ -261,6 +278,14 @@ static struct lgdt330x_config fusionhdtv_3_gold = {
.pll_set = lgdt330x_pll_set, .pll_set = lgdt330x_pll_set,
.set_ts_params = lgdt330x_set_ts_param, .set_ts_params = lgdt330x_set_ts_param,
}; };
static struct lgdt330x_config fusionhdtv_5_gold = {
.demod_address = 0x0e,
.demod_chip = LGDT3303,
.serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
.pll_set = lgdt330x_pll_set,
.set_ts_params = lgdt330x_set_ts_param,
};
#endif #endif
static int dvb_register(struct cx8802_dev *dev) static int dvb_register(struct cx8802_dev *dev)
...@@ -346,6 +371,22 @@ static int dvb_register(struct cx8802_dev *dev) ...@@ -346,6 +371,22 @@ static int dvb_register(struct cx8802_dev *dev)
&dev->core->i2c_adap); &dev->core->i2c_adap);
} }
break; break;
case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
dev->ts_gen_cntrl = 0x08;
{
/* Do a hardware reset of chip before using it. */
struct cx88_core *core = dev->core;
cx_clear(MO_GP0_IO, 1);
mdelay(100);
cx_set(MO_GP0_IO, 1);
mdelay(200);
dev->core->pll_addr = 0x61;
dev->core->pll_desc = &dvb_pll_tdvs_tua6034;
dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_5_gold,
&dev->core->i2c_adap);
}
break;
#endif #endif
default: default:
printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
......
/* /*
$Id: cx88-i2c.c,v 1.30 2005/07/25 05:10:13 mkrufky Exp $
cx88-i2c.c -- all the i2c code is here cx88-i2c.c -- all the i2c code is here
......
/* /*
* $Id: cx88-input.c,v 1.15 2005/07/07 13:58:38 mchehab Exp $
* *
* Device driver for GPIO attached remote control interfaces * Device driver for GPIO attached remote control interfaces
* on Conexant 2388x based TV/DVB cards. * on Conexant 2388x based TV/DVB cards.
...@@ -212,6 +211,53 @@ static IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = { ...@@ -212,6 +211,53 @@ static IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = {
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/* Cinergy 1400 DVB-T */
static IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = {
[0x01] = KEY_POWER,
[0x02] = KEY_1,
[0x03] = KEY_2,
[0x04] = KEY_3,
[0x05] = KEY_4,
[0x06] = KEY_5,
[0x07] = KEY_6,
[0x08] = KEY_7,
[0x09] = KEY_8,
[0x0a] = KEY_9,
[0x0c] = KEY_0,
[0x0b] = KEY_VIDEO,
[0x0d] = KEY_REFRESH,
[0x0e] = KEY_SELECT,
[0x0f] = KEY_EPG,
[0x10] = KEY_UP,
[0x11] = KEY_LEFT,
[0x12] = KEY_OK,
[0x13] = KEY_RIGHT,
[0x14] = KEY_DOWN,
[0x15] = KEY_TEXT,
[0x16] = KEY_INFO,
[0x17] = KEY_RED,
[0x18] = KEY_GREEN,
[0x19] = KEY_YELLOW,
[0x1a] = KEY_BLUE,
[0x1b] = KEY_CHANNELUP,
[0x1c] = KEY_VOLUMEUP,
[0x1d] = KEY_MUTE,
[0x1e] = KEY_VOLUMEDOWN,
[0x1f] = KEY_CHANNELDOWN,
[0x40] = KEY_PAUSE,
[0x4c] = KEY_PLAY,
[0x58] = KEY_RECORD,
[0x54] = KEY_PREVIOUS,
[0x48] = KEY_STOP,
[0x5c] = KEY_NEXT,
};
/* ---------------------------------------------------------------------- */
struct cx88_IR { struct cx88_IR {
struct cx88_core *core; struct cx88_core *core;
struct input_dev input; struct input_dev input;
...@@ -241,7 +287,7 @@ module_param(ir_debug, int, 0644); /* debug level [IR] */ ...@@ -241,7 +287,7 @@ module_param(ir_debug, int, 0644); /* debug level [IR] */
MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]"); MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
#define ir_dprintk(fmt, arg...) if (ir_debug) \ #define ir_dprintk(fmt, arg...) if (ir_debug) \
printk(KERN_DEBUG "%s IR: " fmt , ir->core->name, ## arg) printk(KERN_DEBUG "%s IR: " fmt , ir->core->name , ##arg)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
...@@ -329,6 +375,11 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ...@@ -329,6 +375,11 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
ir->mask_keyup = 0x60; ir->mask_keyup = 0x60;
ir->polling = 50; /* ms */ ir->polling = 50; /* ms */
break; break;
case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
ir_codes = ir_codes_cinergy_1400;
ir_type = IR_TYPE_PD;
ir->sampling = 1;
break;
case CX88_BOARD_HAUPPAUGE: case CX88_BOARD_HAUPPAUGE:
case CX88_BOARD_HAUPPAUGE_DVB_T1: case CX88_BOARD_HAUPPAUGE_DVB_T1:
ir_codes = ir_codes_hauppauge_new; ir_codes = ir_codes_hauppauge_new;
...@@ -445,7 +496,7 @@ int cx88_ir_fini(struct cx88_core *core) ...@@ -445,7 +496,7 @@ int cx88_ir_fini(struct cx88_core *core)
void cx88_ir_irq(struct cx88_core *core) void cx88_ir_irq(struct cx88_core *core)
{ {
struct cx88_IR *ir = core->ir; struct cx88_IR *ir = core->ir;
u32 samples, rc5; u32 samples, ircode;
int i; int i;
if (NULL == ir) if (NULL == ir)
...@@ -477,13 +528,44 @@ void cx88_ir_irq(struct cx88_core *core) ...@@ -477,13 +528,44 @@ void cx88_ir_irq(struct cx88_core *core)
/* decode it */ /* decode it */
switch (core->board) { switch (core->board) {
case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4);
if (ircode == 0xffffffff) { /* decoding error */
ir_dprintk("pulse distance decoding error\n");
break;
}
ir_dprintk("pulse distance decoded: %x\n", ircode);
if (ircode == 0) { /* key still pressed */
ir_dprintk("pulse distance decoded repeat code\n");
ir->release = jiffies + msecs_to_jiffies(120);
break;
}
if ((ircode & 0xffff) != 0xeb04) { /* wrong address */
ir_dprintk("pulse distance decoded wrong address\n");
break;
}
if (((~ircode >> 24) & 0xff) != ((ircode >> 16) & 0xff)) { /* wrong checksum */
ir_dprintk("pulse distance decoded wrong check sum\n");
break;
}
ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0x7f);
ir_input_keydown(&ir->input, &ir->ir, (ircode >> 16) & 0x7f, (ircode >> 16) & 0xff);
ir->release = jiffies + msecs_to_jiffies(120);
break;
case CX88_BOARD_HAUPPAUGE: case CX88_BOARD_HAUPPAUGE:
case CX88_BOARD_HAUPPAUGE_DVB_T1: case CX88_BOARD_HAUPPAUGE_DVB_T1:
rc5 = ir_decode_biphase(ir->samples, ir->scount, 5, 7); ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
ir_dprintk("biphase decoded: %x\n", rc5); ir_dprintk("biphase decoded: %x\n", ircode);
if ((rc5 & 0xfffff000) != 0x3000) if ((ircode & 0xfffff000) != 0x3000)
break; break;
ir_input_keydown(&ir->input, &ir->ir, rc5 & 0x3f, rc5); ir_input_keydown(&ir->input, &ir->ir, ircode & 0x3f, ircode);
ir->release = jiffies + msecs_to_jiffies(120); ir->release = jiffies + msecs_to_jiffies(120);
break; break;
} }
......
/* /*
* $Id: cx88-mpeg.c,v 1.31 2005/07/07 14:17:47 mchehab Exp $
* *
* Support for the mpeg transport stream transfers * Support for the mpeg transport stream transfers
* PCI function #2 of the cx2388x. * PCI function #2 of the cx2388x.
...@@ -73,11 +72,15 @@ static int cx8802_start_dma(struct cx8802_dev *dev, ...@@ -73,11 +72,15 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
udelay(100); udelay(100);
cx_write(MO_PINMUX_IO, 0x00); cx_write(MO_PINMUX_IO, 0x00);
cx_write(TS_HW_SOP_CNTRL,0x47<<16|188<<4|0x01); cx_write(TS_HW_SOP_CNTRL,0x47<<16|188<<4|0x01);
if ((core->board == CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q) || switch (core->board) {
(core->board == CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T)) { case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
cx_write(TS_SOP_STAT, 1<<13); cx_write(TS_SOP_STAT, 1<<13);
} else { break;
default:
cx_write(TS_SOP_STAT, 0x00); cx_write(TS_SOP_STAT, 0x00);
break;
} }
cx_write(TS_GEN_CNTRL, dev->ts_gen_cntrl); cx_write(TS_GEN_CNTRL, dev->ts_gen_cntrl);
udelay(100); udelay(100);
...@@ -86,12 +89,10 @@ static int cx8802_start_dma(struct cx8802_dev *dev, ...@@ -86,12 +89,10 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
if (cx88_boards[core->board].blackbird) { if (cx88_boards[core->board].blackbird) {
cx_write(MO_PINMUX_IO, 0x88); /* enable MPEG parallel IO */ cx_write(MO_PINMUX_IO, 0x88); /* enable MPEG parallel IO */
// cx_write(TS_F2_CMD_STAT_MM, 0x2900106); /* F2_CMD_STAT_MM defaults + master + memory space */
cx_write(TS_GEN_CNTRL, 0x46); /* punctured clock TS & posedge driven & software reset */ cx_write(TS_GEN_CNTRL, 0x46); /* punctured clock TS & posedge driven & software reset */
udelay(100); udelay(100);
cx_write(TS_HW_SOP_CNTRL, 0x408); /* mpeg start byte */ cx_write(TS_HW_SOP_CNTRL, 0x408); /* mpeg start byte */
//cx_write(TS_HW_SOP_CNTRL, 0x2F0BC0); /* mpeg start byte ts: 0x2F0BC0 ? */
cx_write(TS_VALERR_CNTRL, 0x2000); cx_write(TS_VALERR_CNTRL, 0x2000);
cx_write(TS_GEN_CNTRL, 0x06); /* punctured clock TS & posedge driven */ cx_write(TS_GEN_CNTRL, 0x06); /* punctured clock TS & posedge driven */
...@@ -106,7 +107,6 @@ static int cx8802_start_dma(struct cx8802_dev *dev, ...@@ -106,7 +107,6 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
dprintk( 0, "setting the interrupt mask\n" ); dprintk( 0, "setting the interrupt mask\n" );
cx_set(MO_PCI_INTMSK, core->pci_irqmask | 0x04); cx_set(MO_PCI_INTMSK, core->pci_irqmask | 0x04);
cx_set(MO_TS_INTMSK, 0x1f0011); cx_set(MO_TS_INTMSK, 0x1f0011);
//cx_write(MO_TS_INTMSK, 0x0f0011);
/* start dma */ /* start dma */
cx_set(MO_DEV_CNTRL2, (1<<5)); cx_set(MO_DEV_CNTRL2, (1<<5));
...@@ -206,7 +206,6 @@ void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf) ...@@ -206,7 +206,6 @@ void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf)
mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
dprintk(0,"[%p/%d] %s - first active\n", dprintk(0,"[%p/%d] %s - first active\n",
buf, buf->vb.i, __FUNCTION__); buf, buf->vb.i, __FUNCTION__);
//udelay(100);
} else { } else {
dprintk( 1, "queue is not empty - append to active\n" ); dprintk( 1, "queue is not empty - append to active\n" );
...@@ -217,7 +216,6 @@ void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf) ...@@ -217,7 +216,6 @@ void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf)
prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
dprintk( 1, "[%p/%d] %s - append to active\n", dprintk( 1, "[%p/%d] %s - append to active\n",
buf, buf->vb.i, __FUNCTION__); buf, buf->vb.i, __FUNCTION__);
//udelay(100);
} }
} }
...@@ -387,7 +385,6 @@ int cx8802_init_common(struct cx8802_dev *dev) ...@@ -387,7 +385,6 @@ int cx8802_init_common(struct cx8802_dev *dev)
dev->pci_lat,pci_resource_start(dev->pci,0)); dev->pci_lat,pci_resource_start(dev->pci,0));
/* initialize driver struct */ /* initialize driver struct */
init_MUTEX(&dev->lock);
spin_lock_init(&dev->slock); spin_lock_init(&dev->slock);
/* init dma queue */ /* init dma queue */
......
/* /*
$Id: cx88-reg.h,v 1.8 2005/07/07 13:58:38 mchehab Exp $
cx88x-hw.h - CX2388x register offsets cx88x-hw.h - CX2388x register offsets
...@@ -40,6 +39,29 @@ ...@@ -40,6 +39,29 @@
#define CX88X_EN_TBFX 0x02 #define CX88X_EN_TBFX 0x02
#define CX88X_EN_VSFX 0x04 #define CX88X_EN_VSFX 0x04
/* ---------------------------------------------------------------------- */
/* PCI controller registers */
/* Command and Status Register */
#define F0_CMD_STAT_MM 0x2f0004
#define F1_CMD_STAT_MM 0x2f0104
#define F2_CMD_STAT_MM 0x2f0204
#define F3_CMD_STAT_MM 0x2f0304
#define F4_CMD_STAT_MM 0x2f0404
/* Device Control #1 */
#define F0_DEV_CNTRL1_MM 0x2f0040
#define F1_DEV_CNTRL1_MM 0x2f0140
#define F2_DEV_CNTRL1_MM 0x2f0240
#define F3_DEV_CNTRL1_MM 0x2f0340
#define F4_DEV_CNTRL1_MM 0x2f0440
/* Device Control #1 */
#define F0_BAR0_MM 0x2f0010
#define F1_BAR0_MM 0x2f0110
#define F2_BAR0_MM 0x2f0210
#define F3_BAR0_MM 0x2f0310
#define F4_BAR0_MM 0x2f0410
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/* DMA Controller registers */ /* DMA Controller registers */
......
This diff is collapsed.
/* /*
* $Id: cx88-vbi.c,v 1.17 2005/06/12 04:19:19 mchehab Exp $
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
......
This diff is collapsed.
/* /*
* $Id: cx88.h,v 1.70 2005/07/24 17:44:09 mkrufky Exp $
* *
* v4l2 device driver for cx2388x based TV cards * v4l2 device driver for cx2388x based TV cards
* *
...@@ -48,6 +47,9 @@ ...@@ -48,6 +47,9 @@
#define CX88_MAXBOARDS 8 #define CX88_MAXBOARDS 8
/* Max number of inputs by card */
#define MAX_CX88_INPUT 8
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* defines and enums */ /* defines and enums */
...@@ -199,7 +201,7 @@ struct cx88_board { ...@@ -199,7 +201,7 @@ struct cx88_board {
unsigned char tuner_addr; unsigned char tuner_addr;
unsigned char radio_addr; unsigned char radio_addr;
int tda9887_conf; int tda9887_conf;
struct cx88_input input[8]; struct cx88_input input[MAX_CX88_INPUT];
struct cx88_input radio; struct cx88_input radio;
int blackbird:1; int blackbird:1;
int dvb:1; int dvb:1;
...@@ -288,6 +290,11 @@ struct cx88_core { ...@@ -288,6 +290,11 @@ struct cx88_core {
/* IR remote control state */ /* IR remote control state */
struct cx88_IR *ir; struct cx88_IR *ir;
struct semaphore lock;
/* various v4l controls */
u32 freq;
}; };
struct cx8800_dev; struct cx8800_dev;
...@@ -323,8 +330,7 @@ struct cx8800_suspend_state { ...@@ -323,8 +330,7 @@ struct cx8800_suspend_state {
struct cx8800_dev { struct cx8800_dev {
struct cx88_core *core; struct cx88_core *core;
struct list_head devlist; struct list_head devlist;
struct semaphore lock; spinlock_t slock;
spinlock_t slock;
/* various device info */ /* various device info */
unsigned int resources; unsigned int resources;
...@@ -342,7 +348,6 @@ struct cx8800_dev { ...@@ -342,7 +348,6 @@ struct cx8800_dev {
struct cx88_dmaqueue vbiq; struct cx88_dmaqueue vbiq;
/* various v4l controls */ /* various v4l controls */
u32 freq;
/* other global state info */ /* other global state info */
struct cx8800_suspend_state state; struct cx8800_suspend_state state;
...@@ -350,14 +355,8 @@ struct cx8800_dev { ...@@ -350,14 +355,8 @@ struct cx8800_dev {
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* function 1: audio/alsa stuff */ /* function 1: audio/alsa stuff */
/* =============> moved to cx88-alsa.c <====================== */
struct cx8801_dev {
struct cx88_core *core;
/* pci i/o */
struct pci_dev *pci;
unsigned char pci_rev,pci_lat;
};
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* function 2: mpeg stuff */ /* function 2: mpeg stuff */
...@@ -373,8 +372,7 @@ struct cx8802_suspend_state { ...@@ -373,8 +372,7 @@ struct cx8802_suspend_state {
struct cx8802_dev { struct cx8802_dev {
struct cx88_core *core; struct cx88_core *core;
struct semaphore lock; spinlock_t slock;
spinlock_t slock;
/* pci i/o */ /* pci i/o */
struct pci_dev *pci; struct pci_dev *pci;
...@@ -553,8 +551,21 @@ void cx8802_fini_common(struct cx8802_dev *dev); ...@@ -553,8 +551,21 @@ void cx8802_fini_common(struct cx8802_dev *dev);
int cx8802_suspend_common(struct pci_dev *pci_dev, pm_message_t state); int cx8802_suspend_common(struct pci_dev *pci_dev, pm_message_t state);
int cx8802_resume_common(struct pci_dev *pci_dev); int cx8802_resume_common(struct pci_dev *pci_dev);
/* ----------------------------------------------------------- */
/* cx88-video.c */
extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
struct cx88_core *core, unsigned int cmd,
void *arg, v4l2_kioctl driver_ioctl);
/* ----------------------------------------------------------- */
/* cx88-blackbird.c */
extern int (*cx88_ioctl_hook)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg);
extern unsigned int (*cx88_ioctl_translator)(unsigned int cmd);
/* /*
* Local variables: * Local variables:
* c-basic-offset: 8 * c-basic-offset: 8
* End: * End:
* kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
*/ */
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