static unsigned debug;
#define marucam_err(fmt, arg...) \
- printk(KERN_ERR "marucam[%s] : " fmt, __func__, ##arg)
+ printk(KERN_ERR "[ERR]marucam[%s]: " fmt, __func__, ##arg)
#define marucam_warn(fmt, arg...) \
- printk(KERN_WARNING "marucam[%s] : " fmt, __func__, ##arg)
+ printk(KERN_WARNING "[WARN]marucam[%s]: " fmt, __func__, ##arg)
#define marucam_info(fmt, arg...) \
- printk(KERN_INFO "marucam[%s] : " fmt, __func__, ##arg)
+ printk(KERN_INFO "[INFO]marucam[%s]: " fmt, __func__, ##arg)
#define marucam_dbg(level, fmt, arg...) \
do { \
- if (debug >= (level)) \
- printk(KERN_DEBUG "marucam[%s] : " fmt, \
+ if (debug >= (level)) { \
+ printk(KERN_DEBUG "[DBG]marucam[%s]: " fmt, \
__func__, ##arg); \
+ } \
} while (0)
#define MARUCAM_MODULE_NAME "marucam"
#define MAGIC_CHECK(is, should) \
do { \
if (unlikely((is) != (should))) { \
- marucam_err("magic mismatch: %x (expected %x)\n", \
- is, should); \
+ marucam_err("Invalid the magic number:" \
+ " %x (expected %x)\n", is, should); \
BUG(); \
} \
} while (0)
mutex_lock(&q->vb_lock);
- if (q->streaming)
+ if (q->streaming) {
videobuf_queue_cancel(q);
+ }
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
- if (NULL == q->bufs[i])
+ if (NULL == q->bufs[i]) {
continue;
+ }
- if (q->bufs[i]->map != map)
+ if (q->bufs[i]->map != map) {
continue;
+ }
mem = q->bufs[i]->priv;
if (mem) {
vb = kzalloc(size + sizeof(*mem), GFP_KERNEL);
if (vb == NULL) {
- marucam_err("failed to memalloc\n");
+ marucam_err("Failed to allocate the video buffer\n");
return vb;
}
map = kzalloc(sizeof(struct videobuf_mapping), GFP_KERNEL);
if (NULL == map) {
- marucam_err("failed to memalloc\n");
+ marucam_err("Failed to allocate the video buffer map\n");
return -ENOMEM;
}
+ vma->vm_pgoff) >> PAGE_SHIFT,
pages, vma->vm_page_prot);
if (retval < 0) {
- marucam_err("remap failed with error %d.", retval);
+ marucam_err("Failed to remap with error: %d", retval);
mem->mapped = 0;
- goto error;
+ mem = NULL;
+ kfree(map);
+ return -ENOMEM;
}
vma->vm_ops = &videobuf_vm_ops;
videobuf_vm_open(vma);
return 0;
-
-error:
- mem = NULL;
- kfree(map);
- return -ENOMEM;
}
static struct videobuf_qtype_ops qops = {
spin_lock_irqsave(q->irqlock, flags);
if (dev->opstate != S_RUNNING) {
- marucam_err("state is not S_RUNNING\n");
- goto done;
+ marucam_err("The device state is not S_RUNNING\n");
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return;
}
if (list_empty(&dev->active)) {
- marucam_err("list_empty failed\n");
- goto done;
+ marucam_err("The active list is empty\n");
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return;
}
buf = list_entry(dev->active.next, struct videobuf_buffer, queue);
if (!waitqueue_active(&buf->done)) {
- marucam_err("waitqueue_active failed\n");
- goto done;
+ marucam_err("The list of wait queue is empty\n");
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return;
}
list_del(&buf->queue);
if (isr & 0x08) {
- marucam_err("device state is invalid\n");
+ marucam_err("The device state is invalid\n");
buf->state = 0xFF; /* invalid state */
} else {
- marucam_dbg(2, "video buffer is filled\n");
+ marucam_dbg(2, "The video buffer is filled\n");
buf->state = VIDEOBUF_DONE;
}
do_gettimeofday(&buf->ts);
buf->field_count++;
wake_up_interruptible(&buf->done);
-
-done:
spin_unlock_irqrestore(q->irqlock, flags);
}
isr = ioread32(dev->mmregs + MARUCAM_ISR);
if (!isr) {
- marucam_dbg(1, "this irq is not for this module\n");
+ marucam_dbg(1, "This irq is not for this module\n");
return IRQ_NONE;
}
struct v4l2_fmtdesc *f)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
- if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return -EINVAL;
+ }
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(f->index, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_ENUM_FMT);
- ret = ioread32(dev->mmregs + MARUCAM_ENUM_FMT);
- if (ret > 0) {
+ ret = (int)ioread32(dev->mmregs + MARUCAM_ENUM_FMT);
+ if (ret) {
mutex_unlock(&dev->mlock);
- return (int)(-ret);
+ return -ret;
}
f->index = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_format *f)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(0, dev->mmregs + MARUCAM_G_FMT);
- ret = ioread32(dev->mmregs + MARUCAM_G_FMT);
- if (ret > 0) {
- marucam_err("MARUCAM_G_FMT failed with error %d.", -ret);
- mutex_unlock(&dev->mlock);
- return (int)(-ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_G_FMT);
+ if (ret) {
+ marucam_err("MARUCAM_G_FMT failed with error %d.", -ret);
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
f->fmt.pix.width = ioread32(dev->mmregs + MARUCAM_G_DATA);
f->fmt.pix.height = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_format *f)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(f->fmt.pix.field, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_TRY_FMT);
- ret = ioread32(dev->mmregs + MARUCAM_TRY_FMT);
- if (ret > 0) {
- marucam_err("MARUCAM_TRY_FMT failed with error %d.", -ret);
- mutex_unlock(&dev->mlock);
- return (int)(-ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_TRY_FMT);
+ if (ret) {
+ marucam_err("MARUCAM_TRY_FMT failed with error %d.", -ret);
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
f->fmt.pix.width = ioread32(dev->mmregs + MARUCAM_G_DATA);
f->fmt.pix.height = ioread32(dev->mmregs + MARUCAM_G_DATA);
{
struct marucam_device *dev = priv;
struct videobuf_queue *q = &dev->vb_vidq;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
if (dev->opstate != S_IDLE) {
iowrite32(f->fmt.pix.field, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_S_FMT);
- ret = ioread32(dev->mmregs + MARUCAM_S_FMT);
- if (ret > 0) {
+ ret = (int)ioread32(dev->mmregs + MARUCAM_S_FMT);
+ if (ret) {
marucam_err("MARUCAM_S_FMT failed with error %d.", -ret);
mutex_unlock(&dev->mlock);
- return (int)(-ret);
+ return -ret;
}
f->fmt.pix.width = ioread32(dev->mmregs + MARUCAM_G_DATA);
dev->type = p->type;
ret = videobuf_reqbufs(&dev->vb_vidq, p);
- if (ret < 0)
+ if (ret) {
marucam_err("failed to videobuf_reqbufs\n");
+ }
return ret;
}
struct marucam_device *dev = priv;
ret = videobuf_querybuf(&dev->vb_vidq, p);
- if (ret < 0)
+ if (ret) {
marucam_err("failed to videobuf_querybuf\n");
+ }
return ret;
}
struct marucam_device *dev = priv;
ret = videobuf_qbuf(&dev->vb_vidq, p);
- if (ret < 0)
+ if (ret) {
marucam_err("failed to videobuf_qbuf\n");
+ }
return ret;
}
struct marucam_device *dev = priv;
ret = videobuf_dqbuf(&dev->vb_vidq, p, file->f_flags & O_NONBLOCK);
- if (ret < 0)
+ if (ret) {
marucam_err("failed to videobuf_dqbuf\n");
+ }
return ret;
}
int ret = 0;
struct marucam_device *dev = priv;
- if (dev->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (dev->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return -EINVAL;
- if (i != dev->type)
+ }
+ if (i != dev->type) {
return -EINVAL;
+ }
mutex_lock(&dev->mlock);
if (dev->opstate != S_IDLE) {
int ret = 0;
struct marucam_device *dev = priv;
- if (dev->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (dev->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return -EINVAL;
- if (i != dev->type)
+ }
+ if (i != dev->type) {
return -EINVAL;
+ }
mutex_lock(&dev->mlock);
if (dev->opstate != S_RUNNING) {
static int vidioc_enum_input(struct file *file, void *priv,
struct v4l2_input *inp)
{
- if (inp->index != 0)
+ if (inp->index != 0) {
return -EINVAL;
+ }
inp->type = V4L2_INPUT_TYPE_CAMERA;
sprintf(inp->name, "MARU Virtual Camera %u", inp->index);
struct v4l2_queryctrl *qc)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
+ switch (qc->id) {
+ /* we only support followed items. */
+ case V4L2_CID_BRIGHTNESS:
+ case V4L2_CID_CONTRAST:
+ case V4L2_CID_SATURATION:
+ case V4L2_CID_SHARPNESS:
+ break;
+ default:
+ return -EINVAL;
+ }
+
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(qc->id, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_QCTRL);
- ret = ioread32(dev->mmregs + MARUCAM_QCTRL);
- if (ret > 0) {
+ ret = (int)ioread32(dev->mmregs + MARUCAM_QCTRL);
+ if (ret) {
mutex_unlock(&dev->mlock);
- return -(ret);
+ return -ret;
}
qc->id = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_control *ctrl)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(ctrl->id, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_G_CTRL);
- ret = ioread32(dev->mmregs + MARUCAM_G_CTRL);
-
- if (ret > 0) {
+ ret = (int)ioread32(dev->mmregs + MARUCAM_G_CTRL);
+ if (ret) {
marucam_err("MARUCAM_G_CTRL failed!\n");
mutex_unlock(&dev->mlock);
- return -(ret);
+ return -ret;
}
ctrl->value = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_control *ctrl)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(ctrl->value, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_S_CTRL);
- ret = ioread32(dev->mmregs + MARUCAM_S_CTRL);
- if (ret > 0) {
- marucam_err("MARUCAM_S_CTRL failed!\n");
- mutex_unlock(&dev->mlock);
- return -(ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_S_CTRL);
+ if (ret) {
+ marucam_err("MARUCAM_S_CTRL failed!\n");
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
mutex_unlock(&dev->mlock);
return 0;
{
struct marucam_device *dev = priv;
struct v4l2_captureparm *cp = &parm->parm.capture;
- uint32_t ret;
+ int ret;
- if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return -EINVAL;
+ }
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(cp->timeperframe.denominator, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_S_PARAM);
- ret = ioread32(dev->mmregs + MARUCAM_S_PARAM);
- if (ret > 0) {
- marucam_err("MARUCAM_S_PARAM failed!\n");
- mutex_unlock(&dev->mlock);
- return -(ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_S_PARAM);
+ if (ret) {
+ marucam_err("MARUCAM_S_PARAM failed!\n");
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
mutex_unlock(&dev->mlock);
return 0;
{
struct marucam_device *dev = priv;
struct v4l2_captureparm *cp = &parm->parm.capture;
- uint32_t ret;
+ int ret;
- if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return -EINVAL;
+ }
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(0, dev->mmregs + MARUCAM_G_PARAM);
- ret = ioread32(dev->mmregs + MARUCAM_G_PARAM);
- if (ret > 0) {
- marucam_err("MARUCAM_G_PARAM failed!\n");
- mutex_unlock(&dev->mlock);
- return -(ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_G_PARAM);
+ if (ret) {
+ marucam_err("MARUCAM_G_PARAM failed!\n");
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
cp->capability = ioread32(dev->mmregs + MARUCAM_G_DATA);
cp->timeperframe.numerator = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_frmsizeenum *fsize)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(fsize->pixel_format, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_ENUM_FSIZES);
- ret = ioread32(dev->mmregs + MARUCAM_ENUM_FSIZES);
- if (ret > 0) {
- mutex_unlock(&dev->mlock);
- return -(ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_ENUM_FSIZES);
+ if (ret) {
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
fsize->discrete.width = ioread32(dev->mmregs + MARUCAM_G_DATA);
struct v4l2_frmivalenum *fival)
{
struct marucam_device *dev = priv;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
iowrite32(0, dev->mmregs + MARUCAM_DTC);
iowrite32(fival->height, dev->mmregs + MARUCAM_S_DATA);
iowrite32(0, dev->mmregs + MARUCAM_ENUM_FINTV);
- ret = ioread32(dev->mmregs + MARUCAM_ENUM_FINTV);
- if (ret > 0) {
- mutex_unlock(&dev->mlock);
- return -(ret);
- }
+ ret = (int)ioread32(dev->mmregs + MARUCAM_ENUM_FINTV);
+ if (ret) {
+ mutex_unlock(&dev->mlock);
+ return -ret;
+ }
fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
fival->discrete.numerator = ioread32(dev->mmregs + MARUCAM_G_DATA);
*size = get_image_size(dev);
- if (*count > 2)
+ if (*count > 2) {
*count = 2;
- if (0 == *count)
+ } else if (*count == 0) {
*count = 2;
+ }
marucam_dbg(1, "count=%d, size=%d\n", *count, *size);
rc = videobuf_iolock(vq, vb, NULL);
if (rc < 0) {
marucam_err("faile dto videobuf_iolock\n");
- goto fail;
+ vb->state = VIDEOBUF_NEEDS_INIT;
+ return rc;
}
}
vb->state = VIDEOBUF_PREPARED;
return 0;
-
-fail:
- vb->state = VIDEOBUF_NEEDS_INIT;
- return rc;
}
static void
mutex_lock(&dev->mlock);
if (dev->in_use) {
- marucam_err("device already opend!!!!\n");
+ marucam_err("The device has been already opened\n");
mutex_unlock(&dev->mlock);
return -EBUSY;
}
ret = request_irq(dev->pdev->irq, marucam_irq_handler,
IRQF_SHARED, MARUCAM_MODULE_NAME, dev);
if (ret) {
- marucam_err("request_irq failed!!! irq#(%d)\n", dev->pdev->irq);
+ marucam_err("Failed to request the irq: irq(#%d)\n",
+ dev->pdev->irq);
mutex_unlock(&dev->mlock);
return ret;
}
iowrite32(0, dev->mmregs + MARUCAM_OPEN);
ret = (int)ioread32(dev->mmregs + MARUCAM_OPEN);
- if (ret > 0) {
- marucam_err("MARUCAM_OPEN failed\n");
+ if (ret) {
+ marucam_err("Failed to open the device\n");
free_irq(dev->pdev->irq, dev);
mutex_unlock(&dev->mlock);
return -ret;
static int marucam_close(struct file *file)
{
struct marucam_device *dev = file->private_data;
- uint32_t ret;
+ int ret;
mutex_lock(&dev->mlock);
if (dev->opstate == S_RUNNING) {
marucam_err("The device has been terminated unexpectedly.\n");
iowrite32(1, dev->mmregs + MARUCAM_STOP_PREVIEW);
ret = (int)ioread32(dev->mmregs + MARUCAM_STOP_PREVIEW);
- if (ret > 0) {
- marucam_err("MARUCAM_STOP_PREVIEW failed!\n");
+ if (ret) {
+ marucam_err("Failed to stop the preview\n");
mutex_unlock(&dev->mlock);
- return -(ret);
+ return -ret;
}
dev->opstate = S_IDLE;
ret = videobuf_streamoff(&dev->vb_vidq);
- if (ret < 0) {
- marucam_err("videobuf_streamoff failed! ret(%d)\n",
- ret);
+ if (ret) {
+ marucam_err("Failed to streamoff the videobuffer\n");
mutex_unlock(&dev->mlock);
- return -(ret);
+ return ret;
}
INIT_LIST_HEAD(&dev->active);
}
free_irq(dev->pdev->irq, dev);
iowrite32(0, dev->mmregs + MARUCAM_CLOSE);
- ret = ioread32(dev->mmregs + MARUCAM_CLOSE);
- if (ret > 0) {
- marucam_err("device close failed\n");
+ ret = (int)ioread32(dev->mmregs + MARUCAM_CLOSE);
+ if (ret) {
+ marucam_err("Failed to close the device\n");
mutex_unlock(&dev->mlock);
- return -(ret);
+ return -ret;
}
dev->in_use = 0;
unsigned int ret = 0;
struct videobuf_buffer *buf = NULL;
- if (q->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ if (q->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return POLLERR;
+ }
mutex_lock(&q->vb_lock);
if (q->streaming) {
- if (!list_empty(&q->stream))
+ if (!list_empty(&q->stream)) {
buf = list_entry(q->stream.next,
struct videobuf_buffer, stream);
+ }
}
if (!buf) {
- marucam_err("video buffer list is empty\n");
+ marucam_err("The video buffer list is empty\n");
ret = POLLERR;
}
poll_wait(file, &buf->done, wait);
if (buf->state == VIDEOBUF_DONE ||
buf->state == VIDEOBUF_ERROR ||
- buf->state == 0xFF)
+ buf->state == 0xFF) {
ret = POLLIN | POLLRDNORM;
- else
+ } else {
iowrite32(buf->i, dev->mmregs + MARUCAM_REQFRAME);
+ }
}
mutex_unlock(&q->vb_lock);
return ret;
debug = MARUCAM_DEBUG_LEVEL;
if (marucam_instance != NULL) {
- marucam_err("only one device allowed!\n");
+ marucam_err("Only one device allowed\n");
return -EBUSY;
}
marucam_instance = dev;
ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
- if (ret)
- goto out_free;
+ if (ret) {
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
+ }
INIT_LIST_HEAD(&dev->active);
spin_lock_init(&dev->slock);
dev->vfd = video_device_alloc();
if (!dev->vfd) {
marucam_err("video_device_alloc() failed!!\n");
- goto out_unreg;
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
memcpy(dev->vfd, &marucam_video_dev, sizeof(marucam_video_dev));
ret = pci_enable_device(dev->pdev);
if (ret) {
marucam_err("pci_enable_device failed!!\n");
- goto rel_vdev;
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
pci_set_master(dev->pdev);
if (!dev->mem_base) {
marucam_err("pci_resource_start failed!!\n");
- goto out_disable;
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
if (!request_mem_region(dev->mem_base, dev->mem_size,
MARUCAM_MODULE_NAME)) {
marucam_err("request_mem_region(mem) failed!!\n");
- goto out_disable;
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
dev->io_base = pci_resource_start(dev->pdev, 1);
if (!dev->io_base) {
marucam_err("pci_resource_start failed!!\n");
- goto out_rel_mem_region;
+ release_mem_region(dev->mem_base, dev->mem_size);
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
if (!request_mem_region(dev->io_base, dev->io_size,
MARUCAM_MODULE_NAME)) {
marucam_err("request_mem_region(io) failed!!\n");
- goto out_disable;
+ release_mem_region(dev->mem_base, dev->mem_size);
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
dev->mmregs = ioremap(dev->io_base, dev->io_size);
if (!dev->mmregs) {
marucam_err("ioremap failed!!\n");
- goto out_rel_io_region;
+ release_mem_region(dev->io_base, dev->io_size);
+ release_mem_region(dev->mem_base, dev->mem_size);
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
ret = video_register_device(dev->vfd, VFL_TYPE_GRABBER, 0);
if (ret < 0) {
marucam_err("video_register_device failed!!\n");
- goto out_iounmap;
+ iounmap(dev->mmregs);
+ release_mem_region(dev->io_base, dev->io_size);
+ release_mem_region(dev->mem_base, dev->mem_size);
+ pci_disable_device(dev->pdev);
+ video_device_release(dev->vfd);
+ v4l2_device_unregister(&dev->v4l2_dev);
+ kfree(dev);
+ dev = NULL;
+ marucam_instance = NULL;
+ return ret;
}
video_set_drvdata(dev->vfd, dev);
pci_set_drvdata(pdev, dev);
marucam_info("V4L2 device registerd as /dev/video%d\n", dev->vfd->num);
return 0;
-
-out_iounmap:
- iounmap(dev->mmregs);
-out_rel_io_region:
- release_mem_region(dev->io_base, dev->io_size);
-out_rel_mem_region:
- release_mem_region(dev->mem_base, dev->mem_size);
-out_disable:
- pci_disable_device(dev->pdev);
-rel_vdev:
- video_device_release(dev->vfd);
-out_unreg:
- v4l2_device_unregister(&dev->v4l2_dev);
-out_free:
- kfree(dev);
- dev = NULL;
- marucam_instance = NULL;
-
- return ret;
}
static void marucam_pci_removedev(struct pci_dev *pdev)