Add rk29 rk1000 codec and i2s
authorfang <fang@fang-desktop.(none)>
Mon, 22 Nov 2010 09:44:53 +0000 (17:44 +0800)
committerfang <fang@fang-desktop.(none)>
Mon, 22 Nov 2010 09:44:53 +0000 (17:44 +0800)
arch/arm/mach-rk29/Makefile
arch/arm/mach-rk29/board-rk29sdk.c
arch/arm/mach-rk29/devices.h
arch/arm/mach-rk29/include/mach/board.h
arch/arm/mach-rk29/rk29-audio.c [new file with mode: 0644]
sound/soc/Kconfig
sound/soc/Makefile
sound/soc/codecs/rk1000_codec.c

index df59ba3d11af562f73bfca27cd8867d5af813ca9..18e5948018f4e1cfad410afd9ad7a860ce6f9bf1 100644 (file)
@@ -1,3 +1,4 @@
 obj-y += timer.o io.o devices.o iomux.o clock.o rk29-pl330.o dma.o gpio.o
+obj-$(CONFIG_SND_RK29_SOC_I2S) += rk29-audio.o
 obj-$(CONFIG_RK29_VPU) += vpu.o
 obj-$(CONFIG_MACH_RK29SDK) += board-rk29sdk.o board-rk29sdk-key.o
index 1ff06bb853ff8a3bb82332830b4a5cf20e3cc24b..6d446c4ad8f2c511c0c5ab91ee9282d4c406bf41 100755 (executable)
@@ -410,6 +410,13 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = {
                .flags                  = 0,\r
        },\r
 #endif\r
+#if defined (CONFIG_SND_SOC_RK1000)\r
+       {\r
+               .type                   = "rk1000_i2c_codec",\r
+               .addr           = 0x60,\r
+               .flags                  = 0,\r
+       },\r
+#endif\r
 #if defined (CONFIG_BATTERY_STC3100)\r
        {\r
                .type                   = "stc3100-battery",\r
@@ -663,6 +670,12 @@ static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_I2C3_RK29\r
        &rk29_device_i2c3,\r
 #endif\r
+\r
+#ifdef CONFIG_SND_RK29_SOC_I2S\r
+        &rk29_device_iis_2ch,\r
+        //&rk29_device_iis_8ch,\r
+#endif\r
+\r
 #ifdef CONFIG_KEYS_RK29\r
        &rk29_device_keys,\r
 #endif\r
index d202ce311b5007b912865ffcb20d3eb8d92892e8..41e15afdeec244612f1e4d33f2ba59953ebf2414 100755 (executable)
 #define __ARCH_ARM_MACH_RK29_DEVICES_H
 
 extern struct rk29_nand_platform_data rk29_nand_data;
+
 extern struct rk29_i2c_platform_data default_i2c0_data;
 extern struct rk29_i2c_platform_data default_i2c1_data;
 extern struct rk29_i2c_platform_data default_i2c2_data;
 extern struct rk29_i2c_platform_data default_i2c3_data;
+
 extern struct platform_device rk29_device_i2c0;
 extern struct platform_device rk29_device_i2c1;
 extern struct platform_device rk29_device_i2c2;
 extern struct platform_device rk29_device_i2c3;
+
+extern struct platform_device rk29_device_iis_2ch;
+extern struct platform_device rk29_device_iis_8ch;
+
 extern struct platform_device rk29_device_uart0;
 extern struct platform_device rk29_device_uart1;
 extern struct platform_device rk29_device_uart2;
index 17dbf18b01ab1789b09197f9dfc2eec34332cedc..31031a0c2a7c459e894046da6411949a9a68da46 100755 (executable)
@@ -100,6 +100,12 @@ struct rk29_i2c_platform_data {
        int (*io_deinit)(void);
 };
 
+/*i2s*/
+struct rk29_i2s_platform_data {
+       int (*io_init)(void);
+       int (*io_deinit)(void);
+};
+
 void __init rk29_map_common_io(void);
 void __init rk29_clock_init(void);
 
diff --git a/arch/arm/mach-rk29/rk29-audio.c b/arch/arm/mach-rk29/rk29-audio.c
new file mode 100644 (file)
index 0000000..7238538
--- /dev/null
@@ -0,0 +1,68 @@
+
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+
+#include <mach/rk29-dma-pl330.h>
+#include <mach/rk29_iomap.h>
+#include <mach/irqs.h>
+
+static struct resource rk29_iis_2ch_resource[] = {
+        [0] = {
+                .start = RK29_I2S_2CH_PHYS,
+                .end   = RK29_I2S_2CH_PHYS + RK29_I2S_2CH_SIZE,
+                .flags = IORESOURCE_MEM,
+        },
+        [1] = {
+                .start = DMACH_I2S_2CH_TX,
+                .end   = DMACH_I2S_2CH_TX,
+                .flags = IORESOURCE_DMA,
+        },
+        [2] = {
+                .start = DMACH_I2S_2CH_RX,
+                .end   = DMACH_I2S_2CH_RX,
+                .flags = IORESOURCE_DMA,
+        },
+        [3] = {
+                .start = IRQ_I2S_2CH,
+                .end   = IRQ_I2S_2CH,
+                .flags = IORESOURCE_IRQ,        
+        },
+};
+
+struct platform_device rk29_device_iis_2ch = {
+        .name           = "rk29-i2s",
+        .id             = 0,
+        .num_resources  = ARRAY_SIZE(rk29_iis_2ch_resource),
+        .resource       = rk29_iis_2ch_resource,
+};
+
+static struct resource rk29_iis_8ch_resource[] = {
+        [0] = {
+                .start = RK29_I2S_8CH_PHYS,
+                .end   = RK29_I2S_8CH_PHYS + RK29_I2S_8CH_SIZE,
+                .flags = IORESOURCE_MEM,
+        },
+        [1] = {
+                .start = DMACH_I2S_8CH_TX,
+                .end   = DMACH_I2S_8CH_TX,
+                .flags = IORESOURCE_DMA,
+        },
+        [2] = {
+                .start = DMACH_I2S_8CH_RX,
+                .end   = DMACH_I2S_8CH_RX,
+                .flags = IORESOURCE_DMA,
+        },
+        [3] = {
+                .start = IRQ_I2S_8CH,
+                .end   = IRQ_I2S_8CH,
+                .flags = IORESOURCE_IRQ,        
+        },
+};
+
+struct platform_device rk29_device_iis_8ch = {
+        .name           = "rk29-i2s",
+        .id             = 1,
+        .num_resources  = ARRAY_SIZE(rk29_iis_8ch_resource),
+        .resource       = rk29_iis_8ch_resource,
+};
index 36258a0b546b5b8b3fc8016af66b12e89ce9d926..40b0f7beab08a73c18c916d6bb6ce8fb688e8496 100644 (file)
@@ -37,6 +37,7 @@ source "sound/soc/s6000/Kconfig"
 source "sound/soc/sh/Kconfig"
 source "sound/soc/txx9/Kconfig"
 source "sound/soc/rk2818/Kconfig"
+source "sound/soc/rk29/Kconfig"
 # Supported codecs
 source "sound/soc/codecs/Kconfig"
 
index 6adaa55b42e93642c975ecc92f2728e6eaa6cbfc..ffa30c5832ae278c1a946dce8945d0a8ce8f7236 100644 (file)
@@ -15,3 +15,4 @@ obj-$(CONFIG_SND_SOC) += s6000/
 obj-$(CONFIG_SND_SOC)  += sh/
 obj-$(CONFIG_SND_SOC)  += txx9/
 obj-$(CONFIG_SND_SOC)  += rk2818/
+obj-$(CONFIG_SND_SOC)   += rk29/
index dac31cadcd1a590d315fd9634991343bbc9d81ea..7d0736c78b76d2590746e4261960807be8094cc1 100644 (file)
@@ -131,10 +131,13 @@ static int rk1000_codec_write(struct snd_soc_codec *codec, unsigned int reg,
        rk1000_codec_write_reg_cache (codec, reg, value);
        i2c = (struct i2c_client *)codec->control_data;
        i2c->addr = (i2c->addr & 0x60)|reg;
-       if (codec->hw_write(codec->control_data, data, 1) == 2)
+       if (codec->hw_write(codec->control_data, data, 1) == 2){
+                DBG("================%s Run OK================\n",__FUNCTION__,__LINE__);
                return 0;
-       else
+       }else{
+               DBG("================%s Run EIO================\n",__FUNCTION__,__LINE__);
                return -EIO;
+        }
 }
 
 static const struct snd_kcontrol_new rk1000_codec_snd_controls[] = {
@@ -803,7 +806,7 @@ static int rk1000_codec_register(struct rk1000_codec_priv *rk1000_codec,
                //goto err;
        //}
 
-#if 1
+#if 0   //fzf rk2818 is SPK_CTL
        gpio_request(RK2818_PIN_PF7, "rk1000_codec");   
        rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_GPIO1_A3B7);
        gpio_direction_output(RK2818_PIN_PF7,GPIO_HIGH);