aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/davinci/davinci-mcasp.c217
-rw-r--r--sound/soc/davinci/davinci-mcasp.h1
-rw-r--r--sound/soc/davinci/davinci-pcm.h10
3 files changed, 147 insertions, 81 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 4f75cac462d1..af92d3e8671d 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -37,6 +37,8 @@
37#include "davinci-pcm.h" 37#include "davinci-pcm.h"
38#include "davinci-mcasp.h" 38#include "davinci-mcasp.h"
39 39
40#define MCASP_MAX_AFIFO_DEPTH 64
41
40struct davinci_mcasp_context { 42struct davinci_mcasp_context {
41 u32 txfmtctl; 43 u32 txfmtctl;
42 u32 rxfmtctl; 44 u32 rxfmtctl;
@@ -269,25 +271,51 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
269{ 271{
270 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); 272 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
271 int ret = 0; 273 int ret = 0;
274 u32 data_delay;
275 bool fs_pol_rising;
276 bool inv_fs = false;
272 277
273 pm_runtime_get_sync(mcasp->dev); 278 pm_runtime_get_sync(mcasp->dev);
274 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 279 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
280 case SND_SOC_DAIFMT_DSP_A:
281 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
282 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
283 /* 1st data bit occur one ACLK cycle after the frame sync */
284 data_delay = 1;
285 break;
275 case SND_SOC_DAIFMT_DSP_B: 286 case SND_SOC_DAIFMT_DSP_B:
276 case SND_SOC_DAIFMT_AC97: 287 case SND_SOC_DAIFMT_AC97:
277 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR); 288 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
278 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR); 289 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
290 /* No delay after FS */
291 data_delay = 0;
279 break; 292 break;
280 default: 293 case SND_SOC_DAIFMT_I2S:
281 /* configure a full-word SYNC pulse (LRCLK) */ 294 /* configure a full-word SYNC pulse (LRCLK) */
282 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR); 295 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
283 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR); 296 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
284 297 /* 1st data bit occur one ACLK cycle after the frame sync */
285 /* make 1st data bit occur one ACLK cycle after the frame sync */ 298 data_delay = 1;
286 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(1)); 299 /* FS need to be inverted */
287 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(1)); 300 inv_fs = true;
301 break;
302 case SND_SOC_DAIFMT_LEFT_J:
303 /* configure a full-word SYNC pulse (LRCLK) */
304 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
305 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
306 /* No delay after FS */
307 data_delay = 0;
288 break; 308 break;
309 default:
310 ret = -EINVAL;
311 goto out;
289 } 312 }
290 313
314 mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
315 FSXDLY(3));
316 mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(data_delay),
317 FSRDLY(3));
318
291 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 319 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
292 case SND_SOC_DAIFMT_CBS_CFS: 320 case SND_SOC_DAIFMT_CBS_CFS:
293 /* codec is clock and frame slave */ 321 /* codec is clock and frame slave */
@@ -325,7 +353,6 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
325 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR); 353 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
326 mcasp->bclk_master = 0; 354 mcasp->bclk_master = 0;
327 break; 355 break;
328
329 default: 356 default:
330 ret = -EINVAL; 357 ret = -EINVAL;
331 goto out; 358 goto out;
@@ -334,39 +361,38 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
334 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 361 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
335 case SND_SOC_DAIFMT_IB_NF: 362 case SND_SOC_DAIFMT_IB_NF:
336 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL); 363 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
337 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
338
339 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL); 364 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
340 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL); 365 fs_pol_rising = true;
341 break; 366 break;
342
343 case SND_SOC_DAIFMT_NB_IF: 367 case SND_SOC_DAIFMT_NB_IF:
344 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL); 368 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
345 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
346
347 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL); 369 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
348 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL); 370 fs_pol_rising = false;
349 break; 371 break;
350
351 case SND_SOC_DAIFMT_IB_IF: 372 case SND_SOC_DAIFMT_IB_IF:
352 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL); 373 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
353 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
354
355 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL); 374 mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
356 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL); 375 fs_pol_rising = false;
357 break; 376 break;
358
359 case SND_SOC_DAIFMT_NB_NF: 377 case SND_SOC_DAIFMT_NB_NF:
360 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL); 378 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
361 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
362
363 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL); 379 mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
364 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL); 380 fs_pol_rising = true;
365 break; 381 break;
366
367 default: 382 default:
368 ret = -EINVAL; 383 ret = -EINVAL;
369 break; 384 goto out;
385 }
386
387 if (inv_fs)
388 fs_pol_rising = !fs_pol_rising;
389
390 if (fs_pol_rising) {
391 mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
392 mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
393 } else {
394 mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
395 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
370 } 396 }
371out: 397out:
372 pm_runtime_put_sync(mcasp->dev); 398 pm_runtime_put_sync(mcasp->dev);
@@ -464,17 +490,19 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
464} 490}
465 491
466static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, 492static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
467 int channels) 493 int period_words, int channels)
468{ 494{
495 struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[stream];
496 struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream];
469 int i; 497 int i;
470 u8 tx_ser = 0; 498 u8 tx_ser = 0;
471 u8 rx_ser = 0; 499 u8 rx_ser = 0;
472 u8 ser;
473 u8 slots = mcasp->tdm_slots; 500 u8 slots = mcasp->tdm_slots;
474 u8 max_active_serializers = (channels + slots - 1) / slots; 501 u8 max_active_serializers = (channels + slots - 1) / slots;
502 int active_serializers, numevt, n;
475 u32 reg; 503 u32 reg;
476 /* Default configuration */ 504 /* Default configuration */
477 if (mcasp->version != MCASP_VERSION_4) 505 if (mcasp->version < MCASP_VERSION_3)
478 mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT); 506 mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
479 507
480 /* All PINS as McASP */ 508 /* All PINS as McASP */
@@ -505,37 +533,71 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
505 } 533 }
506 } 534 }
507 535
508 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 536 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
509 ser = tx_ser; 537 active_serializers = tx_ser;
510 else 538 numevt = mcasp->txnumevt;
511 ser = rx_ser; 539 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
540 } else {
541 active_serializers = rx_ser;
542 numevt = mcasp->rxnumevt;
543 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
544 }
512 545
513 if (ser < max_active_serializers) { 546 if (active_serializers < max_active_serializers) {
514 dev_warn(mcasp->dev, "stream has more channels (%d) than are " 547 dev_warn(mcasp->dev, "stream has more channels (%d) than are "
515 "enabled in mcasp (%d)\n", channels, ser * slots); 548 "enabled in mcasp (%d)\n", channels,
549 active_serializers * slots);
516 return -EINVAL; 550 return -EINVAL;
517 } 551 }
518 552
519 if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) { 553 /* AFIFO is not in use */
520 if (mcasp->txnumevt * tx_ser > 64) 554 if (!numevt) {
521 mcasp->txnumevt = 1; 555 /* Configure the burst size for platform drivers */
522 556 if (active_serializers > 1) {
523 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET; 557 /*
524 mcasp_mod_bits(mcasp, reg, tx_ser, NUMDMA_MASK); 558 * If more than one serializers are in use we have one
525 mcasp_mod_bits(mcasp, reg, ((mcasp->txnumevt * tx_ser) << 8), 559 * DMA request to provide data for all serializers.
526 NUMEVT_MASK); 560 * For example if three serializers are enabled the DMA
561 * need to transfer three words per DMA request.
562 */
563 dma_params->fifo_level = active_serializers;
564 dma_data->maxburst = active_serializers;
565 } else {
566 dma_params->fifo_level = 0;
567 dma_data->maxburst = 0;
568 }
569 return 0;
527 } 570 }
528 571
529 if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { 572 if (period_words % active_serializers) {
530 if (mcasp->rxnumevt * rx_ser > 64) 573 dev_err(mcasp->dev, "Invalid combination of period words and "
531 mcasp->rxnumevt = 1; 574 "active serializers: %d, %d\n", period_words,
532 575 active_serializers);
533 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET; 576 return -EINVAL;
534 mcasp_mod_bits(mcasp, reg, rx_ser, NUMDMA_MASK);
535 mcasp_mod_bits(mcasp, reg, ((mcasp->rxnumevt * rx_ser) << 8),
536 NUMEVT_MASK);
537 } 577 }
538 578
579 /*
580 * Calculate the optimal AFIFO depth for platform side:
581 * The number of words for numevt need to be in steps of active
582 * serializers.
583 */
584 n = numevt % active_serializers;
585 if (n)
586 numevt += (active_serializers - n);
587 while (period_words % numevt && numevt > 0)
588 numevt -= active_serializers;
589 if (numevt <= 0)
590 numevt = active_serializers;
591
592 mcasp_mod_bits(mcasp, reg, active_serializers, NUMDMA_MASK);
593 mcasp_mod_bits(mcasp, reg, NUMEVT(numevt), NUMEVT_MASK);
594
595 /* Configure the burst size for platform drivers */
596 if (numevt == 1)
597 numevt = 0;
598 dma_params->fifo_level = numevt;
599 dma_data->maxburst = numevt;
600
539 return 0; 601 return 0;
540} 602}
541 603
@@ -607,27 +669,24 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
607 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); 669 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
608 struct davinci_pcm_dma_params *dma_params = 670 struct davinci_pcm_dma_params *dma_params =
609 &mcasp->dma_params[substream->stream]; 671 &mcasp->dma_params[substream->stream];
610 struct snd_dmaengine_dai_dma_data *dma_data =
611 &mcasp->dma_data[substream->stream];
612 int word_length; 672 int word_length;
613 u8 fifo_level;
614 u8 slots = mcasp->tdm_slots;
615 u8 active_serializers;
616 int channels = params_channels(params); 673 int channels = params_channels(params);
674 int period_size = params_period_size(params);
617 int ret; 675 int ret;
618 676
619 /* If mcasp is BCLK master we need to set BCLK divider */ 677 /* If mcasp is BCLK master we need to set BCLK divider */
620 if (mcasp->bclk_master) { 678 if (mcasp->bclk_master) {
621 unsigned int bclk_freq = snd_soc_params_to_bclk(params); 679 unsigned int bclk_freq = snd_soc_params_to_bclk(params);
622 if (mcasp->sysclk_freq % bclk_freq != 0) { 680 if (mcasp->sysclk_freq % bclk_freq != 0) {
623 dev_err(mcasp->dev, "Can't produce requred BCLK\n"); 681 dev_err(mcasp->dev, "Can't produce required BCLK\n");
624 return -EINVAL; 682 return -EINVAL;
625 } 683 }
626 davinci_mcasp_set_clkdiv( 684 davinci_mcasp_set_clkdiv(
627 cpu_dai, 1, mcasp->sysclk_freq / bclk_freq); 685 cpu_dai, 1, mcasp->sysclk_freq / bclk_freq);
628 } 686 }
629 687
630 ret = mcasp_common_hw_param(mcasp, substream->stream, channels); 688 ret = mcasp_common_hw_param(mcasp, substream->stream,
689 period_size * channels, channels);
631 if (ret) 690 if (ret)
632 return ret; 691 return ret;
633 692
@@ -671,21 +730,11 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
671 return -EINVAL; 730 return -EINVAL;
672 } 731 }
673 732
674 /* Calculate FIFO level */ 733 if (mcasp->version == MCASP_VERSION_2 && !dma_params->fifo_level)
675 active_serializers = (channels + slots - 1) / slots;
676 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
677 fifo_level = mcasp->txnumevt * active_serializers;
678 else
679 fifo_level = mcasp->rxnumevt * active_serializers;
680
681 if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
682 dma_params->acnt = 4; 734 dma_params->acnt = 4;
683 else 735 else
684 dma_params->acnt = dma_params->data_type; 736 dma_params->acnt = dma_params->data_type;
685 737
686 dma_params->fifo_level = fifo_level;
687 dma_data->maxburst = fifo_level;
688
689 davinci_config_channel_size(mcasp, word_length); 738 davinci_config_channel_size(mcasp, word_length);
690 739
691 return 0; 740 return 0;
@@ -716,22 +765,7 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
716 return ret; 765 return ret;
717} 766}
718 767
719static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
720 struct snd_soc_dai *dai)
721{
722 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
723
724 if (mcasp->version == MCASP_VERSION_4)
725 snd_soc_dai_set_dma_data(dai, substream,
726 &mcasp->dma_data[substream->stream]);
727 else
728 snd_soc_dai_set_dma_data(dai, substream, mcasp->dma_params);
729
730 return 0;
731}
732
733static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = { 768static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
734 .startup = davinci_mcasp_startup,
735 .trigger = davinci_mcasp_trigger, 769 .trigger = davinci_mcasp_trigger,
736 .hw_params = davinci_mcasp_hw_params, 770 .hw_params = davinci_mcasp_hw_params,
737 .set_fmt = davinci_mcasp_set_dai_fmt, 771 .set_fmt = davinci_mcasp_set_dai_fmt,
@@ -739,6 +773,25 @@ static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
739 .set_sysclk = davinci_mcasp_set_sysclk, 773 .set_sysclk = davinci_mcasp_set_sysclk,
740}; 774};
741 775
776static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai)
777{
778 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
779
780 if (mcasp->version == MCASP_VERSION_4) {
781 /* Using dmaengine PCM */
782 dai->playback_dma_data =
783 &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
784 dai->capture_dma_data =
785 &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
786 } else {
787 /* Using davinci-pcm */
788 dai->playback_dma_data = mcasp->dma_params;
789 dai->capture_dma_data = mcasp->dma_params;
790 }
791
792 return 0;
793}
794
742#ifdef CONFIG_PM_SLEEP 795#ifdef CONFIG_PM_SLEEP
743static int davinci_mcasp_suspend(struct snd_soc_dai *dai) 796static int davinci_mcasp_suspend(struct snd_soc_dai *dai)
744{ 797{
@@ -792,6 +845,7 @@ static int davinci_mcasp_resume(struct snd_soc_dai *dai)
792static struct snd_soc_dai_driver davinci_mcasp_dai[] = { 845static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
793 { 846 {
794 .name = "davinci-mcasp.0", 847 .name = "davinci-mcasp.0",
848 .probe = davinci_mcasp_dai_probe,
795 .suspend = davinci_mcasp_suspend, 849 .suspend = davinci_mcasp_suspend,
796 .resume = davinci_mcasp_resume, 850 .resume = davinci_mcasp_resume,
797 .playback = { 851 .playback = {
@@ -811,6 +865,7 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
811 }, 865 },
812 { 866 {
813 .name = "davinci-mcasp.1", 867 .name = "davinci-mcasp.1",
868 .probe = davinci_mcasp_dai_probe,
814 .playback = { 869 .playback = {
815 .channels_min = 1, 870 .channels_min = 1,
816 .channels_max = 384, 871 .channels_max = 384,
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
index 8fed757d6087..98fbc451892a 100644
--- a/sound/soc/davinci/davinci-mcasp.h
+++ b/sound/soc/davinci/davinci-mcasp.h
@@ -283,6 +283,7 @@
283 */ 283 */
284#define FIFO_ENABLE BIT(16) 284#define FIFO_ENABLE BIT(16)
285#define NUMEVT_MASK (0xFF << 8) 285#define NUMEVT_MASK (0xFF << 8)
286#define NUMEVT(x) (((x) & 0xFF) << 8)
286#define NUMDMA_MASK (0xFF) 287#define NUMDMA_MASK (0xFF)
287 288
288#endif /* DAVINCI_MCASP_H */ 289#endif /* DAVINCI_MCASP_H */
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h
index fbb710c76c08..5fd4737ab398 100644
--- a/sound/soc/davinci/davinci-pcm.h
+++ b/sound/soc/davinci/davinci-pcm.h
@@ -29,7 +29,17 @@ struct davinci_pcm_dma_params {
29 unsigned int fifo_level; 29 unsigned int fifo_level;
30}; 30};
31 31
32#if IS_ENABLED(CONFIG_SND_DAVINCI_SOC)
32int davinci_soc_platform_register(struct device *dev); 33int davinci_soc_platform_register(struct device *dev);
33void davinci_soc_platform_unregister(struct device *dev); 34void davinci_soc_platform_unregister(struct device *dev);
35#else
36static inline int davinci_soc_platform_register(struct device *dev)
37{
38 return 0;
39}
40static inline void davinci_soc_platform_unregister(struct device *dev)
41{
42}
43#endif /* CONFIG_SND_DAVINCI_SOC */
34 44
35#endif 45#endif