[U-Boot] [PATCH u-boot git] there are non-DM6446 DaVinci chips

David Brownell david-b at pacbell.net
Mon Apr 13 00:44:23 CEST 2009


From: David Brownell <dbrownell at users.sourceforge.net>

Start updating DaVinci board support to reduce dependencies on
dm644x chips and EVM-like boards ... beginning with "psc.c",
which hosts a bunch of those dependencies:

 - Pinmux registers and their contents are SoC-specific, and
   are also unrelated to the Power and Sleep Controller.
   
     * Declare more of the pinmux registers;
     * Move their bitfield decls to a public header;
     * Renaming thse bitfields to be clearly SoC-specific.

 - Rename the errata workarounds to be clearly SoC-specific.

 - Add a CONFIG_SOC_DM6446; use it to prevent some mux goofs.

 - Don't include the I2C support if the I2C driver is not enabled.

Plus two minor bugfixes:

 - Correct the PSC_MDSTAT mask ...  it's six bits, not five.
   (Original DM6446 doces said five, FWIW.)

 - Correct the PWREMU_MGT mask ... don't set must-be-zero bits.

The simplest always-correct way to handle pinmux is in board_init()
calls; or possibly in SoC-specific device setup code.  Currently
these chips don't have such SoC-specific support.

Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
---
 board/davinci/common/psc.c              |   29 ++++++++++++++++-------------
 board/davinci/common/psc.h              |    2 +-
 board/davinci/dvevm/dvevm.c             |    2 +-
 board/davinci/schmoogie/schmoogie.c     |    2 +-
 board/davinci/sffsdr/sffsdr.c           |    2 +-
 board/davinci/sonata/sonata.c           |    2 +-
 include/asm-arm/arch-davinci/hardware.h |   23 +++++++++++++++++++++--
 include/configs/davinci_dvevm.h         |    1 +
 include/configs/davinci_schmoogie.h     |    1 +
 include/configs/davinci_sffsdr.h        |    1 +
 include/configs/davinci_sonata.h        |    1 +
 11 files changed, 46 insertions(+), 20 deletions(-)

--- a/board/davinci/common/psc.c
+++ b/board/davinci/common/psc.c
@@ -26,13 +26,6 @@
 #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
@@ -57,7 +50,7 @@ void lpsc_on(unsigned int id)
 
 	while (REG(PSC_PTSTAT) & 0x01);
 
-	if ((*mdstat & 0x1f) == 0x03)
+	if ((*mdstat & 0x3f) == 0x03)
 		return;			/* Already on and enabled */
 
 	*mdctl |= 0x03;
@@ -129,10 +122,12 @@ void davinci_enable_uart0(void)
 	lpsc_on(DAVINCI_LPSC_UART0);
 
 	/* Bringup UART0 out of reset */
-	REG(UART0_PWREMU_MGMT) = 0x0000e003;
+	REG(UART0_PWREMU_MGMT) = 0x00006001;
 
+#ifdef CONFIG_SOC_DM6446
 	/* Enable UART0 MUX lines */
-	REG(PINMUX1) |= PINMUX1_UART0;
+	REG(PINMUX1) |= DM644X_PINMUX1_UART0;
+#endif
 }
 
 #ifdef CONFIG_DRIVER_TI_EMAC
@@ -145,20 +140,27 @@ void davinci_enable_emac(void)
 	/* Enable GIO3.3V cells used for EMAC */
 	REG(VDD3P3V_PWDN) = 0;
 
+#ifdef CONFIG_SOC_DM6446
 	/* Enable EMAC. */
-	REG(PINMUX0) |= PINMUX0_EMACEN;
+	REG(PINMUX0) |= DM644X_PINMUX0_EMACEN;
+#endif
 }
 #endif
 
+#ifdef CONFIG_DRIVER_DAVINCI_I2C
 void davinci_enable_i2c(void)
 {
 	lpsc_on(DAVINCI_LPSC_I2C);
 
+#ifdef CONFIG_SOC_DM6446
 	/* Enable I2C pin Mux */
-	REG(PINMUX1) |= PINMUX1_I2C;
+	REG(PINMUX1) |= DM644X_PINMUX1_I2C;
+#endif
 }
+#endif
 
-void davinci_errata_workarounds(void)
+#ifdef CONFIG_SOC_DM6446
+void dm6446_errata_workarounds(void)
 {
 	/*
 	 * Workaround for TMS320DM6446 errata 1.3.22:
@@ -180,3 +182,4 @@ void davinci_errata_workarounds(void)
 	 */
 	REG(VBPR) = 0x20;
 }
+#endif
--- a/board/davinci/common/psc.h
+++ b/board/davinci/common/psc.h
@@ -27,6 +27,6 @@ void dsp_on(void);
 void davinci_enable_uart0(void);
 void davinci_enable_emac(void);
 void davinci_enable_i2c(void);
-void davinci_errata_workarounds(void);
+void dm6446_errata_workarounds(void);
 
 #endif /* __PSC_H */
--- a/board/davinci/dvevm/dvevm.c
+++ b/board/davinci/dvevm/dvevm.c
@@ -44,7 +44,7 @@ int board_init(void)
 	 * with pull-up/pull-down resistors) */
 	REG(PINMUX0) = 0x00000c1f;
 
-	davinci_errata_workarounds();
+	dm6446_errata_workarounds();
 
 	/* Power on required peripherals */
 	lpsc_on(DAVINCI_LPSC_GPIO);
--- a/board/davinci/schmoogie/schmoogie.c
+++ b/board/davinci/schmoogie/schmoogie.c
@@ -44,7 +44,7 @@ int board_init(void)
 	 * with pull-up/pull-down resistors) */
 	REG(PINMUX0) = 0x00000c1f;
 
-	davinci_errata_workarounds();
+	dm6446_errata_workarounds();
 
 	/* Power on required peripherals */
 	lpsc_on(DAVINCI_LPSC_GPIO);
--- a/board/davinci/sffsdr/sffsdr.c
+++ b/board/davinci/sffsdr/sffsdr.c
@@ -50,7 +50,7 @@ int board_init(void)
 	/* address of boot parameters */
 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
 
-	davinci_errata_workarounds();
+	dm6446_errata_workarounds();
 
 	/* Power on required peripherals */
 	lpsc_on(DAVINCI_LPSC_GPIO);
--- a/board/davinci/sonata/sonata.c
+++ b/board/davinci/sonata/sonata.c
@@ -43,7 +43,7 @@ int board_init(void)
 	 * with pull-up/pull-down resistors) */
 	REG(PINMUX0) = 0x00000c1f;
 
-	davinci_errata_workarounds();
+	dm6446_errata_workarounds();
 
 	/* Power on required peripherals */
 	lpsc_on(DAVINCI_LPSC_GPIO);
--- a/include/asm-arm/arch-davinci/hardware.h
+++ b/include/asm-arm/arch-davinci/hardware.h
@@ -44,6 +44,10 @@ typedef volatile unsigned int *	dv_reg_p
 
 /*
  * Base register addresses
+ *
+ * NOTE:  some of these DM6446-specific addresses DO NOT WORK
+ * on other DaVinci chips.  Double check them before you try
+ * using the addresses ... or PSC module identifiers, etc.
  */
 #define DAVINCI_DMA_3PCC_BASE			(0x01c00000)
 #define DAVINCI_DMA_3PTC0_BASE			(0x01c10000)
@@ -160,7 +164,22 @@ typedef volatile unsigned int *	dv_reg_p
 
 /* Miscellania... */
 #define VBPR				(0x20000020)
-#define PINMUX0				(0x01c40000)
-#define PINMUX1				(0x01c40004)
+
+/* NOTE:  system control modules are *highly* chip-specific, both
+ * as to register content (e.g. for muxing) and which registers exist.
+ */
+#define PINMUX0				0x01c40000
+#define DM644X_PINMUX0_EMACEN (1 << 31)
+#define DM644X_PINMUX0_AECS5  (1 << 11)
+#define DM644X_PINMUX0_AECS4  (1 << 10)
+
+#define PINMUX1				0x01c40004
+#define DM644X_PINMUX1_I2C    (1 <<  7)
+#define DM644X_PINMUX1_UART1  (1 <<  1)
+#define DM644X_PINMUX1_UART0  (1 <<  0)
+
+#define PINMUX2				0x01c40008
+#define PINMUX3				0x01c4000c
+#define PINMUX4				0x01c40010
 
 #endif /* __ASM_ARCH_HARDWARE_H */
--- a/include/configs/davinci_dvevm.h
+++ b/include/configs/davinci_dvevm.h
@@ -59,6 +59,7 @@
 #define CONFIG_SYS_TIMERBASE		0x01c21400	/* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK		27000000	/* Timer Input clock freq */
 #define CONFIG_SYS_HZ			1000
+#define CONFIG_SOC_DM6446
 /*====================================================*/
 /* EEPROM definitions for Atmel 24C256BN SEEPROM chip */
 /* on Sonata/DV_EVM board. No EEPROM on schmoogie.    */
--- a/include/configs/davinci_schmoogie.h
+++ b/include/configs/davinci_schmoogie.h
@@ -34,6 +34,7 @@
 #define CONFIG_SYS_TIMERBASE		0x01c21400	/* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK		27000000	/* Timer Input clock freq */
 #define CONFIG_SYS_HZ			1000
+#define CONFIG_SOC_DM6446
 /*=============*/
 /* Memory Info */
 /*=============*/
--- a/include/configs/davinci_sffsdr.h
+++ b/include/configs/davinci_sffsdr.h
@@ -35,6 +35,7 @@
 #define CONFIG_SYS_TIMERBASE		0x01c21400	/* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK		27000000	/* Timer Input clock freq */
 #define CONFIG_SYS_HZ			1000
+#define CONFIG_SOC_DM6446
 /* EEPROM definitions for Atmel 24LC64 EEPROM chip */
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		2
 #define CONFIG_SYS_I2C_EEPROM_ADDR		0x50
--- a/include/configs/davinci_sonata.h
+++ b/include/configs/davinci_sonata.h
@@ -59,6 +59,7 @@
 #define CONFIG_SYS_TIMERBASE		0x01c21400	/* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK		27000000	/* Timer Input clock freq */
 #define CONFIG_SYS_HZ			1000
+#define CONFIG_SOC_DM6446
 /*====================================================*/
 /* EEPROM definitions for Atmel 24C256BN SEEPROM chip */
 /* on Sonata/DV_EVM board. No EEPROM on schmoogie.    */


More information about the U-Boot mailing list