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>
diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
index cfecb34..8b90a2a 100644
--- a/drivers/media/dvb/mantis/mantis_i2c.c
+++ b/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 @@
 {
 	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 @@
 		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 @@
 	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 @@
 		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 @@
 
 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 @@
 
 	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;
 }