~ctf/alsa-driver/tiwai-trunk2.bazooka_dock

« back to all changes in this revision

Viewing changes to soc/codecs/ac97.c

  • Committer: Canonistack server
  • Date: 2015-01-22 13:04:34 UTC
  • Revision ID: david.henningsson@canonical.com-20150122130434-q48cfdp8ovzgqhe7
Test run of 623 machines: 3 failing with 3 errors and 0 warnings.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * ac97.c  --  ALSA Soc AC97 codec support
 
3
 *
 
4
 * Copyright 2005 Wolfson Microelectronics PLC.
 
5
 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
 
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
 * Generic AC97 support.
 
13
 */
 
14
 
 
15
#include <linux/init.h>
 
16
#include <linux/slab.h>
 
17
#include <linux/kernel.h>
 
18
#include <linux/device.h>
 
19
#include <linux/module.h>
 
20
#include <sound/core.h>
 
21
#include <sound/pcm.h>
 
22
#include <sound/ac97_codec.h>
 
23
#include <sound/initval.h>
 
24
#include <sound/soc.h>
 
25
 
 
26
static const struct snd_soc_dapm_widget ac97_widgets[] = {
 
27
        SND_SOC_DAPM_INPUT("RX"),
 
28
        SND_SOC_DAPM_OUTPUT("TX"),
 
29
};
 
30
 
 
31
static const struct snd_soc_dapm_route ac97_routes[] = {
 
32
        { "AC97 Capture", NULL, "RX" },
 
33
        { "TX", NULL, "AC97 Playback" },
 
34
};
 
35
 
 
36
static int ac97_prepare(struct snd_pcm_substream *substream,
 
37
                        struct snd_soc_dai *dai)
 
38
{
 
39
        struct snd_soc_codec *codec = dai->codec;
 
40
        struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
 
41
 
 
42
        int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
 
43
                  AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE;
 
44
        return snd_ac97_set_rate(ac97, reg, substream->runtime->rate);
 
45
}
 
46
 
 
47
#define STD_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
 
48
                SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
 
49
                SNDRV_PCM_RATE_48000)
 
50
 
 
51
static const struct snd_soc_dai_ops ac97_dai_ops = {
 
52
        .prepare        = ac97_prepare,
 
53
};
 
54
 
 
55
static struct snd_soc_dai_driver ac97_dai = {
 
56
        .name = "ac97-hifi",
 
57
        .playback = {
 
58
                .stream_name = "AC97 Playback",
 
59
                .channels_min = 1,
 
60
                .channels_max = 2,
 
61
                .rates = STD_AC97_RATES,
 
62
                .formats = SND_SOC_STD_AC97_FMTS,},
 
63
        .capture = {
 
64
                .stream_name = "AC97 Capture",
 
65
                .channels_min = 1,
 
66
                .channels_max = 2,
 
67
                .rates = STD_AC97_RATES,
 
68
                .formats = SND_SOC_STD_AC97_FMTS,},
 
69
        .ops = &ac97_dai_ops,
 
70
};
 
71
 
 
72
static int ac97_soc_probe(struct snd_soc_codec *codec)
 
73
{
 
74
        struct snd_ac97 *ac97;
 
75
        struct snd_ac97_bus *ac97_bus;
 
76
        struct snd_ac97_template ac97_template;
 
77
        int ret;
 
78
 
 
79
        /* add codec as bus device for standard ac97 */
 
80
        ret = snd_ac97_bus(codec->component.card->snd_card, 0, soc_ac97_ops,
 
81
                           NULL, &ac97_bus);
 
82
        if (ret < 0)
 
83
                return ret;
 
84
 
 
85
        memset(&ac97_template, 0, sizeof(struct snd_ac97_template));
 
86
        ret = snd_ac97_mixer(ac97_bus, &ac97_template, &ac97);
 
87
        if (ret < 0)
 
88
                return ret;
 
89
 
 
90
        snd_soc_codec_set_drvdata(codec, ac97);
 
91
 
 
92
        return 0;
 
93
}
 
94
 
 
95
#ifdef CONFIG_PM
 
96
static int ac97_soc_suspend(struct snd_soc_codec *codec)
 
97
{
 
98
        struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
 
99
 
 
100
        snd_ac97_suspend(ac97);
 
101
 
 
102
        return 0;
 
103
}
 
104
 
 
105
static int ac97_soc_resume(struct snd_soc_codec *codec)
 
106
{
 
107
 
 
108
        struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
 
109
 
 
110
        snd_ac97_resume(ac97);
 
111
 
 
112
        return 0;
 
113
}
 
114
#else
 
115
#define ac97_soc_suspend NULL
 
116
#define ac97_soc_resume NULL
 
117
#endif
 
118
 
 
119
static struct snd_soc_codec_driver soc_codec_dev_ac97 = {
 
120
        .probe =        ac97_soc_probe,
 
121
        .suspend =      ac97_soc_suspend,
 
122
        .resume =       ac97_soc_resume,
 
123
 
 
124
        .dapm_widgets = ac97_widgets,
 
125
        .num_dapm_widgets = ARRAY_SIZE(ac97_widgets),
 
126
        .dapm_routes = ac97_routes,
 
127
        .num_dapm_routes = ARRAY_SIZE(ac97_routes),
 
128
};
 
129
 
 
130
static int ac97_probe(struct platform_device *pdev)
 
131
{
 
132
        return snd_soc_register_codec(&pdev->dev,
 
133
                        &soc_codec_dev_ac97, &ac97_dai, 1);
 
134
}
 
135
 
 
136
static int ac97_remove(struct platform_device *pdev)
 
137
{
 
138
        snd_soc_unregister_codec(&pdev->dev);
 
139
        return 0;
 
140
}
 
141
 
 
142
static struct platform_driver ac97_codec_driver = {
 
143
        .driver = {
 
144
                .name = "ac97-codec",
 
145
        },
 
146
 
 
147
        .probe = ac97_probe,
 
148
        .remove = ac97_remove,
 
149
};
 
150
 
 
151
module_platform_driver(ac97_codec_driver);
 
152
 
 
153
MODULE_DESCRIPTION("Soc Generic AC97 driver");
 
154
MODULE_AUTHOR("Liam Girdwood");
 
155
MODULE_LICENSE("GPL");
 
156
MODULE_ALIAS("platform:ac97-codec");