1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // ak4554.c |
3 | // |
4 | // Copyright (C) 2013 Renesas Solutions Corp. |
5 | // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
6 | |
7 | #include <linux/module.h> |
8 | #include <sound/soc.h> |
9 | |
10 | /* |
11 | * ak4554 is very simple DA/AD converter which has no setting register. |
12 | * |
13 | * CAUTION |
14 | * |
15 | * ak4554 playback format is SND_SOC_DAIFMT_RIGHT_J, |
16 | * and, capture format is SND_SOC_DAIFMT_LEFT_J |
17 | * on same bit clock, LR clock. |
18 | * But, this driver doesn't have snd_soc_dai_ops :: set_fmt |
19 | * |
20 | * CPU/Codec DAI image |
21 | * |
22 | * CPU-DAI1 (plaback only fmt = RIGHT_J) --+-- ak4554 |
23 | * | |
24 | * CPU-DAI2 (capture only fmt = LEFT_J) ---+ |
25 | */ |
26 | |
27 | static const struct snd_soc_dapm_widget ak4554_dapm_widgets[] = { |
28 | SND_SOC_DAPM_INPUT("AINL" ), |
29 | SND_SOC_DAPM_INPUT("AINR" ), |
30 | |
31 | SND_SOC_DAPM_OUTPUT("AOUTL" ), |
32 | SND_SOC_DAPM_OUTPUT("AOUTR" ), |
33 | }; |
34 | |
35 | static const struct snd_soc_dapm_route ak4554_dapm_routes[] = { |
36 | { "Capture" , NULL, "AINL" }, |
37 | { "Capture" , NULL, "AINR" }, |
38 | |
39 | { "AOUTL" , NULL, "Playback" }, |
40 | { "AOUTR" , NULL, "Playback" }, |
41 | }; |
42 | |
43 | static struct snd_soc_dai_driver ak4554_dai = { |
44 | .name = "ak4554-hifi" , |
45 | .playback = { |
46 | .stream_name = "Playback" , |
47 | .channels_min = 2, |
48 | .channels_max = 2, |
49 | .rates = SNDRV_PCM_RATE_8000_48000, |
50 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
51 | }, |
52 | .capture = { |
53 | .stream_name = "Capture" , |
54 | .channels_min = 2, |
55 | .channels_max = 2, |
56 | .rates = SNDRV_PCM_RATE_8000_48000, |
57 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
58 | }, |
59 | .symmetric_rate = 1, |
60 | }; |
61 | |
62 | static const struct snd_soc_component_driver soc_component_dev_ak4554 = { |
63 | .dapm_widgets = ak4554_dapm_widgets, |
64 | .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), |
65 | .dapm_routes = ak4554_dapm_routes, |
66 | .num_dapm_routes = ARRAY_SIZE(ak4554_dapm_routes), |
67 | .idle_bias_on = 1, |
68 | .use_pmdown_time = 1, |
69 | .endianness = 1, |
70 | }; |
71 | |
72 | static int ak4554_soc_probe(struct platform_device *pdev) |
73 | { |
74 | return devm_snd_soc_register_component(dev: &pdev->dev, |
75 | component_driver: &soc_component_dev_ak4554, |
76 | dai_drv: &ak4554_dai, num_dai: 1); |
77 | } |
78 | |
79 | static const struct of_device_id ak4554_of_match[] = { |
80 | { .compatible = "asahi-kasei,ak4554" }, |
81 | {}, |
82 | }; |
83 | MODULE_DEVICE_TABLE(of, ak4554_of_match); |
84 | |
85 | static struct platform_driver ak4554_driver = { |
86 | .driver = { |
87 | .name = "ak4554-adc-dac" , |
88 | .of_match_table = ak4554_of_match, |
89 | }, |
90 | .probe = ak4554_soc_probe, |
91 | }; |
92 | module_platform_driver(ak4554_driver); |
93 | |
94 | MODULE_LICENSE("GPL v2" ); |
95 | MODULE_DESCRIPTION("SoC AK4554 driver" ); |
96 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>" ); |
97 | |