[alsa-devel] [PATCH] sound/soc/codecs: Add support for the wm8727 DAC.
Add support for the Wolfson Micro wm8727 DAC, this is a simple non-configurable DAC.
Signed-off-by: Neil Jones neil.jones@imgtec.com --- sound/soc/codecs/Kconfig | 6 ++- sound/soc/codecs/Makefile | 5 +- sound/soc/codecs/wm8727.c | 120 +++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/wm8727.h | 21 ++++++++ 4 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 sound/soc/codecs/wm8727.c create mode 100644 sound/soc/codecs/wm8727.h
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 0edca93..816cc86 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -36,6 +36,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_WM8510 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8523 if I2C select SND_SOC_WM8580 if I2C + select SND_SOC_WM8727 select SND_SOC_WM8728 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8731 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8750 if SND_SOC_I2C_AND_SPI @@ -160,6 +161,9 @@ config SND_SOC_WM8523 config SND_SOC_WM8580 tristate
+config SND_SOC_WM8727 + tristate + config SND_SOC_WM8728 tristate
@@ -217,6 +221,6 @@ config SND_SOC_WM9712 config SND_SOC_WM9713 tristate
-# Amp config SND_SOC_MAX9877 tristate + diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index fb4af28..fa536a9 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -24,6 +24,7 @@ snd-soc-wm8400-objs := wm8400.o snd-soc-wm8510-objs := wm8510.o snd-soc-wm8523-objs := wm8523.o snd-soc-wm8580-objs := wm8580.o +snd-soc-wm8727-objs := wm8727.o snd-soc-wm8728-objs := wm8728.o snd-soc-wm8731-objs := wm8731.o snd-soc-wm8750-objs := wm8750.o @@ -44,7 +45,6 @@ snd-soc-wm9705-objs := wm9705.o snd-soc-wm9712-objs := wm9712.o snd-soc-wm9713-objs := wm9713.o snd-soc-wm-hubs-objs := wm_hubs.o - # Amp snd-soc-max9877-objs := max9877.o
@@ -74,6 +74,7 @@ obj-$(CONFIG_SND_SOC_WM8400) += snd-soc-wm8400.o obj-$(CONFIG_SND_SOC_WM8510) += snd-soc-wm8510.o obj-$(CONFIG_SND_SOC_WM8523) += snd-soc-wm8523.o obj-$(CONFIG_SND_SOC_WM8580) += snd-soc-wm8580.o +obj-$(CONFIG_SND_SOC_WM8727) += snd-soc-wm8727.o obj-$(CONFIG_SND_SOC_WM8728) += snd-soc-wm8728.o obj-$(CONFIG_SND_SOC_WM8731) += snd-soc-wm8731.o obj-$(CONFIG_SND_SOC_WM8750) += snd-soc-wm8750.o @@ -94,6 +95,6 @@ obj-$(CONFIG_SND_SOC_WM9705) += snd-soc-wm9705.o obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o obj-$(CONFIG_SND_SOC_WM_HUBS) += snd-soc-wm-hubs.o - # Amp obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o + diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c new file mode 100644 index 0000000..83aa5fa --- /dev/null +++ b/sound/soc/codecs/wm8727.c @@ -0,0 +1,120 @@ +/* + * wm8727.c + * + * Created on: 15-Oct-2009 + * Author: neil.jones@imgtec.com + * + * Copyright (C) 2009 Imagination Technologies Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/device.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/ac97_codec.h> +#include <sound/initval.h> +#include <sound/soc.h> + +#include "wm8727.h" +/* + * Note this is a simple chip with no configuration interface, sample rate is + * determined automatically by examining the Master clock and Bit clock ratios + */ +#define WM8727_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\ + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\ + SNDRV_PCM_RATE_192000) + + +struct snd_soc_dai wm8727_dai = { + .name = "WM8727", + .playback = { + .stream_name = "Playback", + .channels_min = 2, + .channels_max = 2, + .rates = WM8727_RATES, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, + }, +}; +EXPORT_SYMBOL_GPL(wm8727_dai); + +static int wm8727_soc_probe(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec; + int ret = 0; + + codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); + if (codec == NULL) + return -ENOMEM; + mutex_init(&codec->mutex); + codec->name = "WM8727"; + codec->owner = THIS_MODULE; + codec->dai = &wm8727_dai; + codec->num_dai = 1; + socdev->card->codec = codec; + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + /* register pcms */ + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret < 0) { + printk(KERN_ERR "wm8727: failed to create pcms\n"); + goto pcm_err; + } + /* register card */ + ret = snd_soc_init_card(socdev); + if (ret < 0) { + printk(KERN_ERR "wm8727: failed to register card\n"); + goto register_err; + } + + return ret; + +register_err: + snd_soc_free_pcms(socdev); +pcm_err: + kfree(socdev->card->codec); + socdev->card->codec = NULL; + return ret; +} + +static int wm8727_soc_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = socdev->card->codec; + + if (codec == NULL) + return 0; + snd_soc_free_pcms(socdev); + kfree(codec); + return 0; +} + +struct snd_soc_codec_device soc_codec_dev_wm8727 = { + .probe = wm8727_soc_probe, + .remove = wm8727_soc_remove, +}; +EXPORT_SYMBOL_GPL(soc_codec_dev_wm8727); + +static int __init wm8727_init(void) +{ + return snd_soc_register_dai(&wm8727_dai); +} +module_init(wm8727_init); + +static void __exit wm8727_exit(void) +{ + snd_soc_unregister_dai(&wm8727_dai); +} +module_exit(wm8727_exit); + +MODULE_DESCRIPTION("ASoC wm8727 driver"); +MODULE_AUTHOR("Neil Jones"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wm8727.h b/sound/soc/codecs/wm8727.h new file mode 100644 index 0000000..ee19aa7 --- /dev/null +++ b/sound/soc/codecs/wm8727.h @@ -0,0 +1,21 @@ +/* + * wm8727.h + * + * Created on: 15-Oct-2009 + * Author: neil.jones@imgtec.com + * + * Copyright (C) 2009 Imagination Technologies Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef WM8727_H_ +#define WM8727_H_ + +extern struct snd_soc_dai wm8727_dai; +extern struct snd_soc_codec_device soc_codec_dev_wm8727; + +#endif /* WM8727_H_ */
On Mon, Nov 02, 2009 at 11:54:15AM +0000, Neil Jones wrote:
Thanks for this - there's a few relatively minor issues below.
Please remember to CC maintainers on patches, this helps avoid them getting missed on busy mailing lists.
sound/soc/codecs/Makefile | 5 +- sound/soc/codecs/wm8727.c | 120 +++++++++++++++++++++++++++++++++++++++++++++
Your MUA has word wrapped your post - this is going to upset patch. There are some hints on MUA configuration in Documentation/email-clients.txt which might help. If all else fails an attachment (without a copy of the patch in the body of the mail) usually works.
@@ -217,6 +221,6 @@ config SND_SOC_WM9712 config SND_SOC_WM9713 tristate
-# Amp config SND_SOC_MAX9877 tristate
This is an unrelated change which shouldn't be here (and will actually generate a conflict with current code since there was another amplifier driver added).
@@ -44,7 +45,6 @@ snd-soc-wm9705-objs := wm9705.o snd-soc-wm9712-objs := wm9712.o snd-soc-wm9713-objs := wm9713.o snd-soc-wm-hubs-objs := wm_hubs.o
# Amp snd-soc-max9877-objs := max9877.o
Ditto, but no conflict this time.
@@ -94,6 +95,6 @@ obj-$(CONFIG_SND_SOC_WM9705) += snd-soc-wm9705.o obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o obj-$(CONFIG_SND_SOC_WM_HUBS) += snd-soc-wm-hubs.o
# Amp obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o
Ditto.
+static int wm8727_soc_probe(struct platform_device *pdev) +{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
return -ENOMEM;
You might want to run your patch through scripts/checkpatch.pl - I think there's some indentation issues (I'm not 100% sure that this isn't your MUA mangling things, though).
+static int __init wm8727_init(void) +{
- return snd_soc_register_dai(&wm8727_dai);
+} +module_init(wm8727_init);
+static void __exit wm8727_exit(void) +{
- snd_soc_unregister_dai(&wm8727_dai);
+} +module_exit(wm8727_exit);
This should be converted to register a platform driver for the device and do the DAI registration. Some older drivers don't do this but it will be required going forward for newer framework features so it's mandatory for new drivers.
See wm8350 for an example of registering off a platform driver probe, it's just a case of calling the register/unregister functions from the platform driver probe/remove functions and assigning dai->dev to be the struct device for the platform driver before you register the DAI.
On Mon, Nov 2, 2009 at 12:09 PM, Mark Brown < broonie@opensource.wolfsonmicro.com> wrote:
On Mon, Nov 02, 2009 at 11:54:15AM +0000, Neil Jones wrote:
Thanks for this - there's a few relatively minor issues below.
Please remember to CC maintainers on patches, this helps avoid them getting missed on busy mailing lists.
Ok no probs, are you the maintainer ?
Your MUA has word wrapped your post - this is going to upset patch. There are some hints on MUA configuration in Documentation/email-clients.txt which might help. If all else fails an attachment (without a copy of the patch in the body of the mail) usually works.
Again ok, I've tried my gmail acount this time, as i have similar problem with patches sent via exchange.
You might want to run your patch through scripts/checkpatch.pl - I think
there's some indentation issues (I'm not 100% sure that this isn't your MUA mangling things, though).
I did its clean just email client no doubt.
This should be converted to register a platform driver for the device and do the DAI registration. Some older drivers don't do this but it will be required going forward for newer framework features so it's mandatory for new drivers.
See wm8350 for an example of registering off a platform driver probe, it's just a case of calling the register/unregister functions from the platform driver probe/remove functions and assigning dai->dev to be the struct device for the platform driver before you register the DAI.
No probs, cheers for the feedback.
On Mon, Nov 02, 2009 at 01:21:01PM +0000, Neil Jones wrote:
On Mon, Nov 2, 2009 at 12:09 PM, Mark Brown < broonie@opensource.wolfsonmicro.com> wrote:
Please remember to CC maintainers on patches, this helps avoid them getting missed on busy mailing lists.
Ok no probs, are you the maintainer ?
For ASoC, yes. See the MAINTAINERS file in the kernel for a full list, scripts/get_maintainer.pl might help though it does bring up false positives.
There are some hints on MUA configuration in Documentation/email-clients.txt which might help. If all else fails an attachment (without a copy of the patch in the body of the mail) usually works.
Again ok, I've tried my gmail acount this time, as i have similar problem with patches sent via exchange.
gmail mangles patches if you use the web interface, you'll need to either submit over SMTP (eg, with git send-email) or use an attachment if you're using the web interface.
participants (2)
-
Mark Brown
-
Neil Jones