From 78f362011860c7ddb329f6071c01dc7de1682382 Mon Sep 17 00:00:00 2001 From: qjb Date: Tue, 25 Mar 2014 17:52:47 +0800 Subject: [PATCH] i2s : set clk in delay work. faster boot speed. --- sound/soc/rockchip/rk30_i2s.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/sound/soc/rockchip/rk30_i2s.c b/sound/soc/rockchip/rk30_i2s.c index 08d7df0e78f4..f2d466cd2231 100755 --- a/sound/soc/rockchip/rk30_i2s.c +++ b/sound/soc/rockchip/rk30_i2s.c @@ -26,7 +26,6 @@ #include #include #include - #include #include #include @@ -35,8 +34,10 @@ #include #include #include - #include +#include + +#define CLK_SET_lATER #include "rk_pcm.h" #include "rk_i2s.h" @@ -64,6 +65,9 @@ struct rk30_i2s_info { bool i2s_tx_status;//active = true; bool i2s_rx_status; +#ifdef CLK_SET_lATER + struct delayed_work clk_delayed_work; +#endif }; #define I2S_CLR_ERROR_COUNT 10// check I2S_CLR reg @@ -504,6 +508,16 @@ static int rockchip_i2s_resume_noirq(struct device *dev) #define rockchip_i2s_resume_noirq NULL #endif +#ifdef CLK_SET_lATER +static void set_clk_later_work(struct work_struct *work) +{ + struct rk30_i2s_info *i2s = rk30_i2s; + clk_set_rate(i2s->i2s_clk, 11289600); + if(!IS_ERR(i2s->i2s_mclk) ) + clk_set_rate(i2s->i2s_mclk, 11289600); +} +#endif + static int rockchip_i2s_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; @@ -534,22 +548,30 @@ static int rockchip_i2s_probe(struct platform_device *pdev) goto err; } + rk30_i2s = i2s; i2s->i2s_clk= clk_get(&pdev->dev, "i2s_clk"); if (IS_ERR(i2s->i2s_clk)) { dev_err(&pdev->dev, "Can't retrieve i2s clock\n"); ret = PTR_ERR(i2s->i2s_clk); goto err; } - clk_set_rate(i2s->i2s_clk, 12288000); - clk_set_rate(i2s->i2s_clk, 11289600); +#ifdef CLK_SET_lATER + INIT_DELAYED_WORK(&i2s->clk_delayed_work, set_clk_later_work); + schedule_delayed_work(&i2s->clk_delayed_work, msecs_to_jiffies(10)); +#else + clk_set_rate(i2s->iis_clk, 11289600); +#endif clk_prepare_enable(i2s->i2s_clk); i2s->i2s_mclk= clk_get(&pdev->dev, "i2s_mclk"); if(IS_ERR(i2s->i2s_mclk) ) { printk("This platfrom have not i2s_mclk,no need to set i2s_mclk.\n"); }else{ - clk_set_rate(i2s->i2s_mclk, 12288000); + #ifdef CLK_SET_lATER + + #else clk_set_rate(i2s->i2s_mclk, 11289600); + #endif clk_prepare_enable(i2s->i2s_mclk); } @@ -619,8 +641,6 @@ static int rockchip_i2s_probe(struct platform_device *pdev) rockchip_snd_rxctrl(i2s, 0); dev_set_drvdata(&pdev->dev, i2s); - - rk30_i2s = i2s; return 0; err_unregister_component: -- 2.34.1