Commit 65ec1cd1e2c6228752d2f167b01e6d291014d249

Authored by Mark Brown

ASoC: Merge dai_ops factor out

Merge Eric Maio's patch to merge snd_soc_dai_ops out of line.  Fixed
merge issues and updated drivers, plus an issue with the ops for the two
s3c2443 AC97 DAIs having been merged.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

Showing 42 changed files Side-by-side Diff

include/sound/soc-dai.h
... ... @@ -203,7 +203,7 @@
203 203 int (*resume)(struct snd_soc_dai *dai);
204 204  
205 205 /* ops */
206   - struct snd_soc_dai_ops ops;
  206 + struct snd_soc_dai_ops *ops;
207 207  
208 208 /* DAI capabilities */
209 209 struct snd_soc_pcm_stream capture;
sound/soc/atmel/atmel_ssc_dai.c
... ... @@ -697,6 +697,15 @@
697 697 #define ATMEL_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
698 698 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
699 699  
  700 +static struct snd_soc_dai_ops atmel_ssc_dai_ops = {
  701 + .startup = atmel_ssc_startup,
  702 + .shutdown = atmel_ssc_shutdown,
  703 + .prepare = atmel_ssc_prepare,
  704 + .hw_params = atmel_ssc_hw_params,
  705 + .set_fmt = atmel_ssc_set_dai_fmt,
  706 + .set_clkdiv = atmel_ssc_set_dai_clkdiv,
  707 +};
  708 +
700 709 struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
701 710 { .name = "atmel-ssc0",
702 711 .id = 0,
... ... @@ -712,13 +721,7 @@
712 721 .channels_max = 2,
713 722 .rates = ATMEL_SSC_RATES,
714 723 .formats = ATMEL_SSC_FORMATS,},
715   - .ops = {
716   - .startup = atmel_ssc_startup,
717   - .shutdown = atmel_ssc_shutdown,
718   - .prepare = atmel_ssc_prepare,
719   - .hw_params = atmel_ssc_hw_params,
720   - .set_fmt = atmel_ssc_set_dai_fmt,
721   - .set_clkdiv = atmel_ssc_set_dai_clkdiv,},
  724 + .ops = &atmel_ssc_dai_ops,
722 725 .private_data = &ssc_info[0],
723 726 },
724 727 #if NUM_SSC_DEVICES == 3
... ... @@ -736,13 +739,7 @@
736 739 .channels_max = 2,
737 740 .rates = ATMEL_SSC_RATES,
738 741 .formats = ATMEL_SSC_FORMATS,},
739   - .ops = {
740   - .startup = atmel_ssc_startup,
741   - .shutdown = atmel_ssc_shutdown,
742   - .prepare = atmel_ssc_prepare,
743   - .hw_params = atmel_ssc_hw_params,
744   - .set_fmt = atmel_ssc_set_dai_fmt,
745   - .set_clkdiv = atmel_ssc_set_dai_clkdiv,},
  742 + .ops = &atmel_ssc_dai_ops,
746 743 .private_data = &ssc_info[1],
747 744 },
748 745 { .name = "atmel-ssc2",
... ... @@ -759,13 +756,7 @@
759 756 .channels_max = 2,
760 757 .rates = ATMEL_SSC_RATES,
761 758 .formats = ATMEL_SSC_FORMATS,},
762   - .ops = {
763   - .startup = atmel_ssc_startup,
764   - .shutdown = atmel_ssc_shutdown,
765   - .prepare = atmel_ssc_prepare,
766   - .hw_params = atmel_ssc_hw_params,
767   - .set_fmt = atmel_ssc_set_dai_fmt,
768   - .set_clkdiv = atmel_ssc_set_dai_clkdiv,},
  759 + .ops = &atmel_ssc_dai_ops,
769 760 .private_data = &ssc_info[2],
770 761 },
771 762 #endif
sound/soc/au1x/psc-ac97.c
... ... @@ -342,6 +342,11 @@
342 342 return 0;
343 343 }
344 344  
  345 +static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = {
  346 + .trigger = au1xpsc_ac97_trigger,
  347 + .hw_params = au1xpsc_ac97_hw_params,
  348 +};
  349 +
345 350 struct snd_soc_dai au1xpsc_ac97_dai = {
346 351 .name = "au1xpsc_ac97",
347 352 .ac97_control = 1,
... ... @@ -361,10 +366,7 @@
361 366 .channels_min = 2,
362 367 .channels_max = 2,
363 368 },
364   - .ops = {
365   - .trigger = au1xpsc_ac97_trigger,
366   - .hw_params = au1xpsc_ac97_hw_params,
367   - },
  369 + .ops = &au1xpsc_ac97_dai_ops,
368 370 };
369 371 EXPORT_SYMBOL_GPL(au1xpsc_ac97_dai);
370 372  
sound/soc/au1x/psc-i2s.c
... ... @@ -367,6 +367,12 @@
367 367 return 0;
368 368 }
369 369  
  370 +static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = {
  371 + .trigger = au1xpsc_i2s_trigger,
  372 + .hw_params = au1xpsc_i2s_hw_params,
  373 + .set_fmt = au1xpsc_i2s_set_fmt,
  374 +};
  375 +
370 376 struct snd_soc_dai au1xpsc_i2s_dai = {
371 377 .name = "au1xpsc_i2s",
372 378 .probe = au1xpsc_i2s_probe,
... ... @@ -385,11 +391,7 @@
385 391 .channels_min = 2,
386 392 .channels_max = 8, /* 2 without external help */
387 393 },
388   - .ops = {
389   - .trigger = au1xpsc_i2s_trigger,
390   - .hw_params = au1xpsc_i2s_hw_params,
391   - .set_fmt = au1xpsc_i2s_set_fmt,
392   - },
  394 + .ops = &au1xpsc_i2s_dai_ops,
393 395 };
394 396 EXPORT_SYMBOL(au1xpsc_i2s_dai);
395 397  
sound/soc/blackfin/bf5xx-i2s.c
... ... @@ -287,6 +287,13 @@
287 287 #define BF5XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |\
288 288 SNDRV_PCM_FMTBIT_S32_LE)
289 289  
  290 +static struct snd_soc_dai_ops bf5xx_i2s_dai_ops = {
  291 + .startup = bf5xx_i2s_startup,
  292 + .shutdown = bf5xx_i2s_shutdown,
  293 + .hw_params = bf5xx_i2s_hw_params,
  294 + .set_fmt = bf5xx_i2s_set_dai_fmt,
  295 +};
  296 +
290 297 struct snd_soc_dai bf5xx_i2s_dai = {
291 298 .name = "bf5xx-i2s",
292 299 .id = 0,
... ... @@ -304,12 +311,7 @@
304 311 .channels_max = 2,
305 312 .rates = BF5XX_I2S_RATES,
306 313 .formats = BF5XX_I2S_FORMATS,},
307   - .ops = {
308   - .startup = bf5xx_i2s_startup,
309   - .shutdown = bf5xx_i2s_shutdown,
310   - .hw_params = bf5xx_i2s_hw_params,
311   - .set_fmt = bf5xx_i2s_set_dai_fmt,
312   - },
  314 + .ops = &bf5xx_i2s_dai_ops,
313 315 };
314 316 EXPORT_SYMBOL_GPL(bf5xx_i2s_dai);
315 317  
sound/soc/codecs/ac97.c
... ... @@ -41,6 +41,10 @@
41 41 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
42 42 SNDRV_PCM_RATE_48000)
43 43  
  44 +static struct snd_soc_dai_ops ac97_dai_ops = {
  45 + .prepare = ac97_prepare,
  46 +};
  47 +
44 48 struct snd_soc_dai ac97_dai = {
45 49 .name = "AC97 HiFi",
46 50 .ac97_control = 1,
... ... @@ -56,8 +60,7 @@
56 60 .channels_max = 2,
57 61 .rates = STD_AC97_RATES,
58 62 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
59   - .ops = {
60   - .prepare = ac97_prepare,},
  63 + .ops = &ac97_dai_ops,
61 64 };
62 65 EXPORT_SYMBOL_GPL(ac97_dai);
63 66  
sound/soc/codecs/ak4104.c
... ... @@ -174,6 +174,11 @@
174 174 return ak4104_spi_write(codec, AK4104_REG_CHN_STATUS(3), val);
175 175 }
176 176  
  177 +static struct snd_soc_dai_ops ak4101_dai_ops = {
  178 + .hw_params = ak4104_hw_params,
  179 + .set_fmt = ak4104_set_dai_fmt,
  180 +};
  181 +
177 182 struct snd_soc_dai ak4104_dai = {
178 183 .name = DRV_NAME,
179 184 .playback = {
... ... @@ -187,10 +192,7 @@
187 192 SNDRV_PCM_FMTBIT_S24_3LE |
188 193 SNDRV_PCM_FMTBIT_S24_LE
189 194 },
190   - .ops = {
191   - .hw_params = ak4104_hw_params,
192   - .set_fmt = ak4104_set_dai_fmt,
193   - }
  195 + .ops = &ak4101_dai_ops,
194 196 };
195 197  
196 198 static struct snd_soc_codec *ak4104_codec;
sound/soc/codecs/ak4535.c
... ... @@ -421,6 +421,13 @@
421 421 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
422 422 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
423 423  
  424 +static struct snd_soc_dai_ops ak4535_dai_ops = {
  425 + .hw_params = ak4535_hw_params,
  426 + .set_fmt = ak4535_set_dai_fmt,
  427 + .digital_mute = ak4535_mute,
  428 + .set_sysclk = ak4535_set_dai_sysclk,
  429 +};
  430 +
424 431 struct snd_soc_dai ak4535_dai = {
425 432 .name = "AK4535",
426 433 .playback = {
... ... @@ -435,12 +442,7 @@
435 442 .channels_max = 2,
436 443 .rates = AK4535_RATES,
437 444 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
438   - .ops = {
439   - .hw_params = ak4535_hw_params,
440   - .set_fmt = ak4535_set_dai_fmt,
441   - .digital_mute = ak4535_mute,
442   - .set_sysclk = ak4535_set_dai_sysclk,
443   - },
  445 + .ops = &ak4535_dai_ops,
444 446 };
445 447 EXPORT_SYMBOL_GPL(ak4535_dai);
446 448  
sound/soc/codecs/cs4270.c
... ... @@ -502,6 +502,13 @@
502 502 */
503 503 static struct snd_soc_codec *cs4270_codec;
504 504  
  505 +static struct snd_soc_dai_ops cs4270_dai_ops = {
  506 + .hw_params = cs4270_hw_params,
  507 + .set_sysclk = cs4270_set_dai_sysclk,
  508 + .set_fmt = cs4270_set_dai_fmt,
  509 + .digital_mute = cs4270_mute,
  510 +};
  511 +
505 512 struct snd_soc_dai cs4270_dai = {
506 513 .name = "cs4270",
507 514 .playback = {
... ... @@ -518,12 +525,7 @@
518 525 .rates = 0,
519 526 .formats = CS4270_FORMATS,
520 527 },
521   - .ops = {
522   - .hw_params = cs4270_hw_params,
523   - .set_sysclk = cs4270_set_dai_sysclk,
524   - .set_fmt = cs4270_set_dai_fmt,
525   - .digital_mute = cs4270_mute,
526   - },
  528 + .ops = &cs4270_dai_ops,
527 529 };
528 530 EXPORT_SYMBOL_GPL(cs4270_dai);
529 531  
sound/soc/codecs/ssm2602.c
... ... @@ -506,6 +506,16 @@
506 506 #define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
507 507 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
508 508  
  509 +static struct snd_soc_dai_ops ssm2602_dai_ops = {
  510 + .startup = ssm2602_startup,
  511 + .prepare = ssm2602_pcm_prepare,
  512 + .hw_params = ssm2602_hw_params,
  513 + .shutdown = ssm2602_shutdown,
  514 + .digital_mute = ssm2602_mute,
  515 + .set_sysclk = ssm2602_set_dai_sysclk,
  516 + .set_fmt = ssm2602_set_dai_fmt,
  517 +};
  518 +
509 519 struct snd_soc_dai ssm2602_dai = {
510 520 .name = "SSM2602",
511 521 .playback = {
... ... @@ -520,15 +530,7 @@
520 530 .channels_max = 2,
521 531 .rates = SSM2602_RATES,
522 532 .formats = SSM2602_FORMATS,},
523   - .ops = {
524   - .startup = ssm2602_startup,
525   - .prepare = ssm2602_pcm_prepare,
526   - .hw_params = ssm2602_hw_params,
527   - .shutdown = ssm2602_shutdown,
528   - .digital_mute = ssm2602_mute,
529   - .set_sysclk = ssm2602_set_dai_sysclk,
530   - .set_fmt = ssm2602_set_dai_fmt,
531   - }
  533 + .ops = &ssm2602_dai_ops,
532 534 };
533 535 EXPORT_SYMBOL_GPL(ssm2602_dai);
534 536  
sound/soc/codecs/tlv320aic23.c
... ... @@ -580,6 +580,15 @@
580 580 #define AIC23_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
581 581 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
582 582  
  583 +static struct snd_soc_dai_ops tlv320aic23_dai_ops = {
  584 + .prepare = tlv320aic23_pcm_prepare,
  585 + .hw_params = tlv320aic23_hw_params,
  586 + .shutdown = tlv320aic23_shutdown,
  587 + .digital_mute = tlv320aic23_mute,
  588 + .set_fmt = tlv320aic23_set_dai_fmt,
  589 + .set_sysclk = tlv320aic23_set_dai_sysclk,
  590 +};
  591 +
583 592 struct snd_soc_dai tlv320aic23_dai = {
584 593 .name = "tlv320aic23",
585 594 .playback = {
... ... @@ -594,14 +603,7 @@
594 603 .channels_max = 2,
595 604 .rates = AIC23_RATES,
596 605 .formats = AIC23_FORMATS,},
597   - .ops = {
598   - .prepare = tlv320aic23_pcm_prepare,
599   - .hw_params = tlv320aic23_hw_params,
600   - .shutdown = tlv320aic23_shutdown,
601   - .digital_mute = tlv320aic23_mute,
602   - .set_fmt = tlv320aic23_set_dai_fmt,
603   - .set_sysclk = tlv320aic23_set_dai_sysclk,
604   - }
  606 + .ops = &tlv320aic23_dai_ops,
605 607 };
606 608 EXPORT_SYMBOL_GPL(tlv320aic23_dai);
607 609  
sound/soc/codecs/tlv320aic26.c
... ... @@ -270,6 +270,13 @@
270 270 #define AIC26_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE |\
271 271 SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE)
272 272  
  273 +static struct snd_soc_dai_ops aic26_dai_ops = {
  274 + .hw_params = aic26_hw_params,
  275 + .digital_mute = aic26_mute,
  276 + .set_sysclk = aic26_set_sysclk,
  277 + .set_fmt = aic26_set_fmt,
  278 +};
  279 +
273 280 struct snd_soc_dai aic26_dai = {
274 281 .name = "tlv320aic26",
275 282 .playback = {
... ... @@ -286,12 +293,7 @@
286 293 .rates = AIC26_RATES,
287 294 .formats = AIC26_FORMATS,
288 295 },
289   - .ops = {
290   - .hw_params = aic26_hw_params,
291   - .digital_mute = aic26_mute,
292   - .set_sysclk = aic26_set_sysclk,
293   - .set_fmt = aic26_set_fmt,
294   - },
  296 + .ops = &aic26_dai_ops,
295 297 };
296 298 EXPORT_SYMBOL_GPL(aic26_dai);
297 299  
sound/soc/codecs/tlv320aic3x.c
... ... @@ -1088,6 +1088,13 @@
1088 1088 #define AIC3X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1089 1089 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
1090 1090  
  1091 +static struct snd_soc_dai_ops aic3x_dai_ops = {
  1092 + .hw_params = aic3x_hw_params,
  1093 + .digital_mute = aic3x_mute,
  1094 + .set_sysclk = aic3x_set_dai_sysclk,
  1095 + .set_fmt = aic3x_set_dai_fmt,
  1096 +};
  1097 +
1091 1098 struct snd_soc_dai aic3x_dai = {
1092 1099 .name = "tlv320aic3x",
1093 1100 .playback = {
... ... @@ -1102,12 +1109,7 @@
1102 1109 .channels_max = 2,
1103 1110 .rates = AIC3X_RATES,
1104 1111 .formats = AIC3X_FORMATS,},
1105   - .ops = {
1106   - .hw_params = aic3x_hw_params,
1107   - .digital_mute = aic3x_mute,
1108   - .set_sysclk = aic3x_set_dai_sysclk,
1109   - .set_fmt = aic3x_set_dai_fmt,
1110   - }
  1112 + .ops = &aic3x_dai_ops,
1111 1113 };
1112 1114 EXPORT_SYMBOL_GPL(aic3x_dai);
1113 1115  
sound/soc/codecs/uda134x.c
... ... @@ -431,6 +431,15 @@
431 431 SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0),
432 432 };
433 433  
  434 +static struct snd_soc_dai_ops uda134x_dai_ops = {
  435 + .startup = uda134x_startup,
  436 + .shutdown = uda134x_shutdown,
  437 + .hw_params = uda134x_hw_params,
  438 + .digital_mute = uda134x_mute,
  439 + .set_sysclk = uda134x_set_dai_sysclk,
  440 + .set_fmt = uda134x_set_dai_fmt,
  441 +};
  442 +
434 443 struct snd_soc_dai uda134x_dai = {
435 444 .name = "UDA134X",
436 445 /* playback capabilities */
... ... @@ -450,14 +459,7 @@
450 459 .formats = UDA134X_FORMATS,
451 460 },
452 461 /* pcm operations */
453   - .ops = {
454   - .startup = uda134x_startup,
455   - .shutdown = uda134x_shutdown,
456   - .hw_params = uda134x_hw_params,
457   - .digital_mute = uda134x_mute,
458   - .set_sysclk = uda134x_set_dai_sysclk,
459   - .set_fmt = uda134x_set_dai_fmt,
460   - }
  462 + .ops = &uda134x_dai_ops,
461 463 };
462 464 EXPORT_SYMBOL(uda134x_dai);
463 465  
sound/soc/codecs/uda1380.c
... ... @@ -579,6 +579,27 @@
579 579 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
580 580 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
581 581  
  582 +static struct snd_soc_dai_ops uda1380_dai_ops = {
  583 + .hw_params = uda1380_pcm_hw_params,
  584 + .shutdown = uda1380_pcm_shutdown,
  585 + .trigger = uda1380_trigger,
  586 + .set_fmt = uda1380_set_dai_fmt_both,
  587 +};
  588 +
  589 +static struct snd_soc_dai_ops uda1380_dai_ops_playback = {
  590 + .hw_params = uda1380_pcm_hw_params,
  591 + .shutdown = uda1380_pcm_shutdown,
  592 + .trigger = uda1380_trigger,
  593 + .set_fmt = uda1380_set_dai_fmt_playback,
  594 +};
  595 +
  596 +static struct snd_soc_dai_ops uda1380_dai_ops_capture = {
  597 + .hw_params = uda1380_pcm_hw_params,
  598 + .shutdown = uda1380_pcm_shutdown,
  599 + .trigger = uda1380_trigger,
  600 + .set_fmt = uda1380_set_dai_fmt_capture,
  601 +};
  602 +
582 603 struct snd_soc_dai uda1380_dai[] = {
583 604 {
584 605 .name = "UDA1380",
... ... @@ -594,12 +615,7 @@
594 615 .channels_max = 2,
595 616 .rates = UDA1380_RATES,
596 617 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
597   - .ops = {
598   - .trigger = uda1380_trigger,
599   - .hw_params = uda1380_pcm_hw_params,
600   - .shutdown = uda1380_pcm_shutdown,
601   - .set_fmt = uda1380_set_dai_fmt_both,
602   - },
  618 + .ops = &uda1380_dai_ops,
603 619 },
604 620 { /* playback only - dual interface */
605 621 .name = "UDA1380",
... ... @@ -610,12 +626,7 @@
610 626 .rates = UDA1380_RATES,
611 627 .formats = SNDRV_PCM_FMTBIT_S16_LE,
612 628 },
613   - .ops = {
614   - .trigger = uda1380_trigger,
615   - .hw_params = uda1380_pcm_hw_params,
616   - .shutdown = uda1380_pcm_shutdown,
617   - .set_fmt = uda1380_set_dai_fmt_playback,
618   - },
  629 + .ops = &uda1380_dai_ops_playback,
619 630 },
620 631 { /* capture only - dual interface*/
621 632 .name = "UDA1380",
... ... @@ -626,12 +637,7 @@
626 637 .rates = UDA1380_RATES,
627 638 .formats = SNDRV_PCM_FMTBIT_S16_LE,
628 639 },
629   - .ops = {
630   - .trigger = uda1380_trigger,
631   - .hw_params = uda1380_pcm_hw_params,
632   - .shutdown = uda1380_pcm_shutdown,
633   - .set_fmt = uda1380_set_dai_fmt_capture,
634   - },
  640 + .ops = &uda1380_dai_ops_capture,
635 641 },
636 642 };
637 643 EXPORT_SYMBOL_GPL(uda1380_dai);
sound/soc/codecs/wm8350.c
... ... @@ -1538,6 +1538,16 @@
1538 1538 SNDRV_PCM_FMTBIT_S20_3LE |\
1539 1539 SNDRV_PCM_FMTBIT_S24_LE)
1540 1540  
  1541 +static struct snd_soc_dai_ops wm8350_dai_ops = {
  1542 + .hw_params = wm8350_pcm_hw_params,
  1543 + .digital_mute = wm8350_mute,
  1544 + .trigger = wm8350_pcm_trigger,
  1545 + .set_fmt = wm8350_set_dai_fmt,
  1546 + .set_sysclk = wm8350_set_dai_sysclk,
  1547 + .set_pll = wm8350_set_fll,
  1548 + .set_clkdiv = wm8350_set_clkdiv,
  1549 +};
  1550 +
1541 1551 struct snd_soc_dai wm8350_dai = {
1542 1552 .name = "WM8350",
1543 1553 .playback = {
... ... @@ -1554,15 +1564,7 @@
1554 1564 .rates = WM8350_RATES,
1555 1565 .formats = WM8350_FORMATS,
1556 1566 },
1557   - .ops = {
1558   - .hw_params = wm8350_pcm_hw_params,
1559   - .digital_mute = wm8350_mute,
1560   - .trigger = wm8350_pcm_trigger,
1561   - .set_fmt = wm8350_set_dai_fmt,
1562   - .set_sysclk = wm8350_set_dai_sysclk,
1563   - .set_pll = wm8350_set_fll,
1564   - .set_clkdiv = wm8350_set_clkdiv,
1565   - },
  1567 + .ops = &wm8350_dai_ops,
1566 1568 };
1567 1569 EXPORT_SYMBOL_GPL(wm8350_dai);
1568 1570  
sound/soc/codecs/wm8400.c
... ... @@ -1210,6 +1210,14 @@
1210 1210 #define WM8400_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1211 1211 SNDRV_PCM_FMTBIT_S24_LE)
1212 1212  
  1213 +static struct snd_soc_dai_ops wm8400_dai_ops = {
  1214 + .hw_params = wm8400_hw_params,
  1215 + .digital_mute = wm8400_mute,
  1216 + .set_fmt = wm8400_set_dai_fmt,
  1217 + .set_clkdiv = wm8400_set_dai_clkdiv,
  1218 + .set_sysclk = wm8400_set_dai_sysclk,
  1219 +};
  1220 +
1213 1221 /*
1214 1222 * The WM8400 supports 2 different and mutually exclusive DAI
1215 1223 * configurations.
... ... @@ -1235,13 +1243,7 @@
1235 1243 .rates = WM8400_RATES,
1236 1244 .formats = WM8400_FORMATS,
1237 1245 },
1238   - .ops = {
1239   - .hw_params = wm8400_hw_params,
1240   - .digital_mute = wm8400_mute,
1241   - .set_fmt = wm8400_set_dai_fmt,
1242   - .set_clkdiv = wm8400_set_dai_clkdiv,
1243   - .set_sysclk = wm8400_set_dai_sysclk,
1244   - },
  1246 + .ops = &wm8400_dai_ops,
1245 1247 };
1246 1248 EXPORT_SYMBOL_GPL(wm8400_dai);
1247 1249  
sound/soc/codecs/wm8510.c
... ... @@ -554,6 +554,14 @@
554 554 #define WM8510_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
555 555 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
556 556  
  557 +static struct snd_soc_dai_ops wm8510_dai_ops = {
  558 + .hw_params = wm8510_pcm_hw_params,
  559 + .digital_mute = wm8510_mute,
  560 + .set_fmt = wm8510_set_dai_fmt,
  561 + .set_clkdiv = wm8510_set_dai_clkdiv,
  562 + .set_pll = wm8510_set_dai_pll,
  563 +};
  564 +
557 565 struct snd_soc_dai wm8510_dai = {
558 566 .name = "WM8510 HiFi",
559 567 .playback = {
... ... @@ -568,13 +576,7 @@
568 576 .channels_max = 2,
569 577 .rates = WM8510_RATES,
570 578 .formats = WM8510_FORMATS,},
571   - .ops = {
572   - .hw_params = wm8510_pcm_hw_params,
573   - .digital_mute = wm8510_mute,
574   - .set_fmt = wm8510_set_dai_fmt,
575   - .set_clkdiv = wm8510_set_dai_clkdiv,
576   - .set_pll = wm8510_set_dai_pll,
577   - },
  579 + .ops = &wm8510_dai_ops,
578 580 };
579 581 EXPORT_SYMBOL_GPL(wm8510_dai);
580 582  
sound/soc/codecs/wm8580.c
... ... @@ -769,6 +769,21 @@
769 769 #define WM8580_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
770 770 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
771 771  
  772 +static struct snd_soc_dai_ops wm8580_dai_ops_playback = {
  773 + .hw_params = wm8580_paif_hw_params,
  774 + .set_fmt = wm8580_set_paif_dai_fmt,
  775 + .set_clkdiv = wm8580_set_dai_clkdiv,
  776 + .set_pll = wm8580_set_dai_pll,
  777 + .digital_mute = wm8580_digital_mute,
  778 +};
  779 +
  780 +static struct snd_soc_dai_ops wm8580_dai_ops_capture = {
  781 + .hw_params = wm8580_paif_hw_params,
  782 + .set_fmt = wm8580_set_paif_dai_fmt,
  783 + .set_clkdiv = wm8580_set_dai_clkdiv,
  784 + .set_pll = wm8580_set_dai_pll,
  785 +};
  786 +
772 787 struct snd_soc_dai wm8580_dai[] = {
773 788 {
774 789 .name = "WM8580 PAIFRX",
... ... @@ -780,13 +795,7 @@
780 795 .rates = SNDRV_PCM_RATE_8000_192000,
781 796 .formats = WM8580_FORMATS,
782 797 },
783   - .ops = {
784   - .hw_params = wm8580_paif_hw_params,
785   - .set_fmt = wm8580_set_paif_dai_fmt,
786   - .set_clkdiv = wm8580_set_dai_clkdiv,
787   - .set_pll = wm8580_set_dai_pll,
788   - .digital_mute = wm8580_digital_mute,
789   - },
  798 + .ops = &wm8580_dai_ops_playback,
790 799 },
791 800 {
792 801 .name = "WM8580 PAIFTX",
... ... @@ -798,12 +807,7 @@
798 807 .rates = SNDRV_PCM_RATE_8000_192000,
799 808 .formats = WM8580_FORMATS,
800 809 },
801   - .ops = {
802   - .hw_params = wm8580_paif_hw_params,
803   - .set_fmt = wm8580_set_paif_dai_fmt,
804   - .set_clkdiv = wm8580_set_dai_clkdiv,
805   - .set_pll = wm8580_set_dai_pll,
806   - },
  810 + .ops = &wm8580_dai_ops_capture,
807 811 },
808 812 };
809 813 EXPORT_SYMBOL_GPL(wm8580_dai);
sound/soc/codecs/wm8728.c
... ... @@ -244,6 +244,12 @@
244 244 #define WM8728_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
245 245 SNDRV_PCM_FMTBIT_S24_LE)
246 246  
  247 +static struct snd_soc_dai_ops wm8728_dai_ops = {
  248 + .hw_params = wm8728_hw_params,
  249 + .digital_mute = wm8728_mute,
  250 + .set_fmt = wm8728_set_dai_fmt,
  251 +};
  252 +
247 253 struct snd_soc_dai wm8728_dai = {
248 254 .name = "WM8728",
249 255 .playback = {
... ... @@ -253,11 +259,7 @@
253 259 .rates = WM8728_RATES,
254 260 .formats = WM8728_FORMATS,
255 261 },
256   - .ops = {
257   - .hw_params = wm8728_hw_params,
258   - .digital_mute = wm8728_mute,
259   - .set_fmt = wm8728_set_dai_fmt,
260   - }
  262 + .ops = &wm8728_dai_ops,
261 263 };
262 264 EXPORT_SYMBOL_GPL(wm8728_dai);
263 265  
sound/soc/codecs/wm8731.c
... ... @@ -433,6 +433,15 @@
433 433 #define WM8731_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
434 434 SNDRV_PCM_FMTBIT_S24_LE)
435 435  
  436 +static struct snd_soc_dai_ops wm8731_dai_ops = {
  437 + .prepare = wm8731_pcm_prepare,
  438 + .hw_params = wm8731_hw_params,
  439 + .shutdown = wm8731_shutdown,
  440 + .digital_mute = wm8731_mute,
  441 + .set_sysclk = wm8731_set_dai_sysclk,
  442 + .set_fmt = wm8731_set_dai_fmt,
  443 +};
  444 +
436 445 struct snd_soc_dai wm8731_dai = {
437 446 .name = "WM8731",
438 447 .playback = {
... ... @@ -447,14 +456,7 @@
447 456 .channels_max = 2,
448 457 .rates = WM8731_RATES,
449 458 .formats = WM8731_FORMATS,},
450   - .ops = {
451   - .prepare = wm8731_pcm_prepare,
452   - .hw_params = wm8731_hw_params,
453   - .shutdown = wm8731_shutdown,
454   - .digital_mute = wm8731_mute,
455   - .set_sysclk = wm8731_set_dai_sysclk,
456   - .set_fmt = wm8731_set_dai_fmt,
457   - }
  459 + .ops = &wm8731_dai_ops,
458 460 };
459 461 EXPORT_SYMBOL_GPL(wm8731_dai);
460 462  
sound/soc/codecs/wm8750.c
... ... @@ -679,6 +679,13 @@
679 679 #define WM8750_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
680 680 SNDRV_PCM_FMTBIT_S24_LE)
681 681  
  682 +static struct snd_soc_dai_ops wm8750_dai_ops = {
  683 + .hw_params = wm8750_pcm_hw_params,
  684 + .digital_mute = wm8750_mute,
  685 + .set_fmt = wm8750_set_dai_fmt,
  686 + .set_sysclk = wm8750_set_dai_sysclk,
  687 +};
  688 +
682 689 struct snd_soc_dai wm8750_dai = {
683 690 .name = "WM8750",
684 691 .playback = {
... ... @@ -693,12 +700,7 @@
693 700 .channels_max = 2,
694 701 .rates = WM8750_RATES,
695 702 .formats = WM8750_FORMATS,},
696   - .ops = {
697   - .hw_params = wm8750_pcm_hw_params,
698   - .digital_mute = wm8750_mute,
699   - .set_fmt = wm8750_set_dai_fmt,
700   - .set_sysclk = wm8750_set_dai_sysclk,
701   - },
  703 + .ops = &wm8750_dai_ops,
702 704 };
703 705 EXPORT_SYMBOL_GPL(wm8750_dai);
704 706  
sound/soc/codecs/wm8753.c
... ... @@ -1301,6 +1301,51 @@
1301 1301 * 3. Voice disabled - HIFI over HIFI
1302 1302 * 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture
1303 1303 */
  1304 +static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = {
  1305 + .hw_params = wm8753_i2s_hw_params,
  1306 + .digital_mute = wm8753_mute,
  1307 + .set_fmt = wm8753_mode1h_set_dai_fmt,
  1308 + .set_clkdiv = wm8753_set_dai_clkdiv,
  1309 + .set_pll = wm8753_set_dai_pll,
  1310 + .set_sysclk = wm8753_set_dai_sysclk,
  1311 +};
  1312 +
  1313 +static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = {
  1314 + .hw_params = wm8753_pcm_hw_params,
  1315 + .digital_mute = wm8753_mute,
  1316 + .set_fmt = wm8753_mode1v_set_dai_fmt,
  1317 + .set_clkdiv = wm8753_set_dai_clkdiv,
  1318 + .set_pll = wm8753_set_dai_pll,
  1319 + .set_sysclk = wm8753_set_dai_sysclk,
  1320 +};
  1321 +
  1322 +static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = {
  1323 + .hw_params = wm8753_pcm_hw_params,
  1324 + .digital_mute = wm8753_mute,
  1325 + .set_fmt = wm8753_mode2_set_dai_fmt,
  1326 + .set_clkdiv = wm8753_set_dai_clkdiv,
  1327 + .set_pll = wm8753_set_dai_pll,
  1328 + .set_sysclk = wm8753_set_dai_sysclk,
  1329 +};
  1330 +
  1331 +static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = {
  1332 + .hw_params = wm8753_i2s_hw_params,
  1333 + .digital_mute = wm8753_mute,
  1334 + .set_fmt = wm8753_mode3_4_set_dai_fmt,
  1335 + .set_clkdiv = wm8753_set_dai_clkdiv,
  1336 + .set_pll = wm8753_set_dai_pll,
  1337 + .set_sysclk = wm8753_set_dai_sysclk,
  1338 +};
  1339 +
  1340 +static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = {
  1341 + .hw_params = wm8753_i2s_hw_params,
  1342 + .digital_mute = wm8753_mute,
  1343 + .set_fmt = wm8753_mode3_4_set_dai_fmt,
  1344 + .set_clkdiv = wm8753_set_dai_clkdiv,
  1345 + .set_pll = wm8753_set_dai_pll,
  1346 + .set_sysclk = wm8753_set_dai_sysclk,
  1347 +};
  1348 +
1304 1349 static const struct snd_soc_dai wm8753_all_dai[] = {
1305 1350 /* DAI HiFi mode 1 */
1306 1351 { .name = "WM8753 HiFi",
... ... @@ -1317,14 +1362,7 @@
1317 1362 .channels_max = 2,
1318 1363 .rates = WM8753_RATES,
1319 1364 .formats = WM8753_FORMATS},
1320   - .ops = {
1321   - .hw_params = wm8753_i2s_hw_params,
1322   - .digital_mute = wm8753_mute,
1323   - .set_fmt = wm8753_mode1h_set_dai_fmt,
1324   - .set_clkdiv = wm8753_set_dai_clkdiv,
1325   - .set_pll = wm8753_set_dai_pll,
1326   - .set_sysclk = wm8753_set_dai_sysclk,
1327   - },
  1365 + .ops = &wm8753_dai_ops_hifi_mode1,
1328 1366 },
1329 1367 /* DAI Voice mode 1 */
1330 1368 { .name = "WM8753 Voice",
... ... @@ -1341,14 +1379,7 @@
1341 1379 .channels_max = 2,
1342 1380 .rates = WM8753_RATES,
1343 1381 .formats = WM8753_FORMATS,},
1344   - .ops = {
1345   - .hw_params = wm8753_pcm_hw_params,
1346   - .digital_mute = wm8753_mute,
1347   - .set_fmt = wm8753_mode1v_set_dai_fmt,
1348   - .set_clkdiv = wm8753_set_dai_clkdiv,
1349   - .set_pll = wm8753_set_dai_pll,
1350   - .set_sysclk = wm8753_set_dai_sysclk,
1351   - },
  1382 + .ops = &wm8753_dai_ops_voice_mode1,
1352 1383 },
1353 1384 /* DAI HiFi mode 2 - dummy */
1354 1385 { .name = "WM8753 HiFi",
... ... @@ -1369,14 +1400,7 @@
1369 1400 .channels_max = 2,
1370 1401 .rates = WM8753_RATES,
1371 1402 .formats = WM8753_FORMATS,},
1372   - .ops = {
1373   - .hw_params = wm8753_pcm_hw_params,
1374   - .digital_mute = wm8753_mute,
1375   - .set_fmt = wm8753_mode2_set_dai_fmt,
1376   - .set_clkdiv = wm8753_set_dai_clkdiv,
1377   - .set_pll = wm8753_set_dai_pll,
1378   - .set_sysclk = wm8753_set_dai_sysclk,
1379   - },
  1403 + .ops = &wm8753_dai_ops_voice_mode2,
1380 1404 },
1381 1405 /* DAI HiFi mode 3 */
1382 1406 { .name = "WM8753 HiFi",
... ... @@ -1393,14 +1417,7 @@
1393 1417 .channels_max = 2,
1394 1418 .rates = WM8753_RATES,
1395 1419 .formats = WM8753_FORMATS,},
1396   - .ops = {
1397   - .hw_params = wm8753_i2s_hw_params,
1398   - .digital_mute = wm8753_mute,
1399   - .set_fmt = wm8753_mode3_4_set_dai_fmt,
1400   - .set_clkdiv = wm8753_set_dai_clkdiv,
1401   - .set_pll = wm8753_set_dai_pll,
1402   - .set_sysclk = wm8753_set_dai_sysclk,
1403   - },
  1420 + .ops = &wm8753_dai_ops_hifi_mode3,
1404 1421 },
1405 1422 /* DAI Voice mode 3 - dummy */
1406 1423 { .name = "WM8753 Voice",
... ... @@ -1421,14 +1438,7 @@
1421 1438 .channels_max = 2,
1422 1439 .rates = WM8753_RATES,
1423 1440 .formats = WM8753_FORMATS,},
1424   - .ops = {
1425   - .hw_params = wm8753_i2s_hw_params,
1426   - .digital_mute = wm8753_mute,
1427   - .set_fmt = wm8753_mode3_4_set_dai_fmt,
1428   - .set_clkdiv = wm8753_set_dai_clkdiv,
1429   - .set_pll = wm8753_set_dai_pll,
1430   - .set_sysclk = wm8753_set_dai_sysclk,
1431   - },
  1441 + .ops = &wm8753_dai_ops_hifi_mode4,
1432 1442 },
1433 1443 /* DAI Voice mode 4 - dummy */
1434 1444 { .name = "WM8753 Voice",
sound/soc/codecs/wm8900.c
... ... @@ -1088,6 +1088,14 @@
1088 1088 (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
1089 1089 SNDRV_PCM_FORMAT_S24_LE)
1090 1090  
  1091 +static struct snd_soc_dai_ops wm8900_dai_ops = {
  1092 + .hw_params = wm8900_hw_params,
  1093 + .set_clkdiv = wm8900_set_dai_clkdiv,
  1094 + .set_pll = wm8900_set_dai_pll,
  1095 + .set_fmt = wm8900_set_dai_fmt,
  1096 + .digital_mute = wm8900_digital_mute,
  1097 +};
  1098 +
1091 1099 struct snd_soc_dai wm8900_dai = {
1092 1100 .name = "WM8900 HiFi",
1093 1101 .playback = {
... ... @@ -1104,13 +1112,7 @@
1104 1112 .rates = WM8900_RATES,
1105 1113 .formats = WM8900_PCM_FORMATS,
1106 1114 },
1107   - .ops = {
1108   - .hw_params = wm8900_hw_params,
1109   - .set_clkdiv = wm8900_set_dai_clkdiv,
1110   - .set_pll = wm8900_set_dai_pll,
1111   - .set_fmt = wm8900_set_dai_fmt,
1112   - .digital_mute = wm8900_digital_mute,
1113   - },
  1115 + .ops = &wm8900_dai_ops,
1114 1116 };
1115 1117 EXPORT_SYMBOL_GPL(wm8900_dai);
1116 1118  
sound/soc/codecs/wm8903.c
... ... @@ -1497,6 +1497,15 @@
1497 1497 SNDRV_PCM_FMTBIT_S20_3LE |\
1498 1498 SNDRV_PCM_FMTBIT_S24_LE)
1499 1499  
  1500 +static struct snd_soc_dai_ops wm8903_dai_ops = {
  1501 + .startup = wm8903_startup,
  1502 + .shutdown = wm8903_shutdown,
  1503 + .hw_params = wm8903_hw_params,
  1504 + .digital_mute = wm8903_digital_mute,
  1505 + .set_fmt = wm8903_set_dai_fmt,
  1506 + .set_sysclk = wm8903_set_dai_sysclk,
  1507 +};
  1508 +
1500 1509 struct snd_soc_dai wm8903_dai = {
1501 1510 .name = "WM8903",
1502 1511 .playback = {
... ... @@ -1513,14 +1522,7 @@
1513 1522 .rates = WM8903_CAPTURE_RATES,
1514 1523 .formats = WM8903_FORMATS,
1515 1524 },
1516   - .ops = {
1517   - .startup = wm8903_startup,
1518   - .shutdown = wm8903_shutdown,
1519   - .hw_params = wm8903_hw_params,
1520   - .digital_mute = wm8903_digital_mute,
1521   - .set_fmt = wm8903_set_dai_fmt,
1522   - .set_sysclk = wm8903_set_dai_sysclk
1523   - }
  1525 + .ops = &wm8903_dai_ops,
1524 1526 };
1525 1527 EXPORT_SYMBOL_GPL(wm8903_dai);
1526 1528  
sound/soc/codecs/wm8971.c
... ... @@ -604,6 +604,13 @@
604 604 #define WM8971_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
605 605 SNDRV_PCM_FMTBIT_S24_LE)
606 606  
  607 +static struct snd_soc_dai_ops wm8971_dai_ops = {
  608 + .hw_params = wm8971_pcm_hw_params,
  609 + .digital_mute = wm8971_mute,
  610 + .set_fmt = wm8971_set_dai_fmt,
  611 + .set_sysclk = wm8971_set_dai_sysclk,
  612 +};
  613 +
607 614 struct snd_soc_dai wm8971_dai = {
608 615 .name = "WM8971",
609 616 .playback = {
... ... @@ -618,12 +625,7 @@
618 625 .channels_max = 2,
619 626 .rates = WM8971_RATES,
620 627 .formats = WM8971_FORMATS,},
621   - .ops = {
622   - .hw_params = wm8971_pcm_hw_params,
623   - .digital_mute = wm8971_mute,
624   - .set_fmt = wm8971_set_dai_fmt,
625   - .set_sysclk = wm8971_set_dai_sysclk,
626   - },
  628 + .ops = &wm8971_dai_ops,
627 629 };
628 630 EXPORT_SYMBOL_GPL(wm8971_dai);
629 631  
sound/soc/codecs/wm8990.c
... ... @@ -1332,6 +1332,15 @@
1332 1332 * 1. ADC/DAC on Primary Interface
1333 1333 * 2. ADC on Primary Interface/DAC on secondary
1334 1334 */
  1335 +static struct snd_soc_dai_ops wm8990_dai_ops = {
  1336 + .hw_params = wm8990_hw_params,
  1337 + .digital_mute = wm8990_mute,
  1338 + .set_fmt = wm8990_set_dai_fmt,
  1339 + .set_clkdiv = wm8990_set_dai_clkdiv,
  1340 + .set_pll = wm8990_set_dai_pll,
  1341 + .set_sysclk = wm8990_set_dai_sysclk,
  1342 +};
  1343 +
1335 1344 struct snd_soc_dai wm8990_dai = {
1336 1345 /* ADC/DAC on primary */
1337 1346 .name = "WM8990 ADC/DAC Primary",
... ... @@ -1348,14 +1357,7 @@
1348 1357 .channels_max = 2,
1349 1358 .rates = WM8990_RATES,
1350 1359 .formats = WM8990_FORMATS,},
1351   - .ops = {
1352   - .hw_params = wm8990_hw_params,
1353   - .digital_mute = wm8990_mute,
1354   - .set_fmt = wm8990_set_dai_fmt,
1355   - .set_clkdiv = wm8990_set_dai_clkdiv,
1356   - .set_pll = wm8990_set_dai_pll,
1357   - .set_sysclk = wm8990_set_dai_sysclk,
1358   - },
  1360 + .ops = &wm8990_dai_ops,
1359 1361 };
1360 1362 EXPORT_SYMBOL_GPL(wm8990_dai);
1361 1363  
sound/soc/codecs/wm9705.c
... ... @@ -269,6 +269,10 @@
269 269 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
270 270 SNDRV_PCM_RATE_48000)
271 271  
  272 +static struct snd_soc_dai_ops wm9705_dai_ops = {
  273 + .prepare = ac97_prepare,
  274 +};
  275 +
272 276 struct snd_soc_dai wm9705_dai[] = {
273 277 {
274 278 .name = "AC97 HiFi",
... ... @@ -287,9 +291,7 @@
287 291 .rates = WM9705_AC97_RATES,
288 292 .formats = SNDRV_PCM_FMTBIT_S16_LE,
289 293 },
290   - .ops = {
291   - .prepare = ac97_prepare,
292   - },
  294 + .ops = &wm9705_dai_ops,
293 295 },
294 296 {
295 297 .name = "AC97 Aux",
sound/soc/codecs/wm9712.c
... ... @@ -517,6 +517,14 @@
517 517 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
518 518 SNDRV_PCM_RATE_48000)
519 519  
  520 +static struct snd_soc_dai_ops wm9712_dai_ops_hifi = {
  521 + .prepare = ac97_prepare,
  522 +};
  523 +
  524 +static struct snd_soc_dai_ops wm9712_dai_ops_aux = {
  525 + .prepare = ac97_aux_prepare,
  526 +};
  527 +
520 528 struct snd_soc_dai wm9712_dai[] = {
521 529 {
522 530 .name = "AC97 HiFi",
... ... @@ -533,8 +541,7 @@
533 541 .channels_max = 2,
534 542 .rates = WM9712_AC97_RATES,
535 543 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
536   - .ops = {
537   - .prepare = ac97_prepare,},
  544 + .ops = &wm9712_dai_ops_hifi,
538 545 },
539 546 {
540 547 .name = "AC97 Aux",
... ... @@ -544,8 +551,7 @@
544 551 .channels_max = 1,
545 552 .rates = WM9712_AC97_RATES,
546 553 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
547   - .ops = {
548   - .prepare = ac97_aux_prepare,},
  554 + .ops = &wm9712_dai_ops_aux,
549 555 }
550 556 };
551 557 EXPORT_SYMBOL_GPL(wm9712_dai);
sound/soc/codecs/wm9713.c
... ... @@ -1005,6 +1005,27 @@
1005 1005 (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
1006 1006 SNDRV_PCM_FORMAT_S24_LE)
1007 1007  
  1008 +static struct snd_soc_dai_ops wm9713_dai_ops_hifi = {
  1009 + .prepare = ac97_hifi_prepare,
  1010 + .set_clkdiv = wm9713_set_dai_clkdiv,
  1011 + .set_pll = wm9713_set_dai_pll,
  1012 +};
  1013 +
  1014 +static struct snd_soc_dai_ops wm9713_dai_ops_aux = {
  1015 + .prepare = ac97_aux_prepare,
  1016 + .set_clkdiv = wm9713_set_dai_clkdiv,
  1017 + .set_pll = wm9713_set_dai_pll,
  1018 +};
  1019 +
  1020 +static struct snd_soc_dai_ops wm9713_dai_ops_voice = {
  1021 + .hw_params = wm9713_pcm_hw_params,
  1022 + .shutdown = wm9713_voiceshutdown,
  1023 + .set_clkdiv = wm9713_set_dai_clkdiv,
  1024 + .set_pll = wm9713_set_dai_pll,
  1025 + .set_fmt = wm9713_set_dai_fmt,
  1026 + .set_tristate = wm9713_set_dai_tristate,
  1027 +};
  1028 +
1008 1029 struct snd_soc_dai wm9713_dai[] = {
1009 1030 {
1010 1031 .name = "AC97 HiFi",
... ... @@ -1021,10 +1042,7 @@
1021 1042 .channels_max = 2,
1022 1043 .rates = WM9713_RATES,
1023 1044 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
1024   - .ops = {
1025   - .prepare = ac97_hifi_prepare,
1026   - .set_clkdiv = wm9713_set_dai_clkdiv,
1027   - .set_pll = wm9713_set_dai_pll,},
  1045 + .ops = &wm9713_dai_ops_hifi,
1028 1046 },
1029 1047 {
1030 1048 .name = "AC97 Aux",
... ... @@ -1034,10 +1052,7 @@
1034 1052 .channels_max = 1,
1035 1053 .rates = WM9713_RATES,
1036 1054 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
1037   - .ops = {
1038   - .prepare = ac97_aux_prepare,
1039   - .set_clkdiv = wm9713_set_dai_clkdiv,
1040   - .set_pll = wm9713_set_dai_pll,},
  1055 + .ops = &wm9713_dai_ops_aux,
1041 1056 },
1042 1057 {
1043 1058 .name = "WM9713 Voice",
... ... @@ -1053,14 +1068,7 @@
1053 1068 .channels_max = 2,
1054 1069 .rates = WM9713_PCM_RATES,
1055 1070 .formats = WM9713_PCM_FORMATS,},
1056   - .ops = {
1057   - .hw_params = wm9713_pcm_hw_params,
1058   - .shutdown = wm9713_voiceshutdown,
1059   - .set_clkdiv = wm9713_set_dai_clkdiv,
1060   - .set_pll = wm9713_set_dai_pll,
1061   - .set_fmt = wm9713_set_dai_fmt,
1062   - .set_tristate = wm9713_set_dai_tristate,
1063   - },
  1071 + .ops = &wm9713_dai_ops_voice,
1064 1072 },
1065 1073 };
1066 1074 EXPORT_SYMBOL_GPL(wm9713_dai);
sound/soc/davinci/davinci-i2s.c
... ... @@ -499,6 +499,13 @@
499 499  
500 500 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
501 501  
  502 +static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
  503 + .startup = davinci_i2s_startup,
  504 + .trigger = davinci_i2s_trigger,
  505 + .hw_params = davinci_i2s_hw_params,
  506 + .set_fmt = davinci_i2s_set_dai_fmt,
  507 +};
  508 +
502 509 struct snd_soc_dai davinci_i2s_dai = {
503 510 .name = "davinci-i2s",
504 511 .id = 0,
... ... @@ -514,12 +521,7 @@
514 521 .channels_max = 2,
515 522 .rates = DAVINCI_I2S_RATES,
516 523 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
517   - .ops = {
518   - .startup = davinci_i2s_startup,
519   - .trigger = davinci_i2s_trigger,
520   - .hw_params = davinci_i2s_hw_params,
521   - .set_fmt = davinci_i2s_set_dai_fmt,
522   - },
  524 + .ops = &davinci_i2s_dai_ops,
523 525 };
524 526 EXPORT_SYMBOL_GPL(davinci_i2s_dai);
525 527  
sound/soc/fsl/fsl_ssi.c
... ... @@ -580,6 +580,15 @@
580 580 /**
581 581 * fsl_ssi_dai_template: template CPU DAI for the SSI
582 582 */
  583 +static struct snd_soc_dai_ops fsl_ssi_dai_ops = {
  584 + .startup = fsl_ssi_startup,
  585 + .hw_params = fsl_ssi_hw_params,
  586 + .shutdown = fsl_ssi_shutdown,
  587 + .trigger = fsl_ssi_trigger,
  588 + .set_sysclk = fsl_ssi_set_sysclk,
  589 + .set_fmt = fsl_ssi_set_fmt,
  590 +};
  591 +
583 592 static struct snd_soc_dai fsl_ssi_dai_template = {
584 593 .playback = {
585 594 /* The SSI does not support monaural audio. */
... ... @@ -594,14 +603,7 @@
594 603 .rates = FSLSSI_I2S_RATES,
595 604 .formats = FSLSSI_I2S_FORMATS,
596 605 },
597   - .ops = {
598   - .startup = fsl_ssi_startup,
599   - .hw_params = fsl_ssi_hw_params,
600   - .shutdown = fsl_ssi_shutdown,
601   - .trigger = fsl_ssi_trigger,
602   - .set_sysclk = fsl_ssi_set_sysclk,
603   - .set_fmt = fsl_ssi_set_fmt,
604   - },
  606 + .ops = &fsl_ssi_dai_ops,
605 607 };
606 608  
607 609 /**
sound/soc/fsl/mpc5200_psc_i2s.c
... ... @@ -468,6 +468,16 @@
468 468 /**
469 469 * psc_i2s_dai_template: template CPU Digital Audio Interface
470 470 */
  471 +static struct snd_soc_dai_ops psc_i2s_dai_ops = {
  472 + .startup = psc_i2s_startup,
  473 + .hw_params = psc_i2s_hw_params,
  474 + .hw_free = psc_i2s_hw_free,
  475 + .shutdown = psc_i2s_shutdown,
  476 + .trigger = psc_i2s_trigger,
  477 + .set_sysclk = psc_i2s_set_sysclk,
  478 + .set_fmt = psc_i2s_set_fmt,
  479 +};
  480 +
471 481 static struct snd_soc_dai psc_i2s_dai_template = {
472 482 .playback = {
473 483 .channels_min = 2,
... ... @@ -481,15 +491,7 @@
481 491 .rates = PSC_I2S_RATES,
482 492 .formats = PSC_I2S_FORMATS,
483 493 },
484   - .ops = {
485   - .startup = psc_i2s_startup,
486   - .hw_params = psc_i2s_hw_params,
487   - .hw_free = psc_i2s_hw_free,
488   - .shutdown = psc_i2s_shutdown,
489   - .trigger = psc_i2s_trigger,
490   - .set_sysclk = psc_i2s_set_sysclk,
491   - .set_fmt = psc_i2s_set_fmt,
492   - },
  494 + .ops = &psc_i2s_dai_ops,
493 495 };
494 496  
495 497 /* ---------------------------------------------------------------------
sound/soc/omap/omap-mcbsp.c
... ... @@ -461,6 +461,16 @@
461 461 return err;
462 462 }
463 463  
  464 +static struct snd_soc_dai_ops omap_mcbsp_dai_ops = {
  465 + .startup = omap_mcbsp_dai_startup,
  466 + .shutdown = omap_mcbsp_dai_shutdown,
  467 + .trigger = omap_mcbsp_dai_trigger,
  468 + .hw_params = omap_mcbsp_dai_hw_params,
  469 + .set_fmt = omap_mcbsp_dai_set_dai_fmt,
  470 + .set_clkdiv = omap_mcbsp_dai_set_clkdiv,
  471 + .set_sysclk = omap_mcbsp_dai_set_dai_sysclk,
  472 +};
  473 +
464 474 #define OMAP_MCBSP_DAI_BUILDER(link_id) \
465 475 { \
466 476 .name = "omap-mcbsp-dai-"#link_id, \
... ... @@ -477,15 +487,7 @@
477 487 .rates = OMAP_MCBSP_RATES, \
478 488 .formats = SNDRV_PCM_FMTBIT_S16_LE, \
479 489 }, \
480   - .ops = { \
481   - .startup = omap_mcbsp_dai_startup, \
482   - .shutdown = omap_mcbsp_dai_shutdown, \
483   - .trigger = omap_mcbsp_dai_trigger, \
484   - .hw_params = omap_mcbsp_dai_hw_params, \
485   - .set_fmt = omap_mcbsp_dai_set_dai_fmt, \
486   - .set_clkdiv = omap_mcbsp_dai_set_clkdiv, \
487   - .set_sysclk = omap_mcbsp_dai_set_dai_sysclk, \
488   - }, \
  490 + .ops = &omap_mcbsp_dai_ops, \
489 491 .private_data = &mcbsp_data[(link_id)].bus_id, \
490 492 }
491 493  
sound/soc/pxa/pxa-ssp.c
... ... @@ -794,6 +794,19 @@
794 794 SNDRV_PCM_FMTBIT_S24_LE | \
795 795 SNDRV_PCM_FMTBIT_S32_LE)
796 796  
  797 +static struct snd_soc_dai_ops pxa_ssp_dai_ops = {
  798 + .startup = pxa_ssp_startup,
  799 + .shutdown = pxa_ssp_shutdown,
  800 + .trigger = pxa_ssp_trigger,
  801 + .hw_params = pxa_ssp_hw_params,
  802 + .set_sysclk = pxa_ssp_set_dai_sysclk,
  803 + .set_clkdiv = pxa_ssp_set_dai_clkdiv,
  804 + .set_pll = pxa_ssp_set_dai_pll,
  805 + .set_fmt = pxa_ssp_set_dai_fmt,
  806 + .set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
  807 + .set_tristate = pxa_ssp_set_dai_tristate,
  808 +};
  809 +
797 810 struct snd_soc_dai pxa_ssp_dai[] = {
798 811 {
799 812 .name = "pxa2xx-ssp1",
... ... @@ -814,18 +827,7 @@
814 827 .rates = PXA_SSP_RATES,
815 828 .formats = PXA_SSP_FORMATS,
816 829 },
817   - .ops = {
818   - .startup = pxa_ssp_startup,
819   - .shutdown = pxa_ssp_shutdown,
820   - .trigger = pxa_ssp_trigger,
821   - .hw_params = pxa_ssp_hw_params,
822   - .set_sysclk = pxa_ssp_set_dai_sysclk,
823   - .set_clkdiv = pxa_ssp_set_dai_clkdiv,
824   - .set_pll = pxa_ssp_set_dai_pll,
825   - .set_fmt = pxa_ssp_set_dai_fmt,
826   - .set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
827   - .set_tristate = pxa_ssp_set_dai_tristate,
828   - },
  830 + .ops = &pxa_ssp_dai_ops,
829 831 },
830 832 { .name = "pxa2xx-ssp2",
831 833 .id = 1,
... ... @@ -845,18 +847,7 @@
845 847 .rates = PXA_SSP_RATES,
846 848 .formats = PXA_SSP_FORMATS,
847 849 },
848   - .ops = {
849   - .startup = pxa_ssp_startup,
850   - .shutdown = pxa_ssp_shutdown,
851   - .trigger = pxa_ssp_trigger,
852   - .hw_params = pxa_ssp_hw_params,
853   - .set_sysclk = pxa_ssp_set_dai_sysclk,
854   - .set_clkdiv = pxa_ssp_set_dai_clkdiv,
855   - .set_pll = pxa_ssp_set_dai_pll,
856   - .set_fmt = pxa_ssp_set_dai_fmt,
857   - .set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
858   - .set_tristate = pxa_ssp_set_dai_tristate,
859   - },
  850 + .ops = &pxa_ssp_dai_ops,
860 851 },
861 852 {
862 853 .name = "pxa2xx-ssp3",
... ... @@ -877,18 +868,7 @@
877 868 .rates = PXA_SSP_RATES,
878 869 .formats = PXA_SSP_FORMATS,
879 870 },
880   - .ops = {
881   - .startup = pxa_ssp_startup,
882   - .shutdown = pxa_ssp_shutdown,
883   - .trigger = pxa_ssp_trigger,
884   - .hw_params = pxa_ssp_hw_params,
885   - .set_sysclk = pxa_ssp_set_dai_sysclk,
886   - .set_clkdiv = pxa_ssp_set_dai_clkdiv,
887   - .set_pll = pxa_ssp_set_dai_pll,
888   - .set_fmt = pxa_ssp_set_dai_fmt,
889   - .set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
890   - .set_tristate = pxa_ssp_set_dai_tristate,
891   - },
  871 + .ops = &pxa_ssp_dai_ops,
892 872 },
893 873 {
894 874 .name = "pxa2xx-ssp4",
... ... @@ -909,18 +889,7 @@
909 889 .rates = PXA_SSP_RATES,
910 890 .formats = PXA_SSP_FORMATS,
911 891 },
912   - .ops = {
913   - .startup = pxa_ssp_startup,
914   - .shutdown = pxa_ssp_shutdown,
915   - .trigger = pxa_ssp_trigger,
916   - .hw_params = pxa_ssp_hw_params,
917   - .set_sysclk = pxa_ssp_set_dai_sysclk,
918   - .set_clkdiv = pxa_ssp_set_dai_clkdiv,
919   - .set_pll = pxa_ssp_set_dai_pll,
920   - .set_fmt = pxa_ssp_set_dai_fmt,
921   - .set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
922   - .set_tristate = pxa_ssp_set_dai_tristate,
923   - },
  892 + .ops = &pxa_ssp_dai_ops,
924 893 },
925 894 };
926 895 EXPORT_SYMBOL_GPL(pxa_ssp_dai);
sound/soc/pxa/pxa2xx-ac97.c
... ... @@ -164,6 +164,10 @@
164 164 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \
165 165 SNDRV_PCM_RATE_48000)
166 166  
  167 +static struct snd_soc_dai_ops pxa_ac97_dai_ops = {
  168 + .hw_params = pxa2xx_ac97_hw_params,
  169 +};
  170 +
167 171 /*
168 172 * There is only 1 physical AC97 interface for pxa2xx, but it
169 173 * has extra fifo's that can be used for aux DACs and ADCs.
... ... @@ -189,8 +193,7 @@
189 193 .channels_max = 2,
190 194 .rates = PXA2XX_AC97_RATES,
191 195 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
192   - .ops = {
193   - .hw_params = pxa2xx_ac97_hw_params,},
  196 + .ops = &pxa_ac97_dai_ops,
194 197 },
195 198 {
196 199 .name = "pxa2xx-ac97-aux",
... ... @@ -208,8 +211,7 @@
208 211 .channels_max = 1,
209 212 .rates = PXA2XX_AC97_RATES,
210 213 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
211   - .ops = {
212   - .hw_params = pxa2xx_ac97_hw_aux_params,},
  214 + .ops = &pxa_ac97_dai_ops,
213 215 },
214 216 {
215 217 .name = "pxa2xx-ac97-mic",
... ... @@ -221,8 +223,7 @@
221 223 .channels_max = 1,
222 224 .rates = PXA2XX_AC97_RATES,
223 225 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
224   - .ops = {
225   - .hw_params = pxa2xx_ac97_hw_mic_params,},
  226 + .ops = &pxa_ac97_dai_ops,
226 227 },
227 228 };
228 229  
sound/soc/pxa/pxa2xx-i2s.c
... ... @@ -304,6 +304,15 @@
304 304 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \
305 305 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
306 306  
  307 +static struct snd_soc_dai_ops pxa_i2s_dai_ops = {
  308 + .startup = pxa2xx_i2s_startup,
  309 + .shutdown = pxa2xx_i2s_shutdown,
  310 + .trigger = pxa2xx_i2s_trigger,
  311 + .hw_params = pxa2xx_i2s_hw_params,
  312 + .set_fmt = pxa2xx_i2s_set_dai_fmt,
  313 + .set_sysclk = pxa2xx_i2s_set_dai_sysclk,
  314 +};
  315 +
307 316 struct snd_soc_dai pxa_i2s_dai = {
308 317 .name = "pxa2xx-i2s",
309 318 .id = 0,
... ... @@ -319,14 +328,7 @@
319 328 .channels_max = 2,
320 329 .rates = PXA2XX_I2S_RATES,
321 330 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
322   - .ops = {
323   - .startup = pxa2xx_i2s_startup,
324   - .shutdown = pxa2xx_i2s_shutdown,
325   - .trigger = pxa2xx_i2s_trigger,
326   - .hw_params = pxa2xx_i2s_hw_params,
327   - .set_fmt = pxa2xx_i2s_set_dai_fmt,
328   - .set_sysclk = pxa2xx_i2s_set_dai_sysclk,
329   - },
  331 + .ops = &pxa_i2s_dai_ops,
330 332 };
331 333  
332 334 EXPORT_SYMBOL_GPL(pxa_i2s_dai);
sound/soc/s3c24xx/s3c2412-i2s.c
... ... @@ -147,6 +147,10 @@
147 147 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
148 148 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
149 149  
  150 +static struct snd_soc_dai_ops s3c2412_i2s_dai_ops = {
  151 + .set_sysclk = s3c2412_i2s_set_sysclk,
  152 +};
  153 +
150 154 struct snd_soc_dai s3c2412_i2s_dai = {
151 155 .name = "s3c2412-i2s",
152 156 .id = 0,
... ... @@ -163,9 +167,7 @@
163 167 .rates = S3C2412_I2S_RATES,
164 168 .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,
165 169 },
166   - .ops = {
167   - .set_sysclk = s3c2412_i2s_set_sysclk,
168   - },
  170 + .ops = &s3c2412_i2s_dai_ops,
169 171 };
170 172 EXPORT_SYMBOL_GPL(s3c2412_i2s_dai);
171 173  
sound/soc/s3c24xx/s3c2443-ac97.c
... ... @@ -355,6 +355,16 @@
355 355 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
356 356 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
357 357  
  358 +static struct snd_soc_dai_ops s3c2443_ac97_dai_ops = {
  359 + .hw_params = s3c2443_ac97_hw_params,
  360 + .trigger = s3c2443_ac97_trigger,
  361 +};
  362 +
  363 +static struct snd_soc_dai_ops s3c2443_ac97_mic_dai_ops = {
  364 + .hw_params = s3c2443_ac97_hw_mic_params,
  365 + .trigger = s3c2443_ac97_mic_trigger,
  366 +};
  367 +
358 368 struct snd_soc_dai s3c2443_ac97_dai[] = {
359 369 {
360 370 .name = "s3c2443-ac97",
... ... @@ -374,9 +384,7 @@
374 384 .channels_max = 2,
375 385 .rates = s3c2443_AC97_RATES,
376 386 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
377   - .ops = {
378   - .hw_params = s3c2443_ac97_hw_params,
379   - .trigger = s3c2443_ac97_trigger},
  387 + .ops = &s3c2443_ac97_dai_ops,
380 388 },
381 389 {
382 390 .name = "pxa2xx-ac97-mic",
... ... @@ -388,9 +396,7 @@
388 396 .channels_max = 1,
389 397 .rates = s3c2443_AC97_RATES,
390 398 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
391   - .ops = {
392   - .hw_params = s3c2443_ac97_hw_mic_params,
393   - .trigger = s3c2443_ac97_mic_trigger,},
  399 + .ops = &s3c2443_ac97_mic_dai_ops,
394 400 },
395 401 };
396 402 EXPORT_SYMBOL_GPL(s3c2443_ac97_dai);
sound/soc/s3c24xx/s3c24xx-i2s.c
... ... @@ -449,6 +449,14 @@
449 449 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
450 450 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
451 451  
  452 +static struct snd_soc_dai_ops s3c24xx_i2s_dai_ops = {
  453 + .trigger = s3c24xx_i2s_trigger,
  454 + .hw_params = s3c24xx_i2s_hw_params,
  455 + .set_fmt = s3c24xx_i2s_set_fmt,
  456 + .set_clkdiv = s3c24xx_i2s_set_clkdiv,
  457 + .set_sysclk = s3c24xx_i2s_set_sysclk,
  458 +};
  459 +
452 460 struct snd_soc_dai s3c24xx_i2s_dai = {
453 461 .name = "s3c24xx-i2s",
454 462 .id = 0,
... ... @@ -465,13 +473,7 @@
465 473 .channels_max = 2,
466 474 .rates = S3C24XX_I2S_RATES,
467 475 .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
468   - .ops = {
469   - .trigger = s3c24xx_i2s_trigger,
470   - .hw_params = s3c24xx_i2s_hw_params,
471   - .set_fmt = s3c24xx_i2s_set_fmt,
472   - .set_clkdiv = s3c24xx_i2s_set_clkdiv,
473   - .set_sysclk = s3c24xx_i2s_set_sysclk,
474   - },
  476 + .ops = &s3c24xx_i2s_dai_ops,
475 477 };
476 478 EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai);
477 479  
... ... @@ -336,6 +336,16 @@
336 336 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_U24_3LE | \
337 337 SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_U32_LE)
338 338  
  339 +static struct snd_soc_dai_ops ssi_dai_ops = {
  340 + .startup = ssi_startup,
  341 + .shutdown = ssi_shutdown,
  342 + .trigger = ssi_trigger,
  343 + .hw_params = ssi_hw_params,
  344 + .set_sysclk = ssi_set_sysclk,
  345 + .set_clkdiv = ssi_set_clkdiv,
  346 + .set_fmt = ssi_set_fmt,
  347 +};
  348 +
339 349 struct snd_soc_dai sh4_ssi_dai[] = {
340 350 {
341 351 .name = "SSI0",
... ... @@ -352,15 +362,7 @@
352 362 .channels_min = 2,
353 363 .channels_max = 8,
354 364 },
355   - .ops = {
356   - .startup = ssi_startup,
357   - .shutdown = ssi_shutdown,
358   - .trigger = ssi_trigger,
359   - .hw_params = ssi_hw_params,
360   - .set_sysclk = ssi_set_sysclk,
361   - .set_clkdiv = ssi_set_clkdiv,
362   - .set_fmt = ssi_set_fmt,
363   - },
  365 + .ops = &ssi_dai_ops,
364 366 },
365 367 #ifdef CONFIG_CPU_SUBTYPE_SH7760
366 368 {
... ... @@ -378,15 +380,7 @@
378 380 .channels_min = 2,
379 381 .channels_max = 8,
380 382 },
381   - .ops = {
382   - .startup = ssi_startup,
383   - .shutdown = ssi_shutdown,
384   - .trigger = ssi_trigger,
385   - .hw_params = ssi_hw_params,
386   - .set_sysclk = ssi_set_sysclk,
387   - .set_clkdiv = ssi_set_clkdiv,
388   - .set_fmt = ssi_set_fmt,
389   - },
  383 + .ops = &ssi_dai_ops,
390 384 },
391 385 #endif
392 386 };
sound/soc/soc-core.c
... ... @@ -133,8 +133,8 @@
133 133 mutex_lock(&pcm_mutex);
134 134  
135 135 /* startup the audio subsystem */
136   - if (cpu_dai->ops.startup) {
137   - ret = cpu_dai->ops.startup(substream, cpu_dai);
  136 + if (cpu_dai->ops->startup) {
  137 + ret = cpu_dai->ops->startup(substream, cpu_dai);
138 138 if (ret < 0) {
139 139 printk(KERN_ERR "asoc: can't open interface %s\n",
140 140 cpu_dai->name);
... ... @@ -150,8 +150,8 @@
150 150 }
151 151 }
152 152  
153   - if (codec_dai->ops.startup) {
154   - ret = codec_dai->ops.startup(substream, codec_dai);
  153 + if (codec_dai->ops->startup) {
  154 + ret = codec_dai->ops->startup(substream, codec_dai);
155 155 if (ret < 0) {
156 156 printk(KERN_ERR "asoc: can't open codec %s\n",
157 157 codec_dai->name);
... ... @@ -247,8 +247,8 @@
247 247 platform->pcm_ops->close(substream);
248 248  
249 249 platform_err:
250   - if (cpu_dai->ops.shutdown)
251   - cpu_dai->ops.shutdown(substream, cpu_dai);
  250 + if (cpu_dai->ops->shutdown)
  251 + cpu_dai->ops->shutdown(substream, cpu_dai);
252 252 out:
253 253 mutex_unlock(&pcm_mutex);
254 254 return ret;
255 255  
... ... @@ -340,11 +340,11 @@
340 340 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
341 341 snd_soc_dai_digital_mute(codec_dai, 1);
342 342  
343   - if (cpu_dai->ops.shutdown)
344   - cpu_dai->ops.shutdown(substream, cpu_dai);
  343 + if (cpu_dai->ops->shutdown)
  344 + cpu_dai->ops->shutdown(substream, cpu_dai);
345 345  
346   - if (codec_dai->ops.shutdown)
347   - codec_dai->ops.shutdown(substream, codec_dai);
  346 + if (codec_dai->ops->shutdown)
  347 + codec_dai->ops->shutdown(substream, codec_dai);
348 348  
349 349 if (machine->ops && machine->ops->shutdown)
350 350 machine->ops->shutdown(substream);
351 351  
... ... @@ -408,16 +408,16 @@
408 408 }
409 409 }
410 410  
411   - if (codec_dai->ops.prepare) {
412   - ret = codec_dai->ops.prepare(substream, codec_dai);
  411 + if (codec_dai->ops->prepare) {
  412 + ret = codec_dai->ops->prepare(substream, codec_dai);
413 413 if (ret < 0) {
414 414 printk(KERN_ERR "asoc: codec DAI prepare error\n");
415 415 goto out;
416 416 }
417 417 }
418 418  
419   - if (cpu_dai->ops.prepare) {
420   - ret = cpu_dai->ops.prepare(substream, cpu_dai);
  419 + if (cpu_dai->ops->prepare) {
  420 + ret = cpu_dai->ops->prepare(substream, cpu_dai);
421 421 if (ret < 0) {
422 422 printk(KERN_ERR "asoc: cpu DAI prepare error\n");
423 423 goto out;
... ... @@ -494,8 +494,8 @@
494 494 }
495 495 }
496 496  
497   - if (codec_dai->ops.hw_params) {
498   - ret = codec_dai->ops.hw_params(substream, params, codec_dai);
  497 + if (codec_dai->ops->hw_params) {
  498 + ret = codec_dai->ops->hw_params(substream, params, codec_dai);
499 499 if (ret < 0) {
500 500 printk(KERN_ERR "asoc: can't set codec %s hw params\n",
501 501 codec_dai->name);
... ... @@ -503,8 +503,8 @@
503 503 }
504 504 }
505 505  
506   - if (cpu_dai->ops.hw_params) {
507   - ret = cpu_dai->ops.hw_params(substream, params, cpu_dai);
  506 + if (cpu_dai->ops->hw_params) {
  507 + ret = cpu_dai->ops->hw_params(substream, params, cpu_dai);
508 508 if (ret < 0) {
509 509 printk(KERN_ERR "asoc: interface %s hw params failed\n",
510 510 cpu_dai->name);
511 511  
... ... @@ -526,12 +526,12 @@
526 526 return ret;
527 527  
528 528 platform_err:
529   - if (cpu_dai->ops.hw_free)
530   - cpu_dai->ops.hw_free(substream, cpu_dai);
  529 + if (cpu_dai->ops->hw_free)
  530 + cpu_dai->ops->hw_free(substream, cpu_dai);
531 531  
532 532 interface_err:
533   - if (codec_dai->ops.hw_free)
534   - codec_dai->ops.hw_free(substream, codec_dai);
  533 + if (codec_dai->ops->hw_free)
  534 + codec_dai->ops->hw_free(substream, codec_dai);
535 535  
536 536 codec_err:
537 537 if (machine->ops && machine->ops->hw_free)
538 538  
... ... @@ -570,11 +570,11 @@
570 570 platform->pcm_ops->hw_free(substream);
571 571  
572 572 /* now free hw params for the DAI's */
573   - if (codec_dai->ops.hw_free)
574   - codec_dai->ops.hw_free(substream, codec_dai);
  573 + if (codec_dai->ops->hw_free)
  574 + codec_dai->ops->hw_free(substream, codec_dai);
575 575  
576   - if (cpu_dai->ops.hw_free)
577   - cpu_dai->ops.hw_free(substream, cpu_dai);
  576 + if (cpu_dai->ops->hw_free)
  577 + cpu_dai->ops->hw_free(substream, cpu_dai);
578 578  
579 579 mutex_unlock(&pcm_mutex);
580 580 return 0;
... ... @@ -591,8 +591,8 @@
591 591 struct snd_soc_dai *codec_dai = machine->codec_dai;
592 592 int ret;
593 593  
594   - if (codec_dai->ops.trigger) {
595   - ret = codec_dai->ops.trigger(substream, cmd, codec_dai);
  594 + if (codec_dai->ops->trigger) {
  595 + ret = codec_dai->ops->trigger(substream, cmd, codec_dai);
596 596 if (ret < 0)
597 597 return ret;
598 598 }
... ... @@ -603,8 +603,8 @@
603 603 return ret;
604 604 }
605 605  
606   - if (cpu_dai->ops.trigger) {
607   - ret = cpu_dai->ops.trigger(substream, cmd, cpu_dai);
  606 + if (cpu_dai->ops->trigger) {
  607 + ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai);
608 608 if (ret < 0)
609 609 return ret;
610 610 }
... ... @@ -645,8 +645,8 @@
645 645 /* mute any active DAC's */
646 646 for (i = 0; i < card->num_links; i++) {
647 647 struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
648   - if (dai->ops.digital_mute && dai->playback.active)
649   - dai->ops.digital_mute(dai, 1);
  648 + if (dai->ops->digital_mute && dai->playback.active)
  649 + dai->ops->digital_mute(dai, 1);
650 650 }
651 651  
652 652 /* suspend all pcms */
... ... @@ -741,8 +741,8 @@
741 741 /* unmute any active DACs */
742 742 for (i = 0; i < card->num_links; i++) {
743 743 struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
744   - if (dai->ops.digital_mute && dai->playback.active)
745   - dai->ops.digital_mute(dai, 0);
  744 + if (dai->ops->digital_mute && dai->playback.active)
  745 + dai->ops->digital_mute(dai, 0);
746 746 }
747 747  
748 748 for (i = 0; i < card->num_links; i++) {
... ... @@ -2051,8 +2051,8 @@
2051 2051 int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
2052 2052 unsigned int freq, int dir)
2053 2053 {
2054   - if (dai->ops.set_sysclk)
2055   - return dai->ops.set_sysclk(dai, clk_id, freq, dir);
  2054 + if (dai->ops->set_sysclk)
  2055 + return dai->ops->set_sysclk(dai, clk_id, freq, dir);
2056 2056 else
2057 2057 return -EINVAL;
2058 2058 }
... ... @@ -2071,8 +2071,8 @@
2071 2071 int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
2072 2072 int div_id, int div)
2073 2073 {
2074   - if (dai->ops.set_clkdiv)
2075   - return dai->ops.set_clkdiv(dai, div_id, div);
  2074 + if (dai->ops->set_clkdiv)
  2075 + return dai->ops->set_clkdiv(dai, div_id, div);
2076 2076 else
2077 2077 return -EINVAL;
2078 2078 }
... ... @@ -2090,8 +2090,8 @@
2090 2090 int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
2091 2091 int pll_id, unsigned int freq_in, unsigned int freq_out)
2092 2092 {
2093   - if (dai->ops.set_pll)
2094   - return dai->ops.set_pll(dai, pll_id, freq_in, freq_out);
  2093 + if (dai->ops->set_pll)
  2094 + return dai->ops->set_pll(dai, pll_id, freq_in, freq_out);
2095 2095 else
2096 2096 return -EINVAL;
2097 2097 }
... ... @@ -2106,8 +2106,8 @@
2106 2106 */
2107 2107 int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2108 2108 {
2109   - if (dai->ops.set_fmt)
2110   - return dai->ops.set_fmt(dai, fmt);
  2109 + if (dai->ops->set_fmt)
  2110 + return dai->ops->set_fmt(dai, fmt);
2111 2111 else
2112 2112 return -EINVAL;
2113 2113 }
... ... @@ -2125,8 +2125,8 @@
2125 2125 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
2126 2126 unsigned int mask, int slots)
2127 2127 {
2128   - if (dai->ops.set_sysclk)
2129   - return dai->ops.set_tdm_slot(dai, mask, slots);
  2128 + if (dai->ops->set_sysclk)
  2129 + return dai->ops->set_tdm_slot(dai, mask, slots);
2130 2130 else
2131 2131 return -EINVAL;
2132 2132 }
... ... @@ -2141,8 +2141,8 @@
2141 2141 */
2142 2142 int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
2143 2143 {
2144   - if (dai->ops.set_sysclk)
2145   - return dai->ops.set_tristate(dai, tristate);
  2144 + if (dai->ops->set_sysclk)
  2145 + return dai->ops->set_tristate(dai, tristate);
2146 2146 else
2147 2147 return -EINVAL;
2148 2148 }
... ... @@ -2157,8 +2157,8 @@
2157 2157 */
2158 2158 int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute)
2159 2159 {
2160   - if (dai->ops.digital_mute)
2161   - return dai->ops.digital_mute(dai, mute);
  2160 + if (dai->ops->digital_mute)
  2161 + return dai->ops->digital_mute(dai, mute);
2162 2162 else
2163 2163 return -EINVAL;
2164 2164 }
... ... @@ -2211,6 +2211,9 @@
2211 2211 return 0;
2212 2212 }
2213 2213  
  2214 +static struct snd_soc_dai_ops null_dai_ops = {
  2215 +};
  2216 +
2214 2217 /**
2215 2218 * snd_soc_register_dai - Register a DAI with the ASoC core
2216 2219 *
... ... @@ -2224,6 +2227,9 @@
2224 2227 /* The device should become mandatory over time */
2225 2228 if (!dai->dev)
2226 2229 printk(KERN_WARNING "No device for DAI %s\n", dai->name);
  2230 +
  2231 + if (!dai->ops)
  2232 + dai->ops = &null_dai_ops;
2227 2233  
2228 2234 INIT_LIST_HEAD(&dai->list);
2229 2235