On Mon August 6 2012 10:17:39 Federico Vaga wrote: > Signed-off-by: Federico Vaga <federico.vaga@xxxxxxxxx> > Acked-by: Giancarlo Asnaghi <giancarlo.asnaghi@xxxxxx> > > --- > drivers/media/video/sta2x11_vip.c | 1239 +++++++++++++------------------------ > 1 file modificato, 414 inserzioni(+), 825 rimozioni(-) > > diff --git a/drivers/media/video/sta2x11_vip.c b/drivers/media/video/sta2x11_vip.c > index 4c10205..ffd9f0a 100644 > --- a/drivers/media/video/sta2x11_vip.c > +++ b/drivers/media/video/sta2x11_vip.c > @@ -1186,25 +798,6 @@ static void vip_gpio_release(struct device *dev, int pin, const char *name) > } > } > > -/** > - * sta2x11_vip_init_one - init one instance of video device > - * @pdev: PCI device > - * @ent: (not used) > - * > - * allocate reset pins for DAC. > - * Reset video DAC, this is done via reset line. > - * allocate memory for managing device > - * request interrupt > - * map IO region > - * register device > - * find and initialize video DAC > - * > - * return value: 0, no error > - * > - * -ENOMEM, no memory > - * > - * -ENODEV, device could not be detected or registered > - */ > static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > const struct pci_device_id *ent) > { > @@ -1212,10 +805,17 @@ static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > struct sta2x11_vip *vip; > struct vip_config *config; > > + /* Check if hardware support 26-bit DMA */ > + if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(26))) { > + dev_err(&pdev->dev, "26-bit DMA addressing not available\n"); > + return -EINVAL; > + } > + /* Enable PCI */ > ret = pci_enable_device(pdev); > if (ret) > return ret; > > + /* Get VIP platform data */ > config = dev_get_platdata(&pdev->dev); > if (!config) { > dev_info(&pdev->dev, "VIP slot disabled\n"); > @@ -1223,6 +823,7 @@ static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > goto disable; > } > > + /* Power configuration */ > ret = vip_gpio_reserve(&pdev->dev, config->pwr_pin, 0, > config->pwr_name); > if (ret) > @@ -1237,7 +838,6 @@ static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > goto disable; > } > } > - > if (config->pwr_pin != -1) { > /* Datasheet says 5ms between PWR and RST */ > usleep_range(5000, 25000); > @@ -1251,17 +851,20 @@ static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > } > usleep_range(5000, 25000); > > + /* Allocate a new VIP instance */ > vip = kzalloc(sizeof(struct sta2x11_vip), GFP_KERNEL); > if (!vip) { > ret = -ENOMEM; > goto release_gpios; > } > - > vip->pdev = pdev; > vip->std = V4L2_STD_PAL; > vip->format = formats_50[0]; > vip->config = config; > > + ret = sta2x11_vip_init_controls(vip); > + if (ret) > + goto free_mem; > if (v4l2_device_register(&pdev->dev, &vip->v4l2_dev)) > goto free_mem; > > @@ -1271,46 +874,52 @@ static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev, > > pci_set_master(pdev); > > - ret = pci_request_regions(pdev, DRV_NAME); > + ret = pci_request_regions(pdev, KBUILD_MODNAME); > if (ret) > goto unreg; > > vip->iomem = pci_iomap(pdev, 0, 0x100); > if (!vip->iomem) { > - ret = -ENOMEM; /* FIXME */ > + ret = -ENOMEM; > goto release; > } > > pci_enable_msi(pdev); > > - INIT_LIST_HEAD(&vip->capture); > + /* Initialize buffer */ > + ret = sta2x11_vip_init_buffer(vip); > + if (ret) > + goto unmap; > + > spin_lock_init(&vip->slock); > - mutex_init(&vip->mutex); > - vip->started = 0; > - vip->disabled = 0; > > ret = request_irq(pdev->irq, > (irq_handler_t) vip_irq, > - IRQF_SHARED, DRV_NAME, vip); > + IRQF_SHARED, KBUILD_MODNAME, vip); > if (ret) { > dev_err(&pdev->dev, "request_irq failed\n"); > ret = -ENODEV; > - goto unmap; > + goto release_buf; > } > > + /* Alloc, initialize and register video device */ > vip->video_dev = video_device_alloc(); > if (!vip->video_dev) { > ret = -ENOMEM; > goto release_irq; > } > > - *(vip->video_dev) = video_dev_template; > + vip->video_dev = &video_dev_template; > + vip->video_dev->v4l2_dev = &vip->v4l2_dev; > + vip->video_dev->queue = &vip->vb_vidq; > + vip->video_dev->flags |= V4L2_FL_USES_V4L2_FH | V4L2_FL_USE_FH_PRIO; Been there, done that :-) V4L2_FL_USE_FH_PRIO is a bit number, not a bit mask. Use set_bit instead: set_bit(V4L2_FL_USE_FH_PRIO, &vip->video_dev->flags); No need to set V4L2_FL_USES_V4L2_FH, BTW. That will be set automatically as soon as v4l2_fh_open is called. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html