linux/sound/soc/codecs/ad73311.c
<<
>>
Prefs
   1/*
   2 * ad73311.c  --  ALSA Soc AD73311 codec support
   3 *
   4 * Copyright:   Analog Device Inc.
   5 * Author:      Cliff Cai <cliff.cai@analog.com>
   6 *
   7 *  This program is free software; you can redistribute  it and/or modify it
   8 *  under  the terms of  the GNU General  Public License as published by the
   9 *  Free Software Foundation;  either version 2 of the  License, or (at your
  10 *  option) any later version.
  11 */
  12
  13#include <linux/init.h>
  14#include <linux/module.h>
  15#include <linux/kernel.h>
  16#include <linux/device.h>
  17#include <sound/core.h>
  18#include <sound/pcm.h>
  19#include <sound/ac97_codec.h>
  20#include <sound/initval.h>
  21#include <sound/soc.h>
  22
  23#include "ad73311.h"
  24
  25struct snd_soc_dai ad73311_dai = {
  26        .name = "AD73311",
  27        .playback = {
  28                .stream_name = "Playback",
  29                .channels_min = 1,
  30                .channels_max = 1,
  31                .rates = SNDRV_PCM_RATE_8000,
  32                .formats = SNDRV_PCM_FMTBIT_S16_LE, },
  33        .capture = {
  34                .stream_name = "Capture",
  35                .channels_min = 1,
  36                .channels_max = 1,
  37                .rates = SNDRV_PCM_RATE_8000,
  38                .formats = SNDRV_PCM_FMTBIT_S16_LE, },
  39};
  40EXPORT_SYMBOL_GPL(ad73311_dai);
  41
  42static int ad73311_soc_probe(struct platform_device *pdev)
  43{
  44        struct snd_soc_device *socdev = platform_get_drvdata(pdev);
  45        struct snd_soc_codec *codec;
  46        int ret = 0;
  47
  48        codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
  49        if (codec == NULL)
  50                return -ENOMEM;
  51        mutex_init(&codec->mutex);
  52        codec->name = "AD73311";
  53        codec->owner = THIS_MODULE;
  54        codec->dai = &ad73311_dai;
  55        codec->num_dai = 1;
  56        socdev->card->codec = codec;
  57        INIT_LIST_HEAD(&codec->dapm_widgets);
  58        INIT_LIST_HEAD(&codec->dapm_paths);
  59
  60        /* register pcms */
  61        ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
  62        if (ret < 0) {
  63                printk(KERN_ERR "ad73311: failed to create pcms\n");
  64                goto pcm_err;
  65        }
  66
  67        ret = snd_soc_init_card(socdev);
  68        if (ret < 0) {
  69                printk(KERN_ERR "ad73311: failed to register card\n");
  70                goto register_err;
  71        }
  72
  73        return ret;
  74
  75register_err:
  76        snd_soc_free_pcms(socdev);
  77pcm_err:
  78        kfree(socdev->card->codec);
  79        socdev->card->codec = NULL;
  80        return ret;
  81}
  82
  83static int ad73311_soc_remove(struct platform_device *pdev)
  84{
  85        struct snd_soc_device *socdev = platform_get_drvdata(pdev);
  86        struct snd_soc_codec *codec = socdev->card->codec;
  87
  88        if (codec == NULL)
  89                return 0;
  90        snd_soc_free_pcms(socdev);
  91        kfree(codec);
  92        return 0;
  93}
  94
  95struct snd_soc_codec_device soc_codec_dev_ad73311 = {
  96        .probe =        ad73311_soc_probe,
  97        .remove =       ad73311_soc_remove,
  98};
  99EXPORT_SYMBOL_GPL(soc_codec_dev_ad73311);
 100
 101static int __init ad73311_init(void)
 102{
 103        return snd_soc_register_dai(&ad73311_dai);
 104}
 105module_init(ad73311_init);
 106
 107static void __exit ad73311_exit(void)
 108{
 109        snd_soc_unregister_dai(&ad73311_dai);
 110}
 111module_exit(ad73311_exit);
 112
 113MODULE_DESCRIPTION("ASoC ad73311 driver");
 114MODULE_AUTHOR("Cliff Cai ");
 115MODULE_LICENSE("GPL");
 116