"buffer underflow", heh sounds a bit like an oxy- moron, . . .

On Sun, Oct 18, 2015 at 6:58 PM, Rick Mann <[email protected]> wrote:

> I've had the same problem with kernels later than 3.8. On 3.8, I switched
> to using ti,da830-evm-audio (davinci-evm.c, I think). My DTS (for both
> types of sound card) call for a 12MHz McASP master clock, but in 4.x
> kernels, I would actually see a 24MHz signal come off the master clock, and
> I think that's what led to the underflow.
>
> FWIW, here's my DTS (for 3.8):
>
>
> https://github.com/JetForMe/podtique/blob/v1/bbb/cape/Podtique1/BB-BONE-AUDI-03-00A0.dts
>
> I would love to get this to work in 4.1.x
>
> > On Oct 18, 2015, at 07:46 , [email protected] wrote:
> >
> > Hi,
> >
> > I have the same problem.
> > Which kernel are you using?
> > I'm currently working with the offical BeagleBone 4.1 kernel.
> > The only useful information I found is this post:
> >
> http://mailman.alsa-project.org/pipermail/alsa-devel/2014-November/083797.html
> > "An underrun (playback) event occurs when the serializer transfer
> > data from the XRBUF buffer to the XRSR shift register, but the
> > XRBUF hasn't been filled. Similarly, the overrun (capture) event
> > occurs when data from the XRSR shift register is transferred to
> > the XRBUF but it hasn't been read yet."
> >
> > So I think there is a problem with the mcasp interface and ASoC.
> >
> > Am Montag, 10. August 2015 14:25:32 UTC+2 schrieb Shadi Abdu-Rahman:
> > Hi all,
> >
> > I'm having trouble using an audio codec board with a custom device tree
> overlay (see below) with the Beaglebone Black. When exporting the overlay,
> the codecs seem to register fine:
> >
> > dmesg
> > [ 1375.144463] bone_capemgr bone_capemgr: part_number
> 'BB-BONE-XA-SK-AU', version 'N/A'
> > [ 1375.152305] bone_capemgr bone_capemgr: slot #4: override
> > [ 1375.157799] bone_capemgr bone_capemgr: Using override eeprom data at
> slot 4
> > [ 1375.164864] bone_capemgr bone_capemgr: slot #4: 'Override Board
> Name,00A0,Override Manuf,BB-BONE-XA-SK-AU'
> > [ 1375.206351] bone_capemgr bone_capemgr: slot #4: dtbo
> 'BB-BONE-XA-SK-AU-00A0.dtbo' loaded; overlay id #0
> > [ 1375.464260] cs4270 2-0048: found device at i2c address 48
> > [ 1375.469699] cs4270 2-0048: hardware revision 3
> > [ 1375.485782] cs4270 2-0049: found device at i2c address 49
> > [ 1375.491222] cs4270 2-0049: hardware revision 3
> > [ 1375.504744] (NULL device *): Setting gpio_int_masterclk_enable = 0
> > [ 1375.513334] asoc-simple-card ocp:sound: cs4270-hifi <->
> 48038000.mcasp mapping ok
> > [ 1375.521095] (NULL device *): Setting gpio_int_masterclk_enable = 0
> > [ 1375.529893] asoc-simple-card ocp:sound: cs4270-hifi <->
> 48038000.mcasp mapping ok
> >
> > aplay -l
> > **** List of PLAYBACK Hardware Devices ****
> > card 0: XMOSAudioSlice [XMOS-Audio-Slice], device 0:
> davinci-mcasp.0-cs4270-hifi-a cs4270-hifi-0 []
> >   Subdevices: 1/1
> >   Subdevice #0: subdevice #0
> > card 0: XMOSAudioSlice [XMOS-Audio-Slice], device 1:
> davinci-mcasp.0-cs4270-hifi-b cs4270-hifi-1 []
> >   Subdevices: 1/1
> >   Subdevice #0: subdevice #0
> >
> > lsmod:
> > snd_soc_davinci_mcasp    14391  2
> > snd_soc_simple_card     8156  0
> > snd_soc_edma            1150  1 snd_soc_davinci_mcasp
> > snd_soc_cs4270          6875  2
> > snd_soc_omap            2573  1 snd_soc_davinci_mcasp
> > snd_soc_core          156881  5
> snd_soc_davinci_mcasp,snd_soc_edma,snd_soc_omap,snd_soc_simple_card,snd_soc_cs4270
> > snd_compress           11668  1 snd_soc_core
> > snd_pcm_dmaengine       5061  2 snd_soc_core,snd_soc_omap
> > snd_pcm                77081  4
> snd_soc_davinci_mcasp,snd_soc_core,snd_soc_omap,snd_pcm_dmaengine
> > snd_timer              16860  1 snd_pcm
> > snd                    56902  4
> snd_soc_core,snd_timer,snd_pcm,snd_compress
> > soundcore               6869  1 snd
> > pvrsrvkm              147014  0
> > omap_aes               13089  0
> > omap_sham              19190  0
> > tda998x                11683  1
> > tilcdc                 27919  0
> > omap_rng                4354  0
> > rng_core                7270  1 omap_rng
> > drm_kms_helper        106610  3 tda998x,tilcdc
> > uio_pdrv_genirq         3317  0
> > leds_gpio               3102  0
> > uio                     8330  1 uio_pdrv_genirq
> >
> > but when I try to play an audio file I get a stream of transmit buffer
> underflows and no audio:
> >
> > aplay test128.wav
> > Playing WAVE 'test128.wav' : Signed 16 bit Little Endian, Rate 48000 Hz,
> Stereo
> > underrun!!! (at least 1.630 ms long)
> > underrun!!! (at least 5.413 ms long)
> > underrun!!! (at least 0.636 ms long)
> > underrun!!! (at least 5.369 ms long)
> > underrun!!! (at least 0.217 ms long)
> > underrun!!! (at least 0.641 ms long)
> > underrun!!! (at least 5.254 ms long)
> >
> > dmesg
> > [ 1493.190031] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.201647] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.218719] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.229946] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.245328] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.259411] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> > [ 1493.270549] davinci-mcasp 48038000.mcasp: Transmit buffer underflow
> >
> > Using a software oscilloscope, I can see that the frame clock starts on
> mcasp0_fsx frame clock line but stops after a few periods. There’s no
> activity on the on the mcasp0_axr2 audio out line.
> >
> > This might be related to the problem mentioned here, but I couldn't see
> a solution for it. I might also have missed something trivial. Any pointers
> or help would be much appreciated.
> >
> > Additional information:
> > I’m using the v4.1.3-bone15 linux kernel with
> debian-8.1-minimal-armhf-2015-06-09 compiled as per Robert C Nelsons
> instructions here.
> >
> > The board I’m using is an XMOS XA-SK-AUDIO slice and consists of two
> Cirrus Logic cs4270 codecs and an onboard oscillator generating the master
> clock. I’ve interfaced the board to a XMOS micro controller to make sure
> the board is in working order (and it is). When connected to the BBB, reset
> de-assertion and some initial i2c codec configuration (setting the codecs
> in software mode) are handled by the same XMOS micro controller.
> >
> > The overlay I’m using (compiled and installed using bb-overlays) looks
> like this:
> > /dts-v1/;
> > /plugin/;
> >
> > / {
> >     compatible = "ti,beaglebone", "ti,beaglebone-black";
> >     part-number = "BB-BONE-XA-SK-AU";
> >     version = "00A0";
> >
> >     exclusive-use =
> >         /* pin header usage */
> >         "P9.25",    /* mcasp0_ahclkx <- MCLK */
> >         "P9.31",    /* mcasp0_aclkx <-> BCLK*/
> >         "P9.29",    /* mcasp0_fsx <-> LRCLK */
> >         "P9.30",    /* mcasp0_axr0 <- ADC_DATA0 */
> >         "P9.41",    /* mcasp0_axr1 <- ADC_DATA1 */
> >         "P9.28",    /* mcasp0_axr2 -> DAC_DATA0 */
> >         "P9.27",    /* mcasp0_axr3 -> DAC_DATA1 */
> >         /* hardware ip usage */
> >         "gpio0_15",    /* ext-mclk-sel -> MCLK_FSEL */
> >         "gpio0_20", /* CLKOUT2 disabled */
> >         "gpio1_27", /* internal 24.576 MHz oscillator disabled */
> >         "mcasp0";
> >
> >     fragment@0 {
> >         target = <&am33xx_pinmux>;
> >         __overlay__ {
> >             i2c2_pins: pinmux_i2c2_pins {
> >                 pinctrl-single,pins = <
> >                     /* Pullup resistors available on codec board */
> >                     0x17c 0x2b        /* i2c2_scl,        (PIN_INPUT |
> MUX_MODE3) */
> >                     0x178 0x2b        /* i2c2_sda,         (PIN_INPUT |
> MUX_MODE3) */
> >                 >;
> >             };
> >
> >             mcasp0_pins: pinmux_mcasp0_pins {
> >                 pinctrl-single,pins = <
> >                     0x1ac 0x20        /* mcasp0_ahclkx,
> (PIN_INPUT_PULLDOWN | MUX_MODE0) */
> >                     0x190 0x20        /* mcasp0_aclkx,
> (PIN_INPUT_PULLDOWN | MUX_MODE0) */
> >                     0x194 0x20        /* mcasp0_fsx,
> (PIN_INPUT_PULLDOWN | MUX_MODE0) */
> >                     0x198 0x20        /* mcasp0_axr0,
> (PIN_INPUT_PULLDOWN | MUX_MODE0) */
> >                     0x1a8 0x20        /* mcasp0_axr1,
> (PIN_INPUT_PULLDOWN | MUX_MODE0) */
> >                     0x19c 0x02        /* mcasp0_axr2,
> (PIN_OUTPUT_PULLDOWN | MUX_MODE2) */
> >                     0x1a4 0x02        /* mcasp0_axr3,
> (PIN_OUTPUT_PULLDOWN | MUX_MODE2) */
> >                     /* disable internal 24.576 MHz oscillator */
> >                     0x06c 0x07      /* gpio1_27,
> (PIN_OUTPUT_PULLDOWN | MUX_MODE7) */
> >                 >;
> >             };
> >
> >             gpio_pins: pinmux_gpio_pins {
> >                 pinctrl-single,pins = <
> >                     /* ext-mclk-sel */
> >                     0x184 0x17        /* gpio0_15,
> (PIN_OUTPUT_PULLUP | MUX_MODE7) */
> >                     /* disable CLKOUT2 to allow usage of mcasp0_axr1 on
> P9_41 */
> >                     0x1b4 0x2b        /* gpio0_20,        (PIN_INPUT |
> MUX_MODE3) */
> >                 >;
> >             };
> >         };
> >     };
> >
> >     fragment@1 {
> >         target = <&i2c2>;
> >         __overlay__ {
> >             pinctrl-names = "default";
> >             pinctrl-0 = <&i2c2_pins>;
> >             status = "okay";
> >             #address-cells = <1>;
> >             #size-cells = <0>;
> >             clock-frequency = <100000>;
> >
> >             cs4270m: cs4270@48 {
> >                 compatible = "cirrus,cs4270";
> >                 status = "okay";
> >                 #sound-dai-cells = <0>;
> >                 reg = <0x48>;
> >                 name-prefix = "a";
> >                 va-supply = <&ldo4_reg>;
> >                 vd-supply = <&ldo4_reg>;
> >                 vlc-supply = <&ldo4_reg>;
> >             };
> >
> >             cs4270s: cs4270@49 {
> >                 compatible = "cirrus,cs4270";
> >                 status = "okay";
> >                 #sound-dai-cells = <0>;
> >                 reg = <0x49>;
> >                 name-prefix = "b";
> >                 va-supply = <&ldo4_reg>;
> >                 vd-supply = <&ldo4_reg>;
> >                 vlc-supply = <&ldo4_reg>;
> >             };
> >         };
> >     };
> >
> >     fragment@2 {
> >         target = <&mcasp0>;
> >         __overlay__ {
> >             pinctrl-names = "default";
> >             pinctrl-0 = <&mcasp0_pins>;
> >             status = "okay";
> >             #sound-dai-cells = <0>;
> >             op-mode = <0>;    // MCASP_IIS_MODE
> >             tdm-slots = <2>;
> >             num-serializer = <4>;
> >             serial-dir = <        // 0: INACTIVE, 1: TX, 2: RX
> >                 2 2 1 1
> >             >;
> >             tx-num-evt = <1>;
> >             rx-num-evt = <1>;
> >         };
> >     };
> >
> >     fragment@3 {
> >         target = <&ocp>;
> >         __overlay__ {
> >             sound {
> >                 compatible = "simple-audio-card";
> >                 simple-audio-card,name = "XMOS-Audio-Slice";
> >
> >                 simple-audio-card,widgets =
> >                     "Line", "Line In 1",
> >                     "Line", "Line Out 1",
> >                     "Line", "Line In 2",
> >                     "Line", "Line Out 2"
> >                     ;
> >                 simple-audio-card,routing =
> >                     "a AINA", "Line In 1",
> >                     "a AINB", "Line In 1",
> >                     "Line Out 1", "a AOUTA",
> >                     "Line Out 1", "a AOUTB",
> >                     "b AINA", "Line In 2",
> >                     "b AINB", "Line In 2",
> >                     "Line Out 2", "b AOUTA",
> >                     "Line Out 2", "b AOUTB"
> >                     ;
> >
> >                 simple-audio-card,int-masterclk-enable = <&gpio1 27 0>;
> >
> >                 simple-audio-card,dai-link@1 {
> >                     format = "i2s";
> >                     frame-master = <&cpu_node1>;
> >                     bitclock-master = <&cpu_node1>;
> >                     cpu_node1: cpu {
> >                         sound-dai = <&mcasp0>;
> >                         system-clock-frequency = <24576000>;
> >                     };
> >                     codec_node1: codec {
> >                         sound-dai = <&cs4270s>;
> >                         system-clock-frequency = <24576000>;
> >                     };
> >                 };
> >
> >                 simple-audio-card,dai-link@0 {
> >                     format = "i2s";
> >                     frame-master = <&cpu_node0>;
> >                     bitclock-master = <&cpu_node0>;
> >                     cpu_node0: cpu {
> >                         sound-dai = <&mcasp0>;
> >                         system-clock-frequency = <24576000>;
> >                     };
> >                     codec_node0: codec {
> >                         sound-dai = <&cs4270m>;
> >                         system-clock-frequency = <24576000>;
> >                     };
> >                 };
> >             };
> >         };
> >     };
> > };
> >
> >
> > I've also made the following modifications to cs4270.c, simple-card.c,
> and soc-core.c to add a mechanism to disable the internal BBB master clock,
> as well as to fix issues with missing source/sink widgets,
> > [  137.408549] cs4270 2-0048: ASoC: no source widget found for AINA
> > [  137.414737] cs4270 2-0048: ASoC: Failed to add route AINA -> direct
> -> Capture
> > [  137.422016] cs4270 2-0048: ASoC: no source widget found for AINB
> > [  137.428137] cs4270 2-0048: ASoC: Failed to add route AINB -> direct
> -> Capture
> > [  137.435477] cs4270 2-0048: ASoC: no sink widget found for AOUTA
> > [  137.441445] cs4270 2-0048: ASoC: Failed to add route Playback ->
> direct -> AOUTA
> > [  137.448928] cs4270 2-0048: ASoC: no sink widget found for AOUTB
> > [  137.454922] cs4270 2-0048: ASoC: Failed to add route Playback ->
> direct -> AOUTB
> >
> > and name collisions:
> > [   51.364492] asoc-simple-card ocp:sound: control 2:0:0:Master Playback
> Volume:0 is already present
> > [   51.373469] cs4270 2-0049: ASoC: Failed to add Master Playback
> Volume: -16
> > ...
> > [   51.393905] ------------[ cut here ]------------
> > [   51.398561] WARNING: CPU: 0 PID: 44 at fs/sysfs/dir.c:31
> sysfs_warn_dup+0x51/0x5c()
> > [   51.406281] sysfs: cannot create duplicate filename
> '/devices/platform/ocp/ocp:sound/davinci-mcasp.0-cs4270-hifi'
> >
> > diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c
> > index e6d4ff9..4805747 100644
> > --- a/sound/soc/codecs/cs4270.c
> > +++ b/sound/soc/codecs/cs4270.c
> > @@ -140,11 +140,11 @@ struct cs4270_private {
> >  };
> >
> >  static const struct snd_soc_dapm_widget cs4270_dapm_widgets[] = {
> > -SND_SOC_DAPM_INPUT("AINL"),
> > -SND_SOC_DAPM_INPUT("AINR"),
> > +SND_SOC_DAPM_INPUT("AINA"),
> > +SND_SOC_DAPM_INPUT("AINB"),
> >
> > -SND_SOC_DAPM_OUTPUT("AOUTL"),
> > -SND_SOC_DAPM_OUTPUT("AOUTR"),
> > +SND_SOC_DAPM_OUTPUT("AOUTA"),
> > +SND_SOC_DAPM_OUTPUT("AOUTB"),
> >  };
> >
> >  static const struct snd_soc_dapm_route cs4270_dapm_routes[] = {
> > diff --git a/sound/soc/generic/simple-card.c
> b/sound/soc/generic/simple-card.c
> > index 33feee9..1383b0f 100644
> > --- a/sound/soc/generic/simple-card.c
> > +++ b/sound/soc/generic/simple-card.c
> > @@ -28,6 +28,7 @@ struct simple_card_data {
> >          struct asoc_simple_dai codec_dai;
> >      } *dai_props;
> >      unsigned int mclk_fs;
> > +    int gpio_int_masterclk_enable;
> >      int gpio_hp_det;
> >      int gpio_hp_det_invert;
> >      int gpio_mic_det;
> > @@ -50,7 +51,7 @@ static int asoc_simple_card_startup(struct
> snd_pcm_substream *substream)
> >      ret = clk_prepare_enable(dai_props->cpu_dai.clk);
> >      if (ret)
> >          return ret;
> > -
> > +
> >      ret = clk_prepare_enable(dai_props->codec_dai.clk);
> >      if (ret)
> >          clk_disable_unprepare(dai_props->cpu_dai.clk);
> > @@ -167,6 +168,12 @@ static int asoc_simple_card_dai_init(struct
> snd_soc_pcm_runtime *rtd)
> >      if (ret < 0)
> >          return ret;
> >
> > +    /* TODO: Logic for enabling internal clock if specified in DT*/
> > +    if (gpio_is_valid(priv->gpio_int_masterclk_enable)) {
> > +        dev_info(NULL, "Setting gpio_int_masterclk_enable = 0");
> > +        gpio_set_value(priv->gpio_int_masterclk_enable, 0);
> > +    }
> > +
> >      if (gpio_is_valid(priv->gpio_hp_det)) {
> >          snd_soc_card_jack_new(rtd->card, "Headphones",
> >                        SND_JACK_HEADPHONE,
> > @@ -195,16 +202,18 @@ static int asoc_simple_card_dai_init(struct
> snd_soc_pcm_runtime *rtd)
> >  }
> >
> >  static int
> > -asoc_simple_card_sub_parse_of(struct device_node *np,
> > -                  struct asoc_simple_dai *dai,
> > -                  struct device_node **p_node,
> > -                  const char **name,
> > -                  int *args_count)
> > +asoc_simple_card_sub_parse_of(struct simple_card_data *priv,
> > +                    struct device_node *np,
> > +                    struct asoc_simple_dai *dai,
> > +                    struct device_node **p_node,
> > +                    const char **name,
> > +                    int *args_count, bool codec_device, int idx)
> >  {
> >      struct of_phandle_args args;
> >      struct clk *clk;
> >      u32 val;
> >      int ret;
> > +    const char *str = NULL;
> >
> >      /*
> >       * Get node via "sound-dai = <&phandle port>"
> > @@ -225,6 +234,18 @@ asoc_simple_card_sub_parse_of(struct device_node
> *np,
> >      if (ret < 0)
> >          return ret;
> >
> > +    /* get name-prefix */
> > +    if (codec_device) {
> > +        /* NULL bypasses the device name check in soc-core */
> > +        priv->snd_card.codec_conf[idx].dev_name = NULL;
> > +        priv->snd_card.codec_conf[idx].of_node = *p_node;
> > +        of_property_read_string(*p_node, "name-prefix", &str);
> > +        if (str)
> > +            priv->snd_card.codec_conf[idx].name_prefix = str;
> > +        else
> > +            priv->snd_card.codec_conf[idx].name_prefix = NULL;
> > +    }
> > +
> >      /* Parse TDM slot */
> >      ret = snd_soc_of_parse_tdm_slot(np, &dai->slots, &dai->slot_width);
> >      if (ret)
> > @@ -334,16 +355,16 @@ static int asoc_simple_card_dai_link_of(struct
> device_node *node,
> >      if (ret < 0)
> >          goto dai_link_of_err;
> >
> > -    ret = asoc_simple_card_sub_parse_of(cpu, &dai_props->cpu_dai,
> > +    ret = asoc_simple_card_sub_parse_of(priv, cpu, &dai_props->cpu_dai,
> >                          &dai_link->cpu_of_node,
> >                          &dai_link->cpu_dai_name,
> > -                        &cpu_args);
> > +                        &cpu_args, false, idx);
> >      if (ret < 0)
> >          goto dai_link_of_err;
> >
> > -    ret = asoc_simple_card_sub_parse_of(codec, &dai_props->codec_dai,
> > +    ret = asoc_simple_card_sub_parse_of(priv, codec,
> &dai_props->codec_dai,
> >                          &dai_link->codec_of_node,
> > -                        &dai_link->codec_dai_name, NULL);
> > +                        &dai_link->codec_dai_name, NULL, true, idx);
> >      if (ret < 0)
> >          goto dai_link_of_err;
> >
> > @@ -357,8 +378,10 @@ static int asoc_simple_card_dai_link_of(struct
> device_node *node,
> >
> >      /* DAI link name is created from CPU/CODEC dai name */
> >      name = devm_kzalloc(dev,
> > -                strlen(dai_link->cpu_dai_name)   +
> > -                strlen(dai_link->codec_dai_name) + 2,
> > +                strlen(dai_link->cpu_dai_name) +
> > +                strlen(dai_link->codec_dai_name) +
> > +                (priv->snd_card.codec_conf[idx].name_prefix ?
> > +                strlen(priv->snd_card.codec_conf[idx].name_prefix) + 3
> : 2),
> >                  GFP_KERNEL);
> >      if (!name) {
> >          ret = -ENOMEM;
> > @@ -367,6 +390,9 @@ static int asoc_simple_card_dai_link_of(struct
> device_node *node,
> >
> >      sprintf(name, "%s-%s", dai_link->cpu_dai_name,
> >                  dai_link->codec_dai_name);
> > +    if (priv->snd_card.codec_conf[idx].name_prefix)
> > +        sprintf(name, "%s-%s", name,
> > +                priv->snd_card.codec_conf[idx].name_prefix);
> >      dai_link->name = dai_link->stream_name = name;
> >      dai_link->ops = &asoc_simple_card_ops;
> >      dai_link->init = asoc_simple_card_dai_init;
> > @@ -459,6 +485,15 @@ static int asoc_simple_card_parse_of(struct
> device_node *node,
> >              return ret;
> >      }
> >
> > +    /* request GPIO to control internal 24.576MHz oscillator */
> > +    priv->gpio_int_masterclk_enable = of_get_named_gpio_flags(node,
> > +                "simple-audio-card,int-masterclk-enable", 0, &flags);
> > +
> > +    if (priv->gpio_int_masterclk_enable == -EPROBE_DEFER)
> > +        return -EPROBE_DEFER;
> > +    gpio_request_one(priv->gpio_int_masterclk_enable,
> GPIOF_OUT_INIT_LOW,
> > +                   "Internal Clock Enable Pin");
> > +
> >      priv->gpio_hp_det = of_get_named_gpio_flags(node,
> >                  "simple-audio-card,hp-det-gpio", 0, &flags);
> >      priv->gpio_hp_det_invert = !!(flags & OF_GPIO_ACTIVE_LOW);
> > @@ -498,13 +533,18 @@ static int asoc_simple_card_probe(struct
> platform_device *pdev)
> >      struct snd_soc_dai_link *dai_link;
> >      struct device_node *np = pdev->dev.of_node;
> >      struct device *dev = &pdev->dev;
> > -    int num_links, ret;
> > +    int num_links = (np && of_get_child_by_name(np,
> > +                    "simple-audio-card,dai-link")) ?
> > +                    of_get_child_count(np) : 1;
> > +    struct snd_soc_codec_conf codec_conf[num_links];
> > +    int ret;
> >
> > -    /* Get the number of DAI links */
> > +    /* Get the number of DAI links
> >      if (np && of_get_child_by_name(np, "simple-audio-card,dai-link"))
> >          num_links = of_get_child_count(np);
> >      else
> >          num_links = 1;
> > +    */
> >
> >      /* Allocate the private data and the DAI link array */
> >      priv = devm_kzalloc(dev,
> > @@ -519,6 +559,8 @@ static int asoc_simple_card_probe(struct
> platform_device *pdev)
> >      dai_link = priv->dai_link;
> >      priv->snd_card.dai_link = dai_link;
> >      priv->snd_card.num_links = num_links;
> > +    priv->snd_card.codec_conf = codec_conf;
> > +    priv->snd_card.num_configs = num_links;
> >
> >      priv->gpio_hp_det = -ENOENT;
> >      priv->gpio_mic_det = -ENOENT;
> > @@ -589,6 +631,11 @@ static int asoc_simple_card_remove(struct
> platform_device *pdev)
> >      struct snd_soc_card *card = platform_get_drvdata(pdev);
> >      struct simple_card_data *priv = snd_soc_card_get_drvdata(card);
> >
> > +    if (gpio_is_valid(priv->gpio_int_masterclk_enable)) {
> > +        gpio_set_value(priv->gpio_int_masterclk_enable, 0);
> > +        gpio_free(priv->gpio_int_masterclk_enable);
> > +    }
> > +
> >      if (gpio_is_valid(priv->gpio_hp_det))
> >          snd_soc_jack_free_gpios(&simple_card_hp_jack, 1,
> >                      &simple_card_hp_jack_gpio);
> > diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> > index 2373252..4808089 100644
> > --- a/sound/soc/soc-core.c
> > +++ b/sound/soc/soc-core.c
> > @@ -1102,6 +1102,9 @@ static void soc_set_name_prefix(struct
> snd_soc_card *card,
> >
> >      for (i = 0; i < card->num_configs; i++) {
> >          struct snd_soc_codec_conf *map = &card->codec_conf[i];
> > +
> > +        if (!map->name_prefix)
> > +            continue;
> >          if (map->of_node && component->dev->of_node != map->of_node)
> >              continue;
> >          if (map->dev_name && strcmp(component->name, map->dev_name))
> >
> >
> > Thanks in advance,
> > Shadi
> >
> >
> > --
> > For more options, visit http://beagleboard.org/discuss
> > ---
> > You received this message because you are subscribed to the Google
> Groups "BeagleBoard" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> > For more options, visit https://groups.google.com/d/optout.
>
>
> --
> Rick Mann
> [email protected]
>
>
> --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to