On Thu, 23 Jan 2014, Xiubo Li wrote: > diff --git a/include/sound/simple_card.h b/include/sound/simple_card.h > index e1ac996..cfc5b66 100644 > --- a/include/sound/simple_card.h > +++ b/include/sound/simple_card.h > @@ -14,10 +14,18 @@ > > #include <sound/soc.h> > > +struct asoc_simple_tdm_slot { > + unsigned int tx_mask; > + unsigned int rx_mask; > + int slots; > + int slot_width; > +}; > + > struct asoc_simple_dai { > const char *name; > unsigned int fmt; > unsigned int sysclk; > + struct asoc_simple_tdm_slot *tdm; > }; > > struct asoc_simple_card_info { > diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c > index 546b93d..d067e0a 100644 > --- a/sound/soc/generic/simple-card.c > +++ b/sound/soc/generic/simple-card.c > @@ -32,7 +32,7 @@ static int __asoc_simple_card_dai_init(struct snd_soc_dai > *dai, > ret = snd_soc_dai_set_fmt(dai, set->fmt); > if (ret && ret != -ENOTSUPP) { > dev_err(dai->dev, "simple-card: set_fmt error\n"); > - return ret; > + goto err; > } > } > > @@ -40,10 +40,22 @@ static int __asoc_simple_card_dai_init(struct snd_soc_dai > *dai, > ret = snd_soc_dai_set_sysclk(dai, 0, set->sysclk, 0); > if (ret && ret != -ENOTSUPP) { > dev_err(dai->dev, "simple-card: set_sysclk error\n"); > - return ret; > + goto err; > + } > + } > + > + if (set->tdm) { > + ret = snd_soc_dai_set_tdm_slot(dai, set->tdm->tx_mask, > + set->tdm->rx_mask, > + set->tdm->slots, > + set->tdm->slot_width); > + if (ret && ret != -ENOTSUPP) { > + dev_err(dai->dev, "simple-card: set_tdm_slot error\n"); > + goto err; > } > } > > +err: > return ret; > } > > @@ -67,11 +79,43 @@ static int asoc_simple_card_dai_init(struct > snd_soc_pcm_runtime *rtd) > } > > static int > +asoc_simple_card_of_parse_tdm_slot(struct device_node *np, > + struct device *dev, > + struct asoc_simple_dai *dai, > + const char *propname) > +{ > + struct asoc_simple_tdm_slot *tdm; > + u32 out_value[4]; > + int ret; > + > + if (!of_property_read_bool(np, propname)) > + return 0; > + > + tdm = devm_kzalloc(dev, sizeof(*tdm), GFP_KERNEL); > + if (!tdm) > + return -ENOMEM; > + > + ret = of_property_read_u32_array(np, propname, out_value, 4); > + if (ret) > + return ret;
Looks like a memory leak? > + > + tdm->tx_mask = out_value[0]; > + tdm->rx_mask = out_value[1]; > + tdm->slots = out_value[2]; > + tdm->slot_width = out_value[3]; > + > + dai->tdm = tdm; > + > + return 0; > +} > + > +static int > asoc_simple_card_sub_parse_of(struct device_node *np, > unsigned int daifmt, > struct asoc_simple_dai *dai, > const struct device_node **p_node, > - const char **name) > + const char **name, > + struct device *dev) > { > struct device_node *node; > struct clk *clk; > @@ -91,6 +135,11 @@ asoc_simple_card_sub_parse_of(struct device_node *np, > if (ret < 0) > goto parse_error; > > + /* parse tdm_slot */ > + ret = asoc_simple_card_of_parse_tdm_slot(np, dev, dai, "tdm-slot"); > + if (ret < 0) > + goto parse_error; > + > /* > * bitclock-inversion, frame-inversion > * bitclock-master, frame-master > @@ -162,7 +211,8 @@ static int asoc_simple_card_parse_of(struct device_node > *node, > ret = asoc_simple_card_sub_parse_of(np, priv->daifmt, > &priv->cpu_dai, > &dai_link->cpu_of_node, > - &dai_link->cpu_dai_name); > + &dai_link->cpu_dai_name, > + dev); > if (ret < 0) > return ret; > > @@ -173,7 +223,8 @@ static int asoc_simple_card_parse_of(struct device_node > *node, > ret = asoc_simple_card_sub_parse_of(np, priv->daifmt, > &priv->codec_dai, > &dai_link->codec_of_node, > - &dai_link->codec_dai_name); > + &dai_link->codec_dai_name, > + dev); > if (ret < 0) > return ret; > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/