Commit 294be03c authored by Romain Perier's avatar Romain Perier Committed by Wolfram Sang

i2c: pxa: Add support for the I2C units found in Armada 3700

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: default avatarRomain Perier <romain.perier@free-electrons.com>
Tested-by: default avatarGregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 6c14bdac
...@@ -763,7 +763,7 @@ config I2C_PUV3 ...@@ -763,7 +763,7 @@ config I2C_PUV3
config I2C_PXA config I2C_PXA
tristate "Intel PXA2XX I2C adapter" 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 help
If you have devices in the PXA I2C bus, say yes to this option. 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 This driver can also be built as a module. If so, the module
......
...@@ -57,8 +57,12 @@ enum pxa_i2c_types { ...@@ -57,8 +57,12 @@ enum pxa_i2c_types {
REGS_PXA3XX, REGS_PXA3XX,
REGS_CE4100, REGS_CE4100,
REGS_PXA910, 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 * I2C registers definitions
*/ */
...@@ -93,6 +97,15 @@ static struct pxa_reg_layout pxa_reg_layout[] = { ...@@ -93,6 +97,15 @@ static struct pxa_reg_layout pxa_reg_layout[] = {
.ilcr = 0x28, .ilcr = 0x28,
.iwcr = 0x30, .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[] = { static const struct platform_device_id i2c_pxa_id_table[] = {
...@@ -100,6 +113,7 @@ 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 }, { "pxa3xx-pwri2c", REGS_PXA3XX },
{ "ce4100-i2c", REGS_CE4100 }, { "ce4100-i2c", REGS_CE4100 },
{ "pxa910-i2c", REGS_PXA910 }, { "pxa910-i2c", REGS_PXA910 },
{ "armada-3700-i2c", REGS_A3700 },
{ }, { },
}; };
MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table); MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
...@@ -1141,6 +1155,7 @@ static const struct of_device_id i2c_pxa_dt_ids[] = { ...@@ -1141,6 +1155,7 @@ static const struct of_device_id i2c_pxa_dt_ids[] = {
{ .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX }, { .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX },
{ .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX }, { .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX },
{ .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA910 }, { .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); MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment