From: Mark Brown <broonie@opensource.wolfsonmicro.com>
To: Rajeev Kumar <rajeev-dlh.kumar@st.com>
Cc: tiwai@suse.de, alsa-devel@alsa-project.org, lrg@slimlogic.co.uk,
spear-devel@list.st.com
Subject: Re: [PATCH 2/8] sound:asoc: Add support for synopsys i2s controller as per ASoC framework.
Date: Tue, 20 Mar 2012 15:44:22 +0000 [thread overview]
Message-ID: <20120320154420.GE3445@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <7692a51789abe38e7066a582d8329dc93b8eced3.1332242166.git.rajeev-dlh.kumar@st.com>
[-- Attachment #1.1: Type: text/plain, Size: 4641 bytes --]
On Tue, Mar 20, 2012 at 05:03:46PM +0530, Rajeev Kumar wrote:
> This patch add support for synopsys I2S controller as per the ASoC framework.
If this really is a generic Synopsys block shouldn't it be in a Synopsys
directory, possibly with a wrapper in the SPEAr directory for the
platform integration?
> +struct i2s_platform_data {
> + #define PLAY (1 << 0)
> + #define RECORD (1 << 1)
Namespacing here and with most of the other defines in the header (and
the driver, though the ones in the code are less important). Normally
ALSA headers go in include/sound.
> +
> + if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
> + i2s_write_reg(dev->i2s_base, TCR(ch), dev->xfer_resolution);
> + i2s_write_reg(dev->i2s_base, TFCR(ch), 0x02);
> + irq = i2s_read_reg(dev->i2s_base, IMR(ch));
> + i2s_write_reg(dev->i2s_base, IMR(ch), irq & ~0x30);
> + i2s_write_reg(dev->i2s_base, TER(ch), 1);
> + } else {
> + i2s_write_reg(dev->i2s_base, RCR(ch), dev->xfer_resolution);
> + i2s_write_reg(dev->i2s_base, RFCR(ch), 0x07);
> + irq = i2s_read_reg(dev->i2s_base, IMR(ch));
> + i2s_write_reg(dev->i2s_base, IMR(ch), irq & ~0x03);
> + i2s_write_reg(dev->i2s_base, RER(ch), 1);
> + }
It would be good to split out the bits that are common from the bits
that vary per stream.
> + if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
> + for (i = 0; i < 4; i++)
> + i2s_write_reg(dev->i2s_base, TER(i), 0);
> + } else {
> + for (i = 0; i < 4; i++)
> + i2s_write_reg(dev->i2s_base, RER(i), 0);
Magic numbers!
> +static irqreturn_t dw_i2s_play_irq(int irq, void *_dev)
> +{
> + struct dw_i2s_dev *dev = (struct dw_i2s_dev *)_dev;
> + u32 ch0, ch1;
> +
> + /* check for the tx data overrun condition */
> + ch0 = i2s_read_reg(dev->i2s_base, ISR(0)) & 0x20;
> + ch1 = i2s_read_reg(dev->i2s_base, ISR(1)) & 0x20;
> + if (ch0 || ch1) {
> + /* disable i2s block */
> + i2s_write_reg(dev->i2s_base, IER, 0);
> +
> + /* disable tx block */
> + i2s_write_reg(dev->i2s_base, ITER, 0);
> +
> + /* flush all the tx fifo */
> + i2s_write_reg(dev->i2s_base, TXFFR, 1);
> +
> + /* clear tx data overrun interrupt */
> + i2s_clear_irqs(dev, SNDRV_PCM_STREAM_PLAYBACK);
> +
> + /* enable rx block */
> + i2s_write_reg(dev->i2s_base, ITER, 1);
> +
> + /* enable i2s block */
> + i2s_write_reg(dev->i2s_base, IER, 1);
> + }
This is somewhat unusual - normally ALSA detects underrun and overrun
and restarts the stream at the application layer. This looks like it
attempts to mask information about errors from the application which
probably isn't waht we want to do. Why is the normal ALSA handling not
sufficient?
> +
> + return IRQ_HANDLED;
This unconditionally says it handled the interrupt even if it didn't.
> +static int
> +dw_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *cpu_dai)
> +{
> + struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
> + struct dma_data *dma_data = NULL;
> +
> + if (!(dev->capability & RECORD) &&
> + (substream->stream == SNDRV_PCM_STREAM_CAPTURE))
> + return -EINVAL;
Indentation.
> +
> + if (dev->i2s_clk_cfg) {
> + if (dev->i2s_clk_cfg(config)) {
> + dev_err(dev->dev, "runtime audio clk config fail\n");
> + if (cpu_dai->driver->ops->trigger) {
> + int ret =
> + cpu_dai->driver->ops->trigger(substream,
> + SNDRV_PCM_TRIGGER_STOP,
> + cpu_dai);
> + if (ret < 0) {
> + dev_err(dev->dev,
> + "trigger stop fail\n");
> + return ret;
> + }
> + }
No, return an error if you encounter an error!
> +static void
> +dw_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
Indentation - throughout the kernel the type goes on the same line as
the function name.
> +static const struct dev_pm_ops dw_i2s_dev_pm_ops = {
> + .suspend = dw_i2s_suspend,
> + .resume = dw_i2s_resume,
> +};
No, do this at the ASoC level like other CPU drivers (runtime PM
callbacks are OK).
> + cap = pdata->cap;
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res) {
> + dev_err(&pdev->dev, "no i2s resource defined\n");
> + return -ENODEV;
> + }
> +
> + if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
> + dev_err(&pdev->dev, "i2s region already claimed\n");
> + return -EBUSY;
> + }
There's devm_ versions of this stuff too.
> + dev = kzalloc(sizeof(*dev), GFP_KERNEL);
devm_kzalloc()
> + dev->i2s_base = ioremap(res->start, resource_size(res));
> + if (!dev->i2s_base) {
devm_ioremap().
> + if (dev->play_irq < 0)
> + dev_warn(&pdev->dev, "play irq not defined\n");
> + else {
Braces on both sides of the if.
> +static int __init dw_i2s_init(void)
module_platform_driver().
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
next prev parent reply other threads:[~2012-03-20 15:44 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-20 11:33 [PATCH 0/8] Add ASoC drivers for SPEAr platform Rajeev Kumar
2012-03-20 11:33 ` [PATCH 1/8] sound:asoc: Add support for STA529 Audio Codec Rajeev Kumar
2012-03-20 15:25 ` Mark Brown
2012-03-23 3:42 ` Rajeev kumar
2012-03-23 9:07 ` Lars-Peter Clausen
2012-03-23 9:20 ` Rajeev kumar
2012-03-20 17:57 ` Lars-Peter Clausen
2012-03-23 4:00 ` Rajeev kumar
2012-03-23 8:51 ` Lars-Peter Clausen
2012-03-23 9:15 ` Rajeev kumar
2012-03-20 11:33 ` [PATCH 2/8] sound:asoc: Add support for synopsys i2s controller as per ASoC framework Rajeev Kumar
2012-03-20 15:44 ` Mark Brown [this message]
2012-03-26 9:03 ` Rajeev kumar
2012-03-26 11:10 ` Mark Brown
2012-03-27 3:51 ` Rajeev kumar
2012-03-20 11:33 ` [PATCH 3/8] sound:asoc: Add support for SPEAr ASoC pcm layer Rajeev Kumar
2012-03-20 15:50 ` Mark Brown
2012-03-20 11:33 ` [PATCH 4/8] sound:asoc:spdif_in: Add spdif IN support Rajeev Kumar
2012-03-20 15:55 ` Mark Brown
2012-03-27 9:25 ` Rajeev kumar
2012-03-20 11:33 ` [PATCH 5/8] sound:asoc:spdif_out: Add spdif out support Rajeev Kumar
2012-03-20 11:33 ` [PATCH 6/8] sound:asoc: Add support for SPEAr ASoC machine driver Rajeev Kumar
2012-03-20 16:00 ` Mark Brown
2012-03-20 11:33 ` [PATCH 7/8] sound:asoc: Add Kconfig and Makefile to support SPEAr audio driver Rajeev Kumar
2012-03-20 11:33 ` [PATCH 8/8] sound:asoc: Update Kconfig and Makefile(sound/soc/) to support SPEAr audio Rajeev Kumar
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=20120320154420.GE3445@opensource.wolfsonmicro.com \
--to=broonie@opensource.wolfsonmicro.com \
--cc=alsa-devel@alsa-project.org \
--cc=lrg@slimlogic.co.uk \
--cc=rajeev-dlh.kumar@st.com \
--cc=spear-devel@list.st.com \
--cc=tiwai@suse.de \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).