From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean-Christophe PLAGNIOL-VILLARD Date: Mon, 21 Jul 2008 22:13:19 +0200 Subject: [U-Boot-Users] [PATCH] fsl-i2c: fix writes to data segment before relocation In-Reply-To: <1216668383-17967-1-git-send-email-timur@freescale.com> References: <1216668383-17967-1-git-send-email-timur@freescale.com> Message-ID: <20080721201319.GA16567@game.jcrosoft.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 14:26 Mon 21 Jul , Timur Tabi wrote: > Prevent i2c_init() in fsl_i2c.c from writing to the data segment before > relocation. Commit d8c82db4 added the ability for i2c_init() to program the > I2C bus speed and save the value in i2c_bus_speed[], which is a global > variable. It is an error to write to the data segment before relocation, > which is what i2c_init() does when it stores the bus speed in i2c_bus_speed[]. > > Signed-off-by: Timur Tabi > --- > > Wolfgang, please apply this directly to fix the I2C bug we've been talking about. > > drivers/i2c/fsl_i2c.c | 9 +++++++-- > 1 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c > index 9f2c1ec..9d5df8a 100644 > --- a/drivers/i2c/fsl_i2c.c > +++ b/drivers/i2c/fsl_i2c.c > @@ -143,12 +143,15 @@ void > i2c_init(int speed, int slaveadd) > { > struct fsl_i2c *dev; > + unsigned int temp; > > dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET); > > writeb(0, &dev->cr); /* stop I2C controller */ > udelay(5); /* let it shutdown in peace */ > - i2c_bus_speed[0] = set_i2c_bus_speed(dev, gd->i2c1_clk, speed); > + temp = set_i2c_bus_speed(dev, gd->i2c1_clk, speed); > + if (gd->flags & GD_FLG_RELOC) Maybe a macro will more clear like if(is_relacated()) i2c_bus_speed[0] = temp; Best Regards, J.