ASoC: refactor snd_soc_update_bits()

Introduce a wrapper call snd_soc_update_bits_locked()
that will take the codec mutex. This call is used
when the codec mutex is not already taken.

Drivers calling snd_soc_update_bits() may wish to
make sure the codec mutex is taken from the driver.

Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Eero Nurkkala 2009-10-30 13:34:03 +02:00 committed by Mark Brown
parent 8538a119bf
commit 6c508c62f9

View File

@ -1355,6 +1355,30 @@ int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
} }
EXPORT_SYMBOL_GPL(snd_soc_update_bits); EXPORT_SYMBOL_GPL(snd_soc_update_bits);
/**
* snd_soc_update_bits_locked - update codec register bits
* @codec: audio codec
* @reg: codec register
* @mask: register mask
* @value: new value
*
* Writes new register value, and takes the codec mutex.
*
* Returns 1 for change else 0.
*/
static int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
unsigned short reg, unsigned int mask,
unsigned int value)
{
int change;
mutex_lock(&codec->mutex);
change = snd_soc_update_bits(codec, reg, mask, value);
mutex_unlock(&codec->mutex);
return change;
}
/** /**
* snd_soc_test_bits - test register for change * snd_soc_test_bits - test register for change
* @codec: audio codec * @codec: audio codec
@ -1706,7 +1730,7 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
mask |= (bitmask - 1) << e->shift_r; mask |= (bitmask - 1) << e->shift_r;
} }
return snd_soc_update_bits(codec, e->reg, mask, val); return snd_soc_update_bits_locked(codec, e->reg, mask, val);
} }
EXPORT_SYMBOL_GPL(snd_soc_put_enum_double); EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
@ -1780,7 +1804,7 @@ int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
mask |= e->mask << e->shift_r; mask |= e->mask << e->shift_r;
} }
return snd_soc_update_bits(codec, e->reg, mask, val); return snd_soc_update_bits_locked(codec, e->reg, mask, val);
} }
EXPORT_SYMBOL_GPL(snd_soc_put_value_enum_double); EXPORT_SYMBOL_GPL(snd_soc_put_value_enum_double);
@ -1941,7 +1965,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
val_mask |= mask << rshift; val_mask |= mask << rshift;
val |= val2 << rshift; val |= val2 << rshift;
} }
return snd_soc_update_bits(codec, reg, val_mask, val); return snd_soc_update_bits_locked(codec, reg, val_mask, val);
} }
EXPORT_SYMBOL_GPL(snd_soc_put_volsw); EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
@ -2047,11 +2071,11 @@ int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
val = val << shift; val = val << shift;
val2 = val2 << shift; val2 = val2 << shift;
err = snd_soc_update_bits(codec, reg, val_mask, val); err = snd_soc_update_bits_locked(codec, reg, val_mask, val);
if (err < 0) if (err < 0)
return err; return err;
err = snd_soc_update_bits(codec, reg2, val_mask, val2); err = snd_soc_update_bits_locked(codec, reg2, val_mask, val2);
return err; return err;
} }
EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r); EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
@ -2130,7 +2154,7 @@ int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
val = (ucontrol->value.integer.value[0]+min) & 0xff; val = (ucontrol->value.integer.value[0]+min) & 0xff;
val |= ((ucontrol->value.integer.value[1]+min) & 0xff) << 8; val |= ((ucontrol->value.integer.value[1]+min) & 0xff) << 8;
return snd_soc_update_bits(codec, reg, 0xffff, val); return snd_soc_update_bits_locked(codec, reg, 0xffff, val);
} }
EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8); EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8);