Commit | Line | Data |
---|---|---|
a2911cdb KM |
1 | /* |
2 | * ak4554.c | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Solutions Corp. | |
5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | ||
12 | #include <linux/module.h> | |
13 | #include <sound/soc.h> | |
14 | ||
15 | /* | |
16 | * ak4554 is very simple DA/AD converter which has no setting register. | |
17 | * | |
18 | * CAUTION | |
19 | * | |
20 | * ak4554 playback format is SND_SOC_DAIFMT_RIGHT_J, | |
21 | * and, capture format is SND_SOC_DAIFMT_LEFT_J | |
22 | * on same bit clock, LR clock. | |
23 | * But, this driver doesn't have snd_soc_dai_ops :: set_fmt | |
24 | * | |
25 | * CPU/Codec DAI image | |
26 | * | |
27 | * CPU-DAI1 (plaback only fmt = RIGHT_J) --+-- ak4554 | |
28 | * | | |
29 | * CPU-DAI2 (capture only fmt = LEFT_J) ---+ | |
30 | */ | |
31 | ||
4601736a MB |
32 | static const struct snd_soc_dapm_widget ak4554_dapm_widgets[] = { |
33 | SND_SOC_DAPM_INPUT("AINL"), | |
34 | SND_SOC_DAPM_INPUT("AINR"), | |
35 | ||
36 | SND_SOC_DAPM_OUTPUT("AOUTL"), | |
37 | SND_SOC_DAPM_OUTPUT("AOUTR"), | |
38 | }; | |
39 | ||
40 | static const struct snd_soc_dapm_route ak4554_dapm_routes[] = { | |
41 | { "Capture", NULL, "AINL" }, | |
42 | { "Capture", NULL, "AINR" }, | |
43 | ||
44 | { "AOUTL", NULL, "Playback" }, | |
45 | { "AOUTR", NULL, "Playback" }, | |
46 | }; | |
47 | ||
a2911cdb KM |
48 | static struct snd_soc_dai_driver ak4554_dai = { |
49 | .name = "ak4554-hifi", | |
50 | .playback = { | |
51 | .stream_name = "Playback", | |
52 | .channels_min = 2, | |
53 | .channels_max = 2, | |
54 | .rates = SNDRV_PCM_RATE_8000_48000, | |
55 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | |
56 | }, | |
57 | .capture = { | |
58 | .stream_name = "Capture", | |
59 | .channels_min = 2, | |
60 | .channels_max = 2, | |
61 | .rates = SNDRV_PCM_RATE_8000_48000, | |
62 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | |
63 | }, | |
64 | .symmetric_rates = 1, | |
65 | }; | |
66 | ||
67 | static struct snd_soc_codec_driver soc_codec_dev_ak4554 = { | |
4601736a MB |
68 | .dapm_widgets = ak4554_dapm_widgets, |
69 | .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), | |
70 | .dapm_routes = ak4554_dapm_routes, | |
71 | .num_dapm_routes = ARRAY_SIZE(ak4554_dapm_routes), | |
a2911cdb KM |
72 | }; |
73 | ||
74 | static int ak4554_soc_probe(struct platform_device *pdev) | |
75 | { | |
76 | return snd_soc_register_codec(&pdev->dev, | |
77 | &soc_codec_dev_ak4554, | |
78 | &ak4554_dai, 1); | |
79 | } | |
80 | ||
81 | static int ak4554_soc_remove(struct platform_device *pdev) | |
82 | { | |
83 | snd_soc_unregister_codec(&pdev->dev); | |
84 | return 0; | |
85 | } | |
86 | ||
f7d4bfee | 87 | static const struct of_device_id ak4554_of_match[] = { |
b25f7781 KM |
88 | { .compatible = "asahi-kasei,ak4554" }, |
89 | {}, | |
90 | }; | |
91 | MODULE_DEVICE_TABLE(of, ak4554_of_match); | |
92 | ||
a2911cdb KM |
93 | static struct platform_driver ak4554_driver = { |
94 | .driver = { | |
95 | .name = "ak4554-adc-dac", | |
b25f7781 | 96 | .of_match_table = ak4554_of_match, |
a2911cdb KM |
97 | }, |
98 | .probe = ak4554_soc_probe, | |
99 | .remove = ak4554_soc_remove, | |
100 | }; | |
101 | module_platform_driver(ak4554_driver); | |
102 | ||
103 | MODULE_LICENSE("GPL"); | |
104 | MODULE_DESCRIPTION("SoC AK4554 driver"); | |
105 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); |