These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / i2c / busses / i2c-pxa.c
index d9c0d6a..0d35195 100644 (file)
@@ -46,12 +46,15 @@ struct pxa_reg_layout {
        u32 icr;
        u32 isr;
        u32 isar;
+       u32 ilcr;
+       u32 iwcr;
 };
 
 enum pxa_i2c_types {
        REGS_PXA2XX,
        REGS_PXA3XX,
        REGS_CE4100,
+       REGS_PXA910,
 };
 
 /*
@@ -79,12 +82,22 @@ static struct pxa_reg_layout pxa_reg_layout[] = {
                .isr =  0x04,
                /* no isar register */
        },
+       [REGS_PXA910] = {
+               .ibmr = 0x00,
+               .idbr = 0x08,
+               .icr =  0x10,
+               .isr =  0x18,
+               .isar = 0x20,
+               .ilcr = 0x28,
+               .iwcr = 0x30,
+       },
 };
 
 static const struct platform_device_id i2c_pxa_id_table[] = {
        { "pxa2xx-i2c",         REGS_PXA2XX },
        { "pxa3xx-pwri2c",      REGS_PXA3XX },
        { "ce4100-i2c",         REGS_CE4100 },
+       { "pxa910-i2c",         REGS_PXA910 },
        { },
 };
 MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
@@ -124,6 +137,23 @@ MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
 #define ISR_SAD                (1 << 9)           /* slave address detected */
 #define ISR_BED                (1 << 10)          /* bus error no ACK/NAK */
 
+/* bit field shift & mask */
+#define ILCR_SLV_SHIFT         0
+#define ILCR_SLV_MASK          (0x1FF << ILCR_SLV_SHIFT)
+#define ILCR_FLV_SHIFT         9
+#define ILCR_FLV_MASK          (0x1FF << ILCR_FLV_SHIFT)
+#define ILCR_HLVL_SHIFT                18
+#define ILCR_HLVL_MASK         (0x1FF << ILCR_HLVL_SHIFT)
+#define ILCR_HLVH_SHIFT                27
+#define ILCR_HLVH_MASK         (0x1F << ILCR_HLVH_SHIFT)
+
+#define IWCR_CNT_SHIFT         0
+#define IWCR_CNT_MASK          (0x1F << IWCR_CNT_SHIFT)
+#define IWCR_HS_CNT1_SHIFT     5
+#define IWCR_HS_CNT1_MASK      (0x1F << IWCR_HS_CNT1_SHIFT)
+#define IWCR_HS_CNT2_SHIFT     10
+#define IWCR_HS_CNT2_MASK      (0x1F << IWCR_HS_CNT2_SHIFT)
+
 struct pxa_i2c {
        spinlock_t              lock;
        wait_queue_head_t       wait;
@@ -132,6 +162,7 @@ struct pxa_i2c {
        unsigned int            msg_idx;
        unsigned int            msg_ptr;
        unsigned int            slave_addr;
+       unsigned int            req_slave_addr;
 
        struct i2c_adapter      adap;
        struct clk              *clk;
@@ -149,6 +180,8 @@ struct pxa_i2c {
        void __iomem            *reg_icr;
        void __iomem            *reg_isr;
        void __iomem            *reg_isar;
+       void __iomem            *reg_ilcr;
+       void __iomem            *reg_iwcr;
 
        unsigned long           iobase;
        unsigned long           iosize;
@@ -167,6 +200,8 @@ struct pxa_i2c {
 #define _ICR(i2c)      ((i2c)->reg_icr)
 #define _ISR(i2c)      ((i2c)->reg_isr)
 #define _ISAR(i2c)     ((i2c)->reg_isar)
+#define _ILCR(i2c)     ((i2c)->reg_ilcr)
+#define _IWCR(i2c)     ((i2c)->reg_iwcr)
 
 /*
  * I2C Slave mode address
@@ -253,15 +288,20 @@ static void i2c_pxa_show_state(struct pxa_i2c *i2c, int lno, const char *fname)
 static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
 {
        unsigned int i;
-       printk(KERN_ERR "i2c: error: %s\n", why);
-       printk(KERN_ERR "i2c: msg_num: %d msg_idx: %d msg_ptr: %d\n",
+       struct device *dev = &i2c->adap.dev;
+
+       dev_err(dev, "slave_0x%x error: %s\n",
+               i2c->req_slave_addr >> 1, why);
+       dev_err(dev, "msg_num: %d msg_idx: %d msg_ptr: %d\n",
                i2c->msg_num, i2c->msg_idx, i2c->msg_ptr);
-       printk(KERN_ERR "i2c: ICR: %08x ISR: %08x\n",
-              readl(_ICR(i2c)), readl(_ISR(i2c)));
-       printk(KERN_DEBUG "i2c: log: ");
+       dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
+               readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
+               readl(_ISR(i2c)));
+       dev_dbg(dev, "log: ");
        for (i = 0; i < i2c->irqlogidx; i++)
-               printk("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
-       printk("\n");
+               pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
+
+       pr_debug("\n");
 }
 
 #else /* ifdef DEBUG */
@@ -459,7 +499,7 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c)
        writel(I2C_ISR_INIT, _ISR(i2c));
        writel(readl(_ICR(i2c)) & ~ICR_UR, _ICR(i2c));
 
-       if (i2c->reg_isar)
+       if (i2c->reg_isar && IS_ENABLED(CONFIG_I2C_PXA_SLAVE))
                writel(i2c->slave_addr, _ISAR(i2c));
 
        /* set control register values */
@@ -638,6 +678,7 @@ static inline void i2c_pxa_start_message(struct pxa_i2c *i2c)
         * Step 1: target slave address into IDBR
         */
        writel(i2c_pxa_addr_byte(i2c->msg), _IDBR(i2c));
+       i2c->req_slave_addr = i2c_pxa_addr_byte(i2c->msg);
 
        /*
         * Step 2: initiate the write.
@@ -745,8 +786,10 @@ static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
        ret = i2c->msg_idx;
 
 out:
-       if (timeout == 0)
+       if (timeout == 0) {
                i2c_pxa_scream_blue_murder(i2c, "timeout");
+               ret = I2C_RETRY;
+       }
 
        return ret;
 }
@@ -949,6 +992,7 @@ static void i2c_pxa_irq_txempty(struct pxa_i2c *i2c, u32 isr)
                 * Write the next address.
                 */
                writel(i2c_pxa_addr_byte(i2c->msg), _IDBR(i2c));
+               i2c->req_slave_addr = i2c_pxa_addr_byte(i2c->msg);
 
                /*
                 * And trigger a repeated start, and send the byte.
@@ -1092,7 +1136,7 @@ static const struct i2c_algorithm i2c_pxa_pio_algorithm = {
 static const struct of_device_id i2c_pxa_dt_ids[] = {
        { .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX },
        { .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX },
-       { .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA2XX },
+       { .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA910 },
        {}
 };
 MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);
@@ -1114,7 +1158,9 @@ static int i2c_pxa_probe_dt(struct platform_device *pdev, struct pxa_i2c *i2c,
                i2c->use_pio = 1;
        if (of_get_property(np, "mrvl,i2c-fast-mode", NULL))
                i2c->fast_mode = 1;
-       *i2c_types = (u32)(of_id->data);
+
+       *i2c_types = (enum pxa_i2c_types)(of_id->data);
+
        return 0;
 }
 
@@ -1146,10 +1192,19 @@ static int i2c_pxa_probe(struct platform_device *dev)
        struct resource *res = NULL;
        int ret, irq;
 
-       i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
-       if (!i2c) {
-               ret = -ENOMEM;
-               goto emalloc;
+       i2c = devm_kzalloc(&dev->dev, sizeof(struct pxa_i2c), GFP_KERNEL);
+       if (!i2c)
+               return -ENOMEM;
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       i2c->reg_base = devm_ioremap_resource(&dev->dev, res);
+       if (IS_ERR(i2c->reg_base))
+               return PTR_ERR(i2c->reg_base);
+
+       irq = platform_get_irq(dev, 0);
+       if (irq < 0) {
+               dev_err(&dev->dev, "no irq resource: %d\n", irq);
+               return irq;
        }
 
        /* Default adapter num to device id; i2c_pxa_probe_dt can override. */
@@ -1159,19 +1214,7 @@ static int i2c_pxa_probe(struct platform_device *dev)
        if (ret > 0)
                ret = i2c_pxa_probe_pdata(dev, i2c, &i2c_type);
        if (ret < 0)
-               goto eclk;
-
-       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       irq = platform_get_irq(dev, 0);
-       if (res == NULL || irq < 0) {
-               ret = -ENODEV;
-               goto eclk;
-       }
-
-       if (!request_mem_region(res->start, resource_size(res), res->name)) {
-               ret = -ENOMEM;
-               goto eclk;
-       }
+               return ret;
 
        i2c->adap.owner   = THIS_MODULE;
        i2c->adap.retries = 5;
@@ -1181,16 +1224,10 @@ static int i2c_pxa_probe(struct platform_device *dev)
 
        strlcpy(i2c->adap.name, "pxa_i2c-i2c", sizeof(i2c->adap.name));
 
-       i2c->clk = clk_get(&dev->dev, NULL);
+       i2c->clk = devm_clk_get(&dev->dev, NULL);
        if (IS_ERR(i2c->clk)) {
-               ret = PTR_ERR(i2c->clk);
-               goto eclk;
-       }
-
-       i2c->reg_base = ioremap(res->start, resource_size(res));
-       if (!i2c->reg_base) {
-               ret = -EIO;
-               goto eremap;
+               dev_err(&dev->dev, "failed to get the clk: %ld\n", PTR_ERR(i2c->clk));
+               return PTR_ERR(i2c->clk);
        }
 
        i2c->reg_ibmr = i2c->reg_base + pxa_reg_layout[i2c_type].ibmr;
@@ -1200,6 +1237,11 @@ static int i2c_pxa_probe(struct platform_device *dev)
        if (i2c_type != REGS_CE4100)
                i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar;
 
+       if (i2c_type == REGS_PXA910) {
+               i2c->reg_ilcr = i2c->reg_base + pxa_reg_layout[i2c_type].ilcr;
+               i2c->reg_iwcr = i2c->reg_base + pxa_reg_layout[i2c_type].iwcr;
+       }
+
        i2c->iobase = res->start;
        i2c->iosize = resource_size(res);
 
@@ -1232,10 +1274,13 @@ static int i2c_pxa_probe(struct platform_device *dev)
                i2c->adap.algo = &i2c_pxa_pio_algorithm;
        } else {
                i2c->adap.algo = &i2c_pxa_algorithm;
-               ret = request_irq(irq, i2c_pxa_handler, IRQF_SHARED,
-                                 dev_name(&dev->dev), i2c);
-               if (ret)
+               ret = devm_request_irq(&dev->dev, irq, i2c_pxa_handler,
+                               IRQF_SHARED | IRQF_NO_SUSPEND,
+                               dev_name(&dev->dev), i2c);
+               if (ret) {
+                       dev_err(&dev->dev, "failed to request irq: %d\n", ret);
                        goto ereqirq;
+               }
        }
 
        i2c_pxa_reset(i2c);
@@ -1248,33 +1293,22 @@ static int i2c_pxa_probe(struct platform_device *dev)
 
        ret = i2c_add_numbered_adapter(&i2c->adap);
        if (ret < 0) {
-               printk(KERN_INFO "I2C: Failed to add bus\n");
-               goto eadapt;
+               dev_err(&dev->dev, "failed to add bus: %d\n", ret);
+               goto ereqirq;
        }
 
        platform_set_drvdata(dev, i2c);
 
 #ifdef CONFIG_I2C_PXA_SLAVE
-       printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
-              dev_name(&i2c->adap.dev), i2c->slave_addr);
+       dev_info(&i2c->adap.dev, " PXA I2C adapter, slave address %d\n",
+               i2c->slave_addr);
 #else
-       printk(KERN_INFO "I2C: %s: PXA I2C adapter\n",
-              dev_name(&i2c->adap.dev));
+       dev_info(&i2c->adap.dev, " PXA I2C adapter\n");
 #endif
        return 0;
 
-eadapt:
-       if (!i2c->use_pio)
-               free_irq(irq, i2c);
 ereqirq:
        clk_disable_unprepare(i2c->clk);
-       iounmap(i2c->reg_base);
-eremap:
-       clk_put(i2c->clk);
-eclk:
-       kfree(i2c);
-emalloc:
-       release_mem_region(res->start, resource_size(res));
        return ret;
 }
 
@@ -1283,15 +1317,8 @@ static int i2c_pxa_remove(struct platform_device *dev)
        struct pxa_i2c *i2c = platform_get_drvdata(dev);
 
        i2c_del_adapter(&i2c->adap);
-       if (!i2c->use_pio)
-               free_irq(i2c->irq, i2c);
 
        clk_disable_unprepare(i2c->clk);
-       clk_put(i2c->clk);
-
-       iounmap(i2c->reg_base);
-       release_mem_region(i2c->iobase, i2c->iosize);
-       kfree(i2c);
 
        return 0;
 }