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 struct snd_soc_codec_driver soc_codec_dev_ak4554 = { 68 .component_driver = { 69 .dapm_widgets = ak4554_dapm_widgets, 70 .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), 71 .dapm_routes = ak4554_dapm_routes, 72 .num_dapm_routes = ARRAY_SIZE(ak4554_dapm_routes), 73 }, 74 }; 75 76 static int ak4554_soc_probe(struct platform_device *pdev) 77 { 78 return snd_soc_register_codec(&pdev->dev, 79 &soc_codec_dev_ak4554, 80 &ak4554_dai, 1); 81 } 82 83 static int ak4554_soc_remove(struct platform_device *pdev) 84 { 85 snd_soc_unregister_codec(&pdev->dev); 86 return 0; 87 } 88 89 static const struct of_device_id ak4554_of_match[] = { 90 { .compatible = "asahi-kasei,ak4554" }, 91 {}, 92 }; 93 MODULE_DEVICE_TABLE(of, ak4554_of_match); 94 95 static struct platform_driver ak4554_driver = { 96 .driver = { 97 .name = "ak4554-adc-dac", 98 .of_match_table = ak4554_of_match, 99 }, 100 .probe = ak4554_soc_probe, 101 .remove = ak4554_soc_remove, 102 }; 103 module_platform_driver(ak4554_driver); 104 105 MODULE_LICENSE("GPL"); 106 MODULE_DESCRIPTION("SoC AK4554 driver"); 107 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); 108