]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
driver/mxc_i2c: Move static data structure to global_data
authorYork Sun <yorksun@freescale.com>
Mon, 10 Feb 2014 22:02:52 +0000 (14:02 -0800)
committerHeiko Schocher <hs@denx.de>
Tue, 29 Apr 2014 05:10:27 +0000 (07:10 +0200)
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>
drivers/i2c/mxc_i2c.c
include/asm-generic/global_data.h

index 595019b3b8874601437e5c38d6b9b9793d1d0a92..48468d74bdd838ae414688951011b6e5da8e70d8 100644 (file)
@@ -22,6 +22,8 @@
 #include <i2c.h>
 #include <watchdog.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 #ifdef I2C_QUIRK_REG
 struct mxc_i2c_regs {
        uint8_t         iadr;
@@ -411,12 +413,6 @@ struct sram_data {
        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[] = {
 #if defined(CONFIG_MX25)
        (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)
 {
+       struct sram_data *srdata = (void *)gd->srdata;
        int i = 0;
-       struct i2c_parms *p = srdata.i2c_data;
-       while (i < ARRAY_SIZE(srdata.i2c_data)) {
+       struct i2c_parms *p = srdata->i2c_data;
+       while (i < ARRAY_SIZE(srdata->i2c_data)) {
                if (p->base == base)
                        return 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,
                int (*idle_bus_fn)(void *p), void *idle_bus_data)
 {
+       struct sram_data *srdata = (void *)gd->srdata;
        int i = 0;
-       struct i2c_parms *p = srdata.i2c_data;
+       struct i2c_parms *p = srdata->i2c_data;
        if (!base)
                return;
        for (;;) {
@@ -505,7 +503,7 @@ void bus_i2c_init(void *base, int speed, int unused,
                }
                p++;
                i++;
-               if (i >= ARRAY_SIZE(srdata.i2c_data))
+               if (i >= ARRAY_SIZE(srdata->i2c_data))
                        return;
        }
        bus_i2c_set_bus_speed(base, speed);
index 707400e84793daf2166dff8d249e3cc6681a332c..e98b661e358815b1ab375b66675bf964eacf5d12 100644 (file)
@@ -79,6 +79,9 @@ typedef struct global_data {
 #endif
 #if defined(CONFIG_SYS_I2C)
        int             cur_i2c_bus;    /* current used i2c bus */
+#endif
+#ifdef CONFIG_SYS_I2C_MXC
+       void *srdata[10];
 #endif
        unsigned long timebase_h;
        unsigned long timebase_l;