diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 0edca93..1f658c2 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -216,6 +216,9 @@ config SND_SOC_WM9712
 
 config SND_SOC_WM9713
 	tristate
+    
+config SND_SOC_GENERIC
+	tristate
 
 # Amp
 config SND_SOC_MAX9877
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index fb4af28..75061aa 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -44,6 +44,7 @@ snd-soc-wm9705-objs := wm9705.o
 snd-soc-wm9712-objs := wm9712.o
 snd-soc-wm9713-objs := wm9713.o
 snd-soc-wm-hubs-objs := wm_hubs.o
+snd-soc-generic-objs := generic.o
 
 # Amp
 snd-soc-max9877-objs := max9877.o
@@ -94,6 +95,7 @@ obj-$(CONFIG_SND_SOC_WM9705)	+= snd-soc-wm9705.o
 obj-$(CONFIG_SND_SOC_WM9712)	+= snd-soc-wm9712.o
 obj-$(CONFIG_SND_SOC_WM9713)	+= snd-soc-wm9713.o
 obj-$(CONFIG_SND_SOC_WM_HUBS)	+= snd-soc-wm-hubs.o
+obj-$(CONFIG_SND_SOC_GENERIC)	+= snd-soc-generic.o
 
 # Amp
 obj-$(CONFIG_SND_SOC_MAX9877)	+= snd-soc-max9877.o
diff --git a/sound/soc/codecs/generic.c b/sound/soc/codecs/generic.c
new file mode 100644
index 0000000..44ae32e
--- /dev/null
+++ b/sound/soc/codecs/generic.c
@@ -0,0 +1,141 @@
+/*
+ * generic.c
+ *
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#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/initval.h>
+#include <sound/soc.h>
+
+#include "generic.h"
+
+/*
+ * Note this is a simple chip with no configuration interface, sample rate is
+ * determined automatically by examining the Master clock and Bit clock ratios
+ */
+
+struct generic_data {
+	struct snd_soc_codec codec;
+	int mclk;
+};
+
+#define GENERIC_RATES  (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000)
+
+
+struct snd_soc_dai generic_dai = {
+	.name = "generic-hifi",
+	.playback = {
+		.stream_name = "Playback",
+		.channels_min = 1,
+		.channels_max = 2,
+		.rates = GENERIC_RATES,
+		.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
+		},
+	.capture = {
+		.stream_name = "Capture",
+		.channels_min = 1,
+		.channels_max = 2,
+		.rates = GENERIC_RATES,
+		.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
+	},
+	.ops = NULL,
+};
+EXPORT_SYMBOL_GPL(generic_dai);
+
+static int generic_init(struct snd_soc_device *socdev)
+{
+	struct snd_soc_codec *codec = socdev->card->codec;
+	int ret = 0;
+
+	codec->name = "generic_codec";
+	codec->owner = THIS_MODULE;
+	codec->dai = &generic_dai;
+	codec->num_dai = 1;
+
+	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+	if (ret < 0) {
+		printk(KERN_ERR "generic: failed to create pcms\n");
+		return ret;
+	}
+
+	ret = snd_soc_init_card(socdev);
+	if (ret < 0) {
+		printk(KERN_ERR "generic: failed to register card\n");
+		return ret;
+	}
+
+	return ret;
+}
+
+static int generic_probe(struct platform_device *pdev)
+{
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec *codec;
+	struct generic_data *generic_c;
+
+	printk("%s: start\n", __func__);
+
+	generic_c = kzalloc(sizeof(struct generic_data), GFP_KERNEL);
+	if (generic_c == NULL)
+		return -ENOMEM;
+
+	codec = &generic_c->codec;
+	socdev->card->codec = codec;
+
+	mutex_init(&codec->mutex);
+	INIT_LIST_HEAD(&codec->dapm_widgets);
+	INIT_LIST_HEAD(&codec->dapm_paths);
+
+	generic_init(socdev);
+
+	return 0;
+}
+
+static int generic_remove(struct platform_device *pdev)
+{
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec *codec = socdev->card->codec;
+	struct generic_data *generic_c =
+			container_of(codec, struct generic_data, codec);
+
+	kfree(codec->reg_cache);
+	kfree(generic_c);
+
+	return 0;
+}
+
+struct snd_soc_codec_device soc_codec_dev_generic =
+{
+	.probe = generic_probe,
+	.remove = generic_remove,
+};
+EXPORT_SYMBOL_GPL(soc_codec_dev_generic);
+
+
+static int __init generic_mod_init(void)
+{
+	printk("generic module init\n");
+	return snd_soc_register_dai(&generic_dai);
+}
+module_init(generic_mod_init);
+
+static void __exit generic_mod_exit(void)
+{
+	snd_soc_unregister_dai(&generic_dai);
+}
+module_exit(generic_mod_exit);
+
+MODULE_DESCRIPTION("ASoC generic codec driver");
+MODULE_AUTHOR("Jan Pohanka");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/generic.h b/sound/soc/codecs/generic.h
new file mode 100644
index 0000000..1e7695e
--- /dev/null
+++ b/sound/soc/codecs/generic.h
@@ -0,0 +1,16 @@
+/*
+ * ALSA SoC generic codec driver
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _GENERIC_H
+#define _GENERIC_H
+
+extern struct snd_soc_dai generic_dai;
+extern struct snd_soc_codec_device soc_codec_dev_generic;
+
+#endif /* _GENERIC_H */
diff --git a/sound/soc/davinci/Kconfig b/sound/soc/davinci/Kconfig
index 047ee39..5d60ab9 100644
--- a/sound/soc/davinci/Kconfig
+++ b/sound/soc/davinci/Kconfig
@@ -22,6 +22,15 @@ config SND_DAVINCI_SOC_EVM
 	  Say Y if you want to add support for SoC audio on TI
 	  DaVinci DM6446 or DM355 EVM platforms.
 
+config SND_DAVINCI_SOC_EYE03
+	tristate "SoC Audio support for Jablocom EYE03"
+	depends on SND_DAVINCI_SOC
+	select SND_DAVINCI_SOC_I2S
+	select SND_SOC_GENERIC
+	help
+	  Say Y if you want to add support for SoC audio on 
+	  Jablocom EYE03 board.
+
 config  SND_DM6467_SOC_EVM
 	tristate "SoC Audio support for DaVinci DM6467 EVM"
 	depends on SND_DAVINCI_SOC && MACH_DAVINCI_DM6467_EVM
diff --git a/sound/soc/davinci/Makefile b/sound/soc/davinci/Makefile
index a6939d7..7bb0c44 100644
--- a/sound/soc/davinci/Makefile
+++ b/sound/soc/davinci/Makefile
@@ -16,3 +16,8 @@ obj-$(CONFIG_SND_DM6467_SOC_EVM) += snd-soc-evm.o
 obj-$(CONFIG_SND_DA830_SOC_EVM) += snd-soc-evm.o
 obj-$(CONFIG_SND_DA850_SOC_EVM) += snd-soc-evm.o
 obj-$(CONFIG_SND_DAVINCI_SOC_SFFSDR) += snd-soc-sffsdr.o
+
+# EYE03 Machine Support
+snd-soc-eye03-objs := davinci-eye03.o
+
+obj-$(CONFIG_SND_DAVINCI_SOC_EYE03) += snd-soc-eye03.o
diff --git a/sound/soc/davinci/davinci-eye03.c b/sound/soc/davinci/davinci-eye03.c
new file mode 100644
index 0000000..81dc7db
--- /dev/null
+++ b/sound/soc/davinci/davinci-eye03.c
@@ -0,0 +1,172 @@
+/*
+ * ASoC driver for Jablocom EYE03 with TI DM365
+ *
+ * Author:      Jan Pohanka, <pohanka@jablocom.com>
+ * Based on davinci-evm.c by Vladimir Barinov
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+
+#include <asm/dma.h>
+#include <asm/mach-types.h>
+
+#include <mach/asp.h>
+#include <mach/edma.h>
+#include <mach/mux.h>
+
+#include "../codecs/spdif_transciever.h"
+#include "../codecs/generic.h"
+
+#include "davinci-pcm.h"
+#include "davinci-i2s.h"
+#include "davinci-mcasp.h"
+
+#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
+		SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_IB_IF)
+
+static int evm_hw_params(struct snd_pcm_substream *substream,
+			 struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+	int ret = 0;
+	unsigned sysclk;
+
+	sysclk = 27000000;
+
+	/* set codec DAI configuration */
+
+
+	/* set cpu DAI configuration */
+	ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
+	if (ret < 0)
+		return ret;
+
+	/* set the codec system clock */
+
+
+	return 0;
+}
+
+static struct snd_soc_ops evm_ops = {
+	.hw_params = evm_hw_params,
+};
+
+/* davinci-evm machine dapm widgets */
+static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
+	SND_SOC_DAPM_HP("Headphone Jack", NULL),
+	SND_SOC_DAPM_LINE("Line Out", NULL),
+	SND_SOC_DAPM_MIC("Mic Jack", NULL),
+	SND_SOC_DAPM_LINE("Line In", NULL),
+};
+
+/* davinci-evm machine audio_mapnections to the codec pins */
+static const struct snd_soc_dapm_route audio_map[] = {
+	/* Headphone connected to HPLOUT, HPROUT */
+	{"Headphone Jack", NULL, "HPLOUT"},
+	{"Headphone Jack", NULL, "HPROUT"},
+
+	/* Line Out connected to LLOUT, RLOUT */
+	{"Line Out", NULL, "LLOUT"},
+	{"Line Out", NULL, "RLOUT"},
+
+	/* Mic connected to (MIC3L | MIC3R) */
+	{"MIC3L", NULL, "Mic Bias 2V"},
+	{"MIC3R", NULL, "Mic Bias 2V"},
+	{"Mic Bias 2V", NULL, "Mic Jack"},
+
+	/* Line In connected to (LINE1L | LINE2L), (LINE1R | LINE2R) */
+	{"LINE1L", NULL, "Line In"},
+	{"LINE2L", NULL, "Line In"},
+	{"LINE1R", NULL, "Line In"},
+	{"LINE2R", NULL, "Line In"},
+};
+
+
+static int eye03_generic_init(struct snd_soc_codec *codec)
+{
+	printk("%s", __func__);
+	return 0;
+}
+
+/* davinci-evm digital audio interface glue - connects codec <--> CPU */
+static struct snd_soc_dai_link eye03_dai[] = {
+	{
+		.name = "generic",
+		.stream_name = "generic stream",
+		.cpu_dai = &davinci_i2s_dai,
+		.codec_dai = &generic_dai,
+		.ops = &evm_ops,
+		.init = eye03_generic_init,
+	},
+};
+
+static struct snd_soc_card snd_soc_card_eye03 = {
+	.name = "DaVinci EYE03",
+	.platform = &davinci_soc_platform,
+	.dai_link = eye03_dai,
+	.num_links = ARRAY_SIZE(eye03_dai),
+	.num_links = 1,
+};
+
+
+/* eye03 audio subsystem */
+static struct snd_soc_device eye03_snd_devdata = {
+	.card = &snd_soc_card_eye03,
+	.codec_dev = &soc_codec_dev_generic,
+};
+
+
+
+static struct platform_device *eye03_snd_device;
+
+static int __init eye03_init(void)
+{
+	int index;
+	int ret;
+
+	if (!machine_is_eye03())
+		return -EINVAL;
+
+
+	index = 0;
+	eye03_snd_device = platform_device_alloc("soc-audio", index);
+	if (!eye03_snd_device)
+		return -ENOMEM;
+
+	platform_set_drvdata(eye03_snd_device, &eye03_snd_devdata);
+	eye03_snd_devdata.dev = &eye03_snd_device->dev;
+	ret = platform_device_add(eye03_snd_device);
+	if (ret)
+		platform_device_put(eye03_snd_device);
+
+	printk("EYE03 sound init: %d\n", ret);
+
+	return ret;
+}
+
+static void __exit eye03_exit(void)
+{
+	platform_device_unregister(eye03_snd_device);
+}
+
+module_init(eye03_init);
+module_exit(eye03_exit);
+
+MODULE_AUTHOR("Jan Pohanka");
+MODULE_DESCRIPTION("TI DAVINCI EYE03 ASoC driver");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index 1a04e1b..5d9bef1 100644
--- a/sound/soc/davinci/davinci-i2s.c
+++ b/sound/soc/davinci/davinci-i2s.c
@@ -56,6 +56,7 @@
 
 #define DAVINCI_MCBSP_SPCR_RRST		(1 << 0)
 #define DAVINCI_MCBSP_SPCR_RINTM(v)	((v) << 4)
+#define DAVINCI_MCBSP_SPCR_DLB		(1 << 15)
 #define DAVINCI_MCBSP_SPCR_XRST		(1 << 16)
 #define DAVINCI_MCBSP_SPCR_XINTM(v)	((v) << 20)
 #define DAVINCI_MCBSP_SPCR_GRST		(1 << 22)
@@ -77,6 +78,7 @@
 #define DAVINCI_MCBSP_SRGR_FWID(v)	((v) << 8)
 #define DAVINCI_MCBSP_SRGR_FPER(v)	((v) << 16)
 #define DAVINCI_MCBSP_SRGR_FSGM		(1 << 28)
+#define DAVINCI_MCBSP_SRGR_CLKSM	BIT(29)
 
 #define DAVINCI_MCBSP_PCR_CLKRP		(1 << 0)
 #define DAVINCI_MCBSP_PCR_CLKXP		(1 << 1)
@@ -97,6 +99,12 @@ enum {
 	DAVINCI_MCBSP_WORD_32,
 };
 
+static const unsigned char asp_word_length[SNDRV_PCM_FORMAT_S32_LE + 1] = {
+	[SNDRV_PCM_FORMAT_S8]           = DAVINCI_MCBSP_WORD_8,
+	[SNDRV_PCM_FORMAT_S16_LE]       = DAVINCI_MCBSP_WORD_16,
+	[SNDRV_PCM_FORMAT_S32_LE]       = DAVINCI_MCBSP_WORD_32,
+};
+
 struct davinci_mcbsp_dev {
 	/*
 	 * dma_params must be first because rtd->dai->cpu_dai->private_data
@@ -110,6 +118,8 @@ struct davinci_mcbsp_dev {
 	int				mode;
 	u32				pcr;
 	struct clk			*clk;
+	unsigned int			fmt;
+	int				clk_div;
 };
 
 static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev,
@@ -141,7 +151,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
 	struct snd_soc_platform *platform = socdev->card->platform;
 	int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
 	u32 spcr;
-	u32 mask = playback ? DAVINCI_MCBSP_SPCR_XRST : DAVINCI_MCBSP_SPCR_RRST;
+	u32 mask = playback ? DAVINCI_MCBSP_SPCR_XRST :
+			DAVINCI_MCBSP_SPCR_RRST | DAVINCI_MCBSP_SPCR_XRST;
 	spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
 	if (spcr & mask) {
 		/* start off disabled */
@@ -220,18 +231,19 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
 	struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
 	unsigned int pcr;
 	unsigned int srgr;
+	/* Attention srgr is updated by hw_params! */
 	srgr = DAVINCI_MCBSP_SRGR_FSGM |
 		DAVINCI_MCBSP_SRGR_FPER(DEFAULT_BITPERSAMPLE * 2 - 1) |
 		DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE - 1);
 
+	dev->fmt = fmt;
 	/* set master/slave audio interface */
 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 	case SND_SOC_DAIFMT_CBS_CFS:
 		/* cpu is master */
 		pcr = DAVINCI_MCBSP_PCR_FSXM |
 			DAVINCI_MCBSP_PCR_FSRM |
-			DAVINCI_MCBSP_PCR_CLKXM |
-			DAVINCI_MCBSP_PCR_CLKRM;
+			DAVINCI_MCBSP_PCR_CLKXM;
 		break;
 	case SND_SOC_DAIFMT_CBM_CFS:
 		/* McBSP CLKR pin is the input for the Sample Rate Generator.
@@ -346,26 +358,67 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
 	struct davinci_pcm_dma_params *dma_params =
 					&dev->dma_params[substream->stream];
 	struct snd_interval *i = NULL;
-	int mcbsp_word_length;
-	unsigned int rcr, xcr, srgr;
+	int mcbsp_word_length, master;
+	unsigned int rcr, xcr, srgr, clk_div, freq;
 	u32 spcr;
+	snd_pcm_format_t fmt;
 
 	/* general line settings */
 	spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
 	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
-		spcr |= DAVINCI_MCBSP_SPCR_RINTM(3) | DAVINCI_MCBSP_SPCR_FREE;
+		spcr |= DAVINCI_MCBSP_SPCR_RINTM(3) | DAVINCI_MCBSP_SPCR_FREE
+				| DAVINCI_MCBSP_SPCR_DLB;
 		davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
 	} else {
 		spcr |= DAVINCI_MCBSP_SPCR_XINTM(3) | DAVINCI_MCBSP_SPCR_FREE;
 		davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
 	}
 
-	i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
-	srgr = DAVINCI_MCBSP_SRGR_FSGM;
-	srgr |= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1);
+	master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK;
+	fmt = params_format(params);
+	mcbsp_word_length = asp_word_length[fmt];
+	switch (master) {
+	case SND_SOC_DAIFMT_CBS_CFS:
+		freq = clk_get_rate(dev->clk);
+		srgr = DAVINCI_MCBSP_SRGR_FSGM |
+				DAVINCI_MCBSP_SRGR_CLKSM;
+
+		/* symmetric waveforms */
+		clk_div = freq / (mcbsp_word_length * 16) /
+				params->rate_num * params->rate_den / 2;
+		/* 121500000/216/70 = 8035 */
+		clk_div = 216;
+//		srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * 16 - 1);
+		srgr |= DAVINCI_MCBSP_SRGR_FPER(70 - 1);
+
+		srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * 8 * 2 - 1);
+
+		clk_div &= 0xFF;
+		srgr |= clk_div;
+		break;
+	case SND_SOC_DAIFMT_CBM_CFS:
+		srgr = DAVINCI_MCBSP_SRGR_FSGM;
+		clk_div = dev->clk_div - 1;
+		srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * 8 - 1);
+		srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * 16 - 1);
+		clk_div &= 0xFF;
+		srgr |= clk_div;
+		break;
+	case SND_SOC_DAIFMT_CBM_CFM:
+		/* Clock and frame sync given from external sources */
+		i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
+		srgr = DAVINCI_MCBSP_SRGR_FSGM;
+		srgr |= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1);
+		pr_debug("%s - %d  FWID set: re-read srgr = %X\n",
+				__func__, __LINE__, snd_interval_value(i) - 1);
+
+		i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_FRAME_BITS);
+		srgr |= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1);
+		break;
+	default:
+		return -EINVAL;
+	}
 
-	i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_FRAME_BITS);
-	srgr |= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1);
 	davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG, srgr);
 
 	rcr = DAVINCI_MCBSP_RCR_RFIG;
