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

Commit d48a41c1 authored by Srinidhi Kasagar's avatar Srinidhi Kasagar Committed by Russell King
Browse files

ARM: 5913/1: ARM U8500: add I2C platform configurations



This adds platform configurations to support four
i2c controllers found on early MOP500 platform

This depends on the patch 5908/1 for build to succeed.

Signed-off-by: default avatarSrinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent e208c447
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <asm/mach/arch.h>

#include <plat/mtu.h>
#include <plat/i2c.h>

#include <mach/hardware.h>
#include <mach/setup.h>
@@ -120,6 +121,70 @@ static struct amba_device pl031_device = {
	.irq = {IRQ_RTC_RTT, NO_IRQ},
};

#define U8500_I2C_RESOURCES(id, size)		\
static struct resource u8500_i2c_resources_##id[] = {	\
	[0] = {					\
		.start	= U8500_I2C##id##_BASE,	\
		.end	= U8500_I2C##id##_BASE + size - 1, \
		.flags	= IORESOURCE_MEM,	\
	},					\
	[1] = {					\
		.start	= IRQ_I2C##id,		\
		.end	= IRQ_I2C##id,		\
		.flags	= IORESOURCE_IRQ	\
	}					\
}

U8500_I2C_RESOURCES(0, SZ_4K);
U8500_I2C_RESOURCES(1, SZ_4K);
U8500_I2C_RESOURCES(2, SZ_4K);
U8500_I2C_RESOURCES(3, SZ_4K);

#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \
static struct nmk_i2c_controller u8500_i2c_##id = { \
	/*				\
	 * slave data setup time, which is	\
	 * 250 ns,100ns,10ns which is 14,6,2	\
	 * respectively for a 48 Mhz	\
	 * i2c clock			\
	 */				\
	.slsu		= _slsu,	\
	/* Tx FIFO threshold */		\
	.tft		= _tft,		\
	/* Rx FIFO threshold */		\
	.rft		= _rft,		\
	/* std. mode operation */	\
	.clk_freq	= clk,		\
	.sm		= _sm,		\
}

/*
 * The board uses 4 i2c controllers, initialize all of
 * them with slave data setup time of 250 ns,
 * Tx & Rx FIFO threshold values as 1 and standard
 * mode of operation
 */
U8500_I2C_CONTROLLER(0, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
U8500_I2C_CONTROLLER(1, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
U8500_I2C_CONTROLLER(2,	0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
U8500_I2C_CONTROLLER(3,	0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);

#define U8500_I2C_PDEVICE(cid)		\
static struct platform_device i2c_controller##cid = { \
	.name = "nmk-i2c",		\
	.id	 = cid,			\
	.num_resources = 2,		\
	.resource = u8500_i2c_resources_##cid,	\
	.dev = {			\
		.platform_data = &u8500_i2c_##cid \
	}				\
}

U8500_I2C_PDEVICE(0);
U8500_I2C_PDEVICE(1);
U8500_I2C_PDEVICE(2);
U8500_I2C_PDEVICE(3);

static struct amba_device *amba_devs[] __initdata = {
	&uart0_device,
	&uart1_device,
@@ -128,6 +193,14 @@ static struct amba_device *amba_devs[] __initdata = {
	&pl031_device,
};

/* add any platform devices here - TODO */
static struct platform_device *platform_devs[] __initdata = {
	&i2c_controller0,
	&i2c_controller1,
	&i2c_controller2,
	&i2c_controller3,
};

static void __init u8500_timer_init(void)
{
#ifdef CONFIG_LOCAL_TIMERS
@@ -152,6 +225,8 @@ static void __init u8500_init_machine(void)
	for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
		amba_device_register(amba_devs[i], &iomem_resource);

	platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));

	spi_register_board_info(u8500_spi_devices,
			ARRAY_SIZE(u8500_spi_devices));