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(&pdev->dev, 75 &soc_component_dev_ak4554, 76 &ak4554_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