*参照元 [#i2602357] #backlinks *説明 [#e067dd67] FIXME: なにをするもの? -ALSA SoC Layer --DAPM(Dynamic Audio Power Management) --- --DAI(Digital Audio Interfaces) --- **参考 [#b6bb99c9] **関連モジュール [#m8242ada] 必要そうなものメモ。 - --[[linux-4.4.1/snd_soc_platform_driver]] --[[linux-4.4.1/snd_soc_register_platform()]] - --[[linux-4.4.1/snd_soc_component_driver]] --[[linux-4.4.1/snd_soc_dai_driver]] --[[linux-4.4.1/snd_soc_register_component()]] - --[[linux-4.4.1/snd_soc_register_card()]] ** 例 [#na2337a3] platform_bus を使う場合、 struct hoge_device { struct snd_soc_card card; }; static int hoge_probe(struct platform_device *pdev) { struct hoge_device *d; struct device *dev = &pdev->dev; ... d = devm_kzalloc(dev, sizeof(struct hoge_device)); ... snd_soc_register_platform(dev, &hoge_snd_soc_platform_driver); ... snd_soc_register_component(dev, &hoge_snd_soc_component_driver, hoge_snd_soc_dai_drivers, ARRAY_SIZE(hoge_snd_soc_dai_drivers)); ... //FIXME: 他の手立てがありそう d->card.dev = dev; snd_soc_card_set_drvdata(&d->card, d); snd_soc_register_card(&d->card); ... return 0; } -ドライバの固有情報の保存場所について --pdev->dev と d->card.dev が同じ device を指しているため、platform_set_drvdata() で pdev->dev->driver_data に書くのは NG です。 --snd_soc_register_card() が card->dev->driver_data を上書きするため、消えてしまいます。 --おそらく snd_soc_card_set_drvdata() を使って、card->drvdata に保存すべきでしょう。 --[[linux-4.4.1/platform_get_drvdata()]] --[[linux-4.4.1/platform_set_drvdata()]] --[[linux-4.4.1/snd_soc_card_get_drvdata()]] --[[linux-4.4.1/snd_soc_card_set_drvdata()]] static int hoge_remove(struct platform_device *pdev) { struct snd_soc_card *card = platform_get_drvdata(pdev); struct hoge_device *d = snd_soc_card_get_drvdata(card); struct device *dev = &pdev->dev; ... snd_soc_unregister_card(&d->card); ... snd_soc_unregister_component(dev); ... snd_soc_unregister_platform(dev); ... return 0; } static struct platform_driver hoge_driver = { .driver = { .name = "hoge", }, .probe = hoge_probe, .remove = hoge_remove, }; module_platform_driver(hoge_driver); *コメント [#vd3dc98b]