Merge tag 'driver-core-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / i2c / busses / i2c-davinci.c
index dcf671b736b72b273351bc34e373fe582943c54e..6dc7ff5d3d9a050aafd82d1143440f7654031033 100644 (file)
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  * ----------------------------------------------------------------------------
  *
  */
@@ -372,8 +368,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
                flag |= DAVINCI_I2C_MDR_STP;
        davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
 
-       r = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
-                                                     dev->adapter.timeout);
+       r = wait_for_completion_timeout(&dev->cmd_complete, dev->adapter.timeout);
        if (r == 0) {
                dev_err(dev->dev, "controller timed out\n");
                davinci_i2c_recover_bus(dev);
@@ -384,7 +379,6 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
        if (dev->buf_len) {
                /* This should be 0 if all bytes were transferred
                 * or dev->cmd_err denotes an error.
-                * A signal may have aborted the transfer.
                 */
                if (r >= 0) {
                        dev_err(dev->dev, "abnormal termination buf_len=%i\n",
@@ -411,11 +405,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
        if (dev->cmd_err & DAVINCI_I2C_STR_NACK) {
                if (msg->flags & I2C_M_IGNORE_NAK)
                        return msg->len;
-               if (stop) {
-                       w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
-                       w |= DAVINCI_I2C_MDR_STP;
-                       davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
-               }
+               w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
+               w |= DAVINCI_I2C_MDR_STP;
+               davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
                return -EREMOTEIO;
        }
        return -EIO;
@@ -640,13 +632,17 @@ static int davinci_i2c_probe(struct platform_device *pdev)
 {
        struct davinci_i2c_dev *dev;
        struct i2c_adapter *adap;
-       struct resource *mem, *irq;
-       int r;
-
-       irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (!irq) {
-               dev_err(&pdev->dev, "no irq resource?\n");
-               return -ENODEV;
+       struct resource *mem;
+       int r, irq;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq <= 0) {
+               if (!irq)
+                       irq = -ENXIO;
+               if (irq != -EPROBE_DEFER)
+                       dev_err(&pdev->dev,
+                               "can't get irq resource ret=%d\n", irq);
+               return irq;
        }
 
        dev = devm_kzalloc(&pdev->dev, sizeof(struct davinci_i2c_dev),
@@ -661,7 +657,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)
        init_completion(&dev->xfr_complete);
 #endif
        dev->dev = &pdev->dev;
-       dev->irq = irq->start;
+       dev->irq = irq;
        dev->pdata = dev_get_platdata(&pdev->dev);
        platform_set_drvdata(pdev, dev);