Skip to content

Commit

Permalink
ASoC: mediatek: mt8195: release device_node after snd_soc_register_card
Browse files Browse the repository at this point in the history
Device nodes can be released after components have bound.

Shortens the lifecycle of the device nodes.  Releases the reference
counts after snd_soc_register_card.

Signed-off-by: Tzung-Bi Shih <tzungbi@google.com>
Link: https://lore.kernel.org/r/20211224064719.2031210-5-tzungbi@google.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Tzung-Bi Shih authored and Mark Brown committed Dec 24, 2021
1 parent db3f5ab commit 082482a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 81 deletions.
53 changes: 16 additions & 37 deletions sound/soc/mediatek/mt8195/mt8195-mt6359-rt1011-rt5682.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@
#define RT5682S_DEV0_NAME "rt5682s.2-001a"

struct mt8195_mt6359_rt1011_rt5682_priv {
struct device_node *platform_node;
struct device_node *hdmi_node;
struct device_node *dp_node;
struct snd_soc_jack headset_jack;
struct snd_soc_jack dp_jack;
struct snd_soc_jack hdmi_jack;
Expand Down Expand Up @@ -1047,6 +1044,7 @@ static int mt8195_mt6359_rt1011_rt5682_dev_probe(struct platform_device *pdev)
struct snd_soc_card *card = &mt8195_mt6359_rt1011_rt5682_soc_card;
struct snd_soc_dai_link *dai_link;
struct mt8195_mt6359_rt1011_rt5682_priv *priv;
struct device_node *platform_node, *dp_node, *hdmi_node;
int is5682s = 0;
int ret, i;

Expand All @@ -1065,38 +1063,35 @@ static int mt8195_mt6359_rt1011_rt5682_dev_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;

priv->platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!priv->platform_node) {
platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!platform_node) {
dev_dbg(&pdev->dev, "Property 'platform' missing or invalid\n");
return -EINVAL;
}

dp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,dptx-codec", 0);
hdmi_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,hdmi-codec", 0);

for_each_card_prelinks(card, i, dai_link) {
if (!dai_link->platforms->name)
dai_link->platforms->of_node = priv->platform_node;
dai_link->platforms->of_node = platform_node;

if (strcmp(dai_link->name, "DPTX_BE") == 0) {
priv->dp_node =
of_parse_phandle(pdev->dev.of_node,
"mediatek,dptx-codec", 0);

if (!priv->dp_node) {
if (!dp_node) {
dev_dbg(&pdev->dev, "No property 'dptx-codec'\n");
} else {
dai_link->codecs->of_node = priv->dp_node;
dai_link->codecs->of_node = dp_node;
dai_link->codecs->name = NULL;
dai_link->codecs->dai_name = "i2s-hifi";
dai_link->init = mt8195_dptx_codec_init;
}
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
priv->hdmi_node =
of_parse_phandle(pdev->dev.of_node,
"mediatek,hdmi-codec", 0);
if (!priv->hdmi_node) {
if (!hdmi_node) {
dev_dbg(&pdev->dev, "No property 'hdmi-codec'\n");
} else {
dai_link->codecs->of_node = priv->hdmi_node;
dai_link->codecs->of_node = hdmi_node;
dai_link->codecs->name = NULL;
dai_link->codecs->dai_name = "i2s-hifi";
dai_link->init = mt8195_hdmi_codec_init;
Expand All @@ -1113,28 +1108,13 @@ static int mt8195_mt6359_rt1011_rt5682_dev_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata(card, priv);

ret = devm_snd_soc_register_card(&pdev->dev, card);
if (ret) {
of_node_put(priv->hdmi_node);
of_node_put(priv->dp_node);
of_node_put(priv->platform_node);
}

of_node_put(platform_node);
of_node_put(dp_node);
of_node_put(hdmi_node);
return ret;
}

static int mt8195_mt6359_rt1011_rt5682_dev_remove(struct platform_device *pdev)
{
struct snd_soc_card *card = platform_get_drvdata(pdev);
struct mt8195_mt6359_rt1011_rt5682_priv *priv =
snd_soc_card_get_drvdata(card);

of_node_put(priv->hdmi_node);
of_node_put(priv->dp_node);
of_node_put(priv->platform_node);

return 0;
}

#ifdef CONFIG_OF
static const struct of_device_id mt8195_mt6359_rt1011_rt5682_dt_match[] = {
{.compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",},
Expand All @@ -1156,7 +1136,6 @@ static struct platform_driver mt8195_mt6359_rt1011_rt5682_driver = {
.pm = &mt8195_mt6359_rt1011_rt5682_pm_ops,
},
.probe = mt8195_mt6359_rt1011_rt5682_dev_probe,
.remove = mt8195_mt6359_rt1011_rt5682_dev_remove,
};

module_platform_driver(mt8195_mt6359_rt1011_rt5682_driver);
Expand Down
64 changes: 20 additions & 44 deletions sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ struct sof_conn_stream {
};

struct mt8195_mt6359_rt1019_rt5682_priv {
struct device_node *platform_node;
struct device_node *adsp_node;
struct device_node *hdmi_node;
struct device_node *dp_node;
struct snd_soc_jack headset_jack;
struct snd_soc_jack dp_jack;
struct snd_soc_jack hdmi_jack;
Expand Down Expand Up @@ -1257,6 +1253,7 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
struct snd_soc_card *card = &mt8195_mt6359_rt1019_rt5682_soc_card;
struct snd_soc_dai_link *dai_link;
struct mt8195_mt6359_rt1019_rt5682_priv *priv;
struct device_node *platform_node, *adsp_node, *dp_node, *hdmi_node;
int is5682s = 0;
int init6359 = 0;
int sof_on = 0;
Expand All @@ -1278,19 +1275,21 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;

priv->platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!priv->platform_node) {
platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!platform_node) {
dev_dbg(&pdev->dev, "Property 'platform' missing or invalid\n");
return -EINVAL;
}

/* dai link */
priv->adsp_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,adsp", 0);
if (priv->adsp_node)
adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
if (adsp_node)
sof_on = 1;

dp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,dptx-codec", 0);
hdmi_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,hdmi-codec", 0);

if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
ret = mt8195_dailink_parse_of(card, pdev->dev.of_node,
"mediatek,dai-link");
Expand All @@ -1306,31 +1305,25 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
for_each_card_prelinks(card, i, dai_link) {
if (!dai_link->platforms->name) {
if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
dai_link->platforms->of_node = priv->adsp_node;
dai_link->platforms->of_node = adsp_node;
else
dai_link->platforms->of_node = priv->platform_node;
dai_link->platforms->of_node = platform_node;
}

if (strcmp(dai_link->name, "DPTX_BE") == 0) {
priv->dp_node =
of_parse_phandle(pdev->dev.of_node,
"mediatek,dptx-codec", 0);
if (!priv->dp_node) {
if (!dp_node) {
dev_dbg(&pdev->dev, "No property 'dptx-codec'\n");
} else {
dai_link->codecs->of_node = priv->dp_node;
dai_link->codecs->of_node = dp_node;
dai_link->codecs->name = NULL;
dai_link->codecs->dai_name = "i2s-hifi";
dai_link->init = mt8195_dptx_codec_init;
}
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
priv->hdmi_node =
of_parse_phandle(pdev->dev.of_node,
"mediatek,hdmi-codec", 0);
if (!priv->hdmi_node) {
if (!hdmi_node) {
dev_dbg(&pdev->dev, "No property 'hdmi-codec'\n");
} else {
dai_link->codecs->of_node = priv->hdmi_node;
dai_link->codecs->of_node = hdmi_node;
dai_link->codecs->name = NULL;
dai_link->codecs->dai_name = "i2s-hifi";
dai_link->init = mt8195_hdmi_codec_init;
Expand All @@ -1357,30 +1350,14 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata(card, priv);

ret = devm_snd_soc_register_card(&pdev->dev, card);
if (ret) {
of_node_put(priv->hdmi_node);
of_node_put(priv->dp_node);
of_node_put(priv->platform_node);
of_node_put(priv->adsp_node);
}

of_node_put(platform_node);
of_node_put(adsp_node);
of_node_put(dp_node);
of_node_put(hdmi_node);
return ret;
}

static int mt8195_mt6359_rt1019_rt5682_dev_remove(struct platform_device *pdev)
{
struct snd_soc_card *card = platform_get_drvdata(pdev);
struct mt8195_mt6359_rt1019_rt5682_priv *priv =
snd_soc_card_get_drvdata(card);

of_node_put(priv->hdmi_node);
of_node_put(priv->dp_node);
of_node_put(priv->platform_node);
of_node_put(priv->adsp_node);

return 0;
}

#ifdef CONFIG_OF
static const struct of_device_id mt8195_mt6359_rt1019_rt5682_dt_match[] = {
{.compatible = "mediatek,mt8195_mt6359_rt1019_rt5682",},
Expand All @@ -1402,7 +1379,6 @@ static struct platform_driver mt8195_mt6359_rt1019_rt5682_driver = {
.pm = &mt8195_mt6359_rt1019_rt5682_pm_ops,
},
.probe = mt8195_mt6359_rt1019_rt5682_dev_probe,
.remove = mt8195_mt6359_rt1019_rt5682_dev_remove,
};

module_platform_driver(mt8195_mt6359_rt1019_rt5682_driver);
Expand Down

0 comments on commit 082482a

Please sign in to comment.