On 09-07-18, 16:16, Rohit Kumar wrote: > > > +static int sdm845_bind(struct device *dev) > > > +{ > > > + struct snd_soc_card *card; > > > + struct sdm845_snd_data *data; > > > + int ret; > > > + > > > + card = kzalloc(sizeof(*card), GFP_KERNEL); > > > + if (!card) > > > + return -ENOMEM; > > > + > > > + /* Allocate the private data */ > > > + data = kzalloc(sizeof(*data), GFP_KERNEL); > > > + if (!data) > > > + return -ENOMEM; > > > + > > > + ret = component_bind_all(dev, card); > > > + if (ret) { > > > + dev_err(dev, "Audio components bind failed: %d\n", ret); > > > + goto bind_fail; > > > + } > > > + > > > + dev_set_drvdata(dev, card); > > > + card->dev = dev; > > > + ret = qcom_snd_parse_of(card); > > > + if (ret) { > > > + dev_err(dev, "Error parsing OF data\n"); > > > + goto parse_dt_fail; > > > + } > > > + > > > + data->card = card; > > > + snd_soc_card_set_drvdata(card, data); > > > + > > > + sdm845_add_be_ops(card); > > > + > > > + sdm845_init_supplies(dev); > > > + > > > + ret = snd_soc_register_card(card); > > > + if (ret) { > > > + dev_err(dev, "Sound card registration failed\n"); > > > + goto register_card_fail; > > > + } > > > + return ret; > > > + > > > +register_card_fail: > > > + sdm845_deinit_supplies(dev); > > > + kfree(card->dai_link); > > > +parse_dt_fail: > > > + component_unbind_all(dev, card); > > > +bind_fail: > > > + kfree(data); > > > + kfree(card); > > > + return ret; > > > +} > > I would make a case for this to be moved into common too :) > > There are few platform specific APIs and structs here like struct > sdm845_snd_data, > sdm845_add_be_ops() which needs to be initialized and assigned before > soundcard > registration. Moving this complete API to common will restrict it. Please > suggest.
Yes indeed, they can be split and done outside while the common stuff use a 'core' object and use that to initialize. If you need to do some driver step, you can invoke a callback. -- ~Vinod