i2c: pxa: Add support for the I2C units found in Armada 3700
authorRomain Perier <romain.perier@free-electrons.com>
Thu, 1 Dec 2016 11:04:38 +0000 (12:04 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 1 Dec 2016 22:34:33 +0000 (23:34 +0100)
The Armada 3700 has two I2C controllers that is compliant with the I2C
Bus Specificiation 2.1, supports multi-master and different bus speed:
Standard mode (up to 100 KHz), Fast mode (up to 400 KHz),
High speed mode (up to 3.4 Mhz).

This IP block has a lot of similarity with the PXA, except some register
offsets and bitfield. This commits adds a basic support for this I2C
unit.

Signed-off-by: Romain Perier <romain.perier@free-electrons.com>
Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/Kconfig
drivers/i2c/busses/i2c-pxa.c

index 6399ceab402b097dd53c69ca3e5cd7551c18fcd8..3ff7c031e04a3754cc8376b994e80216f1a3d39c 100644 (file)
@@ -763,7 +763,7 @@ config I2C_PUV3
 
 config I2C_PXA
        tristate "Intel PXA2XX I2C adapter"
-       depends on ARCH_PXA || ARCH_MMP || (X86_32 && PCI && OF)
+       depends on ARCH_PXA || ARCH_MMP || ARCH_MVEBU || (X86_32 && PCI && OF)
        help
          If you have devices in the PXA I2C bus, say yes to this option.
          This driver can also be built as a module.  If so, the module
index b4ac235c48ff9ae27a52e5dc2800066c2f39b0a6..6cf333ecc8b83fc8afcf1800ea90dd40b4d4ae5b 100644 (file)
@@ -57,8 +57,12 @@ enum pxa_i2c_types {
        REGS_PXA3XX,
        REGS_CE4100,
        REGS_PXA910,
+       REGS_A3700,
 };
 
+#define ICR_BUSMODE_FM (1 << 16)          /* shifted fast mode for armada-3700 */
+#define ICR_BUSMODE_HS (1 << 17)          /* shifted high speed mode for armada-3700 */
+
 /*
  * I2C registers definitions
  */
@@ -93,6 +97,15 @@ static struct pxa_reg_layout pxa_reg_layout[] = {
                .ilcr = 0x28,
                .iwcr = 0x30,
        },
+       [REGS_A3700] = {
+               .ibmr = 0x00,
+               .idbr = 0x04,
+               .icr =  0x08,
+               .isr =  0x0c,
+               .isar = 0x10,
+               .fm = ICR_BUSMODE_FM,
+               .hs = ICR_BUSMODE_HS,
+       },
 };
 
 static const struct platform_device_id i2c_pxa_id_table[] = {
@@ -100,6 +113,7 @@ static const struct platform_device_id i2c_pxa_id_table[] = {
        { "pxa3xx-pwri2c",      REGS_PXA3XX },
        { "ce4100-i2c",         REGS_CE4100 },
        { "pxa910-i2c",         REGS_PXA910 },
+       { "armada-3700-i2c",    REGS_A3700  },
        { },
 };
 MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
@@ -1141,6 +1155,7 @@ 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_PXA910 },
+       { .compatible = "marvell,armada-3700-i2c", .data = (void *)REGS_A3700 },
        {}
 };
 MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);