From: Barry Song <21cnbao@gmail.com> To: Mark Brown <broonie@kernel.org> Cc: alsa-devel@alsa-project.org, lgirdwood@gmail.com, Workgroup.Linux@csr.com, Rongjun Ying <Rongjun.Ying@csr.com>, Barry Song <Baohua.Song@csr.com>, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 3/6] ASoC: usp-pcm: add CPU DAI driver for PCM simulated from USP Date: Thu, 25 Jul 2013 17:32:12 +0800 [thread overview] Message-ID: <CAGsJ_4xNdxFWyN6NUEL36W9n+4Cj=01+QGi+xaeODm9u8pdP9A@mail.gmail.com> (raw) In-Reply-To: <20130719181313.GT9858@sirena.org.uk> 2013/7/20 Mark Brown <broonie@kernel.org>: > On Fri, Jul 19, 2013 at 07:07:19PM +0800, Barry Song wrote: > >> +static int sirf_usp_pcm_divider(struct snd_soc_dai *dai, int div_id, int rate) >> +{ >> + struct sirf_usp *susp = snd_soc_dai_get_drvdata(dai); >> + >> + u32 clk_rate = clk_get_rate(susp->clk); >> + u32 clk_div = (clk_rate/(2*rate)) - 1; >> + u32 clk_div_hi = (clk_div & 0xC00)>>10; >> + u32 clk_div_lo = (clk_div & 0x3FF); >> + >> + writel((clk_div_lo<<21) | readl(susp->base + USP_MODE2), >> + susp->base + USP_MODE2); >> + writel((clk_div_hi<<30) | readl(susp->base + USP_TX_FRAME_CTRL), >> + susp->base + USP_TX_FRAME_CTRL); >> + >> + return 0; >> +} > > I'd be happier if this did some validation on the supplied rate (for > example, checking that it's less than the master rate) and had arguments > specifying which clock was being affected (in case there's more in > future revisions). sounds good. > > Also what exactly is the rate being set - can the driver just figure > this out automatically from the sample rate? here it is generating the right pcm clock by an internal DIVISOR in USP module. For USP_MODE2: 30:21 (R/W) USP_CLK_DIVISOR 10’h0 USP serial clock divider For USP_TX_FRAME_CTRL: 31:30 (R/W) USP_CLK_DIVISOR 2’h0 This is the two bit [11:10] of USP_CLK_DIVISOR in USP_MODE2 for figuring this out automatically from the sample rate, do you mean a lookup table for common sample rate? > >> +#ifdef CONFIG_PM >> +static int sirf_usp_pcm_suspend(struct platform_device *pdev, >> + pm_message_t state) >> +{ >> + struct sirf_usp *susp = platform_get_drvdata(pdev); >> + >> + susp->mode1_reg = readl(susp->base + USP_MODE1); >> + susp->mode2_reg = readl(susp->base + USP_MODE2); >> + sirf_usp_controller_uninit(susp); >> + clk_disable_unprepare(susp->clk); >> + >> + return 0; >> +} > > Can this be done as runtime PM as well? Seems like it'd save power. agree. > >> + susp->clk = clk_get(&pdev->dev, NULL); >> + if (IS_ERR(susp->clk)) { >> + dev_err(&pdev->dev, "Get clock failed.\n"); >> + return PTR_ERR(susp->clk); >> + } > > devm_clk_get(). agree. missed this one. -barry _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: 21cnbao@gmail.com (Barry Song) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 3/6] ASoC: usp-pcm: add CPU DAI driver for PCM simulated from USP Date: Thu, 25 Jul 2013 17:32:12 +0800 [thread overview] Message-ID: <CAGsJ_4xNdxFWyN6NUEL36W9n+4Cj=01+QGi+xaeODm9u8pdP9A@mail.gmail.com> (raw) In-Reply-To: <20130719181313.GT9858@sirena.org.uk> 2013/7/20 Mark Brown <broonie@kernel.org>: > On Fri, Jul 19, 2013 at 07:07:19PM +0800, Barry Song wrote: > >> +static int sirf_usp_pcm_divider(struct snd_soc_dai *dai, int div_id, int rate) >> +{ >> + struct sirf_usp *susp = snd_soc_dai_get_drvdata(dai); >> + >> + u32 clk_rate = clk_get_rate(susp->clk); >> + u32 clk_div = (clk_rate/(2*rate)) - 1; >> + u32 clk_div_hi = (clk_div & 0xC00)>>10; >> + u32 clk_div_lo = (clk_div & 0x3FF); >> + >> + writel((clk_div_lo<<21) | readl(susp->base + USP_MODE2), >> + susp->base + USP_MODE2); >> + writel((clk_div_hi<<30) | readl(susp->base + USP_TX_FRAME_CTRL), >> + susp->base + USP_TX_FRAME_CTRL); >> + >> + return 0; >> +} > > I'd be happier if this did some validation on the supplied rate (for > example, checking that it's less than the master rate) and had arguments > specifying which clock was being affected (in case there's more in > future revisions). sounds good. > > Also what exactly is the rate being set - can the driver just figure > this out automatically from the sample rate? here it is generating the right pcm clock by an internal DIVISOR in USP module. For USP_MODE2: 30:21 (R/W) USP_CLK_DIVISOR 10?h0 USP serial clock divider For USP_TX_FRAME_CTRL: 31:30 (R/W) USP_CLK_DIVISOR 2?h0 This is the two bit [11:10] of USP_CLK_DIVISOR in USP_MODE2 for figuring this out automatically from the sample rate, do you mean a lookup table for common sample rate? > >> +#ifdef CONFIG_PM >> +static int sirf_usp_pcm_suspend(struct platform_device *pdev, >> + pm_message_t state) >> +{ >> + struct sirf_usp *susp = platform_get_drvdata(pdev); >> + >> + susp->mode1_reg = readl(susp->base + USP_MODE1); >> + susp->mode2_reg = readl(susp->base + USP_MODE2); >> + sirf_usp_controller_uninit(susp); >> + clk_disable_unprepare(susp->clk); >> + >> + return 0; >> +} > > Can this be done as runtime PM as well? Seems like it'd save power. agree. > >> + susp->clk = clk_get(&pdev->dev, NULL); >> + if (IS_ERR(susp->clk)) { >> + dev_err(&pdev->dev, "Get clock failed.\n"); >> + return PTR_ERR(susp->clk); >> + } > > devm_clk_get(). agree. missed this one. -barry
next prev parent reply other threads:[~2013-07-25 9:32 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-07-19 11:07 [PATCH 0/6] ASoC: add CSR SiRFSoC sound drivers Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 11:07 ` [PATCH 1/6] ASoC: sirf: add sirf platform driver which provides DMA Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 15:08 ` Lars-Peter Clausen 2013-07-19 15:08 ` [alsa-devel] " Lars-Peter Clausen 2013-07-19 16:12 ` Mark Brown 2013-07-19 16:12 ` Mark Brown 2013-07-22 0:06 ` Barry Song 2013-07-22 0:06 ` Barry Song 2013-07-19 11:07 ` [PATCH 2/6] ASoC: sirf: add I2S CPU DAI driver Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 16:52 ` Mark Brown 2013-07-19 16:52 ` Mark Brown 2013-07-22 9:07 ` Barry Song 2013-07-22 9:07 ` Barry Song 2013-07-19 11:07 ` [PATCH 3/6] ASoC: usp-pcm: add CPU DAI driver for PCM simulated from USP Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 18:13 ` Mark Brown 2013-07-19 18:13 ` Mark Brown 2013-07-25 9:32 ` Barry Song [this message] 2013-07-25 9:32 ` Barry Song 2013-07-25 10:24 ` Mark Brown 2013-07-25 10:24 ` Mark Brown 2013-07-19 11:07 ` [PATCH 4/6] ASoC: sirf-soc-inner: add drivers for both CPU and Codec DAIs Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 18:35 ` Mark Brown 2013-07-19 18:35 ` Mark Brown 2013-07-25 9:11 ` Barry Song 2013-07-25 9:11 ` Barry Song 2013-07-19 11:07 ` [PATCH 5/6] ASoC: sirf-inner: add mach driver for SiRFSoC internal codec Barry Song 2013-07-19 11:07 ` Barry Song 2013-07-19 18:51 ` Mark Brown 2013-07-19 18:51 ` Mark Brown 2013-07-25 8:57 ` Barry Song 2013-07-25 8:57 ` Barry Song 2013-07-19 11:07 ` [PATCH 6/6] arm: prima2: defconfig: enable sound components Barry Song 2013-07-19 11:07 ` Barry Song
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='CAGsJ_4xNdxFWyN6NUEL36W9n+4Cj=01+QGi+xaeODm9u8pdP9A@mail.gmail.com' \ --to=21cnbao@gmail.com \ --cc=Baohua.Song@csr.com \ --cc=Rongjun.Ying@csr.com \ --cc=Workgroup.Linux@csr.com \ --cc=alsa-devel@alsa-project.org \ --cc=broonie@kernel.org \ --cc=lgirdwood@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.