[PATCH 8/9] MXC: Add a digital audio multiplexer (DAM) driver
Sascha Hauer
s.hauer at pengutronix.de
Thu Nov 12 05:42:04 EST 2009
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
arch/arm/mach-mx2/Kconfig | 2 +
arch/arm/mach-mx3/Kconfig | 2 +
arch/arm/plat-mxc/Kconfig | 7 ++++
arch/arm/plat-mxc/Makefile | 2 +
arch/arm/plat-mxc/dam-v1.c | 33 ++++++++++++++++++++
arch/arm/plat-mxc/dam-v2.c | 56 ++++++++++++++++++++++++++++++++++
arch/arm/plat-mxc/include/mach/dam.h | 45 +++++++++++++++++++++++++++
7 files changed, 147 insertions(+), 0 deletions(-)
create mode 100644 arch/arm/plat-mxc/dam-v1.c
create mode 100644 arch/arm/plat-mxc/dam-v2.c
create mode 100644 arch/arm/plat-mxc/include/mach/dam.h
diff --git a/arch/arm/mach-mx2/Kconfig b/arch/arm/mach-mx2/Kconfig
index c8a2eac..43f07b9 100644
--- a/arch/arm/mach-mx2/Kconfig
+++ b/arch/arm/mach-mx2/Kconfig
@@ -6,11 +6,13 @@ choice
config MACH_MX21
bool "i.MX21 support"
+ select ARCH_MXC_DAM_V1
help
This enables support for Freescale's MX2 based i.MX21 processor.
config MACH_MX27
bool "i.MX27 support"
+ select ARCH_MXC_DAM_V1
help
This enables support for Freescale's MX2 based i.MX27 processor.
diff --git a/arch/arm/mach-mx3/Kconfig b/arch/arm/mach-mx3/Kconfig
index 851f245..7b9fcbb 100644
--- a/arch/arm/mach-mx3/Kconfig
+++ b/arch/arm/mach-mx3/Kconfig
@@ -2,11 +2,13 @@ if ARCH_MX3
config ARCH_MX31
select ARCH_HAS_RNGA
+ select ARCH_MXC_DAM_V2
bool
config ARCH_MX35
bool
select ARCH_MXC_IOMUX_V3
+ select ARCH_MXC_DAM_V2
comment "MX3 platforms:"
diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig
index e8e92cb..eb3f847 100644
--- a/arch/arm/plat-mxc/Kconfig
+++ b/arch/arm/plat-mxc/Kconfig
@@ -78,4 +78,11 @@ config ARCH_HAS_RNGA
config ARCH_MXC_IOMUX_V3
bool
+
+config ARCH_MXC_DAM_V1
+ bool
+
+config ARCH_MXC_DAM_V2
+ bool
+
endif
diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile
index 545412f..e0f987f 100644
--- a/arch/arm/plat-mxc/Makefile
+++ b/arch/arm/plat-mxc/Makefile
@@ -10,3 +10,5 @@ obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o
obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
obj-$(CONFIG_MXC_PWM) += pwm.o
obj-$(CONFIG_MXC_ULPI) += ulpi.o
+obj-$(CONFIG_ARCH_MXC_DAM_V1) += dam-v1.o
+obj-$(CONFIG_ARCH_MXC_DAM_V2) += dam-v2.o
diff --git a/arch/arm/plat-mxc/dam-v1.c b/arch/arm/plat-mxc/dam-v1.c
new file mode 100644
index 0000000..0733361
--- /dev/null
+++ b/arch/arm/plat-mxc/dam-v1.c
@@ -0,0 +1,33 @@
+
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <mach/dam.h>
+#include <mach/hardware.h>
+
+static void __iomem *dam_base;
+
+#define MXC_DAM_V1_PCR(x) ((x) * 4)
+
+int mxc_dam_v1_configure_port(unsigned int port, unsigned int pcr)
+{
+ if (!dam_base) {
+ printk("%s: not configured\n", __func__);
+ return -ENOSYS;
+ }
+
+ writel(pcr, dam_base + MXC_DAM_V1_PCR(port));
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(mxc_dam_v1_configure_port);
+
+static int mxc_dam_v1_init(void)
+{
+ if (cpu_is_mx27() || cpu_is_mx21())
+ dam_base = IO_ADDRESS(AUDMUX_BASE_ADDR);
+ return 0;
+}
+
+postcore_initcall(mxc_dam_v1_init);
diff --git a/arch/arm/plat-mxc/dam-v2.c b/arch/arm/plat-mxc/dam-v2.c
new file mode 100644
index 0000000..a9c8d10
--- /dev/null
+++ b/arch/arm/plat-mxc/dam-v2.c
@@ -0,0 +1,56 @@
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <mach/dam.h>
+#include <mach/hardware.h>
+
+static struct clk *dam_clk;
+static void __iomem *dam_base;
+
+#define MXC_DAM_V2_PTCR(x) ((x) * 8)
+#define MXC_DAM_V2_PDCR(x) ((x) * 8 + 4)
+
+int mxc_dam_v2_configure_port(unsigned int port, unsigned int ptcr,
+ unsigned int pdcr)
+{
+ if (!dam_base)
+ return -ENOSYS;
+
+ if (dam_clk)
+ clk_enable(dam_clk);
+
+ writel(ptcr, dam_base + MXC_DAM_V2_PTCR(port));
+ writel(pdcr, dam_base + MXC_DAM_V2_PDCR(port));
+
+ if (dam_clk)
+ clk_disable(dam_clk);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(mxc_dam_v2_configure_port);
+
+static int mxc_dam_v2_init(void)
+{
+ int ret;
+
+ if (cpu_is_mx31() || cpu_is_mx35())
+ dam_base = IO_ADDRESS(AUDMUX_BASE_ADDR);
+ else
+ return 0;
+
+ if (cpu_is_mx35()) {
+ dam_clk = clk_get(NULL, "audmux");
+ if (IS_ERR(dam_clk)) {
+ dam_base = NULL;
+ ret = PTR_ERR(dam_clk);
+ printk(KERN_ERR "%s: cannot get clock: %d\n", __func__,
+ ret);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+postcore_initcall(mxc_dam_v2_init);
diff --git a/arch/arm/plat-mxc/include/mach/dam.h b/arch/arm/plat-mxc/include/mach/dam.h
new file mode 100644
index 0000000..385b54a
--- /dev/null
+++ b/arch/arm/plat-mxc/include/mach/dam.h
@@ -0,0 +1,45 @@
+#ifndef __MACH_DAM_H
+#define __MACH_DAM_H
+
+#define MX27_HPCR1_SSI0 0
+#define MX27_HPCR2_SSI1 1
+#define MX27_HPCR3_SSI_PINS_4 2
+#define MX27_PPCR1_SSI_PINS_1 3
+#define MX27_PPCR2_SSI_PINS_2 4
+#define MX27_PPCR3_SSI_PINS_3 5
+
+/* Register definitions for the i.MX21/27 Digital Audio Multiplexer */
+#define MXC_DAM_V1_PCR_INMMASK(x) ((x) & 0xff)
+#define MXC_DAM_V1_PCR_INMEN (1 << 8)
+#define MXC_DAM_V1_PCR_TXRXEN (1 << 10)
+#define MXC_DAM_V1_PCR_SYN (1 << 12)
+#define MXC_DAM_V1_PCR_RXDSEL(x) (((x) & 0x7) << 13)
+#define MXC_DAM_V1_PCR_RFCSEL(x) (((x) & 0xf) << 20)
+#define MXC_DAM_V1_PCR_RCLKDIR (1 << 24)
+#define MXC_DAM_V1_PCR_RFSDIR (1 << 25)
+#define MXC_DAM_V1_PCR_TFCSEL(x) (((x) & 0xf) << 26)
+#define MXC_DAM_V1_PCR_TCLKDIR (1 << 30)
+#define MXC_DAM_V1_PCR_TFSDIR (1 << 31)
+
+/* Register definitions for the i.MX25/31/35 Digital Audio Multiplexer */
+#define MXC_DAM_V2_PTCR_TFSDIR (1 << 31)
+#define MXC_DAM_V2_PTCR_TFSEL(x) (((x) & 0xf) << 27)
+#define MXC_DAM_V2_PTCR_TCLKDIR (1 << 26)
+#define MXC_DAM_V2_PTCR_TCSEL(x) (((x) & 0xf) << 22)
+#define MXC_DAM_V2_PTCR_RFSDIR (1 << 21)
+#define MXC_DAM_V2_PTCR_RFSEL(x) (((x) & 0xf) << 17)
+#define MXC_DAM_V2_PTCR_RCLKDIR (1 << 16)
+#define MXC_DAM_V2_PTCR_RCSEL(x) (((x) & 0xf) << 12)
+#define MXC_DAM_V2_PTCR_SYN (1 << 11)
+
+#define MXC_DAM_V2_PDCR_RXDSEL(x) (((x) & 0x7) << 13)
+#define MXC_DAM_V2_PDCR_TXRXEN (1 << 12)
+#define MXC_DAM_V2_PDCR_MODE(x) (((x) & 0x3) << 8)
+#define MXC_DAM_V2_PDCR_INMMASK(x) ((x) & 0xff)
+
+int mxc_dam_v1_configure_port(unsigned int port, unsigned int pcr);
+
+int mxc_dam_v2_configure_port(unsigned int port, unsigned int ptcr,
+ unsigned int pdcr);
+
+#endif
--
1.6.5.2
More information about the linux-arm-kernel
mailing list