drivers:i2c: Modify I2C driver for Exynos4

This patch modifies the S3C i2c driver to support both Exynos4 and Exynos5

Signed-off-by: Piotr Wilczek <p.wilczek@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
CC: Minkyu Kang <mk7.kang@samsung.com>
This commit is contained in:
Piotr Wilczek 2012-11-20 02:19:05 +00:00 committed by Tom Rini
parent 89bd58a1e9
commit c86d9ed382
1 changed files with 12 additions and 7 deletions
drivers/i2c

View File

@ -27,7 +27,7 @@
*/ */
#include <common.h> #include <common.h>
#ifdef CONFIG_EXYNOS5 #if (defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5)
#include <asm/arch/clk.h> #include <asm/arch/clk.h>
#include <asm/arch/cpu.h> #include <asm/arch/cpu.h>
#else #else
@ -62,7 +62,7 @@
static unsigned int g_current_bus; /* Stores Current I2C Bus */ static unsigned int g_current_bus; /* Stores Current I2C Bus */
#ifndef CONFIG_EXYNOS5 #if !(defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5)
static int GetI2CSDA(void) static int GetI2CSDA(void)
{ {
struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio(); struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio();
@ -121,7 +121,12 @@ static void ReadWriteByte(struct s3c24x0_i2c *i2c)
static struct s3c24x0_i2c *get_base_i2c(void) static struct s3c24x0_i2c *get_base_i2c(void)
{ {
#ifdef CONFIG_EXYNOS5 #ifdef CONFIG_EXYNOS4
struct s3c24x0_i2c *i2c = (struct s3c24x0_i2c *)(samsung_get_base_i2c()
+ (EXYNOS4_I2C_SPACING
* g_current_bus));
return i2c;
#elif defined CONFIG_EXYNOS5
struct s3c24x0_i2c *i2c = (struct s3c24x0_i2c *)(samsung_get_base_i2c() struct s3c24x0_i2c *i2c = (struct s3c24x0_i2c *)(samsung_get_base_i2c()
+ (EXYNOS5_I2C_SPACING + (EXYNOS5_I2C_SPACING
* g_current_bus)); * g_current_bus));
@ -134,7 +139,7 @@ static struct s3c24x0_i2c *get_base_i2c(void)
static void i2c_ch_init(struct s3c24x0_i2c *i2c, int speed, int slaveadd) static void i2c_ch_init(struct s3c24x0_i2c *i2c, int speed, int slaveadd)
{ {
ulong freq, pres = 16, div; ulong freq, pres = 16, div;
#ifdef CONFIG_EXYNOS5 #if (defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5)
freq = get_i2c_clk(); freq = get_i2c_clk();
#else #else
freq = get_PCLK(); freq = get_PCLK();
@ -188,7 +193,7 @@ unsigned int i2c_get_bus_num(void)
void i2c_init(int speed, int slaveadd) void i2c_init(int speed, int slaveadd)
{ {
struct s3c24x0_i2c *i2c; struct s3c24x0_i2c *i2c;
#ifndef CONFIG_EXYNOS5 #if !(defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5)
struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio(); struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio();
#endif #endif
int i; int i;
@ -204,7 +209,7 @@ void i2c_init(int speed, int slaveadd)
i--; i--;
} }
#ifndef CONFIG_EXYNOS5 #if !(defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5)
if ((readl(&i2c->iicstat) & I2CSTAT_BSY) || GetI2CSDA() == 0) { if ((readl(&i2c->iicstat) & I2CSTAT_BSY) || GetI2CSDA() == 0) {
#ifdef CONFIG_S3C2410 #ifdef CONFIG_S3C2410
ulong old_gpecon = readl(&gpio->gpecon); ulong old_gpecon = readl(&gpio->gpecon);
@ -248,7 +253,7 @@ void i2c_init(int speed, int slaveadd)
writel(old_gpecon, &gpio->pgcon); writel(old_gpecon, &gpio->pgcon);
#endif #endif
} }
#endif /* #ifndef CONFIG_EXYNOS5 */ #endif /* #if !(defined CONFIG_EXYNOS4 || defined CONFIG_EXYNOS5) */
i2c_ch_init(i2c, speed, slaveadd); i2c_ch_init(i2c, speed, slaveadd);
} }