Move I2S initialisation out of the Wolfson codec driver


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11700 a1c6a512-1295-4272-9138-f99709370657
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 77c2578..30431d7 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -328,6 +328,7 @@
 target/arm/sandisk/sansa-e200/usb-e200.c
 target/arm/sandisk/sansa-e200/button-e200.c
 target/arm/sandisk/sansa-e200/power-e200.c
+target/arm/i2s-pp.c
 #endif /* SIMULATOR */
 #endif /* SANSA_E200 */
 
@@ -403,6 +404,7 @@
 #ifndef SIMULATOR
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/iriver/h10/adc-h10.c
 target/arm/iriver/h10/backlight-h10.c
 target/arm/iriver/h10/button-h10.c
@@ -416,6 +418,7 @@
 #ifndef SIMULATOR
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/iriver/h10/adc-h10.c
 target/arm/iriver/h10/backlight-h10.c
 target/arm/iriver/h10/button-h10.c
@@ -445,6 +448,7 @@
 #ifndef SIMULATOR
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/tatung/tpj1022/adc-tpj1022.c
 target/arm/tatung/tpj1022/backlight-tpj1022.c
 target/arm/tatung/tpj1022/button-tpj1022.c
@@ -459,6 +463,7 @@
 drivers/lcd-ipod.c
 drivers/pcf50605.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ata-pp5020.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-4g_color.c
@@ -474,6 +479,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-4g_color.c
 target/arm/ipod/button-clickwheel.c
@@ -488,6 +494,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-nano_video.c
 target/arm/ipod/button-clickwheel.c
@@ -502,6 +509,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-nano_video.c
 target/arm/ipod/button-clickwheel.c
@@ -516,6 +524,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5002.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/3g/backlight-3g.c
 target/arm/ipod/3g/button-3g.c
@@ -530,6 +539,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-mini1g_mini2g.c
 target/arm/ipod/button-mini1g.c
@@ -544,6 +554,7 @@
 drivers/pcf50605.c
 target/arm/ata-pp5020.c
 target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
 target/arm/ipod/adc-ipod.c
 target/arm/ipod/backlight-mini1g_mini2g.c
 target/arm/ipod/button-clickwheel.c
diff --git a/firmware/drivers/wm8731l.c b/firmware/drivers/wm8731l.c
index 3052133..a690aad 100644
--- a/firmware/drivers/wm8731l.c
+++ b/firmware/drivers/wm8731l.c
@@ -39,6 +39,7 @@
 
 #include "wmcodec.h"
 #include "wm8731l.h"
+#include "i2s.h"
 
 #define IPOD_PCM_LEVEL 0x65       /* -6dB */
 
diff --git a/firmware/drivers/wm8758.c b/firmware/drivers/wm8758.c
index 268df13..22bef73 100644
--- a/firmware/drivers/wm8758.c
+++ b/firmware/drivers/wm8758.c
@@ -39,6 +39,7 @@
 
 #include "wmcodec.h"
 #include "wm8758.h"
+#include "i2s.h"
 
 /* convert tenth of dB volume (-57..6) to master volume register value */
 int tenthdb2master(int db)
diff --git a/firmware/drivers/wm8975.c b/firmware/drivers/wm8975.c
index 7f2f2c4..d2b1fa6 100644
--- a/firmware/drivers/wm8975.c
+++ b/firmware/drivers/wm8975.c
@@ -39,6 +39,7 @@
 
 #include "wmcodec.h"
 #include "wm8975.h"
+#include "i2s.h"
 
 /* convert tenth of dB volume (-730..60) to master volume register value */
 int tenthdb2master(int db)
diff --git a/firmware/export/i2s.h b/firmware/export/i2s.h
new file mode 100644
index 0000000..13dba68
--- /dev/null
+++ b/firmware/export/i2s.h
@@ -0,0 +1,20 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Daniel Ankers
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+void i2s_reset(void);
diff --git a/firmware/export/wmcodec.h b/firmware/export/wmcodec.h
index 1079a80..d810469 100644
--- a/firmware/export/wmcodec.h
+++ b/firmware/export/wmcodec.h
@@ -17,7 +17,6 @@
  *
  ****************************************************************************/
 
-void i2s_reset(void);
 int audiohw_init(void);
 void wmcodec_write(int reg, int data);
 
diff --git a/firmware/target/arm/i2s-pp.c b/firmware/target/arm/i2s-pp.c
new file mode 100644
index 0000000..1485147
--- /dev/null
+++ b/firmware/target/arm/i2s-pp.c
@@ -0,0 +1,95 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Portalplayer specific code for I2S
+ *
+ * Based on code from the ipodlinux project - http://ipodlinux.org/
+ * Adapted for Rockbox in December 2005
+ *
+ * Original file: linux/arch/armnommu/mach-ipod/audio.c
+ *
+ * Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "system.h"
+
+/* TODO: Add in PP5002 defs */
+#if CONFIG_CPU == PP5002
+void i2s_reset(void)
+{
+    /* I2S device reset */
+    DEV_RS |= 0x80;
+    DEV_RS &= ~0x80;
+
+    /* I2S controller enable */
+    IISCONFIG |= 1;
+
+    /* BIT.FORMAT [11:10] = I2S (default) */
+    /* BIT.SIZE [9:8] = 24bit */
+    /* FIFO.FORMAT = 24 bit LSB */
+
+    /* reset DAC and ADC fifo */
+    IISFIFO_CFG |= 0x30000;
+}
+#else /* PP502X */
+
+/* Data format on the I2S bus */
+#define FORMAT_MASK (0x3 << 10)
+#define FORMAT_I2S  (0x00 << 10)
+/* Other formats not yet known */
+
+/* Data size on I2S bus */
+#define SIZE_MASK   (0x3 << 8)
+#define SIZE_16BIT  (0x00 << 10)
+/* Other sizes not yet known */
+
+/* Data size/format on I2S FIFO */
+#define FIFO_FORMAT_MASK (0x7 << 4)
+#define FIFO_FORMAT_32LSB (0x03 << 4)
+/* Other formats not yet known */
+
+/* Are we I2S Master or slave? */
+#define I2S_MASTER (0x25)
+
+#define I2S_RESET (0x1 << 31)
+
+/*
+ * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
+ */
+void i2s_reset(void)
+{
+    /* I2S soft reset */
+    IISCONFIG |= I2S_RESET;
+    IISCONFIG &= ~I2S_RESET;
+
+    /* BIT.FORMAT */
+    IISCONFIG = ((IISCONFIG & ~FORMAT_MASK) | FORMAT_I2S);
+
+    /* BIT.SIZE */
+    IISCONFIG = ((IISCONFIG & ~SIZE_MASK) | SIZE_16BIT);
+
+    /* FIFO.FORMAT */
+    /* If BIT.SIZE < FIFO.FORMAT low bits will be 0 */
+    IISCONFIG = ((IISCONFIG & ~FIFO_FORMAT_MASK) | FIFO_FORMAT_32LSB);
+
+    /* RX_ATN_LVL=1 == when 12 slots full */
+    /* TX_ATN_LVL=1 == when 12 slots empty */
+    IISFIFO_CFG |= 0x33;
+
+    /* Rx.CLR = 1, TX.CLR = 1 */
+    IISFIFO_CFG |= 0x1100;
+}
+#endif
diff --git a/firmware/target/arm/wmcodec-pp.c b/firmware/target/arm/wmcodec-pp.c
index 8aa862c..471cd8f 100644
--- a/firmware/target/arm/wmcodec-pp.c
+++ b/firmware/target/arm/wmcodec-pp.c
@@ -23,19 +23,8 @@
  * KIND, either express or implied.
  *
  ****************************************************************************/
-#include "lcd.h"
-#include "cpu.h"
-#include "kernel.h"
-#include "thread.h"
-#include "power.h"
-#include "debug.h"
+
 #include "system.h"
-#include "sprintf.h"
-#include "button.h"
-#include "string.h"
-#include "file.h"
-#include "buffer.h"
-#include "audio.h"
 
 #if CONFIG_CPU == PP5020
 #include "i2c-pp5020.h"
@@ -51,47 +40,6 @@
 #define I2C_AUDIO_ADDRESS 0x1a
 #endif
 
-/*
- * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
- */
-void i2s_reset(void)
-{
-#if CONFIG_CPU == PP5020
-    /* I2S soft reset */
-    outl(inl(0x70002800) | 0x80000000, 0x70002800);
-    outl(inl(0x70002800) & ~0x80000000, 0x70002800);
-
-    /* BIT.FORMAT [11:10] = I2S (default) */
-    outl(inl(0x70002800) & ~0xc00, 0x70002800);
-    /* BIT.SIZE [9:8] = 16bit (default) */
-    outl(inl(0x70002800) & ~0x300, 0x70002800);
-
-    /* FIFO.FORMAT [6:4] = 32 bit LSB */
-    /* since BIT.SIZ < FIFO.FORMAT low 16 bits will be 0 */
-    outl(inl(0x70002800) | 0x30, 0x70002800);
-
-    /* RX_ATN_LVL=1 == when 12 slots full */
-    /* TX_ATN_LVL=1 == when 12 slots empty */
-    outl(inl(0x7000280c) | 0x33, 0x7000280c);
-
-    /* Rx.CLR = 1, TX.CLR = 1 */
-    outl(inl(0x7000280c) | 0x1100, 0x7000280c);
-#elif CONFIG_CPU == PP5002
-    /* I2S device reset */
-    outl(inl(0xcf005030) | 0x80, 0xcf005030);
-    outl(inl(0xcf005030) & ~0x80, 0xcf005030);
-
-    /* I2S controller enable */
-    outl(inl(0xc0002500) | 0x1, 0xc0002500);
-
-    /* BIT.FORMAT [11:10] = I2S (default) */
-    /* BIT.SIZE [9:8] = 24bit */
-    /* FIFO.FORMAT = 24 bit LSB */
-
-    /* reset DAC and ADC fifo */
-    outl(inl(0xc000251c) | 0x30000, 0xc000251c);
-#endif
-}
 
 /*
  * Initialise the WM8975 for playback via headphone and line out.