aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2017-09-01 07:12:17 -0400
committerMark Brown <broonie@kernel.org>2017-09-01 07:12:17 -0400
commit2e700424799ebe7731839efcee30a5a23525e7b5 (patch)
tree52b50f39c39a0d1185a3056f3b5b47640ff4938d
parentab99d9872e93e83fc2d992eeb8de7d9a128858eb (diff)
parent44c07365e9e2c87c7e04d63293618c391d1480ec (diff)
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
-rw-r--r--include/sound/soc.h32
-rw-r--r--sound/soc/soc-core.c179
-rw-r--r--sound/soc/soc-jack.c22
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);
470void snd_soc_unregister_codec(struct device *dev); 470void snd_soc_unregister_codec(struct device *dev);
471int snd_soc_register_component(struct device *dev, 471int 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);
474int devm_snd_soc_register_component(struct device *dev, 474int 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);
477void snd_soc_unregister_component(struct device *dev); 477void snd_soc_unregister_component(struct device *dev);
478int snd_soc_cache_init(struct snd_soc_codec *codec); 478int 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);
1465int snd_soc_component_test_bits(struct snd_soc_component *component, 1474int 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 */
1478int snd_soc_component_set_sysclk(struct snd_soc_component *component,
1479 int clk_id, int source, unsigned int freq, int dir);
1480int 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
1470void snd_soc_component_init_regmap(struct snd_soc_component *component, 1486void 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}
2596EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); 2597EXPORT_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,
2617EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk); 2618EXPORT_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 */
2630int 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}
2644EXPORT_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}
2661EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll); 2686EXPORT_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}
2682EXPORT_SYMBOL_GPL(snd_soc_codec_set_pll); 2707EXPORT_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 */
2719int 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}
2734EXPORT_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
3282int snd_soc_register_component(struct device *dev, 3330int 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
3313err_cleanup: 3361err_cleanup:
3314 snd_soc_component_cleanup(cmpnt); 3362 snd_soc_component_cleanup(component);
3315err_free: 3363err_free:
3316 kfree(cmpnt); 3364 kfree(component);
3317 return ret; 3365 return ret;
3318} 3366}
3319EXPORT_SYMBOL_GPL(snd_soc_register_component); 3367EXPORT_SYMBOL_GPL(snd_soc_register_component);
@@ -3325,22 +3373,26 @@ EXPORT_SYMBOL_GPL(snd_soc_register_component);
3325 */ 3373 */
3326void snd_soc_unregister_component(struct device *dev) 3374void 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
3338found: 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}
3345EXPORT_SYMBOL_GPL(snd_soc_unregister_component); 3397EXPORT_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
3612static 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
3620static 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
3629static 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
3560static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, 3637static 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,
41EXPORT_SYMBOL_GPL(snd_soc_codec_set_jack); 41EXPORT_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 */
51int 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}
63EXPORT_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