Title: [9803] trunk/sound/soc/codecs/adau1701.c: driver:codec task[#6223]roll back to the previous revision,because 1.now the asoc tree has been updataed to 2.6.40,the framework has changed a lot,so keep this version on current trunk 2.
Revision
9803
Author
cliff
Date
2011-03-29 05:10:46 -0400 (Tue, 29 Mar 2011)

Log Message

driver:codec task[#6223]roll back to the previous revision,because 1.now the asoc tree has been updataed to 2.6.40,the framework has changed a lot,so keep this version on current trunk 2. without the firmware downloading function this driver looks odd

Modified Paths

Diff

Modified: trunk/sound/soc/codecs/adau1701.c (9802 => 9803)


--- trunk/sound/soc/codecs/adau1701.c	2011-03-28 17:00:58 UTC (rev 9802)
+++ trunk/sound/soc/codecs/adau1701.c	2011-03-29 09:10:46 UTC (rev 9803)
@@ -14,6 +14,7 @@
 #include <linux/i2c.h>
 #include <linux/workqueue.h>
 #include <linux/platform_device.h>
+#include <linux/sigma.h>
 #include <linux/sysfs.h>
 #include <linux/slab.h>
 #include <sound/core.h>
@@ -80,9 +81,9 @@
 static int adau1701_write_register(struct snd_soc_codec *codec,
 	u16 reg_address, u32 value)
 {
-	int i, ret;
+	int i;
 	int length, count;
-	u8 buf[6] = { 0, 0, 0, 0, 0, 0 };
+	u8 buf[8];
 
 	for (i = 0; i < ARRAY_SIZE(register_table); i++) {
 		if (register_table[i].address == reg_address)
@@ -112,17 +113,11 @@
 		buf[4] = value >> 8;
 		buf[5] = value;
 	}
-	ret = i2c_master_send(codec->control_data, buf, count);
-	if (ret == count)
-		return 0;
-	else {
-		dev_err(codec->dev, "adau1701_write_register failed.");
-		return -EIO;
-	}
+	return i2c_master_send(codec->control_data, buf, count);
 }
 
 /*
- * Read ADAU1701 hw register
+ * read ADAU1701 hw register
  */
 static u32 adau1701_read_register(struct snd_soc_codec *codec,
 	u16 reg_address)
@@ -172,6 +167,15 @@
 	return value;
 }
 
+static int adau1701_setprogram(struct snd_soc_codec *codec)
+{
+	int ret;
+
+	ret = process_sigma_firmware(codec->control_data, ADAU1701_FIRMWARE);
+
+	return ret;
+}
+
 static int adau1701_pcm_prepare(struct snd_pcm_substream *substream,
 				struct snd_soc_dai *dai)
 {
@@ -301,10 +305,38 @@
 	return 0;
 }
 
+static ssize_t adau1371_dsp_load(struct device *dev,
+				  struct device_attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret;
+	u32 reg;
+	struct adau1701_priv *adau1701 = dev_get_drvdata(dev);
+	struct snd_soc_codec *codec = adau1701->codec;
+
+	reg = ADAU1701_DSPCTRL_DAM | ADAU1701_DSPCTRL_ADM;
+	adau1701_write_register(codec, ADAU1701_DSPCTRL, reg);
+	ret = adau1701_setprogram(codec);
+	reg = ADAU1701_DSPCTRL_DAM | ADAU1701_DSPCTRL_ADM;
+	adau1701_write_register(codec, ADAU1701_DSPCTRL, reg);
+	if (ret)
+		return ret;
+	else
+		return count;
+}
+static DEVICE_ATTR(dsp, 0644, NULL, adau1371_dsp_load);
+
 static int adau1701_reg_init(struct snd_soc_codec *codec)
 {
 	u32 reg;
+	int ret;
 
+	/* Load default program */
+	ret = adau1701_setprogram(codec);
+	if (ret < 0) {
+		dev_err(codec->dev, "Loading program data failed\n");
+		goto error;
+	}
 	reg = 0x08;
 	adau1701_write_register(codec, ADAU1701_DSPRES, reg);
 	adau1701_write_register(codec, ADAU1701_SEROCTL, 0);
@@ -327,7 +359,8 @@
 	/* Power-up the oscillator */
 	adau1701_write_register(codec, ADAU1701_OSCIPOW, 0);
 #endif
-	return 0;
+error:
+	return ret;
 }
 
 static int adau1701_probe(struct snd_soc_codec *codec)
@@ -347,6 +380,9 @@
 		dev_err(codec->dev, "failed to initialize\n");
 		return ret;
 	}
+	ret = device_create_file(codec->dev, &dev_attr_dsp);
+	if (ret)
+		dev_err(codec->dev, "device_create_file() failed\n");
 
 	return ret;
 }
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to