Merge tag 'v3.14.25' into backport/v3.14.24-ltsi-rc1+v3.14.25/snapshot-merge.wip
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / i2c / busses / i2c-xiic.c
index fc2716a..63c0a2f 100644 (file)
  * 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.
- *
  *
  * This code was implemented by Mocean Laboratories AB when porting linux
  * to the automotive development board Russellville. The copyright holder
@@ -30,8 +26,8 @@
  */
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/init.h>
 #include <linux/errno.h>
+#include <linux/err.h>
 #include <linux/delay.h>
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
@@ -69,7 +65,7 @@ struct xiic_i2c {
        struct i2c_adapter      adap;
        struct i2c_msg          *tx_msg;
        spinlock_t              lock;
-       unsigned int            tx_pos;
+       unsigned int            tx_pos;
        unsigned int            nmsgs;
        enum xilinx_i2c_state   state;
        struct i2c_msg          *rx_msg;
@@ -272,8 +268,8 @@ static void xiic_read_rx(struct xiic_i2c *i2c)
 
        bytes_in_fifo = xiic_getreg8(i2c, XIIC_RFO_REG_OFFSET) + 1;
 
-       dev_dbg(i2c->adap.dev.parent, "%s entry, bytes in fifo: %d, msg: %d"
-               ", SR: 0x%x, CR: 0x%x\n",
+       dev_dbg(i2c->adap.dev.parent,
+               "%s entry, bytes in fifo: %d, msg: %d, SR: 0x%x, CR: 0x%x\n",
                __func__, bytes_in_fifo, xiic_rx_space(i2c),
                xiic_getreg8(i2c, XIIC_SR_REG_OFFSET),
                xiic_getreg8(i2c, XIIC_CR_REG_OFFSET));
@@ -340,9 +336,10 @@ static void xiic_process(struct xiic_i2c *i2c)
        ier = xiic_getreg32(i2c, XIIC_IIER_OFFSET);
        pend = isr & ier;
 
-       dev_dbg(i2c->adap.dev.parent, "%s entry, IER: 0x%x, ISR: 0x%x, "
-               "pend: 0x%x, SR: 0x%x, msg: %p, nmsgs: %d\n",
-               __func__, ier, isr, pend, xiic_getreg8(i2c, XIIC_SR_REG_OFFSET),
+       dev_dbg(i2c->adap.dev.parent, "%s: IER: 0x%x, ISR: 0x%x, pend: 0x%x\n",
+               __func__, ier, isr, pend);
+       dev_dbg(i2c->adap.dev.parent, "%s: SR: 0x%x, msg: %p, nmsgs: %d\n",
+               __func__, xiic_getreg8(i2c, XIIC_SR_REG_OFFSET),
                i2c->tx_msg, i2c->nmsgs);
 
        /* Do not processes a devices interrupts if the device has no
@@ -542,9 +539,10 @@ static void xiic_start_send(struct xiic_i2c *i2c)
 
        xiic_irq_clr(i2c, XIIC_INTR_TX_ERROR_MASK);
 
-       dev_dbg(i2c->adap.dev.parent, "%s entry, msg: %p, len: %d, "
-               "ISR: 0x%x, CR: 0x%x\n",
-               __func__, msg, msg->len, xiic_getreg32(i2c, XIIC_IISR_OFFSET),
+       dev_dbg(i2c->adap.dev.parent, "%s entry, msg: %p, len: %d",
+               __func__, msg, msg->len);
+       dev_dbg(i2c->adap.dev.parent, "%s entry, ISR: 0x%x, CR: 0x%x\n",
+               __func__, xiic_getreg32(i2c, XIIC_IISR_OFFSET),
                xiic_getreg8(i2c, XIIC_CR_REG_OFFSET));
 
        if (!(msg->flags & I2C_M_NOSTART)) {
@@ -695,33 +693,21 @@ static int xiic_i2c_probe(struct platform_device *pdev)
        int ret, irq;
        u8 i;
 
+       i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
+       if (!i2c)
+               return -ENOMEM;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               goto resource_missing;
+       i2c->base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(i2c->base))
+               return PTR_ERR(i2c->base);
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
-               goto resource_missing;
+               return irq;
 
        pdata = dev_get_platdata(&pdev->dev);
 
-       i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
-       if (!i2c)
-               return -ENOMEM;
-
-       if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
-               dev_err(&pdev->dev, "Memory region busy\n");
-               ret = -EBUSY;
-               goto request_mem_failed;
-       }
-
-       i2c->base = ioremap(res->start, resource_size(res));
-       if (!i2c->base) {
-               dev_err(&pdev->dev, "Unable to map registers\n");
-               ret = -EIO;
-               goto map_failed;
-       }
-
        /* hook up driver to tree */
        platform_set_drvdata(pdev, i2c);
        i2c->adap = xiic_adapter;
@@ -729,21 +715,23 @@ static int xiic_i2c_probe(struct platform_device *pdev)
        i2c->adap.dev.parent = &pdev->dev;
        i2c->adap.dev.of_node = pdev->dev.of_node;
 
-       xiic_reinit(i2c);
-
        spin_lock_init(&i2c->lock);
        init_waitqueue_head(&i2c->wait);
-       ret = request_irq(irq, xiic_isr, 0, pdev->name, i2c);
-       if (ret) {
+
+       ret = devm_request_irq(&pdev->dev, irq, xiic_isr, 0, pdev->name, i2c);
+       if (ret < 0) {
                dev_err(&pdev->dev, "Cannot claim IRQ\n");
-               goto request_irq_failed;
+               return ret;
        }
 
+       xiic_reinit(i2c);
+
        /* add i2c adapter to i2c tree */
        ret = i2c_add_adapter(&i2c->adap);
        if (ret) {
                dev_err(&pdev->dev, "Failed to add adapter\n");
-               goto add_adapter_failed;
+               xiic_deinit(i2c);
+               return ret;
        }
 
        if (pdata) {
@@ -753,43 +741,17 @@ static int xiic_i2c_probe(struct platform_device *pdev)
        }
 
        return 0;
-
-add_adapter_failed:
-       free_irq(irq, i2c);
-request_irq_failed:
-       xiic_deinit(i2c);
-       iounmap(i2c->base);
-map_failed:
-       release_mem_region(res->start, resource_size(res));
-request_mem_failed:
-       kfree(i2c);
-
-       return ret;
-resource_missing:
-       dev_err(&pdev->dev, "IRQ or Memory resource is missing\n");
-       return -ENOENT;
 }
 
 static int xiic_i2c_remove(struct platform_device *pdev)
 {
        struct xiic_i2c *i2c = platform_get_drvdata(pdev);
-       struct resource *res;
 
        /* remove adapter & data */
        i2c_del_adapter(&i2c->adap);
 
        xiic_deinit(i2c);
 
-       free_irq(platform_get_irq(pdev, 0), i2c);
-
-       iounmap(i2c->base);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (res)
-               release_mem_region(res->start, resource_size(res));
-
-       kfree(i2c);
-
        return 0;
 }