Signed-off-by: Rade Bozic <rade.bozic.ext@nsn.com>
Signed-off-by: David Daney <ddaney@caviumnetworks.com>

---> 
diff -purN linux-2.6_org/drivers/i2c/busses/i2c-octeon.c linux-2.6_i2c/drivers/i2c/busses/i2c-octeon.c
--- linux-2.6_org/drivers/i2c/busses/i2c-octeon.c	2010-01-22 16:33:23.000000000 +0100
+++ linux-2.6_i2c/drivers/i2c/busses/i2c-octeon.c	2010-01-25 15:33:23.000000000 +0100
@@ -10,7 +10,6 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
-
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/sched.h>
@@ -352,7 +351,7 @@ static int octeon_i2c_xfer(struct i2c_ad
 	}
 	octeon_i2c_stop(i2c);
 
-	return (ret < 0) ? ret : num;
+	return (ret < 0) ? EIO : num;
 }
 
 static u32 octeon_i2c_functionality(struct i2c_adapter *adap)
@@ -457,13 +456,13 @@ static int __init octeon_i2c_probe(struc
 	if (res_mem == NULL) {
 		dev_dbg(i2c->dev, "%s: found no memory resource\n", __func__);
 		kfree(i2c);
-		return -ENODEV;
+		return -EINVAL;
 	}
 
 	if (i2c_data == NULL) {
 		dev_dbg(i2c->dev, "%s: no I2C frequence data\n", __func__);
 		kfree(i2c);
-		return -ENODEV;
+		return -EINVAL;
 	}
 
 	i2c->twsi_phys = res_mem->start;
@@ -475,6 +474,7 @@ static int __init octeon_i2c_probe(struc
 		dev_dbg(i2c->dev,
 			"%s i2c-cavium - request_mem_region failed\n",
 			__func__);
+		result = -ENOMEM;
 		goto fail_region;
 	}
 	i2c->twsi_base = ioremap(i2c->twsi_phys, i2c->regsize);
@@ -482,27 +482,37 @@ static int __init octeon_i2c_probe(struc
 	init_waitqueue_head(&i2c->queue);
 
 	i2c->irq = irq;
+
+	/* i2c->irq == NO_IRQ implies polling */
 	if (i2c->irq != NO_IRQ) {
-		/* i2c->irq = NO_IRQ implies polling */
-		result = request_irq(i2c->irq, octeon_i2c_isr, 0, DRV_NAME, i2c);
-		if (result < 0) {
+		if (i2c->irq < 0) {
 			dev_dbg(i2c->dev,
-				"%s: - failed to attach interrupt\n",
+				"%s: - bad interrupt number\n",
 				__func__);
+			result = -EINVAL;
 			goto fail_irq;
+		} else {
+			result = request_irq(i2c->irq, octeon_i2c_isr, 0,
+								DRV_NAME, i2c);
+			if (result < 0) {
+				dev_dbg(i2c->dev,
+					"%s: - failed to attach interrupt\n",
+					__func__);
+				goto fail_irq;
+			}
 		}
 	}
 
 	result = octeon_i2c_initlowlevel(i2c);
 	if (result) {
 		dev_dbg(i2c->dev, "%s: init low level failed\n", __func__);
-		goto  fail_add;
+		goto fail_add;
 	}
 
 	result = octeon_i2c_setclock(i2c);
 	if (result) {
 		dev_dbg(i2c->dev, "%s: clock init failed\n", __func__);
-		goto  fail_add;
+		goto fail_add;
 	}
 
 	i2c->adap = octeon_i2c_ops;
@@ -530,7 +540,7 @@ fail_region:
 	return result;
 };
 
-static int __exit octeon_i2c_remove(struct platform_device *pdev)
+static int __devexit octeon_i2c_remove(struct platform_device *pdev)
 {
 	struct octeon_i2c *i2c = platform_get_drvdata(pdev);
 
@@ -546,7 +556,7 @@ static int __exit octeon_i2c_remove(stru
 
 static struct platform_driver octeon_i2c_driver = {
 	.probe		= octeon_i2c_probe,
-	.remove		= __exit_p(octeon_i2c_remove),
+	.remove		= __devexit_p(octeon_i2c_remove),
 	.driver		= {
 		.owner	= THIS_MODULE,
 		.name	= DRV_NAME,
@@ -576,4 +586,3 @@ MODULE_ALIAS("platform:" DRV_NAME);
 
 module_init(octeon_i2c_init);
 module_exit(octeon_i2c_exit);
-
