Patch by Pantelis Antoniou, 5 May 2004:
- Intracom board update.
- Add Codec POST.
diff --git a/board/netta/dsp.c b/board/netta/dsp.c
index 2bea3ad..66e0b85 100644
--- a/board/netta/dsp.c
+++ b/board/netta/dsp.c
@@ -1,5 +1,5 @@
 /*
- * Intracom TI6711 DSP
+ * Intracom TI6711/TI6412 DSP
  */
 
 #include <common.h>
@@ -12,6 +12,38 @@
 	u32 size;
 };
 
+#if defined(CONFIG_NETTA_6412)
+
+static const struct ram_range int_ram[] = {
+	{ 0x00000000U, 0x00040000U },
+};
+
+static const struct ram_range ext_ram[] = {
+	{ 0x80000000U, 0x00100000U },
+};
+
+static const struct ram_range ranges[] = {
+	{ 0x00000000U, 0x00040000U },
+	{ 0x80000000U, 0x00100000U },
+};
+
+static inline u16 bit_invert(u16 d)
+{
+	register u8 i;
+	register u16 r;
+	register u16 bit;
+
+	r = 0;
+	for (i = 0; i < 16; i++) {
+		bit = d & (1 << i);
+		if (bit != 0)
+			r |= 1 << (15 - i);
+	}
+	return r;
+}
+
+#else
+
 static const struct ram_range int_ram[] = {
 	{ 0x00000000U, 0x00010000U },
 };
@@ -25,6 +57,8 @@
 	{ 0x80000000U, 0x00100000U },
 };
 
+#endif
+
 /*******************************************************************************************************/
 
 static inline int addr_in_int_ram(u32 addr)
@@ -62,8 +96,11 @@
 static inline void dsp_go_slow(void)
 {
 	volatile memctl8xx_t *memctl = &((immap_t *)CFG_IMMR)->im_memctl;
-
+#if defined(CONFIG_NETTA_6412)
+	memctl->memc_or6 |= OR_SCY_15_CLK | OR_TRLX;
+#else
 	memctl->memc_or2 |= OR_SCY_15_CLK | OR_TRLX;
+#endif
 	memctl->memc_or5 |= OR_SCY_15_CLK | OR_TRLX;
 
 	ti6711_delay = (u32 *)DUMMY_BASE;
@@ -72,8 +109,11 @@
 static inline void dsp_go_fast(void)
 {
 	volatile memctl8xx_t *memctl = &((immap_t *)CFG_IMMR)->im_memctl;
-
+#if defined(CONFIG_NETTA_6412)
+	memctl->memc_or6 = (memctl->memc_or6 & ~(OR_SCY_15_CLK | OR_TRLX)) | OR_SCY_0_CLK;
+#else
 	memctl->memc_or2 = (memctl->memc_or2 & ~(OR_SCY_15_CLK | OR_TRLX)) | OR_SCY_3_CLK;
+#endif
 	memctl->memc_or5 = (memctl->memc_or5 & ~(OR_SCY_15_CLK | OR_TRLX)) | OR_SCY_0_CLK;
 
 	ti6711_delay = &dummy_delay;
@@ -89,62 +129,50 @@
 
 static inline u16 dsp_read_hpic(void)
 {
+#if defined(CONFIG_NETTA_6412)
+	return bit_invert(*((volatile u16 *)DSP_BASE));
+#else
 	return *((volatile u16 *)DSP_BASE);
+#endif
 }
 
 static inline void dsp_write_hpic(u16 val)
 {
+#if defined(CONFIG_NETTA_6412)
+	*((volatile u16 *)DSP_BASE) = bit_invert(val);
+#else
 	*((volatile u16 *)DSP_BASE) = val;
+#endif
 }
 
 static inline void dsp_reset(void)
 {
+#if defined(CONFIG_NETTA_6412)
+	((volatile immap_t *)CFG_IMMR)->im_ioport.iop_pddat &= ~(1 << (15 - 15));
+	udelay(500);
+	((volatile immap_t *)CFG_IMMR)->im_ioport.iop_pddat |=  (1 << (15 - 15));
+	udelay(500);
+#else
 	((volatile immap_t *)CFG_IMMR)->im_ioport.iop_pddat &= ~(1 << (15 - 7));
 	udelay(250);
 	((volatile immap_t *)CFG_IMMR)->im_ioport.iop_pddat |=  (1 << (15 - 7));
 	udelay(250);
-}
-
-static inline void dsp_init_hpic(void)
-{
-	int i;
-	volatile u16 *p;
-
-	dsp_go_slow();
-
-	i = 0;
-	while (i < 1000 && (dsp_read_hpic() & 0x08) == 0) {
-		dsp_delay();
-		i++;
-	}
-	dsp_delay();
-
-	/* write control register */
-	p = (volatile u16 *)DSP_BASE;
-	p[0] = 0x0000;
-	dsp_delay();
-	p[1] = 0x0000;
-	dsp_delay();
-
-	dsp_go_fast();
-}
-
-static inline void dsp_wait_hrdy(void)
-{
-	int i;
-
-	i = 0;
-	while (i < 1000 && (dsp_read_hpic() & 0x08) == 0) {
-		dsp_delay();
-		i++;
-	}
+#endif
 }
 
 static inline u32 dsp_read_hpic_word(u32 addr)
 {
 	u32 val;
 	volatile u16 *p;
+#if defined(CONFIG_NETTA_6412)
+	p = (volatile u16 *)((volatile u8 *)DSP_BASE + addr);
 
+	val = ((u32) bit_invert(p[0]) << 16);
+	/* dsp_delay(); */
+
+	val |= bit_invert(p[1]);
+	/* dsp_delay(); */
+#else
 	p = (volatile u16 *)((volatile u8 *)DSP_BASE + addr);
 
 	val = ((u32) p[0] << 16);
@@ -152,40 +180,80 @@
 
 	val |= p[1];
 	dsp_delay();
-
+#endif
 	return val;
 }
 
 static inline u16 dsp_read_hpic_hi_hword(u32 addr)
 {
+#if defined(CONFIG_NETTA_6412)
+	return bit_invert(*(volatile u16 *)((volatile u8 *)DSP_BASE + addr));
+#else
 	return *(volatile u16 *)((volatile u8 *)DSP_BASE + addr);
+#endif
 }
 
 static inline u16 dsp_read_hpic_lo_hword(u32 addr)
 {
+#if defined(CONFIG_NETTA_6412)
+	return bit_invert(*(volatile u16 *)((volatile u8 *)DSP_BASE + addr + 2));
+#else
 	return *(volatile u16 *)((volatile u8 *)DSP_BASE + addr + 2);
+#endif
+}
+
+static inline void dsp_wait_hrdy(void)
+{
+	int i;
+
+	i = 0;
+#if defined(CONFIG_NETTA_6412)
+	while (i < 1000 && (dsp_read_hpic_word(DSP_HPIC) & 0x08) == 0) {
+#else
+	while (i < 1000 && (dsp_read_hpic() & 0x08) == 0) {
+#endif
+		dsp_delay();
+		i++;
+	}
 }
 
 static inline void dsp_write_hpic_word(u32 addr, u32 val)
 {
 	volatile u16 *p;
+#if defined(CONFIG_NETTA_6412)
+	p = (volatile u16 *)((volatile u8 *)DSP_BASE + addr);
+	p[0] = bit_invert((u16)(val >> 16));
+	/* dsp_delay(); */
 
+	p[1] = bit_invert((u16)val);
+	/* dsp_delay(); */
+#else
 	p = (volatile u16 *)((volatile u8 *)DSP_BASE + addr);
 	p[0] = (u16)(val >> 16);
 	dsp_delay();
 
 	p[1] = (u16)val;
 	dsp_delay();
+#endif
 }
 
 static inline void dsp_write_hpic_hi_hword(u32 addr, u16 val_h)
 {
+#if defined(CONFIG_NETTA_6412)
+	*(volatile u16 *)((volatile u8 *)DSP_BASE + addr) = bit_invert(val_h);
+#else
+
 	*(volatile u16 *)((volatile u8 *)DSP_BASE + addr) = val_h;
+#endif
 }
 
 static inline void dsp_write_hpic_lo_hword(u32 addr, u16 val_l)
 {
+#if defined(CONFIG_NETTA_6412)
+	*(volatile u16 *)((volatile u8 *)DSP_BASE + addr + 2) = bit_invert(val_l);
+#else
 	*(volatile u16 *)((volatile u8 *)DSP_BASE + addr + 2) = val_l;
+#endif
 }
 
 /********************************************************************/
@@ -193,21 +261,29 @@
 static inline void c62_write_word(u32 addr, u32 val)
 {
 	dsp_write_hpic_hi_hword(DSP_HPIA, (u16)(addr >> 16));
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
+#endif
 	dsp_write_hpic_lo_hword(DSP_HPIA, (u16)addr);
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
+#endif
 
 	dsp_wait_hrdy();
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
-
+#endif
 	dsp_write_hpic_hi_hword(DSP_HPID2, (u16)(val >> 16));
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
 
-	dsp_wait_hrdy();
-	dsp_delay();
-
+	/* dsp_wait_hrdy();
+	dsp_delay(); */
+#endif
 	dsp_write_hpic_lo_hword(DSP_HPID2, (u16)val);
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
+#endif
 }
 
 static u32 c62_read_word(u32 addr)
@@ -215,26 +291,36 @@
 	u32 val;
 
 	dsp_write_hpic_hi_hword(DSP_HPIA, (u16)(addr >> 16));
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
+#endif
 	dsp_write_hpic_lo_hword(DSP_HPIA, (u16)addr);
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
+#endif
 
 	/* FETCH */
+#if defined(CONFIG_NETTA_6412)
+	dsp_write_hpic_word(DSP_HPIC, 0x00100010);
+#else
 	dsp_write_hpic(0x10);
 	dsp_delay();
-
+#endif
 	dsp_wait_hrdy();
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
-
+#endif
 	val = (u32)dsp_read_hpic_hi_hword(DSP_HPID2) << 16;
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
 
-	dsp_wait_hrdy();
-	dsp_delay();
-
+	/* dsp_wait_hrdy();
+	dsp_delay(); */
+#endif
 	val |= dsp_read_hpic_lo_hword(DSP_HPID2);
+#if !defined(CONFIG_NETTA_6412)
 	dsp_delay();
-
+#endif
 	return val;
 }
 
@@ -300,8 +386,88 @@
 	return 0;
 }
 
+#if defined(CONFIG_NETTA_6412)
+
+#define DRAM_REGS_BASE	0x1800000
+
+#define GBLCTL	DRAM_REGS_BASE
+#define CECTL1	(DRAM_REGS_BASE + 0x4)
+#define CECTL0	(DRAM_REGS_BASE + 0x8)
+#define CECTL2	(DRAM_REGS_BASE + 0x10)
+#define CECTL3	(DRAM_REGS_BASE + 0x14)
+#define SDCTL	(DRAM_REGS_BASE + 0x18)
+#define SDTIM	(DRAM_REGS_BASE + 0x1C)
+#define SDEXT	(DRAM_REGS_BASE + 0x20)
+#define SESEC1	(DRAM_REGS_BASE + 0x44)
+#define SESEC0	(DRAM_REGS_BASE + 0x48)
+#define SESEC2	(DRAM_REGS_BASE + 0x50)
+#define SESEC3	(DRAM_REGS_BASE + 0x54)
+
+#define MAR128	0x1848200
+#define MAR129	0x1848204
+
+void dsp_dram_initialize(void)
+{
+	c62_write_word(GBLCTL, 0x120E4);
+	c62_write_word(CECTL1, 0x18);
+	c62_write_word(CECTL0, 0xD0);
+	c62_write_word(CECTL2, 0x18);
+	c62_write_word(CECTL3, 0x18);
+	c62_write_word(SDCTL, 0x47115000);
+	c62_write_word(SDTIM, 1536);
+	c62_write_word(SDEXT, 0x534A9);
+#if 0
+	c62_write_word(SESEC1, 0);
+	c62_write_word(SESEC0, 0);
+	c62_write_word(SESEC2, 0);
+	c62_write_word(SESEC3, 0);
+#endif
+	c62_write_word(MAR128, 1);
+	c62_write_word(MAR129, 0);
+}
+
+#endif
+
+static inline void dsp_init_hpic(void)
+{
+	int i;
+	volatile u16 *p;
+#if defined(CONFIG_NETTA_6412)
+	dsp_go_fast();
+#else
+	dsp_go_slow();
+#endif
+	i = 0;
+#if defined(CONFIG_NETTA_6412)
+	while (i < 1000 && (dsp_read_hpic_word(DSP_HPIC) & 0x08) == 0) {
+#else
+	while (i < 1000 && (dsp_read_hpic() & 0x08) == 0) {
+#endif
+		dsp_delay();
+		i++;
+	}
+
+	if (i == 1000)
+		printf("HRDY stuck\n");
+
+	dsp_delay();
+
+	/* write control register */
+	p = (volatile u16 *)DSP_BASE;
+	p[0] = 0x0000;
+	dsp_delay();
+	p[1] = 0x0000;
+	dsp_delay();
+
+#if !defined(CONFIG_NETTA_6412)
+	dsp_go_fast();
+#endif
+}
+
 /***********************************************************************************************************/
 
+#if !defined(CONFIG_NETTA_6412)
+
 static const u8 bootstrap_rbin[5084] = {
 	0x52, 0x42, 0x49, 0x4e, 0xc5, 0xa9, 0x9f, 0x1a, 0x00, 0x00, 0x00, 0x02,
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00,
@@ -931,18 +1097,23 @@
 	dsp_go_fast();
 }
 
+#endif
+
 /***********************************************************************************************************/
 
 int board_post_dsp(int flags)
 {
 	u32 ramS, ramE;
 	u32 data, data2;
-	int i, j, k, r;
-
+	int i, j, k;
+#if !defined(CONFIG_NETTA_6412)
+	int r;
+#endif
 	dsp_reset();
 	dsp_init_hpic();
+#if !defined(CONFIG_NETTA_6412)
 	dsp_go_slow();
-
+#endif
 	data = 0x11223344;
 	dsp_write_hpic_word(DSP_HPIA, data);
 	data2 = dsp_read_hpic_word(DSP_HPIA);
@@ -958,7 +1129,9 @@
 		printf("HPIA: ** ERROR; wrote 0x%08X read 0x%08X **\n", data, data2);
 		goto err;
 	}
-
+#if defined(CONFIG_NETTA_6412)
+	dsp_dram_initialize();
+#else
 	r = load_bootstrap();
 	if (r < 0) {
 		printf("BOOTSTRAP: ** ERROR ** failed to load\n");
@@ -968,7 +1141,7 @@
 	run_bootstrap();
 
 	dsp_go_fast();
-
+#endif
 	printf("    ");
 
 	/* test RAMs */
@@ -1001,12 +1174,12 @@
 	}
 
 	printf("\b\b\b\b    \b\b\b\bOK\n");
-
+#if !defined(CONFIG_NETTA_6412)
 	/* XXX assume that this works */
 	load_bootstrap();
 	run_bootstrap();
 	dsp_go_fast();
-
+#endif
 	return 0;
 
 err:
@@ -1015,10 +1188,14 @@
 
 int board_dsp_reset(void)
 {
+#if !defined(CONFIG_NETTA_6412)
 	int r;
-
+#endif
 	dsp_reset();
 	dsp_init_hpic();
+#if defined(CONFIG_NETTA_6412)
+	dsp_dram_initialize();
+#else
 	dsp_go_slow();
 	r = load_bootstrap();
 	if (r < 0)
@@ -1026,6 +1203,6 @@
 
 	run_bootstrap();
 	dsp_go_fast();
-
+#endif
 	return 0;
 }