diff options
author | Sammy He <r62914@freescale.com> | 2009-11-26 18:55:02 +0800 |
---|---|---|
committer | Sammy He <r62914@freescale.com> | 2009-11-26 19:17:00 +0800 |
commit | 078cdf97a1ec61134f0c924a209520dfd7f63c5f (patch) | |
tree | d84e5845508883efd6f930ada95af6cd9de7c23d | |
parent | 758e16168151f671ee8c97790392bfc8e0746866 (diff) | |
download | u-boot-imx-078cdf97a1ec61134f0c924a209520dfd7f63c5f.zip u-boot-imx-078cdf97a1ec61134f0c924a209520dfd7f63c5f.tar.gz u-boot-imx-078cdf97a1ec61134f0c924a209520dfd7f63c5f.tar.bz2 |
ENGR00118816 Fix reboot/reset failure with image on nand
Reset CPLD registers to fix reboot/reset failure issue.
Signed-off-by: Sammy He <r62914@freescale.com>
-rw-r--r-- | drivers/spi/imx_spi_cpld.c | 28 | ||||
-rw-r--r-- | include/asm-arm/arch-mx25/imx_spi_cpld.h | 21 |
2 files changed, 45 insertions, 4 deletions
diff --git a/drivers/spi/imx_spi_cpld.c b/drivers/spi/imx_spi_cpld.c index 2e20b9c..6e1e556 100644 --- a/drivers/spi/imx_spi_cpld.c +++ b/drivers/spi/imx_spi_cpld.c @@ -27,9 +27,22 @@ #include <linux/types.h> #include <imx_spi.h> +#include <asm/arch/imx_spi_cpld.h> static struct spi_slave *cpld_slave; +void cpld_reg_write(u32 offset, u32 val) +{ + cpld_reg_xfer(offset, val, 0); + cpld_reg_xfer(offset + 0x2, (val >> 16), 0); +} + +u32 cpld_reg_read(u32 offset) +{ + return cpld_reg_xfer(offset, 0x0, 1) | \ + (cpld_reg_xfer(offset + 0x2, 0x0, 1) << 16); +} + /*! * To read/write to a CPLD register. * @@ -74,7 +87,22 @@ unsigned int cpld_reg_xfer(unsigned int reg, unsigned int val, struct spi_slave *spi_cpld_probe() { + u32 reg; cpld_slave = spi_setup_slave(0, 0, 25000000, 0); + + udelay(1000); + + /* Reset interrupt status reg */ + cpld_reg_write(PBC_INT_REST, 0x1F); + cpld_reg_write(PBC_INT_REST, 0); + cpld_reg_write(PBC_INT_MASK, 0xFFFF); + /* Reset the XUART and Ethernet controllers */ + reg = cpld_reg_read(PBC_SW_RESET); + reg |= 0x9; + cpld_reg_write(PBC_SW_RESET, reg); + reg &= ~0x9; + cpld_reg_write(PBC_SW_RESET, reg); + return cpld_slave; } diff --git a/include/asm-arm/arch-mx25/imx_spi_cpld.h b/include/asm-arm/arch-mx25/imx_spi_cpld.h index f0fa00c..4bf1388 100644 --- a/include/asm-arm/arch-mx25/imx_spi_cpld.h +++ b/include/asm-arm/arch-mx25/imx_spi_cpld.h @@ -25,9 +25,22 @@ #include <linux/types.h> -extern struct spi_slave *spi_cpld_probe(); -extern void spi_cpld_free(struct spi_slave *slave); -extern unsigned int cpld_reg_xfer(unsigned int reg, unsigned int val, - unsigned int read); +#define PBC_LED_CTRL 0x20000 +#define PBC_SB_STAT 0x20008 +#define PBC_ID_AAAA 0x20040 +#define PBC_ID_5555 0x20048 +#define PBC_VERSION 0x20050 +#define PBC_ID_CAFE 0x20058 +#define PBC_INT_STAT 0x20010 +#define PBC_INT_MASK 0x20038 +#define PBC_INT_REST 0x20020 +#define PBC_SW_RESET 0x20060 + +void cpld_reg_write(u32 offset, u32 val); +u32 cpld_reg_read(u32 offset); +struct spi_slave *spi_cpld_probe(); +void spi_cpld_free(struct spi_slave *slave); +unsigned int cpld_reg_xfer(unsigned int reg, unsigned int val, + unsigned int read); #endif /* _IMX_SPI_CPLD_H_ */ |