Commit | Line | Data |
---|---|---|
efc4720d MB |
1 | /* |
2 | * This is a simple driver for the GTM601 Voice PCM interface | |
3 | * | |
4 | * Copyright (C) 2015 Goldelico GmbH | |
5 | * | |
6 | * Author: Marek Belisko <marek@goldelico.com> | |
7 | * | |
8 | * Based on wm8727.c driver | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License version 2 as | |
12 | * published by the Free Software Foundation. | |
13 | */ | |
14 | ||
15 | #include <linux/init.h> | |
16 | #include <linux/slab.h> | |
17 | #include <linux/module.h> | |
18 | #include <linux/kernel.h> | |
19 | #include <linux/device.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 gtm601_dapm_widgets[] = { | |
27 | SND_SOC_DAPM_OUTPUT("AOUT"), | |
28 | SND_SOC_DAPM_INPUT("AIN"), | |
29 | }; | |
30 | ||
31 | static const struct snd_soc_dapm_route gtm601_dapm_routes[] = { | |
32 | { "AOUT", NULL, "Playback" }, | |
33 | { "Capture", NULL, "AIN" }, | |
34 | }; | |
35 | ||
beb5f865 | 36 | static struct snd_soc_dai_driver gtm601_dai = { |
efc4720d MB |
37 | .name = "gtm601", |
38 | .playback = { | |
39 | .stream_name = "Playback", | |
40 | .channels_min = 1, | |
41 | .channels_max = 1, | |
42 | .rates = SNDRV_PCM_RATE_8000, | |
43 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | |
44 | }, | |
45 | .capture = { | |
46 | .stream_name = "Capture", | |
47 | .channels_min = 1, | |
48 | .channels_max = 1, | |
49 | .rates = SNDRV_PCM_RATE_8000, | |
50 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | |
51 | }, | |
52 | }; | |
53 | ||
02a9547e | 54 | static const struct snd_soc_codec_driver soc_codec_dev_gtm601 = { |
efc4720d MB |
55 | .dapm_widgets = gtm601_dapm_widgets, |
56 | .num_dapm_widgets = ARRAY_SIZE(gtm601_dapm_widgets), | |
57 | .dapm_routes = gtm601_dapm_routes, | |
58 | .num_dapm_routes = ARRAY_SIZE(gtm601_dapm_routes), | |
59 | }; | |
60 | ||
61 | static int gtm601_platform_probe(struct platform_device *pdev) | |
62 | { | |
63 | return snd_soc_register_codec(&pdev->dev, | |
64 | &soc_codec_dev_gtm601, >m601_dai, 1); | |
65 | } | |
66 | ||
67 | static int gtm601_platform_remove(struct platform_device *pdev) | |
68 | { | |
69 | snd_soc_unregister_codec(&pdev->dev); | |
70 | return 0; | |
71 | } | |
72 | ||
efc4720d MB |
73 | #if defined(CONFIG_OF) |
74 | static const struct of_device_id gtm601_codec_of_match[] = { | |
75 | { .compatible = "option,gtm601", }, | |
76 | {}, | |
77 | }; | |
78 | MODULE_DEVICE_TABLE(of, gtm601_codec_of_match); | |
79 | #endif | |
80 | ||
81 | static struct platform_driver gtm601_codec_driver = { | |
82 | .driver = { | |
02a9547e AL |
83 | .name = "gtm601", |
84 | .of_match_table = of_match_ptr(gtm601_codec_of_match), | |
efc4720d | 85 | }, |
efc4720d MB |
86 | .probe = gtm601_platform_probe, |
87 | .remove = gtm601_platform_remove, | |
88 | }; | |
89 | ||
90 | module_platform_driver(gtm601_codec_driver); | |
91 | ||
92 | MODULE_DESCRIPTION("ASoC gtm601 driver"); | |
93 | MODULE_AUTHOR("Marek Belisko <marek@goldelico.com>"); | |
94 | MODULE_LICENSE("GPL"); | |
d4979631 | 95 | MODULE_ALIAS("platform:gtm601"); |