diff --git a/include/sound/soc.h b/include/sound/soc.h index 23681538c849e5422574531e68693bbb03a31031..feb896815069eb2851d6ef045d0333f0b9b7d90f 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -800,6 +800,8 @@ struct snd_soc_component_driver { int clk_id, int source, unsigned int freq, int dir); int (*set_pll)(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out); + int (*set_jack)(struct snd_soc_component *component, + struct snd_soc_jack *jack, void *data); /* DT */ int (*of_xlate_dai_name)(struct snd_soc_component *component, @@ -875,6 +877,8 @@ struct snd_soc_component { int clk_id, int source, unsigned int freq, int dir); int (*set_pll)(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out); + int (*set_jack)(struct snd_soc_component *component, + struct snd_soc_jack *jack, void *data); /* machine specific init */ int (*init)(struct snd_soc_component *component); diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index ee641cd8aa225ecc5e6385579ceb76327abfed97..3d728785860984fecbdde181b7cef27291346e6f 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3225,6 +3225,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component, component->resume = component->driver->resume; component->set_sysclk = component->driver->set_sysclk; component->set_pll = component->driver->set_pll; + component->set_jack = component->driver->set_jack; dapm = &component->dapm; dapm->dev = dev; @@ -3625,6 +3626,14 @@ static int snd_soc_codec_set_pll_(struct snd_soc_component *component, return snd_soc_codec_set_pll(codec, pll_id, source, freq_in, freq_out); } +static int snd_soc_codec_set_jack_(struct snd_soc_component *component, + struct snd_soc_jack *jack, void *data) +{ + struct snd_soc_codec *codec = snd_soc_component_to_codec(component); + + return snd_soc_codec_set_jack(codec, jack, data); +} + static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) { @@ -3680,6 +3689,8 @@ int snd_soc_register_codec(struct device *dev, codec->component.set_sysclk = snd_soc_codec_set_sysclk_; if (codec_drv->set_pll) codec->component.set_pll = snd_soc_codec_set_pll_; + if (codec_drv->set_jack) + codec->component.set_jack = snd_soc_codec_set_jack_; codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time; dapm = snd_soc_codec_get_dapm(codec); diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index 7daf21fee355b22c0a522d51c3de723fd6b7a1fd..2f9f496ab14fdde937e43b108d62c01e90f76266 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -40,6 +40,28 @@ int snd_soc_codec_set_jack(struct snd_soc_codec *codec, } EXPORT_SYMBOL_GPL(snd_soc_codec_set_jack); +/** + * snd_soc_component_set_jack - configure component jack. + * @component: COMPONENTs + * @jack: structure to use for the jack + * @data: can be used if codec driver need extra data for configuring jack + * + * Configures and enables jack detection function. + */ +int snd_soc_component_set_jack(struct snd_soc_component *component, + struct snd_soc_jack *jack, void *data) +{ + /* will be removed */ + if (component->set_jack) + return component->set_jack(component, jack, data); + + if (component->driver->set_jack) + return component->driver->set_jack(component, jack, data); + + return -ENOTSUPP; +} +EXPORT_SYMBOL_GPL(snd_soc_component_set_jack); + /** * snd_soc_card_jack_new - Create a new jack * @card: ASoC card