[alsa-devel] [PATCH 11/25] ASoC: Samsung: Add common I2S driver

Jassi Brar jassisinghbrar at gmail.com
Wed Oct 20 04:22:26 CEST 2010


On Tue, Oct 19, 2010 at 6:35 PM, Mark Brown
<broonie at opensource.wolfsonmicro.com> wrote:
> On Tue, Oct 19, 2010 at 04:07:05PM +0900, Jassi Brar wrote:
>
> This looks good - there's a few comments below but they're pretty small
> things.
>
>>  /**
>>   * struct s3c_audio_pdata - common platform data for audio device drivers
>>   * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode
>>   */
>>  struct s3c_audio_pdata {
>>       int (*cfg_gpio)(struct platform_device *);
>> +     union {
>> +             struct samsung_i2s i2s;
>> +     } type;
>
> Might be as easy just to embed a struct s3c_audio_pdata within the
> struct samsung_i2s?

struct s3c_audio_pdata is shared among I2S, AC97, SPDIF and PCM.
Here the idea is that controller drivers add specific structures to the union
as and when they need it.


>> +     switch (bfs) {
>> +     case 48:
>> +             mod |= MOD_BCLK_48FS;
>> +             break;
>> +     case 32:
>> +             mod |= MOD_BCLK_32FS;
>> +             break;
>> +     case 24:
>> +             mod |= MOD_BCLK_24FS;
>> +             break;
>> +     default:
>> +             mod |= MOD_BCLK_16FS;
>> +             break;
>
> Especially on the write side I'd be a bit more comfortable if these
> functions didn't silently convert an unspecified setting into a default
> so that we know that users are getting the setting they asked for.

Ok. I'll add a case for 16 and print error in default.



>> +             if (is_secondary(i2s)) {
>> +                     con |= CON_TXSDMA_ACTIVE;
>> +                     con &= ~CON_TXSDMA_PAUSE;
>> +             } else {
>> +                     con |= CON_TXDMA_ACTIVE;
>> +                     con &= ~CON_TXDMA_PAUSE;
>
> Can we do this stuff with a variable storing the mask to use?  It might
> compress the code a lot but I've not looked at what the bits actually
> are.

sorry, I am unable to understand what you suggest

>
>> +     /* Allow LRCLK-inverted version of the supported formats */
>> +     switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
>> +     case SND_SOC_DAIFMT_NB_NF:
>> +             break;
>> +     case SND_SOC_DAIFMT_NB_IF:
>> +             if (tmp & MOD_LR_RLOW)
>> +                     tmp &= ~MOD_LR_RLOW;
>> +             else
>> +                     tmp |= MOD_LR_RLOW;
>> +             break;
>
> This looks a bit odd - it'll flip MOD_LR_FLOW if the frame is inverted,
> I'd expect it to want to set a specific value?

The frame polarity is specified by the Format(I2S, LSB, MSB), so we
set/clear MOD_LR_RLOW acc to the Format requested.
The Inversion request works relative to the Format -- if Frame inversion
is requested, we simply flip it from the value set during Format setting.


>> +     /* We don't care about BFS in Slave mode */
>> +     if (is_slave(i2s))
>> +             return 0;
>
> You're skipping more than just rfs setting here.  Probably just a case
> of updating the comment.

Yes, I need to update the comment.


>> +static int i2sv2_i2s_set_clkdiv(struct snd_soc_dai *dai,
>> +     int div_id, int div)
>> +{
>> +     struct i2s_dai *i2s = to_info(dai);
>> +     struct i2s_dai *other = i2s->pri_dai ? : i2s->sec_dai;
>> +
>> +     if (div_id == SAMSUNG_I2S_DIV_BCLK) {
>
> switch statement please.

Switch didn't look very pretty with just one case, so I made it if-else
Anyways, I'll change it to switch.


>> +#define SAMSUNG_I2S_RATES \
>> +     (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
>> +     SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
>> +     SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
>
> SNDRV_PCM_RATE_8000_96000.

of course !

>> +/*
>> + * Maximum number of I2S blocks that any SoC can have.
>> + * The secondary interface of a CPU dai(if there exists any),
>> + * is indexed at [cpu-dai's ID + MAX_I2S]
>> + */
>> +#define MAX_I2S      4
>
> Can this be kept internal to the driver?  If not it should be
> namespaced.

ASoC machine drivers need to index the secondary dai that is
automatically created and registered by the cpu driver.
So, it needs to be available outside.
I'll make it SAMSUNG_I2S_SECOFF -- secondary offset of I2S(?)

Thanks.


More information about the Alsa-devel mailing list