diff options
author | Mark Brown <broonie@kernel.org> | 2017-09-01 07:12:17 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-09-01 07:12:17 -0400 |
commit | 2e700424799ebe7731839efcee30a5a23525e7b5 (patch) | |
tree | 52b50f39c39a0d1185a3056f3b5b47640ff4938d | |
parent | ab99d9872e93e83fc2d992eeb8de7d9a128858eb (diff) | |
parent | 44c07365e9e2c87c7e04d63293618c391d1480ec (diff) |
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
-rw-r--r-- | include/sound/soc.h | 32 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 179 | ||||
-rw-r--r-- | sound/soc/soc-jack.c | 22 |
3 files changed, 177 insertions, 56 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index c4a8b1947566..feb896815069 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -469,10 +469,10 @@ int snd_soc_register_codec(struct device *dev, | |||
469 | struct snd_soc_dai_driver *dai_drv, int num_dai); | 469 | struct snd_soc_dai_driver *dai_drv, int num_dai); |
470 | void snd_soc_unregister_codec(struct device *dev); | 470 | void snd_soc_unregister_codec(struct device *dev); |
471 | int snd_soc_register_component(struct device *dev, | 471 | int snd_soc_register_component(struct device *dev, |
472 | const struct snd_soc_component_driver *cmpnt_drv, | 472 | const struct snd_soc_component_driver *component_driver, |
473 | struct snd_soc_dai_driver *dai_drv, int num_dai); | 473 | struct snd_soc_dai_driver *dai_drv, int num_dai); |
474 | int devm_snd_soc_register_component(struct device *dev, | 474 | int devm_snd_soc_register_component(struct device *dev, |
475 | const struct snd_soc_component_driver *cmpnt_drv, | 475 | const struct snd_soc_component_driver *component_driver, |
476 | struct snd_soc_dai_driver *dai_drv, int num_dai); | 476 | struct snd_soc_dai_driver *dai_drv, int num_dai); |
477 | void snd_soc_unregister_component(struct device *dev); | 477 | void snd_soc_unregister_component(struct device *dev); |
478 | int snd_soc_cache_init(struct snd_soc_codec *codec); | 478 | int snd_soc_cache_init(struct snd_soc_codec *codec); |
@@ -795,6 +795,14 @@ struct snd_soc_component_driver { | |||
795 | int (*suspend)(struct snd_soc_component *); | 795 | int (*suspend)(struct snd_soc_component *); |
796 | int (*resume)(struct snd_soc_component *); | 796 | int (*resume)(struct snd_soc_component *); |
797 | 797 | ||
798 | /* component wide operations */ | ||
799 | int (*set_sysclk)(struct snd_soc_component *component, | ||
800 | int clk_id, int source, unsigned int freq, int dir); | ||
801 | int (*set_pll)(struct snd_soc_component *component, int pll_id, | ||
802 | int source, unsigned int freq_in, unsigned int freq_out); | ||
803 | int (*set_jack)(struct snd_soc_component *component, | ||
804 | struct snd_soc_jack *jack, void *data); | ||
805 | |||
798 | /* DT */ | 806 | /* DT */ |
799 | int (*of_xlate_dai_name)(struct snd_soc_component *component, | 807 | int (*of_xlate_dai_name)(struct snd_soc_component *component, |
800 | struct of_phandle_args *args, | 808 | struct of_phandle_args *args, |
@@ -858,12 +866,6 @@ struct snd_soc_component { | |||
858 | /* Don't use these, use snd_soc_component_get_dapm() */ | 866 | /* Don't use these, use snd_soc_component_get_dapm() */ |
859 | struct snd_soc_dapm_context dapm; | 867 | struct snd_soc_dapm_context dapm; |
860 | 868 | ||
861 | const struct snd_kcontrol_new *controls; | ||
862 | unsigned int num_controls; | ||
863 | const struct snd_soc_dapm_widget *dapm_widgets; | ||
864 | unsigned int num_dapm_widgets; | ||
865 | const struct snd_soc_dapm_route *dapm_routes; | ||
866 | unsigned int num_dapm_routes; | ||
867 | struct snd_soc_codec *codec; | 869 | struct snd_soc_codec *codec; |
868 | 870 | ||
869 | int (*probe)(struct snd_soc_component *); | 871 | int (*probe)(struct snd_soc_component *); |
@@ -871,6 +873,13 @@ struct snd_soc_component { | |||
871 | int (*suspend)(struct snd_soc_component *); | 873 | int (*suspend)(struct snd_soc_component *); |
872 | int (*resume)(struct snd_soc_component *); | 874 | int (*resume)(struct snd_soc_component *); |
873 | 875 | ||
876 | int (*set_sysclk)(struct snd_soc_component *component, | ||
877 | int clk_id, int source, unsigned int freq, int dir); | ||
878 | int (*set_pll)(struct snd_soc_component *component, int pll_id, | ||
879 | int source, unsigned int freq_in, unsigned int freq_out); | ||
880 | int (*set_jack)(struct snd_soc_component *component, | ||
881 | struct snd_soc_jack *jack, void *data); | ||
882 | |||
874 | /* machine specific init */ | 883 | /* machine specific init */ |
875 | int (*init)(struct snd_soc_component *component); | 884 | int (*init)(struct snd_soc_component *component); |
876 | 885 | ||
@@ -1465,6 +1474,13 @@ void snd_soc_component_async_complete(struct snd_soc_component *component); | |||
1465 | int snd_soc_component_test_bits(struct snd_soc_component *component, | 1474 | int snd_soc_component_test_bits(struct snd_soc_component *component, |
1466 | unsigned int reg, unsigned int mask, unsigned int value); | 1475 | unsigned int reg, unsigned int mask, unsigned int value); |
1467 | 1476 | ||
1477 | /* component wide operations */ | ||
1478 | int snd_soc_component_set_sysclk(struct snd_soc_component *component, | ||
1479 | int clk_id, int source, unsigned int freq, int dir); | ||
1480 | int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id, | ||
1481 | int source, unsigned int freq_in, | ||
1482 | unsigned int freq_out); | ||
1483 | |||
1468 | #ifdef CONFIG_REGMAP | 1484 | #ifdef CONFIG_REGMAP |
1469 | 1485 | ||
1470 | void snd_soc_component_init_regmap(struct snd_soc_component *component, | 1486 | void snd_soc_component_init_regmap(struct snd_soc_component *component, |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 13c875e2392a..3d7287858609 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -1451,9 +1451,10 @@ static int soc_probe_component(struct snd_soc_card *card, | |||
1451 | 1451 | ||
1452 | soc_init_component_debugfs(component); | 1452 | soc_init_component_debugfs(component); |
1453 | 1453 | ||
1454 | if (component->dapm_widgets) { | 1454 | if (component->driver->dapm_widgets) { |
1455 | ret = snd_soc_dapm_new_controls(dapm, component->dapm_widgets, | 1455 | ret = snd_soc_dapm_new_controls(dapm, |
1456 | component->num_dapm_widgets); | 1456 | component->driver->dapm_widgets, |
1457 | component->driver->num_dapm_widgets); | ||
1457 | 1458 | ||
1458 | if (ret != 0) { | 1459 | if (ret != 0) { |
1459 | dev_err(component->dev, | 1460 | dev_err(component->dev, |
@@ -1495,12 +1496,14 @@ static int soc_probe_component(struct snd_soc_card *card, | |||
1495 | } | 1496 | } |
1496 | } | 1497 | } |
1497 | 1498 | ||
1498 | if (component->controls) | 1499 | if (component->driver->controls) |
1499 | snd_soc_add_component_controls(component, component->controls, | 1500 | snd_soc_add_component_controls(component, |
1500 | component->num_controls); | 1501 | component->driver->controls, |
1501 | if (component->dapm_routes) | 1502 | component->driver->num_controls); |
1502 | snd_soc_dapm_add_routes(dapm, component->dapm_routes, | 1503 | if (component->driver->dapm_routes) |
1503 | component->num_dapm_routes); | 1504 | snd_soc_dapm_add_routes(dapm, |
1505 | component->driver->dapm_routes, | ||
1506 | component->driver->num_dapm_routes); | ||
1504 | 1507 | ||
1505 | list_add(&dapm->list, &card->dapm_list); | 1508 | list_add(&dapm->list, &card->dapm_list); |
1506 | list_add(&component->card_list, &card->component_dev_list); | 1509 | list_add(&component->card_list, &card->component_dev_list); |
@@ -2587,11 +2590,9 @@ int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, | |||
2587 | { | 2590 | { |
2588 | if (dai->driver && dai->driver->ops->set_sysclk) | 2591 | if (dai->driver && dai->driver->ops->set_sysclk) |
2589 | return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir); | 2592 | return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir); |
2590 | else if (dai->codec && dai->codec->driver->set_sysclk) | 2593 | |
2591 | return dai->codec->driver->set_sysclk(dai->codec, clk_id, 0, | 2594 | return snd_soc_component_set_sysclk(dai->component, clk_id, 0, |
2592 | freq, dir); | 2595 | freq, dir); |
2593 | else | ||
2594 | return -ENOTSUPP; | ||
2595 | } | 2596 | } |
2596 | EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); | 2597 | EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); |
2597 | 2598 | ||
@@ -2617,6 +2618,32 @@ int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id, | |||
2617 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk); | 2618 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk); |
2618 | 2619 | ||
2619 | /** | 2620 | /** |
2621 | * snd_soc_component_set_sysclk - configure COMPONENT system or master clock. | ||
2622 | * @component: COMPONENT | ||
2623 | * @clk_id: DAI specific clock ID | ||
2624 | * @source: Source for the clock | ||
2625 | * @freq: new clock frequency in Hz | ||
2626 | * @dir: new clock direction - input/output. | ||
2627 | * | ||
2628 | * Configures the CODEC master (MCLK) or system (SYSCLK) clocking. | ||
2629 | */ | ||
2630 | int snd_soc_component_set_sysclk(struct snd_soc_component *component, int clk_id, | ||
2631 | int source, unsigned int freq, int dir) | ||
2632 | { | ||
2633 | /* will be removed */ | ||
2634 | if (component->set_sysclk) | ||
2635 | return component->set_sysclk(component, clk_id, source, | ||
2636 | freq, dir); | ||
2637 | |||
2638 | if (component->driver->set_sysclk) | ||
2639 | return component->driver->set_sysclk(component, clk_id, source, | ||
2640 | freq, dir); | ||
2641 | |||
2642 | return -ENOTSUPP; | ||
2643 | } | ||
2644 | EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk); | ||
2645 | |||
2646 | /** | ||
2620 | * snd_soc_dai_set_clkdiv - configure DAI clock dividers. | 2647 | * snd_soc_dai_set_clkdiv - configure DAI clock dividers. |
2621 | * @dai: DAI | 2648 | * @dai: DAI |
2622 | * @div_id: DAI specific clock divider ID | 2649 | * @div_id: DAI specific clock divider ID |
@@ -2652,11 +2679,9 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source, | |||
2652 | if (dai->driver && dai->driver->ops->set_pll) | 2679 | if (dai->driver && dai->driver->ops->set_pll) |
2653 | return dai->driver->ops->set_pll(dai, pll_id, source, | 2680 | return dai->driver->ops->set_pll(dai, pll_id, source, |
2654 | freq_in, freq_out); | 2681 | freq_in, freq_out); |
2655 | else if (dai->codec && dai->codec->driver->set_pll) | 2682 | |
2656 | return dai->codec->driver->set_pll(dai->codec, pll_id, source, | 2683 | return snd_soc_component_set_pll(dai->component, pll_id, source, |
2657 | freq_in, freq_out); | 2684 | freq_in, freq_out); |
2658 | else | ||
2659 | return -EINVAL; | ||
2660 | } | 2685 | } |
2661 | EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll); | 2686 | EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll); |
2662 | 2687 | ||
@@ -2681,6 +2706,33 @@ int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source, | |||
2681 | } | 2706 | } |
2682 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_pll); | 2707 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_pll); |
2683 | 2708 | ||
2709 | /* | ||
2710 | * snd_soc_component_set_pll - configure component PLL. | ||
2711 | * @component: COMPONENT | ||
2712 | * @pll_id: DAI specific PLL ID | ||
2713 | * @source: DAI specific source for the PLL | ||
2714 | * @freq_in: PLL input clock frequency in Hz | ||
2715 | * @freq_out: requested PLL output clock frequency in Hz | ||
2716 | * | ||
2717 | * Configures and enables PLL to generate output clock based on input clock. | ||
2718 | */ | ||
2719 | int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id, | ||
2720 | int source, unsigned int freq_in, | ||
2721 | unsigned int freq_out) | ||
2722 | { | ||
2723 | /* will be removed */ | ||
2724 | if (component->set_pll) | ||
2725 | return component->set_pll(component, pll_id, source, | ||
2726 | freq_in, freq_out); | ||
2727 | |||
2728 | if (component->driver->set_pll) | ||
2729 | return component->driver->set_pll(component, pll_id, source, | ||
2730 | freq_in, freq_out); | ||
2731 | |||
2732 | return -EINVAL; | ||
2733 | } | ||
2734 | EXPORT_SYMBOL_GPL(snd_soc_component_set_pll); | ||
2735 | |||
2684 | /** | 2736 | /** |
2685 | * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio. | 2737 | * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio. |
2686 | * @dai: DAI | 2738 | * @dai: DAI |
@@ -3171,6 +3223,9 @@ static int snd_soc_component_initialize(struct snd_soc_component *component, | |||
3171 | component->remove = component->driver->remove; | 3223 | component->remove = component->driver->remove; |
3172 | component->suspend = component->driver->suspend; | 3224 | component->suspend = component->driver->suspend; |
3173 | component->resume = component->driver->resume; | 3225 | component->resume = component->driver->resume; |
3226 | component->set_sysclk = component->driver->set_sysclk; | ||
3227 | component->set_pll = component->driver->set_pll; | ||
3228 | component->set_jack = component->driver->set_jack; | ||
3174 | 3229 | ||
3175 | dapm = &component->dapm; | 3230 | dapm = &component->dapm; |
3176 | dapm->dev = dev; | 3231 | dapm->dev = dev; |
@@ -3182,13 +3237,6 @@ static int snd_soc_component_initialize(struct snd_soc_component *component, | |||
3182 | if (driver->stream_event) | 3237 | if (driver->stream_event) |
3183 | dapm->stream_event = snd_soc_component_stream_event; | 3238 | dapm->stream_event = snd_soc_component_stream_event; |
3184 | 3239 | ||
3185 | component->controls = driver->controls; | ||
3186 | component->num_controls = driver->num_controls; | ||
3187 | component->dapm_widgets = driver->dapm_widgets; | ||
3188 | component->num_dapm_widgets = driver->num_dapm_widgets; | ||
3189 | component->dapm_routes = driver->dapm_routes; | ||
3190 | component->num_dapm_routes = driver->num_dapm_routes; | ||
3191 | |||
3192 | INIT_LIST_HEAD(&component->dai_list); | 3240 | INIT_LIST_HEAD(&component->dai_list); |
3193 | mutex_init(&component->io_mutex); | 3241 | mutex_init(&component->io_mutex); |
3194 | 3242 | ||
@@ -3280,40 +3328,40 @@ static void snd_soc_component_del_unlocked(struct snd_soc_component *component) | |||
3280 | } | 3328 | } |
3281 | 3329 | ||
3282 | int snd_soc_register_component(struct device *dev, | 3330 | int snd_soc_register_component(struct device *dev, |
3283 | const struct snd_soc_component_driver *cmpnt_drv, | 3331 | const struct snd_soc_component_driver *component_driver, |
3284 | struct snd_soc_dai_driver *dai_drv, | 3332 | struct snd_soc_dai_driver *dai_drv, |
3285 | int num_dai) | 3333 | int num_dai) |
3286 | { | 3334 | { |
3287 | struct snd_soc_component *cmpnt; | 3335 | struct snd_soc_component *component; |
3288 | int ret; | 3336 | int ret; |
3289 | 3337 | ||
3290 | cmpnt = kzalloc(sizeof(*cmpnt), GFP_KERNEL); | 3338 | component = kzalloc(sizeof(*component), GFP_KERNEL); |
3291 | if (!cmpnt) { | 3339 | if (!component) { |
3292 | dev_err(dev, "ASoC: Failed to allocate memory\n"); | 3340 | dev_err(dev, "ASoC: Failed to allocate memory\n"); |
3293 | return -ENOMEM; | 3341 | return -ENOMEM; |
3294 | } | 3342 | } |
3295 | 3343 | ||
3296 | ret = snd_soc_component_initialize(cmpnt, cmpnt_drv, dev); | 3344 | ret = snd_soc_component_initialize(component, component_driver, dev); |
3297 | if (ret) | 3345 | if (ret) |
3298 | goto err_free; | 3346 | goto err_free; |
3299 | 3347 | ||
3300 | cmpnt->ignore_pmdown_time = true; | 3348 | component->ignore_pmdown_time = true; |
3301 | cmpnt->registered_as_component = true; | 3349 | component->registered_as_component = true; |
3302 | 3350 | ||
3303 | ret = snd_soc_register_dais(cmpnt, dai_drv, num_dai, true); | 3351 | ret = snd_soc_register_dais(component, dai_drv, num_dai, true); |
3304 | if (ret < 0) { | 3352 | if (ret < 0) { |
3305 | dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret); | 3353 | dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret); |
3306 | goto err_cleanup; | 3354 | goto err_cleanup; |
3307 | } | 3355 | } |
3308 | 3356 | ||
3309 | snd_soc_component_add(cmpnt); | 3357 | snd_soc_component_add(component); |
3310 | 3358 | ||
3311 | return 0; | 3359 | return 0; |
3312 | 3360 | ||
3313 | err_cleanup: | 3361 | err_cleanup: |
3314 | snd_soc_component_cleanup(cmpnt); | 3362 | snd_soc_component_cleanup(component); |
3315 | err_free: | 3363 | err_free: |
3316 | kfree(cmpnt); | 3364 | kfree(component); |
3317 | return ret; | 3365 | return ret; |
3318 | } | 3366 | } |
3319 | EXPORT_SYMBOL_GPL(snd_soc_register_component); | 3367 | EXPORT_SYMBOL_GPL(snd_soc_register_component); |
@@ -3325,22 +3373,26 @@ EXPORT_SYMBOL_GPL(snd_soc_register_component); | |||
3325 | */ | 3373 | */ |
3326 | void snd_soc_unregister_component(struct device *dev) | 3374 | void snd_soc_unregister_component(struct device *dev) |
3327 | { | 3375 | { |
3328 | struct snd_soc_component *cmpnt; | 3376 | struct snd_soc_component *component; |
3377 | int found = 0; | ||
3329 | 3378 | ||
3330 | mutex_lock(&client_mutex); | 3379 | mutex_lock(&client_mutex); |
3331 | list_for_each_entry(cmpnt, &component_list, list) { | 3380 | list_for_each_entry(component, &component_list, list) { |
3332 | if (dev == cmpnt->dev && cmpnt->registered_as_component) | 3381 | if (dev != component->dev || |
3333 | goto found; | 3382 | !component->registered_as_component) |
3383 | continue; | ||
3384 | |||
3385 | snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL); | ||
3386 | snd_soc_component_del_unlocked(component); | ||
3387 | found = 1; | ||
3388 | break; | ||
3334 | } | 3389 | } |
3335 | mutex_unlock(&client_mutex); | 3390 | mutex_unlock(&client_mutex); |
3336 | return; | ||
3337 | 3391 | ||
3338 | found: | 3392 | if (found) { |
3339 | snd_soc_tplg_component_remove(cmpnt, SND_SOC_TPLG_INDEX_ALL); | 3393 | snd_soc_component_cleanup(component); |
3340 | snd_soc_component_del_unlocked(cmpnt); | 3394 | kfree(component); |
3341 | mutex_unlock(&client_mutex); | 3395 | } |
3342 | snd_soc_component_cleanup(cmpnt); | ||
3343 | kfree(cmpnt); | ||
3344 | } | 3396 | } |
3345 | EXPORT_SYMBOL_GPL(snd_soc_unregister_component); | 3397 | EXPORT_SYMBOL_GPL(snd_soc_unregister_component); |
3346 | 3398 | ||
@@ -3557,6 +3609,31 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component, | |||
3557 | return 0; | 3609 | return 0; |
3558 | } | 3610 | } |
3559 | 3611 | ||
3612 | static int snd_soc_codec_set_sysclk_(struct snd_soc_component *component, | ||
3613 | int clk_id, int source, unsigned int freq, int dir) | ||
3614 | { | ||
3615 | struct snd_soc_codec *codec = snd_soc_component_to_codec(component); | ||
3616 | |||
3617 | return snd_soc_codec_set_sysclk(codec, clk_id, source, freq, dir); | ||
3618 | } | ||
3619 | |||
3620 | static int snd_soc_codec_set_pll_(struct snd_soc_component *component, | ||
3621 | int pll_id, int source, unsigned int freq_in, | ||
3622 | unsigned int freq_out) | ||
3623 | { | ||
3624 | struct snd_soc_codec *codec = snd_soc_component_to_codec(component); | ||
3625 | |||
3626 | return snd_soc_codec_set_pll(codec, pll_id, source, freq_in, freq_out); | ||
3627 | } | ||
3628 | |||
3629 | static int snd_soc_codec_set_jack_(struct snd_soc_component *component, | ||
3630 | struct snd_soc_jack *jack, void *data) | ||
3631 | { | ||
3632 | struct snd_soc_codec *codec = snd_soc_component_to_codec(component); | ||
3633 | |||
3634 | return snd_soc_codec_set_jack(codec, jack, data); | ||
3635 | } | ||
3636 | |||
3560 | static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, | 3637 | static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, |
3561 | enum snd_soc_bias_level level) | 3638 | enum snd_soc_bias_level level) |
3562 | { | 3639 | { |
@@ -3608,6 +3685,12 @@ int snd_soc_register_codec(struct device *dev, | |||
3608 | codec->component.write = snd_soc_codec_drv_write; | 3685 | codec->component.write = snd_soc_codec_drv_write; |
3609 | if (codec_drv->read) | 3686 | if (codec_drv->read) |
3610 | codec->component.read = snd_soc_codec_drv_read; | 3687 | codec->component.read = snd_soc_codec_drv_read; |
3688 | if (codec_drv->set_sysclk) | ||
3689 | codec->component.set_sysclk = snd_soc_codec_set_sysclk_; | ||
3690 | if (codec_drv->set_pll) | ||
3691 | codec->component.set_pll = snd_soc_codec_set_pll_; | ||
3692 | if (codec_drv->set_jack) | ||
3693 | codec->component.set_jack = snd_soc_codec_set_jack_; | ||
3611 | codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time; | 3694 | codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time; |
3612 | 3695 | ||
3613 | dapm = snd_soc_codec_get_dapm(codec); | 3696 | dapm = snd_soc_codec_get_dapm(codec); |
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index 7daf21fee355..2f9f496ab14f 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c | |||
@@ -41,6 +41,28 @@ int snd_soc_codec_set_jack(struct snd_soc_codec *codec, | |||
41 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_jack); | 41 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_jack); |
42 | 42 | ||
43 | /** | 43 | /** |
44 | * snd_soc_component_set_jack - configure component jack. | ||
45 | * @component: COMPONENTs | ||
46 | * @jack: structure to use for the jack | ||
47 | * @data: can be used if codec driver need extra data for configuring jack | ||
48 | * | ||
49 | * Configures and enables jack detection function. | ||
50 | */ | ||
51 | int snd_soc_component_set_jack(struct snd_soc_component *component, | ||
52 | struct snd_soc_jack *jack, void *data) | ||
53 | { | ||
54 | /* will be removed */ | ||
55 | if (component->set_jack) | ||
56 | return component->set_jack(component, jack, data); | ||
57 | |||
58 | if (component->driver->set_jack) | ||
59 | return component->driver->set_jack(component, jack, data); | ||
60 | |||
61 | return -ENOTSUPP; | ||
62 | } | ||
63 | EXPORT_SYMBOL_GPL(snd_soc_component_set_jack); | ||
64 | |||
65 | /** | ||
44 | * snd_soc_card_jack_new - Create a new jack | 66 | * snd_soc_card_jack_new - Create a new jack |
45 | * @card: ASoC card | 67 | * @card: ASoC card |
46 | * @id: an identifying string for this jack | 68 | * @id: an identifying string for this jack |