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>
This commit is contained in:
Mark Brown 2009-03-11 16:51:31 +00:00
commit 65ec1cd1e2
42 changed files with 495 additions and 433 deletions

View File

@ -203,7 +203,7 @@ struct snd_soc_dai {
int (*resume)(struct snd_soc_dai *dai); int (*resume)(struct snd_soc_dai *dai);
/* ops */ /* ops */
struct snd_soc_dai_ops ops; struct snd_soc_dai_ops *ops;
/* DAI capabilities */ /* DAI capabilities */
struct snd_soc_pcm_stream capture; struct snd_soc_pcm_stream capture;

View File

@ -697,6 +697,15 @@ static int atmel_ssc_resume(struct snd_soc_dai *cpu_dai)
#define ATMEL_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\ #define ATMEL_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops atmel_ssc_dai_ops = {
.startup = atmel_ssc_startup,
.shutdown = atmel_ssc_shutdown,
.prepare = atmel_ssc_prepare,
.hw_params = atmel_ssc_hw_params,
.set_fmt = atmel_ssc_set_dai_fmt,
.set_clkdiv = atmel_ssc_set_dai_clkdiv,
};
struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = { struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
{ .name = "atmel-ssc0", { .name = "atmel-ssc0",
.id = 0, .id = 0,
@ -712,13 +721,7 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.channels_max = 2, .channels_max = 2,
.rates = ATMEL_SSC_RATES, .rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,}, .formats = ATMEL_SSC_FORMATS,},
.ops = { .ops = &atmel_ssc_dai_ops,
.startup = atmel_ssc_startup,
.shutdown = atmel_ssc_shutdown,
.prepare = atmel_ssc_prepare,
.hw_params = atmel_ssc_hw_params,
.set_fmt = atmel_ssc_set_dai_fmt,
.set_clkdiv = atmel_ssc_set_dai_clkdiv,},
.private_data = &ssc_info[0], .private_data = &ssc_info[0],
}, },
#if NUM_SSC_DEVICES == 3 #if NUM_SSC_DEVICES == 3
@ -736,13 +739,7 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.channels_max = 2, .channels_max = 2,
.rates = ATMEL_SSC_RATES, .rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,}, .formats = ATMEL_SSC_FORMATS,},
.ops = { .ops = &atmel_ssc_dai_ops,
.startup = atmel_ssc_startup,
.shutdown = atmel_ssc_shutdown,
.prepare = atmel_ssc_prepare,
.hw_params = atmel_ssc_hw_params,
.set_fmt = atmel_ssc_set_dai_fmt,
.set_clkdiv = atmel_ssc_set_dai_clkdiv,},
.private_data = &ssc_info[1], .private_data = &ssc_info[1],
}, },
{ .name = "atmel-ssc2", { .name = "atmel-ssc2",
@ -759,13 +756,7 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.channels_max = 2, .channels_max = 2,
.rates = ATMEL_SSC_RATES, .rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,}, .formats = ATMEL_SSC_FORMATS,},
.ops = { .ops = &atmel_ssc_dai_ops,
.startup = atmel_ssc_startup,
.shutdown = atmel_ssc_shutdown,
.prepare = atmel_ssc_prepare,
.hw_params = atmel_ssc_hw_params,
.set_fmt = atmel_ssc_set_dai_fmt,
.set_clkdiv = atmel_ssc_set_dai_clkdiv,},
.private_data = &ssc_info[2], .private_data = &ssc_info[2],
}, },
#endif #endif

View File

@ -342,6 +342,11 @@ static int au1xpsc_ac97_resume(struct snd_soc_dai *dai)
return 0; return 0;
} }
static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = {
.trigger = au1xpsc_ac97_trigger,
.hw_params = au1xpsc_ac97_hw_params,
};
struct snd_soc_dai au1xpsc_ac97_dai = { struct snd_soc_dai au1xpsc_ac97_dai = {
.name = "au1xpsc_ac97", .name = "au1xpsc_ac97",
.ac97_control = 1, .ac97_control = 1,
@ -361,10 +366,7 @@ struct snd_soc_dai au1xpsc_ac97_dai = {
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
}, },
.ops = { .ops = &au1xpsc_ac97_dai_ops,
.trigger = au1xpsc_ac97_trigger,
.hw_params = au1xpsc_ac97_hw_params,
},
}; };
EXPORT_SYMBOL_GPL(au1xpsc_ac97_dai); EXPORT_SYMBOL_GPL(au1xpsc_ac97_dai);

View File

@ -367,6 +367,12 @@ static int au1xpsc_i2s_resume(struct snd_soc_dai *cpu_dai)
return 0; return 0;
} }
static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = {
.trigger = au1xpsc_i2s_trigger,
.hw_params = au1xpsc_i2s_hw_params,
.set_fmt = au1xpsc_i2s_set_fmt,
};
struct snd_soc_dai au1xpsc_i2s_dai = { struct snd_soc_dai au1xpsc_i2s_dai = {
.name = "au1xpsc_i2s", .name = "au1xpsc_i2s",
.probe = au1xpsc_i2s_probe, .probe = au1xpsc_i2s_probe,
@ -385,11 +391,7 @@ struct snd_soc_dai au1xpsc_i2s_dai = {
.channels_min = 2, .channels_min = 2,
.channels_max = 8, /* 2 without external help */ .channels_max = 8, /* 2 without external help */
}, },
.ops = { .ops = &au1xpsc_i2s_dai_ops,
.trigger = au1xpsc_i2s_trigger,
.hw_params = au1xpsc_i2s_hw_params,
.set_fmt = au1xpsc_i2s_set_fmt,
},
}; };
EXPORT_SYMBOL(au1xpsc_i2s_dai); EXPORT_SYMBOL(au1xpsc_i2s_dai);

View File

@ -287,6 +287,13 @@ static int bf5xx_i2s_resume(struct platform_device *pdev,
#define BF5XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |\ #define BF5XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |\
SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops bf5xx_i2s_dai_ops = {
.startup = bf5xx_i2s_startup,
.shutdown = bf5xx_i2s_shutdown,
.hw_params = bf5xx_i2s_hw_params,
.set_fmt = bf5xx_i2s_set_dai_fmt,
};
struct snd_soc_dai bf5xx_i2s_dai = { struct snd_soc_dai bf5xx_i2s_dai = {
.name = "bf5xx-i2s", .name = "bf5xx-i2s",
.id = 0, .id = 0,
@ -304,12 +311,7 @@ struct snd_soc_dai bf5xx_i2s_dai = {
.channels_max = 2, .channels_max = 2,
.rates = BF5XX_I2S_RATES, .rates = BF5XX_I2S_RATES,
.formats = BF5XX_I2S_FORMATS,}, .formats = BF5XX_I2S_FORMATS,},
.ops = { .ops = &bf5xx_i2s_dai_ops,
.startup = bf5xx_i2s_startup,
.shutdown = bf5xx_i2s_shutdown,
.hw_params = bf5xx_i2s_hw_params,
.set_fmt = bf5xx_i2s_set_dai_fmt,
},
}; };
EXPORT_SYMBOL_GPL(bf5xx_i2s_dai); EXPORT_SYMBOL_GPL(bf5xx_i2s_dai);

View File

@ -41,6 +41,10 @@ static int ac97_prepare(struct snd_pcm_substream *substream,
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops ac97_dai_ops = {
.prepare = ac97_prepare,
};
struct snd_soc_dai ac97_dai = { struct snd_soc_dai ac97_dai = {
.name = "AC97 HiFi", .name = "AC97 HiFi",
.ac97_control = 1, .ac97_control = 1,
@ -56,8 +60,7 @@ struct snd_soc_dai ac97_dai = {
.channels_max = 2, .channels_max = 2,
.rates = STD_AC97_RATES, .rates = STD_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &ac97_dai_ops,
.prepare = ac97_prepare,},
}; };
EXPORT_SYMBOL_GPL(ac97_dai); EXPORT_SYMBOL_GPL(ac97_dai);

View File

@ -174,6 +174,11 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream,
return ak4104_spi_write(codec, AK4104_REG_CHN_STATUS(3), val); return ak4104_spi_write(codec, AK4104_REG_CHN_STATUS(3), val);
} }
static struct snd_soc_dai_ops ak4101_dai_ops = {
.hw_params = ak4104_hw_params,
.set_fmt = ak4104_set_dai_fmt,
};
struct snd_soc_dai ak4104_dai = { struct snd_soc_dai ak4104_dai = {
.name = DRV_NAME, .name = DRV_NAME,
.playback = { .playback = {
@ -187,10 +192,7 @@ struct snd_soc_dai ak4104_dai = {
SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S24_LE SNDRV_PCM_FMTBIT_S24_LE
}, },
.ops = { .ops = &ak4101_dai_ops,
.hw_params = ak4104_hw_params,
.set_fmt = ak4104_set_dai_fmt,
}
}; };
static struct snd_soc_codec *ak4104_codec; static struct snd_soc_codec *ak4104_codec;

View File

@ -421,6 +421,13 @@ static int ak4535_set_bias_level(struct snd_soc_codec *codec,
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops ak4535_dai_ops = {
.hw_params = ak4535_hw_params,
.set_fmt = ak4535_set_dai_fmt,
.digital_mute = ak4535_mute,
.set_sysclk = ak4535_set_dai_sysclk,
};
struct snd_soc_dai ak4535_dai = { struct snd_soc_dai ak4535_dai = {
.name = "AK4535", .name = "AK4535",
.playback = { .playback = {
@ -435,12 +442,7 @@ struct snd_soc_dai ak4535_dai = {
.channels_max = 2, .channels_max = 2,
.rates = AK4535_RATES, .rates = AK4535_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &ak4535_dai_ops,
.hw_params = ak4535_hw_params,
.set_fmt = ak4535_set_dai_fmt,
.digital_mute = ak4535_mute,
.set_sysclk = ak4535_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(ak4535_dai); EXPORT_SYMBOL_GPL(ak4535_dai);

View File

@ -502,6 +502,13 @@ static const struct snd_kcontrol_new cs4270_snd_controls[] = {
*/ */
static struct snd_soc_codec *cs4270_codec; static struct snd_soc_codec *cs4270_codec;
static struct snd_soc_dai_ops cs4270_dai_ops = {
.hw_params = cs4270_hw_params,
.set_sysclk = cs4270_set_dai_sysclk,
.set_fmt = cs4270_set_dai_fmt,
.digital_mute = cs4270_mute,
};
struct snd_soc_dai cs4270_dai = { struct snd_soc_dai cs4270_dai = {
.name = "cs4270", .name = "cs4270",
.playback = { .playback = {
@ -518,12 +525,7 @@ struct snd_soc_dai cs4270_dai = {
.rates = 0, .rates = 0,
.formats = CS4270_FORMATS, .formats = CS4270_FORMATS,
}, },
.ops = { .ops = &cs4270_dai_ops,
.hw_params = cs4270_hw_params,
.set_sysclk = cs4270_set_dai_sysclk,
.set_fmt = cs4270_set_dai_fmt,
.digital_mute = cs4270_mute,
},
}; };
EXPORT_SYMBOL_GPL(cs4270_dai); EXPORT_SYMBOL_GPL(cs4270_dai);

View File

@ -506,6 +506,16 @@ static int ssm2602_set_bias_level(struct snd_soc_codec *codec,
#define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops ssm2602_dai_ops = {
.startup = ssm2602_startup,
.prepare = ssm2602_pcm_prepare,
.hw_params = ssm2602_hw_params,
.shutdown = ssm2602_shutdown,
.digital_mute = ssm2602_mute,
.set_sysclk = ssm2602_set_dai_sysclk,
.set_fmt = ssm2602_set_dai_fmt,
};
struct snd_soc_dai ssm2602_dai = { struct snd_soc_dai ssm2602_dai = {
.name = "SSM2602", .name = "SSM2602",
.playback = { .playback = {
@ -520,15 +530,7 @@ struct snd_soc_dai ssm2602_dai = {
.channels_max = 2, .channels_max = 2,
.rates = SSM2602_RATES, .rates = SSM2602_RATES,
.formats = SSM2602_FORMATS,}, .formats = SSM2602_FORMATS,},
.ops = { .ops = &ssm2602_dai_ops,
.startup = ssm2602_startup,
.prepare = ssm2602_pcm_prepare,
.hw_params = ssm2602_hw_params,
.shutdown = ssm2602_shutdown,
.digital_mute = ssm2602_mute,
.set_sysclk = ssm2602_set_dai_sysclk,
.set_fmt = ssm2602_set_dai_fmt,
}
}; };
EXPORT_SYMBOL_GPL(ssm2602_dai); EXPORT_SYMBOL_GPL(ssm2602_dai);

View File

@ -580,6 +580,15 @@ static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec,
#define AIC23_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ #define AIC23_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops tlv320aic23_dai_ops = {
.prepare = tlv320aic23_pcm_prepare,
.hw_params = tlv320aic23_hw_params,
.shutdown = tlv320aic23_shutdown,
.digital_mute = tlv320aic23_mute,
.set_fmt = tlv320aic23_set_dai_fmt,
.set_sysclk = tlv320aic23_set_dai_sysclk,
};
struct snd_soc_dai tlv320aic23_dai = { struct snd_soc_dai tlv320aic23_dai = {
.name = "tlv320aic23", .name = "tlv320aic23",
.playback = { .playback = {
@ -594,14 +603,7 @@ struct snd_soc_dai tlv320aic23_dai = {
.channels_max = 2, .channels_max = 2,
.rates = AIC23_RATES, .rates = AIC23_RATES,
.formats = AIC23_FORMATS,}, .formats = AIC23_FORMATS,},
.ops = { .ops = &tlv320aic23_dai_ops,
.prepare = tlv320aic23_pcm_prepare,
.hw_params = tlv320aic23_hw_params,
.shutdown = tlv320aic23_shutdown,
.digital_mute = tlv320aic23_mute,
.set_fmt = tlv320aic23_set_dai_fmt,
.set_sysclk = tlv320aic23_set_dai_sysclk,
}
}; };
EXPORT_SYMBOL_GPL(tlv320aic23_dai); EXPORT_SYMBOL_GPL(tlv320aic23_dai);

View File

@ -270,6 +270,13 @@ static int aic26_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
#define AIC26_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE |\ #define AIC26_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE |\
SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE) SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE)
static struct snd_soc_dai_ops aic26_dai_ops = {
.hw_params = aic26_hw_params,
.digital_mute = aic26_mute,
.set_sysclk = aic26_set_sysclk,
.set_fmt = aic26_set_fmt,
};
struct snd_soc_dai aic26_dai = { struct snd_soc_dai aic26_dai = {
.name = "tlv320aic26", .name = "tlv320aic26",
.playback = { .playback = {
@ -286,12 +293,7 @@ struct snd_soc_dai aic26_dai = {
.rates = AIC26_RATES, .rates = AIC26_RATES,
.formats = AIC26_FORMATS, .formats = AIC26_FORMATS,
}, },
.ops = { .ops = &aic26_dai_ops,
.hw_params = aic26_hw_params,
.digital_mute = aic26_mute,
.set_sysclk = aic26_set_sysclk,
.set_fmt = aic26_set_fmt,
},
}; };
EXPORT_SYMBOL_GPL(aic26_dai); EXPORT_SYMBOL_GPL(aic26_dai);

View File

@ -1088,6 +1088,13 @@ EXPORT_SYMBOL_GPL(aic3x_button_pressed);
#define AIC3X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ #define AIC3X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops aic3x_dai_ops = {
.hw_params = aic3x_hw_params,
.digital_mute = aic3x_mute,
.set_sysclk = aic3x_set_dai_sysclk,
.set_fmt = aic3x_set_dai_fmt,
};
struct snd_soc_dai aic3x_dai = { struct snd_soc_dai aic3x_dai = {
.name = "tlv320aic3x", .name = "tlv320aic3x",
.playback = { .playback = {
@ -1102,12 +1109,7 @@ struct snd_soc_dai aic3x_dai = {
.channels_max = 2, .channels_max = 2,
.rates = AIC3X_RATES, .rates = AIC3X_RATES,
.formats = AIC3X_FORMATS,}, .formats = AIC3X_FORMATS,},
.ops = { .ops = &aic3x_dai_ops,
.hw_params = aic3x_hw_params,
.digital_mute = aic3x_mute,
.set_sysclk = aic3x_set_dai_sysclk,
.set_fmt = aic3x_set_dai_fmt,
}
}; };
EXPORT_SYMBOL_GPL(aic3x_dai); EXPORT_SYMBOL_GPL(aic3x_dai);

View File

@ -431,6 +431,15 @@ SOC_ENUM("PCM Playback De-emphasis", uda134x_mixer_enum[1]),
SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0), SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0),
}; };
static struct snd_soc_dai_ops uda134x_dai_ops = {
.startup = uda134x_startup,
.shutdown = uda134x_shutdown,
.hw_params = uda134x_hw_params,
.digital_mute = uda134x_mute,
.set_sysclk = uda134x_set_dai_sysclk,
.set_fmt = uda134x_set_dai_fmt,
};
struct snd_soc_dai uda134x_dai = { struct snd_soc_dai uda134x_dai = {
.name = "UDA134X", .name = "UDA134X",
/* playback capabilities */ /* playback capabilities */
@ -450,14 +459,7 @@ struct snd_soc_dai uda134x_dai = {
.formats = UDA134X_FORMATS, .formats = UDA134X_FORMATS,
}, },
/* pcm operations */ /* pcm operations */
.ops = { .ops = &uda134x_dai_ops,
.startup = uda134x_startup,
.shutdown = uda134x_shutdown,
.hw_params = uda134x_hw_params,
.digital_mute = uda134x_mute,
.set_sysclk = uda134x_set_dai_sysclk,
.set_fmt = uda134x_set_dai_fmt,
}
}; };
EXPORT_SYMBOL(uda134x_dai); EXPORT_SYMBOL(uda134x_dai);

View File

@ -579,6 +579,27 @@ static int uda1380_set_bias_level(struct snd_soc_codec *codec,
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops uda1380_dai_ops = {
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.trigger = uda1380_trigger,
.set_fmt = uda1380_set_dai_fmt_both,
};
static struct snd_soc_dai_ops uda1380_dai_ops_playback = {
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.trigger = uda1380_trigger,
.set_fmt = uda1380_set_dai_fmt_playback,
};
static struct snd_soc_dai_ops uda1380_dai_ops_capture = {
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.trigger = uda1380_trigger,
.set_fmt = uda1380_set_dai_fmt_capture,
};
struct snd_soc_dai uda1380_dai[] = { struct snd_soc_dai uda1380_dai[] = {
{ {
.name = "UDA1380", .name = "UDA1380",
@ -594,12 +615,7 @@ struct snd_soc_dai uda1380_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = UDA1380_RATES, .rates = UDA1380_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &uda1380_dai_ops,
.trigger = uda1380_trigger,
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.set_fmt = uda1380_set_dai_fmt_both,
},
}, },
{ /* playback only - dual interface */ { /* playback only - dual interface */
.name = "UDA1380", .name = "UDA1380",
@ -610,12 +626,7 @@ struct snd_soc_dai uda1380_dai[] = {
.rates = UDA1380_RATES, .rates = UDA1380_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
}, },
.ops = { .ops = &uda1380_dai_ops_playback,
.trigger = uda1380_trigger,
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.set_fmt = uda1380_set_dai_fmt_playback,
},
}, },
{ /* capture only - dual interface*/ { /* capture only - dual interface*/
.name = "UDA1380", .name = "UDA1380",
@ -626,12 +637,7 @@ struct snd_soc_dai uda1380_dai[] = {
.rates = UDA1380_RATES, .rates = UDA1380_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
}, },
.ops = { .ops = &uda1380_dai_ops_capture,
.trigger = uda1380_trigger,
.hw_params = uda1380_pcm_hw_params,
.shutdown = uda1380_pcm_shutdown,
.set_fmt = uda1380_set_dai_fmt_capture,
},
}, },
}; };
EXPORT_SYMBOL_GPL(uda1380_dai); EXPORT_SYMBOL_GPL(uda1380_dai);

View File

@ -1538,6 +1538,16 @@ static int wm8350_remove(struct platform_device *pdev)
SNDRV_PCM_FMTBIT_S20_3LE |\ SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8350_dai_ops = {
.hw_params = wm8350_pcm_hw_params,
.digital_mute = wm8350_mute,
.trigger = wm8350_pcm_trigger,
.set_fmt = wm8350_set_dai_fmt,
.set_sysclk = wm8350_set_dai_sysclk,
.set_pll = wm8350_set_fll,
.set_clkdiv = wm8350_set_clkdiv,
};
struct snd_soc_dai wm8350_dai = { struct snd_soc_dai wm8350_dai = {
.name = "WM8350", .name = "WM8350",
.playback = { .playback = {
@ -1554,15 +1564,7 @@ struct snd_soc_dai wm8350_dai = {
.rates = WM8350_RATES, .rates = WM8350_RATES,
.formats = WM8350_FORMATS, .formats = WM8350_FORMATS,
}, },
.ops = { .ops = &wm8350_dai_ops,
.hw_params = wm8350_pcm_hw_params,
.digital_mute = wm8350_mute,
.trigger = wm8350_pcm_trigger,
.set_fmt = wm8350_set_dai_fmt,
.set_sysclk = wm8350_set_dai_sysclk,
.set_pll = wm8350_set_fll,
.set_clkdiv = wm8350_set_clkdiv,
},
}; };
EXPORT_SYMBOL_GPL(wm8350_dai); EXPORT_SYMBOL_GPL(wm8350_dai);

View File

@ -1210,6 +1210,14 @@ static int wm8400_set_bias_level(struct snd_soc_codec *codec,
#define WM8400_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8400_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8400_dai_ops = {
.hw_params = wm8400_hw_params,
.digital_mute = wm8400_mute,
.set_fmt = wm8400_set_dai_fmt,
.set_clkdiv = wm8400_set_dai_clkdiv,
.set_sysclk = wm8400_set_dai_sysclk,
};
/* /*
* The WM8400 supports 2 different and mutually exclusive DAI * The WM8400 supports 2 different and mutually exclusive DAI
* configurations. * configurations.
@ -1235,13 +1243,7 @@ struct snd_soc_dai wm8400_dai = {
.rates = WM8400_RATES, .rates = WM8400_RATES,
.formats = WM8400_FORMATS, .formats = WM8400_FORMATS,
}, },
.ops = { .ops = &wm8400_dai_ops,
.hw_params = wm8400_hw_params,
.digital_mute = wm8400_mute,
.set_fmt = wm8400_set_dai_fmt,
.set_clkdiv = wm8400_set_dai_clkdiv,
.set_sysclk = wm8400_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(wm8400_dai); EXPORT_SYMBOL_GPL(wm8400_dai);

View File

@ -554,6 +554,14 @@ static int wm8510_set_bias_level(struct snd_soc_codec *codec,
#define WM8510_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8510_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops wm8510_dai_ops = {
.hw_params = wm8510_pcm_hw_params,
.digital_mute = wm8510_mute,
.set_fmt = wm8510_set_dai_fmt,
.set_clkdiv = wm8510_set_dai_clkdiv,
.set_pll = wm8510_set_dai_pll,
};
struct snd_soc_dai wm8510_dai = { struct snd_soc_dai wm8510_dai = {
.name = "WM8510 HiFi", .name = "WM8510 HiFi",
.playback = { .playback = {
@ -568,13 +576,7 @@ struct snd_soc_dai wm8510_dai = {
.channels_max = 2, .channels_max = 2,
.rates = WM8510_RATES, .rates = WM8510_RATES,
.formats = WM8510_FORMATS,}, .formats = WM8510_FORMATS,},
.ops = { .ops = &wm8510_dai_ops,
.hw_params = wm8510_pcm_hw_params,
.digital_mute = wm8510_mute,
.set_fmt = wm8510_set_dai_fmt,
.set_clkdiv = wm8510_set_dai_clkdiv,
.set_pll = wm8510_set_dai_pll,
},
}; };
EXPORT_SYMBOL_GPL(wm8510_dai); EXPORT_SYMBOL_GPL(wm8510_dai);

View File

@ -769,6 +769,21 @@ static int wm8580_set_bias_level(struct snd_soc_codec *codec,
#define WM8580_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8580_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops wm8580_dai_ops_playback = {
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
.set_pll = wm8580_set_dai_pll,
.digital_mute = wm8580_digital_mute,
};
static struct snd_soc_dai_ops wm8580_dai_ops_capture = {
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
.set_pll = wm8580_set_dai_pll,
};
struct snd_soc_dai wm8580_dai[] = { struct snd_soc_dai wm8580_dai[] = {
{ {
.name = "WM8580 PAIFRX", .name = "WM8580 PAIFRX",
@ -780,13 +795,7 @@ struct snd_soc_dai wm8580_dai[] = {
.rates = SNDRV_PCM_RATE_8000_192000, .rates = SNDRV_PCM_RATE_8000_192000,
.formats = WM8580_FORMATS, .formats = WM8580_FORMATS,
}, },
.ops = { .ops = &wm8580_dai_ops_playback,
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
.set_pll = wm8580_set_dai_pll,
.digital_mute = wm8580_digital_mute,
},
}, },
{ {
.name = "WM8580 PAIFTX", .name = "WM8580 PAIFTX",
@ -798,12 +807,7 @@ struct snd_soc_dai wm8580_dai[] = {
.rates = SNDRV_PCM_RATE_8000_192000, .rates = SNDRV_PCM_RATE_8000_192000,
.formats = WM8580_FORMATS, .formats = WM8580_FORMATS,
}, },
.ops = { .ops = &wm8580_dai_ops_capture,
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
.set_pll = wm8580_set_dai_pll,
},
}, },
}; };
EXPORT_SYMBOL_GPL(wm8580_dai); EXPORT_SYMBOL_GPL(wm8580_dai);

View File

@ -244,6 +244,12 @@ static int wm8728_set_bias_level(struct snd_soc_codec *codec,
#define WM8728_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8728_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8728_dai_ops = {
.hw_params = wm8728_hw_params,
.digital_mute = wm8728_mute,
.set_fmt = wm8728_set_dai_fmt,
};
struct snd_soc_dai wm8728_dai = { struct snd_soc_dai wm8728_dai = {
.name = "WM8728", .name = "WM8728",
.playback = { .playback = {
@ -253,11 +259,7 @@ struct snd_soc_dai wm8728_dai = {
.rates = WM8728_RATES, .rates = WM8728_RATES,
.formats = WM8728_FORMATS, .formats = WM8728_FORMATS,
}, },
.ops = { .ops = &wm8728_dai_ops,
.hw_params = wm8728_hw_params,
.digital_mute = wm8728_mute,
.set_fmt = wm8728_set_dai_fmt,
}
}; };
EXPORT_SYMBOL_GPL(wm8728_dai); EXPORT_SYMBOL_GPL(wm8728_dai);

View File

@ -433,6 +433,15 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
#define WM8731_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8731_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8731_dai_ops = {
.prepare = wm8731_pcm_prepare,
.hw_params = wm8731_hw_params,
.shutdown = wm8731_shutdown,
.digital_mute = wm8731_mute,
.set_sysclk = wm8731_set_dai_sysclk,
.set_fmt = wm8731_set_dai_fmt,
};
struct snd_soc_dai wm8731_dai = { struct snd_soc_dai wm8731_dai = {
.name = "WM8731", .name = "WM8731",
.playback = { .playback = {
@ -447,14 +456,7 @@ struct snd_soc_dai wm8731_dai = {
.channels_max = 2, .channels_max = 2,
.rates = WM8731_RATES, .rates = WM8731_RATES,
.formats = WM8731_FORMATS,}, .formats = WM8731_FORMATS,},
.ops = { .ops = &wm8731_dai_ops,
.prepare = wm8731_pcm_prepare,
.hw_params = wm8731_hw_params,
.shutdown = wm8731_shutdown,
.digital_mute = wm8731_mute,
.set_sysclk = wm8731_set_dai_sysclk,
.set_fmt = wm8731_set_dai_fmt,
}
}; };
EXPORT_SYMBOL_GPL(wm8731_dai); EXPORT_SYMBOL_GPL(wm8731_dai);

View File

@ -679,6 +679,13 @@ static int wm8750_set_bias_level(struct snd_soc_codec *codec,
#define WM8750_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8750_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8750_dai_ops = {
.hw_params = wm8750_pcm_hw_params,
.digital_mute = wm8750_mute,
.set_fmt = wm8750_set_dai_fmt,
.set_sysclk = wm8750_set_dai_sysclk,
};
struct snd_soc_dai wm8750_dai = { struct snd_soc_dai wm8750_dai = {
.name = "WM8750", .name = "WM8750",
.playback = { .playback = {
@ -693,12 +700,7 @@ struct snd_soc_dai wm8750_dai = {
.channels_max = 2, .channels_max = 2,
.rates = WM8750_RATES, .rates = WM8750_RATES,
.formats = WM8750_FORMATS,}, .formats = WM8750_FORMATS,},
.ops = { .ops = &wm8750_dai_ops,
.hw_params = wm8750_pcm_hw_params,
.digital_mute = wm8750_mute,
.set_fmt = wm8750_set_dai_fmt,
.set_sysclk = wm8750_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(wm8750_dai); EXPORT_SYMBOL_GPL(wm8750_dai);

View File

@ -1301,6 +1301,51 @@ static int wm8753_set_bias_level(struct snd_soc_codec *codec,
* 3. Voice disabled - HIFI over HIFI * 3. Voice disabled - HIFI over HIFI
* 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture * 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture
*/ */
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = {
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1h_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
};
static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = {
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1v_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
};
static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = {
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode2_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
};
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = {
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
};
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = {
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
};
static const struct snd_soc_dai wm8753_all_dai[] = { static const struct snd_soc_dai wm8753_all_dai[] = {
/* DAI HiFi mode 1 */ /* DAI HiFi mode 1 */
{ .name = "WM8753 HiFi", { .name = "WM8753 HiFi",
@ -1317,14 +1362,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM8753_RATES, .rates = WM8753_RATES,
.formats = WM8753_FORMATS}, .formats = WM8753_FORMATS},
.ops = { .ops = &wm8753_dai_ops_hifi_mode1,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1h_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
},
}, },
/* DAI Voice mode 1 */ /* DAI Voice mode 1 */
{ .name = "WM8753 Voice", { .name = "WM8753 Voice",
@ -1341,14 +1379,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM8753_RATES, .rates = WM8753_RATES,
.formats = WM8753_FORMATS,}, .formats = WM8753_FORMATS,},
.ops = { .ops = &wm8753_dai_ops_voice_mode1,
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1v_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
},
}, },
/* DAI HiFi mode 2 - dummy */ /* DAI HiFi mode 2 - dummy */
{ .name = "WM8753 HiFi", { .name = "WM8753 HiFi",
@ -1369,14 +1400,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM8753_RATES, .rates = WM8753_RATES,
.formats = WM8753_FORMATS,}, .formats = WM8753_FORMATS,},
.ops = { .ops = &wm8753_dai_ops_voice_mode2,
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode2_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
},
}, },
/* DAI HiFi mode 3 */ /* DAI HiFi mode 3 */
{ .name = "WM8753 HiFi", { .name = "WM8753 HiFi",
@ -1393,14 +1417,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM8753_RATES, .rates = WM8753_RATES,
.formats = WM8753_FORMATS,}, .formats = WM8753_FORMATS,},
.ops = { .ops = &wm8753_dai_ops_hifi_mode3,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
},
}, },
/* DAI Voice mode 3 - dummy */ /* DAI Voice mode 3 - dummy */
{ .name = "WM8753 Voice", { .name = "WM8753 Voice",
@ -1421,14 +1438,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM8753_RATES, .rates = WM8753_RATES,
.formats = WM8753_FORMATS,}, .formats = WM8753_FORMATS,},
.ops = { .ops = &wm8753_dai_ops_hifi_mode4,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
.set_clkdiv = wm8753_set_dai_clkdiv,
.set_pll = wm8753_set_dai_pll,
.set_sysclk = wm8753_set_dai_sysclk,
},
}, },
/* DAI Voice mode 4 - dummy */ /* DAI Voice mode 4 - dummy */
{ .name = "WM8753 Voice", { .name = "WM8753 Voice",

View File

@ -1088,6 +1088,14 @@ static int wm8900_digital_mute(struct snd_soc_dai *codec_dai, int mute)
(SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \ (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
SNDRV_PCM_FORMAT_S24_LE) SNDRV_PCM_FORMAT_S24_LE)
static struct snd_soc_dai_ops wm8900_dai_ops = {
.hw_params = wm8900_hw_params,
.set_clkdiv = wm8900_set_dai_clkdiv,
.set_pll = wm8900_set_dai_pll,
.set_fmt = wm8900_set_dai_fmt,
.digital_mute = wm8900_digital_mute,
};
struct snd_soc_dai wm8900_dai = { struct snd_soc_dai wm8900_dai = {
.name = "WM8900 HiFi", .name = "WM8900 HiFi",
.playback = { .playback = {
@ -1104,13 +1112,7 @@ struct snd_soc_dai wm8900_dai = {
.rates = WM8900_RATES, .rates = WM8900_RATES,
.formats = WM8900_PCM_FORMATS, .formats = WM8900_PCM_FORMATS,
}, },
.ops = { .ops = &wm8900_dai_ops,
.hw_params = wm8900_hw_params,
.set_clkdiv = wm8900_set_dai_clkdiv,
.set_pll = wm8900_set_dai_pll,
.set_fmt = wm8900_set_dai_fmt,
.digital_mute = wm8900_digital_mute,
},
}; };
EXPORT_SYMBOL_GPL(wm8900_dai); EXPORT_SYMBOL_GPL(wm8900_dai);

View File

@ -1497,6 +1497,15 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
SNDRV_PCM_FMTBIT_S20_3LE |\ SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8903_dai_ops = {
.startup = wm8903_startup,
.shutdown = wm8903_shutdown,
.hw_params = wm8903_hw_params,
.digital_mute = wm8903_digital_mute,
.set_fmt = wm8903_set_dai_fmt,
.set_sysclk = wm8903_set_dai_sysclk,
};
struct snd_soc_dai wm8903_dai = { struct snd_soc_dai wm8903_dai = {
.name = "WM8903", .name = "WM8903",
.playback = { .playback = {
@ -1513,14 +1522,7 @@ struct snd_soc_dai wm8903_dai = {
.rates = WM8903_CAPTURE_RATES, .rates = WM8903_CAPTURE_RATES,
.formats = WM8903_FORMATS, .formats = WM8903_FORMATS,
}, },
.ops = { .ops = &wm8903_dai_ops,
.startup = wm8903_startup,
.shutdown = wm8903_shutdown,
.hw_params = wm8903_hw_params,
.digital_mute = wm8903_digital_mute,
.set_fmt = wm8903_set_dai_fmt,
.set_sysclk = wm8903_set_dai_sysclk
}
}; };
EXPORT_SYMBOL_GPL(wm8903_dai); EXPORT_SYMBOL_GPL(wm8903_dai);

View File

@ -604,6 +604,13 @@ static int wm8971_set_bias_level(struct snd_soc_codec *codec,
#define WM8971_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8971_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static struct snd_soc_dai_ops wm8971_dai_ops = {
.hw_params = wm8971_pcm_hw_params,
.digital_mute = wm8971_mute,
.set_fmt = wm8971_set_dai_fmt,
.set_sysclk = wm8971_set_dai_sysclk,
};
struct snd_soc_dai wm8971_dai = { struct snd_soc_dai wm8971_dai = {
.name = "WM8971", .name = "WM8971",
.playback = { .playback = {
@ -618,12 +625,7 @@ struct snd_soc_dai wm8971_dai = {
.channels_max = 2, .channels_max = 2,
.rates = WM8971_RATES, .rates = WM8971_RATES,
.formats = WM8971_FORMATS,}, .formats = WM8971_FORMATS,},
.ops = { .ops = &wm8971_dai_ops,
.hw_params = wm8971_pcm_hw_params,
.digital_mute = wm8971_mute,
.set_fmt = wm8971_set_dai_fmt,
.set_sysclk = wm8971_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(wm8971_dai); EXPORT_SYMBOL_GPL(wm8971_dai);

View File

@ -1332,6 +1332,15 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec,
* 1. ADC/DAC on Primary Interface * 1. ADC/DAC on Primary Interface
* 2. ADC on Primary Interface/DAC on secondary * 2. ADC on Primary Interface/DAC on secondary
*/ */
static struct snd_soc_dai_ops wm8990_dai_ops = {
.hw_params = wm8990_hw_params,
.digital_mute = wm8990_mute,
.set_fmt = wm8990_set_dai_fmt,
.set_clkdiv = wm8990_set_dai_clkdiv,
.set_pll = wm8990_set_dai_pll,
.set_sysclk = wm8990_set_dai_sysclk,
};
struct snd_soc_dai wm8990_dai = { struct snd_soc_dai wm8990_dai = {
/* ADC/DAC on primary */ /* ADC/DAC on primary */
.name = "WM8990 ADC/DAC Primary", .name = "WM8990 ADC/DAC Primary",
@ -1348,14 +1357,7 @@ struct snd_soc_dai wm8990_dai = {
.channels_max = 2, .channels_max = 2,
.rates = WM8990_RATES, .rates = WM8990_RATES,
.formats = WM8990_FORMATS,}, .formats = WM8990_FORMATS,},
.ops = { .ops = &wm8990_dai_ops,
.hw_params = wm8990_hw_params,
.digital_mute = wm8990_mute,
.set_fmt = wm8990_set_dai_fmt,
.set_clkdiv = wm8990_set_dai_clkdiv,
.set_pll = wm8990_set_dai_pll,
.set_sysclk = wm8990_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(wm8990_dai); EXPORT_SYMBOL_GPL(wm8990_dai);

View File

@ -269,6 +269,10 @@ static int ac97_prepare(struct snd_pcm_substream *substream,
SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops wm9705_dai_ops = {
.prepare = ac97_prepare,
};
struct snd_soc_dai wm9705_dai[] = { struct snd_soc_dai wm9705_dai[] = {
{ {
.name = "AC97 HiFi", .name = "AC97 HiFi",
@ -287,9 +291,7 @@ struct snd_soc_dai wm9705_dai[] = {
.rates = WM9705_AC97_RATES, .rates = WM9705_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
}, },
.ops = { .ops = &wm9705_dai_ops,
.prepare = ac97_prepare,
},
}, },
{ {
.name = "AC97 Aux", .name = "AC97 Aux",

View File

@ -517,6 +517,14 @@ static int ac97_aux_prepare(struct snd_pcm_substream *substream,
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops wm9712_dai_ops_hifi = {
.prepare = ac97_prepare,
};
static struct snd_soc_dai_ops wm9712_dai_ops_aux = {
.prepare = ac97_aux_prepare,
};
struct snd_soc_dai wm9712_dai[] = { struct snd_soc_dai wm9712_dai[] = {
{ {
.name = "AC97 HiFi", .name = "AC97 HiFi",
@ -533,8 +541,7 @@ struct snd_soc_dai wm9712_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM9712_AC97_RATES, .rates = WM9712_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &wm9712_dai_ops_hifi,
.prepare = ac97_prepare,},
}, },
{ {
.name = "AC97 Aux", .name = "AC97 Aux",
@ -544,8 +551,7 @@ struct snd_soc_dai wm9712_dai[] = {
.channels_max = 1, .channels_max = 1,
.rates = WM9712_AC97_RATES, .rates = WM9712_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &wm9712_dai_ops_aux,
.prepare = ac97_aux_prepare,},
} }
}; };
EXPORT_SYMBOL_GPL(wm9712_dai); EXPORT_SYMBOL_GPL(wm9712_dai);

View File

@ -1005,6 +1005,27 @@ static int ac97_aux_prepare(struct snd_pcm_substream *substream,
(SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \ (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
SNDRV_PCM_FORMAT_S24_LE) SNDRV_PCM_FORMAT_S24_LE)
static struct snd_soc_dai_ops wm9713_dai_ops_hifi = {
.prepare = ac97_hifi_prepare,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,
};
static struct snd_soc_dai_ops wm9713_dai_ops_aux = {
.prepare = ac97_aux_prepare,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,
};
static struct snd_soc_dai_ops wm9713_dai_ops_voice = {
.hw_params = wm9713_pcm_hw_params,
.shutdown = wm9713_voiceshutdown,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,
.set_fmt = wm9713_set_dai_fmt,
.set_tristate = wm9713_set_dai_tristate,
};
struct snd_soc_dai wm9713_dai[] = { struct snd_soc_dai wm9713_dai[] = {
{ {
.name = "AC97 HiFi", .name = "AC97 HiFi",
@ -1021,10 +1042,7 @@ struct snd_soc_dai wm9713_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM9713_RATES, .rates = WM9713_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &wm9713_dai_ops_hifi,
.prepare = ac97_hifi_prepare,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,},
}, },
{ {
.name = "AC97 Aux", .name = "AC97 Aux",
@ -1034,10 +1052,7 @@ struct snd_soc_dai wm9713_dai[] = {
.channels_max = 1, .channels_max = 1,
.rates = WM9713_RATES, .rates = WM9713_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &wm9713_dai_ops_aux,
.prepare = ac97_aux_prepare,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,},
}, },
{ {
.name = "WM9713 Voice", .name = "WM9713 Voice",
@ -1053,14 +1068,7 @@ struct snd_soc_dai wm9713_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = WM9713_PCM_RATES, .rates = WM9713_PCM_RATES,
.formats = WM9713_PCM_FORMATS,}, .formats = WM9713_PCM_FORMATS,},
.ops = { .ops = &wm9713_dai_ops_voice,
.hw_params = wm9713_pcm_hw_params,
.shutdown = wm9713_voiceshutdown,
.set_clkdiv = wm9713_set_dai_clkdiv,
.set_pll = wm9713_set_dai_pll,
.set_fmt = wm9713_set_dai_fmt,
.set_tristate = wm9713_set_dai_tristate,
},
}, },
}; };
EXPORT_SYMBOL_GPL(wm9713_dai); EXPORT_SYMBOL_GPL(wm9713_dai);

View File

@ -499,6 +499,13 @@ static void davinci_i2s_remove(struct platform_device *pdev,
#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
.startup = davinci_i2s_startup,
.trigger = davinci_i2s_trigger,
.hw_params = davinci_i2s_hw_params,
.set_fmt = davinci_i2s_set_dai_fmt,
};
struct snd_soc_dai davinci_i2s_dai = { struct snd_soc_dai davinci_i2s_dai = {
.name = "davinci-i2s", .name = "davinci-i2s",
.id = 0, .id = 0,
@ -514,12 +521,7 @@ struct snd_soc_dai davinci_i2s_dai = {
.channels_max = 2, .channels_max = 2,
.rates = DAVINCI_I2S_RATES, .rates = DAVINCI_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &davinci_i2s_dai_ops,
.startup = davinci_i2s_startup,
.trigger = davinci_i2s_trigger,
.hw_params = davinci_i2s_hw_params,
.set_fmt = davinci_i2s_set_dai_fmt,
},
}; };
EXPORT_SYMBOL_GPL(davinci_i2s_dai); EXPORT_SYMBOL_GPL(davinci_i2s_dai);

View File

@ -580,6 +580,15 @@ static int fsl_ssi_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format)
/** /**
* fsl_ssi_dai_template: template CPU DAI for the SSI * fsl_ssi_dai_template: template CPU DAI for the SSI
*/ */
static struct snd_soc_dai_ops fsl_ssi_dai_ops = {
.startup = fsl_ssi_startup,
.hw_params = fsl_ssi_hw_params,
.shutdown = fsl_ssi_shutdown,
.trigger = fsl_ssi_trigger,
.set_sysclk = fsl_ssi_set_sysclk,
.set_fmt = fsl_ssi_set_fmt,
};
static struct snd_soc_dai fsl_ssi_dai_template = { static struct snd_soc_dai fsl_ssi_dai_template = {
.playback = { .playback = {
/* The SSI does not support monaural audio. */ /* The SSI does not support monaural audio. */
@ -594,14 +603,7 @@ static struct snd_soc_dai fsl_ssi_dai_template = {
.rates = FSLSSI_I2S_RATES, .rates = FSLSSI_I2S_RATES,
.formats = FSLSSI_I2S_FORMATS, .formats = FSLSSI_I2S_FORMATS,
}, },
.ops = { .ops = &fsl_ssi_dai_ops,
.startup = fsl_ssi_startup,
.hw_params = fsl_ssi_hw_params,
.shutdown = fsl_ssi_shutdown,
.trigger = fsl_ssi_trigger,
.set_sysclk = fsl_ssi_set_sysclk,
.set_fmt = fsl_ssi_set_fmt,
},
}; };
/** /**

View File

@ -468,6 +468,16 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format)
/** /**
* psc_i2s_dai_template: template CPU Digital Audio Interface * psc_i2s_dai_template: template CPU Digital Audio Interface
*/ */
static struct snd_soc_dai_ops psc_i2s_dai_ops = {
.startup = psc_i2s_startup,
.hw_params = psc_i2s_hw_params,
.hw_free = psc_i2s_hw_free,
.shutdown = psc_i2s_shutdown,
.trigger = psc_i2s_trigger,
.set_sysclk = psc_i2s_set_sysclk,
.set_fmt = psc_i2s_set_fmt,
};
static struct snd_soc_dai psc_i2s_dai_template = { static struct snd_soc_dai psc_i2s_dai_template = {
.playback = { .playback = {
.channels_min = 2, .channels_min = 2,
@ -481,15 +491,7 @@ static struct snd_soc_dai psc_i2s_dai_template = {
.rates = PSC_I2S_RATES, .rates = PSC_I2S_RATES,
.formats = PSC_I2S_FORMATS, .formats = PSC_I2S_FORMATS,
}, },
.ops = { .ops = &psc_i2s_dai_ops,
.startup = psc_i2s_startup,
.hw_params = psc_i2s_hw_params,
.hw_free = psc_i2s_hw_free,
.shutdown = psc_i2s_shutdown,
.trigger = psc_i2s_trigger,
.set_sysclk = psc_i2s_set_sysclk,
.set_fmt = psc_i2s_set_fmt,
},
}; };
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------

View File

@ -461,6 +461,16 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
return err; return err;
} }
static struct snd_soc_dai_ops omap_mcbsp_dai_ops = {
.startup = omap_mcbsp_dai_startup,
.shutdown = omap_mcbsp_dai_shutdown,
.trigger = omap_mcbsp_dai_trigger,
.hw_params = omap_mcbsp_dai_hw_params,
.set_fmt = omap_mcbsp_dai_set_dai_fmt,
.set_clkdiv = omap_mcbsp_dai_set_clkdiv,
.set_sysclk = omap_mcbsp_dai_set_dai_sysclk,
};
#define OMAP_MCBSP_DAI_BUILDER(link_id) \ #define OMAP_MCBSP_DAI_BUILDER(link_id) \
{ \ { \
.name = "omap-mcbsp-dai-"#link_id, \ .name = "omap-mcbsp-dai-"#link_id, \
@ -477,15 +487,7 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
.rates = OMAP_MCBSP_RATES, \ .rates = OMAP_MCBSP_RATES, \
.formats = SNDRV_PCM_FMTBIT_S16_LE, \ .formats = SNDRV_PCM_FMTBIT_S16_LE, \
}, \ }, \
.ops = { \ .ops = &omap_mcbsp_dai_ops, \
.startup = omap_mcbsp_dai_startup, \
.shutdown = omap_mcbsp_dai_shutdown, \
.trigger = omap_mcbsp_dai_trigger, \
.hw_params = omap_mcbsp_dai_hw_params, \
.set_fmt = omap_mcbsp_dai_set_dai_fmt, \
.set_clkdiv = omap_mcbsp_dai_set_clkdiv, \
.set_sysclk = omap_mcbsp_dai_set_dai_sysclk, \
}, \
.private_data = &mcbsp_data[(link_id)].bus_id, \ .private_data = &mcbsp_data[(link_id)].bus_id, \
} }

View File

@ -794,6 +794,19 @@ static void pxa_ssp_remove(struct platform_device *pdev,
SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops pxa_ssp_dai_ops = {
.startup = pxa_ssp_startup,
.shutdown = pxa_ssp_shutdown,
.trigger = pxa_ssp_trigger,
.hw_params = pxa_ssp_hw_params,
.set_sysclk = pxa_ssp_set_dai_sysclk,
.set_clkdiv = pxa_ssp_set_dai_clkdiv,
.set_pll = pxa_ssp_set_dai_pll,
.set_fmt = pxa_ssp_set_dai_fmt,
.set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
.set_tristate = pxa_ssp_set_dai_tristate,
};
struct snd_soc_dai pxa_ssp_dai[] = { struct snd_soc_dai pxa_ssp_dai[] = {
{ {
.name = "pxa2xx-ssp1", .name = "pxa2xx-ssp1",
@ -814,18 +827,7 @@ struct snd_soc_dai pxa_ssp_dai[] = {
.rates = PXA_SSP_RATES, .rates = PXA_SSP_RATES,
.formats = PXA_SSP_FORMATS, .formats = PXA_SSP_FORMATS,
}, },
.ops = { .ops = &pxa_ssp_dai_ops,
.startup = pxa_ssp_startup,
.shutdown = pxa_ssp_shutdown,
.trigger = pxa_ssp_trigger,
.hw_params = pxa_ssp_hw_params,
.set_sysclk = pxa_ssp_set_dai_sysclk,
.set_clkdiv = pxa_ssp_set_dai_clkdiv,
.set_pll = pxa_ssp_set_dai_pll,
.set_fmt = pxa_ssp_set_dai_fmt,
.set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
.set_tristate = pxa_ssp_set_dai_tristate,
},
}, },
{ .name = "pxa2xx-ssp2", { .name = "pxa2xx-ssp2",
.id = 1, .id = 1,
@ -845,18 +847,7 @@ struct snd_soc_dai pxa_ssp_dai[] = {
.rates = PXA_SSP_RATES, .rates = PXA_SSP_RATES,
.formats = PXA_SSP_FORMATS, .formats = PXA_SSP_FORMATS,
}, },
.ops = { .ops = &pxa_ssp_dai_ops,
.startup = pxa_ssp_startup,
.shutdown = pxa_ssp_shutdown,
.trigger = pxa_ssp_trigger,
.hw_params = pxa_ssp_hw_params,
.set_sysclk = pxa_ssp_set_dai_sysclk,
.set_clkdiv = pxa_ssp_set_dai_clkdiv,
.set_pll = pxa_ssp_set_dai_pll,
.set_fmt = pxa_ssp_set_dai_fmt,
.set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
.set_tristate = pxa_ssp_set_dai_tristate,
},
}, },
{ {
.name = "pxa2xx-ssp3", .name = "pxa2xx-ssp3",
@ -877,18 +868,7 @@ struct snd_soc_dai pxa_ssp_dai[] = {
.rates = PXA_SSP_RATES, .rates = PXA_SSP_RATES,
.formats = PXA_SSP_FORMATS, .formats = PXA_SSP_FORMATS,
}, },
.ops = { .ops = &pxa_ssp_dai_ops,
.startup = pxa_ssp_startup,
.shutdown = pxa_ssp_shutdown,
.trigger = pxa_ssp_trigger,
.hw_params = pxa_ssp_hw_params,
.set_sysclk = pxa_ssp_set_dai_sysclk,
.set_clkdiv = pxa_ssp_set_dai_clkdiv,
.set_pll = pxa_ssp_set_dai_pll,
.set_fmt = pxa_ssp_set_dai_fmt,
.set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
.set_tristate = pxa_ssp_set_dai_tristate,
},
}, },
{ {
.name = "pxa2xx-ssp4", .name = "pxa2xx-ssp4",
@ -909,18 +889,7 @@ struct snd_soc_dai pxa_ssp_dai[] = {
.rates = PXA_SSP_RATES, .rates = PXA_SSP_RATES,
.formats = PXA_SSP_FORMATS, .formats = PXA_SSP_FORMATS,
}, },
.ops = { .ops = &pxa_ssp_dai_ops,
.startup = pxa_ssp_startup,
.shutdown = pxa_ssp_shutdown,
.trigger = pxa_ssp_trigger,
.hw_params = pxa_ssp_hw_params,
.set_sysclk = pxa_ssp_set_dai_sysclk,
.set_clkdiv = pxa_ssp_set_dai_clkdiv,
.set_pll = pxa_ssp_set_dai_pll,
.set_fmt = pxa_ssp_set_dai_fmt,
.set_tdm_slot = pxa_ssp_set_dai_tdm_slot,
.set_tristate = pxa_ssp_set_dai_tristate,
},
}, },
}; };
EXPORT_SYMBOL_GPL(pxa_ssp_dai); EXPORT_SYMBOL_GPL(pxa_ssp_dai);

View File

@ -164,6 +164,10 @@ static int pxa2xx_ac97_hw_mic_params(struct snd_pcm_substream *substream,
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops pxa_ac97_dai_ops = {
.hw_params = pxa2xx_ac97_hw_params,
};
/* /*
* There is only 1 physical AC97 interface for pxa2xx, but it * There is only 1 physical AC97 interface for pxa2xx, but it
* has extra fifo's that can be used for aux DACs and ADCs. * has extra fifo's that can be used for aux DACs and ADCs.
@ -189,8 +193,7 @@ struct snd_soc_dai pxa_ac97_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = PXA2XX_AC97_RATES, .rates = PXA2XX_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &pxa_ac97_dai_ops,
.hw_params = pxa2xx_ac97_hw_params,},
}, },
{ {
.name = "pxa2xx-ac97-aux", .name = "pxa2xx-ac97-aux",
@ -208,8 +211,7 @@ struct snd_soc_dai pxa_ac97_dai[] = {
.channels_max = 1, .channels_max = 1,
.rates = PXA2XX_AC97_RATES, .rates = PXA2XX_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &pxa_ac97_dai_ops,
.hw_params = pxa2xx_ac97_hw_aux_params,},
}, },
{ {
.name = "pxa2xx-ac97-mic", .name = "pxa2xx-ac97-mic",
@ -221,8 +223,7 @@ struct snd_soc_dai pxa_ac97_dai[] = {
.channels_max = 1, .channels_max = 1,
.rates = PXA2XX_AC97_RATES, .rates = PXA2XX_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &pxa_ac97_dai_ops,
.hw_params = pxa2xx_ac97_hw_mic_params,},
}, },
}; };

View File

@ -304,6 +304,15 @@ static int pxa2xx_i2s_resume(struct snd_soc_dai *dai)
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
static struct snd_soc_dai_ops pxa_i2s_dai_ops = {
.startup = pxa2xx_i2s_startup,
.shutdown = pxa2xx_i2s_shutdown,
.trigger = pxa2xx_i2s_trigger,
.hw_params = pxa2xx_i2s_hw_params,
.set_fmt = pxa2xx_i2s_set_dai_fmt,
.set_sysclk = pxa2xx_i2s_set_dai_sysclk,
};
struct snd_soc_dai pxa_i2s_dai = { struct snd_soc_dai pxa_i2s_dai = {
.name = "pxa2xx-i2s", .name = "pxa2xx-i2s",
.id = 0, .id = 0,
@ -319,14 +328,7 @@ struct snd_soc_dai pxa_i2s_dai = {
.channels_max = 2, .channels_max = 2,
.rates = PXA2XX_I2S_RATES, .rates = PXA2XX_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &pxa_i2s_dai_ops,
.startup = pxa2xx_i2s_startup,
.shutdown = pxa2xx_i2s_shutdown,
.trigger = pxa2xx_i2s_trigger,
.hw_params = pxa2xx_i2s_hw_params,
.set_fmt = pxa2xx_i2s_set_dai_fmt,
.set_sysclk = pxa2xx_i2s_set_dai_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(pxa_i2s_dai); EXPORT_SYMBOL_GPL(pxa_i2s_dai);

View File

@ -147,6 +147,10 @@ static int s3c2412_i2s_probe(struct platform_device *pdev,
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
static struct snd_soc_dai_ops s3c2412_i2s_dai_ops = {
.set_sysclk = s3c2412_i2s_set_sysclk,
};
struct snd_soc_dai s3c2412_i2s_dai = { struct snd_soc_dai s3c2412_i2s_dai = {
.name = "s3c2412-i2s", .name = "s3c2412-i2s",
.id = 0, .id = 0,
@ -163,9 +167,7 @@ struct snd_soc_dai s3c2412_i2s_dai = {
.rates = S3C2412_I2S_RATES, .rates = S3C2412_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,
}, },
.ops = { .ops = &s3c2412_i2s_dai_ops,
.set_sysclk = s3c2412_i2s_set_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(s3c2412_i2s_dai); EXPORT_SYMBOL_GPL(s3c2412_i2s_dai);

View File

@ -355,6 +355,16 @@ static int s3c2443_ac97_mic_trigger(struct snd_pcm_substream *substream,
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
static struct snd_soc_dai_ops s3c2443_ac97_dai_ops = {
.hw_params = s3c2443_ac97_hw_params,
.trigger = s3c2443_ac97_trigger,
};
static struct snd_soc_dai_ops s3c2443_ac97_mic_dai_ops = {
.hw_params = s3c2443_ac97_hw_mic_params,
.trigger = s3c2443_ac97_mic_trigger,
};
struct snd_soc_dai s3c2443_ac97_dai[] = { struct snd_soc_dai s3c2443_ac97_dai[] = {
{ {
.name = "s3c2443-ac97", .name = "s3c2443-ac97",
@ -374,9 +384,7 @@ struct snd_soc_dai s3c2443_ac97_dai[] = {
.channels_max = 2, .channels_max = 2,
.rates = s3c2443_AC97_RATES, .rates = s3c2443_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &s3c2443_ac97_dai_ops,
.hw_params = s3c2443_ac97_hw_params,
.trigger = s3c2443_ac97_trigger},
}, },
{ {
.name = "pxa2xx-ac97-mic", .name = "pxa2xx-ac97-mic",
@ -388,9 +396,7 @@ struct snd_soc_dai s3c2443_ac97_dai[] = {
.channels_max = 1, .channels_max = 1,
.rates = s3c2443_AC97_RATES, .rates = s3c2443_AC97_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &s3c2443_ac97_mic_dai_ops,
.hw_params = s3c2443_ac97_hw_mic_params,
.trigger = s3c2443_ac97_mic_trigger,},
}, },
}; };
EXPORT_SYMBOL_GPL(s3c2443_ac97_dai); EXPORT_SYMBOL_GPL(s3c2443_ac97_dai);

View File

@ -449,6 +449,14 @@ static int s3c24xx_i2s_resume(struct snd_soc_dai *cpu_dai)
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
static struct snd_soc_dai_ops s3c24xx_i2s_dai_ops = {
.trigger = s3c24xx_i2s_trigger,
.hw_params = s3c24xx_i2s_hw_params,
.set_fmt = s3c24xx_i2s_set_fmt,
.set_clkdiv = s3c24xx_i2s_set_clkdiv,
.set_sysclk = s3c24xx_i2s_set_sysclk,
};
struct snd_soc_dai s3c24xx_i2s_dai = { struct snd_soc_dai s3c24xx_i2s_dai = {
.name = "s3c24xx-i2s", .name = "s3c24xx-i2s",
.id = 0, .id = 0,
@ -465,13 +473,7 @@ struct snd_soc_dai s3c24xx_i2s_dai = {
.channels_max = 2, .channels_max = 2,
.rates = S3C24XX_I2S_RATES, .rates = S3C24XX_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,}, .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
.ops = { .ops = &s3c24xx_i2s_dai_ops,
.trigger = s3c24xx_i2s_trigger,
.hw_params = s3c24xx_i2s_hw_params,
.set_fmt = s3c24xx_i2s_set_fmt,
.set_clkdiv = s3c24xx_i2s_set_clkdiv,
.set_sysclk = s3c24xx_i2s_set_sysclk,
},
}; };
EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai); EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai);

View File

@ -336,6 +336,16 @@ static int ssi_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_U24_3LE | \ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_U24_3LE | \
SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_U32_LE) SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_U32_LE)
static struct snd_soc_dai_ops ssi_dai_ops = {
.startup = ssi_startup,
.shutdown = ssi_shutdown,
.trigger = ssi_trigger,
.hw_params = ssi_hw_params,
.set_sysclk = ssi_set_sysclk,
.set_clkdiv = ssi_set_clkdiv,
.set_fmt = ssi_set_fmt,
};
struct snd_soc_dai sh4_ssi_dai[] = { struct snd_soc_dai sh4_ssi_dai[] = {
{ {
.name = "SSI0", .name = "SSI0",
@ -352,15 +362,7 @@ struct snd_soc_dai sh4_ssi_dai[] = {
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
}, },
.ops = { .ops = &ssi_dai_ops,
.startup = ssi_startup,
.shutdown = ssi_shutdown,
.trigger = ssi_trigger,
.hw_params = ssi_hw_params,
.set_sysclk = ssi_set_sysclk,
.set_clkdiv = ssi_set_clkdiv,
.set_fmt = ssi_set_fmt,
},
}, },
#ifdef CONFIG_CPU_SUBTYPE_SH7760 #ifdef CONFIG_CPU_SUBTYPE_SH7760
{ {
@ -378,15 +380,7 @@ struct snd_soc_dai sh4_ssi_dai[] = {
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
}, },
.ops = { .ops = &ssi_dai_ops,
.startup = ssi_startup,
.shutdown = ssi_shutdown,
.trigger = ssi_trigger,
.hw_params = ssi_hw_params,
.set_sysclk = ssi_set_sysclk,
.set_clkdiv = ssi_set_clkdiv,
.set_fmt = ssi_set_fmt,
},
}, },
#endif #endif
}; };

View File

@ -133,8 +133,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
mutex_lock(&pcm_mutex); mutex_lock(&pcm_mutex);
/* startup the audio subsystem */ /* startup the audio subsystem */
if (cpu_dai->ops.startup) { if (cpu_dai->ops->startup) {
ret = cpu_dai->ops.startup(substream, cpu_dai); ret = cpu_dai->ops->startup(substream, cpu_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: can't open interface %s\n", printk(KERN_ERR "asoc: can't open interface %s\n",
cpu_dai->name); cpu_dai->name);
@ -150,8 +150,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
} }
} }
if (codec_dai->ops.startup) { if (codec_dai->ops->startup) {
ret = codec_dai->ops.startup(substream, codec_dai); ret = codec_dai->ops->startup(substream, codec_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: can't open codec %s\n", printk(KERN_ERR "asoc: can't open codec %s\n",
codec_dai->name); codec_dai->name);
@ -247,8 +247,8 @@ codec_dai_err:
platform->pcm_ops->close(substream); platform->pcm_ops->close(substream);
platform_err: platform_err:
if (cpu_dai->ops.shutdown) if (cpu_dai->ops->shutdown)
cpu_dai->ops.shutdown(substream, cpu_dai); cpu_dai->ops->shutdown(substream, cpu_dai);
out: out:
mutex_unlock(&pcm_mutex); mutex_unlock(&pcm_mutex);
return ret; return ret;
@ -340,11 +340,11 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
snd_soc_dai_digital_mute(codec_dai, 1); snd_soc_dai_digital_mute(codec_dai, 1);
if (cpu_dai->ops.shutdown) if (cpu_dai->ops->shutdown)
cpu_dai->ops.shutdown(substream, cpu_dai); cpu_dai->ops->shutdown(substream, cpu_dai);
if (codec_dai->ops.shutdown) if (codec_dai->ops->shutdown)
codec_dai->ops.shutdown(substream, codec_dai); codec_dai->ops->shutdown(substream, codec_dai);
if (machine->ops && machine->ops->shutdown) if (machine->ops && machine->ops->shutdown)
machine->ops->shutdown(substream); machine->ops->shutdown(substream);
@ -408,16 +408,16 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
} }
} }
if (codec_dai->ops.prepare) { if (codec_dai->ops->prepare) {
ret = codec_dai->ops.prepare(substream, codec_dai); ret = codec_dai->ops->prepare(substream, codec_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: codec DAI prepare error\n"); printk(KERN_ERR "asoc: codec DAI prepare error\n");
goto out; goto out;
} }
} }
if (cpu_dai->ops.prepare) { if (cpu_dai->ops->prepare) {
ret = cpu_dai->ops.prepare(substream, cpu_dai); ret = cpu_dai->ops->prepare(substream, cpu_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: cpu DAI prepare error\n"); printk(KERN_ERR "asoc: cpu DAI prepare error\n");
goto out; goto out;
@ -494,8 +494,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
} }
} }
if (codec_dai->ops.hw_params) { if (codec_dai->ops->hw_params) {
ret = codec_dai->ops.hw_params(substream, params, codec_dai); ret = codec_dai->ops->hw_params(substream, params, codec_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: can't set codec %s hw params\n", printk(KERN_ERR "asoc: can't set codec %s hw params\n",
codec_dai->name); codec_dai->name);
@ -503,8 +503,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
} }
} }
if (cpu_dai->ops.hw_params) { if (cpu_dai->ops->hw_params) {
ret = cpu_dai->ops.hw_params(substream, params, cpu_dai); ret = cpu_dai->ops->hw_params(substream, params, cpu_dai);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: interface %s hw params failed\n", printk(KERN_ERR "asoc: interface %s hw params failed\n",
cpu_dai->name); cpu_dai->name);
@ -526,12 +526,12 @@ out:
return ret; return ret;
platform_err: platform_err:
if (cpu_dai->ops.hw_free) if (cpu_dai->ops->hw_free)
cpu_dai->ops.hw_free(substream, cpu_dai); cpu_dai->ops->hw_free(substream, cpu_dai);
interface_err: interface_err:
if (codec_dai->ops.hw_free) if (codec_dai->ops->hw_free)
codec_dai->ops.hw_free(substream, codec_dai); codec_dai->ops->hw_free(substream, codec_dai);
codec_err: codec_err:
if (machine->ops && machine->ops->hw_free) if (machine->ops && machine->ops->hw_free)
@ -570,11 +570,11 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
platform->pcm_ops->hw_free(substream); platform->pcm_ops->hw_free(substream);
/* now free hw params for the DAI's */ /* now free hw params for the DAI's */
if (codec_dai->ops.hw_free) if (codec_dai->ops->hw_free)
codec_dai->ops.hw_free(substream, codec_dai); codec_dai->ops->hw_free(substream, codec_dai);
if (cpu_dai->ops.hw_free) if (cpu_dai->ops->hw_free)
cpu_dai->ops.hw_free(substream, cpu_dai); cpu_dai->ops->hw_free(substream, cpu_dai);
mutex_unlock(&pcm_mutex); mutex_unlock(&pcm_mutex);
return 0; return 0;
@ -591,8 +591,8 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
struct snd_soc_dai *codec_dai = machine->codec_dai; struct snd_soc_dai *codec_dai = machine->codec_dai;
int ret; int ret;
if (codec_dai->ops.trigger) { if (codec_dai->ops->trigger) {
ret = codec_dai->ops.trigger(substream, cmd, codec_dai); ret = codec_dai->ops->trigger(substream, cmd, codec_dai);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
@ -603,8 +603,8 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
return ret; return ret;
} }
if (cpu_dai->ops.trigger) { if (cpu_dai->ops->trigger) {
ret = cpu_dai->ops.trigger(substream, cmd, cpu_dai); ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
@ -645,8 +645,8 @@ static int soc_suspend(struct platform_device *pdev, pm_message_t state)
/* mute any active DAC's */ /* mute any active DAC's */
for (i = 0; i < card->num_links; i++) { for (i = 0; i < card->num_links; i++) {
struct snd_soc_dai *dai = card->dai_link[i].codec_dai; struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
if (dai->ops.digital_mute && dai->playback.active) if (dai->ops->digital_mute && dai->playback.active)
dai->ops.digital_mute(dai, 1); dai->ops->digital_mute(dai, 1);
} }
/* suspend all pcms */ /* suspend all pcms */
@ -741,8 +741,8 @@ static void soc_resume_deferred(struct work_struct *work)
/* unmute any active DACs */ /* unmute any active DACs */
for (i = 0; i < card->num_links; i++) { for (i = 0; i < card->num_links; i++) {
struct snd_soc_dai *dai = card->dai_link[i].codec_dai; struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
if (dai->ops.digital_mute && dai->playback.active) if (dai->ops->digital_mute && dai->playback.active)
dai->ops.digital_mute(dai, 0); dai->ops->digital_mute(dai, 0);
} }
for (i = 0; i < card->num_links; i++) { for (i = 0; i < card->num_links; i++) {
@ -2051,8 +2051,8 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8);
int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
unsigned int freq, int dir) unsigned int freq, int dir)
{ {
if (dai->ops.set_sysclk) if (dai->ops->set_sysclk)
return dai->ops.set_sysclk(dai, clk_id, freq, dir); return dai->ops->set_sysclk(dai, clk_id, freq, dir);
else else
return -EINVAL; return -EINVAL;
} }
@ -2071,8 +2071,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
int div_id, int div) int div_id, int div)
{ {
if (dai->ops.set_clkdiv) if (dai->ops->set_clkdiv)
return dai->ops.set_clkdiv(dai, div_id, div); return dai->ops->set_clkdiv(dai, div_id, div);
else else
return -EINVAL; return -EINVAL;
} }
@ -2090,8 +2090,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
int pll_id, unsigned int freq_in, unsigned int freq_out) int pll_id, unsigned int freq_in, unsigned int freq_out)
{ {
if (dai->ops.set_pll) if (dai->ops->set_pll)
return dai->ops.set_pll(dai, pll_id, freq_in, freq_out); return dai->ops->set_pll(dai, pll_id, freq_in, freq_out);
else else
return -EINVAL; return -EINVAL;
} }
@ -2106,8 +2106,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
*/ */
int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{ {
if (dai->ops.set_fmt) if (dai->ops->set_fmt)
return dai->ops.set_fmt(dai, fmt); return dai->ops->set_fmt(dai, fmt);
else else
return -EINVAL; return -EINVAL;
} }
@ -2125,8 +2125,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
unsigned int mask, int slots) unsigned int mask, int slots)
{ {
if (dai->ops.set_sysclk) if (dai->ops->set_sysclk)
return dai->ops.set_tdm_slot(dai, mask, slots); return dai->ops->set_tdm_slot(dai, mask, slots);
else else
return -EINVAL; return -EINVAL;
} }
@ -2141,8 +2141,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
*/ */
int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
{ {
if (dai->ops.set_sysclk) if (dai->ops->set_sysclk)
return dai->ops.set_tristate(dai, tristate); return dai->ops->set_tristate(dai, tristate);
else else
return -EINVAL; return -EINVAL;
} }
@ -2157,8 +2157,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
*/ */
int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute) int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute)
{ {
if (dai->ops.digital_mute) if (dai->ops->digital_mute)
return dai->ops.digital_mute(dai, mute); return dai->ops->digital_mute(dai, mute);
else else
return -EINVAL; return -EINVAL;
} }
@ -2211,6 +2211,9 @@ static int snd_soc_unregister_card(struct snd_soc_card *card)
return 0; return 0;
} }
static struct snd_soc_dai_ops null_dai_ops = {
};
/** /**
* snd_soc_register_dai - Register a DAI with the ASoC core * snd_soc_register_dai - Register a DAI with the ASoC core
* *
@ -2225,6 +2228,9 @@ int snd_soc_register_dai(struct snd_soc_dai *dai)
if (!dai->dev) if (!dai->dev)
printk(KERN_WARNING "No device for DAI %s\n", dai->name); printk(KERN_WARNING "No device for DAI %s\n", dai->name);
if (!dai->ops)
dai->ops = &null_dai_ops;
INIT_LIST_HEAD(&dai->list); INIT_LIST_HEAD(&dai->list);
mutex_lock(&client_mutex); mutex_lock(&client_mutex);