> 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

Reply via email to