linux/sound/soc/sh/fsi-ak4642.c
<<
>>
Prefs
   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
  12#include <linux/platform_device.h>
  13#include <sound/sh_fsi.h>
  14
  15struct 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
  24static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd)
  25{
  26        struct snd_soc_dai *codec = rtd->codec_dai;
  27        struct snd_soc_dai *cpu = rtd->cpu_dai;
  28        int ret;
  29
  30        ret = snd_soc_dai_set_fmt(codec, SND_SOC_DAIFMT_LEFT_J |
  31                                         SND_SOC_DAIFMT_CBM_CFM);
  32        if (ret < 0)
  33                return ret;
  34
  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);
  41
  42        return ret;
  43}
  44
  45static struct snd_soc_dai_link fsi_dai_link = {
  46        .codec_dai_name = "ak4642-hifi",
  47        .init           = fsi_ak4642_dai_init,
  48};
  49
  50static struct snd_soc_card fsi_soc_card  = {
  51        .dai_link       = &fsi_dai_link,
  52        .num_links      = 1,
  53};
  54
  55static struct platform_device *fsi_snd_device;
  56
  57static int fsi_ak4642_probe(struct platform_device *pdev)
  58{
  59        int ret = -ENOMEM;
  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;
  70
  71        fsi_snd_device = platform_device_alloc("soc-audio", pdata->id);
  72        if (!fsi_snd_device)
  73                goto out;
  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
  82        platform_set_drvdata(fsi_snd_device, &fsi_soc_card);
  83        ret = platform_device_add(fsi_snd_device);
  84
  85        if (ret)
  86                platform_device_put(fsi_snd_device);
  87
  88out:
  89        return ret;
  90}
  91
  92static int fsi_ak4642_remove(struct platform_device *pdev)
  93{
  94        platform_device_unregister(fsi_snd_device);
  95        return 0;
  96}
  97
  98static 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
 107static 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
 116static 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
 125static 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
 134static 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
 143static 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
 152static 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
 161static 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
 170static 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
 185static 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
 194static int __init fsi_ak4642_init(void)
 195{
 196        return platform_driver_register(&fsi_ak4642);
 197}
 198
 199static void __exit fsi_ak4642_exit(void)
 200{
 201        platform_driver_unregister(&fsi_ak4642);
 202}
 203
 204module_init(fsi_ak4642_init);
 205module_exit(fsi_ak4642_exit);
 206
 207MODULE_LICENSE("GPL");
 208MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card");
 209MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
 210