sound control: add register cache

bump to version 3.2

Signed-off-by: Paul Reioux <reioux@gmail.com>
Signed-off-by: flar2 <asegaert@gmail.com>
This commit is contained in:
Paul Reioux 2013-11-30 01:05:41 -06:00 committed by followmsi
parent 54d75c8c36
commit 8c16800486
2 changed files with 106 additions and 8 deletions

View file

@ -22,7 +22,9 @@
#include <linux/mfd/wcd9xxx/wcd9310_registers.h> #include <linux/mfd/wcd9xxx/wcd9310_registers.h>
#define SOUND_CONTROL_MAJOR_VERSION 3 #define SOUND_CONTROL_MAJOR_VERSION 3
#define SOUND_CONTROL_MINOR_VERSION 1 #define SOUND_CONTROL_MINOR_VERSION 2
#define REG_SZ 21
extern struct snd_soc_codec *fauxsound_codec_ptr; extern struct snd_soc_codec *fauxsound_codec_ptr;
@ -32,7 +34,96 @@ unsigned int tabla_read(struct snd_soc_codec *codec, unsigned int reg);
int tabla_write(struct snd_soc_codec *codec, unsigned int reg, int tabla_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value); unsigned int value);
int reg_access(unsigned int reg)
static unsigned int cached_regs[] = {6, 6, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0 };
static unsigned int *cache_select(unsigned int reg)
{
unsigned int *out = NULL;
switch (reg) {
case TABLA_A_RX_HPH_L_GAIN:
out = &cached_regs[0];
break;
case TABLA_A_RX_HPH_R_GAIN:
out = &cached_regs[1];
break;
case TABLA_A_CDC_RX1_VOL_CTL_B2_CTL:
out = &cached_regs[4];
break;
case TABLA_A_CDC_RX2_VOL_CTL_B2_CTL:
out = &cached_regs[5];
break;
case TABLA_A_CDC_RX3_VOL_CTL_B2_CTL:
out = &cached_regs[6];
break;
case TABLA_A_CDC_RX4_VOL_CTL_B2_CTL:
out = &cached_regs[7];
break;
case TABLA_A_CDC_RX5_VOL_CTL_B2_CTL:
out = &cached_regs[8];
break;
case TABLA_A_CDC_RX6_VOL_CTL_B2_CTL:
out = &cached_regs[9];
break;
case TABLA_A_CDC_RX7_VOL_CTL_B2_CTL:
out = &cached_regs[10];
break;
case TABLA_A_CDC_TX1_VOL_CTL_GAIN:
out = &cached_regs[11];
break;
case TABLA_A_CDC_TX2_VOL_CTL_GAIN:
out = &cached_regs[12];
break;
case TABLA_A_CDC_TX3_VOL_CTL_GAIN:
out = &cached_regs[13];
break;
case TABLA_A_CDC_TX4_VOL_CTL_GAIN:
out = &cached_regs[14];
break;
case TABLA_A_CDC_TX5_VOL_CTL_GAIN:
out = &cached_regs[15];
break;
case TABLA_A_CDC_TX6_VOL_CTL_GAIN:
out = &cached_regs[16];
break;
case TABLA_A_CDC_TX7_VOL_CTL_GAIN:
out = &cached_regs[17];
break;
case TABLA_A_CDC_TX8_VOL_CTL_GAIN:
out = &cached_regs[18];
break;
case TABLA_A_CDC_TX9_VOL_CTL_GAIN:
out = &cached_regs[19];
break;
case TABLA_A_CDC_TX10_VOL_CTL_GAIN:
out = &cached_regs[20];
break;
}
return out;
}
void snd_hax_cache_write(unsigned int reg, unsigned int value)
{
unsigned int *tmp = cache_select(reg);
if (tmp != NULL)
*tmp = value;
}
EXPORT_SYMBOL(snd_hax_cache_write);
unsigned int snd_hax_cache_read(unsigned int reg)
{
if (cache_select(reg) != NULL)
return *cache_select(reg);
else
return -1;
}
EXPORT_SYMBOL(snd_hax_cache_read);
int snd_hax_reg_access(unsigned int reg)
{ {
int ret = 1; int ret = 1;
@ -66,7 +157,7 @@ int reg_access(unsigned int reg)
} }
return ret; return ret;
} }
EXPORT_SYMBOL(reg_access); EXPORT_SYMBOL(snd_hax_reg_access);
static bool calc_checksum(unsigned int a, unsigned int b, unsigned int c) static bool calc_checksum(unsigned int a, unsigned int b, unsigned int c)
{ {
@ -217,7 +308,8 @@ static ssize_t headphone_pa_gain_store(struct kobject *kobj,
return count; return count;
} }
static ssize_t sound_control_version_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) static ssize_t sound_control_version_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{ {
return sprintf(buf, "version: %u.%u\n", return sprintf(buf, "version: %u.%u\n",
SOUND_CONTROL_MAJOR_VERSION, SOUND_CONTROL_MAJOR_VERSION,

View file

@ -3938,7 +3938,9 @@ static int tabla_volatile(struct snd_soc_codec *ssc, unsigned int reg)
#define TABLA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) #define TABLA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE)
#ifdef CONFIG_SOUND_CONTROL_HAX_3_GPL #ifdef CONFIG_SOUND_CONTROL_HAX_3_GPL
extern int reg_access(unsigned int reg); extern int snd_hax_reg_access(unsigned int);
extern unsigned int snd_hax_cache_read(unsigned int);
extern void snd_hax_cache_write(unsigned int, unsigned int);
#endif #endif
#ifndef CONFIG_SOUND_CONTROL_HAX_3_GPL #ifndef CONFIG_SOUND_CONTROL_HAX_3_GPL
@ -3989,10 +3991,14 @@ int tabla_write(struct snd_soc_codec *codec, unsigned int reg,
reg, ret); reg, ret);
} }
#ifdef CONFIG_SOUND_CONTROL_HAX_3_GPL #ifdef CONFIG_SOUND_CONTROL_HAX_3_GPL
if (!reg_access(reg)) if (!snd_hax_reg_access(reg)) {
if (!((val = snd_hax_cache_read(reg)) != -1)) {
val = wcd9xxx_reg_read_safe(codec->control_data, reg); val = wcd9xxx_reg_read_safe(codec->control_data, reg);
else }
} else {
snd_hax_cache_write(reg, value);
val = value; val = value;
}
return wcd9xxx_reg_write(codec->control_data, reg, val); return wcd9xxx_reg_write(codec->control_data, reg, val);
#else #else
return wcd9xxx_reg_write(codec->control_data, reg, value); return wcd9xxx_reg_write(codec->control_data, reg, value);