Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+15 −0
Original line number Diff line number Diff line
@@ -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);