Skip to content

Commit

Permalink
ASoC: add generic simple-card support
Browse files Browse the repository at this point in the history
Current ASoC requires card.c file to each platforms in order to
specifies its CPU and Codecs pair.
But the differences between these were only value/strings of setting.
In order to reduce duplicate driver, this patch adds generic/simple-card.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Kuninori Morimoto authored and Mark Brown committed Apr 13, 2012
1 parent cdc04fd commit f239088
Show file tree
Hide file tree
Showing 6 changed files with 163 additions and 0 deletions.
38 changes: 38 additions & 0 deletions include/sound/simple_card.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* ASoC simple sound card support
*
* Copyright (C) 2012 Renesas Solutions Corp.
* Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#ifndef __SIMPLE_CARD_H
#define __SIMPLE_CARD_H

#include <sound/soc.h>

struct asoc_simple_dai_init_info {
unsigned int fmt;
unsigned int cpu_daifmt;
unsigned int codec_daifmt;
unsigned int sysclk;
};

struct asoc_simple_card_info {
const char *name;
const char *card;
const char *cpu_dai;
const char *codec;
const char *platform;
const char *codec_dai;
struct asoc_simple_dai_init_info *init; /* for snd_link.init */

/* used in simple-card.c */
struct snd_soc_dai_link snd_link;
struct snd_soc_card snd_card;
};

#endif /* __SIMPLE_CARD_H */
3 changes: 3 additions & 0 deletions sound/soc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,8 @@ source "sound/soc/txx9/Kconfig"
# Supported codecs
source "sound/soc/codecs/Kconfig"

# generic frame-work
source "sound/soc/generic/Kconfig"

endif # SND_SOC

1 change: 1 addition & 0 deletions sound/soc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ obj-$(CONFIG_SND_SOC_DMAENGINE_PCM) += snd-soc-dmaengine-pcm.o

obj-$(CONFIG_SND_SOC) += snd-soc-core.o
obj-$(CONFIG_SND_SOC) += codecs/
obj-$(CONFIG_SND_SOC) += generic/
obj-$(CONFIG_SND_SOC) += atmel/
obj-$(CONFIG_SND_SOC) += au1x/
obj-$(CONFIG_SND_SOC) += blackfin/
Expand Down
4 changes: 4 additions & 0 deletions sound/soc/generic/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
config SND_SIMPLE_CARD
tristate "ASoC Simple sound card support"
help
This option enables generic simple sound card support
3 changes: 3 additions & 0 deletions sound/soc/generic/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
snd-soc-simple-card-objs := simple-card.o

obj-$(CONFIG_SND_SIMPLE_CARD) += snd-soc-simple-card.o
114 changes: 114 additions & 0 deletions sound/soc/generic/simple-card.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* ASoC simple sound card support
*
* Copyright (C) 2012 Renesas Solutions Corp.
* Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#include <linux/platform_device.h>
#include <linux/module.h>
#include <sound/simple_card.h>

#define asoc_simple_get_card_info(p) \
container_of(p->dai_link, struct asoc_simple_card_info, snd_link)

static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
{
struct asoc_simple_card_info *cinfo = asoc_simple_get_card_info(rtd);
struct asoc_simple_dai_init_info *iinfo = cinfo->init;
struct snd_soc_dai *codec = rtd->codec_dai;
struct snd_soc_dai *cpu = rtd->cpu_dai;
unsigned int cpu_daifmt = iinfo->fmt | iinfo->cpu_daifmt;
unsigned int codec_daifmt = iinfo->fmt | iinfo->codec_daifmt;
int ret;

if (codec_daifmt) {
ret = snd_soc_dai_set_fmt(codec, codec_daifmt);
if (ret < 0)
return ret;
}

if (iinfo->sysclk) {
ret = snd_soc_dai_set_sysclk(codec, 0, iinfo->sysclk, 0);
if (ret < 0)
return ret;
}

if (cpu_daifmt) {
ret = snd_soc_dai_set_fmt(cpu, cpu_daifmt);
if (ret < 0)
return ret;
}

return 0;
}

static int asoc_simple_card_probe(struct platform_device *pdev)
{
struct asoc_simple_card_info *cinfo = pdev->dev.platform_data;

if (!cinfo) {
dev_err(&pdev->dev, "no info for asoc-simple-card\n");
return -EINVAL;
}

if (!cinfo->name ||
!cinfo->card ||
!cinfo->cpu_dai ||
!cinfo->codec ||
!cinfo->platform ||
!cinfo->codec_dai) {
dev_err(&pdev->dev, "insufficient asoc_simple_card_info settings\n");
return -EINVAL;
}

/*
* init snd_soc_dai_link
*/
cinfo->snd_link.name = cinfo->name;
cinfo->snd_link.stream_name = cinfo->name;
cinfo->snd_link.cpu_dai_name = cinfo->cpu_dai;
cinfo->snd_link.platform_name = cinfo->platform;
cinfo->snd_link.codec_name = cinfo->codec;
cinfo->snd_link.codec_dai_name = cinfo->codec_dai;

/* enable snd_link.init if cinfo has settings */
if (cinfo->init)
cinfo->snd_link.init = asoc_simple_card_dai_init;

/*
* init snd_soc_card
*/
cinfo->snd_card.name = cinfo->card;
cinfo->snd_card.owner = THIS_MODULE;
cinfo->snd_card.dai_link = &cinfo->snd_link;
cinfo->snd_card.num_links = 1;
cinfo->snd_card.dev = &pdev->dev;

return snd_soc_register_card(&cinfo->snd_card);
}

static int asoc_simple_card_remove(struct platform_device *pdev)
{
struct asoc_simple_card_info *cinfo = pdev->dev.platform_data;

return snd_soc_unregister_card(&cinfo->snd_card);
}

static struct platform_driver asoc_simple_card = {
.driver = {
.name = "asoc-simple-card",
},
.probe = asoc_simple_card_probe,
.remove = asoc_simple_card_remove,
};

module_platform_driver(asoc_simple_card);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("ASoC Simple Sound Card");
MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");

0 comments on commit f239088

Please sign in to comment.