staticint framer_dai_set_tdm_slot(struct snd_soc_dai *dai, unsignedint tx_mask, unsignedint rx_mask, int slots, int width)
{ struct framer_codec *framer = snd_soc_component_get_drvdata(dai->component);
switch (width) { case 0: /* Not set -> default 8 */ case 8: break; default:
dev_err(dai->dev, "tdm slot width %d not supported\n", width); return -EINVAL;
}
framer->max_chan_playback = hweight32(tx_mask); if (framer->max_chan_playback > FRAMER_NB_CHANNEL) {
dev_err(dai->dev, "too many tx slots defined (mask = 0x%x) supported max %d\n",
tx_mask, FRAMER_NB_CHANNEL); return -EINVAL;
}
framer->max_chan_capture = hweight32(rx_mask); if (framer->max_chan_capture > FRAMER_NB_CHANNEL) {
dev_err(dai->dev, "too many rx slots defined (mask = 0x%x) supported max %d\n",
rx_mask, FRAMER_NB_CHANNEL); return -EINVAL;
}
return 0;
}
/* * The constraints for format/channel is to match with the number of 8bit * time-slots available.
*/ staticint framer_dai_hw_rule_channels_by_format(struct snd_soc_dai *dai, struct snd_pcm_hw_params *params, unsignedint nb_ts)
{ struct snd_interval *c = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
snd_pcm_format_t format = params_format(params); struct snd_interval ch = {0}; int width;
ret = snd_pcm_hw_constraint_mask64(substream->runtime,
SNDRV_PCM_HW_PARAM_FORMAT, format); if (ret) {
dev_err(dai->dev, "Failed to add format constraint (%d)\n", ret); return ret;
}
ret = snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
hw_rule_channels_by_format, dai,
SNDRV_PCM_HW_PARAM_FORMAT, -1); if (ret) {
dev_err(dai->dev, "Failed to add channels rule (%d)\n", ret); return ret;
}
ret = snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
hw_rule_format_by_channels, dai,
SNDRV_PCM_HW_PARAM_CHANNELS, -1); if (ret) {
dev_err(dai->dev, "Failed to add format rule (%d)\n", ret); return ret;
}
ret = snd_pcm_hw_constraint_single(substream->runtime,
SNDRV_PCM_HW_PARAM_FRAME_BITS,
frame_bits); if (ret < 0) {
dev_err(dai->dev, "Failed to add frame_bits constraint (%d)\n", ret); return ret;
}
name = "carrier"; if (component->name_prefix) {
name = kasprintf(GFP_KERNEL, "%s carrier", component->name_prefix); if (!name) return -ENOMEM;
}
ret = snd_soc_card_jack_new(component->card, name, FRAMER_JACK_MASK, &framer->jack); if (component->name_prefix)
kfree(name); /* A copy is done by snd_soc_card_jack_new */ if (ret) {
dev_err(component->dev, "Cannot create jack\n"); return ret;
}
ret = framer_init(framer->framer); if (ret) {
dev_err(component->dev, "framer init failed (%d)\n", ret); return ret;
}
ret = framer_power_on(framer->framer); if (ret) {
dev_err(component->dev, "framer power-on failed (%d)\n", ret); goto framer_exit;
}
/* Be sure that get_status is supported */
ret = framer_get_status(framer->framer, &status); if (ret) {
dev_err(component->dev, "get framer status failed (%d)\n", ret); goto framer_power_off;
}
framer->nb.notifier_call = framer_carrier_notifier;
ret = framer_notifier_register(framer->framer, &framer->nb); if (ret) {
dev_err(component->dev, "Cannot register event notifier\n"); goto framer_power_off;
}
/* Queue work to set the initial value */
queue_work(system_power_efficient_wq, &framer->carrier_work);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.