Commit ef77a26b authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (10496): saa7146: implement v4l2_device support.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 80b36e0f
...@@ -363,13 +363,16 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -363,13 +363,16 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
ERR(("out of memory.\n")); ERR(("out of memory.\n"));
goto out; goto out;
} }
err = v4l2_device_register(&pci->dev, &dev->v4l2_dev);
if (err)
goto err_free;
DEB_EE(("pci:%p\n",pci)); DEB_EE(("pci:%p\n",pci));
err = pci_enable_device(pci); err = pci_enable_device(pci);
if (err < 0) { if (err < 0) {
ERR(("pci_enable_device() failed.\n")); ERR(("pci_enable_device() failed.\n"));
goto err_free; goto err_unreg;
} }
/* enable bus-mastering */ /* enable bus-mastering */
...@@ -452,8 +455,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -452,8 +455,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
INFO(("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x).\n", dev->mem, dev->revision, pci->irq, pci->subsystem_vendor, pci->subsystem_device)); INFO(("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x).\n", dev->mem, dev->revision, pci->irq, pci->subsystem_vendor, pci->subsystem_device));
dev->ext = ext; dev->ext = ext;
pci_set_drvdata(pci, dev);
mutex_init(&dev->lock); mutex_init(&dev->lock);
spin_lock_init(&dev->int_slock); spin_lock_init(&dev->int_slock);
spin_lock_init(&dev->slock); spin_lock_init(&dev->slock);
...@@ -477,7 +478,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -477,7 +478,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
if (ext->attach(dev, pci_ext)) { if (ext->attach(dev, pci_ext)) {
DEB_D(("ext->attach() failed for %p. skipping device.\n",dev)); DEB_D(("ext->attach() failed for %p. skipping device.\n",dev));
goto err_unprobe; goto err_free_i2c;
} }
INIT_LIST_HEAD(&dev->item); INIT_LIST_HEAD(&dev->item);
...@@ -488,8 +489,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -488,8 +489,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
out: out:
return err; return err;
err_unprobe:
pci_set_drvdata(pci, NULL);
err_free_i2c: err_free_i2c:
pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr, pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr,
dev->d_i2c.dma_handle); dev->d_i2c.dma_handle);
...@@ -507,6 +506,8 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -507,6 +506,8 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
pci_release_region(pci, 0); pci_release_region(pci, 0);
err_disable: err_disable:
pci_disable_device(pci); pci_disable_device(pci);
err_unreg:
v4l2_device_unregister(&dev->v4l2_dev);
err_free: err_free:
kfree(dev); kfree(dev);
goto out; goto out;
...@@ -514,7 +515,8 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -514,7 +515,8 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
static void saa7146_remove_one(struct pci_dev *pdev) static void saa7146_remove_one(struct pci_dev *pdev)
{ {
struct saa7146_dev* dev = pci_get_drvdata(pdev); struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev);
struct saa7146_dev *dev = container_of(v4l2_dev, struct saa7146_dev, v4l2_dev);
struct { struct {
void *addr; void *addr;
dma_addr_t dma; dma_addr_t dma;
...@@ -528,6 +530,7 @@ static void saa7146_remove_one(struct pci_dev *pdev) ...@@ -528,6 +530,7 @@ static void saa7146_remove_one(struct pci_dev *pdev)
DEB_EE(("dev:%p\n",dev)); DEB_EE(("dev:%p\n",dev));
dev->ext->detach(dev); dev->ext->detach(dev);
v4l2_device_unregister(&dev->v4l2_dev);
/* shut down all video dma transfers */ /* shut down all video dma transfers */
saa7146_write(dev, MC1, 0x00ff0000); saa7146_write(dev, MC1, 0x00ff0000);
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/stringify.h> #include <linux/stringify.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <media/v4l2-device.h>
#include <linux/vmalloc.h> /* for vmalloc() */ #include <linux/vmalloc.h> /* for vmalloc() */
#include <linux/mm.h> /* for vmalloc_to_page() */ #include <linux/mm.h> /* for vmalloc_to_page() */
...@@ -110,6 +111,8 @@ struct saa7146_dev ...@@ -110,6 +111,8 @@ struct saa7146_dev
struct list_head item; struct list_head item;
struct v4l2_device v4l2_dev;
/* different device locks */ /* different device locks */
spinlock_t slock; spinlock_t slock;
struct mutex lock; struct mutex lock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment