Once we enable the sw_inject for a jack_kctl, the hw status change will be blocked, but the hw status still could be reported to snd_jack_report() and be saved to hw_status_cache. After the sw_inject is disabled, we use the last saved hw_status_cache to restore jack's status. Signed-off-by: Hui Wang <hui.wang@xxxxxxxxxxxxx> --- include/sound/jack.h | 1 + sound/core/jack.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/include/sound/jack.h b/include/sound/jack.h index 9eb2b5ec1ec4..1181f536557e 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -67,6 +67,7 @@ struct snd_jack { char name[100]; unsigned int key[6]; /* Keep in sync with definitions above */ #endif /* CONFIG_SND_JACK_INPUT_DEV */ + int hw_status_cache; void *private_data; void (*private_free)(struct snd_jack *); }; diff --git a/sound/core/jack.c b/sound/core/jack.c index 31c80883db2c..2c7fef94823d 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -193,8 +193,14 @@ static ssize_t sw_inject_enable_write(struct file *file, goto exit; } + if (jack_kctl->sw_inject_enable == (!!enable)) + goto exit; + jack_kctl->sw_inject_enable = !!enable; + if (!jack_kctl->sw_inject_enable) + snd_jack_report(jack_kctl->jack, jack_kctl->jack->hw_status_cache); + exit: kfree(buf); return ret; @@ -678,6 +684,8 @@ void snd_jack_report(struct snd_jack *jack, int status) if (!jack) return; + jack->hw_status_cache = status; + list_for_each_entry(jack_kctl, &jack->kctl_list, list) if (jack_kctl->sw_inject_enable) mask_bits |= jack_kctl->mask_bits; -- 2.25.1