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;
}