ALSA: hda/cs8409: Simplify CS42L42 jack detect.
Cleanup interrupt masks. Remove unnecessary read/writes. Ensure Tip Sense/Type Detection interrupts are enabled/disabled when needed. Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com> Signed-off-by: Vitaly Rodionov <vitalyr@opensource.cirrus.com> Link: https://lore.kernel.org/r/20210811185654.6837-11-vitalyr@opensource.cirrus.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
1e0a975a8a
Коммит
db0ae848a9
|
@ -406,10 +406,8 @@ static void cs8409_cs42l42_enable_jack_detect(struct hda_codec *codec)
|
|||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b71, 0x00C0, 1);
|
||||
/* Clear interrupts status */
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b7b, 1);
|
||||
/* Enable interrupt */
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1320, 0x03, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b79, 0x00, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1320, 0xF3, 1);
|
||||
|
||||
mutex_unlock(&spec->cs8409_i2c_mux);
|
||||
}
|
||||
|
@ -424,11 +422,13 @@ static void cs8409_cs42l42_run_jack_detect(struct hda_codec *codec)
|
|||
/* Clear interrupts */
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1308, 1);
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b77, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1320, 0xFF, 1);
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
|
||||
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1102, 0x87, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1f06, 0x86, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b74, 0x07, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x131b, 0x01, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x131b, 0xFD, 1);
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1120, 0x80, 1);
|
||||
/* Wait ~110ms*/
|
||||
usleep_range(110000, 200000);
|
||||
|
@ -487,9 +487,6 @@ static void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
|
|||
reg_hs_status = cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1124, 1);
|
||||
reg_ts_status = cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
|
||||
|
||||
/* Clear interrupts, by reading interrupt status registers */
|
||||
cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b7b, 1);
|
||||
|
||||
mutex_unlock(&spec->cs8409_i2c_mux);
|
||||
|
||||
/* If status values are < 0, read error has occurred. */
|
||||
|
@ -499,6 +496,11 @@ static void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
|
|||
/* HSDET_AUTO_DONE */
|
||||
if (reg_cdc_status & CS42L42_HSDET_AUTO_DONE) {
|
||||
|
||||
mutex_lock(&spec->cs8409_i2c_mux);
|
||||
/* Disable HSDET_AUTO_DONE */
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x131b, 0xFF, 1);
|
||||
mutex_unlock(&spec->cs8409_i2c_mux);
|
||||
|
||||
type = ((reg_hs_status & CS42L42_HSTYPE_MASK) + 1);
|
||||
/* CS42L42 reports optical jack as type 4
|
||||
* We don't handle optical jack
|
||||
|
@ -521,6 +523,11 @@ static void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
|
|||
}
|
||||
}
|
||||
|
||||
mutex_lock(&spec->cs8409_i2c_mux);
|
||||
/* Re-Enable Tip Sense Interrupt */
|
||||
cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1320, 0xF3, 1);
|
||||
mutex_unlock(&spec->cs8409_i2c_mux);
|
||||
|
||||
} else {
|
||||
/* TIP_SENSE INSERT/REMOVE */
|
||||
switch (reg_ts_status) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче