[PATCH V5 3/3] ASoC: AMD: add AMD ASoC ACP-I2S driver

Alex Deucher alexdeucher at gmail.com
Thu Aug 20 16:45:46 PDT 2015


On Thu, Aug 20, 2015 at 7:18 PM, Mark Brown <broonie at kernel.org> wrote:
> On Thu, Aug 20, 2015 at 05:36:34PM -0400, Alex Deucher wrote:
>> From: Maruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu at amd.com>
>>
>> ACP IP block consists of dedicated DMA and I2S blocks. The PCM driver
>> provides the DMA and CPU DAI components to ALSA core.
>
> This is flagged as patch 3/3 but appears to be sent as a single patch.
> Please don't do this, the purpose of numbering patches is to help people
> tell which order they are in.  Numbering only makes sense when you send
> more than one patch, if you are sending a single patch there is no need
> to number.

Sorry, I just saw this reply now.  I just resent the patch with an
improved change log.  You an ignore that one.

Maruthi, can you comment on the points below and respin the patches as
necessary?

Thanks,

Alex

>
>> +++ b/sound/soc/amd/Kconfig
>> @@ -0,0 +1,5 @@
>> +config SND_SOC_AMD_ACP
>> +     tristate "AMD Audio Coprocessor support"
>> +     depends on MFD_CORE
>
> What is the dependency on the MFD core?
>
>> +/*
>> + * AMD ALSA SoC PCM Driver
>> + *
>> + * Copyright 2014-2015 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + * OTHER DEALINGS IN THE SOFTWARE.
>
> Still not happy with the licensing.
>
>> +static const struct snd_soc_component_driver dw_i2s_component = {
>> +     .name = "dw-i2s",
>> +};
>
> We already have a driver for the DesignWare I2S controller.  To repeat
> the concern I raised in a slightly different bit of the code last time:
>
> | This doesn't appear to be a designware-i2s driver, we already have one
> | of those?
>
> Like I say please stop ignoring review comments.  The hw_params()
> certainly seems to bear more than a passing resemblance.
>
>> +static void acp_pcm_period_elapsed(struct device *dev, u16 play_intr,
>> +                                                     u16 capture_intr)
>> +{
>> +     struct snd_pcm_substream *substream;
>> +     struct audio_drv_data *irq_data = dev_get_drvdata(dev);
>> +
>> +     /* Inform ALSA about the period elapsed (one out of two periods) */
>> +     if (play_intr)
>> +             substream = irq_data->play_stream;
>> +     else
>> +             substream = irq_data->capture_stream;
>
> So you've replaced the two if statements with an if/else which means
> subsstream is now guaranteed to be initialized but perhaps not in the
> way the caller intended...  I did find the caller (which got moved into
> another patch in this version) and it appears that the two u16s are
> actually used to pass boolean flags.  The whole interface here now
> seems odd, what is going on here?
>
>> +     if (NULL != pg) {
>
> We still normally write these checks more like (pg != NULL) or even just
> (pg).
>
>> +             /* Save for runtime private data */
>> +             rtd->pg = pg;
>> +             rtd->order = get_order(size);
>> +
>> +             /* Let ACP know the Allocated memory */
>> +             num_of_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
>> +
>> +             /* Fill the page table entries in ACP SRAM */
>> +             rtd->pg = pg;
>> +             rtd->size = size;
>> +             rtd->num_of_pages = num_of_pages;
>> +             rtd->direction = substream->stream;
>> +
>> +             acp_dev->config_dma(acp_dev, rtd);
>> +             status = 0;
>> +     } else {
>> +             status = -ENOMEM;
>> +     }
>> +     return status;
>> +}
>> +
>> +static int acp_dma_hw_free(struct snd_pcm_substream *substream)
>> +{
>> +     return snd_pcm_lib_free_pages(substream);
>> +}
>
> hw_free() doesn't seem to undo everything that we did on allocation?
>
>> +             /* Now configure DMA to transfer only first half of System RAM
>> +              * buffer before playback is triggered. This will overwrite
>> +              * zero-ed second half of SRAM buffer */
>> +             acp_dev->config_dma_channel(acp_dev, SYSRAM_TO_ACP_CH_NUM,
>> +                                     PLAYBACK_START_DMA_DESCR_CH12,
>> +                                     1, 0);
>
> | Why?  The comments describe what's happening but it's not clear why it's
> | happening.
>
>> +static struct snd_soc_dai_driver i2s_dai_driver = {
>> +     .playback = {
>> +                  .stream_name = "I2S Playback",
>> +                  .channels_min = 2,
>> +                  .channels_max = 2,
>
> Elsewhere support for 8 channels was declared and handled.
>
>> +                  .rates = SNDRV_PCM_RATE_8000_96000,
>> +                  .formats = SNDRV_PCM_FMTBIT_S24_LE |
>> +                             SNDRV_PCM_FMTBIT_S32_LE,
>
> Elsewhere there was 16 bit support declared and handled.
>
>> +     pm_rts = pm_runtime_status_suspended(dev);
>> +     if (pm_rts == true) {
>
> There seem to be a lot of variables in here that have only one
> assignment and one user immediately next to them.  I'm not sure it's
> adding much.


More information about the dri-devel mailing list