From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: linuxppc-dev@ozlabs.org, alsa-devel@alsa-project.org,
liam.girdwood@wolfsonmicro.com
Subject: Re: [PATCH v2 1/3] ALSA SoC: Add OpenFirmware helper for matching bus and codec drivers
Date: Mon, 14 Jul 2008 18:16:06 +0400 [thread overview]
Message-ID: <20080714141606.GA22478@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <20080712083929.15025.47682.stgit@trillian.secretlab.ca>
On Sat, Jul 12, 2008 at 02:39:29AM -0600, Grant Likely wrote:
> From: Grant Likely <grant.likely@secretlab.ca>
>
> Simple utility layer for creating ASoC machine instances based on data
> in the OpenFirmware device tree. OF aware platform drivers and codec
> drivers register themselves with this framework and the framework
> automatically instantiates a machine driver.
>
> This is most likely temporary glue code to work around limitations in
> the ASoC v1 framework. I expect ASoC v2 won't need this.
> ---
[...]
> --- /dev/null
> +++ b/sound/soc/soc-of.c
It's quite inconvenient to spread the firmware-specific bits over the
whole kernel source tree. So, can we place this in driver/of/, just as
we did for i2c, spi and gpio?
> @@ -0,0 +1,171 @@
> +/*
> + * OF helpers for ALSA SoC Layer
> + *
> + * Copyright (C) 2008, Secret Lab Technologies Ltd.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/init.h>
> +#include <linux/delay.h>
> +#include <linux/pm.h>
> +#include <linux/bitops.h>
> +#include <linux/platform_device.h>
> +#include <linux/of.h>
> +#include <sound/core.h>
> +#include <sound/pcm.h>
> +#include <sound/pcm_params.h>
> +#include <sound/soc.h>
> +#include <sound/soc-of.h>
> +#include <sound/initval.h>
> +
> +MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("ALSA SoC OpenFirmware bindings");
> +
> +static DEFINE_MUTEX(of_snd_soc_mutex);
> +static LIST_HEAD(of_snd_soc_device_list);
> +static int of_snd_soc_next_index;
> +
> +struct of_snd_soc_device {
> + int id;
> + struct list_head list;
> + struct snd_soc_device device;
> + struct snd_soc_machine machine;
> + struct snd_soc_dai_link dai_link;
> + struct platform_device *pdev;
> + struct device_node *platform_node;
> + struct device_node *codec_node;
> +};
> +
> +static struct snd_soc_ops of_snd_soc_ops = {
> +};
> +
> +static struct of_snd_soc_device *
> +of_snd_soc_get_device(struct device_node *codec_node)
> +{
> + struct of_snd_soc_device *of_soc;
> +
> + list_for_each_entry(of_soc, &of_snd_soc_device_list, list) {
> + if (of_soc->codec_node == codec_node)
> + return of_soc;
> + }
> +
> + of_soc = kzalloc(sizeof(struct of_snd_soc_device), GFP_KERNEL);
> + if (!of_soc)
> + return NULL;
> +
> + /* Initialize the structure and add it to the global list */
> + of_soc->codec_node = codec_node;
> + of_soc->id = of_snd_soc_next_index++;
> + of_soc->machine.dai_link = &of_soc->dai_link;
> + of_soc->machine.num_links = 1;
> + of_soc->device.machine = &of_soc->machine;
> + of_soc->dai_link.ops = &of_snd_soc_ops;
> + list_add(&of_soc->list, &of_snd_soc_device_list);
> +
> + return of_soc;
> +}
> +
> +static void of_snd_soc_register_device(struct of_snd_soc_device *of_soc)
> +{
> + struct platform_device *pdev;
> + int rc;
> +
> + /* Only register the device if both the codec and platform have
> + * been registered */
> + if ((!of_soc->device.codec_data) || (!of_soc->platform_node))
> + return;
> +
> + pr_info("platform<-->codec match achieved; registering machine\n");
> +
> + pdev = platform_device_alloc("soc-audio", of_soc->id);
> + if (!pdev) {
> + pr_err("of_soc: platform_device_alloc() failed\n");
> + return;
> + }
> +
> + pdev->dev.platform_data = of_soc;
> + platform_set_drvdata(pdev, &of_soc->device);
> + of_soc->device.dev = &pdev->dev;
> +
> + /* The ASoC device is complete; register it */
> + rc = platform_device_add(pdev);
> + if (rc) {
> + pr_err("of_soc: platform_device_add() failed\n");
> + return;
> + }
> +
> +}
> +
> +int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev,
> + void *codec_data, struct snd_soc_codec_dai *dai,
> + struct device_node *node)
> +{
> + struct of_snd_soc_device *of_soc;
> + int rc = 0;
> +
> + pr_info("registering ASoC codec driver: %s\n", node->full_name);
> +
> + mutex_lock(&of_snd_soc_mutex);
> + of_soc = of_snd_soc_get_device(node);
> + if (!of_soc) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + /* Store the codec data */
> + of_soc->device.codec_data = codec_data;
> + of_soc->device.codec_dev = codec_dev;
> + of_soc->dai_link.name = node->name;
> + of_soc->dai_link.stream_name = node->name;
> + of_soc->dai_link.codec_dai = dai;
> +
> + /* Now try to register the SoC device */
> + of_snd_soc_register_device(of_soc);
> +
> + out:
> + mutex_unlock(&of_snd_soc_mutex);
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(of_snd_soc_register_codec);
> +
> +int of_snd_soc_register_platform(struct snd_soc_platform *platform,
> + struct device_node *node,
> + struct snd_soc_cpu_dai *cpu_dai)
> +{
> + struct of_snd_soc_device *of_soc;
> + struct device_node *codec_node;
> + const phandle *handle;
> + int len, rc = 0;
> +
> + pr_info("registering ASoC platform driver: %s\n", node->full_name);
> +
> + handle = of_get_property(node, "codec-handle", &len);
> + if (!handle || len < sizeof(handle))
> + return -ENODEV;
> + codec_node = of_find_node_by_phandle(*handle);
> + if (!codec_node)
> + return -ENODEV;
> + pr_info("looking for codec: %s\n", codec_node->full_name);
> +
> + mutex_lock(&of_snd_soc_mutex);
> + of_soc = of_snd_soc_get_device(codec_node);
> + if (!of_soc) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + of_soc->platform_node = node;
> + of_soc->dai_link.cpu_dai = cpu_dai;
> + of_soc->device.platform = platform;
> + of_soc->machine.name = of_soc->dai_link.cpu_dai->name;
> +
> + /* Now try to register the SoC device */
> + of_snd_soc_register_device(of_soc);
> +
> + out:
> + mutex_unlock(&of_snd_soc_mutex);
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(of_snd_soc_register_platform);
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
WARNING: multiple messages have this Message-ID (diff)
From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: linuxppc-dev@ozlabs.org, alsa-devel@alsa-project.org,
liam.girdwood@wolfsonmicro.com
Subject: Re: [PATCH v2 1/3] ALSA SoC: Add OpenFirmware helper for matching bus and codec drivers
Date: Mon, 14 Jul 2008 18:16:06 +0400 [thread overview]
Message-ID: <20080714141606.GA22478@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <20080712083929.15025.47682.stgit@trillian.secretlab.ca>
On Sat, Jul 12, 2008 at 02:39:29AM -0600, Grant Likely wrote:
> From: Grant Likely <grant.likely@secretlab.ca>
>
> Simple utility layer for creating ASoC machine instances based on data
> in the OpenFirmware device tree. OF aware platform drivers and codec
> drivers register themselves with this framework and the framework
> automatically instantiates a machine driver.
>
> This is most likely temporary glue code to work around limitations in
> the ASoC v1 framework. I expect ASoC v2 won't need this.
> ---
[...]
> --- /dev/null
> +++ b/sound/soc/soc-of.c
It's quite inconvenient to spread the firmware-specific bits over the
whole kernel source tree. So, can we place this in driver/of/, just as
we did for i2c, spi and gpio?
> @@ -0,0 +1,171 @@
> +/*
> + * OF helpers for ALSA SoC Layer
> + *
> + * Copyright (C) 2008, Secret Lab Technologies Ltd.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/init.h>
> +#include <linux/delay.h>
> +#include <linux/pm.h>
> +#include <linux/bitops.h>
> +#include <linux/platform_device.h>
> +#include <linux/of.h>
> +#include <sound/core.h>
> +#include <sound/pcm.h>
> +#include <sound/pcm_params.h>
> +#include <sound/soc.h>
> +#include <sound/soc-of.h>
> +#include <sound/initval.h>
> +
> +MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("ALSA SoC OpenFirmware bindings");
> +
> +static DEFINE_MUTEX(of_snd_soc_mutex);
> +static LIST_HEAD(of_snd_soc_device_list);
> +static int of_snd_soc_next_index;
> +
> +struct of_snd_soc_device {
> + int id;
> + struct list_head list;
> + struct snd_soc_device device;
> + struct snd_soc_machine machine;
> + struct snd_soc_dai_link dai_link;
> + struct platform_device *pdev;
> + struct device_node *platform_node;
> + struct device_node *codec_node;
> +};
> +
> +static struct snd_soc_ops of_snd_soc_ops = {
> +};
> +
> +static struct of_snd_soc_device *
> +of_snd_soc_get_device(struct device_node *codec_node)
> +{
> + struct of_snd_soc_device *of_soc;
> +
> + list_for_each_entry(of_soc, &of_snd_soc_device_list, list) {
> + if (of_soc->codec_node == codec_node)
> + return of_soc;
> + }
> +
> + of_soc = kzalloc(sizeof(struct of_snd_soc_device), GFP_KERNEL);
> + if (!of_soc)
> + return NULL;
> +
> + /* Initialize the structure and add it to the global list */
> + of_soc->codec_node = codec_node;
> + of_soc->id = of_snd_soc_next_index++;
> + of_soc->machine.dai_link = &of_soc->dai_link;
> + of_soc->machine.num_links = 1;
> + of_soc->device.machine = &of_soc->machine;
> + of_soc->dai_link.ops = &of_snd_soc_ops;
> + list_add(&of_soc->list, &of_snd_soc_device_list);
> +
> + return of_soc;
> +}
> +
> +static void of_snd_soc_register_device(struct of_snd_soc_device *of_soc)
> +{
> + struct platform_device *pdev;
> + int rc;
> +
> + /* Only register the device if both the codec and platform have
> + * been registered */
> + if ((!of_soc->device.codec_data) || (!of_soc->platform_node))
> + return;
> +
> + pr_info("platform<-->codec match achieved; registering machine\n");
> +
> + pdev = platform_device_alloc("soc-audio", of_soc->id);
> + if (!pdev) {
> + pr_err("of_soc: platform_device_alloc() failed\n");
> + return;
> + }
> +
> + pdev->dev.platform_data = of_soc;
> + platform_set_drvdata(pdev, &of_soc->device);
> + of_soc->device.dev = &pdev->dev;
> +
> + /* The ASoC device is complete; register it */
> + rc = platform_device_add(pdev);
> + if (rc) {
> + pr_err("of_soc: platform_device_add() failed\n");
> + return;
> + }
> +
> +}
> +
> +int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev,
> + void *codec_data, struct snd_soc_codec_dai *dai,
> + struct device_node *node)
> +{
> + struct of_snd_soc_device *of_soc;
> + int rc = 0;
> +
> + pr_info("registering ASoC codec driver: %s\n", node->full_name);
> +
> + mutex_lock(&of_snd_soc_mutex);
> + of_soc = of_snd_soc_get_device(node);
> + if (!of_soc) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + /* Store the codec data */
> + of_soc->device.codec_data = codec_data;
> + of_soc->device.codec_dev = codec_dev;
> + of_soc->dai_link.name = node->name;
> + of_soc->dai_link.stream_name = node->name;
> + of_soc->dai_link.codec_dai = dai;
> +
> + /* Now try to register the SoC device */
> + of_snd_soc_register_device(of_soc);
> +
> + out:
> + mutex_unlock(&of_snd_soc_mutex);
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(of_snd_soc_register_codec);
> +
> +int of_snd_soc_register_platform(struct snd_soc_platform *platform,
> + struct device_node *node,
> + struct snd_soc_cpu_dai *cpu_dai)
> +{
> + struct of_snd_soc_device *of_soc;
> + struct device_node *codec_node;
> + const phandle *handle;
> + int len, rc = 0;
> +
> + pr_info("registering ASoC platform driver: %s\n", node->full_name);
> +
> + handle = of_get_property(node, "codec-handle", &len);
> + if (!handle || len < sizeof(handle))
> + return -ENODEV;
> + codec_node = of_find_node_by_phandle(*handle);
> + if (!codec_node)
> + return -ENODEV;
> + pr_info("looking for codec: %s\n", codec_node->full_name);
> +
> + mutex_lock(&of_snd_soc_mutex);
> + of_soc = of_snd_soc_get_device(codec_node);
> + if (!of_soc) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + of_soc->platform_node = node;
> + of_soc->dai_link.cpu_dai = cpu_dai;
> + of_soc->device.platform = platform;
> + of_soc->machine.name = of_soc->dai_link.cpu_dai->name;
> +
> + /* Now try to register the SoC device */
> + of_snd_soc_register_device(of_soc);
> +
> + out:
> + mutex_unlock(&of_snd_soc_mutex);
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(of_snd_soc_register_platform);
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
next prev parent reply other threads:[~2008-07-14 14:16 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-12 8:39 [PATCH v2 1/3] ALSA SoC: Add OpenFirmware helper for matching bus and codec drivers Grant Likely
2008-07-12 8:39 ` Grant Likely
2008-07-12 8:39 ` [PATCH v2 2/3] ALSA SoC: Add mpc5200-psc I2S driver Grant Likely
2008-07-14 12:10 ` Mark Brown
2008-07-14 12:10 ` [alsa-devel] " Mark Brown
2008-07-12 8:39 ` [PATCH v2 3/3] ALSA SoC: Add Texas Instruments TLV320AIC26 codec driver Grant Likely
2008-07-12 8:39 ` Grant Likely
2008-07-12 18:10 ` Mark Brown
2008-07-12 18:10 ` [alsa-devel] " Mark Brown
2008-07-12 18:14 ` Grant Likely
2008-07-12 18:14 ` [alsa-devel] " Grant Likely
2008-07-14 11:45 ` Mark Brown
2008-07-14 11:45 ` [alsa-devel] " Mark Brown
2008-07-18 6:29 ` Grant Likely
2008-07-18 6:29 ` [alsa-devel] " Grant Likely
2008-07-18 10:39 ` Mark Brown
2008-07-18 10:39 ` [alsa-devel] " Mark Brown
2008-07-15 7:57 ` dinesh
2008-07-15 7:57 ` [alsa-devel] " dinesh
2008-07-15 10:33 ` Mark Brown
2008-07-15 10:33 ` [alsa-devel] " Mark Brown
2008-07-15 12:38 ` dinesh
2008-07-15 12:38 ` [alsa-devel] " dinesh
2008-07-15 12:46 ` Mark Brown
2008-07-15 12:46 ` [alsa-devel] " Mark Brown
2008-07-16 9:05 ` WRITING AN SOC DRIVER WITHOUT DMA dinesh
2008-07-16 9:05 ` dinesh
2008-07-16 10:07 ` Nobin Mathew
2008-07-16 10:07 ` [alsa-devel] " Nobin Mathew
2008-07-16 10:13 ` dinesh
2008-07-16 10:13 ` [alsa-devel] " dinesh
2008-07-17 6:03 ` dinesh
2008-07-17 6:03 ` [alsa-devel] " dinesh
2008-07-17 10:56 ` Mark Brown
2008-07-17 10:56 ` [alsa-devel] " Mark Brown
2008-07-17 11:26 ` Nobin Mathew
2008-07-17 11:26 ` [alsa-devel] " Nobin Mathew
2008-07-17 12:05 ` Jon Smirl
2008-07-17 12:05 ` [alsa-devel] " Jon Smirl
2008-07-17 16:02 ` [PATCH v2 3/3] ALSA SoC: Add Texas Instruments TLV320AIC26 codec driver Timur Tabi
2008-07-14 13:49 ` [PATCH v2 1/3] ALSA SoC: Add OpenFirmware helper for matching bus and codec drivers Mark Brown
2008-07-14 13:49 ` [alsa-devel] " Mark Brown
2008-07-14 14:13 ` Jon Smirl
2008-07-14 14:13 ` [alsa-devel] " Jon Smirl
2008-07-14 15:05 ` Mark Brown
2008-07-14 15:05 ` [alsa-devel] " Mark Brown
2008-07-14 16:14 ` Timur Tabi
2008-07-14 16:14 ` [alsa-devel] " Timur Tabi
2008-07-14 16:27 ` Grant Likely
2008-07-14 16:27 ` [alsa-devel] " Grant Likely
2008-07-14 16:53 ` Mark Brown
2008-07-14 16:53 ` [alsa-devel] " Mark Brown
2008-07-14 17:21 ` Grant Likely
2008-07-14 17:21 ` [alsa-devel] " Grant Likely
2008-07-14 18:36 ` Mark Brown
2008-07-14 18:36 ` [alsa-devel] " Mark Brown
2008-07-14 18:40 ` Timur Tabi
2008-07-14 18:40 ` [alsa-devel] " Timur Tabi
2008-07-14 18:49 ` Mark Brown
2008-07-14 18:49 ` [alsa-devel] " Mark Brown
2008-07-14 18:53 ` Timur Tabi
2008-07-14 18:53 ` [alsa-devel] " Timur Tabi
2008-07-14 22:28 ` Grant Likely
2008-07-14 22:28 ` [alsa-devel] " Grant Likely
2008-07-14 23:45 ` Jon Smirl
2008-07-14 23:45 ` [alsa-devel] " Jon Smirl
2008-07-15 10:13 ` Mark Brown
2008-07-15 10:13 ` [alsa-devel] " Mark Brown
2008-07-15 13:08 ` Jon Smirl
2008-07-15 13:08 ` [alsa-devel] " Jon Smirl
2008-07-15 14:04 ` Mark Brown
2008-07-15 14:04 ` [alsa-devel] " Mark Brown
2008-07-14 15:51 ` Timur Tabi
2008-07-14 15:51 ` [alsa-devel] " Timur Tabi
2008-07-14 17:06 ` Grant Likely
2008-07-14 17:06 ` [alsa-devel] " Grant Likely
2008-07-14 17:16 ` Mark Brown
2008-07-14 17:16 ` [alsa-devel] " Mark Brown
2008-07-14 17:22 ` Grant Likely
2008-07-14 17:22 ` [alsa-devel] " Grant Likely
2008-07-18 7:17 ` Grant Likely
2008-07-18 7:17 ` [alsa-devel] " Grant Likely
2008-07-18 10:00 ` Mark Brown
2008-07-18 10:00 ` [alsa-devel] " Mark Brown
2008-07-18 14:59 ` Timur Tabi
2008-07-18 14:59 ` [alsa-devel] " Timur Tabi
2008-07-14 14:16 ` Anton Vorontsov [this message]
2008-07-14 14:16 ` Anton Vorontsov
2008-07-14 17:11 ` Grant Likely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080714141606.GA22478@polina.dev.rtsoft.ru \
--to=avorontsov@ru.mvista.com \
--cc=alsa-devel@alsa-project.org \
--cc=grant.likely@secretlab.ca \
--cc=liam.girdwood@wolfsonmicro.com \
--cc=linuxppc-dev@ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.