| OLD | NEW |
| 1 /* | 1 /* |
| 2 * FSI-AK464x sound support for ms7724se | 2 * FSI-AK464x sound support for ms7724se |
| 3 * | 3 * |
| 4 * Copyright (C) 2009 Renesas Solutions Corp. | 4 * Copyright (C) 2009 Renesas Solutions Corp. |
| 5 * Kuninori Morimoto <morimoto.kuninori@renesas.com> | 5 * Kuninori Morimoto <morimoto.kuninori@renesas.com> |
| 6 * | 6 * |
| 7 * This file is subject to the terms and conditions of the GNU General Public | 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 | 8 * License. See the file "COPYING" in the main directory of this archive |
| 9 * for more details. | 9 * for more details. |
| 10 */ | 10 */ |
| 11 | 11 |
| 12 #include <linux/platform_device.h> | 12 #include <linux/platform_device.h> |
| 13 #include <sound/sh_fsi.h> | 13 #include <sound/sh_fsi.h> |
| 14 | 14 |
| 15 struct fsi_ak4642_data { |
| 16 const char *name; |
| 17 const char *card; |
| 18 const char *cpu_dai; |
| 19 const char *codec; |
| 20 const char *platform; |
| 21 int id; |
| 22 }; |
| 23 |
| 15 static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd) | 24 static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd) |
| 16 { | 25 { |
| 17 » struct snd_soc_dai *dai = rtd->codec_dai; | 26 » struct snd_soc_dai *codec = rtd->codec_dai; |
| 27 » struct snd_soc_dai *cpu = rtd->cpu_dai; |
| 18 int ret; | 28 int ret; |
| 19 | 29 |
| 20 » ret = snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_CBM_CFM); | 30 » ret = snd_soc_dai_set_fmt(codec, SND_SOC_DAIFMT_LEFT_J | |
| 31 » » » » » SND_SOC_DAIFMT_CBM_CFM); |
| 21 if (ret < 0) | 32 if (ret < 0) |
| 22 return ret; | 33 return ret; |
| 23 | 34 |
| 24 » ret = snd_soc_dai_set_sysclk(dai, 0, 11289600, 0); | 35 » ret = snd_soc_dai_set_sysclk(codec, 0, 11289600, 0); |
| 36 » if (ret < 0) |
| 37 » » return ret; |
| 38 |
| 39 » ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_LEFT_J | |
| 40 » » » » SND_SOC_DAIFMT_CBS_CFS); |
| 25 | 41 |
| 26 return ret; | 42 return ret; |
| 27 } | 43 } |
| 28 | 44 |
| 29 static struct snd_soc_dai_link fsi_dai_link = { | 45 static struct snd_soc_dai_link fsi_dai_link = { |
| 30 .name = "AK4642", | |
| 31 .stream_name = "AK4642", | |
| 32 .cpu_dai_name = "fsia-dai", /* fsi A */ | |
| 33 .codec_dai_name = "ak4642-hifi", | 46 .codec_dai_name = "ak4642-hifi", |
| 34 #ifdef CONFIG_MACH_AP4EVB | |
| 35 .platform_name = "sh_fsi2", | |
| 36 .codec_name = "ak4642-codec.0-0013", | |
| 37 #else | |
| 38 .platform_name = "sh_fsi.0", | |
| 39 .codec_name = "ak4642-codec.0-0012", | |
| 40 #endif | |
| 41 .init = fsi_ak4642_dai_init, | 47 .init = fsi_ak4642_dai_init, |
| 42 .ops = NULL, | |
| 43 }; | 48 }; |
| 44 | 49 |
| 45 static struct snd_soc_card fsi_soc_card = { | 50 static struct snd_soc_card fsi_soc_card = { |
| 46 .name = "FSI (AK4642)", | |
| 47 .dai_link = &fsi_dai_link, | 51 .dai_link = &fsi_dai_link, |
| 48 .num_links = 1, | 52 .num_links = 1, |
| 49 }; | 53 }; |
| 50 | 54 |
| 51 static struct platform_device *fsi_snd_device; | 55 static struct platform_device *fsi_snd_device; |
| 52 | 56 |
| 53 static int __init fsi_ak4642_init(void) | 57 static int fsi_ak4642_probe(struct platform_device *pdev) |
| 54 { | 58 { |
| 55 int ret = -ENOMEM; | 59 int ret = -ENOMEM; |
| 60 const struct platform_device_id *id_entry; |
| 61 struct fsi_ak4642_data *pdata; |
| 56 | 62 |
| 57 » fsi_snd_device = platform_device_alloc("soc-audio", FSI_PORT_A); | 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; |
| 70 |
| 71 » fsi_snd_device = platform_device_alloc("soc-audio", pdata->id); |
| 58 if (!fsi_snd_device) | 72 if (!fsi_snd_device) |
| 59 goto out; | 73 goto out; |
| 60 | 74 |
| 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; |
| 80 fsi_soc_card.name = pdata->card; |
| 81 |
| 61 platform_set_drvdata(fsi_snd_device, &fsi_soc_card); | 82 platform_set_drvdata(fsi_snd_device, &fsi_soc_card); |
| 62 ret = platform_device_add(fsi_snd_device); | 83 ret = platform_device_add(fsi_snd_device); |
| 63 | 84 |
| 64 if (ret) | 85 if (ret) |
| 65 platform_device_put(fsi_snd_device); | 86 platform_device_put(fsi_snd_device); |
| 66 | 87 |
| 67 out: | 88 out: |
| 68 return ret; | 89 return ret; |
| 69 } | 90 } |
| 70 | 91 |
| 92 static int fsi_ak4642_remove(struct platform_device *pdev) |
| 93 { |
| 94 platform_device_unregister(fsi_snd_device); |
| 95 return 0; |
| 96 } |
| 97 |
| 98 static struct fsi_ak4642_data fsi_a_ak4642 = { |
| 99 .name = "AK4642", |
| 100 .card = "FSIA (AK4642)", |
| 101 .cpu_dai = "fsia-dai", |
| 102 .codec = "ak4642-codec.0-0012", |
| 103 .platform = "sh_fsi.0", |
| 104 .id = FSI_PORT_A, |
| 105 }; |
| 106 |
| 107 static struct fsi_ak4642_data fsi_b_ak4642 = { |
| 108 .name = "AK4642", |
| 109 .card = "FSIB (AK4642)", |
| 110 .cpu_dai = "fsib-dai", |
| 111 .codec = "ak4642-codec.0-0012", |
| 112 .platform = "sh_fsi.0", |
| 113 .id = FSI_PORT_B, |
| 114 }; |
| 115 |
| 116 static struct fsi_ak4642_data fsi_a_ak4643 = { |
| 117 .name = "AK4643", |
| 118 .card = "FSIA (AK4643)", |
| 119 .cpu_dai = "fsia-dai", |
| 120 .codec = "ak4642-codec.0-0013", |
| 121 .platform = "sh_fsi.0", |
| 122 .id = FSI_PORT_A, |
| 123 }; |
| 124 |
| 125 static struct fsi_ak4642_data fsi_b_ak4643 = { |
| 126 .name = "AK4643", |
| 127 .card = "FSIB (AK4643)", |
| 128 .cpu_dai = "fsib-dai", |
| 129 .codec = "ak4642-codec.0-0013", |
| 130 .platform = "sh_fsi.0", |
| 131 .id = FSI_PORT_B, |
| 132 }; |
| 133 |
| 134 static struct fsi_ak4642_data fsi2_a_ak4642 = { |
| 135 .name = "AK4642", |
| 136 .card = "FSI2A (AK4642)", |
| 137 .cpu_dai = "fsia-dai", |
| 138 .codec = "ak4642-codec.0-0012", |
| 139 .platform = "sh_fsi2", |
| 140 .id = FSI_PORT_A, |
| 141 }; |
| 142 |
| 143 static struct fsi_ak4642_data fsi2_b_ak4642 = { |
| 144 .name = "AK4642", |
| 145 .card = "FSI2B (AK4642)", |
| 146 .cpu_dai = "fsib-dai", |
| 147 .codec = "ak4642-codec.0-0012", |
| 148 .platform = "sh_fsi2", |
| 149 .id = FSI_PORT_B, |
| 150 }; |
| 151 |
| 152 static struct fsi_ak4642_data fsi2_a_ak4643 = { |
| 153 .name = "AK4643", |
| 154 .card = "FSI2A (AK4643)", |
| 155 .cpu_dai = "fsia-dai", |
| 156 .codec = "ak4642-codec.0-0013", |
| 157 .platform = "sh_fsi2", |
| 158 .id = FSI_PORT_A, |
| 159 }; |
| 160 |
| 161 static struct fsi_ak4642_data fsi2_b_ak4643 = { |
| 162 .name = "AK4643", |
| 163 .card = "FSI2B (AK4643)", |
| 164 .cpu_dai = "fsib-dai", |
| 165 .codec = "ak4642-codec.0-0013", |
| 166 .platform = "sh_fsi2", |
| 167 .id = FSI_PORT_B, |
| 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 |
| 71 static void __exit fsi_ak4642_exit(void) | 199 static void __exit fsi_ak4642_exit(void) |
| 72 { | 200 { |
| 73 » platform_device_unregister(fsi_snd_device); | 201 » platform_driver_unregister(&fsi_ak4642); |
| 74 } | 202 } |
| 75 | 203 |
| 76 module_init(fsi_ak4642_init); | 204 module_init(fsi_ak4642_init); |
| 77 module_exit(fsi_ak4642_exit); | 205 module_exit(fsi_ak4642_exit); |
| 78 | 206 |
| 79 MODULE_LICENSE("GPL"); | 207 MODULE_LICENSE("GPL"); |
| 80 MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card"); | 208 MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card"); |
| 81 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>"); | 209 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>"); |
| OLD | NEW |