> From: u-boot-boun...@lists.denx.de on behalf of Hugo Villeneuve > Sent: Fri 11/21/2008 2:35 PM > To: u-boot@lists.denx.de > Subject: [U-Boot] [PATCH 1/1] ARM DaVinci: Add common peripherals > andmodules enable functions. > > Taken all the duplicated code for enabling common modules and apply > software workarounds from the board specific code into common > functions. Also added comments explaining the workarounds > (from TI errata documents) and replaced some numerical bit numbers > with more meaningful defines. > > Signed-off-by: Hugo Villeneuve <hugo.villene...@lyrtech.com> > --- > board/davinci/common/psc.c | 65 ++++++++++++++++++++++++++ > +++++++++ board/davinci/common/psc.h | 3 ++ > board/davinci/dvevm/dvevm.c | 35 +++++-------------- > board/davinci/schmoogie/schmoogie.c | 37 +++++-------------- > board/davinci/sffsdr/sffsdr.c | 31 +++-------------- > board/davinci/sonata/sonata.c | 35 +++++-------------- > 6 files changed, 101 insertions(+), 105 deletions(-)
I sent this patch two months ago but I didnĀ“t receive feedback... Hugo V. > diff --git a/board/davinci/common/psc.c b/board/davinci/common/psc.c > index d538d51..28e2a4b 100644 > --- a/board/davinci/common/psc.c > +++ b/board/davinci/common/psc.c > @@ -26,6 +26,14 @@ > #include <common.h> > #include <asm/arch/hardware.h> > > +#define PINMUX0_EMACEN (1 << 31) > +#define PINMUX0_AECS5 (1 << 11) > +#define PINMUX0_AECS4 (1 << 10) > + > +#define PINMUX1_I2C (1 << 7) > +#define PINMUX1_UART1 (1 << 1) > +#define PINMUX1_UART0 (1 << 0) > + > /* > * The DM6446 includes two separate power domains: "Always On" and > "DSP". The > * "Always On" power domain is always on when the chip is on. The > "Always On" @@ -115,3 +123,60 @@ void dsp_on(void) > REG(PSC_GBLCTL) &= ~0x1f; > } > #endif /* CONFIG_SYS_USE_DSPLINK */ > + > +void davinci_enable_uart0(void) > +{ > + lpsc_on(DAVINCI_LPSC_UART0); > + > + /* Bringup UART0 out of reset */ > + REG(UART0_PWREMU_MGMT) = 0x0000e003; > + > + /* Enable UART0 MUX lines */ > + REG(PINMUX1) |= PINMUX1_UART0; > +} > + > +#ifdef CONFIG_DRIVER_TI_EMAC > +void davinci_enable_emac(void) > +{ > + lpsc_on(DAVINCI_LPSC_EMAC); > + lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER); > + lpsc_on(DAVINCI_LPSC_MDIO); > + > + /* Enable GIO3.3V cells used for EMAC */ > + REG(VDD3P3V_PWDN) = 0; > + > + /* Enable EMAC. */ > + REG(PINMUX0) |= PINMUX0_EMACEN; > +} > +#endif > + > +void davinci_enable_i2c(void) > +{ > + lpsc_on(DAVINCI_LPSC_I2C); > + > + /* Enable I2C pin Mux */ > + REG(PINMUX1) |= PINMUX1_I2C; > +} > + > +void davinci_errata_workarounds(void) > +{ > + /* > + * Workaround for TMS320DM6446 errata 1.3.22: > + * PSC: PTSTAT Register Does Not Clear After Warm/Maximum > Reset > + * Revision(s) Affected: 1.3 and earlier > + */ > + REG(PSC_SILVER_BULLET) = 0; > + > + /* > + * Set the PR_OLD_COUNT bits in the Bus Burst Priority > Register (PBBPR) > + * as suggested in TMS320DM6446 errata 2.1.2: > + * > + * On DM6446 Silicon Revision 2.1 and earlier, under certain > conditions > + * low priority modules can occupy the bus and prevent high > priority > + * modules like the VPSS from getting the required DDR2 > throughput. > + * A hex value of 0x20 should provide a good ARM (cache > enabled) > + * performance and still allow good utilization by the VPSS > or other > + * modules. > + */ > + REG(VBPR) = 0x20; > +} > diff --git a/board/davinci/common/psc.h b/board/davinci/common/psc.h > index 6ab2575..b18a185 100644 > --- a/board/davinci/common/psc.h > +++ b/board/davinci/common/psc.h > @@ -24,5 +24,8 @@ > > void lpsc_on(unsigned int id); > void dsp_on(void); > +void davinci_enable_uart0(void); > +void davinci_enable_emac(void); > +void davinci_enable_i2c(void); > > #endif /* __PSC_H */ > diff --git a/board/davinci/dvevm/dvevm.c b/board/davinci/dvevm/dvevm.c > index abf60b3..f740124 100644 > --- a/board/davinci/dvevm/dvevm.c > +++ b/board/davinci/dvevm/dvevm.c > @@ -27,7 +27,6 @@ > #include <common.h> > #include <i2c.h> > #include <asm/arch/hardware.h> > -#include <asm/arch/emac_defs.h> > #include "../common/psc.h" > #include "../common/misc.h" > > @@ -41,16 +40,13 @@ int board_init(void) > /* address of boot parameters */ > gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; > > - /* Workaround for TMS320DM6446 errata 1.3.22 */ > - REG(PSC_SILVER_BULLET) = 0; > + /* Configure AEMIF pins (although this should be configured > at boot time > + * with pull-up/pull-down resistors) */ > + REG(PINMUX0) = 0x00000c1f; > + > + davinci_errata_workarounds(); > > /* Power on required peripherals */ > - lpsc_on(DAVINCI_LPSC_EMAC); > - lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER); > - lpsc_on(DAVINCI_LPSC_MDIO); > - lpsc_on(DAVINCI_LPSC_I2C); > - lpsc_on(DAVINCI_LPSC_UART0); > - lpsc_on(DAVINCI_LPSC_TIMER1); > lpsc_on(DAVINCI_LPSC_GPIO); > > #if !defined(CONFIG_SYS_USE_DSPLINK) > @@ -58,24 +54,11 @@ int board_init(void) > dsp_on(); > #endif /* CONFIG_SYS_USE_DSPLINK */ > > - /* Bringup UART0 out of reset */ > - REG(UART0_PWREMU_MGMT) = 0x0000e003; > - > - /* Enable GIO3.3V cells used for EMAC */ > - REG(VDD3P3V_PWDN) = 0; > - > - /* Enable UART0 MUX lines */ > - REG(PINMUX1) |= 1; > - > - /* Enable EMAC and AEMIF pins */ > - REG(PINMUX0) = 0x80000c1f; > - > - /* Enable I2C pin Mux */ > - REG(PINMUX1) |= (1 << 7); > - > - /* Set the Bus Priority Register to appropriate value */ > - REG(VBPR) = 0x20; > + davinci_enable_uart0(); > + davinci_enable_emac(); > + davinci_enable_i2c(); > > + lpsc_on(DAVINCI_LPSC_TIMER1); > timer_init(); > > return(0); > diff --git a/board/davinci/schmoogie/schmoogie.c > b/board/davinci/schmoogie/schmoogie.c index 3504a2e..433769a 100644 > --- a/board/davinci/schmoogie/schmoogie.c > +++ b/board/davinci/schmoogie/schmoogie.c > @@ -27,7 +27,6 @@ > #include <common.h> > #include <i2c.h> > #include <asm/arch/hardware.h> > -#include <asm/arch/emac_defs.h> > #include "../common/psc.h" > #include "../common/misc.h" > > @@ -41,16 +40,13 @@ int board_init(void) > /* address of boot parameters */ > gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; > > - /* Workaround for TMS320DM6446 errata 1.3.22 */ > - REG(PSC_SILVER_BULLET) = 0; > + /* Configure AEMIF pins (although this should be configured > at boot time > + * with pull-up/pull-down resistors) */ > + REG(PINMUX0) = 0x00000c1f; > + > + davinci_errata_workarounds(); > > /* Power on required peripherals */ > - lpsc_on(DAVINCI_LPSC_EMAC); > - lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER); > - lpsc_on(DAVINCI_LPSC_MDIO); > - lpsc_on(DAVINCI_LPSC_I2C); > - lpsc_on(DAVINCI_LPSC_UART0); > - lpsc_on(DAVINCI_LPSC_TIMER1); > lpsc_on(DAVINCI_LPSC_GPIO); > > #if !defined(CONFIG_SYS_USE_DSPLINK) > @@ -58,24 +54,11 @@ int board_init(void) > dsp_on(); > #endif /* CONFIG_SYS_USE_DSPLINK */ > > - /* Bringup UART0 out of reset */ > - REG(UART0_PWREMU_MGMT) = 0x0000e003; > - > - /* Enable GIO3.3V cells used for EMAC */ > - REG(VDD3P3V_PWDN) = 0; > - > - /* Enable UART0 MUX lines */ > - REG(PINMUX1) |= 1; > - > - /* Enable EMAC and AEMIF pins */ > - REG(PINMUX0) = 0x80000c1f; > - > - /* Enable I2C pin Mux */ > - REG(PINMUX1) |= (1 << 7); > - > - /* Set the Bus Priority Register to appropriate value */ > - REG(VBPR) = 0x20; > + davinci_enable_uart0(); > + davinci_enable_emac(); > + davinci_enable_i2c(); > > + lpsc_on(DAVINCI_LPSC_TIMER1); > timer_init(); > > return(0); > @@ -87,7 +70,7 @@ int misc_init_r(void) > int i = 0; > > /* Set serial number from UID chip */ > - u_int8_t crc_tbl[256] = { > + const u_int8_t crc_tbl[256] = { > 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, > 0x83, 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, > 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, > 0x1e, diff --git a/board/davinci/sffsdr/sffsdr.c > b/board/davinci/sffsdr/sffsdr.c index 9296d7b..e76f86d 100644 > --- a/board/davinci/sffsdr/sffsdr.c > +++ b/board/davinci/sffsdr/sffsdr.c > @@ -30,7 +30,6 @@ > #include <common.h> > #include <i2c.h> > #include <asm/arch/hardware.h> > -#include <asm/arch/emac_defs.h> > #include "../common/psc.h" > #include "../common/misc.h" > > @@ -51,16 +50,9 @@ int board_init(void) > /* address of boot parameters */ > gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; > > - /* Workaround for TMS320DM6446 errata 1.3.22 */ > - REG(PSC_SILVER_BULLET) = 0; > + davinci_errata_workarounds(); > > /* Power on required peripherals */ > - lpsc_on(DAVINCI_LPSC_EMAC); > - lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER); > - lpsc_on(DAVINCI_LPSC_MDIO); > - lpsc_on(DAVINCI_LPSC_I2C); > - lpsc_on(DAVINCI_LPSC_UART0); > - lpsc_on(DAVINCI_LPSC_TIMER1); > lpsc_on(DAVINCI_LPSC_GPIO); > > #if !defined(CONFIG_SYS_USE_DSPLINK) > @@ -68,24 +60,11 @@ int board_init(void) > dsp_on(); > #endif /* CONFIG_SYS_USE_DSPLINK */ > > - /* Bringup UART0 out of reset */ > - REG(UART0_PWREMU_MGMT) = 0x0000e003; > - > - /* Enable GIO3.3V cells used for EMAC */ > - REG(VDD3P3V_PWDN) = 0; > - > - /* Enable UART0 MUX lines */ > - REG(PINMUX1) |= 1; > - > - /* Enable EMAC and AEMIF pins */ > - REG(PINMUX0) = 0x80000c1f; > - > - /* Enable I2C pin Mux */ > - REG(PINMUX1) |= (1 << 7); > - > - /* Set the Bus Priority Register to appropriate value */ > - REG(VBPR) = 0x20; > + davinci_enable_uart0(); > + davinci_enable_emac(); > + davinci_enable_i2c(); > > + lpsc_on(DAVINCI_LPSC_TIMER1); > timer_init(); > > return(0); > diff --git a/board/davinci/sonata/sonata.c > b/board/davinci/sonata/sonata.c index 6de9356..d56b443 100644 > --- a/board/davinci/sonata/sonata.c > +++ b/board/davinci/sonata/sonata.c > @@ -26,7 +26,6 @@ > > #include <common.h> > #include <asm/arch/hardware.h> > -#include <asm/arch/emac_defs.h> > #include "../common/psc.h" > #include "../common/misc.h" > > @@ -40,16 +39,13 @@ int board_init(void) > /* address of boot parameters */ > gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; > > - /* Workaround for TMS320DM6446 errata 1.3.22 */ > - REG(PSC_SILVER_BULLET) = 0; > + /* Configure AEMIF pins (although this should be configured > at boot time > + * with pull-up/pull-down resistors) */ > + REG(PINMUX0) = 0x00000c1f; > + > + davinci_errata_workarounds(); > > /* Power on required peripherals */ > - lpsc_on(DAVINCI_LPSC_EMAC); > - lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER); > - lpsc_on(DAVINCI_LPSC_MDIO); > - lpsc_on(DAVINCI_LPSC_I2C); > - lpsc_on(DAVINCI_LPSC_UART0); > - lpsc_on(DAVINCI_LPSC_TIMER1); > lpsc_on(DAVINCI_LPSC_GPIO); > > #if !defined(CONFIG_SYS_USE_DSPLINK) > @@ -57,24 +53,11 @@ int board_init(void) > dsp_on(); > #endif /* CONFIG_SYS_USE_DSPLINK */ > > - /* Bringup UART0 out of reset */ > - REG(UART0_PWREMU_MGMT) = 0x0000e003; > - > - /* Enable GIO3.3V cells used for EMAC */ > - REG(VDD3P3V_PWDN) = 0; > - > - /* Enable UART0 MUX lines */ > - REG(PINMUX1) |= 1; > - > - /* Enable EMAC and AEMIF pins */ > - REG(PINMUX0) = 0x80000c1f; > - > - /* Enable I2C pin Mux */ > - REG(PINMUX1) |= (1 << 7); > - > - /* Set the Bus Priority Register to appropriate value */ > - REG(VBPR) = 0x20; > + davinci_enable_uart0(); > + davinci_enable_emac(); > + davinci_enable_i2c(); > > + lpsc_on(DAVINCI_LPSC_TIMER1); > timer_init(); > > return(0); > -- > 1.5.4.5 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot > > --------------- Hugo Villeneuve www.hugovil.com --------------- _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot