Sonic,

The patch that introduced the ad183x naming never hit mainline in an acceptable 
fashion.
According to Lars this patch implemented support for these other chips in a 
rather non-standard way.
It was therefore easier to start with the ad1836 driver in mainline and add 
support for the other chip variants.

In general subsystem maintainers tend to dislike wildcards in names, unless all 
possibilities are really covered.
What happens if there is an ad1832 in future, then we end up with an ad183x and 
a ad1832!

Greetings,
Michael

--
Analog Devices GmbH      Wilhelm-Wagenfeld-Str. 6      80807 Muenchen
Sitz der Gesellschaft: Muenchen; Registergericht: Muenchen HRB 40368;
Geschaeftsfuehrer:Dr.Carsten Suckrow, Thomas Wessel, William A. Martin, 
Margaret Seif

From: [email protected] 
[mailto:[email protected]] On Behalf Of Zhang, 
Sonic
Sent: Friday, June 17, 2011 4:28 AM
To: Mike Frysinger; [email protected]
Subject: Re: [Linux-kernel-commits] ASoC: AD1836: switch over to the code 
merged upstream

Hi Mike,

Why do you change all ad183x back to ad1836?



Sonic

________________________________________
From: [email protected] 
[mailto:[email protected]] On Behalf Of Mike 
Frysinger
Sent: Friday, June 17, 2011 6:39 AM
To: [email protected]
Subject: [Linux-kernel-commits] ASoC: AD1836: switch over to the code merged 
upstream
commit: 
http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=9b3b24f3abf08dea78a17596d492e7b7c3c7642c
branch: 
http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

The AD1836 driver wasn't renamed to AD183X, and a lot of work for adding
new codecs was redone a bit.  So just sync directly to what is merged.

Signed-off-by: Mike Frysinger <[email protected]>
---
 sound/soc/blackfin/Kconfig                         |   15 +-
 sound/soc/blackfin/Makefile                        |    4 +-
 .../blackfin/{bf5xx-ad183x.c => bf5xx-ad1836.c}    |   62 ++--
 sound/soc/codecs/Kconfig                           |    4 +-
 sound/soc/codecs/Makefile                          |    4 +-
 sound/soc/codecs/ad1836.c                          |  407 +++++++++++++++++
 sound/soc/codecs/ad1836.h                          |   51 +++
 sound/soc/codecs/ad183x.c                          |  474 --------------------
 sound/soc/codecs/ad183x.h                          |   57 ---
 9 files changed, 501 insertions(+), 577 deletions(-)

diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig
index 6e20a4c..2e92c86 100644
--- a/sound/soc/blackfin/Kconfig
+++ b/sound/soc/blackfin/Kconfig
@@ -87,20 +87,17 @@ config SND_BF5XX_TDM
          mode.
          You will also need to select the audio interfaces to support below.

-config SND_BF5XX_SOC_AD183X
-       tristate "SoC AD183X Audio support for BF5xx"
-       depends on SND_BF5XX_TDM && SPI_MASTER
+config SND_BF5XX_SOC_AD1836
+       tristate "SoC AD1836 Audio support for BF5xx"
+       depends on SND_BF5XX_TDM
        select SND_BF5XX_SOC_TDM
-       select SND_SOC_AD183X
+       select SND_SOC_AD1836
        help
-         Say Y if you want to add support for AD183X codec
-         on BF5xx STAMP/EZKIT.
-         This driver supports AD1935A, AD1937A, AD1938A,
-         AD1939A and AD1836.
+         Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT.

 config SND_BF5XX_SOC_AD193X
        tristate "SoC AD193X Audio support for Blackfin"
-       depends on SND_BF5XX_TDM && (SPI_MASTER || I2C)
+       depends on SND_BF5XX_TDM
        select SND_BF5XX_SOC_TDM
        select SND_SOC_AD193X
        help
diff --git a/sound/soc/blackfin/Makefile b/sound/soc/blackfin/Makefile
index c39068d..92a4678 100644
--- a/sound/soc/blackfin/Makefile
+++ b/sound/soc/blackfin/Makefile
@@ -16,7 +16,7 @@ obj-$(CONFIG_SND_BF5XX_SOC_I2S) += snd-soc-bf5xx-i2s.o
 obj-$(CONFIG_SND_BF5XX_SOC_TDM) += snd-soc-bf5xx-tdm.o

 # Blackfin Machine Support
-snd-ad183x-objs := bf5xx-ad183x.o
+snd-ad1836-objs := bf5xx-ad1836.o
 snd-ad1980-objs := bf5xx-ad1980.o
 snd-ssm2602-objs := bf5xx-ssm2602.o
 snd-ad73311-objs := bf5xx-ad73311.o
@@ -28,7 +28,7 @@ snd-adau1381-objs := bf5xx-adau1381.o
 snd-adau1761-objs := bf5xx-adau1761.o
 snd-adav80x-objs := bf5xx-adav80x.o

-obj-$(CONFIG_SND_BF5XX_SOC_AD183X) += snd-ad183x.o
+obj-$(CONFIG_SND_BF5XX_SOC_AD1836) += snd-ad1836.o
 obj-$(CONFIG_SND_BF5XX_SOC_AD1980) += snd-ad1980.o
 obj-$(CONFIG_SND_BF5XX_SOC_SSM2602) += snd-ssm2602.o
 obj-$(CONFIG_SND_BF5XX_SOC_AD73311) += snd-ad73311.o
diff --git a/sound/soc/blackfin/bf5xx-ad183x.c 
b/sound/soc/blackfin/bf5xx-ad1836.c
similarity index 60%
rename from sound/soc/blackfin/bf5xx-ad183x.c
rename to sound/soc/blackfin/bf5xx-ad1836.c
index 98e9a94..f79d165 100644
--- a/sound/soc/blackfin/bf5xx-ad183x.c
+++ b/sound/soc/blackfin/bf5xx-ad1836.c
@@ -1,9 +1,9 @@
 /*
- * File:         sound/soc/blackfin/bf5xx-ad183x.c
+ * File:         sound/soc/blackfin/bf5xx-ad1836.c
  * Author:       Barry Song <[email protected]>
  *
  * Created:      Aug 4 2009
- * Description:  Board driver for ad183x sound chip
+ * Description:  Board driver for ad1836 sound chip
  *
  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
  *
@@ -28,14 +28,14 @@
 #include <asm/dma.h>
 #include <asm/portmux.h>

-#include "../codecs/ad183x.h"
+#include "../codecs/ad1836.h"

 #include "bf5xx-tdm-pcm.h"
 #include "bf5xx-tdm.h"

-static struct snd_soc_card bf5xx_ad183x;
+static struct snd_soc_card bf5xx_ad1836;

-static int bf5xx_ad183x_hw_params(struct snd_pcm_substream *substream,
+static int bf5xx_ad1836_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
@@ -64,66 +64,66 @@ static int bf5xx_ad183x_hw_params(struct snd_pcm_substream 
*substream,
        return 0;
 }

-static struct snd_soc_ops bf5xx_ad183x_ops = {
-       .hw_params = bf5xx_ad183x_hw_params,
+static struct snd_soc_ops bf5xx_ad1836_ops = {
+       .hw_params = bf5xx_ad1836_hw_params,
 };

-static struct snd_soc_dai_link bf5xx_ad183x_dai[] = {
+static struct snd_soc_dai_link bf5xx_ad1836_dai[] = {
        {
-               .name = "ad183x",
-               .stream_name = "AD183X",
+               .name = "ad1836",
+               .stream_name = "AD1836",
                .cpu_dai_name = "bfin-tdm.0",
-               .codec_dai_name = "ad183x-hifi",
+               .codec_dai_name = "ad1836-hifi",
                .platform_name = "bfin-tdm-pcm-audio",
                .codec_name = "spi0.4",
-               .ops = &bf5xx_ad183x_ops,
+               .ops = &bf5xx_ad1836_ops,
        },
        {
-               .name = "ad183x",
-               .stream_name = "AD183X",
+               .name = "ad1836",
+               .stream_name = "AD1836",
                .cpu_dai_name = "bfin-tdm.1",
-               .codec_dai_name = "ad183x-hifi",
+               .codec_dai_name = "ad1836-hifi",
                .platform_name = "bfin-tdm-pcm-audio",
                .codec_name = "spi0.4",
-               .ops = &bf5xx_ad183x_ops,
+               .ops = &bf5xx_ad1836_ops,
        },
 };

-static struct snd_soc_card bf5xx_ad183x = {
-       .name = "bfin-ad183x",
-       .dai_link = &bf5xx_ad183x_dai[CONFIG_SND_BF5XX_SPORT_NUM],
+static struct snd_soc_card bf5xx_ad1836 = {
+       .name = "bfin-ad1836",
+       .dai_link = &bf5xx_ad1836_dai[CONFIG_SND_BF5XX_SPORT_NUM],
        .num_links = 1,
 };

-static struct platform_device *bfxx_ad183x_snd_device;
+static struct platform_device *bfxx_ad1836_snd_device;

-static int __init bf5xx_ad183x_init(void)
+static int __init bf5xx_ad1836_init(void)
 {
        int ret;

-       bfxx_ad183x_snd_device = platform_device_alloc("soc-audio", -1);
-       if (!bfxx_ad183x_snd_device)
+       bfxx_ad1836_snd_device = platform_device_alloc("soc-audio", -1);
+       if (!bfxx_ad1836_snd_device)
                return -ENOMEM;

-       platform_set_drvdata(bfxx_ad183x_snd_device, &bf5xx_ad183x);
-       ret = platform_device_add(bfxx_ad183x_snd_device);
+       platform_set_drvdata(bfxx_ad1836_snd_device, &bf5xx_ad1836);
+       ret = platform_device_add(bfxx_ad1836_snd_device);

        if (ret)
-               platform_device_put(bfxx_ad183x_snd_device);
+               platform_device_put(bfxx_ad1836_snd_device);

        return ret;
 }

-static void __exit bf5xx_ad183x_exit(void)
+static void __exit bf5xx_ad1836_exit(void)
 {
-       platform_device_unregister(bfxx_ad183x_snd_device);
+       platform_device_unregister(bfxx_ad1836_snd_device);
 }

-module_init(bf5xx_ad183x_init);
-module_exit(bf5xx_ad183x_exit);
+module_init(bf5xx_ad1836_init);
+module_exit(bf5xx_ad1836_exit);

 /* Module information */
 MODULE_AUTHOR("Barry Song");
-MODULE_DESCRIPTION("ALSA SoC AD183X board driver");
+MODULE_DESCRIPTION("ALSA SoC AD1836 board driver");
 MODULE_LICENSE("GPL");

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 1151000..24ab62d 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -13,7 +13,7 @@ config SND_SOC_ALL_CODECS
        select SND_SOC_88PM860X if MFD_88PM860X
        select SND_SOC_L3
        select SND_SOC_AC97_CODEC if SND_SOC_AC97_BUS
-       select SND_SOC_AD183X if SPI_MASTER
+       select SND_SOC_AD1836 if SPI_MASTER
        select SND_SOC_AD193X if SND_SOC_I2C_AND_SPI
        select SND_SOC_AD1980 if SND_SOC_AC97_BUS
        select SND_SOC_AD73311
@@ -123,7 +123,7 @@ config SND_SOC_AC97_CODEC
        tristate
        select SND_AC97_CODEC

-config SND_SOC_AD183X
+config SND_SOC_AD1836
        tristate

 config SND_SOC_AD193X
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 1a3e3bf..d85e117 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -1,6 +1,6 @@
 snd-soc-88pm860x-objs := 88pm860x-codec.o
 snd-soc-ac97-objs := ac97.o
-snd-soc-ad183x-objs := ad183x.o
+snd-soc-ad1836-objs := ad1836.o
 snd-soc-ad193x-objs := ad193x.o
 snd-soc-ad1980-objs := ad1980.o
 snd-soc-ad73311-objs := ad73311.o
@@ -95,7 +95,7 @@ snd-soc-wm9090-objs := wm9090.o

 obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o
 obj-$(CONFIG_SND_SOC_AC97_CODEC)       += snd-soc-ac97.o
-obj-$(CONFIG_SND_SOC_AD183X)   += snd-soc-ad183x.o
+obj-$(CONFIG_SND_SOC_AD1836)   += snd-soc-ad1836.o
 obj-$(CONFIG_SND_SOC_AD193X)   += snd-soc-ad193x.o
 obj-$(CONFIG_SND_SOC_AD1980)   += snd-soc-ad1980.o
 obj-$(CONFIG_SND_SOC_AD73311)  += snd-soc-ad73311.o
diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c
new file mode 100644
index 0000000..3d54f9f
--- /dev/null
+++ b/sound/soc/codecs/ad1836.c
@@ -0,0 +1,407 @@
+ /*
+ * Audio Codec driver supporting:
+ *  AD1835A, AD1836, AD1837A, AD1838A, AD1839A
+ *
+ * Copyright 2009-2011 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/initval.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+#include <linux/spi/spi.h>
+#include "ad1836.h"
+
+enum ad1836_type {
+       AD1835,
+       AD1836,
+       AD1838,
+};
+
+/* codec private data */
+struct ad1836_priv {
+       enum ad1836_type type;
+};
+
+/*
+ * AD1836 volume/mute/de-emphasis etc. controls
+ */
+static const char *ad1836_deemp[] = {"None", "44.1kHz", "32kHz", "48kHz"};
+
+static const struct soc_enum ad1836_deemp_enum =
+       SOC_ENUM_SINGLE(AD1836_DAC_CTRL1, 8, 4, ad1836_deemp);
+
+#define AD1836_DAC_VOLUME(x) \
+       SOC_DOUBLE_R("DAC" #x " Playback Volume", AD1836_DAC_L_VOL(x), \
+                       AD1836_DAC_R_VOL(x), 0, 0x3FF, 0)
+
+#define AD1836_DAC_SWITCH(x) \
+       SOC_DOUBLE("DAC" #x " Playback Switch", AD1836_DAC_CTRL2, \
+                       AD1836_MUTE_LEFT(x), AD1836_MUTE_RIGHT(x), 1, 1)
+
+#define AD1836_ADC_SWITCH(x) \
+       SOC_DOUBLE("ADC" #x " Capture Switch", AD1836_ADC_CTRL2, \
+               AD1836_MUTE_LEFT(x), AD1836_MUTE_RIGHT(x), 1, 1)
+
+static const struct snd_kcontrol_new ad183x_dac_controls[] = {
+       AD1836_DAC_VOLUME(1),
+       AD1836_DAC_SWITCH(1),
+       AD1836_DAC_VOLUME(2),
+       AD1836_DAC_SWITCH(2),
+       AD1836_DAC_VOLUME(3),
+       AD1836_DAC_SWITCH(3),
+       AD1836_DAC_VOLUME(4),
+       AD1836_DAC_SWITCH(4),
+};
+
+static const struct snd_soc_dapm_widget ad183x_dac_dapm_widgets[] = {
+       SND_SOC_DAPM_OUTPUT("DAC1OUT"),
+       SND_SOC_DAPM_OUTPUT("DAC2OUT"),
+       SND_SOC_DAPM_OUTPUT("DAC3OUT"),
+       SND_SOC_DAPM_OUTPUT("DAC4OUT"),
+};
+
+static const struct snd_soc_dapm_route ad183x_dac_routes[] = {
+       { "DAC1OUT", NULL, "DAC" },
+       { "DAC2OUT", NULL, "DAC" },
+       { "DAC3OUT", NULL, "DAC" },
+       { "DAC4OUT", NULL, "DAC" },
+};
+
+static const struct snd_kcontrol_new ad183x_adc_controls[] = {
+       AD1836_ADC_SWITCH(1),
+       AD1836_ADC_SWITCH(2),
+       AD1836_ADC_SWITCH(3),
+};
+
+static const struct snd_soc_dapm_widget ad183x_adc_dapm_widgets[] = {
+       SND_SOC_DAPM_INPUT("ADC1IN"),
+       SND_SOC_DAPM_INPUT("ADC2IN"),
+};
+
+static const struct snd_soc_dapm_route ad183x_adc_routes[] = {
+       { "ADC", NULL, "ADC1IN" },
+       { "ADC", NULL, "ADC2IN" },
+};
+
+static const struct snd_kcontrol_new ad183x_controls[] = {
+       /* ADC high-pass filter */
+       SOC_SINGLE("ADC High Pass Filter Switch", AD1836_ADC_CTRL1,
+                       AD1836_ADC_HIGHPASS_FILTER, 1, 0),
+
+       /* DAC de-emphasis */
+       SOC_ENUM("Playback Deemphasis", ad1836_deemp_enum),
+};
+
+static const struct snd_soc_dapm_widget ad183x_dapm_widgets[] = {
+       SND_SOC_DAPM_DAC("DAC", "Playback", AD1836_DAC_CTRL1,
+                               AD1836_DAC_POWERDOWN, 1),
+       SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_SUPPLY("ADC_PWR", AD1836_ADC_CTRL1,
+                               AD1836_ADC_POWERDOWN, 1, NULL, 0),
+};
+
+static const struct snd_soc_dapm_route ad183x_dapm_routes[] = {
+       { "DAC", NULL, "ADC_PWR" },
+       { "ADC", NULL, "ADC_PWR" },
+};
+
+static const DECLARE_TLV_DB_SCALE(ad1836_in_tlv, 0, 300, 0);
+
+static const struct snd_kcontrol_new ad1836_controls[] = {
+       SOC_DOUBLE_TLV("ADC2 Capture Volume", AD1836_ADC_CTRL1, 3, 0, 4, 0,
+           ad1836_in_tlv),
+};
+
+/*
+ * DAI ops entries
+ */
+
+static int ad1836_set_dai_fmt(struct snd_soc_dai *codec_dai,
+               unsigned int fmt)
+{
+       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+       /* at present, we support adc aux mode to interface with
+        * blackfin sport tdm mode
+        */
+       case SND_SOC_DAIFMT_DSP_A:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_IB_IF:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+       /* ALCLK,ABCLK are both output, AD1836 can only be master */
+       case SND_SOC_DAIFMT_CBM_CFM:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int ad1836_hw_params(struct snd_pcm_substream *substream,
+               struct snd_pcm_hw_params *params,
+               struct snd_soc_dai *dai)
+{
+       int word_len = 0;
+
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_codec *codec = rtd->codec;
+
+       /* bit size */
+       switch (params_format(params)) {
+       case SNDRV_PCM_FORMAT_S16_LE:
+               word_len = AD1836_WORD_LEN_16;
+               break;
+       case SNDRV_PCM_FORMAT_S20_3LE:
+               word_len = AD1836_WORD_LEN_20;
+               break;
+       case SNDRV_PCM_FORMAT_S24_LE:
+       case SNDRV_PCM_FORMAT_S32_LE:
+               word_len = AD1836_WORD_LEN_24;
+               break;
+       }
+
+       snd_soc_update_bits(codec, AD1836_DAC_CTRL1, AD1836_DAC_WORD_LEN_MASK,
+               word_len << AD1836_DAC_WORD_LEN_OFFSET);
+
+       snd_soc_update_bits(codec, AD1836_ADC_CTRL2, AD1836_ADC_WORD_LEN_MASK,
+               word_len << AD1836_ADC_WORD_OFFSET);
+
+       return 0;
+}
+
+static struct snd_soc_dai_ops ad1836_dai_ops = {
+       .hw_params = ad1836_hw_params,
+       .set_fmt = ad1836_set_dai_fmt,
+};
+
+#define AD183X_DAI(_name, num_dacs, num_adcs) \
+{ \
+       .name = _name "-hifi", \
+       .playback = { \
+               .stream_name = "Playback", \
+               .channels_min = 2, \
+               .channels_max = (num_dacs) * 2, \
+               .rates = SNDRV_PCM_RATE_48000,  \
+               .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | \
+                       SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, \
+       }, \
+       .capture = { \
+               .stream_name = "Capture", \
+               .channels_min = 2, \
+               .channels_max = (num_adcs) * 2, \
+               .rates = SNDRV_PCM_RATE_48000, \
+               .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | \
+                       SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, \
+       }, \
+       .ops = &ad1836_dai_ops, \
+}
+
+static struct snd_soc_dai_driver ad183x_dais[] = {
+       [AD1835] = AD183X_DAI("ad1835", 4, 1),
+       [AD1836] = AD183X_DAI("ad1836", 3, 2),
+       [AD1838] = AD183X_DAI("ad1838", 3, 1),
+};
+
+#ifdef CONFIG_PM
+static int ad1836_suspend(struct snd_soc_codec *codec, pm_message_t state)
+{
+       /* reset clock control mode */
+       return snd_soc_update_bits(codec, AD1836_ADC_CTRL2,
+               AD1836_ADC_SERFMT_MASK, 0);
+}
+
+static int ad1836_resume(struct snd_soc_codec *codec)
+{
+       /* restore clock control mode */
+       return snd_soc_update_bits(codec, AD1836_ADC_CTRL2,
+               AD1836_ADC_SERFMT_MASK, AD1836_ADC_AUX);
+}
+#else
+#define ad1836_suspend NULL
+#define ad1836_resume  NULL
+#endif
+
+static int ad1836_probe(struct snd_soc_codec *codec)
+{
+       struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_dapm_context *dapm = &codec->dapm;
+       int num_dacs, num_adcs;
+       int ret = 0;
+       int i;
+
+       num_dacs = ad183x_dais[ad1836->type].playback.channels_max / 2;
+       num_adcs = ad183x_dais[ad1836->type].capture.channels_max / 2;
+
+       ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI);
+       if (ret < 0) {
+               dev_err(codec->dev, "failed to set cache I/O: %d\n",
+                               ret);
+               return ret;
+       }
+
+       /* default setting for ad1836 */
+       /* de-emphasis: 48kHz, power-on dac */
+       snd_soc_write(codec, AD1836_DAC_CTRL1, 0x300);
+       /* unmute dac channels */
+       snd_soc_write(codec, AD1836_DAC_CTRL2, 0x0);
+       /* high-pass filter enable, power-on adc */
+       snd_soc_write(codec, AD1836_ADC_CTRL1, 0x100);
+       /* unmute adc channles, adc aux mode */
+       snd_soc_write(codec, AD1836_ADC_CTRL2, 0x180);
+       /* volume */
+       for (i = 1; i <= num_dacs; ++i) {
+               snd_soc_write(codec, AD1836_DAC_L_VOL(i), 0x3FF);
+               snd_soc_write(codec, AD1836_DAC_R_VOL(i), 0x3FF);
+       }
+
+       if (ad1836->type == AD1836) {
+               /* left/right diff:PGA/MUX */
+               snd_soc_write(codec, AD1836_ADC_CTRL3, 0x3A);
+               ret = snd_soc_add_controls(codec, ad1836_controls,
+                               ARRAY_SIZE(ad1836_controls));
+               if (ret)
+                       return ret;
+       } else {
+               snd_soc_write(codec, AD1836_ADC_CTRL3, 0x00);
+       }
+
+       ret = snd_soc_add_controls(codec, ad183x_dac_controls, num_dacs * 2);
+       if (ret)
+               return ret;
+
+       ret = snd_soc_add_controls(codec, ad183x_adc_controls, num_adcs);
+       if (ret)
+               return ret;
+
+       ret = snd_soc_dapm_new_controls(dapm, ad183x_dac_dapm_widgets, 
num_dacs);
+       if (ret)
+               return ret;
+
+       ret = snd_soc_dapm_new_controls(dapm, ad183x_adc_dapm_widgets, 
num_adcs);
+       if (ret)
+               return ret;
+
+       ret = snd_soc_dapm_add_routes(dapm, ad183x_dac_routes, num_dacs);
+       if (ret)
+               return ret;
+
+       ret = snd_soc_dapm_add_routes(dapm, ad183x_adc_routes, num_adcs);
+       if (ret)
+               return ret;
+
+       return ret;
+}
+
+/* power down chip */
+static int ad1836_remove(struct snd_soc_codec *codec)
+{
+       /* reset clock control mode */
+       return snd_soc_update_bits(codec, AD1836_ADC_CTRL2,
+               AD1836_ADC_SERFMT_MASK, 0);
+}
+
+static struct snd_soc_codec_driver soc_codec_dev_ad1836 = {
+       .probe = ad1836_probe,
+       .remove = ad1836_remove,
+       .suspend = ad1836_suspend,
+       .resume = ad1836_resume,
+       .reg_cache_size = AD1836_NUM_REGS,
+       .reg_word_size = sizeof(u16),
+
+       .controls = ad183x_controls,
+       .num_controls = ARRAY_SIZE(ad183x_controls),
+       .dapm_widgets = ad183x_dapm_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(ad183x_dapm_widgets),
+       .dapm_routes = ad183x_dapm_routes,
+       .num_dapm_routes = ARRAY_SIZE(ad183x_dapm_routes),
+};
+
+static int __devinit ad1836_spi_probe(struct spi_device *spi)
+{
+       struct ad1836_priv *ad1836;
+       int ret;
+
+       ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL);
+       if (ad1836 == NULL)
+               return -ENOMEM;
+
+       ad1836->type = spi_get_device_id(spi)->driver_data;
+
+       spi_set_drvdata(spi, ad1836);
+
+       ret = snd_soc_register_codec(&spi->dev,
+                       &soc_codec_dev_ad1836, &ad183x_dais[ad1836->type], 1);
+       if (ret < 0)
+               kfree(ad1836);
+       return ret;
+}
+
+static int __devexit ad1836_spi_remove(struct spi_device *spi)
+{
+       snd_soc_unregister_codec(&spi->dev);
+       kfree(spi_get_drvdata(spi));
+       return 0;
+}
+static const struct spi_device_id ad1836_ids[] = {
+       { "ad1835", AD1835 },
+       { "ad1836", AD1836 },
+       { "ad1837", AD1835 },
+       { "ad1838", AD1838 },
+       { "ad1839", AD1838 },
+       { },
+};
+MODULE_DEVICE_TABLE(spi, ad1836_ids);
+
+static struct spi_driver ad1836_spi_driver = {
+       .driver = {
+               .name   = "ad1836",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = ad1836_spi_probe,
+       .remove         = __devexit_p(ad1836_spi_remove),
+       .id_table       = ad1836_ids,
+};
+
+static int __init ad1836_init(void)
+{
+       int ret;
+
+       ret = spi_register_driver(&ad1836_spi_driver);
+       if (ret != 0) {
+               printk(KERN_ERR "Failed to register ad1836 SPI driver: %d\n",
+                               ret);
+       }
+
+       return ret;
+}
+module_init(ad1836_init);
+
+static void __exit ad1836_exit(void)
+{
+       spi_unregister_driver(&ad1836_spi_driver);
+}
+module_exit(ad1836_exit);
+
+MODULE_DESCRIPTION("ASoC ad1836 driver");
+MODULE_AUTHOR("Barry Song <[email protected]>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/ad1836.h b/sound/soc/codecs/ad1836.h
new file mode 100644
index 0000000..444747f
--- /dev/null
+++ b/sound/soc/codecs/ad1836.h
@@ -0,0 +1,51 @@
+/*
+ * Audio Codec driver supporting:
+ *  AD1835A, AD1836, AD1837A, AD1838A, AD1839A
+ *
+ * Copyright 2009-2011 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#ifndef __AD1836_H__
+#define __AD1836_H__
+
+#define AD1836_DAC_CTRL1               0
+#define AD1836_DAC_POWERDOWN           2
+#define AD1836_DAC_SERFMT_MASK         0xE0
+#define AD1836_DAC_SERFMT_PCK256       (0x4 << 5)
+#define AD1836_DAC_SERFMT_PCK128       (0x5 << 5)
+#define AD1836_DAC_WORD_LEN_MASK       0x18
+#define AD1836_DAC_WORD_LEN_OFFSET     3
+
+#define AD1836_DAC_CTRL2               1
+
+/* These macros are one-based. So AD183X_MUTE_LEFT(1) will return the mute bit
+ * for the first ADC/DAC */
+#define AD1836_MUTE_LEFT(x) (((x) * 2) - 2)
+#define AD1836_MUTE_RIGHT(x) (((x) * 2) - 1)
+
+#define AD1836_DAC_L_VOL(x) ((x) * 2)
+#define AD1836_DAC_R_VOL(x) (1 + ((x) * 2))
+
+#define AD1836_ADC_CTRL1               12
+#define AD1836_ADC_POWERDOWN           7
+#define AD1836_ADC_HIGHPASS_FILTER     8
+
+#define AD1836_ADC_CTRL2               13
+#define AD1836_ADC_WORD_LEN_MASK       0x30
+#define AD1836_ADC_WORD_OFFSET         5
+#define AD1836_ADC_SERFMT_MASK         (7 << 6)
+#define AD1836_ADC_SERFMT_PCK256       (0x4 << 6)
+#define AD1836_ADC_SERFMT_PCK128       (0x5 << 6)
+#define AD1836_ADC_AUX                 (0x6 << 6)
+
+#define AD1836_ADC_CTRL3               14
+
+#define AD1836_NUM_REGS                16
+
+#define AD1836_WORD_LEN_24 0x0
+#define AD1836_WORD_LEN_20 0x1
+#define AD1836_WORD_LEN_16 0x2
+
+#endif
diff --git a/sound/soc/codecs/ad183x.c b/sound/soc/codecs/ad183x.c
deleted file mode 100644
index 4925b42..0000000
--- a/sound/soc/codecs/ad183x.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * AD183X Audio Codec driver supporting AD1835A, AD1836, AD1837A, AD1838A, 
AD1839A
- *
- * Copyright 2009-2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/device.h>
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/pcm_params.h>
-#include <sound/initval.h>
-#include <sound/soc.h>
-#include <sound/tlv.h>
-#include <linux/spi/spi.h>
-#include "ad183x.h"
-
-/* codec private data */
-struct ad183x_chl_ctrls {
-       struct snd_kcontrol_new *snd_ctrls;
-       struct snd_soc_dapm_widget *dapm_widgets;
-       struct snd_soc_dapm_route *audio_paths;
-       int ctrl_num;
-       int widget_num;
-       int path_num;
-};
-
-struct ad183x_priv {
-       enum snd_soc_control_type control_type;
-       struct ad183x_chl_ctrls chl_ctrl;
-};
-
-/*
- * AD183X volume/mute/de-emphasis etc. controls
- */
-static const char *ad183x_deemp[] = {"None", "44.1kHz", "32kHz", "48kHz"};
-
-static const struct soc_enum ad183x_deemp_enum =
-SOC_ENUM_SINGLE(AD183X_DAC_CTRL1, 8, 4, ad183x_deemp);
-
-/* AD1835A/AD1837A: 4 stereo DAC, 1 stereo ADC; */
-static const struct snd_kcontrol_new ad1835a_ad1837a_snd_controls[] = {
-       /* DAC volume control */
-       SOC_DOUBLE_R("DAC1 Volume", AD183X_DAC_L1_VOL,
-                       AD183X_DAC_R1_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC2 Volume", AD183X_DAC_L2_VOL,
-                       AD183X_DAC_R2_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC3 Volume", AD183X_DAC_L3_VOL,
-                       AD183X_DAC_R3_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC4 Volume", AD183X_DAC_L4_VOL,
-                       AD183X_DAC_R4_VOL, 0, 0x3FF, 0),
-
-       /* ADC switch control */
-       SOC_DOUBLE("ADC1 Switch", AD183X_ADC_CTRL2, AD183X_ADCL1_MUTE,
-                       AD183X_ADCR1_MUTE, 1, 1),
-
-       /* DAC switch control */
-       SOC_DOUBLE("DAC1 Switch", AD183X_DAC_CTRL2, AD183X_DACL1_MUTE,
-                       AD183X_DACR1_MUTE, 1, 1),
-       SOC_DOUBLE("DAC2 Switch", AD183X_DAC_CTRL2, AD183X_DACL2_MUTE,
-                       AD183X_DACR2_MUTE, 1, 1),
-       SOC_DOUBLE("DAC3 Switch", AD183X_DAC_CTRL2, AD183X_DACL3_MUTE,
-                       AD183X_DACR3_MUTE, 1, 1),
-       SOC_DOUBLE("DAC4 Switch", AD183X_DAC_CTRL2, AD183X_DACL4_MUTE,
-                       AD183X_DACR4_MUTE, 1, 1),
-
-       /* ADC high-pass filter */
-       SOC_SINGLE("ADC High Pass Filter Switch", AD183X_ADC_CTRL1,
-                       AD183X_ADC_HIGHPASS_FILTER, 1, 0),
-
-       /* DAC de-emphasis */
-       SOC_ENUM("Playback Deemphasis", ad183x_deemp_enum),
-};
-
-static const struct snd_soc_dapm_widget ad1835a_ad1837a_dapm_widgets[] = {
-       SND_SOC_DAPM_DAC("DAC", "Playback", AD183X_DAC_CTRL1,
-                       AD183X_DAC_POWERDOWN, 1),
-       SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
-       SND_SOC_DAPM_SUPPLY("ADC_PWR", AD183X_ADC_CTRL1,
-                       AD183X_ADC_POWERDOWN, 1, NULL, 0),
-       SND_SOC_DAPM_OUTPUT("DAC1OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC2OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC3OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC4OUT"),
-       SND_SOC_DAPM_INPUT("ADC1IN"),
-};
-
-static const struct snd_soc_dapm_route ad1835a_ad1837a_audio_paths[] = {
-       { "DAC", NULL, "ADC_PWR" },
-       { "ADC", NULL, "ADC_PWR" },
-       { "DAC1OUT", "DAC1 Switch", "DAC" },
-       { "DAC2OUT", "DAC2 Switch", "DAC" },
-       { "DAC3OUT", "DAC3 Switch", "DAC" },
-       { "DAC3OUT", "DAC4 Switch", "DAC" },
-       { "ADC", "ADC1 Switch", "ADC1IN" },
-};
-
-/* AD1836: 3 stereo DAC, 2 stereo ADC; */
-static const struct snd_kcontrol_new ad1836_snd_controls[] = {
-       /* DAC volume control */
-       SOC_DOUBLE_R("DAC1 Volume", AD183X_DAC_L1_VOL,
-                       AD183X_DAC_R1_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC2 Volume", AD183X_DAC_L2_VOL,
-                       AD183X_DAC_R2_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC3 Volume", AD183X_DAC_L3_VOL,
-                       AD183X_DAC_R3_VOL, 0, 0x3FF, 0),
-
-       /* ADC switch control */
-       SOC_DOUBLE("ADC1 Switch", AD183X_ADC_CTRL2, AD183X_ADCL1_MUTE,
-                       AD183X_ADCR1_MUTE, 1, 1),
-       SOC_DOUBLE("ADC2 Switch", AD183X_ADC_CTRL2, AD183X_ADCL2_MUTE,
-                       AD183X_ADCR2_MUTE, 1, 1),
-
-       /* DAC switch control */
-       SOC_DOUBLE("DAC1 Switch", AD183X_DAC_CTRL2, AD183X_DACL1_MUTE,
-                       AD183X_DACR1_MUTE, 1, 1),
-       SOC_DOUBLE("DAC2 Switch", AD183X_DAC_CTRL2, AD183X_DACL2_MUTE,
-                       AD183X_DACR2_MUTE, 1, 1),
-       SOC_DOUBLE("DAC3 Switch", AD183X_DAC_CTRL2, AD183X_DACL3_MUTE,
-                       AD183X_DACR3_MUTE, 1, 1),
-
-       /* ADC high-pass filter */
-       SOC_SINGLE("ADC High Pass Filter Switch", AD183X_ADC_CTRL1,
-                       AD183X_ADC_HIGHPASS_FILTER, 1, 0),
-
-       /* DAC de-emphasis */
-       SOC_ENUM("Playback Deemphasis", ad183x_deemp_enum),
-};
-
-static const struct snd_soc_dapm_widget ad1836_dapm_widgets[] = {
-       SND_SOC_DAPM_DAC("DAC", "Playback", AD183X_DAC_CTRL1,
-                       AD183X_DAC_POWERDOWN, 1),
-       SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
-       SND_SOC_DAPM_SUPPLY("ADC_PWR", AD183X_ADC_CTRL1,
-                       AD183X_ADC_POWERDOWN, 1, NULL, 0),
-       SND_SOC_DAPM_OUTPUT("DAC1OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC2OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC3OUT"),
-       SND_SOC_DAPM_INPUT("ADC1IN"),
-       SND_SOC_DAPM_INPUT("ADC2IN"),
-};
-
-static const struct snd_soc_dapm_route ad1836_audio_paths[] = {
-       { "DAC", NULL, "ADC_PWR" },
-       { "ADC", NULL, "ADC_PWR" },
-       { "DAC1OUT", "DAC1 Switch", "DAC" },
-       { "DAC2OUT", "DAC2 Switch", "DAC" },
-       { "DAC3OUT", "DAC3 Switch", "DAC" },
-       { "ADC", "ADC1 Switch", "ADC1IN" },
-       { "ADC", "ADC2 Switch", "ADC2IN" },
-};
-
-/* AD1838A/AD1939A: 3 stereo DAC, 1 stereo ADC; */
-static const struct snd_kcontrol_new ad1838a_ad1839a_snd_controls[] = {
-       /* DAC volume control */
-       SOC_DOUBLE_R("DAC1 Volume", AD183X_DAC_L1_VOL,
-                       AD183X_DAC_R1_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC2 Volume", AD183X_DAC_L2_VOL,
-                       AD183X_DAC_R2_VOL, 0, 0x3FF, 0),
-       SOC_DOUBLE_R("DAC3 Volume", AD183X_DAC_L3_VOL,
-                       AD183X_DAC_R3_VOL, 0, 0x3FF, 0),
-
-       /* ADC switch control */
-       SOC_DOUBLE("ADC1 Switch", AD183X_ADC_CTRL2, AD183X_ADCL1_MUTE,
-                       AD183X_ADCR1_MUTE, 1, 1),
-
-       /* DAC switch control */
-       SOC_DOUBLE("DAC1 Switch", AD183X_DAC_CTRL2, AD183X_DACL1_MUTE,
-                       AD183X_DACR1_MUTE, 1, 1),
-       SOC_DOUBLE("DAC2 Switch", AD183X_DAC_CTRL2, AD183X_DACL2_MUTE,
-                       AD183X_DACR2_MUTE, 1, 1),
-       SOC_DOUBLE("DAC3 Switch", AD183X_DAC_CTRL2, AD183X_DACL3_MUTE,
-                       AD183X_DACR3_MUTE, 1, 1),
-
-       /* ADC high-pass filter */
-       SOC_SINGLE("ADC High Pass Filter Switch", AD183X_ADC_CTRL1,
-                       AD183X_ADC_HIGHPASS_FILTER, 1, 0),
-
-       /* DAC de-emphasis */
-       SOC_ENUM("Playback Deemphasis", ad183x_deemp_enum),
-};
-
-static const struct snd_soc_dapm_widget ad1838a_ad1839a_dapm_widgets[] = {
-       SND_SOC_DAPM_DAC("DAC", "Playback", AD183X_DAC_CTRL1,
-                       AD183X_DAC_POWERDOWN, 1),
-       SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
-       SND_SOC_DAPM_SUPPLY("ADC_PWR", AD183X_ADC_CTRL1,
-                       AD183X_ADC_POWERDOWN, 1, NULL, 0),
-       SND_SOC_DAPM_OUTPUT("DAC1OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC2OUT"),
-       SND_SOC_DAPM_OUTPUT("DAC3OUT"),
-       SND_SOC_DAPM_INPUT("ADC1IN"),
-};
-
-static const struct snd_soc_dapm_route ad1838a_ad1839a_audio_paths[] = {
-       { "DAC", NULL, "ADC_PWR" },
-       { "ADC", NULL, "ADC_PWR" },
-       { "DAC1OUT", "DAC1 Switch", "DAC" },
-       { "DAC2OUT", "DAC2 Switch", "DAC" },
-       { "DAC3OUT", "DAC3 Switch", "DAC" },
-       { "ADC", "ADC1 Switch", "ADC1IN" },
-};
-
-/*
- * DAI ops entries
- */
-
-static int ad183x_set_dai_fmt(struct snd_soc_dai *codec_dai,
-               unsigned int fmt)
-{
-       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-               /* at present, we support adc aux mode to interface with
-                * blackfin sport tdm mode
-                */
-       case SND_SOC_DAIFMT_DSP_A:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
-       case SND_SOC_DAIFMT_IB_IF:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
-               /* ALCLK,ABCLK are both output, AD183X can only be master */
-       case SND_SOC_DAIFMT_CBM_CFM:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int ad183x_hw_params(struct snd_pcm_substream *substream,
-               struct snd_pcm_hw_params *params,
-               struct snd_soc_dai *dai)
-{
-       int word_len = 0;
-
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_codec *codec = rtd->codec;
-
-       /* bit size */
-       switch (params_format(params)) {
-       case SNDRV_PCM_FORMAT_S16_LE:
-               word_len = 3;
-               break;
-       case SNDRV_PCM_FORMAT_S20_3LE:
-               word_len = 1;
-               break;
-       case SNDRV_PCM_FORMAT_S24_LE:
-       case SNDRV_PCM_FORMAT_S32_LE:
-               word_len = 0;
-               break;
-       }
-
-       snd_soc_update_bits(codec, AD183X_DAC_CTRL1,
-                       AD183X_DAC_WORD_LEN_MASK, word_len);
-
-       snd_soc_update_bits(codec, AD183X_ADC_CTRL2,
-                       AD183X_ADC_WORD_LEN_MASK, word_len);
-       return 0;
-}
-
-static struct snd_soc_dai_ops ad183x_dai_ops = {
-       .hw_params = ad183x_hw_params,
-       .set_fmt = ad183x_set_dai_fmt,
-};
-
-/* codec DAI instance */
-static struct snd_soc_dai_driver ad183x_dai = {
-       .name = "ad183x-hifi",
-       .playback = {
-               .stream_name = "Playback",
-               .channels_min = 2,
-               .channels_max = 6,
-               .rates = SNDRV_PCM_RATE_48000,
-               .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
-                       SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
-       },
-       .capture = {
-               .stream_name = "Capture",
-               .channels_min = 2,
-               .channels_max = 4,
-               .rates = SNDRV_PCM_RATE_48000,
-               .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
-                       SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
-       },
-       .ops = &ad183x_dai_ops,
-};
-
-static int ad183x_suspend(struct snd_soc_codec *codec, pm_message_t state)
-{
-       /* reset clock control mode */
-       u16 adc_ctrl2 = snd_soc_read(codec, AD183X_ADC_CTRL2);
-       adc_ctrl2 &= ~AD183X_ADC_SERFMT_MASK;
-
-       return snd_soc_write(codec, AD183X_ADC_CTRL2, adc_ctrl2);
-}
-
-static int ad183x_resume(struct snd_soc_codec *codec)
-{
-       /* restore clock control mode */
-       u16 adc_ctrl2 = snd_soc_read(codec, AD183X_ADC_CTRL2);
-       adc_ctrl2 |= AD183X_ADC_AUX;
-
-       return snd_soc_write(codec, AD183X_ADC_CTRL2, adc_ctrl2);
-}
-
-static int ad183x_probe(struct snd_soc_codec *codec)
-{
-       struct ad183x_priv *ad183x = snd_soc_codec_get_drvdata(codec);
-       struct ad183x_chl_ctrls *chl_ctrl;
-       struct snd_soc_dapm_context *dapm = &codec->dapm;
-       int ret;
-
-       ret = snd_soc_codec_set_cache_io(codec, 4, 12, ad183x->control_type);
-       if (ret < 0) {
-               dev_err(codec->dev, "failed to set cache I/O: %d\n", ret);
-               return ret;
-       }
-
-       /* default setting for ad183x */
-       /* de-emphasis: 48kHz, power-on dac */
-       snd_soc_write(codec, AD183X_DAC_CTRL1, 0x300);
-       /* unmute dac channels */
-       snd_soc_write(codec, AD183X_DAC_CTRL2, 0x0);
-       /* high-pass filter enable, power-on adc */
-       snd_soc_write(codec, AD183X_ADC_CTRL1, 0x100);
-       /* unmute adc channles, adc aux mode */
-       snd_soc_write(codec, AD183X_ADC_CTRL2, 0x180);
-       /* left/right diff:PGA/MUX */
-       snd_soc_write(codec, AD183X_ADC_CTRL3, 0x3A);
-       /* volume */
-       snd_soc_write(codec, AD183X_DAC_L1_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_R1_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_L2_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_R2_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_L3_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_R3_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_L4_VOL, 0x3FF);
-       snd_soc_write(codec, AD183X_DAC_R4_VOL, 0x3FF);
-
-       chl_ctrl = &ad183x->chl_ctrl;
-
-       snd_soc_add_controls(codec, chl_ctrl->snd_ctrls, chl_ctrl->ctrl_num);
-       snd_soc_dapm_new_controls(dapm, chl_ctrl->dapm_widgets, 
chl_ctrl->widget_num);
-       snd_soc_dapm_add_routes(dapm, chl_ctrl->audio_paths, 
chl_ctrl->path_num);
-
-       return 0;
-}
-
-/* power down chip */
-static int ad183x_remove(struct snd_soc_codec *codec)
-{
-       return 0;
-}
-
-static struct snd_soc_codec_driver soc_codec_dev_ad183x = {
-       .probe =        ad183x_probe,
-       .remove =       ad183x_remove,
-       .suspend =      ad183x_suspend,
-       .resume =       ad183x_resume,
-       .reg_cache_size = AD183X_NUM_REGS,
-       .reg_word_size = sizeof(u16),
-};
-
-static int __devinit ad183x_spi_probe(struct spi_device *spi)
-{
-       struct ad183x_priv *ad183x;
-       int ret;
-       char *chip_name = spi->dev.platform_data;
-
-       if (!chip_name)
-               return -ENODEV;
-
-       ad183x = kzalloc(sizeof(struct ad183x_priv), GFP_KERNEL);
-       if (ad183x == NULL)
-               return -ENOMEM;
-
-       if ((strcmp(chip_name, "ad1835a") == 0) || (strcmp(chip_name, 
"ad1837a") == 0)) {
-               ad183x->chl_ctrl.snd_ctrls = (struct snd_kcontrol_new 
*)ad1835a_ad1837a_snd_controls;
-               ad183x->chl_ctrl.dapm_widgets = (struct snd_soc_dapm_widget 
*)ad1835a_ad1837a_dapm_widgets;
-               ad183x->chl_ctrl.audio_paths = (struct snd_soc_dapm_route 
*)ad1835a_ad1837a_audio_paths;
-               ad183x->chl_ctrl.ctrl_num = 
ARRAY_SIZE(ad1835a_ad1837a_snd_controls);
-               ad183x->chl_ctrl.widget_num = 
ARRAY_SIZE(ad1835a_ad1837a_dapm_widgets);
-               ad183x->chl_ctrl.path_num = 
ARRAY_SIZE(ad1835a_ad1837a_audio_paths);
-               ad183x_dai.playback.channels_max = 8;
-               ad183x_dai.capture.channels_max = 2;
-       } else if ((strcmp(chip_name, "ad1838a") == 0) || (strcmp(chip_name, 
"ad1839a") == 0)) {
-               ad183x->chl_ctrl.snd_ctrls = (struct snd_kcontrol_new 
*)ad1838a_ad1839a_snd_controls;
-               ad183x->chl_ctrl.dapm_widgets = (struct snd_soc_dapm_widget 
*)ad1838a_ad1839a_dapm_widgets;
-               ad183x->chl_ctrl.audio_paths = (struct snd_soc_dapm_route 
*)ad1838a_ad1839a_audio_paths;
-               ad183x->chl_ctrl.ctrl_num = 
ARRAY_SIZE(ad1838a_ad1839a_snd_controls);
-               ad183x->chl_ctrl.widget_num = 
ARRAY_SIZE(ad1838a_ad1839a_dapm_widgets);
-               ad183x->chl_ctrl.path_num = 
ARRAY_SIZE(ad1838a_ad1839a_audio_paths);
-               ad183x_dai.playback.channels_max = 6;
-               ad183x_dai.capture.channels_max = 2;
-       } else if (strcmp(chip_name, "ad1836") == 0) {
-               ad183x->chl_ctrl.snd_ctrls = (struct snd_kcontrol_new 
*)ad1836_snd_controls;
-               ad183x->chl_ctrl.dapm_widgets = (struct snd_soc_dapm_widget 
*)ad1836_dapm_widgets;
-               ad183x->chl_ctrl.audio_paths = (struct snd_soc_dapm_route 
*)ad1836_audio_paths;
-               ad183x->chl_ctrl.ctrl_num = ARRAY_SIZE(ad1836_snd_controls);
-               ad183x->chl_ctrl.widget_num = ARRAY_SIZE(ad1836_dapm_widgets);
-               ad183x->chl_ctrl.path_num = ARRAY_SIZE(ad1836_audio_paths);
-               ad183x_dai.playback.channels_max = 6;
-               ad183x_dai.capture.channels_max = 4;
-       } else {
-               dev_err(&spi->dev, "not supported chip type\n");
-               return -EINVAL;
-       }
-
-       spi_set_drvdata(spi, ad183x);
-       ad183x->control_type = SND_SOC_SPI;
-       ret = snd_soc_register_codec(&spi->dev,
-                       &soc_codec_dev_ad183x, &ad183x_dai, 1);
-
-       if (ret < 0)
-               kfree(ad183x);
-       return ret;
-}
-
-static int __devexit ad183x_spi_remove(struct spi_device *spi)
-{
-       snd_soc_unregister_codec(&spi->dev);
-       kfree(spi_get_drvdata(spi));
-
-       return 0;
-}
-
-static struct spi_driver ad183x_spi_driver = {
-       .driver = {
-               .name   = "ad183x",
-               .owner  = THIS_MODULE,
-       },
-       .probe          = ad183x_spi_probe,
-       .remove         = __devexit_p(ad183x_spi_remove),
-};
-
-static int __init ad183x_init(void)
-{
-       int ret = 0;
-#if defined(CONFIG_SPI_MASTER)
-       ret = spi_register_driver(&ad183x_spi_driver);
-       if (ret != 0) {
-               printk(KERN_ERR "Failed to register ad183x SPI driver: %d\n",
-                               ret);
-       }
-#endif
-       return ret;
-}
-module_init(ad183x_init);
-
-static void __exit ad183x_exit(void)
-{
-#if defined(CONFIG_SPI_MASTER)
-       spi_unregister_driver(&ad183x_spi_driver);
-#endif
-}
-module_exit(ad183x_exit);
-
-MODULE_DESCRIPTION("ASoC ad183x driver");
-MODULE_AUTHOR("Barry Song <[email protected]>");
-MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/ad183x.h b/sound/soc/codecs/ad183x.h
deleted file mode 100644
index f7af3db..0000000
--- a/sound/soc/codecs/ad183x.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * AD183X Audio Codec driver supporting AD1835A, AD1836, AD1837A, AD1838A, 
AD1839A
- *
- * Copyright 2009-2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#ifndef __AD183X_H__
-#define __AD183X_H__
-
-#define AD183X_DAC_CTRL1               0
-#define AD183X_DAC_POWERDOWN           2
-#define AD183X_DAC_SERFMT_MASK        0xE0
-#define AD183X_DAC_SERFMT_PCK256       (0x4 << 5)
-#define AD183X_DAC_SERFMT_PCK128       (0x5 << 5)
-#define AD183X_DAC_WORD_LEN_MASK       0x18
-
-#define AD183X_DAC_CTRL2               1
-#define AD183X_DACL1_MUTE              0
-#define AD183X_DACR1_MUTE              1
-#define AD183X_DACL2_MUTE              2
-#define AD183X_DACR2_MUTE              3
-#define AD183X_DACL3_MUTE              4
-#define AD183X_DACR3_MUTE              5
-#define AD183X_DACL4_MUTE              6
-#define AD183X_DACR4_MUTE              7
-
-#define AD183X_DAC_L1_VOL              2
-#define AD183X_DAC_R1_VOL              3
-#define AD183X_DAC_L2_VOL              4
-#define AD183X_DAC_R2_VOL              5
-#define AD183X_DAC_L3_VOL              6
-#define AD183X_DAC_R3_VOL              7
-#define AD183X_DAC_L4_VOL              8
-#define AD183X_DAC_R4_VOL              9
-
-#define AD183X_ADC_CTRL1               12
-#define AD183X_ADC_POWERDOWN           7
-#define AD183X_ADC_HIGHPASS_FILTER     8
-
-#define AD183X_ADC_CTRL2               13
-#define AD183X_ADCL1_MUTE               0
-#define AD183X_ADCR1_MUTE               1
-#define AD183X_ADCL2_MUTE               2
-#define AD183X_ADCR2_MUTE               3
-#define AD183X_ADC_WORD_LEN_MASK       0x30
-#define AD183X_ADC_SERFMT_MASK        (7 << 6)
-#define AD183X_ADC_SERFMT_PCK256       (0x4 << 6)
-#define AD183X_ADC_SERFMT_PCK128       (0x5 << 6)
-#define AD183X_ADC_AUX                 (0x6 << 6)
-
-#define AD183X_ADC_CTRL3               14
-
-#define AD183X_NUM_REGS                16
-
-#endif

_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to