| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 1 | /* | 
|  | 2 | * FSI-AK464x sound support for ms7724se | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 2009 Renesas Solutions Corp. | 
|  | 5 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | 
|  | 6 | * | 
|  | 7 | * This file is subject to the terms and conditions of the GNU General Public | 
|  | 8 | * License.  See the file "COPYING" in the main directory of this archive | 
|  | 9 | * for more details. | 
|  | 10 | */ | 
|  | 11 |  | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 12 | #include <linux/platform_device.h> | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 13 | #include <sound/sh_fsi.h> | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 14 |  | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 15 | struct fsi_ak4642_data { | 
|  | 16 | const char *name; | 
| Kuninori Morimoto | 806bfed | 2010-12-01 15:50:52 +0900 | [diff] [blame] | 17 | const char *card; | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 18 | const char *cpu_dai; | 
|  | 19 | const char *codec; | 
|  | 20 | const char *platform; | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 21 | int id; | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 22 | }; | 
|  | 23 |  | 
| Liam Girdwood | f0fba2a | 2010-03-17 20:15:21 +0000 | [diff] [blame] | 24 | static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd) | 
| Kuninori Morimoto | 4b6316b | 2010-03-23 16:27:28 +0900 | [diff] [blame] | 25 | { | 
| Kuninori Morimoto | 4d805f7 | 2011-01-20 11:46:02 +0900 | [diff] [blame] | 26 | struct snd_soc_dai *codec = rtd->codec_dai; | 
|  | 27 | struct snd_soc_dai *cpu = rtd->cpu_dai; | 
| Kuninori Morimoto | 4b6316b | 2010-03-23 16:27:28 +0900 | [diff] [blame] | 28 | int ret; | 
|  | 29 |  | 
| Kuninori Morimoto | 4d805f7 | 2011-01-20 11:46:02 +0900 | [diff] [blame] | 30 | ret = snd_soc_dai_set_fmt(codec, SND_SOC_DAIFMT_LEFT_J | | 
|  | 31 | SND_SOC_DAIFMT_CBM_CFM); | 
| Kuninori Morimoto | 0643ce8 | 2010-03-15 18:10:50 +0900 | [diff] [blame] | 32 | if (ret < 0) | 
|  | 33 | return ret; | 
|  | 34 |  | 
| Kuninori Morimoto | 4d805f7 | 2011-01-20 11:46:02 +0900 | [diff] [blame] | 35 | ret = snd_soc_dai_set_sysclk(codec, 0, 11289600, 0); | 
|  | 36 | if (ret < 0) | 
|  | 37 | return ret; | 
|  | 38 |  | 
| Kuninori Morimoto | f17c13c | 2011-01-24 10:43:19 +0900 | [diff] [blame] | 39 | ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_LEFT_J | | 
|  | 40 | SND_SOC_DAIFMT_CBS_CFS); | 
| Kuninori Morimoto | 4b6316b | 2010-03-23 16:27:28 +0900 | [diff] [blame] | 41 |  | 
|  | 42 | return ret; | 
|  | 43 | } | 
|  | 44 |  | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 45 | static struct snd_soc_dai_link fsi_dai_link = { | 
| Liam Girdwood | f0fba2a | 2010-03-17 20:15:21 +0000 | [diff] [blame] | 46 | .codec_dai_name	= "ak4642-hifi", | 
| Kuninori Morimoto | 4b6316b | 2010-03-23 16:27:28 +0900 | [diff] [blame] | 47 | .init		= fsi_ak4642_dai_init, | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 48 | }; | 
|  | 49 |  | 
|  | 50 | static struct snd_soc_card fsi_soc_card  = { | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 51 | .dai_link	= &fsi_dai_link, | 
|  | 52 | .num_links	= 1, | 
|  | 53 | }; | 
|  | 54 |  | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 55 | static struct platform_device *fsi_snd_device; | 
|  | 56 |  | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 57 | static int fsi_ak4642_probe(struct platform_device *pdev) | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 58 | { | 
|  | 59 | int ret = -ENOMEM; | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 60 | const struct platform_device_id	*id_entry; | 
|  | 61 | struct fsi_ak4642_data *pdata; | 
|  | 62 |  | 
|  | 63 | id_entry = pdev->id_entry; | 
|  | 64 | if (!id_entry) { | 
|  | 65 | dev_err(&pdev->dev, "unknown fsi ak4642\n"); | 
|  | 66 | return -ENODEV; | 
|  | 67 | } | 
|  | 68 |  | 
|  | 69 | pdata = (struct fsi_ak4642_data *)id_entry->driver_data; | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 70 |  | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 71 | fsi_snd_device = platform_device_alloc("soc-audio", pdata->id); | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 72 | if (!fsi_snd_device) | 
|  | 73 | goto out; | 
|  | 74 |  | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 75 | fsi_dai_link.name		= pdata->name; | 
|  | 76 | fsi_dai_link.stream_name	= pdata->name; | 
|  | 77 | fsi_dai_link.cpu_dai_name	= pdata->cpu_dai; | 
|  | 78 | fsi_dai_link.platform_name	= pdata->platform; | 
|  | 79 | fsi_dai_link.codec_name		= pdata->codec; | 
| Kuninori Morimoto | 806bfed | 2010-12-01 15:50:52 +0900 | [diff] [blame] | 80 | fsi_soc_card.name		= pdata->card; | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 81 |  | 
| Liam Girdwood | f0fba2a | 2010-03-17 20:15:21 +0000 | [diff] [blame] | 82 | platform_set_drvdata(fsi_snd_device, &fsi_soc_card); | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 83 | ret = platform_device_add(fsi_snd_device); | 
|  | 84 |  | 
|  | 85 | if (ret) | 
|  | 86 | platform_device_put(fsi_snd_device); | 
|  | 87 |  | 
|  | 88 | out: | 
|  | 89 | return ret; | 
|  | 90 | } | 
|  | 91 |  | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 92 | static int fsi_ak4642_remove(struct platform_device *pdev) | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 93 | { | 
|  | 94 | platform_device_unregister(fsi_snd_device); | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 95 | return 0; | 
|  | 96 | } | 
|  | 97 |  | 
|  | 98 | static struct fsi_ak4642_data fsi_a_ak4642 = { | 
|  | 99 | .name		= "AK4642", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 100 | .card		= "FSIA-AK4642", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 101 | .cpu_dai	= "fsia-dai", | 
|  | 102 | .codec		= "ak4642-codec.0-0012", | 
|  | 103 | .platform	= "sh_fsi.0", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 104 | .id		= FSI_PORT_A, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 105 | }; | 
|  | 106 |  | 
|  | 107 | static struct fsi_ak4642_data fsi_b_ak4642 = { | 
|  | 108 | .name		= "AK4642", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 109 | .card		= "FSIB-AK4642", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 110 | .cpu_dai	= "fsib-dai", | 
|  | 111 | .codec		= "ak4642-codec.0-0012", | 
|  | 112 | .platform	= "sh_fsi.0", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 113 | .id		= FSI_PORT_B, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 114 | }; | 
|  | 115 |  | 
|  | 116 | static struct fsi_ak4642_data fsi_a_ak4643 = { | 
|  | 117 | .name		= "AK4643", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 118 | .card		= "FSIA-AK4643", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 119 | .cpu_dai	= "fsia-dai", | 
|  | 120 | .codec		= "ak4642-codec.0-0013", | 
|  | 121 | .platform	= "sh_fsi.0", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 122 | .id		= FSI_PORT_A, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 123 | }; | 
|  | 124 |  | 
|  | 125 | static struct fsi_ak4642_data fsi_b_ak4643 = { | 
|  | 126 | .name		= "AK4643", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 127 | .card		= "FSIB-AK4643", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 128 | .cpu_dai	= "fsib-dai", | 
|  | 129 | .codec		= "ak4642-codec.0-0013", | 
|  | 130 | .platform	= "sh_fsi.0", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 131 | .id		= FSI_PORT_B, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 132 | }; | 
|  | 133 |  | 
|  | 134 | static struct fsi_ak4642_data fsi2_a_ak4642 = { | 
|  | 135 | .name		= "AK4642", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 136 | .card		= "FSI2A-AK4642", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 137 | .cpu_dai	= "fsia-dai", | 
|  | 138 | .codec		= "ak4642-codec.0-0012", | 
|  | 139 | .platform	= "sh_fsi2", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 140 | .id		= FSI_PORT_A, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 141 | }; | 
|  | 142 |  | 
|  | 143 | static struct fsi_ak4642_data fsi2_b_ak4642 = { | 
|  | 144 | .name		= "AK4642", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 145 | .card		= "FSI2B-AK4642", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 146 | .cpu_dai	= "fsib-dai", | 
|  | 147 | .codec		= "ak4642-codec.0-0012", | 
|  | 148 | .platform	= "sh_fsi2", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 149 | .id		= FSI_PORT_B, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 150 | }; | 
|  | 151 |  | 
|  | 152 | static struct fsi_ak4642_data fsi2_a_ak4643 = { | 
|  | 153 | .name		= "AK4643", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 154 | .card		= "FSI2A-AK4643", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 155 | .cpu_dai	= "fsia-dai", | 
|  | 156 | .codec		= "ak4642-codec.0-0013", | 
|  | 157 | .platform	= "sh_fsi2", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 158 | .id		= FSI_PORT_A, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 159 | }; | 
|  | 160 |  | 
|  | 161 | static struct fsi_ak4642_data fsi2_b_ak4643 = { | 
|  | 162 | .name		= "AK4643", | 
| Kuninori Morimoto | 505b04e | 2011-07-05 00:15:04 -0700 | [diff] [blame] | 163 | .card		= "FSI2B-AK4643", | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 164 | .cpu_dai	= "fsib-dai", | 
|  | 165 | .codec		= "ak4642-codec.0-0013", | 
|  | 166 | .platform	= "sh_fsi2", | 
| Kuninori Morimoto | a193436 | 2011-01-12 15:32:07 +0900 | [diff] [blame] | 167 | .id		= FSI_PORT_B, | 
| Kuninori Morimoto | c8d6bf9 | 2010-11-30 11:32:04 +0900 | [diff] [blame] | 168 | }; | 
|  | 169 |  | 
|  | 170 | static struct platform_device_id fsi_id_table[] = { | 
|  | 171 | /* FSI */ | 
|  | 172 | { "sh_fsi_a_ak4642",	(kernel_ulong_t)&fsi_a_ak4642 }, | 
|  | 173 | { "sh_fsi_b_ak4642",	(kernel_ulong_t)&fsi_b_ak4642 }, | 
|  | 174 | { "sh_fsi_a_ak4643",	(kernel_ulong_t)&fsi_a_ak4643 }, | 
|  | 175 | { "sh_fsi_b_ak4643",	(kernel_ulong_t)&fsi_b_ak4643 }, | 
|  | 176 |  | 
|  | 177 | /* FSI 2 */ | 
|  | 178 | { "sh_fsi2_a_ak4642",	(kernel_ulong_t)&fsi2_a_ak4642 }, | 
|  | 179 | { "sh_fsi2_b_ak4642",	(kernel_ulong_t)&fsi2_b_ak4642 }, | 
|  | 180 | { "sh_fsi2_a_ak4643",	(kernel_ulong_t)&fsi2_a_ak4643 }, | 
|  | 181 | { "sh_fsi2_b_ak4643",	(kernel_ulong_t)&fsi2_b_ak4643 }, | 
|  | 182 | {}, | 
|  | 183 | }; | 
|  | 184 |  | 
|  | 185 | static struct platform_driver fsi_ak4642 = { | 
|  | 186 | .driver = { | 
|  | 187 | .name	= "fsi-ak4642-audio", | 
|  | 188 | }, | 
|  | 189 | .probe		= fsi_ak4642_probe, | 
|  | 190 | .remove		= fsi_ak4642_remove, | 
|  | 191 | .id_table	= fsi_id_table, | 
|  | 192 | }; | 
|  | 193 |  | 
|  | 194 | static int __init fsi_ak4642_init(void) | 
|  | 195 | { | 
|  | 196 | return platform_driver_register(&fsi_ak4642); | 
|  | 197 | } | 
|  | 198 |  | 
|  | 199 | static void __exit fsi_ak4642_exit(void) | 
|  | 200 | { | 
|  | 201 | platform_driver_unregister(&fsi_ak4642); | 
| Kuninori Morimoto | b8e583f | 2009-08-21 09:42:59 +0900 | [diff] [blame] | 202 | } | 
|  | 203 |  | 
|  | 204 | module_init(fsi_ak4642_init); | 
|  | 205 | module_exit(fsi_ak4642_exit); | 
|  | 206 |  | 
|  | 207 | MODULE_LICENSE("GPL"); | 
|  | 208 | MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card"); | 
|  | 209 | MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>"); |