Przeglądaj źródła

V4L/DVB (13706): [MB86A16] Overhaul

 * better ISR handling
 * I2C fixes
 * better handling of configurations

Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Manu Abraham 15 lat temu
rodzic
commit
df0cca174b

+ 12 - 2
drivers/media/dvb/mantis/mantis_common.h

@@ -65,10 +65,19 @@
 #define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
 
 
+struct mantis_hwconfig {
+	char			*model_name;
+	char			*dev_type;
+};
+
+
 struct mantis_pci {
 	/*	PCI stuff		*/
 	u16			vendor_id;
 	u16			device_id;
+	u16			subsystem_vendor;
+	u16			subsystem_device;
+
 	u8			latency;
 
 	struct			pci_dev *pdev;
@@ -110,7 +119,7 @@ struct mantis_pci {
 
 	u8			feeds;
 
-	struct mantis_config	*config;
+	struct mantis_hwconfig	*hwconfig;
 
 	u32 			mantis_int_stat;
 	u32 			mantis_int_mask;
@@ -121,7 +130,8 @@ struct mantis_pci {
 	u32			sub_device_id;
 
 	 /*	A12 A13 A14		*/
-	int			gpio_status;};
+	int			gpio_status;
+};
 
 extern unsigned int verbose;
 extern unsigned int devs;

+ 47 - 48
drivers/media/dvb/mantis/mantis_core.c

@@ -20,7 +20,10 @@
 
 #include "mantis_common.h"
 #include "mantis_core.h"
-
+#include "mantis_vp1033.h"
+#include "mantis_vp1034.h"
+#include "mantis_vp2033.h"
+#include "mantis_vp3030.h"
 
 static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
 {
@@ -45,7 +48,7 @@ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
 
 		return err;
 	}
-	msleep_interruptible(2);
+//	msleep_interruptible(2);
 
 	return 0;
 }
@@ -72,41 +75,6 @@ static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
 	return 0;
 }
 
-static int get_subdevice_id(struct mantis_pci *mantis)
-{
-	int err;
-	static u8 sub_device_id[2];
-
-	mantis->sub_device_id = 0;
-	sub_device_id[0] = 0xfc;
-	if ((err = read_eeprom_byte(mantis, &sub_device_id[0], 2)) < 0) {
-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
-		return err;
-	}
-	mantis->sub_device_id = (sub_device_id[0] << 8) | sub_device_id[1];
-	dprintk(verbose, MANTIS_ERROR, 1, "Sub Device ID=[0x%04x]",
-		mantis->sub_device_id);
-
-	return 0;
-}
-
-static int get_subvendor_id(struct mantis_pci *mantis)
-{
-	int err;
-	static u8 sub_vendor_id[2];
-
-	mantis->sub_vendor_id = 0;
-	sub_vendor_id[0] = 0xfe;
-	if ((err = read_eeprom_byte(mantis, &sub_vendor_id[0], 2)) < 0) {
-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
-		return err;
-	}
-	mantis->sub_vendor_id = (sub_vendor_id[0] << 8) | sub_vendor_id[1];
-	dprintk(verbose, MANTIS_ERROR, 1, "Sub Vendor ID=[0x%04x]",
-		mantis->sub_vendor_id);
-
-	return 0;
-}
 
 static int get_mac_address(struct mantis_pci *mantis)
 {
@@ -118,8 +86,8 @@ static int get_mac_address(struct mantis_pci *mantis)
 
 		return err;
 	}
-	dprintk(verbose, MANTIS_ERROR, 1,
-		"MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]",
+	dprintk(verbose, MANTIS_ERROR, 0,
+		"    MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
 		mantis->mac_address[0], mantis->mac_address[1],
 		mantis->mac_address[2],	mantis->mac_address[3],
 		mantis->mac_address[4], mantis->mac_address[5]);
@@ -127,11 +95,51 @@ static int get_mac_address(struct mantis_pci *mantis)
 	return 0;
 }
 
+#define MANTIS_MODEL_UNKNOWN	"UNKNOWN"
+#define MANTIS_DEV_UNKNOWN	"UNKNOWN"
+
+struct mantis_hwconfig unknown_device = {
+	.model_name	= MANTIS_MODEL_UNKNOWN,
+	.dev_type	= MANTIS_DEV_UNKNOWN,
+};
+
+static void mantis_load_config(struct mantis_pci *mantis)
+{
+	switch (mantis->subsystem_device) {
+	case MANTIS_VP_1033_DVB_S:	// VP-1033
+		mantis->hwconfig = &vp1033_mantis_config;
+		break;
+	case MANTIS_VP_1034_DVB_S:	// VP-1034
+		mantis->hwconfig = &vp1034_mantis_config;
+		break;
+	case MANTIS_VP_2033_DVB_C:	// VP-2033
+		mantis->hwconfig = &vp2033_mantis_config;
+		break;
+	case MANTIS_VP_3030_DVB_T:	// VP-3030
+		mantis->hwconfig = &vp3030_mantis_config;
+		break;
+	default:
+		mantis->hwconfig = &unknown_device;
+		break;
+	}
+}
 
 int mantis_core_init(struct mantis_pci *mantis)
 {
 	int err = 0;
 
+	mantis_load_config(mantis);
+	dprintk(verbose, MANTIS_ERROR, 0, "found a %s PCI %s device on (%02x:%02x.%x),\n",
+		mantis->hwconfig->model_name, mantis->hwconfig->dev_type,
+		mantis->pdev->bus->number, PCI_SLOT(mantis->pdev->devfn), PCI_FUNC(mantis->pdev->devfn));
+	dprintk(verbose, MANTIS_ERROR, 0, "    Mantis Rev %d [%04x:%04x], ",
+		mantis->revision,
+		mantis->subsystem_vendor, mantis->subsystem_device);
+	dprintk(verbose, MANTIS_ERROR, 0,
+		"irq: %d, latency: %d\n    memory: 0x%lx, mmio: 0x%p\n",
+		mantis->pdev->irq, mantis->latency,
+		mantis->mantis_addr, mantis->mantis_mmio);
+
 	if ((err = mantis_i2c_init(mantis)) < 0) {
 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis I2C init failed");
 		return err;
@@ -140,14 +148,6 @@ int mantis_core_init(struct mantis_pci *mantis)
 		dprintk(verbose, MANTIS_ERROR, 1, "get MAC address failed");
 		return err;
 	}
-	if ((err = get_subvendor_id(mantis)) < 0) {
-		dprintk(verbose, MANTIS_ERROR, 1, "get Sub vendor ID failed");
-		return err;
-	}
-	if ((err = get_subdevice_id(mantis)) < 0) {
-		dprintk(verbose, MANTIS_ERROR, 1, "get Sub device ID failed");
-		return err;
-	}
 	if ((err = mantis_dma_init(mantis)) < 0) {
 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis DMA init failed");
 		return err;
@@ -162,7 +162,6 @@ int mantis_core_init(struct mantis_pci *mantis)
 
 int mantis_core_exit(struct mantis_pci *mantis)
 {
-
 	mantis_dma_stop(mantis);
 	dprintk(verbose, MANTIS_ERROR, 1, "DMA engine stopping");
 	if (mantis_dma_exit(mantis) < 0)

+ 2 - 11
drivers/media/dvb/mantis/mantis_dvb.c

@@ -206,22 +206,13 @@ err0:
 	return result;
 }
 
-#define MANTIS_VP_1027_DVB_S	0x0013
-#define MANTIS_VP_1033_DVB_S	0x0016
-#define MANTIS_VP_1034_DVB_S	0x0014
-#define MANTIS_VP_1040_DVB_S2
-#define MANTIS_VP_1041_DVB_S2
-#define MANTIS_VP_2033_DVB_C	0x0008
-#define MANTIS_VP_3024_DVB_T	0x0009
-#define MANTIS_VP_3030_DVB_T	0x0024
-
 int __devinit mantis_frontend_init(struct mantis_pci *mantis)
 {
 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis frontend Init");
 	mantis_fe_powerup(mantis);
 	mantis_frontend_reset(mantis);
-	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->sub_device_id);
-	switch (mantis->sub_device_id) {
+	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->subsystem_device);
+	switch (mantis->subsystem_device) {
 	case MANTIS_VP_1033_DVB_S:	// VP-1033
 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
 		mantis->fe = stv0299_attach(&lgtdqcs001f_config,

+ 30 - 38
drivers/media/dvb/mantis/mantis_i2c.c

@@ -33,32 +33,27 @@
 static int mantis_ack_wait(struct mantis_pci *mantis)
 {
 	int rc = 0;
+	u32 timeout = 0;
 
 	if (wait_event_interruptible_timeout(mantis->i2c_wq,
-					     mantis->mantis_int_stat & MANTIS_INT_I2CRACK,
-					     msecs_to_jiffies(50)) == -ERESTARTSYS)
+					     mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
+					     msecs_to_jiffies(50)) == -ERESTARTSYS) {
 
+		dprintk(verbose, MANTIS_DEBUG, 1, "I2C Transfer failed, Master !I2CDONE");
 		rc = -EREMOTEIO;
-/*
-	// Wait till we are done
-	while (mantis->mantis_int_stat & MANTIS_INT_I2CRACK){
-		if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
-			mantis->mantis_int_stat &= ~MANTIS_INT_I2CRACK;
-//			dprintk(verbose, MANTIS_DEBUG, 1, "SLAVE RACK 'ed .. Waiting for I2CDONE");
+	}
+	while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
+		dprintk(verbose, MANTIS_DEBUG, 1, "Waiting for Slave RACK");
+		mantis->mantis_int_stat = mmread(MANTIS_INT_STAT);
+		msleep(5);
+		timeout++;
+		if (timeout > 500) {
+			dprintk(verbose, MANTIS_ERROR, 1, "Slave RACK Fail !");
+			rc = -EREMOTEIO;
 			break;
 		}
 	}
-
-	if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
-//		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Int I2CDONE");
-		rc = 1;
-	}
-
-	mantis->mantis_int_stat &= ~MANTIS_INT_I2CDONE;
-*/
-	// ..
-	if (mantis->mantis_int_stat & MANTIS_INT_I2CRACK)
-		msleep_interruptible(10);
+	udelay(350);
 
 	return rc;
 }
@@ -67,7 +62,7 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
 {
 	u32 rxd, i;
 
-	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
+	dprintk(verbose, MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ", __func__, msg->addr);
 	for (i = 0; i < msg->len; i++) {
 		rxd = (msg->addr << 25) | (1 << 24)
 					| MANTIS_I2C_RATE_3
@@ -77,18 +72,17 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
 		if (i == (msg->len - 1))
 			rxd &= ~MANTIS_I2C_STOP;
 
+		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
 		mmwrite(rxd, MANTIS_I2CDATA_CTL);
-		if (mantis_ack_wait(mantis) < 0) {
+		if (mantis_ack_wait(mantis) != 0) {
 			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<R>");
-			return -EIO;
+			return -EREMOTEIO;
 		}
 		rxd = mmread(MANTIS_I2CDATA_CTL);
 		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
-		dprintk(verbose, MANTIS_DEBUG, 1,
-			"Data<R[%d]>=[0x%02x]", i, msg->buf[i]);
-
-		msleep_interruptible(2);
+		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
 	}
+	dprintk(verbose, MANTIS_INFO, 0, "]\n");
 
 	return 0;
 }
@@ -98,9 +92,9 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
 	int i;
 	u32 txd = 0;
 
-	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
+	dprintk(verbose, MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ", __func__, msg->addr);
 	for (i = 0; i < msg->len; i++) {
-		dprintk(verbose, MANTIS_DEBUG, 1, "Data<W[%d]>=[0x%02x]", i, msg->buf[i]);
+		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
 		txd = (msg->addr << 25) | (msg->buf[i] << 8)
 					| MANTIS_I2C_RATE_3
 					| MANTIS_I2C_STOP
@@ -109,13 +103,14 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
 		if (i == (msg->len - 1))
 			txd &= ~MANTIS_I2C_STOP;
 
+		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
 		mmwrite(txd, MANTIS_I2CDATA_CTL);
-		if (mantis_ack_wait(mantis) < 0) {
+		if (mantis_ack_wait(mantis) != 0) {
 			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<W>");
-			return -1;
+			return -EREMOTEIO;
 		}
-		udelay(500);
 	}
+	dprintk(verbose, MANTIS_INFO, 0, "]\n");
 
 	return 0;
 }
@@ -159,7 +154,7 @@ static struct i2c_adapter mantis_i2c_adapter = {
 
 int __devinit mantis_i2c_init(struct mantis_pci *mantis)
 {
-	u32 intstat;
+	u32 intstat, intmask;
 
 	memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
 	i2c_set_adapdata(&mantis->adapter, mantis);
@@ -169,15 +164,12 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
 
 	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing I2C ..");
 
-	// Clear all interrupts
 	intstat = mmread(MANTIS_INT_STAT);
+	intmask = mmread(MANTIS_INT_MASK);
 	mmwrite(intstat, MANTIS_INT_STAT);
+	mmwrite(intmask | MANTIS_INT_I2CDONE, MANTIS_INT_MASK);
 
-	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_I2CDONE,
-					  MANTIS_INT_MASK);
-
-	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]",
-		mmread(MANTIS_INT_STAT), mmread(MANTIS_INT_MASK));
+	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]", intstat, intmask);
 
 	return 0;
 }

+ 63 - 107
drivers/media/dvb/mantis/mantis_pci.c

@@ -52,7 +52,6 @@ MODULE_DEVICE_TABLE(pci, mantis_pci_table);
 
 static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
 {
-	int i = 0, interrupts = 0;
 	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
 	struct mantis_pci *mantis;
 
@@ -64,109 +63,67 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
 	stat = mmread(MANTIS_INT_STAT);
 	mask = mmread(MANTIS_INT_MASK);
 	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
-
-	if (!(stat & mask)) {
-		dprintk(verbose, MANTIS_DEBUG, 1, "Not ours !");
+	if (!(stat & mask))
 		return IRQ_NONE;
+
+	mantis->mantis_int_stat = stat;
+	mantis->mantis_int_mask = mask;
+	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]= [", stat, mask);
+	if (stat & MANTIS_INT_RISCEN) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
+	}
+	if (stat & MANTIS_INT_I2CRACK) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
+//		wake_up(&mantis->i2c_wq);
+	}
+	if (stat & MANTIS_INT_PCMCIA7) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
+	}
+	if (stat & MANTIS_INT_IRQ0) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
+	}
+	if (stat & MANTIS_INT_IRQ1) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
+	}
+	if (stat & MANTIS_INT_OCERR) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
+	}
+	if (stat & MANTIS_INT_PABORT) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
+	}
+	if (stat & MANTIS_INT_RIPERR) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
 	}
-	mmwrite(lstat, MANTIS_INT_STAT);
-	interrupts = hweight32(stat);
-	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]=%d [", stat, mask, interrupts);
-
-	while (lstat) {
-		if (lstat & MANTIS_INT_RISCEN) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
-			lstat &= ~MANTIS_INT_RISCEN;
-
-		} else if (lstat & MANTIS_INT_I2CRACK) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
-			mantis->mantis_int_stat = stat;
-			mantis->mantis_int_mask = mask;
-			wake_up(&mantis->i2c_wq);
-			lstat &= ~MANTIS_INT_I2CRACK;
-
-		} else if (lstat & MANTIS_INT_PCMCIA7) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
-			lstat &= ~MANTIS_INT_PCMCIA7;
-
-		} else if (lstat & MANTIS_INT_PCMCIA6) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-06 *");
-			lstat &= ~MANTIS_INT_PCMCIA6;
-
-		} else if (lstat & MANTIS_INT_PCMCIA5) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-05 *");
-			lstat &= ~MANTIS_INT_PCMCIA5;
-
-		} else if (lstat & MANTIS_INT_PCMCIA4) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-04 *");
-			lstat &= ~MANTIS_INT_PCMCIA4;
-
-		} else if (lstat & MANTIS_INT_PCMCIA3) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-03 *");
-			lstat &= ~MANTIS_INT_PCMCIA3;
-
-		} else if (lstat & MANTIS_INT_PCMCIA2) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-02 *");
-			lstat &= ~MANTIS_INT_PCMCIA2;
-
-		} else if (lstat & MANTIS_INT_PCMCIA1) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-01 *");
-			lstat &= ~MANTIS_INT_PCMCIA1;
-
-		} else if (lstat & MANTIS_INT_PCMCIA0) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-00 *");
-			lstat &= ~MANTIS_INT_PCMCIA0;
-
-		} else if (lstat & MANTIS_INT_IRQ0) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
-			lstat &= ~MANTIS_INT_IRQ0;
-
-		} else if (lstat & MANTIS_INT_IRQ1) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
-			lstat &= ~MANTIS_INT_IRQ1;
-
-		} else if (lstat & MANTIS_INT_OCERR) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
-			lstat &= ~MANTIS_INT_OCERR;
-
-		} else if (lstat & MANTIS_INT_PABORT) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
-			lstat &= ~MANTIS_INT_PABORT;
-
-		} else if (lstat & MANTIS_INT_RIPERR) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
-			lstat &= ~MANTIS_INT_RIPERR;
-
-		} else if (lstat & MANTIS_INT_PPERR) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
-			lstat &= ~MANTIS_INT_PPERR;
-
-		} else if (lstat & MANTIS_INT_FTRGT) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
-			lstat &= ~MANTIS_INT_FTRGT;
-
-		} else if (lstat & MANTIS_INT_RISCI) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
-			mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
-			tasklet_schedule(&mantis->tasklet);
-			lstat &= ~MANTIS_INT_RISCI;
-
-		} else if (lstat & MANTIS_INT_I2CDONE) {
-			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
-			mantis->mantis_int_stat = stat;
-			mantis->mantis_int_mask = mask;
-			lstat &= ~MANTIS_INT_I2CDONE;
-		} else {
-			dprintk(verbose, MANTIS_DEBUG, 0,
-				"* Unknown [%04x/%04x] *", stat, mask);
-			break;
-		}
-		i++;
-		if (i > interrupts) {
-			dprintk(verbose, MANTIS_ERROR, 1, "going Loopy ! -- BREAK --");
-			break;
-		}
+	if (stat & MANTIS_INT_PPERR) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
 	}
+	if (stat & MANTIS_INT_FTRGT) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
+	}
+	if (stat & MANTIS_INT_RISCI) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
+		mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
+		tasklet_schedule(&mantis->tasklet);
+	}
+	if (stat & MANTIS_INT_I2CDONE) {
+		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
+		wake_up(&mantis->i2c_wq);
+	}
+	mmwrite(stat, MANTIS_INT_STAT);
+	stat &= ~(MANTIS_INT_RISCEN   | MANTIS_INT_I2CDONE |
+		  MANTIS_INT_I2CRACK  | MANTIS_INT_PCMCIA7 |
+		  MANTIS_INT_PCMCIA6  | MANTIS_INT_PCMCIA5 |
+		  MANTIS_INT_PCMCIA4  | MANTIS_INT_PCMCIA3 |
+		  MANTIS_INT_PCMCIA2  | MANTIS_INT_PCMCIA1 |
+		  MANTIS_INT_PCMCIA0  | MANTIS_INT_IRQ1	   |
+		  MANTIS_INT_IRQ0     | MANTIS_INT_OCERR   |
+		  MANTIS_INT_PABORT   | MANTIS_INT_RIPERR  |
+		  MANTIS_INT_PPERR    | MANTIS_INT_FTRGT   |
+		  MANTIS_INT_RISCI);
+
+	if (stat)
+		dprintk(verbose, MANTIS_DEBUG, 0, "* Unknown [%04x] *", stat);
+
 	dprintk(verbose, MANTIS_DEBUG, 0, "] ===\n");
 
 	return IRQ_HANDLED;
@@ -180,8 +137,6 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
 	struct mantis_pci *mantis;
 	int ret = 0;
 
-	devs++;
-
 	mantis = kmalloc(sizeof (struct mantis_pci), GFP_KERNEL);
 	if (mantis == NULL) {
 		printk("%s: Out of memory\n", __func__);
@@ -190,6 +145,8 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
 	}
 	memset(mantis, 0, sizeof (struct mantis_pci));
 	mantis->num = devs;
+	devs++;
+
 	if (pci_enable_device(pdev)) {
 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis PCI enable failed");
 		ret = -ENODEV;
@@ -225,11 +182,13 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
 	mantis->latency = latency;
 	mantis->revision = revision;
 	mantis->pdev = pdev;
+	mantis->subsystem_vendor = pdev->subsystem_vendor;
+	mantis->subsystem_device = pdev->subsystem_device;
 	init_waitqueue_head(&mantis->i2c_wq);
 
 	// CAM bypass
 	//mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK);
-	dprintk(verbose, MANTIS_INFO, 1, "gpif status: %04x  irqcfg: %04x", mmread(0x9c), mmread(0x98));
+	dprintk(verbose, MANTIS_INFO, 0, "\ngpif status: %04x  irqcfg: %04x\n", mmread(0x9c), mmread(0x98));
 	if ((mmread(0x9c) & 0x200) != 0) { //CAM inserted
 		msleep_interruptible(1);
 		if ((mmread(0x9c) & 0x200) != 0)
@@ -242,11 +201,8 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
 	}
 	mantis_set_direction(mantis, 0);
 
-	// default latency if none specified
 	if (!latency)
 		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 32);
-	dprintk(verbose, MANTIS_ERROR, 0, "Mantis Rev %d, ",
-		mantis->revision);
 
 	dprintk(verbose, MANTIS_ERROR, 0,
 		"irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",

+ 8 - 0
drivers/media/dvb/mantis/mantis_vp1033.c

@@ -81,6 +81,14 @@ struct stv0299_config lgtdqcs001f_config = {
 //	.pll_set		= lgtdqcs001f_pll_set,
 };
 
+#define MANTIS_MODEL_NAME	"VP-1033"
+#define MANTIS_DEV_TYPE		"DVB-S/DSS"
+
+struct mantis_hwconfig vp1033_mantis_config = {
+	.model_name		= MANTIS_MODEL_NAME,
+	.dev_type		= MANTIS_DEV_TYPE,
+};
+
 int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
 			  struct dvb_frontend_parameters *params)
 {

+ 5 - 1
drivers/media/dvb/mantis/mantis_vp1033.h

@@ -21,10 +21,14 @@
 #ifndef __MANTIS_VP1033_H
 #define __MANTIS_VP1033_H
 
-#include "stv0299.h"
 #include "dvb_frontend.h"
+#include "mantis_common.h"
+#include "stv0299.h"
+
+#define MANTIS_VP_1033_DVB_S	0x0016
 
 extern struct stv0299_config lgtdqcs001f_config;
+extern struct mantis_hwconfig vp1033_mantis_config;
 
 extern int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
 				 struct dvb_frontend_parameters *params);

+ 8 - 0
drivers/media/dvb/mantis/mantis_vp1034.c

@@ -26,6 +26,14 @@ struct mb86a16_config vp1034_config = {
 	.set_voltage	= vp1034_set_voltage,
 };
 
+#define MANTIS_MODEL_NAME	"VP-1034"
+#define MANTIS_DEV_TYPE		"DVB-S/DSS"
+
+struct mantis_hwconfig vp1034_mantis_config = {
+	.model_name	= MANTIS_MODEL_NAME,
+	.dev_type	= MANTIS_DEV_TYPE,
+};
+
 int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 {
 	struct mantis_pci *mantis = fe->dvb->priv;

+ 6 - 1
drivers/media/dvb/mantis/mantis_vp1034.h

@@ -21,9 +21,14 @@
 #ifndef __MANTIS_VP1034_H
 #define __MANTIS_VP1034_H
 
-#include "mb86a16.h"
 #include "dvb_frontend.h"
+#include "mantis_common.h"
+#include "mb86a16.h"
+
+
+#define MANTIS_VP_1034_DVB_S	0x0014
 
+extern struct mantis_hwconfig vp1034_mantis_config;
 extern struct mb86a16_config vp1034_config;
 extern int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
 

+ 14 - 6
drivers/media/dvb/mantis/mantis_vp2033.c

@@ -32,9 +32,17 @@ struct tda10021_state {
 	u8 reg0;
 };
 
+#define MANTIS_MODEL_NAME	"VP-2033"
+#define MANTIS_DEV_TYPE		"DVB-C"
+
+struct mantis_hwconfig vp2033_mantis_config = {
+	.model_name	= MANTIS_MODEL_NAME,
+	.dev_type	= MANTIS_DEV_TYPE,
+};
+
 struct cu1216_config philips_cu1216_config = {
-	.demod_address = 0x18 >> 1,
-	.pll_set = philips_cu1216_tuner_set,
+	.demod_address	= 0x18 >> 1,
+	.pll_set	= philips_cu1216_tuner_set,
 //	.fe_reset = mantis_fe_reset,
 };
 
@@ -47,10 +55,10 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe,
 	u8 buf[4];
 
 	struct i2c_msg msg = {
-		.addr = 0xc0 >> 1,
-		.flags = 0,
-		.buf = buf,
-		.len = sizeof (buf)
+		.addr	= 0xc0 >> 1,
+		.flags	= 0,
+		.buf	= buf,
+		.len	= sizeof (buf)
 	};
 
 #define TUNER_MUL 62500

+ 5 - 1
drivers/media/dvb/mantis/mantis_vp2033.h

@@ -21,10 +21,14 @@
 #ifndef __MANTIS_VP2033_H
 #define __MANTIS_VP2033_H
 
-#include "cu1216.h"
 #include "dvb_frontend.h"
+#include "mantis_common.h"
+#include "cu1216.h"
+
+#define MANTIS_VP_2033_DVB_C	0x0008
 
 extern struct cu1216_config philips_cu1216_config;
+extern struct mantis_hwconfig vp2033_mantis_config;
 
 extern int philips_cu1216_tuner_set(struct dvb_frontend *fe,
 				    struct dvb_frontend_parameters *params);

+ 9 - 1
drivers/media/dvb/mantis/mantis_vp3030.c

@@ -22,7 +22,15 @@
 #include "mantis_vp3030.h"
 
 struct zl10353_config mantis_vp3030_config = {
-	.demod_address = 0x0f,
+	.demod_address	= 0x0f,
+};
+
+#define MANTIS_MODEL_NAME	"VP-3030"
+#define MANTIS_DEV_TYPE		"DVB-T"
+
+struct mantis_hwconfig vp3030_mantis_config = {
+	.model_name	= MANTIS_MODEL_NAME,
+	.dev_type	= MANTIS_DEV_TYPE,
 };
 
 int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,

+ 6 - 2
drivers/media/dvb/mantis/mantis_vp3030.h

@@ -21,10 +21,14 @@
 #ifndef __MANTIS_VP3030_H
 #define __MANTIS_VP3030_H
 
-#include "zl10353.h"
-#include "dvb-pll.h"
 #include "dvb_frontend.h"
+#include "mantis_common.h"
+#include "dvb-pll.h"
+#include "zl10353.h"
+
+#define MANTIS_VP_3030_DVB_T	0x0024
 
 extern struct zl10353_config mantis_vp3030_config;
+extern struct mantis_hwconfig vp3030_mantis_config;
 
 #endif // __MANTIS_VP3030_H