V4L/DVB (10955): cx231xx: CodingStyle automatic fixes with Lindent
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
@@ -58,9 +58,8 @@ static int cx231xx_isoc_audio_deinit(struct cx231xx *dev)
|
||||
|
||||
dprintk("Stopping isoc\n");
|
||||
|
||||
|
||||
for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
|
||||
if(dev->adev.urb[i]) {
|
||||
if (dev->adev.urb[i]) {
|
||||
if (!irqs_disabled())
|
||||
usb_kill_urb(dev->adev.urb[i]);
|
||||
else
|
||||
@@ -145,7 +144,6 @@ static void cx231xx_audio_isocirq(struct urb *urb)
|
||||
runtime->period_size;
|
||||
period_elapsed = 1;
|
||||
}
|
||||
|
||||
snd_pcm_stream_unlock(substream);
|
||||
}
|
||||
if (period_elapsed)
|
||||
@@ -166,7 +164,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||
int i, errCode;
|
||||
int sb_size;
|
||||
|
||||
cx231xx_info("%s: Starting AUDIO transfers\n",__func__);
|
||||
cx231xx_info("%s: Starting AUDIO transfers\n", __func__);
|
||||
|
||||
sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
|
||||
|
||||
@@ -191,7 +189,8 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||
|
||||
urb->dev = dev->udev;
|
||||
urb->context = dev;
|
||||
urb->pipe = usb_rcvisocpipe(dev->udev, dev->adev.end_point_addr);
|
||||
urb->pipe =
|
||||
usb_rcvisocpipe(dev->udev, dev->adev.end_point_addr);
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->transfer_buffer = dev->adev.transfer_buffer[i];
|
||||
urb->interval = 1;
|
||||
@@ -202,8 +201,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||
for (j = k = 0; j < CX231XX_NUM_AUDIO_PACKETS;
|
||||
j++, k += dev->adev.max_pkt_size) {
|
||||
urb->iso_frame_desc[j].offset = k;
|
||||
urb->iso_frame_desc[j].length =
|
||||
dev->adev.max_pkt_size;
|
||||
urb->iso_frame_desc[j].length = dev->adev.max_pkt_size;
|
||||
}
|
||||
dev->adev.urb[i] = urb;
|
||||
}
|
||||
@@ -221,7 +219,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||
|
||||
static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
|
||||
{
|
||||
dprintk("%s transfer\n", (dev->adev.capture_stream == STREAM_ON)?
|
||||
dprintk("%s transfer\n", (dev->adev.capture_stream == STREAM_ON) ?
|
||||
"stop" : "start");
|
||||
|
||||
switch (cmd) {
|
||||
@@ -233,7 +231,7 @@ static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
|
||||
dev->adev.capture_stream = STREAM_OFF;
|
||||
cx231xx_isoc_audio_deinit(dev);
|
||||
} else {
|
||||
cx231xx_errdev( "An underrun very likely occurred. "
|
||||
cx231xx_errdev("An underrun very likely occurred. "
|
||||
"Ignoring it.\n");
|
||||
}
|
||||
return 0;
|
||||
@@ -266,8 +264,7 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs,
|
||||
static struct snd_pcm_hardware snd_cx231xx_hw_capture = {
|
||||
.info = SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_MMAP_VALID,
|
||||
SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID,
|
||||
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
|
||||
@@ -330,7 +327,6 @@ static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
|
||||
int ret;
|
||||
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
||||
|
||||
|
||||
dprintk("closing device\n");
|
||||
|
||||
/* set alternate setting for audio interface */
|
||||
@@ -402,14 +398,14 @@ static int snd_cx231xx_capture_trigger(struct snd_pcm_substream *substream,
|
||||
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
||||
int retval;
|
||||
|
||||
|
||||
dprintk("Should %s capture\n", (cmd == SNDRV_PCM_TRIGGER_START)?
|
||||
"start": "stop");
|
||||
dprintk("Should %s capture\n", (cmd == SNDRV_PCM_TRIGGER_START) ?
|
||||
"start" : "stop");
|
||||
|
||||
spin_lock(&dev->adev.slock);
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, CX231XX_START_AUDIO);
|
||||
cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN,
|
||||
CX231XX_START_AUDIO);
|
||||
retval = 0;
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
@@ -492,7 +488,8 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cx231xx_pcm_capture);
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||
&snd_cx231xx_pcm_capture);
|
||||
pcm->info_flags = 0;
|
||||
pcm->private_data = dev;
|
||||
strcpy(pcm->name, "Conexant cx231xx Capture");
|
||||
@@ -509,13 +506,18 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||
adev->udev = dev->udev;
|
||||
|
||||
/* compute alternate max packet sizes for Audio */
|
||||
uif = dev->udev->actconfig->interface[dev->current_pcb_config.hs_config_info[0].interface_info.audio_index+1];
|
||||
uif =
|
||||
dev->udev->actconfig->interface[dev->current_pcb_config.
|
||||
hs_config_info[0].interface_info.
|
||||
audio_index + 1];
|
||||
|
||||
adev->end_point_addr = le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress);
|
||||
adev->end_point_addr =
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
|
||||
bEndpointAddress);
|
||||
|
||||
adev->num_alt = uif->num_altsetting;
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", adev->end_point_addr,
|
||||
adev->num_alt);
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||
adev->end_point_addr, adev->num_alt);
|
||||
adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL);
|
||||
|
||||
if (adev->alt_max_pkt_size == NULL) {
|
||||
@@ -523,8 +525,9 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < adev->num_alt ; i++) {
|
||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
for (i = 0; i < adev->num_alt; i++) {
|
||||
u16 tmp =
|
||||
le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
wMaxPacketSize);
|
||||
adev->alt_max_pkt_size[i] =
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -50,14 +50,12 @@ static unsigned long cx231xx_devused;
|
||||
*/
|
||||
|
||||
static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
|
||||
{ 0x03, 0x01, 10 },
|
||||
{ 0x03, 0x00, 30 },
|
||||
{ 0x03, 0x01, 10 },
|
||||
{ -1, -1, -1 },
|
||||
{0x03, 0x01, 10},
|
||||
{0x03, 0x00, 30},
|
||||
{0x03, 0x01, 10},
|
||||
{-1, -1, -1},
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Board definitions
|
||||
*/
|
||||
@@ -66,23 +64,28 @@ struct cx231xx_board cx231xx_boards[] = {
|
||||
[CX231XX_BOARD_UNKNOWN] = {
|
||||
.name = "Unknown CX231xx video grabber",
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.input = { {
|
||||
.input = {{
|
||||
.type = CX231XX_VMUX_TELEVISION,
|
||||
.vmux = CX231XX_VIN_3_1,
|
||||
.amux = CX231XX_AMUX_VIDEO,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_COMPOSITE1,
|
||||
.type =
|
||||
CX231XX_VMUX_COMPOSITE1,
|
||||
.vmux = CX231XX_VIN_2_1,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_SVIDEO,
|
||||
.vmux = CX231XX_VIN_1_1 | (CX231XX_VIN_1_2 << 8 ) |
|
||||
.type =
|
||||
CX231XX_VMUX_SVIDEO,
|
||||
.vmux =
|
||||
CX231XX_VIN_1_1 |
|
||||
(CX231XX_VIN_1_2 << 8) |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.amux =
|
||||
CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
} },
|
||||
}},
|
||||
},
|
||||
|
||||
[CX231XX_BOARD_CNXT_RDE_250] = {
|
||||
@@ -105,23 +108,31 @@ struct cx231xx_board cx231xx_boards[] = {
|
||||
.demod_addr = 0x02,
|
||||
.norm = V4L2_STD_PAL,
|
||||
|
||||
.input = { {
|
||||
.type = CX231XX_VMUX_TELEVISION,
|
||||
.input = {{
|
||||
.type =
|
||||
CX231XX_VMUX_TELEVISION,
|
||||
.vmux = CX231XX_VIN_3_1,
|
||||
.amux = CX231XX_AMUX_VIDEO,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_COMPOSITE1,
|
||||
.type =
|
||||
CX231XX_VMUX_COMPOSITE1,
|
||||
.vmux = CX231XX_VIN_2_1,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.amux =
|
||||
CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_SVIDEO,
|
||||
.vmux = CX231XX_VIN_1_1 | (CX231XX_VIN_1_2 << 8 ) |
|
||||
.type =
|
||||
CX231XX_VMUX_SVIDEO,
|
||||
.vmux =
|
||||
CX231XX_VIN_1_1 |
|
||||
(CX231XX_VIN_1_2 <<
|
||||
8) |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.amux =
|
||||
CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
} },
|
||||
}},
|
||||
},
|
||||
|
||||
[CX231XX_BOARD_CNXT_RDU_250] = {
|
||||
@@ -144,37 +155,46 @@ struct cx231xx_board cx231xx_boards[] = {
|
||||
.demod_addr = 0x32,
|
||||
.norm = V4L2_STD_NTSC,
|
||||
|
||||
.input = { {
|
||||
.type = CX231XX_VMUX_TELEVISION,
|
||||
.input = {{
|
||||
.type =
|
||||
CX231XX_VMUX_TELEVISION,
|
||||
.vmux = CX231XX_VIN_3_1,
|
||||
.amux = CX231XX_AMUX_VIDEO,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_COMPOSITE1,
|
||||
.type =
|
||||
CX231XX_VMUX_COMPOSITE1,
|
||||
.vmux = CX231XX_VIN_2_1,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.amux =
|
||||
CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
}, {
|
||||
.type = CX231XX_VMUX_SVIDEO,
|
||||
.vmux = CX231XX_VIN_1_1 | (CX231XX_VIN_1_2 << 8 ) |
|
||||
.type =
|
||||
CX231XX_VMUX_SVIDEO,
|
||||
.vmux =
|
||||
CX231XX_VIN_1_1 |
|
||||
(CX231XX_VIN_1_2 <<
|
||||
8) |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX231XX_AMUX_LINE_IN,
|
||||
.amux =
|
||||
CX231XX_AMUX_LINE_IN,
|
||||
.gpio = 0,
|
||||
} },
|
||||
}},
|
||||
},
|
||||
};
|
||||
const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
struct usb_device_id cx231xx_id_table [] = {
|
||||
{ USB_DEVICE(0x0572, 0x58A0),
|
||||
.driver_info = CX231XX_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0x0572, 0x58A2),
|
||||
.driver_info = CX231XX_BOARD_CNXT_RDE_250 },
|
||||
{ USB_DEVICE(0x0572, 0x5A3C),
|
||||
.driver_info = CX231XX_BOARD_CNXT_RDU_250 },
|
||||
{ },
|
||||
struct usb_device_id cx231xx_id_table[] = {
|
||||
{USB_DEVICE(0x0572, 0x58A0),
|
||||
.driver_info = CX231XX_BOARD_UNKNOWN},
|
||||
{USB_DEVICE(0x0572, 0x58A2),
|
||||
.driver_info = CX231XX_BOARD_CNXT_RDE_250},
|
||||
{USB_DEVICE(0x0572, 0x5A3C),
|
||||
.driver_info = CX231XX_BOARD_CNXT_RDU_250},
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
|
||||
|
||||
/* cx231xx_tuner_callback
|
||||
@@ -188,19 +208,24 @@ int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
|
||||
|
||||
if (dev->tuner_type == TUNER_XC5000) {
|
||||
if (command == XC5000_TUNER_RESET) {
|
||||
cx231xx_info("Tuner Call back : RESET : command %d : tuner type %d \n",
|
||||
cx231xx_info
|
||||
("Tuner Call back : RESET : command %d : tuner type %d \n",
|
||||
command, dev->tuner_type);
|
||||
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
|
||||
1);
|
||||
msleep(10);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,0);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
|
||||
0);
|
||||
msleep(330);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
|
||||
1);
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
|
||||
|
||||
static void inline cx231xx_set_model(struct cx231xx *dev)
|
||||
@@ -225,17 +250,17 @@ void cx231xx_pre_card_setup(struct cx231xx *dev)
|
||||
/* do card specific GPIO settings if required */
|
||||
cx231xx_info("Precard: Board is Conexnat RDE 250\n");
|
||||
/* set the direction for GPIO pins */
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio,1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
|
||||
break;
|
||||
case CX231XX_BOARD_CNXT_RDU_250:
|
||||
/* do card specific GPIO settings if required */
|
||||
cx231xx_info("Precard: Board is Conexnat RDU 250\n");
|
||||
/* set the direction for GPIO pins */
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio,1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
|
||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
|
||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -267,7 +292,8 @@ static void cx231xx_config_tuner(struct cx231xx *dev)
|
||||
tun_setup.addr = dev->tuner_addr;
|
||||
tun_setup.tuner_callback = cx231xx_tuner_callback;
|
||||
|
||||
cx231xx_i2c_call_clients(&dev->i2c_bus[1], TUNER_SET_TYPE_ADDR, &tun_setup);
|
||||
cx231xx_i2c_call_clients(&dev->i2c_bus[1], TUNER_SET_TYPE_ADDR,
|
||||
&tun_setup);
|
||||
#if 0
|
||||
if (tun_setup.type == TUNER_XC5000) {
|
||||
static struct xc2028_ctrl ctrl = {
|
||||
@@ -279,7 +305,8 @@ static void cx231xx_config_tuner(struct cx231xx *dev)
|
||||
.tuner = dev->tuner_type,
|
||||
.priv = &ctrl,
|
||||
};
|
||||
cx231xx_i2c_call_clients(&dev->i2c_bus[1], TUNER_SET_CONFIG, &cfg);
|
||||
cx231xx_i2c_call_clients(&dev->i2c_bus[1], TUNER_SET_CONFIG,
|
||||
&cfg);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -298,7 +325,7 @@ void cx231xx_set_ir(struct cx231xx *dev, struct IR_i2c *ir)
|
||||
{
|
||||
if (disable_ir) {
|
||||
ir->get_key = NULL;
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
/* detect & configure */
|
||||
@@ -345,7 +372,6 @@ void cx231xx_card_setup(struct cx231xx *dev)
|
||||
"addresses)\n\n");
|
||||
}
|
||||
|
||||
|
||||
/* request some modules */
|
||||
if (dev->board.decoder == CX231XX_AVDECODER) {
|
||||
cx231xx_info(": Requesting cx25840 module\n");
|
||||
@@ -364,8 +390,6 @@ void cx231xx_card_setup(struct cx231xx *dev)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* cx231xx_config()
|
||||
* inits registers with sane defaults
|
||||
@@ -415,10 +439,9 @@ void cx231xx_release_resources(struct cx231xx *dev)
|
||||
usb_put_dev(dev->udev);
|
||||
|
||||
/* Mark device as unused */
|
||||
cx231xx_devused &= ~(1<<dev->devno);
|
||||
cx231xx_devused &= ~(1 << dev->devno);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cx231xx_init_dev()
|
||||
* allocates and inits the device structs, registers i2c bus and v4l device
|
||||
@@ -519,7 +542,7 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
|
||||
|
||||
return 0;
|
||||
|
||||
fail_reg_devices:
|
||||
fail_reg_devices:
|
||||
mutex_unlock(&dev->lock);
|
||||
return retval;
|
||||
}
|
||||
@@ -530,7 +553,6 @@ static void request_module_async(struct work_struct *work)
|
||||
struct cx231xx *dev = container_of(work,
|
||||
struct cx231xx, request_module_wk);
|
||||
|
||||
|
||||
if (dev->has_alsa_audio)
|
||||
request_module("cx231xx-alsa");
|
||||
|
||||
@@ -548,8 +570,6 @@ static void request_modules(struct cx231xx *dev)
|
||||
#define request_modules(dev)
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* cx231xx_usb_probe()
|
||||
* checks for supported devices
|
||||
@@ -575,15 +595,15 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
cx231xx_info(": Interface Number %d\n", ifnum);
|
||||
|
||||
/* Interface number 0 - IR interface */
|
||||
if(ifnum == 0 ){
|
||||
if (ifnum == 0) {
|
||||
/* Check to see next free device and mark as used */
|
||||
nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
|
||||
cx231xx_devused |= 1<<nr;
|
||||
cx231xx_devused |= 1 << nr;
|
||||
|
||||
if (nr >= CX231XX_MAXBOARDS) {
|
||||
cx231xx_info(": Supports only %i cx231xx boards.\n",
|
||||
CX231XX_MAXBOARDS);
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -591,7 +611,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (dev == NULL) {
|
||||
cx231xx_err(DRIVER_NAME ": out of memory!\n");
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -613,19 +633,19 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
/* get maximum no.of IAD interfaces */
|
||||
assoc_desc = udev->actconfig->intf_assoc[0];
|
||||
dev->max_iad_interface_count = assoc_desc->bInterfaceCount;
|
||||
cx231xx_info(": Found IAD interface count %d\n", dev->max_iad_interface_count);
|
||||
cx231xx_info(": Found IAD interface count %d\n",
|
||||
dev->max_iad_interface_count);
|
||||
|
||||
/* init CIR module TBD */
|
||||
|
||||
/* store the current interface */
|
||||
lif = interface;
|
||||
|
||||
}
|
||||
else if(ifnum == 1 ){
|
||||
} else if (ifnum == 1) {
|
||||
|
||||
/* Get dev structure first */
|
||||
dev = usb_get_intfdata(udev->actconfig->interface[0]);
|
||||
if(dev == NULL){
|
||||
if (dev == NULL) {
|
||||
cx231xx_err(DRIVER_NAME ": out of first interface!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -640,18 +660,19 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
nr = dev->devno;
|
||||
|
||||
assoc_desc = udev->actconfig->intf_assoc[0];
|
||||
if(assoc_desc->bFirstInterface == ifnum){
|
||||
cx231xx_info(": Found IAD interface match: AV Descriptor Start!! \n");
|
||||
if (assoc_desc->bFirstInterface == ifnum) {
|
||||
cx231xx_info
|
||||
(": Found IAD interface match: AV Descriptor Start!! \n");
|
||||
} else {
|
||||
cx231xx_err(DRIVER_NAME " Not found matching interface\n");
|
||||
cx231xx_err(DRIVER_NAME
|
||||
" Not found matching interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
}
|
||||
else if(ifnum >= 2) {
|
||||
} else if (ifnum >= 2) {
|
||||
/* Get dev structure first */
|
||||
dev = usb_get_intfdata(udev->actconfig->interface[0]);
|
||||
if(dev == NULL){
|
||||
if (dev == NULL) {
|
||||
cx231xx_err(DRIVER_NAME ": out of first interface!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -666,10 +687,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
nr = dev->devno;
|
||||
|
||||
/* set skip interface */
|
||||
if((dev->interface_count -1) != dev->max_iad_interface_count )
|
||||
if ((dev->interface_count - 1) != dev->max_iad_interface_count)
|
||||
skip_interface = 1; /* set skipping */
|
||||
else{
|
||||
cx231xx_info(": Found IAD interface number match with AV Device number!! \n");
|
||||
else {
|
||||
cx231xx_info
|
||||
(": Found IAD interface number match with AV Device number!! \n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -705,69 +727,82 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
speed,
|
||||
le16_to_cpu(udev->descriptor.idVendor),
|
||||
le16_to_cpu(udev->descriptor.idProduct),
|
||||
ifnum,
|
||||
interface->altsetting->desc.bInterfaceNumber);
|
||||
ifnum, interface->altsetting->desc.bInterfaceNumber);
|
||||
|
||||
/* AV device initialization */
|
||||
if((dev->interface_count -1) == dev->max_iad_interface_count ) {
|
||||
if ((dev->interface_count - 1) == dev->max_iad_interface_count) {
|
||||
cx231xx_info(" Calling init_dev\n");
|
||||
/* allocate device struct */
|
||||
retval = cx231xx_init_dev(&dev, udev, nr);
|
||||
if (retval) {
|
||||
cx231xx_devused &= ~(1<<dev->devno);
|
||||
cx231xx_devused &= ~(1 << dev->devno);
|
||||
kfree(dev);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* compute alternate max packet sizes for video */
|
||||
uif = udev->actconfig->interface[dev->current_pcb_config.hs_config_info[0].interface_info.video_index+1];
|
||||
uif =
|
||||
udev->actconfig->interface[dev->current_pcb_config.
|
||||
hs_config_info[0].interface_info.
|
||||
video_index + 1];
|
||||
|
||||
dev->video_mode.end_point_addr = le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress);
|
||||
dev->video_mode.end_point_addr =
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
|
||||
bEndpointAddress);
|
||||
|
||||
dev->video_mode.num_alt = uif->num_altsetting;
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", dev->video_mode.end_point_addr,
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||
dev->video_mode.end_point_addr,
|
||||
dev->video_mode.num_alt);
|
||||
dev->video_mode.alt_max_pkt_size = kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
|
||||
dev->video_mode.alt_max_pkt_size =
|
||||
kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
|
||||
|
||||
if (dev->video_mode.alt_max_pkt_size == NULL) {
|
||||
cx231xx_errdev("out of memory!\n");
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < dev->video_mode.num_alt ; i++) {
|
||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
wMaxPacketSize);
|
||||
for (i = 0; i < dev->video_mode.num_alt; i++) {
|
||||
u16 tmp =
|
||||
le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
|
||||
desc.wMaxPacketSize);
|
||||
dev->video_mode.alt_max_pkt_size[i] =
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
||||
dev->video_mode.alt_max_pkt_size[i]);
|
||||
}
|
||||
|
||||
|
||||
/* compute alternate max packet sizes for vbi */
|
||||
uif = udev->actconfig->interface[dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index+1];
|
||||
uif =
|
||||
udev->actconfig->interface[dev->current_pcb_config.
|
||||
hs_config_info[0].interface_info.
|
||||
vanc_index + 1];
|
||||
|
||||
dev->vbi_mode.end_point_addr =
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress);
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
|
||||
bEndpointAddress);
|
||||
|
||||
dev->vbi_mode.num_alt = uif->num_altsetting;
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", dev->vbi_mode.end_point_addr,
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||
dev->vbi_mode.end_point_addr,
|
||||
dev->vbi_mode.num_alt);
|
||||
dev->vbi_mode.alt_max_pkt_size = kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
|
||||
dev->vbi_mode.alt_max_pkt_size =
|
||||
kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
|
||||
|
||||
if (dev->vbi_mode.alt_max_pkt_size == NULL) {
|
||||
cx231xx_errdev("out of memory!\n");
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < dev->vbi_mode.num_alt ; i++) {
|
||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
wMaxPacketSize);
|
||||
for (i = 0; i < dev->vbi_mode.num_alt; i++) {
|
||||
u16 tmp =
|
||||
le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
|
||||
desc.wMaxPacketSize);
|
||||
dev->vbi_mode.alt_max_pkt_size[i] =
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
||||
@@ -775,58 +810,77 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
}
|
||||
|
||||
/* compute alternate max packet sizes for sliced CC */
|
||||
uif = udev->actconfig->interface[dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index+1];
|
||||
uif =
|
||||
udev->actconfig->interface[dev->current_pcb_config.
|
||||
hs_config_info[0].interface_info.
|
||||
hanc_index + 1];
|
||||
|
||||
dev->sliced_cc_mode.end_point_addr =
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress);
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
|
||||
bEndpointAddress);
|
||||
|
||||
dev->sliced_cc_mode.num_alt = uif->num_altsetting;
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", dev->sliced_cc_mode.end_point_addr,
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||
dev->sliced_cc_mode.end_point_addr,
|
||||
dev->sliced_cc_mode.num_alt);
|
||||
dev->sliced_cc_mode.alt_max_pkt_size = kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
|
||||
dev->sliced_cc_mode.alt_max_pkt_size =
|
||||
kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
|
||||
|
||||
if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
|
||||
cx231xx_errdev("out of memory!\n");
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < dev->sliced_cc_mode.num_alt ; i++) {
|
||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
wMaxPacketSize);
|
||||
for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
|
||||
u16 tmp =
|
||||
le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
|
||||
desc.wMaxPacketSize);
|
||||
dev->sliced_cc_mode.alt_max_pkt_size[i] =
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
||||
dev->sliced_cc_mode.alt_max_pkt_size[i]);
|
||||
}
|
||||
|
||||
if(dev->current_pcb_config.ts1_source != 0xff ) {
|
||||
if (dev->current_pcb_config.ts1_source != 0xff) {
|
||||
|
||||
/* compute alternate max packet sizes for TS1 */
|
||||
uif = udev->actconfig->interface[dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index+1];
|
||||
uif =
|
||||
udev->actconfig->interface[dev->current_pcb_config.
|
||||
hs_config_info[0].
|
||||
interface_info.
|
||||
ts1_index + 1];
|
||||
|
||||
dev->ts1_mode.end_point_addr =
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress);
|
||||
le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].
|
||||
desc.bEndpointAddress);
|
||||
|
||||
dev->ts1_mode.num_alt = uif->num_altsetting;
|
||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", dev->ts1_mode.end_point_addr,
|
||||
cx231xx_info
|
||||
(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||
dev->ts1_mode.end_point_addr,
|
||||
dev->ts1_mode.num_alt);
|
||||
dev->ts1_mode.alt_max_pkt_size = kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
|
||||
dev->ts1_mode.alt_max_pkt_size =
|
||||
kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
|
||||
|
||||
if (dev->ts1_mode.alt_max_pkt_size == NULL) {
|
||||
cx231xx_errdev("out of memory!\n");
|
||||
cx231xx_devused &= ~(1<<nr);
|
||||
cx231xx_devused &= ~(1 << nr);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < dev->ts1_mode.num_alt ; i++) {
|
||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||
for (i = 0; i < dev->ts1_mode.num_alt; i++) {
|
||||
u16 tmp =
|
||||
le16_to_cpu(uif->altsetting[i].
|
||||
endpoint[isoc_pipe].desc.
|
||||
wMaxPacketSize);
|
||||
dev->ts1_mode.alt_max_pkt_size[i] =
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) +
|
||||
1);
|
||||
cx231xx_info
|
||||
("Alternate setting %i, max size= %i\n", i,
|
||||
dev->ts1_mode.alt_max_pkt_size[i]);
|
||||
}
|
||||
}
|
||||
@@ -837,13 +891,12 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
|
||||
usb_set_intfdata(lif, dev);
|
||||
|
||||
/* load other modules required */
|
||||
if((dev->interface_count -1) == dev->max_iad_interface_count )
|
||||
{
|
||||
if ((dev->interface_count - 1) == dev->max_iad_interface_count) {
|
||||
cx231xx_info("Calling request modules\n");
|
||||
request_modules(dev);
|
||||
}
|
||||
|
||||
if(skip_interface ) {
|
||||
if (skip_interface) {
|
||||
cx231xx_info("Skipping the interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -875,8 +928,7 @@ static void cx231xx_usb_disconnect(struct usb_interface *interface)
|
||||
if (dev->users) {
|
||||
cx231xx_warn
|
||||
("device /dev/video%d is open! Deregistration and memory "
|
||||
"deallocation are deferred on close.\n",
|
||||
dev->vdev->num);
|
||||
"deallocation are deferred on close.\n", dev->vdev->num);
|
||||
|
||||
dev->state |= DEV_MISCONFIGURED;
|
||||
cx231xx_uninit_isoc(dev);
|
||||
|
@@ -19,7 +19,6 @@
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _POLARIS_REG_H_
|
||||
#define _POLARIS_REG_H_
|
||||
|
||||
@@ -60,13 +59,13 @@
|
||||
#define I2C_DEMOD_EN 0x01 /* bit0 */
|
||||
#define PWR_RESETOUT_EN 0x100 /* bit8 */
|
||||
|
||||
typedef enum{
|
||||
typedef enum {
|
||||
POLARIS_AVMODE_DEFAULT = 0,
|
||||
POLARIS_AVMODE_DIGITAL = 0x10,
|
||||
POLARIS_AVMODE_ANALOGT_TV = 0x20,
|
||||
POLARIS_AVMODE_ENXTERNAL_AV = 0x30,
|
||||
|
||||
}AV_MODE;
|
||||
} AV_MODE;
|
||||
|
||||
/* Colibri Registers */
|
||||
|
||||
@@ -75,8 +74,6 @@ typedef enum{
|
||||
#define EU_IF 0x9
|
||||
#define US_IF 0xa
|
||||
|
||||
|
||||
|
||||
#define SUP_BLK_TUNE1 0x00
|
||||
#define SUP_BLK_TUNE2 0x01
|
||||
#define SUP_BLK_TUNE3 0x02
|
||||
@@ -487,5 +484,4 @@ typedef enum{
|
||||
/* Reserved [31:25] */
|
||||
#define FLD_DIF_CTL_IP 0x01FFFFFF
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -32,8 +32,8 @@
|
||||
/* #define ENABLE_DEBUG_ISOC_FRAMES */
|
||||
|
||||
static unsigned int core_debug;
|
||||
module_param(core_debug,int,0644);
|
||||
MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
|
||||
module_param(core_debug, int, 0644);
|
||||
MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
|
||||
|
||||
#define cx231xx_coredbg(fmt, arg...) do {\
|
||||
if (core_debug) \
|
||||
@@ -41,8 +41,8 @@ MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
|
||||
dev->name, __func__ , ##arg); } while (0)
|
||||
|
||||
static unsigned int reg_debug;
|
||||
module_param(reg_debug,int,0644);
|
||||
MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
|
||||
module_param(reg_debug, int, 0644);
|
||||
MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
|
||||
|
||||
#define cx231xx_regdbg(fmt, arg...) do {\
|
||||
if (reg_debug) \
|
||||
@@ -59,8 +59,6 @@ MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
|
||||
printk(KERN_INFO "%s %s :"fmt, \
|
||||
dev->name, __func__ , ##arg); } while (0)
|
||||
|
||||
|
||||
|
||||
/************************************************************************************
|
||||
* Device control list functions *
|
||||
*************************************************************************************/
|
||||
@@ -69,8 +67,7 @@ static LIST_HEAD(cx231xx_devlist);
|
||||
static DEFINE_MUTEX(cx231xx_devlist_mutex);
|
||||
|
||||
struct cx231xx *cx231xx_get_device(int minor,
|
||||
enum v4l2_buf_type *fh_type,
|
||||
int *has_radio)
|
||||
enum v4l2_buf_type *fh_type, int *has_radio)
|
||||
{
|
||||
struct cx231xx *h, *dev = NULL;
|
||||
|
||||
@@ -85,8 +82,7 @@ struct cx231xx *cx231xx_get_device(int minor,
|
||||
dev = h;
|
||||
*fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
|
||||
}
|
||||
if (h->radio_dev &&
|
||||
h->radio_dev->minor == minor) {
|
||||
if (h->radio_dev && h->radio_dev->minor == minor) {
|
||||
dev = h;
|
||||
*has_radio = 1;
|
||||
}
|
||||
@@ -115,9 +111,6 @@ void cx231xx_add_into_devlist(struct cx231xx *dev)
|
||||
mutex_unlock(&cx231xx_devlist_mutex);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static LIST_HEAD(cx231xx_extension_devlist);
|
||||
static DEFINE_MUTEX(cx231xx_extension_devlist_lock);
|
||||
|
||||
@@ -137,6 +130,7 @@ int cx231xx_register_extension(struct cx231xx_ops *ops)
|
||||
mutex_unlock(&cx231xx_devlist_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(cx231xx_register_extension);
|
||||
|
||||
void cx231xx_unregister_extension(struct cx231xx_ops *ops)
|
||||
@@ -155,8 +149,8 @@ void cx231xx_unregister_extension(struct cx231xx_ops *ops)
|
||||
mutex_unlock(&cx231xx_extension_devlist_lock);
|
||||
mutex_unlock(&cx231xx_devlist_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(cx231xx_unregister_extension);
|
||||
|
||||
EXPORT_SYMBOL(cx231xx_unregister_extension);
|
||||
|
||||
void cx231xx_init_extension(struct cx231xx *dev)
|
||||
{
|
||||
@@ -209,22 +203,26 @@ int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
|
||||
saddr_len = req_data->saddr_len;
|
||||
|
||||
/* Set wValue */
|
||||
if(saddr_len == 1) /* need check saddr_len == 0 */
|
||||
ven_req.wValue = req_data->dev_addr<<9|_i2c_period<<4|saddr_len<<2|
|
||||
_i2c_nostop<<1|I2C_SYNC|_i2c_reserve<<6;
|
||||
if (saddr_len == 1) /* need check saddr_len == 0 */
|
||||
ven_req.wValue =
|
||||
req_data->
|
||||
dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
|
||||
_i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
|
||||
else
|
||||
ven_req.wValue = req_data->dev_addr<<9|_i2c_period<<4|saddr_len<<2|
|
||||
_i2c_nostop<<1|I2C_SYNC|_i2c_reserve<<6;
|
||||
ven_req.wValue =
|
||||
req_data->
|
||||
dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
|
||||
_i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
|
||||
|
||||
/* set channel number */
|
||||
if(req_data->direction & I2C_M_RD)
|
||||
if (req_data->direction & I2C_M_RD)
|
||||
ven_req.bRequest = i2c_bus->nr + 4; /* channel number, for read,
|
||||
spec required channel_num +4 */
|
||||
else
|
||||
ven_req.bRequest = i2c_bus->nr; /* channel number, */
|
||||
|
||||
/* set index value */
|
||||
switch(saddr_len){
|
||||
switch (saddr_len) {
|
||||
case 0:
|
||||
ven_req.wIndex = 0; /* need check */
|
||||
break;
|
||||
@@ -243,22 +241,22 @@ int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
|
||||
ven_req.bData = 0;
|
||||
|
||||
/* set the direction */
|
||||
if(req_data->direction){
|
||||
if (req_data->direction) {
|
||||
ven_req.direction = USB_DIR_IN;
|
||||
memset(req_data->p_buffer, 0x00, ven_req.wLength);
|
||||
}
|
||||
else
|
||||
} else
|
||||
ven_req.direction = USB_DIR_OUT;
|
||||
|
||||
/* set the buffer for read / write */
|
||||
ven_req.pBuff = req_data->p_buffer;
|
||||
|
||||
|
||||
|
||||
/* call common vendor command request */
|
||||
status = cx231xx_send_vendor_cmd(dev, &ven_req);
|
||||
if (status < 0) {
|
||||
cx231xx_info("UsbInterface::sendCommand, output buffer failed with status -%d\n", status);
|
||||
cx231xx_info
|
||||
("UsbInterface::sendCommand, output buffer failed with status -%d\n",
|
||||
status);
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -282,8 +280,7 @@ int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
|
||||
if (len > URB_MAX_CTRL_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
switch(len)
|
||||
{
|
||||
switch (len) {
|
||||
case 1:
|
||||
val = ENABLE_ONE_BYTE;
|
||||
break;
|
||||
@@ -300,7 +297,7 @@ int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
|
||||
val = 0xFF; /* invalid option */
|
||||
}
|
||||
|
||||
if(val == 0xFF)
|
||||
if (val == 0xFF)
|
||||
return -EINVAL;
|
||||
|
||||
if (reg_debug) {
|
||||
@@ -309,8 +306,7 @@ int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
|
||||
pipe,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
req, 0, val,
|
||||
reg & 0xff, reg >> 8,
|
||||
len & 0xff, len >> 8);
|
||||
reg & 0xff, reg >> 8, len & 0xff, len >> 8);
|
||||
}
|
||||
|
||||
/* mutex_lock(&dev->ctrl_urb_lock); */
|
||||
@@ -340,8 +336,7 @@ int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN *ven_req)
|
||||
int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN * ven_req)
|
||||
{
|
||||
int ret;
|
||||
int pipe = 0;
|
||||
@@ -352,32 +347,34 @@ int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN *ven_req)
|
||||
if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
if(ven_req->direction)
|
||||
if (ven_req->direction)
|
||||
pipe = usb_rcvctrlpipe(dev->udev, 0);
|
||||
else
|
||||
pipe = usb_sndctrlpipe(dev->udev, 0);
|
||||
|
||||
|
||||
if (reg_debug) {
|
||||
int byte;
|
||||
|
||||
cx231xx_isocdbg("(pipe 0x%08x): "
|
||||
"OUT: %02x %02x %02x %04x %04x %04x >>>",
|
||||
pipe,
|
||||
ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
ven_req->
|
||||
direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
ven_req->bRequest, 0, ven_req->wValue,
|
||||
ven_req->wIndex,
|
||||
ven_req->wLength);
|
||||
ven_req->wIndex, ven_req->wLength);
|
||||
|
||||
for (byte = 0; byte < ven_req->wLength; byte++)
|
||||
cx231xx_isocdbg(" %02x", (unsigned char)ven_req->pBuff[byte]);
|
||||
cx231xx_isocdbg(" %02x",
|
||||
(unsigned char)ven_req->pBuff[byte]);
|
||||
cx231xx_isocdbg("\n");
|
||||
}
|
||||
|
||||
/* mutex_lock(&dev->ctrl_urb_lock); */
|
||||
ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
|
||||
ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
ven_req->wValue, ven_req->wIndex, ven_req->pBuff, ven_req->wLength, HZ);
|
||||
ven_req->
|
||||
direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
ven_req->wValue, ven_req->wIndex, ven_req->pBuff,
|
||||
ven_req->wLength, HZ);
|
||||
/* mutex_unlock(&dev->ctrl_urb_lock); */
|
||||
|
||||
return ret;
|
||||
@@ -400,8 +397,7 @@ int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
|
||||
if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
switch(len)
|
||||
{
|
||||
switch (len) {
|
||||
case 1:
|
||||
val = ENABLE_ONE_BYTE;
|
||||
break;
|
||||
@@ -418,7 +414,7 @@ int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
|
||||
val = 0xFF; /* invalid option */
|
||||
}
|
||||
|
||||
if(val == 0xFF)
|
||||
if (val == 0xFF)
|
||||
return -EINVAL;
|
||||
|
||||
if (reg_debug) {
|
||||
@@ -427,10 +423,9 @@ int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
|
||||
cx231xx_isocdbg("(pipe 0x%08x): "
|
||||
"OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
|
||||
pipe,
|
||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
req, 0, val,
|
||||
reg & 0xff, reg >> 8,
|
||||
len & 0xff, len >> 8);
|
||||
USB_DIR_OUT | USB_TYPE_VENDOR |
|
||||
USB_RECIP_DEVICE, req, 0, val, reg & 0xff,
|
||||
reg >> 8, len & 0xff, len >> 8);
|
||||
|
||||
for (byte = 0; byte < len; byte++)
|
||||
cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
|
||||
@@ -447,7 +442,6 @@ int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************************
|
||||
* USB Alternate Setting functions *
|
||||
*************************************************************************************/
|
||||
@@ -465,13 +459,13 @@ int cx231xx_set_video_alternate(struct cx231xx *dev)
|
||||
if (dev->width * 2 * dev->height > 720 * 240 * 2)
|
||||
min_pkt_size *= 2;
|
||||
|
||||
if(dev->width > 360) {
|
||||
if (dev->width > 360) {
|
||||
/* resolutions: 720,704,640 */
|
||||
dev->video_mode.alt = 3;
|
||||
} else if(dev->width > 180) {
|
||||
} else if (dev->width > 180) {
|
||||
/* resolutions: 360,352,320,240 */
|
||||
dev->video_mode.alt = 2;
|
||||
} else if(dev->width > 0) {
|
||||
} else if (dev->width > 0) {
|
||||
/* resolutions: 180,176,160,128,88 */
|
||||
dev->video_mode.alt = 1;
|
||||
} else {
|
||||
@@ -480,19 +474,28 @@ int cx231xx_set_video_alternate(struct cx231xx *dev)
|
||||
}
|
||||
|
||||
/* Get the correct video interface Index */
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.video_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
video_index + 1;
|
||||
|
||||
if (dev->video_mode.alt != prev_alt) {
|
||||
cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
|
||||
min_pkt_size, dev->video_mode.alt);
|
||||
dev->video_mode.max_pkt_size = dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
|
||||
dev->video_mode.max_pkt_size =
|
||||
dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
|
||||
cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
|
||||
dev->video_mode.alt, dev->video_mode.max_pkt_size);
|
||||
cx231xx_info(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
|
||||
dev->video_mode.alt, dev->video_mode.max_pkt_size, usb_interface_index);
|
||||
errCode = usb_set_interface(dev->udev, usb_interface_index, dev->video_mode.alt);
|
||||
dev->video_mode.alt,
|
||||
dev->video_mode.max_pkt_size);
|
||||
cx231xx_info
|
||||
(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
|
||||
dev->video_mode.alt, dev->video_mode.max_pkt_size,
|
||||
usb_interface_index);
|
||||
errCode =
|
||||
usb_set_interface(dev->udev, usb_interface_index,
|
||||
dev->video_mode.alt);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("cannot change alternate number to %d (error=%i)\n",
|
||||
cx231xx_errdev
|
||||
("cannot change alternate number to %d (error=%i)\n",
|
||||
dev->video_mode.alt, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -506,57 +509,80 @@ int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
|
||||
u32 usb_interface_index = 0;
|
||||
u32 max_pkt_size = 0;
|
||||
|
||||
switch(index) {
|
||||
switch (index) {
|
||||
case INDEX_TS1:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
ts1_index + 1;
|
||||
dev->video_mode.alt = alt;
|
||||
if(dev->ts1_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->ts1_mode.max_pkt_size = dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
|
||||
if (dev->ts1_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->ts1_mode.max_pkt_size =
|
||||
dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
|
||||
break;
|
||||
case INDEX_TS2:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.ts2_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
ts2_index + 1;
|
||||
break;
|
||||
case INDEX_AUDIO:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.audio_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
audio_index + 1;
|
||||
dev->adev.alt = alt;
|
||||
if( dev->adev.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->adev.max_pkt_size = dev->adev.alt_max_pkt_size[dev->adev.alt];
|
||||
if (dev->adev.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->adev.max_pkt_size =
|
||||
dev->adev.alt_max_pkt_size[dev->adev.alt];
|
||||
break;
|
||||
case INDEX_VIDEO:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.video_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
video_index + 1;
|
||||
dev->video_mode.alt = alt;
|
||||
if(dev->video_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->video_mode.max_pkt_size = dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
|
||||
if (dev->video_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->video_mode.max_pkt_size =
|
||||
dev->video_mode.alt_max_pkt_size[dev->video_mode.
|
||||
alt];
|
||||
break;
|
||||
case INDEX_VANC:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
vanc_index + 1;
|
||||
dev->vbi_mode.alt = alt;
|
||||
if(dev->vbi_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->vbi_mode.max_pkt_size = dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
|
||||
if (dev->vbi_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->vbi_mode.max_pkt_size =
|
||||
dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
|
||||
break;
|
||||
case INDEX_HANC:
|
||||
usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index+1;
|
||||
usb_interface_index =
|
||||
dev->current_pcb_config.hs_config_info[0].interface_info.
|
||||
hanc_index + 1;
|
||||
dev->sliced_cc_mode.alt = alt;
|
||||
if(dev->sliced_cc_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->sliced_cc_mode.max_pkt_size = dev->sliced_cc_mode.alt_max_pkt_size[dev->sliced_cc_mode.alt];
|
||||
if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
|
||||
max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
|
||||
dev->sliced_cc_mode.alt_max_pkt_size[dev->
|
||||
sliced_cc_mode.
|
||||
alt];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(alt > 0 && max_pkt_size == 0 ) {
|
||||
cx231xx_errdev("cannot change interface %d alternate number to %d : Max. Pkt size is ZERO\n",
|
||||
if (alt > 0 && max_pkt_size == 0) {
|
||||
cx231xx_errdev
|
||||
("cannot change interface %d alternate number to %d : Max. Pkt size is ZERO\n",
|
||||
usb_interface_index, alt);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cx231xx_info(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
|
||||
cx231xx_info
|
||||
(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
|
||||
alt, max_pkt_size, usb_interface_index);
|
||||
|
||||
if(usb_interface_index > 0 ) {
|
||||
if (usb_interface_index > 0) {
|
||||
status = usb_set_interface(dev->udev, usb_interface_index, alt);
|
||||
if (status < 0) {
|
||||
cx231xx_errdev("cannot change interface %d alternate number to %d (error=%i)\n",
|
||||
cx231xx_errdev
|
||||
("cannot change interface %d alternate number to %d (error=%i)\n",
|
||||
usb_interface_index, alt, status);
|
||||
return status;
|
||||
}
|
||||
@@ -564,6 +590,7 @@ int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
|
||||
|
||||
int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
|
||||
@@ -575,8 +602,7 @@ int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
|
||||
|
||||
/* Send GPIO reset sequences specified at board entry */
|
||||
while (gpio->sleep >= 0) {
|
||||
rc = cx231xx_set_gpio_value(dev, gpio->bit,
|
||||
gpio->val);
|
||||
rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
@@ -607,10 +633,11 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
|
||||
if (dev->mode == CX231XX_DIGITAL_MODE) {
|
||||
/* Set Digital power mode */
|
||||
} else {
|
||||
/* Set Analog Power mode*/
|
||||
/* Set Analog Power mode */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_set_mode);
|
||||
|
||||
/************************************************************************************
|
||||
@@ -623,11 +650,11 @@ EXPORT_SYMBOL_GPL(cx231xx_set_mode);
|
||||
static void cx231xx_irq_callback(struct urb *urb)
|
||||
{
|
||||
struct cx231xx_dmaqueue *dma_q = urb->context;
|
||||
struct cx231xx_video_mode *vmode = container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx_video_mode *vmode =
|
||||
container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
|
||||
int rc, i;
|
||||
|
||||
|
||||
switch (urb->status) {
|
||||
case 0: /* success */
|
||||
case -ETIMEDOUT: /* NAK */
|
||||
@@ -682,7 +709,8 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
|
||||
if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
|
||||
usb_buffer_free(dev->udev,
|
||||
urb->transfer_buffer_length,
|
||||
dev->video_mode.isoc_ctl.transfer_buffer[i],
|
||||
dev->video_mode.isoc_ctl.
|
||||
transfer_buffer[i],
|
||||
urb->transfer_dma);
|
||||
}
|
||||
usb_free_urb(urb);
|
||||
@@ -700,6 +728,7 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
|
||||
|
||||
cx231xx_capture_start(dev, 0, Raw_Video);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
|
||||
|
||||
/*
|
||||
@@ -707,7 +736,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
|
||||
*/
|
||||
int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
int num_bufs, int max_pkt_size,
|
||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
|
||||
int (*isoc_copy) (struct cx231xx * dev, struct urb * urb))
|
||||
{
|
||||
struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
|
||||
int i;
|
||||
@@ -718,12 +747,11 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
|
||||
cx231xx_isocdbg("cx231xx: called cx231xx_prepare_isoc\n");
|
||||
|
||||
dev->video_input = dev->video_input > 2?2:dev->video_input;
|
||||
dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
|
||||
|
||||
cx231xx_info("Setting Video mux to %d\n",dev->video_input);
|
||||
cx231xx_info("Setting Video mux to %d\n", dev->video_input);
|
||||
video_mux(dev, dev->video_input);
|
||||
|
||||
|
||||
/* De-allocates all pending stuff */
|
||||
cx231xx_uninit_isoc(dev);
|
||||
|
||||
@@ -734,20 +762,21 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
dma_q->last_sav = 0;
|
||||
dma_q->current_field = -1;
|
||||
dma_q->field1_done = 0;
|
||||
dma_q->lines_per_field = dev->height/2;
|
||||
dma_q->lines_per_field = dev->height / 2;
|
||||
dma_q->bytes_left_in_line = dev->width << 1;
|
||||
dma_q->lines_completed = 0;
|
||||
for(i = 0; i < 8 ; i++)
|
||||
for (i = 0; i < 8; i++)
|
||||
dma_q->partial_buf[i] = 0;
|
||||
|
||||
dev->video_mode.isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
|
||||
dev->video_mode.isoc_ctl.urb =
|
||||
kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
|
||||
if (!dev->video_mode.isoc_ctl.urb) {
|
||||
cx231xx_errdev("cannot alloc memory for usb buffers\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev->video_mode.isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
|
||||
GFP_KERNEL);
|
||||
dev->video_mode.isoc_ctl.transfer_buffer =
|
||||
kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
|
||||
if (!dev->video_mode.isoc_ctl.transfer_buffer) {
|
||||
cx231xx_errdev("cannot allocate memory for usbtransfer\n");
|
||||
kfree(dev->video_mode.isoc_ctl.urb);
|
||||
@@ -769,23 +798,25 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
}
|
||||
dev->video_mode.isoc_ctl.urb[i] = urb;
|
||||
|
||||
dev->video_mode.isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->udev,
|
||||
sb_size, GFP_KERNEL, &urb->transfer_dma);
|
||||
dev->video_mode.isoc_ctl.transfer_buffer[i] =
|
||||
usb_buffer_alloc(dev->udev, sb_size, GFP_KERNEL,
|
||||
&urb->transfer_dma);
|
||||
if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
|
||||
cx231xx_err("unable to allocate %i bytes for transfer"
|
||||
" buffer %i%s\n",
|
||||
sb_size, i,
|
||||
in_interrupt()?" while in int":"");
|
||||
in_interrupt()? " while in int" : "");
|
||||
cx231xx_uninit_isoc(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
|
||||
|
||||
pipe = usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
|
||||
pipe =
|
||||
usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
|
||||
|
||||
usb_fill_int_urb(urb, dev->udev, pipe,
|
||||
dev->video_mode.isoc_ctl.transfer_buffer[i], sb_size,
|
||||
cx231xx_irq_callback, dma_q, 1);
|
||||
dev->video_mode.isoc_ctl.transfer_buffer[i],
|
||||
sb_size, cx231xx_irq_callback, dma_q, 1);
|
||||
|
||||
urb->number_of_packets = max_packets;
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
@@ -801,10 +832,10 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
|
||||
init_waitqueue_head(&dma_q->wq);
|
||||
|
||||
|
||||
/* submit urbs and enables IRQ */
|
||||
for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
|
||||
rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i], GFP_ATOMIC);
|
||||
rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
|
||||
GFP_ATOMIC);
|
||||
if (rc) {
|
||||
cx231xx_err("submit of urb %i failed (error=%i)\n", i,
|
||||
rc);
|
||||
@@ -817,6 +848,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
|
||||
|
||||
/************************************************************************************
|
||||
@@ -858,7 +890,8 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
/* Note : with out calling set power mode function, colibri can not be set up correctly */
|
||||
errCode = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -866,13 +899,15 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
/* initialize Colibri block */
|
||||
errCode = cx231xx_colibri_init_super_block(dev, 0x23c);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_colibri init super block - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_colibri init super block - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
errCode = cx231xx_colibri_init_channels(dev);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_colibri init channels - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_colibri init channels - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -880,7 +915,8 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
/* Set DIF in By pass mode */
|
||||
errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -888,7 +924,8 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
/* flatiron related functions */
|
||||
errCode = cx231xx_flatiron_initialize(dev);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_flatiron initialize - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_flatiron initialize - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -904,7 +941,8 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
/* set AGC mode to Analog */
|
||||
errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
|
||||
if (errCode < 0) {
|
||||
cx231xx_errdev("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
|
||||
cx231xx_errdev
|
||||
("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
|
||||
__func__, errCode);
|
||||
return errCode;
|
||||
}
|
||||
@@ -913,7 +951,7 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
|
||||
cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
|
||||
cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
|
||||
if(dev->board.has_dvb)
|
||||
if (dev->board.has_dvb)
|
||||
cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
|
||||
|
||||
/* set the I2C master port to 3 on channel 1 */
|
||||
@@ -921,6 +959,7 @@ int cx231xx_dev_init(struct cx231xx *dev)
|
||||
|
||||
return errCode;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_dev_init);
|
||||
|
||||
void cx231xx_dev_uninit(struct cx231xx *dev)
|
||||
@@ -930,37 +969,36 @@ void cx231xx_dev_uninit(struct cx231xx *dev)
|
||||
cx231xx_i2c_unregister(&dev->i2c_bus[1]);
|
||||
cx231xx_i2c_unregister(&dev->i2c_bus[0]);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
|
||||
|
||||
/************************************************************************************
|
||||
* G P I O related functions *
|
||||
*************************************************************************************/
|
||||
int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val,
|
||||
int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val,
|
||||
u8 len, u8 request, u8 direction)
|
||||
{
|
||||
int status = 0;
|
||||
VENDOR_REQUEST_IN ven_req;
|
||||
|
||||
/* Set wValue */
|
||||
ven_req.wValue = (u16)(gpio_bit>>16 & 0xffff);
|
||||
ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
|
||||
|
||||
/* set request */
|
||||
if(!request){
|
||||
if(direction)
|
||||
if (!request) {
|
||||
if (direction)
|
||||
ven_req.bRequest = VRT_GET_GPIO; /* 0x8 gpio */
|
||||
else
|
||||
ven_req.bRequest = VRT_SET_GPIO; /* 0x9 gpio */
|
||||
}
|
||||
else {
|
||||
if(direction)
|
||||
} else {
|
||||
if (direction)
|
||||
ven_req.bRequest = VRT_GET_GPIE; /* 0xa gpie */
|
||||
else
|
||||
ven_req.bRequest = VRT_SET_GPIE; /* 0xb gpie */
|
||||
}
|
||||
|
||||
/* set index value */
|
||||
ven_req.wIndex = (u16)(gpio_bit & 0xffff);
|
||||
ven_req.wIndex = (u16) (gpio_bit & 0xffff);
|
||||
|
||||
/* set wLength value */
|
||||
ven_req.wLength = len;
|
||||
@@ -972,20 +1010,19 @@ int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val,
|
||||
ven_req.pBuff = gpio_val;
|
||||
|
||||
/* set the direction */
|
||||
if(direction){
|
||||
if (direction) {
|
||||
ven_req.direction = USB_DIR_IN;
|
||||
memset(ven_req.pBuff, 0x00, ven_req.wLength);
|
||||
}
|
||||
else
|
||||
} else
|
||||
ven_req.direction = USB_DIR_OUT;
|
||||
|
||||
|
||||
|
||||
/* call common vendor command request */
|
||||
status = cx231xx_send_vendor_cmd(dev, &ven_req);
|
||||
if (status < 0)
|
||||
{
|
||||
cx231xx_info("UsbInterface::sendCommand, output buffer failed with status -%d\n", status);
|
||||
if (status < 0) {
|
||||
cx231xx_info
|
||||
("UsbInterface::sendCommand, output buffer failed with status -%d\n",
|
||||
status);
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -998,23 +1035,25 @@ EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
|
||||
*************************************************************************************/
|
||||
int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
|
||||
{
|
||||
u8 value[4] = {0x0, 0x0, 0x0, 0x0};
|
||||
u32 tmp =0;
|
||||
u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
|
||||
u32 tmp = 0;
|
||||
int status = 0;
|
||||
|
||||
status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, address,value,4);
|
||||
if(status < 0)
|
||||
status =
|
||||
cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
tmp = *((u32 *)value);
|
||||
tmp = *((u32 *) value);
|
||||
tmp |= mode;
|
||||
|
||||
value[0]=(u8) tmp;
|
||||
value[1]=(u8)(tmp>>8);
|
||||
value[2]=(u8)(tmp>>16);
|
||||
value[3]=(u8)(tmp>>24);
|
||||
value[0] = (u8) tmp;
|
||||
value[1] = (u8) (tmp >> 8);
|
||||
value[2] = (u8) (tmp >> 16);
|
||||
value[3] = (u8) (tmp >> 24);
|
||||
|
||||
status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, address,value,4);
|
||||
status =
|
||||
cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1023,15 +1062,15 @@ int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
|
||||
* I 2 C Internal C O N T R O L functions *
|
||||
*************************************************************************************/
|
||||
int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
|
||||
u8 saddr_len, u32 *data, u8 data_len)
|
||||
u8 saddr_len, u32 * data, u8 data_len)
|
||||
{
|
||||
int status = 0;
|
||||
struct cx231xx_i2c_xfer_data req_data;
|
||||
u8 value[4] ={0,0,0,0};
|
||||
u8 value[4] = { 0, 0, 0, 0 };
|
||||
|
||||
if(saddr_len == 0)
|
||||
if (saddr_len == 0)
|
||||
saddr = 0;
|
||||
else if(saddr_len == 0)
|
||||
else if (saddr_len == 0)
|
||||
saddr &= 0xff;
|
||||
|
||||
/* prepare xfer_data struct */
|
||||
@@ -1040,18 +1079,19 @@ int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
|
||||
req_data.saddr_len = saddr_len;
|
||||
req_data.saddr_dat = saddr;
|
||||
req_data.buf_size = data_len;
|
||||
req_data.p_buffer = (u8*)value;
|
||||
req_data.p_buffer = (u8 *) value;
|
||||
|
||||
/* usb send command */
|
||||
status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
|
||||
|
||||
if(status >= 0)
|
||||
{
|
||||
if (status >= 0) {
|
||||
/* Copy the data read back to main buffer */
|
||||
if(data_len == 1)
|
||||
if (data_len == 1)
|
||||
*data = value[0];
|
||||
else
|
||||
*data = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
|
||||
*data =
|
||||
value[0] | value[1] << 8 | value[2] << 16 | value[3]
|
||||
<< 24;
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -1061,17 +1101,17 @@ int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
|
||||
u8 saddr_len, u32 data, u8 data_len)
|
||||
{
|
||||
int status = 0;
|
||||
u8 value[4] ={0,0,0,0};
|
||||
u8 value[4] = { 0, 0, 0, 0 };
|
||||
struct cx231xx_i2c_xfer_data req_data;
|
||||
|
||||
value[0]=(u8)data;
|
||||
value[1]=(u8)(data>>8);
|
||||
value[2]=(u8)(data>>16);
|
||||
value[3]=(u8)(data>>24);
|
||||
value[0] = (u8) data;
|
||||
value[1] = (u8) (data >> 8);
|
||||
value[2] = (u8) (data >> 16);
|
||||
value[3] = (u8) (data >> 24);
|
||||
|
||||
if(saddr_len == 0)
|
||||
if (saddr_len == 0)
|
||||
saddr = 0;
|
||||
else if(saddr_len == 0)
|
||||
else if (saddr_len == 0)
|
||||
saddr &= 0xff;
|
||||
|
||||
/* prepare xfer_data struct */
|
||||
@@ -1088,54 +1128,58 @@ int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
|
||||
return status;
|
||||
}
|
||||
|
||||
int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size, u16 register_address,
|
||||
u8 bit_start,u8 bit_end, u32 value)
|
||||
int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
|
||||
u16 register_address, u8 bit_start, u8 bit_end,
|
||||
u32 value)
|
||||
{
|
||||
int status = 0;
|
||||
u32 tmp;
|
||||
u32 mask = 0;
|
||||
int i;
|
||||
|
||||
if (bit_start>(size-1) || bit_end>(size-1)) {
|
||||
if (bit_start > (size - 1) || bit_end > (size - 1)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (size==8){
|
||||
status = cx231xx_read_i2c_data(dev, dev_addr, register_address, 2, &tmp, 1);
|
||||
if (size == 8) {
|
||||
status =
|
||||
cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
|
||||
&tmp, 1);
|
||||
} else {
|
||||
status = cx231xx_read_i2c_data(dev, dev_addr, register_address, 2, &tmp, 4);
|
||||
status =
|
||||
cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
|
||||
&tmp, 4);
|
||||
}
|
||||
|
||||
if (status < 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
mask = 1<<bit_end;
|
||||
for (i=bit_end; i>bit_start&&i>0; i--) {
|
||||
mask = mask + (1<<(i-1));
|
||||
mask = 1 << bit_end;
|
||||
for (i = bit_end; i > bit_start && i > 0; i--) {
|
||||
mask = mask + (1 << (i - 1));
|
||||
}
|
||||
|
||||
value <<= bit_start;
|
||||
|
||||
if (size==8)
|
||||
{
|
||||
if (size == 8) {
|
||||
tmp &= ~mask;
|
||||
tmp |= value;
|
||||
tmp &= 0xff;
|
||||
status = cx231xx_write_i2c_data(dev, dev_addr, register_address, 2, tmp, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
status =
|
||||
cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
|
||||
tmp, 1);
|
||||
} else {
|
||||
tmp &= ~mask;
|
||||
tmp |= value;
|
||||
status = cx231xx_write_i2c_data(dev, dev_addr, register_address, 2, tmp, 4);
|
||||
status =
|
||||
cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
|
||||
tmp, 4);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
|
||||
u16 saddr, u32 mask, u32 value)
|
||||
{
|
||||
@@ -1144,7 +1188,7 @@ int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
|
||||
|
||||
status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
|
||||
|
||||
if(status < 0)
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
temp &= ~mask;
|
||||
|
@@ -29,7 +29,6 @@
|
||||
#include "xc5000.h"
|
||||
#include "dvb_dummy_fe.h"
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
|
||||
MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -65,9 +64,7 @@ struct cx231xx_dvb {
|
||||
struct dvb_net net;
|
||||
};
|
||||
|
||||
|
||||
static inline void print_err_status(struct cx231xx *dev,
|
||||
int packet, int status)
|
||||
static inline void print_err_status(struct cx231xx *dev, int packet, int status)
|
||||
{
|
||||
char *errmsg = "Unknown";
|
||||
|
||||
@@ -149,8 +146,8 @@ static int start_streaming(struct cx231xx_dvb *dvb)
|
||||
return rc;
|
||||
|
||||
return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
|
||||
CX231XX_DVB_NUM_BUFS, CX231XX_DVB_MAX_PACKETSIZE,
|
||||
dvb_isoc_copy);
|
||||
CX231XX_DVB_NUM_BUFS,
|
||||
CX231XX_DVB_MAX_PACKETSIZE, dvb_isoc_copy);
|
||||
}
|
||||
|
||||
static int stop_streaming(struct cx231xx_dvb *dvb)
|
||||
@@ -203,8 +200,6 @@ static int stop_feed(struct dvb_demux_feed *feed)
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
|
||||
{
|
||||
@@ -218,13 +213,11 @@ static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
|
||||
static struct xc5000_config cnxt_rde250_tunerconfig = {
|
||||
.i2c_address = 0x61,
|
||||
.if_khz = 5380,
|
||||
};
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
#if 0
|
||||
static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||
@@ -239,8 +232,7 @@ static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||
|
||||
if (!dev->dvb->frontend) {
|
||||
printk(KERN_ERR "%s/2: dvb frontend not attached. "
|
||||
"Can't attach xc5000\n",
|
||||
dev->name);
|
||||
"Can't attach xc5000\n", dev->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -258,20 +250,20 @@ static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq )
|
||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if( (dev->dvb != NULL) && (dev->dvb->frontend != NULL) ){
|
||||
if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
|
||||
|
||||
struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
|
||||
|
||||
if(dops->set_analog_params != NULL) {
|
||||
if (dops->set_analog_params != NULL) {
|
||||
struct analog_parameters params;
|
||||
|
||||
params.frequency = freq;
|
||||
params.std = dev->norm;
|
||||
params.mode = 0 ; /* 0- Air; 1 - cable */
|
||||
params.mode = 0; /* 0- Air; 1 - cable */
|
||||
/*params.audmode = ; */
|
||||
|
||||
/* Set the analog parameters to set the frequency */
|
||||
@@ -288,20 +280,22 @@ int cx231xx_reset_analog_tuner(struct cx231xx *dev)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if( (dev->dvb != NULL) && (dev->dvb->frontend != NULL) ){
|
||||
if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
|
||||
|
||||
struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
|
||||
|
||||
if(dops->init != NULL && !dev->xc_fw_load_done) {
|
||||
if (dops->init != NULL && !dev->xc_fw_load_done) {
|
||||
|
||||
cx231xx_info("Reloading firmware for XC5000\n");
|
||||
status = dops->init(dev->dvb->frontend);
|
||||
if(status == 0 ) {
|
||||
if (status == 0) {
|
||||
dev->xc_fw_load_done = 1;
|
||||
cx231xx_info("XC5000 firmware download completed\n");
|
||||
cx231xx_info
|
||||
("XC5000 firmware download completed\n");
|
||||
} else {
|
||||
dev->xc_fw_load_done = 0;
|
||||
cx231xx_info("XC5000 firmware download failed !!!\n");
|
||||
cx231xx_info
|
||||
("XC5000 firmware download failed !!!\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,13 +304,11 @@ int cx231xx_reset_analog_tuner(struct cx231xx *dev)
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
struct module *module,
|
||||
struct cx231xx *dev,
|
||||
struct device *device)
|
||||
struct cx231xx *dev, struct device *device)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -326,7 +318,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
|
||||
adapter_nr);
|
||||
if (result < 0) {
|
||||
printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n",
|
||||
printk(KERN_WARNING
|
||||
"%s: dvb_register_adapter failed (errno = %d)\n",
|
||||
dev->name, result);
|
||||
goto fail_adapter;
|
||||
}
|
||||
@@ -339,7 +332,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
/* register frontend */
|
||||
result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
|
||||
if (result < 0) {
|
||||
printk(KERN_WARNING "%s: dvb_register_frontend failed (errno = %d)\n",
|
||||
printk(KERN_WARNING
|
||||
"%s: dvb_register_frontend failed (errno = %d)\n",
|
||||
dev->name, result);
|
||||
goto fail_frontend;
|
||||
}
|
||||
@@ -374,7 +368,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
dvb->fe_hw.source = DMX_FRONTEND_0;
|
||||
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||
if (result < 0) {
|
||||
printk(KERN_WARNING "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
|
||||
printk(KERN_WARNING
|
||||
"%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
|
||||
dev->name, result);
|
||||
goto fail_fe_hw;
|
||||
}
|
||||
@@ -382,15 +377,17 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
dvb->fe_mem.source = DMX_MEMORY_FE;
|
||||
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
|
||||
if (result < 0) {
|
||||
printk(KERN_WARNING "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
|
||||
printk(KERN_WARNING
|
||||
"%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
|
||||
dev->name, result);
|
||||
goto fail_fe_mem;
|
||||
}
|
||||
|
||||
result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||
if (result < 0) {
|
||||
printk(KERN_WARNING "%s: connect_frontend failed (errno = %d)\n",
|
||||
dev->name, result);
|
||||
printk(KERN_WARNING
|
||||
"%s: connect_frontend failed (errno = %d)\n", dev->name,
|
||||
result);
|
||||
goto fail_fe_conn;
|
||||
}
|
||||
|
||||
@@ -398,20 +395,20 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||
dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
|
||||
return 0;
|
||||
|
||||
fail_fe_conn:
|
||||
fail_fe_conn:
|
||||
dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
|
||||
fail_fe_mem:
|
||||
fail_fe_mem:
|
||||
dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||
fail_fe_hw:
|
||||
fail_fe_hw:
|
||||
dvb_dmxdev_release(&dvb->dmxdev);
|
||||
fail_dmxdev:
|
||||
fail_dmxdev:
|
||||
dvb_dmx_release(&dvb->demux);
|
||||
fail_dmx:
|
||||
fail_dmx:
|
||||
dvb_unregister_frontend(dvb->frontend);
|
||||
fail_frontend:
|
||||
fail_frontend:
|
||||
dvb_frontend_detach(dvb->frontend);
|
||||
dvb_unregister_adapter(&dvb->adapter);
|
||||
fail_adapter:
|
||||
fail_adapter:
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -427,7 +424,6 @@ static void unregister_dvb(struct cx231xx_dvb *dvb)
|
||||
dvb_unregister_adapter(&dvb->adapter);
|
||||
}
|
||||
|
||||
|
||||
static int dvb_init(struct cx231xx *dev)
|
||||
{
|
||||
int result = 0;
|
||||
@@ -455,11 +451,12 @@ static int dvb_init(struct cx231xx *dev)
|
||||
|
||||
/* dev->dvb->frontend = dvb_attach(s5h1411_attach,
|
||||
&dvico_s5h1411_config,
|
||||
&dev->i2c_bus[1].i2c_adap);*/
|
||||
&dev->i2c_bus[1].i2c_adap); */
|
||||
dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
|
||||
|
||||
if(dev->dvb->frontend == NULL) {
|
||||
printk(DRIVER_NAME ": Failed to attach dummy front end\n");
|
||||
if (dev->dvb->frontend == NULL) {
|
||||
printk(DRIVER_NAME
|
||||
": Failed to attach dummy front end\n");
|
||||
result = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -467,7 +464,7 @@ static int dvb_init(struct cx231xx *dev)
|
||||
/* define general-purpose callback pointer */
|
||||
dvb->frontend->callback = cx231xx_tuner_callback;
|
||||
|
||||
if(dvb_attach(xc5000_attach, dev->dvb->frontend,
|
||||
if (dvb_attach(xc5000_attach, dev->dvb->frontend,
|
||||
&dev->i2c_bus[1].i2c_adap,
|
||||
&cnxt_rde250_tunerconfig) < 0) {
|
||||
result = -EINVAL;
|
||||
@@ -479,8 +476,9 @@ static int dvb_init(struct cx231xx *dev)
|
||||
|
||||
dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
|
||||
|
||||
if(dev->dvb->frontend == NULL) {
|
||||
printk(DRIVER_NAME ": Failed to attach dummy front end\n");
|
||||
if (dev->dvb->frontend == NULL) {
|
||||
printk(DRIVER_NAME
|
||||
": Failed to attach dummy front end\n");
|
||||
result = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -488,7 +486,7 @@ static int dvb_init(struct cx231xx *dev)
|
||||
/* define general-purpose callback pointer */
|
||||
dvb->frontend->callback = cx231xx_tuner_callback;
|
||||
|
||||
if(dvb_attach(xc5000_attach, dev->dvb->frontend,
|
||||
if (dvb_attach(xc5000_attach, dev->dvb->frontend,
|
||||
&dev->i2c_bus[1].i2c_adap,
|
||||
&cnxt_rde250_tunerconfig) < 0) {
|
||||
result = -EINVAL;
|
||||
@@ -498,19 +496,16 @@ static int dvb_init(struct cx231xx *dev)
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
|
||||
" isn't supported yet\n",
|
||||
dev->name);
|
||||
" isn't supported yet\n", dev->name);
|
||||
break;
|
||||
}
|
||||
if (NULL == dvb->frontend) {
|
||||
printk(KERN_ERR
|
||||
"%s/2: frontend initialization failed\n",
|
||||
dev->name);
|
||||
"%s/2: frontend initialization failed\n", dev->name);
|
||||
result = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
||||
/* register everything */
|
||||
result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
|
||||
|
||||
@@ -521,7 +516,7 @@ static int dvb_init(struct cx231xx *dev)
|
||||
printk(KERN_INFO "Successfully loaded cx231xx-dvb\n");
|
||||
return 0;
|
||||
|
||||
out_free:
|
||||
out_free:
|
||||
cx231xx_set_mode(dev, CX231XX_SUSPEND);
|
||||
kfree(dvb);
|
||||
dev->dvb = NULL;
|
||||
@@ -562,4 +557,3 @@ static void __exit cx231xx_dvb_unregister(void)
|
||||
|
||||
module_init(cx231xx_dvb_register);
|
||||
module_exit(cx231xx_dvb_unregister);
|
||||
|
||||
|
@@ -29,7 +29,6 @@
|
||||
|
||||
#include "cx231xx.h"
|
||||
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
static unsigned int i2c_scan;
|
||||
@@ -40,7 +39,6 @@ static unsigned int i2c_debug;
|
||||
module_param(i2c_debug, int, 0644);
|
||||
MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
|
||||
|
||||
|
||||
#define dprintk1(lvl, fmt, args...) \
|
||||
do { \
|
||||
if (i2c_debug >= lvl) { \
|
||||
@@ -56,7 +54,6 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*
|
||||
* cx231xx_i2c_send_bytes()
|
||||
*/
|
||||
@@ -74,25 +71,25 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||
u16 saddr = 0;
|
||||
u8 need_gpio = 0;
|
||||
|
||||
|
||||
if( (bus->nr ==1) && (msg->addr == 0x61) && (dev->tuner_type == TUNER_XC5000) ) {
|
||||
if ((bus->nr == 1) && (msg->addr == 0x61)
|
||||
&& (dev->tuner_type == TUNER_XC5000)) {
|
||||
|
||||
size = msg->len;
|
||||
|
||||
if( size == 2 ) { /* register write sub addr*/
|
||||
if (size == 2) { /* register write sub addr */
|
||||
|
||||
/* Just writing sub address will cause problem to XC5000
|
||||
So ignore the request */
|
||||
return 0;
|
||||
|
||||
} else if( size == 4 ) { /* register write with sub addr*/
|
||||
} else if (size == 4) { /* register write with sub addr */
|
||||
|
||||
if(msg->len >= 2 )
|
||||
if (msg->len >= 2)
|
||||
saddr = msg->buf[0] << 8 | msg->buf[1];
|
||||
else if ( msg->len == 1 )
|
||||
else if (msg->len == 1)
|
||||
saddr = msg->buf[0];
|
||||
|
||||
switch(saddr) {
|
||||
switch (saddr) {
|
||||
case 0x0000: /* start tuner calibration mode */
|
||||
need_gpio = 1;
|
||||
dev->xc_fw_load_done = 1; /* FW Loading is done */
|
||||
@@ -104,16 +101,20 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||
need_gpio = 1;
|
||||
break;
|
||||
default:
|
||||
if(dev->xc_fw_load_done)
|
||||
if (dev->xc_fw_load_done)
|
||||
need_gpio = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if(need_gpio ) {
|
||||
dprintk1(1, " GPIO W R I T E : addr 0x%x, len %d, saddr 0x%x\n",
|
||||
if (need_gpio) {
|
||||
dprintk1(1,
|
||||
" GPIO W R I T E : addr 0x%x, len %d, saddr 0x%x\n",
|
||||
msg->addr, msg->len, saddr);
|
||||
|
||||
return dev->cx231xx_gpio_i2c_write(dev, msg->addr, msg->buf, msg->len);
|
||||
return dev->cx231xx_gpio_i2c_write(dev,
|
||||
msg->addr,
|
||||
msg->buf,
|
||||
msg->len);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -123,7 +124,7 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||
|
||||
/* adjust the length to correct length */
|
||||
size -= saddr_len;
|
||||
buf_ptr = (u8*) (msg->buf + 1 );
|
||||
buf_ptr = (u8 *) (msg->buf + 1);
|
||||
|
||||
do {
|
||||
/* prepare xfer_data struct */
|
||||
@@ -131,22 +132,22 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||
req_data.direction = msg->flags;
|
||||
req_data.saddr_len = saddr_len;
|
||||
req_data.saddr_dat = msg->buf[0];
|
||||
req_data.buf_size = size > 16 ? 16: size;
|
||||
req_data.p_buffer = (u8*)(buf_ptr + loop * 16);
|
||||
req_data.buf_size = size > 16 ? 16 : size;
|
||||
req_data.p_buffer = (u8 *) (buf_ptr + loop * 16);
|
||||
|
||||
bus->i2c_nostop = (size > 16) ? 1: 0;
|
||||
bus->i2c_reserve = (loop == 0) ? 0: 1;
|
||||
bus->i2c_nostop = (size > 16) ? 1 : 0;
|
||||
bus->i2c_reserve = (loop == 0) ? 0 : 1;
|
||||
|
||||
/* usb send command */
|
||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||
loop++;
|
||||
|
||||
if( size >= 16 )
|
||||
if (size >= 16)
|
||||
size -= 16;
|
||||
else
|
||||
size = 0;
|
||||
|
||||
}while( size > 0 );
|
||||
} while (size > 0);
|
||||
|
||||
bus->i2c_nostop = 0;
|
||||
bus->i2c_reserve = 0;
|
||||
@@ -165,7 +166,7 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||
}
|
||||
|
||||
return status < 0 ? status: 0;
|
||||
return status < 0 ? status : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -182,21 +183,23 @@ static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||
u16 saddr = 0;
|
||||
u8 need_gpio = 0;
|
||||
|
||||
if((bus->nr ==1) && (msg->addr == 0x61) && dev->tuner_type == TUNER_XC5000) {
|
||||
if ((bus->nr == 1) && (msg->addr == 0x61)
|
||||
&& dev->tuner_type == TUNER_XC5000) {
|
||||
|
||||
if(msg->len == 2 )
|
||||
if (msg->len == 2)
|
||||
saddr = msg->buf[0] << 8 | msg->buf[1];
|
||||
else if ( msg->len == 1 )
|
||||
else if (msg->len == 1)
|
||||
saddr = msg->buf[0];
|
||||
|
||||
if( dev->xc_fw_load_done) {
|
||||
if (dev->xc_fw_load_done) {
|
||||
|
||||
switch(saddr) {
|
||||
switch (saddr) {
|
||||
case 0x0009: /* BUSY check */
|
||||
dprintk1(1, " GPIO R E A D : Special case BUSY check \n");
|
||||
dprintk1(1,
|
||||
" GPIO R E A D : Special case BUSY check \n");
|
||||
/* Try to read BUSY register, just set it to zero */
|
||||
msg->buf[0] = 0;
|
||||
if(msg->len == 2 )
|
||||
if (msg->len == 2)
|
||||
msg->buf[1] = 0;
|
||||
return 0;
|
||||
case 0x0004: /* read Lock status */
|
||||
@@ -205,13 +208,21 @@ static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||
|
||||
}
|
||||
|
||||
if(need_gpio) {
|
||||
if (need_gpio) {
|
||||
/* this is a special case to handle Xceive tuner clock stretch issue
|
||||
with gpio based I2C interface */
|
||||
dprintk1(1, " GPIO R E A D : addr 0x%x, len %d, saddr 0x%x\n",
|
||||
msg->addr, msg->len, msg->buf[0] << 8| msg->buf[1]);
|
||||
status = dev->cx231xx_gpio_i2c_write(dev, msg->addr, msg->buf, msg->len);
|
||||
status = dev->cx231xx_gpio_i2c_read(dev, msg->addr, msg->buf, msg->len);
|
||||
dprintk1(1,
|
||||
" GPIO R E A D : addr 0x%x, len %d, saddr 0x%x\n",
|
||||
msg->addr, msg->len,
|
||||
msg->buf[0] << 8 | msg->buf[1]);
|
||||
status =
|
||||
dev->cx231xx_gpio_i2c_write(dev, msg->addr,
|
||||
msg->buf,
|
||||
msg->len);
|
||||
status =
|
||||
dev->cx231xx_gpio_i2c_read(dev, msg->addr,
|
||||
msg->buf,
|
||||
msg->len);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
@@ -241,7 +252,7 @@ static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||
}
|
||||
|
||||
return status < 0 ? status: 0;
|
||||
return status < 0 ? status : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -249,7 +260,8 @@ static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||
* read a byte from the i2c device
|
||||
*/
|
||||
static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
||||
const struct i2c_msg *msg1, const struct i2c_msg *msg2)
|
||||
const struct i2c_msg *msg1,
|
||||
const struct i2c_msg *msg2)
|
||||
{
|
||||
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
||||
struct cx231xx *dev = bus->dev;
|
||||
@@ -258,19 +270,21 @@ static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
||||
u16 saddr = 0;
|
||||
u8 need_gpio = 0;
|
||||
|
||||
if(msg1->len == 2 )
|
||||
if (msg1->len == 2)
|
||||
saddr = msg1->buf[0] << 8 | msg1->buf[1];
|
||||
else if ( msg1->len == 1 )
|
||||
else if (msg1->len == 1)
|
||||
saddr = msg1->buf[0];
|
||||
|
||||
if ( (bus->nr ==1) && (msg2->addr == 0x61) && dev->tuner_type == TUNER_XC5000) {
|
||||
if ((bus->nr == 1) && (msg2->addr == 0x61)
|
||||
&& dev->tuner_type == TUNER_XC5000) {
|
||||
|
||||
if( (msg2->len < 16) ) {
|
||||
if ((msg2->len < 16)) {
|
||||
|
||||
dprintk1(1, " i2c_read : addr 0x%x, len %d, subaddr 0x%x, leng %d\n",
|
||||
dprintk1(1,
|
||||
" i2c_read : addr 0x%x, len %d, subaddr 0x%x, leng %d\n",
|
||||
msg2->addr, msg2->len, saddr, msg1->len);
|
||||
|
||||
switch(saddr) {
|
||||
switch (saddr) {
|
||||
case 0x0008: /* read FW load status */
|
||||
need_gpio = 1;
|
||||
break;
|
||||
@@ -279,9 +293,15 @@ static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
||||
break;
|
||||
}
|
||||
|
||||
if(need_gpio ) {
|
||||
status = dev->cx231xx_gpio_i2c_write(dev, msg1->addr, msg1->buf, msg1->len);
|
||||
status = dev->cx231xx_gpio_i2c_read(dev, msg2->addr, msg2->buf, msg2->len);
|
||||
if (need_gpio) {
|
||||
status =
|
||||
dev->cx231xx_gpio_i2c_write(dev, msg1->addr,
|
||||
msg1->buf,
|
||||
msg1->len);
|
||||
status =
|
||||
dev->cx231xx_gpio_i2c_read(dev, msg2->addr,
|
||||
msg2->buf,
|
||||
msg2->len);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
@@ -298,7 +318,7 @@ static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
||||
/* usb send command */
|
||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||
|
||||
return status < 0 ? status: 0;
|
||||
return status < 0 ? status : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -324,7 +344,7 @@ static int cx231xx_i2c_check_for_device(struct i2c_adapter *i2c_adap,
|
||||
/* usb send command */
|
||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||
|
||||
return status < 0 ? status: 0;
|
||||
return status < 0 ? status : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -363,9 +383,12 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
printk(" %02x", msgs[i].buf[byte]);
|
||||
}
|
||||
} else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
|
||||
msgs[i].addr == msgs[i + 1].addr && (msgs[i].len <= 2) && (bus->nr < 2)) {
|
||||
msgs[i].addr == msgs[i + 1].addr
|
||||
&& (msgs[i].len <= 2) && (bus->nr < 2)) {
|
||||
/* read bytes */
|
||||
rc = cx231xx_i2c_recv_bytes_with_saddr(i2c_adap, &msgs[i], &msgs[i+1]);
|
||||
rc = cx231xx_i2c_recv_bytes_with_saddr(i2c_adap,
|
||||
&msgs[i],
|
||||
&msgs[i + 1]);
|
||||
if (i2c_debug >= 2) {
|
||||
for (byte = 0; byte < msgs[i].len; byte++)
|
||||
printk(" %02x", msgs[i].buf[byte]);
|
||||
@@ -377,7 +400,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
for (byte = 0; byte < msgs[i].len; byte++)
|
||||
printk(" %02x", msgs[i].buf[byte]);
|
||||
}
|
||||
rc = cx231xx_i2c_send_bytes(i2c_adap,&msgs[i]);
|
||||
rc = cx231xx_i2c_send_bytes(i2c_adap, &msgs[i]);
|
||||
}
|
||||
if (rc < 0)
|
||||
goto err;
|
||||
@@ -386,7 +409,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
}
|
||||
|
||||
return num;
|
||||
err:
|
||||
err:
|
||||
dprintk2(2, " ERROR: %i\n", rc);
|
||||
return rc;
|
||||
}
|
||||
@@ -454,7 +477,6 @@ static int detach_inform(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct i2c_algorithm cx231xx_algo = {
|
||||
.master_xfer = cx231xx_i2c_xfer,
|
||||
.functionality = functionality,
|
||||
@@ -507,7 +529,8 @@ void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c)
|
||||
if (rc < 0)
|
||||
continue;
|
||||
cx231xx_info("%s: i2c scan: found device @ 0x%x [%s]\n",
|
||||
dev->name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
|
||||
dev->name, i << 1,
|
||||
i2c_devs[i] ? i2c_devs[i] : "???");
|
||||
}
|
||||
cx231xx_info(": Completed Checking for I2C devices.\n");
|
||||
}
|
||||
@@ -516,7 +539,8 @@ void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c)
|
||||
* cx231xx_i2c_call_clients()
|
||||
* send commands to all attached i2c devices
|
||||
*/
|
||||
void cx231xx_i2c_call_clients(struct cx231xx_i2c *bus, unsigned int cmd, void *arg)
|
||||
void cx231xx_i2c_call_clients(struct cx231xx_i2c *bus, unsigned int cmd,
|
||||
void *arg)
|
||||
{
|
||||
/* struct cx231xx *dev = bus->dev; */
|
||||
|
||||
@@ -536,17 +560,14 @@ int cx231xx_i2c_register(struct cx231xx_i2c *bus)
|
||||
|
||||
cx231xx_info("%s(bus = %d)\n", __func__, bus->nr);
|
||||
|
||||
memcpy(&bus->i2c_adap, &cx231xx_adap_template,
|
||||
sizeof(bus->i2c_adap));
|
||||
memcpy(&bus->i2c_algo, &cx231xx_algo,
|
||||
sizeof(bus->i2c_algo));
|
||||
memcpy(&bus->i2c_adap, &cx231xx_adap_template, sizeof(bus->i2c_adap));
|
||||
memcpy(&bus->i2c_algo, &cx231xx_algo, sizeof(bus->i2c_algo));
|
||||
memcpy(&bus->i2c_client, &cx231xx_client_template,
|
||||
sizeof(bus->i2c_client));
|
||||
|
||||
bus->i2c_adap.dev.parent = &dev->udev->dev;
|
||||
|
||||
strlcpy(bus->i2c_adap.name, bus->dev->name,
|
||||
sizeof(bus->i2c_adap.name));
|
||||
strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name));
|
||||
|
||||
bus->i2c_algo.data = bus;
|
||||
bus->i2c_adap.algo_data = bus;
|
||||
|
@@ -30,7 +30,6 @@
|
||||
|
||||
#include "cx231xx.h"
|
||||
|
||||
|
||||
static unsigned int ir_debug;
|
||||
module_param(ir_debug, int, 0644);
|
||||
MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
|
||||
@@ -71,11 +70,9 @@ struct cx231xx_IR {
|
||||
unsigned int last_readcount;
|
||||
unsigned int repeat_interval;
|
||||
|
||||
int (*get_key)(struct cx231xx_IR *, struct cx231xx_ir_poll_result *);
|
||||
int (*get_key) (struct cx231xx_IR *, struct cx231xx_ir_poll_result *);
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**********************************************************
|
||||
Polling code for cx231xx
|
||||
**********************************************************/
|
||||
@@ -196,8 +193,7 @@ int cx231xx_ir_init(struct cx231xx *dev)
|
||||
ir->polling = 100; /* ms */
|
||||
|
||||
/* init input device */
|
||||
snprintf(ir->name, sizeof(ir->name), "cx231xx IR (%s)",
|
||||
dev->name);
|
||||
snprintf(ir->name, sizeof(ir->name), "cx231xx IR (%s)", dev->name);
|
||||
|
||||
usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
|
||||
strlcat(ir->phys, "/input0", sizeof(ir->phys));
|
||||
|
@@ -60,7 +60,6 @@
|
||||
/*****************************************************************************/
|
||||
#define HOST_REG2 0x001
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define HOST_REG3 0x002
|
||||
|
||||
@@ -231,7 +230,6 @@
|
||||
/* Reserved [3:1] */
|
||||
#define FLD_CIR_TEST_DIS 0x00000001
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define TEST_CTRL2 0x148
|
||||
#define FLD_TSXCLK_POL_CTL 0x80000000
|
||||
@@ -257,7 +255,6 @@
|
||||
#define FLD_FLTRN_BIST_TST_DONE 0x00000008
|
||||
#define FLD_VID_BIST_TST_DONE 0x00000007
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* DirectIF registers definition have been moved to DIF_reg.h */
|
||||
/*****************************************************************************/
|
||||
@@ -662,7 +659,6 @@
|
||||
#define FLD_PLL_KI 0x00FF0000
|
||||
#define FLD_PLL_MAX_OFFSET 0x0000FFFF
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define HTL_CTRL 0x498
|
||||
/* Reserved [31:24] */
|
||||
@@ -771,7 +767,6 @@
|
||||
#define FLD_FIELD_PHASE_LIMIT 0x000000F0
|
||||
#define FLD_HEAD_SW_DET_LIMIT 0x0000000F
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define DL_CTL 0x800
|
||||
#define DL_CTL_ADDRESS_LOW 0x800 /* Byte 1 in DL_CTL */
|
||||
@@ -1424,7 +1419,6 @@
|
||||
#define FLD_I2S_OUT_WS_SEL 0x00000020
|
||||
#define FLD_I2S_OUT_BCN_DEL 0x0000001F
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define AC97_CTL 0x91C
|
||||
/* Reserved [31:26] */
|
||||
@@ -1437,7 +1431,6 @@
|
||||
/* Reserved [7:1] */
|
||||
#define FLD_AC97_SHUTDOWN 0x00000001
|
||||
|
||||
|
||||
/* Cx231xx redefine */
|
||||
#define QPSK_IAGC_CTL1 0x94c
|
||||
#define QPSK_IAGC_CTL2 0x950
|
||||
@@ -1450,7 +1443,6 @@
|
||||
#define QPSK_EQ_CTL 0x96c
|
||||
#define QPSK_LOCK_CTL 0x970
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define FM1_DFT_CTL 0x9A8
|
||||
#define FLD_FM1_DFT_THRESHOLD 0xFFFF0000
|
||||
@@ -1494,8 +1486,6 @@
|
||||
/* Reserved [15:6] */
|
||||
#define FLD_AFE_VGA_OUT 0x0000003F
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
#define MTS_GAIN_STATUS 0x9BC
|
||||
/* Reserved [31:14] */
|
||||
@@ -1543,7 +1533,6 @@
|
||||
#define INPUT_MODE_YC2_2 2 /* INPUT_MODE_VALUE(2) */
|
||||
#define INPUT_MODE_YUV_3 3 /* INPUT_MODE_VALUE(3) */
|
||||
|
||||
|
||||
#define LUMA_LPF_LOW_BANDPASS 0 /* 0.6Mhz lowpass filter bandwidth */
|
||||
#define LUMA_LPF_MEDIUM_BANDPASS 1 /* 1.0Mhz lowpass filter bandwidth */
|
||||
#define LUMA_LPF_HIGH_BANDPASS 2 /* 1.5Mhz lowpass filter bandwidth */
|
||||
|
@@ -39,8 +39,7 @@
|
||||
#include "cx231xx.h"
|
||||
#include "cx231xx-vbi.h"
|
||||
|
||||
static inline void print_err_status(struct cx231xx *dev,
|
||||
int packet, int status)
|
||||
static inline void print_err_status(struct cx231xx *dev, int packet, int status)
|
||||
{
|
||||
char *errmsg = "Unknown";
|
||||
|
||||
@@ -71,7 +70,8 @@ static inline void print_err_status(struct cx231xx *dev,
|
||||
break;
|
||||
}
|
||||
if (packet < 0) {
|
||||
cx231xx_err(DRIVER_NAME "URB status %d [%s].\n", status, errmsg);
|
||||
cx231xx_err(DRIVER_NAME "URB status %d [%s].\n", status,
|
||||
errmsg);
|
||||
} else {
|
||||
cx231xx_err(DRIVER_NAME "URB packet %d, status %d [%s].\n",
|
||||
packet, status, errmsg);
|
||||
@@ -112,20 +112,22 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||
|
||||
bytes_parsed = 0;
|
||||
|
||||
if(dma_q->is_partial_line) {
|
||||
if (dma_q->is_partial_line) {
|
||||
/* Handle the case where we were working on a partial line */
|
||||
sav_eav = dma_q->last_sav;
|
||||
} else {
|
||||
/* Check for a SAV/EAV overlapping the buffer boundary */
|
||||
sav_eav = cx231xx_find_boundary_SAV_EAV(p_buffer, dma_q->partial_buf, &bytes_parsed);
|
||||
sav_eav =
|
||||
cx231xx_find_boundary_SAV_EAV(p_buffer,
|
||||
dma_q->partial_buf,
|
||||
&bytes_parsed);
|
||||
}
|
||||
|
||||
sav_eav &= 0xF0;
|
||||
/* Get the first line if we have some portion of an SAV/EAV from the last buffer
|
||||
or a partial line */
|
||||
if(sav_eav) {
|
||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q,
|
||||
sav_eav, /* SAV/EAV */
|
||||
if (sav_eav) {
|
||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q, sav_eav, /* SAV/EAV */
|
||||
p_buffer + bytes_parsed, /* p_buffer */
|
||||
buffer_size - bytes_parsed); /* buffer size */
|
||||
}
|
||||
@@ -133,22 +135,18 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||
/* Now parse data that is completely in this buffer */
|
||||
dma_q->is_partial_line = 0;
|
||||
|
||||
while(bytes_parsed < buffer_size)
|
||||
{
|
||||
while (bytes_parsed < buffer_size) {
|
||||
u32 bytes_used = 0;
|
||||
|
||||
sav_eav = cx231xx_find_next_SAV_EAV(
|
||||
p_buffer + bytes_parsed, /* p_buffer */
|
||||
sav_eav = cx231xx_find_next_SAV_EAV(p_buffer + bytes_parsed, /* p_buffer */
|
||||
buffer_size - bytes_parsed, /* buffer size */
|
||||
&bytes_used); /* Receives bytes used to get SAV/EAV */
|
||||
|
||||
bytes_parsed += bytes_used;
|
||||
|
||||
sav_eav &= 0xF0;
|
||||
if(sav_eav && (bytes_parsed < buffer_size))
|
||||
{
|
||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q,
|
||||
sav_eav, /* SAV/EAV */
|
||||
if (sav_eav && (bytes_parsed < buffer_size)) {
|
||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q, sav_eav, /* SAV/EAV */
|
||||
p_buffer + bytes_parsed, /* p_buffer */
|
||||
buffer_size - bytes_parsed); /* buffer size */
|
||||
}
|
||||
@@ -168,16 +166,17 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||
------------------------------------------------------------------*/
|
||||
|
||||
static int
|
||||
vbi_buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
|
||||
vbi_buffer_setup(struct videobuf_queue *vq, unsigned int *count,
|
||||
unsigned int *size)
|
||||
{
|
||||
struct cx231xx_fh *fh = vq->priv_data;
|
||||
struct cx231xx *dev = fh->dev;
|
||||
u32 height = 0;
|
||||
|
||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||
|
||||
*size = ( dev->width * height * 2);
|
||||
*size = (dev->width * height * 2);
|
||||
if (0 == *count)
|
||||
*count = CX231XX_DEF_VBI_BUF;
|
||||
|
||||
@@ -223,14 +222,15 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||
enum v4l2_field field)
|
||||
{
|
||||
struct cx231xx_fh *fh = vq->priv_data;
|
||||
struct cx231xx_buffer *buf = container_of(vb, struct cx231xx_buffer, vb);
|
||||
struct cx231xx_buffer *buf =
|
||||
container_of(vb, struct cx231xx_buffer, vb);
|
||||
struct cx231xx *dev = fh->dev;
|
||||
int rc = 0, urb_init = 0;
|
||||
u32 height = 0;
|
||||
|
||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
||||
buf->vb.size = ( (dev->width << 1) * height );
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||
buf->vb.size = ((dev->width << 1) * height);
|
||||
|
||||
if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
|
||||
return -EINVAL;
|
||||
@@ -251,7 +251,8 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||
|
||||
if (urb_init) {
|
||||
rc = cx231xx_init_vbi_isoc(dev, CX231XX_NUM_VBI_PACKETS,
|
||||
CX231XX_NUM_VBI_BUFS, dev->vbi_mode.alt_max_pkt_size[0],
|
||||
CX231XX_NUM_VBI_BUFS,
|
||||
dev->vbi_mode.alt_max_pkt_size[0],
|
||||
cx231xx_isoc_vbi_copy);
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
@@ -260,7 +261,7 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||
buf->vb.state = VIDEOBUF_PREPARED;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
fail:
|
||||
free_buffer(vq, buf);
|
||||
return rc;
|
||||
}
|
||||
@@ -268,7 +269,8 @@ fail:
|
||||
static void
|
||||
vbi_buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx231xx_buffer *buf = container_of(vb, struct cx231xx_buffer, vb);
|
||||
struct cx231xx_buffer *buf =
|
||||
container_of(vb, struct cx231xx_buffer, vb);
|
||||
struct cx231xx_fh *fh = vq->priv_data;
|
||||
struct cx231xx *dev = fh->dev;
|
||||
struct cx231xx_dmaqueue *vidq = &dev->vbi_mode.vidq;
|
||||
@@ -281,7 +283,8 @@ vbi_buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
||||
static void vbi_buffer_release(struct videobuf_queue *vq,
|
||||
struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx231xx_buffer *buf = container_of(vb, struct cx231xx_buffer, vb);
|
||||
struct cx231xx_buffer *buf =
|
||||
container_of(vb, struct cx231xx_buffer, vb);
|
||||
/*
|
||||
struct cx231xx_fh *fh = vq->priv_data;
|
||||
struct cx231xx *dev = (struct cx231xx *)fh->dev;
|
||||
@@ -292,7 +295,6 @@ static void vbi_buffer_release(struct videobuf_queue *vq,
|
||||
free_buffer(vq, buf);
|
||||
}
|
||||
|
||||
|
||||
struct videobuf_queue_ops cx231xx_vbi_qops = {
|
||||
.buf_setup = vbi_buffer_setup,
|
||||
.buf_prepare = vbi_buffer_prepare,
|
||||
@@ -300,8 +302,6 @@ struct videobuf_queue_ops cx231xx_vbi_qops = {
|
||||
.buf_release = vbi_buffer_release,
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------
|
||||
URB control
|
||||
------------------------------------------------------------------*/
|
||||
@@ -312,11 +312,11 @@ struct videobuf_queue_ops cx231xx_vbi_qops = {
|
||||
static void cx231xx_irq_vbi_callback(struct urb *urb)
|
||||
{
|
||||
struct cx231xx_dmaqueue *dma_q = urb->context;
|
||||
struct cx231xx_video_mode *vmode = container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx_video_mode *vmode =
|
||||
container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
||||
int rc;
|
||||
|
||||
|
||||
switch (urb->status) {
|
||||
case 0: /* success */
|
||||
case -ETIMEDOUT: /* NAK */
|
||||
@@ -326,7 +326,8 @@ static void cx231xx_irq_vbi_callback(struct urb *urb)
|
||||
case -ESHUTDOWN:
|
||||
return;
|
||||
default: /* error */
|
||||
cx231xx_err(DRIVER_NAME "urb completition error %d.\n", urb->status);
|
||||
cx231xx_err(DRIVER_NAME "urb completition error %d.\n",
|
||||
urb->status);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -366,8 +367,10 @@ void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
|
||||
|
||||
if (dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
|
||||
|
||||
kfree(dev->vbi_mode.isoc_ctl.transfer_buffer[i]);
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i] = NULL;
|
||||
kfree(dev->vbi_mode.isoc_ctl.
|
||||
transfer_buffer[i]);
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
|
||||
NULL;
|
||||
}
|
||||
usb_free_urb(urb);
|
||||
dev->vbi_mode.isoc_ctl.urb[i] = NULL;
|
||||
@@ -384,6 +387,7 @@ void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
|
||||
|
||||
cx231xx_capture_start(dev, 0, Vbi);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
|
||||
|
||||
/*
|
||||
@@ -391,7 +395,8 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
|
||||
*/
|
||||
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
int num_bufs, int max_pkt_size,
|
||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
|
||||
int (*isoc_copy) (struct cx231xx * dev,
|
||||
struct urb * urb))
|
||||
{
|
||||
struct cx231xx_dmaqueue *dma_q = &dev->vbi_mode.vidq;
|
||||
int i;
|
||||
@@ -405,8 +410,9 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
cx231xx_uninit_vbi_isoc(dev);
|
||||
|
||||
/* clear if any halt */
|
||||
usb_clear_halt(dev->udev, usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr));
|
||||
|
||||
usb_clear_halt(dev->udev,
|
||||
usb_rcvbulkpipe(dev->udev,
|
||||
dev->vbi_mode.end_point_addr));
|
||||
|
||||
dev->vbi_mode.isoc_ctl.isoc_copy = isoc_copy;
|
||||
dev->vbi_mode.isoc_ctl.num_bufs = num_bufs;
|
||||
@@ -416,19 +422,20 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
dma_q->current_field = -1;
|
||||
dma_q->bytes_left_in_line = dev->width << 1;
|
||||
dma_q->lines_per_field = ((dev->norm & V4L2_STD_625_50) ?
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||
dma_q->lines_completed = 0;
|
||||
for(i = 0; i < 8 ; i++)
|
||||
for (i = 0; i < 8; i++)
|
||||
dma_q->partial_buf[i] = 0;
|
||||
|
||||
dev->vbi_mode.isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
|
||||
dev->vbi_mode.isoc_ctl.urb =
|
||||
kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
|
||||
if (!dev->vbi_mode.isoc_ctl.urb) {
|
||||
cx231xx_errdev("cannot alloc memory for usb buffers\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
|
||||
GFP_KERNEL);
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer =
|
||||
kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
|
||||
if (!dev->vbi_mode.isoc_ctl.transfer_buffer) {
|
||||
cx231xx_errdev("cannot allocate memory for usbtransfer\n");
|
||||
kfree(dev->vbi_mode.isoc_ctl.urb);
|
||||
@@ -445,27 +452,29 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!urb) {
|
||||
cx231xx_err(DRIVER_NAME ": cannot alloc isoc_ctl.urb %i\n", i);
|
||||
cx231xx_err(DRIVER_NAME
|
||||
": cannot alloc isoc_ctl.urb %i\n", i);
|
||||
cx231xx_uninit_vbi_isoc(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
dev->vbi_mode.isoc_ctl.urb[i] = urb;
|
||||
urb->transfer_flags = 0;
|
||||
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i] = kzalloc(sb_size, GFP_KERNEL);
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
|
||||
kzalloc(sb_size, GFP_KERNEL);
|
||||
if (!dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
|
||||
cx231xx_err(DRIVER_NAME ": unable to allocate %i bytes for transfer"
|
||||
" buffer %i%s\n",
|
||||
sb_size, i,
|
||||
in_interrupt()?" while in int":"");
|
||||
cx231xx_err(DRIVER_NAME
|
||||
": unable to allocate %i bytes for transfer"
|
||||
" buffer %i%s\n", sb_size, i,
|
||||
in_interrupt()? " while in int" : "");
|
||||
cx231xx_uninit_vbi_isoc(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pipe = usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr);
|
||||
usb_fill_bulk_urb(urb, dev->udev, pipe,
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i], sb_size,
|
||||
cx231xx_irq_vbi_callback, dma_q);
|
||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i],
|
||||
sb_size, cx231xx_irq_vbi_callback, dma_q);
|
||||
}
|
||||
|
||||
init_waitqueue_head(&dma_q->wq);
|
||||
@@ -474,7 +483,8 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
|
||||
rc = usb_submit_urb(dev->vbi_mode.isoc_ctl.urb[i], GFP_ATOMIC);
|
||||
if (rc) {
|
||||
cx231xx_err(DRIVER_NAME ": submit of urb %i failed (error=%i)\n", i,
|
||||
cx231xx_err(DRIVER_NAME
|
||||
": submit of urb %i failed (error=%i)\n", i,
|
||||
rc);
|
||||
cx231xx_uninit_vbi_isoc(dev);
|
||||
return rc;
|
||||
@@ -485,16 +495,16 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(cx231xx_init_vbi_isoc);
|
||||
|
||||
|
||||
u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 sav_eav, u8 *p_buffer, u32 buffer_size)
|
||||
u32 cx231xx_get_vbi_line(struct cx231xx * dev, struct cx231xx_dmaqueue * dma_q,
|
||||
u8 sav_eav, u8 * p_buffer, u32 buffer_size)
|
||||
{
|
||||
u32 bytes_copied = 0;
|
||||
int current_field = -1;
|
||||
|
||||
switch(sav_eav) {
|
||||
switch (sav_eav) {
|
||||
|
||||
case SAV_VBI_FIELD1:
|
||||
current_field = 1;
|
||||
@@ -507,12 +517,14 @@ u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
break;
|
||||
}
|
||||
|
||||
if(current_field < 0 )
|
||||
if (current_field < 0)
|
||||
return bytes_copied;
|
||||
|
||||
dma_q->last_sav = sav_eav;
|
||||
|
||||
bytes_copied = cx231xx_copy_vbi_line(dev, dma_q, p_buffer, buffer_size, current_field);
|
||||
bytes_copied =
|
||||
cx231xx_copy_vbi_line(dev, dma_q, p_buffer, buffer_size,
|
||||
current_field);
|
||||
|
||||
return bytes_copied;
|
||||
}
|
||||
@@ -538,13 +550,13 @@ static inline void vbi_buffer_filled(struct cx231xx *dev,
|
||||
}
|
||||
|
||||
u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_line, u32 length, int field_number)
|
||||
u8 * p_line, u32 length, int field_number)
|
||||
{
|
||||
u32 bytes_to_copy;
|
||||
struct cx231xx_buffer *buf;
|
||||
u32 _line_size = dev->width * 2;
|
||||
|
||||
if( dma_q->current_field != field_number ) {
|
||||
if (dma_q->current_field != field_number) {
|
||||
cx231xx_reset_vbi_buffer(dev, dma_q);
|
||||
}
|
||||
|
||||
@@ -555,12 +567,13 @@ u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
dma_q->current_field = field_number;
|
||||
|
||||
bytes_to_copy = dma_q->bytes_left_in_line;
|
||||
if(bytes_to_copy > length)
|
||||
if (bytes_to_copy > length)
|
||||
bytes_to_copy = length;
|
||||
|
||||
if(dma_q->lines_completed >= dma_q->lines_per_field) {
|
||||
if (dma_q->lines_completed >= dma_q->lines_per_field) {
|
||||
dma_q->bytes_left_in_line -= bytes_to_copy;
|
||||
dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||
dma_q->is_partial_line =
|
||||
(dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -568,9 +581,10 @@ u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
|
||||
/* If we don't have a buffer, just return the number of bytes we would
|
||||
have copied if we had a buffer. */
|
||||
if(!buf) {
|
||||
if (!buf) {
|
||||
dma_q->bytes_left_in_line -= bytes_to_copy;
|
||||
dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||
dma_q->is_partial_line =
|
||||
(dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||
return bytes_to_copy;
|
||||
}
|
||||
|
||||
@@ -580,13 +594,13 @@ u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
dma_q->pos += bytes_to_copy;
|
||||
dma_q->bytes_left_in_line -= bytes_to_copy;
|
||||
|
||||
if(dma_q->bytes_left_in_line == 0) {
|
||||
if (dma_q->bytes_left_in_line == 0) {
|
||||
|
||||
dma_q->bytes_left_in_line = _line_size;
|
||||
dma_q->lines_completed++;
|
||||
dma_q->is_partial_line = 0;
|
||||
|
||||
if(cx231xx_is_vbi_buffer_done(dev, dma_q) && buf ) {
|
||||
if (cx231xx_is_vbi_buffer_done(dev, dma_q) && buf) {
|
||||
|
||||
vbi_buffer_filled(dev, dma_q, buf);
|
||||
|
||||
@@ -605,7 +619,8 @@ u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
|
||||
struct cx231xx_buffer **buf)
|
||||
{
|
||||
struct cx231xx_video_mode *vmode = container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx_video_mode *vmode =
|
||||
container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
||||
char *outp;
|
||||
|
||||
@@ -628,14 +643,14 @@ static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void cx231xx_reset_vbi_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q)
|
||||
void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
|
||||
struct cx231xx_dmaqueue *dma_q)
|
||||
{
|
||||
struct cx231xx_buffer *buf;
|
||||
|
||||
buf = dev->vbi_mode.isoc_ctl.buf;
|
||||
|
||||
if(buf == NULL) {
|
||||
if (buf == NULL) {
|
||||
|
||||
/* first try to get the buffer */
|
||||
get_next_vbi_buf(dma_q, &buf);
|
||||
@@ -649,7 +664,7 @@ void cx231xx_reset_vbi_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma
|
||||
}
|
||||
|
||||
int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_buffer, u32 bytes_to_copy)
|
||||
u8 * p_buffer, u32 bytes_to_copy)
|
||||
{
|
||||
u8 *p_out_buffer = NULL;
|
||||
u32 current_line_bytes_copied = 0;
|
||||
@@ -666,28 +681,32 @@ int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
|
||||
p_out_buffer = videobuf_to_vmalloc(&buf->vb);
|
||||
|
||||
if(dma_q->bytes_left_in_line != _line_size ) {
|
||||
current_line_bytes_copied = _line_size - dma_q->bytes_left_in_line;
|
||||
if (dma_q->bytes_left_in_line != _line_size) {
|
||||
current_line_bytes_copied =
|
||||
_line_size - dma_q->bytes_left_in_line;
|
||||
}
|
||||
|
||||
offset = ( dma_q->lines_completed * _line_size ) + current_line_bytes_copied;
|
||||
offset =
|
||||
(dma_q->lines_completed * _line_size) + current_line_bytes_copied;
|
||||
|
||||
/* prepare destination address */
|
||||
startwrite = p_out_buffer + offset;
|
||||
|
||||
lencopy = dma_q->bytes_left_in_line > bytes_to_copy ? bytes_to_copy : dma_q->bytes_left_in_line;
|
||||
lencopy =
|
||||
dma_q->bytes_left_in_line >
|
||||
bytes_to_copy ? bytes_to_copy : dma_q->bytes_left_in_line;
|
||||
|
||||
memcpy(startwrite, p_buffer, lencopy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,struct cx231xx_dmaqueue *dma_q)
|
||||
u8 cx231xx_is_vbi_buffer_done(struct cx231xx * dev,
|
||||
struct cx231xx_dmaqueue * dma_q)
|
||||
{
|
||||
u32 height = 0;
|
||||
|
||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
||||
return (dma_q->lines_completed == height)?1:0;
|
||||
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||
return (dma_q->lines_completed == height) ? 1 : 0;
|
||||
}
|
||||
|
@@ -24,7 +24,6 @@
|
||||
|
||||
extern struct videobuf_queue_ops cx231xx_vbi_qops;
|
||||
|
||||
|
||||
#define NTSC_VBI_START_LINE 10 /* line 10 - 21 */
|
||||
#define NTSC_VBI_END_LINE 21
|
||||
#define NTSC_VBI_LINES (NTSC_VBI_END_LINE - NTSC_VBI_START_LINE + 1)
|
||||
@@ -42,20 +41,23 @@ extern struct videobuf_queue_ops cx231xx_vbi_qops;
|
||||
/* stream functions */
|
||||
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
int num_bufs, int max_pkt_size,
|
||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb));
|
||||
int (*isoc_copy) (struct cx231xx * dev,
|
||||
struct urb * urb));
|
||||
|
||||
void cx231xx_uninit_vbi_isoc(struct cx231xx *dev);
|
||||
|
||||
/* vbi data copy functions */
|
||||
u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 sav_eav, u8 *p_buffer, u32 buffer_size);
|
||||
u8 sav_eav, u8 * p_buffer, u32 buffer_size);
|
||||
u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_line, u32 length, int field_number);
|
||||
void cx231xx_reset_vbi_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
|
||||
u8 * p_line, u32 length, int field_number);
|
||||
void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
|
||||
struct cx231xx_dmaqueue *dma_q);
|
||||
|
||||
int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_buffer, u32 bytes_to_copy);
|
||||
u8 * p_buffer, u32 bytes_to_copy);
|
||||
|
||||
u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,struct cx231xx_dmaqueue *dma_q);
|
||||
u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,
|
||||
struct cx231xx_dmaqueue *dma_q);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -82,17 +82,14 @@
|
||||
*/
|
||||
#define CX231XX_NUM_PACKETS 40
|
||||
|
||||
|
||||
/* default alternate; 0 means choose the best */
|
||||
#define CX231XX_PINOUT 0
|
||||
|
||||
#define CX231XX_INTERLACED_DEFAULT 1
|
||||
|
||||
|
||||
/* time to wait when stopping the isoc transfer */
|
||||
#define CX231XX_URB_TIMEOUT msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
|
||||
|
||||
|
||||
enum cx231xx_mode {
|
||||
CX231XX_SUSPEND,
|
||||
CX231XX_ANALOG_MODE,
|
||||
@@ -143,12 +140,10 @@ struct cx231xx_usb_isoc_ctl {
|
||||
int nfields;
|
||||
|
||||
/* isoc urb callback */
|
||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb);
|
||||
int (*isoc_copy) (struct cx231xx * dev, struct urb * urb);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct cx231xx_fmt {
|
||||
char *name;
|
||||
u32 fourcc; /* v4l2 format id */
|
||||
@@ -184,7 +179,6 @@ struct cx231xx_dmaqueue {
|
||||
u32 lines_per_field;
|
||||
};
|
||||
|
||||
|
||||
/* inputs */
|
||||
|
||||
#define MAX_CX231XX_INPUT 4
|
||||
@@ -215,7 +209,7 @@ enum cx231xx_v_input {
|
||||
/* cx231xx has two audio inputs: tuner and line in */
|
||||
enum cx231xx_amux {
|
||||
/* This is the only entry for cx231xx tuner input */
|
||||
CX231XX_AMUX_VIDEO, /* cx231xx tuner*/
|
||||
CX231XX_AMUX_VIDEO, /* cx231xx tuner */
|
||||
CX231XX_AMUX_LINE_IN, /* Line In */
|
||||
};
|
||||
|
||||
@@ -239,13 +233,12 @@ enum cx231xx_decoder {
|
||||
CX231XX_AVDECODER
|
||||
};
|
||||
|
||||
typedef enum _I2C_MASTER_PORT
|
||||
{
|
||||
I2C_0 =0,
|
||||
I2C_1 =1,
|
||||
I2C_2 =2,
|
||||
I2C_3 =3
|
||||
}CX231XX_I2C_MASTER_PORT;
|
||||
typedef enum _I2C_MASTER_PORT {
|
||||
I2C_0 = 0,
|
||||
I2C_1 = 1,
|
||||
I2C_2 = 2,
|
||||
I2C_3 = 3
|
||||
} CX231XX_I2C_MASTER_PORT;
|
||||
|
||||
struct cx231xx_board {
|
||||
char *name;
|
||||
@@ -295,8 +288,7 @@ enum cx231xx_dev_state {
|
||||
DEV_MISCONFIGURED = 0x04,
|
||||
};
|
||||
|
||||
enum AFE_MODE
|
||||
{
|
||||
enum AFE_MODE {
|
||||
AFE_MODE_LOW_IF,
|
||||
AFE_MODE_BASEBAND,
|
||||
AFE_MODE_EU_HI_IF,
|
||||
@@ -304,8 +296,7 @@ enum AFE_MODE
|
||||
AFE_MODE_JAPAN_HI_IF
|
||||
};
|
||||
|
||||
enum AUDIO_INPUT
|
||||
{
|
||||
enum AUDIO_INPUT {
|
||||
AUDIO_INPUT_MUTE,
|
||||
AUDIO_INPUT_LINE,
|
||||
AUDIO_INPUT_TUNER_TV,
|
||||
@@ -319,7 +310,6 @@ enum AUDIO_INPUT
|
||||
#define CX231XX_STOP_AUDIO 0
|
||||
#define CX231XX_START_AUDIO 1
|
||||
|
||||
|
||||
/* cx231xx extensions */
|
||||
#define CX231XX_AUDIO 0x10
|
||||
#define CX231XX_DVB 0x20
|
||||
@@ -386,17 +376,16 @@ struct cx231xx_i2c {
|
||||
u8 i2c_reserve;
|
||||
};
|
||||
|
||||
struct cx231xx_i2c_xfer_data{
|
||||
struct cx231xx_i2c_xfer_data {
|
||||
u8 dev_addr;
|
||||
u8 direction; /* 1 - IN, 0 - OUT */
|
||||
u8 saddr_len; /* sub address len */
|
||||
u16 saddr_dat; /* sub addr data */
|
||||
u8 buf_size; /* buffer size */
|
||||
u8* p_buffer; /* pointer to the buffer */
|
||||
u8 *p_buffer; /* pointer to the buffer */
|
||||
};
|
||||
|
||||
typedef struct _VENDOR_REQUEST_IN
|
||||
{
|
||||
typedef struct _VENDOR_REQUEST_IN {
|
||||
u8 bRequest;
|
||||
u16 wValue;
|
||||
u16 wIndex;
|
||||
@@ -414,7 +403,7 @@ struct cx231xx_ctrl {
|
||||
u32 shift;
|
||||
};
|
||||
|
||||
typedef enum{
|
||||
typedef enum {
|
||||
Raw_Video = 0,
|
||||
Audio,
|
||||
Vbi, /* VANC */
|
||||
@@ -422,7 +411,7 @@ typedef enum{
|
||||
TS1_serial_mode,
|
||||
TS2,
|
||||
TS1_parallel_mode
|
||||
}TRANSFER_TYPE;
|
||||
} TRANSFER_TYPE;
|
||||
|
||||
struct cx231xx_video_mode {
|
||||
/* Isoc control struct */
|
||||
@@ -438,7 +427,6 @@ struct cx231xx_video_mode {
|
||||
u16 end_point_addr;
|
||||
};
|
||||
|
||||
|
||||
/* main device struct */
|
||||
struct cx231xx {
|
||||
/* generic device properties */
|
||||
@@ -506,21 +494,23 @@ struct cx231xx {
|
||||
struct cx231xx_video_mode ts1_mode;
|
||||
|
||||
struct usb_device *udev; /* the usb device */
|
||||
char urb_buf[URB_MAX_CTRL_SIZE];/* urb control msg buffer */
|
||||
|
||||
char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */
|
||||
|
||||
/* helper funcs that call usb_control_msg */
|
||||
int (*cx231xx_read_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg,
|
||||
int (*cx231xx_read_ctrl_reg) (struct cx231xx * dev, u8 req, u16 reg,
|
||||
char *buf, int len);
|
||||
int (*cx231xx_write_ctrl_reg)(struct cx231xx *dev, u8 req, u16 reg,
|
||||
int (*cx231xx_write_ctrl_reg) (struct cx231xx * dev, u8 req, u16 reg,
|
||||
char *buf, int len);
|
||||
int (*cx231xx_send_usb_command)(struct cx231xx_i2c *i2c_bus,
|
||||
struct cx231xx_i2c_xfer_data *req_data);
|
||||
int (*cx231xx_gpio_i2c_read)(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
||||
int (*cx231xx_gpio_i2c_write)(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
||||
int (*cx231xx_send_usb_command) (struct cx231xx_i2c * i2c_bus,
|
||||
struct cx231xx_i2c_xfer_data *
|
||||
req_data);
|
||||
int (*cx231xx_gpio_i2c_read) (struct cx231xx * dev, u8 dev_addr,
|
||||
u8 * buf, u8 len);
|
||||
int (*cx231xx_gpio_i2c_write) (struct cx231xx * dev, u8 dev_addr,
|
||||
u8 * buf, u8 len);
|
||||
|
||||
int (*cx231xx_set_analog_freq)(struct cx231xx *dev, u32 freq ) ;
|
||||
int (*cx231xx_reset_analog_tuner)(struct cx231xx *dev) ;
|
||||
int (*cx231xx_set_analog_freq) (struct cx231xx * dev, u32 freq);
|
||||
int (*cx231xx_reset_analog_tuner) (struct cx231xx * dev);
|
||||
|
||||
enum cx231xx_mode mode;
|
||||
|
||||
@@ -555,27 +545,29 @@ struct cx231xx_ops {
|
||||
struct list_head next;
|
||||
char *name;
|
||||
int id;
|
||||
int (*init)(struct cx231xx *);
|
||||
int (*fini)(struct cx231xx *);
|
||||
int (*init) (struct cx231xx *);
|
||||
int (*fini) (struct cx231xx *);
|
||||
};
|
||||
|
||||
/* call back functions in dvb module */
|
||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq ) ;
|
||||
int cx231xx_reset_analog_tuner(struct cx231xx *dev) ;
|
||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq);
|
||||
int cx231xx_reset_analog_tuner(struct cx231xx *dev);
|
||||
|
||||
/* Provided by cx231xx-i2c.c */
|
||||
void cx231xx_i2c_call_clients(struct cx231xx_i2c *bus, unsigned int cmd, void *arg);
|
||||
void cx231xx_i2c_call_clients(struct cx231xx_i2c *bus, unsigned int cmd,
|
||||
void *arg);
|
||||
void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c);
|
||||
int cx231xx_i2c_register(struct cx231xx_i2c *bus);
|
||||
int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
|
||||
|
||||
/* Internal block control functions */
|
||||
int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr,
|
||||
u16 saddr, u8 saddr_len, u32 *data, u8 data_len);
|
||||
u16 saddr, u8 saddr_len, u32 * data, u8 data_len);
|
||||
int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr,
|
||||
u16 saddr, u8 saddr_len, u32 data, u8 data_len);
|
||||
int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size, u16 register_address,
|
||||
u8 bit_start,u8 bit_end, u32 value);
|
||||
int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
|
||||
u16 register_address, u8 bit_start, u8 bit_end,
|
||||
u32 value);
|
||||
int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
|
||||
u16 saddr, u32 mask, u32 value);
|
||||
u32 cx231xx_set_field(u32 field_mask, u32 data);
|
||||
@@ -602,17 +594,20 @@ int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
|
||||
int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
|
||||
|
||||
/* video parser functions */
|
||||
u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, u32 *p_bytes_used);
|
||||
u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf, u32 *p_bytes_used);
|
||||
u8 cx231xx_find_next_SAV_EAV(u8 * p_buffer, u32 buffer_size,
|
||||
u32 * p_bytes_used);
|
||||
u8 cx231xx_find_boundary_SAV_EAV(u8 * p_buffer, u8 * partial_buf,
|
||||
u32 * p_bytes_used);
|
||||
int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_buffer, u32 bytes_to_copy);
|
||||
void cx231xx_reset_video_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
|
||||
u8 cx231xx_is_buffer_done(struct cx231xx *dev,struct cx231xx_dmaqueue *dma_q);
|
||||
u8 * p_buffer, u32 bytes_to_copy);
|
||||
void cx231xx_reset_video_buffer(struct cx231xx *dev,
|
||||
struct cx231xx_dmaqueue *dma_q);
|
||||
u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
|
||||
u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 *p_line, u32 length, int field_number);
|
||||
u8 * p_line, u32 length, int field_number);
|
||||
u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||
u8 sav_eav, u8 *p_buffer, u32 buffer_size);
|
||||
void cx231xx_swab(u16 *from, u16 *to, u16 len);
|
||||
u8 sav_eav, u8 * p_buffer, u32 buffer_size);
|
||||
void cx231xx_swab(u16 * from, u16 * to, u16 len);
|
||||
|
||||
/* Provided by cx231xx-core.c */
|
||||
|
||||
@@ -629,31 +624,33 @@ int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
|
||||
char *buf, int len);
|
||||
int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode);
|
||||
|
||||
int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN *ven_req);
|
||||
int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN * ven_req);
|
||||
int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
|
||||
struct cx231xx_i2c_xfer_data *req_data);
|
||||
|
||||
/* Gpio related functions */
|
||||
int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val,
|
||||
int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val,
|
||||
u8 len, u8 request, u8 direction);
|
||||
int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val);
|
||||
int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val);
|
||||
int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val);
|
||||
int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val);
|
||||
int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value);
|
||||
int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number, int pin_value);
|
||||
int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number,
|
||||
int pin_value);
|
||||
|
||||
int cx231xx_gpio_i2c_start(struct cx231xx *dev);
|
||||
int cx231xx_gpio_i2c_end(struct cx231xx *dev);
|
||||
int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data);
|
||||
int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf);
|
||||
int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 * buf);
|
||||
int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev);
|
||||
int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev);
|
||||
int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev);
|
||||
|
||||
int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
||||
int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
||||
int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len);
|
||||
int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len);
|
||||
|
||||
/* audio related functions */
|
||||
int cx231xx_set_audio_decoder_input(struct cx231xx *dev, enum AUDIO_INPUT audio_input);
|
||||
int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
|
||||
enum AUDIO_INPUT audio_input);
|
||||
|
||||
int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type);
|
||||
int cx231xx_resolution_set(struct cx231xx *dev);
|
||||
@@ -661,7 +658,8 @@ int cx231xx_set_video_alternate(struct cx231xx *dev);
|
||||
int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
|
||||
int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
int num_bufs, int max_pkt_size,
|
||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb));
|
||||
int (*isoc_copy) (struct cx231xx * dev,
|
||||
struct urb * urb));
|
||||
void cx231xx_uninit_isoc(struct cx231xx *dev);
|
||||
int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
|
||||
int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
|
||||
@@ -695,7 +693,8 @@ int cx231xx_power_suspend(struct cx231xx *dev);
|
||||
|
||||
/* chip specific control functions */
|
||||
int cx231xx_init_ctrl_pin_status(struct cx231xx *dev);
|
||||
int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev, u8 analog_or_digital);
|
||||
int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
|
||||
u8 analog_or_digital);
|
||||
int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex);
|
||||
|
||||
/* video audio decoder related functions */
|
||||
@@ -743,7 +742,6 @@ int cx231xx_ir_fini(struct cx231xx *dev);
|
||||
printk(KERN_WARNING "%s: "fmt,\
|
||||
dev->name , ##arg); } while (0)
|
||||
|
||||
|
||||
static inline unsigned int norm_maxw(struct cx231xx *dev)
|
||||
{
|
||||
if (dev->board.max_range_640_480)
|
||||
|
Reference in New Issue
Block a user