ASoC: tegra: rename Tegra20-specific driver files
authorStephen Warren <swarren@nvidia.com>
Thu, 5 Apr 2012 21:54:53 +0000 (15:54 -0600)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 6 Apr 2012 13:17:45 +0000 (14:17 +0100)
Rename these files so they include a specific hardware version in their
filenames. The contents is only touched minimally so that git's rename
tracking operates correctly; renaming all symbols in the files results
in a diff so large that the rename detection fails.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
13 files changed:
sound/soc/tegra/Makefile
sound/soc/tegra/tegra20_das.c [new file with mode: 0644]
sound/soc/tegra/tegra20_das.h [new file with mode: 0644]
sound/soc/tegra/tegra20_i2s.c [new file with mode: 0644]
sound/soc/tegra/tegra20_i2s.h [new file with mode: 0644]
sound/soc/tegra/tegra20_spdif.c [new file with mode: 0644]
sound/soc/tegra/tegra20_spdif.h [new file with mode: 0644]
sound/soc/tegra/tegra_das.c [deleted file]
sound/soc/tegra/tegra_das.h [deleted file]
sound/soc/tegra/tegra_i2s.c [deleted file]
sound/soc/tegra/tegra_i2s.h [deleted file]
sound/soc/tegra/tegra_spdif.c [deleted file]
sound/soc/tegra/tegra_spdif.h [deleted file]

index 714d36070b86febaa128fafc4ba73be41bc81d33..4a33884115f8ca7dbcec5d9f35bb0ff536613c74 100644 (file)
@@ -1,15 +1,15 @@
 # Tegra platform Support
 snd-soc-tegra-pcm-objs := tegra_pcm.o
 snd-soc-tegra-utils-objs += tegra_asoc_utils.o
-snd-soc-tegra-das-objs := tegra_das.o
-snd-soc-tegra-i2s-objs := tegra_i2s.o
-snd-soc-tegra-spdif-objs := tegra_spdif.o
+snd-soc-tegra20-das-objs := tegra20_das.o
+snd-soc-tegra20-i2s-objs := tegra20_i2s.o
+snd-soc-tegra20-spdif-objs := tegra20_spdif.o
 
 obj-$(CONFIG_SND_SOC_TEGRA) += snd-soc-tegra-pcm.o
 obj-$(CONFIG_SND_SOC_TEGRA) += snd-soc-tegra-utils.o
-obj-$(CONFIG_SND_SOC_TEGRA_DAS) += snd-soc-tegra-das.o
-obj-$(CONFIG_SND_SOC_TEGRA_I2S) += snd-soc-tegra-i2s.o
-obj-$(CONFIG_SND_SOC_TEGRA_SPDIF) += snd-soc-tegra-spdif.o
+obj-$(CONFIG_SND_SOC_TEGRA_DAS) += snd-soc-tegra20-das.o
+obj-$(CONFIG_SND_SOC_TEGRA_I2S) += snd-soc-tegra20-i2s.o
+obj-$(CONFIG_SND_SOC_TEGRA_SPDIF) += snd-soc-tegra20-spdif.o
 
 # Tegra machine Support
 snd-soc-tegra-wm8903-objs := tegra_wm8903.o
diff --git a/sound/soc/tegra/tegra20_das.c b/sound/soc/tegra/tegra20_das.c
new file mode 100644 (file)
index 0000000..b5e3698
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * tegra20_das.c - Tegra20 DAS driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2010 - NVIDIA, Inc.
+ *
+ * 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
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <mach/iomap.h>
+#include <sound/soc.h>
+#include "tegra20_das.h"
+
+#define DRV_NAME "tegra-das"
+
+static struct tegra_das *das;
+
+static inline void tegra_das_write(u32 reg, u32 val)
+{
+       __raw_writel(val, das->regs + reg);
+}
+
+static inline u32 tegra_das_read(u32 reg)
+{
+       return __raw_readl(das->regs + reg);
+}
+
+int tegra_das_connect_dap_to_dac(int dap, int dac)
+{
+       u32 addr;
+       u32 reg;
+
+       if (!das)
+               return -ENODEV;
+
+       addr = TEGRA_DAS_DAP_CTRL_SEL +
+               (dap * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
+       reg = dac << TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P;
+
+       tegra_das_write(addr, reg);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(tegra_das_connect_dap_to_dac);
+
+int tegra_das_connect_dap_to_dap(int dap, int otherdap, int master,
+                                       int sdata1rx, int sdata2rx)
+{
+       u32 addr;
+       u32 reg;
+
+       if (!das)
+               return -ENODEV;
+
+       addr = TEGRA_DAS_DAP_CTRL_SEL +
+               (dap * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
+       reg = otherdap << TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P |
+               !!sdata2rx << TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_P |
+               !!sdata1rx << TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_P |
+               !!master << TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_P;
+
+       tegra_das_write(addr, reg);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(tegra_das_connect_dap_to_dap);
+
+int tegra_das_connect_dac_to_dap(int dac, int dap)
+{
+       u32 addr;
+       u32 reg;
+
+       if (!das)
+               return -ENODEV;
+
+       addr = TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL +
+               (dac * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE);
+       reg = dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_P |
+               dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_P |
+               dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_P;
+
+       tegra_das_write(addr, reg);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(tegra_das_connect_dac_to_dap);
+
+#ifdef CONFIG_DEBUG_FS
+static int tegra_das_show(struct seq_file *s, void *unused)
+{
+       int i;
+       u32 addr;
+       u32 reg;
+
+       for (i = 0; i < TEGRA_DAS_DAP_CTRL_SEL_COUNT; i++) {
+               addr = TEGRA_DAS_DAP_CTRL_SEL +
+                       (i * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
+               reg = tegra_das_read(addr);
+               seq_printf(s, "TEGRA_DAS_DAP_CTRL_SEL[%d] = %08x\n", i, reg);
+       }
+
+       for (i = 0; i < TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_COUNT; i++) {
+               addr = TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL +
+                       (i * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE);
+               reg = tegra_das_read(addr);
+               seq_printf(s, "TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL[%d] = %08x\n",
+                                i, reg);
+       }
+
+       return 0;
+}
+
+static int tegra_das_debug_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, tegra_das_show, inode->i_private);
+}
+
+static const struct file_operations tegra_das_debug_fops = {
+       .open    = tegra_das_debug_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
+       .release = single_release,
+};
+
+static void tegra_das_debug_add(struct tegra_das *das)
+{
+       das->debug = debugfs_create_file(DRV_NAME, S_IRUGO,
+                                        snd_soc_debugfs_root, das,
+                                        &tegra_das_debug_fops);
+}
+
+static void tegra_das_debug_remove(struct tegra_das *das)
+{
+       if (das->debug)
+               debugfs_remove(das->debug);
+}
+#else
+static inline void tegra_das_debug_add(struct tegra_das *das)
+{
+}
+
+static inline void tegra_das_debug_remove(struct tegra_das *das)
+{
+}
+#endif
+
+static int __devinit tegra_das_probe(struct platform_device *pdev)
+{
+       struct resource *res, *region;
+       int ret = 0;
+
+       if (das)
+               return -ENODEV;
+
+       das = devm_kzalloc(&pdev->dev, sizeof(struct tegra_das), GFP_KERNEL);
+       if (!das) {
+               dev_err(&pdev->dev, "Can't allocate tegra_das\n");
+               ret = -ENOMEM;
+               goto err;
+       }
+       das->dev = &pdev->dev;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "No memory resource\n");
+               ret = -ENODEV;
+               goto err;
+       }
+
+       region = devm_request_mem_region(&pdev->dev, res->start,
+                                        resource_size(res), pdev->name);
+       if (!region) {
+               dev_err(&pdev->dev, "Memory region already claimed\n");
+               ret = -EBUSY;
+               goto err;
+       }
+
+       das->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+       if (!das->regs) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err;
+       }
+
+       ret = tegra_das_connect_dap_to_dac(TEGRA_DAS_DAP_ID_1,
+                                          TEGRA_DAS_DAP_SEL_DAC1);
+       if (ret) {
+               dev_err(&pdev->dev, "Can't set up DAS DAP connection\n");
+               goto err;
+       }
+       ret = tegra_das_connect_dac_to_dap(TEGRA_DAS_DAC_ID_1,
+                                          TEGRA_DAS_DAC_SEL_DAP1);
+       if (ret) {
+               dev_err(&pdev->dev, "Can't set up DAS DAC connection\n");
+               goto err;
+       }
+
+       tegra_das_debug_add(das);
+
+       platform_set_drvdata(pdev, das);
+
+       return 0;
+
+err:
+       das = NULL;
+       return ret;
+}
+
+static int __devexit tegra_das_remove(struct platform_device *pdev)
+{
+       if (!das)
+               return -ENODEV;
+
+       tegra_das_debug_remove(das);
+
+       das = NULL;
+
+       return 0;
+}
+
+static const struct of_device_id tegra_das_of_match[] __devinitconst = {
+       { .compatible = "nvidia,tegra20-das", },
+       {},
+};
+
+static struct platform_driver tegra_das_driver = {
+       .probe = tegra_das_probe,
+       .remove = __devexit_p(tegra_das_remove),
+       .driver = {
+               .name = DRV_NAME,
+               .owner = THIS_MODULE,
+               .of_match_table = tegra_das_of_match,
+       },
+};
+module_platform_driver(tegra_das_driver);
+
+MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
+MODULE_DESCRIPTION("Tegra DAS driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, tegra_das_of_match);
diff --git a/sound/soc/tegra/tegra20_das.h b/sound/soc/tegra/tegra20_das.h
new file mode 100644 (file)
index 0000000..896bf03
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * tegra20_das.h - Definitions for Tegra20 DAS driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2010 - NVIDIA, Inc.
+ *
+ * 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
+ *
+ */
+
+#ifndef __TEGRA_DAS_H__
+#define __TEGRA_DAS_H__
+
+/* Register TEGRA_DAS_DAP_CTRL_SEL */
+#define TEGRA_DAS_DAP_CTRL_SEL                         0x00
+#define TEGRA_DAS_DAP_CTRL_SEL_COUNT                   5
+#define TEGRA_DAS_DAP_CTRL_SEL_STRIDE                  4
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_P            31
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_S            1
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_P      30
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_S      1
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_P      29
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_S      1
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P          0
+#define TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_S          5
+
+/* Values for field TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL */
+#define TEGRA_DAS_DAP_SEL_DAC1 0
+#define TEGRA_DAS_DAP_SEL_DAC2 1
+#define TEGRA_DAS_DAP_SEL_DAC3 2
+#define TEGRA_DAS_DAP_SEL_DAP1 16
+#define TEGRA_DAS_DAP_SEL_DAP2 17
+#define TEGRA_DAS_DAP_SEL_DAP3 18
+#define TEGRA_DAS_DAP_SEL_DAP4 19
+#define TEGRA_DAS_DAP_SEL_DAP5 20
+
+/* Register TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL */
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL                       0x40
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_COUNT                 3
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE                        4
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_P      28
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_S      4
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_P      24
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_S      4
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_P         0
+#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_S         4
+
+/*
+ * Values for:
+ * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL
+ * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL
+ * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL
+ */
+#define TEGRA_DAS_DAC_SEL_DAP1 0
+#define TEGRA_DAS_DAC_SEL_DAP2 1
+#define TEGRA_DAS_DAC_SEL_DAP3 2
+#define TEGRA_DAS_DAC_SEL_DAP4 3
+#define TEGRA_DAS_DAC_SEL_DAP5 4
+
+/*
+ * Names/IDs of the DACs/DAPs.
+ */
+
+#define TEGRA_DAS_DAP_ID_1 0
+#define TEGRA_DAS_DAP_ID_2 1
+#define TEGRA_DAS_DAP_ID_3 2
+#define TEGRA_DAS_DAP_ID_4 3
+#define TEGRA_DAS_DAP_ID_5 4
+
+#define TEGRA_DAS_DAC_ID_1 0
+#define TEGRA_DAS_DAC_ID_2 1
+#define TEGRA_DAS_DAC_ID_3 2
+
+struct tegra_das {
+       struct device *dev;
+       void __iomem *regs;
+       struct dentry *debug;
+};
+
+/*
+ * Terminology:
+ * DAS: Digital audio switch (HW module controlled by this driver)
+ * DAP: Digital audio port (port/pins on Tegra device)
+ * DAC: Digital audio controller (e.g. I2S or AC97 controller elsewhere)
+ *
+ * The Tegra DAS is a mux/cross-bar which can connect each DAP to a specific
+ * DAC, or another DAP. When DAPs are connected, one must be the master and
+ * one the slave. Each DAC allows selection of a specific DAP for input, to
+ * cater for the case where N DAPs are connected to 1 DAC for broadcast
+ * output.
+ *
+ * This driver is dumb; no attempt is made to ensure that a valid routing
+ * configuration is programmed.
+ */
+
+/*
+ * Connect a DAP to to a DAC
+ * dap_id: DAP to connect: TEGRA_DAS_DAP_ID_*
+ * dac_sel: DAC to connect to: TEGRA_DAS_DAP_SEL_DAC*
+ */
+extern int tegra_das_connect_dap_to_dac(int dap_id, int dac_sel);
+
+/*
+ * Connect a DAP to to another DAP
+ * dap_id: DAP to connect: TEGRA_DAS_DAP_ID_*
+ * other_dap_sel: DAP to connect to: TEGRA_DAS_DAP_SEL_DAP*
+ * master: Is this DAP the master (1) or slave (0)
+ * sdata1rx: Is this DAP's SDATA1 pin RX (1) or TX (0)
+ * sdata2rx: Is this DAP's SDATA2 pin RX (1) or TX (0)
+ */
+extern int tegra_das_connect_dap_to_dap(int dap_id, int other_dap_sel,
+                                       int master, int sdata1rx,
+                                       int sdata2rx);
+
+/*
+ * Connect a DAC's input to a DAP
+ * (DAC outputs are selected by the DAP)
+ * dac_id: DAC ID to connect: TEGRA_DAS_DAC_ID_*
+ * dap_sel: DAP to receive input from: TEGRA_DAS_DAC_SEL_DAP*
+ */
+extern int tegra_das_connect_dac_to_dap(int dac_id, int dap_sel);
+
+#endif
diff --git a/sound/soc/tegra/tegra20_i2s.c b/sound/soc/tegra/tegra20_i2s.c
new file mode 100644 (file)
index 0000000..e24759a
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * tegra20_i2s.c - Tegra20 I2S driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2010,2012 - NVIDIA, Inc.
+ *
+ * Based on code copyright/by:
+ *
+ * Copyright (c) 2009-2010, NVIDIA Corporation.
+ * Scott Peterson <speterson@nvidia.com>
+ *
+ * Copyright (C) 2010 Google, Inc.
+ * Iliyan Malchev <malchev@google.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
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <mach/iomap.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+
+#include "tegra20_i2s.h"
+
+#define DRV_NAME "tegra-i2s"
+
+static inline void tegra_i2s_write(struct tegra_i2s *i2s, u32 reg, u32 val)
+{
+       __raw_writel(val, i2s->regs + reg);
+}
+
+static inline u32 tegra_i2s_read(struct tegra_i2s *i2s, u32 reg)
+{
+       return __raw_readl(i2s->regs + reg);
+}
+
+#ifdef CONFIG_DEBUG_FS
+static int tegra_i2s_show(struct seq_file *s, void *unused)
+{
+#define REG(r) { r, #r }
+       static const struct {
+               int offset;
+               const char *name;
+       } regs[] = {
+               REG(TEGRA_I2S_CTRL),
+               REG(TEGRA_I2S_STATUS),
+               REG(TEGRA_I2S_TIMING),
+               REG(TEGRA_I2S_FIFO_SCR),
+               REG(TEGRA_I2S_PCM_CTRL),
+               REG(TEGRA_I2S_NW_CTRL),
+               REG(TEGRA_I2S_TDM_CTRL),
+               REG(TEGRA_I2S_TDM_TX_RX_CTRL),
+       };
+#undef REG
+
+       struct tegra_i2s *i2s = s->private;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(regs); i++) {
+               u32 val = tegra_i2s_read(i2s, regs[i].offset);
+               seq_printf(s, "%s = %08x\n", regs[i].name, val);
+       }
+
+       return 0;
+}
+
+static int tegra_i2s_debug_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, tegra_i2s_show, inode->i_private);
+}
+
+static const struct file_operations tegra_i2s_debug_fops = {
+       .open    = tegra_i2s_debug_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
+       .release = single_release,
+};
+
+static void tegra_i2s_debug_add(struct tegra_i2s *i2s)
+{
+       i2s->debug = debugfs_create_file(i2s->dai.name, S_IRUGO,
+                                        snd_soc_debugfs_root, i2s,
+                                        &tegra_i2s_debug_fops);
+}
+
+static void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
+{
+       if (i2s->debug)
+               debugfs_remove(i2s->debug);
+}
+#else
+static inline void tegra_i2s_debug_add(struct tegra_i2s *i2s, int id)
+{
+}
+
+static inline void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
+{
+}
+#endif
+
+static int tegra_i2s_set_fmt(struct snd_soc_dai *dai,
+                               unsigned int fmt)
+{
+       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_NF:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_MASTER_ENABLE;
+       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+       case SND_SOC_DAIFMT_CBS_CFS:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_MASTER_ENABLE;
+               break;
+       case SND_SOC_DAIFMT_CBM_CFM:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       i2s->reg_ctrl &= ~(TEGRA_I2S_CTRL_BIT_FORMAT_MASK |
+                               TEGRA_I2S_CTRL_LRCK_MASK);
+       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+       case SND_SOC_DAIFMT_DSP_A:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_DSP;
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
+               break;
+       case SND_SOC_DAIFMT_DSP_B:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_DSP;
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_R_LOW;
+               break;
+       case SND_SOC_DAIFMT_I2S:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_I2S;
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
+               break;
+       case SND_SOC_DAIFMT_RIGHT_J:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_RJM;
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
+               break;
+       case SND_SOC_DAIFMT_LEFT_J:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_LJM;
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int tegra_i2s_hw_params(struct snd_pcm_substream *substream,
+                               struct snd_pcm_hw_params *params,
+                               struct snd_soc_dai *dai)
+{
+       struct device *dev = substream->pcm->card->dev;
+       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+       u32 reg;
+       int ret, sample_size, srate, i2sclock, bitcnt;
+
+       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_BIT_SIZE_MASK;
+       switch (params_format(params)) {
+       case SNDRV_PCM_FORMAT_S16_LE:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_16;
+               sample_size = 16;
+               break;
+       case SNDRV_PCM_FORMAT_S24_LE:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_24;
+               sample_size = 24;
+               break;
+       case SNDRV_PCM_FORMAT_S32_LE:
+               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_32;
+               sample_size = 32;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       srate = params_rate(params);
+
+       /* Final "* 2" required by Tegra hardware */
+       i2sclock = srate * params_channels(params) * sample_size * 2;
+
+       ret = clk_set_rate(i2s->clk_i2s, i2sclock);
+       if (ret) {
+               dev_err(dev, "Can't set I2S clock rate: %d\n", ret);
+               return ret;
+       }
+
+       bitcnt = (i2sclock / (2 * srate)) - 1;
+       if (bitcnt < 0 || bitcnt > TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US)
+               return -EINVAL;
+       reg = bitcnt << TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT;
+
+       if (i2sclock % (2 * srate))
+               reg |= TEGRA_I2S_TIMING_NON_SYM_ENABLE;
+
+       clk_enable(i2s->clk_i2s);
+
+       tegra_i2s_write(i2s, TEGRA_I2S_TIMING, reg);
+
+       tegra_i2s_write(i2s, TEGRA_I2S_FIFO_SCR,
+               TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_FOUR_SLOTS |
+               TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_FOUR_SLOTS);
+
+       clk_disable(i2s->clk_i2s);
+
+       return 0;
+}
+
+static void tegra_i2s_start_playback(struct tegra_i2s *i2s)
+{
+       i2s->reg_ctrl |= TEGRA_I2S_CTRL_FIFO1_ENABLE;
+       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
+}
+
+static void tegra_i2s_stop_playback(struct tegra_i2s *i2s)
+{
+       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_FIFO1_ENABLE;
+       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
+}
+
+static void tegra_i2s_start_capture(struct tegra_i2s *i2s)
+{
+       i2s->reg_ctrl |= TEGRA_I2S_CTRL_FIFO2_ENABLE;
+       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
+}
+
+static void tegra_i2s_stop_capture(struct tegra_i2s *i2s)
+{
+       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_FIFO2_ENABLE;
+       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
+}
+
+static int tegra_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+                               struct snd_soc_dai *dai)
+{
+       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+       case SNDRV_PCM_TRIGGER_RESUME:
+               clk_enable(i2s->clk_i2s);
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+                       tegra_i2s_start_playback(i2s);
+               else
+                       tegra_i2s_start_capture(i2s);
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+                       tegra_i2s_stop_playback(i2s);
+               else
+                       tegra_i2s_stop_capture(i2s);
+               clk_disable(i2s->clk_i2s);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int tegra_i2s_probe(struct snd_soc_dai *dai)
+{
+       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+
+       dai->capture_dma_data = &i2s->capture_dma_data;
+       dai->playback_dma_data = &i2s->playback_dma_data;
+
+       return 0;
+}
+
+static const struct snd_soc_dai_ops tegra_i2s_dai_ops = {
+       .set_fmt        = tegra_i2s_set_fmt,
+       .hw_params      = tegra_i2s_hw_params,
+       .trigger        = tegra_i2s_trigger,
+};
+
+static const struct snd_soc_dai_driver tegra_i2s_dai_template = {
+       .probe = tegra_i2s_probe,
+       .playback = {
+               .channels_min = 2,
+               .channels_max = 2,
+               .rates = SNDRV_PCM_RATE_8000_96000,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+       },
+       .capture = {
+               .channels_min = 2,
+               .channels_max = 2,
+               .rates = SNDRV_PCM_RATE_8000_96000,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+       },
+       .ops = &tegra_i2s_dai_ops,
+       .symmetric_rates = 1,
+};
+
+static __devinit int tegra_i2s_platform_probe(struct platform_device *pdev)
+{
+       struct tegra_i2s *i2s;
+       struct resource *mem, *memregion, *dmareq;
+       u32 of_dma[2];
+       u32 dma_ch;
+       int ret;
+
+       i2s = devm_kzalloc(&pdev->dev, sizeof(struct tegra_i2s), GFP_KERNEL);
+       if (!i2s) {
+               dev_err(&pdev->dev, "Can't allocate tegra_i2s\n");
+               ret = -ENOMEM;
+               goto err;
+       }
+       dev_set_drvdata(&pdev->dev, i2s);
+
+       i2s->dai = tegra_i2s_dai_template;
+       i2s->dai.name = dev_name(&pdev->dev);
+
+       i2s->clk_i2s = clk_get(&pdev->dev, NULL);
+       if (IS_ERR(i2s->clk_i2s)) {
+               dev_err(&pdev->dev, "Can't retrieve i2s clock\n");
+               ret = PTR_ERR(i2s->clk_i2s);
+               goto err;
+       }
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!mem) {
+               dev_err(&pdev->dev, "No memory resource\n");
+               ret = -ENODEV;
+               goto err_clk_put;
+       }
+
+       dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmareq) {
+               if (of_property_read_u32_array(pdev->dev.of_node,
+                                       "nvidia,dma-request-selector",
+                                       of_dma, 2) < 0) {
+                       dev_err(&pdev->dev, "No DMA resource\n");
+                       ret = -ENODEV;
+                       goto err_clk_put;
+               }
+               dma_ch = of_dma[1];
+       } else {
+               dma_ch = dmareq->start;
+       }
+
+       memregion = devm_request_mem_region(&pdev->dev, mem->start,
+                                           resource_size(mem), DRV_NAME);
+       if (!memregion) {
+               dev_err(&pdev->dev, "Memory region already claimed\n");
+               ret = -EBUSY;
+               goto err_clk_put;
+       }
+
+       i2s->regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
+       if (!i2s->regs) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err_clk_put;
+       }
+
+       i2s->capture_dma_data.addr = mem->start + TEGRA_I2S_FIFO2;
+       i2s->capture_dma_data.wrap = 4;
+       i2s->capture_dma_data.width = 32;
+       i2s->capture_dma_data.req_sel = dma_ch;
+
+       i2s->playback_dma_data.addr = mem->start + TEGRA_I2S_FIFO1;
+       i2s->playback_dma_data.wrap = 4;
+       i2s->playback_dma_data.width = 32;
+       i2s->playback_dma_data.req_sel = dma_ch;
+
+       i2s->reg_ctrl = TEGRA_I2S_CTRL_FIFO_FORMAT_PACKED;
+
+       ret = snd_soc_register_dai(&pdev->dev, &i2s->dai);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
+               ret = -ENOMEM;
+               goto err_clk_put;
+       }
+
+       ret = tegra_pcm_platform_register(&pdev->dev);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
+               goto err_unregister_dai;
+       }
+
+       tegra_i2s_debug_add(i2s);
+
+       return 0;
+
+err_unregister_dai:
+       snd_soc_unregister_dai(&pdev->dev);
+err_clk_put:
+       clk_put(i2s->clk_i2s);
+err:
+       return ret;
+}
+
+static int __devexit tegra_i2s_platform_remove(struct platform_device *pdev)
+{
+       struct tegra_i2s *i2s = dev_get_drvdata(&pdev->dev);
+
+       tegra_pcm_platform_unregister(&pdev->dev);
+       snd_soc_unregister_dai(&pdev->dev);
+
+       tegra_i2s_debug_remove(i2s);
+
+       clk_put(i2s->clk_i2s);
+
+       return 0;
+}
+
+static const struct of_device_id tegra_i2s_of_match[] __devinitconst = {
+       { .compatible = "nvidia,tegra20-i2s", },
+       {},
+};
+
+static struct platform_driver tegra_i2s_driver = {
+       .driver = {
+               .name = DRV_NAME,
+               .owner = THIS_MODULE,
+               .of_match_table = tegra_i2s_of_match,
+       },
+       .probe = tegra_i2s_platform_probe,
+       .remove = __devexit_p(tegra_i2s_platform_remove),
+};
+module_platform_driver(tegra_i2s_driver);
+
+MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
+MODULE_DESCRIPTION("Tegra I2S ASoC driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, tegra_i2s_of_match);
diff --git a/sound/soc/tegra/tegra20_i2s.h b/sound/soc/tegra/tegra20_i2s.h
new file mode 100644 (file)
index 0000000..56f1e0f
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * tegra20_i2s.h - Definitions for Tegra20 I2S driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2010 - NVIDIA, Inc.
+ *
+ * Based on code copyright/by:
+ *
+ * Copyright (c) 2009-2010, NVIDIA Corporation.
+ * Scott Peterson <speterson@nvidia.com>
+ *
+ * Copyright (C) 2010 Google, Inc.
+ * Iliyan Malchev <malchev@google.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
+ *
+ */
+
+#ifndef __TEGRA_I2S_H__
+#define __TEGRA_I2S_H__
+
+#include "tegra_pcm.h"
+
+/* Register offsets from TEGRA_I2S1_BASE and TEGRA_I2S2_BASE */
+
+#define TEGRA_I2S_CTRL                                 0x00
+#define TEGRA_I2S_STATUS                               0x04
+#define TEGRA_I2S_TIMING                               0x08
+#define TEGRA_I2S_FIFO_SCR                             0x0c
+#define TEGRA_I2S_PCM_CTRL                             0x10
+#define TEGRA_I2S_NW_CTRL                              0x14
+#define TEGRA_I2S_TDM_CTRL                             0x20
+#define TEGRA_I2S_TDM_TX_RX_CTRL                       0x24
+#define TEGRA_I2S_FIFO1                                        0x40
+#define TEGRA_I2S_FIFO2                                        0x80
+
+/* Fields in TEGRA_I2S_CTRL */
+
+#define TEGRA_I2S_CTRL_FIFO2_TX_ENABLE                 (1 << 30)
+#define TEGRA_I2S_CTRL_FIFO1_ENABLE                    (1 << 29)
+#define TEGRA_I2S_CTRL_FIFO2_ENABLE                    (1 << 28)
+#define TEGRA_I2S_CTRL_FIFO1_RX_ENABLE                 (1 << 27)
+#define TEGRA_I2S_CTRL_FIFO_LPBK_ENABLE                        (1 << 26)
+#define TEGRA_I2S_CTRL_MASTER_ENABLE                   (1 << 25)
+
+#define TEGRA_I2S_LRCK_LEFT_LOW                                0
+#define TEGRA_I2S_LRCK_RIGHT_LOW                       1
+
+#define TEGRA_I2S_CTRL_LRCK_SHIFT                      24
+#define TEGRA_I2S_CTRL_LRCK_MASK                       (1                        << TEGRA_I2S_CTRL_LRCK_SHIFT)
+#define TEGRA_I2S_CTRL_LRCK_L_LOW                      (TEGRA_I2S_LRCK_LEFT_LOW  << TEGRA_I2S_CTRL_LRCK_SHIFT)
+#define TEGRA_I2S_CTRL_LRCK_R_LOW                      (TEGRA_I2S_LRCK_RIGHT_LOW << TEGRA_I2S_CTRL_LRCK_SHIFT)
+
+#define TEGRA_I2S_BIT_FORMAT_I2S                       0
+#define TEGRA_I2S_BIT_FORMAT_RJM                       1
+#define TEGRA_I2S_BIT_FORMAT_LJM                       2
+#define TEGRA_I2S_BIT_FORMAT_DSP                       3
+
+#define TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT                        10
+#define TEGRA_I2S_CTRL_BIT_FORMAT_MASK                 (3                        << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_FORMAT_I2S                  (TEGRA_I2S_BIT_FORMAT_I2S << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_FORMAT_RJM                  (TEGRA_I2S_BIT_FORMAT_RJM << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_FORMAT_LJM                  (TEGRA_I2S_BIT_FORMAT_LJM << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_FORMAT_DSP                  (TEGRA_I2S_BIT_FORMAT_DSP << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
+
+#define TEGRA_I2S_BIT_SIZE_16                          0
+#define TEGRA_I2S_BIT_SIZE_20                          1
+#define TEGRA_I2S_BIT_SIZE_24                          2
+#define TEGRA_I2S_BIT_SIZE_32                          3
+
+#define TEGRA_I2S_CTRL_BIT_SIZE_SHIFT                  8
+#define TEGRA_I2S_CTRL_BIT_SIZE_MASK                   (3                     << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_SIZE_16                     (TEGRA_I2S_BIT_SIZE_16 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_SIZE_20                     (TEGRA_I2S_BIT_SIZE_20 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_SIZE_24                     (TEGRA_I2S_BIT_SIZE_24 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
+#define TEGRA_I2S_CTRL_BIT_SIZE_32                     (TEGRA_I2S_BIT_SIZE_32 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
+
+#define TEGRA_I2S_FIFO_16_LSB                          0
+#define TEGRA_I2S_FIFO_20_LSB                          1
+#define TEGRA_I2S_FIFO_24_LSB                          2
+#define TEGRA_I2S_FIFO_32                              3
+#define TEGRA_I2S_FIFO_PACKED                          7
+
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT               4
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_MASK                        (7                     << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_16_LSB              (TEGRA_I2S_FIFO_16_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_20_LSB              (TEGRA_I2S_FIFO_20_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_24_LSB              (TEGRA_I2S_FIFO_24_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_32                  (TEGRA_I2S_FIFO_32     << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+#define TEGRA_I2S_CTRL_FIFO_FORMAT_PACKED              (TEGRA_I2S_FIFO_PACKED << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
+
+#define TEGRA_I2S_CTRL_IE_FIFO1_ERR                    (1 << 3)
+#define TEGRA_I2S_CTRL_IE_FIFO2_ERR                    (1 << 2)
+#define TEGRA_I2S_CTRL_QE_FIFO1                                (1 << 1)
+#define TEGRA_I2S_CTRL_QE_FIFO2                                (1 << 0)
+
+/* Fields in TEGRA_I2S_STATUS */
+
+#define TEGRA_I2S_STATUS_FIFO1_RDY                     (1 << 31)
+#define TEGRA_I2S_STATUS_FIFO2_RDY                     (1 << 30)
+#define TEGRA_I2S_STATUS_FIFO1_BSY                     (1 << 29)
+#define TEGRA_I2S_STATUS_FIFO2_BSY                     (1 << 28)
+#define TEGRA_I2S_STATUS_FIFO1_ERR                     (1 << 3)
+#define TEGRA_I2S_STATUS_FIFO2_ERR                     (1 << 2)
+#define TEGRA_I2S_STATUS_QS_FIFO1                      (1 << 1)
+#define TEGRA_I2S_STATUS_QS_FIFO2                      (1 << 0)
+
+/* Fields in TEGRA_I2S_TIMING */
+
+#define TEGRA_I2S_TIMING_NON_SYM_ENABLE                        (1 << 12)
+#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT       0
+#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US     0x7fff
+#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK                (TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
+
+/* Fields in TEGRA_I2S_FIFO_SCR */
+
+#define TEGRA_I2S_FIFO_SCR_FIFO2_FULL_EMPTY_COUNT_SHIFT        24
+#define TEGRA_I2S_FIFO_SCR_FIFO1_FULL_EMPTY_COUNT_SHIFT        16
+#define TEGRA_I2S_FIFO_SCR_FIFO_FULL_EMPTY_COUNT_MASK  0x3f
+
+#define TEGRA_I2S_FIFO_SCR_FIFO2_CLR                   (1 << 12)
+#define TEGRA_I2S_FIFO_SCR_FIFO1_CLR                   (1 << 8)
+
+#define TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT                        0
+#define TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS              1
+#define TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS             2
+#define TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS            3
+
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT         4
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_MASK          (3 << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_ONE_SLOT      (TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT     << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_FOUR_SLOTS    (TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS   << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_EIGHT_SLOTS   (TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS  << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_TWELVE_SLOTS  (TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
+
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT         0
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_MASK          (3 << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_ONE_SLOT      (TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT     << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_FOUR_SLOTS    (TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS   << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_EIGHT_SLOTS   (TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS  << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
+#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_TWELVE_SLOTS  (TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
+
+struct tegra_i2s {
+       struct snd_soc_dai_driver dai;
+       struct clk *clk_i2s;
+       struct tegra_pcm_dma_params capture_dma_data;
+       struct tegra_pcm_dma_params playback_dma_data;
+       void __iomem *regs;
+       struct dentry *debug;
+       u32 reg_ctrl;
+};
+
+#endif
diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c
new file mode 100644 (file)
index 0000000..ed1fd50
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * tegra20_spdif.c - Tegra20 SPDIF driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2011-2012 - NVIDIA, Inc.
+ *
+ * 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
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <mach/iomap.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+
+#include "tegra20_spdif.h"
+
+#define DRV_NAME "tegra-spdif"
+
+static inline void tegra_spdif_write(struct tegra_spdif *spdif, u32 reg,
+                                       u32 val)
+{
+       __raw_writel(val, spdif->regs + reg);
+}
+
+static inline u32 tegra_spdif_read(struct tegra_spdif *spdif, u32 reg)
+{
+       return __raw_readl(spdif->regs + reg);
+}
+
+#ifdef CONFIG_DEBUG_FS
+static int tegra_spdif_show(struct seq_file *s, void *unused)
+{
+#define REG(r) { r, #r }
+       static const struct {
+               int offset;
+               const char *name;
+       } regs[] = {
+               REG(TEGRA_SPDIF_CTRL),
+               REG(TEGRA_SPDIF_STATUS),
+               REG(TEGRA_SPDIF_STROBE_CTRL),
+               REG(TEGRA_SPDIF_DATA_FIFO_CSR),
+               REG(TEGRA_SPDIF_CH_STA_RX_A),
+               REG(TEGRA_SPDIF_CH_STA_RX_B),
+               REG(TEGRA_SPDIF_CH_STA_RX_C),
+               REG(TEGRA_SPDIF_CH_STA_RX_D),
+               REG(TEGRA_SPDIF_CH_STA_RX_E),
+               REG(TEGRA_SPDIF_CH_STA_RX_F),
+               REG(TEGRA_SPDIF_CH_STA_TX_A),
+               REG(TEGRA_SPDIF_CH_STA_TX_B),
+               REG(TEGRA_SPDIF_CH_STA_TX_C),
+               REG(TEGRA_SPDIF_CH_STA_TX_D),
+               REG(TEGRA_SPDIF_CH_STA_TX_E),
+               REG(TEGRA_SPDIF_CH_STA_TX_F),
+       };
+#undef REG
+
+       struct tegra_spdif *spdif = s->private;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(regs); i++) {
+               u32 val = tegra_spdif_read(spdif, regs[i].offset);
+               seq_printf(s, "%s = %08x\n", regs[i].name, val);
+       }
+
+       return 0;
+}
+
+static int tegra_spdif_debug_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, tegra_spdif_show, inode->i_private);
+}
+
+static const struct file_operations tegra_spdif_debug_fops = {
+       .open    = tegra_spdif_debug_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
+       .release = single_release,
+};
+
+static void tegra_spdif_debug_add(struct tegra_spdif *spdif)
+{
+       spdif->debug = debugfs_create_file(DRV_NAME, S_IRUGO,
+                                               snd_soc_debugfs_root, spdif,
+                                               &tegra_spdif_debug_fops);
+}
+
+static void tegra_spdif_debug_remove(struct tegra_spdif *spdif)
+{
+       if (spdif->debug)
+               debugfs_remove(spdif->debug);
+}
+#else
+static inline void tegra_spdif_debug_add(struct tegra_spdif *spdif)
+{
+}
+
+static inline void tegra_spdif_debug_remove(struct tegra_spdif *spdif)
+{
+}
+#endif
+
+static int tegra_spdif_hw_params(struct snd_pcm_substream *substream,
+                               struct snd_pcm_hw_params *params,
+                               struct snd_soc_dai *dai)
+{
+       struct device *dev = substream->pcm->card->dev;
+       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
+       int ret, spdifclock;
+
+       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_PACK;
+       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_BIT_MODE_MASK;
+       switch (params_format(params)) {
+       case SNDRV_PCM_FORMAT_S16_LE:
+               spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_PACK;
+               spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_BIT_MODE_16BIT;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       switch (params_rate(params)) {
+       case 32000:
+               spdifclock = 4096000;
+               break;
+       case 44100:
+               spdifclock = 5644800;
+               break;
+       case 48000:
+               spdifclock = 6144000;
+               break;
+       case 88200:
+               spdifclock = 11289600;
+               break;
+       case 96000:
+               spdifclock = 12288000;
+               break;
+       case 176400:
+               spdifclock = 22579200;
+               break;
+       case 192000:
+               spdifclock = 24576000;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = clk_set_rate(spdif->clk_spdif_out, spdifclock);
+       if (ret) {
+               dev_err(dev, "Can't set SPDIF clock rate: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static void tegra_spdif_start_playback(struct tegra_spdif *spdif)
+{
+       spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_TX_EN;
+       tegra_spdif_write(spdif, TEGRA_SPDIF_CTRL, spdif->reg_ctrl);
+}
+
+static void tegra_spdif_stop_playback(struct tegra_spdif *spdif)
+{
+       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_TX_EN;
+       tegra_spdif_write(spdif, TEGRA_SPDIF_CTRL, spdif->reg_ctrl);
+}
+
+static int tegra_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
+                               struct snd_soc_dai *dai)
+{
+       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+       case SNDRV_PCM_TRIGGER_RESUME:
+               clk_enable(spdif->clk_spdif_out);
+               tegra_spdif_start_playback(spdif);
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+               tegra_spdif_stop_playback(spdif);
+               clk_disable(spdif->clk_spdif_out);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int tegra_spdif_probe(struct snd_soc_dai *dai)
+{
+       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
+
+       dai->capture_dma_data = NULL;
+       dai->playback_dma_data = &spdif->playback_dma_data;
+
+       return 0;
+}
+
+static const struct snd_soc_dai_ops tegra_spdif_dai_ops = {
+       .hw_params      = tegra_spdif_hw_params,
+       .trigger        = tegra_spdif_trigger,
+};
+
+static struct snd_soc_dai_driver tegra_spdif_dai = {
+       .name = DRV_NAME,
+       .probe = tegra_spdif_probe,
+       .playback = {
+               .channels_min = 2,
+               .channels_max = 2,
+               .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+                               SNDRV_PCM_RATE_48000,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+       },
+       .ops = &tegra_spdif_dai_ops,
+};
+
+static __devinit int tegra_spdif_platform_probe(struct platform_device *pdev)
+{
+       struct tegra_spdif *spdif;
+       struct resource *mem, *memregion, *dmareq;
+       int ret;
+
+       spdif = kzalloc(sizeof(struct tegra_spdif), GFP_KERNEL);
+       if (!spdif) {
+               dev_err(&pdev->dev, "Can't allocate tegra_spdif\n");
+               ret = -ENOMEM;
+               goto exit;
+       }
+       dev_set_drvdata(&pdev->dev, spdif);
+
+       spdif->clk_spdif_out = clk_get(&pdev->dev, "spdif_out");
+       if (IS_ERR(spdif->clk_spdif_out)) {
+               pr_err("Can't retrieve spdif clock\n");
+               ret = PTR_ERR(spdif->clk_spdif_out);
+               goto err_free;
+       }
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!mem) {
+               dev_err(&pdev->dev, "No memory resource\n");
+               ret = -ENODEV;
+               goto err_clk_put;
+       }
+
+       dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmareq) {
+               dev_err(&pdev->dev, "No DMA resource\n");
+               ret = -ENODEV;
+               goto err_clk_put;
+       }
+
+       memregion = request_mem_region(mem->start, resource_size(mem),
+                                       DRV_NAME);
+       if (!memregion) {
+               dev_err(&pdev->dev, "Memory region already claimed\n");
+               ret = -EBUSY;
+               goto err_clk_put;
+       }
+
+       spdif->regs = ioremap(mem->start, resource_size(mem));
+       if (!spdif->regs) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err_release;
+       }
+
+       spdif->playback_dma_data.addr = mem->start + TEGRA_SPDIF_DATA_OUT;
+       spdif->playback_dma_data.wrap = 4;
+       spdif->playback_dma_data.width = 32;
+       spdif->playback_dma_data.req_sel = dmareq->start;
+
+       ret = snd_soc_register_dai(&pdev->dev, &tegra_spdif_dai);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
+               ret = -ENOMEM;
+               goto err_unmap;
+       }
+
+       ret = tegra_pcm_platform_register(&pdev->dev);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
+               goto err_unregister_dai;
+       }
+
+       tegra_spdif_debug_add(spdif);
+
+       return 0;
+
+err_unregister_dai:
+       snd_soc_unregister_dai(&pdev->dev);
+err_unmap:
+       iounmap(spdif->regs);
+err_release:
+       release_mem_region(mem->start, resource_size(mem));
+err_clk_put:
+       clk_put(spdif->clk_spdif_out);
+err_free:
+       kfree(spdif);
+exit:
+       return ret;
+}
+
+static int __devexit tegra_spdif_platform_remove(struct platform_device *pdev)
+{
+       struct tegra_spdif *spdif = dev_get_drvdata(&pdev->dev);
+       struct resource *res;
+
+       tegra_pcm_platform_unregister(&pdev->dev);
+       snd_soc_unregister_dai(&pdev->dev);
+
+       tegra_spdif_debug_remove(spdif);
+
+       iounmap(spdif->regs);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       release_mem_region(res->start, resource_size(res));
+
+       clk_put(spdif->clk_spdif_out);
+
+       kfree(spdif);
+
+       return 0;
+}
+
+static struct platform_driver tegra_spdif_driver = {
+       .driver = {
+               .name = DRV_NAME,
+               .owner = THIS_MODULE,
+       },
+       .probe = tegra_spdif_platform_probe,
+       .remove = __devexit_p(tegra_spdif_platform_remove),
+};
+
+module_platform_driver(tegra_spdif_driver);
+
+MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
+MODULE_DESCRIPTION("Tegra SPDIF ASoC driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
diff --git a/sound/soc/tegra/tegra20_spdif.h b/sound/soc/tegra/tegra20_spdif.h
new file mode 100644 (file)
index 0000000..001f9dc
--- /dev/null
@@ -0,0 +1,472 @@
+/*
+ * tegra20_spdif.h - Definitions for Tegra20 SPDIF driver
+ *
+ * Author: Stephen Warren <swarren@nvidia.com>
+ * Copyright (C) 2011 - NVIDIA, Inc.
+ *
+ * Based on code copyright/by:
+ * Copyright (c) 2008-2009, NVIDIA Corporation
+ *
+ * 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
+ *
+ */
+
+#ifndef __TEGRA_SPDIF_H__
+#define __TEGRA_SPDIF_H__
+
+#include "tegra_pcm.h"
+
+/* Offsets from TEGRA_SPDIF_BASE */
+
+#define TEGRA_SPDIF_CTRL                                       0x0
+#define TEGRA_SPDIF_STATUS                                     0x4
+#define TEGRA_SPDIF_STROBE_CTRL                                        0x8
+#define TEGRA_SPDIF_DATA_FIFO_CSR                              0x0C
+#define TEGRA_SPDIF_DATA_OUT                                   0x40
+#define TEGRA_SPDIF_DATA_IN                                    0x80
+#define TEGRA_SPDIF_CH_STA_RX_A                                        0x100
+#define TEGRA_SPDIF_CH_STA_RX_B                                        0x104
+#define TEGRA_SPDIF_CH_STA_RX_C                                        0x108
+#define TEGRA_SPDIF_CH_STA_RX_D                                        0x10C
+#define TEGRA_SPDIF_CH_STA_RX_E                                        0x110
+#define TEGRA_SPDIF_CH_STA_RX_F                                        0x114
+#define TEGRA_SPDIF_CH_STA_TX_A                                        0x140
+#define TEGRA_SPDIF_CH_STA_TX_B                                        0x144
+#define TEGRA_SPDIF_CH_STA_TX_C                                        0x148
+#define TEGRA_SPDIF_CH_STA_TX_D                                        0x14C
+#define TEGRA_SPDIF_CH_STA_TX_E                                        0x150
+#define TEGRA_SPDIF_CH_STA_TX_F                                        0x154
+#define TEGRA_SPDIF_USR_STA_RX_A                               0x180
+#define TEGRA_SPDIF_USR_DAT_TX_A                               0x1C0
+
+/* Fields in TEGRA_SPDIF_CTRL */
+
+/* Start capturing from 0=right, 1=left channel */
+#define TEGRA_SPDIF_CTRL_CAP_LC                                        (1 << 30)
+
+/* SPDIF receiver(RX) enable */
+#define TEGRA_SPDIF_CTRL_RX_EN                                 (1 << 29)
+
+/* SPDIF Transmitter(TX) enable */
+#define TEGRA_SPDIF_CTRL_TX_EN                                 (1 << 28)
+
+/* Transmit Channel status */
+#define TEGRA_SPDIF_CTRL_TC_EN                                 (1 << 27)
+
+/* Transmit user Data */
+#define TEGRA_SPDIF_CTRL_TU_EN                                 (1 << 26)
+
+/* Interrupt on transmit error */
+#define TEGRA_SPDIF_CTRL_IE_TXE                                        (1 << 25)
+
+/* Interrupt on receive error */
+#define TEGRA_SPDIF_CTRL_IE_RXE                                        (1 << 24)
+
+/* Interrupt on invalid preamble */
+#define TEGRA_SPDIF_CTRL_IE_P                                  (1 << 23)
+
+/* Interrupt on "B" preamble */
+#define TEGRA_SPDIF_CTRL_IE_B                                  (1 << 22)
+
+/* Interrupt when block of channel status received */
+#define TEGRA_SPDIF_CTRL_IE_C                                  (1 << 21)
+
+/* Interrupt when a valid information unit (IU) is received */
+#define TEGRA_SPDIF_CTRL_IE_U                                  (1 << 20)
+
+/* Interrupt when RX user FIFO attention level is reached */
+#define TEGRA_SPDIF_CTRL_QE_RU                                 (1 << 19)
+
+/* Interrupt when TX user FIFO attention level is reached */
+#define TEGRA_SPDIF_CTRL_QE_TU                                 (1 << 18)
+
+/* Interrupt when RX data FIFO attention level is reached */
+#define TEGRA_SPDIF_CTRL_QE_RX                                 (1 << 17)
+
+/* Interrupt when TX data FIFO attention level is reached */
+#define TEGRA_SPDIF_CTRL_QE_TX                                 (1 << 16)
+
+/* Loopback test mode enable */
+#define TEGRA_SPDIF_CTRL_LBK_EN                                        (1 << 15)
+
+/*
+ * Pack data mode:
+ * 0 = Single data (16 bit needs to be  padded to match the
+ *     interface data bit size).
+ * 1 = Packeted left/right channel data into a single word.
+ */
+#define TEGRA_SPDIF_CTRL_PACK                                  (1 << 14)
+
+/*
+ * 00 = 16bit data
+ * 01 = 20bit data
+ * 10 = 24bit data
+ * 11 = raw data
+ */
+#define TEGRA_SPDIF_BIT_MODE_16BIT                             0
+#define TEGRA_SPDIF_BIT_MODE_20BIT                             1
+#define TEGRA_SPDIF_BIT_MODE_24BIT                             2
+#define TEGRA_SPDIF_BIT_MODE_RAW                               3
+
+#define TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT                                12
+#define TEGRA_SPDIF_CTRL_BIT_MODE_MASK                         (3                          << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
+#define TEGRA_SPDIF_CTRL_BIT_MODE_16BIT                                (TEGRA_SPDIF_BIT_MODE_16BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
+#define TEGRA_SPDIF_CTRL_BIT_MODE_20BIT                                (TEGRA_SPDIF_BIT_MODE_20BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
+#define TEGRA_SPDIF_CTRL_BIT_MODE_24BIT                                (TEGRA_SPDIF_BIT_MODE_24BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
+#define TEGRA_SPDIF_CTRL_BIT_MODE_RAW                          (TEGRA_SPDIF_BIT_MODE_RAW   << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
+
+/* Fields in TEGRA_SPDIF_STATUS */
+
+/*
+ * Note: IS_P, IS_B, IS_C, and IS_U are sticky bits. Software must
+ * write a 1 to the corresponding bit location to clear the status.
+ */
+
+/*
+ * Receiver(RX) shifter is busy receiving data.
+ * This bit is asserted when the receiver first locked onto the
+ * preamble of the data stream after RX_EN is asserted. This bit is
+ * deasserted when either,
+ * (a) the end of a frame is reached after RX_EN is deeasserted, or
+ * (b) the SPDIF data stream becomes inactive.
+ */
+#define TEGRA_SPDIF_STATUS_RX_BSY                              (1 << 29)
+
+/*
+ * Transmitter(TX) shifter is busy transmitting data.
+ * This bit is asserted when TX_EN is asserted.
+ * This bit is deasserted when the end of a frame is reached after
+ * TX_EN is deasserted.
+ */
+#define TEGRA_SPDIF_STATUS_TX_BSY                              (1 << 28)
+
+/*
+ * TX is busy shifting out channel status.
+ * This bit is asserted when both TX_EN and TC_EN are asserted and
+ * data from CH_STA_TX_A register is loaded into the internal shifter.
+ * This bit is deasserted when either,
+ * (a) the end of a frame is reached after TX_EN is deasserted, or
+ * (b) CH_STA_TX_F register is loaded into the internal shifter.
+ */
+#define TEGRA_SPDIF_STATUS_TC_BSY                              (1 << 27)
+
+/*
+ * TX User data FIFO busy.
+ * This bit is asserted when TX_EN and TXU_EN are asserted and
+ * there's data in the TX user FIFO.  This bit is deassert when either,
+ * (a) the end of a frame is reached after TX_EN is deasserted, or
+ * (b) there's no data left in the TX user FIFO.
+ */
+#define TEGRA_SPDIF_STATUS_TU_BSY                              (1 << 26)
+
+/* TX FIFO Underrun error status */
+#define TEGRA_SPDIF_STATUS_TX_ERR                              (1 << 25)
+
+/* RX FIFO Overrun error status */
+#define TEGRA_SPDIF_STATUS_RX_ERR                              (1 << 24)
+
+/* Preamble status: 0=Preamble OK, 1=bad/missing preamble */
+#define TEGRA_SPDIF_STATUS_IS_P                                        (1 << 23)
+
+/* B-preamble detection status: 0=not detected, 1=B-preamble detected */
+#define TEGRA_SPDIF_STATUS_IS_B                                        (1 << 22)
+
+/*
+ * RX channel block data receive status:
+ * 0=entire block not recieved yet.
+ * 1=received entire block of channel status,
+ */
+#define TEGRA_SPDIF_STATUS_IS_C                                        (1 << 21)
+
+/* RX User Data Valid flag:  1=valid IU detected, 0 = no IU detected. */
+#define TEGRA_SPDIF_STATUS_IS_U                                        (1 << 20)
+
+/*
+ * RX User FIFO Status:
+ * 1=attention level reached, 0=attention level not reached.
+ */
+#define TEGRA_SPDIF_STATUS_QS_RU                               (1 << 19)
+
+/*
+ * TX User FIFO Status:
+ * 1=attention level reached, 0=attention level not reached.
+ */
+#define TEGRA_SPDIF_STATUS_QS_TU                               (1 << 18)
+
+/*
+ * RX Data FIFO Status:
+ * 1=attention level reached, 0=attention level not reached.
+ */
+#define TEGRA_SPDIF_STATUS_QS_RX                               (1 << 17)
+
+/*
+ * TX Data FIFO Status:
+ * 1=attention level reached, 0=attention level not reached.
+ */
+#define TEGRA_SPDIF_STATUS_QS_TX                               (1 << 16)
+
+/* Fields in TEGRA_SPDIF_STROBE_CTRL */
+
+/*
+ * Indicates the approximate number of detected SPDIFIN clocks within a
+ * bi-phase period.
+ */
+#define TEGRA_SPDIF_STROBE_CTRL_PERIOD_SHIFT                   16
+#define TEGRA_SPDIF_STROBE_CTRL_PERIOD_MASK                    (0xff << TEGRA_SPDIF_STROBE_CTRL_PERIOD_SHIFT)
+
+/* Data strobe mode: 0=Auto-locked 1=Manual locked */
+#define TEGRA_SPDIF_STROBE_CTRL_STROBE                         (1 << 15)
+
+/*
+ * Manual data strobe time within the bi-phase clock period (in terms of
+ * the number of over-sampling clocks).
+ */
+#define TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT             8
+#define TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_MASK              (0x1f << TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT)
+
+/*
+ * Manual SPDIFIN bi-phase clock period (in terms of the number of
+ * over-sampling clocks).
+ */
+#define TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT             0
+#define TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_MASK              (0x3f << TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT)
+
+/* Fields in SPDIF_DATA_FIFO_CSR */
+
+/* Clear Receiver User FIFO (RX USR.FIFO) */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_CLR                       (1 << 31)
+
+#define TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT                    0
+#define TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS                   1
+#define TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS                 2
+#define TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS                  3
+
+/* RU FIFO attention level */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT             29
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_MASK              \
+               (0x3                                    << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU1_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU2_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU3_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU4_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
+
+/* Number of RX USR.FIFO levels with valid data. */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT          24
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_MASK           (0x1f << TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT)
+
+/* Clear Transmitter User FIFO (TX USR.FIFO) */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_CLR                       (1 << 23)
+
+/* TU FIFO attention level */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT             21
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_MASK              \
+               (0x3                                   << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU1_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU2_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU3_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU4_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
+
+/* Number of TX USR.FIFO levels that could be filled. */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT         16
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_MASK          (0x1f << SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT)
+
+/* Clear Receiver Data FIFO (RX DATA.FIFO) */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_CLR                       (1 << 15)
+
+#define TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT                    0
+#define TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS                  1
+#define TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS                 2
+#define TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS                        3
+
+/* RU FIFO attention level */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT             13
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_MASK              \
+               (0x3                                     << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU1_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU4_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU8_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU12_WORD_FULL    \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
+
+/* Number of RX DATA.FIFO levels with valid data. */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT          8
+#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_MASK           (0x1f << TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT)
+
+/* Clear Transmitter Data FIFO (TX DATA.FIFO) */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_CLR                       (1 << 7)
+
+/* TU FIFO attention level */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT             5
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_MASK              \
+               (0x3                                     << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU1_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU4_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU8_WORD_FULL     \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU12_WORD_FULL    \
+               (TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
+
+/* Number of TX DATA.FIFO levels that could be filled. */
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT         0
+#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_MASK          (0x1f << SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT)
+
+/* Fields in TEGRA_SPDIF_DATA_OUT */
+
+/*
+ * This register has 5 different formats:
+ * 16-bit        (BIT_MODE=00, PACK=0)
+ * 20-bit        (BIT_MODE=01, PACK=0)
+ * 24-bit        (BIT_MODE=10, PACK=0)
+ * raw           (BIT_MODE=11, PACK=0)
+ * 16-bit packed (BIT_MODE=00, PACK=1)
+ */
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_SHIFT                     0
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_MASK                      (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_20_SHIFT                     0
+#define TEGRA_SPDIF_DATA_OUT_DATA_20_MASK                      (0xfffff << TEGRA_SPDIF_DATA_OUT_DATA_20_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_24_SHIFT                     0
+#define TEGRA_SPDIF_DATA_OUT_DATA_24_MASK                      (0xffffff << TEGRA_SPDIF_DATA_OUT_DATA_24_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_P                                (1 << 31)
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_C                                (1 << 30)
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_U                                (1 << 29)
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_V                                (1 << 28)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT               8
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_MASK                        (0xfffff << TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT                        4
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_MASK                 (0xf << TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT           0
+#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_MASK            (0xf << TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT                16
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_MASK         (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT)
+
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT         0
+#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_MASK          (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT)
+
+/* Fields in TEGRA_SPDIF_DATA_IN */
+
+/*
+ * This register has 5 different formats:
+ * 16-bit        (BIT_MODE=00, PACK=0)
+ * 20-bit        (BIT_MODE=01, PACK=0)
+ * 24-bit        (BIT_MODE=10, PACK=0)
+ * raw           (BIT_MODE=11, PACK=0)
+ * 16-bit packed (BIT_MODE=00, PACK=1)
+ *
+ * Bits 31:24 are common to all modes except 16-bit packed
+ */
+
+#define TEGRA_SPDIF_DATA_IN_DATA_P                             (1 << 31)
+#define TEGRA_SPDIF_DATA_IN_DATA_C                             (1 << 30)
+#define TEGRA_SPDIF_DATA_IN_DATA_U                             (1 << 29)
+#define TEGRA_SPDIF_DATA_IN_DATA_V                             (1 << 28)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT                        24
+#define TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_MASK                 (0xf << TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_16_SHIFT                      0
+#define TEGRA_SPDIF_DATA_IN_DATA_16_MASK                       (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_20_SHIFT                      0
+#define TEGRA_SPDIF_DATA_IN_DATA_20_MASK                       (0xfffff << TEGRA_SPDIF_DATA_IN_DATA_20_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_24_SHIFT                      0
+#define TEGRA_SPDIF_DATA_IN_DATA_24_MASK                       (0xffffff << TEGRA_SPDIF_DATA_IN_DATA_24_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT                        8
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_MASK                 (0xfffff << TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT                 4
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_MASK                  (0xf << TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT            0
+#define TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_MASK             (0xf << TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT         16
+#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_MASK          (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT)
+
+#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT          0
+#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_MASK           (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT)
+
+/* Fields in TEGRA_SPDIF_CH_STA_RX_A */
+/* Fields in TEGRA_SPDIF_CH_STA_RX_B */
+/* Fields in TEGRA_SPDIF_CH_STA_RX_C */
+/* Fields in TEGRA_SPDIF_CH_STA_RX_D */
+/* Fields in TEGRA_SPDIF_CH_STA_RX_E */
+/* Fields in TEGRA_SPDIF_CH_STA_RX_F */
+
+/*
+ * The 6-word receive channel data page buffer holds a block (192 frames) of
+ * channel status information. The order of receive is from LSB to MSB
+ * bit, and from CH_STA_RX_A to CH_STA_RX_F then back to CH_STA_RX_A.
+ */
+
+/* Fields in TEGRA_SPDIF_CH_STA_TX_A */
+/* Fields in TEGRA_SPDIF_CH_STA_TX_B */
+/* Fields in TEGRA_SPDIF_CH_STA_TX_C */
+/* Fields in TEGRA_SPDIF_CH_STA_TX_D */
+/* Fields in TEGRA_SPDIF_CH_STA_TX_E */
+/* Fields in TEGRA_SPDIF_CH_STA_TX_F */
+
+/*
+ * The 6-word transmit channel data page buffer holds a block (192 frames) of
+ * channel status information. The order of transmission is from LSB to MSB
+ * bit, and from CH_STA_TX_A to CH_STA_TX_F then back to CH_STA_TX_A.
+ */
+
+/* Fields in TEGRA_SPDIF_USR_STA_RX_A */
+
+/*
+ * This 4-word deep FIFO receives user FIFO field information. The order of
+ * receive is from LSB to MSB bit.
+ */
+
+/* Fields in TEGRA_SPDIF_USR_DAT_TX_A */
+
+/*
+ * This 4-word deep FIFO transmits user FIFO field information. The order of
+ * transmission is from LSB to MSB bit.
+ */
+
+struct tegra_spdif {
+       struct clk *clk_spdif_out;
+       struct tegra_pcm_dma_params capture_dma_data;
+       struct tegra_pcm_dma_params playback_dma_data;
+       void __iomem *regs;
+       struct dentry *debug;
+       u32 reg_ctrl;
+};
+
+#endif
diff --git a/sound/soc/tegra/tegra_das.c b/sound/soc/tegra/tegra_das.c
deleted file mode 100644 (file)
index 3b3c1ba..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * tegra_das.c - Tegra DAS driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010 - NVIDIA, Inc.
- *
- * 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
- *
- */
-
-#include <linux/module.h>
-#include <linux/debugfs.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-#include <linux/io.h>
-#include <mach/iomap.h>
-#include <sound/soc.h>
-#include "tegra_das.h"
-
-#define DRV_NAME "tegra-das"
-
-static struct tegra_das *das;
-
-static inline void tegra_das_write(u32 reg, u32 val)
-{
-       __raw_writel(val, das->regs + reg);
-}
-
-static inline u32 tegra_das_read(u32 reg)
-{
-       return __raw_readl(das->regs + reg);
-}
-
-int tegra_das_connect_dap_to_dac(int dap, int dac)
-{
-       u32 addr;
-       u32 reg;
-
-       if (!das)
-               return -ENODEV;
-
-       addr = TEGRA_DAS_DAP_CTRL_SEL +
-               (dap * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
-       reg = dac << TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P;
-
-       tegra_das_write(addr, reg);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(tegra_das_connect_dap_to_dac);
-
-int tegra_das_connect_dap_to_dap(int dap, int otherdap, int master,
-                                       int sdata1rx, int sdata2rx)
-{
-       u32 addr;
-       u32 reg;
-
-       if (!das)
-               return -ENODEV;
-
-       addr = TEGRA_DAS_DAP_CTRL_SEL +
-               (dap * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
-       reg = otherdap << TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P |
-               !!sdata2rx << TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_P |
-               !!sdata1rx << TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_P |
-               !!master << TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_P;
-
-       tegra_das_write(addr, reg);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(tegra_das_connect_dap_to_dap);
-
-int tegra_das_connect_dac_to_dap(int dac, int dap)
-{
-       u32 addr;
-       u32 reg;
-
-       if (!das)
-               return -ENODEV;
-
-       addr = TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL +
-               (dac * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE);
-       reg = dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_P |
-               dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_P |
-               dap << TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_P;
-
-       tegra_das_write(addr, reg);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(tegra_das_connect_dac_to_dap);
-
-#ifdef CONFIG_DEBUG_FS
-static int tegra_das_show(struct seq_file *s, void *unused)
-{
-       int i;
-       u32 addr;
-       u32 reg;
-
-       for (i = 0; i < TEGRA_DAS_DAP_CTRL_SEL_COUNT; i++) {
-               addr = TEGRA_DAS_DAP_CTRL_SEL +
-                       (i * TEGRA_DAS_DAP_CTRL_SEL_STRIDE);
-               reg = tegra_das_read(addr);
-               seq_printf(s, "TEGRA_DAS_DAP_CTRL_SEL[%d] = %08x\n", i, reg);
-       }
-
-       for (i = 0; i < TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_COUNT; i++) {
-               addr = TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL +
-                       (i * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE);
-               reg = tegra_das_read(addr);
-               seq_printf(s, "TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL[%d] = %08x\n",
-                                i, reg);
-       }
-
-       return 0;
-}
-
-static int tegra_das_debug_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, tegra_das_show, inode->i_private);
-}
-
-static const struct file_operations tegra_das_debug_fops = {
-       .open    = tegra_das_debug_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = single_release,
-};
-
-static void tegra_das_debug_add(struct tegra_das *das)
-{
-       das->debug = debugfs_create_file(DRV_NAME, S_IRUGO,
-                                        snd_soc_debugfs_root, das,
-                                        &tegra_das_debug_fops);
-}
-
-static void tegra_das_debug_remove(struct tegra_das *das)
-{
-       if (das->debug)
-               debugfs_remove(das->debug);
-}
-#else
-static inline void tegra_das_debug_add(struct tegra_das *das)
-{
-}
-
-static inline void tegra_das_debug_remove(struct tegra_das *das)
-{
-}
-#endif
-
-static int __devinit tegra_das_probe(struct platform_device *pdev)
-{
-       struct resource *res, *region;
-       int ret = 0;
-
-       if (das)
-               return -ENODEV;
-
-       das = devm_kzalloc(&pdev->dev, sizeof(struct tegra_das), GFP_KERNEL);
-       if (!das) {
-               dev_err(&pdev->dev, "Can't allocate tegra_das\n");
-               ret = -ENOMEM;
-               goto err;
-       }
-       das->dev = &pdev->dev;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "No memory resource\n");
-               ret = -ENODEV;
-               goto err;
-       }
-
-       region = devm_request_mem_region(&pdev->dev, res->start,
-                                        resource_size(res), pdev->name);
-       if (!region) {
-               dev_err(&pdev->dev, "Memory region already claimed\n");
-               ret = -EBUSY;
-               goto err;
-       }
-
-       das->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
-       if (!das->regs) {
-               dev_err(&pdev->dev, "ioremap failed\n");
-               ret = -ENOMEM;
-               goto err;
-       }
-
-       ret = tegra_das_connect_dap_to_dac(TEGRA_DAS_DAP_ID_1,
-                                          TEGRA_DAS_DAP_SEL_DAC1);
-       if (ret) {
-               dev_err(&pdev->dev, "Can't set up DAS DAP connection\n");
-               goto err;
-       }
-       ret = tegra_das_connect_dac_to_dap(TEGRA_DAS_DAC_ID_1,
-                                          TEGRA_DAS_DAC_SEL_DAP1);
-       if (ret) {
-               dev_err(&pdev->dev, "Can't set up DAS DAC connection\n");
-               goto err;
-       }
-
-       tegra_das_debug_add(das);
-
-       platform_set_drvdata(pdev, das);
-
-       return 0;
-
-err:
-       das = NULL;
-       return ret;
-}
-
-static int __devexit tegra_das_remove(struct platform_device *pdev)
-{
-       if (!das)
-               return -ENODEV;
-
-       tegra_das_debug_remove(das);
-
-       das = NULL;
-
-       return 0;
-}
-
-static const struct of_device_id tegra_das_of_match[] __devinitconst = {
-       { .compatible = "nvidia,tegra20-das", },
-       {},
-};
-
-static struct platform_driver tegra_das_driver = {
-       .probe = tegra_das_probe,
-       .remove = __devexit_p(tegra_das_remove),
-       .driver = {
-               .name = DRV_NAME,
-               .owner = THIS_MODULE,
-               .of_match_table = tegra_das_of_match,
-       },
-};
-module_platform_driver(tegra_das_driver);
-
-MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
-MODULE_DESCRIPTION("Tegra DAS driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:" DRV_NAME);
-MODULE_DEVICE_TABLE(of, tegra_das_of_match);
diff --git a/sound/soc/tegra/tegra_das.h b/sound/soc/tegra/tegra_das.h
deleted file mode 100644 (file)
index 1810cd1..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * tegra_das.h - Definitions for Tegra DAS driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010 - NVIDIA, Inc.
- *
- * 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
- *
- */
-
-#ifndef __TEGRA_DAS_H__
-#define __TEGRA_DAS_H__
-
-/* Register TEGRA_DAS_DAP_CTRL_SEL */
-#define TEGRA_DAS_DAP_CTRL_SEL                         0x00
-#define TEGRA_DAS_DAP_CTRL_SEL_COUNT                   5
-#define TEGRA_DAS_DAP_CTRL_SEL_STRIDE                  4
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_P            31
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_MS_SEL_S            1
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_P      30
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA1_TX_RX_S      1
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_P      29
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_SDATA2_TX_RX_S      1
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_P          0
-#define TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL_S          5
-
-/* Values for field TEGRA_DAS_DAP_CTRL_SEL_DAP_CTRL_SEL */
-#define TEGRA_DAS_DAP_SEL_DAC1 0
-#define TEGRA_DAS_DAP_SEL_DAC2 1
-#define TEGRA_DAS_DAP_SEL_DAC3 2
-#define TEGRA_DAS_DAP_SEL_DAP1 16
-#define TEGRA_DAS_DAP_SEL_DAP2 17
-#define TEGRA_DAS_DAP_SEL_DAP3 18
-#define TEGRA_DAS_DAP_SEL_DAP4 19
-#define TEGRA_DAS_DAP_SEL_DAP5 20
-
-/* Register TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL */
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL                       0x40
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_COUNT                 3
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_STRIDE                        4
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_P      28
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL_S      4
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_P      24
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL_S      4
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_P         0
-#define TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL_S         4
-
-/*
- * Values for:
- * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA2_SEL
- * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_SDATA1_SEL
- * TEGRA_DAS_DAC_INPUT_DATA_CLK_SEL_DAC_CLK_SEL
- */
-#define TEGRA_DAS_DAC_SEL_DAP1 0
-#define TEGRA_DAS_DAC_SEL_DAP2 1
-#define TEGRA_DAS_DAC_SEL_DAP3 2
-#define TEGRA_DAS_DAC_SEL_DAP4 3
-#define TEGRA_DAS_DAC_SEL_DAP5 4
-
-/*
- * Names/IDs of the DACs/DAPs.
- */
-
-#define TEGRA_DAS_DAP_ID_1 0
-#define TEGRA_DAS_DAP_ID_2 1
-#define TEGRA_DAS_DAP_ID_3 2
-#define TEGRA_DAS_DAP_ID_4 3
-#define TEGRA_DAS_DAP_ID_5 4
-
-#define TEGRA_DAS_DAC_ID_1 0
-#define TEGRA_DAS_DAC_ID_2 1
-#define TEGRA_DAS_DAC_ID_3 2
-
-struct tegra_das {
-       struct device *dev;
-       void __iomem *regs;
-       struct dentry *debug;
-};
-
-/*
- * Terminology:
- * DAS: Digital audio switch (HW module controlled by this driver)
- * DAP: Digital audio port (port/pins on Tegra device)
- * DAC: Digital audio controller (e.g. I2S or AC97 controller elsewhere)
- *
- * The Tegra DAS is a mux/cross-bar which can connect each DAP to a specific
- * DAC, or another DAP. When DAPs are connected, one must be the master and
- * one the slave. Each DAC allows selection of a specific DAP for input, to
- * cater for the case where N DAPs are connected to 1 DAC for broadcast
- * output.
- *
- * This driver is dumb; no attempt is made to ensure that a valid routing
- * configuration is programmed.
- */
-
-/*
- * Connect a DAP to to a DAC
- * dap_id: DAP to connect: TEGRA_DAS_DAP_ID_*
- * dac_sel: DAC to connect to: TEGRA_DAS_DAP_SEL_DAC*
- */
-extern int tegra_das_connect_dap_to_dac(int dap_id, int dac_sel);
-
-/*
- * Connect a DAP to to another DAP
- * dap_id: DAP to connect: TEGRA_DAS_DAP_ID_*
- * other_dap_sel: DAP to connect to: TEGRA_DAS_DAP_SEL_DAP*
- * master: Is this DAP the master (1) or slave (0)
- * sdata1rx: Is this DAP's SDATA1 pin RX (1) or TX (0)
- * sdata2rx: Is this DAP's SDATA2 pin RX (1) or TX (0)
- */
-extern int tegra_das_connect_dap_to_dap(int dap_id, int other_dap_sel,
-                                       int master, int sdata1rx,
-                                       int sdata2rx);
-
-/*
- * Connect a DAC's input to a DAP
- * (DAC outputs are selected by the DAP)
- * dac_id: DAC ID to connect: TEGRA_DAS_DAC_ID_*
- * dap_sel: DAP to receive input from: TEGRA_DAS_DAC_SEL_DAP*
- */
-extern int tegra_das_connect_dac_to_dap(int dac_id, int dap_sel);
-
-#endif
diff --git a/sound/soc/tegra/tegra_i2s.c b/sound/soc/tegra/tegra_i2s.c
deleted file mode 100644 (file)
index 2d32b8c..0000000
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * tegra_i2s.c - Tegra I2S driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010,2012 - NVIDIA, Inc.
- *
- * Based on code copyright/by:
- *
- * Copyright (c) 2009-2010, NVIDIA Corporation.
- * Scott Peterson <speterson@nvidia.com>
- *
- * Copyright (C) 2010 Google, Inc.
- * Iliyan Malchev <malchev@google.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
- *
- */
-
-#include <linux/clk.h>
-#include <linux/module.h>
-#include <linux/debugfs.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <mach/iomap.h>
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/pcm_params.h>
-#include <sound/soc.h>
-
-#include "tegra_i2s.h"
-
-#define DRV_NAME "tegra-i2s"
-
-static inline void tegra_i2s_write(struct tegra_i2s *i2s, u32 reg, u32 val)
-{
-       __raw_writel(val, i2s->regs + reg);
-}
-
-static inline u32 tegra_i2s_read(struct tegra_i2s *i2s, u32 reg)
-{
-       return __raw_readl(i2s->regs + reg);
-}
-
-#ifdef CONFIG_DEBUG_FS
-static int tegra_i2s_show(struct seq_file *s, void *unused)
-{
-#define REG(r) { r, #r }
-       static const struct {
-               int offset;
-               const char *name;
-       } regs[] = {
-               REG(TEGRA_I2S_CTRL),
-               REG(TEGRA_I2S_STATUS),
-               REG(TEGRA_I2S_TIMING),
-               REG(TEGRA_I2S_FIFO_SCR),
-               REG(TEGRA_I2S_PCM_CTRL),
-               REG(TEGRA_I2S_NW_CTRL),
-               REG(TEGRA_I2S_TDM_CTRL),
-               REG(TEGRA_I2S_TDM_TX_RX_CTRL),
-       };
-#undef REG
-
-       struct tegra_i2s *i2s = s->private;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(regs); i++) {
-               u32 val = tegra_i2s_read(i2s, regs[i].offset);
-               seq_printf(s, "%s = %08x\n", regs[i].name, val);
-       }
-
-       return 0;
-}
-
-static int tegra_i2s_debug_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, tegra_i2s_show, inode->i_private);
-}
-
-static const struct file_operations tegra_i2s_debug_fops = {
-       .open    = tegra_i2s_debug_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = single_release,
-};
-
-static void tegra_i2s_debug_add(struct tegra_i2s *i2s)
-{
-       i2s->debug = debugfs_create_file(i2s->dai.name, S_IRUGO,
-                                        snd_soc_debugfs_root, i2s,
-                                        &tegra_i2s_debug_fops);
-}
-
-static void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
-{
-       if (i2s->debug)
-               debugfs_remove(i2s->debug);
-}
-#else
-static inline void tegra_i2s_debug_add(struct tegra_i2s *i2s, int id)
-{
-}
-
-static inline void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
-{
-}
-#endif
-
-static int tegra_i2s_set_fmt(struct snd_soc_dai *dai,
-                               unsigned int fmt)
-{
-       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-
-       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
-       case SND_SOC_DAIFMT_NB_NF:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_MASTER_ENABLE;
-       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
-       case SND_SOC_DAIFMT_CBS_CFS:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_MASTER_ENABLE;
-               break;
-       case SND_SOC_DAIFMT_CBM_CFM:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       i2s->reg_ctrl &= ~(TEGRA_I2S_CTRL_BIT_FORMAT_MASK |
-                               TEGRA_I2S_CTRL_LRCK_MASK);
-       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-       case SND_SOC_DAIFMT_DSP_A:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_DSP;
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
-               break;
-       case SND_SOC_DAIFMT_DSP_B:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_DSP;
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_R_LOW;
-               break;
-       case SND_SOC_DAIFMT_I2S:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_I2S;
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
-               break;
-       case SND_SOC_DAIFMT_RIGHT_J:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_RJM;
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
-               break;
-       case SND_SOC_DAIFMT_LEFT_J:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_FORMAT_LJM;
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_LRCK_L_LOW;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int tegra_i2s_hw_params(struct snd_pcm_substream *substream,
-                               struct snd_pcm_hw_params *params,
-                               struct snd_soc_dai *dai)
-{
-       struct device *dev = substream->pcm->card->dev;
-       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-       u32 reg;
-       int ret, sample_size, srate, i2sclock, bitcnt;
-
-       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_BIT_SIZE_MASK;
-       switch (params_format(params)) {
-       case SNDRV_PCM_FORMAT_S16_LE:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_16;
-               sample_size = 16;
-               break;
-       case SNDRV_PCM_FORMAT_S24_LE:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_24;
-               sample_size = 24;
-               break;
-       case SNDRV_PCM_FORMAT_S32_LE:
-               i2s->reg_ctrl |= TEGRA_I2S_CTRL_BIT_SIZE_32;
-               sample_size = 32;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       srate = params_rate(params);
-
-       /* Final "* 2" required by Tegra hardware */
-       i2sclock = srate * params_channels(params) * sample_size * 2;
-
-       ret = clk_set_rate(i2s->clk_i2s, i2sclock);
-       if (ret) {
-               dev_err(dev, "Can't set I2S clock rate: %d\n", ret);
-               return ret;
-       }
-
-       bitcnt = (i2sclock / (2 * srate)) - 1;
-       if (bitcnt < 0 || bitcnt > TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US)
-               return -EINVAL;
-       reg = bitcnt << TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT;
-
-       if (i2sclock % (2 * srate))
-               reg |= TEGRA_I2S_TIMING_NON_SYM_ENABLE;
-
-       clk_enable(i2s->clk_i2s);
-
-       tegra_i2s_write(i2s, TEGRA_I2S_TIMING, reg);
-
-       tegra_i2s_write(i2s, TEGRA_I2S_FIFO_SCR,
-               TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_FOUR_SLOTS |
-               TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_FOUR_SLOTS);
-
-       clk_disable(i2s->clk_i2s);
-
-       return 0;
-}
-
-static void tegra_i2s_start_playback(struct tegra_i2s *i2s)
-{
-       i2s->reg_ctrl |= TEGRA_I2S_CTRL_FIFO1_ENABLE;
-       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
-}
-
-static void tegra_i2s_stop_playback(struct tegra_i2s *i2s)
-{
-       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_FIFO1_ENABLE;
-       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
-}
-
-static void tegra_i2s_start_capture(struct tegra_i2s *i2s)
-{
-       i2s->reg_ctrl |= TEGRA_I2S_CTRL_FIFO2_ENABLE;
-       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
-}
-
-static void tegra_i2s_stop_capture(struct tegra_i2s *i2s)
-{
-       i2s->reg_ctrl &= ~TEGRA_I2S_CTRL_FIFO2_ENABLE;
-       tegra_i2s_write(i2s, TEGRA_I2S_CTRL, i2s->reg_ctrl);
-}
-
-static int tegra_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
-                               struct snd_soc_dai *dai)
-{
-       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-       case SNDRV_PCM_TRIGGER_RESUME:
-               clk_enable(i2s->clk_i2s);
-               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       tegra_i2s_start_playback(i2s);
-               else
-                       tegra_i2s_start_capture(i2s);
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       tegra_i2s_stop_playback(i2s);
-               else
-                       tegra_i2s_stop_capture(i2s);
-               clk_disable(i2s->clk_i2s);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int tegra_i2s_probe(struct snd_soc_dai *dai)
-{
-       struct tegra_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-
-       dai->capture_dma_data = &i2s->capture_dma_data;
-       dai->playback_dma_data = &i2s->playback_dma_data;
-
-       return 0;
-}
-
-static const struct snd_soc_dai_ops tegra_i2s_dai_ops = {
-       .set_fmt        = tegra_i2s_set_fmt,
-       .hw_params      = tegra_i2s_hw_params,
-       .trigger        = tegra_i2s_trigger,
-};
-
-static const struct snd_soc_dai_driver tegra_i2s_dai_template = {
-       .probe = tegra_i2s_probe,
-       .playback = {
-               .channels_min = 2,
-               .channels_max = 2,
-               .rates = SNDRV_PCM_RATE_8000_96000,
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,
-       },
-       .capture = {
-               .channels_min = 2,
-               .channels_max = 2,
-               .rates = SNDRV_PCM_RATE_8000_96000,
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,
-       },
-       .ops = &tegra_i2s_dai_ops,
-       .symmetric_rates = 1,
-};
-
-static __devinit int tegra_i2s_platform_probe(struct platform_device *pdev)
-{
-       struct tegra_i2s *i2s;
-       struct resource *mem, *memregion, *dmareq;
-       u32 of_dma[2];
-       u32 dma_ch;
-       int ret;
-
-       i2s = devm_kzalloc(&pdev->dev, sizeof(struct tegra_i2s), GFP_KERNEL);
-       if (!i2s) {
-               dev_err(&pdev->dev, "Can't allocate tegra_i2s\n");
-               ret = -ENOMEM;
-               goto err;
-       }
-       dev_set_drvdata(&pdev->dev, i2s);
-
-       i2s->dai = tegra_i2s_dai_template;
-       i2s->dai.name = dev_name(&pdev->dev);
-
-       i2s->clk_i2s = clk_get(&pdev->dev, NULL);
-       if (IS_ERR(i2s->clk_i2s)) {
-               dev_err(&pdev->dev, "Can't retrieve i2s clock\n");
-               ret = PTR_ERR(i2s->clk_i2s);
-               goto err;
-       }
-
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mem) {
-               dev_err(&pdev->dev, "No memory resource\n");
-               ret = -ENODEV;
-               goto err_clk_put;
-       }
-
-       dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!dmareq) {
-               if (of_property_read_u32_array(pdev->dev.of_node,
-                                       "nvidia,dma-request-selector",
-                                       of_dma, 2) < 0) {
-                       dev_err(&pdev->dev, "No DMA resource\n");
-                       ret = -ENODEV;
-                       goto err_clk_put;
-               }
-               dma_ch = of_dma[1];
-       } else {
-               dma_ch = dmareq->start;
-       }
-
-       memregion = devm_request_mem_region(&pdev->dev, mem->start,
-                                           resource_size(mem), DRV_NAME);
-       if (!memregion) {
-               dev_err(&pdev->dev, "Memory region already claimed\n");
-               ret = -EBUSY;
-               goto err_clk_put;
-       }
-
-       i2s->regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
-       if (!i2s->regs) {
-               dev_err(&pdev->dev, "ioremap failed\n");
-               ret = -ENOMEM;
-               goto err_clk_put;
-       }
-
-       i2s->capture_dma_data.addr = mem->start + TEGRA_I2S_FIFO2;
-       i2s->capture_dma_data.wrap = 4;
-       i2s->capture_dma_data.width = 32;
-       i2s->capture_dma_data.req_sel = dma_ch;
-
-       i2s->playback_dma_data.addr = mem->start + TEGRA_I2S_FIFO1;
-       i2s->playback_dma_data.wrap = 4;
-       i2s->playback_dma_data.width = 32;
-       i2s->playback_dma_data.req_sel = dma_ch;
-
-       i2s->reg_ctrl = TEGRA_I2S_CTRL_FIFO_FORMAT_PACKED;
-
-       ret = snd_soc_register_dai(&pdev->dev, &i2s->dai);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
-               ret = -ENOMEM;
-               goto err_clk_put;
-       }
-
-       ret = tegra_pcm_platform_register(&pdev->dev);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
-               goto err_unregister_dai;
-       }
-
-       tegra_i2s_debug_add(i2s);
-
-       return 0;
-
-err_unregister_dai:
-       snd_soc_unregister_dai(&pdev->dev);
-err_clk_put:
-       clk_put(i2s->clk_i2s);
-err:
-       return ret;
-}
-
-static int __devexit tegra_i2s_platform_remove(struct platform_device *pdev)
-{
-       struct tegra_i2s *i2s = dev_get_drvdata(&pdev->dev);
-
-       tegra_pcm_platform_unregister(&pdev->dev);
-       snd_soc_unregister_dai(&pdev->dev);
-
-       tegra_i2s_debug_remove(i2s);
-
-       clk_put(i2s->clk_i2s);
-
-       return 0;
-}
-
-static const struct of_device_id tegra_i2s_of_match[] __devinitconst = {
-       { .compatible = "nvidia,tegra20-i2s", },
-       {},
-};
-
-static struct platform_driver tegra_i2s_driver = {
-       .driver = {
-               .name = DRV_NAME,
-               .owner = THIS_MODULE,
-               .of_match_table = tegra_i2s_of_match,
-       },
-       .probe = tegra_i2s_platform_probe,
-       .remove = __devexit_p(tegra_i2s_platform_remove),
-};
-module_platform_driver(tegra_i2s_driver);
-
-MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
-MODULE_DESCRIPTION("Tegra I2S ASoC driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:" DRV_NAME);
-MODULE_DEVICE_TABLE(of, tegra_i2s_of_match);
diff --git a/sound/soc/tegra/tegra_i2s.h b/sound/soc/tegra/tegra_i2s.h
deleted file mode 100644 (file)
index c08e019..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * tegra_i2s.h - Definitions for Tegra I2S driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010 - NVIDIA, Inc.
- *
- * Based on code copyright/by:
- *
- * Copyright (c) 2009-2010, NVIDIA Corporation.
- * Scott Peterson <speterson@nvidia.com>
- *
- * Copyright (C) 2010 Google, Inc.
- * Iliyan Malchev <malchev@google.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
- *
- */
-
-#ifndef __TEGRA_I2S_H__
-#define __TEGRA_I2S_H__
-
-#include "tegra_pcm.h"
-
-/* Register offsets from TEGRA_I2S1_BASE and TEGRA_I2S2_BASE */
-
-#define TEGRA_I2S_CTRL                                 0x00
-#define TEGRA_I2S_STATUS                               0x04
-#define TEGRA_I2S_TIMING                               0x08
-#define TEGRA_I2S_FIFO_SCR                             0x0c
-#define TEGRA_I2S_PCM_CTRL                             0x10
-#define TEGRA_I2S_NW_CTRL                              0x14
-#define TEGRA_I2S_TDM_CTRL                             0x20
-#define TEGRA_I2S_TDM_TX_RX_CTRL                       0x24
-#define TEGRA_I2S_FIFO1                                        0x40
-#define TEGRA_I2S_FIFO2                                        0x80
-
-/* Fields in TEGRA_I2S_CTRL */
-
-#define TEGRA_I2S_CTRL_FIFO2_TX_ENABLE                 (1 << 30)
-#define TEGRA_I2S_CTRL_FIFO1_ENABLE                    (1 << 29)
-#define TEGRA_I2S_CTRL_FIFO2_ENABLE                    (1 << 28)
-#define TEGRA_I2S_CTRL_FIFO1_RX_ENABLE                 (1 << 27)
-#define TEGRA_I2S_CTRL_FIFO_LPBK_ENABLE                        (1 << 26)
-#define TEGRA_I2S_CTRL_MASTER_ENABLE                   (1 << 25)
-
-#define TEGRA_I2S_LRCK_LEFT_LOW                                0
-#define TEGRA_I2S_LRCK_RIGHT_LOW                       1
-
-#define TEGRA_I2S_CTRL_LRCK_SHIFT                      24
-#define TEGRA_I2S_CTRL_LRCK_MASK                       (1                        << TEGRA_I2S_CTRL_LRCK_SHIFT)
-#define TEGRA_I2S_CTRL_LRCK_L_LOW                      (TEGRA_I2S_LRCK_LEFT_LOW  << TEGRA_I2S_CTRL_LRCK_SHIFT)
-#define TEGRA_I2S_CTRL_LRCK_R_LOW                      (TEGRA_I2S_LRCK_RIGHT_LOW << TEGRA_I2S_CTRL_LRCK_SHIFT)
-
-#define TEGRA_I2S_BIT_FORMAT_I2S                       0
-#define TEGRA_I2S_BIT_FORMAT_RJM                       1
-#define TEGRA_I2S_BIT_FORMAT_LJM                       2
-#define TEGRA_I2S_BIT_FORMAT_DSP                       3
-
-#define TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT                        10
-#define TEGRA_I2S_CTRL_BIT_FORMAT_MASK                 (3                        << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_FORMAT_I2S                  (TEGRA_I2S_BIT_FORMAT_I2S << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_FORMAT_RJM                  (TEGRA_I2S_BIT_FORMAT_RJM << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_FORMAT_LJM                  (TEGRA_I2S_BIT_FORMAT_LJM << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_FORMAT_DSP                  (TEGRA_I2S_BIT_FORMAT_DSP << TEGRA_I2S_CTRL_BIT_FORMAT_SHIFT)
-
-#define TEGRA_I2S_BIT_SIZE_16                          0
-#define TEGRA_I2S_BIT_SIZE_20                          1
-#define TEGRA_I2S_BIT_SIZE_24                          2
-#define TEGRA_I2S_BIT_SIZE_32                          3
-
-#define TEGRA_I2S_CTRL_BIT_SIZE_SHIFT                  8
-#define TEGRA_I2S_CTRL_BIT_SIZE_MASK                   (3                     << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_SIZE_16                     (TEGRA_I2S_BIT_SIZE_16 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_SIZE_20                     (TEGRA_I2S_BIT_SIZE_20 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_SIZE_24                     (TEGRA_I2S_BIT_SIZE_24 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
-#define TEGRA_I2S_CTRL_BIT_SIZE_32                     (TEGRA_I2S_BIT_SIZE_32 << TEGRA_I2S_CTRL_BIT_SIZE_SHIFT)
-
-#define TEGRA_I2S_FIFO_16_LSB                          0
-#define TEGRA_I2S_FIFO_20_LSB                          1
-#define TEGRA_I2S_FIFO_24_LSB                          2
-#define TEGRA_I2S_FIFO_32                              3
-#define TEGRA_I2S_FIFO_PACKED                          7
-
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT               4
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_MASK                        (7                     << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_16_LSB              (TEGRA_I2S_FIFO_16_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_20_LSB              (TEGRA_I2S_FIFO_20_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_24_LSB              (TEGRA_I2S_FIFO_24_LSB << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_32                  (TEGRA_I2S_FIFO_32     << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-#define TEGRA_I2S_CTRL_FIFO_FORMAT_PACKED              (TEGRA_I2S_FIFO_PACKED << TEGRA_I2S_CTRL_FIFO_FORMAT_SHIFT)
-
-#define TEGRA_I2S_CTRL_IE_FIFO1_ERR                    (1 << 3)
-#define TEGRA_I2S_CTRL_IE_FIFO2_ERR                    (1 << 2)
-#define TEGRA_I2S_CTRL_QE_FIFO1                                (1 << 1)
-#define TEGRA_I2S_CTRL_QE_FIFO2                                (1 << 0)
-
-/* Fields in TEGRA_I2S_STATUS */
-
-#define TEGRA_I2S_STATUS_FIFO1_RDY                     (1 << 31)
-#define TEGRA_I2S_STATUS_FIFO2_RDY                     (1 << 30)
-#define TEGRA_I2S_STATUS_FIFO1_BSY                     (1 << 29)
-#define TEGRA_I2S_STATUS_FIFO2_BSY                     (1 << 28)
-#define TEGRA_I2S_STATUS_FIFO1_ERR                     (1 << 3)
-#define TEGRA_I2S_STATUS_FIFO2_ERR                     (1 << 2)
-#define TEGRA_I2S_STATUS_QS_FIFO1                      (1 << 1)
-#define TEGRA_I2S_STATUS_QS_FIFO2                      (1 << 0)
-
-/* Fields in TEGRA_I2S_TIMING */
-
-#define TEGRA_I2S_TIMING_NON_SYM_ENABLE                        (1 << 12)
-#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT       0
-#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US     0x7fff
-#define TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK                (TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
-
-/* Fields in TEGRA_I2S_FIFO_SCR */
-
-#define TEGRA_I2S_FIFO_SCR_FIFO2_FULL_EMPTY_COUNT_SHIFT        24
-#define TEGRA_I2S_FIFO_SCR_FIFO1_FULL_EMPTY_COUNT_SHIFT        16
-#define TEGRA_I2S_FIFO_SCR_FIFO_FULL_EMPTY_COUNT_MASK  0x3f
-
-#define TEGRA_I2S_FIFO_SCR_FIFO2_CLR                   (1 << 12)
-#define TEGRA_I2S_FIFO_SCR_FIFO1_CLR                   (1 << 8)
-
-#define TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT                        0
-#define TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS              1
-#define TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS             2
-#define TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS            3
-
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT         4
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_MASK          (3 << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_ONE_SLOT      (TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT     << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_FOUR_SLOTS    (TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS   << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_EIGHT_SLOTS   (TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS  << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_TWELVE_SLOTS  (TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS << TEGRA_I2S_FIFO_SCR_FIFO2_ATN_LVL_SHIFT)
-
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT         0
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_MASK          (3 << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_ONE_SLOT      (TEGRA_I2S_FIFO_ATN_LVL_ONE_SLOT     << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_FOUR_SLOTS    (TEGRA_I2S_FIFO_ATN_LVL_FOUR_SLOTS   << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_EIGHT_SLOTS   (TEGRA_I2S_FIFO_ATN_LVL_EIGHT_SLOTS  << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
-#define TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_TWELVE_SLOTS  (TEGRA_I2S_FIFO_ATN_LVL_TWELVE_SLOTS << TEGRA_I2S_FIFO_SCR_FIFO1_ATN_LVL_SHIFT)
-
-struct tegra_i2s {
-       struct snd_soc_dai_driver dai;
-       struct clk *clk_i2s;
-       struct tegra_pcm_dma_params capture_dma_data;
-       struct tegra_pcm_dma_params playback_dma_data;
-       void __iomem *regs;
-       struct dentry *debug;
-       u32 reg_ctrl;
-};
-
-#endif
diff --git a/sound/soc/tegra/tegra_spdif.c b/sound/soc/tegra/tegra_spdif.c
deleted file mode 100644 (file)
index 3426633..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * tegra_spdif.c - Tegra SPDIF driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2011-2012 - NVIDIA, Inc.
- *
- * 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
- *
- */
-
-#include <linux/clk.h>
-#include <linux/module.h>
-#include <linux/debugfs.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-#include <linux/io.h>
-#include <mach/iomap.h>
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/pcm_params.h>
-#include <sound/soc.h>
-
-#include "tegra_spdif.h"
-
-#define DRV_NAME "tegra-spdif"
-
-static inline void tegra_spdif_write(struct tegra_spdif *spdif, u32 reg,
-                                       u32 val)
-{
-       __raw_writel(val, spdif->regs + reg);
-}
-
-static inline u32 tegra_spdif_read(struct tegra_spdif *spdif, u32 reg)
-{
-       return __raw_readl(spdif->regs + reg);
-}
-
-#ifdef CONFIG_DEBUG_FS
-static int tegra_spdif_show(struct seq_file *s, void *unused)
-{
-#define REG(r) { r, #r }
-       static const struct {
-               int offset;
-               const char *name;
-       } regs[] = {
-               REG(TEGRA_SPDIF_CTRL),
-               REG(TEGRA_SPDIF_STATUS),
-               REG(TEGRA_SPDIF_STROBE_CTRL),
-               REG(TEGRA_SPDIF_DATA_FIFO_CSR),
-               REG(TEGRA_SPDIF_CH_STA_RX_A),
-               REG(TEGRA_SPDIF_CH_STA_RX_B),
-               REG(TEGRA_SPDIF_CH_STA_RX_C),
-               REG(TEGRA_SPDIF_CH_STA_RX_D),
-               REG(TEGRA_SPDIF_CH_STA_RX_E),
-               REG(TEGRA_SPDIF_CH_STA_RX_F),
-               REG(TEGRA_SPDIF_CH_STA_TX_A),
-               REG(TEGRA_SPDIF_CH_STA_TX_B),
-               REG(TEGRA_SPDIF_CH_STA_TX_C),
-               REG(TEGRA_SPDIF_CH_STA_TX_D),
-               REG(TEGRA_SPDIF_CH_STA_TX_E),
-               REG(TEGRA_SPDIF_CH_STA_TX_F),
-       };
-#undef REG
-
-       struct tegra_spdif *spdif = s->private;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(regs); i++) {
-               u32 val = tegra_spdif_read(spdif, regs[i].offset);
-               seq_printf(s, "%s = %08x\n", regs[i].name, val);
-       }
-
-       return 0;
-}
-
-static int tegra_spdif_debug_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, tegra_spdif_show, inode->i_private);
-}
-
-static const struct file_operations tegra_spdif_debug_fops = {
-       .open    = tegra_spdif_debug_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = single_release,
-};
-
-static void tegra_spdif_debug_add(struct tegra_spdif *spdif)
-{
-       spdif->debug = debugfs_create_file(DRV_NAME, S_IRUGO,
-                                               snd_soc_debugfs_root, spdif,
-                                               &tegra_spdif_debug_fops);
-}
-
-static void tegra_spdif_debug_remove(struct tegra_spdif *spdif)
-{
-       if (spdif->debug)
-               debugfs_remove(spdif->debug);
-}
-#else
-static inline void tegra_spdif_debug_add(struct tegra_spdif *spdif)
-{
-}
-
-static inline void tegra_spdif_debug_remove(struct tegra_spdif *spdif)
-{
-}
-#endif
-
-static int tegra_spdif_hw_params(struct snd_pcm_substream *substream,
-                               struct snd_pcm_hw_params *params,
-                               struct snd_soc_dai *dai)
-{
-       struct device *dev = substream->pcm->card->dev;
-       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
-       int ret, spdifclock;
-
-       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_PACK;
-       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_BIT_MODE_MASK;
-       switch (params_format(params)) {
-       case SNDRV_PCM_FORMAT_S16_LE:
-               spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_PACK;
-               spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_BIT_MODE_16BIT;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       switch (params_rate(params)) {
-       case 32000:
-               spdifclock = 4096000;
-               break;
-       case 44100:
-               spdifclock = 5644800;
-               break;
-       case 48000:
-               spdifclock = 6144000;
-               break;
-       case 88200:
-               spdifclock = 11289600;
-               break;
-       case 96000:
-               spdifclock = 12288000;
-               break;
-       case 176400:
-               spdifclock = 22579200;
-               break;
-       case 192000:
-               spdifclock = 24576000;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       ret = clk_set_rate(spdif->clk_spdif_out, spdifclock);
-       if (ret) {
-               dev_err(dev, "Can't set SPDIF clock rate: %d\n", ret);
-               return ret;
-       }
-
-       return 0;
-}
-
-static void tegra_spdif_start_playback(struct tegra_spdif *spdif)
-{
-       spdif->reg_ctrl |= TEGRA_SPDIF_CTRL_TX_EN;
-       tegra_spdif_write(spdif, TEGRA_SPDIF_CTRL, spdif->reg_ctrl);
-}
-
-static void tegra_spdif_stop_playback(struct tegra_spdif *spdif)
-{
-       spdif->reg_ctrl &= ~TEGRA_SPDIF_CTRL_TX_EN;
-       tegra_spdif_write(spdif, TEGRA_SPDIF_CTRL, spdif->reg_ctrl);
-}
-
-static int tegra_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
-                               struct snd_soc_dai *dai)
-{
-       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
-
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-       case SNDRV_PCM_TRIGGER_RESUME:
-               clk_enable(spdif->clk_spdif_out);
-               tegra_spdif_start_playback(spdif);
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-               tegra_spdif_stop_playback(spdif);
-               clk_disable(spdif->clk_spdif_out);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int tegra_spdif_probe(struct snd_soc_dai *dai)
-{
-       struct tegra_spdif *spdif = snd_soc_dai_get_drvdata(dai);
-
-       dai->capture_dma_data = NULL;
-       dai->playback_dma_data = &spdif->playback_dma_data;
-
-       return 0;
-}
-
-static const struct snd_soc_dai_ops tegra_spdif_dai_ops = {
-       .hw_params      = tegra_spdif_hw_params,
-       .trigger        = tegra_spdif_trigger,
-};
-
-static struct snd_soc_dai_driver tegra_spdif_dai = {
-       .name = DRV_NAME,
-       .probe = tegra_spdif_probe,
-       .playback = {
-               .channels_min = 2,
-               .channels_max = 2,
-               .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
-                               SNDRV_PCM_RATE_48000,
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,
-       },
-       .ops = &tegra_spdif_dai_ops,
-};
-
-static __devinit int tegra_spdif_platform_probe(struct platform_device *pdev)
-{
-       struct tegra_spdif *spdif;
-       struct resource *mem, *memregion, *dmareq;
-       int ret;
-
-       spdif = kzalloc(sizeof(struct tegra_spdif), GFP_KERNEL);
-       if (!spdif) {
-               dev_err(&pdev->dev, "Can't allocate tegra_spdif\n");
-               ret = -ENOMEM;
-               goto exit;
-       }
-       dev_set_drvdata(&pdev->dev, spdif);
-
-       spdif->clk_spdif_out = clk_get(&pdev->dev, "spdif_out");
-       if (IS_ERR(spdif->clk_spdif_out)) {
-               pr_err("Can't retrieve spdif clock\n");
-               ret = PTR_ERR(spdif->clk_spdif_out);
-               goto err_free;
-       }
-
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mem) {
-               dev_err(&pdev->dev, "No memory resource\n");
-               ret = -ENODEV;
-               goto err_clk_put;
-       }
-
-       dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!dmareq) {
-               dev_err(&pdev->dev, "No DMA resource\n");
-               ret = -ENODEV;
-               goto err_clk_put;
-       }
-
-       memregion = request_mem_region(mem->start, resource_size(mem),
-                                       DRV_NAME);
-       if (!memregion) {
-               dev_err(&pdev->dev, "Memory region already claimed\n");
-               ret = -EBUSY;
-               goto err_clk_put;
-       }
-
-       spdif->regs = ioremap(mem->start, resource_size(mem));
-       if (!spdif->regs) {
-               dev_err(&pdev->dev, "ioremap failed\n");
-               ret = -ENOMEM;
-               goto err_release;
-       }
-
-       spdif->playback_dma_data.addr = mem->start + TEGRA_SPDIF_DATA_OUT;
-       spdif->playback_dma_data.wrap = 4;
-       spdif->playback_dma_data.width = 32;
-       spdif->playback_dma_data.req_sel = dmareq->start;
-
-       ret = snd_soc_register_dai(&pdev->dev, &tegra_spdif_dai);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
-               ret = -ENOMEM;
-               goto err_unmap;
-       }
-
-       ret = tegra_pcm_platform_register(&pdev->dev);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
-               goto err_unregister_dai;
-       }
-
-       tegra_spdif_debug_add(spdif);
-
-       return 0;
-
-err_unregister_dai:
-       snd_soc_unregister_dai(&pdev->dev);
-err_unmap:
-       iounmap(spdif->regs);
-err_release:
-       release_mem_region(mem->start, resource_size(mem));
-err_clk_put:
-       clk_put(spdif->clk_spdif_out);
-err_free:
-       kfree(spdif);
-exit:
-       return ret;
-}
-
-static int __devexit tegra_spdif_platform_remove(struct platform_device *pdev)
-{
-       struct tegra_spdif *spdif = dev_get_drvdata(&pdev->dev);
-       struct resource *res;
-
-       tegra_pcm_platform_unregister(&pdev->dev);
-       snd_soc_unregister_dai(&pdev->dev);
-
-       tegra_spdif_debug_remove(spdif);
-
-       iounmap(spdif->regs);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(res->start, resource_size(res));
-
-       clk_put(spdif->clk_spdif_out);
-
-       kfree(spdif);
-
-       return 0;
-}
-
-static struct platform_driver tegra_spdif_driver = {
-       .driver = {
-               .name = DRV_NAME,
-               .owner = THIS_MODULE,
-       },
-       .probe = tegra_spdif_platform_probe,
-       .remove = __devexit_p(tegra_spdif_platform_remove),
-};
-
-module_platform_driver(tegra_spdif_driver);
-
-MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
-MODULE_DESCRIPTION("Tegra SPDIF ASoC driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:" DRV_NAME);
diff --git a/sound/soc/tegra/tegra_spdif.h b/sound/soc/tegra/tegra_spdif.h
deleted file mode 100644 (file)
index f5fc712..0000000
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * tegra_spdif.h - Definitions for Tegra SPDIF driver
- *
- * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2011 - NVIDIA, Inc.
- *
- * Based on code copyright/by:
- * Copyright (c) 2008-2009, NVIDIA Corporation
- *
- * 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
- *
- */
-
-#ifndef __TEGRA_SPDIF_H__
-#define __TEGRA_SPDIF_H__
-
-#include "tegra_pcm.h"
-
-/* Offsets from TEGRA_SPDIF_BASE */
-
-#define TEGRA_SPDIF_CTRL                                       0x0
-#define TEGRA_SPDIF_STATUS                                     0x4
-#define TEGRA_SPDIF_STROBE_CTRL                                        0x8
-#define TEGRA_SPDIF_DATA_FIFO_CSR                              0x0C
-#define TEGRA_SPDIF_DATA_OUT                                   0x40
-#define TEGRA_SPDIF_DATA_IN                                    0x80
-#define TEGRA_SPDIF_CH_STA_RX_A                                        0x100
-#define TEGRA_SPDIF_CH_STA_RX_B                                        0x104
-#define TEGRA_SPDIF_CH_STA_RX_C                                        0x108
-#define TEGRA_SPDIF_CH_STA_RX_D                                        0x10C
-#define TEGRA_SPDIF_CH_STA_RX_E                                        0x110
-#define TEGRA_SPDIF_CH_STA_RX_F                                        0x114
-#define TEGRA_SPDIF_CH_STA_TX_A                                        0x140
-#define TEGRA_SPDIF_CH_STA_TX_B                                        0x144
-#define TEGRA_SPDIF_CH_STA_TX_C                                        0x148
-#define TEGRA_SPDIF_CH_STA_TX_D                                        0x14C
-#define TEGRA_SPDIF_CH_STA_TX_E                                        0x150
-#define TEGRA_SPDIF_CH_STA_TX_F                                        0x154
-#define TEGRA_SPDIF_USR_STA_RX_A                               0x180
-#define TEGRA_SPDIF_USR_DAT_TX_A                               0x1C0
-
-/* Fields in TEGRA_SPDIF_CTRL */
-
-/* Start capturing from 0=right, 1=left channel */
-#define TEGRA_SPDIF_CTRL_CAP_LC                                        (1 << 30)
-
-/* SPDIF receiver(RX) enable */
-#define TEGRA_SPDIF_CTRL_RX_EN                                 (1 << 29)
-
-/* SPDIF Transmitter(TX) enable */
-#define TEGRA_SPDIF_CTRL_TX_EN                                 (1 << 28)
-
-/* Transmit Channel status */
-#define TEGRA_SPDIF_CTRL_TC_EN                                 (1 << 27)
-
-/* Transmit user Data */
-#define TEGRA_SPDIF_CTRL_TU_EN                                 (1 << 26)
-
-/* Interrupt on transmit error */
-#define TEGRA_SPDIF_CTRL_IE_TXE                                        (1 << 25)
-
-/* Interrupt on receive error */
-#define TEGRA_SPDIF_CTRL_IE_RXE                                        (1 << 24)
-
-/* Interrupt on invalid preamble */
-#define TEGRA_SPDIF_CTRL_IE_P                                  (1 << 23)
-
-/* Interrupt on "B" preamble */
-#define TEGRA_SPDIF_CTRL_IE_B                                  (1 << 22)
-
-/* Interrupt when block of channel status received */
-#define TEGRA_SPDIF_CTRL_IE_C                                  (1 << 21)
-
-/* Interrupt when a valid information unit (IU) is received */
-#define TEGRA_SPDIF_CTRL_IE_U                                  (1 << 20)
-
-/* Interrupt when RX user FIFO attention level is reached */
-#define TEGRA_SPDIF_CTRL_QE_RU                                 (1 << 19)
-
-/* Interrupt when TX user FIFO attention level is reached */
-#define TEGRA_SPDIF_CTRL_QE_TU                                 (1 << 18)
-
-/* Interrupt when RX data FIFO attention level is reached */
-#define TEGRA_SPDIF_CTRL_QE_RX                                 (1 << 17)
-
-/* Interrupt when TX data FIFO attention level is reached */
-#define TEGRA_SPDIF_CTRL_QE_TX                                 (1 << 16)
-
-/* Loopback test mode enable */
-#define TEGRA_SPDIF_CTRL_LBK_EN                                        (1 << 15)
-
-/*
- * Pack data mode:
- * 0 = Single data (16 bit needs to be  padded to match the
- *     interface data bit size).
- * 1 = Packeted left/right channel data into a single word.
- */
-#define TEGRA_SPDIF_CTRL_PACK                                  (1 << 14)
-
-/*
- * 00 = 16bit data
- * 01 = 20bit data
- * 10 = 24bit data
- * 11 = raw data
- */
-#define TEGRA_SPDIF_BIT_MODE_16BIT                             0
-#define TEGRA_SPDIF_BIT_MODE_20BIT                             1
-#define TEGRA_SPDIF_BIT_MODE_24BIT                             2
-#define TEGRA_SPDIF_BIT_MODE_RAW                               3
-
-#define TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT                                12
-#define TEGRA_SPDIF_CTRL_BIT_MODE_MASK                         (3                          << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
-#define TEGRA_SPDIF_CTRL_BIT_MODE_16BIT                                (TEGRA_SPDIF_BIT_MODE_16BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
-#define TEGRA_SPDIF_CTRL_BIT_MODE_20BIT                                (TEGRA_SPDIF_BIT_MODE_20BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
-#define TEGRA_SPDIF_CTRL_BIT_MODE_24BIT                                (TEGRA_SPDIF_BIT_MODE_24BIT << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
-#define TEGRA_SPDIF_CTRL_BIT_MODE_RAW                          (TEGRA_SPDIF_BIT_MODE_RAW   << TEGRA_SPDIF_CTRL_BIT_MODE_SHIFT)
-
-/* Fields in TEGRA_SPDIF_STATUS */
-
-/*
- * Note: IS_P, IS_B, IS_C, and IS_U are sticky bits. Software must
- * write a 1 to the corresponding bit location to clear the status.
- */
-
-/*
- * Receiver(RX) shifter is busy receiving data.
- * This bit is asserted when the receiver first locked onto the
- * preamble of the data stream after RX_EN is asserted. This bit is
- * deasserted when either,
- * (a) the end of a frame is reached after RX_EN is deeasserted, or
- * (b) the SPDIF data stream becomes inactive.
- */
-#define TEGRA_SPDIF_STATUS_RX_BSY                              (1 << 29)
-
-/*
- * Transmitter(TX) shifter is busy transmitting data.
- * This bit is asserted when TX_EN is asserted.
- * This bit is deasserted when the end of a frame is reached after
- * TX_EN is deasserted.
- */
-#define TEGRA_SPDIF_STATUS_TX_BSY                              (1 << 28)
-
-/*
- * TX is busy shifting out channel status.
- * This bit is asserted when both TX_EN and TC_EN are asserted and
- * data from CH_STA_TX_A register is loaded into the internal shifter.
- * This bit is deasserted when either,
- * (a) the end of a frame is reached after TX_EN is deasserted, or
- * (b) CH_STA_TX_F register is loaded into the internal shifter.
- */
-#define TEGRA_SPDIF_STATUS_TC_BSY                              (1 << 27)
-
-/*
- * TX User data FIFO busy.
- * This bit is asserted when TX_EN and TXU_EN are asserted and
- * there's data in the TX user FIFO.  This bit is deassert when either,
- * (a) the end of a frame is reached after TX_EN is deasserted, or
- * (b) there's no data left in the TX user FIFO.
- */
-#define TEGRA_SPDIF_STATUS_TU_BSY                              (1 << 26)
-
-/* TX FIFO Underrun error status */
-#define TEGRA_SPDIF_STATUS_TX_ERR                              (1 << 25)
-
-/* RX FIFO Overrun error status */
-#define TEGRA_SPDIF_STATUS_RX_ERR                              (1 << 24)
-
-/* Preamble status: 0=Preamble OK, 1=bad/missing preamble */
-#define TEGRA_SPDIF_STATUS_IS_P                                        (1 << 23)
-
-/* B-preamble detection status: 0=not detected, 1=B-preamble detected */
-#define TEGRA_SPDIF_STATUS_IS_B                                        (1 << 22)
-
-/*
- * RX channel block data receive status:
- * 0=entire block not recieved yet.
- * 1=received entire block of channel status,
- */
-#define TEGRA_SPDIF_STATUS_IS_C                                        (1 << 21)
-
-/* RX User Data Valid flag:  1=valid IU detected, 0 = no IU detected. */
-#define TEGRA_SPDIF_STATUS_IS_U                                        (1 << 20)
-
-/*
- * RX User FIFO Status:
- * 1=attention level reached, 0=attention level not reached.
- */
-#define TEGRA_SPDIF_STATUS_QS_RU                               (1 << 19)
-
-/*
- * TX User FIFO Status:
- * 1=attention level reached, 0=attention level not reached.
- */
-#define TEGRA_SPDIF_STATUS_QS_TU                               (1 << 18)
-
-/*
- * RX Data FIFO Status:
- * 1=attention level reached, 0=attention level not reached.
- */
-#define TEGRA_SPDIF_STATUS_QS_RX                               (1 << 17)
-
-/*
- * TX Data FIFO Status:
- * 1=attention level reached, 0=attention level not reached.
- */
-#define TEGRA_SPDIF_STATUS_QS_TX                               (1 << 16)
-
-/* Fields in TEGRA_SPDIF_STROBE_CTRL */
-
-/*
- * Indicates the approximate number of detected SPDIFIN clocks within a
- * bi-phase period.
- */
-#define TEGRA_SPDIF_STROBE_CTRL_PERIOD_SHIFT                   16
-#define TEGRA_SPDIF_STROBE_CTRL_PERIOD_MASK                    (0xff << TEGRA_SPDIF_STROBE_CTRL_PERIOD_SHIFT)
-
-/* Data strobe mode: 0=Auto-locked 1=Manual locked */
-#define TEGRA_SPDIF_STROBE_CTRL_STROBE                         (1 << 15)
-
-/*
- * Manual data strobe time within the bi-phase clock period (in terms of
- * the number of over-sampling clocks).
- */
-#define TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT             8
-#define TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_MASK              (0x1f << TEGRA_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT)
-
-/*
- * Manual SPDIFIN bi-phase clock period (in terms of the number of
- * over-sampling clocks).
- */
-#define TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT             0
-#define TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_MASK              (0x3f << TEGRA_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT)
-
-/* Fields in SPDIF_DATA_FIFO_CSR */
-
-/* Clear Receiver User FIFO (RX USR.FIFO) */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_CLR                       (1 << 31)
-
-#define TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT                    0
-#define TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS                   1
-#define TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS                 2
-#define TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS                  3
-
-/* RU FIFO attention level */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT             29
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_MASK              \
-               (0x3                                    << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU1_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU2_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU3_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU4_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
-
-/* Number of RX USR.FIFO levels with valid data. */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT          24
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_MASK           (0x1f << TEGRA_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT)
-
-/* Clear Transmitter User FIFO (TX USR.FIFO) */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_CLR                       (1 << 23)
-
-/* TU FIFO attention level */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT             21
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_MASK              \
-               (0x3                                   << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU1_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU2_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU3_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU4_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
-
-/* Number of TX USR.FIFO levels that could be filled. */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT         16
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_MASK          (0x1f << SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT)
-
-/* Clear Receiver Data FIFO (RX DATA.FIFO) */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_CLR                       (1 << 15)
-
-#define TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT                    0
-#define TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS                  1
-#define TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS                 2
-#define TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS                        3
-
-/* RU FIFO attention level */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT             13
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_MASK              \
-               (0x3                                     << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU1_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU4_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU8_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU12_WORD_FULL    \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
-
-/* Number of RX DATA.FIFO levels with valid data. */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT          8
-#define TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_MASK           (0x1f << TEGRA_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT)
-
-/* Clear Transmitter Data FIFO (TX DATA.FIFO) */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_CLR                       (1 << 7)
-
-/* TU FIFO attention level */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT             5
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_MASK              \
-               (0x3                                     << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU1_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU4_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU8_WORD_FULL     \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU12_WORD_FULL    \
-               (TEGRA_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
-
-/* Number of TX DATA.FIFO levels that could be filled. */
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT         0
-#define TEGRA_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_MASK          (0x1f << SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT)
-
-/* Fields in TEGRA_SPDIF_DATA_OUT */
-
-/*
- * This register has 5 different formats:
- * 16-bit        (BIT_MODE=00, PACK=0)
- * 20-bit        (BIT_MODE=01, PACK=0)
- * 24-bit        (BIT_MODE=10, PACK=0)
- * raw           (BIT_MODE=11, PACK=0)
- * 16-bit packed (BIT_MODE=00, PACK=1)
- */
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_SHIFT                     0
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_MASK                      (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_20_SHIFT                     0
-#define TEGRA_SPDIF_DATA_OUT_DATA_20_MASK                      (0xfffff << TEGRA_SPDIF_DATA_OUT_DATA_20_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_24_SHIFT                     0
-#define TEGRA_SPDIF_DATA_OUT_DATA_24_MASK                      (0xffffff << TEGRA_SPDIF_DATA_OUT_DATA_24_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_P                                (1 << 31)
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_C                                (1 << 30)
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_U                                (1 << 29)
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_V                                (1 << 28)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT               8
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_MASK                        (0xfffff << TEGRA_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT                        4
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_MASK                 (0xf << TEGRA_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT           0
-#define TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_MASK            (0xf << TEGRA_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT                16
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_MASK         (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT)
-
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT         0
-#define TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_MASK          (0xffff << TEGRA_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT)
-
-/* Fields in TEGRA_SPDIF_DATA_IN */
-
-/*
- * This register has 5 different formats:
- * 16-bit        (BIT_MODE=00, PACK=0)
- * 20-bit        (BIT_MODE=01, PACK=0)
- * 24-bit        (BIT_MODE=10, PACK=0)
- * raw           (BIT_MODE=11, PACK=0)
- * 16-bit packed (BIT_MODE=00, PACK=1)
- *
- * Bits 31:24 are common to all modes except 16-bit packed
- */
-
-#define TEGRA_SPDIF_DATA_IN_DATA_P                             (1 << 31)
-#define TEGRA_SPDIF_DATA_IN_DATA_C                             (1 << 30)
-#define TEGRA_SPDIF_DATA_IN_DATA_U                             (1 << 29)
-#define TEGRA_SPDIF_DATA_IN_DATA_V                             (1 << 28)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT                        24
-#define TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_MASK                 (0xf << TEGRA_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_16_SHIFT                      0
-#define TEGRA_SPDIF_DATA_IN_DATA_16_MASK                       (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_20_SHIFT                      0
-#define TEGRA_SPDIF_DATA_IN_DATA_20_MASK                       (0xfffff << TEGRA_SPDIF_DATA_IN_DATA_20_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_24_SHIFT                      0
-#define TEGRA_SPDIF_DATA_IN_DATA_24_MASK                       (0xffffff << TEGRA_SPDIF_DATA_IN_DATA_24_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT                        8
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_MASK                 (0xfffff << TEGRA_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT                 4
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_MASK                  (0xf << TEGRA_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT            0
-#define TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_MASK             (0xf << TEGRA_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT         16
-#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_MASK          (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT)
-
-#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT          0
-#define TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_MASK           (0xffff << TEGRA_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT)
-
-/* Fields in TEGRA_SPDIF_CH_STA_RX_A */
-/* Fields in TEGRA_SPDIF_CH_STA_RX_B */
-/* Fields in TEGRA_SPDIF_CH_STA_RX_C */
-/* Fields in TEGRA_SPDIF_CH_STA_RX_D */
-/* Fields in TEGRA_SPDIF_CH_STA_RX_E */
-/* Fields in TEGRA_SPDIF_CH_STA_RX_F */
-
-/*
- * The 6-word receive channel data page buffer holds a block (192 frames) of
- * channel status information. The order of receive is from LSB to MSB
- * bit, and from CH_STA_RX_A to CH_STA_RX_F then back to CH_STA_RX_A.
- */
-
-/* Fields in TEGRA_SPDIF_CH_STA_TX_A */
-/* Fields in TEGRA_SPDIF_CH_STA_TX_B */
-/* Fields in TEGRA_SPDIF_CH_STA_TX_C */
-/* Fields in TEGRA_SPDIF_CH_STA_TX_D */
-/* Fields in TEGRA_SPDIF_CH_STA_TX_E */
-/* Fields in TEGRA_SPDIF_CH_STA_TX_F */
-
-/*
- * The 6-word transmit channel data page buffer holds a block (192 frames) of
- * channel status information. The order of transmission is from LSB to MSB
- * bit, and from CH_STA_TX_A to CH_STA_TX_F then back to CH_STA_TX_A.
- */
-
-/* Fields in TEGRA_SPDIF_USR_STA_RX_A */
-
-/*
- * This 4-word deep FIFO receives user FIFO field information. The order of
- * receive is from LSB to MSB bit.
- */
-
-/* Fields in TEGRA_SPDIF_USR_DAT_TX_A */
-
-/*
- * This 4-word deep FIFO transmits user FIFO field information. The order of
- * transmission is from LSB to MSB bit.
- */
-
-struct tegra_spdif {
-       struct clk *clk_spdif_out;
-       struct tegra_pcm_dma_params capture_dma_data;
-       struct tegra_pcm_dma_params playback_dma_data;
-       void __iomem *regs;
-       struct dentry *debug;
-       u32 reg_ctrl;
-};
-
-#endif