mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
ASoC: rt5640: Add optional hp_det_gpio parameter to rt5640_detect_headset()
Some devices don't use the builtin jack-detect but can still benefit from the mic-bias-current over-current-detection headphones vs headset detection done by rt5640_detect_headset(). In this case the jack-inserted check done by rt5640_detect_headset() needs to be done through a GPIO rather then by using the codec's builtin jack-detect. Add an optional hp_det_gpio parameter and export rt5640_detect_headset() for use on machines where jack-detect is handled outside of the codec. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20210819190543.784415-4-hdegoede@redhat.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
15d54840ec
commit
d21213b450
@ -2241,7 +2241,7 @@ static void rt5640_button_press_work(struct work_struct *work)
|
||||
schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME));
|
||||
}
|
||||
|
||||
static int rt5640_detect_headset(struct snd_soc_component *component)
|
||||
int rt5640_detect_headset(struct snd_soc_component *component, struct gpio_desc *hp_det_gpio)
|
||||
{
|
||||
int i, headset_count = 0, headphone_count = 0;
|
||||
|
||||
@ -2259,8 +2259,13 @@ static int rt5640_detect_headset(struct snd_soc_component *component)
|
||||
msleep(JACK_SETTLE_TIME);
|
||||
|
||||
/* Check the jack is still connected before checking ovcd */
|
||||
if (!rt5640_jack_inserted(component))
|
||||
return 0;
|
||||
if (hp_det_gpio) {
|
||||
if (gpiod_get_value_cansleep(hp_det_gpio))
|
||||
return 0;
|
||||
} else {
|
||||
if (!rt5640_jack_inserted(component))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rt5640_micbias1_ovcd(component)) {
|
||||
/*
|
||||
@ -2285,6 +2290,7 @@ static int rt5640_detect_headset(struct snd_soc_component *component)
|
||||
dev_err(component->dev, "Error detecting headset vs headphones, bad contact?, assuming headphones\n");
|
||||
return SND_JACK_HEADPHONE;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt5640_detect_headset);
|
||||
|
||||
static void rt5640_jack_work(struct work_struct *work)
|
||||
{
|
||||
@ -2309,7 +2315,7 @@ static void rt5640_jack_work(struct work_struct *work)
|
||||
/* Jack inserted */
|
||||
WARN_ON(rt5640->ovcd_irq_enabled);
|
||||
rt5640_enable_micbias1_for_ovcd(component);
|
||||
status = rt5640_detect_headset(component);
|
||||
status = rt5640_detect_headset(component, NULL);
|
||||
if (status == SND_JACK_HEADSET) {
|
||||
/* Enable ovcd IRQ for button press detect. */
|
||||
rt5640_enable_micbias1_ovcd_irq(component);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define _RT5640_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <dt-bindings/sound/rt5640.h>
|
||||
|
||||
@ -2156,5 +2157,6 @@ int rt5640_dmic_enable(struct snd_soc_component *component,
|
||||
bool dmic1_data_pin, bool dmic2_data_pin);
|
||||
int rt5640_sel_asrc_clk_src(struct snd_soc_component *component,
|
||||
unsigned int filter_mask, unsigned int clk_src);
|
||||
int rt5640_detect_headset(struct snd_soc_component *component, struct gpio_desc *hp_det_gpio);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user