V4L/DVB (10955): cx231xx: CodingStyle automatic fixes with Lindent
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
e0d3bafd02
commit
84b5dbf39e
|
@ -58,21 +58,20 @@ static int cx231xx_isoc_audio_deinit(struct cx231xx *dev)
|
||||||
|
|
||||||
dprintk("Stopping isoc\n");
|
dprintk("Stopping isoc\n");
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
|
for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
|
||||||
if(dev->adev.urb[i]) {
|
if (dev->adev.urb[i]) {
|
||||||
if (!irqs_disabled())
|
if (!irqs_disabled())
|
||||||
usb_kill_urb(dev->adev.urb[i]);
|
usb_kill_urb(dev->adev.urb[i]);
|
||||||
else
|
else
|
||||||
usb_unlink_urb(dev->adev.urb[i]);
|
usb_unlink_urb(dev->adev.urb[i]);
|
||||||
|
|
||||||
usb_free_urb(dev->adev.urb[i]);
|
usb_free_urb(dev->adev.urb[i]);
|
||||||
dev->adev.urb[i] = NULL;
|
dev->adev.urb[i] = NULL;
|
||||||
|
|
||||||
kfree(dev->adev.transfer_buffer[i]);
|
kfree(dev->adev.transfer_buffer[i]);
|
||||||
dev->adev.transfer_buffer[i] = NULL;
|
dev->adev.transfer_buffer[i] = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -80,27 +79,27 @@ static int cx231xx_isoc_audio_deinit(struct cx231xx *dev)
|
||||||
|
|
||||||
static void cx231xx_audio_isocirq(struct urb *urb)
|
static void cx231xx_audio_isocirq(struct urb *urb)
|
||||||
{
|
{
|
||||||
struct cx231xx *dev = urb->context;
|
struct cx231xx *dev = urb->context;
|
||||||
int i;
|
int i;
|
||||||
unsigned int oldptr;
|
unsigned int oldptr;
|
||||||
int period_elapsed = 0;
|
int period_elapsed = 0;
|
||||||
int status;
|
int status;
|
||||||
unsigned char *cp;
|
unsigned char *cp;
|
||||||
unsigned int stride;
|
unsigned int stride;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
struct snd_pcm_runtime *runtime;
|
struct snd_pcm_runtime *runtime;
|
||||||
|
|
||||||
switch (urb->status) {
|
switch (urb->status) {
|
||||||
case 0: /* success */
|
case 0: /* success */
|
||||||
case -ETIMEDOUT: /* NAK */
|
case -ETIMEDOUT: /* NAK */
|
||||||
break;
|
break;
|
||||||
case -ECONNRESET: /* kill */
|
case -ECONNRESET: /* kill */
|
||||||
case -ENOENT:
|
case -ENOENT:
|
||||||
case -ESHUTDOWN:
|
case -ESHUTDOWN:
|
||||||
return;
|
return;
|
||||||
default: /* error */
|
default: /* error */
|
||||||
dprintk("urb completition error %d.\n", urb->status);
|
dprintk("urb completition error %d.\n", urb->status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->adev.capture_pcm_substream) {
|
if (dev->adev.capture_pcm_substream) {
|
||||||
|
@ -145,7 +144,6 @@ static void cx231xx_audio_isocirq(struct urb *urb)
|
||||||
runtime->period_size;
|
runtime->period_size;
|
||||||
period_elapsed = 1;
|
period_elapsed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_pcm_stream_unlock(substream);
|
snd_pcm_stream_unlock(substream);
|
||||||
}
|
}
|
||||||
if (period_elapsed)
|
if (period_elapsed)
|
||||||
|
@ -156,19 +154,19 @@ static void cx231xx_audio_isocirq(struct urb *urb)
|
||||||
status = usb_submit_urb(urb, GFP_ATOMIC);
|
status = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
cx231xx_errdev("resubmit of audio urb failed (error=%i)\n",
|
cx231xx_errdev("resubmit of audio urb failed (error=%i)\n",
|
||||||
status);
|
status);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
int i, errCode;
|
int i, errCode;
|
||||||
int sb_size;
|
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;
|
sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
|
||||||
|
|
||||||
for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
|
for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
|
@ -191,7 +189,8 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||||
|
|
||||||
urb->dev = dev->udev;
|
urb->dev = dev->udev;
|
||||||
urb->context = dev;
|
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_flags = URB_ISO_ASAP;
|
||||||
urb->transfer_buffer = dev->adev.transfer_buffer[i];
|
urb->transfer_buffer = dev->adev.transfer_buffer[i];
|
||||||
urb->interval = 1;
|
urb->interval = 1;
|
||||||
|
@ -200,10 +199,9 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||||
urb->transfer_buffer_length = sb_size;
|
urb->transfer_buffer_length = sb_size;
|
||||||
|
|
||||||
for (j = k = 0; j < CX231XX_NUM_AUDIO_PACKETS;
|
for (j = k = 0; j < CX231XX_NUM_AUDIO_PACKETS;
|
||||||
j++, k += dev->adev.max_pkt_size) {
|
j++, k += dev->adev.max_pkt_size) {
|
||||||
urb->iso_frame_desc[j].offset = k;
|
urb->iso_frame_desc[j].offset = k;
|
||||||
urb->iso_frame_desc[j].length =
|
urb->iso_frame_desc[j].length = dev->adev.max_pkt_size;
|
||||||
dev->adev.max_pkt_size;
|
|
||||||
}
|
}
|
||||||
dev->adev.urb[i] = urb;
|
dev->adev.urb[i] = urb;
|
||||||
}
|
}
|
||||||
|
@ -221,11 +219,11 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||||
|
|
||||||
static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
|
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");
|
"stop" : "start");
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case CX231XX_CAPTURE_STREAM_EN:
|
case CX231XX_CAPTURE_STREAM_EN:
|
||||||
if (dev->adev.capture_stream == STREAM_OFF && arg == 1) {
|
if (dev->adev.capture_stream == STREAM_OFF && arg == 1) {
|
||||||
dev->adev.capture_stream = STREAM_ON;
|
dev->adev.capture_stream = STREAM_ON;
|
||||||
cx231xx_init_audio_isoc(dev);
|
cx231xx_init_audio_isoc(dev);
|
||||||
|
@ -233,8 +231,8 @@ static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
|
||||||
dev->adev.capture_stream = STREAM_OFF;
|
dev->adev.capture_stream = STREAM_OFF;
|
||||||
cx231xx_isoc_audio_deinit(dev);
|
cx231xx_isoc_audio_deinit(dev);
|
||||||
} else {
|
} else {
|
||||||
cx231xx_errdev( "An underrun very likely occurred. "
|
cx231xx_errdev("An underrun very likely occurred. "
|
||||||
"Ignoring it.\n");
|
"Ignoring it.\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
|
@ -265,9 +263,8 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs,
|
||||||
|
|
||||||
static struct snd_pcm_hardware snd_cx231xx_hw_capture = {
|
static struct snd_pcm_hardware snd_cx231xx_hw_capture = {
|
||||||
.info = SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
.info = SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||||
SNDRV_PCM_INFO_MMAP |
|
SNDRV_PCM_INFO_MMAP |
|
||||||
SNDRV_PCM_INFO_INTERLEAVED |
|
SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID,
|
||||||
SNDRV_PCM_INFO_MMAP_VALID,
|
|
||||||
|
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||||
|
|
||||||
|
@ -278,10 +275,10 @@ static struct snd_pcm_hardware snd_cx231xx_hw_capture = {
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.buffer_bytes_max = 62720 * 8, /* just about the value in usbaudio.c */
|
.buffer_bytes_max = 62720 * 8, /* just about the value in usbaudio.c */
|
||||||
.period_bytes_min = 64, /* 12544/2, */
|
.period_bytes_min = 64, /* 12544/2, */
|
||||||
.period_bytes_max = 12544,
|
.period_bytes_max = 12544,
|
||||||
.periods_min = 2,
|
.periods_min = 2,
|
||||||
.periods_max = 98, /* 12544, */
|
.periods_max = 98, /* 12544, */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
|
static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
|
||||||
|
@ -294,29 +291,29 @@ static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
|
||||||
|
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
cx231xx_errdev("BUG: cx231xx can't find device struct."
|
cx231xx_errdev("BUG: cx231xx can't find device struct."
|
||||||
" Can't proceed with open\n");
|
" Can't proceed with open\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets volume, mute, etc */
|
/* Sets volume, mute, etc */
|
||||||
dev->mute = 0;
|
dev->mute = 0;
|
||||||
|
|
||||||
/* set alternate setting for audio interface */
|
/* set alternate setting for audio interface */
|
||||||
ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 1); /* 1 - 48000 samples per sec */
|
ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 1); /* 1 - 48000 samples per sec */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
cx231xx_errdev("failed to set alternate setting !\n");
|
cx231xx_errdev("failed to set alternate setting !\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* inform hardware to start streaming */
|
/* inform hardware to start streaming */
|
||||||
ret = cx231xx_capture_start(dev, 1, Audio);
|
ret = cx231xx_capture_start(dev, 1, Audio);
|
||||||
|
|
||||||
runtime->hw = snd_cx231xx_hw_capture;
|
runtime->hw = snd_cx231xx_hw_capture;
|
||||||
|
|
||||||
mutex_lock(&dev->lock);
|
mutex_lock(&dev->lock);
|
||||||
dev->adev.users++;
|
dev->adev.users++;
|
||||||
mutex_unlock(&dev->lock);
|
mutex_unlock(&dev->lock);
|
||||||
|
|
||||||
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
||||||
dev->adev.capture_pcm_substream = substream;
|
dev->adev.capture_pcm_substream = substream;
|
||||||
|
@ -327,26 +324,25 @@ static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
|
||||||
|
|
||||||
static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
|
static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
||||||
|
|
||||||
|
|
||||||
dprintk("closing device\n");
|
dprintk("closing device\n");
|
||||||
|
|
||||||
/* set alternate setting for audio interface */
|
/* set alternate setting for audio interface */
|
||||||
ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 0); /* 1 - 48000 samples per sec */
|
ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 0); /* 1 - 48000 samples per sec */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
cx231xx_errdev("failed to set alternate setting !\n");
|
cx231xx_errdev("failed to set alternate setting !\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* inform hardware to start streaming */
|
/* inform hardware to start streaming */
|
||||||
ret = cx231xx_capture_start(dev, 0, Audio);
|
ret = cx231xx_capture_start(dev, 0, Audio);
|
||||||
|
|
||||||
dev->mute = 1;
|
dev->mute = 1;
|
||||||
mutex_lock(&dev->lock);
|
mutex_lock(&dev->lock);
|
||||||
dev->adev.users--;
|
dev->adev.users--;
|
||||||
mutex_unlock(&dev->lock);
|
mutex_unlock(&dev->lock);
|
||||||
|
|
||||||
if (dev->adev.users == 0 && dev->adev.shutdown == 1) {
|
if (dev->adev.users == 0 && dev->adev.shutdown == 1) {
|
||||||
|
@ -360,7 +356,7 @@ static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_cx231xx_hw_capture_params(struct snd_pcm_substream *substream,
|
static int snd_cx231xx_hw_capture_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *hw_params)
|
struct snd_pcm_hw_params *hw_params)
|
||||||
{
|
{
|
||||||
unsigned int channels, rate, format;
|
unsigned int channels, rate, format;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -368,7 +364,7 @@ static int snd_cx231xx_hw_capture_params(struct snd_pcm_substream *substream,
|
||||||
dprintk("Setting capture parameters\n");
|
dprintk("Setting capture parameters\n");
|
||||||
|
|
||||||
ret = snd_pcm_alloc_vmalloc_buffer(substream,
|
ret = snd_pcm_alloc_vmalloc_buffer(substream,
|
||||||
params_buffer_bytes(hw_params));
|
params_buffer_bytes(hw_params));
|
||||||
format = params_format(hw_params);
|
format = params_format(hw_params);
|
||||||
rate = params_rate(hw_params);
|
rate = params_rate(hw_params);
|
||||||
channels = params_channels(hw_params);
|
channels = params_channels(hw_params);
|
||||||
|
@ -397,45 +393,45 @@ static int snd_cx231xx_prepare(struct snd_pcm_substream *substream)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_cx231xx_capture_trigger(struct snd_pcm_substream *substream,
|
static int snd_cx231xx_capture_trigger(struct snd_pcm_substream *substream,
|
||||||
int cmd)
|
int cmd)
|
||||||
{
|
{
|
||||||
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
struct cx231xx *dev = snd_pcm_substream_chip(substream);
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
dprintk("Should %s capture\n", (cmd == SNDRV_PCM_TRIGGER_START) ?
|
||||||
|
"start" : "stop");
|
||||||
|
|
||||||
dprintk("Should %s capture\n", (cmd == SNDRV_PCM_TRIGGER_START)?
|
spin_lock(&dev->adev.slock);
|
||||||
"start": "stop");
|
|
||||||
|
|
||||||
spin_lock(&dev->adev.slock);
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
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;
|
retval = 0;
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, CX231XX_STOP_AUDIO);
|
cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, CX231XX_STOP_AUDIO);
|
||||||
retval = 0;
|
retval = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&dev->adev.slock);
|
spin_unlock(&dev->adev.slock);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static snd_pcm_uframes_t snd_cx231xx_capture_pointer(struct snd_pcm_substream
|
static snd_pcm_uframes_t snd_cx231xx_capture_pointer(struct snd_pcm_substream
|
||||||
*substream)
|
*substream)
|
||||||
{
|
{
|
||||||
struct cx231xx *dev;
|
struct cx231xx *dev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
snd_pcm_uframes_t hwptr_done;
|
snd_pcm_uframes_t hwptr_done;
|
||||||
|
|
||||||
dev = snd_pcm_substream_chip(substream);
|
dev = snd_pcm_substream_chip(substream);
|
||||||
|
|
||||||
spin_lock_irqsave(&dev->adev.slock, flags);
|
spin_lock_irqsave(&dev->adev.slock, flags);
|
||||||
hwptr_done = dev->adev.hwptr_done_capture;
|
hwptr_done = dev->adev.hwptr_done_capture;
|
||||||
spin_unlock_irqrestore(&dev->adev.slock, flags);
|
spin_unlock_irqrestore(&dev->adev.slock, flags);
|
||||||
|
|
||||||
return hwptr_done;
|
return hwptr_done;
|
||||||
}
|
}
|
||||||
|
@ -449,26 +445,26 @@ static struct page *snd_pcm_get_vmalloc_page(struct snd_pcm_substream *subs,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct snd_pcm_ops snd_cx231xx_pcm_capture = {
|
static struct snd_pcm_ops snd_cx231xx_pcm_capture = {
|
||||||
.open = snd_cx231xx_capture_open,
|
.open = snd_cx231xx_capture_open,
|
||||||
.close = snd_cx231xx_pcm_close,
|
.close = snd_cx231xx_pcm_close,
|
||||||
.ioctl = snd_pcm_lib_ioctl,
|
.ioctl = snd_pcm_lib_ioctl,
|
||||||
.hw_params = snd_cx231xx_hw_capture_params,
|
.hw_params = snd_cx231xx_hw_capture_params,
|
||||||
.hw_free = snd_cx231xx_hw_capture_free,
|
.hw_free = snd_cx231xx_hw_capture_free,
|
||||||
.prepare = snd_cx231xx_prepare,
|
.prepare = snd_cx231xx_prepare,
|
||||||
.trigger = snd_cx231xx_capture_trigger,
|
.trigger = snd_cx231xx_capture_trigger,
|
||||||
.pointer = snd_cx231xx_capture_pointer,
|
.pointer = snd_cx231xx_capture_pointer,
|
||||||
.page = snd_pcm_get_vmalloc_page,
|
.page = snd_pcm_get_vmalloc_page,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int cx231xx_audio_init(struct cx231xx *dev)
|
static int cx231xx_audio_init(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
struct cx231xx_audio *adev = &dev->adev;
|
struct cx231xx_audio *adev = &dev->adev;
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
static int devnr;
|
static int devnr;
|
||||||
int err;
|
int err;
|
||||||
struct usb_interface *uif;
|
struct usb_interface *uif;
|
||||||
int i, isoc_pipe = 0;
|
int i, isoc_pipe = 0;
|
||||||
|
|
||||||
if (dev->has_alsa_audio != 1) {
|
if (dev->has_alsa_audio != 1) {
|
||||||
/* This device does not support the extension (in this case
|
/* This device does not support the extension (in this case
|
||||||
|
@ -478,7 +474,7 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
cx231xx_info("cx231xx-audio.c: probing for cx231xx "
|
cx231xx_info("cx231xx-audio.c: probing for cx231xx "
|
||||||
"non standard usbaudio\n");
|
"non standard usbaudio\n");
|
||||||
|
|
||||||
card = snd_card_new(index[devnr], "Cx231xx Audio", THIS_MODULE, 0);
|
card = snd_card_new(index[devnr], "Cx231xx Audio", THIS_MODULE, 0);
|
||||||
if (card == NULL) {
|
if (card == NULL) {
|
||||||
|
@ -492,7 +488,8 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||||
return err;
|
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->info_flags = 0;
|
||||||
pcm->private_data = dev;
|
pcm->private_data = dev;
|
||||||
strcpy(pcm->name, "Conexant cx231xx Capture");
|
strcpy(pcm->name, "Conexant cx231xx Capture");
|
||||||
|
@ -508,29 +505,35 @@ static int cx231xx_audio_init(struct cx231xx *dev)
|
||||||
adev->sndcard = card;
|
adev->sndcard = card;
|
||||||
adev->udev = dev->udev;
|
adev->udev = dev->udev;
|
||||||
|
|
||||||
/* compute alternate max packet sizes for Audio */
|
/* 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;
|
adev->num_alt = uif->num_altsetting;
|
||||||
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n", adev->end_point_addr,
|
cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
|
||||||
adev->num_alt);
|
adev->end_point_addr, adev->num_alt);
|
||||||
adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL);
|
adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL);
|
||||||
|
|
||||||
if (adev->alt_max_pkt_size == NULL) {
|
if (adev->alt_max_pkt_size == NULL) {
|
||||||
cx231xx_errdev("out of memory!\n");
|
cx231xx_errdev("out of memory!\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < adev->num_alt ; i++) {
|
for (i = 0; i < adev->num_alt; i++) {
|
||||||
u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
u16 tmp =
|
||||||
wMaxPacketSize);
|
le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
|
||||||
adev->alt_max_pkt_size[i] =
|
wMaxPacketSize);
|
||||||
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
adev->alt_max_pkt_size[i] =
|
||||||
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
(tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
|
||||||
adev->alt_max_pkt_size[i]);
|
cx231xx_info("Alternate setting %i, max size= %i\n", i,
|
||||||
}
|
adev->alt_max_pkt_size[i]);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -549,7 +552,7 @@ static int cx231xx_audio_fini(struct cx231xx *dev)
|
||||||
|
|
||||||
if (dev->adev.sndcard) {
|
if (dev->adev.sndcard) {
|
||||||
snd_card_free(dev->adev.sndcard);
|
snd_card_free(dev->adev.sndcard);
|
||||||
kfree(dev->adev.alt_max_pkt_size);
|
kfree(dev->adev.alt_max_pkt_size);
|
||||||
dev->adev.sndcard = NULL;
|
dev->adev.sndcard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,7 +560,7 @@ static int cx231xx_audio_fini(struct cx231xx *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cx231xx_ops audio_ops = {
|
static struct cx231xx_ops audio_ops = {
|
||||||
.id = CX231XX_AUDIO,
|
.id = CX231XX_AUDIO,
|
||||||
.name = "Cx231xx Audio Extension",
|
.name = "Cx231xx Audio Extension",
|
||||||
.init = cx231xx_audio_init,
|
.init = cx231xx_audio_init,
|
||||||
.fini = cx231xx_audio_fini,
|
.fini = cx231xx_audio_fini,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
cx231xx_conf-reg.h - driver for Conexant Cx23100/101/102 USB
|
cx231xx_conf-reg.h - driver for Conexant Cx23100/101/102 USB
|
||||||
video capture devices
|
video capture devices
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _POLARIS_REG_H_
|
#ifndef _POLARIS_REG_H_
|
||||||
#define _POLARIS_REG_H_
|
#define _POLARIS_REG_H_
|
||||||
|
|
||||||
|
@ -43,30 +42,30 @@
|
||||||
#define PWR_CTL_EN 0x74
|
#define PWR_CTL_EN 0x74
|
||||||
|
|
||||||
/* Polaris Endpoints capture mask for register EP_MODE_SET */
|
/* Polaris Endpoints capture mask for register EP_MODE_SET */
|
||||||
#define ENABLE_EP1 0x01 /* Bit[0]=1 */
|
#define ENABLE_EP1 0x01 /* Bit[0]=1 */
|
||||||
#define ENABLE_EP2 0x02 /* Bit[1]=1 */
|
#define ENABLE_EP2 0x02 /* Bit[1]=1 */
|
||||||
#define ENABLE_EP3 0x04 /* Bit[2]=1 */
|
#define ENABLE_EP3 0x04 /* Bit[2]=1 */
|
||||||
#define ENABLE_EP4 0x08 /* Bit[3]=1 */
|
#define ENABLE_EP4 0x08 /* Bit[3]=1 */
|
||||||
#define ENABLE_EP5 0x10 /* Bit[4]=1 */
|
#define ENABLE_EP5 0x10 /* Bit[4]=1 */
|
||||||
#define ENABLE_EP6 0x20 /* Bit[5]=1 */
|
#define ENABLE_EP6 0x20 /* Bit[5]=1 */
|
||||||
|
|
||||||
/* Bit definition for register PWR_CTL_EN */
|
/* Bit definition for register PWR_CTL_EN */
|
||||||
#define PWR_MODE_MASK 0x17f
|
#define PWR_MODE_MASK 0x17f
|
||||||
#define PWR_AV_EN 0x08 /* bit3 */
|
#define PWR_AV_EN 0x08 /* bit3 */
|
||||||
#define PWR_ISO_EN 0x40 /* bit6 */
|
#define PWR_ISO_EN 0x40 /* bit6 */
|
||||||
#define PWR_AV_MODE 0x30 /* bit4,5 */
|
#define PWR_AV_MODE 0x30 /* bit4,5 */
|
||||||
#define PWR_TUNER_EN 0x04 /* bit2 */
|
#define PWR_TUNER_EN 0x04 /* bit2 */
|
||||||
#define PWR_DEMOD_EN 0x02 /* bit1 */
|
#define PWR_DEMOD_EN 0x02 /* bit1 */
|
||||||
#define I2C_DEMOD_EN 0x01 /* bit0 */
|
#define I2C_DEMOD_EN 0x01 /* bit0 */
|
||||||
#define PWR_RESETOUT_EN 0x100 /* bit8 */
|
#define PWR_RESETOUT_EN 0x100 /* bit8 */
|
||||||
|
|
||||||
typedef enum{
|
typedef enum {
|
||||||
POLARIS_AVMODE_DEFAULT = 0,
|
POLARIS_AVMODE_DEFAULT = 0,
|
||||||
POLARIS_AVMODE_DIGITAL = 0x10,
|
POLARIS_AVMODE_DIGITAL = 0x10,
|
||||||
POLARIS_AVMODE_ANALOGT_TV = 0x20,
|
POLARIS_AVMODE_ANALOGT_TV = 0x20,
|
||||||
POLARIS_AVMODE_ENXTERNAL_AV = 0x30,
|
POLARIS_AVMODE_ENXTERNAL_AV = 0x30,
|
||||||
|
|
||||||
}AV_MODE;
|
} AV_MODE;
|
||||||
|
|
||||||
/* Colibri Registers */
|
/* Colibri Registers */
|
||||||
|
|
||||||
|
@ -75,8 +74,6 @@ typedef enum{
|
||||||
#define EU_IF 0x9
|
#define EU_IF 0x9
|
||||||
#define US_IF 0xa
|
#define US_IF 0xa
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define SUP_BLK_TUNE1 0x00
|
#define SUP_BLK_TUNE1 0x00
|
||||||
#define SUP_BLK_TUNE2 0x01
|
#define SUP_BLK_TUNE2 0x01
|
||||||
#define SUP_BLK_TUNE3 0x02
|
#define SUP_BLK_TUNE3 0x02
|
||||||
|
@ -129,7 +126,7 @@ typedef enum{
|
||||||
#define ADC_INPUT_CH1 0x28
|
#define ADC_INPUT_CH1 0x28
|
||||||
#define ADC_INPUT_CH2 0x48
|
#define ADC_INPUT_CH2 0x48
|
||||||
#define ADC_INPUT_CH3 0x68
|
#define ADC_INPUT_CH3 0x68
|
||||||
#define INPUT_SEL_MASK 0x30 /* [5:4] in_sel */
|
#define INPUT_SEL_MASK 0x30 /* [5:4] in_sel */
|
||||||
|
|
||||||
#define ADC_NTF_PRECLMP_EN_CH1 0x29
|
#define ADC_NTF_PRECLMP_EN_CH1 0x29
|
||||||
#define ADC_NTF_PRECLMP_EN_CH2 0x49
|
#define ADC_NTF_PRECLMP_EN_CH2 0x49
|
||||||
|
@ -148,12 +145,12 @@ typedef enum{
|
||||||
#define TESTBUS_CTRL_CH3 0x72
|
#define TESTBUS_CTRL_CH3 0x72
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* DIF registers *
|
* DIF registers *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#define DIRECT_IF_REVB_BASE 0x00300
|
#define DIRECT_IF_REVB_BASE 0x00300
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_FREQ_WORD (DIRECT_IF_REVB_BASE + 0x00000000) /* Reg Size 32 */
|
#define DIF_PLL_FREQ_WORD (DIRECT_IF_REVB_BASE + 0x00000000) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_PLL_LOCK 0x80000000
|
#define FLD_DIF_PLL_LOCK 0x80000000
|
||||||
/* Reserved [30:29] */
|
/* Reserved [30:29] */
|
||||||
|
@ -161,7 +158,7 @@ typedef enum{
|
||||||
#define FLD_DIF_PLL_FREQ 0x0FFFFFFF
|
#define FLD_DIF_PLL_FREQ 0x0FFFFFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_CTRL (DIRECT_IF_REVB_BASE + 0x00000004) /* Reg Size 32 */
|
#define DIF_PLL_CTRL (DIRECT_IF_REVB_BASE + 0x00000004) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_KD_PD 0xFF000000
|
#define FLD_DIF_KD_PD 0xFF000000
|
||||||
/* Reserved [23:20] */
|
/* Reserved [23:20] */
|
||||||
|
@ -171,7 +168,7 @@ typedef enum{
|
||||||
#define FLD_DIF_KIS_PD 0x0000000F
|
#define FLD_DIF_KIS_PD 0x0000000F
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_CTRL1 (DIRECT_IF_REVB_BASE + 0x00000008) /* Reg Size 32 */
|
#define DIF_PLL_CTRL1 (DIRECT_IF_REVB_BASE + 0x00000008) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_KD_FD 0xFF000000
|
#define FLD_DIF_KD_FD 0xFF000000
|
||||||
/* Reserved [23:20] */
|
/* Reserved [23:20] */
|
||||||
|
@ -181,7 +178,7 @@ typedef enum{
|
||||||
#define FLD_DIF_KIS_FD 0x0000000F
|
#define FLD_DIF_KIS_FD 0x0000000F
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_CTRL2 (DIRECT_IF_REVB_BASE + 0x0000000C) /* Reg Size 32 */
|
#define DIF_PLL_CTRL2 (DIRECT_IF_REVB_BASE + 0x0000000C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_PLL_AGC_REF 0xFFF00000
|
#define FLD_DIF_PLL_AGC_REF 0xFFF00000
|
||||||
#define FLD_DIF_PLL_AGC_KI 0x000F0000
|
#define FLD_DIF_PLL_AGC_KI 0x000F0000
|
||||||
|
@ -191,7 +188,7 @@ typedef enum{
|
||||||
#define FLD_DIF_DOWNSMPL_FD 0x000000FF
|
#define FLD_DIF_DOWNSMPL_FD 0x000000FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_CTRL3 (DIRECT_IF_REVB_BASE + 0x00000010) /* Reg Size 32 */
|
#define DIF_PLL_CTRL3 (DIRECT_IF_REVB_BASE + 0x00000010) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:16] */
|
/* Reserved [31:16] */
|
||||||
#define FLD_DIF_PLL_AGC_EN 0x00008000
|
#define FLD_DIF_PLL_AGC_EN 0x00008000
|
||||||
|
@ -199,7 +196,7 @@ typedef enum{
|
||||||
#define FLD_DIF_PLL_MAN_GAIN 0x00000FFF
|
#define FLD_DIF_PLL_MAN_GAIN 0x00000FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_IF_REF (DIRECT_IF_REVB_BASE + 0x00000014) /* Reg Size 32 */
|
#define DIF_AGC_IF_REF (DIRECT_IF_REVB_BASE + 0x00000014) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_K_AGC_RF 0xF0000000
|
#define FLD_DIF_K_AGC_RF 0xF0000000
|
||||||
#define FLD_DIF_K_AGC_IF 0x0F000000
|
#define FLD_DIF_K_AGC_IF 0x0F000000
|
||||||
|
@ -208,40 +205,40 @@ typedef enum{
|
||||||
#define FLD_DIF_IF_REF 0x00000FFF
|
#define FLD_DIF_IF_REF 0x00000FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_CTRL_IF (DIRECT_IF_REVB_BASE + 0x00000018) /* Reg Size 32 */
|
#define DIF_AGC_CTRL_IF (DIRECT_IF_REVB_BASE + 0x00000018) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_IF_MAX 0xFF000000
|
#define FLD_DIF_IF_MAX 0xFF000000
|
||||||
#define FLD_DIF_IF_MIN 0x00FF0000
|
#define FLD_DIF_IF_MIN 0x00FF0000
|
||||||
#define FLD_DIF_IF_AGC 0x0000FFFF
|
#define FLD_DIF_IF_AGC 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_CTRL_INT (DIRECT_IF_REVB_BASE + 0x0000001C) /* Reg Size 32 */
|
#define DIF_AGC_CTRL_INT (DIRECT_IF_REVB_BASE + 0x0000001C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_INT_MAX 0xFF000000
|
#define FLD_DIF_INT_MAX 0xFF000000
|
||||||
#define FLD_DIF_INT_MIN 0x00FF0000
|
#define FLD_DIF_INT_MIN 0x00FF0000
|
||||||
#define FLD_DIF_INT_AGC 0x0000FFFF
|
#define FLD_DIF_INT_AGC 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_CTRL_RF (DIRECT_IF_REVB_BASE + 0x00000020) /* Reg Size 32 */
|
#define DIF_AGC_CTRL_RF (DIRECT_IF_REVB_BASE + 0x00000020) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_RF_MAX 0xFF000000
|
#define FLD_DIF_RF_MAX 0xFF000000
|
||||||
#define FLD_DIF_RF_MIN 0x00FF0000
|
#define FLD_DIF_RF_MIN 0x00FF0000
|
||||||
#define FLD_DIF_RF_AGC 0x0000FFFF
|
#define FLD_DIF_RF_AGC 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_IF_INT_CURRENT (DIRECT_IF_REVB_BASE + 0x00000024) /* Reg Size 32 */
|
#define DIF_AGC_IF_INT_CURRENT (DIRECT_IF_REVB_BASE + 0x00000024) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_IF_AGC_IN 0xFFFF0000
|
#define FLD_DIF_IF_AGC_IN 0xFFFF0000
|
||||||
#define FLD_DIF_INT_AGC_IN 0x0000FFFF
|
#define FLD_DIF_INT_AGC_IN 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AGC_RF_CURRENT (DIRECT_IF_REVB_BASE + 0x00000028) /* Reg Size 32 */
|
#define DIF_AGC_RF_CURRENT (DIRECT_IF_REVB_BASE + 0x00000028) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:16] */
|
/* Reserved [31:16] */
|
||||||
#define FLD_DIF_RF_AGC_IN 0x0000FFFF
|
#define FLD_DIF_RF_AGC_IN 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_VIDEO_AGC_CTRL (DIRECT_IF_REVB_BASE + 0x0000002C) /* Reg Size 32 */
|
#define DIF_VIDEO_AGC_CTRL (DIRECT_IF_REVB_BASE + 0x0000002C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_AFD 0xC0000000
|
#define FLD_DIF_AFD 0xC0000000
|
||||||
#define FLD_DIF_K_VID_AGC 0x30000000
|
#define FLD_DIF_K_VID_AGC 0x30000000
|
||||||
|
@ -249,7 +246,7 @@ typedef enum{
|
||||||
#define FLD_DIF_AGC_GAIN 0x0000FFFF
|
#define FLD_DIF_AGC_GAIN 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_VID_AUD_OVERRIDE (DIRECT_IF_REVB_BASE + 0x00000030) /* Reg Size 32 */
|
#define DIF_VID_AUD_OVERRIDE (DIRECT_IF_REVB_BASE + 0x00000030) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_AUDIO_AGC_OVERRIDE 0x80000000
|
#define FLD_DIF_AUDIO_AGC_OVERRIDE 0x80000000
|
||||||
/* Reserved [30:30] */
|
/* Reserved [30:30] */
|
||||||
|
@ -259,14 +256,14 @@ typedef enum{
|
||||||
#define FLD_DIF_VID_MAN_GAIN 0x0000FFFF
|
#define FLD_DIF_VID_MAN_GAIN 0x0000FFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_AV_SEP_CTRL (DIRECT_IF_REVB_BASE + 0x00000034) /* Reg Size 32 */
|
#define DIF_AV_SEP_CTRL (DIRECT_IF_REVB_BASE + 0x00000034) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_LPF_FREQ 0xC0000000
|
#define FLD_DIF_LPF_FREQ 0xC0000000
|
||||||
#define FLD_DIF_AV_PHASE_INC 0x3F000000
|
#define FLD_DIF_AV_PHASE_INC 0x3F000000
|
||||||
#define FLD_DIF_AUDIO_FREQ 0x00FFFFFF
|
#define FLD_DIF_AUDIO_FREQ 0x00FFFFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_COMP_FLT_CTRL (DIRECT_IF_REVB_BASE + 0x00000038) /* Reg Size 32 */
|
#define DIF_COMP_FLT_CTRL (DIRECT_IF_REVB_BASE + 0x00000038) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:24] */
|
/* Reserved [31:24] */
|
||||||
#define FLD_DIF_IIR23_R2 0x00FF0000
|
#define FLD_DIF_IIR23_R2 0x00FF0000
|
||||||
|
@ -274,7 +271,7 @@ typedef enum{
|
||||||
#define FLD_DIF_IIR1_R1 0x000000FF
|
#define FLD_DIF_IIR1_R1 0x000000FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_MISC_CTRL (DIRECT_IF_REVB_BASE + 0x0000003C) /* Reg Size 32 */
|
#define DIF_MISC_CTRL (DIRECT_IF_REVB_BASE + 0x0000003C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FLD_DIF_DIF_BYPASS 0x80000000
|
#define FLD_DIF_DIF_BYPASS 0x80000000
|
||||||
#define FLD_DIF_FM_NYQ_GAIN 0x40000000
|
#define FLD_DIF_FM_NYQ_GAIN 0x40000000
|
||||||
|
@ -299,20 +296,20 @@ typedef enum{
|
||||||
#define FLD_DIF_RF_IF_LOCK 0x00000001
|
#define FLD_DIF_RF_IF_LOCK 0x00000001
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_SRC_PHASE_INC (DIRECT_IF_REVB_BASE + 0x00000040) /* Reg Size 32 */
|
#define DIF_SRC_PHASE_INC (DIRECT_IF_REVB_BASE + 0x00000040) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:29] */
|
/* Reserved [31:29] */
|
||||||
#define FLD_DIF_PHASE_INC 0x1FFFFFFF
|
#define FLD_DIF_PHASE_INC 0x1FFFFFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_SRC_GAIN_CONTROL (DIRECT_IF_REVB_BASE + 0x00000044) /* Reg Size 32 */
|
#define DIF_SRC_GAIN_CONTROL (DIRECT_IF_REVB_BASE + 0x00000044) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:16] */
|
/* Reserved [31:16] */
|
||||||
#define FLD_DIF_SRC_KI 0x0000FF00
|
#define FLD_DIF_SRC_KI 0x0000FF00
|
||||||
#define FLD_DIF_SRC_KD 0x000000FF
|
#define FLD_DIF_SRC_KD 0x000000FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF01 (DIRECT_IF_REVB_BASE + 0x00000048) /* Reg Size 32 */
|
#define DIF_BPF_COEFF01 (DIRECT_IF_REVB_BASE + 0x00000048) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:19] */
|
/* Reserved [31:19] */
|
||||||
#define FLD_DIF_BPF_COEFF_0 0x00070000
|
#define FLD_DIF_BPF_COEFF_0 0x00070000
|
||||||
|
@ -320,7 +317,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_1 0x0000000F
|
#define FLD_DIF_BPF_COEFF_1 0x0000000F
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF23 (DIRECT_IF_REVB_BASE + 0x0000004c) /* Reg Size 32 */
|
#define DIF_BPF_COEFF23 (DIRECT_IF_REVB_BASE + 0x0000004c) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:22] */
|
/* Reserved [31:22] */
|
||||||
#define FLD_DIF_BPF_COEFF_2 0x003F0000
|
#define FLD_DIF_BPF_COEFF_2 0x003F0000
|
||||||
|
@ -328,7 +325,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_3 0x0000007F
|
#define FLD_DIF_BPF_COEFF_3 0x0000007F
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF45 (DIRECT_IF_REVB_BASE + 0x00000050) /* Reg Size 32 */
|
#define DIF_BPF_COEFF45 (DIRECT_IF_REVB_BASE + 0x00000050) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:24] */
|
/* Reserved [31:24] */
|
||||||
#define FLD_DIF_BPF_COEFF_4 0x00FF0000
|
#define FLD_DIF_BPF_COEFF_4 0x00FF0000
|
||||||
|
@ -336,7 +333,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_5 0x000000FF
|
#define FLD_DIF_BPF_COEFF_5 0x000000FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF67 (DIRECT_IF_REVB_BASE + 0x00000054) /* Reg Size 32 */
|
#define DIF_BPF_COEFF67 (DIRECT_IF_REVB_BASE + 0x00000054) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:25] */
|
/* Reserved [31:25] */
|
||||||
#define FLD_DIF_BPF_COEFF_6 0x01FF0000
|
#define FLD_DIF_BPF_COEFF_6 0x01FF0000
|
||||||
|
@ -344,7 +341,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_7 0x000001FF
|
#define FLD_DIF_BPF_COEFF_7 0x000001FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF89 (DIRECT_IF_REVB_BASE + 0x00000058) /* Reg Size 32 */
|
#define DIF_BPF_COEFF89 (DIRECT_IF_REVB_BASE + 0x00000058) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:26] */
|
/* Reserved [31:26] */
|
||||||
#define FLD_DIF_BPF_COEFF_8 0x03FF0000
|
#define FLD_DIF_BPF_COEFF_8 0x03FF0000
|
||||||
|
@ -352,7 +349,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_9 0x000003FF
|
#define FLD_DIF_BPF_COEFF_9 0x000003FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF1011 (DIRECT_IF_REVB_BASE + 0x0000005C) /* Reg Size 32 */
|
#define DIF_BPF_COEFF1011 (DIRECT_IF_REVB_BASE + 0x0000005C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:27] */
|
/* Reserved [31:27] */
|
||||||
#define FLD_DIF_BPF_COEFF_10 0x07FF0000
|
#define FLD_DIF_BPF_COEFF_10 0x07FF0000
|
||||||
|
@ -360,7 +357,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_11 0x000007FF
|
#define FLD_DIF_BPF_COEFF_11 0x000007FF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF1213 (DIRECT_IF_REVB_BASE + 0x00000060) /* Reg Size 32 */
|
#define DIF_BPF_COEFF1213 (DIRECT_IF_REVB_BASE + 0x00000060) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:27] */
|
/* Reserved [31:27] */
|
||||||
#define FLD_DIF_BPF_COEFF_12 0x07FF0000
|
#define FLD_DIF_BPF_COEFF_12 0x07FF0000
|
||||||
|
@ -368,7 +365,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_13 0x00000FFF
|
#define FLD_DIF_BPF_COEFF_13 0x00000FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF1415 (DIRECT_IF_REVB_BASE + 0x00000064) /* Reg Size 32 */
|
#define DIF_BPF_COEFF1415 (DIRECT_IF_REVB_BASE + 0x00000064) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:28] */
|
/* Reserved [31:28] */
|
||||||
#define FLD_DIF_BPF_COEFF_14 0x0FFF0000
|
#define FLD_DIF_BPF_COEFF_14 0x0FFF0000
|
||||||
|
@ -376,7 +373,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_15 0x00000FFF
|
#define FLD_DIF_BPF_COEFF_15 0x00000FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF1617 (DIRECT_IF_REVB_BASE + 0x00000068) /* Reg Size 32 */
|
#define DIF_BPF_COEFF1617 (DIRECT_IF_REVB_BASE + 0x00000068) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:29] */
|
/* Reserved [31:29] */
|
||||||
#define FLD_DIF_BPF_COEFF_16 0x1FFF0000
|
#define FLD_DIF_BPF_COEFF_16 0x1FFF0000
|
||||||
|
@ -384,7 +381,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_17 0x00001FFF
|
#define FLD_DIF_BPF_COEFF_17 0x00001FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF1819 (DIRECT_IF_REVB_BASE + 0x0000006C) /* Reg Size 32 */
|
#define DIF_BPF_COEFF1819 (DIRECT_IF_REVB_BASE + 0x0000006C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:29] */
|
/* Reserved [31:29] */
|
||||||
#define FLD_DIF_BPF_COEFF_18 0x1FFF0000
|
#define FLD_DIF_BPF_COEFF_18 0x1FFF0000
|
||||||
|
@ -392,7 +389,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_19 0x00001FFF
|
#define FLD_DIF_BPF_COEFF_19 0x00001FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF2021 (DIRECT_IF_REVB_BASE + 0x00000070) /* Reg Size 32 */
|
#define DIF_BPF_COEFF2021 (DIRECT_IF_REVB_BASE + 0x00000070) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:29] */
|
/* Reserved [31:29] */
|
||||||
#define FLD_DIF_BPF_COEFF_20 0x1FFF0000
|
#define FLD_DIF_BPF_COEFF_20 0x1FFF0000
|
||||||
|
@ -400,7 +397,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_21 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_21 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF2223 (DIRECT_IF_REVB_BASE + 0x00000074) /* Reg Size 32 */
|
#define DIF_BPF_COEFF2223 (DIRECT_IF_REVB_BASE + 0x00000074) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_22 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_22 0x3FFF0000
|
||||||
|
@ -408,7 +405,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_23 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_23 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF2425 (DIRECT_IF_REVB_BASE + 0x00000078) /* Reg Size 32 */
|
#define DIF_BPF_COEFF2425 (DIRECT_IF_REVB_BASE + 0x00000078) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_24 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_24 0x3FFF0000
|
||||||
|
@ -416,7 +413,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_25 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_25 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF2627 (DIRECT_IF_REVB_BASE + 0x0000007C) /* Reg Size 32 */
|
#define DIF_BPF_COEFF2627 (DIRECT_IF_REVB_BASE + 0x0000007C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_26 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_26 0x3FFF0000
|
||||||
|
@ -424,7 +421,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_27 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_27 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF2829 (DIRECT_IF_REVB_BASE + 0x00000080) /* Reg Size 32 */
|
#define DIF_BPF_COEFF2829 (DIRECT_IF_REVB_BASE + 0x00000080) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_28 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_28 0x3FFF0000
|
||||||
|
@ -432,7 +429,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_29 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_29 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF3031 (DIRECT_IF_REVB_BASE + 0x00000084) /* Reg Size 32 */
|
#define DIF_BPF_COEFF3031 (DIRECT_IF_REVB_BASE + 0x00000084) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_30 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_30 0x3FFF0000
|
||||||
|
@ -440,7 +437,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_31 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_31 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF3233 (DIRECT_IF_REVB_BASE + 0x00000088) /* Reg Size 32 */
|
#define DIF_BPF_COEFF3233 (DIRECT_IF_REVB_BASE + 0x00000088) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_32 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_32 0x3FFF0000
|
||||||
|
@ -448,7 +445,7 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_33 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_33 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF3435 (DIRECT_IF_REVB_BASE + 0x0000008C) /* Reg Size 32 */
|
#define DIF_BPF_COEFF3435 (DIRECT_IF_REVB_BASE + 0x0000008C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_34 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_34 0x3FFF0000
|
||||||
|
@ -456,20 +453,20 @@ typedef enum{
|
||||||
#define FLD_DIF_BPF_COEFF_35 0x00003FFF
|
#define FLD_DIF_BPF_COEFF_35 0x00003FFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_BPF_COEFF36 (DIRECT_IF_REVB_BASE + 0x00000090) /* Reg Size 32 */
|
#define DIF_BPF_COEFF36 (DIRECT_IF_REVB_BASE + 0x00000090) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:30] */
|
/* Reserved [31:30] */
|
||||||
#define FLD_DIF_BPF_COEFF_36 0x3FFF0000
|
#define FLD_DIF_BPF_COEFF_36 0x3FFF0000
|
||||||
/* Reserved [15:0] */
|
/* Reserved [15:0] */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_RPT_VARIANCE (DIRECT_IF_REVB_BASE + 0x00000094) /* Reg Size 32 */
|
#define DIF_RPT_VARIANCE (DIRECT_IF_REVB_BASE + 0x00000094) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:20] */
|
/* Reserved [31:20] */
|
||||||
#define FLD_DIF_RPT_VARIANCE 0x000FFFFF
|
#define FLD_DIF_RPT_VARIANCE 0x000FFFFF
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_SOFT_RST_CTRL_REVB (DIRECT_IF_REVB_BASE + 0x00000098) /* Reg Size 32 */
|
#define DIF_SOFT_RST_CTRL_REVB (DIRECT_IF_REVB_BASE + 0x00000098) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:8] */
|
/* Reserved [31:8] */
|
||||||
#define FLD_DIF_DIF_SOFT_RST 0x00000080
|
#define FLD_DIF_DIF_SOFT_RST 0x00000080
|
||||||
|
@ -482,10 +479,9 @@ typedef enum{
|
||||||
#define FLD_DIF_PLL_RST_MSK 0x00000001
|
#define FLD_DIF_PLL_RST_MSK 0x00000001
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DIF_PLL_FREQ_ERR (DIRECT_IF_REVB_BASE + 0x0000009C) /* Reg Size 32 */
|
#define DIF_PLL_FREQ_ERR (DIRECT_IF_REVB_BASE + 0x0000009C) /* Reg Size 32 */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Reserved [31:25] */
|
/* Reserved [31:25] */
|
||||||
#define FLD_DIF_CTL_IP 0x01FFFFFF
|
#define FLD_DIF_CTL_IP 0x01FFFFFF
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
||||||
DVB device driver for cx231xx
|
DVB device driver for cx231xx
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on em28xx driver
|
Based on em28xx driver
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
#include "xc5000.h"
|
#include "xc5000.h"
|
||||||
#include "dvb_dummy_fe.h"
|
#include "dvb_dummy_fe.h"
|
||||||
|
|
||||||
|
|
||||||
MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
|
MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
|
||||||
MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
|
MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -50,24 +49,22 @@ if (debug >= level) \
|
||||||
#define CX231XX_DVB_MAX_PACKETS 64
|
#define CX231XX_DVB_MAX_PACKETS 64
|
||||||
|
|
||||||
struct cx231xx_dvb {
|
struct cx231xx_dvb {
|
||||||
struct dvb_frontend *frontend;
|
struct dvb_frontend *frontend;
|
||||||
|
|
||||||
/* feed count management */
|
/* feed count management */
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
int nfeeds;
|
int nfeeds;
|
||||||
|
|
||||||
/* general boilerplate stuff */
|
/* general boilerplate stuff */
|
||||||
struct dvb_adapter adapter;
|
struct dvb_adapter adapter;
|
||||||
struct dvb_demux demux;
|
struct dvb_demux demux;
|
||||||
struct dmxdev dmxdev;
|
struct dmxdev dmxdev;
|
||||||
struct dmx_frontend fe_hw;
|
struct dmx_frontend fe_hw;
|
||||||
struct dmx_frontend fe_mem;
|
struct dmx_frontend fe_mem;
|
||||||
struct dvb_net net;
|
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";
|
char *errmsg = "Unknown";
|
||||||
|
|
||||||
|
@ -149,8 +146,8 @@ static int start_streaming(struct cx231xx_dvb *dvb)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
|
return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
|
||||||
CX231XX_DVB_NUM_BUFS, CX231XX_DVB_MAX_PACKETSIZE,
|
CX231XX_DVB_NUM_BUFS,
|
||||||
dvb_isoc_copy);
|
CX231XX_DVB_MAX_PACKETSIZE, dvb_isoc_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stop_streaming(struct cx231xx_dvb *dvb)
|
static int stop_streaming(struct cx231xx_dvb *dvb)
|
||||||
|
@ -166,7 +163,7 @@ static int stop_streaming(struct cx231xx_dvb *dvb)
|
||||||
|
|
||||||
static int start_feed(struct dvb_demux_feed *feed)
|
static int start_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
struct dvb_demux *demux = feed->demux;
|
struct dvb_demux *demux = feed->demux;
|
||||||
struct cx231xx_dvb *dvb = demux->priv;
|
struct cx231xx_dvb *dvb = demux->priv;
|
||||||
int rc, ret;
|
int rc, ret;
|
||||||
|
|
||||||
|
@ -189,7 +186,7 @@ static int start_feed(struct dvb_demux_feed *feed)
|
||||||
|
|
||||||
static int stop_feed(struct dvb_demux_feed *feed)
|
static int stop_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
struct dvb_demux *demux = feed->demux;
|
struct dvb_demux *demux = feed->demux;
|
||||||
struct cx231xx_dvb *dvb = demux->priv;
|
struct cx231xx_dvb *dvb = demux->priv;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
@ -203,8 +200,6 @@ static int stop_feed(struct dvb_demux_feed *feed)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
|
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 = {
|
static struct xc5000_config cnxt_rde250_tunerconfig = {
|
||||||
.i2c_address = 0x61,
|
.i2c_address = 0x61,
|
||||||
.if_khz = 5380,
|
.if_khz = 5380,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
#if 0
|
#if 0
|
||||||
static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||||
|
@ -234,13 +227,12 @@ static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||||
struct xc5000_config cfg;
|
struct xc5000_config cfg;
|
||||||
|
|
||||||
memset(&cfg, 0, sizeof(cfg));
|
memset(&cfg, 0, sizeof(cfg));
|
||||||
cfg.i2c_adap = &dev->i2c_bus[1].i2c_adap;
|
cfg.i2c_adap = &dev->i2c_bus[1].i2c_adap;
|
||||||
cfg.i2c_addr = addr;
|
cfg.i2c_addr = addr;
|
||||||
|
|
||||||
if (!dev->dvb->frontend) {
|
if (!dev->dvb->frontend) {
|
||||||
printk(KERN_ERR "%s/2: dvb frontend not attached. "
|
printk(KERN_ERR "%s/2: dvb frontend not attached. "
|
||||||
"Can't attach xc5000\n",
|
"Can't attach xc5000\n", dev->name);
|
||||||
dev->name);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,65 +250,65 @@ static int attach_xc5000(u8 addr, struct cx231xx *dev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq )
|
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
|
||||||
{
|
{
|
||||||
int status = 0;
|
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;
|
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;
|
struct analog_parameters params;
|
||||||
|
|
||||||
params.frequency = freq;
|
params.frequency = freq;
|
||||||
params.std = dev->norm;
|
params.std = dev->norm;
|
||||||
params.mode = 0 ; /* 0- Air; 1 - cable */
|
params.mode = 0; /* 0- Air; 1 - cable */
|
||||||
/*params.audmode = ; */
|
/*params.audmode = ; */
|
||||||
|
|
||||||
/* Set the analog parameters to set the frequency */
|
|
||||||
cx231xx_info("Setting Frequency for XC5000\n");
|
|
||||||
dops->set_analog_params(dev->dvb->frontend, ¶ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Set the analog parameters to set the frequency */
|
||||||
|
cx231xx_info("Setting Frequency for XC5000\n");
|
||||||
|
dops->set_analog_params(dev->dvb->frontend, ¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cx231xx_reset_analog_tuner(struct cx231xx *dev)
|
int cx231xx_reset_analog_tuner(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
int status = 0;
|
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;
|
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");
|
cx231xx_info("Reloading firmware for XC5000\n");
|
||||||
status = dops->init(dev->dvb->frontend);
|
status = dops->init(dev->dvb->frontend);
|
||||||
if(status == 0 ) {
|
if (status == 0) {
|
||||||
dev->xc_fw_load_done = 1;
|
dev->xc_fw_load_done = 1;
|
||||||
cx231xx_info("XC5000 firmware download completed\n");
|
cx231xx_info
|
||||||
} else {
|
("XC5000 firmware download completed\n");
|
||||||
dev->xc_fw_load_done = 0;
|
} else {
|
||||||
cx231xx_info("XC5000 firmware download failed !!!\n");
|
dev->xc_fw_load_done = 0;
|
||||||
}
|
cx231xx_info
|
||||||
|
("XC5000 firmware download failed !!!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int register_dvb(struct cx231xx_dvb *dvb,
|
static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
struct module *module,
|
struct module *module,
|
||||||
struct cx231xx *dev,
|
struct cx231xx *dev, struct device *device)
|
||||||
struct device *device)
|
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
@ -326,7 +318,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
|
result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
|
||||||
adapter_nr);
|
adapter_nr);
|
||||||
if (result < 0) {
|
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);
|
dev->name, result);
|
||||||
goto fail_adapter;
|
goto fail_adapter;
|
||||||
}
|
}
|
||||||
|
@ -339,20 +332,21 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
/* register frontend */
|
/* register frontend */
|
||||||
result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
|
result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
|
||||||
if (result < 0) {
|
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);
|
dev->name, result);
|
||||||
goto fail_frontend;
|
goto fail_frontend;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register demux stuff */
|
/* register demux stuff */
|
||||||
dvb->demux.dmx.capabilities =
|
dvb->demux.dmx.capabilities =
|
||||||
DMX_TS_FILTERING | DMX_SECTION_FILTERING |
|
DMX_TS_FILTERING | DMX_SECTION_FILTERING |
|
||||||
DMX_MEMORY_BASED_FILTERING;
|
DMX_MEMORY_BASED_FILTERING;
|
||||||
dvb->demux.priv = dvb;
|
dvb->demux.priv = dvb;
|
||||||
dvb->demux.filternum = 256;
|
dvb->demux.filternum = 256;
|
||||||
dvb->demux.feednum = 256;
|
dvb->demux.feednum = 256;
|
||||||
dvb->demux.start_feed = start_feed;
|
dvb->demux.start_feed = start_feed;
|
||||||
dvb->demux.stop_feed = stop_feed;
|
dvb->demux.stop_feed = stop_feed;
|
||||||
|
|
||||||
result = dvb_dmx_init(&dvb->demux);
|
result = dvb_dmx_init(&dvb->demux);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
|
@ -361,8 +355,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
goto fail_dmx;
|
goto fail_dmx;
|
||||||
}
|
}
|
||||||
|
|
||||||
dvb->dmxdev.filternum = 256;
|
dvb->dmxdev.filternum = 256;
|
||||||
dvb->dmxdev.demux = &dvb->demux.dmx;
|
dvb->dmxdev.demux = &dvb->demux.dmx;
|
||||||
dvb->dmxdev.capabilities = 0;
|
dvb->dmxdev.capabilities = 0;
|
||||||
result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
|
result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
|
@ -374,7 +368,8 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
dvb->fe_hw.source = DMX_FRONTEND_0;
|
dvb->fe_hw.source = DMX_FRONTEND_0;
|
||||||
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||||
if (result < 0) {
|
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);
|
dev->name, result);
|
||||||
goto fail_fe_hw;
|
goto fail_fe_hw;
|
||||||
}
|
}
|
||||||
|
@ -382,15 +377,17 @@ static int register_dvb(struct cx231xx_dvb *dvb,
|
||||||
dvb->fe_mem.source = DMX_MEMORY_FE;
|
dvb->fe_mem.source = DMX_MEMORY_FE;
|
||||||
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
|
result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
|
||||||
if (result < 0) {
|
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);
|
dev->name, result);
|
||||||
goto fail_fe_mem;
|
goto fail_fe_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
printk(KERN_WARNING "%s: connect_frontend failed (errno = %d)\n",
|
printk(KERN_WARNING
|
||||||
dev->name, result);
|
"%s: connect_frontend failed (errno = %d)\n", dev->name,
|
||||||
|
result);
|
||||||
goto fail_fe_conn;
|
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);
|
dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_fe_conn:
|
fail_fe_conn:
|
||||||
dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
|
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);
|
dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
|
||||||
fail_fe_hw:
|
fail_fe_hw:
|
||||||
dvb_dmxdev_release(&dvb->dmxdev);
|
dvb_dmxdev_release(&dvb->dmxdev);
|
||||||
fail_dmxdev:
|
fail_dmxdev:
|
||||||
dvb_dmx_release(&dvb->demux);
|
dvb_dmx_release(&dvb->demux);
|
||||||
fail_dmx:
|
fail_dmx:
|
||||||
dvb_unregister_frontend(dvb->frontend);
|
dvb_unregister_frontend(dvb->frontend);
|
||||||
fail_frontend:
|
fail_frontend:
|
||||||
dvb_frontend_detach(dvb->frontend);
|
dvb_frontend_detach(dvb->frontend);
|
||||||
dvb_unregister_adapter(&dvb->adapter);
|
dvb_unregister_adapter(&dvb->adapter);
|
||||||
fail_adapter:
|
fail_adapter:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,7 +424,6 @@ static void unregister_dvb(struct cx231xx_dvb *dvb)
|
||||||
dvb_unregister_adapter(&dvb->adapter);
|
dvb_unregister_adapter(&dvb->adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dvb_init(struct cx231xx *dev)
|
static int dvb_init(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
@ -446,71 +442,70 @@ static int dvb_init(struct cx231xx *dev)
|
||||||
}
|
}
|
||||||
dev->dvb = dvb;
|
dev->dvb = dvb;
|
||||||
dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
|
dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
|
||||||
dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
|
dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
|
||||||
|
|
||||||
cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
|
cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
|
||||||
/* init frontend */
|
/* init frontend */
|
||||||
switch (dev->model) {
|
switch (dev->model) {
|
||||||
case CX231XX_BOARD_CNXT_RDE_250:
|
case CX231XX_BOARD_CNXT_RDE_250:
|
||||||
|
|
||||||
/* dev->dvb->frontend = dvb_attach(s5h1411_attach,
|
/* dev->dvb->frontend = dvb_attach(s5h1411_attach,
|
||||||
&dvico_s5h1411_config,
|
&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);
|
dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
|
||||||
|
|
||||||
if(dev->dvb->frontend == NULL) {
|
if (dev->dvb->frontend == NULL) {
|
||||||
printk(DRIVER_NAME ": Failed to attach dummy front end\n");
|
printk(DRIVER_NAME
|
||||||
result = -EINVAL;
|
": Failed to attach dummy front end\n");
|
||||||
goto out_free;
|
result = -EINVAL;
|
||||||
}
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
/* define general-purpose callback pointer */
|
/* define general-purpose callback pointer */
|
||||||
dvb->frontend->callback = cx231xx_tuner_callback;
|
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,
|
&dev->i2c_bus[1].i2c_adap,
|
||||||
&cnxt_rde250_tunerconfig) < 0) {
|
&cnxt_rde250_tunerconfig) < 0) {
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case CX231XX_BOARD_CNXT_RDU_250:
|
case CX231XX_BOARD_CNXT_RDU_250:
|
||||||
|
|
||||||
dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
|
dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
|
||||||
|
|
||||||
if(dev->dvb->frontend == NULL) {
|
if (dev->dvb->frontend == NULL) {
|
||||||
printk(DRIVER_NAME ": Failed to attach dummy front end\n");
|
printk(DRIVER_NAME
|
||||||
result = -EINVAL;
|
": Failed to attach dummy front end\n");
|
||||||
goto out_free;
|
result = -EINVAL;
|
||||||
}
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
/* define general-purpose callback pointer */
|
/* define general-purpose callback pointer */
|
||||||
dvb->frontend->callback = cx231xx_tuner_callback;
|
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,
|
&dev->i2c_bus[1].i2c_adap,
|
||||||
&cnxt_rde250_tunerconfig) < 0) {
|
&cnxt_rde250_tunerconfig) < 0) {
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
|
printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
|
||||||
" isn't supported yet\n",
|
" isn't supported yet\n", dev->name);
|
||||||
dev->name);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (NULL == dvb->frontend) {
|
if (NULL == dvb->frontend) {
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"%s/2: frontend initialization failed\n",
|
"%s/2: frontend initialization failed\n", dev->name);
|
||||||
dev->name);
|
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* register everything */
|
/* register everything */
|
||||||
result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
|
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");
|
printk(KERN_INFO "Successfully loaded cx231xx-dvb\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
cx231xx_set_mode(dev, CX231XX_SUSPEND);
|
cx231xx_set_mode(dev, CX231XX_SUSPEND);
|
||||||
kfree(dvb);
|
kfree(dvb);
|
||||||
dev->dvb = NULL;
|
dev->dvb = NULL;
|
||||||
|
@ -544,7 +539,7 @@ static int dvb_fini(struct cx231xx *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cx231xx_ops dvb_ops = {
|
static struct cx231xx_ops dvb_ops = {
|
||||||
.id = CX231XX_DVB,
|
.id = CX231XX_DVB,
|
||||||
.name = "Cx231xx dvb Extension",
|
.name = "Cx231xx dvb Extension",
|
||||||
.init = dvb_init,
|
.init = dvb_init,
|
||||||
.fini = dvb_fini,
|
.fini = dvb_fini,
|
||||||
|
@ -562,4 +557,3 @@ static void __exit cx231xx_dvb_unregister(void)
|
||||||
|
|
||||||
module_init(cx231xx_dvb_register);
|
module_init(cx231xx_dvb_register);
|
||||||
module_exit(cx231xx_dvb_unregister);
|
module_exit(cx231xx_dvb_unregister);
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
cx231xx-i2c.c - driver for Conexant Cx23100/101/102 USB video capture devices
|
cx231xx-i2c.c - driver for Conexant Cx23100/101/102 USB video capture devices
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on em28xx driver
|
Based on em28xx driver
|
||||||
Based on Cx23885 driver
|
Based on Cx23885 driver
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include "cx231xx.h"
|
#include "cx231xx.h"
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
/* ----------------------------------------------------------- */
|
||||||
|
|
||||||
static unsigned int i2c_scan;
|
static unsigned int i2c_scan;
|
||||||
|
@ -40,7 +39,6 @@ static unsigned int i2c_debug;
|
||||||
module_param(i2c_debug, int, 0644);
|
module_param(i2c_debug, int, 0644);
|
||||||
MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
|
MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
|
||||||
|
|
||||||
|
|
||||||
#define dprintk1(lvl, fmt, args...) \
|
#define dprintk1(lvl, fmt, args...) \
|
||||||
do { \
|
do { \
|
||||||
if (i2c_debug >= lvl) { \
|
if (i2c_debug >= lvl) { \
|
||||||
|
@ -56,116 +54,119 @@ do { \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cx231xx_i2c_send_bytes()
|
* cx231xx_i2c_send_bytes()
|
||||||
*/
|
*/
|
||||||
int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||||
const struct i2c_msg *msg)
|
const struct i2c_msg *msg)
|
||||||
{
|
{
|
||||||
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
struct cx231xx_i2c_xfer_data req_data;
|
struct cx231xx_i2c_xfer_data req_data;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
u16 size = 0;
|
u16 size = 0;
|
||||||
u8 loop = 0;
|
u8 loop = 0;
|
||||||
u8 saddr_len = 1;
|
u8 saddr_len = 1;
|
||||||
u8 *buf_ptr = NULL;
|
u8 *buf_ptr = NULL;
|
||||||
u16 saddr = 0;
|
u16 saddr = 0;
|
||||||
u8 need_gpio = 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;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
/* Just writing sub address will cause problem to XC5000
|
} else if (size == 4) { /* register write with sub addr */
|
||||||
So ignore the request */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} else if( size == 4 ) { /* register write with sub addr*/
|
if (msg->len >= 2)
|
||||||
|
saddr = msg->buf[0] << 8 | msg->buf[1];
|
||||||
|
else if (msg->len == 1)
|
||||||
|
saddr = msg->buf[0];
|
||||||
|
|
||||||
if(msg->len >= 2 )
|
switch (saddr) {
|
||||||
saddr = msg->buf[0] << 8 | msg->buf[1];
|
case 0x0000: /* start tuner calibration mode */
|
||||||
else if ( msg->len == 1 )
|
need_gpio = 1;
|
||||||
saddr = msg->buf[0];
|
dev->xc_fw_load_done = 1; /* FW Loading is done */
|
||||||
|
break;
|
||||||
|
case 0x000D: /* Set signal source */
|
||||||
|
case 0x0001: /* Set TV standard - Video */
|
||||||
|
case 0x0002: /* Set TV standard - Audio */
|
||||||
|
case 0x0003: /* Set RF Frequency */
|
||||||
|
need_gpio = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (dev->xc_fw_load_done)
|
||||||
|
need_gpio = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch(saddr) {
|
if (need_gpio) {
|
||||||
case 0x0000: /* start tuner calibration mode */
|
dprintk1(1,
|
||||||
need_gpio = 1;
|
" GPIO W R I T E : addr 0x%x, len %d, saddr 0x%x\n",
|
||||||
dev->xc_fw_load_done = 1; /* FW Loading is done */
|
msg->addr, msg->len, saddr);
|
||||||
break;
|
|
||||||
case 0x000D: /* Set signal source */
|
|
||||||
case 0x0001: /* Set TV standard - Video */
|
|
||||||
case 0x0002: /* Set TV standard - Audio */
|
|
||||||
case 0x0003: /* Set RF Frequency */
|
|
||||||
need_gpio = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if(dev->xc_fw_load_done)
|
|
||||||
need_gpio = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(need_gpio ) {
|
return dev->cx231xx_gpio_i2c_write(dev,
|
||||||
dprintk1(1, " GPIO W R I T E : addr 0x%x, len %d, saddr 0x%x\n",
|
msg->addr,
|
||||||
msg->addr, msg->len, saddr);
|
msg->buf,
|
||||||
|
msg->len);
|
||||||
|
}
|
||||||
|
|
||||||
return dev->cx231xx_gpio_i2c_write(dev, msg->addr, msg->buf, msg->len);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
/* special case for Xc5000 tuner case */
|
||||||
|
saddr_len = 1;
|
||||||
|
|
||||||
/* special case for Xc5000 tuner case */
|
/* adjust the length to correct length */
|
||||||
saddr_len = 1;
|
size -= saddr_len;
|
||||||
|
buf_ptr = (u8 *) (msg->buf + 1);
|
||||||
|
|
||||||
/* adjust the length to correct length */
|
do {
|
||||||
size -= saddr_len;
|
/* prepare xfer_data struct */
|
||||||
buf_ptr = (u8*) (msg->buf + 1 );
|
req_data.dev_addr = msg->addr;
|
||||||
|
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);
|
||||||
|
|
||||||
do {
|
bus->i2c_nostop = (size > 16) ? 1 : 0;
|
||||||
/* prepare xfer_data struct */
|
bus->i2c_reserve = (loop == 0) ? 0 : 1;
|
||||||
req_data.dev_addr = msg->addr;
|
|
||||||
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);
|
|
||||||
|
|
||||||
bus->i2c_nostop = (size > 16) ? 1: 0;
|
/* usb send command */
|
||||||
bus->i2c_reserve = (loop == 0) ? 0: 1;
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
|
loop++;
|
||||||
|
|
||||||
/* usb send command */
|
if (size >= 16)
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
size -= 16;
|
||||||
loop++;
|
else
|
||||||
|
size = 0;
|
||||||
|
|
||||||
if( size >= 16 )
|
} while (size > 0);
|
||||||
size -= 16;
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
|
|
||||||
}while( size > 0 );
|
bus->i2c_nostop = 0;
|
||||||
|
bus->i2c_reserve = 0;
|
||||||
|
|
||||||
bus->i2c_nostop = 0;
|
} else { /* regular case */
|
||||||
bus->i2c_reserve = 0;
|
|
||||||
|
|
||||||
} else { /* regular case */
|
/* prepare xfer_data struct */
|
||||||
|
req_data.dev_addr = msg->addr;
|
||||||
|
req_data.direction = msg->flags;
|
||||||
|
req_data.saddr_len = 0;
|
||||||
|
req_data.saddr_dat = 0;
|
||||||
|
req_data.buf_size = msg->len;
|
||||||
|
req_data.p_buffer = msg->buf;
|
||||||
|
|
||||||
/* prepare xfer_data struct */
|
/* usb send command */
|
||||||
req_data.dev_addr = msg->addr;
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
req_data.direction = msg->flags;
|
}
|
||||||
req_data.saddr_len = 0;
|
|
||||||
req_data.saddr_dat = 0;
|
|
||||||
req_data.buf_size = msg->len;
|
|
||||||
req_data.p_buffer = msg->buf;
|
|
||||||
|
|
||||||
/* usb send command */
|
return status < 0 ? status : 0;
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status < 0 ? status: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -173,75 +174,85 @@ int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
|
||||||
* read a byte from the i2c device
|
* read a byte from the i2c device
|
||||||
*/
|
*/
|
||||||
static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||||
const struct i2c_msg *msg)
|
const struct i2c_msg *msg)
|
||||||
{
|
{
|
||||||
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
struct cx231xx_i2c_xfer_data req_data;
|
struct cx231xx_i2c_xfer_data req_data;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
u16 saddr = 0;
|
u16 saddr = 0;
|
||||||
u8 need_gpio = 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];
|
saddr = msg->buf[0] << 8 | msg->buf[1];
|
||||||
else if ( msg->len == 1 )
|
else if (msg->len == 1)
|
||||||
saddr = msg->buf[0];
|
saddr = msg->buf[0];
|
||||||
|
|
||||||
if( dev->xc_fw_load_done) {
|
if (dev->xc_fw_load_done) {
|
||||||
|
|
||||||
switch(saddr) {
|
switch (saddr) {
|
||||||
case 0x0009: /* BUSY check */
|
case 0x0009: /* BUSY check */
|
||||||
dprintk1(1, " GPIO R E A D : Special case BUSY check \n");
|
dprintk1(1,
|
||||||
/* Try to read BUSY register, just set it to zero */
|
" GPIO R E A D : Special case BUSY check \n");
|
||||||
msg->buf[0] = 0;
|
/* Try to read BUSY register, just set it to zero */
|
||||||
if(msg->len == 2 )
|
msg->buf[0] = 0;
|
||||||
msg->buf[1] = 0;
|
if (msg->len == 2)
|
||||||
return 0;
|
msg->buf[1] = 0;
|
||||||
case 0x0004: /* read Lock status */
|
return 0;
|
||||||
need_gpio = 1;
|
case 0x0004: /* read Lock status */
|
||||||
break;
|
need_gpio = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(need_gpio) {
|
if (need_gpio) {
|
||||||
/* this is a special case to handle Xceive tuner clock stretch issue
|
/* this is a special case to handle Xceive tuner clock stretch issue
|
||||||
with gpio based I2C interface */
|
with gpio based I2C interface */
|
||||||
dprintk1(1, " GPIO R E A D : addr 0x%x, len %d, saddr 0x%x\n",
|
dprintk1(1,
|
||||||
msg->addr, msg->len, msg->buf[0] << 8| msg->buf[1]);
|
" GPIO R E A D : addr 0x%x, len %d, saddr 0x%x\n",
|
||||||
status = dev->cx231xx_gpio_i2c_write(dev, msg->addr, msg->buf, msg->len);
|
msg->addr, msg->len,
|
||||||
status = dev->cx231xx_gpio_i2c_read(dev, msg->addr, msg->buf, msg->len);
|
msg->buf[0] << 8 | msg->buf[1]);
|
||||||
return status;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* prepare xfer_data struct */
|
/* prepare xfer_data struct */
|
||||||
req_data.dev_addr = msg->addr;
|
req_data.dev_addr = msg->addr;
|
||||||
req_data.direction = msg->flags;
|
req_data.direction = msg->flags;
|
||||||
req_data.saddr_len = msg->len;
|
req_data.saddr_len = msg->len;
|
||||||
req_data.saddr_dat = msg->buf[0] << 8 | msg->buf[1];
|
req_data.saddr_dat = msg->buf[0] << 8 | msg->buf[1];
|
||||||
req_data.buf_size = msg->len;
|
req_data.buf_size = msg->len;
|
||||||
req_data.p_buffer = msg->buf;
|
req_data.p_buffer = msg->buf;
|
||||||
|
|
||||||
/* usb send command */
|
/* usb send command */
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* prepare xfer_data struct */
|
/* prepare xfer_data struct */
|
||||||
req_data.dev_addr = msg->addr;
|
req_data.dev_addr = msg->addr;
|
||||||
req_data.direction = msg->flags;
|
req_data.direction = msg->flags;
|
||||||
req_data.saddr_len = 0;
|
req_data.saddr_len = 0;
|
||||||
req_data.saddr_dat = 0;
|
req_data.saddr_dat = 0;
|
||||||
req_data.buf_size = msg->len;
|
req_data.buf_size = msg->len;
|
||||||
req_data.p_buffer = msg->buf;
|
req_data.p_buffer = msg->buf;
|
||||||
|
|
||||||
/* usb send command */
|
/* usb send command */
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status < 0 ? status: 0;
|
return status < 0 ? status : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -249,56 +260,65 @@ static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
|
||||||
* read a byte from the i2c device
|
* read a byte from the i2c device
|
||||||
*/
|
*/
|
||||||
static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
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_i2c *bus = i2c_adap->algo_data;
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
struct cx231xx_i2c_xfer_data req_data;
|
struct cx231xx_i2c_xfer_data req_data;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
u16 saddr = 0;
|
u16 saddr = 0;
|
||||||
u8 need_gpio = 0;
|
u8 need_gpio = 0;
|
||||||
|
|
||||||
if(msg1->len == 2 )
|
if (msg1->len == 2)
|
||||||
saddr = msg1->buf[0] << 8 | msg1->buf[1];
|
saddr = msg1->buf[0] << 8 | msg1->buf[1];
|
||||||
else if ( msg1->len == 1 )
|
else if (msg1->len == 1)
|
||||||
saddr = msg1->buf[0];
|
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,
|
||||||
msg2->addr, msg2->len, saddr, msg1->len);
|
" 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 */
|
case 0x0008: /* read FW load status */
|
||||||
need_gpio = 1;
|
need_gpio = 1;
|
||||||
break;
|
break;
|
||||||
case 0x0004: /* read Lock status */
|
case 0x0004: /* read Lock status */
|
||||||
need_gpio = 1;
|
need_gpio = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(need_gpio ) {
|
if (need_gpio) {
|
||||||
status = dev->cx231xx_gpio_i2c_write(dev, msg1->addr, msg1->buf, msg1->len);
|
status =
|
||||||
status = dev->cx231xx_gpio_i2c_read(dev, msg2->addr, msg2->buf, msg2->len);
|
dev->cx231xx_gpio_i2c_write(dev, msg1->addr,
|
||||||
return status;
|
msg1->buf,
|
||||||
}
|
msg1->len);
|
||||||
}
|
status =
|
||||||
}
|
dev->cx231xx_gpio_i2c_read(dev, msg2->addr,
|
||||||
|
msg2->buf,
|
||||||
|
msg2->len);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* prepare xfer_data struct */
|
/* prepare xfer_data struct */
|
||||||
req_data.dev_addr = msg2->addr;
|
req_data.dev_addr = msg2->addr;
|
||||||
req_data.direction = msg2->flags;
|
req_data.direction = msg2->flags;
|
||||||
req_data.saddr_len = msg1->len;
|
req_data.saddr_len = msg1->len;
|
||||||
req_data.saddr_dat = saddr;
|
req_data.saddr_dat = saddr;
|
||||||
req_data.buf_size = msg2->len;
|
req_data.buf_size = msg2->len;
|
||||||
req_data.p_buffer = msg2->buf;
|
req_data.p_buffer = msg2->buf;
|
||||||
|
|
||||||
/* usb send command */
|
/* usb send command */
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
|
|
||||||
return status < 0 ? status: 0;
|
return status < 0 ? status : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -306,25 +326,25 @@ static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
|
||||||
* check if there is a i2c_device at the supplied address
|
* check if there is a i2c_device at the supplied address
|
||||||
*/
|
*/
|
||||||
static int cx231xx_i2c_check_for_device(struct i2c_adapter *i2c_adap,
|
static int cx231xx_i2c_check_for_device(struct i2c_adapter *i2c_adap,
|
||||||
const struct i2c_msg *msg)
|
const struct i2c_msg *msg)
|
||||||
{
|
{
|
||||||
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
struct cx231xx_i2c_xfer_data req_data;
|
struct cx231xx_i2c_xfer_data req_data;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
/* prepare xfer_data struct */
|
/* prepare xfer_data struct */
|
||||||
req_data.dev_addr = msg->addr;
|
req_data.dev_addr = msg->addr;
|
||||||
req_data.direction = msg->flags;
|
req_data.direction = msg->flags;
|
||||||
req_data.saddr_len = 0;
|
req_data.saddr_len = 0;
|
||||||
req_data.saddr_dat = 0;
|
req_data.saddr_dat = 0;
|
||||||
req_data.buf_size = 0;
|
req_data.buf_size = 0;
|
||||||
req_data.p_buffer = NULL;
|
req_data.p_buffer = NULL;
|
||||||
|
|
||||||
/* usb send command */
|
/* usb send command */
|
||||||
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
status = dev->cx231xx_send_usb_command(bus, &req_data);
|
||||||
|
|
||||||
return status < 0 ? status: 0;
|
return status < 0 ? status : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -332,7 +352,7 @@ static int cx231xx_i2c_check_for_device(struct i2c_adapter *i2c_adap,
|
||||||
* the main i2c transfer function
|
* the main i2c transfer function
|
||||||
*/
|
*/
|
||||||
static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||||
struct i2c_msg msgs[], int num)
|
struct i2c_msg msgs[], int num)
|
||||||
{
|
{
|
||||||
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
struct cx231xx_i2c *bus = i2c_adap->algo_data;
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
|
@ -348,7 +368,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||||
dprintk2(2, "%s %s addr=%x len=%d:",
|
dprintk2(2, "%s %s addr=%x len=%d:",
|
||||||
(msgs[i].flags & I2C_M_RD) ? "read" : "write",
|
(msgs[i].flags & I2C_M_RD) ? "read" : "write",
|
||||||
i == num - 1 ? "stop" : "nonstop", addr, msgs[i].len);
|
i == num - 1 ? "stop" : "nonstop", addr, msgs[i].len);
|
||||||
if (!msgs[i].len) { /* no len: check only for device presence */
|
if (!msgs[i].len) { /* no len: check only for device presence */
|
||||||
rc = cx231xx_i2c_check_for_device(i2c_adap, &msgs[i]);
|
rc = cx231xx_i2c_check_for_device(i2c_adap, &msgs[i]);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dprintk2(2, " no device\n");
|
dprintk2(2, " no device\n");
|
||||||
|
@ -363,21 +383,24 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||||
printk(" %02x", msgs[i].buf[byte]);
|
printk(" %02x", msgs[i].buf[byte]);
|
||||||
}
|
}
|
||||||
} else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
|
} 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 */
|
/* 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) {
|
if (i2c_debug >= 2) {
|
||||||
for (byte = 0; byte < msgs[i].len; byte++)
|
for (byte = 0; byte < msgs[i].len; byte++)
|
||||||
printk(" %02x", msgs[i].buf[byte]);
|
printk(" %02x", msgs[i].buf[byte]);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} else {
|
||||||
/* write bytes */
|
/* write bytes */
|
||||||
if (i2c_debug >= 2) {
|
if (i2c_debug >= 2) {
|
||||||
for (byte = 0; byte < msgs[i].len; byte++)
|
for (byte = 0; byte < msgs[i].len; byte++)
|
||||||
printk(" %02x", msgs[i].buf[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)
|
if (rc < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -386,7 +409,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||||
}
|
}
|
||||||
|
|
||||||
return num;
|
return num;
|
||||||
err:
|
err:
|
||||||
dprintk2(2, " ERROR: %i\n", rc);
|
dprintk2(2, " ERROR: %i\n", rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -408,7 +431,7 @@ static u32 functionality(struct i2c_adapter *adap)
|
||||||
*/
|
*/
|
||||||
static int attach_inform(struct i2c_client *client)
|
static int attach_inform(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct cx231xx_i2c *bus = i2c_get_adapdata(client->adapter);
|
struct cx231xx_i2c *bus = i2c_get_adapdata(client->adapter);
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
|
|
||||||
switch (client->addr << 1) {
|
switch (client->addr << 1) {
|
||||||
|
@ -422,16 +445,16 @@ static int attach_inform(struct i2c_client *client)
|
||||||
dprintk1(1, "attach_inform: eeprom detected.\n");
|
dprintk1(1, "attach_inform: eeprom detected.\n");
|
||||||
break;
|
break;
|
||||||
case 0x60:
|
case 0x60:
|
||||||
dprintk1(1, "attach_inform: Colibri detected.\n");
|
dprintk1(1, "attach_inform: Colibri detected.\n");
|
||||||
break;
|
|
||||||
case 0x8e:
|
|
||||||
{
|
|
||||||
struct IR_i2c *ir = i2c_get_clientdata(client);
|
|
||||||
dprintk1(1, "attach_inform: IR detected (%s).\n",
|
|
||||||
ir->phys);
|
|
||||||
cx231xx_set_ir(dev, ir);
|
|
||||||
break;
|
break;
|
||||||
}
|
case 0x8e:
|
||||||
|
{
|
||||||
|
struct IR_i2c *ir = i2c_get_clientdata(client);
|
||||||
|
dprintk1(1, "attach_inform: IR detected (%s).\n",
|
||||||
|
ir->phys);
|
||||||
|
cx231xx_set_ir(dev, ir);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 0x80:
|
case 0x80:
|
||||||
case 0x88:
|
case 0x88:
|
||||||
dprintk1(1, "attach_inform: Hammerhead detected.\n");
|
dprintk1(1, "attach_inform: Hammerhead detected.\n");
|
||||||
|
@ -442,7 +465,7 @@ static int attach_inform(struct i2c_client *client)
|
||||||
dev->tuner_addr = client->addr;
|
dev->tuner_addr = client->addr;
|
||||||
|
|
||||||
dprintk1(1, "attach inform: detected I2C address %x\n",
|
dprintk1(1, "attach inform: detected I2C address %x\n",
|
||||||
client->addr << 1);
|
client->addr << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -454,9 +477,8 @@ static int detach_inform(struct i2c_client *client)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct i2c_algorithm cx231xx_algo = {
|
static struct i2c_algorithm cx231xx_algo = {
|
||||||
.master_xfer = cx231xx_i2c_xfer,
|
.master_xfer = cx231xx_i2c_xfer,
|
||||||
.functionality = functionality,
|
.functionality = functionality,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -466,7 +488,7 @@ static struct i2c_adapter cx231xx_adap_template = {
|
||||||
.name = "cx231xx",
|
.name = "cx231xx",
|
||||||
.id = I2C_HW_B_CX231XX,
|
.id = I2C_HW_B_CX231XX,
|
||||||
.algo = &cx231xx_algo,
|
.algo = &cx231xx_algo,
|
||||||
.client_register = attach_inform,
|
.client_register = attach_inform,
|
||||||
.client_unregister = detach_inform,
|
.client_unregister = detach_inform,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -483,9 +505,9 @@ static struct i2c_client cx231xx_client_template = {
|
||||||
static char *i2c_devs[128] = {
|
static char *i2c_devs[128] = {
|
||||||
[0x60 >> 1] = "colibri",
|
[0x60 >> 1] = "colibri",
|
||||||
[0x88 >> 1] = "hammerhead",
|
[0x88 >> 1] = "hammerhead",
|
||||||
[0x8e >> 1] = "CIR",
|
[0x8e >> 1] = "CIR",
|
||||||
[0x32 >> 1] = "GeminiIII",
|
[0x32 >> 1] = "GeminiIII",
|
||||||
[0x02 >> 1] = "Aquarius",
|
[0x02 >> 1] = "Aquarius",
|
||||||
[0xa0 >> 1] = "eeprom",
|
[0xa0 >> 1] = "eeprom",
|
||||||
[0xc0 >> 1] = "tuner/XC3028",
|
[0xc0 >> 1] = "tuner/XC3028",
|
||||||
[0xc2 >> 1] = "tuner/XC5000",
|
[0xc2 >> 1] = "tuner/XC5000",
|
||||||
|
@ -500,23 +522,25 @@ void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c)
|
||||||
unsigned char buf;
|
unsigned char buf;
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
cx231xx_info(": Checking for I2C devices ..\n");
|
cx231xx_info(": Checking for I2C devices ..\n");
|
||||||
for (i = 0; i < 128; i++) {
|
for (i = 0; i < 128; i++) {
|
||||||
c->addr = i;
|
c->addr = i;
|
||||||
rc = i2c_master_recv(c, &buf, 0);
|
rc = i2c_master_recv(c, &buf, 0);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
continue;
|
continue;
|
||||||
cx231xx_info("%s: i2c scan: found device @ 0x%x [%s]\n",
|
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");
|
cx231xx_info(": Completed Checking for I2C devices.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cx231xx_i2c_call_clients()
|
* cx231xx_i2c_call_clients()
|
||||||
* send commands to all attached i2c devices
|
* 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; */
|
/* struct cx231xx *dev = bus->dev; */
|
||||||
|
|
||||||
|
@ -530,23 +554,20 @@ void cx231xx_i2c_call_clients(struct cx231xx_i2c *bus, unsigned int cmd, void *a
|
||||||
*/
|
*/
|
||||||
int cx231xx_i2c_register(struct cx231xx_i2c *bus)
|
int cx231xx_i2c_register(struct cx231xx_i2c *bus)
|
||||||
{
|
{
|
||||||
struct cx231xx *dev = bus->dev;
|
struct cx231xx *dev = bus->dev;
|
||||||
|
|
||||||
BUG_ON(!dev->cx231xx_send_usb_command);
|
BUG_ON(!dev->cx231xx_send_usb_command);
|
||||||
|
|
||||||
cx231xx_info("%s(bus = %d)\n", __func__, bus->nr);
|
cx231xx_info("%s(bus = %d)\n", __func__, bus->nr);
|
||||||
|
|
||||||
memcpy(&bus->i2c_adap, &cx231xx_adap_template,
|
memcpy(&bus->i2c_adap, &cx231xx_adap_template, sizeof(bus->i2c_adap));
|
||||||
sizeof(bus->i2c_adap));
|
memcpy(&bus->i2c_algo, &cx231xx_algo, sizeof(bus->i2c_algo));
|
||||||
memcpy(&bus->i2c_algo, &cx231xx_algo,
|
|
||||||
sizeof(bus->i2c_algo));
|
|
||||||
memcpy(&bus->i2c_client, &cx231xx_client_template,
|
memcpy(&bus->i2c_client, &cx231xx_client_template,
|
||||||
sizeof(bus->i2c_client));
|
sizeof(bus->i2c_client));
|
||||||
|
|
||||||
bus->i2c_adap.dev.parent = &dev->udev->dev;
|
bus->i2c_adap.dev.parent = &dev->udev->dev;
|
||||||
|
|
||||||
strlcpy(bus->i2c_adap.name, bus->dev->name,
|
strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name));
|
||||||
sizeof(bus->i2c_adap.name));
|
|
||||||
|
|
||||||
bus->i2c_algo.data = bus;
|
bus->i2c_algo.data = bus;
|
||||||
bus->i2c_adap.algo_data = bus;
|
bus->i2c_adap.algo_data = bus;
|
||||||
|
@ -561,7 +582,7 @@ int cx231xx_i2c_register(struct cx231xx_i2c *bus)
|
||||||
cx231xx_do_i2c_scan(dev, &bus->i2c_client);
|
cx231xx_do_i2c_scan(dev, &bus->i2c_client);
|
||||||
} else
|
} else
|
||||||
cx231xx_warn("%s: i2c bus %d register FAILED\n",
|
cx231xx_warn("%s: i2c bus %d register FAILED\n",
|
||||||
dev->name, bus->nr);
|
dev->name, bus->nr);
|
||||||
|
|
||||||
return bus->i2c_rc;
|
return bus->i2c_rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
handle cx231xx IR remotes via linux kernel input layer.
|
handle cx231xx IR remotes via linux kernel input layer.
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on em28xx driver
|
Based on em28xx driver
|
||||||
|
|
||||||
< This is a place holder for IR now.>
|
< This is a place holder for IR now.>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -30,7 +30,6 @@
|
||||||
|
|
||||||
#include "cx231xx.h"
|
#include "cx231xx.h"
|
||||||
|
|
||||||
|
|
||||||
static unsigned int ir_debug;
|
static unsigned int ir_debug;
|
||||||
module_param(ir_debug, int, 0644);
|
module_param(ir_debug, int, 0644);
|
||||||
MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
|
MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
|
||||||
|
@ -71,11 +70,9 @@ struct cx231xx_IR {
|
||||||
unsigned int last_readcount;
|
unsigned int last_readcount;
|
||||||
unsigned int repeat_interval;
|
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
|
Polling code for cx231xx
|
||||||
**********************************************************/
|
**********************************************************/
|
||||||
|
@ -187,17 +184,16 @@ int cx231xx_ir_init(struct cx231xx *dev)
|
||||||
|
|
||||||
/* Setup the proper handler based on the chip */
|
/* Setup the proper handler based on the chip */
|
||||||
switch (dev->chip_id) {
|
switch (dev->chip_id) {
|
||||||
default:
|
default:
|
||||||
printk("Unrecognized cx231xx chip id: IR not supported\n");
|
printk("Unrecognized cx231xx chip id: IR not supported\n");
|
||||||
goto err_out_free;
|
goto err_out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is how often we ask the chip for IR information */
|
/* This is how often we ask the chip for IR information */
|
||||||
ir->polling = 100; /* ms */
|
ir->polling = 100; /* ms */
|
||||||
|
|
||||||
/* init input device */
|
/* init input device */
|
||||||
snprintf(ir->name, sizeof(ir->name), "cx231xx IR (%s)",
|
snprintf(ir->name, sizeof(ir->name), "cx231xx IR (%s)", dev->name);
|
||||||
dev->name);
|
|
||||||
|
|
||||||
usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
|
usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
|
||||||
strlcat(ir->phys, "/input0", sizeof(ir->phys));
|
strlcat(ir->phys, "/input0", sizeof(ir->phys));
|
||||||
|
@ -223,10 +219,10 @@ int cx231xx_ir_init(struct cx231xx *dev)
|
||||||
goto err_out_stop;
|
goto err_out_stop;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err_out_stop:
|
err_out_stop:
|
||||||
cx231xx_ir_stop(ir);
|
cx231xx_ir_stop(ir);
|
||||||
dev->ir = NULL;
|
dev->ir = NULL;
|
||||||
err_out_free:
|
err_out_free:
|
||||||
input_free_device(input_dev);
|
input_free_device(input_dev);
|
||||||
kfree(ir);
|
kfree(ir);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#define _CX231XX_REG_H
|
#define _CX231XX_REG_H
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* VBI codes *
|
* VBI codes *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#define SAV_ACTIVE_VIDEO_FIELD1 0x80
|
#define SAV_ACTIVE_VIDEO_FIELD1 0x80
|
||||||
|
@ -37,16 +37,16 @@
|
||||||
#define SAV_VBLANK_FIELD2 0xE0
|
#define SAV_VBLANK_FIELD2 0xE0
|
||||||
#define EAV_VBLANK_FIELD2 0xF0
|
#define EAV_VBLANK_FIELD2 0xF0
|
||||||
|
|
||||||
#define SAV_VBI_FIELD1 0x20
|
#define SAV_VBI_FIELD1 0x20
|
||||||
#define EAV_VBI_FIELD1 0x30
|
#define EAV_VBI_FIELD1 0x30
|
||||||
|
|
||||||
#define SAV_VBI_FIELD2 0x60
|
#define SAV_VBI_FIELD2 0x60
|
||||||
#define EAV_VBI_FIELD2 0x70
|
#define EAV_VBI_FIELD2 0x70
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Audio ADC Registers */
|
/* Audio ADC Registers */
|
||||||
#define CH_PWR_CTRL1 0x0000000E
|
#define CH_PWR_CTRL1 0x0000000E
|
||||||
#define CH_PWR_CTRL2 0x0000000F
|
#define CH_PWR_CTRL2 0x0000000F
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define HOST_REG1 0x000
|
#define HOST_REG1 0x000
|
||||||
|
@ -60,7 +60,6 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define HOST_REG2 0x001
|
#define HOST_REG2 0x001
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define HOST_REG3 0x002
|
#define HOST_REG3 0x002
|
||||||
|
|
||||||
|
@ -231,7 +230,6 @@
|
||||||
/* Reserved [3:1] */
|
/* Reserved [3:1] */
|
||||||
#define FLD_CIR_TEST_DIS 0x00000001
|
#define FLD_CIR_TEST_DIS 0x00000001
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define TEST_CTRL2 0x148
|
#define TEST_CTRL2 0x148
|
||||||
#define FLD_TSXCLK_POL_CTL 0x80000000
|
#define FLD_TSXCLK_POL_CTL 0x80000000
|
||||||
|
@ -257,7 +255,6 @@
|
||||||
#define FLD_FLTRN_BIST_TST_DONE 0x00000008
|
#define FLD_FLTRN_BIST_TST_DONE 0x00000008
|
||||||
#define FLD_VID_BIST_TST_DONE 0x00000007
|
#define FLD_VID_BIST_TST_DONE 0x00000007
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* DirectIF registers definition have been moved to DIF_reg.h */
|
/* DirectIF registers definition have been moved to DIF_reg.h */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -268,7 +265,7 @@
|
||||||
#define FLD_AFD_FORCE_PAL 0x04000000
|
#define FLD_AFD_FORCE_PAL 0x04000000
|
||||||
#define FLD_AFD_PALM_SEL 0x03000000
|
#define FLD_AFD_PALM_SEL 0x03000000
|
||||||
#define FLD_CKILL_MODE 0x00300000
|
#define FLD_CKILL_MODE 0x00300000
|
||||||
#define FLD_COMB_NOTCH_MODE 0x00c00000 /* bit[19:18] */
|
#define FLD_COMB_NOTCH_MODE 0x00c00000 /* bit[19:18] */
|
||||||
#define FLD_CLR_LOCK_STAT 0x00020000
|
#define FLD_CLR_LOCK_STAT 0x00020000
|
||||||
#define FLD_FAST_LOCK_MD 0x00010000
|
#define FLD_FAST_LOCK_MD 0x00010000
|
||||||
#define FLD_WCEN 0x00008000
|
#define FLD_WCEN 0x00008000
|
||||||
|
@ -662,7 +659,6 @@
|
||||||
#define FLD_PLL_KI 0x00FF0000
|
#define FLD_PLL_KI 0x00FF0000
|
||||||
#define FLD_PLL_MAX_OFFSET 0x0000FFFF
|
#define FLD_PLL_MAX_OFFSET 0x0000FFFF
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define HTL_CTRL 0x498
|
#define HTL_CTRL 0x498
|
||||||
/* Reserved [31:24] */
|
/* Reserved [31:24] */
|
||||||
|
@ -771,13 +767,12 @@
|
||||||
#define FLD_FIELD_PHASE_LIMIT 0x000000F0
|
#define FLD_FIELD_PHASE_LIMIT 0x000000F0
|
||||||
#define FLD_HEAD_SW_DET_LIMIT 0x0000000F
|
#define FLD_HEAD_SW_DET_LIMIT 0x0000000F
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define DL_CTL 0x800
|
#define DL_CTL 0x800
|
||||||
#define DL_CTL_ADDRESS_LOW 0x800 /* Byte 1 in DL_CTL */
|
#define DL_CTL_ADDRESS_LOW 0x800 /* Byte 1 in DL_CTL */
|
||||||
#define DL_CTL_ADDRESS_HIGH 0x801 /* Byte 2 in DL_CTL */
|
#define DL_CTL_ADDRESS_HIGH 0x801 /* Byte 2 in DL_CTL */
|
||||||
#define DL_CTL_DATA 0x802 /* Byte 3 in DL_CTL */
|
#define DL_CTL_DATA 0x802 /* Byte 3 in DL_CTL */
|
||||||
#define DL_CTL_CONTROL 0x803 /* Byte 4 in DL_CTL */
|
#define DL_CTL_CONTROL 0x803 /* Byte 4 in DL_CTL */
|
||||||
/* Reserved [31:5] */
|
/* Reserved [31:5] */
|
||||||
#define FLD_START_8051 0x10000000
|
#define FLD_START_8051 0x10000000
|
||||||
#define FLD_DL_ENABLE 0x08000000
|
#define FLD_DL_ENABLE 0x08000000
|
||||||
|
@ -795,8 +790,8 @@
|
||||||
#define AUD_BUILD_NUM 0x806
|
#define AUD_BUILD_NUM 0x806
|
||||||
#define AUD_VER_NUM 0x807
|
#define AUD_VER_NUM 0x807
|
||||||
#define STD_DET_CTL 0x808
|
#define STD_DET_CTL 0x808
|
||||||
#define STD_DET_CTL_AUD_CTL 0x808 /* Byte 1 in STD_DET_CTL */
|
#define STD_DET_CTL_AUD_CTL 0x808 /* Byte 1 in STD_DET_CTL */
|
||||||
#define STD_DET_CTL_PREF_MODE 0x809 /* Byte 2 in STD_DET_CTL */
|
#define STD_DET_CTL_PREF_MODE 0x809 /* Byte 2 in STD_DET_CTL */
|
||||||
#define FLD_SPARE_CTL0 0xFF000000
|
#define FLD_SPARE_CTL0 0xFF000000
|
||||||
#define FLD_DIS_DBX 0x00800000
|
#define FLD_DIS_DBX 0x00800000
|
||||||
#define FLD_DIS_BTSC 0x00400000
|
#define FLD_DIS_BTSC 0x00400000
|
||||||
|
@ -1424,7 +1419,6 @@
|
||||||
#define FLD_I2S_OUT_WS_SEL 0x00000020
|
#define FLD_I2S_OUT_WS_SEL 0x00000020
|
||||||
#define FLD_I2S_OUT_BCN_DEL 0x0000001F
|
#define FLD_I2S_OUT_BCN_DEL 0x0000001F
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define AC97_CTL 0x91C
|
#define AC97_CTL 0x91C
|
||||||
/* Reserved [31:26] */
|
/* Reserved [31:26] */
|
||||||
|
@ -1437,7 +1431,6 @@
|
||||||
/* Reserved [7:1] */
|
/* Reserved [7:1] */
|
||||||
#define FLD_AC97_SHUTDOWN 0x00000001
|
#define FLD_AC97_SHUTDOWN 0x00000001
|
||||||
|
|
||||||
|
|
||||||
/* Cx231xx redefine */
|
/* Cx231xx redefine */
|
||||||
#define QPSK_IAGC_CTL1 0x94c
|
#define QPSK_IAGC_CTL1 0x94c
|
||||||
#define QPSK_IAGC_CTL2 0x950
|
#define QPSK_IAGC_CTL2 0x950
|
||||||
|
@ -1450,7 +1443,6 @@
|
||||||
#define QPSK_EQ_CTL 0x96c
|
#define QPSK_EQ_CTL 0x96c
|
||||||
#define QPSK_LOCK_CTL 0x970
|
#define QPSK_LOCK_CTL 0x970
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define FM1_DFT_CTL 0x9A8
|
#define FM1_DFT_CTL 0x9A8
|
||||||
#define FLD_FM1_DFT_THRESHOLD 0xFFFF0000
|
#define FLD_FM1_DFT_THRESHOLD 0xFFFF0000
|
||||||
|
@ -1494,8 +1486,6 @@
|
||||||
/* Reserved [15:6] */
|
/* Reserved [15:6] */
|
||||||
#define FLD_AFE_VGA_OUT 0x0000003F
|
#define FLD_AFE_VGA_OUT 0x0000003F
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
#define MTS_GAIN_STATUS 0x9BC
|
#define MTS_GAIN_STATUS 0x9BC
|
||||||
/* Reserved [31:14] */
|
/* Reserved [31:14] */
|
||||||
|
@ -1538,19 +1528,18 @@
|
||||||
#define VID_FMT_SECAM 12
|
#define VID_FMT_SECAM 12
|
||||||
#define VID_FMT_SECAM_60 13
|
#define VID_FMT_SECAM_60 13
|
||||||
|
|
||||||
#define INPUT_MODE_CVBS_0 0 /* INPUT_MODE_VALUE(0) */
|
#define INPUT_MODE_CVBS_0 0 /* INPUT_MODE_VALUE(0) */
|
||||||
#define INPUT_MODE_YC_1 1 /* INPUT_MODE_VALUE(1) */
|
#define INPUT_MODE_YC_1 1 /* INPUT_MODE_VALUE(1) */
|
||||||
#define INPUT_MODE_YC2_2 2 /* INPUT_MODE_VALUE(2) */
|
#define INPUT_MODE_YC2_2 2 /* INPUT_MODE_VALUE(2) */
|
||||||
#define INPUT_MODE_YUV_3 3 /* INPUT_MODE_VALUE(3) */
|
#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 */
|
||||||
|
|
||||||
#define LUMA_LPF_LOW_BANDPASS 0 /* 0.6Mhz lowpass filter bandwidth */
|
#define UV_LPF_LOW_BANDPASS 0 /* 0.6Mhz lowpass filter bandwidth */
|
||||||
#define LUMA_LPF_MEDIUM_BANDPASS 1 /* 1.0Mhz lowpass filter bandwidth */
|
#define UV_LPF_MEDIUM_BANDPASS 1 /* 1.0Mhz lowpass filter bandwidth */
|
||||||
#define LUMA_LPF_HIGH_BANDPASS 2 /* 1.5Mhz lowpass filter bandwidth */
|
#define UV_LPF_HIGH_BANDPASS 2 /* 1.5Mhz lowpass filter bandwidth */
|
||||||
|
|
||||||
#define UV_LPF_LOW_BANDPASS 0 /* 0.6Mhz lowpass filter bandwidth */
|
|
||||||
#define UV_LPF_MEDIUM_BANDPASS 1 /* 1.0Mhz lowpass filter bandwidth */
|
|
||||||
#define UV_LPF_HIGH_BANDPASS 2 /* 1.5Mhz lowpass filter bandwidth */
|
|
||||||
|
|
||||||
#define TWO_TAP_FILT 0
|
#define TWO_TAP_FILT 0
|
||||||
#define THREE_TAP_FILT 1
|
#define THREE_TAP_FILT 1
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
cx231xx_vbi.c - driver for Conexant Cx23100/101/102 USB video capture devices
|
cx231xx_vbi.c - driver for Conexant Cx23100/101/102 USB video capture devices
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on cx88 driver
|
Based on cx88 driver
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -39,8 +39,7 @@
|
||||||
#include "cx231xx.h"
|
#include "cx231xx.h"
|
||||||
#include "cx231xx-vbi.h"
|
#include "cx231xx-vbi.h"
|
||||||
|
|
||||||
static inline void print_err_status(struct cx231xx *dev,
|
static inline void print_err_status(struct cx231xx *dev, int packet, int status)
|
||||||
int packet, int status)
|
|
||||||
{
|
{
|
||||||
char *errmsg = "Unknown";
|
char *errmsg = "Unknown";
|
||||||
|
|
||||||
|
@ -71,10 +70,11 @@ static inline void print_err_status(struct cx231xx *dev,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (packet < 0) {
|
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 {
|
} else {
|
||||||
cx231xx_err(DRIVER_NAME "URB packet %d, status %d [%s].\n",
|
cx231xx_err(DRIVER_NAME "URB packet %d, status %d [%s].\n",
|
||||||
packet, status, errmsg);
|
packet, status, errmsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,12 +83,12 @@ static inline void print_err_status(struct cx231xx *dev,
|
||||||
*/
|
*/
|
||||||
static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||||
{
|
{
|
||||||
struct cx231xx_buffer *buf;
|
struct cx231xx_buffer *buf;
|
||||||
struct cx231xx_dmaqueue *dma_q = urb->context;
|
struct cx231xx_dmaqueue *dma_q = urb->context;
|
||||||
int rc = 1;
|
int rc = 1;
|
||||||
unsigned char *p_buffer;
|
unsigned char *p_buffer;
|
||||||
u32 bytes_parsed = 0, buffer_size = 0;
|
u32 bytes_parsed = 0, buffer_size = 0;
|
||||||
u8 sav_eav = 0;
|
u8 sav_eav = 0;
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -104,60 +104,58 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||||
|
|
||||||
buf = dev->vbi_mode.isoc_ctl.buf;
|
buf = dev->vbi_mode.isoc_ctl.buf;
|
||||||
|
|
||||||
/* get buffer pointer and length */
|
/* get buffer pointer and length */
|
||||||
p_buffer = urb->transfer_buffer;
|
p_buffer = urb->transfer_buffer;
|
||||||
buffer_size = urb->actual_length;
|
buffer_size = urb->actual_length;
|
||||||
|
|
||||||
if (buffer_size > 0) {
|
if (buffer_size > 0) {
|
||||||
|
|
||||||
bytes_parsed = 0;
|
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 */
|
/* Handle the case where we were working on a partial line */
|
||||||
sav_eav = dma_q->last_sav;
|
sav_eav = dma_q->last_sav;
|
||||||
} else {
|
} else {
|
||||||
/* Check for a SAV/EAV overlapping the buffer boundary */
|
/* 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;
|
sav_eav &= 0xF0;
|
||||||
/* Get the first line if we have some portion of an SAV/EAV from the last buffer
|
/* Get the first line if we have some portion of an SAV/EAV from the last buffer
|
||||||
or a partial line */
|
or a partial line */
|
||||||
if(sav_eav) {
|
if (sav_eav) {
|
||||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q,
|
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q, sav_eav, /* SAV/EAV */
|
||||||
sav_eav, /* SAV/EAV */
|
p_buffer + bytes_parsed, /* p_buffer */
|
||||||
p_buffer + bytes_parsed, /* p_buffer */
|
buffer_size - bytes_parsed); /* buffer size */
|
||||||
buffer_size - bytes_parsed); /* buffer size */
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Now parse data that is completely in this buffer */
|
/* Now parse data that is completely in this buffer */
|
||||||
dma_q->is_partial_line = 0;
|
dma_q->is_partial_line = 0;
|
||||||
|
|
||||||
while(bytes_parsed < buffer_size)
|
while (bytes_parsed < buffer_size) {
|
||||||
{
|
u32 bytes_used = 0;
|
||||||
u32 bytes_used = 0;
|
|
||||||
|
|
||||||
sav_eav = cx231xx_find_next_SAV_EAV(
|
sav_eav = cx231xx_find_next_SAV_EAV(p_buffer + bytes_parsed, /* p_buffer */
|
||||||
p_buffer + bytes_parsed, /* p_buffer */
|
buffer_size - bytes_parsed, /* buffer size */
|
||||||
buffer_size - bytes_parsed, /* buffer size */
|
&bytes_used); /* Receives bytes used to get SAV/EAV */
|
||||||
&bytes_used); /* Receives bytes used to get SAV/EAV */
|
|
||||||
|
|
||||||
bytes_parsed += bytes_used;
|
bytes_parsed += bytes_used;
|
||||||
|
|
||||||
sav_eav &= 0xF0;
|
sav_eav &= 0xF0;
|
||||||
if(sav_eav && (bytes_parsed < buffer_size))
|
if (sav_eav && (bytes_parsed < buffer_size)) {
|
||||||
{
|
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q, sav_eav, /* SAV/EAV */
|
||||||
bytes_parsed += cx231xx_get_vbi_line(dev, dma_q,
|
p_buffer + bytes_parsed, /* p_buffer */
|
||||||
sav_eav, /* SAV/EAV */
|
buffer_size - bytes_parsed); /* buffer size */
|
||||||
p_buffer + bytes_parsed, /* p_buffer */
|
}
|
||||||
buffer_size - bytes_parsed); /* buffer size */
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Save the last four bytes of the buffer so we can check the buffer boundary
|
/* Save the last four bytes of the buffer so we can check the buffer boundary
|
||||||
condition next time */
|
condition next time */
|
||||||
memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
|
memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
|
||||||
bytes_parsed = 0;
|
bytes_parsed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -168,25 +166,26 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
|
||||||
------------------------------------------------------------------*/
|
------------------------------------------------------------------*/
|
||||||
|
|
||||||
static int
|
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_fh *fh = vq->priv_data;
|
||||||
struct cx231xx *dev = fh->dev;
|
struct cx231xx *dev = fh->dev;
|
||||||
u32 height = 0;
|
u32 height = 0;
|
||||||
|
|
||||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
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)
|
if (0 == *count)
|
||||||
*count = CX231XX_DEF_VBI_BUF;
|
*count = CX231XX_DEF_VBI_BUF;
|
||||||
|
|
||||||
if (*count < CX231XX_MIN_BUF)
|
if (*count < CX231XX_MIN_BUF)
|
||||||
*count = CX231XX_MIN_BUF;
|
*count = CX231XX_MIN_BUF;
|
||||||
|
|
||||||
/* call VBI setup if required */
|
/* call VBI setup if required */
|
||||||
/* cx231xx_i2c_call_clients(&dev->i2c_bus[1], VIDIOC_S_FREQUENCY, &f);
|
/* cx231xx_i2c_call_clients(&dev->i2c_bus[1], VIDIOC_S_FREQUENCY, &f);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -194,8 +193,8 @@ vbi_buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *s
|
||||||
/* This is called *without* dev->slock held; please keep it that way */
|
/* This is called *without* dev->slock held; please keep it that way */
|
||||||
static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
|
static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
|
||||||
{
|
{
|
||||||
struct cx231xx_fh *fh = vq->priv_data;
|
struct cx231xx_fh *fh = vq->priv_data;
|
||||||
struct cx231xx *dev = fh->dev;
|
struct cx231xx *dev = fh->dev;
|
||||||
unsigned long flags = 0;
|
unsigned long flags = 0;
|
||||||
if (in_interrupt())
|
if (in_interrupt())
|
||||||
BUG();
|
BUG();
|
||||||
|
@ -208,7 +207,7 @@ static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
|
||||||
This should be safe; by the time we get here, the buffer isn't
|
This should be safe; by the time we get here, the buffer isn't
|
||||||
queued anymore. If we ever start marking the buffers as
|
queued anymore. If we ever start marking the buffers as
|
||||||
VIDEOBUF_ACTIVE, it won't be, though.
|
VIDEOBUF_ACTIVE, it won't be, though.
|
||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&dev->vbi_mode.slock, flags);
|
spin_lock_irqsave(&dev->vbi_mode.slock, flags);
|
||||||
if (dev->vbi_mode.isoc_ctl.buf == buf)
|
if (dev->vbi_mode.isoc_ctl.buf == buf)
|
||||||
dev->vbi_mode.isoc_ctl.buf = NULL;
|
dev->vbi_mode.isoc_ctl.buf = NULL;
|
||||||
|
@ -220,25 +219,26 @@ static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||||
enum v4l2_field field)
|
enum v4l2_field field)
|
||||||
{
|
{
|
||||||
struct cx231xx_fh *fh = vq->priv_data;
|
struct cx231xx_fh *fh = vq->priv_data;
|
||||||
struct cx231xx_buffer *buf = container_of(vb, struct cx231xx_buffer, vb);
|
struct cx231xx_buffer *buf =
|
||||||
struct cx231xx *dev = fh->dev;
|
container_of(vb, struct cx231xx_buffer, vb);
|
||||||
int rc = 0, urb_init = 0;
|
struct cx231xx *dev = fh->dev;
|
||||||
u32 height = 0;
|
int rc = 0, urb_init = 0;
|
||||||
|
u32 height = 0;
|
||||||
|
|
||||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
height = ((dev->norm & V4L2_STD_625_50) ?
|
||||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||||
buf->vb.size = ( (dev->width << 1) * height );
|
buf->vb.size = ((dev->width << 1) * height);
|
||||||
|
|
||||||
if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
|
if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
buf->vb.width = dev->width;
|
buf->vb.width = dev->width;
|
||||||
buf->vb.height = height;
|
buf->vb.height = height;
|
||||||
buf->vb.field = field;
|
buf->vb.field = field;
|
||||||
buf->vb.field = V4L2_FIELD_SEQ_TB;
|
buf->vb.field = V4L2_FIELD_SEQ_TB;
|
||||||
|
|
||||||
if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
|
if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
|
||||||
rc = videobuf_iolock(vq, &buf->vb, NULL);
|
rc = videobuf_iolock(vq, &buf->vb, NULL);
|
||||||
|
@ -251,8 +251,9 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||||
|
|
||||||
if (urb_init) {
|
if (urb_init) {
|
||||||
rc = cx231xx_init_vbi_isoc(dev, CX231XX_NUM_VBI_PACKETS,
|
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,
|
||||||
cx231xx_isoc_vbi_copy);
|
dev->vbi_mode.alt_max_pkt_size[0],
|
||||||
|
cx231xx_isoc_vbi_copy);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -260,7 +261,7 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
|
||||||
buf->vb.state = VIDEOBUF_PREPARED;
|
buf->vb.state = VIDEOBUF_PREPARED;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
free_buffer(vq, buf);
|
free_buffer(vq, buf);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -268,10 +269,11 @@ fail:
|
||||||
static void
|
static void
|
||||||
vbi_buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
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 =
|
||||||
struct cx231xx_fh *fh = vq->priv_data;
|
container_of(vb, struct cx231xx_buffer, vb);
|
||||||
struct cx231xx *dev = fh->dev;
|
struct cx231xx_fh *fh = vq->priv_data;
|
||||||
struct cx231xx_dmaqueue *vidq = &dev->vbi_mode.vidq;
|
struct cx231xx *dev = fh->dev;
|
||||||
|
struct cx231xx_dmaqueue *vidq = &dev->vbi_mode.vidq;
|
||||||
|
|
||||||
buf->vb.state = VIDEOBUF_QUEUED;
|
buf->vb.state = VIDEOBUF_QUEUED;
|
||||||
list_add_tail(&buf->vb.queue, &vidq->active);
|
list_add_tail(&buf->vb.queue, &vidq->active);
|
||||||
|
@ -279,29 +281,27 @@ vbi_buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vbi_buffer_release(struct videobuf_queue *vq,
|
static void vbi_buffer_release(struct videobuf_queue *vq,
|
||||||
struct videobuf_buffer *vb)
|
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;
|
struct cx231xx_fh *fh = vq->priv_data;
|
||||||
|
struct cx231xx *dev = (struct cx231xx *)fh->dev;
|
||||||
|
|
||||||
cx231xx_info(DRIVER_NAME "cx231xx: called vbi_buffer_release\n");
|
cx231xx_info(DRIVER_NAME "cx231xx: called vbi_buffer_release\n");
|
||||||
*/
|
*/
|
||||||
|
|
||||||
free_buffer(vq, buf);
|
free_buffer(vq, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct videobuf_queue_ops cx231xx_vbi_qops = {
|
struct videobuf_queue_ops cx231xx_vbi_qops = {
|
||||||
.buf_setup = vbi_buffer_setup,
|
.buf_setup = vbi_buffer_setup,
|
||||||
.buf_prepare = vbi_buffer_prepare,
|
.buf_prepare = vbi_buffer_prepare,
|
||||||
.buf_queue = vbi_buffer_queue,
|
.buf_queue = vbi_buffer_queue,
|
||||||
.buf_release = vbi_buffer_release,
|
.buf_release = vbi_buffer_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
/* ------------------------------------------------------------------
|
||||||
URB control
|
URB control
|
||||||
------------------------------------------------------------------*/
|
------------------------------------------------------------------*/
|
||||||
|
@ -311,23 +311,24 @@ struct videobuf_queue_ops cx231xx_vbi_qops = {
|
||||||
*/
|
*/
|
||||||
static void cx231xx_irq_vbi_callback(struct urb *urb)
|
static void cx231xx_irq_vbi_callback(struct urb *urb)
|
||||||
{
|
{
|
||||||
struct cx231xx_dmaqueue *dma_q = urb->context;
|
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 =
|
||||||
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||||
|
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
switch (urb->status) {
|
||||||
switch (urb->status) {
|
case 0: /* success */
|
||||||
case 0: /* success */
|
case -ETIMEDOUT: /* NAK */
|
||||||
case -ETIMEDOUT: /* NAK */
|
break;
|
||||||
break;
|
case -ECONNRESET: /* kill */
|
||||||
case -ECONNRESET: /* kill */
|
case -ENOENT:
|
||||||
case -ENOENT:
|
case -ESHUTDOWN:
|
||||||
case -ESHUTDOWN:
|
return;
|
||||||
return;
|
default: /* error */
|
||||||
default: /* error */
|
cx231xx_err(DRIVER_NAME "urb completition error %d.\n",
|
||||||
cx231xx_err(DRIVER_NAME "urb completition error %d.\n", urb->status);
|
urb->status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy data from URB */
|
/* Copy data from URB */
|
||||||
|
@ -341,7 +342,7 @@ static void cx231xx_irq_vbi_callback(struct urb *urb)
|
||||||
urb->status = usb_submit_urb(urb, GFP_ATOMIC);
|
urb->status = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
if (urb->status) {
|
if (urb->status) {
|
||||||
cx231xx_err(DRIVER_NAME "urb resubmit failed (error=%i)\n",
|
cx231xx_err(DRIVER_NAME "urb resubmit failed (error=%i)\n",
|
||||||
urb->status);
|
urb->status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,21 +354,23 @@ void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cx231xx_info(DRIVER_NAME "cx231xx: called cx231xx_uninit_vbi_isoc\n");
|
cx231xx_info(DRIVER_NAME "cx231xx: called cx231xx_uninit_vbi_isoc\n");
|
||||||
|
|
||||||
dev->vbi_mode.isoc_ctl.nfields = -1;
|
dev->vbi_mode.isoc_ctl.nfields = -1;
|
||||||
for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
|
for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
|
||||||
urb = dev->vbi_mode.isoc_ctl.urb[i];
|
urb = dev->vbi_mode.isoc_ctl.urb[i];
|
||||||
if (urb) {
|
if (urb) {
|
||||||
if (!irqs_disabled())
|
if (!irqs_disabled())
|
||||||
usb_kill_urb(urb);
|
usb_kill_urb(urb);
|
||||||
else
|
else
|
||||||
usb_unlink_urb(urb);
|
usb_unlink_urb(urb);
|
||||||
|
|
||||||
if (dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
|
if (dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
|
||||||
|
|
||||||
kfree(dev->vbi_mode.isoc_ctl.transfer_buffer[i]);
|
kfree(dev->vbi_mode.isoc_ctl.
|
||||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i] = NULL;
|
transfer_buffer[i]);
|
||||||
|
dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
|
||||||
|
NULL;
|
||||||
}
|
}
|
||||||
usb_free_urb(urb);
|
usb_free_urb(urb);
|
||||||
dev->vbi_mode.isoc_ctl.urb[i] = NULL;
|
dev->vbi_mode.isoc_ctl.urb[i] = NULL;
|
||||||
|
@ -384,14 +387,16 @@ void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
|
||||||
|
|
||||||
cx231xx_capture_start(dev, 0, Vbi);
|
cx231xx_capture_start(dev, 0, Vbi);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
|
EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate URBs and start IRQ
|
* Allocate URBs and start IRQ
|
||||||
*/
|
*/
|
||||||
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||||
int num_bufs, int max_pkt_size,
|
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;
|
struct cx231xx_dmaqueue *dma_q = &dev->vbi_mode.vidq;
|
||||||
int i;
|
int i;
|
||||||
|
@ -404,31 +409,33 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||||
/* De-allocates all pending stuff */
|
/* De-allocates all pending stuff */
|
||||||
cx231xx_uninit_vbi_isoc(dev);
|
cx231xx_uninit_vbi_isoc(dev);
|
||||||
|
|
||||||
/* clear if any halt */
|
/* 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.isoc_copy = isoc_copy;
|
||||||
dev->vbi_mode.isoc_ctl.num_bufs = num_bufs;
|
dev->vbi_mode.isoc_ctl.num_bufs = num_bufs;
|
||||||
dma_q->pos = 0;
|
dma_q->pos = 0;
|
||||||
dma_q->is_partial_line = 0;
|
dma_q->is_partial_line = 0;
|
||||||
dma_q->last_sav = 0;
|
dma_q->last_sav = 0;
|
||||||
dma_q->current_field = -1;
|
dma_q->current_field = -1;
|
||||||
dma_q->bytes_left_in_line = dev->width << 1;
|
dma_q->bytes_left_in_line = dev->width << 1;
|
||||||
dma_q->lines_per_field = ((dev->norm & V4L2_STD_625_50) ?
|
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;
|
dma_q->lines_completed = 0;
|
||||||
for(i = 0; i < 8 ; i++)
|
for (i = 0; i < 8; i++)
|
||||||
dma_q->partial_buf[i] = 0;
|
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) {
|
if (!dev->vbi_mode.isoc_ctl.urb) {
|
||||||
cx231xx_errdev("cannot alloc memory for usb buffers\n");
|
cx231xx_errdev("cannot alloc memory for usb buffers\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->vbi_mode.isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
|
dev->vbi_mode.isoc_ctl.transfer_buffer =
|
||||||
GFP_KERNEL);
|
kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
|
||||||
if (!dev->vbi_mode.isoc_ctl.transfer_buffer) {
|
if (!dev->vbi_mode.isoc_ctl.transfer_buffer) {
|
||||||
cx231xx_errdev("cannot allocate memory for usbtransfer\n");
|
cx231xx_errdev("cannot allocate memory for usbtransfer\n");
|
||||||
kfree(dev->vbi_mode.isoc_ctl.urb);
|
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);
|
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
if (!urb) {
|
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);
|
cx231xx_uninit_vbi_isoc(dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
dev->vbi_mode.isoc_ctl.urb[i] = urb;
|
dev->vbi_mode.isoc_ctl.urb[i] = urb;
|
||||||
urb->transfer_flags = 0;
|
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]) {
|
if (!dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
|
||||||
cx231xx_err(DRIVER_NAME ": unable to allocate %i bytes for transfer"
|
cx231xx_err(DRIVER_NAME
|
||||||
" buffer %i%s\n",
|
": unable to allocate %i bytes for transfer"
|
||||||
sb_size, i,
|
" buffer %i%s\n", sb_size, i,
|
||||||
in_interrupt()?" while in int":"");
|
in_interrupt()? " while in int" : "");
|
||||||
cx231xx_uninit_vbi_isoc(dev);
|
cx231xx_uninit_vbi_isoc(dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
pipe = usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr);
|
pipe = usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr);
|
||||||
usb_fill_bulk_urb(urb, dev->udev, pipe,
|
usb_fill_bulk_urb(urb, dev->udev, pipe,
|
||||||
dev->vbi_mode.isoc_ctl.transfer_buffer[i], sb_size,
|
dev->vbi_mode.isoc_ctl.transfer_buffer[i],
|
||||||
cx231xx_irq_vbi_callback, dma_q);
|
sb_size, cx231xx_irq_vbi_callback, dma_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&dma_q->wq);
|
init_waitqueue_head(&dma_q->wq);
|
||||||
|
@ -474,55 +483,58 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||||
for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
|
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);
|
rc = usb_submit_urb(dev->vbi_mode.isoc_ctl.urb[i], GFP_ATOMIC);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
cx231xx_err(DRIVER_NAME ": submit of urb %i failed (error=%i)\n", i,
|
cx231xx_err(DRIVER_NAME
|
||||||
rc);
|
": submit of urb %i failed (error=%i)\n", i,
|
||||||
|
rc);
|
||||||
cx231xx_uninit_vbi_isoc(dev);
|
cx231xx_uninit_vbi_isoc(dev);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cx231xx_capture_start(dev, 1, Vbi);
|
cx231xx_capture_start(dev, 1, Vbi);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(cx231xx_init_vbi_isoc);
|
EXPORT_SYMBOL_GPL(cx231xx_init_vbi_isoc);
|
||||||
|
|
||||||
|
u32 cx231xx_get_vbi_line(struct cx231xx * dev, struct cx231xx_dmaqueue * dma_q,
|
||||||
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 bytes_copied = 0;
|
u32 bytes_copied = 0;
|
||||||
int current_field = -1;
|
int current_field = -1;
|
||||||
|
|
||||||
switch(sav_eav) {
|
switch (sav_eav) {
|
||||||
|
|
||||||
case SAV_VBI_FIELD1:
|
case SAV_VBI_FIELD1:
|
||||||
current_field = 1;
|
current_field = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SAV_VBI_FIELD2:
|
case SAV_VBI_FIELD2:
|
||||||
current_field = 2;
|
current_field = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(current_field < 0 )
|
if (current_field < 0)
|
||||||
return bytes_copied;
|
return bytes_copied;
|
||||||
|
|
||||||
dma_q->last_sav = sav_eav;
|
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;
|
return bytes_copied;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Announces that a buffer were filled and request the next
|
* Announces that a buffer were filled and request the next
|
||||||
*/
|
*/
|
||||||
static inline void vbi_buffer_filled(struct cx231xx *dev,
|
static inline void vbi_buffer_filled(struct cx231xx *dev,
|
||||||
struct cx231xx_dmaqueue *dma_q,
|
struct cx231xx_dmaqueue *dma_q,
|
||||||
struct cx231xx_buffer *buf)
|
struct cx231xx_buffer *buf)
|
||||||
{
|
{
|
||||||
/* Advice that buffer was filled */
|
/* Advice that buffer was filled */
|
||||||
/* cx231xx_info(DRIVER_NAME "[%p/%d] wakeup\n", buf, buf->vb.i); */
|
/* cx231xx_info(DRIVER_NAME "[%p/%d] wakeup\n", buf, buf->vb.i); */
|
||||||
|
@ -537,80 +549,83 @@ static inline void vbi_buffer_filled(struct cx231xx *dev,
|
||||||
wake_up(&buf->vb.done);
|
wake_up(&buf->vb.done);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
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;
|
u32 bytes_to_copy;
|
||||||
struct cx231xx_buffer *buf;
|
struct cx231xx_buffer *buf;
|
||||||
u32 _line_size = dev->width * 2;
|
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);
|
cx231xx_reset_vbi_buffer(dev, dma_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the buffer pointer */
|
/* get the buffer pointer */
|
||||||
buf = dev->vbi_mode.isoc_ctl.buf;
|
buf = dev->vbi_mode.isoc_ctl.buf;
|
||||||
|
|
||||||
/* Remember the field number for next time */
|
/* Remember the field number for next time */
|
||||||
dma_q->current_field = field_number;
|
dma_q->current_field = field_number;
|
||||||
|
|
||||||
bytes_to_copy = dma_q->bytes_left_in_line;
|
bytes_to_copy = dma_q->bytes_left_in_line;
|
||||||
if(bytes_to_copy > length)
|
if (bytes_to_copy > length)
|
||||||
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->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 =
|
||||||
return 0;
|
(dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||||
}
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dma_q->is_partial_line = 1;
|
dma_q->is_partial_line = 1;
|
||||||
|
|
||||||
/* If we don't have a buffer, just return the number of bytes we would
|
/* If we don't have a buffer, just return the number of bytes we would
|
||||||
have copied if we had a buffer. */
|
have copied if we had a buffer. */
|
||||||
if(!buf) {
|
if (!buf) {
|
||||||
dma_q->bytes_left_in_line -= bytes_to_copy;
|
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 =
|
||||||
return bytes_to_copy;
|
(dma_q->bytes_left_in_line == 0) ? 0 : 1;
|
||||||
}
|
return bytes_to_copy;
|
||||||
|
}
|
||||||
|
|
||||||
/* copy the data to video buffer */
|
/* copy the data to video buffer */
|
||||||
cx231xx_do_vbi_copy(dev, dma_q, p_line, bytes_to_copy);
|
cx231xx_do_vbi_copy(dev, dma_q, p_line, bytes_to_copy);
|
||||||
|
|
||||||
dma_q->pos += bytes_to_copy;
|
dma_q->pos += bytes_to_copy;
|
||||||
dma_q->bytes_left_in_line -= 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->bytes_left_in_line = _line_size;
|
||||||
dma_q->lines_completed++;
|
dma_q->lines_completed++;
|
||||||
dma_q->is_partial_line = 0;
|
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);
|
vbi_buffer_filled(dev, dma_q, buf);
|
||||||
|
|
||||||
dma_q->pos = 0;
|
dma_q->pos = 0;
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
dma_q->lines_completed = 0;
|
dma_q->lines_completed = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes_to_copy;
|
return bytes_to_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* video-buf generic routine to get the next available buffer
|
* video-buf generic routine to get the next available buffer
|
||||||
*/
|
*/
|
||||||
static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
|
static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
|
||||||
struct cx231xx_buffer **buf)
|
struct cx231xx_buffer **buf)
|
||||||
{
|
{
|
||||||
struct cx231xx_video_mode *vmode = container_of(dma_q, struct cx231xx_video_mode, vidq);
|
struct cx231xx_video_mode *vmode =
|
||||||
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
container_of(dma_q, struct cx231xx_video_mode, vidq);
|
||||||
|
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
|
||||||
char *outp;
|
char *outp;
|
||||||
|
|
||||||
if (list_empty(&dma_q->active)) {
|
if (list_empty(&dma_q->active)) {
|
||||||
cx231xx_err(DRIVER_NAME ": No active queue to serve\n");
|
cx231xx_err(DRIVER_NAME ": No active queue to serve\n");
|
||||||
dev->vbi_mode.isoc_ctl.buf = NULL;
|
dev->vbi_mode.isoc_ctl.buf = NULL;
|
||||||
*buf = NULL;
|
*buf = NULL;
|
||||||
return;
|
return;
|
||||||
|
@ -628,66 +643,70 @@ static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
|
||||||
void cx231xx_reset_vbi_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q)
|
struct cx231xx_dmaqueue *dma_q)
|
||||||
{
|
{
|
||||||
struct cx231xx_buffer *buf;
|
struct cx231xx_buffer *buf;
|
||||||
|
|
||||||
buf = dev->vbi_mode.isoc_ctl.buf;
|
buf = dev->vbi_mode.isoc_ctl.buf;
|
||||||
|
|
||||||
if(buf == NULL) {
|
if (buf == NULL) {
|
||||||
|
|
||||||
/* first try to get the buffer */
|
/* first try to get the buffer */
|
||||||
get_next_vbi_buf(dma_q, &buf);
|
get_next_vbi_buf(dma_q, &buf);
|
||||||
|
|
||||||
dma_q->pos = 0;
|
dma_q->pos = 0;
|
||||||
dma_q->current_field = -1;
|
dma_q->current_field = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_q->bytes_left_in_line = dev->width << 1;
|
dma_q->bytes_left_in_line = dev->width << 1;
|
||||||
dma_q->lines_completed = 0;
|
dma_q->lines_completed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cx231xx_do_vbi_copy(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 *p_out_buffer = NULL;
|
u8 *p_out_buffer = NULL;
|
||||||
u32 current_line_bytes_copied = 0;
|
u32 current_line_bytes_copied = 0;
|
||||||
struct cx231xx_buffer *buf;
|
struct cx231xx_buffer *buf;
|
||||||
u32 _line_size = dev->width << 1;
|
u32 _line_size = dev->width << 1;
|
||||||
void *startwrite;
|
void *startwrite;
|
||||||
int offset, lencopy;
|
int offset, lencopy;
|
||||||
|
|
||||||
buf = dev->vbi_mode.isoc_ctl.buf;
|
buf = dev->vbi_mode.isoc_ctl.buf;
|
||||||
|
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p_out_buffer = videobuf_to_vmalloc(&buf->vb);
|
p_out_buffer = videobuf_to_vmalloc(&buf->vb);
|
||||||
|
|
||||||
if(dma_q->bytes_left_in_line != _line_size ) {
|
if (dma_q->bytes_left_in_line != _line_size) {
|
||||||
current_line_bytes_copied = _line_size - dma_q->bytes_left_in_line;
|
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 */
|
/* prepare destination address */
|
||||||
startwrite = p_out_buffer + offset;
|
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);
|
memcpy(startwrite, p_buffer, lencopy);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u8 cx231xx_is_vbi_buffer_done(struct cx231xx * dev,
|
||||||
u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,struct cx231xx_dmaqueue *dma_q)
|
struct cx231xx_dmaqueue * dma_q)
|
||||||
{
|
{
|
||||||
u32 height = 0;
|
u32 height = 0;
|
||||||
|
|
||||||
height = ((dev->norm & V4L2_STD_625_50) ?
|
height = ((dev->norm & V4L2_STD_625_50) ?
|
||||||
PAL_VBI_LINES : NTSC_VBI_LINES) ;
|
PAL_VBI_LINES : NTSC_VBI_LINES);
|
||||||
return (dma_q->lines_completed == height)?1:0;
|
return (dma_q->lines_completed == height) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
cx231xx_vbi.h - driver for Conexant Cx23100/101/102 USB video capture devices
|
cx231xx_vbi.h - driver for Conexant Cx23100/101/102 USB video capture devices
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on cx88 driver
|
Based on cx88 driver
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,8 +24,7 @@
|
||||||
|
|
||||||
extern struct videobuf_queue_ops cx231xx_vbi_qops;
|
extern struct videobuf_queue_ops cx231xx_vbi_qops;
|
||||||
|
|
||||||
|
#define NTSC_VBI_START_LINE 10 /* line 10 - 21 */
|
||||||
#define NTSC_VBI_START_LINE 10 /* line 10 - 21 */
|
|
||||||
#define NTSC_VBI_END_LINE 21
|
#define NTSC_VBI_END_LINE 21
|
||||||
#define NTSC_VBI_LINES (NTSC_VBI_END_LINE - NTSC_VBI_START_LINE + 1)
|
#define NTSC_VBI_LINES (NTSC_VBI_END_LINE - NTSC_VBI_START_LINE + 1)
|
||||||
|
|
||||||
|
@ -41,21 +40,24 @@ extern struct videobuf_queue_ops cx231xx_vbi_qops;
|
||||||
|
|
||||||
/* stream functions */
|
/* stream functions */
|
||||||
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||||
int num_bufs, int max_pkt_size,
|
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);
|
void cx231xx_uninit_vbi_isoc(struct cx231xx *dev);
|
||||||
|
|
||||||
/* vbi data copy functions */
|
/* vbi data copy functions */
|
||||||
u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
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,
|
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);
|
||||||
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);
|
||||||
|
|
||||||
int cx231xx_do_vbi_copy(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
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
||||||
cx231xx.h - driver for Conexant Cx23100/101/102 USB video capture devices
|
cx231xx.h - driver for Conexant Cx23100/101/102 USB video capture devices
|
||||||
|
|
||||||
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
|
||||||
Based on em28xx driver
|
Based on em28xx driver
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
|
|
||||||
/* Params for validated field */
|
/* Params for validated field */
|
||||||
#define CX231XX_BOARD_NOT_VALIDATED 1
|
#define CX231XX_BOARD_NOT_VALIDATED 1
|
||||||
#define CX231XX_BOARD_VALIDATED 0
|
#define CX231XX_BOARD_VALIDATED 0
|
||||||
|
|
||||||
/* maximum number of cx231xx boards */
|
/* maximum number of cx231xx boards */
|
||||||
#define CX231XX_MAXBOARDS 8
|
#define CX231XX_MAXBOARDS 8
|
||||||
|
@ -82,17 +82,14 @@
|
||||||
*/
|
*/
|
||||||
#define CX231XX_NUM_PACKETS 40
|
#define CX231XX_NUM_PACKETS 40
|
||||||
|
|
||||||
|
|
||||||
/* default alternate; 0 means choose the best */
|
/* default alternate; 0 means choose the best */
|
||||||
#define CX231XX_PINOUT 0
|
#define CX231XX_PINOUT 0
|
||||||
|
|
||||||
#define CX231XX_INTERLACED_DEFAULT 1
|
#define CX231XX_INTERLACED_DEFAULT 1
|
||||||
|
|
||||||
|
|
||||||
/* time to wait when stopping the isoc transfer */
|
/* time to wait when stopping the isoc transfer */
|
||||||
#define CX231XX_URB_TIMEOUT msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
|
#define CX231XX_URB_TIMEOUT msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
|
||||||
|
|
||||||
|
|
||||||
enum cx231xx_mode {
|
enum cx231xx_mode {
|
||||||
CX231XX_SUSPEND,
|
CX231XX_SUSPEND,
|
||||||
CX231XX_ANALOG_MODE,
|
CX231XX_ANALOG_MODE,
|
||||||
|
@ -113,47 +110,45 @@ enum cx231xx_stream_state {
|
||||||
struct cx231xx;
|
struct cx231xx;
|
||||||
|
|
||||||
struct cx231xx_usb_isoc_ctl {
|
struct cx231xx_usb_isoc_ctl {
|
||||||
/* max packet size of isoc transaction */
|
/* max packet size of isoc transaction */
|
||||||
int max_pkt_size;
|
int max_pkt_size;
|
||||||
|
|
||||||
/* number of allocated urbs */
|
/* number of allocated urbs */
|
||||||
int num_bufs;
|
int num_bufs;
|
||||||
|
|
||||||
/* urb for isoc transfers */
|
/* urb for isoc transfers */
|
||||||
struct urb **urb;
|
struct urb **urb;
|
||||||
|
|
||||||
/* transfer buffers for isoc transfer */
|
/* transfer buffers for isoc transfer */
|
||||||
char **transfer_buffer;
|
char **transfer_buffer;
|
||||||
|
|
||||||
/* Last buffer command and region */
|
/* Last buffer command and region */
|
||||||
u8 cmd;
|
u8 cmd;
|
||||||
int pos, size, pktsize;
|
int pos, size, pktsize;
|
||||||
|
|
||||||
/* Last field: ODD or EVEN? */
|
/* Last field: ODD or EVEN? */
|
||||||
int field;
|
int field;
|
||||||
|
|
||||||
/* Stores incomplete commands */
|
/* Stores incomplete commands */
|
||||||
u32 tmp_buf;
|
u32 tmp_buf;
|
||||||
int tmp_buf_len;
|
int tmp_buf_len;
|
||||||
|
|
||||||
/* Stores already requested buffers */
|
/* Stores already requested buffers */
|
||||||
struct cx231xx_buffer *buf;
|
struct cx231xx_buffer *buf;
|
||||||
|
|
||||||
/* Stores the number of received fields */
|
/* Stores the number of received fields */
|
||||||
int nfields;
|
int nfields;
|
||||||
|
|
||||||
/* isoc urb callback */
|
/* isoc urb callback */
|
||||||
int (*isoc_copy) (struct cx231xx *dev, struct urb *urb);
|
int (*isoc_copy) (struct cx231xx * dev, struct urb * urb);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct cx231xx_fmt {
|
struct cx231xx_fmt {
|
||||||
char *name;
|
char *name;
|
||||||
u32 fourcc; /* v4l2 format id */
|
u32 fourcc; /* v4l2 format id */
|
||||||
int depth;
|
int depth;
|
||||||
int reg;
|
int reg;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* buffer for one video frame */
|
/* buffer for one video frame */
|
||||||
|
@ -167,24 +162,23 @@ struct cx231xx_buffer {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cx231xx_dmaqueue {
|
struct cx231xx_dmaqueue {
|
||||||
struct list_head active;
|
struct list_head active;
|
||||||
struct list_head queued;
|
struct list_head queued;
|
||||||
|
|
||||||
wait_queue_head_t wq;
|
wait_queue_head_t wq;
|
||||||
|
|
||||||
/* Counters to control buffer fill */
|
/* Counters to control buffer fill */
|
||||||
int pos;
|
int pos;
|
||||||
u8 is_partial_line;
|
u8 is_partial_line;
|
||||||
u8 partial_buf[8];
|
u8 partial_buf[8];
|
||||||
u8 last_sav;
|
u8 last_sav;
|
||||||
int current_field;
|
int current_field;
|
||||||
u32 bytes_left_in_line;
|
u32 bytes_left_in_line;
|
||||||
u32 lines_completed;
|
u32 lines_completed;
|
||||||
u8 field1_done;
|
u8 field1_done;
|
||||||
u32 lines_per_field;
|
u32 lines_per_field;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* inputs */
|
/* inputs */
|
||||||
|
|
||||||
#define MAX_CX231XX_INPUT 4
|
#define MAX_CX231XX_INPUT 4
|
||||||
|
@ -193,35 +187,35 @@ enum cx231xx_itype {
|
||||||
CX231XX_VMUX_COMPOSITE1 = 1,
|
CX231XX_VMUX_COMPOSITE1 = 1,
|
||||||
CX231XX_VMUX_SVIDEO,
|
CX231XX_VMUX_SVIDEO,
|
||||||
CX231XX_VMUX_TELEVISION,
|
CX231XX_VMUX_TELEVISION,
|
||||||
CX231XX_VMUX_CABLE,
|
CX231XX_VMUX_CABLE,
|
||||||
CX231XX_RADIO,
|
CX231XX_RADIO,
|
||||||
CX231XX_VMUX_DVB,
|
CX231XX_VMUX_DVB,
|
||||||
CX231XX_VMUX_DEBUG
|
CX231XX_VMUX_DEBUG
|
||||||
};
|
};
|
||||||
|
|
||||||
enum cx231xx_v_input {
|
enum cx231xx_v_input {
|
||||||
CX231XX_VIN_1_1 = 0x1,
|
CX231XX_VIN_1_1 = 0x1,
|
||||||
CX231XX_VIN_2_1,
|
CX231XX_VIN_2_1,
|
||||||
CX231XX_VIN_3_1,
|
CX231XX_VIN_3_1,
|
||||||
CX231XX_VIN_4_1,
|
CX231XX_VIN_4_1,
|
||||||
CX231XX_VIN_1_2 = 0x01,
|
CX231XX_VIN_1_2 = 0x01,
|
||||||
CX231XX_VIN_2_2,
|
CX231XX_VIN_2_2,
|
||||||
CX231XX_VIN_3_2,
|
CX231XX_VIN_3_2,
|
||||||
CX231XX_VIN_1_3 = 0x1,
|
CX231XX_VIN_1_3 = 0x1,
|
||||||
CX231XX_VIN_2_3,
|
CX231XX_VIN_2_3,
|
||||||
CX231XX_VIN_3_3,
|
CX231XX_VIN_3_3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* cx231xx has two audio inputs: tuner and line in */
|
/* cx231xx has two audio inputs: tuner and line in */
|
||||||
enum cx231xx_amux {
|
enum cx231xx_amux {
|
||||||
/* This is the only entry for cx231xx tuner input */
|
/* 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 */
|
CX231XX_AMUX_LINE_IN, /* Line In */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cx231xx_reg_seq {
|
struct cx231xx_reg_seq {
|
||||||
unsigned char bit;
|
unsigned char bit;
|
||||||
unsigned char val;
|
unsigned char val;
|
||||||
int sleep;
|
int sleep;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -239,41 +233,40 @@ enum cx231xx_decoder {
|
||||||
CX231XX_AVDECODER
|
CX231XX_AVDECODER
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum _I2C_MASTER_PORT
|
typedef enum _I2C_MASTER_PORT {
|
||||||
{
|
I2C_0 = 0,
|
||||||
I2C_0 =0,
|
I2C_1 = 1,
|
||||||
I2C_1 =1,
|
I2C_2 = 2,
|
||||||
I2C_2 =2,
|
I2C_3 = 3
|
||||||
I2C_3 =3
|
} CX231XX_I2C_MASTER_PORT;
|
||||||
}CX231XX_I2C_MASTER_PORT;
|
|
||||||
|
|
||||||
struct cx231xx_board {
|
struct cx231xx_board {
|
||||||
char *name;
|
char *name;
|
||||||
int vchannels;
|
int vchannels;
|
||||||
int tuner_type;
|
int tuner_type;
|
||||||
int tuner_addr;
|
int tuner_addr;
|
||||||
v4l2_std_id norm; /* tv norm */
|
v4l2_std_id norm; /* tv norm */
|
||||||
|
|
||||||
/* demod related */
|
/* demod related */
|
||||||
int demod_addr;
|
int demod_addr;
|
||||||
u8 demod_xfer_mode; /* 0 - Serial; 1 - parallel */
|
u8 demod_xfer_mode; /* 0 - Serial; 1 - parallel */
|
||||||
|
|
||||||
/* GPIO Pins */
|
/* GPIO Pins */
|
||||||
struct cx231xx_reg_seq *dvb_gpio;
|
struct cx231xx_reg_seq *dvb_gpio;
|
||||||
struct cx231xx_reg_seq *suspend_gpio;
|
struct cx231xx_reg_seq *suspend_gpio;
|
||||||
struct cx231xx_reg_seq *tuner_gpio;
|
struct cx231xx_reg_seq *tuner_gpio;
|
||||||
u8 tuner_sif_gpio;
|
u8 tuner_sif_gpio;
|
||||||
u8 tuner_scl_gpio;
|
u8 tuner_scl_gpio;
|
||||||
u8 tuner_sda_gpio;
|
u8 tuner_sda_gpio;
|
||||||
|
|
||||||
/* PIN ctrl */
|
/* PIN ctrl */
|
||||||
u32 ctl_pin_status_mask;
|
u32 ctl_pin_status_mask;
|
||||||
u8 agc_analog_digital_select_gpio;
|
u8 agc_analog_digital_select_gpio;
|
||||||
u32 gpio_pin_status_mask;
|
u32 gpio_pin_status_mask;
|
||||||
|
|
||||||
/* i2c masters */
|
/* i2c masters */
|
||||||
u8 tuner_i2c_master;
|
u8 tuner_i2c_master;
|
||||||
u8 demod_i2c_master;
|
u8 demod_i2c_master;
|
||||||
|
|
||||||
unsigned int max_range_640_480:1;
|
unsigned int max_range_640_480:1;
|
||||||
unsigned int has_dvb:1;
|
unsigned int has_dvb:1;
|
||||||
|
@ -283,9 +276,9 @@ struct cx231xx_board {
|
||||||
|
|
||||||
enum cx231xx_decoder decoder;
|
enum cx231xx_decoder decoder;
|
||||||
|
|
||||||
struct cx231xx_input input[MAX_CX231XX_INPUT];
|
struct cx231xx_input input[MAX_CX231XX_INPUT];
|
||||||
struct cx231xx_input radio;
|
struct cx231xx_input radio;
|
||||||
IR_KEYTAB_TYPE *ir_codes;
|
IR_KEYTAB_TYPE *ir_codes;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* device states */
|
/* device states */
|
||||||
|
@ -295,22 +288,20 @@ enum cx231xx_dev_state {
|
||||||
DEV_MISCONFIGURED = 0x04,
|
DEV_MISCONFIGURED = 0x04,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AFE_MODE
|
enum AFE_MODE {
|
||||||
{
|
AFE_MODE_LOW_IF,
|
||||||
AFE_MODE_LOW_IF,
|
AFE_MODE_BASEBAND,
|
||||||
AFE_MODE_BASEBAND,
|
AFE_MODE_EU_HI_IF,
|
||||||
AFE_MODE_EU_HI_IF,
|
AFE_MODE_US_HI_IF,
|
||||||
AFE_MODE_US_HI_IF,
|
AFE_MODE_JAPAN_HI_IF
|
||||||
AFE_MODE_JAPAN_HI_IF
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AUDIO_INPUT
|
enum AUDIO_INPUT {
|
||||||
{
|
AUDIO_INPUT_MUTE,
|
||||||
AUDIO_INPUT_MUTE,
|
AUDIO_INPUT_LINE,
|
||||||
AUDIO_INPUT_LINE,
|
AUDIO_INPUT_TUNER_TV,
|
||||||
AUDIO_INPUT_TUNER_TV,
|
AUDIO_INPUT_SPDIF,
|
||||||
AUDIO_INPUT_SPDIF,
|
AUDIO_INPUT_TUNER_FM
|
||||||
AUDIO_INPUT_TUNER_FM
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CX231XX_AUDIO_BUFS 5
|
#define CX231XX_AUDIO_BUFS 5
|
||||||
|
@ -319,7 +310,6 @@ enum AUDIO_INPUT
|
||||||
#define CX231XX_STOP_AUDIO 0
|
#define CX231XX_STOP_AUDIO 0
|
||||||
#define CX231XX_START_AUDIO 1
|
#define CX231XX_START_AUDIO 1
|
||||||
|
|
||||||
|
|
||||||
/* cx231xx extensions */
|
/* cx231xx extensions */
|
||||||
#define CX231XX_AUDIO 0x10
|
#define CX231XX_AUDIO 0x10
|
||||||
#define CX231XX_DVB 0x20
|
#define CX231XX_DVB 0x20
|
||||||
|
@ -330,169 +320,167 @@ struct cx231xx_audio {
|
||||||
struct urb *urb[CX231XX_AUDIO_BUFS];
|
struct urb *urb[CX231XX_AUDIO_BUFS];
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
unsigned int capture_transfer_done;
|
unsigned int capture_transfer_done;
|
||||||
struct snd_pcm_substream *capture_pcm_substream;
|
struct snd_pcm_substream *capture_pcm_substream;
|
||||||
|
|
||||||
unsigned int hwptr_done_capture;
|
unsigned int hwptr_done_capture;
|
||||||
struct snd_card *sndcard;
|
struct snd_card *sndcard;
|
||||||
|
|
||||||
int users, shutdown;
|
int users, shutdown;
|
||||||
enum cx231xx_stream_state capture_stream;
|
enum cx231xx_stream_state capture_stream;
|
||||||
spinlock_t slock;
|
spinlock_t slock;
|
||||||
|
|
||||||
int alt; /* alternate */
|
int alt; /* alternate */
|
||||||
int max_pkt_size; /* max packet size of isoc transaction */
|
int max_pkt_size; /* max packet size of isoc transaction */
|
||||||
int num_alt; /* Number of alternative settings */
|
int num_alt; /* Number of alternative settings */
|
||||||
unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
|
unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
|
||||||
u16 end_point_addr;
|
u16 end_point_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cx231xx;
|
struct cx231xx;
|
||||||
|
|
||||||
struct cx231xx_fh {
|
struct cx231xx_fh {
|
||||||
struct cx231xx *dev;
|
struct cx231xx *dev;
|
||||||
unsigned int stream_on:1; /* Locks streams */
|
unsigned int stream_on:1; /* Locks streams */
|
||||||
int radio;
|
int radio;
|
||||||
|
|
||||||
struct videobuf_queue vb_vidq;
|
struct videobuf_queue vb_vidq;
|
||||||
|
|
||||||
enum v4l2_buf_type type;
|
enum v4l2_buf_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
/* set/get i2c */
|
/* set/get i2c */
|
||||||
#define I2C_SPEED_1M 0x0 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
#define I2C_SPEED_1M 0x0 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
||||||
#define I2C_SPEED_400K 0x1 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
#define I2C_SPEED_400K 0x1 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
||||||
#define I2C_SPEED_100K 0x2 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
#define I2C_SPEED_100K 0x2 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
||||||
#define I2C_SPEED_5M 0x3 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
#define I2C_SPEED_5M 0x3 /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
|
||||||
|
|
||||||
#define I2C_STOP 0x0 /* 0-- STOP transaction */
|
#define I2C_STOP 0x0 /* 0-- STOP transaction */
|
||||||
#define I2C_NOSTOP 0x1 /* 1-- do not transmit STOP at end of transaction */
|
#define I2C_NOSTOP 0x1 /* 1-- do not transmit STOP at end of transaction */
|
||||||
#define I2C_SYNC 0x1 /* 1--alllow slave to insert clock wait states */
|
#define I2C_SYNC 0x1 /* 1--alllow slave to insert clock wait states */
|
||||||
|
|
||||||
struct cx231xx_i2c {
|
struct cx231xx_i2c {
|
||||||
struct cx231xx *dev;
|
struct cx231xx *dev;
|
||||||
|
|
||||||
int nr;
|
int nr;
|
||||||
|
|
||||||
/* i2c i/o */
|
/* i2c i/o */
|
||||||
struct i2c_adapter i2c_adap;
|
struct i2c_adapter i2c_adap;
|
||||||
struct i2c_algo_bit_data i2c_algo;
|
struct i2c_algo_bit_data i2c_algo;
|
||||||
struct i2c_client i2c_client;
|
struct i2c_client i2c_client;
|
||||||
u32 i2c_rc;
|
u32 i2c_rc;
|
||||||
|
|
||||||
/* different settings for each bus */
|
/* different settings for each bus */
|
||||||
u8 i2c_period;
|
u8 i2c_period;
|
||||||
u8 i2c_nostop;
|
u8 i2c_nostop;
|
||||||
u8 i2c_reserve;
|
u8 i2c_reserve;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cx231xx_i2c_xfer_data{
|
struct cx231xx_i2c_xfer_data {
|
||||||
u8 dev_addr;
|
u8 dev_addr;
|
||||||
u8 direction; /* 1 - IN, 0 - OUT */
|
u8 direction; /* 1 - IN, 0 - OUT */
|
||||||
u8 saddr_len; /* sub address len */
|
u8 saddr_len; /* sub address len */
|
||||||
u16 saddr_dat; /* sub addr data */
|
u16 saddr_dat; /* sub addr data */
|
||||||
u8 buf_size; /* buffer size */
|
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;
|
||||||
u8 bRequest;
|
u16 wValue;
|
||||||
u16 wValue;
|
u16 wIndex;
|
||||||
u16 wIndex;
|
u16 wLength;
|
||||||
u16 wLength;
|
u8 direction;
|
||||||
u8 direction;
|
u8 bData;
|
||||||
u8 bData;
|
u8 *pBuff;
|
||||||
u8 *pBuff;
|
|
||||||
} VENDOR_REQUEST_IN, *PVENDOR_REQUEST_IN;
|
} VENDOR_REQUEST_IN, *PVENDOR_REQUEST_IN;
|
||||||
|
|
||||||
struct cx231xx_ctrl {
|
struct cx231xx_ctrl {
|
||||||
struct v4l2_queryctrl v;
|
struct v4l2_queryctrl v;
|
||||||
u32 off;
|
u32 off;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
u32 mask;
|
u32 mask;
|
||||||
u32 shift;
|
u32 shift;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum{
|
typedef enum {
|
||||||
Raw_Video = 0,
|
Raw_Video = 0,
|
||||||
Audio,
|
Audio,
|
||||||
Vbi, /* VANC */
|
Vbi, /* VANC */
|
||||||
Sliced_cc, /* HANC */
|
Sliced_cc, /* HANC */
|
||||||
TS1_serial_mode,
|
TS1_serial_mode,
|
||||||
TS2,
|
TS2,
|
||||||
TS1_parallel_mode
|
TS1_parallel_mode
|
||||||
}TRANSFER_TYPE;
|
} TRANSFER_TYPE;
|
||||||
|
|
||||||
struct cx231xx_video_mode {
|
struct cx231xx_video_mode {
|
||||||
/* Isoc control struct */
|
/* Isoc control struct */
|
||||||
struct cx231xx_dmaqueue vidq;
|
struct cx231xx_dmaqueue vidq;
|
||||||
struct cx231xx_usb_isoc_ctl isoc_ctl;
|
struct cx231xx_usb_isoc_ctl isoc_ctl;
|
||||||
spinlock_t slock;
|
spinlock_t slock;
|
||||||
|
|
||||||
/* usb transfer */
|
/* usb transfer */
|
||||||
int alt; /* alternate */
|
int alt; /* alternate */
|
||||||
int max_pkt_size; /* max packet size of isoc transaction */
|
int max_pkt_size; /* max packet size of isoc transaction */
|
||||||
int num_alt; /* Number of alternative settings */
|
int num_alt; /* Number of alternative settings */
|
||||||
unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
|
unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
|
||||||
u16 end_point_addr;
|
u16 end_point_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* main device struct */
|
/* main device struct */
|
||||||
struct cx231xx {
|
struct cx231xx {
|
||||||
/* generic device properties */
|
/* generic device properties */
|
||||||
char name[30]; /* name (including minor) of the device */
|
char name[30]; /* name (including minor) of the device */
|
||||||
int model; /* index in the device_data struct */
|
int model; /* index in the device_data struct */
|
||||||
int devno; /* marks the number of this device */
|
int devno; /* marks the number of this device */
|
||||||
|
|
||||||
struct cx231xx_board board;
|
struct cx231xx_board board;
|
||||||
|
|
||||||
unsigned int stream_on:1; /* Locks streams */
|
unsigned int stream_on:1; /* Locks streams */
|
||||||
unsigned int vbi_stream_on:1; /* Locks streams for VBI */
|
unsigned int vbi_stream_on:1; /* Locks streams for VBI */
|
||||||
unsigned int has_audio_class:1;
|
unsigned int has_audio_class:1;
|
||||||
unsigned int has_alsa_audio:1;
|
unsigned int has_alsa_audio:1;
|
||||||
|
|
||||||
struct cx231xx_fmt *format;
|
struct cx231xx_fmt *format;
|
||||||
|
|
||||||
struct cx231xx_IR *ir;
|
struct cx231xx_IR *ir;
|
||||||
|
|
||||||
struct list_head devlist;
|
struct list_head devlist;
|
||||||
|
|
||||||
int tuner_type; /* type of the tuner */
|
int tuner_type; /* type of the tuner */
|
||||||
int tuner_addr; /* tuner address */
|
int tuner_addr; /* tuner address */
|
||||||
|
|
||||||
/* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
|
/* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
|
||||||
struct cx231xx_i2c i2c_bus[3];
|
struct cx231xx_i2c i2c_bus[3];
|
||||||
unsigned int xc_fw_load_done:1;
|
unsigned int xc_fw_load_done:1;
|
||||||
struct mutex gpio_i2c_lock;
|
struct mutex gpio_i2c_lock;
|
||||||
|
|
||||||
/* video for linux */
|
/* video for linux */
|
||||||
int users; /* user count for exclusive use */
|
int users; /* user count for exclusive use */
|
||||||
struct video_device *vdev; /* video for linux device struct */
|
struct video_device *vdev; /* video for linux device struct */
|
||||||
v4l2_std_id norm; /* selected tv norm */
|
v4l2_std_id norm; /* selected tv norm */
|
||||||
int ctl_freq; /* selected frequency */
|
int ctl_freq; /* selected frequency */
|
||||||
unsigned int ctl_ainput; /* selected audio input */
|
unsigned int ctl_ainput; /* selected audio input */
|
||||||
int mute;
|
int mute;
|
||||||
int volume;
|
int volume;
|
||||||
|
|
||||||
/* frame properties */
|
/* frame properties */
|
||||||
int width; /* current frame width */
|
int width; /* current frame width */
|
||||||
int height; /* current frame height */
|
int height; /* current frame height */
|
||||||
unsigned hscale; /* horizontal scale factor (see datasheet) */
|
unsigned hscale; /* horizontal scale factor (see datasheet) */
|
||||||
unsigned vscale; /* vertical scale factor (see datasheet) */
|
unsigned vscale; /* vertical scale factor (see datasheet) */
|
||||||
int interlaced; /* 1=interlace fileds, 0=just top fileds */
|
int interlaced; /* 1=interlace fileds, 0=just top fileds */
|
||||||
|
|
||||||
struct cx231xx_audio adev;
|
struct cx231xx_audio adev;
|
||||||
|
|
||||||
/* states */
|
/* states */
|
||||||
enum cx231xx_dev_state state;
|
enum cx231xx_dev_state state;
|
||||||
|
|
||||||
struct work_struct request_module_wk;
|
struct work_struct request_module_wk;
|
||||||
|
|
||||||
/* locks */
|
/* locks */
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct mutex ctrl_urb_lock; /* protects urb_buf */
|
struct mutex ctrl_urb_lock; /* protects urb_buf */
|
||||||
struct list_head inqueue, outqueue;
|
struct list_head inqueue, outqueue;
|
||||||
wait_queue_head_t open, wait_frame, wait_stream;
|
wait_queue_head_t open, wait_frame, wait_stream;
|
||||||
struct video_device *vbi_dev;
|
struct video_device *vbi_dev;
|
||||||
|
@ -500,54 +488,56 @@ struct cx231xx {
|
||||||
|
|
||||||
unsigned char eedata[256];
|
unsigned char eedata[256];
|
||||||
|
|
||||||
struct cx231xx_video_mode video_mode;
|
struct cx231xx_video_mode video_mode;
|
||||||
struct cx231xx_video_mode vbi_mode;
|
struct cx231xx_video_mode vbi_mode;
|
||||||
struct cx231xx_video_mode sliced_cc_mode;
|
struct cx231xx_video_mode sliced_cc_mode;
|
||||||
struct cx231xx_video_mode ts1_mode;
|
struct cx231xx_video_mode ts1_mode;
|
||||||
|
|
||||||
struct usb_device *udev; /* the usb device */
|
|
||||||
char urb_buf[URB_MAX_CTRL_SIZE];/* urb control msg buffer */
|
|
||||||
|
|
||||||
|
struct usb_device *udev; /* the usb device */
|
||||||
|
char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */
|
||||||
|
|
||||||
/* helper funcs that call usb_control_msg */
|
/* 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,
|
|
||||||
char *buf, int len);
|
char *buf, int len);
|
||||||
int (*cx231xx_send_usb_command)(struct cx231xx_i2c *i2c_bus,
|
int (*cx231xx_write_ctrl_reg) (struct cx231xx * dev, u8 req, u16 reg,
|
||||||
struct cx231xx_i2c_xfer_data *req_data);
|
char *buf, int len);
|
||||||
int (*cx231xx_gpio_i2c_read)(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
int (*cx231xx_send_usb_command) (struct cx231xx_i2c * i2c_bus,
|
||||||
int (*cx231xx_gpio_i2c_write)(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len);
|
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_set_analog_freq) (struct cx231xx * dev, u32 freq);
|
||||||
int (*cx231xx_reset_analog_tuner)(struct cx231xx *dev) ;
|
int (*cx231xx_reset_analog_tuner) (struct cx231xx * dev);
|
||||||
|
|
||||||
enum cx231xx_mode mode;
|
enum cx231xx_mode mode;
|
||||||
|
|
||||||
struct cx231xx_dvb *dvb;
|
struct cx231xx_dvb *dvb;
|
||||||
|
|
||||||
/* Cx231xx supported PCB config's */
|
/* Cx231xx supported PCB config's */
|
||||||
struct pcb_config current_pcb_config;
|
struct pcb_config current_pcb_config;
|
||||||
u8 current_scenario_idx;
|
u8 current_scenario_idx;
|
||||||
u8 interface_count;
|
u8 interface_count;
|
||||||
u8 max_iad_interface_count;
|
u8 max_iad_interface_count;
|
||||||
|
|
||||||
/* GPIO related register direction and values */
|
/* GPIO related register direction and values */
|
||||||
u32 gpio_dir;
|
u32 gpio_dir;
|
||||||
u32 gpio_val;
|
u32 gpio_val;
|
||||||
|
|
||||||
/* Power Modes */
|
/* Power Modes */
|
||||||
int power_mode;
|
int power_mode;
|
||||||
|
|
||||||
/* colibri parameters */
|
/* colibri parameters */
|
||||||
enum AFE_MODE colibri_mode;
|
enum AFE_MODE colibri_mode;
|
||||||
u32 colibri_ref_count;
|
u32 colibri_ref_count;
|
||||||
|
|
||||||
/* video related parameters */
|
/* video related parameters */
|
||||||
u32 video_input;
|
u32 video_input;
|
||||||
u32 active_mode;
|
u32 active_mode;
|
||||||
u8 vbi_or_sliced_cc_mode; /* 0 - vbi ; 1 - sliced cc mode */
|
u8 vbi_or_sliced_cc_mode; /* 0 - vbi ; 1 - sliced cc mode */
|
||||||
enum cx231xx_std_mode std_mode; /* 0 - Air; 1 - cable */
|
enum cx231xx_std_mode std_mode; /* 0 - Air; 1 - cable */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -555,29 +545,31 @@ struct cx231xx_ops {
|
||||||
struct list_head next;
|
struct list_head next;
|
||||||
char *name;
|
char *name;
|
||||||
int id;
|
int id;
|
||||||
int (*init)(struct cx231xx *);
|
int (*init) (struct cx231xx *);
|
||||||
int (*fini)(struct cx231xx *);
|
int (*fini) (struct cx231xx *);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* call back functions in dvb module */
|
/* call back functions in dvb module */
|
||||||
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq ) ;
|
int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq);
|
||||||
int cx231xx_reset_analog_tuner(struct cx231xx *dev) ;
|
int cx231xx_reset_analog_tuner(struct cx231xx *dev);
|
||||||
|
|
||||||
/* Provided by cx231xx-i2c.c */
|
/* 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);
|
void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c);
|
||||||
int cx231xx_i2c_register(struct cx231xx_i2c *bus);
|
int cx231xx_i2c_register(struct cx231xx_i2c *bus);
|
||||||
int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
|
int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
|
||||||
|
|
||||||
/* Internal block control functions */
|
/* Internal block control functions */
|
||||||
int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr,
|
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,
|
int cx231xx_write_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_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size, u16 register_address,
|
int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
|
||||||
u8 bit_start,u8 bit_end, u32 value);
|
u16 register_address, u8 bit_start, u8 bit_end,
|
||||||
|
u32 value);
|
||||||
int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
|
int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
|
||||||
u16 saddr, u32 mask, u32 value);
|
u16 saddr, u32 mask, u32 value);
|
||||||
u32 cx231xx_set_field(u32 field_mask, u32 data);
|
u32 cx231xx_set_field(u32 field_mask, u32 data);
|
||||||
|
|
||||||
/* Colibri related functions */
|
/* Colibri related functions */
|
||||||
|
@ -596,23 +588,26 @@ int cx231xx_flatiron_set_audio_input(struct cx231xx *dev, u8 audio_input);
|
||||||
|
|
||||||
/* DIF related functions */
|
/* DIF related functions */
|
||||||
int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
|
int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
|
||||||
u32 function_mode, u32 standard);
|
u32 function_mode, u32 standard);
|
||||||
int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard);
|
int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard);
|
||||||
int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
|
int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
|
||||||
int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
|
int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
|
||||||
|
|
||||||
/* video parser functions */
|
/* video parser functions */
|
||||||
u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, u32 *p_bytes_used);
|
u8 cx231xx_find_next_SAV_EAV(u8 * p_buffer, u32 buffer_size,
|
||||||
u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf, u32 *p_bytes_used);
|
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,
|
int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||||
u8 *p_buffer, u32 bytes_to_copy);
|
u8 * p_buffer, u32 bytes_to_copy);
|
||||||
void cx231xx_reset_video_buffer(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
|
void cx231xx_reset_video_buffer(struct cx231xx *dev,
|
||||||
u8 cx231xx_is_buffer_done(struct cx231xx *dev,struct cx231xx_dmaqueue *dma_q);
|
struct cx231xx_dmaqueue *dma_q);
|
||||||
u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
|
||||||
u8 *p_line, u32 length, int field_number);
|
u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||||
u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
u8 * p_line, u32 length, int field_number);
|
||||||
u8 sav_eav, u8 *p_buffer, u32 buffer_size);
|
u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
|
||||||
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 */
|
/* Provided by cx231xx-core.c */
|
||||||
|
|
||||||
|
@ -622,46 +617,49 @@ void cx231xx_release_buffers(struct cx231xx *dev);
|
||||||
|
|
||||||
/* read from control pipe */
|
/* read from control pipe */
|
||||||
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);
|
char *buf, int len);
|
||||||
|
|
||||||
/* write to control pipe */
|
/* write to control pipe */
|
||||||
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);
|
char *buf, int len);
|
||||||
int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode);
|
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,
|
int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
|
||||||
struct cx231xx_i2c_xfer_data *req_data);
|
struct cx231xx_i2c_xfer_data *req_data);
|
||||||
|
|
||||||
/* Gpio related functions */
|
/* 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);
|
u8 len, u8 request, u8 direction);
|
||||||
int cx231xx_set_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_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_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_start(struct cx231xx *dev);
|
||||||
int cx231xx_gpio_i2c_end(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_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_read_ack(struct cx231xx *dev);
|
||||||
int cx231xx_gpio_i2c_write_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_write_nak(struct cx231xx *dev);
|
||||||
|
|
||||||
int cx231xx_gpio_i2c_read(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);
|
int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len);
|
||||||
|
|
||||||
/* audio related functions */
|
/* 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_capture_start(struct cx231xx *dev, int start, u8 media_type);
|
||||||
int cx231xx_resolution_set(struct cx231xx *dev);
|
int cx231xx_resolution_set(struct cx231xx *dev);
|
||||||
int cx231xx_set_video_alternate(struct cx231xx *dev);
|
int cx231xx_set_video_alternate(struct cx231xx *dev);
|
||||||
int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
|
int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
|
||||||
int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||||
int num_bufs, int max_pkt_size,
|
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);
|
void cx231xx_uninit_isoc(struct cx231xx *dev);
|
||||||
int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
|
int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
|
||||||
int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
|
int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
|
||||||
|
@ -673,7 +671,7 @@ int cx231xx_register_analog_devices(struct cx231xx *dev);
|
||||||
void cx231xx_remove_from_devlist(struct cx231xx *dev);
|
void cx231xx_remove_from_devlist(struct cx231xx *dev);
|
||||||
void cx231xx_add_into_devlist(struct cx231xx *dev);
|
void cx231xx_add_into_devlist(struct cx231xx *dev);
|
||||||
struct cx231xx *cx231xx_get_device(int minor,
|
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);
|
||||||
void cx231xx_init_extension(struct cx231xx *dev);
|
void cx231xx_init_extension(struct cx231xx *dev);
|
||||||
void cx231xx_close_extension(struct cx231xx *dev);
|
void cx231xx_close_extension(struct cx231xx *dev);
|
||||||
|
|
||||||
|
@ -695,7 +693,8 @@ int cx231xx_power_suspend(struct cx231xx *dev);
|
||||||
|
|
||||||
/* chip specific control functions */
|
/* chip specific control functions */
|
||||||
int cx231xx_init_ctrl_pin_status(struct cx231xx *dev);
|
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);
|
int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex);
|
||||||
|
|
||||||
/* video audio decoder related functions */
|
/* video audio decoder related functions */
|
||||||
|
@ -705,8 +704,8 @@ int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input);
|
||||||
int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev);
|
int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev);
|
||||||
int cx231xx_set_audio_input(struct cx231xx *dev, u8 input);
|
int cx231xx_set_audio_input(struct cx231xx *dev, u8 input);
|
||||||
void get_scale(struct cx231xx *dev,
|
void get_scale(struct cx231xx *dev,
|
||||||
unsigned int width, unsigned int height,
|
unsigned int width, unsigned int height,
|
||||||
unsigned int *hscale, unsigned int *vscale);
|
unsigned int *hscale, unsigned int *vscale);
|
||||||
|
|
||||||
/* Provided by cx231xx-video.c */
|
/* Provided by cx231xx-video.c */
|
||||||
int cx231xx_register_extension(struct cx231xx_ops *dev);
|
int cx231xx_register_extension(struct cx231xx_ops *dev);
|
||||||
|
@ -743,7 +742,6 @@ int cx231xx_ir_fini(struct cx231xx *dev);
|
||||||
printk(KERN_WARNING "%s: "fmt,\
|
printk(KERN_WARNING "%s: "fmt,\
|
||||||
dev->name , ##arg); } while (0)
|
dev->name , ##arg); } while (0)
|
||||||
|
|
||||||
|
|
||||||
static inline unsigned int norm_maxw(struct cx231xx *dev)
|
static inline unsigned int norm_maxw(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
if (dev->board.max_range_640_480)
|
if (dev->board.max_range_640_480)
|
||||||
|
|
Loading…
Reference in New Issue