ASoC: MAX9877: separate callback functions
The callback function to control register was used by whole controls in MAX9877 driver, but this causes using many if statement for double register control or invert. So, the callback function for double register control is separate differently, and the code for invert is added in the callback function. Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
ed0f19b237
commit
e458a48f87
|
@ -34,16 +34,16 @@ static int max9877_get_reg(struct snd_kcontrol *kcontrol,
|
||||||
{
|
{
|
||||||
struct soc_mixer_control *mc =
|
struct soc_mixer_control *mc =
|
||||||
(struct soc_mixer_control *)kcontrol->private_value;
|
(struct soc_mixer_control *)kcontrol->private_value;
|
||||||
int reg = mc->reg;
|
unsigned int reg = mc->reg;
|
||||||
int reg2 = mc->rreg;
|
unsigned int shift = mc->shift;
|
||||||
int shift = mc->shift;
|
unsigned int mask = mc->max;
|
||||||
int mask = mc->max;
|
unsigned int invert = mc->invert;
|
||||||
|
|
||||||
ucontrol->value.integer.value[0] = (max9877_regs[reg] >> shift) & mask;
|
ucontrol->value.integer.value[0] = (max9877_regs[reg] >> shift) & mask;
|
||||||
|
|
||||||
if (reg2)
|
if (invert)
|
||||||
ucontrol->value.integer.value[1] =
|
ucontrol->value.integer.value[0] =
|
||||||
(max9877_regs[reg2] >> shift) & mask;
|
mask - ucontrol->value.integer.value[0];
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -53,39 +53,69 @@ static int max9877_set_reg(struct snd_kcontrol *kcontrol,
|
||||||
{
|
{
|
||||||
struct soc_mixer_control *mc =
|
struct soc_mixer_control *mc =
|
||||||
(struct soc_mixer_control *)kcontrol->private_value;
|
(struct soc_mixer_control *)kcontrol->private_value;
|
||||||
int reg = mc->reg;
|
unsigned int reg = mc->reg;
|
||||||
int reg2 = mc->rreg;
|
unsigned int shift = mc->shift;
|
||||||
int shift = mc->shift;
|
unsigned int mask = mc->max;
|
||||||
int mask = mc->max;
|
unsigned int invert = mc->invert;
|
||||||
int change = 1;
|
unsigned int val = (ucontrol->value.integer.value[0] & mask);
|
||||||
int change2 = 1;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (((max9877_regs[reg] >> shift) & mask) ==
|
if (invert)
|
||||||
ucontrol->value.integer.value[0])
|
val = mask - val;
|
||||||
|
|
||||||
|
if (((max9877_regs[reg] >> shift) & mask) == val)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
max9877_regs[reg] &= ~(mask << shift);
|
||||||
|
max9877_regs[reg] |= val << shift;
|
||||||
|
max9877_write_regs();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int max9877_get_2reg(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
struct soc_mixer_control *mc =
|
||||||
|
(struct soc_mixer_control *)kcontrol->private_value;
|
||||||
|
unsigned int reg = mc->reg;
|
||||||
|
unsigned int reg2 = mc->rreg;
|
||||||
|
unsigned int shift = mc->shift;
|
||||||
|
unsigned int mask = mc->max;
|
||||||
|
|
||||||
|
ucontrol->value.integer.value[0] = (max9877_regs[reg] >> shift) & mask;
|
||||||
|
ucontrol->value.integer.value[1] = (max9877_regs[reg2] >> shift) & mask;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int max9877_set_2reg(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
struct soc_mixer_control *mc =
|
||||||
|
(struct soc_mixer_control *)kcontrol->private_value;
|
||||||
|
unsigned int reg = mc->reg;
|
||||||
|
unsigned int reg2 = mc->rreg;
|
||||||
|
unsigned int shift = mc->shift;
|
||||||
|
unsigned int mask = mc->max;
|
||||||
|
unsigned int val = (ucontrol->value.integer.value[0] & mask);
|
||||||
|
unsigned int val2 = (ucontrol->value.integer.value[1] & mask);
|
||||||
|
unsigned int change = 1;
|
||||||
|
|
||||||
|
if (((max9877_regs[reg] >> shift) & mask) == val)
|
||||||
change = 0;
|
change = 0;
|
||||||
|
|
||||||
if (reg2)
|
if (((max9877_regs[reg2] >> shift) & mask) == val2)
|
||||||
if (((max9877_regs[reg2] >> shift) & mask) ==
|
change = 0;
|
||||||
ucontrol->value.integer.value[1])
|
|
||||||
change2 = 0;
|
|
||||||
|
|
||||||
if (change) {
|
if (change) {
|
||||||
max9877_regs[reg] &= ~(mask << shift);
|
max9877_regs[reg] &= ~(mask << shift);
|
||||||
max9877_regs[reg] |= ucontrol->value.integer.value[0] << shift;
|
max9877_regs[reg] |= val << shift;
|
||||||
ret = change;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reg2 && change2) {
|
|
||||||
max9877_regs[reg2] &= ~(mask << shift);
|
max9877_regs[reg2] &= ~(mask << shift);
|
||||||
max9877_regs[reg2] |= ucontrol->value.integer.value[1] << shift;
|
max9877_regs[reg2] |= val2 << shift;
|
||||||
ret = change2;
|
max9877_write_regs();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret)
|
return change;
|
||||||
max9877_write_regs();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int max9877_get_out_mode(struct snd_kcontrol *kcontrol,
|
static int max9877_get_out_mode(struct snd_kcontrol *kcontrol,
|
||||||
|
@ -190,7 +220,7 @@ static const struct snd_kcontrol_new max9877_controls[] = {
|
||||||
max9877_get_reg, max9877_set_reg, max9877_output_tlv),
|
max9877_get_reg, max9877_set_reg, max9877_output_tlv),
|
||||||
SOC_DOUBLE_R_EXT_TLV("MAX9877 Amp HP Playback Volume",
|
SOC_DOUBLE_R_EXT_TLV("MAX9877 Amp HP Playback Volume",
|
||||||
MAX9877_HPL_VOLUME, MAX9877_HPR_VOLUME, 0, 31, 0,
|
MAX9877_HPL_VOLUME, MAX9877_HPR_VOLUME, 0, 31, 0,
|
||||||
max9877_get_reg, max9877_set_reg, max9877_output_tlv),
|
max9877_get_2reg, max9877_set_2reg, max9877_output_tlv),
|
||||||
SOC_SINGLE_EXT("MAX9877 INB Stereo Switch",
|
SOC_SINGLE_EXT("MAX9877 INB Stereo Switch",
|
||||||
MAX9877_INPUT_MODE, 4, 1, 1,
|
MAX9877_INPUT_MODE, 4, 1, 1,
|
||||||
max9877_get_reg, max9877_set_reg),
|
max9877_get_reg, max9877_set_reg),
|
||||||
|
|
Loading…
Reference in New Issue