[U-Boot] [PATCH 1/1] ARM DaVinci: Add common peripherals andmodules enable functions.

Hugo Villeneuve hugo at hugovil.com
Mon Jan 19 15:56:18 CET 2009


> From: u-boot-bounces at lists.denx.de on behalf of Hugo Villeneuve
> Sent: Fri 11/21/2008 2:35 PM
> To: u-boot at 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.villeneuve at 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 at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
> 
> 


---------------
Hugo Villeneuve
www.hugovil.com
---------------


More information about the U-Boot mailing list