ALSA SoCドライバメモ No.002 private data

 ALSA SoCドライバ開発でいちいちgrepするのが面倒な情報をメモしておく

それぞれのドライバでprivate dataをどこに置くのか?

dai link

  • snd_soc_cardが自分の持ち物
  • 設定方法 (probe時にsnd_soc_register_card前にやる) snd_soc_card_set_drvdata(&hoge_card, priv);
  • 参照方法
    • いろいろ面倒だが、stream->runtime->cardまで辿れば読める
struct snd_soc_pcm_runtime *rtd = substream->private_data; // streamから
struct snd_soc_card *card = rtd->card; // runtimeから
struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); // mixerから
struct hoge_priv *priv = snd_soc_card_get_drvdata(card);

cpu dai

  • platform_device配下のdev pdev->dev
  • 設定方法 dev_set_drvdata(&pdev->dev, priv); snd_soc_add_dai_controls(dai, ... // mixerに設定
  • 参照方法
    • struct snd_soc_dai daiから取れる struct hoge_priv priv = snd_soc_dai_get_drvdata(dai);

    struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); // mixerから

codec

  • platform_device配下のdevかstruct i2c_client配下のdev pdev->dev i2c_client->dev
  • 設定方法 i2c_set_clientdata(i2c, priv); dev_set_drvdata(dev, priv);

  • 参照方法

    • mixerから struct snd_soc_codec codec = snd_soc_kcontrol_codec(kcontrol); struct hoge_priv priv = snd_soc_codec_get_drvdata(codec);

    • struct snd_soc_dai daiから struct snd_soc_codec codec = dai->codec; struct hoge_priv *priv = snd_soc_codec_get_drvdata(codec);