driver/mxc_i2c: Move static data structure to global_data

This driver needs a data structure in SRAM before SDRAM is available.
This is not alway the case using .data section. Moving this data
structure to global_data guarantees it is writable.

Signed-off-by: York Sun <yorksun@freescale.com>
CC: Troy Kisky <troy.kisky@boundarydevices.com>
This commit is contained in:
York Sun 2014-02-10 14:02:52 -08:00 committed by Heiko Schocher
parent 8854070784
commit dec1861be9
2 changed files with 11 additions and 10 deletions

View file

@ -22,6 +22,8 @@
#include <i2c.h> #include <i2c.h>
#include <watchdog.h> #include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
#ifdef I2C_QUIRK_REG #ifdef I2C_QUIRK_REG
struct mxc_i2c_regs { struct mxc_i2c_regs {
uint8_t iadr; uint8_t iadr;
@ -411,12 +413,6 @@ struct sram_data {
struct i2c_parms i2c_data[3]; struct i2c_parms i2c_data[3];
}; };
/*
* For SPL boot some boards need i2c before SDRAM is initialized so force
* variables to live in SRAM
*/
static struct sram_data __attribute__((section(".data"))) srdata;
static void * const i2c_bases[] = { static void * const i2c_bases[] = {
#if defined(CONFIG_MX25) #if defined(CONFIG_MX25)
(void *)IMX_I2C_BASE, (void *)IMX_I2C_BASE,
@ -445,9 +441,10 @@ void *i2c_get_base(struct i2c_adapter *adap)
static struct i2c_parms *i2c_get_parms(void *base) static struct i2c_parms *i2c_get_parms(void *base)
{ {
struct sram_data *srdata = (void *)gd->srdata;
int i = 0; int i = 0;
struct i2c_parms *p = srdata.i2c_data; struct i2c_parms *p = srdata->i2c_data;
while (i < ARRAY_SIZE(srdata.i2c_data)) { while (i < ARRAY_SIZE(srdata->i2c_data)) {
if (p->base == base) if (p->base == base)
return p; return p;
p++; p++;
@ -490,8 +487,9 @@ static int mxc_i2c_probe(struct i2c_adapter *adap, uint8_t chip)
void bus_i2c_init(void *base, int speed, int unused, void bus_i2c_init(void *base, int speed, int unused,
int (*idle_bus_fn)(void *p), void *idle_bus_data) int (*idle_bus_fn)(void *p), void *idle_bus_data)
{ {
struct sram_data *srdata = (void *)gd->srdata;
int i = 0; int i = 0;
struct i2c_parms *p = srdata.i2c_data; struct i2c_parms *p = srdata->i2c_data;
if (!base) if (!base)
return; return;
for (;;) { for (;;) {
@ -505,7 +503,7 @@ void bus_i2c_init(void *base, int speed, int unused,
} }
p++; p++;
i++; i++;
if (i >= ARRAY_SIZE(srdata.i2c_data)) if (i >= ARRAY_SIZE(srdata->i2c_data))
return; return;
} }
bus_i2c_set_bus_speed(base, speed); bus_i2c_set_bus_speed(base, speed);

View file

@ -79,6 +79,9 @@ typedef struct global_data {
#endif #endif
#if defined(CONFIG_SYS_I2C) #if defined(CONFIG_SYS_I2C)
int cur_i2c_bus; /* current used i2c bus */ int cur_i2c_bus; /* current used i2c bus */
#endif
#ifdef CONFIG_SYS_I2C_MXC
void *srdata[10];
#endif #endif
unsigned long timebase_h; unsigned long timebase_h;
unsigned long timebase_l; unsigned long timebase_l;