|
@@ -153,16 +153,13 @@ MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
|
|
|
MODULE_AUTHOR("Serguei Miridonov");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
|
-#if (defined(CONFIG_VIDEO_ZORAN_MODULE) && defined(MODULE))
|
|
|
static struct pci_device_id zr36067_pci_tbl[] = {
|
|
|
- {PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057,
|
|
|
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
|
|
+ { PCI_DEVICE(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057), },
|
|
|
{0}
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
|
|
|
-#endif
|
|
|
|
|
|
-int zoran_num; /* number of Buzs in use */
|
|
|
+atomic_t zoran_num = ATOMIC_INIT(0); /* number of Buzs in use */
|
|
|
struct zoran *zoran[BUZ_MAX];
|
|
|
|
|
|
/* videocodec bus functions ZR36060 */
|
|
@@ -1146,7 +1143,7 @@ zr36057_init (struct zoran *zr)
|
|
|
strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
|
|
|
err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
|
|
|
if (err < 0)
|
|
|
- goto exit_unregister;
|
|
|
+ goto exit_free;
|
|
|
|
|
|
zoran_init_hardware(zr);
|
|
|
if (zr36067_debug > 2)
|
|
@@ -1161,19 +1158,19 @@ zr36057_init (struct zoran *zr)
|
|
|
zr->initialized = 1;
|
|
|
return 0;
|
|
|
|
|
|
-exit_unregister:
|
|
|
- zoran_unregister_i2c(zr);
|
|
|
exit_free:
|
|
|
kfree(zr->stat_com);
|
|
|
kfree(zr->video_dev);
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-zoran_release (struct zoran *zr)
|
|
|
+static void __devexit zoran_remove(struct pci_dev *pdev)
|
|
|
{
|
|
|
+ struct zoran *zr = pci_get_drvdata(pdev);
|
|
|
+
|
|
|
if (!zr->initialized)
|
|
|
goto exit_free;
|
|
|
+
|
|
|
/* unregister videocodec bus */
|
|
|
if (zr->codec) {
|
|
|
struct videocodec_master *master = zr->codec->master_data;
|
|
@@ -1202,6 +1199,7 @@ zoran_release (struct zoran *zr)
|
|
|
pci_disable_device(zr->pci_dev);
|
|
|
video_unregister_device(zr->video_dev);
|
|
|
exit_free:
|
|
|
+ pci_set_drvdata(pdev, NULL);
|
|
|
kfree(zr);
|
|
|
}
|
|
|
|
|
@@ -1264,338 +1262,347 @@ zoran_setup_videocodec (struct zoran *zr,
|
|
|
* Scan for a Buz card (actually for the PCI controller ZR36057),
|
|
|
* request the irq and map the io memory
|
|
|
*/
|
|
|
-static int __devinit
|
|
|
-find_zr36057 (void)
|
|
|
+static int __devinit zoran_probe(struct pci_dev *pdev,
|
|
|
+ const struct pci_device_id *ent)
|
|
|
{
|
|
|
unsigned char latency, need_latency;
|
|
|
struct zoran *zr;
|
|
|
- struct pci_dev *dev = NULL;
|
|
|
int result;
|
|
|
struct videocodec_master *master_vfe = NULL;
|
|
|
struct videocodec_master *master_codec = NULL;
|
|
|
int card_num;
|
|
|
char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
|
|
|
+ unsigned int nr;
|
|
|
|
|
|
- zoran_num = 0;
|
|
|
- while (zoran_num < BUZ_MAX &&
|
|
|
- (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
|
|
|
- card_num = card[zoran_num];
|
|
|
- zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
|
|
|
- if (!zr) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - kzalloc failed\n",
|
|
|
- ZORAN_NAME);
|
|
|
- continue;
|
|
|
- }
|
|
|
- zr->pci_dev = dev;
|
|
|
- //zr->zr36057_mem = NULL;
|
|
|
- zr->id = zoran_num;
|
|
|
- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
|
|
- spin_lock_init(&zr->spinlock);
|
|
|
- mutex_init(&zr->resource_lock);
|
|
|
- if (pci_enable_device(dev))
|
|
|
- goto zr_free_mem;
|
|
|
- zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
|
|
|
- pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
|
|
|
- &zr->revision);
|
|
|
- if (zr->revision < 2) {
|
|
|
- dprintk(1,
|
|
|
- KERN_INFO
|
|
|
- "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
|
|
|
- ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
|
- zr->zr36057_adr);
|
|
|
|
|
|
- if (card_num == -1) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_free_mem;
|
|
|
- }
|
|
|
- } else {
|
|
|
- int i;
|
|
|
- unsigned short ss_vendor, ss_device;
|
|
|
-
|
|
|
- ss_vendor = zr->pci_dev->subsystem_vendor;
|
|
|
- ss_device = zr->pci_dev->subsystem_device;
|
|
|
- dprintk(1,
|
|
|
- KERN_INFO
|
|
|
- "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
|
|
|
- ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
|
- zr->zr36057_adr);
|
|
|
- dprintk(1,
|
|
|
- KERN_INFO
|
|
|
- "%s: subsystem vendor=0x%04x id=0x%04x\n",
|
|
|
- ZR_DEVNAME(zr), ss_vendor, ss_device);
|
|
|
- if (card_num == -1) {
|
|
|
- dprintk(3,
|
|
|
- KERN_DEBUG
|
|
|
- "%s: find_zr36057() - trying to autodetect card type\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- for (i=0;i<NUM_CARDS;i++) {
|
|
|
- if (ss_vendor == zoran_cards[i].vendor_id &&
|
|
|
- ss_device == zoran_cards[i].device_id) {
|
|
|
- dprintk(3,
|
|
|
- KERN_DEBUG
|
|
|
- "%s: find_zr36057() - card %s detected\n",
|
|
|
- ZR_DEVNAME(zr),
|
|
|
- zoran_cards[i].name);
|
|
|
- card_num = i;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (i == NUM_CARDS) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - unknown card\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_free_mem;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ nr = atomic_inc_return(&zoran_num) - 1;
|
|
|
+ if (nr >= BUZ_MAX) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: driver limited to %d card(s) maximum\n",
|
|
|
+ ZORAN_NAME, BUZ_MAX);
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
|
|
|
- if (card_num < 0 || card_num >= NUM_CARDS) {
|
|
|
- dprintk(2,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - invalid cardnum %d\n",
|
|
|
- ZR_DEVNAME(zr), card_num);
|
|
|
- goto zr_free_mem;
|
|
|
- }
|
|
|
+ card_num = card[nr];
|
|
|
+ zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
|
|
|
+ if (!zr) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - kzalloc failed\n",
|
|
|
+ ZORAN_NAME);
|
|
|
+ /* The entry in zoran[] gets leaked */
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+ zr->pci_dev = pdev;
|
|
|
+ zr->id = nr;
|
|
|
+ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
|
|
+ spin_lock_init(&zr->spinlock);
|
|
|
+ mutex_init(&zr->resource_lock);
|
|
|
+ if (pci_enable_device(pdev))
|
|
|
+ goto zr_free_mem;
|
|
|
+ zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
|
|
|
+ pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
|
|
|
+ if (zr->revision < 2) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_INFO
|
|
|
+ "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
|
|
|
+ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
|
+ zr->zr36057_adr);
|
|
|
|
|
|
- /* even though we make this a non pointer and thus
|
|
|
- * theoretically allow for making changes to this struct
|
|
|
- * on a per-individual card basis at runtime, this is
|
|
|
- * strongly discouraged. This structure is intended to
|
|
|
- * keep general card information, no settings or anything */
|
|
|
- zr->card = zoran_cards[card_num];
|
|
|
- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
|
|
|
- "%s[%u]", zr->card.name, zr->id);
|
|
|
-
|
|
|
- zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
|
|
|
- if (!zr->zr36057_mem) {
|
|
|
+ if (card_num == -1) {
|
|
|
dprintk(1,
|
|
|
KERN_ERR
|
|
|
- "%s: find_zr36057() - ioremap failed\n",
|
|
|
+ "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
|
|
|
ZR_DEVNAME(zr));
|
|
|
goto zr_free_mem;
|
|
|
}
|
|
|
+ } else {
|
|
|
+ int i;
|
|
|
+ unsigned short ss_vendor, ss_device;
|
|
|
|
|
|
- result = request_irq(zr->pci_dev->irq,
|
|
|
- zoran_irq,
|
|
|
- IRQF_SHARED | IRQF_DISABLED,
|
|
|
- ZR_DEVNAME(zr),
|
|
|
- (void *) zr);
|
|
|
- if (result < 0) {
|
|
|
- if (result == -EINVAL) {
|
|
|
+ ss_vendor = zr->pci_dev->subsystem_vendor;
|
|
|
+ ss_device = zr->pci_dev->subsystem_device;
|
|
|
+ dprintk(1,
|
|
|
+ KERN_INFO
|
|
|
+ "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
|
|
|
+ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
|
+ zr->zr36057_adr);
|
|
|
+ dprintk(1,
|
|
|
+ KERN_INFO
|
|
|
+ "%s: subsystem vendor=0x%04x id=0x%04x\n",
|
|
|
+ ZR_DEVNAME(zr), ss_vendor, ss_device);
|
|
|
+ if (card_num == -1) {
|
|
|
+ dprintk(3,
|
|
|
+ KERN_DEBUG
|
|
|
+ "%s: find_zr36057() - trying to autodetect card type\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ for (i = 0; i < NUM_CARDS; i++) {
|
|
|
+ if (ss_vendor == zoran_cards[i].vendor_id &&
|
|
|
+ ss_device == zoran_cards[i].device_id) {
|
|
|
+ dprintk(3,
|
|
|
+ KERN_DEBUG
|
|
|
+ "%s: find_zr36057() - card %s detected\n",
|
|
|
+ ZR_DEVNAME(zr),
|
|
|
+ zoran_cards[i].name);
|
|
|
+ card_num = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (i == NUM_CARDS) {
|
|
|
dprintk(1,
|
|
|
KERN_ERR
|
|
|
- "%s: find_zr36057() - bad irq number or handler\n",
|
|
|
+ "%s: find_zr36057() - unknown card\n",
|
|
|
ZR_DEVNAME(zr));
|
|
|
- } else if (result == -EBUSY) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
|
|
|
- ZR_DEVNAME(zr), zr->pci_dev->irq);
|
|
|
- } else {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - can't assign irq, error code %d\n",
|
|
|
- ZR_DEVNAME(zr), result);
|
|
|
+ goto zr_free_mem;
|
|
|
}
|
|
|
- goto zr_unmap;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- /* set PCI latency timer */
|
|
|
- pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
|
- &latency);
|
|
|
- need_latency = zr->revision > 1 ? 32 : 48;
|
|
|
- if (latency != need_latency) {
|
|
|
- dprintk(2,
|
|
|
- KERN_INFO
|
|
|
- "%s: Changing PCI latency from %d to %d.\n",
|
|
|
- ZR_DEVNAME(zr), latency, need_latency);
|
|
|
- pci_write_config_byte(zr->pci_dev,
|
|
|
- PCI_LATENCY_TIMER,
|
|
|
- need_latency);
|
|
|
- }
|
|
|
+ if (card_num < 0 || card_num >= NUM_CARDS) {
|
|
|
+ dprintk(2,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - invalid cardnum %d\n",
|
|
|
+ ZR_DEVNAME(zr), card_num);
|
|
|
+ goto zr_free_mem;
|
|
|
+ }
|
|
|
|
|
|
- zr36057_restart(zr);
|
|
|
- /* i2c */
|
|
|
- dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
|
|
|
+ /* even though we make this a non pointer and thus
|
|
|
+ * theoretically allow for making changes to this struct
|
|
|
+ * on a per-individual card basis at runtime, this is
|
|
|
+ * strongly discouraged. This structure is intended to
|
|
|
+ * keep general card information, no settings or anything */
|
|
|
+ zr->card = zoran_cards[card_num];
|
|
|
+ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
|
|
|
+ "%s[%u]", zr->card.name, zr->id);
|
|
|
+
|
|
|
+ zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
|
|
|
+ if (!zr->zr36057_mem) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - ioremap failed\n",
|
|
|
ZR_DEVNAME(zr));
|
|
|
+ goto zr_free_mem;
|
|
|
+ }
|
|
|
|
|
|
- /* i2c decoder */
|
|
|
- if (decoder[zr->id] != -1) {
|
|
|
- i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
|
|
|
- zr->card.i2c_decoder = decoder[zr->id];
|
|
|
- } else if (zr->card.i2c_decoder != 0) {
|
|
|
- i2c_dec_name =
|
|
|
- i2cid_to_modulename(zr->card.i2c_decoder);
|
|
|
+ result = request_irq(zr->pci_dev->irq, zoran_irq,
|
|
|
+ IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
|
|
|
+ if (result < 0) {
|
|
|
+ if (result == -EINVAL) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - bad irq number or handler\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ } else if (result == -EBUSY) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
|
|
|
+ ZR_DEVNAME(zr), zr->pci_dev->irq);
|
|
|
} else {
|
|
|
- i2c_dec_name = NULL;
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - can't assign irq, error code %d\n",
|
|
|
+ ZR_DEVNAME(zr), result);
|
|
|
}
|
|
|
+ goto zr_unmap;
|
|
|
+ }
|
|
|
|
|
|
- if (i2c_dec_name) {
|
|
|
- if ((result = request_module(i2c_dec_name)) < 0) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: failed to load module %s: %d\n",
|
|
|
- ZR_DEVNAME(zr), i2c_dec_name, result);
|
|
|
- }
|
|
|
- }
|
|
|
+ /* set PCI latency timer */
|
|
|
+ pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
|
+ &latency);
|
|
|
+ need_latency = zr->revision > 1 ? 32 : 48;
|
|
|
+ if (latency != need_latency) {
|
|
|
+ dprintk(2,
|
|
|
+ KERN_INFO
|
|
|
+ "%s: Changing PCI latency from %d to %d\n",
|
|
|
+ ZR_DEVNAME(zr), latency, need_latency);
|
|
|
+ pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
|
+ need_latency);
|
|
|
+ }
|
|
|
|
|
|
- /* i2c encoder */
|
|
|
- if (encoder[zr->id] != -1) {
|
|
|
- i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
|
|
|
- zr->card.i2c_encoder = encoder[zr->id];
|
|
|
- } else if (zr->card.i2c_encoder != 0) {
|
|
|
- i2c_enc_name =
|
|
|
- i2cid_to_modulename(zr->card.i2c_encoder);
|
|
|
- } else {
|
|
|
- i2c_enc_name = NULL;
|
|
|
- }
|
|
|
+ zr36057_restart(zr);
|
|
|
+ /* i2c */
|
|
|
+ dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+
|
|
|
+ /* i2c decoder */
|
|
|
+ if (decoder[zr->id] != -1) {
|
|
|
+ i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
|
|
|
+ zr->card.i2c_decoder = decoder[zr->id];
|
|
|
+ } else if (zr->card.i2c_decoder != 0) {
|
|
|
+ i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
|
|
|
+ } else {
|
|
|
+ i2c_dec_name = NULL;
|
|
|
+ }
|
|
|
|
|
|
- if (i2c_enc_name) {
|
|
|
- if ((result = request_module(i2c_enc_name)) < 0) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: failed to load module %s: %d\n",
|
|
|
- ZR_DEVNAME(zr), i2c_enc_name, result);
|
|
|
- }
|
|
|
+ if (i2c_dec_name) {
|
|
|
+ result = request_module(i2c_dec_name);
|
|
|
+ if (result < 0) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: failed to load module %s: %d\n",
|
|
|
+ ZR_DEVNAME(zr), i2c_dec_name, result);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (zoran_register_i2c(zr) < 0) {
|
|
|
+ /* i2c encoder */
|
|
|
+ if (encoder[zr->id] != -1) {
|
|
|
+ i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
|
|
|
+ zr->card.i2c_encoder = encoder[zr->id];
|
|
|
+ } else if (zr->card.i2c_encoder != 0) {
|
|
|
+ i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
|
|
|
+ } else {
|
|
|
+ i2c_enc_name = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (i2c_enc_name) {
|
|
|
+ result = request_module(i2c_enc_name);
|
|
|
+ if (result < 0) {
|
|
|
dprintk(1,
|
|
|
KERN_ERR
|
|
|
- "%s: find_zr36057() - can't initialize i2c bus\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_free_irq;
|
|
|
+ "%s: failed to load module %s: %d\n",
|
|
|
+ ZR_DEVNAME(zr), i2c_enc_name, result);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- dprintk(2,
|
|
|
- KERN_INFO "%s: Initializing videocodec bus...\n",
|
|
|
+ if (zoran_register_i2c(zr) < 0) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - can't initialize i2c bus\n",
|
|
|
ZR_DEVNAME(zr));
|
|
|
+ goto zr_free_irq;
|
|
|
+ }
|
|
|
|
|
|
- if (zr->card.video_codec != 0 &&
|
|
|
- (codec_name =
|
|
|
- codecid_to_modulename(zr->card.video_codec)) != NULL) {
|
|
|
- if ((result = request_module(codec_name)) < 0) {
|
|
|
+ dprintk(2,
|
|
|
+ KERN_INFO "%s: Initializing videocodec bus...\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+
|
|
|
+ if (zr->card.video_codec) {
|
|
|
+ codec_name = codecid_to_modulename(zr->card.video_codec);
|
|
|
+ if (codec_name) {
|
|
|
+ result = request_module(codec_name);
|
|
|
+ if (result) {
|
|
|
dprintk(1,
|
|
|
KERN_ERR
|
|
|
"%s: failed to load modules %s: %d\n",
|
|
|
ZR_DEVNAME(zr), codec_name, result);
|
|
|
}
|
|
|
}
|
|
|
- if (zr->card.video_vfe != 0 &&
|
|
|
- (vfe_name =
|
|
|
- codecid_to_modulename(zr->card.video_vfe)) != NULL) {
|
|
|
- if ((result = request_module(vfe_name)) < 0) {
|
|
|
+ }
|
|
|
+ if (zr->card.video_vfe) {
|
|
|
+ vfe_name = codecid_to_modulename(zr->card.video_vfe);
|
|
|
+ if (vfe_name) {
|
|
|
+ result = request_module(vfe_name);
|
|
|
+ if (result < 0) {
|
|
|
dprintk(1,
|
|
|
KERN_ERR
|
|
|
"%s: failed to load modules %s: %d\n",
|
|
|
ZR_DEVNAME(zr), vfe_name, result);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- /* reset JPEG codec */
|
|
|
- jpeg_codec_sleep(zr, 1);
|
|
|
- jpeg_codec_reset(zr);
|
|
|
- /* video bus enabled */
|
|
|
- /* display codec revision */
|
|
|
- if (zr->card.video_codec != 0) {
|
|
|
- master_codec = zoran_setup_videocodec(zr,
|
|
|
- zr->card.video_codec);
|
|
|
- if (!master_codec)
|
|
|
- goto zr_unreg_i2c;
|
|
|
- zr->codec = videocodec_attach(master_codec);
|
|
|
- if (!zr->codec) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - no codec found\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_free_codec;
|
|
|
- }
|
|
|
- if (zr->codec->type != zr->card.video_codec) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - wrong codec\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_detach_codec;
|
|
|
- }
|
|
|
+ /* reset JPEG codec */
|
|
|
+ jpeg_codec_sleep(zr, 1);
|
|
|
+ jpeg_codec_reset(zr);
|
|
|
+ /* video bus enabled */
|
|
|
+ /* display codec revision */
|
|
|
+ if (zr->card.video_codec != 0) {
|
|
|
+ master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
|
|
|
+ if (!master_codec)
|
|
|
+ goto zr_unreg_i2c;
|
|
|
+ zr->codec = videocodec_attach(master_codec);
|
|
|
+ if (!zr->codec) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - no codec found\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ goto zr_free_codec;
|
|
|
}
|
|
|
- if (zr->card.video_vfe != 0) {
|
|
|
- master_vfe = zoran_setup_videocodec(zr,
|
|
|
- zr->card.video_vfe);
|
|
|
- if (!master_vfe)
|
|
|
- goto zr_detach_codec;
|
|
|
- zr->vfe = videocodec_attach(master_vfe);
|
|
|
- if (!zr->vfe) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() - no VFE found\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_free_vfe;
|
|
|
- }
|
|
|
- if (zr->vfe->type != zr->card.video_vfe) {
|
|
|
- dprintk(1,
|
|
|
- KERN_ERR
|
|
|
- "%s: find_zr36057() = wrong VFE\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- goto zr_detach_vfe;
|
|
|
- }
|
|
|
+ if (zr->codec->type != zr->card.video_codec) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - wrong codec\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ goto zr_detach_codec;
|
|
|
}
|
|
|
- /* Success so keep the pci_dev referenced */
|
|
|
- pci_dev_get(zr->pci_dev);
|
|
|
- zoran[zoran_num++] = zr;
|
|
|
- continue;
|
|
|
-
|
|
|
- // Init errors
|
|
|
- zr_detach_vfe:
|
|
|
- videocodec_detach(zr->vfe);
|
|
|
- zr_free_vfe:
|
|
|
- kfree(master_vfe);
|
|
|
- zr_detach_codec:
|
|
|
- videocodec_detach(zr->codec);
|
|
|
- zr_free_codec:
|
|
|
- kfree(master_codec);
|
|
|
- zr_unreg_i2c:
|
|
|
- zoran_unregister_i2c(zr);
|
|
|
- zr_free_irq:
|
|
|
- btwrite(0, ZR36057_SPGPPCR);
|
|
|
- free_irq(zr->pci_dev->irq, zr);
|
|
|
- zr_unmap:
|
|
|
- iounmap(zr->zr36057_mem);
|
|
|
- zr_free_mem:
|
|
|
- kfree(zr);
|
|
|
- continue;
|
|
|
}
|
|
|
- if (dev) /* Clean up ref count on early exit */
|
|
|
- pci_dev_put(dev);
|
|
|
+ if (zr->card.video_vfe != 0) {
|
|
|
+ master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
|
|
|
+ if (!master_vfe)
|
|
|
+ goto zr_detach_codec;
|
|
|
+ zr->vfe = videocodec_attach(master_vfe);
|
|
|
+ if (!zr->vfe) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() - no VFE found\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ goto zr_free_vfe;
|
|
|
+ }
|
|
|
+ if (zr->vfe->type != zr->card.video_vfe) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: find_zr36057() = wrong VFE\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
+ goto zr_detach_vfe;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zoran[nr] = zr;
|
|
|
|
|
|
- if (zoran_num == 0) {
|
|
|
- dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
|
|
|
+ /* take care of Natoma chipset and a revision 1 zr36057 */
|
|
|
+ if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
|
|
|
+ zr->jpg_buffers.need_contiguous = 1;
|
|
|
+ dprintk(1,
|
|
|
+ KERN_INFO
|
|
|
+ "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
|
|
|
+ ZR_DEVNAME(zr));
|
|
|
}
|
|
|
- return zoran_num;
|
|
|
+
|
|
|
+ if (zr36057_init(zr) < 0)
|
|
|
+ goto zr_detach_vfe;
|
|
|
+
|
|
|
+ zoran_proc_init(zr);
|
|
|
+
|
|
|
+ pci_set_drvdata(pdev, zr);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+zr_detach_vfe:
|
|
|
+ videocodec_detach(zr->vfe);
|
|
|
+zr_free_vfe:
|
|
|
+ kfree(master_vfe);
|
|
|
+zr_detach_codec:
|
|
|
+ videocodec_detach(zr->codec);
|
|
|
+zr_free_codec:
|
|
|
+ kfree(master_codec);
|
|
|
+zr_unreg_i2c:
|
|
|
+ zoran_unregister_i2c(zr);
|
|
|
+zr_free_irq:
|
|
|
+ btwrite(0, ZR36057_SPGPPCR);
|
|
|
+ free_irq(zr->pci_dev->irq, zr);
|
|
|
+zr_unmap:
|
|
|
+ iounmap(zr->zr36057_mem);
|
|
|
+zr_free_mem:
|
|
|
+ kfree(zr);
|
|
|
+
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
|
|
|
-static int __init
|
|
|
-init_dc10_cards (void)
|
|
|
+static struct pci_driver zoran_driver = {
|
|
|
+ .name = "zr36067",
|
|
|
+ .id_table = zr36067_pci_tbl,
|
|
|
+ .probe = zoran_probe,
|
|
|
+ .remove = zoran_remove,
|
|
|
+};
|
|
|
+
|
|
|
+static int __init zoran_init(void)
|
|
|
{
|
|
|
- int i;
|
|
|
+ int res;
|
|
|
|
|
|
memset(zoran, 0, sizeof(zoran));
|
|
|
printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
|
|
|
MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
|
|
|
|
|
|
- /* Look for cards */
|
|
|
- if (find_zr36057() < 0) {
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
- if (zoran_num == 0)
|
|
|
- return -ENODEV;
|
|
|
- dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
|
|
|
- zoran_num);
|
|
|
/* check the parameters we have been given, adjust if necessary */
|
|
|
if (v4l_nbufs < 2)
|
|
|
v4l_nbufs = 2;
|
|
@@ -1637,37 +1644,22 @@ init_dc10_cards (void)
|
|
|
ZORAN_NAME);
|
|
|
}
|
|
|
|
|
|
- /* take care of Natoma chipset and a revision 1 zr36057 */
|
|
|
- for (i = 0; i < zoran_num; i++) {
|
|
|
- struct zoran *zr = zoran[i];
|
|
|
-
|
|
|
- if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
|
|
|
- zr->jpg_buffers.need_contiguous = 1;
|
|
|
- dprintk(1,
|
|
|
- KERN_INFO
|
|
|
- "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
|
|
|
- ZR_DEVNAME(zr));
|
|
|
- }
|
|
|
-
|
|
|
- if (zr36057_init(zr) < 0) {
|
|
|
- for (i = 0; i < zoran_num; i++)
|
|
|
- zoran_release(zoran[i]);
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
- zoran_proc_init(zr);
|
|
|
+ res = pci_register_driver(&zoran_driver);
|
|
|
+ if (res) {
|
|
|
+ dprintk(1,
|
|
|
+ KERN_ERR
|
|
|
+ "%s: Unable to register ZR36057 driver\n",
|
|
|
+ ZORAN_NAME);
|
|
|
+ return res;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void __exit
|
|
|
-unload_dc10_cards (void)
|
|
|
+static void __exit zoran_exit(void)
|
|
|
{
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < zoran_num; i++)
|
|
|
- zoran_release(zoran[i]);
|
|
|
+ pci_unregister_driver(&zoran_driver);
|
|
|
}
|
|
|
|
|
|
-module_init(init_dc10_cards);
|
|
|
-module_exit(unload_dc10_cards);
|
|
|
+module_init(zoran_init);
|
|
|
+module_exit(zoran_exit);
|