All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/4] Adding OMAP DMIC driver to kernel
@ 2011-01-25 22:00 David Lambert
  2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: David Lambert @ 2011-01-25 22:00 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: Tony Lindgren, Paul Walmsley, Mark Brown, David Lambert, Liam Girdwood

This is a patch series to add the OMAP Digital Microphone
driver for OMAP4.

It includes the driver, a generic DMIC codec, platform devices,
as well as HWMOD entries for OMAP44xx chipsets.

Note: The DMIC codec driver was removed from this series as it was
accepted for and merged for the 2.6.38 kernel.

Benoit Cousson (1):
  OMAP4: hwmod: add entries for DMIC driver

David Lambert (3):
  ASoC: DMIC: Adding the OMAP DMIC driver
  OMAP4: DMIC: initializes the DMIC driver
  OMAP4: DMIC: Add DMIC codec platform devices

 arch/arm/mach-omap2/board-4430sdp.c        |   11 +
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   91 +++++
 arch/arm/plat-omap/devices.c               |   35 ++
 arch/arm/plat-omap/include/plat/dmic.h     |   82 +++++
 sound/soc/omap/Kconfig                     |    3 +
 sound/soc/omap/Makefile                    |    2 +
 sound/soc/omap/omap-dmic.c                 |  534 ++++++++++++++++++++++++++++
 7 files changed, 758 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/plat-omap/include/plat/dmic.h
 create mode 100644 sound/soc/omap/omap-dmic.c

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver
  2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
@ 2011-01-25 22:00 ` David Lambert
  2011-01-28  7:43   ` Varadarajan, Charulatha
  2011-01-28  8:45   ` Varadarajan, Charulatha
  2011-01-25 22:01 ` [PATCH v3 2/4] OMAP4: hwmod: add entries for " David Lambert
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 13+ messages in thread
From: David Lambert @ 2011-01-25 22:00 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: Tony Lindgren, Paul Walmsley, Mark Brown, Liam Girdwood, David Lambert

This patch adds support for the OMAP4 digital microphone DAI.

This DAI can support support recording in 2, 4, or 6 channels

When provided with a 19.2Mhz functional clock, can encode at 96Khz or
192Khz (all channels must have the same sample rate).

Details of the hardware interface can be found in the OMAP4 TRM in Section 23.7

Signed-off-by: David Lambert <dlambert@ti.com>
---
 arch/arm/plat-omap/include/plat/dmic.h |   82 +++++
 sound/soc/omap/Kconfig                 |    3 +
 sound/soc/omap/Makefile                |    2 +
 sound/soc/omap/omap-dmic.c             |  534 ++++++++++++++++++++++++++++++++
 4 files changed, 621 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/plat-omap/include/plat/dmic.h
 create mode 100644 sound/soc/omap/omap-dmic.c

diff --git a/arch/arm/plat-omap/include/plat/dmic.h b/arch/arm/plat-omap/include/plat/dmic.h
new file mode 100644
index 0000000..a72e080
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/dmic.h
@@ -0,0 +1,82 @@
+/*
+ * omap-dmic.h  --  OMAP Digital Microphone Controller
+ *
+ * Author: Liam Girdwood <lrg@slimlogic.co.uk>
+ *	   David Lambert <dlambert@ti.com>
+ *	   Misael Lopez Cruz <misael.lopez@ti.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 __ASM_ARCH_OMAP_DMIC_H
+#define __ASM_ARCH_OMAP_DMIC_H
+
+#define OMAP44XX_DMIC_L3_BASE	0x4902e000
+
+#define OMAP_DMIC_REVISION		0x00
+#define OMAP_DMIC_SYSCONFIG		0x10
+#define OMAP_DMIC_IRQSTATUS_RAW		0x24
+#define OMAP_DMIC_IRQSTATUS		0x28
+#define OMAP_DMIC_IRQENABLE_SET		0x2C
+#define OMAP_DMIC_IRQENABLE_CLR		0x30
+#define OMAP_DMIC_IRQWAKE_EN		0x34
+#define OMAP_DMIC_DMAENABLE_SET		0x38
+#define OMAP_DMIC_DMAENABLE_CLR		0x3C
+#define OMAP_DMIC_DMAWAKEEN		0x40
+#define OMAP_DMIC_CTRL			0x44
+#define OMAP_DMIC_DATA			0x48
+#define OMAP_DMIC_FIFO_CTRL		0x4C
+#define OMAP_DMIC_FIFO_DMIC1R_DATA	0x50
+#define OMAP_DMIC_FIFO_DMIC1L_DATA	0x54
+#define OMAP_DMIC_FIFO_DMIC2R_DATA	0x58
+#define OMAP_DMIC_FIFO_DMIC2L_DATA	0x5C
+#define OMAP_DMIC_FIFO_DMIC3R_DATA	0x60
+#define OMAP_DMIC_FIFO_DMIC3L_DATA	0x64
+
+/*
+ * DMIC_IRQ bit fields
+ * IRQSTATUS_RAW, IRQSTATUS, IRQENABLE_SET, IRQENABLE_CLR
+ */
+
+#define OMAP_DMIC_IRQ			(1 << 0)
+#define OMAP_DMIC_IRQ_FULL		(1 << 1)
+#define OMAP_DMIC_IRQ_ALMST_EMPTY	(1 << 2)
+#define OMAP_DMIC_IRQ_EMPTY		(1 << 3)
+#define OMAP_DMIC_IRQ_MASK		0x07
+
+/*
+ * DMIC_DMAENABLE bit fields
+ */
+
+#define OMAP_DMIC_DMA_ENABLE		0x1
+
+/*
+ * DMIC_CTRL bit fields
+ */
+
+#define OMAP_DMIC_UP1_ENABLE		0x0001
+#define OMAP_DMIC_UP2_ENABLE		0x0002
+#define OMAP_DMIC_UP3_ENABLE		0x0004
+#define OMAP_DMIC_FORMAT		0x0008
+#define OMAP_DMIC_POLAR1		0x0010
+#define OMAP_DMIC_POLAR2		0x0020
+#define OMAP_DMIC_POLAR3		0x0040
+#define OMAP_DMIC_POLAR_MASK		0x0070
+#define OMAP_DMIC_CLK_DIV_SHIFT		7
+#define OMAP_DMIC_CLK_DIV_MASK		0x0380
+#define	OMAP_DMIC_RESET			0x0400
+
+#define OMAP_DMIC_ENABLE_MASK		0x007
+
+#define OMAP_DMICOUTFORMAT_LJUST	(0 << 3)
+#define OMAP_DMICOUTFORMAT_RJUST	(1 << 3)
+
+/*
+ * DMIC_FIFO_CTRL bit fields
+ */
+
+#define OMAP_DMIC_THRES_MAX		0xF
+
+#endif
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig
index a088db6..818ead3 100644
--- a/sound/soc/omap/Kconfig
+++ b/sound/soc/omap/Kconfig
@@ -9,6 +9,9 @@ config SND_OMAP_SOC_MCBSP
 config SND_OMAP_SOC_MCPDM
 	tristate
 
+config SND_OMAP_SOC_DMIC
+	tristate
+
 config SND_OMAP_SOC_N810
 	tristate "SoC Audio support for Nokia N810"
 	depends on SND_OMAP_SOC && MACH_NOKIA_N810 && I2C
diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile
index ba9fc65..6ff27f5 100644
--- a/sound/soc/omap/Makefile
+++ b/sound/soc/omap/Makefile
@@ -1,9 +1,11 @@
 # OMAP Platform Support
 snd-soc-omap-objs := omap-pcm.o
+snd-soc-omap-dmic-objs := omap-dmic.o
 snd-soc-omap-mcbsp-objs := omap-mcbsp.o
 snd-soc-omap-mcpdm-objs := omap-mcpdm.o mcpdm.o
 
 obj-$(CONFIG_SND_OMAP_SOC) += snd-soc-omap.o
+obj-$(CONFIG_SND_OMAP_SOC_DMIC) += snd-soc-omap-dmic.o
 obj-$(CONFIG_SND_OMAP_SOC_MCBSP) += snd-soc-omap-mcbsp.o
 obj-$(CONFIG_SND_OMAP_SOC_MCPDM) += snd-soc-omap-mcpdm.o
 
diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c
new file mode 100644
index 0000000..06dbb99
--- /dev/null
+++ b/sound/soc/omap/omap-dmic.c
@@ -0,0 +1,534 @@
+/*
+ * omap-dmic.c  --  OMAP ASoC DMIC DAI driver
+ *
+ * Copyright (C) 2010 Texas Instruments
+ *
+ * Author: Liam Girdwood <lrg@slimlogic.co.uk>
+ *	   David Lambert <dlambert@ti.com>
+ *	   Misael Lopez Cruz <misael.lopez@ti.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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#undef DEBUG
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/wait.h>
+#include <linux/interrupt.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/pm_runtime.h>
+
+#include <plat/control.h>
+#include <plat/dma.h>
+#include <plat/dmic.h>
+#include <plat/omap_hwmod.h>
+
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/initval.h>
+#include <sound/soc.h>
+
+#include "omap-pcm.h"
+
+#define OMAP_DMIC_RATES		(SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
+#define OMAP_DMIC_FORMATS	SNDRV_PCM_FMTBIT_S32_LE
+
+struct omap_dmic {
+	struct device *dev;
+	void __iomem *io_base;
+	int clk_freq;
+	int sysclk;
+	int active;
+	spinlock_t lock;
+	struct omap_dmic_link *link;
+};
+
+struct omap_dmic_link {
+	int threshold;
+	int format;
+	int channels;
+	int polar;
+};
+
+static struct omap_dmic_link omap_dmic_link = {
+	.threshold	= 2,
+	.format		= OMAP_DMICOUTFORMAT_LJUST,
+	.polar		= OMAP_DMIC_POLAR1 | OMAP_DMIC_POLAR2
+				| OMAP_DMIC_POLAR3,
+};
+
+/*
+ * Stream DMA parameters
+ */
+static struct omap_pcm_dma_data omap_dmic_dai_dma_params = {
+	.name		= "DMIC capture",
+	.data_type	= OMAP_DMA_DATA_TYPE_S32,
+	.sync_mode	= OMAP_DMA_SYNC_PACKET,
+	.packet_size	= 2,
+	.port_addr	= OMAP44XX_DMIC_L3_BASE + OMAP_DMIC_DATA,
+};
+
+enum omap_dmic_clk {
+	OMAP_DMIC_SYSCLK_PAD_CLKS,		/* PAD_CLKS */
+	OMAP_DMIC_SYSCLK_SLIMBLUS_CLKS,		/* SLIMBUS_CLK */
+	OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS,		/* DMIC_SYNC_MUX_CLK */
+};
+
+/* DMIC dividers */
+enum omap_dmic_div {
+	OMAP_DMIC_CLKDIV,
+};
+
+static inline void omap_dmic_write(struct omap_dmic *dmic,
+		u16 reg, u32 val)
+{
+	__raw_writel(val, dmic->io_base + reg);
+}
+
+static inline int omap_dmic_read(struct omap_dmic *dmic, u16 reg)
+{
+	return __raw_readl(dmic->io_base + reg);
+}
+
+/*
+ * Enables the transfer through the DMIC interface
+ */
+static void omap_dmic_start(struct omap_dmic *dmic, int channels)
+{
+	u32 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL);
+	omap_dmic_write(dmic, OMAP_DMIC_CTRL, ctrl | channels);
+
+}
+
+/*
+ * Disables the transfer through the DMIC interface
+ */
+static void omap_dmic_stop(struct omap_dmic *dmic, int channels)
+{
+	u32 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL);
+	omap_dmic_write(dmic, OMAP_DMIC_CTRL, ctrl & ~channels);
+}
+
+static int omap_dmic_set_clkdiv(struct snd_soc_dai *dai,
+				int div_id, int div)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+	int ctrl, div_sel = -EINVAL;
+
+	if (div_id != OMAP_DMIC_CLKDIV)
+		return -ENODEV;
+
+	switch (dmic->clk_freq) {
+	case 19200000:
+		switch (div) {
+		case 5:
+			div_sel = 0x1;
+			break;
+		case 8:
+			div_sel = 0x0;
+			break;
+		default:
+			dev_err(dai->dev, "invalid div_sel (%d) for freq", div);
+			return -EINVAL;
+			}
+		break;
+	case 24000000:
+		switch (div) {
+		case 10:
+			div_sel = 0x2;
+			break;
+		default:
+			dev_err(dai->dev, "invalid div_sel (%d) for freq", div);
+			return -EINVAL;
+			}
+		break;
+	case 24576000:
+		switch (div) {
+		case 8:
+			div_sel = 0x3;
+			break;
+		case 16:
+			div_sel = 0x4;
+			break;
+		default:
+			dev_err(dai->dev, "invalid div_sel (%d) for freq", div);
+			return -EINVAL;
+			}
+		break;
+	case 12000000:
+		switch (div) {
+		case 5:
+			div_sel = 0x5;
+			break;
+		default:
+			dev_err(dai->dev, "invalid div_sel (%d) for freq", div);
+			return -EINVAL;
+			}
+		break;
+	default:
+		dev_err(dai->dev, "invalid freq %d\n", dmic->clk_freq);
+		return -EINVAL;
+	}
+
+	if (div_sel < 0) {
+		dev_err(dai->dev, "divider not supported %d\n", div);
+		return -EINVAL;
+	}
+
+	ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL) & ~OMAP_DMIC_CLK_DIV_MASK;
+
+	omap_dmic_write(dmic, OMAP_DMIC_CTRL,
+			ctrl | (div_sel << OMAP_DMIC_CLK_DIV_SHIFT));
+
+	return 0;
+}
+
+/*
+ * Configures DMIC for audio recording.
+ * This function should be called before omap_dmic_start.
+ */
+static int omap_dmic_open(struct omap_dmic *dmic)
+{
+	struct omap_dmic_link *link = dmic->link;
+	u32 ctrl;
+
+	/* Configure uplink threshold */
+	if (link->threshold > OMAP_DMIC_THRES_MAX)
+		link->threshold = OMAP_DMIC_THRES_MAX;
+
+	omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL, link->threshold);
+
+	/* Configure DMA controller */
+	omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_SET, OMAP_DMIC_DMA_ENABLE);
+
+	/* Set dmic out format */
+	ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL)
+		& ~(OMAP_DMIC_FORMAT | OMAP_DMIC_POLAR_MASK);
+	omap_dmic_write(dmic, OMAP_DMIC_CTRL,
+			ctrl | link->format | link->polar);
+
+	return 0;
+}
+
+/*
+ * Cleans DMIC uplink configuration.
+ * This function should be called when the stream is closed.
+ */
+static int omap_dmic_close(struct omap_dmic *dmic)
+{
+
+	/* Disable DMA request generation */
+	omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_CLR, OMAP_DMIC_DMA_ENABLE);
+
+	return 0;
+}
+
+static int omap_dmic_dai_startup(struct snd_pcm_substream *substream,
+				  struct snd_soc_dai *dai)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+
+	dmic->active++;
+	pm_runtime_get_sync(dmic->dev);
+
+	return 0;
+}
+
+static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream,
+				    struct snd_soc_dai *dai)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+
+	dmic->active--;
+	pm_runtime_put_sync(dmic->dev);
+}
+
+static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream,
+				    struct snd_pcm_hw_params *params,
+				    struct snd_soc_dai *dai)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+	struct omap_dmic_link *link = dmic->link;
+	int channels, rate, div;
+	int ret = 0;
+
+	channels = params_channels(params);
+	switch (channels) {
+	case 6:
+		link->channels = OMAP_DMIC_UP1_ENABLE | OMAP_DMIC_UP2_ENABLE
+			 | OMAP_DMIC_UP3_ENABLE;
+		break;
+	case 4:
+		link->channels = OMAP_DMIC_UP1_ENABLE | OMAP_DMIC_UP2_ENABLE;
+		break;
+	case 2:
+		link->channels = OMAP_DMIC_UP1_ENABLE;
+		break;
+	default:
+		dev_err(dmic->dev, "invalid number of channels\n");
+		return -EINVAL;
+	}
+
+	rate = params_rate(params);
+	switch (rate) {
+	case 96000:
+		div = 8;
+		break;
+	case 192000:
+		div = 5;
+		break;
+	default:
+		dev_err(dmic->dev, "invalid frequency\n");
+		return -EINVAL;
+	}
+
+	omap_dmic_set_clkdiv(dai, OMAP_DMIC_CLKDIV, div);
+
+	omap_dmic_dai_dma_params.packet_size = link->threshold * channels;
+	snd_soc_dai_set_dma_data(dai, substream, &omap_dmic_dai_dma_params);
+
+	if (dmic->active == 1)
+		ret = omap_dmic_open(dmic);
+
+	return ret;
+}
+
+static int omap_dmic_dai_hw_free(struct snd_pcm_substream *substream,
+				  struct snd_soc_dai *dai)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+	struct omap_dmic_link *link = dmic->link;
+	int ret = 0;
+
+	if (dmic->active == 1) {
+		ret = omap_dmic_close(dmic);
+		link->channels = 0;
+	}
+
+	return ret;
+}
+
+static int omap_dmic_dai_trigger(struct snd_pcm_substream *substream,
+				  int cmd, struct snd_soc_dai *dai)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+	int dmic_id = dmic->link->channels;
+
+	switch (cmd) {
+	case SNDRV_PCM_TRIGGER_START:
+		omap_dmic_start(dmic, dmic_id);
+		break;
+	case SNDRV_PCM_TRIGGER_STOP:
+		omap_dmic_stop(dmic, dmic_id);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int omap_dmic_set_dai_sysclk(struct snd_soc_dai *dai,
+				    int clk_id, unsigned int freq,
+				    int dir)
+{
+	struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
+	struct clk *dmic_clk, *parent_clk;
+	int ret = 0;
+
+	dmic_clk = clk_get(NULL, "dmic_fck");
+	if (IS_ERR(dmic_clk))
+		return -ENODEV;
+
+	switch (clk_id) {
+	case OMAP_DMIC_SYSCLK_PAD_CLKS:
+		parent_clk = clk_get(NULL, "pad_clks_ck");
+		if (IS_ERR(parent_clk)) {
+			ret = -ENODEV;
+			goto err_par;
+		}
+		break;
+	case OMAP_DMIC_SYSCLK_SLIMBLUS_CLKS:
+		parent_clk = clk_get(NULL, "slimbus_clk");
+		if (IS_ERR(parent_clk)) {
+			ret = -ENODEV;
+			goto err_par;
+		}
+		break;
+	case OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS:
+		parent_clk = clk_get(NULL, "dmic_sync_mux_ck");
+		if (IS_ERR(parent_clk)) {
+			ret = -ENODEV;
+			goto err_par;
+		}
+		break;
+	default:
+		dev_err(dai->dev, "clk_id not supported %d\n", clk_id);
+		ret = -EINVAL;
+		goto err_par;
+	}
+
+	if (dmic->sysclk != clk_id) {
+		/* reparent not allowed if a stream is ongoing */
+		if (dmic->active > 1) {
+			ret = -EBUSY;
+			goto err_busy;
+		}
+
+		/* disable clock while reparenting */
+		if (dmic->active == 1)
+			pm_runtime_put_sync(dmic->dev);
+
+		ret = clk_set_parent(dmic_clk, parent_clk);
+
+		if (dmic->active == 1)
+			pm_runtime_get_sync(dmic->dev);
+
+		dmic->sysclk = clk_id;
+	}
+
+	dmic->clk_freq = clk_get_rate(dmic_clk);
+
+err_busy:
+	clk_put(parent_clk);
+err_par:
+	clk_put(dmic_clk);
+
+	return ret;
+}
+
+static struct snd_soc_dai_ops omap_dmic_dai_ops = {
+	.startup	= omap_dmic_dai_startup,
+	.shutdown	= omap_dmic_dai_shutdown,
+	.hw_params	= omap_dmic_dai_hw_params,
+	.trigger	= omap_dmic_dai_trigger,
+	.hw_free	= omap_dmic_dai_hw_free,
+	.set_sysclk	= omap_dmic_set_dai_sysclk,
+	.set_clkdiv	= omap_dmic_set_clkdiv,
+};
+
+static struct snd_soc_dai_driver omap_dmic_dai = {
+
+	.name = "omap-dmic-dai-0",
+	.capture = {
+		.channels_min = 2,
+		.channels_max = 6,
+		.rates = OMAP_DMIC_RATES,
+		.formats = OMAP_DMIC_FORMATS,
+	},
+	.ops = &omap_dmic_dai_ops,
+};
+
+static __devinit int asoc_dmic_probe(struct platform_device *pdev)
+{
+	struct omap_dmic *dmic;
+	struct resource *res;
+	int ret;
+
+	dmic = kzalloc(sizeof(struct omap_dmic), GFP_KERNEL);
+	if (!dmic)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, dmic);
+	dmic->dev = &pdev->dev;
+	dmic->link = &omap_dmic_link;
+	dmic->sysclk = OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS;
+
+	spin_lock_init(&dmic->lock);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(dmic->dev, "invalid memory resource\n");
+		ret = -ENODEV;
+		goto err_res;
+	}
+
+	dmic->io_base = ioremap(res->start, resource_size(res));
+	if (!dmic->io_base) {
+		ret = -ENOMEM;
+		goto err_res;
+	}
+
+	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+	if (!res) {
+		dev_err(dmic->dev, "invalid dma resource\n");
+		ret = -ENODEV;
+		goto err_dai;
+	}
+	omap_dmic_dai_dma_params.dma_req = res->start;
+
+	pm_runtime_enable(dmic->dev);
+
+	/* Disable lines while request is ongoing */
+	omap_dmic_write(dmic, OMAP_DMIC_CTRL, 0x00);
+
+	ret = snd_soc_register_dais(&pdev->dev, &omap_dmic_dai, 1);
+	if (ret)
+		goto err_dai;
+
+	return 0;
+
+err_dai:
+	iounmap(dmic->io_base);
+err_res:
+	kfree(dmic);
+	return ret;
+}
+
+static int __devexit asoc_dmic_remove(struct platform_device *pdev)
+{
+	struct omap_dmic *dmic = platform_get_drvdata(pdev);
+
+	snd_soc_unregister_dai(&pdev->dev);
+	iounmap(dmic->io_base);
+	pm_runtime_disable(dmic->dev);
+	kfree(dmic);
+
+	return 0;
+}
+
+static struct platform_driver asoc_dmic_driver = {
+	.driver = {
+		.name = "omap-dmic-dai",
+		.owner = THIS_MODULE,
+	},
+	.probe = asoc_dmic_probe,
+	.remove = __devexit_p(asoc_dmic_remove),
+};
+
+static int __init snd_omap_dmic_init(void)
+{
+	return platform_driver_register(&asoc_dmic_driver);
+}
+module_init(snd_omap_dmic_init);
+
+static void __exit snd_omap_dmic_exit(void)
+{
+	platform_driver_unregister(&asoc_dmic_driver);
+}
+module_exit(snd_omap_dmic_exit);
+
+MODULE_ALIAS("platform:omap-dmic-dai");
+MODULE_AUTHOR("David Lambert <dlambert@ti.com>");
+MODULE_DESCRIPTION("OMAP DMIC SoC Interface");
+MODULE_LICENSE("GPL");
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 2/4] OMAP4: hwmod: add entries for DMIC driver
  2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
  2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
@ 2011-01-25 22:01 ` David Lambert
  2011-01-25 23:54   ` Paul Walmsley
  2011-02-14 15:36   ` Cousson, Benoit
  2011-01-25 22:01 ` [PATCH v3 3/4] OMAP4: DMIC: initializes the " David Lambert
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 13+ messages in thread
From: David Lambert @ 2011-01-25 22:01 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: Paul Walmsley, Benoit Cousson, Tony Lindgren, Mark Brown,
	David Lambert, Liam Girdwood

From: Benoit Cousson <b-cousson@ti.com>

Adds HWMOD entries for the OMAP DMIC driver and creates
a platform device.  The HWMOD entires define the system
resource requirements for the drvier such as DMA addresses, channels,
and IRQ's.  Placing this information in the HWMOD database allows
for more generic drivers to be written and having the specific
implementation details defined in HWMOD.

Signed-off-by: David Lambert <dlambert@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   91 ++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 7274db4..f9b2ad3 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -383,6 +383,95 @@ static struct omap_hwmod omap44xx_l4_wkup_hwmod = {
 };
 
 /*
+ * 'dmic' class
+ * digital microphone controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap44xx_dmic_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.sysc_flags	= (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+	.sysc_fields	= &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap44xx_dmic_hwmod_class = {
+	.name = "omap-dmic",
+	.sysc = &omap44xx_dmic_sysc,
+};
+
+/* dmic */
+static struct omap_hwmod omap44xx_dmic_hwmod;
+static struct omap_hwmod_irq_info omap44xx_dmic_irqs[] = {
+	{ .irq = 114 + OMAP44XX_IRQ_GIC_START },
+};
+
+static struct omap_hwmod_dma_info omap44xx_dmic_sdma_reqs[] = {
+	{ .dma_req = 66 + OMAP44XX_DMA_REQ_START },
+};
+
+static struct omap_hwmod_addr_space omap44xx_dmic_addrs[] = {
+	{
+		.pa_start	= 0x4012e000,
+		.pa_end		= 0x4012e07f,
+		.flags		= ADDR_TYPE_RT
+	},
+};
+
+/* l4_abe -> dmic */
+static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic = {
+	.master		= &omap44xx_l4_abe_hwmod,
+	.slave		= &omap44xx_dmic_hwmod,
+	.clk		= "ocp_abe_iclk",
+	.addr		= omap44xx_dmic_addrs,
+	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_addrs),
+	.user		= OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space omap44xx_dmic_dma_addrs[] = {
+	{
+		.pa_start	= 0x4902e000,
+		.pa_end		= 0x4902e07f,
+		.flags		= ADDR_TYPE_RT
+	},
+};
+
+/* l4_abe -> dmic (dma) */
+static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic_dma = {
+	.master		= &omap44xx_l4_abe_hwmod,
+	.slave		= &omap44xx_dmic_hwmod,
+	.clk		= "ocp_abe_iclk",
+	.addr		= omap44xx_dmic_dma_addrs,
+	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_dma_addrs),
+	.user		= OCP_USER_SDMA,
+};
+
+/* dmic slave ports */
+static struct omap_hwmod_ocp_if *omap44xx_dmic_slaves[] = {
+	&omap44xx_l4_abe__dmic,
+	&omap44xx_l4_abe__dmic_dma,
+};
+
+static struct omap_hwmod omap44xx_dmic_hwmod = {
+	.name		= "omap-dmic",
+	.class		= &omap44xx_dmic_hwmod_class,
+	.mpu_irqs	= omap44xx_dmic_irqs,
+	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_dmic_irqs),
+	.sdma_reqs	= omap44xx_dmic_sdma_reqs,
+	.sdma_reqs_cnt	= ARRAY_SIZE(omap44xx_dmic_sdma_reqs),
+	.main_clk	= "dmic_fck",
+	.prcm = {
+		.omap4 = {
+			.clkctrl_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
+		},
+	},
+	.slaves		= omap44xx_dmic_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_dmic_slaves),
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+};
+
+/*
  * 'mpu_bus' class
  * instance(s): mpu_private
  */
@@ -826,6 +915,8 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
 	&omap44xx_l4_cfg_hwmod,
 	&omap44xx_l4_per_hwmod,
 	&omap44xx_l4_wkup_hwmod,
+	/* dmic class */
+	&omap44xx_dmic_hwmod,
 	/* mpu_bus class */
 	&omap44xx_mpu_private_hwmod,
 
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 3/4] OMAP4: DMIC: initializes the DMIC driver
  2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
  2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
  2011-01-25 22:01 ` [PATCH v3 2/4] OMAP4: hwmod: add entries for " David Lambert
@ 2011-01-25 22:01 ` David Lambert
  2011-01-28  7:46   ` Varadarajan, Charulatha
  2011-01-25 22:01 ` [PATCH v3 4/4] OMAP4: DMIC: Add DMIC codec platform devices David Lambert
  2011-01-26  1:22 ` [PATCH v3 0/4] Adding OMAP DMIC driver to kernel G, Manjunath Kondaiah
  4 siblings, 1 reply; 13+ messages in thread
From: David Lambert @ 2011-01-25 22:01 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: Tony Lindgren, Paul Walmsley, Mark Brown, Liam Girdwood, David Lambert

This code is used to read the HWMOD database and initialize
the DMIC driver.

Signed-off-by: David Lambert <dlambert@ti.com>
---
 arch/arm/plat-omap/devices.c |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c
index fc81912..b347f75 100644
--- a/arch/arm/plat-omap/devices.c
+++ b/arch/arm/plat-omap/devices.c
@@ -72,6 +72,40 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
 
 /*-------------------------------------------------------------------------*/
 
+#if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
+	defined(CONFIG_SND_OMAP_SOC_DMIC_MODULE)
+
+static struct omap_device_pm_latency omap_dmic_latency[] = {
+	{
+		.deactivate_func = omap_device_idle_hwmods,
+		.activate_func = omap_device_enable_hwmods,
+		.flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
+	},
+};
+
+static void omap_init_dmic(void)
+{
+	struct omap_hwmod *oh;
+	struct omap_device *od;
+
+	oh = omap_hwmod_lookup("omap-dmic");
+	if (!oh) {
+		printk(KERN_ERR "Could not look up dmic hw_mod\n");
+		return;
+	}
+
+	od = omap_device_build("omap-dmic-dai", -1, oh, NULL, 0,
+				omap_dmic_latency,
+				ARRAY_SIZE(omap_dmic_latency), 0);
+	if (IS_ERR(od))
+		printk(KERN_ERR "Could not build omap_device for omap-dmic-dai\n");
+}
+#else
+static inline void omap_init_dmic(void) {}
+#endif
+
+/*-------------------------------------------------------------------------*/
+
 #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
 		defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
 
@@ -328,6 +362,7 @@ static int __init omap_init_devices(void)
 	/* please keep these calls, and their implementations above,
 	 * in alphabetical order so they're easier to sort through.
 	 */
+	omap_init_dmic();
 	omap_init_rng();
 	omap_init_mcpdm();
 	omap_init_uwire();
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 4/4] OMAP4: DMIC: Add DMIC codec platform devices
  2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
                   ` (2 preceding siblings ...)
  2011-01-25 22:01 ` [PATCH v3 3/4] OMAP4: DMIC: initializes the " David Lambert
@ 2011-01-25 22:01 ` David Lambert
  2011-01-26  1:22 ` [PATCH v3 0/4] Adding OMAP DMIC driver to kernel G, Manjunath Kondaiah
  4 siblings, 0 replies; 13+ messages in thread
From: David Lambert @ 2011-01-25 22:01 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: Tony Lindgren, Paul Walmsley, Mark Brown, Liam Girdwood, David Lambert

This creates the DMIC codec platform devices.

The platform devices create an instance of the driver during boot up.

Signed-off-by: David Lambert <dlambert@ti.com>
---
 arch/arm/mach-omap2/board-4430sdp.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index df5a425..e7745cf 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -505,6 +505,16 @@ static void __init omap_sfh7741prox_init(void)
 	}
 }
 
+static struct platform_device codec_dmic0 = {
+	.name   = "dmic-codec",
+	.id     = -1,
+};
+
+static inline void omap_dmic_init(void)
+{
+	platform_device_register(&codec_dmic0);
+}
+
 static void __init omap_4430sdp_init(void)
 {
 	int status;
@@ -528,6 +538,7 @@ static void __init omap_4430sdp_init(void)
 		spi_register_board_info(sdp4430_spi_board_info,
 				ARRAY_SIZE(sdp4430_spi_board_info));
 	}
+	omap_dmic_init();
 }
 
 static void __init omap_4430sdp_map_io(void)
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/4] OMAP4: hwmod: add entries for DMIC driver
  2011-01-25 22:01 ` [PATCH v3 2/4] OMAP4: hwmod: add entries for " David Lambert
@ 2011-01-25 23:54   ` Paul Walmsley
  2011-01-26 12:55     ` Lambert, David
  2011-02-14 15:36   ` Cousson, Benoit
  1 sibling, 1 reply; 13+ messages in thread
From: Paul Walmsley @ 2011-01-25 23:54 UTC (permalink / raw)
  To: Benoit Cousson, David Lambert
  Cc: alsa-devel, linux-omap, Tony Lindgren, Mark Brown, Liam Girdwood

On Tue, 25 Jan 2011, David Lambert wrote:

> From: Benoit Cousson <b-cousson@ti.com>
> 
> Adds HWMOD entries for the OMAP DMIC driver and creates
> a platform device.  The HWMOD entires define the system
> resource requirements for the drvier such as DMA addresses, channels,
> and IRQ's.  Placing this information in the HWMOD database allows
> for more generic drivers to be written and having the specific
> implementation details defined in HWMOD.
> 
> Signed-off-by: David Lambert <dlambert@ti.com>

This should have Benoit's Signed-off-by: also.


- Paul

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/4] Adding OMAP DMIC driver to kernel
  2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
                   ` (3 preceding siblings ...)
  2011-01-25 22:01 ` [PATCH v3 4/4] OMAP4: DMIC: Add DMIC codec platform devices David Lambert
@ 2011-01-26  1:22 ` G, Manjunath Kondaiah
  4 siblings, 0 replies; 13+ messages in thread
From: G, Manjunath Kondaiah @ 2011-01-26  1:22 UTC (permalink / raw)
  To: David Lambert
  Cc: alsa-devel, linux-omap, Tony Lindgren, Paul Walmsley, Mark Brown,
	Liam Girdwood

On Tue, Jan 25, 2011 at 04:00:58PM -0600, David Lambert wrote:
> This is a patch series to add the OMAP Digital Microphone
> driver for OMAP4.
> 
> It includes the driver, a generic DMIC codec, platform devices,
> as well as HWMOD entries for OMAP44xx chipsets.
> 
> Note: The DMIC codec driver was removed from this series as it was
> accepted for and merged for the 2.6.38 kernel.

You have not mentioned the baseline for this patch series. I tried to apply
first patch of this series on linux omap master branch, patch applies cleanly
but the changes are not getting compiled eventhough it is enabled in Makefile
if I use omap2plus_defconfig. Am I missing anything?

-Manjunath

> 
> Benoit Cousson (1):
>   OMAP4: hwmod: add entries for DMIC driver
> 
> David Lambert (3):
>   ASoC: DMIC: Adding the OMAP DMIC driver
>   OMAP4: DMIC: initializes the DMIC driver
>   OMAP4: DMIC: Add DMIC codec platform devices
> 
>  arch/arm/mach-omap2/board-4430sdp.c        |   11 +
>  arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   91 +++++
>  arch/arm/plat-omap/devices.c               |   35 ++
>  arch/arm/plat-omap/include/plat/dmic.h     |   82 +++++
>  sound/soc/omap/Kconfig                     |    3 +
>  sound/soc/omap/Makefile                    |    2 +
>  sound/soc/omap/omap-dmic.c                 |  534 ++++++++++++++++++++++++++++
>  7 files changed, 758 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/plat-omap/include/plat/dmic.h
>  create mode 100644 sound/soc/omap/omap-dmic.c
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/4] OMAP4: hwmod: add entries for DMIC driver
  2011-01-25 23:54   ` Paul Walmsley
@ 2011-01-26 12:55     ` Lambert, David
  2011-01-26 17:28       ` Paul Walmsley
  0 siblings, 1 reply; 13+ messages in thread
From: Lambert, David @ 2011-01-26 12:55 UTC (permalink / raw)
  To: Paul Walmsley
  Cc: Benoit Cousson, alsa-devel, linux-omap, Tony Lindgren,
	Mark Brown, Liam Girdwood

On Tue, Jan 25, 2011 at 5:54 PM, Paul Walmsley <paul@pwsan.com> wrote:
>
> On Tue, 25 Jan 2011, David Lambert wrote:
>
> > From: Benoit Cousson <b-cousson@ti.com>
> >
> > Adds HWMOD entries for the OMAP DMIC driver and creates
> > a platform device.  The HWMOD entires define the system
> > resource requirements for the drvier such as DMA addresses, channels,
> > and IRQ's.  Placing this information in the HWMOD database allows
> > for more generic drivers to be written and having the specific
> > implementation details defined in HWMOD.
> >
> > Signed-off-by: David Lambert <dlambert@ti.com>
>
> This should have Benoit's Signed-off-by: also.
>

OK... Benoit has already agreed to it... will it be sufficient if I
just have him ACK the
change here on e-mail?

--
David Lambert
OMAP™ Multimedia
214-567-5692
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/4] OMAP4: hwmod: add entries for DMIC driver
  2011-01-26 12:55     ` Lambert, David
@ 2011-01-26 17:28       ` Paul Walmsley
  0 siblings, 0 replies; 13+ messages in thread
From: Paul Walmsley @ 2011-01-26 17:28 UTC (permalink / raw)
  To: Lambert, David
  Cc: Benoit Cousson, alsa-devel, linux-omap, Tony Lindgren,
	Mark Brown, Liam Girdwood

[-- Attachment #1: Type: TEXT/PLAIN, Size: 888 bytes --]

On Wed, 26 Jan 2011, Lambert, David wrote:

> On Tue, Jan 25, 2011 at 5:54 PM, Paul Walmsley <paul@pwsan.com> wrote:
> >
> > On Tue, 25 Jan 2011, David Lambert wrote:
> >
> > > From: Benoit Cousson <b-cousson@ti.com>
> > >
> > > Adds HWMOD entries for the OMAP DMIC driver and creates
> > > a platform device.  The HWMOD entires define the system
> > > resource requirements for the drvier such as DMA addresses, channels,
> > > and IRQ's.  Placing this information in the HWMOD database allows
> > > for more generic drivers to be written and having the specific
> > > implementation details defined in HWMOD.
> > >
> > > Signed-off-by: David Lambert <dlambert@ti.com>
> >
> > This should have Benoit's Signed-off-by: also.
> >
> 
> OK... Benoit has already agreed to it... will it be sufficient if I just 
> have him ACK the change here on e-mail?

Yes.

- Paul

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver
  2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
@ 2011-01-28  7:43   ` Varadarajan, Charulatha
  2011-01-28  8:45   ` Varadarajan, Charulatha
  1 sibling, 0 replies; 13+ messages in thread
From: Varadarajan, Charulatha @ 2011-01-28  7:43 UTC (permalink / raw)
  To: David Lambert
  Cc: alsa-devel, linux-omap, Tony Lindgren, Paul Walmsley, Mark Brown,
	Liam Girdwood

On Wed, Jan 26, 2011 at 03:30, David Lambert <dlambert@ti.com> wrote:
> This patch adds support for the OMAP4 digital microphone DAI.
>
> This DAI can support support recording in 2, 4, or 6 channels
>
> When provided with a 19.2Mhz functional clock, can encode at 96Khz or
> 192Khz (all channels must have the same sample rate).
>
> Details of the hardware interface can be found in the OMAP4 TRM in Section 23.7
>
> Signed-off-by: David Lambert <dlambert@ti.com>
> ---
>  arch/arm/plat-omap/include/plat/dmic.h |   82 +++++
>  sound/soc/omap/Kconfig                 |    3 +
>  sound/soc/omap/Makefile                |    2 +
>  sound/soc/omap/omap-dmic.c             |  534 ++++++++++++++++++++++++++++++++
>  4 files changed, 621 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/plat-omap/include/plat/dmic.h
>  create mode 100644 sound/soc/omap/omap-dmic.c
>
> diff --git a/arch/arm/plat-omap/include/plat/dmic.h b/arch/arm/plat-omap/include/plat/dmic.h
> new file mode 100644
> index 0000000..a72e080
> --- /dev/null
> +++ b/arch/arm/plat-omap/include/plat/dmic.h
> @@ -0,0 +1,82 @@
> +/*
> + * omap-dmic.h  --  OMAP Digital Microphone Controller
> + *
> + * Author: Liam Girdwood <lrg@slimlogic.co.uk>
> + *        David Lambert <dlambert@ti.com>
> + *        Misael Lopez Cruz <misael.lopez@ti.com>

Consider adding the copyright info.

> + *
> + * 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 __ASM_ARCH_OMAP_DMIC_H
> +#define __ASM_ARCH_OMAP_DMIC_H
> +
> +#define OMAP44XX_DMIC_L3_BASE  0x4902e000
> +
> +#define OMAP_DMIC_REVISION             0x00
> +#define OMAP_DMIC_SYSCONFIG            0x10

As this driver would use hwmod framework, it would be good
to avoid defining this macro in the driver. Anyway it is not
used in the driver.

> +#define OMAP_DMIC_IRQSTATUS_RAW                0x24
> +#define OMAP_DMIC_IRQSTATUS            0x28
> +#define OMAP_DMIC_IRQENABLE_SET                0x2C
> +#define OMAP_DMIC_IRQENABLE_CLR                0x30
> +#define OMAP_DMIC_IRQWAKE_EN           0x34
> +#define OMAP_DMIC_DMAENABLE_SET                0x38
> +#define OMAP_DMIC_DMAENABLE_CLR                0x3C
> +#define OMAP_DMIC_DMAWAKEEN            0x40
> +#define OMAP_DMIC_CTRL                 0x44
> +#define OMAP_DMIC_DATA                 0x48
> +#define OMAP_DMIC_FIFO_CTRL            0x4C
> +#define OMAP_DMIC_FIFO_DMIC1R_DATA     0x50
> +#define OMAP_DMIC_FIFO_DMIC1L_DATA     0x54
> +#define OMAP_DMIC_FIFO_DMIC2R_DATA     0x58
> +#define OMAP_DMIC_FIFO_DMIC2L_DATA     0x5C
> +#define OMAP_DMIC_FIFO_DMIC3R_DATA     0x60
> +#define OMAP_DMIC_FIFO_DMIC3L_DATA     0x64
> +
> +/*

<<snip>>

> diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c
> new file mode 100644
> index 0000000..06dbb99
> --- /dev/null
> +++ b/sound/soc/omap/omap-dmic.c
> @@ -0,0 +1,534 @@
> +/*
> + * omap-dmic.c  --  OMAP ASoC DMIC DAI driver
> + *
> + * Copyright (C) 2010 Texas Instruments
> + *
> + * Author: Liam Girdwood <lrg@slimlogic.co.uk>
> + *        David Lambert <dlambert@ti.com>
> + *        Misael Lopez Cruz <misael.lopez@ti.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.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
> + * 02110-1301 USA
> + *
> + */
> +
> +#undef DEBUG
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/wait.h>
> +#include <linux/interrupt.h>
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/io.h>
> +#include <linux/slab.h>
> +#include <linux/pm_runtime.h>
> +
> +#include <plat/control.h>
> +#include <plat/dma.h>
> +#include <plat/dmic.h>
> +#include <plat/omap_hwmod.h>

The above header file is not required in the driver

> +
> +#include <sound/core.h>
> +#include <sound/pcm.h>
> +#include <sound/pcm_params.h>
> +#include <sound/initval.h>
> +#include <sound/soc.h>
> +

<<snip>>

> +
> +static int omap_dmic_dai_trigger(struct snd_pcm_substream *substream,
> +                                 int cmd, struct snd_soc_dai *dai)
> +{
> +       struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
> +       int dmic_id = dmic->link->channels;
> +
> +       switch (cmd) {
> +       case SNDRV_PCM_TRIGGER_START:
> +               omap_dmic_start(dmic, dmic_id);
> +               break;
> +       case SNDRV_PCM_TRIGGER_STOP:
> +               omap_dmic_stop(dmic, dmic_id);
> +               break;
> +       default:

You may consider adding a "command not supported" warning if it would
be meaningful.

> +               break;
> +       }
> +
> +       return 0;
> +}
> +

<<snip>>

> +
> +static struct snd_soc_dai_driver omap_dmic_dai = {
> +
> +       .name = "omap-dmic-dai-0",
> +       .capture = {
> +               .channels_min = 2,
> +               .channels_max = 6,
> +               .rates = OMAP_DMIC_RATES,
> +               .formats = OMAP_DMIC_FORMATS,
> +       },
> +       .ops = &omap_dmic_dai_ops,
> +};
> +
> +static __devinit int asoc_dmic_probe(struct platform_device *pdev)
> +{
> +       struct omap_dmic *dmic;
> +       struct resource *res;
> +       int ret;
> +
> +       dmic = kzalloc(sizeof(struct omap_dmic), GFP_KERNEL);
> +       if (!dmic)
> +               return -ENOMEM;
> +
> +       platform_set_drvdata(pdev, dmic);
> +       dmic->dev = &pdev->dev;
> +       dmic->link = &omap_dmic_link;
> +       dmic->sysclk = OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS;
> +
> +       spin_lock_init(&dmic->lock);
> +
> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       if (!res) {
> +               dev_err(dmic->dev, "invalid memory resource\n");
> +               ret = -ENODEV;
> +               goto err_res;
> +       }
> +
> +       dmic->io_base = ioremap(res->start, resource_size(res));
> +       if (!dmic->io_base) {

Print the error.

> +               ret = -ENOMEM;
> +               goto err_res;
> +       }
> +
> +       res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
> +       if (!res) {
> +               dev_err(dmic->dev, "invalid dma resource\n");
> +               ret = -ENODEV;
> +               goto err_dai;
> +       }
> +       omap_dmic_dai_dma_params.dma_req = res->start;
> +
> +       pm_runtime_enable(dmic->dev);
> +

Before accessing the below register, you should be doing a pm_runtime_get*()

> +       /* Disable lines while request is ongoing */
> +       omap_dmic_write(dmic, OMAP_DMIC_CTRL, 0x00);
> +
> +       ret = snd_soc_register_dais(&pdev->dev, &omap_dmic_dai, 1);
> +       if (ret)
> +               goto err_dai;
> +
> +       return 0;
> +
> +err_dai:
> +       iounmap(dmic->io_base);
> +err_res:
> +       kfree(dmic);
> +       return ret;
> +}
> +

<<snip>>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 3/4] OMAP4: DMIC: initializes the DMIC driver
  2011-01-25 22:01 ` [PATCH v3 3/4] OMAP4: DMIC: initializes the " David Lambert
@ 2011-01-28  7:46   ` Varadarajan, Charulatha
  0 siblings, 0 replies; 13+ messages in thread
From: Varadarajan, Charulatha @ 2011-01-28  7:46 UTC (permalink / raw)
  To: David Lambert
  Cc: alsa-devel, linux-omap, Tony Lindgren, Paul Walmsley, Mark Brown,
	Liam Girdwood

On Wed, Jan 26, 2011 at 03:31, David Lambert <dlambert@ti.com> wrote:
> This code is used to read the HWMOD database and initialize

use "hwmod" and not HWMOD

> the DMIC driver.
>
> Signed-off-by: David Lambert <dlambert@ti.com>
> ---

<<snip>>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver
  2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
  2011-01-28  7:43   ` Varadarajan, Charulatha
@ 2011-01-28  8:45   ` Varadarajan, Charulatha
  1 sibling, 0 replies; 13+ messages in thread
From: Varadarajan, Charulatha @ 2011-01-28  8:45 UTC (permalink / raw)
  To: David Lambert
  Cc: alsa-devel, linux-omap, Tony Lindgren, Paul Walmsley, Mark Brown,
	Liam Girdwood

<<snip>>

> +
> +static int omap_dmic_set_dai_sysclk(struct snd_soc_dai *dai,
> +                                   int clk_id, unsigned int freq,
> +                                   int dir)
> +{
> +       struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
> +       struct clk *dmic_clk, *parent_clk;
> +       int ret = 0;
> +
> +       dmic_clk = clk_get(NULL, "dmic_fck");

It is preferred to use device pointer. instead of NULL.
(Applicable elsewhere)

> +       if (IS_ERR(dmic_clk))
> +               return -ENODEV;
> +
> +       switch (clk_id) {
> +       case OMAP_DMIC_SYSCLK_PAD_CLKS:
> +               parent_clk = clk_get(NULL, "pad_clks_ck");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       case OMAP_DMIC_SYSCLK_SLIMBLUS_CLKS:
> +               parent_clk = clk_get(NULL, "slimbus_clk");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       case OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS:
> +               parent_clk = clk_get(NULL, "dmic_sync_mux_ck");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       default:
> +               dev_err(dai->dev, "clk_id not supported %d\n", clk_id);
> +               ret = -EINVAL;
> +               goto err_par;
> +       }
> +
> +       if (dmic->sysclk != clk_id) {
> +               /* reparent not allowed if a stream is ongoing */
> +               if (dmic->active > 1) {
> +                       ret = -EBUSY;
> +                       goto err_busy;
> +               }
> +
> +               /* disable clock while reparenting */
> +               if (dmic->active == 1)
> +                       pm_runtime_put_sync(dmic->dev);
> +
> +               ret = clk_set_parent(dmic_clk, parent_clk);
> +
> +               if (dmic->active == 1)
> +                       pm_runtime_get_sync(dmic->dev);
> +
> +               dmic->sysclk = clk_id;
> +       }
> +
> +       dmic->clk_freq = clk_get_rate(dmic_clk);
> +
> +err_busy:
> +       clk_put(parent_clk);
> +err_par:
> +       clk_put(dmic_clk);
> +
> +       return ret;
> +}
> +

<<snip>>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/4] OMAP4: hwmod: add entries for DMIC driver
  2011-01-25 22:01 ` [PATCH v3 2/4] OMAP4: hwmod: add entries for " David Lambert
  2011-01-25 23:54   ` Paul Walmsley
@ 2011-02-14 15:36   ` Cousson, Benoit
  1 sibling, 0 replies; 13+ messages in thread
From: Cousson, Benoit @ 2011-02-14 15:36 UTC (permalink / raw)
  To: Lambert, David
  Cc: alsa-devel, linux-omap, Tony Lindgren, Paul Walmsley, Mark Brown,
	Liam Girdwood

Hi David,

I have few comments about the modification you did to the original code.

On 1/25/2011 11:01 PM, Lambert, David wrote:
> From: Benoit Cousson<b-cousson@ti.com>
> 
> Adds HWMOD entries for the OMAP DMIC driver and creates
> a platform device.  The HWMOD entires define the system

The changelog does not really reflect what the patch is doing.
You are not creating a platform device in that patch.

> resource requirements for the drvier such as DMA addresses, channels,
> and IRQ's.  Placing this information in the HWMOD database allows
> for more generic drivers to be written and having the specific
> implementation details defined in HWMOD.
> 

We already discussed that, but my S-O-B is missing.

> Signed-off-by: David Lambert<dlambert@ti.com>
> ---
>   arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   91 ++++++++++++++++++++++++++++
>   1 files changed, 91 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> index 7274db4..f9b2ad3 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> @@ -383,6 +383,95 @@ static struct omap_hwmod omap44xx_l4_wkup_hwmod = {
>   };
> 
>   /*
> + * 'dmic' class
> + * digital microphone controller
> + */
> +
> +static struct omap_hwmod_class_sysconfig omap44xx_dmic_sysc = {
> +	.rev_offs	= 0x0000,
> +	.sysc_offs	= 0x0010,
> +	.sysc_flags	= (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
> +			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
> +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),

SIDLE_SMART_WKUP flag is missing.

> +	.sysc_fields	=&omap_hwmod_sysc_type2,
> +};
> +
> +static struct omap_hwmod_class omap44xx_dmic_hwmod_class = {
> +	.name = "omap-dmic",

This is not the right name. Please stick to the original one from the HW spec. You can rename it the way you want in the device only.

> +	.sysc =&omap44xx_dmic_sysc,
> +};
> +
> +/* dmic */
> +static struct omap_hwmod omap44xx_dmic_hwmod;
> +static struct omap_hwmod_irq_info omap44xx_dmic_irqs[] = {
> +	{ .irq = 114 + OMAP44XX_IRQ_GIC_START },
> +};
> +
> +static struct omap_hwmod_dma_info omap44xx_dmic_sdma_reqs[] = {
> +	{ .dma_req = 66 + OMAP44XX_DMA_REQ_START },
> +};
> +
> +static struct omap_hwmod_addr_space omap44xx_dmic_addrs[] = {
> +	{

it might not be useful for your driver, but we should use a name to differentiate the dual memory mapping here. It was introduce by Kishon in his McBSP series.

> +		.pa_start	= 0x4012e000,
> +		.pa_end		= 0x4012e07f,
> +		.flags		= ADDR_TYPE_RT
> +	},
> +};
> +
> +/* l4_abe ->  dmic */
> +static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic = {
> +	.master		=&omap44xx_l4_abe_hwmod,
> +	.slave		=&omap44xx_dmic_hwmod,
> +	.clk		= "ocp_abe_iclk",
> +	.addr		= omap44xx_dmic_addrs,
> +	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_addrs),
> +	.user		= OCP_USER_MPU,
> +};
> +
> +static struct omap_hwmod_addr_space omap44xx_dmic_dma_addrs[] = {
> +	{
> +		.pa_start	= 0x4902e000,
> +		.pa_end		= 0x4902e07f,
> +		.flags		= ADDR_TYPE_RT
> +	},
> +};
> +
> +/* l4_abe ->  dmic (dma) */
> +static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic_dma = {
> +	.master		=&omap44xx_l4_abe_hwmod,
> +	.slave		=&omap44xx_dmic_hwmod,
> +	.clk		= "ocp_abe_iclk",
> +	.addr		= omap44xx_dmic_dma_addrs,
> +	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_dma_addrs),
> +	.user		= OCP_USER_SDMA,
> +};
> +
> +/* dmic slave ports */
> +static struct omap_hwmod_ocp_if *omap44xx_dmic_slaves[] = {
> +	&omap44xx_l4_abe__dmic,
> +	&omap44xx_l4_abe__dmic_dma,
> +};
> +
> +static struct omap_hwmod omap44xx_dmic_hwmod = {
> +	.name		= "omap-dmic",
> +	.class		=&omap44xx_dmic_hwmod_class,
> +	.mpu_irqs	= omap44xx_dmic_irqs,
> +	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_dmic_irqs),
> +	.sdma_reqs	= omap44xx_dmic_sdma_reqs,
> +	.sdma_reqs_cnt	= ARRAY_SIZE(omap44xx_dmic_sdma_reqs),
> +	.main_clk	= "dmic_fck",
> +	.prcm = {
> +		.omap4 = {
> +			.clkctrl_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
> +		},
> +	},
> +	.slaves		= omap44xx_dmic_slaves,
> +	.slaves_cnt	= ARRAY_SIZE(omap44xx_dmic_slaves),
> +	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
> +};
> +
> +/*
>    * 'mpu_bus' class
>    * instance(s): mpu_private
>    */
> @@ -826,6 +915,8 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
>   	&omap44xx_l4_cfg_hwmod,
>   	&omap44xx_l4_per_hwmod,
>   	&omap44xx_l4_wkup_hwmod,
> +	/* dmic class */
> +	&omap44xx_dmic_hwmod,

This is not the right place, and a blank line is missing before and after.

Please find the fixed version below. This is based on top of the spinlock + mcspi + mcbsp to avoid conflict and to get the hwmod memory name support.

Regards,
Benoit

---
>From 01f72d4f3887d2356455bb4455cd0ba3c7eb4758 Mon Sep 17 00:00:00 2001
From: Benoit Cousson <b-cousson@ti.com>
Date: Tue, 25 Jan 2011 22:01:00 +0000
Subject: [PATCH] OMAP4: hwmod data: Add entries for DMIC

Adds HWMOD entries for the OMAP DMIC. The HWMOD entires define the system
resource requirements for the driver such as DMA addresses, channels,
and IRQ's.  Placing this information in the HWMOD database allows for
more generic drivers to be written and having the specific implementation
details defined in HWMOD.

Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: David Lambert <dlambert@ti.com>
[b-cousson@ti.com: Change the wrong hwmod name,
add memory name, add missing flag and re-order structures]
---
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   96 +++++++++++++++++++++++++++-
 1 files changed, 95 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 6665922..703f3d4 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -519,7 +519,6 @@ static struct omap_hwmod omap44xx_mpu_private_hwmod = {
  *  ctrl_module_pad_wkup
  *  ctrl_module_wkup
  *  debugss
- *  dmic
  *  efuse_ctrl_cust
  *  efuse_ctrl_std
  *  elm
@@ -646,6 +645,98 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = {
 };
 
 /*
+ * 'dmic' class
+ * digital microphone controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap44xx_dmic_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.sysc_flags	= (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+			   SIDLE_SMART_WKUP),
+	.sysc_fields	= &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap44xx_dmic_hwmod_class = {
+	.name	= "dmic",
+	.sysc	= &omap44xx_dmic_sysc,
+};
+
+/* dmic */
+static struct omap_hwmod omap44xx_dmic_hwmod;
+static struct omap_hwmod_irq_info omap44xx_dmic_irqs[] = {
+	{ .irq = 114 + OMAP44XX_IRQ_GIC_START },
+};
+
+static struct omap_hwmod_dma_info omap44xx_dmic_sdma_reqs[] = {
+	{ .dma_req = 66 + OMAP44XX_DMA_REQ_START },
+};
+
+static struct omap_hwmod_addr_space omap44xx_dmic_addrs[] = {
+	{
+		.name		= "mpu",
+		.pa_start	= 0x4012e000,
+		.pa_end		= 0x4012e07f,
+		.flags		= ADDR_TYPE_RT
+	},
+};
+
+/* l4_abe -> dmic */
+static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic = {
+	.master		= &omap44xx_l4_abe_hwmod,
+	.slave		= &omap44xx_dmic_hwmod,
+	.clk		= "ocp_abe_iclk",
+	.addr		= omap44xx_dmic_addrs,
+	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_addrs),
+	.user		= OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space omap44xx_dmic_dma_addrs[] = {
+	{
+		.name		= "dma",
+		.pa_start	= 0x4902e000,
+		.pa_end		= 0x4902e07f,
+		.flags		= ADDR_TYPE_RT
+	},
+};
+
+/* l4_abe -> dmic (dma) */
+static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic_dma = {
+	.master		= &omap44xx_l4_abe_hwmod,
+	.slave		= &omap44xx_dmic_hwmod,
+	.clk		= "ocp_abe_iclk",
+	.addr		= omap44xx_dmic_dma_addrs,
+	.addr_cnt	= ARRAY_SIZE(omap44xx_dmic_dma_addrs),
+	.user		= OCP_USER_SDMA,
+};
+
+/* dmic slave ports */
+static struct omap_hwmod_ocp_if *omap44xx_dmic_slaves[] = {
+	&omap44xx_l4_abe__dmic,
+	&omap44xx_l4_abe__dmic_dma,
+};
+
+static struct omap_hwmod omap44xx_dmic_hwmod = {
+	.name		= "dmic",
+	.class		= &omap44xx_dmic_hwmod_class,
+	.mpu_irqs	= omap44xx_dmic_irqs,
+	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_dmic_irqs),
+	.sdma_reqs	= omap44xx_dmic_sdma_reqs,
+	.sdma_reqs_cnt	= ARRAY_SIZE(omap44xx_dmic_sdma_reqs),
+	.main_clk	= "dmic_fck",
+	.prcm		= {
+		.omap4 = {
+			.clkctrl_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
+		},
+	},
+	.slaves		= omap44xx_dmic_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_dmic_slaves),
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+};
+
+/*
  * 'dsp' class
  * dsp sub-system
  */
@@ -3895,6 +3986,9 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
 	/* dma class */
 	&omap44xx_dma_system_hwmod,
 
+	/* dmic class */
+	&omap44xx_dmic_hwmod,
+
 	/* dsp class */
 	&omap44xx_dsp_hwmod,
 	&omap44xx_dsp_c0_hwmod,
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2011-02-14 15:36 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 22:00 [PATCH v3 0/4] Adding OMAP DMIC driver to kernel David Lambert
2011-01-25 22:00 ` [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver David Lambert
2011-01-28  7:43   ` Varadarajan, Charulatha
2011-01-28  8:45   ` Varadarajan, Charulatha
2011-01-25 22:01 ` [PATCH v3 2/4] OMAP4: hwmod: add entries for " David Lambert
2011-01-25 23:54   ` Paul Walmsley
2011-01-26 12:55     ` Lambert, David
2011-01-26 17:28       ` Paul Walmsley
2011-02-14 15:36   ` Cousson, Benoit
2011-01-25 22:01 ` [PATCH v3 3/4] OMAP4: DMIC: initializes the " David Lambert
2011-01-28  7:46   ` Varadarajan, Charulatha
2011-01-25 22:01 ` [PATCH v3 4/4] OMAP4: DMIC: Add DMIC codec platform devices David Lambert
2011-01-26  1:22 ` [PATCH v3 0/4] Adding OMAP DMIC driver to kernel G, Manjunath Kondaiah

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.