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 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 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 const struct snd_soc_component_driver soc_component_dev_ak4554 = { 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), 72 .idle_bias_on = 1, 73 .use_pmdown_time = 1, 74 .endianness = 1, 75 .non_legacy_dai_naming = 1, 76 }; 77 78 static int ak4554_soc_probe(struct platform_device *pdev) 79 { 80 return devm_snd_soc_register_component(&pdev->dev, 81 &soc_component_dev_ak4554, 82 &ak4554_dai, 1); 83 } 84 85 static const struct of_device_id ak4554_of_match[] = { 86 { .compatible = "asahi-kasei,ak4554" }, 87 {}, 88 }; 89 MODULE_DEVICE_TABLE(of, ak4554_of_match); 90 91 static struct platform_driver ak4554_driver = { 92 .driver = { 93 .name = "ak4554-adc-dac", 94 .of_match_table = ak4554_of_match, 95 }, 96 .probe = ak4554_soc_probe, 97 }; 98 module_platform_driver(ak4554_driver); 99 100 MODULE_LICENSE("GPL"); 101 MODULE_DESCRIPTION("SoC AK4554 driver"); 102 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); 103