summaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/common/Kconfig6
-rw-r--r--drivers/media/common/Makefile4
-rw-r--r--drivers/media/common/ir-common.c61
-rw-r--r--drivers/media/common/saa7146_core.c6
-rw-r--r--drivers/media/common/saa7146_fops.c32
-rw-r--r--drivers/media/common/saa7146_i2c.c16
-rw-r--r--drivers/media/common/saa7146_vbi.c4
-rw-r--r--drivers/media/common/saa7146_video.c46
-rw-r--r--drivers/media/dvb/b2c2/Kconfig1
-rw-r--r--drivers/media/dvb/b2c2/flexcop-common.h2
-rw-r--r--drivers/media/dvb/b2c2/flexcop-fe-tuner.c4
-rw-r--r--drivers/media/dvb/b2c2/flexcop-hw-filter.c2
-rw-r--r--drivers/media/dvb/bt8xx/dst_ca.c6
-rw-r--r--drivers/media/dvb/bt8xx/dvb-bt8xx.c6
-rw-r--r--drivers/media/dvb/cinergyT2/cinergyT2.c11
-rw-r--r--drivers/media/dvb/dvb-core/demux.h92
-rw-r--r--drivers/media/dvb/dvb-core/dmxdev.c2
-rw-r--r--drivers/media/dvb/dvb-core/dmxdev.h64
-rw-r--r--drivers/media/dvb/dvb-core/dvb_ca_en50221.c71
-rw-r--r--drivers/media/dvb/dvb-core/dvb_filter.c332
-rw-r--r--drivers/media/dvb/dvb-core/dvb_filter.h102
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.c8
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.h8
-rw-r--r--drivers/media/dvb/dvb-core/dvb_net.c73
-rw-r--r--drivers/media/dvb/dvb-core/dvb_ringbuffer.c262
-rw-r--r--drivers/media/dvb/dvb-core/dvb_ringbuffer.h20
-rw-r--r--drivers/media/dvb/dvb-core/dvbdev.c142
-rw-r--r--drivers/media/dvb/dvb-core/dvbdev.h6
-rw-r--r--drivers/media/dvb/dvb-usb/a800.c2
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-common.c18
-rw-r--r--drivers/media/dvb/dvb-usb/digitv.c2
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-init.c2
-rw-r--r--drivers/media/dvb/dvb-usb/vp702x-fe.c2
-rw-r--r--drivers/media/dvb/dvb-usb/vp7045-fe.c2
-rw-r--r--drivers/media/dvb/frontends/at76c651.c6
-rw-r--r--drivers/media/dvb/frontends/bcm3510.c4
-rw-r--r--drivers/media/dvb/frontends/cx22700.c10
-rw-r--r--drivers/media/dvb/frontends/cx22702.c4
-rw-r--r--drivers/media/dvb/frontends/cx22702.h4
-rw-r--r--drivers/media/dvb/frontends/cx24110.c312
-rw-r--r--drivers/media/dvb/frontends/l64781.c26
-rw-r--r--drivers/media/dvb/frontends/l64781.h2
-rw-r--r--drivers/media/dvb/frontends/lgdt330x.c8
-rw-r--r--drivers/media/dvb/frontends/mt312.c4
-rw-r--r--drivers/media/dvb/frontends/nxt2002.c6
-rw-r--r--drivers/media/dvb/frontends/nxt200x.c6
-rw-r--r--drivers/media/dvb/frontends/nxt6000.c10
-rw-r--r--drivers/media/dvb/frontends/or51132.c2
-rw-r--r--drivers/media/dvb/frontends/s5h1420.c6
-rw-r--r--drivers/media/dvb/frontends/s5h1420.h2
-rw-r--r--drivers/media/dvb/frontends/sp8870.c16
-rw-r--r--drivers/media/dvb/frontends/sp887x.c14
-rw-r--r--drivers/media/dvb/frontends/stv0299.c36
-rw-r--r--drivers/media/dvb/frontends/tda10021.c10
-rw-r--r--drivers/media/dvb/frontends/tda10021.h4
-rw-r--r--drivers/media/dvb/frontends/tda1004x.c2
-rw-r--r--drivers/media/dvb/frontends/tda8083.c20
-rw-r--r--drivers/media/dvb/frontends/ves1820.c14
-rw-r--r--drivers/media/dvb/ttpci/Kconfig1
-rw-r--r--drivers/media/dvb/ttpci/av7110.c29
-rw-r--r--drivers/media/dvb/ttpci/av7110_ca.c1
-rw-r--r--drivers/media/dvb/ttpci/av7110_hw.c20
-rw-r--r--drivers/media/dvb/ttpci/av7110_hw.h3
-rw-r--r--drivers/media/dvb/ttpci/av7110_v4l.c4
-rw-r--r--drivers/media/dvb/ttpci/budget-av.c2
-rw-r--r--drivers/media/dvb/ttpci/budget-ci.c2
-rw-r--r--drivers/media/dvb/ttpci/budget-core.c2
-rw-r--r--drivers/media/dvb/ttpci/budget-patch.c326
-rw-r--r--drivers/media/dvb/ttpci/budget.c8
-rw-r--r--drivers/media/dvb/ttpci/budget.h2
-rw-r--r--drivers/media/dvb/ttpci/fdump.c2
-rw-r--r--drivers/media/dvb/ttpci/ttpci-eeprom.c41
-rw-r--r--drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c128
-rw-r--r--drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h3276
-rw-r--r--drivers/media/dvb/ttusb-dec/ttusb_dec.c4
-rw-r--r--drivers/media/video/Kconfig33
-rw-r--r--drivers/media/video/Makefile5
-rw-r--r--drivers/media/video/bt832.c14
-rw-r--r--drivers/media/video/bttv-cards.c30
-rw-r--r--drivers/media/video/bttv-driver.c153
-rw-r--r--drivers/media/video/bttv-gpio.c18
-rw-r--r--drivers/media/video/bttv.h3
-rw-r--r--drivers/media/video/bttvp.h3
-rw-r--r--drivers/media/video/cx25840/Makefile6
-rw-r--r--drivers/media/video/cx25840/cx25840-audio.c368
-rw-r--r--drivers/media/video/cx25840/cx25840-core.c1056
-rw-r--r--drivers/media/video/cx25840/cx25840-firmware.c167
-rw-r--r--drivers/media/video/cx25840/cx25840-vbi.c315
-rw-r--r--drivers/media/video/cx25840/cx25840.h92
-rw-r--r--drivers/media/video/cx88/Kconfig20
-rw-r--r--drivers/media/video/cx88/Makefile27
-rw-r--r--drivers/media/video/cx88/cx88-blackbird.c2
-rw-r--r--drivers/media/video/cx88/cx88-cards.c45
-rw-r--r--drivers/media/video/cx88/cx88-core.c35
-rw-r--r--drivers/media/video/cx88/cx88-dvb.c3
-rw-r--r--drivers/media/video/cx88/cx88-input.c2
-rw-r--r--drivers/media/video/cx88/cx88-tvaudio.c28
-rw-r--r--drivers/media/video/cx88/cx88.h5
-rw-r--r--drivers/media/video/em28xx/em28xx-core.c56
-rw-r--r--drivers/media/video/em28xx/em28xx-i2c.c2
-rw-r--r--drivers/media/video/em28xx/em28xx-input.c3
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c23
-rw-r--r--drivers/media/video/ir-kbd-gpio.c293
-rw-r--r--drivers/media/video/ir-kbd-i2c.c63
-rw-r--r--drivers/media/video/msp3400.c18
-rw-r--r--drivers/media/video/saa6588.c1
-rw-r--r--drivers/media/video/saa7115.c1378
-rw-r--r--drivers/media/video/saa711x.c5
-rw-r--r--drivers/media/video/saa7127.c849
-rw-r--r--drivers/media/video/saa7134/Kconfig37
-rw-r--r--drivers/media/video/saa7134/Makefile29
-rw-r--r--drivers/media/video/saa7134/saa6752hs.c17
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c484
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c34
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c147
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c1
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c2
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c111
-rw-r--r--drivers/media/video/saa7134/saa7134-oss.c187
-rw-r--r--drivers/media/video/saa7134/saa7134.h6
-rw-r--r--drivers/media/video/tda8290.c4
-rw-r--r--drivers/media/video/tda9887.c15
-rw-r--r--drivers/media/video/tuner-core.c11
-rw-r--r--drivers/media/video/tuner-simple.c4
-rw-r--r--drivers/media/video/tvaudio.c30
-rw-r--r--drivers/media/video/tveeprom.c69
-rw-r--r--drivers/media/video/tvp5150.c3
-rw-r--r--drivers/media/video/video-buf-dvb.c2
-rw-r--r--drivers/media/video/video-buf.c9
-rw-r--r--drivers/media/video/videodev.c26
-rw-r--r--drivers/media/video/wm8775.c7
131 files changed, 8482 insertions, 3670 deletions
diff --git a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig
index caebd0a..6a901a0 100644
--- a/drivers/media/common/Kconfig
+++ b/drivers/media/common/Kconfig
@@ -1,12 +1,12 @@
config VIDEO_SAA7146
- tristate
+ tristate
select I2C
config VIDEO_SAA7146_VV
- tristate
+ tristate
select VIDEO_BUF
select VIDEO_VIDEOBUF
select VIDEO_SAA7146
config VIDEO_VIDEOBUF
- tristate
+ tristate
diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile
index 97b4341..bd458cb 100644
--- a/drivers/media/common/Makefile
+++ b/drivers/media/common/Makefile
@@ -1,5 +1,5 @@
-saa7146-objs := saa7146_i2c.o saa7146_core.o
-saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
+saa7146-objs := saa7146_i2c.o saa7146_core.o
+saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
diff --git a/drivers/media/common/ir-common.c b/drivers/media/common/ir-common.c
index 4b71fd6..97fa3fc 100644
--- a/drivers/media/common/ir-common.c
+++ b/drivers/media/common/ir-common.c
@@ -126,6 +126,66 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
};
EXPORT_SYMBOL_GPL(ir_codes_winfast);
+IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
+ [ 0x59 ] = KEY_MUTE,
+ [ 0x4a ] = KEY_POWER,
+
+ [ 0x18 ] = KEY_TEXT,
+ [ 0x26 ] = KEY_TV,
+ [ 0x3d ] = KEY_PRINT,
+
+ [ 0x48 ] = KEY_RED,
+ [ 0x04 ] = KEY_GREEN,
+ [ 0x11 ] = KEY_YELLOW,
+ [ 0x00 ] = KEY_BLUE,
+
+ [ 0x2d ] = KEY_VOLUMEUP,
+ [ 0x1e ] = KEY_VOLUMEDOWN,
+
+ [ 0x49 ] = KEY_MENU,
+
+ [ 0x16 ] = KEY_CHANNELUP,
+ [ 0x17 ] = KEY_CHANNELDOWN,
+
+ [ 0x20 ] = KEY_UP,
+ [ 0x21 ] = KEY_DOWN,
+ [ 0x22 ] = KEY_LEFT,
+ [ 0x23 ] = KEY_RIGHT,
+ [ 0x0d ] = KEY_SELECT,
+
+
+
+ [ 0x08 ] = KEY_BACK,
+ [ 0x07 ] = KEY_REFRESH,
+
+ [ 0x2f ] = KEY_ZOOM,
+ [ 0x29 ] = KEY_RECORD,
+
+ [ 0x4b ] = KEY_PAUSE,
+ [ 0x4d ] = KEY_REWIND,
+ [ 0x2e ] = KEY_PLAY,
+ [ 0x4e ] = KEY_FORWARD,
+ [ 0x53 ] = KEY_PREVIOUS,
+ [ 0x4c ] = KEY_STOP,
+ [ 0x54 ] = KEY_NEXT,
+
+ [ 0x69 ] = KEY_KP0,
+ [ 0x6a ] = KEY_KP1,
+ [ 0x6b ] = KEY_KP2,
+ [ 0x6c ] = KEY_KP3,
+ [ 0x6d ] = KEY_KP4,
+ [ 0x6e ] = KEY_KP5,
+ [ 0x6f ] = KEY_KP6,
+ [ 0x70 ] = KEY_KP7,
+ [ 0x71 ] = KEY_KP8,
+ [ 0x72 ] = KEY_KP9,
+
+ [ 0x74 ] = KEY_CHANNEL,
+ [ 0x0a ] = KEY_BACKSPACE,
+};
+
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle);
+
/* empty keytable, can be used as placeholder for not-yet created keytables */
IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = {
[ 42 ] = KEY_COFFEE,
@@ -253,6 +313,7 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
if (ir_codes)
memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
+
dev->keycode = ir->ir_codes;
dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
dev->keycodemax = IR_KEYTAB_SIZE;
diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
index 206cc2f..2899d34 100644
--- a/drivers/media/common/saa7146_core.c
+++ b/drivers/media/common/saa7146_core.c
@@ -174,8 +174,8 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
{
- u32 *cpu;
- dma_addr_t dma_addr;
+ u32 *cpu;
+ dma_addr_t dma_addr;
cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr);
if (NULL == cpu) {
@@ -405,7 +405,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
pci_set_drvdata(pci, dev);
- init_MUTEX(&dev->lock);
+ init_MUTEX(&dev->lock);
spin_lock_init(&dev->int_slock);
spin_lock_init(&dev->slock);
diff --git a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c
index 3788898..09ec964 100644
--- a/drivers/media/common/saa7146_fops.c
+++ b/drivers/media/common/saa7146_fops.c
@@ -1,6 +1,6 @@
#include <media/saa7146_vv.h>
-#define BOARD_CAN_DO_VBI(dev) (dev->revision != 0 && dev->vv_data->vbi_minor != -1)
+#define BOARD_CAN_DO_VBI(dev) (dev->revision != 0 && dev->vv_data->vbi_minor != -1)
/****************************************************************************/
/* resource management functions, shamelessly stolen from saa7134 driver */
@@ -102,9 +102,9 @@ void saa7146_buffer_finish(struct saa7146_dev *dev,
/* finish current buffer */
if (NULL == q->curr) {
DEB_D(("aiii. no current buffer\n"));
- return;
+ return;
}
-
+
q->curr->vb.state = state;
do_gettimeofday(&q->curr->vb.ts);
wake_up(&q->curr->vb.done);
@@ -143,13 +143,13 @@ void saa7146_buffer_next(struct saa7146_dev *dev,
// fixme: fix this for vflip != 0
saa7146_write(dev, PROT_ADDR1, 0);
- saa7146_write(dev, MC2, (MASK_02|MASK_18));
+ saa7146_write(dev, MC2, (MASK_02|MASK_18));
/* write the address of the rps-program */
saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
/* turn on rps */
saa7146_write(dev, MC1, (MASK_12 | MASK_28));
-
+
/*
printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
@@ -246,7 +246,7 @@ static int fops_open(struct inode *inode, struct file *file)
goto out;
}
memset(fh,0,sizeof(*fh));
-
+
file->private_data = fh;
fh->dev = dev;
fh->type = type;
@@ -275,7 +275,7 @@ out:
file->private_data = NULL;
}
up(&saa7146_devices_lock);
- return result;
+ return result;
}
static int fops_release(struct inode *inode, struct file *file)
@@ -405,7 +405,7 @@ static struct file_operations video_fops =
static void vv_callback(struct saa7146_dev *dev, unsigned long status)
{
u32 isr = status;
-
+
DEB_INT(("dev:%p, isr:0x%08x\n",dev,(u32)status));
if (0 != (isr & (MASK_27))) {
@@ -454,11 +454,11 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
handle different devices that might need different
configuration data) */
dev->ext_vv_data = ext_vv;
-
+
vv->video_minor = -1;
vv->vbi_minor = -1;
- vv->d_clipping.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_CLIPPING_MEM, &vv->d_clipping.dma_handle);
+ vv->d_clipping.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_CLIPPING_MEM, &vv->d_clipping.dma_handle);
if( NULL == vv->d_clipping.cpu_addr ) {
ERR(("out of memory. aborting.\n"));
kfree(vv);
@@ -468,7 +468,7 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
saa7146_video_uops.init(dev,vv);
saa7146_vbi_uops.init(dev,vv);
-
+
dev->vv_data = vv;
dev->vv_callback = &vv_callback;
@@ -480,12 +480,12 @@ int saa7146_vv_release(struct saa7146_dev* dev)
struct saa7146_vv *vv = dev->vv_data;
DEB_EE(("dev:%p\n",dev));
-
+
pci_free_consistent(dev->pci, SAA7146_RPS_MEM, vv->d_clipping.cpu_addr, vv->d_clipping.dma_handle);
- kfree(vv);
+ kfree(vv);
dev->vv_data = NULL;
dev->vv_callback = NULL;
-
+
return 0;
}
@@ -498,7 +498,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
DEB_EE(("dev:%p, name:'%s', type:%d\n",dev,name,type));
// released by vfd->release
- vfd = video_device_alloc();
+ vfd = video_device_alloc();
if (vfd == NULL)
return -ENOMEM;
@@ -530,7 +530,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev)
{
struct saa7146_vv *vv = dev->vv_data;
-
+
DEB_EE(("dev:%p\n",dev));
if( VFL_TYPE_GRABBER == (*vid)->type ) {
diff --git a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
index fec6bea..8aabdd8fb 100644
--- a/drivers/media/common/saa7146_i2c.c
+++ b/drivers/media/common/saa7146_i2c.c
@@ -276,8 +276,8 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
int i = 0, count = 0;
u32* buffer = dev->d_i2c.cpu_addr;
int err = 0;
- int address_err = 0;
- int short_delay = 0;
+ int address_err = 0;
+ int short_delay = 0;
if (down_interruptible (&dev->i2c_lock))
return -ERESTARTSYS;
@@ -325,7 +325,7 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
goto out;
}
- address_err++;
+ address_err++;
}
DEB_I2C(("error while sending message(s). starting again.\n"));
break;
@@ -336,14 +336,14 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
break;
}
- /* delay a bit before retrying */
- msleep(10);
+ /* delay a bit before retrying */
+ msleep(10);
} while (err != num && retries--);
- /* if every retry had an address error, exit right away */
- if (address_err == retries) {
- goto out;
+ /* if every retry had an address error, exit right away */
+ if (address_err == retries) {
+ goto out;
}
/* if any things had to be read, get the results */
diff --git a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c
index cb86a97..063986e 100644
--- a/drivers/media/common/saa7146_vbi.c
+++ b/drivers/media/common/saa7146_vbi.c
@@ -6,8 +6,8 @@ static int vbi_workaround(struct saa7146_dev *dev)
{
struct saa7146_vv *vv = dev->vv_data;
- u32 *cpu;
- dma_addr_t dma_addr;
+ u32 *cpu;
+ dma_addr_t dma_addr;
int count = 0;
int i;
diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
index 8dd4d15..1d96102 100644
--- a/drivers/media/common/saa7146_video.c
+++ b/drivers/media/common/saa7146_video.c
@@ -150,23 +150,23 @@ static int try_win(struct saa7146_dev *dev, struct v4l2_window *win)
maxh = vv->standard->v_max_out;
if (V4L2_FIELD_ANY == field) {
- field = (win->w.height > maxh/2)
- ? V4L2_FIELD_INTERLACED
- : V4L2_FIELD_TOP;
- }
- switch (field) {
- case V4L2_FIELD_TOP:
- case V4L2_FIELD_BOTTOM:
- case V4L2_FIELD_ALTERNATE:
- maxh = maxh / 2;
- break;
- case V4L2_FIELD_INTERLACED:
- break;
- default: {
+ field = (win->w.height > maxh/2)
+ ? V4L2_FIELD_INTERLACED
+ : V4L2_FIELD_TOP;
+ }
+ switch (field) {
+ case V4L2_FIELD_TOP:
+ case V4L2_FIELD_BOTTOM:
+ case V4L2_FIELD_ALTERNATE:
+ maxh = maxh / 2;
+ break;
+ case V4L2_FIELD_INTERLACED:
+ break;
+ default: {
DEB_D(("no known field mode '%d'.\n",field));
- return -EINVAL;
+ return -EINVAL;
+ }
}
- }
win->field = field;
if (win->w.width > maxw)
@@ -887,7 +887,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
DEB_EE(("VIDIOC_QUERYCAP\n"));
- strcpy(cap->driver, "saa7146 v4l2");
+ strcpy(cap->driver, "saa7146 v4l2");
strlcpy(cap->card, dev->ext->name, sizeof(cap->card));
sprintf(cap->bus_info,"PCI:%s", pci_name(dev->pci));
cap->version = SAA7146_VERSION_CODE;
@@ -1011,19 +1011,19 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
err = set_control(fh,arg);
return err;
}
- case VIDIOC_G_PARM:
- {
- struct v4l2_streamparm *parm = arg;
+ case VIDIOC_G_PARM:
+ {
+ struct v4l2_streamparm *parm = arg;
if( parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ) {
return -EINVAL;
}
- memset(&parm->parm.capture,0,sizeof(struct v4l2_captureparm));
+ memset(&parm->parm.capture,0,sizeof(struct v4l2_captureparm));
parm->parm.capture.readbuffers = 1;
// fixme: only for PAL!
parm->parm.capture.timeperframe.numerator = 1;
parm->parm.capture.timeperframe.denominator = 25;
- return 0;
- }
+ return 0;
+ }
case VIDIOC_G_FMT:
{
struct v4l2_format *f = arg;
@@ -1383,7 +1383,7 @@ static struct videobuf_queue_ops video_qops = {
static void video_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
{
- INIT_LIST_HEAD(&vv->video_q.queue);
+ INIT_LIST_HEAD(&vv->video_q.queue);
init_timer(&vv->video_q.timeout);
vv->video_q.timeout.function = saa7146_buffer_timeout;
diff --git a/drivers/media/dvb/b2c2/Kconfig b/drivers/media/dvb/b2c2/Kconfig
index d7417ea..2583a86 100644
--- a/drivers/media/dvb/b2c2/Kconfig
+++ b/drivers/media/dvb/b2c2/Kconfig
@@ -7,6 +7,7 @@ config DVB_B2C2_FLEXCOP
select DVB_NXT2002
select DVB_STV0297
select DVB_BCM3510
+ select DVB_LGDT330X
help
Support for the digital TV receiver chip made by B2C2 Inc. included in
Technisats PCI cards and USB boxes.
diff --git a/drivers/media/dvb/b2c2/flexcop-common.h b/drivers/media/dvb/b2c2/flexcop-common.h
index a94912a..344a3c8 100644
--- a/drivers/media/dvb/b2c2/flexcop-common.h
+++ b/drivers/media/dvb/b2c2/flexcop-common.h
@@ -132,7 +132,7 @@ int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended);
* I2C-channel of the flexcop.
*/
int flexcop_i2c_request(struct flexcop_device*, flexcop_access_op_t,
- flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
+ flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
/* from flexcop-sram.c */
int flexcop_sram_set_dest(struct flexcop_device *fc, flexcop_sram_dest_t dest, flexcop_sram_dest_target_t target);
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
index a353303..21a9045 100644
--- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
+++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
@@ -298,7 +298,7 @@ static int flexcop_fe_request_firmware(struct dvb_frontend* fe, const struct fir
}
static int lgdt3303_pll_set(struct dvb_frontend* fe,
- struct dvb_frontend_parameters* params)
+ struct dvb_frontend_parameters* params)
{
struct flexcop_device *fc = fe->dvb->priv;
u8 buf[4];
@@ -332,7 +332,7 @@ static int lgdt3303_pll_set(struct dvb_frontend* fe,
return -EREMOTEIO;
}
- return 0;
+ return 0;
}
static struct lgdt330x_config air2pc_atsc_hd5000_config = {
diff --git a/drivers/media/dvb/b2c2/flexcop-hw-filter.c b/drivers/media/dvb/b2c2/flexcop-hw-filter.c
index 75cf237..b386cc6 100644
--- a/drivers/media/dvb/b2c2/flexcop-hw-filter.c
+++ b/drivers/media/dvb/b2c2/flexcop-hw-filter.c
@@ -19,7 +19,7 @@ void flexcop_smc_ctrl(struct flexcop_device *fc, int onoff)
flexcop_set_ibi_value(ctrl_208,SMC_Enable_sig,onoff);
}
-void flexcop_null_filter_ctrl(struct flexcop_device *fc, int onoff)
+static void flexcop_null_filter_ctrl(struct flexcop_device *fc, int onoff)
{
flexcop_set_ibi_value(ctrl_208,Null_filter_sig,onoff);
}
diff --git a/drivers/media/dvb/bt8xx/dst_ca.c b/drivers/media/dvb/bt8xx/dst_ca.c
index e6541af..2239651 100644
--- a/drivers/media/dvb/bt8xx/dst_ca.c
+++ b/drivers/media/dvb/bt8xx/dst_ca.c
@@ -406,7 +406,7 @@ static int ca_send_message(struct dst_state *state, struct ca_msg *p_ca_message,
}
dprintk(verbose, DST_CA_DEBUG, 1, " ");
- if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg))) {
+ if (copy_from_user(p_ca_message, arg, sizeof (struct ca_msg))) {
result = -EFAULT;
goto free_mem_and_exit;
}
@@ -579,7 +579,7 @@ static int dst_ca_release(struct inode *inode, struct file *file)
return 0;
}
-static int dst_ca_read(struct file *file, char __user *buffer, size_t length, loff_t *offset)
+static ssize_t dst_ca_read(struct file *file, char __user *buffer, size_t length, loff_t *offset)
{
int bytes_read = 0;
@@ -588,7 +588,7 @@ static int dst_ca_read(struct file *file, char __user *buffer, size_t length, lo
return bytes_read;
}
-static int dst_ca_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset)
+static ssize_t dst_ca_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset)
{
dprintk(verbose, DST_CA_DEBUG, 1, " Device write.");
diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
index 2e39809..77977e9 100644
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
@@ -556,9 +556,9 @@ static int tdvs_tua6034_pll_set(struct dvb_frontend* fe, struct dvb_frontend_par
dprintk("%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]);
if ((err = i2c_transfer(card->i2c_adapter, &msg, 1)) != 1) {
- printk(KERN_WARNING "dvb-bt8xx: %s error "
- "(addr %02x <- %02x, err = %i)\n",
- __FUNCTION__, buf[0], buf[1], err);
+ printk(KERN_WARNING "dvb-bt8xx: %s error "
+ "(addr %02x <- %02x, err = %i)\n",
+ __FUNCTION__, buf[0], buf[1], err);
if (err < 0)
return err;
else
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c
index a1607e7..336fc28 100644
--- a/drivers/media/dvb/cinergyT2/cinergyT2.c
+++ b/drivers/media/dvb/cinergyT2/cinergyT2.c
@@ -276,7 +276,7 @@ static void cinergyt2_free_stream_urbs (struct cinergyt2 *cinergyt2)
if (cinergyt2->stream_urb[i])
usb_free_urb(cinergyt2->stream_urb[i]);
- pci_free_consistent(NULL, STREAM_URB_COUNT*STREAM_BUF_SIZE,
+ usb_buffer_free(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE,
cinergyt2->streambuf, cinergyt2->streambuf_dmahandle);
}
@@ -284,9 +284,8 @@ static int cinergyt2_alloc_stream_urbs (struct cinergyt2 *cinergyt2)
{
int i;
- cinergyt2->streambuf = pci_alloc_consistent(NULL,
- STREAM_URB_COUNT*STREAM_BUF_SIZE,
- &cinergyt2->streambuf_dmahandle);
+ cinergyt2->streambuf = usb_buffer_alloc(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE,
+ SLAB_KERNEL, &cinergyt2->streambuf_dmahandle);
if (!cinergyt2->streambuf) {
dprintk(1, "failed to alloc consistent stream memory area, bailing out!\n");
return -ENOMEM;
@@ -773,13 +772,15 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
input_dev->name = DRIVER_NAME " remote control";
input_dev->phys = cinergyt2->phys;
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
- for (i = 0; ARRAY_SIZE(rc_keys); i += 3)
+ for (i = 0; i < ARRAY_SIZE(rc_keys); i += 3)
set_bit(rc_keys[i + 2], input_dev->keybit);
input_dev->keycodesize = 0;
input_dev->keycodemax = 0;
input_register_device(cinergyt2->rc_input_dev);
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
+
+ return 0;
}
static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2)
diff --git a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h
index 7d7b006..9f02582 100644
--- a/drivers/media/dvb/dvb-core/demux.h
+++ b/drivers/media/dvb/dvb-core/demux.h
@@ -86,25 +86,25 @@ enum dmx_success {
enum dmx_ts_pes
{ /* also send packets to decoder (if it exists) */
- DMX_TS_PES_AUDIO0,
+ DMX_TS_PES_AUDIO0,
DMX_TS_PES_VIDEO0,
DMX_TS_PES_TELETEXT0,
DMX_TS_PES_SUBTITLE0,
DMX_TS_PES_PCR0,
- DMX_TS_PES_AUDIO1,
+ DMX_TS_PES_AUDIO1,
DMX_TS_PES_VIDEO1,
DMX_TS_PES_TELETEXT1,
DMX_TS_PES_SUBTITLE1,
DMX_TS_PES_PCR1,
- DMX_TS_PES_AUDIO2,
+ DMX_TS_PES_AUDIO2,
DMX_TS_PES_VIDEO2,
DMX_TS_PES_TELETEXT2,
DMX_TS_PES_SUBTITLE2,
DMX_TS_PES_PCR2,
- DMX_TS_PES_AUDIO3,
+ DMX_TS_PES_AUDIO3,
DMX_TS_PES_VIDEO3,
DMX_TS_PES_TELETEXT3,
DMX_TS_PES_SUBTITLE3,
@@ -121,17 +121,17 @@ enum dmx_ts_pes
struct dmx_ts_feed {
- int is_filtering; /* Set to non-zero when filtering in progress */
- struct dmx_demux *parent; /* Back-pointer */
- void *priv; /* Pointer to private data of the API client */
- int (*set) (struct dmx_ts_feed *feed,
+ int is_filtering; /* Set to non-zero when filtering in progress */
+ struct dmx_demux *parent; /* Back-pointer */
+ void *priv; /* Pointer to private data of the API client */
+ int (*set) (struct dmx_ts_feed *feed,
u16 pid,
int type,
enum dmx_ts_pes pes_type,
size_t circular_buffer_size,
struct timespec timeout);
- int (*start_filtering) (struct dmx_ts_feed* feed);
- int (*stop_filtering) (struct dmx_ts_feed* feed);
+ int (*start_filtering) (struct dmx_ts_feed* feed);
+ int (*stop_filtering) (struct dmx_ts_feed* feed);
};
/*--------------------------------------------------------------------------*/
@@ -139,35 +139,35 @@ struct dmx_ts_feed {
/*--------------------------------------------------------------------------*/
struct dmx_section_filter {
- u8 filter_value [DMX_MAX_FILTER_SIZE];
- u8 filter_mask [DMX_MAX_FILTER_SIZE];
- u8 filter_mode [DMX_MAX_FILTER_SIZE];
- struct dmx_section_feed* parent; /* Back-pointer */
- void* priv; /* Pointer to private data of the API client */
+ u8 filter_value [DMX_MAX_FILTER_SIZE];
+ u8 filter_mask [DMX_MAX_FILTER_SIZE];
+ u8 filter_mode [DMX_MAX_FILTER_SIZE];
+ struct dmx_section_feed* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
};
struct dmx_section_feed {
- int is_filtering; /* Set to non-zero when filtering in progress */
- struct dmx_demux* parent; /* Back-pointer */
- void* priv; /* Pointer to private data of the API client */
+ int is_filtering; /* Set to non-zero when filtering in progress */
+ struct dmx_demux* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
- int check_crc;
+ int check_crc;
u32 crc_val;
- u8 *secbuf;
- u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
- u16 secbufp, seclen, tsfeedp;
+ u8 *secbuf;
+ u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
+ u16 secbufp, seclen, tsfeedp;
- int (*set) (struct dmx_section_feed* feed,
+ int (*set) (struct dmx_section_feed* feed,
u16 pid,
size_t circular_buffer_size,
int check_crc);
- int (*allocate_filter) (struct dmx_section_feed* feed,
+ int (*allocate_filter) (struct dmx_section_feed* feed,
struct dmx_section_filter** filter);
- int (*release_filter) (struct dmx_section_feed* feed,
+ int (*release_filter) (struct dmx_section_feed* feed,
struct dmx_section_filter* filter);
- int (*start_filtering) (struct dmx_section_feed* feed);
- int (*stop_filtering) (struct dmx_section_feed* feed);
+ int (*start_filtering) (struct dmx_section_feed* feed);
+ int (*stop_filtering) (struct dmx_section_feed* feed);
};
/*--------------------------------------------------------------------------*/
@@ -205,10 +205,10 @@ enum dmx_frontend_source {
};
struct dmx_frontend {
- struct list_head connectivity_list; /* List of front-ends that can
+ struct list_head connectivity_list; /* List of front-ends that can
be connected to a particular
demux */
- enum dmx_frontend_source source;
+ enum dmx_frontend_source source;
};
/*--------------------------------------------------------------------------*/
@@ -240,38 +240,38 @@ struct dmx_frontend {
#define DMX_FE_ENTRY(list) list_entry(list, struct dmx_frontend, connectivity_list)
struct dmx_demux {
- u32 capabilities; /* Bitfield of capability flags */
- struct dmx_frontend* frontend; /* Front-end connected to the demux */
- void* priv; /* Pointer to private data of the API client */
- int (*open) (struct dmx_demux* demux);
- int (*close) (struct dmx_demux* demux);
- int (*write) (struct dmx_demux* demux, const char* buf, size_t count);
- int (*allocate_ts_feed) (struct dmx_demux* demux,
+ u32 capabilities; /* Bitfield of capability flags */
+ struct dmx_frontend* frontend; /* Front-end connected to the demux */
+ void* priv; /* Pointer to private data of the API client */
+ int (*open) (struct dmx_demux* demux);
+ int (*close) (struct dmx_demux* demux);
+ int (*write) (struct dmx_demux* demux, const char* buf, size_t count);
+ int (*allocate_ts_feed) (struct dmx_demux* demux,
struct dmx_ts_feed** feed,
dmx_ts_cb callback);
- int (*release_ts_feed) (struct dmx_demux* demux,
+ int (*release_ts_feed) (struct dmx_demux* demux,
struct dmx_ts_feed* feed);
- int (*allocate_section_feed) (struct dmx_demux* demux,
+ int (*allocate_section_feed) (struct dmx_demux* demux,
struct dmx_section_feed** feed,
dmx_section_cb callback);
- int (*release_section_feed) (struct dmx_demux* demux,
+ int (*release_section_feed) (struct dmx_demux* demux,
struct dmx_section_feed* feed);
- int (*add_frontend) (struct dmx_demux* demux,
+ int (*add_frontend) (struct dmx_demux* demux,
struct dmx_frontend* frontend);
- int (*remove_frontend) (struct dmx_demux* demux,
+ int (*remove_frontend) (struct dmx_demux* demux,
struct dmx_frontend* frontend);
- struct list_head* (*get_frontends) (struct dmx_demux* demux);
- int (*connect_frontend) (struct dmx_demux* demux,
+ struct list_head* (*get_frontends) (struct dmx_demux* demux);
+ int (*connect_frontend) (struct dmx_demux* demux,
struct dmx_frontend* frontend);
- int (*disconnect_frontend) (struct dmx_demux* demux);
+ int (*disconnect_frontend) (struct dmx_demux* demux);
- int (*get_pes_pids) (struct dmx_demux* demux, u16 *pids);
+ int (*get_pes_pids) (struct dmx_demux* demux, u16 *pids);
int (*get_caps) (struct dmx_demux* demux, struct dmx_caps *caps);
int (*set_source) (struct dmx_demux* demux, const dmx_source_t *src);
- int (*get_stc) (struct dmx_demux* demux, unsigned int num,
+ int (*get_stc) (struct dmx_demux* demux, unsigned int num,
u64 *stc, unsigned int *base);
};
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
index 8028c3a5e..7b8373a 100644
--- a/drivers/media/dvb/dvb-core/dmxdev.c
+++ b/drivers/media/dvb/dvb-core/dmxdev.c
@@ -947,7 +947,7 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
case DMX_GET_STC:
if (!dmxdev->demux->get_stc) {
- ret=-EINVAL;
+ ret=-EINVAL;
break;
}
ret = dmxdev->demux->get_stc(dmxdev->demux,
diff --git a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h
index 395a9cd..fd72920 100644
--- a/drivers/media/dvb/dvb-core/dmxdev.h
+++ b/drivers/media/dvb/dvb-core/dmxdev.h
@@ -53,51 +53,51 @@ enum dmxdev_state {
};
struct dmxdev_buffer {
- u8 *data;
- int size;
- int pread;
- int pwrite;
+ u8 *data;
+ int size;
+ int pread;
+ int pwrite;
wait_queue_head_t queue;
- int error;
+ int error;
};
struct dmxdev_filter {
struct dvb_device *dvbdev;
- union {
- struct dmx_section_filter *sec;
+ union {
+ struct dmx_section_filter *sec;
} filter;
- union {
- struct dmx_ts_feed *ts;
- struct dmx_section_feed *sec;
+ union {
+ struct dmx_ts_feed *ts;
+ struct dmx_section_feed *sec;
} feed;
- union {
- struct dmx_sct_filter_params sec;
- struct dmx_pes_filter_params pes;
+ union {
+ struct dmx_sct_filter_params sec;
+ struct dmx_pes_filter_params pes;
} params;
- int type;
- enum dmxdev_state state;
- struct dmxdev *dev;
- struct dmxdev_buffer buffer;
+ int type;
+ enum dmxdev_state state;
+ struct dmxdev *dev;
+ struct dmxdev_buffer buffer;
struct semaphore mutex;
- /* only for sections */
- struct timer_list timer;
- int todo;
- u8 secheader[3];
+ /* only for sections */
+ struct timer_list timer;
+ int todo;
+ u8 secheader[3];
- u16 pid;
+ u16 pid;
};
struct dmxdev_dvr {
- int state;
- struct dmxdev *dev;
- struct dmxdev_buffer buffer;
+ int state;
+ struct dmxdev *dev;
+ struct dmxdev_buffer buffer;
};
@@ -105,16 +105,16 @@ struct dmxdev {
struct dvb_device *dvbdev;
struct dvb_device *dvr_dvbdev;
- struct dmxdev_filter *filter;
- struct dmxdev_dvr *dvr;
- struct dmx_demux *demux;
+ struct dmxdev_filter *filter;
+ struct dmxdev_dvr *dvr;
+ struct dmx_demux *demux;
- int filternum;
- int capabilities;
+ int filternum;
+ int capabilities;
#define DMXDEV_CAP_DUPLEX 1
- struct dmx_frontend *dvr_orig_fe;
+ struct dmx_frontend *dvr_orig_fe;
- struct dmxdev_buffer dvr_buffer;
+ struct dmxdev_buffer dvr_buffer;
#define DVR_BUFFER_SIZE (10*188*1024)
struct semaphore mutex;
diff --git a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c
index 2aa767f..5956c35 100644
--- a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c
+++ b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c
@@ -35,7 +35,7 @@
#include <linux/moduleparam.h>
#include <linux/vmalloc.h>
#include <linux/delay.h>
-#include <linux/rwsem.h>
+#include <linux/spinlock.h>
#include <linux/sched.h>
#include "dvb_ca_en50221.h"
@@ -111,9 +111,6 @@ struct dvb_ca_slot {
/* size of the buffer to use when talking to the CAM */
int link_buf_size;
- /* semaphore for syncing access to slot structure */
- struct rw_semaphore sem;
-
/* buffer for incoming packets */
struct dvb_ringbuffer rx_buffer;
@@ -501,7 +498,7 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
/* process the CFTABLE_ENTRY tuples, and any after those */
while ((!end_chain) && (address < 0x1000)) {
if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
- &tupleLength, tuple)) < 0)
+ &tupleLength, tuple)) < 0)
return status;
switch (tupleType) {
case 0x1B: // CISTPL_CFTABLE_ENTRY
@@ -602,14 +599,11 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
if (ebuf == NULL) {
int buf_free;
- down_read(&ca->slot_info[slot].sem);
if (ca->slot_info[slot].rx_buffer.data == NULL) {
- up_read(&ca->slot_info[slot].sem);
status = -EIO;
goto exit;
}
buf_free = dvb_ringbuffer_free(&ca->slot_info[slot].rx_buffer);
- up_read(&ca->slot_info[slot].sem);
if (buf_free < (ca->slot_info[slot].link_buf_size + DVB_RINGBUFFER_PKTHDRSIZE)) {
status = -EAGAIN;
@@ -680,14 +674,11 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
/* OK, add it to the receive buffer, or copy into external buffer if supplied */
if (ebuf == NULL) {
- down_read(&ca->slot_info[slot].sem);
if (ca->slot_info[slot].rx_buffer.data == NULL) {
- up_read(&ca->slot_info[slot].sem);
status = -EIO;
goto exit;
}
dvb_ringbuffer_pkt_write(&ca->slot_info[slot].rx_buffer, buf, bytes_read);
- up_read(&ca->slot_info[slot].sem);
} else {
memcpy(ebuf, buf, bytes_read);
}
@@ -802,12 +793,8 @@ static int dvb_ca_en50221_slot_shutdown(struct dvb_ca_private *ca, int slot)
{
dprintk("%s\n", __FUNCTION__);
- down_write(&ca->slot_info[slot].sem);
ca->pub->slot_shutdown(ca->pub, slot);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
- vfree(ca->slot_info[slot].rx_buffer.data);
- ca->slot_info[slot].rx_buffer.data = NULL;
- up_write(&ca->slot_info[slot].sem);
/* need to wake up all processes to check if they're now
trying to write to a defunct CAM */
@@ -893,7 +880,7 @@ void dvb_ca_en50221_frda_irq(struct dvb_ca_en50221 *pubca, int slot)
case DVB_CA_SLOTSTATE_RUNNING:
if (ca->open)
- dvb_ca_en50221_read_data(ca, slot, NULL, 0);
+ dvb_ca_en50221_thread_wakeup(ca);
break;
}
}
@@ -1127,16 +1114,16 @@ static int dvb_ca_en50221_thread(void *data)
break;
}
- rxbuf = vmalloc(RX_BUFFER_SIZE);
- if (rxbuf == NULL) {
- printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
- ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
- dvb_ca_en50221_thread_update_delay(ca);
- break;
+ if (ca->slot_info[slot].rx_buffer.data == NULL) {
+ rxbuf = vmalloc(RX_BUFFER_SIZE);
+ if (rxbuf == NULL) {
+ printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
+ ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
+ dvb_ca_en50221_thread_update_delay(ca);
+ break;
+ }
+ dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
}
- down_write(&ca->slot_info[slot].sem);
- dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
- up_write(&ca->slot_info[slot].sem);
ca->pub->slot_ts_enable(ca->pub, slot);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING;
@@ -1148,11 +1135,7 @@ static int dvb_ca_en50221_thread(void *data)
if (!ca->open)
continue;
- // no need to poll if the CAM supports IRQs
- if (ca->slot_info[slot].da_irq_supported)
- break;
-
- // poll mode
+ // poll slots for data
pktcount = 0;
while ((status = dvb_ca_en50221_read_data(ca, slot, NULL, 0)) > 0) {
if (!ca->open)
@@ -1367,12 +1350,13 @@ exit:
/**
* Condition for waking up in dvb_ca_en50221_io_read_condition
*/
-static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *result, int *_slot)
+static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca,
+ int *result, int *_slot)
{
int slot;
int slot_count = 0;
int idx;
- int fraglen;
+ size_t fraglen;
int connection_id = -1;
int found = 0;
u8 hdr[2];
@@ -1382,10 +1366,7 @@ static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *resu
if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
goto nextslot;
- down_read(&ca->slot_info[slot].sem);
-
if (ca->slot_info[slot].rx_buffer.data == NULL) {
- up_read(&ca->slot_info[slot].sem);
return 0;
}
@@ -1403,10 +1384,7 @@ static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *resu
idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
}
- if (!found)
- up_read(&ca->slot_info[slot].sem);
-
- nextslot:
+nextslot:
slot = (slot + 1) % ca->slot_count;
slot_count++;
}
@@ -1511,8 +1489,7 @@ static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
goto exit;
status = pktlen;
- exit:
- up_read(&ca->slot_info[slot].sem);
+exit:
return status;
}
@@ -1544,11 +1521,11 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
for (i = 0; i < ca->slot_count; i++) {
if (ca->slot_info[i].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
- down_write(&ca->slot_info[i].sem);
if (ca->slot_info[i].rx_buffer.data != NULL) {
+ /* it is safe to call this here without locks because
+ * ca->open == 0. Data is not read in this case */
dvb_ringbuffer_flush(&ca->slot_info[i].rx_buffer);
}
- up_write(&ca->slot_info[i].sem);
}
}
@@ -1607,7 +1584,6 @@ static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
dprintk("%s\n", __FUNCTION__);
if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
- up_read(&ca->slot_info[slot].sem);
mask |= POLLIN;
}
@@ -1619,7 +1595,6 @@ static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
poll_wait(file, &ca->wait_queue, wait);
if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
- up_read(&ca->slot_info[slot].sem);
mask |= POLLIN;
}
@@ -1709,7 +1684,6 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
atomic_set(&ca->slot_info[i].camchange_count, 0);
ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
- init_rwsem(&ca->slot_info[i].sem);
}
if (signal_pending(current)) {
@@ -1729,7 +1703,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
ca->thread_pid = ret;
return 0;
- error:
+error:
if (ca != NULL) {
if (ca->dvbdev != NULL)
dvb_unregister_device(ca->dvbdev);
@@ -1771,6 +1745,9 @@ void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
for (i = 0; i < ca->slot_count; i++) {
dvb_ca_en50221_slot_shutdown(ca, i);
+ if (ca->slot_info[i].rx_buffer.data != NULL) {
+ vfree(ca->slot_info[i].rx_buffer.data);
+ }
}
kfree(ca->slot_info);
dvb_unregister_device(ca->dvbdev);
diff --git a/drivers/media/dvb/dvb-core/dvb_filter.c b/drivers/media/dvb/dvb-core/dvb_filter.c
index bd51439..c49fd0b 100644
--- a/drivers/media/dvb/dvb-core/dvb_filter.c
+++ b/drivers/media/dvb/dvb-core/dvb_filter.c
@@ -72,12 +72,12 @@ static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, in
u8 pct;
if (pr) printk( "Pic header: ");
- pic->temporal_reference[field] = (( headr[0] << 2 ) |
+ pic->temporal_reference[field] = (( headr[0] << 2 ) |
(headr[1] & 0x03) )& 0x03ff;
if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
pct = ( headr[1] >> 2 ) & 0x07;
- pic->picture_coding_type[field] = pct;
+ pic->picture_coding_type[field] = pct;
if (pr) {
switch(pct){
case I_FRAME:
@@ -93,17 +93,17 @@ static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, in
}
- pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) |
+ pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) |
( (headr[3] & 0x1F) << 11) ) & 0xffff;
if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
- pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
+ pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
((headr[4] & 0x80) >> 3);
- if ( pct == B_FRAME ){
- pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
- }
+ if ( pct == B_FRAME ){
+ pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
+ }
if (pr) printk( " pic head param: 0x%x",
pic->picture_header_parameter);
@@ -124,18 +124,18 @@ static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
- if ( ( headr[3] & 0x40 ) != 0 ){
- pic->closed_gop = 1;
- } else {
- pic->closed_gop = 0;
- }
+ if ( ( headr[3] & 0x40 ) != 0 ){
+ pic->closed_gop = 1;
+ } else {
+ pic->closed_gop = 0;
+ }
if (pr) printk("closed: %d", pic->closed_gop);
- if ( ( headr[3] & 0x20 ) != 0 ){
- pic->broken_link = 1;
- } else {
- pic->broken_link = 0;
- }
+ if ( ( headr[3] & 0x20 ) != 0 ){
+ pic->broken_link = 1;
+ } else {
+ pic->broken_link = 0;
+ }
if (pr) printk(" broken: %d\n", pic->broken_link);
return 0;
@@ -146,7 +146,7 @@ static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
/* needs 8 byte input */
static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
{
- int sw;
+ int sw;
int form = -1;
if (pr) printk("Reading sequence header\n");
@@ -154,9 +154,9 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]);
- sw = (int)((headr[3]&0xF0) >> 4) ;
+ sw = (int)((headr[3]&0xF0) >> 4) ;
- switch( sw ){
+ switch( sw ){
case 1:
if (pr)
printk("Videostream: ASPECT: 1:1");
@@ -165,84 +165,84 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
case 2:
if (pr)
printk("Videostream: ASPECT: 4:3");
- vi->aspect_ratio = 133;
+ vi->aspect_ratio = 133;
break;
case 3:
if (pr)
printk("Videostream: ASPECT: 16:9");
- vi->aspect_ratio = 177;
+ vi->aspect_ratio = 177;
break;
case 4:
if (pr)
printk("Videostream: ASPECT: 2.21:1");
- vi->aspect_ratio = 221;
+ vi->aspect_ratio = 221;
break;
- case 5 ... 15:
+ case 5 ... 15:
if (pr)
printk("Videostream: ASPECT: reserved");
- vi->aspect_ratio = 0;
+ vi->aspect_ratio = 0;
break;
- default:
- vi->aspect_ratio = 0;
- return -1;
+ default:
+ vi->aspect_ratio = 0;
+ return -1;
}
if (pr)
printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size);
- sw = (int)(headr[3]&0x0F);
+ sw = (int)(headr[3]&0x0F);
- switch ( sw ) {
+ switch ( sw ) {
case 1:
if (pr)
printk(" FRate: 23.976 fps");
- vi->framerate = 23976;
+ vi->framerate = 23976;
form = -1;
break;
case 2:
if (pr)
printk(" FRate: 24 fps");
- vi->framerate = 24000;
+ vi->framerate = 24000;
form = -1;
break;
case 3:
if (pr)
printk(" FRate: 25 fps");
- vi->framerate = 25000;
+ vi->framerate = 25000;
form = VIDEO_MODE_PAL;
break;
case 4:
if (pr)
printk(" FRate: 29.97 fps");
- vi->framerate = 29970;
+ vi->framerate = 29970;
form = VIDEO_MODE_NTSC;
break;
case 5:
if (pr)
printk(" FRate: 30 fps");
- vi->framerate = 30000;
+ vi->framerate = 30000;
form = VIDEO_MODE_NTSC;
break;
case 6:
if (pr)
printk(" FRate: 50 fps");
- vi->framerate = 50000;
+ vi->framerate = 50000;
form = VIDEO_MODE_PAL;
break;
case 7:
if (pr)
printk(" FRate: 60 fps");
- vi->framerate = 60000;
+ vi->framerate = 60000;
form = VIDEO_MODE_NTSC;
break;
}
vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
- vi->vbv_buffer_size
- = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
+ vi->vbv_buffer_size
+ = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
if (pr){
printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
@@ -250,7 +250,7 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
printk("\n");
}
- vi->video_format = form;
+ vi->video_format = form;
return 0;
}
@@ -308,7 +308,7 @@ static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
if (!found) return -1;
if (c+3 >= count) return -1;
- headr = mbuf+c;
+ headr = mbuf+c;
ai->layer = (headr[1] & 0x06) >> 1;
@@ -368,7 +368,7 @@ int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int p
if (c+5 >= count) return -1;
ai->layer = 0; // 0 for AC3
- headr = mbuf+c+2;
+ headr = mbuf+c+2;
frame = (headr[2]&0x3f);
ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
@@ -396,159 +396,159 @@ EXPORT_SYMBOL(dvb_filter_get_ac3info);
#if 0
static u8 *skip_pes_header(u8 **bufp)
{
- u8 *inbuf = *bufp;
- u8 *buf = inbuf;
- u8 *pts = NULL;
- int skip = 0;
+ u8 *inbuf = *bufp;
+ u8 *buf = inbuf;
+ u8 *pts = NULL;
+ int skip = 0;
static const int mpeg1_skip_table[16] = {
1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
- if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
- if (buf[7] & PTS_ONLY)
- pts = buf+9;
- else pts = NULL;
- buf = inbuf + 9 + inbuf[8];
- } else { /* mpeg1 */
- for (buf = inbuf + 6; *buf == 0xff; buf++)
- if (buf == inbuf + 6 + 16) {
- break;
- }
- if ((*buf & 0xc0) == 0x40)
- buf += 2;
- skip = mpeg1_skip_table [*buf >> 4];
- if (skip == 5 || skip == 10) pts = buf;
- else pts = NULL;
-
- buf += mpeg1_skip_table [*buf >> 4];
- }
-
- *bufp = buf;
- return pts;
+ if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
+ if (buf[7] & PTS_ONLY)
+ pts = buf+9;
+ else pts = NULL;
+ buf = inbuf + 9 + inbuf[8];
+ } else { /* mpeg1 */
+ for (buf = inbuf + 6; *buf == 0xff; buf++)
+ if (buf == inbuf + 6 + 16) {
+ break;
+ }
+ if ((*buf & 0xc0) == 0x40)
+ buf += 2;
+ skip = mpeg1_skip_table [*buf >> 4];
+ if (skip == 5 || skip == 10) pts = buf;
+ else pts = NULL;
+
+ buf += mpeg1_skip_table [*buf >> 4];
+ }
+
+ *bufp = buf;
+ return pts;
}
#endif
#if 0
static void initialize_quant_matrix( u32 *matrix )
{
- int i;
-
- matrix[0] = 0x08101013;
- matrix[1] = 0x10131616;
- matrix[2] = 0x16161616;
- matrix[3] = 0x1a181a1b;
- matrix[4] = 0x1b1b1a1a;
- matrix[5] = 0x1a1a1b1b;
- matrix[6] = 0x1b1d1d1d;
- matrix[7] = 0x2222221d;
- matrix[8] = 0x1d1d1b1b;
- matrix[9] = 0x1d1d2020;
- matrix[10] = 0x22222526;
- matrix[11] = 0x25232322;
- matrix[12] = 0x23262628;
- matrix[13] = 0x28283030;
- matrix[14] = 0x2e2e3838;
- matrix[15] = 0x3a454553;
-
- for ( i = 16 ; i < 32 ; i++ )
- matrix[i] = 0x10101010;
+ int i;
+
+ matrix[0] = 0x08101013;
+ matrix[1] = 0x10131616;
+ matrix[2] = 0x16161616;
+ matrix[3] = 0x1a181a1b;
+ matrix[4] = 0x1b1b1a1a;
+ matrix[5] = 0x1a1a1b1b;
+ matrix[6] = 0x1b1d1d1d;
+ matrix[7] = 0x2222221d;
+ matrix[8] = 0x1d1d1b1b;
+ matrix[9] = 0x1d1d2020;
+ matrix[10] = 0x22222526;
+ matrix[11] = 0x25232322;
+ matrix[12] = 0x23262628;
+ matrix[13] = 0x28283030;
+ matrix[14] = 0x2e2e3838;
+ matrix[15] = 0x3a454553;
+
+ for ( i = 16 ; i < 32 ; i++ )
+ matrix[i] = 0x10101010;
}
#endif
#if 0
static void initialize_mpg_picture(struct mpg_picture *pic)
{
- int i;
-
- /* set MPEG1 */
- pic->mpeg1_flag = 1;
- pic->profile_and_level = 0x4A ; /* MP@LL */
- pic->progressive_sequence = 1;
- pic->low_delay = 0;
-
- pic->sequence_display_extension_flag = 0;
- for ( i = 0 ; i < 4 ; i++ ){
- pic->frame_centre_horizontal_offset[i] = 0;
- pic->frame_centre_vertical_offset[i] = 0;
- }
- pic->last_frame_centre_horizontal_offset = 0;
- pic->last_frame_centre_vertical_offset = 0;
-
- pic->picture_display_extension_flag[0] = 0;
- pic->picture_display_extension_flag[1] = 0;
- pic->sequence_header_flag = 0;
+ int i;
+
+ /* set MPEG1 */
+ pic->mpeg1_flag = 1;
+ pic->profile_and_level = 0x4A ; /* MP@LL */
+ pic->progressive_sequence = 1;
+ pic->low_delay = 0;
+
+ pic->sequence_display_extension_flag = 0;
+ for ( i = 0 ; i < 4 ; i++ ){
+ pic->frame_centre_horizontal_offset[i] = 0;
+ pic->frame_centre_vertical_offset[i] = 0;
+ }
+ pic->last_frame_centre_horizontal_offset = 0;
+ pic->last_frame_centre_vertical_offset = 0;
+
+ pic->picture_display_extension_flag[0] = 0;
+ pic->picture_display_extension_flag[1] = 0;
+ pic->sequence_header_flag = 0;
pic->gop_flag = 0;
- pic->sequence_end_flag = 0;
+ pic->sequence_end_flag = 0;
}
#endif
#if 0
static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
{
- int16_t last_h_offset;
- int16_t last_v_offset;
-
- int16_t *p_h_offset;
- int16_t *p_v_offset;
-
- if ( pic->mpeg1_flag ){
- pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
- pic->top_field_first = 0;
- pic->repeat_first_field = 0;
- pic->progressive_frame = 1;
- pic->picture_coding_parameter = 0x000010;
- }
-
- /* Reset flag */
- pic->picture_display_extension_flag[field_type] = 0;
-
- last_h_offset = pic->last_frame_centre_horizontal_offset;
- last_v_offset = pic->last_frame_centre_vertical_offset;
- if ( field_type == FIRST_FIELD ){
- p_h_offset = pic->frame_centre_horizontal_offset;
- p_v_offset = pic->frame_centre_vertical_offset;
- *p_h_offset = last_h_offset;
- *(p_h_offset + 1) = last_h_offset;
- *(p_h_offset + 2) = last_h_offset;
- *p_v_offset = last_v_offset;
- *(p_v_offset + 1) = last_v_offset;
- *(p_v_offset + 2) = last_v_offset;
- } else {
- pic->frame_centre_horizontal_offset[3] = last_h_offset;
- pic->frame_centre_vertical_offset[3] = last_v_offset;
- }
+ int16_t last_h_offset;
+ int16_t last_v_offset;
+
+ int16_t *p_h_offset;
+ int16_t *p_v_offset;
+
+ if ( pic->mpeg1_flag ){
+ pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
+ pic->top_field_first = 0;
+ pic->repeat_first_field = 0;
+ pic->progressive_frame = 1;
+ pic->picture_coding_parameter = 0x000010;
+ }
+
+ /* Reset flag */
+ pic->picture_display_extension_flag[field_type] = 0;
+
+ last_h_offset = pic->last_frame_centre_horizontal_offset;
+ last_v_offset = pic->last_frame_centre_vertical_offset;
+ if ( field_type == FIRST_FIELD ){
+ p_h_offset = pic->frame_centre_horizontal_offset;
+ p_v_offset = pic->frame_centre_vertical_offset;
+ *p_h_offset = last_h_offset;
+ *(p_h_offset + 1) = last_h_offset;
+ *(p_h_offset + 2) = last_h_offset;
+ *p_v_offset = last_v_offset;
+ *(p_v_offset + 1) = last_v_offset;
+ *(p_v_offset + 2) = last_v_offset;
+ } else {
+ pic->frame_centre_horizontal_offset[3] = last_h_offset;
+ pic->frame_centre_vertical_offset[3] = last_v_offset;
+ }
}
#endif
#if 0
static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
{
- pic->picture_header = 0;
- pic->sequence_header_data
- = ( INIT_HORIZONTAL_SIZE << 20 )
- | ( INIT_VERTICAL_SIZE << 8 )
- | ( INIT_ASPECT_RATIO << 4 )
- | ( INIT_FRAME_RATE );
- pic->mpeg1_flag = 0;
- pic->vinfo.horizontal_size
- = INIT_DISP_HORIZONTAL_SIZE;
- pic->vinfo.vertical_size
- = INIT_DISP_VERTICAL_SIZE;
- pic->picture_display_extension_flag[field_type]
- = 0;
- pic->pts_flag[field_type] = 0;
-
- pic->sequence_gop_header = 0;
- pic->picture_header = 0;
- pic->sequence_header_flag = 0;
- pic->gop_flag = 0;
- pic->sequence_end_flag = 0;
- pic->sequence_display_extension_flag = 0;
- pic->last_frame_centre_horizontal_offset = 0;
- pic->last_frame_centre_vertical_offset = 0;
+ pic->picture_header = 0;
+ pic->sequence_header_data
+ = ( INIT_HORIZONTAL_SIZE << 20 )
+ | ( INIT_VERTICAL_SIZE << 8 )
+ | ( INIT_ASPECT_RATIO << 4 )
+ | ( INIT_FRAME_RATE );
+ pic->mpeg1_flag = 0;
+ pic->vinfo.horizontal_size
+ = INIT_DISP_HORIZONTAL_SIZE;
+ pic->vinfo.vertical_size
+ = INIT_DISP_VERTICAL_SIZE;
+ pic->picture_display_extension_flag[field_type]
+ = 0;
+ pic->pts_flag[field_type] = 0;
+
+ pic->sequence_gop_header = 0;
+ pic->picture_header = 0;
+ pic->sequence_header_flag = 0;
+ pic->gop_flag = 0;
+ pic->sequence_end_flag = 0;
+ pic->sequence_display_extension_flag = 0;
+ pic->last_frame_centre_horizontal_offset = 0;
+ pic->last_frame_centre_vertical_offset = 0;
pic->channel = chan;
}
#endif
@@ -588,11 +588,11 @@ int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
buf[1]&=~0x40;
}
if (!len)
- return 0;
+ return 0;
buf[3]=0x30|((p2ts->cc++)&0x0f);
rest=183-len;
if (rest) {
- buf[5]=0x00;
+ buf[5]=0x00;
if (rest-1)
memset(buf+6, 0xff, rest-1);
}
diff --git a/drivers/media/dvb/dvb-core/dvb_filter.h b/drivers/media/dvb/dvb-core/dvb_filter.h
index b0848f7..375e3be 100644
--- a/drivers/media/dvb/dvb-core/dvb_filter.h
+++ b/drivers/media/dvb/dvb-core/dvb_filter.h
@@ -29,8 +29,8 @@ typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
struct dvb_filter_pes2ts {
unsigned char buf[188];
- unsigned char cc;
- dvb_filter_pes2ts_cb_t *cb;
+ unsigned char cc;
+ dvb_filter_pes2ts_cb_t *cb;
void *priv;
};
@@ -162,7 +162,7 @@ struct dvb_video_info {
u32 bit_rate;
u32 comp_bit_rate;
u32 vbv_buffer_size;
- s16 vbv_delay;
+ s16 vbv_delay;
u32 CSPF;
u32 off;
};
@@ -173,60 +173,60 @@ struct dvb_video_info {
#define VIDEO_FRAME_PICTURE 0x03
struct mpg_picture {
- int channel;
+ int channel;
struct dvb_video_info vinfo;
- u32 *sequence_gop_header;
- u32 *picture_header;
- s32 time_code;
- int low_delay;
- int closed_gop;
- int broken_link;
- int sequence_header_flag;
- int gop_flag;
- int sequence_end_flag;
-
- u8 profile_and_level;
- s32 picture_coding_parameter;
- u32 matrix[32];
- s8 matrix_change_flag;
-
- u8 picture_header_parameter;
+ u32 *sequence_gop_header;
+ u32 *picture_header;
+ s32 time_code;
+ int low_delay;
+ int closed_gop;
+ int broken_link;
+ int sequence_header_flag;
+ int gop_flag;
+ int sequence_end_flag;
+
+ u8 profile_and_level;
+ s32 picture_coding_parameter;
+ u32 matrix[32];
+ s8 matrix_change_flag;
+
+ u8 picture_header_parameter;
/* bit 0 - 2: bwd f code
bit 3 : fpb vector
bit 4 - 6: fwd f code
bit 7 : fpf vector */
- int mpeg1_flag;
- int progressive_sequence;
- int sequence_display_extension_flag;
- u32 sequence_header_data;
- s16 last_frame_centre_horizontal_offset;
- s16 last_frame_centre_vertical_offset;
-
- u32 pts[2]; /* [0] 1st field, [1] 2nd field */
- int top_field_first;
- int repeat_first_field;
- int progressive_frame;
- int bank;
- int forward_bank;
- int backward_bank;
- int compress;
- s16 frame_centre_horizontal_offset[OFF_SIZE];
- /* [0-2] 1st field, [3] 2nd field */
- s16 frame_centre_vertical_offset[OFF_SIZE];
- /* [0-2] 1st field, [3] 2nd field */
- s16 temporal_reference[2];
- /* [0] 1st field, [1] 2nd field */
-
- s8 picture_coding_type[2];
- /* [0] 1st field, [1] 2nd field */
- s8 picture_structure[2];
- /* [0] 1st field, [1] 2nd field */
- s8 picture_display_extension_flag[2];
- /* [0] 1st field, [1] 2nd field */
- /* picture_display_extenion() 0:no 1:exit*/
- s8 pts_flag[2];
- /* [0] 1st field, [1] 2nd field */
+ int mpeg1_flag;
+ int progressive_sequence;
+ int sequence_display_extension_flag;
+ u32 sequence_header_data;
+ s16 last_frame_centre_horizontal_offset;
+ s16 last_frame_centre_vertical_offset;
+
+ u32 pts[2]; /* [0] 1st field, [1] 2nd field */
+ int top_field_first;
+ int repeat_first_field;
+ int progressive_frame;
+ int bank;
+ int forward_bank;
+ int backward_bank;
+ int compress;
+ s16 frame_centre_horizontal_offset[OFF_SIZE];
+ /* [0-2] 1st field, [3] 2nd field */
+ s16 frame_centre_vertical_offset[OFF_SIZE];
+ /* [0-2] 1st field, [3] 2nd field */
+ s16 temporal_reference[2];
+ /* [0] 1st field, [1] 2nd field */
+
+ s8 picture_coding_type[2];
+ /* [0] 1st field, [1] 2nd field */
+ s8 picture_structure[2];
+ /* [0] 1st field, [1] 2nd field */
+ s8 picture_display_extension_flag[2];
+ /* [0] 1st field, [1] 2nd field */
+ /* picture_display_extenion() 0:no 1:exit*/
+ s8 pts_flag[2];
+ /* [0] 1st field, [1] 2nd field */
};
struct dvb_audio_info {
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index 6ffa6b2..95ea509 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -372,10 +372,10 @@ static int dvb_frontend_thread(void *data)
snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num);
- lock_kernel();
- daemonize(name);
- sigfillset(&current->blocked);
- unlock_kernel();
+ lock_kernel();
+ daemonize(name);
+ sigfillset(&current->blocked);
+ unlock_kernel();
fepriv->status = 0;
dvb_frontend_init(fe);
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
index 348c9b0..1e0840d 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -41,10 +41,10 @@
#include "dvbdev.h"
struct dvb_frontend_tune_settings {
- int min_delay_ms;
- int step_size;
- int max_drift;
- struct dvb_frontend_parameters parameters;
+ int min_delay_ms;
+ int step_size;
+ int max_drift;
+ struct dvb_frontend_parameters parameters;
};
struct dvb_frontend;
diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c
index 8793549..86bba81 100644
--- a/drivers/media/dvb/dvb-core/dvb_net.c
+++ b/drivers/media/dvb/dvb-core/dvb_net.c
@@ -151,6 +151,8 @@ struct dvb_net_priv {
unsigned char ule_bridged; /* Whether the ULE_BRIDGED extension header was found. */
int ule_sndu_remain; /* Nr. of bytes still required for current ULE SNDU. */
unsigned long ts_count; /* Current ts cell counter. */
+
+ struct semaphore mutex;
};
@@ -711,7 +713,7 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
if (buffer1_len > 32768)
printk(KERN_WARNING "length > 32k: %zu.\n", buffer1_len);
/* printk("TS callback: %u bytes, %u TS cells @ %p.\n",
- buffer1_len, buffer1_len / TS_SZ, buffer1); */
+ buffer1_len, buffer1_len / TS_SZ, buffer1); */
dvb_net_ule(dev, buffer1, buffer1_len);
return 0;
}
@@ -719,8 +721,8 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
{
- u8 *eth;
- struct sk_buff *skb;
+ u8 *eth;
+ struct sk_buff *skb;
struct net_device_stats *stats = &(((struct dvb_net_priv *) dev->priv)->stats);
int snap = 0;
@@ -752,7 +754,7 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
return;
}
snap = 8;
- }
+ }
if (pkt[7]) {
/* FIXME: assemble datagram from multiple sections */
stats->rx_errors++;
@@ -776,14 +778,14 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
/* create ethernet header: */
- eth[0]=pkt[0x0b];
- eth[1]=pkt[0x0a];
- eth[2]=pkt[0x09];
- eth[3]=pkt[0x08];
- eth[4]=pkt[0x04];
- eth[5]=pkt[0x03];
+ eth[0]=pkt[0x0b];
+ eth[1]=pkt[0x0a];
+ eth[2]=pkt[0x09];
+ eth[3]=pkt[0x08];
+ eth[4]=pkt[0x04];
+ eth[5]=pkt[0x03];
- eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
+ eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
if (snap) {
eth[12] = pkt[18];
@@ -805,7 +807,7 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
stats->rx_packets++;
stats->rx_bytes+=skb->len;
- netif_rx(skb);
+ netif_rx(skb);
}
static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
@@ -813,7 +815,7 @@ static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
struct dmx_section_filter *filter,
enum dmx_success success)
{
- struct net_device *dev = filter->priv;
+ struct net_device *dev = filter->priv;
/**
* we rely on the DVB API definition where exactly one complete
@@ -881,12 +883,13 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
static int dvb_net_feed_start(struct net_device *dev)
{
- int ret, i;
+ int ret = 0, i;
struct dvb_net_priv *priv = dev->priv;
- struct dmx_demux *demux = priv->demux;
- unsigned char *mac = (unsigned char *) dev->dev_addr;
+ struct dmx_demux *demux = priv->demux;
+ unsigned char *mac = (unsigned char *) dev->dev_addr;
dprintk("%s: rx_mode %i\n", __FUNCTION__, priv->rx_mode);
+ down(&priv->mutex);
if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
printk("%s: BUG %d\n", __FUNCTION__, __LINE__);
@@ -900,7 +903,7 @@ static int dvb_net_feed_start(struct net_device *dev)
dvb_net_sec_callback);
if (ret<0) {
printk("%s: could not allocate section feed\n", dev->name);
- return ret;
+ goto error;
}
ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 1);
@@ -909,7 +912,7 @@ static int dvb_net_feed_start(struct net_device *dev)
printk("%s: could not set section feed\n", dev->name);
priv->demux->release_section_feed(priv->demux, priv->secfeed);
priv->secfeed=NULL;
- return ret;
+ goto error;
}
if (priv->rx_mode != RX_MODE_PROMISC) {
@@ -948,7 +951,7 @@ static int dvb_net_feed_start(struct net_device *dev)
ret = demux->allocate_ts_feed(demux, &priv->tsfeed, dvb_net_ts_callback);
if (ret < 0) {
printk("%s: could not allocate ts feed\n", dev->name);
- return ret;
+ goto error;
}
/* Set netdevice pointer for ts decaps callback. */
@@ -962,23 +965,26 @@ static int dvb_net_feed_start(struct net_device *dev)
printk("%s: could not set ts feed\n", dev->name);
priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
priv->tsfeed = NULL;
- return ret;
+ goto error;
}
dprintk("%s: start filtering\n", __FUNCTION__);
priv->tsfeed->start_filtering(priv->tsfeed);
} else
- return -EINVAL;
+ ret = -EINVAL;
- return 0;
+error:
+ up(&priv->mutex);
+ return ret;
}
static int dvb_net_feed_stop(struct net_device *dev)
{
struct dvb_net_priv *priv = dev->priv;
- int i;
+ int i, ret = 0;
dprintk("%s\n", __FUNCTION__);
+ down(&priv->mutex);
if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
if (priv->secfeed) {
if (priv->secfeed->is_filtering) {
@@ -1019,8 +1025,9 @@ static int dvb_net_feed_stop(struct net_device *dev)
else
printk("%s: no ts feed to stop\n", dev->name);
} else
- return -EINVAL;
- return 0;
+ ret = -EINVAL;
+ up(&priv->mutex);
+ return ret;
}
@@ -1044,8 +1051,8 @@ static void wq_set_multicast_list (void *data)
struct dvb_net_priv *priv = dev->priv;
dvb_net_feed_stop(dev);
-
priv->rx_mode = RX_MODE_UNI;
+ spin_lock_bh(&dev->xmit_lock);
if (dev->flags & IFF_PROMISC) {
dprintk("%s: promiscuous mode\n", dev->name);
@@ -1070,6 +1077,7 @@ static void wq_set_multicast_list (void *data)
}
}
+ spin_unlock_bh(&dev->xmit_lock);
dvb_net_feed_start(dev);
}
@@ -1121,12 +1129,12 @@ static int dvb_net_stop(struct net_device *dev)
struct dvb_net_priv *priv = dev->priv;
priv->in_use--;
- return dvb_net_feed_stop(dev);
+ return dvb_net_feed_stop(dev);
}
static struct net_device_stats * dvb_net_get_stats(struct net_device *dev)
{
- return &((struct dvb_net_priv*) dev->priv)->stats;
+ return &((struct dvb_net_priv*) dev->priv)->stats;
}
static void dvb_net_setup(struct net_device *dev)
@@ -1200,6 +1208,7 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype)
INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
+ init_MUTEX(&priv->mutex);
net->base_addr = pid;
@@ -1351,10 +1360,10 @@ static struct file_operations dvb_net_fops = {
};
static struct dvb_device dvbdev_net = {
- .priv = NULL,
- .users = 1,
- .writers = 1,
- .fops = &dvb_net_fops,
+ .priv = NULL,
+ .users = 1,
+ .writers = 1,
+ .fops = &dvb_net_fops,
};
diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
index fb6d94a..283c6e9 100644
--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
@@ -42,216 +42,216 @@
void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
{
- rbuf->pread=rbuf->pwrite=0;
- rbuf->data=data;
- rbuf->size=len;
+ rbuf->pread=rbuf->pwrite=0;
+ rbuf->data=data;
+ rbuf->size=len;
- init_waitqueue_head(&rbuf->queue);
+ init_waitqueue_head(&rbuf->queue);
- spin_lock_init(&(rbuf->lock));
+ spin_lock_init(&(rbuf->lock));
}
int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)
{
- return (rbuf->pread==rbuf->pwrite);
+ return (rbuf->pread==rbuf->pwrite);
}
ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)
{
- ssize_t free;
+ ssize_t free;
- free = rbuf->pread - rbuf->pwrite;
- if (free <= 0)
- free += rbuf->size;
- return free-1;
+ free = rbuf->pread - rbuf->pwrite;
+ if (free <= 0)
+ free += rbuf->size;
+ return free-1;
}
ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
{
- ssize_t avail;
+ ssize_t avail;
- avail = rbuf->pwrite - rbuf->pread;
- if (avail < 0)
- avail += rbuf->size;
- return avail;
+ avail = rbuf->pwrite - rbuf->pread;
+ if (avail < 0)
+ avail += rbuf->size;
+ return avail;
}
void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
{
- rbuf->pread = rbuf->pwrite;
+ rbuf->pread = rbuf->pwrite;
}
void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
{
- unsigned long flags;
+ unsigned long flags;
- spin_lock_irqsave(&rbuf->lock, flags);
- dvb_ringbuffer_flush(rbuf);
- spin_unlock_irqrestore(&rbuf->lock, flags);
+ spin_lock_irqsave(&rbuf->lock, flags);
+ dvb_ringbuffer_flush(rbuf);
+ spin_unlock_irqrestore(&rbuf->lock, flags);
- wake_up(&rbuf->queue);
+ wake_up(&rbuf->queue);
}
ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len, int usermem)
{
- size_t todo = len;
- size_t split;
-
- split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
- if (split > 0) {
- if (!usermem)
- memcpy(buf, rbuf->data+rbuf->pread, split);
- else
- if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
- return -EFAULT;
- buf += split;
- todo -= split;
- rbuf->pread = 0;
- }
- if (!usermem)
- memcpy(buf, rbuf->data+rbuf->pread, todo);
- else
- if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
- return -EFAULT;
-
- rbuf->pread = (rbuf->pread + todo) % rbuf->size;
-
- return len;
+ size_t todo = len;
+ size_t split;
+
+ split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
+ if (split > 0) {
+ if (!usermem)
+ memcpy(buf, rbuf->data+rbuf->pread, split);
+ else
+ if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
+ return -EFAULT;
+ buf += split;
+ todo -= split;
+ rbuf->pread = 0;
+ }
+ if (!usermem)
+ memcpy(buf, rbuf->data+rbuf->pread, todo);
+ else
+ if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
+ return -EFAULT;
+
+ rbuf->pread = (rbuf->pread + todo) % rbuf->size;
+
+ return len;
}
ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t len)
{
- size_t todo = len;
- size_t split;
+ size_t todo = len;
+ size_t split;
- split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
+ split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
- if (split > 0) {
- memcpy(rbuf->data+rbuf->pwrite, buf, split);
- buf += split;
- todo -= split;
- rbuf->pwrite = 0;
- }
- memcpy(rbuf->data+rbuf->pwrite, buf, todo);
- rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
+ if (split > 0) {
+ memcpy(rbuf->data+rbuf->pwrite, buf, split);
+ buf += split;
+ todo -= split;
+ rbuf->pwrite = 0;
+ }
+ memcpy(rbuf->data+rbuf->pwrite, buf, todo);
+ rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
- return len;
+ return len;
}
ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf, size_t len)
{
- int status;
- ssize_t oldpwrite = rbuf->pwrite;
+ int status;
+ ssize_t oldpwrite = rbuf->pwrite;
- DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
- DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
- DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY);
- status = dvb_ringbuffer_write(rbuf, buf, len);
+ DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
+ DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
+ DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY);
+ status = dvb_ringbuffer_write(rbuf, buf, len);
- if (status < 0) rbuf->pwrite = oldpwrite;
- return status;
+ if (status < 0) rbuf->pwrite = oldpwrite;
+ return status;
}
ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
- int offset, u8* buf, size_t len, int usermem)
+ int offset, u8* buf, size_t len, int usermem)
{
- size_t todo;
- size_t split;
- size_t pktlen;
-
- pktlen = rbuf->data[idx] << 8;
- pktlen |= rbuf->data[(idx + 1) % rbuf->size];
- if (offset > pktlen) return -EINVAL;
- if ((offset + len) > pktlen) len = pktlen - offset;
-
- idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
- todo = len;
- split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
- if (split > 0) {
- if (!usermem)
- memcpy(buf, rbuf->data+idx, split);
- else
- if (copy_to_user(buf, rbuf->data+idx, split))
- return -EFAULT;
- buf += split;
- todo -= split;
- idx = 0;
- }
- if (!usermem)
- memcpy(buf, rbuf->data+idx, todo);
- else
- if (copy_to_user(buf, rbuf->data+idx, todo))
- return -EFAULT;
-
- return len;
+ size_t todo;
+ size_t split;
+ size_t pktlen;
+
+ pktlen = rbuf->data[idx] << 8;
+ pktlen |= rbuf->data[(idx + 1) % rbuf->size];
+ if (offset > pktlen) return -EINVAL;
+ if ((offset + len) > pktlen) len = pktlen - offset;
+
+ idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
+ todo = len;
+ split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
+ if (split > 0) {
+ if (!usermem)
+ memcpy(buf, rbuf->data+idx, split);
+ else
+ if (copy_to_user(buf, rbuf->data+idx, split))
+ return -EFAULT;
+ buf += split;
+ todo -= split;
+ idx = 0;
+ }
+ if (!usermem)
+ memcpy(buf, rbuf->data+idx, todo);
+ else
+ if (copy_to_user(buf, rbuf->data+idx, todo))
+ return -EFAULT;
+
+ return len;
}
void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)
{
- size_t pktlen;
-
- rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED;
-
- // clean up disposed packets
- while(dvb_ringbuffer_avail(rbuf) > DVB_RINGBUFFER_PKTHDRSIZE) {
- if (DVB_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) {
- pktlen = DVB_RINGBUFFER_PEEK(rbuf, 0) << 8;
- pktlen |= DVB_RINGBUFFER_PEEK(rbuf, 1);
- DVB_RINGBUFFER_SKIP(rbuf, pktlen + DVB_RINGBUFFER_PKTHDRSIZE);
- } else {
- // first packet is not disposed, so we stop cleaning now
- break;
- }
- }
+ size_t pktlen;
+
+ rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED;
+
+ // clean up disposed packets
+ while(dvb_ringbuffer_avail(rbuf) > DVB_RINGBUFFER_PKTHDRSIZE) {
+ if (DVB_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) {
+ pktlen = DVB_RINGBUFFER_PEEK(rbuf, 0) << 8;
+ pktlen |= DVB_RINGBUFFER_PEEK(rbuf, 1);
+ DVB_RINGBUFFER_SKIP(rbuf, pktlen + DVB_RINGBUFFER_PKTHDRSIZE);
+ } else {
+ // first packet is not disposed, so we stop cleaning now
+ break;
+ }
+ }
}
ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t* pktlen)
{
- int consumed;
- int curpktlen;
- int curpktstatus;
+ int consumed;
+ int curpktlen;
+ int curpktstatus;
- if (idx == -1) {
+ if (idx == -1) {
idx = rbuf->pread;
} else {
- curpktlen = rbuf->data[idx] << 8;
- curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
- idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
+ curpktlen = rbuf->data[idx] << 8;
+ curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
+ idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
}
- consumed = (idx - rbuf->pread) % rbuf->size;
+ consumed = (idx - rbuf->pread) % rbuf->size;
- while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
+ while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
- curpktlen = rbuf->data[idx] << 8;
- curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
- curpktstatus = rbuf->data[(idx + 2) % rbuf->size];
+ curpktlen = rbuf->data[idx] << 8;
+ curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
+ curpktstatus = rbuf->data[(idx + 2) % rbuf->size];
- if (curpktstatus == PKT_READY) {
- *pktlen = curpktlen;
- return idx;
- }
+ if (curpktstatus == PKT_READY) {
+ *pktlen = curpktlen;
+ return idx;
+ }
- consumed += curpktlen + DVB_RINGBUFFER_PKTHDRSIZE;
- idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
- }
+ consumed += curpktlen + DVB_RINGBUFFER_PKTHDRSIZE;
+ idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
+ }
- // no packets available
- return -1;
+ // no packets available
+ return -1;
}
diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
index d18e9c4..fa476f6 100644
--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
@@ -31,13 +31,13 @@
#include <linux/wait.h>
struct dvb_ringbuffer {
- u8 *data;
- ssize_t size;
- ssize_t pread;
- ssize_t pwrite;
+ u8 *data;
+ ssize_t size;
+ ssize_t pread;
+ ssize_t pwrite;
- wait_queue_head_t queue;
- spinlock_t lock;
+ wait_queue_head_t queue;
+ spinlock_t lock;
};
#define DVB_RINGBUFFER_PKTHDRSIZE 3
@@ -106,7 +106,7 @@ extern void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf);
** returns number of bytes transferred or -EFAULT
*/
extern ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf,
- size_t len, int usermem);
+ size_t len, int usermem);
/* write routines & macros */
@@ -121,7 +121,7 @@ extern ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf,
** returns number of bytes transferred or -EFAULT
*/
extern ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf,
- size_t len);
+ size_t len);
/**
@@ -133,7 +133,7 @@ extern ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf,
* returns Number of bytes written, or -EFAULT, -ENOMEM, -EVINAL.
*/
extern ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf,
- size_t len);
+ size_t len);
/**
* Read from a packet in the ringbuffer. Note: unlike dvb_ringbuffer_read(), this
@@ -149,7 +149,7 @@ extern ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf,
* returns Number of bytes read, or -EFAULT.
*/
extern ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
- int offset, u8* buf, size_t len, int usermem);
+ int offset, u8* buf, size_t len, int usermem);
/**
* Dispose of a packet in the ring buffer.
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c
index 477b4fa..a4aee86 100644
--- a/drivers/media/dvb/dvb-core/dvbdev.c
+++ b/drivers/media/dvb/dvb-core/dvbdev.c
@@ -47,7 +47,7 @@ static LIST_HEAD(dvb_adapter_list);
static DECLARE_MUTEX(dvbdev_register_lock);
static const char * const dnames[] = {
- "video", "audio", "sec", "frontend", "demux", "dvr", "ca",
+ "video", "audio", "sec", "frontend", "demux", "dvr", "ca",
"net", "osd"
};
@@ -90,15 +90,15 @@ static int dvb_device_open(struct inode *inode, struct file *file)
file->private_data = dvbdev;
old_fops = file->f_op;
- file->f_op = fops_get(dvbdev->fops);
- if(file->f_op->open)
- err = file->f_op->open(inode,file);
- if (err) {
- fops_put(file->f_op);
- file->f_op = fops_get(old_fops);
- }
- fops_put(old_fops);
- return err;
+ file->f_op = fops_get(dvbdev->fops);
+ if(file->f_op->open)
+ err = file->f_op->open(inode,file);
+ if (err) {
+ fops_put(file->f_op);
+ file->f_op = fops_get(old_fops);
+ }
+ fops_put(old_fops);
+ return err;
}
return -ENODEV;
}
@@ -117,21 +117,21 @@ static struct cdev dvb_device_cdev = {
int dvb_generic_open(struct inode *inode, struct file *file)
{
- struct dvb_device *dvbdev = file->private_data;
+ struct dvb_device *dvbdev = file->private_data;
- if (!dvbdev)
- return -ENODEV;
+ if (!dvbdev)
+ return -ENODEV;
if (!dvbdev->users)
- return -EBUSY;
+ return -EBUSY;
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
- if (!dvbdev->readers)
- return -EBUSY;
+ if (!dvbdev->readers)
+ return -EBUSY;
dvbdev->readers--;
} else {
- if (!dvbdev->writers)
- return -EBUSY;
+ if (!dvbdev->writers)
+ return -EBUSY;
dvbdev->writers--;
}
@@ -143,10 +143,10 @@ EXPORT_SYMBOL(dvb_generic_open);
int dvb_generic_release(struct inode *inode, struct file *file)
{
- struct dvb_device *dvbdev = file->private_data;
+ struct dvb_device *dvbdev = file->private_data;
if (!dvbdev)
- return -ENODEV;
+ return -ENODEV;
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
dvbdev->readers++;
@@ -163,10 +163,10 @@ EXPORT_SYMBOL(dvb_generic_release);
int dvb_generic_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
- struct dvb_device *dvbdev = file->private_data;
+ struct dvb_device *dvbdev = file->private_data;
- if (!dvbdev)
- return -ENODEV;
+ if (!dvbdev)
+ return -ENODEV;
if (!dvbdev->kernel_ioctl)
return -EINVAL;
@@ -334,63 +334,63 @@ EXPORT_SYMBOL(dvb_unregister_adapter);
to the v4l "videodev.o" module, which is unnecessary for some
cards (ie. the budget dvb-cards don't need the v4l module...) */
int dvb_usercopy(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg,
+ unsigned int cmd, unsigned long arg,
int (*func)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg))
{
- char sbuf[128];
- void *mbuf = NULL;
- void *parg = NULL;
- int err = -EINVAL;
-
- /* Copy arguments into temp kernel buffer */
- switch (_IOC_DIR(cmd)) {
- case _IOC_NONE:
+ char sbuf[128];
+ void *mbuf = NULL;
+ void *parg = NULL;
+ int err = -EINVAL;
+
+ /* Copy arguments into temp kernel buffer */
+ switch (_IOC_DIR(cmd)) {
+ case _IOC_NONE:
/*
* For this command, the pointer is actually an integer
* argument.
*/
parg = (void *) arg;
break;
- case _IOC_READ: /* some v4l ioctls are marked wrong ... */
- case _IOC_WRITE:
- case (_IOC_WRITE | _IOC_READ):
- if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
- parg = sbuf;
- } else {
- /* too big to allocate from stack */
- mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
- if (NULL == mbuf)
- return -ENOMEM;
- parg = mbuf;
- }
-
- err = -EFAULT;
- if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
- goto out;
- break;
- }
-
- /* call driver */
- if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
- err = -EINVAL;
-
- if (err < 0)
- goto out;
-
- /* Copy results into user buffer */
- switch (_IOC_DIR(cmd))
- {
- case _IOC_READ:
- case (_IOC_WRITE | _IOC_READ):
- if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
- err = -EFAULT;
- break;
- }
+ case _IOC_READ: /* some v4l ioctls are marked wrong ... */
+ case _IOC_WRITE:
+ case (_IOC_WRITE | _IOC_READ):
+ if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
+ parg = sbuf;
+ } else {
+ /* too big to allocate from stack */
+ mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
+ if (NULL == mbuf)
+ return -ENOMEM;
+ parg = mbuf;
+ }
+
+ err = -EFAULT;
+ if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
+ goto out;
+ break;
+ }
+
+ /* call driver */
+ if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
+ err = -EINVAL;
+
+ if (err < 0)
+ goto out;
+
+ /* Copy results into user buffer */
+ switch (_IOC_DIR(cmd))
+ {
+ case _IOC_READ:
+ case (_IOC_WRITE | _IOC_READ):
+ if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
+ err = -EFAULT;
+ break;
+ }
out:
- kfree(mbuf);
- return err;
+ kfree(mbuf);
+ return err;
}
static int __init init_dvbdev(void)
@@ -427,10 +427,10 @@ error:
static void __exit exit_dvbdev(void)
{
- devfs_remove("dvb");
+ devfs_remove("dvb");
class_destroy(dvb_class);
cdev_del(&dvb_device_cdev);
- unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
+ unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
}
module_init(init_dvbdev);
diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h
index a251867..0cc6e4a 100644
--- a/drivers/media/dvb/dvb-core/dvbdev.h
+++ b/drivers/media/dvb/dvb-core/dvbdev.h
@@ -68,8 +68,8 @@ struct dvb_device {
int writers;
int users;
- /* don't really need those !? -- FIXME: use video_usercopy */
- int (*kernel_ioctl)(struct inode *inode, struct file *file,
+ /* don't really need those !? -- FIXME: use video_usercopy */
+ int (*kernel_ioctl)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg);
void *priv;
@@ -97,7 +97,7 @@ we simply define out own dvb_usercopy(), which will hopefully become
generic_usercopy() someday... */
extern int dvb_usercopy(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg,
+ unsigned int cmd, unsigned long arg,
int (*func)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg));
diff --git a/drivers/media/dvb/dvb-usb/a800.c b/drivers/media/dvb/dvb-usb/a800.c
index 49f541d..8c7beff 100644
--- a/drivers/media/dvb/dvb-usb/a800.c
+++ b/drivers/media/dvb/dvb-usb/a800.c
@@ -65,7 +65,7 @@ static struct dvb_usb_rc_key a800_rc_keys[] = {
};
-int a800_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
+static int a800_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
{
u8 key[5];
if (usb_control_msg(d->udev,usb_rcvctrlpipe(d->udev,0),
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
index 00b9464..269d899 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -21,9 +21,9 @@ MODULE_LICENSE("GPL");
int dibusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
{
if (d->priv != NULL) {
- struct dib_fe_xfer_ops *ops = d->priv;
- if (ops->fifo_ctrl != NULL)
- if (ops->fifo_ctrl(d->fe,onoff)) {
+ struct dibusb_state *st = d->priv;
+ if (st->ops.fifo_ctrl != NULL)
+ if (st->ops.fifo_ctrl(d->fe,onoff)) {
err("error while controlling the fifo of the demod.");
return -ENODEV;
}
@@ -35,9 +35,9 @@ EXPORT_SYMBOL(dibusb_streaming_ctrl);
int dibusb_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff)
{
if (d->priv != NULL) {
- struct dib_fe_xfer_ops *ops = d->priv;
- if (d->pid_filtering && ops->pid_ctrl != NULL)
- ops->pid_ctrl(d->fe,index,pid,onoff);
+ struct dibusb_state *st = d->priv;
+ if (st->ops.pid_ctrl != NULL)
+ st->ops.pid_ctrl(d->fe,index,pid,onoff);
}
return 0;
}
@@ -46,9 +46,9 @@ EXPORT_SYMBOL(dibusb_pid_filter);
int dibusb_pid_filter_ctrl(struct dvb_usb_device *d, int onoff)
{
if (d->priv != NULL) {
- struct dib_fe_xfer_ops *ops = d->priv;
- if (ops->pid_parse != NULL)
- if (ops->pid_parse(d->fe,onoff) < 0)
+ struct dibusb_state *st = d->priv;
+ if (st->ops.pid_parse != NULL)
+ if (st->ops.pid_parse(d->fe,onoff) < 0)
err("could not handle pid_parser");
}
return 0;
diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
index 74545f8..f98e306 100644
--- a/drivers/media/dvb/dvb-usb/digitv.c
+++ b/drivers/media/dvb/dvb-usb/digitv.c
@@ -148,7 +148,7 @@ static struct dvb_usb_rc_key digitv_rc_keys[] = {
};
/* TODO is it really the NEC protocol ? */
-int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
+static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
{
u8 key[5];
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-init.c b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
index a902059..dd8e0b9 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
@@ -23,7 +23,7 @@ module_param_named(disable_rc_polling, dvb_usb_disable_rc_polling, int, 0644);
MODULE_PARM_DESC(disable_rc_polling, "disable remote control polling (default: 0).");
/* general initialization functions */
-int dvb_usb_exit(struct dvb_usb_device *d)
+static int dvb_usb_exit(struct dvb_usb_device *d)
{
deb_info("state before exiting everything: %x\n",d->state);
dvb_usb_remote_exit(d);
diff --git a/drivers/media/dvb/dvb-usb/vp702x-fe.c b/drivers/media/dvb/dvb-usb/vp702x-fe.c
index f20d8db..104b5d0 100644
--- a/drivers/media/dvb/dvb-usb/vp702x-fe.c
+++ b/drivers/media/dvb/dvb-usb/vp702x-fe.c
@@ -190,7 +190,7 @@ static int vp702x_fe_get_frontend(struct dvb_frontend* fe,
}
static int vp702x_fe_send_diseqc_msg (struct dvb_frontend* fe,
- struct dvb_diseqc_master_cmd *m)
+ struct dvb_diseqc_master_cmd *m)
{
struct vp702x_fe_state *st = fe->demodulator_priv;
u8 cmd[8],ibuf[10];
diff --git a/drivers/media/dvb/dvb-usb/vp7045-fe.c b/drivers/media/dvb/dvb-usb/vp7045-fe.c
index 2746edf..83f1de1 100644
--- a/drivers/media/dvb/dvb-usb/vp7045-fe.c
+++ b/drivers/media/dvb/dvb-usb/vp7045-fe.c
@@ -58,7 +58,7 @@ static int vp7045_fe_read_ber(struct dvb_frontend* fe, u32 *ber)
struct vp7045_fe_state *state = fe->demodulator_priv;
*ber = (vp7045_read_reg(state->d, 0x0D) << 16) |
(vp7045_read_reg(state->d, 0x0E) << 8) |
- vp7045_read_reg(state->d, 0x0F);
+ vp7045_read_reg(state->d, 0x0F);
return 0;
}
diff --git a/drivers/media/dvb/frontends/at76c651.c b/drivers/media/dvb/frontends/at76c651.c
index 72a2b54..8e0f4b3 100644
--- a/drivers/media/dvb/frontends/at76c651.c
+++ b/drivers/media/dvb/frontends/at76c651.c
@@ -361,9 +361,9 @@ static int at76c651_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
static int at76c651_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *fesettings)
{
- fesettings->min_delay_ms = 50;
- fesettings->step_size = 0;
- fesettings->max_drift = 0;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
return 0;
}
diff --git a/drivers/media/dvb/frontends/bcm3510.c b/drivers/media/dvb/frontends/bcm3510.c
index f6d4ee7..8ceb9a3 100644
--- a/drivers/media/dvb/frontends/bcm3510.c
+++ b/drivers/media/dvb/frontends/bcm3510.c
@@ -69,7 +69,7 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,2=i2c (|-able)).");
#define dbufout(b,l,m) {\
int i; \
for (i = 0; i < l; i++) \
- m("%02x ",b[i]); \
+ m("%02x ",b[i]); \
}
#define deb_info(args...) dprintk(0x01,args)
#define deb_i2c(args...) dprintk(0x02,args)
@@ -827,7 +827,7 @@ static struct dvb_frontend_ops bcm3510_ops = {
.type = FE_ATSC,
.frequency_min = 54000000,
.frequency_max = 803000000,
- /* stepsize is just a guess */
+ /* stepsize is just a guess */
.frequency_stepsize = 0,
.caps =
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
diff --git a/drivers/media/dvb/frontends/cx22700.c b/drivers/media/dvb/frontends/cx22700.c
index 0c2ed44..755f774 100644
--- a/drivers/media/dvb/frontends/cx22700.c
+++ b/drivers/media/dvb/frontends/cx22700.c
@@ -355,10 +355,10 @@ static int cx22700_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
static int cx22700_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
{
- fesettings->min_delay_ms = 150;
- fesettings->step_size = 166667;
- fesettings->max_drift = 166667*2;
- return 0;
+ fesettings->min_delay_ms = 150;
+ fesettings->step_size = 166667;
+ fesettings->max_drift = 166667*2;
+ return 0;
}
static void cx22700_release(struct dvb_frontend* fe)
@@ -407,7 +407,7 @@ static struct dvb_frontend_ops cx22700_ops = {
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
- FE_CAN_RECOVER
+ FE_CAN_RECOVER
},
.release = cx22700_release,
diff --git a/drivers/media/dvb/frontends/cx22702.c b/drivers/media/dvb/frontends/cx22702.c
index 9f63929..5de0e6d3 100644
--- a/drivers/media/dvb/frontends/cx22702.c
+++ b/drivers/media/dvb/frontends/cx22702.c
@@ -2,12 +2,12 @@
Conexant 22702 DVB OFDM demodulator driver
based on:
- Alps TDMB7 DVB OFDM demodulator driver
+ Alps TDMB7 DVB OFDM demodulator driver
Copyright (C) 2001-2002 Convergence Integrated Media GmbH
Holger Waechtler <holger@convergence.de>
- Copyright (C) 2004 Steven Toth <steve@toth.demon.co.uk>
+ Copyright (C) 2004 Steven Toth <stoth@hauppauge.com>
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
diff --git a/drivers/media/dvb/frontends/cx22702.h b/drivers/media/dvb/frontends/cx22702.h
index 11f8680..5633976 100644
--- a/drivers/media/dvb/frontends/cx22702.h
+++ b/drivers/media/dvb/frontends/cx22702.h
@@ -2,12 +2,12 @@
Conexant 22702 DVB OFDM demodulator driver
based on:
- Alps TDMB7 DVB OFDM demodulator driver
+ Alps TDMB7 DVB OFDM demodulator driver
Copyright (C) 2001-2002 Convergence Integrated Media GmbH
Holger Waechtler <holger@convergence.de>
- Copyright (C) 2004 Steven Toth <steve@toth.demon.co.uk>
+ Copyright (C) 2004 Steven Toth <stoth@hauppauge.com>
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
diff --git a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c
index 654d7dc..0c4db80 100644
--- a/drivers/media/dvb/frontends/cx24110.c
+++ b/drivers/media/dvb/frontends/cx24110.c
@@ -55,81 +55,81 @@ static int debug;
} while (0)
static struct {u8 reg; u8 data;} cx24110_regdata[]=
- /* Comments beginning with @ denote this value should
- be the default */
- {{0x09,0x01}, /* SoftResetAll */
- {0x09,0x00}, /* release reset */
- {0x01,0xe8}, /* MSB of code rate 27.5MS/s */
- {0x02,0x17}, /* middle byte " */
- {0x03,0x29}, /* LSB " */
- {0x05,0x03}, /* @ DVB mode, standard code rate 3/4 */
- {0x06,0xa5}, /* @ PLL 60MHz */
- {0x07,0x01}, /* @ Fclk, i.e. sampling clock, 60MHz */
- {0x0a,0x00}, /* @ partial chip disables, do not set */
- {0x0b,0x01}, /* set output clock in gapped mode, start signal low
- active for first byte */
- {0x0c,0x11}, /* no parity bytes, large hold time, serial data out */
- {0x0d,0x6f}, /* @ RS Sync/Unsync thresholds */
- {0x10,0x40}, /* chip doc is misleading here: write bit 6 as 1
- to avoid starting the BER counter. Reset the
- CRC test bit. Finite counting selected */
- {0x15,0xff}, /* @ size of the limited time window for RS BER
- estimation. It is <value>*256 RS blocks, this
- gives approx. 2.6 sec at 27.5MS/s, rate 3/4 */
- {0x16,0x00}, /* @ enable all RS output ports */
- {0x17,0x04}, /* @ time window allowed for the RS to sync */
- {0x18,0xae}, /* @ allow all standard DVB code rates to be scanned
- for automatically */
- /* leave the current code rate and normalization
- registers as they are after reset... */
- {0x21,0x10}, /* @ during AutoAcq, search each viterbi setting
- only once */
- {0x23,0x18}, /* @ size of the limited time window for Viterbi BER
- estimation. It is <value>*65536 channel bits, i.e.
- approx. 38ms at 27.5MS/s, rate 3/4 */
- {0x24,0x24}, /* do not trigger Viterbi CRC test. Finite count window */
- /* leave front-end AGC parameters at default values */
- /* leave decimation AGC parameters at default values */
- {0x35,0x40}, /* disable all interrupts. They are not connected anyway */
- {0x36,0xff}, /* clear all interrupt pending flags */
- {0x37,0x00}, /* @ fully enable AutoAcqq state machine */
- {0x38,0x07}, /* @ enable fade recovery, but not autostart AutoAcq */
- /* leave the equalizer parameters on their default values */
- /* leave the final AGC parameters on their default values */
- {0x41,0x00}, /* @ MSB of front-end derotator frequency */
- {0x42,0x00}, /* @ middle bytes " */
- {0x43,0x00}, /* @ LSB " */
- /* leave the carrier tracking loop parameters on default */
- /* leave the bit timing loop parameters at gefault */
- {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */
- /* the cx24108 data sheet for symbol rates above 15MS/s */
- {0x57,0x00}, /* @ Filter sigma delta enabled, positive */
- {0x61,0x95}, /* GPIO pins 1-4 have special function */
- {0x62,0x05}, /* GPIO pin 5 has special function, pin 6 is GPIO */
- {0x63,0x00}, /* All GPIO pins use CMOS output characteristics */
- {0x64,0x20}, /* GPIO 6 is input, all others are outputs */
- {0x6d,0x30}, /* tuner auto mode clock freq 62kHz */
- {0x70,0x15}, /* use auto mode, tuner word is 21 bits long */
- {0x73,0x00}, /* @ disable several demod bypasses */
- {0x74,0x00}, /* @ " */
- {0x75,0x00} /* @ " */
- /* the remaining registers are for SEC */
+ /* Comments beginning with @ denote this value should
+ be the default */
+ {{0x09,0x01}, /* SoftResetAll */
+ {0x09,0x00}, /* release reset */
+ {0x01,0xe8}, /* MSB of code rate 27.5MS/s */
+ {0x02,0x17}, /* middle byte " */
+ {0x03,0x29}, /* LSB " */
+ {0x05,0x03}, /* @ DVB mode, standard code rate 3/4 */
+ {0x06,0xa5}, /* @ PLL 60MHz */
+ {0x07,0x01}, /* @ Fclk, i.e. sampling clock, 60MHz */
+ {0x0a,0x00}, /* @ partial chip disables, do not set */
+ {0x0b,0x01}, /* set output clock in gapped mode, start signal low
+ active for first byte */
+ {0x0c,0x11}, /* no parity bytes, large hold time, serial data out */
+ {0x0d,0x6f}, /* @ RS Sync/Unsync thresholds */
+ {0x10,0x40}, /* chip doc is misleading here: write bit 6 as 1
+ to avoid starting the BER counter. Reset the
+ CRC test bit. Finite counting selected */
+ {0x15,0xff}, /* @ size of the limited time window for RS BER
+ estimation. It is <value>*256 RS blocks, this
+ gives approx. 2.6 sec at 27.5MS/s, rate 3/4 */
+ {0x16,0x00}, /* @ enable all RS output ports */
+ {0x17,0x04}, /* @ time window allowed for the RS to sync */
+ {0x18,0xae}, /* @ allow all standard DVB code rates to be scanned
+ for automatically */
+ /* leave the current code rate and normalization
+ registers as they are after reset... */
+ {0x21,0x10}, /* @ during AutoAcq, search each viterbi setting
+ only once */
+ {0x23,0x18}, /* @ size of the limited time window for Viterbi BER
+ estimation. It is <value>*65536 channel bits, i.e.
+ approx. 38ms at 27.5MS/s, rate 3/4 */
+ {0x24,0x24}, /* do not trigger Viterbi CRC test. Finite count window */
+ /* leave front-end AGC parameters at default values */
+ /* leave decimation AGC parameters at default values */
+ {0x35,0x40}, /* disable all interrupts. They are not connected anyway */
+ {0x36,0xff}, /* clear all interrupt pending flags */
+ {0x37,0x00}, /* @ fully enable AutoAcqq state machine */
+ {0x38,0x07}, /* @ enable fade recovery, but not autostart AutoAcq */
+ /* leave the equalizer parameters on their default values */
+ /* leave the final AGC parameters on their default values */
+ {0x41,0x00}, /* @ MSB of front-end derotator frequency */
+ {0x42,0x00}, /* @ middle bytes " */
+ {0x43,0x00}, /* @ LSB " */
+ /* leave the carrier tracking loop parameters on default */
+ /* leave the bit timing loop parameters at gefault */
+ {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */
+ /* the cx24108 data sheet for symbol rates above 15MS/s */
+ {0x57,0x00}, /* @ Filter sigma delta enabled, positive */
+ {0x61,0x95}, /* GPIO pins 1-4 have special function */
+ {0x62,0x05}, /* GPIO pin 5 has special function, pin 6 is GPIO */
+ {0x63,0x00}, /* All GPIO pins use CMOS output characteristics */
+ {0x64,0x20}, /* GPIO 6 is input, all others are outputs */
+ {0x6d,0x30}, /* tuner auto mode clock freq 62kHz */
+ {0x70,0x15}, /* use auto mode, tuner word is 21 bits long */
+ {0x73,0x00}, /* @ disable several demod bypasses */
+ {0x74,0x00}, /* @ " */
+ {0x75,0x00} /* @ " */
+ /* the remaining registers are for SEC */
};
static int cx24110_writereg (struct cx24110_state* state, int reg, int data)
{
- u8 buf [] = { reg, data };
+ u8 buf [] = { reg, data };
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
int err;
- if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
+ if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
dprintk ("%s: writereg error (err == %i, reg == 0x%02x,"
" data == 0x%02x)\n", __FUNCTION__, err, reg, data);
return -EREMOTEIO;
}
- return 0;
+ return 0;
}
static int cx24110_readreg (struct cx24110_state* state, u8 reg)
@@ -153,27 +153,27 @@ static int cx24110_set_inversion (struct cx24110_state* state, fe_spectral_inver
switch (inversion) {
case INVERSION_OFF:
- cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
- /* AcqSpectrInvDis on. No idea why someone should want this */
- cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)&0xf7);
- /* Initial value 0 at start of acq */
- cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)&0xef);
- /* current value 0 */
- /* The cx24110 manual tells us this reg is read-only.
- But what the heck... set it ayways */
- break;
+ cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
+ /* AcqSpectrInvDis on. No idea why someone should want this */
+ cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)&0xf7);
+ /* Initial value 0 at start of acq */
+ cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)&0xef);
+ /* current value 0 */
+ /* The cx24110 manual tells us this reg is read-only.
+ But what the heck... set it ayways */
+ break;
case INVERSION_ON:
- cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
- /* AcqSpectrInvDis on. No idea why someone should want this */
- cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)|0x08);
- /* Initial value 1 at start of acq */
- cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)|0x10);
- /* current value 1 */
- break;
+ cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
+ /* AcqSpectrInvDis on. No idea why someone should want this */
+ cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)|0x08);
+ /* Initial value 1 at start of acq */
+ cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)|0x10);
+ /* current value 1 */
+ break;
case INVERSION_AUTO:
- cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xfe);
- /* AcqSpectrInvDis off. Leave initial & current states as is */
- break;
+ cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xfe);
+ /* AcqSpectrInvDis off. Leave initial & current states as is */
+ break;
default:
return -EINVAL;
}
@@ -185,18 +185,18 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
{
/* fixme (low): error handling */
- static const int rate[]={-1,1,2,3,5,7,-1};
- static const int g1[]={-1,0x01,0x02,0x05,0x15,0x45,-1};
- static const int g2[]={-1,0x01,0x03,0x06,0x1a,0x7a,-1};
+ static const int rate[]={-1,1,2,3,5,7,-1};
+ static const int g1[]={-1,0x01,0x02,0x05,0x15,0x45,-1};
+ static const int g2[]={-1,0x01,0x03,0x06,0x1a,0x7a,-1};
- /* Well, the AutoAcq engine of the cx24106 and 24110 automatically
- searches all enabled viterbi rates, and can handle non-standard
- rates as well. */
+ /* Well, the AutoAcq engine of the cx24106 and 24110 automatically
+ searches all enabled viterbi rates, and can handle non-standard
+ rates as well. */
- if (fec>FEC_AUTO)
- fec=FEC_AUTO;
+ if (fec>FEC_AUTO)
+ fec=FEC_AUTO;
- if (fec==FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
+ if (fec==FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xdf);
/* clear AcqVitDis bit */
cx24110_writereg(state,0x18,0xae);
@@ -208,7 +208,7 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
cx24110_writereg(state,0x1a,0x05); cx24110_writereg(state,0x1b,0x06);
/* set the puncture registers for code rate 3/4 */
return 0;
- } else {
+ } else {
cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x20);
/* set AcqVitDis bit */
if(rate[fec]>0) {
@@ -219,10 +219,10 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
cx24110_writereg(state,0x1a,g1[fec]);
cx24110_writereg(state,0x1b,g2[fec]);
/* not sure if this is the right way: I always used AutoAcq mode */
- } else
+ } else
return -EOPNOTSUPP;
/* fixme (low): which is the correct return code? */
- };
+ };
return 0;
}
@@ -245,72 +245,72 @@ static fe_code_rate_t cx24110_get_fec (struct cx24110_state* state)
static int cx24110_set_symbolrate (struct cx24110_state* state, u32 srate)
{
/* fixme (low): add error handling */
- u32 ratio;
- u32 tmp, fclk, BDRI;
+ u32 ratio;
+ u32 tmp, fclk, BDRI;
- static const u32 bands[]={5000000UL,15000000UL,90999000UL/2};
- int i;
+ static const u32 bands[]={5000000UL,15000000UL,90999000UL/2};
+ int i;
dprintk("cx24110 debug: entering %s(%d)\n",__FUNCTION__,srate);
- if (srate>90999000UL/2)
- srate=90999000UL/2;
- if (srate<500000)
- srate=500000;
+ if (srate>90999000UL/2)
+ srate=90999000UL/2;
+ if (srate<500000)
+ srate=500000;
- for(i=0;(i<sizeof(bands)/sizeof(bands[0]))&&(srate>bands[i]);i++)
+ for(i=0;(i<sizeof(bands)/sizeof(bands[0]))&&(srate>bands[i]);i++)
;
- /* first, check which sample rate is appropriate: 45, 60 80 or 90 MHz,
- and set the PLL accordingly (R07[1:0] Fclk, R06[7:4] PLLmult,
- R06[3:0] PLLphaseDetGain */
- tmp=cx24110_readreg(state,0x07)&0xfc;
- if(srate<90999000UL/4) { /* sample rate 45MHz*/
+ /* first, check which sample rate is appropriate: 45, 60 80 or 90 MHz,
+ and set the PLL accordingly (R07[1:0] Fclk, R06[7:4] PLLmult,
+ R06[3:0] PLLphaseDetGain */
+ tmp=cx24110_readreg(state,0x07)&0xfc;
+ if(srate<90999000UL/4) { /* sample rate 45MHz*/
cx24110_writereg(state,0x07,tmp);
cx24110_writereg(state,0x06,0x78);
fclk=90999000UL/2;
- } else if(srate<60666000UL/2) { /* sample rate 60MHz */
+ } else if(srate<60666000UL/2) { /* sample rate 60MHz */
cx24110_writereg(state,0x07,tmp|0x1);
cx24110_writereg(state,0x06,0xa5);
fclk=60666000UL;
- } else if(srate<80888000UL/2) { /* sample rate 80MHz */
+ } else if(srate<80888000UL/2) { /* sample rate 80MHz */
cx24110_writereg(state,0x07,tmp|0x2);
cx24110_writereg(state,0x06,0x87);
fclk=80888000UL;
- } else { /* sample rate 90MHz */
+ } else { /* sample rate 90MHz */
cx24110_writereg(state,0x07,tmp|0x3);
cx24110_writereg(state,0x06,0x78);
fclk=90999000UL;
- };
- dprintk("cx24110 debug: fclk %d Hz\n",fclk);
- /* we need to divide two integers with approx. 27 bits in 32 bit
- arithmetic giving a 25 bit result */
- /* the maximum dividend is 90999000/2, 0x02b6446c, this number is
- also the most complex divisor. Hence, the dividend has,
- assuming 32bit unsigned arithmetic, 6 clear bits on top, the
- divisor 2 unused bits at the bottom. Also, the quotient is
- always less than 1/2. Borrowed from VES1893.c, of course */
+ };
+ dprintk("cx24110 debug: fclk %d Hz\n",fclk);
+ /* we need to divide two integers with approx. 27 bits in 32 bit
+ arithmetic giving a 25 bit result */
+ /* the maximum dividend is 90999000/2, 0x02b6446c, this number is
+ also the most complex divisor. Hence, the dividend has,
+ assuming 32bit unsigned arithmetic, 6 clear bits on top, the
+ divisor 2 unused bits at the bottom. Also, the quotient is
+ always less than 1/2. Borrowed from VES1893.c, of course */
- tmp=srate<<6;
- BDRI=fclk>>2;
- ratio=(tmp/BDRI);
+ tmp=srate<<6;
+ BDRI=fclk>>2;
+ ratio=(tmp/BDRI);
- tmp=(tmp%BDRI)<<8;
- ratio=(ratio<<8)+(tmp/BDRI);
+ tmp=(tmp%BDRI)<<8;
+ ratio=(ratio<<8)+(tmp/BDRI);
- tmp=(tmp%BDRI)<<8;
- ratio=(ratio<<8)+(tmp/BDRI);
+ tmp=(tmp%BDRI)<<8;
+ ratio=(ratio<<8)+(tmp/BDRI);
- tmp=(tmp%BDRI)<<1;
- ratio=(ratio<<1)+(tmp/BDRI);
+ tmp=(tmp%BDRI)<<1;
+ ratio=(ratio<<1)+(tmp/BDRI);
- dprintk("srate= %d (range %d, up to %d)\n", srate,i,bands[i]);
- dprintk("fclk = %d\n", fclk);
- dprintk("ratio= %08x\n", ratio);
+ dprintk("srate= %d (range %d, up to %d)\n", srate,i,bands[i]);
+ dprintk("fclk = %d\n", fclk);
+ dprintk("ratio= %08x\n", ratio);
- cx24110_writereg(state, 0x1, (ratio>>16)&0xff);
- cx24110_writereg(state, 0x2, (ratio>>8)&0xff);
- cx24110_writereg(state, 0x3, (ratio)&0xff);
+ cx24110_writereg(state, 0x1, (ratio>>16)&0xff);
+ cx24110_writereg(state, 0x2, (ratio>>8)&0xff);
+ cx24110_writereg(state, 0x3, (ratio)&0xff);
- return 0;
+ return 0;
}
@@ -324,48 +324,48 @@ int cx24110_pll_write (struct dvb_frontend* fe, u32 data)
dprintk("cx24110 debug: cx24108_write(%8.8x)\n",data);
- cx24110_writereg(state,0x6d,0x30); /* auto mode at 62kHz */
- cx24110_writereg(state,0x70,0x15); /* auto mode 21 bits */
+ cx24110_writereg(state,0x6d,0x30); /* auto mode at 62kHz */
+ cx24110_writereg(state,0x70,0x15); /* auto mode 21 bits */
- /* if the auto tuner writer is still busy, clear it out */
- while (cx24110_readreg(state,0x6d)&0x80)
+ /* if the auto tuner writer is still busy, clear it out */
+ while (cx24110_readreg(state,0x6d)&0x80)
cx24110_writereg(state,0x72,0);
- /* write the topmost 8 bits */
- cx24110_writereg(state,0x72,(data>>24)&0xff);
+ /* write the topmost 8 bits */
+ cx24110_writereg(state,0x72,(data>>24)&0xff);
- /* wait for the send to be completed */
- while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+ /* wait for the send to be completed */
+ while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
;
- /* send another 8 bytes */
- cx24110_writereg(state,0x72,(data>>16)&0xff);
- while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+ /* send another 8 bytes */
+ cx24110_writereg(state,0x72,(data>>16)&0xff);
+ while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
;
- /* and the topmost 5 bits of this byte */
- cx24110_writereg(state,0x72,(data>>8)&0xff);
- while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+ /* and the topmost 5 bits of this byte */
+ cx24110_writereg(state,0x72,(data>>8)&0xff);
+ while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
;
- /* now strobe the enable line once */
- cx24110_writereg(state,0x6d,0x32);
- cx24110_writereg(state,0x6d,0x30);
+ /* now strobe the enable line once */
+ cx24110_writereg(state,0x6d,0x32);
+ cx24110_writereg(state,0x6d,0x30);
- return 0;
+ return 0;
}
static int cx24110_initfe(struct dvb_frontend* fe)
{
struct cx24110_state *state = fe->demodulator_priv;
/* fixme (low): error handling */
- int i;
+ int i;
dprintk("%s: init chip\n", __FUNCTION__);
- for(i=0;i<sizeof(cx24110_regdata)/sizeof(cx24110_regdata[0]);i++) {
+ for(i=0;i<sizeof(cx24110_regdata)/sizeof(cx24110_regdata[0]);i++) {
cx24110_writereg(state, cx24110_regdata[i].reg, cx24110_regdata[i].data);
- };
+ };
if (state->config->pll_init) state->config->pll_init(fe);
diff --git a/drivers/media/dvb/frontends/l64781.c b/drivers/media/dvb/frontends/l64781.c
index 19b4bf7..1c7c912 100644
--- a/drivers/media/dvb/frontends/l64781.c
+++ b/drivers/media/dvb/frontends/l64781.c
@@ -2,7 +2,7 @@
driver for LSI L64781 COFDM demodulator
Copyright (C) 2001 Holger Waechtler for Convergence Integrated Media GmbH
- Marko Kohtala <marko.kohtala@luukku.com>
+ Marko Kohtala <marko.kohtala@luukku.com>
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
@@ -433,7 +433,7 @@ static int l64781_init(struct dvb_frontend* fe)
{
struct l64781_state* state = fe->demodulator_priv;
- reset_and_configure (state);
+ reset_and_configure (state);
/* Power up */
l64781_writereg (state, 0x3e, 0xa5);
@@ -456,9 +456,9 @@ static int l64781_init(struct dvb_frontend* fe)
l64781_writereg (state, 0x0d, 0x8c);
/* With ppm=8000, it seems the DTR_SENSITIVITY will result in
- value of 2 with all possible bandwidths and guard
- intervals, which is the initial value anyway. */
- /*l64781_writereg (state, 0x19, 0x92);*/
+ value of 2 with all possible bandwidths and guard
+ intervals, which is the initial value anyway. */
+ /*l64781_writereg (state, 0x19, 0x92);*/
/* Everything is two's complement, soft bit and CSI_OUT too */
l64781_writereg (state, 0x1e, 0x09);
@@ -477,10 +477,10 @@ static int l64781_init(struct dvb_frontend* fe)
static int l64781_get_tune_settings(struct dvb_frontend* fe,
struct dvb_frontend_tune_settings* fesettings)
{
- fesettings->min_delay_ms = 4000;
- fesettings->step_size = 0;
- fesettings->max_drift = 0;
- return 0;
+ fesettings->min_delay_ms = 4000;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
}
static void l64781_release(struct dvb_frontend* fe)
@@ -522,7 +522,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
/* The chip always responds to reads */
if (i2c_transfer(state->i2c, msg, 2) != 2) {
- dprintk("No response to read on I2C bus\n");
+ dprintk("No response to read on I2C bus\n");
goto error;
}
@@ -531,7 +531,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
/* Reading the POWER_DOWN register always returns 0 */
if (reg0x3e != 0) {
- dprintk("Device doesn't look like L64781\n");
+ dprintk("Device doesn't look like L64781\n");
goto error;
}
@@ -540,7 +540,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
/* Responds to all reads with 0 */
if (l64781_readreg(state, 0x1a) != 0) {
- dprintk("Read 1 returned unexpcted value\n");
+ dprintk("Read 1 returned unexpcted value\n");
goto error;
}
@@ -549,7 +549,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
/* Responds with register default value */
if (l64781_readreg(state, 0x1a) != 0xa1) {
- dprintk("Read 2 returned unexpcted value\n");
+ dprintk("Read 2 returned unexpcted value\n");
goto error;
}
diff --git a/drivers/media/dvb/frontends/l64781.h b/drivers/media/dvb/frontends/l64781.h
index 7e30fb0..947f65f 100644
--- a/drivers/media/dvb/frontends/l64781.h
+++ b/drivers/media/dvb/frontends/l64781.h
@@ -2,7 +2,7 @@
driver for LSI L64781 COFDM demodulator
Copyright (C) 2001 Holger Waechtler for Convergence Integrated Media GmbH
- Marko Kohtala <marko.kohtala@luukku.com>
+ Marko Kohtala <marko.kohtala@luukku.com>
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
diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c
index 6a33f5a..cb5301865 100644
--- a/drivers/media/dvb/frontends/lgdt330x.c
+++ b/drivers/media/dvb/frontends/lgdt330x.c
@@ -301,10 +301,10 @@ static int lgdt330x_set_parameters(struct dvb_frontend* fe,
static u8 lgdt3303_8vsb_44_data[] = {
0x04, 0x00,
0x0d, 0x40,
- 0x0e, 0x87,
- 0x0f, 0x8e,
- 0x10, 0x01,
- 0x47, 0x8b };
+ 0x0e, 0x87,
+ 0x0f, 0x8e,
+ 0x10, 0x01,
+ 0x47, 0x8b };
/*
* Array of byte pairs <address, value>
diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c
index 9c67f40..8d67228 100644
--- a/drivers/media/dvb/frontends/mt312.c
+++ b/drivers/media/dvb/frontends/mt312.c
@@ -554,7 +554,7 @@ static int mt312_set_frontend(struct dvb_frontend* fe,
if ((ret = mt312_write(state, SYM_RATE_H, buf, sizeof(buf))) < 0)
return ret;
- mt312_reset(state, 0);
+ mt312_reset(state, 0);
return 0;
}
@@ -695,7 +695,7 @@ static struct dvb_frontend_ops vp310_mt312_ops = {
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_MUTE_TS |
- FE_CAN_RECOVER
+ FE_CAN_RECOVER
},
.release = mt312_release,
diff --git a/drivers/media/dvb/frontends/nxt2002.c b/drivers/media/dvb/frontends/nxt2002.c
index 30786b1..52c4160 100644
--- a/drivers/media/dvb/frontends/nxt2002.c
+++ b/drivers/media/dvb/frontends/nxt2002.c
@@ -527,7 +527,7 @@ static int nxt2002_read_snr(struct dvb_frontend* fe, u16* snr)
else
snrdb = 1000*0 + ( 1000*(12-0) * ( temp2 - 0 ) / ( 0x7C00 - 0 ) );
- /* the value reported back from the frontend will be FFFF=32db 0000=0db */
+ /* the value reported back from the frontend will be FFFF=32db 0000=0db */
*snr = snrdb * (0xFFFF/32000);
@@ -646,7 +646,7 @@ struct dvb_frontend* nxt2002_attach(const struct nxt2002_config* config,
memcpy(&state->ops, &nxt2002_ops, sizeof(struct dvb_frontend_ops));
state->initialised = 0;
- /* Check the first 5 registers to ensure this a revision we can handle */
+ /* Check the first 5 registers to ensure this a revision we can handle */
i2c_readbytes(state, 0x00, buf, 5);
if (buf[0] != 0x04) goto error; /* device id */
@@ -672,7 +672,7 @@ static struct dvb_frontend_ops nxt2002_ops = {
.type = FE_ATSC,
.frequency_min = 54000000,
.frequency_max = 860000000,
- /* stepsize is just a guess */
+ /* stepsize is just a guess */
.frequency_stepsize = 166666,
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
diff --git a/drivers/media/dvb/frontends/nxt200x.c b/drivers/media/dvb/frontends/nxt200x.c
index bad0933..aeafef4 100644
--- a/drivers/media/dvb/frontends/nxt200x.c
+++ b/drivers/media/dvb/frontends/nxt200x.c
@@ -44,6 +44,8 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
+#include <linux/slab.h>
+#include <linux/string.h>
#include "dvb_frontend.h"
#include "dvb-pll.h"
@@ -337,7 +339,7 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data)
switch (state->demod_chip) {
case NXT2004:
if (i2c_writebytes(state, state->config->pll_address, data, 4))
- printk(KERN_WARNING "nxt200x: error writing to tuner\n");
+ printk(KERN_WARNING "nxt200x: error writing to tuner\n");
/* wait until we have a lock */
while (count < 20) {
i2c_readbytes(state, state->config->pll_address, &buf, 1);
@@ -495,7 +497,7 @@ static int nxt2004_load_firmware (struct dvb_frontend* fe, const struct firmware
/* calculate firmware CRC */
for (position = 0; position < fw->size; position++) {
- crc = nxt200x_crc(crc, fw->data[position]);
+ crc = nxt200x_crc(crc, fw->data[position]);
}
buf[0] = rambase >> 8;
diff --git a/drivers/media/dvb/frontends/nxt6000.c b/drivers/media/dvb/frontends/nxt6000.c
index 88a57b7..a458a3b 100644
--- a/drivers/media/dvb/frontends/nxt6000.c
+++ b/drivers/media/dvb/frontends/nxt6000.c
@@ -574,11 +574,11 @@ static struct dvb_frontend_ops nxt6000_ops = {
.symbol_rate_max = 9360000, /* FIXME */
.symbol_rate_tolerance = 4000,
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
- FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
- FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
- FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
- FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
- FE_CAN_HIERARCHY_AUTO,
+ FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
+ FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
+ FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+ FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO,
},
.release = nxt6000_release,
diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c
index 78bded8..80e0f28 100644
--- a/drivers/media/dvb/frontends/or51132.c
+++ b/drivers/media/dvb/frontends/or51132.c
@@ -503,7 +503,7 @@ static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
rcvr_stat = rec_buf[1];
usK = (rcvr_stat & 0x10) ? 3 : 0;
- /* The value reported back from the frontend will be FFFF=100% 0000=0% */
+ /* The value reported back from the frontend will be FFFF=100% 0000=0% */
signal_strength = (((8952 - i20Log10(snr_equ) - usK*100)/3+5)*65535)/1000;
if (signal_strength > 0xffff)
*strength = 0xffff;
diff --git a/drivers/media/dvb/frontends/s5h1420.c b/drivers/media/dvb/frontends/s5h1420.c
index f265418..1871509 100644
--- a/drivers/media/dvb/frontends/s5h1420.c
+++ b/drivers/media/dvb/frontends/s5h1420.c
@@ -494,7 +494,7 @@ static int s5h1420_getfreqoffset(struct s5h1420_state* state)
}
static void s5h1420_setfec_inversion(struct s5h1420_state* state,
- struct dvb_frontend_parameters *p)
+ struct dvb_frontend_parameters *p)
{
u8 inversion = 0;
@@ -521,8 +521,8 @@ static void s5h1420_setfec_inversion(struct s5h1420_state* state,
case FEC_3_4:
s5h1420_writereg(state, 0x30, 0x04);
- s5h1420_writereg(state, 0x31, 0x12 | inversion);
- break;
+ s5h1420_writereg(state, 0x31, 0x12 | inversion);
+ break;
case FEC_5_6:
s5h1420_writereg(state, 0x30, 0x08);
diff --git a/drivers/media/dvb/frontends/s5h1420.h b/drivers/media/dvb/frontends/s5h1420.h
index 872028d..73296f1 100644
--- a/drivers/media/dvb/frontends/s5h1420.h
+++ b/drivers/media/dvb/frontends/s5h1420.h
@@ -39,6 +39,6 @@ struct s5h1420_config
};
extern struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config,
- struct i2c_adapter* i2c);
+ struct i2c_adapter* i2c);
#endif // S5H1420_H
diff --git a/drivers/media/dvb/frontends/sp8870.c b/drivers/media/dvb/frontends/sp8870.c
index 1c6b2e9..fc06cd6 100644
--- a/drivers/media/dvb/frontends/sp8870.c
+++ b/drivers/media/dvb/frontends/sp8870.c
@@ -67,16 +67,16 @@ static int debug;
static int sp8870_writereg (struct sp8870_state* state, u16 reg, u16 data)
{
- u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
+ u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 4 };
int err;
- if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
+ if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data);
return -EREMOTEIO;
}
- return 0;
+ return 0;
}
static int sp8870_readreg (struct sp8870_state* state, u16 reg)
@@ -305,7 +305,7 @@ static int sp8870_set_frontend_parameters (struct dvb_frontend* fe,
static int sp8870_init (struct dvb_frontend* fe)
{
struct sp8870_state* state = fe->demodulator_priv;
- const struct firmware *fw = NULL;
+ const struct firmware *fw = NULL;
sp8870_wake_up(state);
if (state->initialised) return 0;
@@ -534,10 +534,10 @@ static int sp8870_sleep(struct dvb_frontend* fe)
static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
{
- fesettings->min_delay_ms = 350;
- fesettings->step_size = 0;
- fesettings->max_drift = 0;
- return 0;
+ fesettings->min_delay_ms = 350;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
}
static void sp8870_release(struct dvb_frontend* fe)
diff --git a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c
index 73384e7..e3b6657 100644
--- a/drivers/media/dvb/frontends/sp887x.c
+++ b/drivers/media/dvb/frontends/sp887x.c
@@ -80,7 +80,7 @@ static int sp887x_readreg (struct sp887x_state* state, u16 reg)
u8 b1 [2];
int ret;
struct i2c_msg msg[] = {{ .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 },
- { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 }};
+ { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 }};
if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) {
printk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
@@ -498,7 +498,7 @@ static int sp887x_sleep(struct dvb_frontend* fe)
static int sp887x_init(struct dvb_frontend* fe)
{
struct sp887x_state* state = fe->demodulator_priv;
- const struct firmware *fw = NULL;
+ const struct firmware *fw = NULL;
int ret;
if (!state->initialised) {
@@ -528,10 +528,10 @@ static int sp887x_init(struct dvb_frontend* fe)
static int sp887x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
{
- fesettings->min_delay_ms = 350;
- fesettings->step_size = 166666*2;
- fesettings->max_drift = (166666*2)+1;
- return 0;
+ fesettings->min_delay_ms = 350;
+ fesettings->step_size = 166666*2;
+ fesettings->max_drift = (166666*2)+1;
+ return 0;
}
static void sp887x_release(struct dvb_frontend* fe)
@@ -581,7 +581,7 @@ static struct dvb_frontend_ops sp887x_ops = {
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
- FE_CAN_RECOVER
+ FE_CAN_RECOVER
},
.release = sp887x_release,
diff --git a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c
index 29c4866..177d71d 100644
--- a/drivers/media/dvb/frontends/stv0299.c
+++ b/drivers/media/dvb/frontends/stv0299.c
@@ -95,7 +95,7 @@ static int stv0299_writeregI (struct stv0299_state* state, u8 reg, u8 data)
int stv0299_writereg (struct dvb_frontend* fe, u8 reg, u8 data)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
return stv0299_writeregI(state, reg, data);
}
@@ -220,7 +220,7 @@ static int stv0299_wait_diseqc_idle (struct stv0299_state* state, int timeout)
static int stv0299_set_symbolrate (struct dvb_frontend* fe, u32 srate)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u64 big = srate;
u32 ratio;
@@ -271,7 +271,7 @@ static int stv0299_get_symbolrate (struct stv0299_state* state)
static int stv0299_send_diseqc_msg (struct dvb_frontend* fe,
struct dvb_diseqc_master_cmd *m)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u8 val;
int i;
@@ -301,7 +301,7 @@ static int stv0299_send_diseqc_msg (struct dvb_frontend* fe,
static int stv0299_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u8 val;
dprintk ("%s\n", __FUNCTION__);
@@ -328,7 +328,7 @@ static int stv0299_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t
static int stv0299_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u8 val;
if (stv0299_wait_diseqc_idle (state, 100) < 0)
@@ -350,7 +350,7 @@ static int stv0299_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
static int stv0299_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u8 reg0x08;
u8 reg0x0c;
@@ -442,7 +442,7 @@ static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, u32 cmd)
static int stv0299_init (struct dvb_frontend* fe)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
int i;
dprintk("stv0299: init chip\n");
@@ -461,7 +461,7 @@ static int stv0299_init (struct dvb_frontend* fe)
static int stv0299_read_status(struct dvb_frontend* fe, fe_status_t* status)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
u8 signal = 0xff - stv0299_readreg (state, 0x18);
u8 sync = stv0299_readreg (state, 0x1b);
@@ -489,7 +489,7 @@ static int stv0299_read_status(struct dvb_frontend* fe, fe_status_t* status)
static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
if (state->errmode != STATUS_BER) return 0;
*ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
@@ -499,7 +499,7 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
static int stv0299_read_signal_strength(struct dvb_frontend* fe, u16* strength)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
s32 signal = 0xffff - ((stv0299_readreg (state, 0x18) << 8)
| stv0299_readreg (state, 0x19));
@@ -516,7 +516,7 @@ static int stv0299_read_signal_strength(struct dvb_frontend* fe, u16* strength)
static int stv0299_read_snr(struct dvb_frontend* fe, u16* snr)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
s32 xsnr = 0xffff - ((stv0299_readreg (state, 0x24) << 8)
| stv0299_readreg (state, 0x25));
@@ -528,7 +528,7 @@ static int stv0299_read_snr(struct dvb_frontend* fe, u16* snr)
static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0;
else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
@@ -538,7 +538,7 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
int invval = 0;
dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
@@ -571,7 +571,7 @@ static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
static int stv0299_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
s32 derot_freq;
int invval;
@@ -596,7 +596,7 @@ static int stv0299_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
static int stv0299_sleep(struct dvb_frontend* fe)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
stv0299_writeregI(state, 0x02, 0x80);
state->initialised = 0;
@@ -606,7 +606,7 @@ static int stv0299_sleep(struct dvb_frontend* fe)
static int stv0299_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
{
- struct stv0299_state* state = fe->demodulator_priv;
+ struct stv0299_state* state = fe->demodulator_priv;
fesettings->min_delay_ms = state->config->min_delay_ms;
if (fesettings->parameters.u.qpsk.symbol_rate < 10000000) {
@@ -658,7 +658,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
/* create dvb_frontend */
state->frontend.ops = &state->ops;
- state->frontend.demodulator_priv = state;
+ state->frontend.demodulator_priv = state;
return &state->frontend;
error:
@@ -714,7 +714,7 @@ MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
MODULE_DESCRIPTION("ST STV0299 DVB Demodulator driver");
MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, "
- "Andreas Oberritter, Andrew de Quincey, Kenneth Aafløy");
+ "Andreas Oberritter, Andrew de Quincey, Kenneth Aafløy");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(stv0299_writereg);
diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c
index eaf130e..425cd19 100644
--- a/drivers/media/dvb/frontends/tda10021.c
+++ b/drivers/media/dvb/frontends/tda10021.c
@@ -1,10 +1,10 @@
/*
TDA10021 - Single Chip Cable Channel Receiver driver module
- used on the the Siemens DVB-C cards
+ used on the the Siemens DVB-C cards
Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
Copyright (C) 2004 Markus Schulz <msc@antzsystem.de>
- Support for TDA10021
+ Support for TDA10021
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
@@ -76,9 +76,9 @@ static u8 tda10021_inittab[0x40]=
static int tda10021_writereg (struct tda10021_state* state, u8 reg, u8 data)
{
- u8 buf[] = { reg, data };
+ u8 buf[] = { reg, data };
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
- int ret;
+ int ret;
ret = i2c_transfer (state->i2c, &msg, 1);
if (ret != 1)
@@ -95,7 +95,7 @@ static u8 tda10021_readreg (struct tda10021_state* state, u8 reg)
u8 b0 [] = { reg };
u8 b1 [] = { 0 };
struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 },
- { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+ { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
int ret;
ret = i2c_transfer (state->i2c, msg, 2);
diff --git a/drivers/media/dvb/frontends/tda10021.h b/drivers/media/dvb/frontends/tda10021.h
index 7d6a51c..53be939 100644
--- a/drivers/media/dvb/frontends/tda10021.h
+++ b/drivers/media/dvb/frontends/tda10021.h
@@ -1,10 +1,10 @@
/*
TDA10021 - Single Chip Cable Channel Receiver driver module
- used on the the Siemens DVB-C cards
+ used on the the Siemens DVB-C cards
Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
Copyright (C) 2004 Markus Schulz <msc@antzsystem.de>
- Support for TDA10021
+ Support for TDA10021
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
diff --git a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c
index 7968743..dd02aff 100644
--- a/drivers/media/dvb/frontends/tda1004x.c
+++ b/drivers/media/dvb/frontends/tda1004x.c
@@ -475,7 +475,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
ret = state->config->request_firmware(fe, &fw, TDA10046_DEFAULT_FIRMWARE);
if (ret) {
printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n");
- return ret;
+ return ret;
}
tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8); // going to boot from HOST
ret = tda1004x_do_upload(state, fw->data, fw->size, TDA10046H_CODE_CPT, TDA10046H_CODE_IN);
diff --git a/drivers/media/dvb/frontends/tda8083.c b/drivers/media/dvb/frontends/tda8083.c
index c05cf186..91baa9c 100644
--- a/drivers/media/dvb/frontends/tda8083.c
+++ b/drivers/media/dvb/frontends/tda8083.c
@@ -66,13 +66,13 @@ static int tda8083_writereg (struct tda8083_state* state, u8 reg, u8 data)
u8 buf [] = { reg, data };
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
- ret = i2c_transfer(state->i2c, &msg, 1);
+ ret = i2c_transfer(state->i2c, &msg, 1);
- if (ret != 1)
- dprintk ("%s: writereg error (reg %02x, ret == %i)\n",
+ if (ret != 1)
+ dprintk ("%s: writereg error (reg %02x, ret == %i)\n",
__FUNCTION__, reg, ret);
- return (ret != 1) ? -1 : 0;
+ return (ret != 1) ? -1 : 0;
}
static int tda8083_readregs (struct tda8083_state* state, u8 reg1, u8 *b, u8 len)
@@ -87,7 +87,7 @@ static int tda8083_readregs (struct tda8083_state* state, u8 reg1, u8 *b, u8 len
dprintk ("%s: readreg error (reg %02x, ret == %i)\n",
__FUNCTION__, reg1, ret);
- return ret == 2 ? 0 : -1;
+ return ret == 2 ? 0 : -1;
}
static inline u8 tda8083_readreg (struct tda8083_state* state, u8 reg)
@@ -132,14 +132,14 @@ static fe_code_rate_t tda8083_get_fec (struct tda8083_state* state)
static int tda8083_set_symbolrate (struct tda8083_state* state, u32 srate)
{
- u32 ratio;
+ u32 ratio;
u32 tmp;
u8 filter;
if (srate > 32000000)
- srate = 32000000;
- if (srate < 500000)
- srate = 500000;
+ srate = 32000000;
+ if (srate < 500000)
+ srate = 500000;
filter = 0;
if (srate < 24000000)
@@ -174,7 +174,7 @@ static void tda8083_wait_diseqc_fifo (struct tda8083_state* state, int timeout)
unsigned long start = jiffies;
while (jiffies - start < timeout &&
- !(tda8083_readreg(state, 0x02) & 0x80))
+ !(tda8083_readreg(state, 0x02) & 0x80))
{
msleep(50);
};
diff --git a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c
index c6d2766..ad8647a3 100644
--- a/drivers/media/dvb/frontends/ves1820.c
+++ b/drivers/media/dvb/frontends/ves1820.c
@@ -140,25 +140,25 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
/* yeuch! */
fpxin = state->config->xin * 10;
fptmp = fpxin; do_div(fptmp, 123);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 1;
fptmp = fpxin; do_div(fptmp, 160);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 0;
fptmp = fpxin; do_div(fptmp, 246);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 1;
fptmp = fpxin; do_div(fptmp, 320);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 0;
fptmp = fpxin; do_div(fptmp, 492);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 1;
fptmp = fpxin; do_div(fptmp, 640);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 0;
fptmp = fpxin; do_div(fptmp, 984);
- if (symbolrate < fptmp);
+ if (symbolrate < fptmp)
SFIL = 1;
fin = state->config->xin >> 4;
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig
index d8bf658..fa5034a 100644
--- a/drivers/media/dvb/ttpci/Kconfig
+++ b/drivers/media/dvb/ttpci/Kconfig
@@ -81,6 +81,7 @@ config DVB_BUDGET_CI
tristate "Budget cards with onboard CI connector"
depends on DVB_CORE && PCI
select VIDEO_SAA7146
+ select DVB_STV0297
select DVB_STV0299
select DVB_TDA1004X
help
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
index 87ea527..7dae91e 100644
--- a/drivers/media/dvb/ttpci/av7110.c
+++ b/drivers/media/dvb/ttpci/av7110.c
@@ -176,6 +176,9 @@ static void init_av7110_av(struct av7110 *av7110)
}
}
+ if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000e)
+ av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, SpdifSwitch, 1, 0); // SPDIF on
+
ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
if (ret < 0)
printk("dvb-ttpci:cannot set volume :%d\n",ret);
@@ -217,10 +220,10 @@ static int arm_thread(void *data)
dprintk(4, "%p\n",av7110);
- lock_kernel();
- daemonize("arm_mon");
- sigfillset(&current->blocked);
- unlock_kernel();
+ lock_kernel();
+ daemonize("arm_mon");
+ sigfillset(&current->blocked);
+ unlock_kernel();
av7110->arm_thread = current;
@@ -1535,7 +1538,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
buf[2] = ((div & 0x18000) >> 10) | 0x95;
buf[3] = (pwr << 6) | 0x30;
- // NOTE: since we're using a prescaler of 2, we set the
+ // NOTE: since we're using a prescaler of 2, we set the
// divisor frequency to 62.5kHz and divide by 125 above
if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1)
@@ -1811,7 +1814,7 @@ static struct tda8083_config grundig_29504_451_config = {
static int philips_cd1516_pll_set(struct dvb_frontend* fe,
struct dvb_frontend_parameters* params)
{
- struct av7110* av7110 = fe->dvb->priv;
+ struct av7110* av7110 = fe->dvb->priv;
u32 div;
u32 f = params->frequency;
u8 data[4];
@@ -2202,7 +2205,7 @@ static u8 read_pwm(struct av7110* av7110)
struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
{ .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
- if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
+ if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
pwm = 0x48;
return pwm;
@@ -2245,7 +2248,7 @@ static int frontend_init(struct av7110 *av7110)
}
// Try the grundig 29504-451
- av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap);
+ av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap);
if (av7110->fe) {
av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst;
@@ -2271,12 +2274,12 @@ static int frontend_init(struct av7110 *av7110)
case 0x0001: // Hauppauge/TT Nexus-T premium rev1.X
// ALPS TDLB7
- av7110->fe = sp8870_attach(&alps_tdlb7_config, &av7110->i2c_adap);
+ av7110->fe = sp8870_attach(&alps_tdlb7_config, &av7110->i2c_adap);
break;
case 0x0002: // Hauppauge/TT DVB-C premium rev2.X
- av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
+ av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
break;
case 0x0006: /* Fujitsu-Siemens DVB-S rev 1.6 */
@@ -2421,9 +2424,9 @@ static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_d
dprintk(4, "dev: %p\n", dev);
- /* Set RPS_IRQ to 1 to track rps1 activity.
- * Enabling this won't send any interrupt to PC CPU.
- */
+ /* Set RPS_IRQ to 1 to track rps1 activity.
+ * Enabling this won't send any interrupt to PC CPU.
+ */
#define RPS_IRQ 0
if (budgetpatch == 1) {
diff --git a/drivers/media/dvb/ttpci/av7110_ca.c b/drivers/media/dvb/ttpci/av7110_ca.c
index c3801e3..6079e88 100644
--- a/drivers/media/dvb/ttpci/av7110_ca.c
+++ b/drivers/media/dvb/ttpci/av7110_ca.c
@@ -40,6 +40,7 @@
#include "av7110.h"
#include "av7110_hw.h"
+#include "av7110_ca.h"
void CI_handle(struct av7110 *av7110, u8 *data, u16 len)
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c
index 7442f56..87106e8 100644
--- a/drivers/media/dvb/ttpci/av7110_hw.c
+++ b/drivers/media/dvb/ttpci/av7110_hw.c
@@ -1203,15 +1203,15 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap)
{
- switch (cap->cmd) {
- case OSD_CAP_MEMSIZE:
- if (FW_4M_SDRAM(av7110->arm_app))
- cap->val = 1000000;
- else
- cap->val = 92000;
- return 0;
- default:
- return -EINVAL;
- }
+ switch (cap->cmd) {
+ case OSD_CAP_MEMSIZE:
+ if (FW_4M_SDRAM(av7110->arm_app))
+ cap->val = 1000000;
+ else
+ cap->val = 92000;
+ return 0;
+ default:
+ return -EINVAL;
+ }
}
#endif /* CONFIG_DVB_AV7110_OSD */
diff --git a/drivers/media/dvb/ttpci/av7110_hw.h b/drivers/media/dvb/ttpci/av7110_hw.h
index fedd20f..2a5e87b 100644
--- a/drivers/media/dvb/ttpci/av7110_hw.h
+++ b/drivers/media/dvb/ttpci/av7110_hw.h
@@ -143,7 +143,8 @@ enum av7110_audio_command {
MainSwitch,
ADSwitch,
SendDiSEqC,
- SetRegister
+ SetRegister,
+ SpdifSwitch
};
enum av7110_request_command {
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c
index 6af74f7..b5aea41 100644
--- a/drivers/media/dvb/ttpci/av7110_v4l.c
+++ b/drivers/media/dvb/ttpci/av7110_v4l.c
@@ -120,8 +120,8 @@ static int ves1820_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
static int stv0297_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
{
- u8 buf [] = { reg, data };
- struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 2 };
+ u8 buf [] = { reg, data };
+ struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 2 };
if (1 != saa7146_i2c_transfer(dev, &msg, 1, 1))
return -1;
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c
index aa75dc0..9f51bae 100644
--- a/drivers/media/dvb/ttpci/budget-av.c
+++ b/drivers/media/dvb/ttpci/budget-av.c
@@ -1020,6 +1020,8 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
static struct saa7146_extension budget_extension = {
.name = "budget_av",
+ .flags = SAA7146_I2C_SHORT_DELAY,
+
.pci_tbl = pci_tbl,
.module = THIS_MODULE,
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
index 75fb92d..b9b3cd9 100644
--- a/drivers/media/dvb/ttpci/budget-ci.c
+++ b/drivers/media/dvb/ttpci/budget-ci.c
@@ -1166,7 +1166,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
static struct saa7146_extension budget_extension = {
.name = "budget_ci dvb\0",
- .flags = 0,
+ .flags = SAA7146_I2C_SHORT_DELAY,
.module = THIS_MODULE,
.pci_tbl = &pci_tbl[0],
diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c
index 0498a05..017fcbc 100644
--- a/drivers/media/dvb/ttpci/budget-core.c
+++ b/drivers/media/dvb/ttpci/budget-core.c
@@ -87,7 +87,7 @@ static int start_ts_capture(struct budget *budget)
* Pitch: 188, NumBytes3: 188, NumLines3: 1024
*/
- switch(budget->card->type) {
+ switch(budget->card->type) {
case BUDGET_FS_ACTIVY:
saa7146_write(dev, DD1_INIT, 0x04000000);
saa7146_write(dev, MC2, (MASK_09 | MASK_25));
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c
index 755df81..fc416cf 100644
--- a/drivers/media/dvb/ttpci/budget-patch.c
+++ b/drivers/media/dvb/ttpci/budget-patch.c
@@ -45,11 +45,11 @@ MAKE_BUDGET_INFO(ttbp, "TT-Budget/Patch DVB-S 1.x PCI", BUDGET_PATCH);
//MAKE_BUDGET_INFO(satel,"TT-Budget/Patch SATELCO PCI", BUDGET_TT_HW_DISEQC);
static struct pci_device_id pci_tbl[] = {
- MAKE_EXTENSION_PCI(ttbp,0x13c2, 0x0000),
+ MAKE_EXTENSION_PCI(ttbp,0x13c2, 0x0000),
// MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
- {
- .vendor = 0,
- }
+ {
+ .vendor = 0,
+ }
};
/* those lines are for budget-patch to be tried
@@ -165,57 +165,57 @@ static int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t m
static int budget_av7110_send_fw_cmd(struct budget_patch *budget, u16* buf, int length)
{
- int i;
-
- dprintk(2, "budget: %p\n", budget);
-
- for (i = 2; i < length; i++)
- {
- ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2*i, 2, (u32) buf[i], 0,0);
- msleep(5);
- }
- if (length)
- ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, (u32) buf[1], 0,0);
- else
- ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, 0, 0,0);
- msleep(5);
- ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND, 2, (u32) buf[0], 0,0);
- msleep(5);
- return 0;
+ int i;
+
+ dprintk(2, "budget: %p\n", budget);
+
+ for (i = 2; i < length; i++)
+ {
+ ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2*i, 2, (u32) buf[i], 0,0);
+ msleep(5);
+ }
+ if (length)
+ ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, (u32) buf[1], 0,0);
+ else
+ ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, 0, 0,0);
+ msleep(5);
+ ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND, 2, (u32) buf[0], 0,0);
+ msleep(5);
+ return 0;
}
static void av7110_set22k(struct budget_patch *budget, int state)
{
- u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
+ u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
- dprintk(2, "budget: %p\n", budget);
- budget_av7110_send_fw_cmd(budget, buf, 2);
+ dprintk(2, "budget: %p\n", budget);
+ budget_av7110_send_fw_cmd(budget, buf, 2);
}
static int av7110_send_diseqc_msg(struct budget_patch *budget, int len, u8 *msg, int burst)
{
- int i;
- u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) | SendDiSEqC),
- 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ int i;
+ u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) | SendDiSEqC),
+ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- dprintk(2, "budget: %p\n", budget);
+ dprintk(2, "budget: %p\n", budget);
- if (len>10)
- len=10;
+ if (len>10)
+ len=10;
- buf[1] = len+2;
- buf[2] = len;
+ buf[1] = len+2;
+ buf[2] = len;
- if (burst != -1)
- buf[3]=burst ? 0x01 : 0x00;
- else
- buf[3]=0xffff;
+ if (burst != -1)
+ buf[3]=burst ? 0x01 : 0x00;
+ else
+ buf[3]=0xffff;
- for (i=0; i<len; i++)
- buf[i+4]=msg[i];
+ for (i=0; i<len; i++)
+ buf[i+4]=msg[i];
- budget_av7110_send_fw_cmd(budget, buf, 18);
- return 0;
+ budget_av7110_send_fw_cmd(budget, buf, 18);
+ return 0;
}
static int budget_patch_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
@@ -276,7 +276,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
buf[2] = ((div & 0x18000) >> 10) | 0x95;
buf[3] = (pwr << 6) | 0x30;
- // NOTE: since we're using a prescaler of 2, we set the
+ // NOTE: since we're using a prescaler of 2, we set the
// divisor frequency to 62.5kHz and divide by 125 above
if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
@@ -294,7 +294,7 @@ static u8 alps_bsru6_inittab[] = {
0x01, 0x15,
0x02, 0x00,
0x03, 0x00,
- 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
+ 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
0x06, 0x40, /* DAC not used, set to high impendance mode */
0x07, 0x00, /* DAC LSB */
@@ -413,7 +413,7 @@ static void frontend_init(struct budget_patch* budget)
{
switch(budget->dev->pci->subsystem_device) {
case 0x0000: // Hauppauge/TT WinTV DVB-S rev1.X
- case 0x1013: // SATELCO Multimedia PCI
+ case 0x1013: // SATELCO Multimedia PCI
// try the ALPS BSRV2 first of all
budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap);
@@ -463,8 +463,8 @@ static void frontend_init(struct budget_patch* budget)
/* written by Emard */
static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
{
- struct budget_patch *budget;
- int err;
+ struct budget_patch *budget;
+ int err;
int count = 0;
int detected = 0;
@@ -472,12 +472,12 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
#define RPS_IRQ 0
#define HPS_SETUP 0
#if PATCH_RESET
- saa7146_write(dev, MC1, MASK_31);
- msleep(40);
+ saa7146_write(dev, MC1, MASK_31);
+ msleep(40);
#endif
#if HPS_SETUP
- // initialize registers. Better to have it like this
- // than leaving something unconfigured
+ // initialize registers. Better to have it like this
+ // than leaving something unconfigured
saa7146_write(dev, DD1_STREAM_B, 0);
// port B VSYNC at rising edge
saa7146_write(dev, DD1_INIT, 0x00000200); // have this in budget-core too!
@@ -486,29 +486,29 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
// debi config
// saa7146_write(dev, DEBI_CONFIG, MASK_30|MASK_28|MASK_18);
- // zero all HPS registers
- saa7146_write(dev, HPS_H_PRESCALE, 0); // r68
- saa7146_write(dev, HPS_H_SCALE, 0); // r6c
- saa7146_write(dev, BCS_CTRL, 0); // r70
- saa7146_write(dev, HPS_V_SCALE, 0); // r60
- saa7146_write(dev, HPS_V_GAIN, 0); // r64
- saa7146_write(dev, CHROMA_KEY_RANGE, 0); // r74
- saa7146_write(dev, CLIP_FORMAT_CTRL, 0); // r78
- // Set HPS prescaler for port B input
- saa7146_write(dev, HPS_CTRL, (1<<30) | (0<<29) | (1<<28) | (0<<12) );
- saa7146_write(dev, MC2,
- 0 * (MASK_08 | MASK_24) | // BRS control
- 0 * (MASK_09 | MASK_25) | // a
- 0 * (MASK_10 | MASK_26) | // b
- 1 * (MASK_06 | MASK_22) | // HPS_CTRL1
- 1 * (MASK_05 | MASK_21) | // HPS_CTRL2
- 0 * (MASK_01 | MASK_15) // DEBI
- );
+ // zero all HPS registers
+ saa7146_write(dev, HPS_H_PRESCALE, 0); // r68
+ saa7146_write(dev, HPS_H_SCALE, 0); // r6c
+ saa7146_write(dev, BCS_CTRL, 0); // r70
+ saa7146_write(dev, HPS_V_SCALE, 0); // r60
+ saa7146_write(dev, HPS_V_GAIN, 0); // r64
+ saa7146_write(dev, CHROMA_KEY_RANGE, 0); // r74
+ saa7146_write(dev, CLIP_FORMAT_CTRL, 0); // r78
+ // Set HPS prescaler for port B input
+ saa7146_write(dev, HPS_CTRL, (1<<30) | (0<<29) | (1<<28) | (0<<12) );
+ saa7146_write(dev, MC2,
+ 0 * (MASK_08 | MASK_24) | // BRS control
+ 0 * (MASK_09 | MASK_25) | // a
+ 0 * (MASK_10 | MASK_26) | // b
+ 1 * (MASK_06 | MASK_22) | // HPS_CTRL1
+ 1 * (MASK_05 | MASK_21) | // HPS_CTRL2
+ 0 * (MASK_01 | MASK_15) // DEBI
+ );
#endif
// Disable RPS1 and RPS0
- saa7146_write(dev, MC1, ( MASK_29 | MASK_28));
- // RPS1 timeout disable
- saa7146_write(dev, RPS_TOV1, 0);
+ saa7146_write(dev, MC1, ( MASK_29 | MASK_28));
+ // RPS1 timeout disable
+ saa7146_write(dev, RPS_TOV1, 0);
// code for autodetection
// will wait for VBI_B event (vertical blank at port B)
@@ -521,38 +521,38 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
WRITE_RPS1(cpu_to_le32(CMD_UPLOAD |
MASK_10 | MASK_09 | MASK_08 | MASK_06 | MASK_05 | MASK_04 | MASK_03 | MASK_02 ));
#endif
- WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_VBI_B));
- WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
- WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
- WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
+ WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_VBI_B));
+ WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+ WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+ WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
#if RPS_IRQ
- // issue RPS1 interrupt to increment counter
- WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
- // at least a NOP is neede between two interrupts
- WRITE_RPS1(cpu_to_le32(CMD_NOP));
- // interrupt again
- WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+ // issue RPS1 interrupt to increment counter
+ WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+ // at least a NOP is neede between two interrupts
+ WRITE_RPS1(cpu_to_le32(CMD_NOP));
+ // interrupt again
+ WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
#endif
- WRITE_RPS1(cpu_to_le32(CMD_STOP));
+ WRITE_RPS1(cpu_to_le32(CMD_STOP));
#if RPS_IRQ
- // set event counter 1 source as RPS1 interrupt (0x03) (rE4 p53)
- // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
- // use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called
- saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
- // set event counter 1 treshold to maximum allowed value (rEC p55)
- saa7146_write(dev, ECT1R, 0x3fff );
+ // set event counter 1 source as RPS1 interrupt (0x03) (rE4 p53)
+ // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
+ // use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called
+ saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
+ // set event counter 1 treshold to maximum allowed value (rEC p55)
+ saa7146_write(dev, ECT1R, 0x3fff );
#endif
- // Fix VSYNC level
- saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
- // Set RPS1 Address register to point to RPS code (r108 p42)
- saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
- // Enable RPS1, (rFC p33)
- saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
+ // Fix VSYNC level
+ saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+ // Set RPS1 Address register to point to RPS code (r108 p42)
+ saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
+ // Enable RPS1, (rFC p33)
+ saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
- mdelay(50);
- saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
+ mdelay(50);
+ saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
mdelay(150);
@@ -560,17 +560,17 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
detected = 1;
#if RPS_IRQ
- printk("Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
+ printk("Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
#endif
// Disable RPS1
- saa7146_write(dev, MC1, ( MASK_29 ));
+ saa7146_write(dev, MC1, ( MASK_29 ));
if(detected == 0)
- printk("budget-patch not detected or saa7146 in non-default state.\n"
- "try enabling ressetting of 7146 with MASK_31 in MC1 register\n");
+ printk("budget-patch not detected or saa7146 in non-default state.\n"
+ "try enabling ressetting of 7146 with MASK_31 in MC1 register\n");
else
- printk("BUDGET-PATCH DETECTED.\n");
+ printk("BUDGET-PATCH DETECTED.\n");
/* OLD (Original design by Roberto Deza):
@@ -641,83 +641,83 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
*/
// Setup RPS1 "program" (p35)
- count = 0;
+ count = 0;
- // Wait Source Line Counter Threshold (p36)
- WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_HS));
- // Set GPIO3=1 (p42)
- WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
- WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
- WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTHI<<24));
+ // Wait Source Line Counter Threshold (p36)
+ WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_HS));
+ // Set GPIO3=1 (p42)
+ WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+ WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+ WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTHI<<24));
#if RPS_IRQ
- // issue RPS1 interrupt
- WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+ // issue RPS1 interrupt
+ WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
#endif
- // Wait reset Source Line Counter Threshold (p36)
- WRITE_RPS1(cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS));
- // Set GPIO3=0 (p42)
- WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
- WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
- WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
+ // Wait reset Source Line Counter Threshold (p36)
+ WRITE_RPS1(cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS));
+ // Set GPIO3=0 (p42)
+ WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+ WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+ WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
#if RPS_IRQ
- // issue RPS1 interrupt
- WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+ // issue RPS1 interrupt
+ WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
#endif
- // Jump to begin of RPS program (p37)
- WRITE_RPS1(cpu_to_le32(CMD_JUMP));
- WRITE_RPS1(cpu_to_le32(dev->d_rps1.dma_handle));
-
- // Fix VSYNC level
- saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
- // Set RPS1 Address register to point to RPS code (r108 p42)
- saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
- // Set Source Line Counter Threshold, using BRS (rCC p43)
- // It generates HS event every TS_HEIGHT lines
- // this is related to TS_WIDTH set in register
- // NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
- // low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
- //,then RPS_THRESH1
- // should be set to trigger every TS_HEIGHT (512) lines.
- //
- saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
+ // Jump to begin of RPS program (p37)
+ WRITE_RPS1(cpu_to_le32(CMD_JUMP));
+ WRITE_RPS1(cpu_to_le32(dev->d_rps1.dma_handle));
- // saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
- // Enable RPS1 (rFC p33)
- saa7146_write(dev, MC1, (MASK_13 | MASK_29));
-
-
- if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
- return -ENOMEM;
+ // Fix VSYNC level
+ saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+ // Set RPS1 Address register to point to RPS code (r108 p42)
+ saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
+ // Set Source Line Counter Threshold, using BRS (rCC p43)
+ // It generates HS event every TS_HEIGHT lines
+ // this is related to TS_WIDTH set in register
+ // NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
+ // low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
+ //,then RPS_THRESH1
+ // should be set to trigger every TS_HEIGHT (512) lines.
+ //
+ saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
+
+ // saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
+ // Enable RPS1 (rFC p33)
+ saa7146_write(dev, MC1, (MASK_13 | MASK_29));
+
+
+ if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
+ return -ENOMEM;
- dprintk(2, "budget: %p\n", budget);
+ dprintk(2, "budget: %p\n", budget);
- if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) {
- kfree (budget);
- return err;
- }
+ if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) {
+ kfree (budget);
+ return err;
+ }
- dev->ext_priv = budget;
+ dev->ext_priv = budget;
budget->dvb_adapter.priv = budget;
frontend_init(budget);
- return 0;
+ return 0;
}
static int budget_patch_detach (struct saa7146_dev* dev)
{
- struct budget_patch *budget = (struct budget_patch*) dev->ext_priv;
- int err;
+ struct budget_patch *budget = (struct budget_patch*) dev->ext_priv;
+ int err;
if (budget->dvb_frontend) dvb_unregister_frontend(budget->dvb_frontend);
- err = ttpci_budget_deinit (budget);
+ err = ttpci_budget_deinit (budget);
- kfree (budget);
+ kfree (budget);
- return err;
+ return err;
}
static int __init budget_patch_init(void)
@@ -727,20 +727,20 @@ static int __init budget_patch_init(void)
static void __exit budget_patch_exit(void)
{
- saa7146_unregister_extension(&budget_extension);
+ saa7146_unregister_extension(&budget_extension);
}
static struct saa7146_extension budget_extension = {
- .name = "budget_patch dvb\0",
- .flags = 0,
+ .name = "budget_patch dvb\0",
+ .flags = 0,
- .module = THIS_MODULE,
- .pci_tbl = pci_tbl,
- .attach = budget_patch_attach,
- .detach = budget_patch_detach,
+ .module = THIS_MODULE,
+ .pci_tbl = pci_tbl,
+ .attach = budget_patch_attach,
+ .detach = budget_patch_detach,
- .irq_mask = MASK_10,
- .irq_func = ttpci_budget_irq10_handler,
+ .irq_mask = MASK_10,
+ .irq_func = ttpci_budget_irq10_handler,
};
module_init(budget_patch_init);
@@ -749,4 +749,4 @@ module_exit(budget_patch_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Emard, Roberto Deza, Holger Waechtler, Michael Hunold, others");
MODULE_DESCRIPTION("Driver for full TS modified DVB-S SAA7146+AV7110 "
- "based so-called Budget Patch cards");
+ "based so-called Budget Patch cards");
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c
index 4fd8bbc..fafe640 100644
--- a/drivers/media/dvb/ttpci/budget.c
+++ b/drivers/media/dvb/ttpci/budget.c
@@ -256,7 +256,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
buf[2] = ((div & 0x18000) >> 10) | 0x95;
buf[3] = (pwr << 6) | 0x30;
- // NOTE: since we're using a prescaler of 2, we set the
+ // NOTE: since we're using a prescaler of 2, we set the
// divisor frequency to 62.5kHz and divide by 125 above
if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
@@ -565,7 +565,7 @@ static u8 read_pwm(struct budget* budget)
struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
{ .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
- if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
+ if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
pwm = 0x48;
return pwm;
@@ -593,7 +593,7 @@ static void frontend_init(struct budget *budget)
budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap);
if (budget->dvb_frontend) {
budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
- budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
+ budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
budget->dvb_frontend->ops->set_tone = budget_set_tone;
break;
}
@@ -738,7 +738,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
static struct saa7146_extension budget_extension = {
.name = "budget dvb\0",
- .flags = 0,
+ .flags = SAA7146_I2C_SHORT_DELAY,
.module = THIS_MODULE,
.pci_tbl = pci_tbl,
diff --git a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h
index c6ef496b..fdaa331 100644
--- a/drivers/media/dvb/ttpci/budget.h
+++ b/drivers/media/dvb/ttpci/budget.h
@@ -19,7 +19,7 @@ extern int budget_debug;
#endif
#define dprintk(level,args...) \
- do { if ((budget_debug & level)) { printk("%s: %s(): ",__stringify(KBUILD_MODNAME), __FUNCTION__); printk(args); } } while (0)
+ do { if ((budget_debug & level)) { printk("%s: %s(): ",__stringify(KBUILD_MODNAME), __FUNCTION__); printk(args); } } while (0)
struct budget_info {
char *name;
diff --git a/drivers/media/dvb/ttpci/fdump.c b/drivers/media/dvb/ttpci/fdump.c
index 0b478db..c90001d 100644
--- a/drivers/media/dvb/ttpci/fdump.c
+++ b/drivers/media/dvb/ttpci/fdump.c
@@ -36,7 +36,7 @@ int main(int argc, char **argv)
}
fprintf(fd_out, "\n};\n\n");
-
+
fclose(fd_in);
fclose(fd_out);
diff --git a/drivers/media/dvb/ttpci/ttpci-eeprom.c b/drivers/media/dvb/ttpci/ttpci-eeprom.c
index e9a8457..18aa22b 100644
--- a/drivers/media/dvb/ttpci/ttpci-eeprom.c
+++ b/drivers/media/dvb/ttpci/ttpci-eeprom.c
@@ -13,7 +13,7 @@
Holger Waechtler Convergence
Copyright (C) 2002-2003 Ralph Metzler <rjkm@metzlerbros.de>
- Metzler Brothers Systementwicklung GbR
+ Metzler Brothers Systementwicklung GbR
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
@@ -37,6 +37,7 @@
#include <linux/string.h>
#include <linux/i2c.h>
+#include "ttpci-eeprom.h"
#if 1
#define dprintk(x...) do { printk(x); } while (0)
@@ -47,41 +48,41 @@
static int check_mac_tt(u8 *buf)
{
- int i;
- u16 tmp = 0xffff;
-
- for (i = 0; i < 8; i++) {
- tmp = (tmp << 8) | ((tmp >> 8) ^ buf[i]);
- tmp ^= (tmp >> 4) & 0x0f;
- tmp ^= (tmp << 12) ^ ((tmp & 0xff) << 5);
- }
- tmp ^= 0xffff;
- return (((tmp >> 8) ^ buf[8]) | ((tmp & 0xff) ^ buf[9]));
+ int i;
+ u16 tmp = 0xffff;
+
+ for (i = 0; i < 8; i++) {
+ tmp = (tmp << 8) | ((tmp >> 8) ^ buf[i]);
+ tmp ^= (tmp >> 4) & 0x0f;
+ tmp ^= (tmp << 12) ^ ((tmp & 0xff) << 5);
+ }
+ tmp ^= 0xffff;
+ return (((tmp >> 8) ^ buf[8]) | ((tmp & 0xff) ^ buf[9]));
}
static int getmac_tt(u8 * decodedMAC, u8 * encodedMAC)
{
- u8 xor[20] = { 0x72, 0x23, 0x68, 0x19, 0x5c, 0xa8, 0x71, 0x2c,
+ u8 xor[20] = { 0x72, 0x23, 0x68, 0x19, 0x5c, 0xa8, 0x71, 0x2c,
0x54, 0xd3, 0x7b, 0xf1, 0x9E, 0x23, 0x16, 0xf6,
0x1d, 0x36, 0x64, 0x78};
- u8 data[20];
- int i;
+ u8 data[20];
+ int i;
/* In case there is a sig check failure have the orig contents available */
memcpy(data, encodedMAC, 20);
for (i = 0; i < 20; i++)
- data[i] ^= xor[i];
- for (i = 0; i < 10; i++)
- data[i] = ((data[2 * i + 1] << 8) | data[2 * i])
+ data[i] ^= xor[i];
+ for (i = 0; i < 10; i++)
+ data[i] = ((data[2 * i + 1] << 8) | data[2 * i])
>> ((data[2 * i + 1] >> 6) & 3);
- if (check_mac_tt(data))
- return -ENODEV;
+ if (check_mac_tt(data))
+ return -ENODEV;
decodedMAC[0] = data[2]; decodedMAC[1] = data[1]; decodedMAC[2] = data[0];
decodedMAC[3] = data[6]; decodedMAC[4] = data[5]; decodedMAC[5] = data[4];
- return 0;
+ return 0;
}
static int ttpci_eeprom_read_encodedMAC(struct i2c_adapter *adapter, u8 * encodedMAC)
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
index fd53d60..104df61 100644
--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
@@ -225,8 +225,8 @@ static int ttusb_i2c_msg(struct ttusb *ttusb,
err = ttusb_result(ttusb, b, 0x20);
- /* check if the i2c transaction was successful */
- if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
+ /* check if the i2c transaction was successful */
+ if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
if (rcv_len > 0) {
@@ -489,27 +489,27 @@ static int ttusb_send_diseqc(struct dvb_frontend* fe,
static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
{
- struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
- int ret;
- u8 data[1];
- struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) };
-
- switch(voltage) {
- case SEC_VOLTAGE_OFF:
- data[0] = 0x00;
- break;
- case SEC_VOLTAGE_13:
- data[0] = 0x44;
- break;
- case SEC_VOLTAGE_18:
- data[0] = 0x4c;
- break;
- default:
- return -EINVAL;
- };
-
- ret = i2c_transfer(&ttusb->i2c_adap, &msg, 1);
- return (ret != 1) ? -EIO : 0;
+ struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
+ int ret;
+ u8 data[1];
+ struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) };
+
+ switch(voltage) {
+ case SEC_VOLTAGE_OFF:
+ data[0] = 0x00;
+ break;
+ case SEC_VOLTAGE_13:
+ data[0] = 0x44;
+ break;
+ case SEC_VOLTAGE_18:
+ data[0] = 0x4c;
+ break;
+ default:
+ return -EINVAL;
+ };
+
+ ret = i2c_transfer(&ttusb->i2c_adap, &msg, 1);
+ return (ret != 1) ? -EIO : 0;
}
static int ttusb_update_lnb(struct ttusb *ttusb)
@@ -1184,45 +1184,45 @@ static struct tda1004x_config philips_tdm1316l_config = {
};
static u8 alps_bsbe1_inittab[] = {
- 0x01, 0x15,
- 0x02, 0x30,
- 0x03, 0x00,
- 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
- 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
- 0x06, 0x40, /* DAC not used, set to high impendance mode */
- 0x07, 0x00, /* DAC LSB */
- 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
- 0x09, 0x00, /* FIFO */
- 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
- 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
- 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
- 0x10, 0x3f, // AGC2 0x3d
- 0x11, 0x84,
- 0x12, 0xb9,
- 0x15, 0xc9, // lock detector threshold
- 0x16, 0x00,
- 0x17, 0x00,
- 0x18, 0x00,
- 0x19, 0x00,
- 0x1a, 0x00,
- 0x1f, 0x50,
- 0x20, 0x00,
- 0x21, 0x00,
- 0x22, 0x00,
- 0x23, 0x00,
- 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
- 0x29, 0x1e, // 1/2 threshold
- 0x2a, 0x14, // 2/3 threshold
- 0x2b, 0x0f, // 3/4 threshold
- 0x2c, 0x09, // 5/6 threshold
- 0x2d, 0x05, // 7/8 threshold
- 0x2e, 0x01,
- 0x31, 0x1f, // test all FECs
- 0x32, 0x19, // viterbi and synchro search
- 0x33, 0xfc, // rs control
- 0x34, 0x93, // error control
- 0x0f, 0x92,
- 0xff, 0xff
+ 0x01, 0x15,
+ 0x02, 0x30,
+ 0x03, 0x00,
+ 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
+ 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
+ 0x06, 0x40, /* DAC not used, set to high impendance mode */
+ 0x07, 0x00, /* DAC LSB */
+ 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
+ 0x09, 0x00, /* FIFO */
+ 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
+ 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
+ 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
+ 0x10, 0x3f, // AGC2 0x3d
+ 0x11, 0x84,
+ 0x12, 0xb9,
+ 0x15, 0xc9, // lock detector threshold
+ 0x16, 0x00,
+ 0x17, 0x00,
+ 0x18, 0x00,
+ 0x19, 0x00,
+ 0x1a, 0x00,
+ 0x1f, 0x50,
+ 0x20, 0x00,
+ 0x21, 0x00,
+ 0x22, 0x00,
+ 0x23, 0x00,
+ 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
+ 0x29, 0x1e, // 1/2 threshold
+ 0x2a, 0x14, // 2/3 threshold
+ 0x2b, 0x0f, // 3/4 threshold
+ 0x2c, 0x09, // 5/6 threshold
+ 0x2d, 0x05, // 7/8 threshold
+ 0x2e, 0x01,
+ 0x31, 0x1f, // test all FECs
+ 0x32, 0x19, // viterbi and synchro search
+ 0x33, 0xfc, // rs control
+ 0x34, 0x93, // error control
+ 0x0f, 0x92,
+ 0xff, 0xff
};
static u8 alps_bsru6_inittab[] = {
@@ -1350,7 +1350,7 @@ static int ttusb_novas_grundig_29504_491_pll_set(struct dvb_frontend *fe, struct
u32 div;
struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
- div = params->frequency / 125;
+ div = params->frequency / 125;
buf[0] = (div >> 8) & 0x7f;
buf[1] = div & 0xff;
@@ -1487,7 +1487,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
udev = interface_to_usbdev(intf);
- if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
+ if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
return -ENOMEM;
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h b/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
index 95ee799..8c3cd54 100644
--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
+++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
@@ -2,1643 +2,1643 @@
#include <asm/types.h>
static u8 dsp_bootcode [] = {
- 0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00,
- 0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f,
- 0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb,
- 0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8,
- 0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe,
- 0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5,
- 0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00,
- 0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8,
- 0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5,
- 0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01,
- 0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8,
- 0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8,
- 0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89,
- 0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20,
- 0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d,
- 0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02,
- 0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00,
- 0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03,
- 0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74,
- 0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11,
- 0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8,
- 0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95,
- 0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6,
- 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee,
- 0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff,
- 0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45,
- 0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3,
- 0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16,
- 0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20,
- 0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e,
- 0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95,
- 0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11,
- 0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01,
- 0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11,
- 0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00,
- 0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11,
- 0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10,
- 0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15,
- 0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21,
- 0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8,
- 0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16,
- 0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d,
- 0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8,
- 0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d,
- 0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01,
- 0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb,
- 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00,
- 0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c,
- 0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11,
- 0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e,
- 0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12,
- 0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3,
- 0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66,
- 0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87,
- 0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8,
- 0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8,
- 0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8,
- 0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12,
- 0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f,
- 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
- 0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93,
- 0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05,
- 0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0,
- 0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f,
- 0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8,
- 0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f,
- 0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93,
- 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8,
- 0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0,
- 0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
- 0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2,
- 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74,
- 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2,
- 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00,
- 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6,
- 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
- 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
- 0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
- 0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
- 0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
- 0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
- 0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
- 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
- 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
- 0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
- 0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd,
- 0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30,
- 0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff,
- 0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80,
- 0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95,
- 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a,
- 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19,
- 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15,
- 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11,
- 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b,
- 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb,
- 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
- 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2,
- 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2,
- 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1,
- 0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04,
- 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e,
- 0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01,
- 0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff,
- 0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
- 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2,
- 0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2,
- 0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1,
- 0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1,
- 0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff,
- 0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06,
- 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39,
- 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18,
- 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01,
- 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02,
- 0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11,
- 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95,
- 0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98,
- 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b,
- 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71,
- 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
- 0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15,
- 0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11,
- 0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83,
- 0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05,
- 0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8,
- 0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01,
- 0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c,
- 0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1,
- 0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9,
- 0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00,
- 0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00,
- 0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74,
- 0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74,
- 0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12,
- 0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11,
- 0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2,
- 0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2,
- 0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c,
- 0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0,
- 0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8,
- 0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
- 0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16,
- 0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
- 0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff,
- 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8,
- 0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2,
- 0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0,
- 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a,
- 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff,
- 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff,
- 0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2,
- 0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0,
- 0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8,
- 0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
- 0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a,
- 0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
- 0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff,
- 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2,
- 0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12,
- 0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58,
- 0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8,
- 0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2,
- 0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16,
- 0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58,
- 0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8,
- 0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2,
- 0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a,
- 0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00,
- 0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2,
- 0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e,
- 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00,
- 0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2,
- 0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
- 0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed,
- 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02,
- 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08,
- 0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20,
- 0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10,
- 0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08,
- 0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74,
- 0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12,
- 0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04,
- 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
- 0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
- 0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
- 0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69,
- 0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
- 0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
- 0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
- 0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41,
- 0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
- 0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57,
- 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c,
- 0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36,
- 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea,
- 0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00,
- 0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95,
- 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8,
- 0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74,
- 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73,
- 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff,
- 0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1,
- 0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01,
- 0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a,
- 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
- 0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc,
- 0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
- 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
- 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
- 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
- 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09,
- 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
- 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00,
- 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
- 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
- 0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
- 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
- 0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01,
- 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02,
- 0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03,
- 0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11,
- 0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00,
- 0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00,
- 0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95,
- 0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11,
- 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a,
- 0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00,
- 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1,
- 0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
- 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
- 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
- 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
- 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c,
- 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
- 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00,
- 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
- 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
- 0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
- 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
- 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01,
- 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02,
- 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03,
- 0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04,
- 0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d,
- 0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01,
- 0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c,
- 0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa,
- 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38,
- 0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1,
- 0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56,
- 0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95,
- 0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8,
- 0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3,
- 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2,
- 0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1,
- 0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95,
- 0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1,
- 0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00,
- 0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8,
- 0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44,
- 0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd,
- 0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8,
- 0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2,
- 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
- 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
- 0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
- 0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
- 0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
- 0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
- 0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
- 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
- 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
- 0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
- 0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff,
- 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04,
- 0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18,
- 0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d,
- 0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e,
- 0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16,
- 0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12,
- 0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c,
- 0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08,
- 0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38,
- 0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00,
- 0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6,
- 0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b,
- 0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa,
- 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c,
- 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f,
- 0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a,
- 0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a,
- 0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b,
- 0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b,
- 0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
- 0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
- 0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
- 0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11,
- 0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79,
- 0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95,
- 0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
- 0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11,
- 0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8,
- 0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
- 0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0,
- 0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8,
- 0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
- 0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00,
- 0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02,
- 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20,
- 0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73,
- 0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b,
- 0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
- 0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12,
- 0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
- 0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
- 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92,
- 0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00,
- 0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13,
- 0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01,
- 0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda,
- 0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
- 0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05,
- 0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01,
- 0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01,
- 0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8,
- 0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00,
- 0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba,
- 0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12,
- 0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13,
- 0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20,
- 0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
- 0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8,
- 0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11,
- 0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce,
- 0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30,
- 0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc,
- 0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16,
- 0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03,
- 0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45,
- 0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03,
- 0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00,
- 0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b,
- 0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff,
- 0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
- 0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9,
- 0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01,
- 0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74,
- 0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11,
- 0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9,
- 0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9,
- 0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8,
- 0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8,
- 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8,
- 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8,
- 0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9,
- 0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8,
- 0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76,
- 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8,
- 0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8,
- 0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80,
- 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80,
- 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8,
- 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8,
- 0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00,
- 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a,
- 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
- 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
- 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
- 0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1,
- 0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01,
- 0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8,
- 0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6,
- 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20,
- 0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c,
- 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00,
- 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d,
- 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09,
- 0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74,
- 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01,
- 0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
- 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
- 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
- 0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11,
- 0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00,
- 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
- 0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00,
- 0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f,
- 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80,
- 0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00,
- 0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33,
- 0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25,
- 0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82,
- 0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2,
- 0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3,
- 0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8,
- 0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39,
- 0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8,
- 0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2,
- 0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79,
- 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30,
- 0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8,
- 0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11,
- 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
- 0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79,
- 0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff,
- 0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20,
- 0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74,
- 0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72,
- 0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95,
- 0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f,
- 0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00,
- 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83,
- 0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff,
- 0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00,
- 0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91,
- 0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11,
- 0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30,
- 0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30,
- 0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08,
- 0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9,
- 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1,
- 0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b,
- 0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08,
- 0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b,
- 0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff,
- 0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00,
- 0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75,
- 0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8,
- 0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00,
- 0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74,
- 0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a,
- 0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62,
- 0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80,
- 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb,
- 0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73,
- 0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
- 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73,
- 0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20,
- 0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee,
- 0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96,
- 0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a,
- 0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
- 0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03,
- 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95,
- 0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb,
- 0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41,
- 0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13,
- 0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8,
- 0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00,
- 0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0,
- 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8,
- 0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8,
- 0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38,
- 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
- 0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81,
- 0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86,
- 0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
- 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
- 0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67,
- 0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a,
- 0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
- 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
- 0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67,
- 0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b,
- 0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30,
- 0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a,
- 0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02,
- 0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30,
- 0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a,
- 0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01,
- 0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
- 0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8,
- 0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
- 0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8,
- 0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80,
- 0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00,
- 0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
- 0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
- 0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20,
- 0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
- 0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73,
- 0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20,
- 0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73,
- 0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8,
- 0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
- 0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00,
- 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30,
- 0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20,
- 0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8,
- 0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b,
- 0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00,
- 0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08,
- 0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30,
- 0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
- 0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a,
- 0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16,
- 0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
- 0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
- 0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00,
- 0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17,
- 0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17,
- 0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d,
- 0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18,
- 0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f,
- 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01,
- 0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74,
- 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04,
- 0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
- 0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8,
- 0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72,
- 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00,
- 0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79,
- 0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00,
- 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8,
- 0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8,
- 0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00,
- 0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc,
- 0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00,
- 0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00,
- 0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12,
- 0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12,
- 0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01,
- 0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02,
- 0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11,
- 0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80,
- 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
- 0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
- 0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20,
- 0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
- 0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00,
- 0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11,
- 0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11,
- 0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80,
- 0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20,
- 0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b,
- 0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73,
- 0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
- 0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02,
- 0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb,
- 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95,
- 0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8,
- 0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e,
- 0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e,
- 0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11,
- 0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff,
- 0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00,
- 0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70,
- 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8,
- 0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12,
- 0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4,
- 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
- 0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01,
- 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8,
- 0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71,
- 0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04,
- 0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a,
- 0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00,
- 0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff,
- 0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00,
- 0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00,
- 0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00,
- 0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11,
- 0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95,
- 0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17,
- 0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15,
- 0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05,
- 0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06,
- 0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11,
- 0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06,
- 0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20,
- 0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01,
- 0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa,
- 0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00,
- 0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11,
- 0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a,
- 0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09,
- 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce,
- 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95,
- 0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73,
- 0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8,
- 0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12,
- 0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c,
- 0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11,
- 0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01,
- 0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1,
- 0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02,
- 0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87,
- 0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20,
- 0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
- 0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce,
- 0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17,
- 0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09,
- 0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74,
- 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16,
- 0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
- 0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
- 0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc,
- 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11,
- 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
- 0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16,
- 0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95,
- 0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00,
- 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
- 0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45,
- 0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae,
- 0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1,
- 0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb,
- 0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9,
- 0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
- 0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
- 0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11,
- 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
- 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
- 0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06,
- 0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00,
- 0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f,
- 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
- 0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11,
- 0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
- 0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
- 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11,
- 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
- 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
- 0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45,
- 0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06,
- 0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04,
- 0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30,
- 0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04,
- 0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0,
- 0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18,
- 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04,
- 0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86,
- 0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e,
- 0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74,
- 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e,
- 0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8,
- 0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30,
- 0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09,
- 0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10,
- 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
- 0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71,
- 0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00,
- 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95,
- 0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01,
- 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee,
- 0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99,
- 0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a,
- 0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00,
- 0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c,
- 0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01,
- 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9,
- 0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82,
- 0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01,
- 0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82,
- 0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01,
- 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8,
- 0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8,
- 0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00,
- 0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11,
- 0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1,
- 0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14,
- 0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12,
- 0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff,
- 0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13,
- 0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c,
- 0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
- 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01,
- 0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9,
- 0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02,
- 0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11,
- 0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00,
- 0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00,
- 0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa,
- 0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8,
- 0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00,
- 0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48,
- 0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8,
- 0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01,
- 0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a,
- 0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01,
- 0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a,
- 0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12,
- 0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73,
- 0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c,
- 0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81,
- 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10,
- 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1,
- 0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01,
- 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13,
- 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11,
- 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73,
- 0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01,
- 0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13,
- 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00,
- 0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a,
- 0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84,
- 0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88,
- 0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85,
- 0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00,
- 0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03,
- 0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
- 0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
- 0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84,
- 0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01,
- 0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
- 0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
- 0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff,
- 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1,
- 0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5,
- 0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06,
- 0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30,
- 0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01,
- 0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07,
- 0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b,
- 0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73,
- 0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
- 0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11,
- 0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd,
- 0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4,
- 0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60,
- 0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8,
- 0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8,
- 0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00,
- 0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20,
- 0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
- 0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73,
- 0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74,
- 0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8,
- 0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7,
- 0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0,
- 0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1,
- 0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03,
- 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11,
- 0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01,
- 0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95,
- 0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01,
- 0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c,
- 0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3,
- 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
- 0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e,
- 0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5,
- 0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87,
- 0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62,
- 0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5,
- 0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66,
- 0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87,
- 0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00,
- 0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00,
- 0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7,
- 0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6,
- 0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6,
- 0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11,
- 0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09,
- 0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
- 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
- 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
- 0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b,
- 0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73,
- 0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01,
- 0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09,
- 0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08,
- 0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07,
- 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0,
- 0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00,
- 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01,
- 0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16,
- 0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00,
- 0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02,
- 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
- 0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12,
- 0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00,
- 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81,
- 0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d,
- 0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1,
- 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
- 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c,
- 0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e,
- 0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00,
- 0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95,
- 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
- 0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00,
- 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00,
- 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e,
- 0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00,
- 0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00,
- 0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14,
- 0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c,
- 0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11,
- 0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13,
- 0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
- 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13,
- 0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d,
- 0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e,
- 0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66,
- 0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11,
- 0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32,
- 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
- 0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d,
- 0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20,
- 0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04,
- 0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
- 0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04,
- 0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1,
- 0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30,
- 0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa,
- 0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b,
- 0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8,
- 0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa,
- 0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96,
- 0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20,
- 0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16,
- 0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1,
- 0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12,
- 0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c,
- 0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03,
- 0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01,
- 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10,
- 0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8,
- 0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04,
- 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10,
- 0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc,
- 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
- 0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c,
- 0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95,
- 0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30,
- 0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01,
- 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae,
- 0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06,
- 0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03,
- 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8,
- 0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45,
- 0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
- 0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
- 0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
- 0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
- 0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
- 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
- 0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
- 0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
- 0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10,
- 0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5,
- 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10,
- 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13,
- 0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8,
- 0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd,
- 0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05,
- 0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18,
- 0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03,
- 0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33,
- 0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1,
- 0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13,
- 0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
- 0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27,
- 0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95,
- 0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30,
- 0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45,
- 0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
- 0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
- 0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
- 0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
- 0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
- 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
- 0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
- 0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
- 0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c,
- 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab,
- 0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f,
- 0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa,
- 0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f,
- 0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c,
- 0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa,
- 0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c,
- 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab,
- 0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa,
- 0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1,
- 0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95,
- 0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1,
- 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1,
- 0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c,
- 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa,
- 0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c,
- 0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00,
- 0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17,
- 0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74,
- 0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1,
- 0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c,
- 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa,
- 0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45,
- 0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05,
- 0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b,
- 0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04,
- 0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f,
- 0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
- 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16,
- 0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16,
- 0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1,
- 0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04,
- 0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73,
- 0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1,
- 0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95,
- 0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16,
- 0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
- 0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3,
- 0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45,
- 0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17,
- 0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06,
- 0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9,
- 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
- 0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00,
- 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16,
- 0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b,
- 0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31,
- 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
- 0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04,
- 0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
- 0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff,
- 0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86,
- 0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc,
- 0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11,
- 0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
- 0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81,
- 0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8,
- 0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c,
- 0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61,
- 0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8,
- 0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13,
- 0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01,
- 0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8,
- 0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10,
- 0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75,
- 0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01,
- 0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63,
- 0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8,
- 0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03,
- 0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00,
- 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b,
- 0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01,
- 0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8,
- 0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8,
- 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9,
- 0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04,
- 0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8,
- 0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20,
- 0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01,
- 0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74,
- 0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8,
- 0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68,
- 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00,
- 0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40,
- 0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f,
- 0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11,
- 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1,
- 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
- 0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0,
- 0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00,
- 0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95,
- 0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff,
- 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06,
- 0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00,
- 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
- 0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02,
- 0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9,
- 0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef,
- 0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d,
- 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
- 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17,
- 0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11,
- 0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45,
- 0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78,
- 0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2,
- 0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08,
- 0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1,
- 0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0,
- 0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95,
- 0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00,
- 0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17,
- 0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42,
- 0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb,
- 0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90,
- 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01,
- 0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01,
- 0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16,
- 0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
- 0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16,
- 0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
- 0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf,
- 0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00,
- 0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16,
- 0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9,
- 0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90,
- 0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90,
- 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc,
- 0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00,
- 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11,
- 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10,
- 0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8,
- 0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90,
- 0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01,
- 0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e,
- 0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01,
- 0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12,
- 0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04,
- 0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
- 0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
- 0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00,
- 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
- 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00,
- 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11,
- 0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07,
- 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
- 0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
- 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff,
- 0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
- 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
- 0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec,
- 0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01,
- 0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb,
- 0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00,
- 0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
- 0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08,
- 0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85,
- 0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8,
- 0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00,
- 0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02,
- 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00,
- 0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
- 0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8,
- 0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85,
- 0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06,
- 0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20,
- 0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d,
- 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11,
- 0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec,
- 0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81,
- 0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81,
- 0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
- 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff,
- 0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80,
- 0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8,
- 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
- 0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00,
- 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
- 0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17,
- 0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17,
- 0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f,
- 0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17,
- 0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3,
- 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06,
- 0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b,
- 0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07,
- 0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14,
- 0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95,
- 0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57,
- 0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6,
- 0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8,
- 0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11,
- 0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81,
- 0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07,
- 0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2,
- 0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08,
- 0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11,
- 0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81,
- 0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09,
- 0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11,
- 0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
- 0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95,
- 0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52,
- 0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55,
- 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
- 0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55,
- 0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12,
- 0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82,
- 0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73,
- 0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12,
- 0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
- 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d,
- 0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34,
- 0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13,
- 0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83,
- 0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55,
- 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
- 0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40,
- 0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40,
- 0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
- 0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95,
- 0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52,
- 0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55,
- 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
- 0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73,
- 0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12,
- 0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
- 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f,
- 0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32,
- 0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57,
- 0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40,
- 0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82,
- 0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2,
- 0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
- 0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11,
- 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e,
- 0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04,
- 0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff,
- 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20,
- 0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12,
- 0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1,
- 0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54,
- 0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54,
- 0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
- 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
- 0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2,
- 0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55,
- 0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12,
- 0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13,
- 0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56,
- 0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1,
- 0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82,
- 0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01,
- 0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80,
- 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
- 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9,
- 0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16,
- 0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a,
- 0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c,
- 0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17,
- 0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81,
- 0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53,
- 0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20,
- 0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08,
- 0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b,
- 0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06,
- 0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00,
- 0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03,
- 0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01,
- 0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08,
- 0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00,
- 0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17,
- 0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18,
- 0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c,
- 0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00,
- 0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2,
- 0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04,
- 0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14,
- 0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06,
- 0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10,
- 0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11,
- 0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05,
- 0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05,
- 0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05,
- 0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea,
- 0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07,
- 0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7,
- 0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b,
- 0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27,
- 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
- 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11,
- 0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2,
- 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10,
- 0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16,
- 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11,
- 0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
- 0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71,
- 0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b,
- 0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11,
- 0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81,
- 0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff,
- 0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86,
- 0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80,
- 0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e,
- 0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16,
- 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16,
- 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11,
- 0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
- 0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9,
- 0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03,
- 0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12,
- 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
- 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
- 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
- 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
- 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
- 0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8,
- 0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01,
- 0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12,
- 0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82,
- 0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76,
- 0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66,
- 0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b,
- 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
- 0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11,
- 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
- 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
- 0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
- 0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
- 0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11,
- 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
- 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
- 0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
- 0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
- 0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11,
- 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
- 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
- 0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
- 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
- 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
- 0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81,
- 0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
- 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73,
- 0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11,
- 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1,
- 0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
- 0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08,
- 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
- 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b,
- 0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44,
- 0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81,
- 0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
- 0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
- 0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01,
- 0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81,
- 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
- 0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
- 0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11,
- 0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93,
- 0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
- 0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10,
- 0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08,
- 0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01,
- 0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0,
- 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
- 0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95,
- 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
- 0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95,
- 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
- 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04,
- 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
- 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
- 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
- 0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c,
- 0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6,
- 0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
- 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82,
- 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1,
- 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
- 0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6,
- 0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
- 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82,
- 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
- 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
- 0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1,
- 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03,
- 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
- 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1,
- 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62,
- 0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16,
- 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05,
- 0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00,
- 0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11,
- 0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95,
- 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81,
- 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
- 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
- 0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95,
- 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c,
- 0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53,
- 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00,
- 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
- 0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1,
- 0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
- 0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20,
- 0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1,
- 0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06,
- 0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39,
- 0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1,
- 0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a,
- 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41,
- 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1,
- 0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e,
- 0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48,
- 0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1,
- 0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12,
- 0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
- 0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06,
- 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12,
- 0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82,
- 0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
- 0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd,
- 0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01,
- 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8,
- 0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80,
- 0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80,
- 0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11,
- 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
- 0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01,
- 0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11,
- 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
- 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
- 0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
- 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d,
- 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
- 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
- 0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
- 0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
- 0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
- 0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1,
- 0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73,
- 0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
- 0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95,
- 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80,
- 0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80,
- 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
- 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95,
- 0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11,
- 0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
- 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
- 0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2,
- 0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02,
- 0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6,
- 0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12,
- 0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
- 0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62,
- 0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01,
- 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11,
- 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff,
- 0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11,
- 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11,
- 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3,
- 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
- 0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff,
- 0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b,
- 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01,
- 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00,
- 0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1,
- 0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04,
- 0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24,
- 0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
- 0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08,
- 0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31,
- 0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11,
- 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16,
- 0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06,
- 0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
- 0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11,
- 0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73,
- 0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b,
- 0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8,
- 0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11,
- 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44,
- 0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95,
- 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
- 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95,
- 0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45,
- 0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c,
- 0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17,
- 0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86,
- 0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95,
- 0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
- 0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11,
- 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80,
- 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
- 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc,
- 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82,
- 0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12,
- 0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02,
- 0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1,
- 0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0,
- 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82,
- 0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
- 0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02,
- 0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1,
- 0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda,
- 0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b,
- 0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00,
- 0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
- 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9,
- 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
- 0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf,
- 0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01,
- 0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12,
- 0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01,
- 0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d,
- 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79,
- 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68,
- 0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65,
- 0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f,
- 0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e,
- 0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47,
- 0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30,
- 0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c,
- 0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62,
- 0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20,
- 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31,
- 0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31,
- 0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35,
- 0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00,
- 0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00,
- 0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01,
- 0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1,
- 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00,
- 0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02,
- 0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7,
- 0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41,
- 0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00,
- 0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40,
- 0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00,
- 0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8,
- 0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0,
- 0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81,
- 0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
- 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00,
+ 0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f,
+ 0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb,
+ 0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8,
+ 0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe,
+ 0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5,
+ 0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00,
+ 0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8,
+ 0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5,
+ 0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01,
+ 0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8,
+ 0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8,
+ 0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89,
+ 0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20,
+ 0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d,
+ 0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02,
+ 0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00,
+ 0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03,
+ 0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74,
+ 0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11,
+ 0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8,
+ 0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95,
+ 0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6,
+ 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee,
+ 0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff,
+ 0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45,
+ 0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3,
+ 0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16,
+ 0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20,
+ 0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e,
+ 0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95,
+ 0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11,
+ 0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01,
+ 0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11,
+ 0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00,
+ 0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11,
+ 0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10,
+ 0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15,
+ 0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21,
+ 0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8,
+ 0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16,
+ 0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d,
+ 0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8,
+ 0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d,
+ 0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01,
+ 0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb,
+ 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00,
+ 0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c,
+ 0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11,
+ 0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e,
+ 0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12,
+ 0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3,
+ 0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66,
+ 0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87,
+ 0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8,
+ 0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8,
+ 0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8,
+ 0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12,
+ 0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f,
+ 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
+ 0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93,
+ 0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05,
+ 0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0,
+ 0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f,
+ 0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8,
+ 0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f,
+ 0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93,
+ 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8,
+ 0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0,
+ 0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+ 0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2,
+ 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74,
+ 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2,
+ 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00,
+ 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6,
+ 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
+ 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
+ 0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
+ 0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
+ 0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
+ 0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
+ 0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
+ 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+ 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+ 0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
+ 0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd,
+ 0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30,
+ 0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff,
+ 0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80,
+ 0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95,
+ 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a,
+ 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19,
+ 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15,
+ 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11,
+ 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b,
+ 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb,
+ 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
+ 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2,
+ 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2,
+ 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1,
+ 0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04,
+ 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e,
+ 0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01,
+ 0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff,
+ 0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
+ 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2,
+ 0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2,
+ 0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1,
+ 0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1,
+ 0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff,
+ 0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06,
+ 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39,
+ 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18,
+ 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01,
+ 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02,
+ 0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11,
+ 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95,
+ 0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98,
+ 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b,
+ 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71,
+ 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
+ 0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15,
+ 0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11,
+ 0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83,
+ 0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05,
+ 0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8,
+ 0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01,
+ 0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c,
+ 0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1,
+ 0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9,
+ 0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00,
+ 0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00,
+ 0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74,
+ 0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74,
+ 0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12,
+ 0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11,
+ 0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2,
+ 0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2,
+ 0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c,
+ 0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0,
+ 0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8,
+ 0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
+ 0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16,
+ 0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
+ 0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff,
+ 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8,
+ 0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2,
+ 0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0,
+ 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a,
+ 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff,
+ 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff,
+ 0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2,
+ 0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0,
+ 0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8,
+ 0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
+ 0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a,
+ 0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
+ 0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff,
+ 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2,
+ 0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12,
+ 0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58,
+ 0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8,
+ 0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2,
+ 0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16,
+ 0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58,
+ 0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8,
+ 0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2,
+ 0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a,
+ 0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00,
+ 0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2,
+ 0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e,
+ 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00,
+ 0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2,
+ 0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+ 0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed,
+ 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02,
+ 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08,
+ 0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20,
+ 0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10,
+ 0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08,
+ 0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74,
+ 0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12,
+ 0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04,
+ 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
+ 0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
+ 0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
+ 0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69,
+ 0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
+ 0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
+ 0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
+ 0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41,
+ 0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
+ 0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57,
+ 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c,
+ 0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36,
+ 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea,
+ 0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00,
+ 0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95,
+ 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8,
+ 0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74,
+ 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73,
+ 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff,
+ 0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1,
+ 0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01,
+ 0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a,
+ 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
+ 0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc,
+ 0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
+ 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
+ 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
+ 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
+ 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09,
+ 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
+ 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00,
+ 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
+ 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
+ 0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
+ 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
+ 0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01,
+ 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02,
+ 0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03,
+ 0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11,
+ 0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00,
+ 0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00,
+ 0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95,
+ 0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11,
+ 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a,
+ 0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00,
+ 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1,
+ 0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
+ 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
+ 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
+ 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
+ 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c,
+ 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
+ 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00,
+ 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
+ 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
+ 0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
+ 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
+ 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01,
+ 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02,
+ 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03,
+ 0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04,
+ 0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d,
+ 0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01,
+ 0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c,
+ 0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa,
+ 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38,
+ 0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1,
+ 0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56,
+ 0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95,
+ 0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8,
+ 0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3,
+ 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2,
+ 0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1,
+ 0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95,
+ 0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1,
+ 0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00,
+ 0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8,
+ 0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44,
+ 0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd,
+ 0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8,
+ 0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2,
+ 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
+ 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
+ 0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
+ 0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
+ 0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
+ 0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
+ 0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
+ 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+ 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+ 0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
+ 0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff,
+ 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04,
+ 0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18,
+ 0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d,
+ 0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e,
+ 0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16,
+ 0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12,
+ 0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c,
+ 0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08,
+ 0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38,
+ 0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00,
+ 0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6,
+ 0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b,
+ 0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa,
+ 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c,
+ 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f,
+ 0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a,
+ 0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a,
+ 0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b,
+ 0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b,
+ 0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
+ 0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
+ 0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
+ 0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11,
+ 0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79,
+ 0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95,
+ 0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
+ 0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11,
+ 0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8,
+ 0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
+ 0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0,
+ 0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8,
+ 0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
+ 0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00,
+ 0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02,
+ 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20,
+ 0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73,
+ 0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b,
+ 0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+ 0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12,
+ 0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
+ 0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
+ 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92,
+ 0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00,
+ 0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13,
+ 0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01,
+ 0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda,
+ 0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+ 0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05,
+ 0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01,
+ 0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01,
+ 0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8,
+ 0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00,
+ 0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba,
+ 0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12,
+ 0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13,
+ 0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20,
+ 0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8,
+ 0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11,
+ 0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce,
+ 0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30,
+ 0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc,
+ 0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16,
+ 0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03,
+ 0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45,
+ 0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03,
+ 0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00,
+ 0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b,
+ 0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff,
+ 0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+ 0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9,
+ 0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01,
+ 0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74,
+ 0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11,
+ 0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9,
+ 0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9,
+ 0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8,
+ 0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8,
+ 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8,
+ 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8,
+ 0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9,
+ 0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8,
+ 0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76,
+ 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8,
+ 0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8,
+ 0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80,
+ 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80,
+ 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8,
+ 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8,
+ 0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00,
+ 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a,
+ 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+ 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+ 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+ 0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1,
+ 0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01,
+ 0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8,
+ 0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6,
+ 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20,
+ 0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c,
+ 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00,
+ 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d,
+ 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09,
+ 0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74,
+ 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01,
+ 0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+ 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+ 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+ 0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11,
+ 0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00,
+ 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+ 0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00,
+ 0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f,
+ 0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80,
+ 0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00,
+ 0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33,
+ 0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25,
+ 0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82,
+ 0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2,
+ 0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3,
+ 0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8,
+ 0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39,
+ 0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8,
+ 0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2,
+ 0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79,
+ 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30,
+ 0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8,
+ 0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11,
+ 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+ 0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79,
+ 0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff,
+ 0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20,
+ 0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74,
+ 0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72,
+ 0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95,
+ 0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f,
+ 0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00,
+ 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83,
+ 0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff,
+ 0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00,
+ 0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91,
+ 0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11,
+ 0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30,
+ 0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30,
+ 0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08,
+ 0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9,
+ 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1,
+ 0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b,
+ 0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08,
+ 0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b,
+ 0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff,
+ 0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00,
+ 0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75,
+ 0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8,
+ 0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00,
+ 0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74,
+ 0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a,
+ 0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62,
+ 0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80,
+ 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb,
+ 0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73,
+ 0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
+ 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73,
+ 0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20,
+ 0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee,
+ 0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96,
+ 0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a,
+ 0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
+ 0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03,
+ 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95,
+ 0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb,
+ 0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41,
+ 0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13,
+ 0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8,
+ 0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00,
+ 0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0,
+ 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8,
+ 0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8,
+ 0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38,
+ 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+ 0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81,
+ 0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86,
+ 0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
+ 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+ 0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67,
+ 0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a,
+ 0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
+ 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+ 0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67,
+ 0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b,
+ 0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30,
+ 0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a,
+ 0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02,
+ 0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30,
+ 0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a,
+ 0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01,
+ 0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
+ 0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8,
+ 0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
+ 0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8,
+ 0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80,
+ 0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00,
+ 0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
+ 0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+ 0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20,
+ 0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+ 0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73,
+ 0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20,
+ 0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73,
+ 0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8,
+ 0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
+ 0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00,
+ 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30,
+ 0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20,
+ 0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8,
+ 0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b,
+ 0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00,
+ 0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08,
+ 0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30,
+ 0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
+ 0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a,
+ 0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16,
+ 0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
+ 0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
+ 0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00,
+ 0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17,
+ 0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17,
+ 0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d,
+ 0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18,
+ 0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f,
+ 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01,
+ 0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74,
+ 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04,
+ 0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
+ 0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8,
+ 0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72,
+ 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00,
+ 0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79,
+ 0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00,
+ 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8,
+ 0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8,
+ 0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00,
+ 0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc,
+ 0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00,
+ 0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00,
+ 0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12,
+ 0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12,
+ 0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01,
+ 0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02,
+ 0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11,
+ 0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80,
+ 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
+ 0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+ 0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20,
+ 0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+ 0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00,
+ 0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11,
+ 0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11,
+ 0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80,
+ 0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20,
+ 0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b,
+ 0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73,
+ 0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+ 0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02,
+ 0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb,
+ 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95,
+ 0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8,
+ 0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e,
+ 0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e,
+ 0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11,
+ 0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff,
+ 0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00,
+ 0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70,
+ 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8,
+ 0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12,
+ 0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4,
+ 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+ 0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01,
+ 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8,
+ 0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71,
+ 0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04,
+ 0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a,
+ 0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00,
+ 0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff,
+ 0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00,
+ 0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00,
+ 0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00,
+ 0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11,
+ 0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95,
+ 0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17,
+ 0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15,
+ 0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05,
+ 0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06,
+ 0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11,
+ 0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06,
+ 0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20,
+ 0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01,
+ 0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa,
+ 0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00,
+ 0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11,
+ 0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a,
+ 0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09,
+ 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce,
+ 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95,
+ 0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73,
+ 0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8,
+ 0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12,
+ 0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c,
+ 0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11,
+ 0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01,
+ 0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1,
+ 0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02,
+ 0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87,
+ 0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20,
+ 0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
+ 0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce,
+ 0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17,
+ 0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09,
+ 0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74,
+ 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16,
+ 0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
+ 0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
+ 0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc,
+ 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11,
+ 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
+ 0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16,
+ 0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95,
+ 0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00,
+ 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
+ 0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45,
+ 0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae,
+ 0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1,
+ 0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb,
+ 0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9,
+ 0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
+ 0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
+ 0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11,
+ 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
+ 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
+ 0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06,
+ 0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00,
+ 0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f,
+ 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
+ 0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11,
+ 0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
+ 0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
+ 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11,
+ 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
+ 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
+ 0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45,
+ 0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06,
+ 0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04,
+ 0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30,
+ 0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04,
+ 0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0,
+ 0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18,
+ 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04,
+ 0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86,
+ 0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e,
+ 0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74,
+ 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e,
+ 0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8,
+ 0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30,
+ 0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09,
+ 0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10,
+ 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+ 0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71,
+ 0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00,
+ 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95,
+ 0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01,
+ 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee,
+ 0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99,
+ 0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a,
+ 0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00,
+ 0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c,
+ 0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01,
+ 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9,
+ 0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82,
+ 0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01,
+ 0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82,
+ 0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01,
+ 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8,
+ 0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8,
+ 0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00,
+ 0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11,
+ 0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1,
+ 0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14,
+ 0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12,
+ 0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff,
+ 0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13,
+ 0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c,
+ 0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
+ 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01,
+ 0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9,
+ 0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02,
+ 0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11,
+ 0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00,
+ 0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00,
+ 0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa,
+ 0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8,
+ 0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00,
+ 0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48,
+ 0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8,
+ 0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01,
+ 0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a,
+ 0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01,
+ 0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a,
+ 0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12,
+ 0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73,
+ 0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c,
+ 0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81,
+ 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10,
+ 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1,
+ 0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01,
+ 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13,
+ 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11,
+ 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73,
+ 0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01,
+ 0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13,
+ 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00,
+ 0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a,
+ 0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84,
+ 0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88,
+ 0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85,
+ 0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00,
+ 0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03,
+ 0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
+ 0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
+ 0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84,
+ 0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01,
+ 0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
+ 0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
+ 0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff,
+ 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1,
+ 0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5,
+ 0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06,
+ 0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30,
+ 0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01,
+ 0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07,
+ 0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b,
+ 0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73,
+ 0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11,
+ 0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd,
+ 0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4,
+ 0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60,
+ 0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8,
+ 0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8,
+ 0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00,
+ 0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20,
+ 0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
+ 0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73,
+ 0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74,
+ 0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8,
+ 0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7,
+ 0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0,
+ 0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1,
+ 0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03,
+ 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11,
+ 0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01,
+ 0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95,
+ 0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01,
+ 0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c,
+ 0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3,
+ 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
+ 0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e,
+ 0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5,
+ 0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87,
+ 0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62,
+ 0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5,
+ 0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66,
+ 0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87,
+ 0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00,
+ 0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00,
+ 0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7,
+ 0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6,
+ 0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6,
+ 0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11,
+ 0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09,
+ 0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+ 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+ 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+ 0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b,
+ 0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73,
+ 0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01,
+ 0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09,
+ 0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08,
+ 0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07,
+ 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0,
+ 0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00,
+ 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01,
+ 0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16,
+ 0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00,
+ 0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02,
+ 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+ 0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12,
+ 0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00,
+ 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81,
+ 0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d,
+ 0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1,
+ 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
+ 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c,
+ 0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e,
+ 0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00,
+ 0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+ 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
+ 0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00,
+ 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00,
+ 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e,
+ 0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00,
+ 0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00,
+ 0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14,
+ 0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c,
+ 0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11,
+ 0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13,
+ 0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+ 0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13,
+ 0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d,
+ 0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e,
+ 0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66,
+ 0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11,
+ 0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32,
+ 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+ 0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d,
+ 0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20,
+ 0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04,
+ 0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
+ 0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04,
+ 0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1,
+ 0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30,
+ 0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa,
+ 0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b,
+ 0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8,
+ 0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa,
+ 0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96,
+ 0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20,
+ 0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16,
+ 0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1,
+ 0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12,
+ 0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c,
+ 0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03,
+ 0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01,
+ 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10,
+ 0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8,
+ 0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04,
+ 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10,
+ 0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc,
+ 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+ 0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c,
+ 0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95,
+ 0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30,
+ 0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01,
+ 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae,
+ 0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06,
+ 0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03,
+ 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8,
+ 0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45,
+ 0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
+ 0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
+ 0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
+ 0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
+ 0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
+ 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+ 0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
+ 0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
+ 0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10,
+ 0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5,
+ 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10,
+ 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13,
+ 0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8,
+ 0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd,
+ 0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05,
+ 0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18,
+ 0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03,
+ 0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33,
+ 0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1,
+ 0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13,
+ 0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27,
+ 0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30,
+ 0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45,
+ 0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
+ 0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
+ 0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
+ 0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
+ 0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
+ 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+ 0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
+ 0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
+ 0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c,
+ 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab,
+ 0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f,
+ 0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa,
+ 0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f,
+ 0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c,
+ 0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa,
+ 0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c,
+ 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab,
+ 0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa,
+ 0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1,
+ 0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95,
+ 0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1,
+ 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1,
+ 0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c,
+ 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa,
+ 0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c,
+ 0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00,
+ 0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17,
+ 0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74,
+ 0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1,
+ 0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c,
+ 0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa,
+ 0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45,
+ 0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05,
+ 0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b,
+ 0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04,
+ 0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f,
+ 0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
+ 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16,
+ 0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16,
+ 0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1,
+ 0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04,
+ 0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73,
+ 0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1,
+ 0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16,
+ 0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3,
+ 0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45,
+ 0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17,
+ 0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06,
+ 0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9,
+ 0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+ 0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00,
+ 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16,
+ 0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b,
+ 0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31,
+ 0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+ 0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04,
+ 0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
+ 0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff,
+ 0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86,
+ 0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc,
+ 0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11,
+ 0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
+ 0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81,
+ 0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8,
+ 0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c,
+ 0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61,
+ 0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8,
+ 0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13,
+ 0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01,
+ 0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8,
+ 0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10,
+ 0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75,
+ 0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01,
+ 0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63,
+ 0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8,
+ 0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03,
+ 0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00,
+ 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b,
+ 0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01,
+ 0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8,
+ 0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8,
+ 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9,
+ 0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04,
+ 0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8,
+ 0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20,
+ 0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01,
+ 0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74,
+ 0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8,
+ 0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68,
+ 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00,
+ 0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40,
+ 0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f,
+ 0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11,
+ 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1,
+ 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
+ 0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0,
+ 0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00,
+ 0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95,
+ 0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff,
+ 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06,
+ 0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00,
+ 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
+ 0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02,
+ 0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9,
+ 0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef,
+ 0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d,
+ 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
+ 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17,
+ 0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11,
+ 0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45,
+ 0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78,
+ 0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2,
+ 0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08,
+ 0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1,
+ 0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0,
+ 0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95,
+ 0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00,
+ 0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17,
+ 0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42,
+ 0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb,
+ 0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90,
+ 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01,
+ 0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01,
+ 0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16,
+ 0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
+ 0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16,
+ 0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
+ 0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf,
+ 0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00,
+ 0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16,
+ 0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9,
+ 0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90,
+ 0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90,
+ 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc,
+ 0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00,
+ 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11,
+ 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10,
+ 0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8,
+ 0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90,
+ 0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01,
+ 0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e,
+ 0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01,
+ 0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12,
+ 0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04,
+ 0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+ 0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
+ 0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00,
+ 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
+ 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00,
+ 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11,
+ 0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07,
+ 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+ 0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
+ 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff,
+ 0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
+ 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
+ 0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec,
+ 0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01,
+ 0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb,
+ 0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00,
+ 0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
+ 0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08,
+ 0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85,
+ 0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8,
+ 0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00,
+ 0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02,
+ 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00,
+ 0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
+ 0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8,
+ 0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85,
+ 0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06,
+ 0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20,
+ 0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d,
+ 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11,
+ 0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec,
+ 0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81,
+ 0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81,
+ 0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff,
+ 0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80,
+ 0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8,
+ 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
+ 0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00,
+ 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
+ 0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17,
+ 0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17,
+ 0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f,
+ 0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17,
+ 0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3,
+ 0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06,
+ 0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b,
+ 0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07,
+ 0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14,
+ 0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95,
+ 0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57,
+ 0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6,
+ 0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8,
+ 0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11,
+ 0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81,
+ 0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07,
+ 0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2,
+ 0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08,
+ 0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11,
+ 0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81,
+ 0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09,
+ 0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11,
+ 0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
+ 0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95,
+ 0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52,
+ 0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55,
+ 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+ 0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55,
+ 0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12,
+ 0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82,
+ 0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73,
+ 0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12,
+ 0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
+ 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d,
+ 0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34,
+ 0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13,
+ 0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83,
+ 0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55,
+ 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+ 0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40,
+ 0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40,
+ 0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
+ 0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95,
+ 0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52,
+ 0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55,
+ 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+ 0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73,
+ 0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12,
+ 0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
+ 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f,
+ 0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32,
+ 0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57,
+ 0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40,
+ 0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82,
+ 0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2,
+ 0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+ 0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e,
+ 0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04,
+ 0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff,
+ 0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20,
+ 0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12,
+ 0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1,
+ 0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54,
+ 0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54,
+ 0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
+ 0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2,
+ 0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55,
+ 0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12,
+ 0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13,
+ 0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56,
+ 0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1,
+ 0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82,
+ 0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01,
+ 0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80,
+ 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9,
+ 0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16,
+ 0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a,
+ 0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c,
+ 0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17,
+ 0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81,
+ 0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53,
+ 0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20,
+ 0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08,
+ 0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b,
+ 0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06,
+ 0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00,
+ 0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03,
+ 0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08,
+ 0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00,
+ 0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17,
+ 0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18,
+ 0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c,
+ 0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00,
+ 0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2,
+ 0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04,
+ 0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14,
+ 0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06,
+ 0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10,
+ 0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11,
+ 0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05,
+ 0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05,
+ 0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05,
+ 0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea,
+ 0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07,
+ 0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7,
+ 0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b,
+ 0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27,
+ 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11,
+ 0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2,
+ 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10,
+ 0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16,
+ 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11,
+ 0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+ 0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71,
+ 0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b,
+ 0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11,
+ 0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81,
+ 0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff,
+ 0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86,
+ 0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80,
+ 0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e,
+ 0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16,
+ 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16,
+ 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11,
+ 0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+ 0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9,
+ 0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03,
+ 0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12,
+ 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+ 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+ 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+ 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+ 0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+ 0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8,
+ 0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01,
+ 0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12,
+ 0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82,
+ 0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76,
+ 0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66,
+ 0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b,
+ 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+ 0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11,
+ 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+ 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+ 0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
+ 0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
+ 0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11,
+ 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+ 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+ 0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
+ 0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
+ 0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11,
+ 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+ 0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+ 0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+ 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
+ 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
+ 0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81,
+ 0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73,
+ 0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11,
+ 0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1,
+ 0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
+ 0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08,
+ 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b,
+ 0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44,
+ 0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81,
+ 0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
+ 0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
+ 0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01,
+ 0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81,
+ 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+ 0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
+ 0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11,
+ 0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93,
+ 0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+ 0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10,
+ 0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08,
+ 0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01,
+ 0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0,
+ 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+ 0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
+ 0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95,
+ 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04,
+ 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+ 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
+ 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+ 0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c,
+ 0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6,
+ 0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+ 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82,
+ 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1,
+ 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
+ 0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6,
+ 0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+ 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82,
+ 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+ 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
+ 0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1,
+ 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03,
+ 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
+ 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1,
+ 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62,
+ 0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16,
+ 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05,
+ 0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00,
+ 0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11,
+ 0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81,
+ 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+ 0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95,
+ 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c,
+ 0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53,
+ 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00,
+ 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+ 0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1,
+ 0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+ 0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20,
+ 0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1,
+ 0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06,
+ 0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39,
+ 0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1,
+ 0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a,
+ 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41,
+ 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1,
+ 0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e,
+ 0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48,
+ 0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1,
+ 0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12,
+ 0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+ 0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06,
+ 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12,
+ 0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82,
+ 0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+ 0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd,
+ 0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01,
+ 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8,
+ 0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80,
+ 0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80,
+ 0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11,
+ 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
+ 0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01,
+ 0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11,
+ 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
+ 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
+ 0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+ 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d,
+ 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+ 0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+ 0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+ 0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
+ 0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
+ 0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1,
+ 0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73,
+ 0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+ 0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95,
+ 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80,
+ 0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80,
+ 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
+ 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95,
+ 0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11,
+ 0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
+ 0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2,
+ 0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02,
+ 0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6,
+ 0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12,
+ 0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
+ 0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62,
+ 0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01,
+ 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11,
+ 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff,
+ 0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11,
+ 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11,
+ 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3,
+ 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+ 0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff,
+ 0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b,
+ 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01,
+ 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00,
+ 0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1,
+ 0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04,
+ 0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24,
+ 0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
+ 0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08,
+ 0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31,
+ 0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11,
+ 0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16,
+ 0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06,
+ 0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+ 0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11,
+ 0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73,
+ 0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b,
+ 0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8,
+ 0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11,
+ 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44,
+ 0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95,
+ 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+ 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95,
+ 0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45,
+ 0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c,
+ 0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17,
+ 0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86,
+ 0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95,
+ 0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+ 0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11,
+ 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80,
+ 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
+ 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc,
+ 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82,
+ 0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12,
+ 0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02,
+ 0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1,
+ 0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0,
+ 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82,
+ 0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
+ 0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02,
+ 0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1,
+ 0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda,
+ 0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b,
+ 0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00,
+ 0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+ 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9,
+ 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
+ 0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf,
+ 0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01,
+ 0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12,
+ 0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01,
+ 0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d,
+ 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79,
+ 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68,
+ 0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65,
+ 0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f,
+ 0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e,
+ 0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47,
+ 0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30,
+ 0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c,
+ 0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62,
+ 0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20,
+ 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31,
+ 0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31,
+ 0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35,
+ 0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00,
+ 0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00,
+ 0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01,
+ 0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1,
+ 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00,
+ 0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02,
+ 0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7,
+ 0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41,
+ 0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00,
+ 0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40,
+ 0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00,
+ 0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8,
+ 0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0,
+ 0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81,
+ 0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+ 0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00,
};
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
index 832d179..8abc218 100644
--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
@@ -1203,7 +1203,7 @@ static int ttusb_init_rc(struct ttusb_dec *dec)
input_dev->keycode = rc_keys;
for (i = 0; i < ARRAY_SIZE(rc_keys); i++)
- set_bit(rc_keys[i], input_dev->keybit);
+ set_bit(rc_keys[i], input_dev->keybit);
input_register_device(input_dev);
@@ -1529,7 +1529,7 @@ static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
usb_free_urb(dec->irq_urb);
usb_buffer_free(dec->udev,IRQ_PACKET_SIZE,
- dec->irq_buffer, dec->irq_dma_handle);
+ dec->irq_buffer, dec->irq_dma_handle);
if (dec->rc_input_dev) {
input_unregister_device(dec->rc_input_dev);
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index 199b011..fc87efc 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -26,15 +26,12 @@ config VIDEO_BT848
module will be called bttv.
config VIDEO_BT848_DVB
- tristate "DVB/ATSC Support for bt878 based TV cards"
+ bool "DVB/ATSC Support for bt878 based TV cards"
depends on VIDEO_BT848 && DVB_CORE
select DVB_BT8XX
---help---
This adds support for DVB/ATSC cards based on the BT878 chip.
- To compile this driver as a module, choose M here: the
- module will be called dvb-bt8xx.
-
config VIDEO_SAA6588
tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
depends on VIDEO_DEV && I2C && VIDEO_BT848
@@ -191,7 +188,7 @@ config VIDEO_ZORAN
To compile this driver as a module, choose M here: the
module will be called zr36067.
-
+
config VIDEO_ZORAN_BUZ
tristate "Iomega Buz support"
depends on VIDEO_ZORAN
@@ -207,8 +204,8 @@ config VIDEO_ZORAN_DC10
config VIDEO_ZORAN_DC30
tristate "Pinnacle/Miro DC30(+) support"
- depends on VIDEO_ZORAN
- help
+ depends on VIDEO_ZORAN
+ help
Support for the Pinnacle/Miro DC30(+) MJPEG capture/playback
card. This also supports really old DC10 cards based on the
zr36050 MJPEG codec and zr36016 VFE.
@@ -263,7 +260,7 @@ config VIDEO_MXB
---help---
This is a video4linux driver for the 'Multimedia eXtension Board'
TV card by Siemens-Nixdorf.
-
+
To compile this driver as a module, choose M here: the
module will be called mxb.
@@ -277,7 +274,7 @@ config VIDEO_DPC
for SAA7146 bases boards, so if you have some unsupported
saa7146 based, analog video card, chances are good that it
will work with this skeleton driver.
-
+
To compile this driver as a module, choose M here: the
module will be called dpc7146.
@@ -288,7 +285,7 @@ config VIDEO_HEXIUM_ORION
---help---
This is a video4linux driver for the Hexium HV-PCI6 and
Orion frame grabber cards by Hexium.
-
+
To compile this driver as a module, choose M here: the
module will be called hexium_orion.
@@ -300,7 +297,7 @@ config VIDEO_HEXIUM_GEMINI
This is a video4linux driver for the Hexium Gemini frame
grabber card by Hexium. Please note that the Gemini Dual
card is *not* fully supported.
-
+
To compile this driver as a module, choose M here: the
module will be called hexium_gemini.
@@ -333,4 +330,18 @@ config VIDEO_M32R_AR_M64278
Say Y here to use the Renesas M64278E-800 camera module,
which supports VGA(640x480 pixcels) size of images.
+config VIDEO_AUDIO_DECODER
+ tristate "Add support for additional audio chipsets"
+ depends on VIDEO_DEV && I2C && EXPERIMENTAL
+ ---help---
+ Say Y here to compile drivers for WM8775 and CS53L32A audio
+ decoders.
+
+config VIDEO_DECODER
+ tristate "Add support for additional video chipsets"
+ depends on VIDEO_DEV && I2C && EXPERIMENTAL
+ ---help---
+ Say Y here to compile drivers for SAA7115, SAA7127 and CX25840
+ video decoders.
+
endmenu
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
index 3ac4659..82060f9 100644
--- a/drivers/media/video/Makefile
+++ b/drivers/media/video/Makefile
@@ -36,10 +36,11 @@ obj-$(CONFIG_VIDEO_CPIA) += cpia.o
obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o
obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o
obj-$(CONFIG_VIDEO_MEYE) += meye.o
-obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
+obj-$(CONFIG_VIDEO_SAA7134) += ir-kbd-i2c.o saa7134/
obj-$(CONFIG_VIDEO_CX88) += cx88/
obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
obj-$(CONFIG_VIDEO_EM28XX) += saa711x.o tvp5150.o
+obj-$(CONFIG_VIDEO_AUDIO_DECODER) += wm8775.o cs53l32a.o
obj-$(CONFIG_VIDEO_OVCAMCHIP) += ovcamchip/
obj-$(CONFIG_VIDEO_MXB) += saa7111.o tuner.o tda9840.o tea6415c.o tea6420.o mxb.o
obj-$(CONFIG_VIDEO_HEXIUM_ORION) += hexium_orion.o
@@ -55,4 +56,6 @@ obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
obj-$(CONFIG_VIDEO_M32R_AR_M64278) += arv.o
+obj-$(CONFIG_VIDEO_DECODER) += saa7115.o cx25840/ saa7127.o
+
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
diff --git a/drivers/media/video/bt832.c b/drivers/media/video/bt832.c
index e406395..3ca1d76 100644
--- a/drivers/media/video/bt832.c
+++ b/drivers/media/video/bt832.c
@@ -231,18 +231,18 @@ bt832_command(struct i2c_client *client, unsigned int cmd, void *arg)
static struct i2c_driver driver = {
.owner = THIS_MODULE,
- .name = "i2c bt832 driver",
- .id = -1, /* FIXME */
- .flags = I2C_DF_NOTIFY,
- .attach_adapter = bt832_probe,
- .detach_client = bt832_detach,
- .command = bt832_command,
+ .name = "i2c bt832 driver",
+ .id = -1, /* FIXME */
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = bt832_probe,
+ .detach_client = bt832_detach,
+ .command = bt832_command,
};
static struct i2c_client client_template =
{
.name = "bt832",
.flags = I2C_CLIENT_ALLOW_USE,
- .driver = &driver,
+ .driver = &driver,
};
diff --git a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c
index 3413bac..012be63 100644
--- a/drivers/media/video/bttv-cards.c
+++ b/drivers/media/video/bttv-cards.c
@@ -2133,7 +2133,10 @@ struct tvcard bttv_tvcards[] = {
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
.has_dvb = 1,
+ .has_remote = 1,
+ .gpiomask = 0x1b,
.no_gpioirq = 1,
+ .any_irq = 1,
},
[BTTV_BOARD_PV143] = {
/* Jorge Boncompte - DTI2 <jorge@dti2.net> */
@@ -2796,7 +2799,24 @@ struct tvcard bttv_tvcards[] = {
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
},
-
+ /* ---- card 0x8e ---------------------------------- */
+ [BTTV_BOARD_SABRENT_TVFM] = {
+ .name = "Sabrent TV-FM (bttv version)",
+ .video_inputs = 3,
+ .audio_inputs = 1,
+ .tuner = 0,
+ .svhs = 2,
+ .gpiomask = 0x108007,
+ .muxsel = { 2, 3, 1, 1},
+ .audiomux = { 100000, 100002, 100002, 100000},
+ .no_msp34xx = 1,
+ .no_tda9875 = 1,
+ .no_tda7432 = 1,
+ .pll = PLL_28,
+ .tuner_type = TUNER_TNF_5335MF,
+ .tuner_addr = ADDR_UNSET,
+ .has_radio = 1,
+ },
};
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -2884,7 +2904,7 @@ void __devinit bttv_idcard(struct bttv *btv)
*/
/* Some Modular Technology cards have an eeprom, but no subsystem ID */
-void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
+static void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
{
int type = -1;
@@ -3367,6 +3387,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
btv->has_remote=1;
if (!bttv_tvcards[btv->c.type].no_gpioirq)
btv->gpioirq=1;
+ if (bttv_tvcards[btv->c.type].any_irq)
+ btv->any_irq = 1;
if (bttv_tvcards[btv->c.type].audio_hook)
btv->audio_hook=bttv_tvcards[btv->c.type].audio_hook;
@@ -3857,7 +3879,7 @@ static void __devinit init_PXC200(struct bttv *btv)
* error. ERROR_CPLD_Check_Failed.
*/
/* ----------------------------------------------------------------------- */
-void
+static void
init_RTV24 (struct bttv *btv)
{
uint32_t dataRead = 0;
@@ -4081,7 +4103,7 @@ void tea5757_set_freq(struct bttv *btv, unsigned short freq)
/* ----------------------------------------------------------------------- */
/* winview */
-void winview_audio(struct bttv *btv, struct video_audio *v, int set)
+static void winview_audio(struct bttv *btv, struct video_audio *v, int set)
{
/* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
int bits_out, loops, vol, data;
diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c
index 0005741..1ddf9ba 100644
--- a/drivers/media/video/bttv-driver.c
+++ b/drivers/media/video/bttv-driver.c
@@ -727,71 +727,71 @@ void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
{
- unsigned char fl, fh, fi;
+ unsigned char fl, fh, fi;
- /* prevent overflows */
- fin/=4;
- fout/=4;
+ /* prevent overflows */
+ fin/=4;
+ fout/=4;
- fout*=12;
- fi=fout/fin;
+ fout*=12;
+ fi=fout/fin;
- fout=(fout%fin)*256;
- fh=fout/fin;
+ fout=(fout%fin)*256;
+ fh=fout/fin;
- fout=(fout%fin)*256;
- fl=fout/fin;
+ fout=(fout%fin)*256;
+ fl=fout/fin;
- btwrite(fl, BT848_PLL_F_LO);
- btwrite(fh, BT848_PLL_F_HI);
- btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
+ btwrite(fl, BT848_PLL_F_LO);
+ btwrite(fh, BT848_PLL_F_HI);
+ btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
}
static void set_pll(struct bttv *btv)
{
- int i;
+ int i;
- if (!btv->pll.pll_crystal)
- return;
+ if (!btv->pll.pll_crystal)
+ return;
if (btv->pll.pll_ofreq == btv->pll.pll_current) {
dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
- return;
- }
+ return;
+ }
- if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
- /* no PLL needed */
- if (btv->pll.pll_current == 0)
- return;
+ if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
+ /* no PLL needed */
+ if (btv->pll.pll_current == 0)
+ return;
bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
- btv->c.nr,btv->pll.pll_ifreq);
- btwrite(0x00,BT848_TGCTRL);
- btwrite(0x00,BT848_PLL_XCI);
- btv->pll.pll_current = 0;
- return;
- }
+ btv->c.nr,btv->pll.pll_ifreq);
+ btwrite(0x00,BT848_TGCTRL);
+ btwrite(0x00,BT848_PLL_XCI);
+ btv->pll.pll_current = 0;
+ return;
+ }
bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
- btv->pll.pll_ifreq, btv->pll.pll_ofreq);
+ btv->pll.pll_ifreq, btv->pll.pll_ofreq);
set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
- for (i=0; i<10; i++) {
+ for (i=0; i<10; i++) {
/* Let other people run while the PLL stabilizes */
bttv_printk(".");
msleep(10);
- if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
+ if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
btwrite(0,BT848_DSTATUS);
- } else {
- btwrite(0x08,BT848_TGCTRL);
- btv->pll.pll_current = btv->pll.pll_ofreq;
+ } else {
+ btwrite(0x08,BT848_TGCTRL);
+ btv->pll.pll_current = btv->pll.pll_ofreq;
bttv_printk(" ok\n");
- return;
- }
- }
- btv->pll.pll_current = -1;
+ return;
+ }
+ }
+ btv->pll.pll_current = -1;
bttv_printk("failed\n");
- return;
+ return;
}
/* used to switch between the bt848's analog/digital video capture modes */
@@ -1720,7 +1720,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
memset(i,0,sizeof(*i));
i->index = n;
i->type = V4L2_INPUT_TYPE_CAMERA;
- i->audioset = 1;
+ i->audioset = 0;
if (i->index == bttv_tvcards[btv->c.type].tuner) {
sprintf(i->name, "Television");
i->type = V4L2_INPUT_TYPE_TUNER;
@@ -1771,12 +1771,20 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
memset(t,0,sizeof(*t));
strcpy(t->name, "Television");
t->type = V4L2_TUNER_ANALOG_TV;
- t->rangehigh = 0xffffffffUL;
t->capability = V4L2_TUNER_CAP_NORM;
t->rxsubchans = V4L2_TUNER_SUB_MONO;
if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
t->signal = 0xffff;
{
+ struct video_tuner tuner;
+
+ memset(&tuner, 0, sizeof (tuner));
+ tuner.rangehigh = 0xffffffffUL;
+ bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner);
+ t->rangelow = tuner.rangelow;
+ t->rangehigh = tuner.rangehigh;
+ }
+ {
/* Hmmm ... */
struct video_audio va;
memset(&va, 0, sizeof(struct video_audio));
@@ -1853,7 +1861,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
}
case VIDIOC_LOG_STATUS:
{
- bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, 0);
+ bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
return 0;
}
@@ -1956,7 +1964,7 @@ static int setup_window(struct bttv_fh *fh, struct bttv *btv,
}
down(&fh->cap.lock);
- kfree(fh->ov.clips);
+ kfree(fh->ov.clips);
fh->ov.clips = clips;
fh->ov.nclips = n;
@@ -2029,19 +2037,33 @@ static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
return 0;
}
+static void
+pix_format_set_size (struct v4l2_pix_format * f,
+ const struct bttv_format * fmt,
+ unsigned int width,
+ unsigned int height)
+{
+ f->width = width;
+ f->height = height;
+
+ if (fmt->flags & FORMAT_FLAGS_PLANAR) {
+ f->bytesperline = width; /* Y plane */
+ f->sizeimage = (width * height * fmt->depth) >> 3;
+ } else {
+ f->bytesperline = (width * fmt->depth) >> 3;
+ f->sizeimage = height * f->bytesperline;
+ }
+}
+
static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
{
switch (f->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
- f->fmt.pix.width = fh->width;
- f->fmt.pix.height = fh->height;
+ pix_format_set_size (&f->fmt.pix, fh->fmt,
+ fh->width, fh->height);
f->fmt.pix.field = fh->cap.field;
f->fmt.pix.pixelformat = fh->fmt->fourcc;
- f->fmt.pix.bytesperline =
- (f->fmt.pix.width * fh->fmt->depth) >> 3;
- f->fmt.pix.sizeimage =
- f->fmt.pix.height * f->fmt.pix.bytesperline;
return 0;
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
memset(&f->fmt.win,0,sizeof(struct v4l2_window));
@@ -2106,11 +2128,9 @@ static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
f->fmt.pix.width = maxw;
if (f->fmt.pix.height > maxh)
f->fmt.pix.height = maxh;
- f->fmt.pix.width &= ~0x03;
- f->fmt.pix.bytesperline =
- (f->fmt.pix.width * fmt->depth) >> 3;
- f->fmt.pix.sizeimage =
- f->fmt.pix.height * f->fmt.pix.bytesperline;
+ pix_format_set_size (&f->fmt.pix, fmt,
+ f->fmt.pix.width & ~3,
+ f->fmt.pix.height);
return 0;
}
@@ -2278,6 +2298,15 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
retval = -EINVAL;
goto fh_unlock_and_return;
}
+ if (fmt->flags & FORMAT_FLAGS_RAW) {
+ /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL *
+ RAW_LINES * 2. F1 is stored at offset 0, F2
+ at buffer size / 2. */
+ fh->width = RAW_BPL;
+ fh->height = gbufsize / RAW_BPL;
+ btv->init.width = RAW_BPL;
+ btv->init.height = gbufsize / RAW_BPL;
+ }
fh->ovfmt = fmt;
fh->fmt = fmt;
btv->init.ovfmt = fmt;
@@ -2589,9 +2618,11 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
if (0 == v4l2)
return -EINVAL;
- strcpy(cap->driver,"bttv");
- strlcpy(cap->card,btv->video_dev->name,sizeof(cap->card));
- sprintf(cap->bus_info,"PCI:%s",pci_name(btv->c.pci));
+ memset(cap, 0, sizeof (*cap));
+ strlcpy(cap->driver, "bttv", sizeof (cap->driver));
+ strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card));
+ snprintf(cap->bus_info, sizeof (cap->bus_info),
+ "PCI:%s", pci_name(btv->c.pci));
cap->version = BTTV_VERSION_CODE;
cap->capabilities =
V4L2_CAP_VIDEO_CAPTURE |
@@ -2727,7 +2758,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
fh->ov.w.height = fb->fmt.height;
btv->init.ov.w.width = fb->fmt.width;
btv->init.ov.w.height = fb->fmt.height;
- kfree(fh->ov.clips);
+ kfree(fh->ov.clips);
fh->ov.clips = NULL;
fh->ov.nclips = 0;
@@ -2952,6 +2983,8 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait)
fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
field = videobuf_next_field(&fh->cap);
if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
+ kfree (fh->cap.read_buf);
+ fh->cap.read_buf = NULL;
up(&fh->cap.lock);
return POLLERR;
}
@@ -3667,6 +3700,10 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
int handled = 0;
btv=(struct bttv *)dev_id;
+
+ if (btv->any_irq)
+ handled = bttv_any_irq(&btv->c);
+
count=0;
while (1) {
/* get/clear interrupt status bits */
diff --git a/drivers/media/video/bttv-gpio.c b/drivers/media/video/bttv-gpio.c
index 575ce8b..616a5b7 100644
--- a/drivers/media/video/bttv-gpio.c
+++ b/drivers/media/video/bttv-gpio.c
@@ -113,6 +113,24 @@ void bttv_gpio_irq(struct bttv_core *core)
}
}
+int bttv_any_irq(struct bttv_core *core)
+{
+ struct bttv_sub_driver *drv;
+ struct bttv_sub_device *dev;
+ struct list_head *item;
+ int handled = 0;
+
+ list_for_each(item,&core->subs) {
+ dev = list_entry(item,struct bttv_sub_device,list);
+ drv = to_bttv_sub_drv(dev->dev.driver);
+ if (drv && drv->any_irq) {
+ if (drv->any_irq(dev))
+ handled = 1;
+ }
+ }
+ return handled;
+}
+
/* ----------------------------------------------------------------------- */
/* external: sub-driver register/unregister */
diff --git a/drivers/media/video/bttv.h b/drivers/media/video/bttv.h
index 124ea41..93298f0 100644
--- a/drivers/media/video/bttv.h
+++ b/drivers/media/video/bttv.h
@@ -162,6 +162,7 @@
#define BTTV_BOARD_PV_M4900 0x8b
#define BTTV_BOARD_OSPREY440 0x8c
#define BTTV_BOARD_ASOUND_SKYEYE 0x8d
+#define BTTV_BOARD_SABRENT_TVFM 0x8e
/* i2c address list */
#define I2C_TSA5522 0xc2
@@ -234,6 +235,7 @@ struct tvcard
unsigned int has_dvb:1;
unsigned int has_remote:1;
unsigned int no_gpioirq:1;
+ unsigned int any_irq:1;
/* other settings */
unsigned int pll;
@@ -333,6 +335,7 @@ struct bttv_sub_driver {
struct device_driver drv;
char wanted[BUS_ID_SIZE];
void (*gpio_irq)(struct bttv_sub_device *sub);
+ int (*any_irq)(struct bttv_sub_device *sub);
};
#define to_bttv_sub_drv(x) container_of((x), struct bttv_sub_driver, drv)
diff --git a/drivers/media/video/bttvp.h b/drivers/media/video/bttvp.h
index 386f546..1e6a563 100644
--- a/drivers/media/video/bttvp.h
+++ b/drivers/media/video/bttvp.h
@@ -45,6 +45,7 @@
#include <media/tveeprom.h>
#include <media/ir-common.h>
+
#include "bt848.h"
#include "bttv.h"
#include "btcx-risc.h"
@@ -208,6 +209,7 @@ extern struct bus_type bttv_sub_bus_type;
int bttv_sub_add_device(struct bttv_core *core, char *name);
int bttv_sub_del_devices(struct bttv_core *core);
void bttv_gpio_irq(struct bttv_core *core);
+int bttv_any_irq(struct bttv_core *core);
/* ---------------------------------------------------------- */
@@ -273,6 +275,7 @@ struct bttv {
struct bttv_pll_info pll;
int triton1;
int gpioirq;
+ int any_irq;
int use_i2c_hw;
/* old gpio interface */
diff --git a/drivers/media/video/cx25840/Makefile b/drivers/media/video/cx25840/Makefile
new file mode 100644
index 0000000..543ebac
--- /dev/null
+++ b/drivers/media/video/cx25840/Makefile
@@ -0,0 +1,6 @@
+cx25840-objs := cx25840-core.o cx25840-audio.o cx25840-firmware.o \
+ cx25840-vbi.o
+
+obj-$(CONFIG_VIDEO_DECODER) += cx25840.o
+
+EXTRA_CFLAGS += -I$(src)/..
diff --git a/drivers/media/video/cx25840/cx25840-audio.c b/drivers/media/video/cx25840/cx25840-audio.c
new file mode 100644
index 0000000..740908f
--- /dev/null
+++ b/drivers/media/video/cx25840/cx25840-audio.c
@@ -0,0 +1,368 @@
+/* cx25840 audio functions
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/audiochip.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+inline static int set_audclk_freq(struct i2c_client *client,
+ enum v4l2_audio_clock_freq freq)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ /* assert soft reset */
+ cx25840_and_or(client, 0x810, ~0x1, 0x01);
+
+ /* common for all inputs and rates */
+ /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
+ cx25840_write(client, 0x127, 0x50);
+
+ switch (state->audio_input) {
+ case AUDIO_TUNER:
+ switch (freq) {
+ case V4L2_AUDCLK_32_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f040610);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0xee39bb01);
+
+ /* src3/4/6_ctl = 0x0801f77f */
+ cx25840_write4(client, 0x900, 0x7ff70108);
+ cx25840_write4(client, 0x904, 0x7ff70108);
+ cx25840_write4(client, 0x90c, 0x7ff70108);
+ break;
+
+ case V4L2_AUDCLK_441_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f040910);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0xd66bec00);
+
+ /* src3/4/6_ctl = 0x08016d59 */
+ cx25840_write4(client, 0x900, 0x596d0108);
+ cx25840_write4(client, 0x904, 0x596d0108);
+ cx25840_write4(client, 0x90c, 0x596d0108);
+ break;
+
+ case V4L2_AUDCLK_48_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f040a10);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0xe5d69800);
+
+ /* src3/4/6_ctl = 0x08014faa */
+ cx25840_write4(client, 0x900, 0xaa4f0108);
+ cx25840_write4(client, 0x904, 0xaa4f0108);
+ cx25840_write4(client, 0x90c, 0xaa4f0108);
+ break;
+ }
+ break;
+
+ case AUDIO_EXTERN_1:
+ case AUDIO_EXTERN_2:
+ case AUDIO_INTERN:
+ case AUDIO_RADIO:
+ switch (freq) {
+ case V4L2_AUDCLK_32_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f04081e);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0x69082a01);
+
+ /* src1_ctl = 0x08010000 */
+ cx25840_write4(client, 0x8f8, 0x00000108);
+
+ /* src3/4/6_ctl = 0x08020000 */
+ cx25840_write4(client, 0x900, 0x00000208);
+ cx25840_write4(client, 0x904, 0x00000208);
+ cx25840_write4(client, 0x90c, 0x00000208);
+
+ /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */
+ cx25840_write(client, 0x127, 0x54);
+ break;
+
+ case V4L2_AUDCLK_441_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f040918);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0xd66bec00);
+
+ /* src1_ctl = 0x08010000 */
+ cx25840_write4(client, 0x8f8, 0xcd600108);
+
+ /* src3/4/6_ctl = 0x08020000 */
+ cx25840_write4(client, 0x900, 0x85730108);
+ cx25840_write4(client, 0x904, 0x85730108);
+ cx25840_write4(client, 0x90c, 0x85730108);
+ break;
+
+ case V4L2_AUDCLK_48_KHZ:
+ /* VID_PLL and AUX_PLL */
+ cx25840_write4(client, 0x108, 0x0f040a18);
+
+ /* AUX_PLL_FRAC */
+ cx25840_write4(client, 0x110, 0xe5d69800);
+
+ /* src1_ctl = 0x08010000 */
+ cx25840_write4(client, 0x8f8, 0x00800108);
+
+ /* src3/4/6_ctl = 0x08020000 */
+ cx25840_write4(client, 0x900, 0x55550108);
+ cx25840_write4(client, 0x904, 0x55550108);
+ cx25840_write4(client, 0x90c, 0x55550108);
+ break;
+ }
+ break;
+ }
+
+ /* deassert soft reset */
+ cx25840_and_or(client, 0x810, ~0x1, 0x00);
+
+ state->audclk_freq = freq;
+
+ return 0;
+}
+
+static int set_input(struct i2c_client *client, int audio_input)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ cx25840_dbg("set audio input (%d)\n", audio_input);
+
+ /* stop microcontroller */
+ cx25840_and_or(client, 0x803, ~0x10, 0);
+
+ /* Mute everything to prevent the PFFT! */
+ cx25840_write(client, 0x8d3, 0x1f);
+
+ switch (audio_input) {
+ case AUDIO_TUNER:
+ /* Set Path1 to Analog Demod Main Channel */
+ cx25840_write4(client, 0x8d0, 0x7038061f);
+
+ /* When the microcontroller detects the
+ * audio format, it will unmute the lines */
+ cx25840_and_or(client, 0x803, ~0x10, 0x10);
+ break;
+
+ case AUDIO_EXTERN_1:
+ case AUDIO_EXTERN_2:
+ case AUDIO_INTERN:
+ case AUDIO_RADIO:
+ /* Set Path1 to Serial Audio Input */
+ cx25840_write4(client, 0x8d0, 0x12100101);
+
+ /* The microcontroller should not be started for the
+ * non-tuner inputs: autodetection is specific for
+ * TV audio. */
+ break;
+
+ default:
+ cx25840_dbg("Invalid audio input selection %d\n", audio_input);
+ return -EINVAL;
+ }
+
+ state->audio_input = audio_input;
+
+ return set_audclk_freq(client, state->audclk_freq);
+}
+
+inline static int get_volume(struct i2c_client *client)
+{
+ /* Volume runs +18dB to -96dB in 1/2dB steps
+ * change to fit the msp3400 -114dB to +12dB range */
+
+ /* check PATH1_VOLUME */
+ int vol = 228 - cx25840_read(client, 0x8d4);
+ vol = (vol / 2) + 23;
+ return vol << 9;
+}
+
+inline static void set_volume(struct i2c_client *client, int volume)
+{
+ /* First convert the volume to msp3400 values (0-127) */
+ int vol = volume >> 9;
+ /* now scale it up to cx25840 values
+ * -114dB to -96dB maps to 0
+ * this should be 19, but in my testing that was 4dB too loud */
+ if (vol <= 23) {
+ vol = 0;
+ } else {
+ vol -= 23;
+ }
+
+ /* PATH1_VOLUME */
+ cx25840_write(client, 0x8d4, 228 - (vol * 2));
+}
+
+inline static int get_bass(struct i2c_client *client)
+{
+ /* bass is 49 steps +12dB to -12dB */
+
+ /* check PATH1_EQ_BASS_VOL */
+ int bass = cx25840_read(client, 0x8d9) & 0x3f;
+ bass = (((48 - bass) * 0xffff) + 47) / 48;
+ return bass;
+}
+
+inline static void set_bass(struct i2c_client *client, int bass)
+{
+ /* PATH1_EQ_BASS_VOL */
+ cx25840_and_or(client, 0x8d9, ~0x3f, 48 - (bass * 48 / 0xffff));
+}
+
+inline static int get_treble(struct i2c_client *client)
+{
+ /* treble is 49 steps +12dB to -12dB */
+
+ /* check PATH1_EQ_TREBLE_VOL */
+ int treble = cx25840_read(client, 0x8db) & 0x3f;
+ treble = (((48 - treble) * 0xffff) + 47) / 48;
+ return treble;
+}
+
+inline static void set_treble(struct i2c_client *client, int treble)
+{
+ /* PATH1_EQ_TREBLE_VOL */
+ cx25840_and_or(client, 0x8db, ~0x3f, 48 - (treble * 48 / 0xffff));
+}
+
+inline static int get_balance(struct i2c_client *client)
+{
+ /* balance is 7 bit, 0 to -96dB */
+
+ /* check PATH1_BAL_LEVEL */
+ int balance = cx25840_read(client, 0x8d5) & 0x7f;
+ /* check PATH1_BAL_LEFT */
+ if ((cx25840_read(client, 0x8d5) & 0x80) == 0)
+ balance = 0x80 - balance;
+ else
+ balance = 0x80 + balance;
+ return balance << 8;
+}
+
+inline static void set_balance(struct i2c_client *client, int balance)
+{
+ int bal = balance >> 8;
+ if (bal > 0x80) {
+ /* PATH1_BAL_LEFT */
+ cx25840_and_or(client, 0x8d5, 0x7f, 0x80);
+ /* PATH1_BAL_LEVEL */
+ cx25840_and_or(client, 0x8d5, ~0x7f, bal & 0x7f);
+ } else {
+ /* PATH1_BAL_LEFT */
+ cx25840_and_or(client, 0x8d5, 0x7f, 0x00);
+ /* PATH1_BAL_LEVEL */
+ cx25840_and_or(client, 0x8d5, ~0x7f, 0x80 - bal);
+ }
+}
+
+inline static int get_mute(struct i2c_client *client)
+{
+ /* check SRC1_MUTE_EN */
+ return cx25840_read(client, 0x8d3) & 0x2 ? 1 : 0;
+}
+
+inline static void set_mute(struct i2c_client *client, int mute)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ if (state->audio_input == AUDIO_TUNER) {
+ /* Must turn off microcontroller in order to mute sound.
+ * Not sure if this is the best method, but it does work.
+ * If the microcontroller is running, then it will undo any
+ * changes to the mute register. */
+ if (mute) {
+ /* disable microcontroller */
+ cx25840_and_or(client, 0x803, ~0x10, 0x00);
+ cx25840_write(client, 0x8d3, 0x1f);
+ } else {
+ /* enable microcontroller */
+ cx25840_and_or(client, 0x803, ~0x10, 0x10);
+ }
+ } else {
+ /* SRC1_MUTE_EN */
+ cx25840_and_or(client, 0x8d3, ~0x2, mute ? 0x02 : 0x00);
+ }
+}
+
+int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+ struct v4l2_control *ctrl = arg;
+
+ switch (cmd) {
+ case AUDC_SET_INPUT:
+ return set_input(client, *(int *)arg);
+ case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+ return set_audclk_freq(client, *(enum v4l2_audio_clock_freq *)arg);
+ case VIDIOC_G_CTRL:
+ switch (ctrl->id) {
+ case V4L2_CID_AUDIO_VOLUME:
+ ctrl->value = get_volume(client);
+ break;
+ case V4L2_CID_AUDIO_BASS:
+ ctrl->value = get_bass(client);
+ break;
+ case V4L2_CID_AUDIO_TREBLE:
+ ctrl->value = get_treble(client);
+ break;
+ case V4L2_CID_AUDIO_BALANCE:
+ ctrl->value = get_balance(client);
+ break;
+ case V4L2_CID_AUDIO_MUTE:
+ ctrl->value = get_mute(client);
+ break;
+ default:
+ return -EINVAL;
+ }
+ break;
+ case VIDIOC_S_CTRL:
+ switch (ctrl->id) {
+ case V4L2_CID_AUDIO_VOLUME:
+ set_volume(client, ctrl->value);
+ break;
+ case V4L2_CID_AUDIO_BASS:
+ set_bass(client, ctrl->value);
+ break;
+ case V4L2_CID_AUDIO_TREBLE:
+ set_treble(client, ctrl->value);
+ break;
+ case V4L2_CID_AUDIO_BALANCE:
+ set_balance(client, ctrl->value);
+ break;
+ case V4L2_CID_AUDIO_MUTE:
+ set_mute(client, ctrl->value);
+ break;
+ default:
+ return -EINVAL;
+ }
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
new file mode 100644
index 0000000..5b93723
--- /dev/null
+++ b/drivers/media/video/cx25840/cx25840-core.c
@@ -0,0 +1,1056 @@
+/* cx25840 - Conexant CX25840 audio/video decoder driver
+ *
+ * Copyright (C) 2004 Ulf Eklund
+ *
+ * Based on the saa7115 driver and on the first verison of Chris Kennedy's
+ * cx25840 driver.
+ *
+ * Changes by Tyler Trafford <tatrafford@comcast.net>
+ * - cleanup/rewrite for V4L2 API (2005)
+ *
+ * VBI support by Hans Verkuil <hverkuil@xs4all.nl>.
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/audiochip.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver");
+MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford");
+MODULE_LICENSE("GPL");
+
+static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
+
+
+int cx25840_debug = 0;
+
+module_param(cx25840_debug, bool, 0644);
+
+MODULE_PARM_DESC(cx25840_debug, "Debugging messages [0=Off (default) 1=On]");
+
+I2C_CLIENT_INSMOD;
+
+/* ----------------------------------------------------------------------- */
+
+int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
+{
+ u8 buffer[3];
+ buffer[0] = addr >> 8;
+ buffer[1] = addr & 0xff;
+ buffer[2] = value;
+ return i2c_master_send(client, buffer, 3);
+}
+
+int cx25840_write4(struct i2c_client *client, u16 addr, u32 value)
+{
+ u8 buffer[6];
+ buffer[0] = addr >> 8;
+ buffer[1] = addr & 0xff;
+ buffer[2] = value >> 24;
+ buffer[3] = (value >> 16) & 0xff;
+ buffer[4] = (value >> 8) & 0xff;
+ buffer[5] = value & 0xff;
+ return i2c_master_send(client, buffer, 6);
+}
+
+u8 cx25840_read(struct i2c_client * client, u16 addr)
+{
+ u8 buffer[2];
+ buffer[0] = addr >> 8;
+ buffer[1] = addr & 0xff;
+
+ if (i2c_master_send(client, buffer, 2) < 2)
+ return 0;
+
+ if (i2c_master_recv(client, buffer, 1) < 1)
+ return 0;
+
+ return buffer[0];
+}
+
+u32 cx25840_read4(struct i2c_client * client, u16 addr)
+{
+ u8 buffer[4];
+ buffer[0] = addr >> 8;
+ buffer[1] = addr & 0xff;
+
+ if (i2c_master_send(client, buffer, 2) < 2)
+ return 0;
+
+ if (i2c_master_recv(client, buffer, 4) < 4)
+ return 0;
+
+ return (buffer[0] << 24) | (buffer[1] << 16) |
+ (buffer[2] << 8) | buffer[3];
+}
+
+int cx25840_and_or(struct i2c_client *client, u16 addr, u8 and_mask,
+ u8 or_value)
+{
+ return cx25840_write(client, addr,
+ (cx25840_read(client, addr) & and_mask) |
+ or_value);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_input(struct i2c_client *, enum cx25840_input);
+static void input_change(struct i2c_client *);
+static void log_status(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+
+static inline void init_dll1(struct i2c_client *client)
+{
+ /* This is the Hauppauge sequence used to
+ * initialize the Delay Lock Loop 1 (ADC DLL). */
+ cx25840_write(client, 0x159, 0x23);
+ cx25840_write(client, 0x15a, 0x87);
+ cx25840_write(client, 0x15b, 0x06);
+ cx25840_write(client, 0x159, 0xe1);
+ cx25840_write(client, 0x15a, 0x86);
+ cx25840_write(client, 0x159, 0xe0);
+ cx25840_write(client, 0x159, 0xe1);
+ cx25840_write(client, 0x15b, 0x10);
+}
+
+static inline void init_dll2(struct i2c_client *client)
+{
+ /* This is the Hauppauge sequence used to
+ * initialize the Delay Lock Loop 2 (ADC DLL). */
+ cx25840_write(client, 0x15d, 0xe3);
+ cx25840_write(client, 0x15e, 0x86);
+ cx25840_write(client, 0x15f, 0x06);
+ cx25840_write(client, 0x15d, 0xe1);
+ cx25840_write(client, 0x15d, 0xe0);
+ cx25840_write(client, 0x15d, 0xe1);
+}
+
+static void cx25840_initialize(struct i2c_client *client, int loadfw)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ /* datasheet startup in numbered steps, refer to page 3-77 */
+ /* 2. */
+ 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. */
+ cx25840_write(client, 0x000, 0x04);
+ /* 3. */
+ init_dll1(client);
+ init_dll2(client);
+ cx25840_write(client, 0x136, 0x0a);
+ /* 4. */
+ cx25840_write(client, 0x13c, 0x01);
+ cx25840_write(client, 0x13c, 0x00);
+ /* 5. */
+ if (loadfw)
+ cx25840_loadfw(client);
+ /* 6. */
+ cx25840_write(client, 0x115, 0x8c);
+ cx25840_write(client, 0x116, 0x07);
+ cx25840_write(client, 0x118, 0x02);
+ /* 7. */
+ cx25840_write(client, 0x4a5, 0x80);
+ cx25840_write(client, 0x4a5, 0x00);
+ cx25840_write(client, 0x402, 0x00);
+ /* 8. */
+ cx25840_write(client, 0x401, 0x18);
+ cx25840_write(client, 0x4a2, 0x10);
+ cx25840_write(client, 0x402, 0x04);
+ /* 10. */
+ cx25840_write(client, 0x8d3, 0x1f);
+ cx25840_write(client, 0x8e3, 0x03);
+
+ cx25840_vbi_setup(client);
+
+ /* trial and error says these are needed to get audio */
+ cx25840_write(client, 0x914, 0xa0);
+ cx25840_write(client, 0x918, 0xa0);
+ cx25840_write(client, 0x919, 0x01);
+
+ /* stereo prefered */
+ cx25840_write(client, 0x809, 0x04);
+ /* AC97 shift */
+ cx25840_write(client, 0x8cf, 0x0f);
+
+ /* (re)set video input */
+ set_input(client, state->input);
+ /* (re)set audio input */
+ cx25840_audio(client, AUDC_SET_INPUT, &state->audio_input);
+
+ /* start microcontroller */
+ cx25840_and_or(client, 0x803, ~0x10, 0x10);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void input_change(struct i2c_client *client)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+ v4l2_std_id std = cx25840_get_v4lstd(client);
+
+ /* Note: perhaps V4L2_STD_PAL_M should be handled as V4L2_STD_NTSC
+ instead of V4L2_STD_PAL. Someone needs to test this. */
+ if (std & V4L2_STD_PAL) {
+ /* Follow tuner change procedure for PAL */
+ cx25840_write(client, 0x808, 0xff);
+ cx25840_write(client, 0x80b, 0x10);
+ } else if (std & V4L2_STD_SECAM) {
+ /* Select autodetect for SECAM */
+ cx25840_write(client, 0x808, 0xff);
+ cx25840_write(client, 0x80b, 0x10);
+ } else if (std & V4L2_STD_NTSC) {
+ /* NTSC */
+ if (state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
+ /* Certain Hauppauge PVR150 models have a hardware bug
+ that causes audio to drop out. For these models the
+ audio standard must be set explicitly.
+ To be precise: it affects cards with tuner models
+ 85, 99 and 112 (model numbers from tveeprom). */
+ if (std == V4L2_STD_NTSC_M_JP) {
+ /* Japan uses EIAJ audio standard */
+ cx25840_write(client, 0x808, 0x2f);
+ } else {
+ /* Others use the BTSC audio standard */
+ cx25840_write(client, 0x808, 0x1f);
+ }
+ /* South Korea uses the A2-M (aka Zweiton M) audio
+ standard, and should set 0x808 to 0x3f, but I don't
+ know how to detect this. */
+ } else if (std == V4L2_STD_NTSC_M_JP) {
+ /* Japan uses EIAJ audio standard */
+ cx25840_write(client, 0x808, 0xf7);
+ } else {
+ /* Others use the BTSC audio standard */
+ cx25840_write(client, 0x808, 0xf6);
+ }
+ /* South Korea uses the A2-M (aka Zweiton M) audio standard,
+ and should set 0x808 to 0xf8, but I don't know how to
+ detect this. */
+ cx25840_write(client, 0x80b, 0x00);
+ }
+
+ if (cx25840_read(client, 0x803) & 0x10) {
+ /* restart audio decoder microcontroller */
+ cx25840_and_or(client, 0x803, ~0x10, 0x00);
+ cx25840_and_or(client, 0x803, ~0x10, 0x10);
+ }
+}
+
+static int set_input(struct i2c_client *client, enum cx25840_input input)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ cx25840_dbg("decoder set input (%d)\n", input);
+
+ switch (input) {
+ case CX25840_TUNER:
+ cx25840_dbg("now setting Tuner input\n");
+
+ if (state->cardtype == CARDTYPE_PVR150 ||
+ state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
+ /* CH_SEL_ADC2=1 */
+ cx25840_and_or(client, 0x102, ~0x2, 0x02);
+ }
+
+ /* Video Input Control */
+ if (state->cardtype == CARDTYPE_PG600) {
+ cx25840_write(client, 0x103, 0x11);
+ } else {
+ cx25840_write(client, 0x103, 0x46);
+ }
+
+ /* INPUT_MODE=0 */
+ cx25840_and_or(client, 0x401, ~0x6, 0x00);
+ break;
+
+ case CX25840_COMPOSITE0:
+ case CX25840_COMPOSITE1:
+ cx25840_dbg("now setting Composite input\n");
+
+ /* Video Input Control */
+ if (state->cardtype == CARDTYPE_PG600) {
+ cx25840_write(client, 0x103, 0x00);
+ } else {
+ cx25840_write(client, 0x103, 0x02);
+ }
+
+ /* INPUT_MODE=0 */
+ cx25840_and_or(client, 0x401, ~0x6, 0x00);
+ break;
+
+ case CX25840_SVIDEO0:
+ case CX25840_SVIDEO1:
+ cx25840_dbg("now setting S-Video input\n");
+
+ /* CH_SEL_ADC2=0 */
+ cx25840_and_or(client, 0x102, ~0x2, 0x00);
+
+ /* Video Input Control */
+ if (state->cardtype == CARDTYPE_PG600) {
+ cx25840_write(client, 0x103, 0x02);
+ } else {
+ cx25840_write(client, 0x103, 0x10);
+ }
+
+ /* INPUT_MODE=1 */
+ cx25840_and_or(client, 0x401, ~0x6, 0x02);
+ break;
+
+ default:
+ cx25840_err("%d is not a valid input!\n", input);
+ return -EINVAL;
+ }
+
+ state->input = input;
+ input_change(client);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_v4lstd(struct i2c_client *client, v4l2_std_id std)
+{
+ u8 fmt=0; /* zero is autodetect */
+
+ /* First tests should be against specific std */
+ if (std & V4L2_STD_NTSC_M_JP) {
+ fmt=0x2;
+ } else if (std & V4L2_STD_NTSC_443) {
+ fmt=0x3;
+ } else if (std & V4L2_STD_PAL_M) {
+ fmt=0x5;
+ } else if (std & V4L2_STD_PAL_N) {
+ fmt=0x6;
+ } else if (std & V4L2_STD_PAL_Nc) {
+ fmt=0x7;
+ } else if (std & V4L2_STD_PAL_60) {
+ fmt=0x8;
+ } else {
+ /* Then, test against generic ones */
+ if (std & V4L2_STD_NTSC) {
+ fmt=0x1;
+ } else if (std & V4L2_STD_PAL) {
+ fmt=0x4;
+ } else if (std & V4L2_STD_SECAM) {
+ fmt=0xc;
+ }
+ }
+
+ cx25840_and_or(client, 0x400, ~0xf, fmt);
+ cx25840_vbi_setup(client);
+ return 0;
+}
+
+v4l2_std_id cx25840_get_v4lstd(struct i2c_client * client)
+{
+ /* check VID_FMT_SEL first */
+ u8 fmt = cx25840_read(client, 0x400) & 0xf;
+
+ if (!fmt) {
+ /* check AFD_FMT_STAT if set to autodetect */
+ fmt = cx25840_read(client, 0x40d) & 0xf;
+ }
+
+ switch (fmt) {
+ case 0x1: return V4L2_STD_NTSC_M;
+ case 0x2: return V4L2_STD_NTSC_M_JP;
+ case 0x3: return V4L2_STD_NTSC_443;
+ case 0x4: return V4L2_STD_PAL;
+ case 0x5: return V4L2_STD_PAL_M;
+ case 0x6: return V4L2_STD_PAL_N;
+ case 0x7: return V4L2_STD_PAL_Nc;
+ case 0x8: return V4L2_STD_PAL_60;
+ case 0xc: return V4L2_STD_SECAM;
+ default: return V4L2_STD_UNKNOWN;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ switch (ctrl->id) {
+ case CX25840_CID_CARDTYPE:
+ switch (ctrl->value) {
+ case CARDTYPE_PVR150:
+ case CARDTYPE_PVR150_WORKAROUND:
+ case CARDTYPE_PG600:
+ state->cardtype = ctrl->value;
+ break;
+ default:
+ return -ERANGE;
+ }
+
+ set_input(client, state->input);
+ break;
+
+ case V4L2_CID_BRIGHTNESS:
+ if (ctrl->value < 0 || ctrl->value > 255) {
+ cx25840_err("invalid brightness setting %d\n",
+ ctrl->value);
+ return -ERANGE;
+ }
+
+ cx25840_write(client, 0x414, ctrl->value - 128);
+ break;
+
+ case V4L2_CID_CONTRAST:
+ if (ctrl->value < 0 || ctrl->value > 127) {
+ cx25840_err("invalid contrast setting %d\n",
+ ctrl->value);
+ return -ERANGE;
+ }
+
+ cx25840_write(client, 0x415, ctrl->value << 1);
+ break;
+
+ case V4L2_CID_SATURATION:
+ if (ctrl->value < 0 || ctrl->value > 127) {
+ cx25840_err("invalid saturation setting %d\n",
+ ctrl->value);
+ return -ERANGE;
+ }
+
+ cx25840_write(client, 0x420, ctrl->value << 1);
+ cx25840_write(client, 0x421, ctrl->value << 1);
+ break;
+
+ case V4L2_CID_HUE:
+ if (ctrl->value < -127 || ctrl->value > 127) {
+ cx25840_err("invalid hue setting %d\n", ctrl->value);
+ return -ERANGE;
+ }
+
+ cx25840_write(client, 0x422, ctrl->value);
+ break;
+
+ case V4L2_CID_AUDIO_VOLUME:
+ case V4L2_CID_AUDIO_BASS:
+ case V4L2_CID_AUDIO_TREBLE:
+ case V4L2_CID_AUDIO_BALANCE:
+ case V4L2_CID_AUDIO_MUTE:
+ return cx25840_audio(client, VIDIOC_S_CTRL, ctrl);
+ }
+
+ return 0;
+}
+
+static int get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+
+ switch (ctrl->id) {
+ case CX25840_CID_CARDTYPE:
+ ctrl->value = state->cardtype;
+ break;
+ case V4L2_CID_BRIGHTNESS:
+ ctrl->value = cx25840_read(client, 0x414) + 128;
+ break;
+ case V4L2_CID_CONTRAST:
+ ctrl->value = cx25840_read(client, 0x415) >> 1;
+ break;
+ case V4L2_CID_SATURATION:
+ ctrl->value = cx25840_read(client, 0x420) >> 1;
+ break;
+ case V4L2_CID_HUE:
+ ctrl->value = cx25840_read(client, 0x422);
+ break;
+ case V4L2_CID_AUDIO_VOLUME:
+ case V4L2_CID_AUDIO_BASS:
+ case V4L2_CID_AUDIO_TREBLE:
+ case V4L2_CID_AUDIO_BALANCE:
+ case V4L2_CID_AUDIO_MUTE:
+ return cx25840_audio(client, VIDIOC_G_CTRL, ctrl);
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+ switch (fmt->type) {
+ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+ return cx25840_vbi(client, VIDIOC_G_FMT, fmt);
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+ struct v4l2_pix_format *pix;
+ int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
+ int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_NTSC);
+
+ switch (fmt->type) {
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ pix = &(fmt->fmt.pix);
+
+ Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
+ Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
+
+ Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
+ Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
+
+ Vlines = pix->height + (is_pal ? 4 : 7);
+
+ if ((pix->width * 16 < Hsrc) || (Hsrc < pix->width) ||
+ (Vlines * 8 < Vsrc) || (Vsrc < Vlines)) {
+ cx25840_err("%dx%d is not a valid size!\n",
+ pix->width, pix->height);
+ return -ERANGE;
+ }
+
+ HSC = (Hsrc * (1 << 20)) / pix->width - (1 << 20);
+ VSC = (1 << 16) - (Vsrc * (1 << 9) / Vlines - (1 << 9));
+ VSC &= 0x1fff;
+
+ if (pix->width >= 385)
+ filter = 0;
+ else if (pix->width > 192)
+ filter = 1;
+ else if (pix->width > 96)
+ filter = 2;
+ else
+ filter = 3;
+
+ cx25840_dbg("decoder set size %dx%d -> scale %ux%u\n",
+ pix->width, pix->height, HSC, VSC);
+
+ /* HSCALE=HSC */
+ cx25840_write(client, 0x418, HSC & 0xff);
+ cx25840_write(client, 0x419, (HSC >> 8) & 0xff);
+ cx25840_write(client, 0x41a, HSC >> 16);
+ /* VSCALE=VSC */
+ cx25840_write(client, 0x41c, VSC & 0xff);
+ cx25840_write(client, 0x41d, VSC >> 8);
+ /* VS_INTRLACE=1 VFILT=filter */
+ cx25840_write(client, 0x41e, 0x8 | filter);
+ break;
+
+ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+ return cx25840_vbi(client, VIDIOC_S_FMT, fmt);
+
+ case V4L2_BUF_TYPE_VBI_CAPTURE:
+ return cx25840_vbi(client, VIDIOC_S_FMT, fmt);
+
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int cx25840_command(struct i2c_client *client, unsigned int cmd,
+ void *arg)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+ struct v4l2_tuner *vt = arg;
+ int result = 0;
+
+ switch (cmd) {
+ case 0:
+ break;
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+ /* ioctls to allow direct access to the
+ * cx25840 registers for testing */
+ case VIDIOC_INT_G_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_CX25840)
+ return -EINVAL;
+ reg->val = cx25840_read(client, reg->reg & 0x0fff);
+ break;
+ }
+
+ case VIDIOC_INT_S_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_CX25840)
+ return -EINVAL;
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+ cx25840_write(client, reg->reg & 0x0fff, reg->val & 0xff);
+ break;
+ }
+#endif
+
+ case VIDIOC_INT_DECODE_VBI_LINE:
+ return cx25840_vbi(client, cmd, arg);
+
+ case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+ case AUDC_SET_INPUT:
+ result = cx25840_audio(client, cmd, arg);
+ break;
+
+ case VIDIOC_STREAMON:
+ cx25840_dbg("enable output\n");
+ cx25840_write(client, 0x115, 0x8c);
+ cx25840_write(client, 0x116, 0x07);
+ break;
+
+ case VIDIOC_STREAMOFF:
+ cx25840_dbg("disable output\n");
+ cx25840_write(client, 0x115, 0x00);
+ cx25840_write(client, 0x116, 0x00);
+ break;
+
+ case VIDIOC_LOG_STATUS:
+ log_status(client);
+ break;
+
+ case VIDIOC_G_CTRL:
+ result = get_v4lctrl(client, (struct v4l2_control *)arg);
+ break;
+
+ case VIDIOC_S_CTRL:
+ result = set_v4lctrl(client, (struct v4l2_control *)arg);
+ break;
+
+ case VIDIOC_G_STD:
+ *(v4l2_std_id *)arg = cx25840_get_v4lstd(client);
+ break;
+
+ case VIDIOC_S_STD:
+ result = set_v4lstd(client, *(v4l2_std_id *)arg);
+ break;
+
+ case VIDIOC_G_INPUT:
+ *(int *)arg = state->input;
+ break;
+
+ case VIDIOC_S_INPUT:
+ result = set_input(client, *(int *)arg);
+ break;
+
+ case VIDIOC_S_FREQUENCY:
+ input_change(client);
+ break;
+
+ case VIDIOC_G_TUNER:
+ {
+ u8 mode = cx25840_read(client, 0x804);
+ u8 pref = cx25840_read(client, 0x809) & 0xf;
+ u8 vpres = cx25840_read(client, 0x80a) & 0x10;
+ int val = 0;
+
+ vt->capability |=
+ V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
+ V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
+
+ vt->signal = vpres ? 0xffff : 0x0;
+
+ /* get rxsubchans and audmode */
+ if ((mode & 0xf) == 1)
+ val |= V4L2_TUNER_SUB_STEREO;
+ else
+ val |= V4L2_TUNER_SUB_MONO;
+
+ if (mode == 2 || mode == 4)
+ val |= V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
+
+ if (mode & 0x10)
+ val |= V4L2_TUNER_SUB_SAP;
+
+ vt->rxsubchans = val;
+
+ switch (pref) {
+ case 0:
+ vt->audmode = V4L2_TUNER_MODE_MONO;
+ break;
+ case 1:
+ case 2:
+ vt->audmode = V4L2_TUNER_MODE_LANG2;
+ break;
+ case 4:
+ default:
+ vt->audmode = V4L2_TUNER_MODE_STEREO;
+ }
+ break;
+ }
+
+ case VIDIOC_S_TUNER:
+ switch (vt->audmode) {
+ case V4L2_TUNER_MODE_MONO:
+ case V4L2_TUNER_MODE_LANG1:
+ /* Force PREF_MODE to MONO */
+ cx25840_and_or(client, 0x809, ~0xf, 0x00);
+ break;
+ case V4L2_TUNER_MODE_STEREO:
+ /* Force PREF_MODE to STEREO */
+ cx25840_and_or(client, 0x809, ~0xf, 0x04);
+ break;
+ case V4L2_TUNER_MODE_LANG2:
+ /* Force PREF_MODE to LANG2 */
+ cx25840_and_or(client, 0x809, ~0xf, 0x01);
+ break;
+ }
+ break;
+
+ case VIDIOC_G_FMT:
+ result = get_v4lfmt(client, (struct v4l2_format *)arg);
+ break;
+
+ case VIDIOC_S_FMT:
+ result = set_v4lfmt(client, (struct v4l2_format *)arg);
+ break;
+
+ case VIDIOC_INT_RESET:
+ cx25840_initialize(client, 0);
+ break;
+
+ case VIDIOC_INT_G_CHIP_IDENT:
+ *(enum v4l2_chip_ident *)arg =
+ V4L2_IDENT_CX25840 + ((cx25840_read(client, 0x100) >> 4) & 0xf);
+ break;
+
+ default:
+ cx25840_err("invalid ioctl %x\n", cmd);
+ return -EINVAL;
+ }
+
+ return result;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_cx25840;
+
+static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
+ int kind)
+{
+ struct i2c_client *client;
+ struct cx25840_state *state;
+ u16 device_id;
+
+ /* Check if the adapter supports the needed features
+ * Not until kernel version 2.6.11 did the bit-algo
+ * correctly report that it would do an I2C-level xfer */
+ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
+ return 0;
+
+ client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+ if (client == 0)
+ return -ENOMEM;
+
+ memset(client, 0, sizeof(struct i2c_client));
+ client->addr = address;
+ client->adapter = adapter;
+ client->driver = &i2c_driver_cx25840;
+ client->flags = I2C_CLIENT_ALLOW_USE;
+ snprintf(client->name, sizeof(client->name) - 1, "cx25840");
+
+ cx25840_dbg("detecting cx25840 client on address 0x%x\n", address << 1);
+
+ device_id = cx25840_read(client, 0x101) << 8;
+ device_id |= cx25840_read(client, 0x100);
+
+ /* The high byte of the device ID should be
+ * 0x84 if chip is present */
+ if ((device_id & 0xff00) != 0x8400) {
+ cx25840_dbg("cx25840 not found\n");
+ kfree(client);
+ return 0;
+ }
+
+ cx25840_info("cx25%3x-2%x found @ 0x%x (%s)\n",
+ (device_id & 0xfff0) >> 4,
+ (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1 : 3,
+ address << 1, adapter->name);
+
+ state = kmalloc(sizeof(struct cx25840_state), GFP_KERNEL);
+ if (state == NULL) {
+ kfree(client);
+ return -ENOMEM;
+ }
+
+ i2c_set_clientdata(client, state);
+ memset(state, 0, sizeof(struct cx25840_state));
+ state->input = CX25840_TUNER;
+ state->audclk_freq = V4L2_AUDCLK_48_KHZ;
+ state->audio_input = AUDIO_TUNER;
+ state->cardtype = CARDTYPE_PVR150;
+
+ cx25840_initialize(client, 1);
+
+ i2c_attach_client(client);
+
+ return 0;
+}
+
+static int cx25840_attach_adapter(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+ if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+ if (adapter->id == I2C_HW_B_BT848)
+#endif
+ return i2c_probe(adapter, &addr_data, &cx25840_detect_client);
+ return 0;
+}
+
+static int cx25840_detach_client(struct i2c_client *client)
+{
+ struct cx25840_state *state = i2c_get_clientdata(client);
+ int err;
+
+ err = i2c_detach_client(client);
+ if (err) {
+ return err;
+ }
+
+ kfree(state);
+ kfree(client);
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_cx25840 = {
+ .name = "cx25840",
+
+ .id = I2C_DRIVERID_CX25840,
+ .flags = I2C_DF_NOTIFY,
+
+ .attach_adapter = cx25840_attach_adapter,
+ .detach_client = cx25840_detach_client,
+ .command = cx25840_command,
+ .owner = THIS_MODULE,
+};
+
+
+static int __init m__init(void)
+{
+ return i2c_add_driver(&i2c_driver_cx25840);
+}
+
+static void __exit m__exit(void)
+{
+ i2c_del_driver(&i2c_driver_cx25840);
+}
+
+module_init(m__init);
+module_exit(m__exit);
+
+/* ----------------------------------------------------------------------- */
+
+static void log_status(struct i2c_client *client)
+{
+ static const char *const fmt_strs[] = {
+ "0x0",
+ "NTSC-M", "NTSC-J", "NTSC-4.43",
+ "PAL-BDGHI", "PAL-M", "PAL-N", "PAL-Nc", "PAL-60",
+ "0x9", "0xA", "0xB",
+ "SECAM",
+ "0xD", "0xE", "0xF"
+ };
+
+ struct cx25840_state *state = i2c_get_clientdata(client);
+ u8 microctrl_vidfmt = cx25840_read(client, 0x80a);
+ u8 vidfmt_sel = cx25840_read(client, 0x400) & 0xf;
+ u8 gen_stat1 = cx25840_read(client, 0x40d);
+ u8 download_ctl = cx25840_read(client, 0x803);
+ u8 mod_det_stat0 = cx25840_read(client, 0x804);
+ u8 mod_det_stat1 = cx25840_read(client, 0x805);
+ u8 audio_config = cx25840_read(client, 0x808);
+ u8 pref_mode = cx25840_read(client, 0x809);
+ u8 afc0 = cx25840_read(client, 0x80b);
+ u8 mute_ctl = cx25840_read(client, 0x8d3);
+ char *p;
+
+ cx25840_info("Video signal: %spresent\n",
+ (microctrl_vidfmt & 0x10) ? "" : "not ");
+ cx25840_info("Detected format: %s\n",
+ fmt_strs[gen_stat1 & 0xf]);
+
+ switch (mod_det_stat0) {
+ case 0x00: p = "mono"; break;
+ case 0x01: p = "stereo"; break;
+ case 0x02: p = "dual"; break;
+ 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";
+ }
+ cx25840_info("Detected audio mode: %s\n", p);
+
+ switch (mod_det_stat1) {
+ case 0x00: p = "not defined"; break;
+ case 0x01: p = "EIAJ"; break;
+ case 0x02: p = "A2-M"; break;
+ case 0x03: p = "A2-BG"; break;
+ case 0x04: p = "A2-DK1"; break;
+ case 0x05: p = "A2-DK2"; break;
+ case 0x06: p = "A2-DK3"; break;
+ 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";
+ }
+ cx25840_info("Detected audio standard: %s\n", p);
+ cx25840_info("Audio muted: %s\n",
+ (mute_ctl & 0x2) ? "yes" : "no");
+ cx25840_info("Audio microcontroller: %s\n",
+ (download_ctl & 0x10) ? "running" : "stopped");
+
+ switch (audio_config >> 4) {
+ case 0x00: p = "undefined"; break;
+ case 0x01: p = "BTSC"; break;
+ case 0x02: p = "EIAJ"; break;
+ case 0x03: p = "A2-M"; break;
+ case 0x04: p = "A2-BG"; break;
+ case 0x05: 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";
+ }
+ cx25840_info("Configured audio standard: %s\n", p);
+
+ if ((audio_config >> 4) < 0xF) {
+ switch (audio_config & 0xF) {
+ case 0x00: p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)"; break;
+ case 0x01: p = "MONO2 (LANGUAGE B)"; break;
+ case 0x02: p = "MONO3 (STEREO forced MONO)"; break;
+ case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; 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";
+ }
+ cx25840_info("Configured audio mode: %s\n", p);
+ } else {
+ switch (audio_config & 0xF) {
+ case 0x00: p = "BG"; break;
+ case 0x01: p = "DK1"; break;
+ case 0x02: p = "DK2"; break;
+ case 0x03: p = "DK3"; 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";
+ }
+ cx25840_info("Configured audio system: %s\n", p);
+ }
+
+ cx25840_info("Specified standard: %s\n",
+ vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection");
+
+ switch (state->input) {
+ case CX25840_COMPOSITE0: p = "Composite 0"; break;
+ case CX25840_COMPOSITE1: p = "Composite 1"; break;
+ case CX25840_SVIDEO0: p = "S-Video 0"; break;
+ case CX25840_SVIDEO1: p = "S-Video 1"; break;
+ case CX25840_TUNER: p = "Tuner"; break;
+ }
+ cx25840_info("Specified input: %s\n", p);
+ cx25840_info("Specified audio input: %s\n",
+ state->audio_input == 0 ? "Tuner" : "External");
+
+ switch (state->audclk_freq) {
+ case V4L2_AUDCLK_441_KHZ: p = "44.1 kHz"; break;
+ case V4L2_AUDCLK_48_KHZ: p = "48 kHz"; break;
+ case V4L2_AUDCLK_32_KHZ: p = "32 kHz"; break;
+ default: p = "undefined";
+ }
+ cx25840_info("Specified audioclock freq: %s\n", p);
+
+ switch (pref_mode & 0xf) {
+ case 0: p = "mono/language A"; break;
+ case 1: p = "language B"; break;
+ case 2: p = "language C"; 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";
+ }
+ cx25840_info("Preferred audio mode: %s\n", p);
+
+ if ((audio_config & 0xf) == 0xf) {
+ switch ((afc0 >> 3) & 0x3) {
+ case 0: p = "system DK"; break;
+ case 1: p = "system L"; break;
+ case 2: p = "autodetect"; break;
+ default: p = "undefined";
+ }
+ cx25840_info("Selected 65 MHz format: %s\n", p);
+
+ switch (afc0 & 0x7) {
+ case 0: p = "chroma"; break;
+ case 1: p = "BTSC"; break;
+ case 2: p = "EIAJ"; break;
+ case 3: p = "A2-M"; break;
+ case 4: p = "autodetect"; break;
+ default: p = "undefined";
+ }
+ cx25840_info("Selected 45 MHz format: %s\n", p);
+ }
+}
diff --git a/drivers/media/video/cx25840/cx25840-firmware.c b/drivers/media/video/cx25840/cx25840-firmware.c
new file mode 100644
index 0000000..df9d50a
--- /dev/null
+++ b/drivers/media/video/cx25840/cx25840-firmware.c
@@ -0,0 +1,167 @@
+/* cx25840 firmware functions
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+#include <linux/firmware.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+#define FWFILE "v4l-cx25840.fw"
+#define FWSEND 1024
+
+#define FWDEV(x) &((x)->adapter->dev)
+
+static int fastfw = 1;
+static char *firmware = FWFILE;
+
+module_param(fastfw, bool, 0444);
+module_param(firmware, charp, 0444);
+
+MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]");
+MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]");
+
+static inline void set_i2c_delay(struct i2c_client *client, int delay)
+{
+ struct i2c_algo_bit_data *algod = client->adapter->algo_data;
+
+ /* We aren't guaranteed to be using algo_bit,
+ * so avoid the null pointer dereference
+ * and disable the 'fast firmware load' */
+ if (algod) {
+ algod->udelay = delay;
+ } else {
+ fastfw = 0;
+ }
+}
+
+static inline void start_fw_load(struct i2c_client *client)
+{
+ /* DL_ADDR_LB=0 DL_ADDR_HB=0 */
+ cx25840_write(client, 0x800, 0x00);
+ cx25840_write(client, 0x801, 0x00);
+ // DL_MAP=3 DL_AUTO_INC=0 DL_ENABLE=1
+ cx25840_write(client, 0x803, 0x0b);
+ /* AUTO_INC_DIS=1 */
+ cx25840_write(client, 0x000, 0x20);
+
+ if (fastfw)
+ set_i2c_delay(client, 3);
+}
+
+static inline void end_fw_load(struct i2c_client *client)
+{
+ if (fastfw)
+ set_i2c_delay(client, 10);
+
+ /* AUTO_INC_DIS=0 */
+ cx25840_write(client, 0x000, 0x00);
+ /* DL_ENABLE=0 */
+ cx25840_write(client, 0x803, 0x03);
+}
+
+static inline int check_fw_load(struct i2c_client *client, int size)
+{
+ /* DL_ADDR_HB DL_ADDR_LB */
+ int s = cx25840_read(client, 0x801) << 8;
+ s |= cx25840_read(client, 0x800);
+
+ if (size != s) {
+ cx25840_err("firmware %s load failed\n", firmware);
+ return -EINVAL;
+ }
+
+ cx25840_info("loaded %s firmware (%d bytes)\n", firmware, size);
+ return 0;
+}
+
+static inline int fw_write(struct i2c_client *client, u8 * data, int size)
+{
+ if (i2c_master_send(client, data, size) < size) {
+
+ if (fastfw) {
+ cx25840_err("333MHz i2c firmware load failed\n");
+ fastfw = 0;
+ set_i2c_delay(client, 10);
+
+ if (i2c_master_send(client, data, size) < size) {
+ cx25840_err
+ ("100MHz i2c firmware load failed\n");
+ return -ENOSYS;
+ }
+
+ } else {
+ cx25840_err("firmware load i2c failure\n");
+ return -ENOSYS;
+ }
+
+ }
+
+ return 0;
+}
+
+int cx25840_loadfw(struct i2c_client *client)
+{
+ const struct firmware *fw = NULL;
+ u8 buffer[4], *ptr;
+ int size, send, retval;
+
+ if (request_firmware(&fw, firmware, FWDEV(client)) != 0) {
+ cx25840_err("unable to open firmware %s\n", firmware);
+ return -EINVAL;
+ }
+
+ start_fw_load(client);
+
+ buffer[0] = 0x08;
+ buffer[1] = 0x02;
+ buffer[2] = fw->data[0];
+ buffer[3] = fw->data[1];
+ retval = fw_write(client, buffer, 4);
+
+ if (retval < 0) {
+ release_firmware(fw);
+ return retval;
+ }
+
+ size = fw->size - 2;
+ ptr = fw->data;
+ while (size > 0) {
+ ptr[0] = 0x08;
+ ptr[1] = 0x02;
+ send = size > (FWSEND - 2) ? FWSEND : size + 2;
+ retval = fw_write(client, ptr, send);
+
+ if (retval < 0) {
+ release_firmware(fw);
+ return retval;
+ }
+
+ size -= FWSEND - 2;
+ ptr += FWSEND - 2;
+ }
+
+ end_fw_load(client);
+
+ size = fw->size;
+ release_firmware(fw);
+
+ return check_fw_load(client, size);
+}
diff --git a/drivers/media/video/cx25840/cx25840-vbi.c b/drivers/media/video/cx25840/cx25840-vbi.c
new file mode 100644
index 0000000..13ba4e1
--- /dev/null
+++ b/drivers/media/video/cx25840/cx25840-vbi.c
@@ -0,0 +1,315 @@
+/* cx25840 VBI functions
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+static inline int odd_parity(u8 c)
+{
+ c ^= (c >> 4);
+ c ^= (c >> 2);
+ c ^= (c >> 1);
+
+ return c & 1;
+}
+
+static inline int decode_vps(u8 * dst, u8 * p)
+{
+ static const u8 biphase_tbl[] = {
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+ 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+ 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+ 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+ 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+ 0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
+ 0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
+ 0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
+ 0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
+ 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+ 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+ 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+ 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+ 0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
+ 0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
+ 0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
+ 0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
+ 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+ 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+ 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+ 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+ 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ };
+
+ u8 c, err = 0;
+ int i;
+
+ for (i = 0; i < 2 * 13; i += 2) {
+ err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
+ c = (biphase_tbl[p[i + 1]] & 0xf) |
+ ((biphase_tbl[p[i]] & 0xf) << 4);
+ dst[i / 2] = c;
+ }
+
+ return err & 0xf0;
+}
+
+void cx25840_vbi_setup(struct i2c_client *client)
+{
+ v4l2_std_id std = cx25840_get_v4lstd(client);
+
+ if (std & ~V4L2_STD_NTSC) {
+ /* datasheet startup, step 8d */
+ cx25840_write(client, 0x49f, 0x11);
+
+ cx25840_write(client, 0x470, 0x84);
+ cx25840_write(client, 0x471, 0x00);
+ cx25840_write(client, 0x472, 0x2d);
+ cx25840_write(client, 0x473, 0x5d);
+
+ cx25840_write(client, 0x474, 0x24);
+ cx25840_write(client, 0x475, 0x40);
+ cx25840_write(client, 0x476, 0x24);
+ cx25840_write(client, 0x477, 0x28);
+
+ cx25840_write(client, 0x478, 0x1f);
+ cx25840_write(client, 0x479, 0x02);
+
+ if (std & V4L2_STD_SECAM) {
+ cx25840_write(client, 0x47a, 0x80);
+ cx25840_write(client, 0x47b, 0x00);
+ cx25840_write(client, 0x47c, 0x5f);
+ cx25840_write(client, 0x47d, 0x42);
+ } else {
+ cx25840_write(client, 0x47a, 0x90);
+ cx25840_write(client, 0x47b, 0x20);
+ cx25840_write(client, 0x47c, 0x63);
+ cx25840_write(client, 0x47d, 0x82);
+ }
+
+ cx25840_write(client, 0x47e, 0x0a);
+ cx25840_write(client, 0x47f, 0x01);
+ } else {
+ /* datasheet startup, step 8d */
+ cx25840_write(client, 0x49f, 0x14);
+
+ cx25840_write(client, 0x470, 0x7a);
+ cx25840_write(client, 0x471, 0x00);
+ cx25840_write(client, 0x472, 0x2d);
+ cx25840_write(client, 0x473, 0x5b);
+
+ cx25840_write(client, 0x474, 0x1a);
+ cx25840_write(client, 0x475, 0x70);
+ cx25840_write(client, 0x476, 0x1e);
+ cx25840_write(client, 0x477, 0x1e);
+
+ cx25840_write(client, 0x478, 0x1f);
+ cx25840_write(client, 0x479, 0x02);
+ cx25840_write(client, 0x47a, 0x50);
+ cx25840_write(client, 0x47b, 0x66);
+
+ cx25840_write(client, 0x47c, 0x1f);
+ cx25840_write(client, 0x47d, 0x7c);
+ cx25840_write(client, 0x47e, 0x08);
+ cx25840_write(client, 0x47f, 0x00);
+ }
+}
+
+int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+ struct v4l2_format *fmt;
+ struct v4l2_sliced_vbi_format *svbi;
+
+ switch (cmd) {
+ case VIDIOC_G_FMT:
+ {
+ static u16 lcr2vbi[] = {
+ 0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
+ 0, V4L2_SLICED_WSS_625, 0, /* 4 */
+ V4L2_SLICED_CAPTION_525, /* 6 */
+ 0, 0, V4L2_SLICED_VPS, 0, 0, /* 9 */
+ 0, 0, 0, 0
+ };
+ int i;
+
+ fmt = arg;
+ if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+ return -EINVAL;
+ svbi = &fmt->fmt.sliced;
+ memset(svbi, 0, sizeof(*svbi));
+ /* we're done if raw VBI is active */
+ if ((cx25840_read(client, 0x404) & 0x10) == 0)
+ break;
+
+ for (i = 7; i <= 23; i++) {
+ u8 v = cx25840_read(client, 0x424 + i - 7);
+
+ svbi->service_lines[0][i] = lcr2vbi[v >> 4];
+ svbi->service_lines[1][i] = lcr2vbi[v & 0xf];
+ svbi->service_set |=
+ svbi->service_lines[0][i] | svbi->service_lines[1][i];
+ }
+ break;
+ }
+
+ case VIDIOC_S_FMT:
+ {
+ int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_NTSC);
+ int vbi_offset = is_pal ? 1 : 0;
+ int i, x;
+ u8 lcr[24];
+
+ fmt = arg;
+ if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+ return -EINVAL;
+ svbi = &fmt->fmt.sliced;
+ if (svbi->service_set == 0) {
+ /* raw VBI */
+ memset(svbi, 0, sizeof(*svbi));
+
+ /* Setup VBI */
+ cx25840_vbi_setup(client);
+
+ /* VBI Offset */
+ cx25840_write(client, 0x47f, vbi_offset);
+ cx25840_write(client, 0x404, 0x2e);
+ break;
+ }
+
+ for (x = 0; x <= 23; x++)
+ lcr[x] = 0x00;
+
+ /* Setup VBI */
+ cx25840_vbi_setup(client);
+
+ /* Sliced VBI */
+ cx25840_write(client, 0x404, 0x36); /* Ancillery data */
+ cx25840_write(client, 0x406, 0x13);
+ cx25840_write(client, 0x47f, vbi_offset);
+
+ if (is_pal) {
+ for (i = 0; i <= 6; i++)
+ svbi->service_lines[0][i] =
+ svbi->service_lines[1][i] = 0;
+ } else {
+ for (i = 0; i <= 9; i++)
+ svbi->service_lines[0][i] =
+ svbi->service_lines[1][i] = 0;
+
+ for (i = 22; i <= 23; i++)
+ svbi->service_lines[0][i] =
+ svbi->service_lines[1][i] = 0;
+ }
+
+ for (i = 7; i <= 23; i++) {
+ for (x = 0; x <= 1; x++) {
+ switch (svbi->service_lines[1-x][i]) {
+ case V4L2_SLICED_TELETEXT_B:
+ lcr[i] |= 1 << (4 * x);
+ break;
+ case V4L2_SLICED_WSS_625:
+ lcr[i] |= 4 << (4 * x);
+ break;
+ case V4L2_SLICED_CAPTION_525:
+ lcr[i] |= 6 << (4 * x);
+ break;
+ case V4L2_SLICED_VPS:
+ lcr[i] |= 9 << (4 * x);
+ break;
+ }
+ }
+ }
+
+ for (x = 1, i = 0x424; i <= 0x434; i++, x++) {
+ cx25840_write(client, i, lcr[6 + x]);
+ }
+
+ cx25840_write(client, 0x43c, 0x16);
+
+ if (is_pal) {
+ cx25840_write(client, 0x474, 0x2a);
+ } else {
+ cx25840_write(client, 0x474, 0x1a + 6);
+ }
+ break;
+ }
+
+ case VIDIOC_INT_DECODE_VBI_LINE:
+ {
+ struct v4l2_decode_vbi_line *vbi = arg;
+ u8 *p = vbi->p;
+ int id1, id2, l, err = 0;
+
+ if (p[0] || p[1] != 0xff || p[2] != 0xff ||
+ (p[3] != 0x55 && p[3] != 0x91)) {
+ vbi->line = vbi->type = 0;
+ break;
+ }
+
+ p += 4;
+ id1 = p[-1];
+ id2 = p[0] & 0xf;
+ l = p[2] & 0x3f;
+ l += 5;
+ p += 4;
+
+ switch (id2) {
+ case 1:
+ id2 = V4L2_SLICED_TELETEXT_B;
+ break;
+ case 4:
+ id2 = V4L2_SLICED_WSS_625;
+ break;
+ case 6:
+ id2 = V4L2_SLICED_CAPTION_525;
+ err = !odd_parity(p[0]) || !odd_parity(p[1]);
+ break;
+ case 9:
+ id2 = V4L2_SLICED_VPS;
+ if (decode_vps(p, p) != 0) {
+ err = 1;
+ }
+ break;
+ default:
+ id2 = 0;
+ err = 1;
+ break;
+ }
+
+ vbi->type = err ? 0 : id2;
+ vbi->line = err ? 0 : l;
+ vbi->is_second_field = err ? 0 : (id1 == 0x55);
+ vbi->p = p;
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/drivers/media/video/cx25840/cx25840.h b/drivers/media/video/cx25840/cx25840.h
new file mode 100644
index 0000000..4932ed1
--- /dev/null
+++ b/drivers/media/video/cx25840/cx25840.h
@@ -0,0 +1,92 @@
+/* cx25840 API header
+ *
+ * Copyright (C) 2003-2004 Chris Kennedy
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _CX25840_H_
+#define _CX25840_H_
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+
+extern int cx25840_debug;
+
+#define cx25840_dbg(fmt, arg...) do { if (cx25840_debug) \
+ printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define cx25840_err(fmt, arg...) do { \
+ printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define cx25840_info(fmt, arg...) do { \
+ printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0)
+
+/* The CARDTYPE_PVR150_WORKAROUND cardtype activates a workaround for a
+ hardware bug that is present in PVR150 (and possible PVR500) cards that
+ have certain NTSC tuners (tveeprom model numbers 85, 99 and 112). The
+ audio autodetect fails on some channels for these models and the workaround
+ is to select the audio standard explicitly. Many thanks to Hauppauge for
+ providing this information. */
+enum cx25840_cardtype {
+ CARDTYPE_PVR150,
+ CARDTYPE_PG600,
+ CARDTYPE_PVR150_WORKAROUND,
+};
+
+enum cx25840_input {
+ CX25840_TUNER,
+ CX25840_COMPOSITE0,
+ CX25840_COMPOSITE1,
+ CX25840_SVIDEO0,
+ CX25840_SVIDEO1
+};
+
+struct cx25840_state {
+ enum cx25840_cardtype cardtype;
+ enum cx25840_input input;
+ int audio_input;
+ enum v4l2_audio_clock_freq audclk_freq;
+};
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-core.c */
+int cx25840_write(struct i2c_client *client, u16 addr, u8 value);
+int cx25840_write4(struct i2c_client *client, u16 addr, u32 value);
+u8 cx25840_read(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, u8 mask, u8 value);
+v4l2_std_id cx25840_get_v4lstd(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-firmware.c */
+int cx25840_loadfw(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-audio.c */
+int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-vbi.c */
+void cx25840_vbi_setup(struct i2c_client *client);
+int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg);
+
+#endif
diff --git a/drivers/media/video/cx88/Kconfig b/drivers/media/video/cx88/Kconfig
index 41818b6..85ba410 100644
--- a/drivers/media/video/cx88/Kconfig
+++ b/drivers/media/video/cx88/Kconfig
@@ -46,8 +46,8 @@ config VIDEO_CX88_DVB_ALL_FRONTENDS
If you are unsure, choose Y.
config VIDEO_CX88_DVB_MT352
- tristate "Zarlink MT352 DVB-T Support"
- default m
+ bool "Zarlink MT352 DVB-T Support"
+ default y
depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
select DVB_MT352
---help---
@@ -55,8 +55,8 @@ config VIDEO_CX88_DVB_MT352
Connexant 2388x chip and the MT352 demodulator.
config VIDEO_CX88_DVB_OR51132
- tristate "OR51132 ATSC Support"
- default m
+ bool "OR51132 ATSC Support"
+ default y
depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
select DVB_OR51132
---help---
@@ -64,8 +64,8 @@ config VIDEO_CX88_DVB_OR51132
Connexant 2388x chip and the OR51132 demodulator.
config VIDEO_CX88_DVB_CX22702
- tristate "Conexant CX22702 DVB-T Support"
- default m
+ bool "Conexant CX22702 DVB-T Support"
+ default y
depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
select DVB_CX22702
---help---
@@ -73,8 +73,8 @@ config VIDEO_CX88_DVB_CX22702
Connexant 2388x chip and the CX22702 demodulator.
config VIDEO_CX88_DVB_LGDT330X
- tristate "LG Electronics DT3302/DT3303 ATSC Support"
- default m
+ bool "LG Electronics DT3302/DT3303 ATSC Support"
+ default y
depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
select DVB_LGDT330X
---help---
@@ -82,8 +82,8 @@ config VIDEO_CX88_DVB_LGDT330X
Connexant 2388x chip and the LGDT3302/LGDT3303 demodulator.
config VIDEO_CX88_DVB_NXT200X
- tristate "NXT2002/NXT2004 ATSC Support"
- default m
+ bool "NXT2002/NXT2004 ATSC Support"
+ default y
depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
select DVB_NXT200X
---help---
diff --git a/drivers/media/video/cx88/Makefile b/drivers/media/video/cx88/Makefile
index 0df40b7..54401b0 100644
--- a/drivers/media/video/cx88/Makefile
+++ b/drivers/media/video/cx88/Makefile
@@ -9,21 +9,12 @@ obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
EXTRA_CFLAGS += -I$(src)/..
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
-ifneq ($(CONFIG_VIDEO_BUF_DVB),n)
- EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1
-endif
-ifneq ($(CONFIG_DVB_CX22702),n)
- EXTRA_CFLAGS += -DHAVE_CX22702=1
-endif
-ifneq ($(CONFIG_DVB_OR51132),n)
- EXTRA_CFLAGS += -DHAVE_OR51132=1
-endif
-ifneq ($(CONFIG_DVB_LGDT330X),n)
- EXTRA_CFLAGS += -DHAVE_LGDT330X=1
-endif
-ifneq ($(CONFIG_DVB_MT352),n)
- EXTRA_CFLAGS += -DHAVE_MT352=1
-endif
-ifneq ($(CONFIG_DVB_NXT200X),n)
- EXTRA_CFLAGS += -DHAVE_NXT200X=1
-endif
+
+extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1
+extra-cflags-$(CONFIG_DVB_CX22702) += -DHAVE_CX22702=1
+extra-cflags-$(CONFIG_DVB_OR51132) += -DHAVE_OR51132=1
+extra-cflags-$(CONFIG_DVB_LGDT330X) += -DHAVE_LGDT330X=1
+extra-cflags-$(CONFIG_DVB_MT352) += -DHAVE_MT352=1
+extra-cflags-$(CONFIG_DVB_NXT200X) += -DHAVE_NXT200X=1
+
+EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m)
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
index 4ae3f78..74e57a5 100644
--- a/drivers/media/video/cx88/cx88-blackbird.c
+++ b/drivers/media/video/cx88/cx88-blackbird.c
@@ -616,6 +616,8 @@ static int blackbird_load_firmware(struct cx8802_dev *dev)
retval = request_firmware(&firmware, BLACKBIRD_FIRM_ENC_FILENAME,
&dev->pci->dev);
+
+
if (retval != 0) {
dprintk(0, "ERROR: Hotplug firmware request failed (%s).\n",
BLACKBIRD_FIRM_ENC_FILENAME);
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c
index f226863..951709a 100644
--- a/drivers/media/video/cx88/cx88-cards.c
+++ b/drivers/media/video/cx88/cx88-cards.c
@@ -567,6 +567,7 @@ struct cx88_board cx88_boards[] = {
.radio_type = UNSET,
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
+ .tda9887_conf = TDA9887_PRESENT,
.input = {{
.type = CX88_VMUX_TELEVISION,
.vmux = 0,
@@ -711,6 +712,7 @@ struct cx88_board cx88_boards[] = {
.radio_type = UNSET,
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
+ .tda9887_conf = TDA9887_PRESENT,
.input = {{
.type = CX88_VMUX_TELEVISION,
.vmux = 0,
@@ -1083,41 +1085,28 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
tveeprom_hauppauge_analog(&core->i2c_client, &tv, eeprom_data);
core->tuner_type = tv.tuner_type;
core->has_radio = tv.has_radio;
-}
-
-static int hauppauge_eeprom_dvb(struct cx88_core *core, u8 *ee)
-{
- int model;
- int tuner;
/* Make sure we support the board model */
- model = ee[0x1f] << 24 | ee[0x1e] << 16 | ee[0x1d] << 8 | ee[0x1c];
- switch(model) {
- case 90002:
- case 90500:
- case 90501:
+ switch (tv.model)
+ {
+ case 90002: /* Nova-T-PCI (9002) */
+ case 92001: /* Nova-S-Plus (Video and IR) */
+ case 92002: /* Nova-S-Plus (Video and IR) */
+ case 90003: /* Nova-T-PCI (9002 No RF out) */
+ case 90500: /* Nova-T-PCI (oem) */
+ case 90501: /* Nova-T-PCI (oem/IR) */
+ case 92000: /* Nova-SE2 (OEM, No Video or IR) */
+
/* known */
break;
default:
printk("%s: warning: unknown hauppauge model #%d\n",
- core->name, model);
+ core->name, tv.model);
break;
}
- /* Make sure we support the tuner */
- tuner = ee[0x2d];
- switch(tuner) {
- case 0x4B: /* dtt 7595 */
- case 0x4C: /* dtt 7592 */
- break;
- default:
- printk("%s: error: unknown hauppauge tuner 0x%02x\n",
- core->name, tuner);
- return -ENODEV;
- }
- printk(KERN_INFO "%s: hauppauge eeprom: model=%d, tuner=%d\n",
- core->name, model, tuner);
- return 0;
+ printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n",
+ core->name, tv.model);
}
/* ----------------------------------------------------------------------- */
@@ -1201,7 +1190,7 @@ void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
void cx88_card_setup(struct cx88_core *core)
{
- static u8 eeprom[128];
+ static u8 eeprom[256];
if (0 == core->i2c_rc) {
core->i2c_client.addr = 0xa0 >> 1;
@@ -1224,7 +1213,7 @@ void cx88_card_setup(struct cx88_core *core)
break;
case CX88_BOARD_HAUPPAUGE_DVB_T1:
if (0 == core->i2c_rc)
- hauppauge_eeprom_dvb(core,eeprom);
+ hauppauge_eeprom(core,eeprom);
break;
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c
index eb806af..bb6eb54 100644
--- a/drivers/media/video/cx88/cx88-core.c
+++ b/drivers/media/video/cx88/cx88-core.c
@@ -837,6 +837,29 @@ static int set_pll(struct cx88_core *core, int prescale, u32 ofreq)
return -1;
}
+int cx88_start_audio_dma(struct cx88_core *core)
+{
+ /* setup fifo + format */
+ cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0);
+ cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0);
+
+ cx_write(MO_AUDD_LNGTH, 128); /* fifo bpl size */
+ cx_write(MO_AUDR_LNGTH, 128); /* fifo bpl size */
+
+ /* start dma */
+ cx_write(MO_AUD_DMACNTRL, 0x0003); /* Up and Down fifo enable */
+
+ return 0;
+}
+
+int cx88_stop_audio_dma(struct cx88_core *core)
+{
+ /* stop dma */
+ cx_write(MO_AUD_DMACNTRL, 0x0000);
+
+ return 0;
+}
+
static int set_tvaudio(struct cx88_core *core)
{
struct cx88_tvnorm *norm = core->tvnorm;
@@ -877,12 +900,16 @@ static int set_tvaudio(struct cx88_core *core)
cx88_set_tvaudio(core);
/* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */
- cx_write(MO_AUDD_LNGTH, 128); /* fifo size */
- cx_write(MO_AUDR_LNGTH, 128); /* fifo size */
- cx_write(MO_AUD_DMACNTRL, 0x03); /* need audio fifo */
+/*
+ This should be needed only on cx88-alsa. It seems that some cx88 chips have
+ bugs and does require DMA enabled for it to work.
+ */
+ cx88_start_audio_dma(core);
return 0;
}
+
+
int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm)
{
u32 fsc8;
@@ -1204,6 +1231,8 @@ EXPORT_SYMBOL(cx88_set_scale);
EXPORT_SYMBOL(cx88_vdev_init);
EXPORT_SYMBOL(cx88_core_get);
EXPORT_SYMBOL(cx88_core_put);
+EXPORT_SYMBOL(cx88_start_audio_dma);
+EXPORT_SYMBOL(cx88_stop_audio_dma);
/*
* Local variables:
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c
index 9cce91e..99ea955 100644
--- a/drivers/media/video/cx88/cx88-dvb.c
+++ b/drivers/media/video/cx88/cx88-dvb.c
@@ -439,9 +439,6 @@ static int dvb_register(struct cx8802_dev *dev)
/* Put the analog decoder in standby to keep it quiet */
cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
- /* Put the analog decoder in standby to keep it quiet */
- cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
-
/* register everything */
return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev);
}
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
index 38b12eb..461019d 100644
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -453,7 +453,6 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
input_dev->id.product = pci->device;
}
input_dev->cdev.dev = &pci->dev;
-
/* record handles to ourself */
ir->core = core;
core->ir = ir;
@@ -586,7 +585,6 @@ void cx88_ir_irq(struct cx88_core *core)
MODULE_AUTHOR("Gerd Knorr, Pavel Machek, Chris Pascoe");
MODULE_DESCRIPTION("input driver for cx88 GPIO-based IR remote controls");
MODULE_LICENSE("GPL");
-
/*
* Local variables:
* c-basic-offset: 8
diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c
index 6d9bec1..a1b120c 100644
--- a/drivers/media/video/cx88/cx88-tvaudio.c
+++ b/drivers/media/video/cx88/cx88-tvaudio.c
@@ -119,13 +119,10 @@ static void set_audio_registers(struct cx88_core *core, const struct rlist *l)
static void set_audio_start(struct cx88_core *core, u32 mode)
{
- // mute
+ /* mute */
cx_write(AUD_VOL_CTL, (1 << 6));
- // start programming
- cx_write(MO_AUD_DMACNTRL, 0x0000);
- msleep(100);
- //cx_write(AUD_CTL, 0x0000);
+ /* start programming */
cx_write(AUD_INIT, mode);
cx_write(AUD_INIT_LD, 0x0001);
cx_write(AUD_SOFT_RESET, 0x0001);
@@ -135,17 +132,21 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
{
u32 volume;
+ /* restart dma; This avoids buzz in NICAM and is good in others */
+ cx88_stop_audio_dma(core);
+ cx_write(AUD_RATE_THRES_DMD, 0x000000C0);
+ cx88_start_audio_dma(core);
+
if (cx88_boards[core->board].blackbird) {
- // sets sound input from external adc
+ /* sets sound input from external adc */
cx_set(AUD_CTL, EN_I2SIN_ENABLE);
- //cx_write(AUD_I2SINPUTCNTL, 0);
cx_write(AUD_I2SINPUTCNTL, 4);
cx_write(AUD_BAUDRATE, 1);
- // 'pass-thru mode': this enables the i2s output to the mpeg encoder
+ /* 'pass-thru mode': this enables the i2s output to the mpeg encoder */
cx_set(AUD_CTL, EN_I2SOUT_ENABLE);
cx_write(AUD_I2SOUTPUTCNTL, 1);
cx_write(AUD_I2SCNTL, 0);
- //cx_write(AUD_APB_IN_RATE_ADJ, 0);
+ /* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
} else {
ctl |= EN_DAC_ENABLE;
cx_write(AUD_CTL, ctl);
@@ -153,7 +154,6 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
/* finish programming */
cx_write(AUD_SOFT_RESET, 0x0000);
- cx_write(MO_AUD_DMACNTRL, 0x0003);
/* unmute */
volume = cx_sread(SHADOW_AUD_VOL_CTL);
@@ -313,7 +313,6 @@ static void set_audio_standard_NICAM(struct cx88_core *core, u32 mode)
{AUD_RATE_ADJ3, 0x00000100},
{AUD_RATE_ADJ4, 0x00000400},
{AUD_RATE_ADJ5, 0x00001000},
- //{ AUD_DMD_RA_DDS, 0x00c0d5ce },
{AUD_ERRLOGPERIOD_R, 0x00000fff},
{AUD_ERRINTRPTTHSHLD1_R, 0x000003ff},
{AUD_ERRINTRPTTHSHLD2_R, 0x000000ff},
@@ -351,12 +350,12 @@ static void set_audio_standard_NICAM(struct cx88_core *core, u32 mode)
set_audio_registers(core, nicam_l);
break;
case WW_I:
- dprintk("%s PAL-I NICAM (status: devel)\n", __FUNCTION__);
+ dprintk("%s PAL-I NICAM (status: known-good)\n", __FUNCTION__);
set_audio_registers(core, nicam_bgdki_common);
set_audio_registers(core, nicam_i);
break;
default:
- dprintk("%s PAL-BGDK NICAM (status: unknown)\n", __FUNCTION__);
+ dprintk("%s PAL-BGDK NICAM (status: known-good)\n", __FUNCTION__);
set_audio_registers(core, nicam_bgdki_common);
set_audio_registers(core, nicam_default);
break;
@@ -715,8 +714,7 @@ int cx88_detect_nicam(struct cx88_core *core)
/* if bit1=1 then nicam is detected */
j += ((cx_read(AUD_NICAM_STATUS2) & 0x02) >> 1);
- /* 3x detected: absolutly sure now */
- if (j == 3) {
+ if (j == 1) {
dprintk("nicam is detected.\n");
return 1;
}
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h
index b19d3a9e..77beafc 100644
--- a/drivers/media/video/cx88/cx88.h
+++ b/drivers/media/video/cx88/cx88.h
@@ -411,7 +411,6 @@ struct cx8802_dev {
struct videobuf_dvb dvb;
void* fe_handle;
int (*fe_release)(void *handle);
-
/* for switching modulation types */
unsigned char ts_gen_cntrl;
@@ -491,6 +490,10 @@ extern struct cx88_core* cx88_core_get(struct pci_dev *pci);
extern void cx88_core_put(struct cx88_core *core,
struct pci_dev *pci);
+extern int cx88_start_audio_dma(struct cx88_core *core);
+extern int cx88_stop_audio_dma(struct cx88_core *core);
+
+
/* ----------------------------------------------------------- */
/* cx88-vbi.c */
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c
index d54bc0127..0cfe754 100644
--- a/drivers/media/video/em28xx/em28xx-core.c
+++ b/drivers/media/video/em28xx/em28xx-core.c
@@ -32,7 +32,7 @@
/* #define ENABLE_DEBUG_ISOC_FRAMES */
-unsigned int core_debug;
+static unsigned int core_debug;
module_param(core_debug,int,0644);
MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
printk(KERN_INFO "%s %s :"fmt, \
dev->name, __FUNCTION__ , ##arg); } while (0)
-unsigned int reg_debug;
+static unsigned int reg_debug;
module_param(reg_debug,int,0644);
MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
@@ -50,7 +50,7 @@ MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
printk(KERN_INFO "%s %s :"fmt, \
dev->name, __FUNCTION__ , ##arg); } while (0)
-unsigned int isoc_debug;
+static unsigned int isoc_debug;
module_param(isoc_debug,int,0644);
MODULE_PARM_DESC(isoc_debug,"enable debug messages [isoc transfers]");
@@ -116,47 +116,6 @@ void em28xx_print_ioctl(char *name, unsigned int cmd)
}
}
-static void *rvmalloc(size_t size)
-{
- void *mem;
- unsigned long adr;
-
- size = PAGE_ALIGN(size);
-
- mem = vmalloc_32((unsigned long)size);
- if (!mem)
- return NULL;
-
- memset(mem, 0, size);
-
- adr = (unsigned long)mem;
- while (size > 0) {
- SetPageReserved(vmalloc_to_page((void *)adr));
- adr += PAGE_SIZE;
- size -= PAGE_SIZE;
- }
-
- return mem;
-}
-
-static void rvfree(void *mem, size_t size)
-{
- unsigned long adr;
-
- if (!mem)
- return;
-
- size = PAGE_ALIGN(size);
-
- adr = (unsigned long)mem;
- while (size > 0) {
- ClearPageReserved(vmalloc_to_page((void *)adr));
- adr += PAGE_SIZE;
- size -= PAGE_SIZE;
- }
-
- vfree(mem);
-}
/*
* em28xx_request_buffers()
@@ -167,14 +126,16 @@ u32 em28xx_request_buffers(struct em28xx *dev, u32 count)
const size_t imagesize = PAGE_ALIGN(dev->frame_size); /*needs to be page aligned cause the buffers can be mapped individually! */
void *buff = NULL;
u32 i;
- em28xx_coredbg("requested %i buffers with size %i", count, imagesize);
+ em28xx_coredbg("requested %i buffers with size %zd", count, imagesize);
if (count > EM28XX_NUM_FRAMES)
count = EM28XX_NUM_FRAMES;
dev->num_frames = count;
while (dev->num_frames > 0) {
- if ((buff = rvmalloc(dev->num_frames * imagesize)))
+ if ((buff = vmalloc_32(dev->num_frames * imagesize))) {
+ memset(buff, 0, dev->num_frames * imagesize);
break;
+ }
dev->num_frames--;
}
@@ -217,8 +178,7 @@ void em28xx_queue_unusedframes(struct em28xx *dev)
void em28xx_release_buffers(struct em28xx *dev)
{
if (dev->num_frames) {
- rvfree(dev->frame[0].bufmem,
- dev->num_frames * PAGE_ALIGN(dev->frame[0].buf.length));
+ vfree(dev->frame[0].bufmem);
dev->num_frames = 0;
}
}
diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c
index b32d985..7f56030 100644
--- a/drivers/media/video/em28xx/em28xx-i2c.c
+++ b/drivers/media/video/em28xx/em28xx-i2c.c
@@ -41,7 +41,7 @@ module_param(i2c_debug, int, 0644);
MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
#define dprintk1(lvl,fmt, args...) if (i2c_debug>=lvl) do {\
- printk(fmt , ##args); } while (0)
+ printk(fmt, ##args); } while (0)
#define dprintk2(lvl,fmt, args...) if (i2c_debug>=lvl) do{ \
printk(KERN_DEBUG "%s at %s: " fmt, \
dev->name, __FUNCTION__ , ##args); } while (0)
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c
index 32c49df..9b94f77 100644
--- a/drivers/media/video/em28xx/em28xx-input.c
+++ b/drivers/media/video/em28xx/em28xx-input.c
@@ -120,9 +120,6 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
if (buf[1]==0xff)
return 0;
- /* avoid fast reapeating */
- if (buf[1]==ir->old)
- return 0;
ir->old=buf[1];
/* Rearranges bits to the right order */
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index 57c1826b92..06d7687 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -189,16 +189,6 @@ static DECLARE_RWSEM(em28xx_disconnect);
/********************* v4l2 interface ******************************************/
-static inline unsigned long kvirt_to_pa(unsigned long adr)
-{
- unsigned long kva, ret;
-
- kva = (unsigned long)page_address(vmalloc_to_page((void *)adr));
- kva |= adr & (PAGE_SIZE - 1);
- ret = __pa(kva);
- return ret;
-}
-
/*
* em28xx_config()
* inits registers with sane defaults
@@ -226,7 +216,7 @@ static int em28xx_config(struct em28xx *dev)
* em28xx_config_i2c()
* configure i2c attached devices
*/
-void em28xx_config_i2c(struct em28xx *dev)
+static void em28xx_config_i2c(struct em28xx *dev)
{
struct v4l2_frequency f;
struct video_decoder_init em28xx_vdi = {.data = NULL };
@@ -616,7 +606,8 @@ static struct vm_operations_struct em28xx_vm_ops = {
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
{
unsigned long size = vma->vm_end - vma->vm_start,
- start = vma->vm_start, pos, page;
+ start = vma->vm_start;
+ void *pos;
u32 i;
struct em28xx *dev = filp->private_data;
@@ -657,12 +648,10 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
vma->vm_flags |= VM_IO;
vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
- pos = (unsigned long)dev->frame[i].bufmem;
+ pos = dev->frame[i].bufmem;
while (size > 0) { /* size is page-aligned */
- page = vmalloc_to_pfn((void *)pos);
- if (remap_pfn_range(vma, start, page, PAGE_SIZE,
- vma->vm_page_prot)) {
- em28xx_videodbg("mmap: rename page map failed\n");
+ if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
+ em28xx_videodbg("mmap: vm_insert_page failed\n");
up(&dev->fileop_lock);
return -EAGAIN;
}
diff --git a/drivers/media/video/ir-kbd-gpio.c b/drivers/media/video/ir-kbd-gpio.c
index ed81934..de1385e 100644
--- a/drivers/media/video/ir-kbd-gpio.c
+++ b/drivers/media/video/ir-kbd-gpio.c
@@ -221,24 +221,98 @@ static IR_KEYTAB_TYPE ir_codes_conceptronic[IR_KEYTAB_SIZE] = {
[ 24 ] = KEY_MUTE // mute/unmute
};
+static IR_KEYTAB_TYPE ir_codes_nebula[IR_KEYTAB_SIZE] = {
+ [0x00] = KEY_KP0,
+ [0x01] = KEY_KP1,
+ [0x02] = KEY_KP2,
+ [0x03] = KEY_KP3,
+ [0x04] = KEY_KP4,
+ [0x05] = KEY_KP5,
+ [0x06] = KEY_KP6,
+ [0x07] = KEY_KP7,
+ [0x08] = KEY_KP8,
+ [0x09] = KEY_KP9,
+ [0x0a] = KEY_TV,
+ [0x0b] = KEY_AUX,
+ [0x0c] = KEY_DVD,
+ [0x0d] = KEY_POWER,
+ [0x0e] = KEY_MHP, /* labelled 'Picture' */
+ [0x0f] = KEY_AUDIO,
+ [0x10] = KEY_INFO,
+ [0x11] = KEY_F13, /* 16:9 */
+ [0x12] = KEY_F14, /* 14:9 */
+ [0x13] = KEY_EPG,
+ [0x14] = KEY_EXIT,
+ [0x15] = KEY_MENU,
+ [0x16] = KEY_UP,
+ [0x17] = KEY_DOWN,
+ [0x18] = KEY_LEFT,
+ [0x19] = KEY_RIGHT,
+ [0x1a] = KEY_ENTER,
+ [0x1b] = KEY_CHANNELUP,
+ [0x1c] = KEY_CHANNELDOWN,
+ [0x1d] = KEY_VOLUMEUP,
+ [0x1e] = KEY_VOLUMEDOWN,
+ [0x1f] = KEY_RED,
+ [0x20] = KEY_GREEN,
+ [0x21] = KEY_YELLOW,
+ [0x22] = KEY_BLUE,
+ [0x23] = KEY_SUBTITLE,
+ [0x24] = KEY_F15, /* AD */
+ [0x25] = KEY_TEXT,
+ [0x26] = KEY_MUTE,
+ [0x27] = KEY_REWIND,
+ [0x28] = KEY_STOP,
+ [0x29] = KEY_PLAY,
+ [0x2a] = KEY_FASTFORWARD,
+ [0x2b] = KEY_F16, /* chapter */
+ [0x2c] = KEY_PAUSE,
+ [0x2d] = KEY_PLAY,
+ [0x2e] = KEY_RECORD,
+ [0x2f] = KEY_F17, /* picture in picture */
+ [0x30] = KEY_KPPLUS, /* zoom in */
+ [0x31] = KEY_KPMINUS, /* zoom out */
+ [0x32] = KEY_F18, /* capture */
+ [0x33] = KEY_F19, /* web */
+ [0x34] = KEY_EMAIL,
+ [0x35] = KEY_PHONE,
+ [0x36] = KEY_PC
+};
+
struct IR {
struct bttv_sub_device *sub;
struct input_dev *input;
struct ir_input_state ir;
char name[32];
char phys[32];
+
+ /* Usual gpio signalling */
+
u32 mask_keycode;
u32 mask_keydown;
u32 mask_keyup;
-
- int polling;
+ u32 polling;
u32 last_gpio;
struct work_struct work;
struct timer_list timer;
+
+ /* RC5 gpio */
+ u32 rc5_gpio;
+ struct timer_list timer_end; /* timer_end for code completion */
+ struct timer_list timer_keyup; /* timer_end for key release */
+ u32 last_rc5; /* last good rc5 code */
+ u32 last_bit; /* last raw bit seen */
+ u32 code; /* raw code under construction */
+ struct timeval base_time; /* time of last seen code */
+ int active; /* building raw code */
};
static int debug;
module_param(debug, int, 0644); /* debug level (0,1,2) */
+static int repeat_delay = 500;
+module_param(repeat_delay, int, 0644);
+static int repeat_period = 33;
+module_param(repeat_period, int, 0644);
#define DEVNAME "ir-kbd-gpio"
#define dprintk(fmt, arg...) if (debug) \
@@ -254,7 +328,7 @@ static struct bttv_sub_driver driver = {
.probe = ir_probe,
.remove = ir_remove,
},
- .gpio_irq = ir_irq,
+ .gpio_irq = ir_irq,
};
/* ---------------------------------------------------------------------- */
@@ -327,6 +401,173 @@ static void ir_work(void *data)
mod_timer(&ir->timer, timeout);
}
+/* ---------------------------------------------------------------*/
+
+static int rc5_remote_gap = 885;
+module_param(rc5_remote_gap, int, 0644);
+static int rc5_key_timeout = 200;
+module_param(rc5_key_timeout, int, 0644);
+
+#define RC5_START(x) (((x)>>12)&3)
+#define RC5_TOGGLE(x) (((x)>>11)&1)
+#define RC5_ADDR(x) (((x)>>6)&31)
+#define RC5_INSTR(x) ((x)&63)
+
+/* decode raw bit pattern to RC5 code */
+static u32 rc5_decode(unsigned int code)
+{
+ unsigned int org_code = code;
+ unsigned int pair;
+ unsigned int rc5 = 0;
+ int i;
+
+ code = (code << 1) | 1;
+ for (i = 0; i < 14; ++i) {
+ pair = code & 0x3;
+ code >>= 2;
+
+ rc5 <<= 1;
+ switch (pair) {
+ case 0:
+ case 2:
+ break;
+ case 1:
+ rc5 |= 1;
+ break;
+ case 3:
+ dprintk("bad code: %x\n", org_code);
+ return 0;
+ }
+ }
+ dprintk("code=%x, rc5=%x, start=%x, toggle=%x, address=%x, "
+ "instr=%x\n", rc5, org_code, RC5_START(rc5),
+ RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));
+ return rc5;
+}
+
+static int ir_rc5_irq(struct bttv_sub_device *sub)
+{
+ struct IR *ir = dev_get_drvdata(&sub->dev);
+ struct timeval tv;
+ u32 gpio;
+ u32 gap;
+ unsigned long current_jiffies, timeout;
+
+ /* read gpio port */
+ gpio = bttv_gpio_read(ir->sub->core);
+
+ /* remote IRQ? */
+ if (!(gpio & 0x20))
+ return 0;
+
+ /* get time of bit */
+ current_jiffies = jiffies;
+ do_gettimeofday(&tv);
+
+ /* avoid overflow with gap >1s */
+ if (tv.tv_sec - ir->base_time.tv_sec > 1) {
+ gap = 200000;
+ } else {
+ gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
+ tv.tv_usec - ir->base_time.tv_usec;
+ }
+
+ /* active code => add bit */
+ if (ir->active) {
+ /* only if in the code (otherwise spurious IRQ or timer
+ late) */
+ if (ir->last_bit < 28) {
+ ir->last_bit = (gap - rc5_remote_gap / 2) /
+ rc5_remote_gap;
+ ir->code |= 1 << ir->last_bit;
+ }
+ /* starting new code */
+ } else {
+ ir->active = 1;
+ ir->code = 0;
+ ir->base_time = tv;
+ ir->last_bit = 0;
+
+ timeout = current_jiffies + (500 + 30 * HZ) / 1000;
+ mod_timer(&ir->timer_end, timeout);
+ }
+
+ /* toggle GPIO pin 4 to reset the irq */
+ bttv_gpio_write(ir->sub->core, gpio & ~(1 << 4));
+ bttv_gpio_write(ir->sub->core, gpio | (1 << 4));
+ return 1;
+}
+
+static void ir_rc5_timer_end(unsigned long data)
+{
+ struct IR *ir = (struct IR *)data;
+ struct timeval tv;
+ unsigned long current_jiffies, timeout;
+ u32 gap;
+
+ /* get time */
+ current_jiffies = jiffies;
+ do_gettimeofday(&tv);
+
+ /* avoid overflow with gap >1s */
+ if (tv.tv_sec - ir->base_time.tv_sec > 1) {
+ gap = 200000;
+ } else {
+ gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
+ tv.tv_usec - ir->base_time.tv_usec;
+ }
+
+ /* Allow some timmer jitter (RC5 is ~24ms anyway so this is ok) */
+ if (gap < 28000) {
+ dprintk("spurious timer_end\n");
+ return;
+ }
+
+ ir->active = 0;
+ if (ir->last_bit < 20) {
+ /* ignore spurious codes (caused by light/other remotes) */
+ dprintk("short code: %x\n", ir->code);
+ } else {
+ u32 rc5 = rc5_decode(ir->code);
+
+ /* two start bits? */
+ if (RC5_START(rc5) != 3) {
+ dprintk("rc5 start bits invalid: %u\n", RC5_START(rc5));
+
+ /* right address? */
+ } else if (RC5_ADDR(rc5) == 0x0) {
+ u32 toggle = RC5_TOGGLE(rc5);
+ u32 instr = RC5_INSTR(rc5);
+
+ /* Good code, decide if repeat/repress */
+ if (toggle != RC5_TOGGLE(ir->last_rc5) ||
+ instr != RC5_INSTR(ir->last_rc5)) {
+ dprintk("instruction %x, toggle %x\n", instr,
+ toggle);
+ ir_input_nokey(ir->input, &ir->ir);
+ ir_input_keydown(ir->input, &ir->ir, instr,
+ instr);
+ }
+
+ /* Set/reset key-up timer */
+ timeout = current_jiffies + (500 + rc5_key_timeout
+ * HZ) / 1000;
+ mod_timer(&ir->timer_keyup, timeout);
+
+ /* Save code for repeat test */
+ ir->last_rc5 = rc5;
+ }
+ }
+}
+
+static void ir_rc5_timer_keyup(unsigned long data)
+{
+ struct IR *ir = (struct IR *)data;
+
+ dprintk("key released\n");
+ ir_input_nokey(ir->input, &ir->ir);
+}
+
/* ---------------------------------------------------------------------- */
static int ir_probe(struct device *dev)
@@ -400,6 +641,12 @@ static int ir_probe(struct device *dev)
ir->mask_keyup = 0x006000;
ir->polling = 50; // ms
break;
+ case BTTV_BOARD_NEBULA_DIGITV:
+ ir_codes = ir_codes_nebula;
+ driver.any_irq = ir_rc5_irq;
+ driver.gpio_irq = NULL;
+ ir->rc5_gpio = 1;
+ break;
}
if (NULL == ir_codes) {
kfree(ir);
@@ -407,9 +654,17 @@ static int ir_probe(struct device *dev)
return -ENODEV;
}
- /* init hardware-specific stuff */
- bttv_gpio_inout(sub->core, ir->mask_keycode | ir->mask_keydown, 0);
- ir->sub = sub;
+ if (ir->rc5_gpio) {
+ u32 gpio;
+ /* enable remote irq */
+ bttv_gpio_inout(sub->core, (1 << 4), 1 << 4);
+ gpio = bttv_gpio_read(sub->core);
+ bttv_gpio_write(sub->core, gpio & ~(1 << 4));
+ bttv_gpio_write(sub->core, gpio | (1 << 4));
+ } else {
+ /* init hardware-specific stuff */
+ bttv_gpio_inout(sub->core, ir->mask_keycode | ir->mask_keydown, 0);
+ }
/* init input device */
snprintf(ir->name, sizeof(ir->name), "bttv IR (card=%d)",
@@ -431,18 +686,34 @@ static int ir_probe(struct device *dev)
}
input_dev->cdev.dev = &sub->core->pci->dev;
+ ir->input = input_dev;
+ ir->sub = sub;
+
if (ir->polling) {
INIT_WORK(&ir->work, ir_work, ir);
init_timer(&ir->timer);
ir->timer.function = ir_timer;
ir->timer.data = (unsigned long)ir;
schedule_work(&ir->work);
+ } else if (ir->rc5_gpio) {
+ /* set timer_end for code completion */
+ init_timer(&ir->timer_end);
+ ir->timer_end.function = ir_rc5_timer_end;
+ ir->timer_end.data = (unsigned long)ir;
+
+ init_timer(&ir->timer_keyup);
+ ir->timer_keyup.function = ir_rc5_timer_keyup;
+ ir->timer_keyup.data = (unsigned long)ir;
}
/* all done */
dev_set_drvdata(dev, ir);
input_register_device(ir->input);
+ /* the remote isn't as bouncy as a keyboard */
+ ir->input->rep[REP_DELAY] = repeat_delay;
+ ir->input->rep[REP_PERIOD] = repeat_period;
+
return 0;
}
@@ -455,6 +726,16 @@ static int ir_remove(struct device *dev)
flush_scheduled_work();
}
+ if (ir->rc5_gpio) {
+ u32 gpio;
+
+ del_timer(&ir->timer_end);
+ flush_scheduled_work();
+
+ gpio = bttv_gpio_read(ir->sub->core);
+ bttv_gpio_write(ir->sub->core, gpio & ~(1 << 4));
+ }
+
input_unregister_device(ir->input);
kfree(ir);
return 0;
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
index 0085567..740e543 100644
--- a/drivers/media/video/ir-kbd-i2c.c
+++ b/drivers/media/video/ir-kbd-i2c.c
@@ -40,6 +40,7 @@
#include <linux/i2c.h>
#include <linux/workqueue.h>
#include <asm/semaphore.h>
+
#include <media/ir-common.h>
#include <media/ir-kbd-i2c.h>
@@ -183,6 +184,58 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
return 1;
}
+/* The new pinnacle PCTV remote (with the colored buttons)
+ *
+ * Ricardo Cerqueira <v4l@cerqueira.org>
+ */
+
+int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+ unsigned char b[4];
+ unsigned int start = 0,parity = 0,code = 0;
+
+ /* poll IR chip */
+ if (4 != i2c_master_recv(&ir->c,b,4)) {
+ dprintk(2,"read error\n");
+ return -EIO;
+ }
+
+ for (start = 0; start<4; start++) {
+ if (b[start] == 0x80) {
+ code=b[(start+3)%4];
+ parity=b[(start+2)%4];
+ }
+ }
+
+ /* Empty Request */
+ if (parity==0)
+ return 0;
+
+ /* Repeating... */
+ if (ir->old == parity)
+ return 0;
+
+
+ ir->old = parity;
+
+ /* Reduce code value to fit inside IR_KEYTAB_SIZE
+ *
+ * this is the only value that results in 42 unique
+ * codes < 128
+ */
+
+ code %= 0x88;
+
+ *ir_raw = code;
+ *ir_key = code;
+
+ dprintk(1,"Pinnacle PCTV key %02x\n", code);
+
+ return 1;
+}
+
+EXPORT_SYMBOL_GPL(get_key_pinnacle);
+
/* ----------------------------------------------------------------------- */
static void ir_key_poll(struct IR_i2c *ir)
@@ -226,7 +279,7 @@ static int ir_probe(struct i2c_adapter *adap);
static struct i2c_driver driver = {
.name = "ir remote kbd driver",
- .id = I2C_DRIVERID_EXP3, /* FIXME */
+ .id = I2C_DRIVERID_INFRARED,
.flags = I2C_DF_NOTIFY,
.attach_adapter = ir_probe,
.detach_client = ir_detach,
@@ -244,15 +297,15 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
IR_KEYTAB_TYPE *ir_codes = NULL;
char *name;
int ir_type;
- struct IR_i2c *ir;
+ struct IR_i2c *ir;
struct input_dev *input_dev;
- ir = kzalloc(sizeof(struct IR_i2c), GFP_KERNEL);
+ ir = kzalloc(sizeof(struct IR_i2c),GFP_KERNEL);
input_dev = input_allocate_device();
if (!ir || !input_dev) {
kfree(ir);
input_free_device(input_dev);
- return -ENOMEM;
+ return -ENOMEM;
}
ir->c = client_template;
@@ -308,7 +361,7 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
/* register i2c device
* At device register, IR codes may be changed to be
* board dependent.
- */
+ */
i2c_attach_client(&ir->c);
/* If IR not supported or disabled, unregisters driver */
diff --git a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c
index a23fb03..d86f8e9 100644
--- a/drivers/media/video/msp3400.c
+++ b/drivers/media/video/msp3400.c
@@ -134,7 +134,7 @@ struct msp3400c {
int rxsubchans;
int muted;
- int left, right; /* volume */
+ int left, right; /* volume */
int bass, treble;
/* shadow register set */
@@ -882,6 +882,7 @@ static void watch_stereo(struct i2c_client *client)
msp->watch_stereo = 0;
}
+
static int msp3400c_thread(void *data)
{
struct i2c_client *client = data;
@@ -889,6 +890,7 @@ static int msp3400c_thread(void *data)
struct CARRIER_DETECT *cd;
int count, max1,max2,val1,val2, val,this;
+
msp3400_info("msp3400 daemon started\n");
for (;;) {
msp3400_dbg_mediumvol("msp3400 thread: sleep\n");
@@ -1162,6 +1164,7 @@ static int msp3410d_thread(void *data)
int mode,val,i,std;
msp3400_info("msp3410 daemon started\n");
+
for (;;) {
msp3400_dbg_mediumvol("msp3410 thread: sleep\n");
msp34xx_sleep(msp,-1);
@@ -1384,6 +1387,7 @@ static int msp34xxg_thread(void *data)
int val, std, i;
msp3400_info("msp34xxg daemon started\n");
+
msp->source = 1; /* default */
for (;;) {
msp3400_dbg_mediumvol("msp34xxg thread: sleep\n");
@@ -1559,11 +1563,11 @@ static void msp_wake_thread(struct i2c_client *client);
static struct i2c_driver driver = {
.owner = THIS_MODULE,
.name = "msp3400",
- .id = I2C_DRIVERID_MSP3400,
- .flags = I2C_DF_NOTIFY,
- .attach_adapter = msp_probe,
- .detach_client = msp_detach,
- .command = msp_command,
+ .id = I2C_DRIVERID_MSP3400,
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = msp_probe,
+ .detach_client = msp_detach,
+ .command = msp_command,
.driver = {
.suspend = msp_suspend,
.resume = msp_resume,
@@ -1574,7 +1578,7 @@ static struct i2c_client client_template =
{
.name = "(unset)",
.flags = I2C_CLIENT_ALLOW_USE,
- .driver = &driver,
+ .driver = &driver,
};
static int msp_attach(struct i2c_adapter *adap, int addr, int kind)
diff --git a/drivers/media/video/saa6588.c b/drivers/media/video/saa6588.c
index dca3ddf..9233225 100644
--- a/drivers/media/video/saa6588.c
+++ b/drivers/media/video/saa6588.c
@@ -422,7 +422,6 @@ static int saa6588_attach(struct i2c_adapter *adap, int addr, int kind)
s->timer.function = saa6588_timer;
s->timer.data = (unsigned long)s;
schedule_work(&s->work);
-
return 0;
}
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c
new file mode 100644
index 0000000..e717e30
--- /dev/null
+++ b/drivers/media/video/saa7115.c
@@ -0,0 +1,1378 @@
+/* saa7115 - Philips SAA7114/SAA7115 video decoder driver
+ *
+ * Based on saa7114 driver by Maxim Yevtyushkin, which is based on
+ * the saa7111 driver by Dave Perks.
+ *
+ * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
+ * Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
+ *
+ * Slight changes for video timing and attachment output by
+ * Wolfgang Scherr <scherr@net4you.net>
+ *
+ * Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
+ * by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
+ * (2/17/2003)
+ *
+ * VBI support (2004) and cleanups (2005) by Hans Verkuil <hverkuil@xs4all.nl>
+ *
+ * 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 (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-common.h>
+
+MODULE_DESCRIPTION("Philips SAA7114/SAA7115 video decoder driver");
+MODULE_AUTHOR("Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, Hans Verkuil");
+MODULE_LICENSE("GPL");
+
+static int debug = 0;
+module_param(debug, int, 0644);
+
+MODULE_PARM_DESC(debug, "Debug level (0-1)");
+
+#define saa7115_dbg(fmt,arg...) \
+ do { \
+ if (debug) \
+ printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); \
+ } while (0)
+
+#define saa7115_err(fmt, arg...) do { \
+ printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+#define saa7115_info(fmt, arg...) do { \
+ printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+static unsigned short normal_i2c[] = { 0x42 >> 1, 0x40 >> 1, I2C_CLIENT_END };
+
+
+I2C_CLIENT_INSMOD;
+
+struct saa7115_state {
+ v4l2_std_id std;
+ int input;
+ int enable;
+ int bright;
+ int contrast;
+ int hue;
+ int sat;
+ enum v4l2_chip_ident ident;
+ enum v4l2_audio_clock_freq audclk_freq;
+};
+
+/* ----------------------------------------------------------------------- */
+
+static inline int saa7115_write(struct i2c_client *client, u8 reg, u8 value)
+{
+ return i2c_smbus_write_byte_data(client, reg, value);
+}
+
+static int saa7115_writeregs(struct i2c_client *client, const unsigned char *regs)
+{
+ unsigned char reg, data;
+
+ while (*regs != 0x00) {
+ reg = *(regs++);
+ data = *(regs++);
+ if (saa7115_write(client, reg, data) < 0)
+ return -1;
+ }
+ return 0;
+}
+
+static inline int saa7115_read(struct i2c_client *client, u8 reg)
+{
+ return i2c_smbus_read_byte_data(client, reg);
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* If a value differs from the Hauppauge driver values, then the comment starts with
+ 'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
+ Hauppauge driver sets. */
+
+static const unsigned char saa7115_init_auto_input[] = {
+ 0x01, 0x48, /* white peak control disabled */
+ 0x03, 0x20, /* was 0x30. 0x20: long vertical blanking */
+ 0x04, 0x90, /* analog gain set to 0 */
+ 0x05, 0x90, /* analog gain set to 0 */
+ 0x06, 0xeb, /* horiz sync begin = -21 */
+ 0x07, 0xe0, /* horiz sync stop = -17 */
+ 0x0a, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */
+ 0x0b, 0x44, /* was 0x48. decoder contrast, 0x44 is itu standard */
+ 0x0c, 0x40, /* was 0x47. decoder saturation, 0x40 is itu standard */
+ 0x0d, 0x00, /* chrominance hue control */
+ 0x0f, 0x00, /* chrominance gain control: use automicatic mode */
+ 0x10, 0x06, /* chrominance/luminance control: active adaptive combfilter */
+ 0x11, 0x00, /* delay control */
+ 0x12, 0x9d, /* RTS0 output control: VGATE */
+ 0x13, 0x80, /* X-port output control: ITU656 standard mode, RTCO output enable RTCE */
+ 0x14, 0x00, /* analog/ADC/auto compatibility control */
+ 0x18, 0x40, /* raw data gain 0x00 = nominal */
+ 0x19, 0x80, /* raw data offset 0x80 = 0 LSB */
+ 0x1a, 0x77, /* color killer level control 0x77 = recommended */
+ 0x1b, 0x42, /* misc chroma control 0x42 = recommended */
+ 0x1c, 0xa9, /* combfilter control 0xA9 = recommended */
+ 0x1d, 0x01, /* combfilter control 0x01 = recommended */
+ 0x88, 0xd0, /* reset device */
+ 0x88, 0xf0, /* set device programmed, all in operational mode */
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_reset_scaler[] = {
+ 0x87, 0x00, /* disable I-port output */
+ 0x88, 0xd0, /* reset scaler */
+ 0x88, 0xf0, /* activate scaler */
+ 0x87, 0x01, /* enable I-port output */
+ 0x00, 0x00
+};
+
+/* ============== SAA7715 VIDEO templates ============= */
+
+static const unsigned char saa7115_cfg_60hz_fullres_x[] = {
+ 0xcc, 0xd0, /* hsize low (output), hor. output window size = 0x2d0 = 720 */
+ 0xcd, 0x02, /* hsize hi (output) */
+
+ /* Why not in 60hz-Land, too? */
+ 0xd0, 0x01, /* downscale = 1 */
+ 0xd8, 0x00, /* hor lum scaling 0x0400 = 1 */
+ 0xd9, 0x04,
+ 0xdc, 0x00, /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+ 0xdd, 0x02, /* H-scaling incr chroma */
+
+ 0x00, 0x00
+};
+static const unsigned char saa7115_cfg_60hz_fullres_y[] = {
+ 0xce, 0xf8, /* vsize low (output), ver. output window size = 248 (but 60hz is 240?) */
+ 0xcf, 0x00, /* vsize hi (output) */
+
+ /* Why not in 60hz-Land, too? */
+ 0xd5, 0x40, /* Lum contrast, nominal value = 0x40 */
+ 0xd6, 0x40, /* Chroma satur. nominal value = 0x80 */
+
+ 0xe0, 0x00, /* V-scaling incr luma low */
+ 0xe1, 0x04, /* " hi */
+ 0xe2, 0x00, /* V-scaling incr chroma low */
+ 0xe3, 0x04, /* " hi */
+
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_60hz_video[] = {
+ 0x80, 0x00, /* reset tasks */
+ 0x88, 0xd0, /* reset scaler */
+
+ 0x15, 0x03, /* VGATE pulse start */
+ 0x16, 0x11, /* VGATE pulse stop */
+ 0x17, 0x9c, /* VGATE MSB and other values */
+
+ 0x08, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
+ 0x0e, 0x07, /* lots of different stuff... video autodetection is on */
+
+ 0x5a, 0x06, /* Vertical offset, standard 60hz value for ITU656 line counting */
+
+ /* Task A */
+ 0x90, 0x80, /* Task Handling Control */
+ 0x91, 0x48, /* X-port formats/config */
+ 0x92, 0x40, /* Input Ref. signal Def. */
+ 0x93, 0x84, /* I-port config */
+ 0x94, 0x01, /* hoffset low (input), 0x0002 is minimum */
+ 0x95, 0x00, /* hoffset hi (input) */
+ 0x96, 0xd0, /* hsize low (input), 0x02d0 = 720 */
+ 0x97, 0x02, /* hsize hi (input) */
+ 0x98, 0x05, /* voffset low (input) */
+ 0x99, 0x00, /* voffset hi (input) */
+ 0x9a, 0x0c, /* vsize low (input), 0x0c = 12 */
+ 0x9b, 0x00, /* vsize hi (input) */
+ 0x9c, 0xa0, /* hsize low (output), 0x05a0 = 1440 */
+ 0x9d, 0x05, /* hsize hi (output) */
+ 0x9e, 0x0c, /* vsize low (output), 0x0c = 12 */
+ 0x9f, 0x00, /* vsize hi (output) */
+
+ /* Task B */
+ 0xc0, 0x00, /* Task Handling Control */
+ 0xc1, 0x08, /* X-port formats/config */
+ 0xc2, 0x00, /* Input Ref. signal Def. */
+ 0xc3, 0x80, /* I-port config */
+ 0xc4, 0x02, /* hoffset low (input), 0x0002 is minimum */
+ 0xc5, 0x00, /* hoffset hi (input) */
+ 0xc6, 0xd0, /* hsize low (input), 0x02d0 = 720 */
+ 0xc7, 0x02, /* hsize hi (input) */
+ 0xc8, 0x12, /* voffset low (input), 0x12 = 18 */
+ 0xc9, 0x00, /* voffset hi (input) */
+ 0xca, 0xf8, /* vsize low (input), 0xf8 = 248 */
+ 0xcb, 0x00, /* vsize hi (input) */
+ 0xcc, 0xd0, /* hsize low (output), 0x02d0 = 720 */
+ 0xcd, 0x02, /* hsize hi (output) */
+
+ 0xf0, 0xad, /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
+ 0xf1, 0x05, /* low bit with 0xF0 */
+ 0xf5, 0xad, /* Set pulse generator register */
+ 0xf6, 0x01,
+
+ 0x87, 0x00, /* Disable I-port output */
+ 0x88, 0xd0, /* reset scaler */
+ 0x80, 0x20, /* Activate only task "B", continuous mode (was 0xA0) */
+ 0x88, 0xf0, /* activate scaler */
+ 0x87, 0x01, /* Enable I-port output */
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_50hz_fullres_x[] = {
+ 0xcc, 0xd0, /* hsize low (output), 720 same as 60hz */
+ 0xcd, 0x02, /* hsize hi (output) */
+
+ 0xd0, 0x01, /* down scale = 1 */
+ 0xd8, 0x00, /* hor lum scaling 0x0400 = 1 */
+ 0xd9, 0x04,
+ 0xdc, 0x00, /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+ 0xdd, 0x02, /* H-scaling incr chroma */
+
+ 0x00, 0x00
+};
+static const unsigned char saa7115_cfg_50hz_fullres_y[] = {
+ 0xce, 0x20, /* vsize low (output), 0x0120 = 288 */
+ 0xcf, 0x01, /* vsize hi (output) */
+
+ 0xd5, 0x40, /* Lum contrast, nominal value = 0x40 */
+ 0xd6, 0x40, /* Chroma satur. nominal value = 0x80 */
+
+ 0xe0, 0x00, /* V-scaling incr luma low */
+ 0xe1, 0x04, /* " hi */
+ 0xe2, 0x00, /* V-scaling incr chroma low */
+ 0xe3, 0x04, /* " hi */
+
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_50hz_video[] = {
+ 0x80, 0x00, /* reset tasks */
+ 0x88, 0xd0, /* reset scaler */
+
+ 0x15, 0x37, /* VGATE start */
+ 0x16, 0x16, /* VGATE stop */
+ 0x17, 0x99, /* VGATE MSB and other values */
+
+ 0x08, 0x28, /* 0x28 = PAL */
+ 0x0e, 0x07, /* chrominance control 1 */
+
+ 0x5a, 0x03, /* Vertical offset, standard 50hz value */
+
+ /* Task A */
+ 0x90, 0x81, /* Task Handling Control */
+ 0x91, 0x48, /* X-port formats/config */
+ 0x92, 0x40, /* Input Ref. signal Def. */
+ 0x93, 0x84, /* I-port config */
+ /* This is weird: the datasheet says that you should use 2 as the minimum value, */
+ /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
+ 0x94, 0x00, /* hoffset low (input), 0x0002 is minimum */
+ 0x95, 0x00, /* hoffset hi (input) */
+ 0x96, 0xd0, /* hsize low (input), 0x02d0 = 720 */
+ 0x97, 0x02, /* hsize hi (input) */
+ 0x98, 0x03, /* voffset low (input) */
+ 0x99, 0x00, /* voffset hi (input) */
+ 0x9a, 0x12, /* vsize low (input), 0x12 = 18 */
+ 0x9b, 0x00, /* vsize hi (input) */
+ 0x9c, 0xa0, /* hsize low (output), 0x05a0 = 1440 */
+ 0x9d, 0x05, /* hsize hi (output) */
+ 0x9e, 0x12, /* vsize low (output), 0x12 = 18 */
+ 0x9f, 0x00, /* vsize hi (output) */
+
+ /* Task B */
+ 0xc0, 0x00, /* Task Handling Control */
+ 0xc1, 0x08, /* X-port formats/config */
+ 0xc2, 0x00, /* Input Ref. signal Def. */
+ 0xc3, 0x80, /* I-port config */
+ 0xc4, 0x00, /* hoffset low (input), 0x0002 is minimum. See comment at 0x94 above. */
+ 0xc5, 0x00, /* hoffset hi (input) */
+ 0xc6, 0xd0, /* hsize low (input), 0x02d0 = 720 */
+ 0xc7, 0x02, /* hsize hi (input) */
+ 0xc8, 0x16, /* voffset low (input), 0x16 = 22 */
+ 0xc9, 0x00, /* voffset hi (input) */
+ 0xca, 0x20, /* vsize low (input), 0x0120 = 288 */
+ 0xcb, 0x01, /* vsize hi (input) */
+ 0xcc, 0xd0, /* hsize low (output), 0x02d0 = 720 */
+ 0xcd, 0x02, /* hsize hi (output) */
+ 0xce, 0x20, /* vsize low (output), 0x0120 = 288 */
+ 0xcf, 0x01, /* vsize hi (output) */
+
+ 0xf0, 0xb0, /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
+ 0xf1, 0x05, /* low bit with 0xF0, (was 0x05) */
+ 0xf5, 0xb0, /* Set pulse generator register */
+ 0xf6, 0x01,
+
+ 0x87, 0x00, /* Disable I-port output */
+ 0x88, 0xd0, /* reset scaler (was 0xD0) */
+ 0x80, 0x20, /* Activate only task "B" */
+ 0x88, 0xf0, /* activate scaler */
+ 0x87, 0x01, /* Enable I-port output */
+ 0x00, 0x00
+};
+
+/* ============== SAA7715 VIDEO templates (end) ======= */
+
+static const unsigned char saa7115_cfg_vbi_on[] = {
+ 0x80, 0x00, /* reset tasks */
+ 0x88, 0xd0, /* reset scaler */
+ 0x80, 0x30, /* Activate both tasks */
+ 0x88, 0xf0, /* activate scaler */
+ 0x87, 0x01, /* Enable I-port output */
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_vbi_off[] = {
+ 0x80, 0x00, /* reset tasks */
+ 0x88, 0xd0, /* reset scaler */
+ 0x80, 0x20, /* Activate only task "B" */
+ 0x88, 0xf0, /* activate scaler */
+ 0x87, 0x01, /* Enable I-port output */
+ 0x00, 0x00
+};
+
+static const unsigned char saa7115_init_misc[] = {
+ 0x38, 0x03, /* audio stuff */
+ 0x39, 0x10,
+ 0x3a, 0x08,
+
+ 0x81, 0x01, /* reg 0x15,0x16 define blanking window */
+ 0x82, 0x00,
+ 0x83, 0x01, /* I port settings */
+ 0x84, 0x20,
+ 0x85, 0x21,
+ 0x86, 0xc5,
+ 0x87, 0x01,
+
+ /* Task A */
+ 0xa0, 0x01, /* down scale = 1 */
+ 0xa1, 0x00, /* prescale accumulation length = 1 */
+ 0xa2, 0x00, /* dc gain and fir prefilter control */
+ 0xa4, 0x80, /* Lum Brightness, nominal value = 0x80 */
+ 0xa5, 0x40, /* Lum contrast, nominal value = 0x40 */
+ 0xa6, 0x40, /* Chroma satur. nominal value = 0x80 */
+ 0xa8, 0x00, /* hor lum scaling 0x0200 = 2 zoom */
+ 0xa9, 0x02, /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
+ 0xaa, 0x00, /* H-phase offset Luma = 0 */
+ 0xac, 0x00, /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+ 0xad, 0x01, /* H-scaling incr chroma */
+ 0xae, 0x00, /* H-phase offset chroma. must be offset luma / 2 */
+
+ 0xb0, 0x00, /* V-scaling incr luma low */
+ 0xb1, 0x04, /* " hi */
+ 0xb2, 0x00, /* V-scaling incr chroma low */
+ 0xb3, 0x04, /* " hi */
+ 0xb4, 0x01, /* V-scaling mode control */
+ 0xb8, 0x00, /* V-phase offset chroma 00 */
+ 0xb9, 0x00, /* V-phase offset chroma 01 */
+ 0xba, 0x00, /* V-phase offset chroma 10 */
+ 0xbb, 0x00, /* V-phase offset chroma 11 */
+ 0xbc, 0x00, /* V-phase offset luma 00 */
+ 0xbd, 0x00, /* V-phase offset luma 01 */
+ 0xbe, 0x00, /* V-phase offset luma 10 */
+ 0xbf, 0x00, /* V-phase offset luma 11 */
+
+ /* Task B */
+ 0xd0, 0x01, /* down scale = 1 */
+ 0xd1, 0x00, /* prescale accumulation length = 1 */
+ 0xd2, 0x00, /* dc gain and fir prefilter control */
+ 0xd4, 0x80, /* Lum Brightness, nominal value = 0x80 */
+ 0xd5, 0x40, /* Lum contrast, nominal value = 0x40 */
+ 0xd6, 0x40, /* Chroma satur. nominal value = 0x80 */
+ 0xd8, 0x00, /* hor lum scaling 0x0400 = 1 */
+ 0xd9, 0x04,
+ 0xda, 0x00, /* H-phase offset Luma = 0 */
+ 0xdc, 0x00, /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+ 0xdd, 0x02, /* H-scaling incr chroma */
+ 0xde, 0x00, /* H-phase offset chroma. must be offset luma / 2 */
+
+ 0xe0, 0x00, /* V-scaling incr luma low */
+ 0xe1, 0x04, /* " hi */
+ 0xe2, 0x00, /* V-scaling incr chroma low */
+ 0xe3, 0x04, /* " hi */
+ 0xe4, 0x01, /* V-scaling mode control */
+ 0xe8, 0x00, /* V-phase offset chroma 00 */
+ 0xe9, 0x00, /* V-phase offset chroma 01 */
+ 0xea, 0x00, /* V-phase offset chroma 10 */
+ 0xeb, 0x00, /* V-phase offset chroma 11 */
+ 0xec, 0x00, /* V-phase offset luma 00 */
+ 0xed, 0x00, /* V-phase offset luma 01 */
+ 0xee, 0x00, /* V-phase offset luma 10 */
+ 0xef, 0x00, /* V-phase offset luma 11 */
+
+ 0xf2, 0x50, /* crystal clock = 24.576 MHz, target = 27MHz */
+ 0xf3, 0x46,
+ 0xf4, 0x00,
+ 0xf7, 0x4b, /* not the recommended settings! */
+ 0xf8, 0x00,
+ 0xf9, 0x4b,
+ 0xfa, 0x00,
+ 0xfb, 0x4b,
+ 0xff, 0x88, /* PLL2 lock detection settings: 71 lines 50% phase error */
+
+ /* Turn off VBI */
+ 0x40, 0x20, /* No framing code errors allowed. */
+ 0x41, 0xff,
+ 0x42, 0xff,
+ 0x43, 0xff,
+ 0x44, 0xff,
+ 0x45, 0xff,
+ 0x46, 0xff,
+ 0x47, 0xff,
+ 0x48, 0xff,
+ 0x49, 0xff,
+ 0x4a, 0xff,
+ 0x4b, 0xff,
+ 0x4c, 0xff,
+ 0x4d, 0xff,
+ 0x4e, 0xff,
+ 0x4f, 0xff,
+ 0x50, 0xff,
+ 0x51, 0xff,
+ 0x52, 0xff,
+ 0x53, 0xff,
+ 0x54, 0xff,
+ 0x55, 0xff,
+ 0x56, 0xff,
+ 0x57, 0xff,
+ 0x58, 0x40,
+ 0x59, 0x47,
+ 0x5b, 0x83,
+ 0x5d, 0xbd,
+ 0x5e, 0x35,
+
+ 0x02, 0x84, /* input tuner -> input 4, amplifier active */
+ 0x09, 0x53, /* 0x53, was 0x56 for 60hz. luminance control */
+
+ 0x80, 0x20, /* enable task B */
+ 0x88, 0xd0,
+ 0x88, 0xf0,
+ 0x00, 0x00
+};
+
+/* ============== SAA7715 AUDIO settings ============= */
+
+/* 48.0 kHz */
+static const unsigned char saa7115_cfg_48_audio[] = {
+ 0x34, 0xce,
+ 0x35, 0xfb,
+ 0x36, 0x30,
+ 0x00, 0x00
+};
+
+/* 44.1 kHz */
+static const unsigned char saa7115_cfg_441_audio[] = {
+ 0x34, 0xf2,
+ 0x35, 0x00,
+ 0x36, 0x2d,
+ 0x00, 0x00
+};
+
+/* 32.0 kHz */
+static const unsigned char saa7115_cfg_32_audio[] = {
+ 0x34, 0xdf,
+ 0x35, 0xa7,
+ 0x36, 0x20,
+ 0x00, 0x00
+};
+
+/* 48.0 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_48_audio[] = {
+ 0x30, 0xcd,
+ 0x31, 0x20,
+ 0x32, 0x03,
+ 0x00, 0x00
+};
+
+/* 48.0 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_48_audio[] = {
+ 0x30, 0x00,
+ 0x31, 0xc0,
+ 0x32, 0x03,
+ 0x00, 0x00
+};
+
+/* 44.1 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_441_audio[] = {
+ 0x30, 0xbc,
+ 0x31, 0xdf,
+ 0x32, 0x02,
+ 0x00, 0x00
+};
+
+/* 44.1 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_441_audio[] = {
+ 0x30, 0x00,
+ 0x31, 0x72,
+ 0x32, 0x03,
+ 0x00, 0x00
+};
+
+/* 32.0 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_32_audio[] = {
+ 0x30, 0xde,
+ 0x31, 0x15,
+ 0x32, 0x02,
+ 0x00, 0x00
+};
+
+/* 32.0 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_32_audio[] = {
+ 0x30, 0x00,
+ 0x31, 0x80,
+ 0x32, 0x02,
+ 0x00, 0x00
+};
+
+static int saa7115_odd_parity(u8 c)
+{
+ c ^= (c >> 4);
+ c ^= (c >> 2);
+ c ^= (c >> 1);
+
+ return c & 1;
+}
+
+static int saa7115_decode_vps(u8 * dst, u8 * p)
+{
+ static const u8 biphase_tbl[] = {
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+ 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+ 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+ 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+ 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+ 0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
+ 0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
+ 0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
+ 0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
+ 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+ 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+ 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+ 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+ 0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
+ 0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
+ 0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
+ 0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
+ 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+ 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+ 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+ 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+ 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+ 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+ 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+ };
+ int i;
+ u8 c, err = 0;
+
+ for (i = 0; i < 2 * 13; i += 2) {
+ err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
+ c = (biphase_tbl[p[i + 1]] & 0xf) | ((biphase_tbl[p[i]] & 0xf) << 4);
+ dst[i / 2] = c;
+ }
+ return err & 0xf0;
+}
+
+static int saa7115_decode_wss(u8 * p)
+{
+ static const int wss_bits[8] = {
+ 0, 0, 0, 1, 0, 1, 1, 1
+ };
+ unsigned char parity;
+ int wss = 0;
+ int i;
+
+ for (i = 0; i < 16; i++) {
+ int b1 = wss_bits[p[i] & 7];
+ int b2 = wss_bits[(p[i] >> 3) & 7];
+
+ if (b1 == b2)
+ return -1;
+ wss |= b2 << i;
+ }
+ parity = wss & 15;
+ parity ^= parity >> 2;
+ parity ^= parity >> 1;
+
+ if (!(parity & 1))
+ return -1;
+
+ return wss;
+}
+
+
+static int saa7115_set_audio_clock_freq(struct i2c_client *client, enum v4l2_audio_clock_freq freq)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+
+ saa7115_dbg("set audio clock freq: %d\n", freq);
+ switch (freq) {
+ case V4L2_AUDCLK_32_KHZ:
+ saa7115_writeregs(client, saa7115_cfg_32_audio);
+ if (state->std & V4L2_STD_525_60) {
+ saa7115_writeregs(client, saa7115_cfg_60hz_32_audio);
+ } else {
+ saa7115_writeregs(client, saa7115_cfg_50hz_32_audio);
+ }
+ break;
+ case V4L2_AUDCLK_441_KHZ:
+ saa7115_writeregs(client, saa7115_cfg_441_audio);
+ if (state->std & V4L2_STD_525_60) {
+ saa7115_writeregs(client, saa7115_cfg_60hz_441_audio);
+ } else {
+ saa7115_writeregs(client, saa7115_cfg_50hz_441_audio);
+ }
+ break;
+ case V4L2_AUDCLK_48_KHZ:
+ saa7115_writeregs(client, saa7115_cfg_48_audio);
+ if (state->std & V4L2_STD_525_60) {
+ saa7115_writeregs(client, saa7115_cfg_60hz_48_audio);
+ } else {
+ saa7115_writeregs(client, saa7115_cfg_50hz_48_audio);
+ }
+ break;
+ default:
+ saa7115_dbg("invalid audio setting %d\n", freq);
+ return -EINVAL;
+ }
+ state->audclk_freq = freq;
+ return 0;
+}
+
+static int saa7115_set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+
+ switch (ctrl->id) {
+ case V4L2_CID_BRIGHTNESS:
+ if (ctrl->value < 0 || ctrl->value > 255) {
+ saa7115_err("invalid brightness setting %d\n", ctrl->value);
+ return -ERANGE;
+ }
+
+ state->bright = ctrl->value;
+ saa7115_write(client, 0x0a, state->bright);
+ break;
+
+ case V4L2_CID_CONTRAST:
+ if (ctrl->value < 0 || ctrl->value > 127) {
+ saa7115_err("invalid contrast setting %d\n", ctrl->value);
+ return -ERANGE;
+ }
+
+ state->contrast = ctrl->value;
+ saa7115_write(client, 0x0b, state->contrast);
+ break;
+
+ case V4L2_CID_SATURATION:
+ if (ctrl->value < 0 || ctrl->value > 127) {
+ saa7115_err("invalid saturation setting %d\n", ctrl->value);
+ return -ERANGE;
+ }
+
+ state->sat = ctrl->value;
+ saa7115_write(client, 0x0c, state->sat);
+ break;
+
+ case V4L2_CID_HUE:
+ if (ctrl->value < -127 || ctrl->value > 127) {
+ saa7115_err("invalid hue setting %d\n", ctrl->value);
+ return -ERANGE;
+ }
+
+ state->hue = ctrl->value;
+ saa7115_write(client, 0x0d, state->hue);
+ break;
+ }
+
+ return 0;
+}
+
+static int saa7115_get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+
+ switch (ctrl->id) {
+ case V4L2_CID_BRIGHTNESS:
+ ctrl->value = state->bright;
+ break;
+ case V4L2_CID_CONTRAST:
+ ctrl->value = state->contrast;
+ break;
+ case V4L2_CID_SATURATION:
+ ctrl->value = state->sat;
+ break;
+ case V4L2_CID_HUE:
+ ctrl->value = state->hue;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void saa7115_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ int taskb = saa7115_read(client, 0x80) & 0x10;
+
+ // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
+ if (std & V4L2_STD_525_60) {
+ saa7115_dbg("decoder set standard 60 Hz\n");
+ saa7115_writeregs(client, saa7115_cfg_60hz_video);
+ } else {
+ saa7115_dbg("decoder set standard 50 Hz\n");
+ saa7115_writeregs(client, saa7115_cfg_50hz_video);
+ }
+
+ state->std = std;
+
+ /* restart task B if needed */
+ if (taskb && state->ident == V4L2_IDENT_SAA7114) {
+ saa7115_writeregs(client, saa7115_cfg_vbi_on);
+ }
+
+ /* switch audio mode too! */
+ saa7115_set_audio_clock_freq(client, state->audclk_freq);
+}
+
+static v4l2_std_id saa7115_get_v4lstd(struct i2c_client *client)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+
+ return state->std;
+}
+
+static void saa7115_log_status(struct i2c_client *client)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ char *audfreq = "undefined";
+ int reg1e, reg1f;
+ int signalOk;
+ int vcr;
+
+ switch (state->audclk_freq) {
+ case V4L2_AUDCLK_32_KHZ: audfreq = "32 kHz"; break;
+ case V4L2_AUDCLK_441_KHZ: audfreq = "44.1 kHz"; break;
+ case V4L2_AUDCLK_48_KHZ: audfreq = "48 kHz"; break;
+ }
+
+ saa7115_info("Audio frequency: %s\n", audfreq);
+ if (client->name[6] == '4') {
+ /* status for the saa7114 */
+ reg1f = saa7115_read(client, 0x1f);
+ signalOk = (reg1f & 0xc1) == 0x81;
+ saa7115_info("Video signal: %s\n", signalOk ? "ok" : "bad");
+ saa7115_info("Frequency: %s\n", (reg1f & 0x20) ? "60Hz" : "50Hz");
+ return;
+ }
+
+ /* status for the saa7115 */
+ reg1e = saa7115_read(client, 0x1e);
+ reg1f = saa7115_read(client, 0x1f);
+
+ signalOk = (reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80;
+ vcr = !(reg1f & 0x10);
+
+ saa7115_info("Video signal: %s\n", signalOk ? (vcr ? "VCR" : "broadcast/DVD") : "bad");
+ saa7115_info("Frequency: %s\n", (reg1f & 0x20) ? "60Hz" : "50Hz");
+
+ switch (reg1e & 0x03) {
+ case 1:
+ saa7115_info("Detected format: NTSC\n");
+ break;
+ case 2:
+ saa7115_info("Detected format: PAL\n");
+ break;
+ case 3:
+ saa7115_info("Detected format: SECAM\n");
+ break;
+ default:
+ saa7115_info("Detected format: BW/No color\n");
+ break;
+ }
+}
+
+/* setup the sliced VBI lcr registers according to the sliced VBI format */
+static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_format *fmt)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ int is_50hz = (state->std & V4L2_STD_625_50);
+ u8 lcr[24];
+ int i, x;
+
+ /* saa7114 doesn't yet support VBI */
+ if (state->ident == V4L2_IDENT_SAA7114)
+ return;
+
+ for (i = 0; i <= 23; i++)
+ lcr[i] = 0xff;
+
+ if (fmt->service_set == 0) {
+ /* raw VBI */
+ if (is_50hz)
+ for (i = 6; i <= 23; i++)
+ lcr[i] = 0xdd;
+ else
+ for (i = 10; i <= 21; i++)
+ lcr[i] = 0xdd;
+ } else {
+ /* sliced VBI */
+ /* first clear lines that cannot be captured */
+ if (is_50hz) {
+ for (i = 0; i <= 5; i++)
+ fmt->service_lines[0][i] =
+ fmt->service_lines[1][i] = 0;
+ }
+ else {
+ for (i = 0; i <= 9; i++)
+ fmt->service_lines[0][i] =
+ fmt->service_lines[1][i] = 0;
+ for (i = 22; i <= 23; i++)
+ fmt->service_lines[0][i] =
+ fmt->service_lines[1][i] = 0;
+ }
+
+ /* Now set the lcr values according to the specified service */
+ for (i = 6; i <= 23; i++) {
+ lcr[i] = 0;
+ for (x = 0; x <= 1; x++) {
+ switch (fmt->service_lines[1-x][i]) {
+ case 0:
+ lcr[i] |= 0xf << (4 * x);
+ break;
+ case V4L2_SLICED_TELETEXT_B:
+ lcr[i] |= 1 << (4 * x);
+ break;
+ case V4L2_SLICED_CAPTION_525:
+ lcr[i] |= 4 << (4 * x);
+ break;
+ case V4L2_SLICED_WSS_625:
+ lcr[i] |= 5 << (4 * x);
+ break;
+ case V4L2_SLICED_VPS:
+ lcr[i] |= 7 << (4 * x);
+ break;
+ }
+ }
+ }
+ }
+
+ /* write the lcr registers */
+ for (i = 2; i <= 23; i++) {
+ saa7115_write(client, i - 2 + 0x41, lcr[i]);
+ }
+
+ /* enable/disable raw VBI capturing */
+ saa7115_writeregs(client, fmt->service_set == 0 ? saa7115_cfg_vbi_on : saa7115_cfg_vbi_off);
+}
+
+static int saa7115_get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+ static u16 lcr2vbi[] = {
+ 0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
+ 0, V4L2_SLICED_CAPTION_525, /* 4 */
+ V4L2_SLICED_WSS_625, 0, /* 5 */
+ V4L2_SLICED_VPS, 0, 0, 0, 0, /* 7 */
+ 0, 0, 0, 0
+ };
+ struct v4l2_sliced_vbi_format *sliced = &fmt->fmt.sliced;
+ int i;
+
+ if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+ return -EINVAL;
+ memset(sliced, 0, sizeof(*sliced));
+ /* done if using raw VBI */
+ if (saa7115_read(client, 0x80) & 0x10)
+ return 0;
+ for (i = 2; i <= 23; i++) {
+ u8 v = saa7115_read(client, i - 2 + 0x41);
+
+ sliced->service_lines[0][i] = lcr2vbi[v >> 4];
+ sliced->service_lines[1][i] = lcr2vbi[v & 0xf];
+ sliced->service_set |=
+ sliced->service_lines[0][i] | sliced->service_lines[1][i];
+ }
+ return 0;
+}
+
+static int saa7115_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ struct v4l2_pix_format *pix;
+ int HPSC, HFSC;
+ int VSCY, Vsrc;
+ int is_50hz = state->std & V4L2_STD_625_50;
+
+ if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
+ saa7115_set_lcr(client, &fmt->fmt.sliced);
+ return 0;
+ }
+ if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+
+ pix = &(fmt->fmt.pix);
+
+ saa7115_dbg("decoder set size\n");
+
+ /* FIXME need better bounds checking here */
+ if ((pix->width < 1) || (pix->width > 1440))
+ return -EINVAL;
+ if ((pix->height < 1) || (pix->height > 960))
+ return -EINVAL;
+
+ /* probably have a valid size, let's set it */
+ /* Set output width/height */
+ /* width */
+ saa7115_write(client, 0xcc, (u8) (pix->width & 0xff));
+ saa7115_write(client, 0xcd, (u8) ((pix->width >> 8) & 0xff));
+ /* height */
+ saa7115_write(client, 0xce, (u8) (pix->height & 0xff));
+ saa7115_write(client, 0xcf, (u8) ((pix->height >> 8) & 0xff));
+
+ /* Scaling settings */
+ /* Hprescaler is floor(inres/outres) */
+ /* FIXME hardcoding input res */
+ if (pix->width != 720) {
+ HPSC = (int)(720 / pix->width);
+ /* 0 is not allowed (div. by zero) */
+ HPSC = HPSC ? HPSC : 1;
+ HFSC = (int)((1024 * 720) / (HPSC * pix->width));
+
+ saa7115_dbg("Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
+ /* FIXME hardcodes to "Task B"
+ * write H prescaler integer */
+ saa7115_write(client, 0xd0, (u8) (HPSC & 0x3f));
+
+ /* write H fine-scaling (luminance) */
+ saa7115_write(client, 0xd8, (u8) (HFSC & 0xff));
+ saa7115_write(client, 0xd9, (u8) ((HFSC >> 8) & 0xff));
+ /* write H fine-scaling (chrominance)
+ * must be lum/2, so i'll just bitshift :) */
+ saa7115_write(client, 0xDC, (u8) ((HFSC >> 1) & 0xff));
+ saa7115_write(client, 0xDD, (u8) ((HFSC >> 9) & 0xff));
+ } else {
+ if (is_50hz) {
+ saa7115_dbg("Setting full 50hz width\n");
+ saa7115_writeregs(client, saa7115_cfg_50hz_fullres_x);
+ } else {
+ saa7115_dbg("Setting full 60hz width\n");
+ saa7115_writeregs(client, saa7115_cfg_60hz_fullres_x);
+ }
+ }
+
+ Vsrc = is_50hz ? 576 : 480;
+
+ if (pix->height != Vsrc) {
+ VSCY = (int)((1024 * Vsrc) / pix->height);
+ saa7115_dbg("Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
+
+ /* Correct Contrast and Luminance */
+ saa7115_write(client, 0xd5, (u8) (64 * 1024 / VSCY));
+ saa7115_write(client, 0xd6, (u8) (64 * 1024 / VSCY));
+
+ /* write V fine-scaling (luminance) */
+ saa7115_write(client, 0xe0, (u8) (VSCY & 0xff));
+ saa7115_write(client, 0xe1, (u8) ((VSCY >> 8) & 0xff));
+ /* write V fine-scaling (chrominance) */
+ saa7115_write(client, 0xe2, (u8) (VSCY & 0xff));
+ saa7115_write(client, 0xe3, (u8) ((VSCY >> 8) & 0xff));
+ } else {
+ if (is_50hz) {
+ saa7115_dbg("Setting full 50Hz height\n");
+ saa7115_writeregs(client, saa7115_cfg_50hz_fullres_y);
+ } else {
+ saa7115_dbg("Setting full 60hz height\n");
+ saa7115_writeregs(client, saa7115_cfg_60hz_fullres_y);
+ }
+ }
+
+ saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+ return 0;
+}
+
+/* Decode the sliced VBI data stream as created by the saa7115.
+ The format is described in the saa7115 datasheet in Tables 25 and 26
+ and in Figure 33.
+ The current implementation uses SAV/EAV codes and not the ancillary data
+ headers. The vbi->p pointer points to the SDID byte right after the SAV
+ code. */
+static void saa7115_decode_vbi_line(struct i2c_client *client,
+ struct v4l2_decode_vbi_line *vbi)
+{
+ static const char vbi_no_data_pattern[] = {
+ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
+ };
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ u8 *p = vbi->p;
+ u32 wss;
+ int id1, id2; /* the ID1 and ID2 bytes from the internal header */
+
+ vbi->type = 0; /* mark result as a failure */
+ id1 = p[2];
+ id2 = p[3];
+ /* Note: the field bit is inverted for 60 Hz video */
+ if (state->std & V4L2_STD_525_60)
+ id1 ^= 0x40;
+
+ /* Skip internal header, p now points to the start of the payload */
+ p += 4;
+ vbi->p = p;
+
+ /* calculate field and line number of the VBI packet (1-23) */
+ vbi->is_second_field = ((id1 & 0x40) != 0);
+ vbi->line = (id1 & 0x3f) << 3;
+ vbi->line |= (id2 & 0x70) >> 4;
+
+ /* Obtain data type */
+ id2 &= 0xf;
+
+ /* If the VBI slicer does not detect any signal it will fill up
+ the payload buffer with 0xa0 bytes. */
+ if (!memcmp(p, vbi_no_data_pattern, sizeof(vbi_no_data_pattern)))
+ return;
+
+ /* decode payloads */
+ switch (id2) {
+ case 1:
+ vbi->type = V4L2_SLICED_TELETEXT_B;
+ break;
+ case 4:
+ if (!saa7115_odd_parity(p[0]) || !saa7115_odd_parity(p[1]))
+ return;
+ vbi->type = V4L2_SLICED_CAPTION_525;
+ break;
+ case 5:
+ wss = saa7115_decode_wss(p);
+ if (wss == -1)
+ return;
+ p[0] = wss & 0xff;
+ p[1] = wss >> 8;
+ vbi->type = V4L2_SLICED_WSS_625;
+ break;
+ case 7:
+ if (saa7115_decode_vps(p, p) != 0)
+ return;
+ vbi->type = V4L2_SLICED_VPS;
+ break;
+ default:
+ return;
+ }
+}
+
+/* ============ SAA7115 AUDIO settings (end) ============= */
+
+static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ int *iarg = arg;
+
+ /* ioctls to allow direct access to the saa7115 registers for testing */
+ switch (cmd) {
+ case VIDIOC_S_FMT:
+ return saa7115_set_v4lfmt(client, (struct v4l2_format *)arg);
+
+ case VIDIOC_G_FMT:
+ return saa7115_get_v4lfmt(client, (struct v4l2_format *)arg);
+
+ case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+ return saa7115_set_audio_clock_freq(client, *(enum v4l2_audio_clock_freq *)arg);
+
+ case VIDIOC_G_TUNER:
+ {
+ struct v4l2_tuner *vt = arg;
+ int status;
+
+ status = saa7115_read(client, 0x1f);
+
+ saa7115_dbg("status: 0x%02x\n", status);
+ vt->signal = ((status & (1 << 6)) == 0) ? 0xffff : 0x0;
+ break;
+ }
+
+ case VIDIOC_LOG_STATUS:
+ saa7115_log_status(client);
+ break;
+
+ case VIDIOC_G_CTRL:
+ return saa7115_get_v4lctrl(client, (struct v4l2_control *)arg);
+
+ case VIDIOC_S_CTRL:
+ return saa7115_set_v4lctrl(client, (struct v4l2_control *)arg);
+
+ case VIDIOC_G_STD:
+ *(v4l2_std_id *)arg = saa7115_get_v4lstd(client);
+ break;
+
+ case VIDIOC_S_STD:
+ saa7115_set_v4lstd(client, *(v4l2_std_id *)arg);
+ break;
+
+ case VIDIOC_G_INPUT:
+ *(int *)arg = state->input;
+ break;
+
+ case VIDIOC_S_INPUT:
+ saa7115_dbg("decoder set input %d\n", *iarg);
+ /* inputs from 0-9 are available */
+ if (*iarg < 0 || *iarg > 9) {
+ return -EINVAL;
+ }
+
+ if (state->input == *iarg)
+ break;
+ saa7115_dbg("now setting %s input\n",
+ *iarg >= 6 ? "S-Video" : "Composite");
+ state->input = *iarg;
+
+ /* select mode */
+ saa7115_write(client, 0x02,
+ (saa7115_read(client, 0x02) & 0xf0) |
+ state->input);
+
+ /* bypass chrominance trap for modes 6..9 */
+ saa7115_write(client, 0x09,
+ (saa7115_read(client, 0x09) & 0x7f) |
+ (state->input < 6 ? 0x0 : 0x80));
+ break;
+
+ case VIDIOC_STREAMON:
+ case VIDIOC_STREAMOFF:
+ saa7115_dbg("%s output\n",
+ (cmd == VIDIOC_STREAMON) ? "enable" : "disable");
+
+ if (state->enable != (cmd == VIDIOC_STREAMON)) {
+ state->enable = (cmd == VIDIOC_STREAMON);
+ saa7115_write(client, 0x87, state->enable);
+ }
+ break;
+
+ case VIDIOC_INT_DECODE_VBI_LINE:
+ saa7115_decode_vbi_line(client, arg);
+ break;
+
+ case VIDIOC_INT_RESET:
+ saa7115_dbg("decoder RESET\n");
+ saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+ break;
+
+ case VIDIOC_INT_G_VBI_DATA:
+ {
+ struct v4l2_sliced_vbi_data *data = arg;
+
+ switch (data->id) {
+ case V4L2_SLICED_WSS_625:
+ if (saa7115_read(client, 0x6b) & 0xc0)
+ return -EIO;
+ data->data[0] = saa7115_read(client, 0x6c);
+ data->data[1] = saa7115_read(client, 0x6d);
+ return 0;
+ case V4L2_SLICED_CAPTION_525:
+ if (data->field == 0) {
+ /* CC */
+ if (saa7115_read(client, 0x66) & 0xc0)
+ return -EIO;
+ data->data[0] = saa7115_read(client, 0x67);
+ data->data[1] = saa7115_read(client, 0x68);
+ return 0;
+ }
+ /* XDS */
+ if (saa7115_read(client, 0x66) & 0x30)
+ return -EIO;
+ data->data[0] = saa7115_read(client, 0x69);
+ data->data[1] = saa7115_read(client, 0x6a);
+ return 0;
+ default:
+ return -EINVAL;
+ }
+ break;
+ }
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+ case VIDIOC_INT_G_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_SAA711X)
+ return -EINVAL;
+ reg->val = saa7115_read(client, reg->reg & 0xff);
+ break;
+ }
+
+ case VIDIOC_INT_S_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_SAA711X)
+ return -EINVAL;
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+ saa7115_write(client, reg->reg & 0xff, reg->val & 0xff);
+ break;
+ }
+#endif
+
+ case VIDIOC_INT_G_CHIP_IDENT:
+ *iarg = state->ident;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_saa7115;
+
+static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind)
+{
+ struct i2c_client *client;
+ struct saa7115_state *state;
+ u8 chip_id;
+
+ /* Check if the adapter supports the needed features */
+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+ return 0;
+
+ client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+ if (client == 0)
+ return -ENOMEM;
+ memset(client, 0, sizeof(struct i2c_client));
+ client->addr = address;
+ client->adapter = adapter;
+ client->driver = &i2c_driver_saa7115;
+ client->flags = I2C_CLIENT_ALLOW_USE;
+ snprintf(client->name, sizeof(client->name) - 1, "saa7115");
+
+ saa7115_dbg("detecting saa7115 client on address 0x%x\n", address << 1);
+
+ saa7115_write(client, 0, 5);
+ chip_id = saa7115_read(client, 0) & 0x0f;
+ if (chip_id != 4 && chip_id != 5) {
+ saa7115_dbg("saa7115 not found\n");
+ kfree(client);
+ return 0;
+ }
+ if (chip_id == 4) {
+ snprintf(client->name, sizeof(client->name) - 1, "saa7114");
+ }
+ saa7115_info("saa711%d found @ 0x%x (%s)\n", chip_id, address << 1, adapter->name);
+
+ state = kmalloc(sizeof(struct saa7115_state), GFP_KERNEL);
+ i2c_set_clientdata(client, state);
+ if (state == NULL) {
+ kfree(client);
+ return -ENOMEM;
+ }
+ memset(state, 0, sizeof(struct saa7115_state));
+ state->std = V4L2_STD_NTSC;
+ state->input = -1;
+ state->enable = 1;
+ state->bright = 128;
+ state->contrast = 64;
+ state->hue = 0;
+ state->sat = 64;
+ state->ident = (chip_id == 4) ? V4L2_IDENT_SAA7114 : V4L2_IDENT_SAA7115;
+ state->audclk_freq = V4L2_AUDCLK_48_KHZ;
+
+ saa7115_dbg("writing init values\n");
+
+ /* init to 60hz/48khz */
+ saa7115_writeregs(client, saa7115_init_auto_input);
+ saa7115_writeregs(client, saa7115_init_misc);
+ saa7115_writeregs(client, saa7115_cfg_60hz_fullres_x);
+ saa7115_writeregs(client, saa7115_cfg_60hz_fullres_y);
+ saa7115_writeregs(client, saa7115_cfg_60hz_video);
+ saa7115_writeregs(client, saa7115_cfg_48_audio);
+ saa7115_writeregs(client, saa7115_cfg_60hz_48_audio);
+ saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+
+ i2c_attach_client(client);
+
+ saa7115_dbg("status: (1E) 0x%02x, (1F) 0x%02x\n",
+ saa7115_read(client, 0x1e), saa7115_read(client, 0x1f));
+
+ return 0;
+}
+
+static int saa7115_probe(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+ if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+ if (adapter->id == I2C_HW_B_BT848)
+#endif
+ return i2c_probe(adapter, &addr_data, &saa7115_attach);
+ return 0;
+}
+
+static int saa7115_detach(struct i2c_client *client)
+{
+ struct saa7115_state *state = i2c_get_clientdata(client);
+ int err;
+
+ err = i2c_detach_client(client);
+ if (err) {
+ return err;
+ }
+
+ kfree(state);
+ kfree(client);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* i2c implementation */
+static struct i2c_driver i2c_driver_saa7115 = {
+ .name = "saa7115",
+ .id = I2C_DRIVERID_SAA711X,
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = saa7115_probe,
+ .detach_client = saa7115_detach,
+ .command = saa7115_command,
+ .owner = THIS_MODULE,
+};
+
+
+static int __init saa7115_init_module(void)
+{
+ return i2c_add_driver(&i2c_driver_saa7115);
+}
+
+static void __exit saa7115_cleanup_module(void)
+{
+ i2c_del_driver(&i2c_driver_saa7115);
+}
+
+module_init(saa7115_init_module);
+module_exit(saa7115_cleanup_module);
diff --git a/drivers/media/video/saa711x.c b/drivers/media/video/saa711x.c
index 9aa8827..31f7b95 100644
--- a/drivers/media/video/saa711x.c
+++ b/drivers/media/video/saa711x.c
@@ -36,7 +36,6 @@
#include <asm/pgtable.h>
#include <asm/page.h>
#include <linux/sched.h>
-#include <asm/segment.h>
#include <linux/types.h>
#include <asm/uaccess.h>
#include <linux/videodev.h>
@@ -60,7 +59,7 @@ MODULE_PARM_DESC(debug, " Set the default Debug level. Default: 0 (Off) - (0-1)
#define dprintk(num, format, args...) \
do { \
if (debug >= num) \
- printk(format , ##args); \
+ printk(format, ##args); \
} while (0)
/* ----------------------------------------------------------------------- */
@@ -324,7 +323,7 @@ saa711x_command (struct i2c_client *client,
case VIDEO_MODE_SECAM:
saa711x_write(client, 0x08,
- (decoder->reg[0x0e] & 0x3f) | 0x00);
+ (decoder->reg[0x08] & 0x3f) | 0x00);
saa711x_write(client, 0x0e,
(decoder->reg[0x0e] & 0x8f) | 0x50);
break;
diff --git a/drivers/media/video/saa7127.c b/drivers/media/video/saa7127.c
new file mode 100644
index 0000000..c36f014
--- /dev/null
+++ b/drivers/media/video/saa7127.c
@@ -0,0 +1,849 @@
+/*
+ * saa7127 - Philips SAA7127/SAA7129 video encoder driver
+ *
+ * Copyright (C) 2003 Roy Bulter <rbulter@hetnet.nl>
+ *
+ * Based on SAA7126 video encoder driver by Gillem & Andreas Oberritter
+ *
+ * Copyright (C) 2000-2001 Gillem <htoa@gmx.net>
+ * Copyright (C) 2002 Andreas Oberritter <obi@saftware.de>
+ *
+ * Based on Stadis 4:2:2 MPEG-2 Decoder Driver by Nathan Laredo
+ *
+ * Copyright (C) 1999 Nathan Laredo <laredo@gnu.org>
+ *
+ * This driver is designed for the Hauppauge 250/350 Linux driver
+ * from the ivtv Project
+ *
+ * Copyright (C) 2003 Kevin Thayer <nufan_wfk@yahoo.com>
+ *
+ * Dual output support:
+ * Copyright (C) 2004 Eric Varsanyi
+ *
+ * NTSC Tuning and 7.5 IRE Setup
+ * Copyright (C) 2004 Chris Kennedy <c@groovy.org>
+ *
+ * VBI additions & cleanup:
+ * Copyright (C) 2004, 2005 Hans Verkuil <hverkuil@xs4all.nl>
+ *
+ * Note: the saa7126 is identical to the saa7127, and the saa7128 is
+ * identical to the saa7129, except that the saa7126 and saa7128 have
+ * macrovision anti-taping support. This driver will almost certainly
+ * work find for those chips, except of course for the missing anti-taping
+ * support.
+ *
+ * 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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-common.h>
+
+static int debug = 0;
+static int test_image = 0;
+
+MODULE_DESCRIPTION("Philips SAA7127/9 video encoder driver");
+MODULE_AUTHOR("Kevin Thayer, Chris Kennedy, Hans Verkuil");
+MODULE_LICENSE("GPL");
+module_param(debug, int, 0644);
+module_param(test_image, int, 0644);
+MODULE_PARM_DESC(debug, "debug level (0-2)");
+MODULE_PARM_DESC(test_image, "test_image (0-1)");
+
+#define saa7127_dbg(fmt, arg...) \
+ do { \
+ if (debug >= 1) \
+ printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); \
+ } while (0)
+
+/* High volume debug. Use with care. */
+#define saa7127_dbg_highvol(fmt, arg...) \
+ do { \
+ if (debug == 2) \
+ printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); \
+ } while (0)
+
+#define saa7127_err(fmt, arg...) do { \
+ printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+#define saa7127_info(fmt, arg...) do { \
+ printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+ i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
+
+
+I2C_CLIENT_INSMOD;
+
+/*
+ * SAA7127 registers
+ */
+
+#define SAA7127_REG_STATUS 0x00
+#define SAA7127_REG_WIDESCREEN_CONFIG 0x26
+#define SAA7127_REG_WIDESCREEN_ENABLE 0x27
+#define SAA7127_REG_BURST_START 0x28
+#define SAA7127_REG_BURST_END 0x29
+#define SAA7127_REG_COPYGEN_0 0x2a
+#define SAA7127_REG_COPYGEN_1 0x2b
+#define SAA7127_REG_COPYGEN_2 0x2c
+#define SAA7127_REG_OUTPUT_PORT_CONTROL 0x2d
+#define SAA7127_REG_GAIN_LUMINANCE_RGB 0x38
+#define SAA7127_REG_GAIN_COLORDIFF_RGB 0x39
+#define SAA7127_REG_INPUT_PORT_CONTROL_1 0x3a
+#define SAA7129_REG_FADE_KEY_COL2 0x4f
+#define SAA7127_REG_CHROMA_PHASE 0x5a
+#define SAA7127_REG_GAINU 0x5b
+#define SAA7127_REG_GAINV 0x5c
+#define SAA7127_REG_BLACK_LEVEL 0x5d
+#define SAA7127_REG_BLANKING_LEVEL 0x5e
+#define SAA7127_REG_VBI_BLANKING 0x5f
+#define SAA7127_REG_DAC_CONTROL 0x61
+#define SAA7127_REG_BURST_AMP 0x62
+#define SAA7127_REG_SUBC3 0x63
+#define SAA7127_REG_SUBC2 0x64
+#define SAA7127_REG_SUBC1 0x65
+#define SAA7127_REG_SUBC0 0x66
+#define SAA7127_REG_LINE_21_ODD_0 0x67
+#define SAA7127_REG_LINE_21_ODD_1 0x68
+#define SAA7127_REG_LINE_21_EVEN_0 0x69
+#define SAA7127_REG_LINE_21_EVEN_1 0x6a
+#define SAA7127_REG_RCV_PORT_CONTROL 0x6b
+#define SAA7127_REG_VTRIG 0x6c
+#define SAA7127_REG_HTRIG_HI 0x6d
+#define SAA7127_REG_MULTI 0x6e
+#define SAA7127_REG_CLOSED_CAPTION 0x6f
+#define SAA7127_REG_RCV2_OUTPUT_START 0x70
+#define SAA7127_REG_RCV2_OUTPUT_END 0x71
+#define SAA7127_REG_RCV2_OUTPUT_MSBS 0x72
+#define SAA7127_REG_TTX_REQUEST_H_START 0x73
+#define SAA7127_REG_TTX_REQUEST_H_DELAY_LENGTH 0x74
+#define SAA7127_REG_CSYNC_ADVANCE_VSYNC_SHIFT 0x75
+#define SAA7127_REG_TTX_ODD_REQ_VERT_START 0x76
+#define SAA7127_REG_TTX_ODD_REQ_VERT_END 0x77
+#define SAA7127_REG_TTX_EVEN_REQ_VERT_START 0x78
+#define SAA7127_REG_TTX_EVEN_REQ_VERT_END 0x79
+#define SAA7127_REG_FIRST_ACTIVE 0x7a
+#define SAA7127_REG_LAST_ACTIVE 0x7b
+#define SAA7127_REG_MSB_VERTICAL 0x7c
+#define SAA7127_REG_DISABLE_TTX_LINE_LO_0 0x7e
+#define SAA7127_REG_DISABLE_TTX_LINE_LO_1 0x7f
+
+/*
+ **********************************************************************
+ *
+ * Arrays with configuration parameters for the SAA7127
+ *
+ **********************************************************************
+ */
+
+struct i2c_reg_value {
+ unsigned char reg;
+ unsigned char value;
+};
+
+static const struct i2c_reg_value saa7129_init_config_extra[] = {
+ { SAA7127_REG_OUTPUT_PORT_CONTROL, 0x38 },
+ { SAA7127_REG_VTRIG, 0xfa },
+};
+
+static const struct i2c_reg_value saa7127_init_config_common[] = {
+ { SAA7127_REG_WIDESCREEN_CONFIG, 0x0d },
+ { SAA7127_REG_WIDESCREEN_ENABLE, 0x00 },
+ { SAA7127_REG_COPYGEN_0, 0x77 },
+ { SAA7127_REG_COPYGEN_1, 0x41 },
+ { SAA7127_REG_COPYGEN_2, 0x00 }, /* Macrovision enable/disable */
+ { SAA7127_REG_OUTPUT_PORT_CONTROL, 0x9e },
+ { SAA7127_REG_GAIN_LUMINANCE_RGB, 0x00 },
+ { SAA7127_REG_GAIN_COLORDIFF_RGB, 0x00 },
+ { SAA7127_REG_INPUT_PORT_CONTROL_1, 0x80 }, /* for color bars */
+ { SAA7127_REG_LINE_21_ODD_0, 0x77 },
+ { SAA7127_REG_LINE_21_ODD_1, 0x41 },
+ { SAA7127_REG_LINE_21_EVEN_0, 0x88 },
+ { SAA7127_REG_LINE_21_EVEN_1, 0x41 },
+ { SAA7127_REG_RCV_PORT_CONTROL, 0x12 },
+ { SAA7127_REG_VTRIG, 0xf9 },
+ { SAA7127_REG_HTRIG_HI, 0x00 },
+ { SAA7127_REG_RCV2_OUTPUT_START, 0x41 },
+ { SAA7127_REG_RCV2_OUTPUT_END, 0xc3 },
+ { SAA7127_REG_RCV2_OUTPUT_MSBS, 0x00 },
+ { SAA7127_REG_TTX_REQUEST_H_START, 0x3e },
+ { SAA7127_REG_TTX_REQUEST_H_DELAY_LENGTH, 0xb8 },
+ { SAA7127_REG_CSYNC_ADVANCE_VSYNC_SHIFT, 0x03 },
+ { SAA7127_REG_TTX_ODD_REQ_VERT_START, 0x15 },
+ { SAA7127_REG_TTX_ODD_REQ_VERT_END, 0x16 },
+ { SAA7127_REG_TTX_EVEN_REQ_VERT_START, 0x15 },
+ { SAA7127_REG_TTX_EVEN_REQ_VERT_END, 0x16 },
+ { SAA7127_REG_FIRST_ACTIVE, 0x1a },
+ { SAA7127_REG_LAST_ACTIVE, 0x01 },
+ { SAA7127_REG_MSB_VERTICAL, 0xc0 },
+ { SAA7127_REG_DISABLE_TTX_LINE_LO_0, 0x00 },
+ { SAA7127_REG_DISABLE_TTX_LINE_LO_1, 0x00 },
+ { 0, 0 }
+};
+
+#define SAA7127_60HZ_DAC_CONTROL 0x15
+static const struct i2c_reg_value saa7127_init_config_60hz[] = {
+ { SAA7127_REG_BURST_START, 0x19 },
+ /* BURST_END is also used as a chip ID in saa7127_detect_client */
+ { SAA7127_REG_BURST_END, 0x1d },
+ { SAA7127_REG_CHROMA_PHASE, 0xa3 },
+ { SAA7127_REG_GAINU, 0x98 },
+ { SAA7127_REG_GAINV, 0xd3 },
+ { SAA7127_REG_BLACK_LEVEL, 0x39 },
+ { SAA7127_REG_BLANKING_LEVEL, 0x2e },
+ { SAA7127_REG_VBI_BLANKING, 0x2e },
+ { SAA7127_REG_DAC_CONTROL, 0x15 },
+ { SAA7127_REG_BURST_AMP, 0x4d },
+ { SAA7127_REG_SUBC3, 0x1f },
+ { SAA7127_REG_SUBC2, 0x7c },
+ { SAA7127_REG_SUBC1, 0xf0 },
+ { SAA7127_REG_SUBC0, 0x21 },
+ { SAA7127_REG_MULTI, 0x90 },
+ { SAA7127_REG_CLOSED_CAPTION, 0x11 },
+ { 0, 0 }
+};
+
+#define SAA7127_50HZ_DAC_CONTROL 0x02
+static struct i2c_reg_value saa7127_init_config_50hz[] = {
+ { SAA7127_REG_BURST_START, 0x21 },
+ /* BURST_END is also used as a chip ID in saa7127_detect_client */
+ { SAA7127_REG_BURST_END, 0x1d },
+ { SAA7127_REG_CHROMA_PHASE, 0x3f },
+ { SAA7127_REG_GAINU, 0x7d },
+ { SAA7127_REG_GAINV, 0xaf },
+ { SAA7127_REG_BLACK_LEVEL, 0x33 },
+ { SAA7127_REG_BLANKING_LEVEL, 0x35 },
+ { SAA7127_REG_VBI_BLANKING, 0x35 },
+ { SAA7127_REG_DAC_CONTROL, 0x02 },
+ { SAA7127_REG_BURST_AMP, 0x2f },
+ { SAA7127_REG_SUBC3, 0xcb },
+ { SAA7127_REG_SUBC2, 0x8a },
+ { SAA7127_REG_SUBC1, 0x09 },
+ { SAA7127_REG_SUBC0, 0x2a },
+ { SAA7127_REG_MULTI, 0xa0 },
+ { SAA7127_REG_CLOSED_CAPTION, 0x00 },
+ { 0, 0 }
+};
+
+/* Enumeration for the Supported input types */
+enum saa7127_input_type {
+ SAA7127_INPUT_TYPE_NORMAL,
+ SAA7127_INPUT_TYPE_TEST_IMAGE
+};
+
+/* Enumeration for the Supported Output signal types */
+enum saa7127_output_type {
+ SAA7127_OUTPUT_TYPE_BOTH,
+ SAA7127_OUTPUT_TYPE_COMPOSITE,
+ SAA7127_OUTPUT_TYPE_SVIDEO,
+ SAA7127_OUTPUT_TYPE_RGB,
+ SAA7127_OUTPUT_TYPE_YUV_C,
+ SAA7127_OUTPUT_TYPE_YUV_V
+};
+
+/*
+ **********************************************************************
+ *
+ * Encoder Struct, holds the configuration state of the encoder
+ *
+ **********************************************************************
+ */
+
+struct saa7127_state {
+ v4l2_std_id std;
+ enum v4l2_chip_ident ident;
+ enum saa7127_input_type input_type;
+ enum saa7127_output_type output_type;
+ int video_enable;
+ int wss_enable;
+ u16 wss_mode;
+ int cc_enable;
+ u16 cc_data;
+ int xds_enable;
+ u16 xds_data;
+ int vps_enable;
+ u8 vps_data[5];
+ u8 reg_2d;
+ u8 reg_3a;
+ u8 reg_3a_cb; /* colorbar bit */
+ u8 reg_61;
+};
+
+static const char * const output_strs[] =
+{
+ "S-Video + Composite",
+ "Composite",
+ "S-Video",
+ "RGB",
+ "YUV C",
+ "YUV V"
+};
+
+static const char * const wss_strs[] = {
+ "invalid",
+ "letterbox 14:9 center",
+ "letterbox 14:9 top",
+ "invalid",
+ "letterbox 16:9 top",
+ "invalid",
+ "invalid",
+ "16:9 full format anamorphic"
+ "4:3 full format",
+ "invalid",
+ "invalid",
+ "letterbox 16:9 center",
+ "invalid",
+ "letterbox >16:9 center",
+ "14:9 full format center",
+ "invalid",
+};
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_read(struct i2c_client *client, u8 reg)
+{
+ return i2c_smbus_read_byte_data(client, reg);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_write(struct i2c_client *client, u8 reg, u8 val)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ if (i2c_smbus_write_byte_data(client, reg, val) == 0)
+ return 0;
+ }
+ saa7127_err("I2C Write Problem\n");
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_write_inittab(struct i2c_client *client,
+ const struct i2c_reg_value *regs)
+{
+ while (regs->reg != 0) {
+ saa7127_write(client, regs->reg, regs->value);
+ regs++;
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_vps(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ int enable = (data->line != 0);
+
+ if (enable && (data->field != 0 || data->line != 16))
+ return -EINVAL;
+ if (state->vps_enable != enable) {
+ saa7127_dbg("Turn VPS Signal %s\n", enable ? "on" : "off");
+ saa7127_write(client, 0x54, enable << 7);
+ state->vps_enable = enable;
+ }
+ if (!enable)
+ return 0;
+
+ state->vps_data[0] = data->data[4];
+ state->vps_data[1] = data->data[10];
+ state->vps_data[2] = data->data[11];
+ state->vps_data[3] = data->data[12];
+ state->vps_data[4] = data->data[13];
+ saa7127_dbg("Set VPS data %02x %02x %02x %02x %02x\n",
+ state->vps_data[0], state->vps_data[1],
+ state->vps_data[2], state->vps_data[3],
+ state->vps_data[4]);
+ saa7127_write(client, 0x55, state->vps_data[0]);
+ saa7127_write(client, 0x56, state->vps_data[1]);
+ saa7127_write(client, 0x57, state->vps_data[2]);
+ saa7127_write(client, 0x58, state->vps_data[3]);
+ saa7127_write(client, 0x59, state->vps_data[4]);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_cc(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ u16 cc = data->data[1] << 8 | data->data[0];
+ int enable = (data->line != 0);
+
+ if (enable && (data->field != 0 || data->line != 21))
+ return -EINVAL;
+ if (state->cc_enable != enable) {
+ saa7127_dbg("Turn CC %s\n", enable ? "on" : "off");
+ saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
+ (state->xds_enable << 7) | (enable << 6) | 0x11);
+ state->cc_enable = enable;
+ }
+ if (!enable)
+ return 0;
+
+ saa7127_dbg_highvol("CC data: %04x\n", cc);
+ saa7127_write(client, SAA7127_REG_LINE_21_ODD_0, cc & 0xff);
+ saa7127_write(client, SAA7127_REG_LINE_21_ODD_1, cc >> 8);
+ state->cc_data = cc;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_xds(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ u16 xds = data->data[1] << 8 | data->data[0];
+ int enable = (data->line != 0);
+
+ if (enable && (data->field != 1 || data->line != 21))
+ return -EINVAL;
+ if (state->xds_enable != enable) {
+ saa7127_dbg("Turn XDS %s\n", enable ? "on" : "off");
+ saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
+ (enable << 7) | (state->cc_enable << 6) | 0x11);
+ state->xds_enable = enable;
+ }
+ if (!enable)
+ return 0;
+
+ saa7127_dbg_highvol("XDS data: %04x\n", xds);
+ saa7127_write(client, SAA7127_REG_LINE_21_EVEN_0, xds & 0xff);
+ saa7127_write(client, SAA7127_REG_LINE_21_EVEN_1, xds >> 8);
+ state->xds_data = xds;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_wss(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ int enable = (data->line != 0);
+
+ if (enable && (data->field != 0 || data->line != 23))
+ return -EINVAL;
+ if (state->wss_enable != enable) {
+ saa7127_dbg("Turn WSS %s\n", enable ? "on" : "off");
+ saa7127_write(client, 0x27, enable << 7);
+ state->wss_enable = enable;
+ }
+ if (!enable)
+ return 0;
+
+ saa7127_write(client, 0x26, data->data[0]);
+ saa7127_write(client, 0x27, 0x80 | (data->data[1] & 0x3f));
+ saa7127_dbg("WSS mode: %s\n", wss_strs[data->data[0] & 0xf]);
+ state->wss_mode = (data->data[1] & 0x3f) << 8 | data->data[0];
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_video_enable(struct i2c_client *client, int enable)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+
+ if (enable) {
+ saa7127_dbg("Enable Video Output\n");
+ saa7127_write(client, 0x2d, state->reg_2d);
+ saa7127_write(client, 0x61, state->reg_61);
+ } else {
+ saa7127_dbg("Disable Video Output\n");
+ saa7127_write(client, 0x2d, (state->reg_2d & 0xf0));
+ saa7127_write(client, 0x61, (state->reg_61 | 0xc0));
+ }
+ state->video_enable = enable;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_std(struct i2c_client *client, v4l2_std_id std)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ const struct i2c_reg_value *inittab;
+
+ if (std & V4L2_STD_525_60) {
+ saa7127_dbg("Selecting 60 Hz video Standard\n");
+ inittab = saa7127_init_config_60hz;
+ state->reg_61 = SAA7127_60HZ_DAC_CONTROL;
+ } else {
+ saa7127_dbg("Selecting 50 Hz video Standard\n");
+ inittab = saa7127_init_config_50hz;
+ state->reg_61 = SAA7127_50HZ_DAC_CONTROL;
+ }
+
+ /* Write Table */
+ saa7127_write_inittab(client, inittab);
+ state->std = std;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_output_type(struct i2c_client *client, int output)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+
+ switch (output) {
+ case SAA7127_OUTPUT_TYPE_RGB:
+ state->reg_2d = 0x0f; /* RGB + CVBS (for sync) */
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_COMPOSITE:
+ state->reg_2d = 0x08; /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_SVIDEO:
+ state->reg_2d = 0xff; /* 11111111 croma -> R, luma -> CVBS + G + B */
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_YUV_V:
+ state->reg_2d = 0x4f; /* reg 2D = 01001111, all DAC's on, RGB + VBS */
+ state->reg_3a = 0x0b; /* reg 3A = 00001011, bypass RGB-matrix */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_YUV_C:
+ state->reg_2d = 0x0f; /* reg 2D = 00001111, all DAC's on, RGB + CVBS */
+ state->reg_3a = 0x0b; /* reg 3A = 00001011, bypass RGB-matrix */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_BOTH:
+ state->reg_2d = 0xbf;
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ saa7127_dbg("Selecting %s output type\n", output_strs[output]);
+
+ /* Configure Encoder */
+ saa7127_write(client, 0x2d, state->reg_2d);
+ saa7127_write(client, 0x3a, state->reg_3a | state->reg_3a_cb);
+ state->output_type = output;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_input_type(struct i2c_client *client, int input)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+
+ switch (input) {
+ case SAA7127_INPUT_TYPE_NORMAL: /* avia */
+ saa7127_dbg("Selecting Normal Encoder Input\n");
+ state->reg_3a_cb = 0;
+ break;
+
+ case SAA7127_INPUT_TYPE_TEST_IMAGE: /* color bar */
+ saa7127_dbg("Selecting Color Bar generator\n");
+ state->reg_3a_cb = 0x80;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ saa7127_write(client, 0x3a, state->reg_3a | state->reg_3a_cb);
+ state->input_type = input;
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_command(struct i2c_client *client,
+ unsigned int cmd, void *arg)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ struct v4l2_format *fmt = arg;
+ int *iarg = arg;
+
+ switch (cmd) {
+ case VIDIOC_S_STD:
+ if (state->std == *(v4l2_std_id *)arg)
+ break;
+ return saa7127_set_std(client, *(v4l2_std_id *)arg);
+
+ case VIDIOC_G_STD:
+ *(v4l2_std_id *)arg = state->std;
+ break;
+
+ case VIDIOC_S_INPUT:
+ if (state->input_type == *iarg)
+ break;
+ return saa7127_set_input_type(client, *iarg);
+
+ case VIDIOC_S_OUTPUT:
+ if (state->output_type == *iarg)
+ break;
+ return saa7127_set_output_type(client, *iarg);
+
+ case VIDIOC_STREAMON:
+ case VIDIOC_STREAMOFF:
+ if (state->video_enable == (cmd == VIDIOC_STREAMON))
+ break;
+ return saa7127_set_video_enable(client, cmd == VIDIOC_STREAMON);
+
+ case VIDIOC_G_FMT:
+ if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+ return -EINVAL;
+
+ memset(&fmt->fmt.sliced, 0, sizeof(fmt->fmt.sliced));
+ if (state->vps_enable)
+ fmt->fmt.sliced.service_lines[0][16] = V4L2_SLICED_VPS;
+ if (state->wss_enable)
+ fmt->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
+ if (state->cc_enable) {
+ fmt->fmt.sliced.service_lines[0][21] = V4L2_SLICED_CAPTION_525;
+ fmt->fmt.sliced.service_lines[1][21] = V4L2_SLICED_CAPTION_525;
+ }
+ fmt->fmt.sliced.service_set =
+ (state->vps_enable ? V4L2_SLICED_VPS : 0) |
+ (state->wss_enable ? V4L2_SLICED_WSS_625 : 0) |
+ (state->cc_enable ? V4L2_SLICED_CAPTION_525 : 0);
+ break;
+
+ case VIDIOC_LOG_STATUS:
+ saa7127_info("Standard: %s\n", (state->std & V4L2_STD_525_60) ? "60 Hz" : "50 Hz");
+ saa7127_info("Input: %s\n", state->input_type ? "color bars" : "normal");
+ saa7127_info("Output: %s\n", state->video_enable ?
+ output_strs[state->output_type] : "disabled");
+ saa7127_info("WSS: %s\n", state->wss_enable ?
+ wss_strs[state->wss_mode] : "disabled");
+ saa7127_info("VPS: %s\n", state->vps_enable ? "enabled" : "disabled");
+ saa7127_info("CC: %s\n", state->cc_enable ? "enabled" : "disabled");
+ break;
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+ case VIDIOC_INT_G_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_SAA7127)
+ return -EINVAL;
+ reg->val = saa7127_read(client, reg->reg & 0xff);
+ break;
+ }
+
+ case VIDIOC_INT_S_REGISTER:
+ {
+ struct v4l2_register *reg = arg;
+
+ if (reg->i2c_id != I2C_DRIVERID_SAA7127)
+ return -EINVAL;
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+ saa7127_write(client, reg->reg & 0xff, reg->val & 0xff);
+ break;
+ }
+#endif
+
+ case VIDIOC_INT_S_VBI_DATA:
+ {
+ struct v4l2_sliced_vbi_data *data = arg;
+
+ switch (data->id) {
+ case V4L2_SLICED_WSS_625:
+ return saa7127_set_wss(client, data);
+ case V4L2_SLICED_VPS:
+ return saa7127_set_vps(client, data);
+ case V4L2_SLICED_CAPTION_525:
+ if (data->field == 0)
+ return saa7127_set_cc(client, data);
+ return saa7127_set_xds(client, data);
+ default:
+ return -EINVAL;
+ }
+ break;
+ }
+
+ case VIDIOC_INT_G_CHIP_IDENT:
+ *(enum v4l2_chip_ident *)arg = state->ident;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_saa7127;
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_attach(struct i2c_adapter *adapter, int address, int kind)
+{
+ struct i2c_client *client;
+ struct saa7127_state *state;
+ struct v4l2_sliced_vbi_data vbi = { 0, 0, 0, 0 }; /* set to disabled */
+ int read_result = 0;
+
+ /* Check if the adapter supports the needed features */
+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+ return 0;
+
+ client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+ if (client == 0)
+ return -ENOMEM;
+
+ memset(client, 0, sizeof(struct i2c_client));
+ client->addr = address;
+ client->adapter = adapter;
+ client->driver = &i2c_driver_saa7127;
+ client->flags = I2C_CLIENT_ALLOW_USE;
+ snprintf(client->name, sizeof(client->name) - 1, "saa7127");
+
+ saa7127_dbg("detecting saa7127 client on address 0x%x\n", address << 1);
+
+ /* First test register 0: Bits 5-7 are a version ID (should be 0),
+ and bit 2 should also be 0.
+ This is rather general, so the second test is more specific and
+ looks at the 'ending point of burst in clock cycles' which is
+ 0x1d after a reset and not expected to ever change. */
+ if ((saa7127_read(client, 0) & 0xe4) != 0 ||
+ (saa7127_read(client, 0x29) & 0x3f) != 0x1d) {
+ saa7127_dbg("saa7127 not found\n");
+ kfree(client);
+ return 0;
+ }
+ state = kmalloc(sizeof(struct saa7127_state), GFP_KERNEL);
+
+ if (state == NULL) {
+ kfree(client);
+ return (-ENOMEM);
+ }
+
+ i2c_set_clientdata(client, state);
+ memset(state, 0, sizeof(struct saa7127_state));
+
+ /* Configure Encoder */
+
+ saa7127_dbg("Configuring encoder\n");
+ saa7127_write_inittab(client, saa7127_init_config_common);
+ saa7127_set_std(client, V4L2_STD_NTSC);
+ saa7127_set_output_type(client, SAA7127_OUTPUT_TYPE_BOTH);
+ saa7127_set_vps(client, &vbi);
+ saa7127_set_wss(client, &vbi);
+ saa7127_set_cc(client, &vbi);
+ saa7127_set_xds(client, &vbi);
+ if (test_image == 1) {
+ /* The Encoder has an internal Colorbar generator */
+ /* This can be used for debugging */
+ saa7127_set_input_type(client, SAA7127_INPUT_TYPE_TEST_IMAGE);
+ } else {
+ saa7127_set_input_type(client, SAA7127_INPUT_TYPE_NORMAL);
+ }
+ saa7127_set_video_enable(client, 1);
+
+ /* Detect if it's an saa7129 */
+ read_result = saa7127_read(client, SAA7129_REG_FADE_KEY_COL2);
+ saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, 0xaa);
+ if (saa7127_read(client, SAA7129_REG_FADE_KEY_COL2) == 0xaa) {
+ saa7127_info("saa7129 found @ 0x%x (%s)\n", address << 1, adapter->name);
+ saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, read_result);
+ saa7127_write_inittab(client, saa7129_init_config_extra);
+ state->ident = V4L2_IDENT_SAA7129;
+ } else {
+ saa7127_info("saa7127 found @ 0x%x (%s)\n", address << 1, adapter->name);
+ state->ident = V4L2_IDENT_SAA7127;
+ }
+
+ i2c_attach_client(client);
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_probe(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+ if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+ if (adapter->id == I2C_HW_B_BT848)
+#endif
+ return i2c_probe(adapter, &addr_data, saa7127_attach);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_detach(struct i2c_client *client)
+{
+ struct saa7127_state *state = i2c_get_clientdata(client);
+ int err;
+
+ /* Turn off TV output */
+ saa7127_set_video_enable(client, 0);
+
+ err = i2c_detach_client(client);
+
+ if (err) {
+ return err;
+ }
+
+ kfree(state);
+ kfree(client);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_saa7127 = {
+ .name = "saa7127",
+ .id = I2C_DRIVERID_SAA7127,
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = saa7127_probe,
+ .detach_client = saa7127_detach,
+ .command = saa7127_command,
+ .owner = THIS_MODULE,
+};
+
+
+/* ----------------------------------------------------------------------- */
+
+static int __init saa7127_init_module(void)
+{
+ return i2c_add_driver(&i2c_driver_saa7127);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void __exit saa7127_cleanup_module(void)
+{
+ i2c_del_driver(&i2c_driver_saa7127);
+}
+
+/* ----------------------------------------------------------------------- */
+
+module_init(saa7127_init_module);
+module_exit(saa7127_cleanup_module);
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig
index 624e880..8a5c3e7 100644
--- a/drivers/media/video/saa7134/Kconfig
+++ b/drivers/media/video/saa7134/Kconfig
@@ -1,6 +1,6 @@
config VIDEO_SAA7134
tristate "Philips SAA7134 support"
- depends on VIDEO_DEV && PCI && I2C && SOUND
+ depends on VIDEO_DEV && PCI && I2C
select VIDEO_BUF
select VIDEO_IR
select VIDEO_TUNER
@@ -12,6 +12,29 @@ config VIDEO_SAA7134
To compile this driver as a module, choose M here: the
module will be called saa7134.
+config VIDEO_SAA7134_ALSA
+ tristate "Philips SAA7134 DMA audio support"
+ depends on VIDEO_SAA7134 && SND
+ select SND_PCM_OSS
+ ---help---
+ This is a video4linux driver for direct (DMA) audio in
+ Philips SAA713x based TV cards using ALSA
+
+ To compile this driver as a module, choose M here: the
+ module will be called saa7134-alsa.
+
+config VIDEO_SAA7134_OSS
+ tristate "Philips SAA7134 DMA audio support (OSS, DEPRECATED)"
+ depends on VIDEO_SAA7134 && SOUND_PRIME && !VIDEO_SAA7134_ALSA
+ ---help---
+ This is a video4linux driver for direct (DMA) audio in
+ Philips SAA713x based TV cards using OSS
+
+ This is deprecated in favor of the ALSA module
+
+ To compile this driver as a module, choose M here: the
+ module will be called saa7134-oss.
+
config VIDEO_SAA7134_DVB
tristate "DVB/ATSC Support for saa7134 based TV cards"
depends on VIDEO_SAA7134 && DVB_CORE
@@ -41,8 +64,8 @@ config VIDEO_SAA7134_DVB_ALL_FRONTENDS
If you are unsure, choose Y.
config VIDEO_SAA7134_DVB_MT352
- tristate "Zarlink MT352 DVB-T Support"
- default m
+ bool "Zarlink MT352 DVB-T Support"
+ default y
depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
select DVB_MT352
---help---
@@ -50,8 +73,8 @@ config VIDEO_SAA7134_DVB_MT352
Philips saa7134 chip and the MT352 demodulator.
config VIDEO_SAA7134_DVB_TDA1004X
- tristate "Phillips TDA10045H/TDA10046H DVB-T Support"
- default m
+ bool "Phillips TDA10045H/TDA10046H DVB-T Support"
+ default y
depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
select DVB_TDA1004X
---help---
@@ -59,8 +82,8 @@ config VIDEO_SAA7134_DVB_TDA1004X
Philips saa7134 chip and the TDA10045H/TDA10046H demodulator.
config VIDEO_SAA7134_DVB_NXT200X
- tristate "NXT2002/NXT2004 ATSC Support"
- default m
+ bool "NXT2002/NXT2004 ATSC Support"
+ default y
depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
select DVB_NXT200X
---help---
diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile
index e0b28f0..1ba9984 100644
--- a/drivers/media/video/saa7134/Makefile
+++ b/drivers/media/video/saa7134/Makefile
@@ -1,24 +1,23 @@
saa7134-objs := saa7134-cards.o saa7134-core.o saa7134-i2c.o \
- saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \
- saa7134-vbi.o saa7134-video.o saa7134-input.o
+ saa7134-ts.o saa7134-tvaudio.o saa7134-vbi.o \
+ saa7134-video.o saa7134-input.o
obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \
- saa6752hs.o saa7134-alsa.o
+ saa6752hs.o
+
+obj-$(CONFIG_VIDEO_SAA7134_ALSA) += saa7134-alsa.o
+obj-$(CONFIG_VIDEO_SAA7134_OSS) += saa7134-oss.o
+
obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
EXTRA_CFLAGS += -I$(src)/..
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
-ifneq ($(CONFIG_VIDEO_BUF_DVB),n)
- EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1
-endif
-ifneq ($(CONFIG_DVB_MT352),n)
- EXTRA_CFLAGS += -DHAVE_MT352=1
-endif
-ifneq ($(CONFIG_DVB_TDA1004X),n)
- EXTRA_CFLAGS += -DHAVE_TDA1004X=1
-endif
-ifneq ($(CONFIG_DVB_NXT200X),n)
- EXTRA_CFLAGS += -DHAVE_NXT200X=1
-endif
+
+extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1
+extra-cflags-$(CONFIG_DVB_MT352) += -DHAVE_MT352=1
+extra-cflags-$(CONFIG_DVB_TDA1004X) += -DHAVE_TDA1004X=1
+extra-cflags-$(CONFIG_DVB_NXT200X) += -DHAVE_NXT200X=1
+
+EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m)
diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c
index cdd1ed9..a61d24f 100644
--- a/drivers/media/video/saa7134/saa6752hs.c
+++ b/drivers/media/video/saa7134/saa6752hs.c
@@ -523,7 +523,8 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
h->standard = 0;
i2c_set_clientdata(&h->client, h);
- i2c_attach_client(&h->client);
+ i2c_attach_client(&h->client);
+
return 0;
}
@@ -597,19 +598,19 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
static struct i2c_driver driver = {
.owner = THIS_MODULE,
- .name = "i2c saa6752hs MPEG encoder",
- .id = I2C_DRIVERID_SAA6752HS,
- .flags = I2C_DF_NOTIFY,
- .attach_adapter = saa6752hs_probe,
- .detach_client = saa6752hs_detach,
- .command = saa6752hs_command,
+ .name = "i2c saa6752hs MPEG encoder",
+ .id = I2C_DRIVERID_SAA6752HS,
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = saa6752hs_probe,
+ .detach_client = saa6752hs_detach,
+ .command = saa6752hs_command,
};
static struct i2c_client client_template =
{
.name = "saa6752hs",
.flags = I2C_CLIENT_ALLOW_USE,
- .driver = &driver,
+ .driver = &driver,
};
static int __init saa6752hs_init_module(void)
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index 4f3c423..ade05f7 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -30,7 +30,9 @@
#include <sound/core.h>
#include <sound/control.h>
#include <sound/pcm.h>
+#include <sound/pcm_params.h>
#include <sound/initval.h>
+#include <linux/interrupt.h>
#include "saa7134.h"
#include "saa7134-reg.h"
@@ -49,6 +51,7 @@ MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
#define MIXER_ADDR_LINE2 2
#define MIXER_ADDR_LAST 2
+
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
@@ -57,18 +60,21 @@ module_param_array(index, int, NULL, 0444);
MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
#define dprintk(fmt, arg...) if (debug) \
- printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
+ printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ##arg)
+
+
/*
* Main chip structure
*/
+
typedef struct snd_card_saa7134 {
snd_card_t *card;
spinlock_t mixer_lock;
int mixer_volume[MIXER_ADDR_LAST+1][2];
int capture_source[MIXER_ADDR_LAST+1][2];
struct pci_dev *pci;
- struct saa7134_dev *saadev;
+ struct saa7134_dev *dev;
unsigned long iobase;
int irq;
@@ -83,12 +89,10 @@ typedef struct snd_card_saa7134 {
*/
typedef struct snd_card_saa7134_pcm {
- struct saa7134_dev *saadev;
+ struct saa7134_dev *dev;
spinlock_t lock;
- unsigned int pcm_size; /* buffer size */
- unsigned int pcm_count; /* bytes per period */
- unsigned int pcm_bps; /* bytes per second */
+
snd_pcm_substream_t *substream;
} snd_card_saa7134_pcm_t;
@@ -100,13 +104,11 @@ static snd_card_t *snd_saa7134_cards[SNDRV_CARDS];
*
* Called when the capture device is released or the buffer overflows
*
- * - Copied verbatim from saa7134-oss's dsp_dma_stop. Can be dropped
- * if we just share dsp_dma_stop and use it here
+ * - Copied verbatim from saa7134-oss's dsp_dma_stop.
*
*/
static void saa7134_dma_stop(struct saa7134_dev *dev)
-
{
dev->dmasound.dma_blk = -1;
dev->dmasound.dma_running = 0;
@@ -118,8 +120,7 @@ static void saa7134_dma_stop(struct saa7134_dev *dev)
*
* Called when preparing the capture device for use
*
- * - Copied verbatim from saa7134-oss's dsp_dma_start. Can be dropped
- * if we just share dsp_dma_start and use it here
+ * - Copied verbatim from saa7134-oss's dsp_dma_start.
*
*/
@@ -141,7 +142,8 @@ static void saa7134_dma_start(struct saa7134_dev *dev)
*
*/
-void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
+static void saa7134_irq_alsa_done(struct saa7134_dev *dev,
+ unsigned long status)
{
int next_blk, reg = 0;
@@ -170,9 +172,9 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count,
dev->dmasound.bufsize, dev->dmasound.blocks);
+ spin_unlock(&dev->slock);
snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN);
- saa7134_dma_stop(dev);
- goto done;
+ return;
}
/* next block addr */
@@ -194,6 +196,7 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
snd_pcm_period_elapsed(dev->dmasound.substream);
spin_lock(&dev->slock);
}
+
done:
spin_unlock(&dev->slock);
@@ -209,7 +212,9 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs)
{
- struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
+ struct saa7134_dmasound *dmasound = dev_id;
+ struct saa7134_dev *dev = dmasound->priv_data;
+
unsigned long report, status;
int loop, handled = 0;
@@ -248,56 +253,23 @@ static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
int cmd)
{
snd_pcm_runtime_t *runtime = substream->runtime;
- snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
- struct saa7134_dev *dev=saapcm->saadev;
+ snd_card_saa7134_pcm_t *pcm = runtime->private_data;
+ struct saa7134_dev *dev=pcm->dev;
int err = 0;
- spin_lock_irq(&dev->slock);
- if (cmd == SNDRV_PCM_TRIGGER_START) {
+ spin_lock(&dev->slock);
+ if (cmd == SNDRV_PCM_TRIGGER_START) {
/* start dma */
saa7134_dma_start(dev);
- } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
+ } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
/* stop dma */
saa7134_dma_stop(dev);
- } else {
- err = -EINVAL;
- }
- spin_unlock_irq(&dev->slock);
-
- return err;
-}
-
-/*
- * DMA buffer config
- *
- * Sets the values that will later be used as the size of the buffer,
- * size of the fragments, and total number of fragments.
- * Must be called during the preparation stage, before memory is
- * allocated
- *
- * - Copied verbatim from saa7134-oss. Can be dropped
- * if we just share dsp_buffer_conf from OSS.
- */
+ } else {
+ err = -EINVAL;
+ }
+ spin_unlock(&dev->slock);
-static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
-{
- if (blksize < 0x100)
- blksize = 0x100;
- if (blksize > 0x10000)
- blksize = 0x10000;
-
- if (blocks < 2)
- blocks = 2;
- if ((blksize * blocks) > 1024*1024)
- blocks = 1024*1024 / blksize;
-
- dev->dmasound.blocks = blocks;
- dev->dmasound.blksize = blksize;
- dev->dmasound.bufsize = blksize * blocks;
-
- dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
- blocks,blksize,blksize * blocks / 1024);
- return 0;
+ return err;
}
/*
@@ -307,16 +279,16 @@ static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
* ALSA, but I was unable to use ALSA's own DMA, and had to force the
* usage of V4L's
*
- * - Copied verbatim from saa7134-oss. Can be dropped
- * if we just share dsp_buffer_init from OSS.
+ * - Copied verbatim from saa7134-oss.
+ *
*/
static int dsp_buffer_init(struct saa7134_dev *dev)
{
int err;
- if (!dev->dmasound.bufsize)
- BUG();
+ BUG_ON(!dev->dmasound.bufsize);
+
videobuf_dma_init(&dev->dmasound.dma);
err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
(dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
@@ -326,6 +298,28 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
}
/*
+ * DMA buffer release
+ *
+ * Called after closing the device, during snd_card_saa7134_capture_close
+ *
+ */
+
+static int dsp_buffer_free(struct saa7134_dev *dev)
+{
+ if (!dev->dmasound.blksize)
+ BUG();
+
+ videobuf_dma_free(&dev->dmasound.dma);
+
+ dev->dmasound.blocks = 0;
+ dev->dmasound.blksize = 0;
+ dev->dmasound.bufsize = 0;
+
+ return 0;
+}
+
+
+/*
* ALSA PCM preparation
*
* - One of the ALSA capture callbacks.
@@ -340,84 +334,30 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
- int err, bswap, sign;
+ int bswap, sign;
u32 fmt, control;
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
struct saa7134_dev *dev;
- snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
- unsigned int bps;
- unsigned long size;
- unsigned count;
+ snd_card_saa7134_pcm_t *pcm = runtime->private_data;
- size = snd_pcm_lib_buffer_bytes(substream);
- count = snd_pcm_lib_period_bytes(substream);
-
- saapcm->saadev->dmasound.substream = substream;
- bps = runtime->rate * runtime->channels;
- bps *= snd_pcm_format_width(runtime->format);
- bps /= 8;
- if (bps <= 0)
- return -EINVAL;
- saapcm->pcm_bps = bps;
- saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream);
- saapcm->pcm_count = snd_pcm_lib_period_bytes(substream);
-
-
- dev=saa7134->saadev;
-
- dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count));
-
- err = dsp_buffer_init(dev);
- if (0 != err)
- goto fail2;
-
- /* prepare buffer */
- if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
- return err;
- if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
- goto fail1;
- if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
- dev->dmasound.dma.sglist,
- dev->dmasound.dma.sglen,
- 0)))
- goto fail2;
+ pcm->dev->dmasound.substream = substream;
+ dev = saa7134->dev;
-
- switch (runtime->format) {
- case SNDRV_PCM_FORMAT_U8:
- case SNDRV_PCM_FORMAT_S8:
+ if (snd_pcm_format_width(runtime->format) == 8)
fmt = 0x00;
- break;
- case SNDRV_PCM_FORMAT_U16_LE:
- case SNDRV_PCM_FORMAT_U16_BE:
- case SNDRV_PCM_FORMAT_S16_LE:
- case SNDRV_PCM_FORMAT_S16_BE:
+ else
fmt = 0x01;
- break;
- default:
- err = -EINVAL;
- return 1;
- }
- switch (runtime->format) {
- case SNDRV_PCM_FORMAT_S8:
- case SNDRV_PCM_FORMAT_S16_LE:
- case SNDRV_PCM_FORMAT_S16_BE:
+ if (snd_pcm_format_signed(runtime->format))
sign = 1;
- break;
- default:
+ else
sign = 0;
- break;
- }
- switch (runtime->format) {
- case SNDRV_PCM_FORMAT_U16_BE:
- case SNDRV_PCM_FORMAT_S16_BE:
- bswap = 1; break;
- default:
- bswap = 0; break;
- }
+ if (snd_pcm_format_big_endian(runtime->format))
+ bswap = 1;
+ else
+ bswap = 0;
switch (dev->pci->device) {
case PCI_DEVICE_ID_PHILIPS_SAA7134:
@@ -445,7 +385,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
fmt |= 0x04;
saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
- //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210);
break;
}
@@ -459,12 +398,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
if (bswap)
control |= SAA7134_RS_CONTROL_BSWAP;
- /* I should be able to use runtime->dma_addr in the control
- byte, but it doesn't work. So I allocate the DMA using the
- V4L functions, and force ALSA to use that as the DMA area */
-
- runtime->dma_area = dev->dmasound.dma.vmalloc;
-
saa_writel(SAA7134_RS_BA1(6),0);
saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
saa_writel(SAA7134_RS_PITCH(6),0);
@@ -473,12 +406,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
dev->dmasound.rate = runtime->rate;
return 0;
- fail2:
- saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
- fail1:
- videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
- return err;
-
}
@@ -496,10 +423,8 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
- snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
- struct saa7134_dev *dev=saapcm->saadev;
-
-
+ snd_card_saa7134_pcm_t *pcm = runtime->private_data;
+ struct saa7134_dev *dev=pcm->dev;
if (dev->dmasound.read_count) {
dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream);
@@ -540,9 +465,9 @@ static snd_pcm_hardware_t snd_card_saa7134_capture =
static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
{
- snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
+ snd_card_saa7134_pcm_t *pcm = runtime->private_data;
- kfree(saapcm);
+ kfree(pcm);
}
@@ -552,17 +477,76 @@ static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
* - One of the ALSA capture callbacks.
*
* Called on initialization, right before the PCM preparation
- * Usually used in ALSA to allocate the DMA, but since we don't use the
- * ALSA DMA it does nothing
*
*/
static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
snd_pcm_hw_params_t * hw_params)
{
+ snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
+ struct saa7134_dev *dev;
+ unsigned int period_size, periods;
+ int err;
- return 0;
+ period_size = params_period_bytes(hw_params);
+ periods = params_periods(hw_params);
+
+ snd_assert(period_size >= 0x100 && period_size <= 0x10000,
+ return -EINVAL);
+ snd_assert(periods >= 2, return -EINVAL);
+ snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL);
+
+ dev = saa7134->dev;
+
+ if (dev->dmasound.blocks == periods &&
+ dev->dmasound.blksize == period_size)
+ return 0;
+ /* release the old buffer */
+ if (substream->runtime->dma_area) {
+ saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+ videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+ dsp_buffer_free(dev);
+ substream->runtime->dma_area = NULL;
+ }
+ dev->dmasound.blocks = periods;
+ dev->dmasound.blksize = period_size;
+ dev->dmasound.bufsize = period_size * periods;
+
+ err = dsp_buffer_init(dev);
+ if (0 != err) {
+ dev->dmasound.blocks = 0;
+ dev->dmasound.blksize = 0;
+ dev->dmasound.bufsize = 0;
+ return err;
+ }
+
+ if (0 != (err = videobuf_dma_pci_map(dev->pci, &dev->dmasound.dma))) {
+ dsp_buffer_free(dev);
+ return err;
+ }
+ if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) {
+ videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+ dsp_buffer_free(dev);
+ return err;
+ }
+ if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
+ dev->dmasound.dma.sglist,
+ dev->dmasound.dma.sglen,
+ 0))) {
+ saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+ videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+ dsp_buffer_free(dev);
+ return err;
+ }
+
+ /* I should be able to use runtime->dma_addr in the control
+ byte, but it doesn't work. So I allocate the DMA using the
+ V4L functions, and force ALSA to use that as the DMA area */
+
+ substream->runtime->dma_area = dev->dmasound.dma.vmalloc;
+
+ return 1;
}
@@ -572,33 +556,23 @@ static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
* - One of the ALSA capture callbacks.
*
* Called after closing the device, but before snd_card_saa7134_capture_close
- * Usually used in ALSA to free the DMA, but since we don't use the
- * ALSA DMA I'm almost sure this isn't necessary.
+ * It stops the DMA audio and releases the buffers.
*
*/
static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
{
- return 0;
-}
-
-/*
- * DMA buffer release
- *
- * Called after closing the device, during snd_card_saa7134_capture_close
- *
- */
+ snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
+ struct saa7134_dev *dev;
-static int dsp_buffer_free(struct saa7134_dev *dev)
-{
- if (!dev->dmasound.blksize)
- BUG();
+ dev = saa7134->dev;
- videobuf_dma_free(&dev->dmasound.dma);
-
- dev->dmasound.blocks = 0;
- dev->dmasound.blksize = 0;
- dev->dmasound.bufsize = 0;
+ if (substream->runtime->dma_area) {
+ saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+ videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+ dsp_buffer_free(dev);
+ substream->runtime->dma_area = NULL;
+ }
return 0;
}
@@ -608,21 +582,12 @@ static int dsp_buffer_free(struct saa7134_dev *dev)
*
* - One of the ALSA capture callbacks.
*
- * Called after closing the device. It stops the DMA audio and releases
- * the buffers
+ * Called after closing the device.
*
*/
static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
{
- snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream);
- struct saa7134_dev *dev = chip->saadev;
-
- /* unlock buffer */
- saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
- videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
-
- dsp_buffer_free(dev);
return 0;
}
@@ -639,29 +604,28 @@ static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
- snd_card_saa7134_pcm_t *saapcm;
+ snd_card_saa7134_pcm_t *pcm;
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
- struct saa7134_dev *dev = saa7134->saadev;
+ struct saa7134_dev *dev = saa7134->dev;
int err;
down(&dev->dmasound.lock);
- dev->dmasound.afmt = SNDRV_PCM_FORMAT_U8;
- dev->dmasound.channels = 2;
dev->dmasound.read_count = 0;
dev->dmasound.read_offset = 0;
up(&dev->dmasound.lock);
- saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL);
- if (saapcm == NULL)
+ pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
+ if (pcm == NULL)
return -ENOMEM;
- saapcm->saadev=saa7134->saadev;
- spin_lock_init(&saapcm->lock);
+ pcm->dev=saa7134->dev;
+
+ spin_lock_init(&pcm->lock);
- saapcm->substream = substream;
- runtime->private_data = saapcm;
+ pcm->substream = substream;
+ runtime->private_data = pcm;
runtime->private_free = snd_card_saa7134_runtime_free;
runtime->hw = snd_card_saa7134_capture;
@@ -736,7 +700,6 @@ static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
- unsigned long flags;
int change, addr = kcontrol->private_value;
int left, right;
@@ -750,12 +713,12 @@ static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
right = 0;
if (right > 20)
right = 20;
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock_irq(&chip->mixer_lock);
change = chip->mixer_volume[addr][0] != left ||
chip->mixer_volume[addr][1] != right;
chip->mixer_volume[addr][0] = left;
chip->mixer_volume[addr][1] = right;
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock_irq(&chip->mixer_lock);
return change;
}
@@ -777,38 +740,37 @@ static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_
static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
- unsigned long flags;
int addr = kcontrol->private_value;
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock_irq(&chip->mixer_lock);
ucontrol->value.integer.value[0] = chip->capture_source[addr][0];
ucontrol->value.integer.value[1] = chip->capture_source[addr][1];
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock_irq(&chip->mixer_lock);
+
return 0;
}
static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
- unsigned long flags;
int change, addr = kcontrol->private_value;
int left, right;
u32 anabar, xbarin;
int analog_io, rate;
struct saa7134_dev *dev;
- dev = chip->saadev;
+ dev = chip->dev;
left = ucontrol->value.integer.value[0] & 1;
right = ucontrol->value.integer.value[1] & 1;
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock_irq(&chip->mixer_lock);
change = chip->capture_source[addr][0] != left ||
chip->capture_source[addr][1] != right;
chip->capture_source[addr][0] = left;
chip->capture_source[addr][1] = right;
dev->dmasound.input=addr;
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock_irq(&chip->mixer_lock);
if (change) {
@@ -898,43 +860,44 @@ static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
return 0;
}
-static int snd_saa7134_free(snd_card_saa7134_t *chip)
+static void snd_saa7134_free(snd_card_t * card)
{
- return 0;
-}
+ snd_card_saa7134_t *chip = card->private_data;
+
+ if (chip->dev->dmasound.priv_data == NULL)
+ return;
+
+ if (chip->irq >= 0) {
+ synchronize_irq(chip->irq);
+ free_irq(chip->irq, &chip->dev->dmasound);
+ }
+
+ chip->dev->dmasound.priv_data = NULL;
-static int snd_saa7134_dev_free(snd_device_t *device)
-{
- snd_card_saa7134_t *chip = device->device_data;
- return snd_saa7134_free(chip);
}
/*
* ALSA initialization
*
- * Called by saa7134-core, it creates the basic structures and registers
- * the ALSA devices
+ * Called by the init routine, once for each saa7134 device present,
+ * it creates the basic structures and registers the ALSA devices
*
*/
-int alsa_card_saa7134_create (struct saa7134_dev *saadev)
+static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
{
- static int dev;
snd_card_t *card;
snd_card_saa7134_t *chip;
int err;
- static snd_device_ops_t ops = {
- .dev_free = snd_saa7134_dev_free,
- };
- if (dev >= SNDRV_CARDS)
+ if (devnum >= SNDRV_CARDS)
return -ENODEV;
- if (!enable[dev])
+ if (!enable[devnum])
return -ENODEV;
- card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
+ card = snd_card_new(index[devnum], id[devnum], THIS_MODULE, sizeof(snd_card_saa7134_t));
if (card == NULL)
return -ENOMEM;
@@ -943,34 +906,33 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev)
/* Card "creation" */
- chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
- if (chip == NULL) {
- return -ENOMEM;
- }
+ card->private_free = snd_saa7134_free;
+ chip = (snd_card_saa7134_t *) card->private_data;
spin_lock_init(&chip->lock);
spin_lock_init(&chip->mixer_lock);
- chip->saadev = saadev;
+ chip->dev = dev;
chip->card = card;
- chip->pci = saadev->pci;
- chip->irq = saadev->pci->irq;
- chip->iobase = pci_resource_start(saadev->pci, 0);
+ chip->pci = dev->pci;
+ chip->iobase = pci_resource_start(dev->pci, 0);
- err = request_irq(saadev->pci->irq, saa7134_alsa_irq,
- SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev);
+
+ err = request_irq(dev->pci->irq, saa7134_alsa_irq,
+ SA_SHIRQ | SA_INTERRUPT, dev->name,
+ (void*) &dev->dmasound);
if (err < 0) {
printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
- saadev->name, saadev->pci->irq);
+ dev->name, dev->pci->irq);
goto __nodev;
}
- if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
- goto __nodev;
- }
+ chip->irq = dev->pci->irq;
+
+ init_MUTEX(&dev->dmasound.lock);
if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
goto __nodev;
@@ -984,19 +946,36 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev)
strcpy(card->shortname, "SAA7134");
sprintf(card->longname, "%s at 0x%lx irq %d",
- chip->saadev->name, chip->iobase, chip->irq);
+ chip->dev->name, chip->iobase, chip->irq);
+
+ printk(KERN_INFO "%s/alsa: %s registered as card %d\n",dev->name,card->longname,index[devnum]);
if ((err = snd_card_register(card)) == 0) {
- snd_saa7134_cards[dev] = card;
+ snd_saa7134_cards[devnum] = card;
return 0;
}
__nodev:
snd_card_free(card);
- kfree(chip);
return err;
}
+
+static int alsa_device_init(struct saa7134_dev *dev)
+{
+ dev->dmasound.priv_data = dev;
+ alsa_card_saa7134_create(dev,dev->nr);
+ return 1;
+}
+
+static int alsa_device_exit(struct saa7134_dev *dev)
+{
+
+ snd_card_free(snd_saa7134_cards[dev->nr]);
+ snd_saa7134_cards[dev->nr] = NULL;
+ return 1;
+}
+
/*
* Module initializer
*
@@ -1007,17 +986,30 @@ __nodev:
static int saa7134_alsa_init(void)
{
- struct saa7134_dev *saadev = NULL;
- struct list_head *list;
+ struct saa7134_dev *dev = NULL;
+ struct list_head *list;
+
+ if (!dmasound_init && !dmasound_exit) {
+ dmasound_init = alsa_device_init;
+ dmasound_exit = alsa_device_exit;
+ } else {
+ printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
+ return -EBUSY;
+ }
printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
- list_for_each(list,&saa7134_devlist) {
- saadev = list_entry(list, struct saa7134_dev, devlist);
- alsa_card_saa7134_create(saadev);
- }
+ list_for_each(list,&saa7134_devlist) {
+ dev = list_entry(list, struct saa7134_dev, devlist);
+ if (dev->dmasound.priv_data == NULL) {
+ alsa_device_init(dev);
+ } else {
+ printk(KERN_ERR "saa7134 ALSA: DMA sound is being handled by OSS. ignoring %s\n",dev->name);
+ return -EBUSY;
+ }
+ }
- if (saadev == NULL)
+ if (dev == NULL)
printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
return 0;
@@ -1028,7 +1020,7 @@ static int saa7134_alsa_init(void)
* Module destructor
*/
-void saa7134_alsa_exit(void)
+static void saa7134_alsa_exit(void)
{
int idx;
@@ -1036,12 +1028,18 @@ void saa7134_alsa_exit(void)
snd_card_free(snd_saa7134_cards[idx]);
}
+ dmasound_init = NULL;
+ dmasound_exit = NULL;
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
return;
}
-module_init(saa7134_alsa_init);
+/* We initialize this late, to make sure the sound system is up and running */
+late_initcall(saa7134_alsa_init);
module_exit(saa7134_alsa_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ricardo Cerqueira");
+
+
+
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 663d03e..672fb20 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -976,7 +976,7 @@ struct saa7134_board saa7134_boards[] = {
.radio_type = UNSET,
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
- .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER,
+ .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_ACTIVE,
.inputs = {{
.name = name_tv,
.vmux = 3,
@@ -2529,6 +2529,32 @@ struct saa7134_board saa7134_boards[] = {
.amux = LINE1,
}},
},
+ [SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
+ .name = "MSI TV@Anywhere plus",
+ .audio_clock = 0x00187de7,
+ .tuner_type = TUNER_PHILIPS_TDA8290,
+ .radio_type = UNSET,
+ .tuner_addr = ADDR_UNSET,
+ .radio_addr = ADDR_UNSET,
+ .inputs = {{
+ .name = name_tv,
+ .vmux = 1,
+ .amux = TV,
+ .tv = 1,
+ },{
+ .name = name_comp1,
+ .vmux = 3,
+ .amux = LINE1,
+ },{
+ .name = name_svideo,
+ .vmux = 0,
+ .amux = LINE1,
+ }},
+ .radio = {
+ .name = name_radio,
+ .amux = LINE1,
+ },
+ },
};
const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -2970,6 +2996,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
.subdevice = 0x2018,
.driver_data = SAA7134_BOARD_PHILIPS_TIGER,
},{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
+ .subvendor = 0x1462,
+ .subdevice = 0x6231,
+ .driver_data = SAA7134_BOARD_MSI_TVATANYWHERE_PLUS,
+ },{
/* --- boards without eeprom + subsystem ID --- */
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index 19b8874..23d8747 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -53,13 +53,13 @@ static unsigned int gpio_tracking = 0;
module_param(gpio_tracking, int, 0644);
MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
-static unsigned int oss = 0;
-module_param(oss, int, 0444);
-MODULE_PARM_DESC(oss,"register oss devices (default: no)");
-
static unsigned int alsa = 0;
-module_param(alsa, int, 0444);
-MODULE_PARM_DESC(alsa,"register alsa devices (default: no)");
+module_param(alsa, int, 0644);
+MODULE_PARM_DESC(alsa,"enable ALSA DMA sound [dmasound]");
+
+static unsigned int oss = 0;
+module_param(oss, int, 0644);
+MODULE_PARM_DESC(oss,"enable OSS DMA sound [dmasound]");
static unsigned int latency = UNSET;
module_param(latency, int, 0444);
@@ -68,24 +68,19 @@ MODULE_PARM_DESC(latency,"pci latency timer");
static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
-static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
-static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+
module_param_array(video_nr, int, NULL, 0444);
module_param_array(vbi_nr, int, NULL, 0444);
module_param_array(radio_nr, int, NULL, 0444);
-module_param_array(dsp_nr, int, NULL, 0444);
-module_param_array(mixer_nr, int, NULL, 0444);
module_param_array(tuner, int, NULL, 0444);
module_param_array(card, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "video device number");
MODULE_PARM_DESC(vbi_nr, "vbi device number");
MODULE_PARM_DESC(radio_nr, "radio device number");
-MODULE_PARM_DESC(dsp_nr, "oss dsp device number");
-MODULE_PARM_DESC(mixer_nr, "oss mixer device number");
MODULE_PARM_DESC(tuner, "tuner type");
MODULE_PARM_DESC(card, "card type");
@@ -94,6 +89,9 @@ LIST_HEAD(saa7134_devlist);
static LIST_HEAD(mops_list);
static unsigned int saa7134_devcount;
+int (*dmasound_init)(struct saa7134_dev *dev);
+int (*dmasound_exit)(struct saa7134_dev *dev);
+
#define dprintk(fmt, arg...) if (core_debug) \
printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
@@ -190,11 +188,11 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
/* ----------------------------------------------------------- */
/* delayed request_module */
-#ifdef CONFIG_MODULES
-
+#if defined(CONFIG_MODULES) && defined(MODULE)
static int need_empress;
static int need_dvb;
static int need_alsa;
+static int need_oss;
static int pending_call(struct notifier_block *self, unsigned long state,
void *module)
@@ -208,6 +206,8 @@ static int pending_call(struct notifier_block *self, unsigned long state,
request_module("saa7134-dvb");
if (need_alsa)
request_module("saa7134-alsa");
+ if (need_oss)
+ request_module("saa7134-oss");
return NOTIFY_DONE;
}
@@ -218,10 +218,11 @@ static struct notifier_block pending_notifier = {
static void request_module_depend(char *name, int *flag)
{
+ int err;
switch (THIS_MODULE->state) {
case MODULE_STATE_COMING:
if (!pending_registered) {
- register_module_notifier(&pending_notifier);
+ err = register_module_notifier(&pending_notifier);
pending_registered = 1;
}
*flag = 1;
@@ -236,9 +237,7 @@ static void request_module_depend(char *name, int *flag)
}
#else
-
#define request_module_depend(name,flag)
-
#endif /* CONFIG_MODULES */
/* ------------------------------------------------------------------ */
@@ -578,12 +577,14 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
goto out;
}
- /* If alsa support is active and we get a sound report, exit
- and let the saa7134-alsa module deal with it */
+ /* If dmasound support is active and we get a sound report, exit
+ and let the saa7134-alsa/oss module deal with it */
- if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && alsa) {
+ if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
+ (dev->dmasound.priv_data != NULL) )
+ {
if (irq_debug > 1)
- printk(KERN_DEBUG "%s/irq: ignoring interrupt for ALSA\n",
+ printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n",
dev->name);
goto out;
}
@@ -609,12 +610,6 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
card_has_mpeg(dev))
saa7134_irq_ts_done(dev,status);
- if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) {
- if (oss) {
- saa7134_irq_oss_done(dev,status);
- }
- }
-
if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
SAA7134_IRQ_REPORT_GPIO18)) &&
dev->remote)
@@ -689,14 +684,6 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
* audio will not work.
*/
- switch (dev->pci->device) {
- case PCI_DEVICE_ID_PHILIPS_SAA7134:
- case PCI_DEVICE_ID_PHILIPS_SAA7133:
- case PCI_DEVICE_ID_PHILIPS_SAA7135:
- saa7134_oss_init1(dev);
- break;
- }
-
/* enable peripheral devices */
saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
@@ -728,8 +715,6 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 |
SAA7134_IRQ2_INTE_GPIO18A |
SAA7134_IRQ2_INTE_GPIO16 );
- else if (dev->has_remote == SAA7134_REMOTE_I2C)
- request_module("ir-kbd-i2c");
saa_writel(SAA7134_IRQ1, 0);
saa_writel(SAA7134_IRQ2, irq2_mask);
@@ -742,13 +727,6 @@ static int saa7134_hwfini(struct saa7134_dev *dev)
{
dprintk("hwfini\n");
- switch (dev->pci->device) {
- case PCI_DEVICE_ID_PHILIPS_SAA7134:
- case PCI_DEVICE_ID_PHILIPS_SAA7133:
- case PCI_DEVICE_ID_PHILIPS_SAA7135:
- saa7134_oss_fini(dev);
- break;
- }
if (card_has_mpeg(dev))
saa7134_ts_fini(dev);
saa7134_input_fini(dev);
@@ -986,11 +964,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
if (card_is_dvb(dev))
request_module_depend("saa7134-dvb",&need_dvb);
- if (!oss && alsa) {
- dprintk("Requesting ALSA module\n");
+
+ if (alsa)
request_module_depend("saa7134-alsa",&need_alsa);
- }
+ if (oss)
+ request_module_depend("saa7134-oss",&need_oss);
v4l2_prio_init(&dev->prio);
@@ -1024,32 +1003,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
dev->name,dev->radio_dev->minor & 0x1f);
}
- /* register oss devices */
- switch (dev->pci->device) {
- case PCI_DEVICE_ID_PHILIPS_SAA7134:
- case PCI_DEVICE_ID_PHILIPS_SAA7133:
- case PCI_DEVICE_ID_PHILIPS_SAA7135:
- if (oss) {
- err = dev->dmasound.minor_dsp =
- register_sound_dsp(&saa7134_dsp_fops,
- dsp_nr[dev->nr]);
- if (err < 0) {
- goto fail4;
- }
- printk(KERN_INFO "%s: registered device dsp%d\n",
- dev->name,dev->dmasound.minor_dsp >> 4);
-
- err = dev->dmasound.minor_mixer =
- register_sound_mixer(&saa7134_mixer_fops,
- mixer_nr[dev->nr]);
- if (err < 0)
- goto fail5;
- printk(KERN_INFO "%s: registered device mixer%d\n",
- dev->name,dev->dmasound.minor_mixer >> 4);
- }
- break;
- }
-
/* everything worked */
pci_set_drvdata(pci_dev,dev);
saa7134_devcount++;
@@ -1064,17 +1017,13 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
/* check for signal */
saa7134_irq_video_intl(dev);
- return 0;
- fail5:
- switch (dev->pci->device) {
- case PCI_DEVICE_ID_PHILIPS_SAA7134:
- case PCI_DEVICE_ID_PHILIPS_SAA7133:
- case PCI_DEVICE_ID_PHILIPS_SAA7135:
- if (oss)
- unregister_sound_dsp(dev->dmasound.minor_dsp);
- break;
+ if (dmasound_init && !dev->dmasound.priv_data) {
+ dmasound_init(dev);
}
+
+ return 0;
+
fail4:
saa7134_unregister_video(dev);
saa7134_i2c_unregister(dev);
@@ -1096,6 +1045,11 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
struct list_head *item;
struct saa7134_mpeg_ops *mops;
+ /* Release DMA sound modules if present */
+ if (dmasound_exit && dev->dmasound.priv_data) {
+ dmasound_exit(dev);
+ }
+
/* debugging ... */
if (irq_debug) {
u32 report = saa_readl(SAA7134_IRQ_REPORT);
@@ -1125,19 +1079,18 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
saa7134_devcount--;
saa7134_i2c_unregister(dev);
- switch (dev->pci->device) {
- case PCI_DEVICE_ID_PHILIPS_SAA7134:
- case PCI_DEVICE_ID_PHILIPS_SAA7133:
- case PCI_DEVICE_ID_PHILIPS_SAA7135:
- if (oss) {
- unregister_sound_mixer(dev->dmasound.minor_mixer);
- unregister_sound_dsp(dev->dmasound.minor_dsp);
- }
- break;
- }
saa7134_unregister_video(dev);
- /* release ressources */
+
+ /* the DMA sound modules should be unloaded before reaching
+ this, but just in case they are still present... */
+ if (dev->dmasound.priv_data != NULL) {
+ free_irq(pci_dev->irq, &dev->dmasound);
+ dev->dmasound.priv_data = NULL;
+ }
+
+
+ /* release resources */
free_irq(pci_dev->irq, dev);
iounmap(dev->lmmio);
release_mem_region(pci_resource_start(pci_dev,0),
@@ -1208,10 +1161,10 @@ static int saa7134_init(void)
static void saa7134_fini(void)
{
-#ifdef CONFIG_MODULES
+#if defined(CONFIG_MODULES) && defined(MODULE)
if (pending_registered)
unregister_module_notifier(&pending_notifier);
-#endif
+#endif /* CONFIG_MODULES */
pci_unregister_driver(&saa7134_pci_driver);
}
@@ -1225,8 +1178,10 @@ EXPORT_SYMBOL(saa7134_i2c_call_clients);
EXPORT_SYMBOL(saa7134_devlist);
EXPORT_SYMBOL(saa7134_boards);
-/* ----------------- For ALSA -------------------------------- */
+/* ----------------- for the DMA sound modules --------------- */
+EXPORT_SYMBOL(dmasound_init);
+EXPORT_SYMBOL(dmasound_exit);
EXPORT_SYMBOL(saa7134_pgtable_free);
EXPORT_SYMBOL(saa7134_pgtable_build);
EXPORT_SYMBOL(saa7134_pgtable_alloc);
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index e9ec69e..575f3e8 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -36,6 +36,7 @@ MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
MODULE_LICENSE("GPL");
static unsigned int empress_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+
module_param_array(empress_nr, int, NULL, 0444);
MODULE_PARM_DESC(empress_nr,"ts device number");
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
index 7575043..df9dd36 100644
--- a/drivers/media/video/saa7134/saa7134-i2c.c
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -333,7 +333,7 @@ static int attach_inform(struct i2c_client *client)
struct tuner_setup tun_setup;
d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
- client->driver->name, client->addr, client->name);
+ client->driver->name, client->addr, client->name);
/* Am I an i2c remote control? */
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index 329accd..ab75ca5 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -485,64 +485,6 @@ static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
};
-static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
- [ 0x59 ] = KEY_MUTE,
- [ 0x4a ] = KEY_POWER,
-
- [ 0x18 ] = KEY_TEXT,
- [ 0x26 ] = KEY_TV,
- [ 0x3d ] = KEY_PRINT,
-
- [ 0x48 ] = KEY_RED,
- [ 0x04 ] = KEY_GREEN,
- [ 0x11 ] = KEY_YELLOW,
- [ 0x00 ] = KEY_BLUE,
-
- [ 0x2d ] = KEY_VOLUMEUP,
- [ 0x1e ] = KEY_VOLUMEDOWN,
-
- [ 0x49 ] = KEY_MENU,
-
- [ 0x16 ] = KEY_CHANNELUP,
- [ 0x17 ] = KEY_CHANNELDOWN,
-
- [ 0x20 ] = KEY_UP,
- [ 0x21 ] = KEY_DOWN,
- [ 0x22 ] = KEY_LEFT,
- [ 0x23 ] = KEY_RIGHT,
- [ 0x0d ] = KEY_SELECT,
-
-
-
- [ 0x08 ] = KEY_BACK,
- [ 0x07 ] = KEY_REFRESH,
-
- [ 0x2f ] = KEY_ZOOM,
- [ 0x29 ] = KEY_RECORD,
-
- [ 0x4b ] = KEY_PAUSE,
- [ 0x4d ] = KEY_REWIND,
- [ 0x2e ] = KEY_PLAY,
- [ 0x4e ] = KEY_FORWARD,
- [ 0x53 ] = KEY_PREVIOUS,
- [ 0x4c ] = KEY_STOP,
- [ 0x54 ] = KEY_NEXT,
-
- [ 0x69 ] = KEY_KP0,
- [ 0x6a ] = KEY_KP1,
- [ 0x6b ] = KEY_KP2,
- [ 0x6c ] = KEY_KP3,
- [ 0x6d ] = KEY_KP4,
- [ 0x6e ] = KEY_KP5,
- [ 0x6f ] = KEY_KP6,
- [ 0x70 ] = KEY_KP7,
- [ 0x71 ] = KEY_KP8,
- [ 0x72 ] = KEY_KP9,
-
- [ 0x74 ] = KEY_CHANNEL,
- [ 0x0a ] = KEY_BACKSPACE,
-};
-
/* Mapping for the 28 key remote control as seen at
http://www.sednacomputer.com/photo/cardbus-tv.jpg
Pavel Mihaylov <bin@bash.info> */
@@ -635,57 +577,6 @@ static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
return 1;
}
-/* The new pinnacle PCTV remote (with the colored buttons)
- *
- * Ricardo Cerqueira <v4l@cerqueira.org>
- */
-
-static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
-{
- unsigned char b[4];
- unsigned int start = 0,parity = 0,code = 0;
-
- /* poll IR chip */
- if (4 != i2c_master_recv(&ir->c,b,4)) {
- i2cdprintk("read error\n");
- return -EIO;
- }
-
- for (start = 0; start<4; start++) {
- if (b[start] == 0x80) {
- code=b[(start+3)%4];
- parity=b[(start+2)%4];
- }
- }
-
- /* Empty Request */
- if (parity==0)
- return 0;
-
- /* Repeating... */
- if (ir->old == parity)
- return 0;
-
-
- ir->old = parity;
-
- /* Reduce code value to fit inside IR_KEYTAB_SIZE
- *
- * this is the only value that results in 42 unique
- * codes < 128
- */
-
- code %= 0x88;
-
- *ir_raw = code;
- *ir_key = code;
-
- i2cdprintk("Pinnacle PCTV key %02x\n", code);
-
- return 1;
-}
-
-
void saa7134_input_irq(struct saa7134_dev *dev)
{
struct saa7134_ir *ir = dev->remote;
@@ -822,6 +713,8 @@ int saa7134_input_init1(struct saa7134_dev *dev)
return -ENOMEM;
}
+ ir->dev = input_dev;
+
/* init hardware-specific stuff */
ir->mask_keycode = mask_keycode;
ir->mask_keydown = mask_keydown;
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c
index fd53dfc..8badd2a 100644
--- a/drivers/media/video/saa7134/saa7134-oss.c
+++ b/drivers/media/video/saa7134/saa7134-oss.c
@@ -4,6 +4,8 @@
* oss dsp interface
*
* (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ * 2005 conversion to standalone module:
+ * Ricardo Cerqueira <v4l@cerqueira.org>
*
* 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
@@ -25,7 +27,9 @@
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
+#include <linux/interrupt.h>
#include <linux/slab.h>
+#include <linux/sound.h>
#include <linux/soundcard.h>
#include "saa7134-reg.h"
@@ -33,15 +37,23 @@
/* ------------------------------------------------------------------ */
-static unsigned int oss_debug = 0;
-module_param(oss_debug, int, 0644);
-MODULE_PARM_DESC(oss_debug,"enable debug messages [oss]");
+static unsigned int debug = 0;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug,"enable debug messages [oss]");
-static unsigned int oss_rate = 0;
-module_param(oss_rate, int, 0444);
-MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)");
+static unsigned int rate = 0;
+module_param(rate, int, 0444);
+MODULE_PARM_DESC(rate,"sample rate (valid are: 32000,48000)");
-#define dprintk(fmt, arg...) if (oss_debug) \
+static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM_DESC(dsp_nr, "device numbers for SAA7134 capture interface(s).");
+module_param_array(dsp_nr, int, NULL, 0444);
+
+static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM_DESC(mixer_nr, "mixer numbers for SAA7134 capture interface(s).");
+module_param_array(mixer_nr, int, NULL, 0444);
+
+#define dprintk(fmt, arg...) if (debug) \
printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg)
@@ -369,7 +381,7 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
int __user *p = argp;
int val = 0;
- if (oss_debug > 1)
+ if (debug > 1)
saa7134_print_ioctl(dev->name,cmd);
switch (cmd) {
case OSS_GETVERSION:
@@ -665,7 +677,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
void __user *argp = (void __user *) arg;
int __user *p = argp;
- if (oss_debug > 1)
+ if (debug > 1)
saa7134_print_ioctl(dev->name,cmd);
switch (cmd) {
case OSS_GETVERSION:
@@ -768,8 +780,41 @@ struct file_operations saa7134_mixer_fops = {
/* ------------------------------------------------------------------ */
+static irqreturn_t saa7134_oss_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+ struct saa7134_dmasound *dmasound = dev_id;
+ struct saa7134_dev *dev = dmasound->priv_data;
+ unsigned long report, status;
+ int loop, handled = 0;
+
+ for (loop = 0; loop < 10; loop++) {
+ report = saa_readl(SAA7134_IRQ_REPORT);
+ status = saa_readl(SAA7134_IRQ_STATUS);
+
+ if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
+ handled = 1;
+ saa_writel(SAA7134_IRQ_REPORT,report);
+ saa7134_irq_oss_done(dev, status);
+ } else {
+ goto out;
+ }
+ }
+
+ if (loop == 10) {
+ dprintk("error! looping IRQ!");
+ }
+out:
+ return IRQ_RETVAL(handled);
+}
+
int saa7134_oss_init1(struct saa7134_dev *dev)
{
+
+ if ((request_irq(dev->pci->irq, saa7134_oss_irq,
+ SA_SHIRQ | SA_INTERRUPT, dev->name,
+ (void*) &dev->dmasound)) < 0)
+ return -1;
+
/* general */
init_MUTEX(&dev->dmasound.lock);
init_waitqueue_head(&dev->dmasound.wq);
@@ -785,8 +830,8 @@ int saa7134_oss_init1(struct saa7134_dev *dev)
/* dsp */
dev->dmasound.rate = 32000;
- if (oss_rate)
- dev->dmasound.rate = oss_rate;
+ if (rate)
+ dev->dmasound.rate = rate;
dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000;
/* mixer */
@@ -840,7 +885,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
/* next block addr */
next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
saa_writel(reg,next_blk * dev->dmasound.blksize);
- if (oss_debug > 2)
+ if (debug > 2)
dprintk("irq: ok, %s, next_blk=%d, addr=%x\n",
(status & 0x10000000) ? "even" : "odd ", next_blk,
next_blk * dev->dmasound.blksize);
@@ -854,6 +899,124 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
spin_unlock(&dev->slock);
}
+static int saa7134_dsp_create(struct saa7134_dev *dev)
+{
+ int err;
+
+ err = dev->dmasound.minor_dsp =
+ register_sound_dsp(&saa7134_dsp_fops,
+ dsp_nr[dev->nr]);
+ if (err < 0) {
+ goto fail;
+ }
+ printk(KERN_INFO "%s: registered device dsp%d\n",
+ dev->name,dev->dmasound.minor_dsp >> 4);
+
+ err = dev->dmasound.minor_mixer =
+ register_sound_mixer(&saa7134_mixer_fops,
+ mixer_nr[dev->nr]);
+ if (err < 0)
+ goto fail;
+ printk(KERN_INFO "%s: registered device mixer%d\n",
+ dev->name,dev->dmasound.minor_mixer >> 4);
+
+ return 0;
+
+fail:
+ unregister_sound_dsp(dev->dmasound.minor_dsp);
+ return 0;
+
+
+}
+
+static int oss_device_init(struct saa7134_dev *dev)
+{
+ dev->dmasound.priv_data = dev;
+ saa7134_oss_init1(dev);
+ saa7134_dsp_create(dev);
+ return 1;
+}
+
+static int oss_device_exit(struct saa7134_dev *dev)
+{
+
+ unregister_sound_mixer(dev->dmasound.minor_mixer);
+ unregister_sound_dsp(dev->dmasound.minor_dsp);
+
+ saa7134_oss_fini(dev);
+
+ if (dev->pci->irq > 0) {
+ synchronize_irq(dev->pci->irq);
+ free_irq(dev->pci->irq,&dev->dmasound);
+ }
+
+ dev->dmasound.priv_data = NULL;
+ return 1;
+}
+
+static int saa7134_oss_init(void)
+{
+ struct saa7134_dev *dev = NULL;
+ struct list_head *list;
+
+ if (!dmasound_init && !dmasound_exit) {
+ dmasound_init = oss_device_init;
+ dmasound_exit = oss_device_exit;
+ } else {
+ printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
+ return -EBUSY;
+ }
+
+ printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n");
+
+
+ list_for_each(list,&saa7134_devlist) {
+ dev = list_entry(list, struct saa7134_dev, devlist);
+ if (dev->dmasound.priv_data == NULL) {
+ oss_device_init(dev);
+ } else {
+ printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name);
+ return -EBUSY;
+ }
+ }
+
+ if (dev == NULL)
+ printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n");
+
+ return 0;
+
+}
+
+static void saa7134_oss_exit(void)
+{
+ struct saa7134_dev *dev = NULL;
+ struct list_head *list;
+
+ list_for_each(list,&saa7134_devlist) {
+ dev = list_entry(list, struct saa7134_dev, devlist);
+
+ /* Device isn't registered by OSS, probably ALSA's */
+ if (!dev->dmasound.minor_dsp)
+ continue;
+
+ oss_device_exit(dev);
+
+ }
+
+ dmasound_init = NULL;
+ dmasound_exit = NULL;
+
+ printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
+
+ return;
+}
+
+/* We initialize this late, to make sure the sound system is up and running */
+late_initcall(saa7134_oss_init);
+module_exit(saa7134_oss_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
+
/* ----------------------------------------------------------- */
/*
* Local variables:
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index fb97274..add49db 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -208,6 +208,7 @@ struct saa7134_format {
#define SAA7134_BOARD_SEDNA_PC_TV_CARDBUS 79
#define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80
#define SAA7134_BOARD_PHILIPS_TIGER 81
+#define SAA7134_BOARD_MSI_TVATANYWHERE_PLUS 82
#define SAA7134_MAXBOARDS 8
#define SAA7134_INPUT_MAX 8
@@ -383,6 +384,7 @@ struct saa7134_dmasound {
unsigned int dma_blk;
unsigned int read_offset;
unsigned int read_count;
+ void * priv_data;
snd_pcm_substream_t *substream;
};
@@ -569,6 +571,10 @@ void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf);
int saa7134_set_dmabits(struct saa7134_dev *dev);
+extern int (*dmasound_init)(struct saa7134_dev *dev);
+extern int (*dmasound_exit)(struct saa7134_dev *dev);
+
+
/* ----------------------------------------------------------- */
/* saa7134-cards.c */
diff --git a/drivers/media/video/tda8290.c b/drivers/media/video/tda8290.c
index b2dfe07..61d94dd 100644
--- a/drivers/media/video/tda8290.c
+++ b/drivers/media/video/tda8290.c
@@ -437,6 +437,10 @@ static void set_audio(struct tuner *t)
t->sgIF = 124;
t->tda8290_easy_mode = 0x20;
mode = "L";
+ } else if (t->std & V4L2_STD_SECAM_LC) {
+ t->sgIF = 20;
+ t->tda8290_easy_mode = 0x40;
+ mode = "LC";
}
tuner_dbg("setting tda8290 to system %s\n", mode);
}
diff --git a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c
index 4249127..2f2414e 100644
--- a/drivers/media/video/tda9887.c
+++ b/drivers/media/video/tda9887.c
@@ -12,6 +12,7 @@
#include <media/audiochip.h>
#include <media/tuner.h>
+
/* Chips:
TDA9885 (PAL, NTSC)
TDA9886 (PAL, SECAM, NTSC)
@@ -819,12 +820,12 @@ static int tda9887_resume(struct device * dev)
static struct i2c_driver driver = {
.owner = THIS_MODULE,
- .name = "i2c tda9887 driver",
- .id = -1, /* FIXME */
- .flags = I2C_DF_NOTIFY,
- .attach_adapter = tda9887_probe,
- .detach_client = tda9887_detach,
- .command = tda9887_command,
+ .name = "i2c tda9887 driver",
+ .id = -1, /* FIXME */
+ .flags = I2C_DF_NOTIFY,
+ .attach_adapter = tda9887_probe,
+ .detach_client = tda9887_detach,
+ .command = tda9887_command,
.driver = {
.suspend = tda9887_suspend,
.resume = tda9887_resume,
@@ -834,7 +835,7 @@ static struct i2c_client client_template =
{
.name = "tda9887",
.flags = I2C_CLIENT_ALLOW_USE,
- .driver = &driver,
+ .driver = &driver,
};
static int __init tda9887_init_module(void)
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
index 73c4041..e58abdf 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -251,7 +251,7 @@ static inline int check_mode(struct tuner *t, char *cmd)
static char pal[] = "-";
module_param_string(pal, pal, sizeof(pal), 0644);
-static char secam[] = "-";
+static char secam[] = "--";
module_param_string(secam, secam, sizeof(secam), 0644);
/* get more precise norm info from insmod option */
@@ -307,8 +307,13 @@ static int tuner_fixup_std(struct tuner *t)
break;
case 'l':
case 'L':
- tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
- t->std = V4L2_STD_SECAM_L;
+ if ((secam[1]=='C')||(secam[1]=='c')) {
+ tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
+ t->std = V4L2_STD_SECAM_LC;
+ } else {
+ tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
+ t->std = V4L2_STD_SECAM_L;
+ }
break;
case '-':
/* default parameter, do nothing */
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c
index d832205..e0c9fdb 100644
--- a/drivers/media/video/tuner-simple.c
+++ b/drivers/media/video/tuner-simple.c
@@ -233,7 +233,7 @@ static struct tunertype tuners[] = {
{ "Ymec TVision TVF-5533MF", Philips, NTSC,
16*160.00,16*454.00,0x01,0x02,0x04,0x8e,732},
- /* 60-68 */
+ /* 60-69 */
{ "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC,
16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732},
{ "Tena TNF9533-D/IF/TNF9533-B/DF", Philips, PAL,
@@ -252,6 +252,8 @@ static struct tunertype tuners[] = {
16*160.00,16*442.00,0xa1,0xa2,0xa4,0xc8,623 },
{ "Philips TUV1236D ATSC/NTSC dual in", Philips, ATSC,
16*157.25,16*454.00,0x01,0x02,0x04,0xce,732 },
+ { "Tena TNF 5335 MF", Philips, NTSC,
+ 16*157.25,16*454.00,0x01,0x02,0x04,0x8e,732 },
};
unsigned const int tuner_count = ARRAY_SIZE(tuners);
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
index c31bf28..5b20e81 100644
--- a/drivers/media/video/tvaudio.c
+++ b/drivers/media/video/tvaudio.c
@@ -188,7 +188,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
buffer[1] = val;
if (2 != i2c_master_send(&chip->c,buffer,2)) {
tvaudio_warn("%s: I/O error (write reg%d=0x%x)\n",
- chip->c.name, subaddr, val);
+ chip->c.name, subaddr, val);
return -1;
}
}
@@ -216,7 +216,7 @@ static int chip_read(struct CHIPSTATE *chip)
chip->c.name);
return -1;
}
- tvaudio_dbg("%s: chip_read: 0x%x\n",chip->c.name,buffer);
+ tvaudio_dbg("%s: chip_read: 0x%x\n",chip->c.name, buffer);
return buffer;
}
@@ -235,7 +235,7 @@ static int chip_read2(struct CHIPSTATE *chip, int subaddr)
return -1;
}
tvaudio_dbg("%s: chip_read2: reg%d=0x%x\n",
- chip->c.name,subaddr,read[0]);
+ chip->c.name, subaddr,read[0]);
return read[0];
}
@@ -248,7 +248,7 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
/* update our shadow register set; print bytes if (debug > 0) */
tvaudio_dbg("%s: chip_cmd(%s): reg=%d, data:",
- chip->c.name,name,cmd->bytes[0]);
+ chip->c.name, name,cmd->bytes[0]);
for (i = 1; i < cmd->count; i++) {
if (debug)
printk(" 0x%x",cmd->bytes[i]);
@@ -322,7 +322,7 @@ static void generic_checkmode(struct CHIPSTATE *chip)
int mode = desc->getmode(chip);
if (mode == chip->prevmode)
- return;
+ return;
tvaudio_dbg("%s: thread checkmode\n", chip->c.name);
chip->prevmode = mode;
@@ -1506,18 +1506,18 @@ static int chip_attach(struct i2c_adapter *adap, int addr, int kind)
return -EIO;
}
tvaudio_info("%s found @ 0x%x (%s)\n", desc->name, addr<<1, adap->name);
- if (desc->flags) {
- tvaudio_dbg("matches:%s%s%s.\n",
- (desc->flags & CHIP_HAS_VOLUME) ? " volume" : "",
- (desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
- (desc->flags & CHIP_HAS_INPUTSEL) ? " audiomux" : "");
- }
+ if (desc->flags) {
+ tvaudio_dbg("matches:%s%s%s.\n",
+ (desc->flags & CHIP_HAS_VOLUME) ? " volume" : "",
+ (desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
+ (desc->flags & CHIP_HAS_INPUTSEL) ? " audiomux" : "");
+ }
/* fill required data structures */
- strcpy(chip->c.name,desc->name);
+ strcpy(chip->c.name, desc->name);
chip->type = desc-chiplist;
chip->shadow.count = desc->registers+1;
- chip->prevmode = -1;
+ chip->prevmode = -1;
/* register */
i2c_attach_client(&chip->c);
@@ -1604,7 +1604,7 @@ static int chip_command(struct i2c_client *client,
struct CHIPSTATE *chip = i2c_get_clientdata(client);
struct CHIPDESC *desc = chiplist + chip->type;
- tvaudio_dbg("%s: chip_command 0x%x\n",chip->c.name,cmd);
+ tvaudio_dbg("%s: chip_command 0x%x\n", chip->c.name, cmd);
switch (cmd) {
case AUDC_SET_INPUT:
@@ -1624,7 +1624,7 @@ static int chip_command(struct i2c_client *client,
/* --- v4l ioctls --- */
/* take care: bttv does userspace copying, we'll get a
- kernel pointer here... */
+ kernel pointer here... */
case VIDIOCGAUDIO:
{
struct video_audio *va = arg;
diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c
index 72e8741..5ac2353 100644
--- a/drivers/media/video/tveeprom.c
+++ b/drivers/media/video/tveeprom.c
@@ -81,7 +81,7 @@ hauppauge_tuner_fmt[] =
{ 0x00000010, " PAL(I)" },
{ 0x00400000, " SECAM(L/L')" },
{ 0x00000e00, " PAL(D/K)" },
- { 0x03000000, " ATSC Digital" },
+ { 0x03000000, " ATSC/DVB Digital" },
};
/* This is the full list of possible tuners. Many thanks to Hauppauge for
@@ -206,16 +206,30 @@ hauppauge_tuner[] =
{ TUNER_ABSENT, "TCL 2002MI_3H"},
{ TUNER_TCL_2002N, "TCL 2002N 5H"},
/* 100-109 */
- { TUNER_ABSENT, "Philips FMD1216ME"},
+ { TUNER_PHILIPS_FMD1216ME_MK3, "Philips FMD1216ME"},
{ TUNER_TEA5767, "Philips TEA5768HL FM Radio"},
{ TUNER_ABSENT, "Panasonic ENV57H12D5"},
- { TUNER_ABSENT, "TCL MFNM05-4"},
+ { TUNER_PHILIPS_FM1236_MK3, "TCL MFNM05-4"},
{ TUNER_ABSENT, "TCL MNM05-4"},
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"},
{ TUNER_ABSENT, "TCL MQNM05-4"},
{ TUNER_ABSENT, "LG TAPC-W701D"},
{ TUNER_ABSENT, "TCL 9886P-WM"},
{ TUNER_ABSENT, "TCL 1676NM-WM"},
+ /* 110-119 */
+ { TUNER_ABSENT, "Thompson DTT75105"},
+ { TUNER_ABSENT, "Conexant_CX24109"},
+ { TUNER_ABSENT, "TCL M2523_5N_E"},
+ { TUNER_ABSENT, "TCL M2523_3DB_E"},
+ { TUNER_ABSENT, "Philips 8275A"},
+ { TUNER_ABSENT, "Microtune MT2060"},
+ { TUNER_ABSENT, "Philips FM1236 MK5"},
+ { TUNER_ABSENT, "Philips FM1216ME MK5"},
+ { TUNER_ABSENT, "TCL M2523_3DI_E"},
+ { TUNER_ABSENT, "Samsung THPD5222FG30A"},
+ /* 120-129 */
+ { TUNER_ABSENT, "Xceive XC3028"},
+ { TUNER_ABSENT, "Philips FQ1216LME MK5"},
};
static struct HAUPPAUGE_AUDIOIC
@@ -325,6 +339,7 @@ static int hasRadioTuner(int tunerType)
case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM:
case 89: //PNPEnv_TUNER_TCL_MFPE05_2:
case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4:
+ case 105:
return 1;
}
return 0;
@@ -368,10 +383,15 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
memset(tvee, 0, sizeof(*tvee));
done = len = beenhere = 0;
- /* Hack for processing eeprom for em28xx */
- if ((eeprom_data[0]==0x1a)&&(eeprom_data[1]==0xeb)&&
- (eeprom_data[2]==0x67)&&(eeprom_data[3]==0x95))
- start=0xa0;
+ /* Hack for processing eeprom for em28xx and cx 2388x*/
+ if ((eeprom_data[0] == 0x1a) && (eeprom_data[1] == 0xeb) &&
+ (eeprom_data[2] == 0x67) && (eeprom_data[3] == 0x95))
+ start=0xa0; /* Generic em28xx offset */
+ else if (((eeprom_data[0] & 0xf0) == 0x10) &&
+ (eeprom_data[1] == 0x00) &&
+ (eeprom_data[2] == 0x00) &&
+ (eeprom_data[8] == 0x84))
+ start=8; /* Generic cx2388x offset */
else
start=0;
@@ -448,6 +468,17 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
eeprom_data[i+5] +
(eeprom_data[i+6] << 8) +
(eeprom_data[i+7] << 16);
+
+ if ( (eeprom_data[i + 8] && 0xf0) &&
+ (tvee->serial_number < 0xffffff) ) {
+ tvee->MAC_address[0] = 0x00;
+ tvee->MAC_address[1] = 0x0D;
+ tvee->MAC_address[2] = 0xFE;
+ tvee->MAC_address[3] = eeprom_data[i + 7];
+ tvee->MAC_address[4] = eeprom_data[i + 6];
+ tvee->MAC_address[5] = eeprom_data[i + 5];
+ tvee->has_MAC_address = 1;
+ }
break;
case 0x05:
@@ -466,11 +497,14 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
case 0x06:
/* tag 'ModelRev' */
tvee->model =
- eeprom_data[i+1] +
- (eeprom_data[i+2] << 8);
- tvee->revision = eeprom_data[i+5] +
- (eeprom_data[i+6] << 8) +
- (eeprom_data[i+7] << 16);
+ eeprom_data[i + 1] +
+ (eeprom_data[i + 2] << 8) +
+ (eeprom_data[i + 3] << 16) +
+ (eeprom_data[i + 4] << 24);
+ tvee->revision =
+ eeprom_data[i +5 ] +
+ (eeprom_data[i + 6] << 8) +
+ (eeprom_data[i + 7] << 16);
break;
case 0x07:
@@ -563,6 +597,8 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
t_name2 = "unknown";
}
+ tvee->tuner_hauppauge_model = tuner1;
+ tvee->tuner2_hauppauge_model = tuner2;
tvee->tuner_formats = 0;
tvee->tuner2_formats = 0;
for (i = j = 0; i < 8; i++) {
@@ -578,6 +614,12 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n",
tvee->model, tvee->rev_str, tvee->serial_number);
+ if (tvee->has_MAC_address == 1) {
+ tveeprom_info("MAC address is %02X-%02X-%02X-%02X-%02X-%02X\n",
+ tvee->MAC_address[0], tvee->MAC_address[1],
+ tvee->MAC_address[2], tvee->MAC_address[3],
+ tvee->MAC_address[4], tvee->MAC_address[5]);
+ }
tveeprom_info("tuner model is %s (idx %d, type %d)\n",
t_name1, tuner1, tvee->tuner_type);
tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
@@ -711,7 +753,8 @@ tveeprom_detect_client(struct i2c_adapter *adapter,
client->driver = &i2c_driver_tveeprom;
client->flags = I2C_CLIENT_ALLOW_USE;
snprintf(client->name, sizeof(client->name), "tveeprom");
- i2c_attach_client(client);
+ i2c_attach_client(client);
+
return 0;
}
diff --git a/drivers/media/video/tvp5150.c b/drivers/media/video/tvp5150.c
index 81e6d44..97431e2 100644
--- a/drivers/media/video/tvp5150.c
+++ b/drivers/media/video/tvp5150.c
@@ -31,7 +31,7 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
#define dprintk(num, format, args...) \
do { \
if (debug >= num) \
- printk(format , ##args); \
+ printk(format, ##args); \
} while (0)
/* supported controls */
@@ -770,7 +770,6 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter,
if (debug > 1)
dump_reg(client);
-
return 0;
}
diff --git a/drivers/media/video/video-buf-dvb.c b/drivers/media/video/video-buf-dvb.c
index 55f129e..0a4004a 100644
--- a/drivers/media/video/video-buf-dvb.c
+++ b/drivers/media/video/video-buf-dvb.c
@@ -13,6 +13,7 @@
* (at your option) any later version.
*/
+
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
@@ -247,3 +248,4 @@ EXPORT_SYMBOL(videobuf_dvb_unregister);
* compile-command: "make DVB=1"
* End:
*/
+
diff --git a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c
index acfd3a1..9a6bf28 100644
--- a/drivers/media/video/video-buf.c
+++ b/drivers/media/video/video-buf.c
@@ -753,10 +753,9 @@ videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data,
int retval;
/* setup stuff */
- retval = -ENOMEM;
q->read_buf = videobuf_alloc(q->msize);
if (NULL == q->read_buf)
- goto done;
+ return -ENOMEM;
q->read_buf->memory = V4L2_MEMORY_USERPTR;
q->read_buf->baddr = (unsigned long)data;
@@ -817,10 +816,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
if (NULL == q->read_buf)
goto done;
q->read_buf->memory = V4L2_MEMORY_USERPTR;
+ q->read_buf->bsize = count; /* preferred size */
field = videobuf_next_field(q);
retval = q->ops->buf_prepare(q,q->read_buf,field);
- if (0 != retval)
+ if (0 != retval) {
+ kfree (q->read_buf);
+ q->read_buf = NULL;
goto done;
+ }
spin_lock_irqsave(q->irqlock,flags);
q->ops->buf_queue(q,q->read_buf);
spin_unlock_irqrestore(q->irqlock,flags);
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c
index 83c49f9..6de5b00 100644
--- a/drivers/media/video/videodev.c
+++ b/drivers/media/video/videodev.c
@@ -76,14 +76,14 @@ static void video_release(struct class_device *cd)
}
static struct class video_class = {
- .name = VIDEO_NAME,
+ .name = VIDEO_NAME,
.release = video_release,
};
/*
- * Active devices
+ * Active devices
*/
-
+
static struct video_device *video_device[VIDEO_NUM_DEVICES];
static DECLARE_MUTEX(videodev_lock);
@@ -101,7 +101,7 @@ static int video_open(struct inode *inode, struct file *file)
int err = 0;
struct video_device *vfl;
struct file_operations *old_fops;
-
+
if(minor>=VIDEO_NUM_DEVICES)
return -ENODEV;
down(&videodev_lock);
@@ -189,7 +189,7 @@ video_usercopy(struct inode *inode, struct file *file,
return -ENOMEM;
parg = mbuf;
}
-
+
err = -EFAULT;
if (_IOC_DIR(cmd) & _IOC_WRITE)
if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
@@ -240,7 +240,7 @@ int video_exclusive_open(struct inode *inode, struct file *file)
int video_exclusive_release(struct inode *inode, struct file *file)
{
struct video_device *vfl = video_devdata(file);
-
+
vfl->users--;
return 0;
}
@@ -253,7 +253,7 @@ static struct file_operations video_fops;
* @type: type of device to register
* @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ...
* -1 == first free)
- *
+ *
* The registration code assigns minor numbers based on the type
* requested. -ENFILE is returned in all the device slots for this
* category are full. If not then the minor field is set and the
@@ -269,7 +269,7 @@ static struct file_operations video_fops;
*
* %VFL_TYPE_VBI - Vertical blank data (undecoded)
*
- * %VFL_TYPE_RADIO - A radio card
+ * %VFL_TYPE_RADIO - A radio card
*/
int video_register_device(struct video_device *vfd, int type, int nr)
@@ -278,7 +278,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
int base;
int end;
char *name_base;
-
+
switch(type)
{
case VFL_TYPE_GRABBER:
@@ -293,7 +293,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
break;
case VFL_TYPE_VBI:
base=224;
- end=240;
+ end=256;
name_base = "vbi";
break;
case VFL_TYPE_RADIO:
@@ -334,7 +334,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
init_MUTEX(&vfd->lock);
/* sysfs class */
- memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
+ memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
if (vfd->dev)
vfd->class_dev.dev = vfd->dev;
vfd->class_dev.class = &video_class;
@@ -360,7 +360,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
* This unregisters the passed device and deassigns the minor
* number. Future open calls will be met with errors.
*/
-
+
void video_unregister_device(struct video_device *vfd)
{
down(&videodev_lock);
@@ -384,7 +384,7 @@ static struct file_operations video_fops=
/*
* Initialise video for linux
*/
-
+
static int __init videodev_init(void)
{
int ret;
diff --git a/drivers/media/video/wm8775.c b/drivers/media/video/wm8775.c
index 22f2862..a6936ad 100644
--- a/drivers/media/video/wm8775.c
+++ b/drivers/media/video/wm8775.c
@@ -5,6 +5,11 @@
*
* Based on saa7115 driver
*
+ * Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
+ * - Cleanup
+ * - V4L2 API update
+ * - sound fixes
+ *
* 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
@@ -31,7 +36,7 @@
#include <media/audiochip.h>
MODULE_DESCRIPTION("wm8775 driver");
-MODULE_AUTHOR("Ulf Eklund");
+MODULE_AUTHOR("Ulf Eklund, Hans Verkuil");
MODULE_LICENSE("GPL");
#define wm8775_err(fmt, arg...) do { \
OpenPOWER on IntegriCloud