Fix: reset ac101/ac108 chips after fill cache
This commit is contained in:
parent
0548a6d0a3
commit
ccac09b842
3 changed files with 39 additions and 26 deletions
28
ac101.c
28
ac101.c
|
@ -1490,10 +1490,11 @@ int ac101_codec_resume(struct snd_soc_codec *codec)
|
||||||
static ssize_t ac101_debug_store(struct device *dev,
|
static ssize_t ac101_debug_store(struct device *dev,
|
||||||
struct device_attribute *attr, const char *buf, size_t count)
|
struct device_attribute *attr, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
static int val = 0, flag = 0;
|
|
||||||
u8 reg,num,i=0;
|
|
||||||
u16 value_w,value_r[128];
|
|
||||||
struct ac10x_priv *ac10x = dev_get_drvdata(dev);
|
struct ac10x_priv *ac10x = dev_get_drvdata(dev);
|
||||||
|
int val = 0, flag = 0;
|
||||||
|
u16 value_w, value_r;
|
||||||
|
u8 reg, num, i=0;
|
||||||
|
|
||||||
val = simple_strtol(buf, NULL, 16);
|
val = simple_strtol(buf, NULL, 16);
|
||||||
flag = (val >> 24) & 0xF;
|
flag = (val >> 24) & 0xF;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
|
@ -1506,16 +1507,15 @@ static ssize_t ac101_debug_store(struct device *dev,
|
||||||
num = val & 0xff;
|
num = val & 0xff;
|
||||||
printk("\n");
|
printk("\n");
|
||||||
printk("read:start add:0x%x,count:0x%x\n", reg, num);
|
printk("read:start add:0x%x,count:0x%x\n", reg, num);
|
||||||
|
|
||||||
|
regcache_cache_bypass(ac10x->regmap101, true);
|
||||||
do {
|
do {
|
||||||
value_r[i] = ac101_read(ac10x->codec, reg);
|
value_r = ac101_read(ac10x->codec, reg);
|
||||||
printk("0x%x: 0x%04x ",reg,value_r[i]);
|
printk("0x%x: 0x%04x ", reg++, value_r);
|
||||||
reg+=1;
|
if (++i % 4 == 0 || i == num)
|
||||||
i++;
|
|
||||||
if(i == num)
|
|
||||||
printk("\n");
|
|
||||||
if(i%4==0)
|
|
||||||
printk("\n");
|
printk("\n");
|
||||||
} while (i < num);
|
} while (i < num);
|
||||||
|
regcache_cache_bypass(ac10x->regmap101, false);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -1602,13 +1602,13 @@ int ac101_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ac10x_fill_regcache(&i2c->dev, ac10x->regmap101);
|
|
||||||
|
|
||||||
/* Chip reset */
|
/* Chip reset */
|
||||||
/*
|
regcache_cache_only(ac10x->regmap101, false);
|
||||||
ret = regmap_write(ac10x->regmap101, CHIP_AUDIO_RST, 0);
|
ret = regmap_write(ac10x->regmap101, CHIP_AUDIO_RST, 0);
|
||||||
msleep(50);
|
msleep(50);
|
||||||
*/
|
|
||||||
|
/* sync regcache for FLAT type */
|
||||||
|
ac10x_fill_regcache(&i2c->dev, ac10x->regmap101);
|
||||||
|
|
||||||
ret = regmap_read(ac10x->regmap101, CHIP_AUDIO_RST, &v);
|
ret = regmap_read(ac10x->regmap101, CHIP_AUDIO_RST, &v);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
20
ac108.c
20
ac108.c
|
@ -173,8 +173,11 @@ static const DECLARE_TLV_DB_SCALE(tlv_ch_digital_vol, -11925,75,0);
|
||||||
int ac10x_read(u8 reg, u8* rt_val, struct regmap* i2cm) {
|
int ac10x_read(u8 reg, u8* rt_val, struct regmap* i2cm) {
|
||||||
int r, v = 0;
|
int r, v = 0;
|
||||||
|
|
||||||
r = regmap_read(i2cm, reg, &v);
|
if ((r = regmap_read(i2cm, reg, &v)) < 0) {
|
||||||
|
pr_err("ac10x_read error->[REG-0x%02x]\n", reg);
|
||||||
|
} else {
|
||||||
*rt_val = v;
|
*rt_val = v;
|
||||||
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1325,12 +1328,16 @@ static ssize_t ac108_store(struct device *dev, struct device_attribute *attr, co
|
||||||
ac108_multi_write(reg, value_w, ac10x);
|
ac108_multi_write(reg, value_w, ac10x);
|
||||||
printk("Write 0x%02x to REG:0x%02x\n", value_w, reg);
|
printk("Write 0x%02x to REG:0x%02x\n", value_w, reg);
|
||||||
} else {
|
} else {
|
||||||
|
int k;
|
||||||
|
|
||||||
reg = (val >> 8) & 0xFF;
|
reg = (val >> 8) & 0xFF;
|
||||||
num = val & 0xff;
|
num = val & 0xff;
|
||||||
printk("\nRead: start REG:0x%02x,count:0x%02x\n", reg, num);
|
printk("\nRead: start REG:0x%02x,count:0x%02x\n", reg, num);
|
||||||
|
|
||||||
|
for (k = 0; k < ac10x->codec_cnt; k++) {
|
||||||
|
regcache_cache_bypass(ac10x->i2cmap[k], true);
|
||||||
|
}
|
||||||
do {
|
do {
|
||||||
int k;
|
|
||||||
|
|
||||||
memset(value_r, 0, sizeof value_r);
|
memset(value_r, 0, sizeof value_r);
|
||||||
|
|
||||||
|
@ -1348,6 +1355,9 @@ static ssize_t ac108_store(struct device *dev, struct device_attribute *attr, co
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
} while (i < num);
|
} while (i < num);
|
||||||
|
for (k = 0; k < ac10x->codec_cnt; k++) {
|
||||||
|
regcache_cache_bypass(ac10x->i2cmap[k], false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
|
@ -1429,15 +1439,17 @@ static int ac108_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *i
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ac10x_fill_regcache(&i2c->dev, ac10x->i2cmap[index]);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Writing this register with 0x12
|
* Writing this register with 0x12
|
||||||
* will resets all register to their default state.
|
* will resets all register to their default state.
|
||||||
*/
|
*/
|
||||||
|
regcache_cache_only(ac10x->i2cmap[index], false);
|
||||||
ret = regmap_write(ac10x->i2cmap[index], CHIP_RST, CHIP_RST_VAL);
|
ret = regmap_write(ac10x->i2cmap[index], CHIP_RST, CHIP_RST_VAL);
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
|
||||||
|
/* sync regcache for FLAT type */
|
||||||
|
ac10x_fill_regcache(&i2c->dev, ac10x->i2cmap[index]);
|
||||||
|
|
||||||
ac10x->codec_cnt++;
|
ac10x->codec_cnt++;
|
||||||
pr_err(" ac10x codec count : %d\n", ac10x->codec_cnt);
|
pr_err(" ac10x codec count : %d\n", ac10x->codec_cnt);
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@ cp seeed-8mic-voicecard.dtbo /boot/overlays
|
||||||
#install alsa plugins
|
#install alsa plugins
|
||||||
# no need this plugin now
|
# no need this plugin now
|
||||||
# install -D ac108_plugin/libasound_module_pcm_ac108.so /usr/lib/arm-linux-gnueabihf/alsa-lib/libasound_module_pcm_ac108.so
|
# install -D ac108_plugin/libasound_module_pcm_ac108.so /usr/lib/arm-linux-gnueabihf/alsa-lib/libasound_module_pcm_ac108.so
|
||||||
|
rm -f /usr/lib/arm-linux-gnueabihf/alsa-lib/libasound_module_pcm_ac108.so
|
||||||
|
|
||||||
#set kernel moduels
|
#set kernel moduels
|
||||||
grep -q "snd-soc-seeed-voicecard" /etc/modules || \
|
grep -q "snd-soc-seeed-voicecard" /etc/modules || \
|
||||||
|
|
Loading…
Reference in a new issue