]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/i2c/busses/i2c-ismt.c
i2c: ismt: propagate actual error code
[karo-tx-linux.git] / drivers / i2c / busses / i2c-ismt.c
index f994712d0904733782e6804c20bd7ad47eaffb94..21cd4f6636bf3812f56211d26b1f84b4cdb1683b 100644 (file)
@@ -165,14 +165,13 @@ struct ismt_desc {
 
 struct ismt_priv {
        struct i2c_adapter adapter;
-       void *smba;                             /* PCI BAR */
+       void __iomem *smba;                     /* PCI BAR */
        struct pci_dev *pci_dev;
        struct ismt_desc *hw;                   /* descriptor virt base addr */
        dma_addr_t io_rng_dma;                  /* descriptor HW base addr */
        u8 head;                                /* ring buffer head pointer */
        struct completion cmp;                  /* interrupt completion */
        u8 dma_buffer[I2C_SMBUS_BLOCK_MAX + 1]; /* temp R/W data buffer */
-       bool using_msi;                         /* type of interrupt flag */
 };
 
 /**
@@ -398,7 +397,7 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,
        desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, read_write);
 
        /* Initialize common control bits */
-       if (likely(priv->using_msi))
+       if (likely(pci_dev_msi_enabled(priv->pci_dev)))
                desc->control = ISMT_DESC_INT | ISMT_DESC_FAIR;
        else
                desc->control = ISMT_DESC_FAIR;
@@ -806,7 +805,6 @@ static int ismt_int_init(struct ismt_priv *priv)
                goto intx;
        }
 
-       priv->using_msi = true;
        goto done;
 
        /* Try using legacy interrupts */
@@ -819,11 +817,9 @@ intx:
                               priv);
        if (err) {
                dev_err(&priv->pci_dev->dev, "no usable interrupts\n");
-               return -ENODEV;
+               return err;
        }
 
-       priv->using_msi = false;
-
 done:
        return 0;
 }
@@ -904,8 +900,7 @@ ismt_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        priv->smba = pcim_iomap(pdev, SMBBAR, len);
        if (!priv->smba) {
                dev_err(&pdev->dev, "Unable to ioremap SMBus BAR\n");
-               err = -ENODEV;
-               goto fail;
+               return -ENODEV;
        }
 
        if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) ||
@@ -915,32 +910,26 @@ ismt_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                                                 DMA_BIT_MASK(32)) != 0)) {
                        dev_err(&pdev->dev, "pci_set_dma_mask fail %p\n",
                                pdev);
-                       err = -ENODEV;
-                       goto fail;
+                       return -ENODEV;
                }
        }
 
        err = ismt_dev_init(priv);
        if (err)
-               goto fail;
+               return err;
 
        ismt_hw_init(priv);
 
        err = ismt_int_init(priv);
        if (err)
-               goto fail;
+               return err;
 
        err = i2c_add_adapter(&priv->adapter);
        if (err) {
                dev_err(&pdev->dev, "Failed to add SMBus iSMT adapter\n");
-               err = -ENODEV;
-               goto fail;
+               return -ENODEV;
        }
        return 0;
-
-fail:
-       pci_release_region(pdev, SMBBAR);
-       return err;
 }
 
 /**
@@ -952,47 +941,13 @@ static void ismt_remove(struct pci_dev *pdev)
        struct ismt_priv *priv = pci_get_drvdata(pdev);
 
        i2c_del_adapter(&priv->adapter);
-       pci_release_region(pdev, SMBBAR);
-}
-
-/**
- * ismt_suspend() - place the device in suspend
- * @pdev: PCI-Express device
- * @mesg: PM message
- */
-#ifdef CONFIG_PM
-static int ismt_suspend(struct pci_dev *pdev, pm_message_t mesg)
-{
-       pci_save_state(pdev);
-       pci_set_power_state(pdev, pci_choose_state(pdev, mesg));
-       return 0;
-}
-
-/**
- * ismt_resume() - PCI resume code
- * @pdev: PCI-Express device
- */
-static int ismt_resume(struct pci_dev *pdev)
-{
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-       return pci_enable_device(pdev);
 }
 
-#else
-
-#define ismt_suspend NULL
-#define ismt_resume NULL
-
-#endif
-
 static struct pci_driver ismt_driver = {
        .name = "ismt_smbus",
        .id_table = ismt_ids,
        .probe = ismt_probe,
        .remove = ismt_remove,
-       .suspend = ismt_suspend,
-       .resume = ismt_resume,
 };
 
 module_pci_driver(ismt_driver);