Skip to content

Commit

Permalink
ASoC: BCM2708: Add support for PROTO board with WM8731
Browse files Browse the repository at this point in the history
Signed-off-by: Florian Meier <[email protected]>
  • Loading branch information
koalo committed May 8, 2013
1 parent 38aa611 commit f6e9fde
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 0 deletions.
12 changes: 12 additions & 0 deletions arch/arm/mach-bcm2708/bcm2708.c
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,14 @@ static struct platform_device snd_rpi_tda1541a_device = {
};
#endif

#ifdef CONFIG_SND_BCM2708_SOC_RPI_CODEC_PROTO_MODULE
static struct platform_device snd_rpi_proto_device = {
.name = "snd-rpi-proto",
.id = 0,
.num_resources = 0,
};
#endif

int __init bcm_register_device(struct platform_device *pdev)
{
int ret;
Expand Down Expand Up @@ -802,6 +810,10 @@ void __init bcm2708_init(void)
bcm_register_device(&snd_rpi_tda1541a_device);
#endif

#ifdef CONFIG_SND_BCM2708_SOC_RPI_CODEC_PROTO_MODULE
bcm_register_device(&snd_rpi_proto_device);
#endif

for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
struct amba_device *d = amba_devs[i];
amba_device_register(d, &iomem_resource);
Expand Down
8 changes: 8 additions & 0 deletions sound/soc/bcm2708/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,11 @@ config SND_BCM2708_SOC_RPI_CODEC_TDA1541A
help
Say Y if you want to add support for TDA1541A

config SND_BCM2708_SOC_RPI_CODEC_PROTO
tristate "Support for Audio Codec Board - PROTO (WM8731)"
depends on SND_BCM2708_SOC
select SND_BCM2708_SOC_I2S
select SND_SOC_WM8731
help
Say Y if you want to add support for Audio Codec Board - PROTO (WM8731)

2 changes: 2 additions & 0 deletions sound/soc/bcm2708/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ snd-soc-bcm2708-objs := bcm2708-pcm.o
snd-soc-bcm2708-i2s-objs := bcm2708-i2s.o
snd-soc-rpi-mbed-objs := rpi-mbed.o
snd-soc-rpi-tda1541a-objs := rpi-tda1541a.o
snd-soc-rpi-proto-objs := rpi-proto.o

obj-$(CONFIG_SND_BCM2708_SOC) += snd-soc-bcm2708.o
obj-$(CONFIG_SND_BCM2708_SOC_I2S) += snd-soc-bcm2708-i2s.o

# BCM2708 Machine Support
obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_MBED) += snd-soc-rpi-mbed.o
obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_TDA1541A) += snd-soc-rpi-tda1541a.o
obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_PROTO) += snd-soc-rpi-proto.o
121 changes: 121 additions & 0 deletions sound/soc/bcm2708/rpi-proto.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/*
* ASoC driver for PROTO AudioCODEC (with a WM8731)
* connected to a Raspberry Pi
*
* Author: Florian Meier, <[email protected]>
* Copyright 2013
*
* 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/module.h>
#include <linux/platform_device.h>

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <sound/jack.h>

#include "../codecs/wm8731.h"

static const unsigned int wm8731_rates_12288000[] = {
8000, 32000, 48000, 96000,
};

static struct snd_pcm_hw_constraint_list wm8731_constraints_12288000 = {
.list = wm8731_rates_12288000,
.count = ARRAY_SIZE(wm8731_rates_12288000),
};

static int snd_rpi_proto_startup(struct snd_pcm_substream *substream)
{
/* Setup constraints, because there is a 12.288 MHz XTAL on the board */
snd_pcm_hw_constraint_list(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_RATE,
&wm8731_constraints_12288000);
return 0;
}

static int snd_rpi_proto_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->codec_dai;
int sysclk = 12288000; /* This is fixed on this board */

/* Set proto sysclk */
int ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
sysclk, SND_SOC_CLOCK_IN);
if (ret < 0) {
dev_err(substream->pcm->dev, "Failed to set WM8731 SYSCLK: %d\n", ret);
return ret;
}

return 0;
}

/* machine stream operations */
static struct snd_soc_ops snd_rpi_proto_ops = {
.startup = snd_rpi_proto_startup,
.hw_params = snd_rpi_proto_hw_params,
};

static struct snd_soc_dai_link snd_rpi_proto_dai[] = {
{
.name = "WM8731",
.stream_name = "WM8731 HiFi",
.cpu_dai_name = "bcm2708-i2s.0",
.codec_dai_name = "wm8731-hifi",
.platform_name = "bcm2708-pcm-audio.0",
.codec_name = "wm8731.1-001a",
.dai_fmt = SND_SOC_DAIFMT_I2S
| SND_SOC_DAIFMT_NB_NF
| SND_SOC_DAIFMT_CBM_CFM,
.ops = &snd_rpi_proto_ops,
},
};

/* audio machine driver */
static struct snd_soc_card snd_rpi_proto = {
.name = "snd_rpi_proto",
.dai_link = snd_rpi_proto_dai,
.num_links = ARRAY_SIZE(snd_rpi_proto_dai),
};

static int snd_rpi_proto_probe(struct platform_device *pdev)
{
int ret = 0;

snd_rpi_proto.dev = &pdev->dev;
ret = snd_soc_register_card(&snd_rpi_proto);
if (ret)
{
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
}

return ret;
}


static int snd_rpi_proto_remove(struct platform_device *pdev)
{
return snd_soc_unregister_card(&snd_rpi_proto);
}

static struct platform_driver snd_rpi_proto_driver = {
.driver = {
.name = "snd-rpi-proto",
.owner = THIS_MODULE,
},
.probe = snd_rpi_proto_probe,
.remove = snd_rpi_proto_remove,
};

module_platform_driver(snd_rpi_proto_driver);

MODULE_AUTHOR("Florian Meier");
MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to PROTO board with WM8731 codec");
MODULE_LICENSE("GPL");

0 comments on commit f6e9fde

Please sign in to comment.