change for wm8994
author陈金泉 <chenjq@rock-chips.com>
Tue, 29 Nov 2011 03:38:28 +0000 (11:38 +0800)
committer陈金泉 <chenjq@rock-chips.com>
Tue, 29 Nov 2011 03:38:58 +0000 (11:38 +0800)
drivers/mfd/wm8994-core.c
include/linux/mfd/wm8994/core.h
sound/soc/codecs/wm8994.c
sound/soc/rk29/rk29_wm8994.c

index 7ecd7de78c3366894660f09fe81e8a7e85fbfe86..7617bcd0174328719dcd5e673042c7fea6078a95 100644 (file)
@@ -25,6 +25,9 @@
 #include <linux/mfd/wm8994/core.h>
 #include <linux/mfd/wm8994/pdata.h>
 #include <linux/mfd/wm8994/registers.h>
+#include <mach/gpio.h>
+
+#define WM_PW_EN RK29_PIN5_PA1
 
 static int wm8994_read(struct wm8994 *wm8994, unsigned short reg,
                       int bytes, void *dest)
@@ -43,7 +46,6 @@ static int wm8994_read(struct wm8994 *wm8994, unsigned short reg,
                dev_vdbg(wm8994->dev, "Read %04x from R%d(0x%x)\n",
                         be16_to_cpu(buf[i]), reg + i, reg + i);
        }
-
        return 0;
 }
 
@@ -107,7 +109,6 @@ static int wm8994_write(struct wm8994 *wm8994, unsigned short reg,
                dev_vdbg(wm8994->dev, "Write %04x to R%d(0x%x)\n",
                         be16_to_cpu(buf[i]), reg + i, reg + i);
        }
-
        return wm8994->write_dev(wm8994, reg, bytes, src);
 }
 
@@ -266,18 +267,17 @@ static const char *wm8958_main_supplies[] = {
 };
 
 #ifdef CONFIG_PM
-static int wm8994_suspend(struct device *dev)
+int wm8994_suspend(struct wm8994 *wm8994)
 {
-       struct wm8994 *wm8994 = dev_get_drvdata(dev);
        int ret;
 
        /* Don't actually go through with the suspend if the CODEC is
         * still active (eg, for audio passthrough from CP. */
        ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_1);
        if (ret < 0) {
-               dev_err(dev, "Failed to read power status: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to read power status: %d\n", ret);
        } else if (ret & WM8994_VMID_SEL_MASK) {
-               dev_dbg(dev, "CODEC still active, ignoring suspend\n");
+               dev_dbg(wm8994->dev, "CODEC still active, ignoring suspend\n");
                return 0;
        }
 
@@ -288,13 +288,13 @@ static int wm8994_suspend(struct device *dev)
        ret = wm8994_read(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
                          &wm8994->gpio_regs);
        if (ret < 0)
-               dev_err(dev, "Failed to save GPIO registers: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to save GPIO registers: %d\n", ret);
 
        /* For similar reasons we also stash the regulator states */
        ret = wm8994_read(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
                          &wm8994->ldo_regs);
        if (ret < 0)
-               dev_err(dev, "Failed to save LDO registers: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to save LDO registers: %d\n", ret);
 
        /* Explicitly put the device into reset in case regulators
         * don't get disabled in order to ensure consistent restart.
@@ -303,46 +303,51 @@ static int wm8994_suspend(struct device *dev)
 
        wm8994->suspended = true;
 
-       ret = regulator_bulk_disable(wm8994->num_supplies,
+/*     ret = regulator_bulk_disable(wm8994->num_supplies,
                                     wm8994->supplies);
        if (ret != 0) {
                dev_err(dev, "Failed to disable supplies: %d\n", ret);
                return ret;
        }
+*/
+
+       gpio_set_value(WM_PW_EN, GPIO_LOW);
 
        return 0;
 }
 
-static int wm8994_resume(struct device *dev)
+int wm8994_resume(struct wm8994 *wm8994)
 {
-       struct wm8994 *wm8994 = dev_get_drvdata(dev);
        int ret;
 
        /* We may have lied to the PM core about suspending */
        if (!wm8994->suspended)
                return 0;
 
-       ret = regulator_bulk_enable(wm8994->num_supplies,
+       gpio_set_value(WM_PW_EN, GPIO_HIGH);
+       msleep(50);
+
+/*     ret = regulator_bulk_enable(wm8994->num_supplies,
                                    wm8994->supplies);
        if (ret != 0) {
                dev_err(dev, "Failed to enable supplies: %d\n", ret);
                return ret;
        }
-
+*/
        ret = wm8994_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK,
                           WM8994_NUM_IRQ_REGS * 2, &wm8994->irq_masks_cur);
        if (ret < 0)
-               dev_err(dev, "Failed to restore interrupt masks: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to restore interrupt masks: %d\n", ret);
 
        ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
                           &wm8994->ldo_regs);
        if (ret < 0)
-               dev_err(dev, "Failed to restore LDO registers: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to restore LDO registers: %d\n", ret);
 
        ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
                           &wm8994->gpio_regs);
        if (ret < 0)
-               dev_err(dev, "Failed to restore GPIO registers: %d\n", ret);
+               dev_err(wm8994->dev, "Failed to restore GPIO registers: %d\n", ret);
 
        wm8994->suspended = false;
 
@@ -394,7 +399,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
                goto err;
        }
 
-       switch (wm8994->type) {
+/*     switch (wm8994->type) {
        case WM8994:
                wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
                break;
@@ -441,7 +446,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
                dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
                goto err_get;
        }
-
+*/
        ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
        if (ret < 0) {
                dev_err(wm8994->dev, "Failed to read ID register\n");
@@ -537,12 +542,12 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
 err_irq:
        wm8994_irq_exit(wm8994);
 err_enable:
-       regulator_bulk_disable(wm8994->num_supplies,
-                              wm8994->supplies);
+//     regulator_bulk_disable(wm8994->num_supplies,
+//                            wm8994->supplies);
 err_get:
-       regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
+//     regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
 err_supplies:
-       kfree(wm8994->supplies);
+//     kfree(wm8994->supplies);
 err:
        mfd_remove_devices(wm8994->dev);
        kfree(wm8994);
@@ -554,10 +559,10 @@ static void wm8994_device_exit(struct wm8994 *wm8994)
        pm_runtime_disable(wm8994->dev);
        mfd_remove_devices(wm8994->dev);
        wm8994_irq_exit(wm8994);
-       regulator_bulk_disable(wm8994->num_supplies,
-                              wm8994->supplies);
-       regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
-       kfree(wm8994->supplies);
+//     regulator_bulk_disable(wm8994->num_supplies,
+//                            wm8994->supplies);
+//     regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
+//     kfree(wm8994->supplies);
        kfree(wm8994);
 }
 
@@ -595,11 +600,13 @@ static int wm8994_i2c_write_device(struct wm8994 *wm8994, unsigned short reg,
        xfer[0].flags = 0;
        xfer[0].len = 2;
        xfer[0].buf = (char *)&reg;
+       xfer[0].scl_rate = 100 * 1000;
 
        xfer[1].addr = i2c->addr;
        xfer[1].flags = I2C_M_NOSTART;
        xfer[1].len = bytes;
        xfer[1].buf = (char *)src;
+       xfer[1].scl_rate = 100 * 1000;
 
        ret = i2c_transfer(i2c->adapter, xfer, 2);
        if (ret < 0)
@@ -610,11 +617,16 @@ static int wm8994_i2c_write_device(struct wm8994 *wm8994, unsigned short reg,
        return 0;
 }
 
-static int wm8994_i2c_probe(struct i2c_client *i2c,
-                           const struct i2c_device_id *id)
+int wm8994_probe(struct i2c_client *i2c,
+                   const struct i2c_device_id *id)
 {
        struct wm8994 *wm8994;
 
+       gpio_request(WM_PW_EN, NULL);
+       gpio_direction_output(WM_PW_EN, GPIO_HIGH);
+
+       msleep(50);
+
        wm8994 = kzalloc(sizeof(struct wm8994), GFP_KERNEL);
        if (wm8994 == NULL)
                return -ENOMEM;
@@ -630,7 +642,7 @@ static int wm8994_i2c_probe(struct i2c_client *i2c,
        return wm8994_device_init(wm8994, i2c->irq);
 }
 
-static int wm8994_i2c_remove(struct i2c_client *i2c)
+int wm8994_remove(struct i2c_client *i2c)
 {
        struct wm8994 *wm8994 = i2c_get_clientdata(i2c);
 
@@ -638,46 +650,6 @@ static int wm8994_i2c_remove(struct i2c_client *i2c)
 
        return 0;
 }
-
-static const struct i2c_device_id wm8994_i2c_id[] = {
-       { "wm8994", WM8994 },
-       { "wm8958", WM8958 },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);
-
-static UNIVERSAL_DEV_PM_OPS(wm8994_pm_ops, wm8994_suspend, wm8994_resume,
-                           NULL);
-
-static struct i2c_driver wm8994_i2c_driver = {
-       .driver = {
-               .name = "WM8994",
-               .owner = THIS_MODULE,
-               .pm = &wm8994_pm_ops,
-       },
-       .probe = wm8994_i2c_probe,
-       .remove = wm8994_i2c_remove,
-       .id_table = wm8994_i2c_id,
-};
-
-static int __init wm8994_i2c_init(void)
-{
-       int ret;
-
-       ret = i2c_add_driver(&wm8994_i2c_driver);
-       if (ret != 0)
-               pr_err("Failed to register wm8994 I2C driver: %d\n", ret);
-
-       return ret;
-}
-module_init(wm8994_i2c_init);
-
-static void __exit wm8994_i2c_exit(void)
-{
-       i2c_del_driver(&wm8994_i2c_driver);
-}
-module_exit(wm8994_i2c_exit);
-
 MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
index f0b69cdae41cc94f24c995d9812301d9eb711451..3e2c91f91657a8eb32297c7db4be123f8542ea95 100644 (file)
@@ -16,6 +16,7 @@
 #define __MFD_WM8994_CORE_H__
 
 #include <linux/interrupt.h>
+#include <linux/i2c.h>
 
 enum wm8994_type {
        WM8994 = 0,
@@ -113,4 +114,10 @@ static inline void wm8994_free_irq(struct wm8994 *wm8994, int irq, void *data)
 int wm8994_irq_init(struct wm8994 *wm8994);
 void wm8994_irq_exit(struct wm8994 *wm8994);
 
+int wm8994_suspend(struct wm8994 *wm8994);
+int wm8994_resume(struct wm8994 *wm8994);
+
+int wm8994_probe(struct i2c_client *i2c, const struct i2c_device_id *id);
+int wm8994_remove(struct i2c_client *i2c);
+
 #endif
index 8da1cc17b79cf46ee3fbb8edaaa982a73885f0fe..52f46b3cc58c9a0d92da6b4ddd00966ebf657e27 100755 (executable)
@@ -41,6 +41,8 @@
 #define WM8994_NUM_DRC 3
 #define WM8994_NUM_EQ  3
 
+struct wm8994 *wm8994_control;
+
 static int wm8994_drc_base[] = {
        WM8994_AIF1_DRC1_1,
        WM8994_AIF1_DRC2_1,
@@ -2329,6 +2331,32 @@ static int wm8994_set_tristate(struct snd_soc_dai *codec_dai, int tristate)
        return snd_soc_update_bits(codec, reg, mask, val);
 }
 
+struct snd_soc_codec *wm8994_regshow_codec;
+
+static ssize_t wm8994_index_reg_show(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       #define IDX_REG_FMT "reg 0x%04x value 0x%04x\n"
+       unsigned int val;
+       int cnt = 0, i;
+
+       cnt += sprintf(buf, "WM8994 index register\n");
+       for (i = 0; i < WM8994_CACHE_SIZE; i++) {
+               if (!wm8994_readable(wm8994_regshow_codec, i) || wm8994_volatile(wm8994_regshow_codec, i))
+                       continue;
+               val = wm8994_reg_read(wm8994_control, i);
+               if (!val)
+                       continue;
+               cnt += sprintf(buf + cnt, IDX_REG_FMT, i, val);
+       }
+
+       if (cnt >= PAGE_SIZE)
+               cnt = PAGE_SIZE - 1;
+
+       return cnt;
+}
+static DEVICE_ATTR(index_reg, 0444, wm8994_index_reg_show, NULL);
+
 #define WM8994_RATES SNDRV_PCM_RATE_8000_96000
 
 #define WM8994_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
@@ -2418,7 +2446,7 @@ static struct snd_soc_dai_driver wm8994_dai[] = {
 };
 
 #ifdef CONFIG_PM
-static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state)
+static int wm8994_codec_suspend(struct snd_soc_codec *codec, pm_message_t state)
 {
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        struct wm8994 *control = codec->control_data;
@@ -2445,16 +2473,20 @@ static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state)
 
        wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF);
 
+       wm8994_suspend(control);
+
        return 0;
 }
 
-static int wm8994_resume(struct snd_soc_codec *codec)
+static int wm8994_codec_resume(struct snd_soc_codec *codec)
 {
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        struct wm8994 *control = codec->control_data;
        int i, ret;
        unsigned int val, mask;
 
+       wm8994_resume(control);
+
        if (wm8994->revision < 4) {
                /* force a HW read */
                val = wm8994_reg_read(codec->control_data,
@@ -2857,15 +2889,22 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
        struct snd_soc_dapm_context *dapm = &codec->dapm;
        int ret, i;
 
-       codec->control_data = dev_get_drvdata(codec->dev->parent);
+       if (wm8994_control == NULL) {
+               pr_err("wm8994_codec_probe:wm8994_control is NULL!");
+               return -EIO;
+       }
+
+       codec->control_data = wm8994_control;//dev_get_drvdata(codec->dev->parent);
        control = codec->control_data;
 
+       wm8994_regshow_codec = codec;
+
        wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL);
        if (wm8994 == NULL)
                return -ENOMEM;
        snd_soc_codec_set_drvdata(codec, wm8994);
 
-       wm8994->pdata = dev_get_platdata(codec->dev->parent);
+       wm8994->pdata = wm8994_control->dev->platform_data;//dev_get_platdata(codec->dev->parent);
        wm8994->codec = codec;
 
        if (wm8994->pdata && wm8994->pdata->micdet_irq)
@@ -3145,6 +3184,13 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
                break;
        }
 
+       ret = device_create_file(codec->dev, &dev_attr_index_reg);
+       if (ret != 0) {
+               dev_err(codec->dev,
+                       "Failed to create index_reg sysfs files: %d\n", ret);
+               return ret;
+       }
+
        return 0;
 
 err_irq:
@@ -3200,8 +3246,8 @@ static int  wm8994_codec_remove(struct snd_soc_codec *codec)
 static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {
        .probe =        wm8994_codec_probe,
        .remove =       wm8994_codec_remove,
-       .suspend =      wm8994_suspend,
-       .resume =       wm8994_resume,
+       .suspend =      wm8994_codec_suspend,
+       .resume =       wm8994_codec_resume,
        .read =         wm8994_read,
        .write =        wm8994_write,
        .readable_register = wm8994_readable,
@@ -3214,39 +3260,69 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {
        .compress_type = SND_SOC_RBTREE_COMPRESSION,
 };
 
-static int __devinit wm8994_probe(struct platform_device *pdev)
+static int wm8994_i2c_probe(struct i2c_client *i2c,
+                           const struct i2c_device_id *id)
 {
-       return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994,
-                       wm8994_dai, ARRAY_SIZE(wm8994_dai));
+       int ret;
+
+       ret = wm8994_probe(i2c, id);
+       if (ret < 0) {
+               pr_err("wm8994_i2c_probe error!");
+               return ret;
+       }
+
+       wm8994_control = i2c_get_clientdata(i2c);
+
+       return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8994,
+               wm8994_dai, ARRAY_SIZE(wm8994_dai));
 }
 
-static int __devexit wm8994_remove(struct platform_device *pdev)
+static int wm8994_i2c_remove(struct i2c_client *i2c)
 {
-       snd_soc_unregister_codec(&pdev->dev);
+       wm8994_remove(i2c);
+       snd_soc_unregister_codec(&i2c->dev);
+
        return 0;
 }
 
-static struct platform_driver wm8994_codec_driver = {
+static const struct i2c_device_id wm8994_i2c_id[] = {
+       { "wm8994", WM8994 },
+//     { "wm8958", WM8958 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);
+
+//static UNIVERSAL_DEV_PM_OPS(wm8994_pm_ops, wm8994_suspend, wm8994_resume,
+//                         NULL);
+
+static struct i2c_driver wm8994_i2c_driver = {
        .driver = {
-                  .name = "WM8994",
-                  .owner = THIS_MODULE,
-                  },
-       .probe = wm8994_probe,
-       .remove = __devexit_p(wm8994_remove),
+               .name = "WM8994",
+               .owner = THIS_MODULE,
+               //.pm = &wm8994_pm_ops,
+       },
+       .probe = wm8994_i2c_probe,
+       .remove = wm8994_i2c_remove,
+       .id_table = wm8994_i2c_id,
 };
 
-static __init int wm8994_init(void)
+static int __init wm8994_i2c_init(void)
 {
-       return platform_driver_register(&wm8994_codec_driver);
+       int ret;
+
+       ret = i2c_add_driver(&wm8994_i2c_driver);
+       if (ret != 0)
+               pr_err("Failed to register wm8994 I2C driver: %d\n", ret);
+
+       return ret;
 }
-module_init(wm8994_init);
+module_init(wm8994_i2c_init);
 
-static __exit void wm8994_exit(void)
+static void __exit wm8994_i2c_exit(void)
 {
-       platform_driver_unregister(&wm8994_codec_driver);
+       i2c_del_driver(&wm8994_i2c_driver);
 }
-module_exit(wm8994_exit);
-
+module_exit(wm8994_i2c_exit);
 
 MODULE_DESCRIPTION("ASoC WM8994 driver");
 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
index 84222e918eefbfe120bf8876bd85b896a8e09bc6..95bb3ecaff97e7fe349ad9af4660d63a522ac5d1 100755 (executable)
@@ -42,9 +42,7 @@ static int rk29_aif1_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        unsigned int pll_out = 0; 
-       int div_bclk,div_mclk;
        int ret;
-       struct clk      *general_pll;
 
        DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
 
@@ -107,38 +105,17 @@ static int rk29_aif1_hw_params(struct snd_pcm_substream *substream,
 
        DBG("Enter:%s, %d, rate=%d\n",__FUNCTION__,__LINE__,params_rate(params));
 
-#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)         
+       ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
+       if (ret < 0) {
+               DBG("rk29_hw_params_wm8994:failed to set the sysclk for codec side\n"); 
+               return ret;
+       }
+
        snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
-#endif
 
 #if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
-       general_pll=clk_get(NULL, "general_pll");
-
-       if(clk_get_rate(general_pll)>260000000) {
-               div_bclk=(pll_out/4)/params_rate(params)-1;
-               div_mclk=3;
-       }
-       else if(clk_get_rate(general_pll)>130000000)
-       {
-               div_bclk=(pll_out/2)/params_rate(params)-1;
-               div_mclk=1;
-       }
-       else
-       {
-               pll_out=pll_out/4;
-               div_bclk=(pll_out)/params_rate(params)-1;
-               div_mclk=0;
-       }
-       DBG("func is%s,gpll=%ld,pll_out=%d,div_mclk=%d\n",
-               __FUNCTION__,clk_get_rate(general_pll),pll_out,div_mclk);
-       snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
-       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK,div_bclk);
-       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, div_mclk);
-       
-       if(div_mclk == 3)
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
-       else
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, pll_out, 0);      
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK, (pll_out/4)/params_rate(params)-1);
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, 3);
 #endif
 
        return 0;
@@ -192,36 +169,17 @@ static int rk29_aif2_hw_params(struct snd_pcm_substream *substream,
 
        DBG("Enter:%s, %d, rate=%d\n",__FUNCTION__,__LINE__,params_rate(params));
 
-#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)         
+       ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
+       if (ret < 0) {
+               DBG("rk29_hw_params_wm8994:failed to set the sysclk for codec side\n"); 
+               return ret;
+       }
+
        snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
-#endif
 
 #if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
-       general_pll=clk_get(NULL, "general_pll");
-
-       if(clk_get_rate(general_pll)>260000000) {
-               div_bclk=(pll_out/4)/params_rate(params)-1;
-               div_mclk=3;
-       }
-       else if(clk_get_rate(general_pll)>130000000)
-       {
-               div_bclk=(pll_out/2)/params_rate(params)-1;
-               div_mclk=1;
-       }
-       else
-       {
-               pll_out=pll_out/4;
-               div_bclk=(pll_out)/params_rate(params)-1;
-               div_mclk=0;
-       }
-       DBG("func is%s,gpll=%ld,pll_out=%d,div_mclk=%d\n",
-               __FUNCTION__,clk_get_rate(general_pll),pll_out,div_mclk);
-       snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
-       
-       if(div_mclk == 3)
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
-       else
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, pll_out, 0);
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK, (pll_out/4)/params_rate(params)-1);
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, 3);
 #endif
 
        return 0;
@@ -269,30 +227,18 @@ static int rk29_aif3_hw_params(struct snd_pcm_substream *substream,
 
        DBG("Enter:%s, %d, rate=%d\n",__FUNCTION__,__LINE__,params_rate(params));
 
-       snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
+       ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
+       if (ret < 0) {
+               DBG("rk29_hw_params_wm8994:failed to set the sysclk for codec side\n"); 
+               return ret;
+       }
 
-       general_pll=clk_get(NULL, "general_pll");
+       snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
 
-       if(clk_get_rate(general_pll)>260000000) {
-               div_bclk=(pll_out/4)/params_rate(params)-1;
-               div_mclk=3;
-       }
-       else if(clk_get_rate(general_pll)>130000000)
-       {
-               div_bclk=(pll_out/2)/params_rate(params)-1;
-               div_mclk=1;
-       }
-       else
-       {
-               pll_out=pll_out/4;
-               div_bclk=(pll_out)/params_rate(params)-1;
-               div_mclk=0;
-       }
-       
-       if(div_mclk == 3)
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_MCLK1, pll_out, 0);
-       else
-               snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, pll_out, 0);
+#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK, (pll_out/4)/params_rate(params)-1);
+       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, 3);
+#endif
 
        return 0;
 }
@@ -315,34 +261,6 @@ static const struct snd_soc_dapm_route audio_map[]= {
        {"Micp", NULL, "LINPUT2"},
 };
 */
-/*
- * Logic for a wm8994 as connected on a rockchip board.
- */
-static int rk29_wm8994_init(struct snd_soc_pcm_runtime *rtd)
-{
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_codec *codec = rtd->codec;
-       struct snd_soc_dapm_context *dapm = &codec->dapm;
-       int ret;
-
-       DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-    
-       ret = snd_soc_dai_set_sysclk(codec_dai, 0,
-               12000000, SND_SOC_CLOCK_IN);
-       if (ret < 0) {
-               printk(KERN_ERR "Failed to set WM8994 SYSCLK: %d\n", ret);
-               return ret;
-       }
-       
-       /* Add specific widgets */
-//     snd_soc_dapm_new_controls(dapm, rk2818_dapm_widgets,
-//             ARRAY_SIZE(rk2818_dapm_widgets));       
-       /* Set up specific audio path audio_mapnects */
-//     snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));       
-//     snd_soc_dapm_sync(codec);
-    return 0;
-}
 
 static struct snd_soc_ops rk29_aif1_ops = {
          .hw_params = rk29_aif1_hw_params,
@@ -358,33 +276,30 @@ static struct snd_soc_ops rk29_aif3_ops = {
 
 static struct snd_soc_dai_link rk29_dai[] = {
        {
-               .name = "WM8994",
-               .stream_name = "WM8994 I2S1",
+               .name = "WM8994 I2S1",
+               .stream_name = "WM8994 PCM",
                .codec_name = "WM8994.0-001a",
                .platform_name = "rockchip-audio",
                .cpu_dai_name = "rk29_i2s.0",
                .codec_dai_name = "wm8994-aif1",
-               .init = rk29_wm8994_init,
                .ops = &rk29_aif1_ops,
        },
        {
-               .name = "WM8994",
-               .stream_name = "WM8994 I2S2",
-               .codec_name = "WM8994.1-001a",
+               .name = "WM8994 I2S2",
+               .stream_name = "WM8994 PCM",
+               .codec_name = "WM8994.0-001a",
                .platform_name = "rockchip-audio",
                .cpu_dai_name = "rk29_i2s.0",
                .codec_dai_name = "wm8994-aif2",
-               .init = rk29_wm8994_init,
                .ops = &rk29_aif2_ops,
        },
        {
-               .name = "WM8994",
-               .stream_name = "WM8994 I2S3",
-               .codec_name = "WM8994.2-001a",
+               .name = "WM8994 I2S3",
+               .stream_name = "WM8994 PCM",
+               .codec_name = "WM8994.0-001a",
                .platform_name = "rockchip-audio",
                .cpu_dai_name = "rk29_i2s.0",
                .codec_dai_name = "wm8994-aif3",
-               .init = rk29_wm8994_init,
                .ops = &rk29_aif3_ops,
        },
 };
@@ -405,15 +320,14 @@ static int __init audio_card_init(void)
 
        rk29_snd_device = platform_device_alloc("soc-audio", -1);
        if (!rk29_snd_device) {
-                 DBG("platform device allocation failed\n");
-                 ret = -ENOMEM;
-                 return ret;
+                 printk("platform device allocation failed\n");
+                 return -ENOMEM;
        }
 
        platform_set_drvdata(rk29_snd_device, &snd_soc_card_rk29);
        ret = platform_device_add(rk29_snd_device);
        if (ret) {
-               DBG("platform device add failed\n");
+               printk("platform device add failed\n");
 
                platform_device_put(rk29_snd_device);
                return ret;