Lines Matching defs:player

29 #define UNIPERIF_PLAYER_I2S_OUT 1 /* player id connected to I2S/TDM TX bus */
64 struct uniperif *player = dev_id;
68 spin_lock(&player->irq_lock);
69 if (!player->substream)
72 snd_pcm_stream_lock(player->substream);
73 if (player->state == UNIPERIF_STATE_STOPPED)
77 status = GET_UNIPERIF_ITS(player);
78 SET_UNIPERIF_ITS_BCLR(player, status);
81 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) {
82 dev_err(player->dev, "FIFO underflow error detected\n");
85 if (player->underflow_enabled) {
87 player->state = UNIPERIF_STATE_UNDERFLOW;
91 SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(player);
93 /* Stop the player */
94 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
101 if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) {
102 dev_err(player->dev, "DMA error detected\n");
105 SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player);
107 /* Stop the player */
108 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
114 if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) {
115 if (!player->underflow_enabled) {
116 dev_err(player->dev,
122 tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player);
123 dev_dbg(player->dev, "Underflow recovered (%d LR clocks max)\n",
127 SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player);
130 player->state = UNIPERIF_STATE_STARTED;
137 UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) {
138 dev_err(player->dev, "Underflow recovery failed\n");
140 /* Stop the player */
141 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
147 snd_pcm_stream_unlock(player->substream);
149 spin_unlock(&player->irq_lock);
154 static int uni_player_clk_set_rate(struct uniperif *player, unsigned long rate)
157 int adjustment = player->clk_adj;
190 ret = clk_set_rate(player->clk, rate_adjusted);
194 rate_achieved = clk_get_rate(player->clk);
214 player->clk_adj = adjustment;
218 static void uni_player_set_channel_status(struct uniperif *player,
232 player->stream_settings.iec958.status[3] =
236 player->stream_settings.iec958.status[3] =
240 player->stream_settings.iec958.status[3] =
244 player->stream_settings.iec958.status[3] =
248 player->stream_settings.iec958.status[3] =
252 player->stream_settings.iec958.status[3] =
256 player->stream_settings.iec958.status[3] =
260 player->stream_settings.iec958.status[3] =
264 player->stream_settings.iec958.status[3] =
269 player->stream_settings.iec958.status[3] =
278 if (player->stream_settings.iec958.status[0] & IEC958_AES0_NONAUDIO)
279 player->stream_settings.encoding_mode =
282 player->stream_settings.encoding_mode =
285 if (player->stream_settings.encoding_mode ==
288 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
291 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 1);
296 player->stream_settings.iec958.status[0 + (n * 4)] & 0xf;
298 player->stream_settings.iec958.status[1 + (n * 4)] << 8;
300 player->stream_settings.iec958.status[2 + (n * 4)] << 16;
302 player->stream_settings.iec958.status[3 + (n * 4)] << 24;
303 SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
307 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
308 SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
310 SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
313 static int uni_player_prepare_iec958(struct uniperif *player,
318 clk_div = player->mclk / runtime->rate;
322 dev_err(player->dev, "%s: invalid clk_div %d\n",
330 SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
332 SET_UNIPERIF_I2S_FMT_NBIT_32(player);
334 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
338 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
340 SET_UNIPERIF_I2S_FMT_NBIT_32(player);
342 SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player);
345 dev_err(player->dev, "format not supported\n");
350 SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(player);
353 SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(player);
356 SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(player);
359 SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(player);
362 SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(player);
364 SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
366 mutex_lock(&player->ctrl_lock);
368 uni_player_set_channel_status(player, runtime);
369 mutex_unlock(&player->ctrl_lock);
372 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
375 SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
378 SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(player);
381 SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(player);
384 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
386 if (player->stream_settings.encoding_mode ==
388 SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(player);
390 SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(player);
392 SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
395 SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
398 SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / 128);
400 /* Set the spdif latency to not wait before starting player */
401 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
408 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
409 SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
411 SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player);
416 static int uni_player_prepare_pcm(struct uniperif *player,
422 if ((player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
430 clk_div = player->mclk / runtime->rate;
436 dev_err(player->dev, "%s: invalid clk_div\n", __func__);
441 dev_err(player->dev, "%s: invalid clk_div\n", __func__);
451 SET_UNIPERIF_I2S_FMT_NBIT_32(player);
452 SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
455 SET_UNIPERIF_I2S_FMT_NBIT_16(player);
456 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
459 dev_err(player->dev, "subframe format not supported\n");
467 SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
475 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
479 dev_err(player->dev, "format not supported\n");
484 SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
487 SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / (2 * output_frame_size));
492 dev_err(player->dev, "%s: invalid nb of channels\n", __func__);
496 SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
499 SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
501 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
504 SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
509 static int uni_player_prepare_tdm(struct uniperif *player,
520 sti_uniperiph_get_unip_tdm_frame_size(player);
525 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
526 SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
529 SET_UNIPERIF_I2S_FMT_NUM_CH(player, user_frame_size / 4 / 2);
531 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
532 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
535 SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(player);
538 SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(player, tdm_frame_size);
541 sti_uniperiph_get_tdm_word_pos(player, word_pos);
542 SET_UNIPERIF_TDM_WORD_POS(player, 1_2, word_pos[WORD_1_2]);
543 SET_UNIPERIF_TDM_WORD_POS(player, 3_4, word_pos[WORD_3_4]);
544 SET_UNIPERIF_TDM_WORD_POS(player, 5_6, word_pos[WORD_5_6]);
545 SET_UNIPERIF_TDM_WORD_POS(player, 7_8, word_pos[WORD_7_8]);
549 mutex_lock(&player->ctrl_lock);
550 ret = uni_player_clk_set_rate(player, freq);
552 player->mclk = freq;
553 mutex_unlock(&player->ctrl_lock);
575 struct uniperif *player = priv->dai_data.uni;
576 struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
578 mutex_lock(&player->ctrl_lock);
583 mutex_unlock(&player->ctrl_lock);
592 struct uniperif *player = priv->dai_data.uni;
593 struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
596 mutex_lock(&player->ctrl_lock);
602 spin_lock_irqsave(&player->irq_lock, flags);
603 if (player->substream && player->substream->runtime)
604 uni_player_set_channel_status(player,
605 player->substream->runtime);
607 uni_player_set_channel_status(player, NULL);
609 spin_unlock_irqrestore(&player->irq_lock, flags);
610 mutex_unlock(&player->ctrl_lock);
643 struct uniperif *player = priv->dai_data.uni;
645 mutex_lock(&player->ctrl_lock);
646 ucontrol->value.integer.value[0] = player->clk_adj;
647 mutex_unlock(&player->ctrl_lock);
657 struct uniperif *player = priv->dai_data.uni;
664 mutex_lock(&player->ctrl_lock);
665 player->clk_adj = ucontrol->value.integer.value[0];
667 if (player->mclk)
668 ret = uni_player_clk_set_rate(player, player->mclk);
669 mutex_unlock(&player->ctrl_lock);
695 struct uniperif *player = priv->dai_data.uni;
699 spin_lock_irqsave(&player->irq_lock, flags);
700 player->substream = substream;
701 spin_unlock_irqrestore(&player->irq_lock, flags);
703 player->clk_adj = 0;
705 if (!UNIPERIF_TYPE_IS_TDM(player))
712 player, SNDRV_PCM_HW_PARAM_CHANNELS,
720 player, SNDRV_PCM_HW_PARAM_FORMAT,
728 struct uniperif *player = priv->dai_data.uni;
731 if (UNIPERIF_TYPE_IS_TDM(player) || (dir == SND_SOC_CLOCK_IN))
737 mutex_lock(&player->ctrl_lock);
738 ret = uni_player_clk_set_rate(player, freq);
740 player->mclk = freq;
741 mutex_unlock(&player->ctrl_lock);
750 struct uniperif *player = priv->dai_data.uni;
755 /* The player should be stopped */
756 if (player->state != UNIPERIF_STATE_STOPPED) {
757 dev_err(player->dev, "%s: invalid player state %d\n", __func__,
758 player->state);
763 if (player->type == SND_ST_UNIPERIF_TYPE_TDM) {
772 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) {
785 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) {
786 dev_err(player->dev, "invalid trigger limit %d\n",
791 SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(player, trigger_limit);
793 /* Uniperipheral setup depends on player type */
794 switch (player->type) {
796 ret = uni_player_prepare_iec958(player, runtime);
799 ret = uni_player_prepare_pcm(player, runtime);
802 ret = uni_player_prepare_iec958(player, runtime);
805 ret = uni_player_prepare_tdm(player, runtime);
808 dev_err(player->dev, "invalid player type\n");
815 switch (player->daifmt & SND_SOC_DAIFMT_INV_MASK) {
817 SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
818 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
821 SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
822 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
825 SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
826 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
829 SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
830 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
834 switch (player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) {
836 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
837 SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(player);
840 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
841 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
844 SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(player);
845 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
848 dev_err(player->dev, "format not supported\n");
852 SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0);
855 return sti_uniperiph_reset(player);
858 static int uni_player_start(struct uniperif *player)
862 /* The player should be stopped */
863 if (player->state != UNIPERIF_STATE_STOPPED) {
864 dev_err(player->dev, "%s: invalid player state\n", __func__);
868 ret = clk_prepare_enable(player->clk);
870 dev_err(player->dev, "%s: Failed to enable clock\n", __func__);
875 SET_UNIPERIF_ITS_BCLR(player, GET_UNIPERIF_ITS(player));
878 SET_UNIPERIF_ITM_BSET_DMA_ERROR(player);
879 SET_UNIPERIF_ITM_BSET_FIFO_ERROR(player);
882 if (player->underflow_enabled) {
883 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(player);
884 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player);
887 ret = sti_uniperiph_reset(player);
889 clk_disable_unprepare(player->clk);
900 SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(player);
905 * will not take affect and hang the player.
907 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
908 if (UNIPERIF_TYPE_IS_IEC958(player))
909 SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player);
912 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
913 SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
915 SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
918 player->state = UNIPERIF_STATE_STARTED;
923 static int uni_player_stop(struct uniperif *player)
927 /* The player should not be in stopped state */
928 if (player->state == UNIPERIF_STATE_STOPPED) {
929 dev_err(player->dev, "%s: invalid player state\n", __func__);
933 /* Turn the player off */
934 SET_UNIPERIF_CTRL_OPERATION_OFF(player);
936 ret = sti_uniperiph_reset(player);
941 SET_UNIPERIF_ITM_BCLR(player, GET_UNIPERIF_ITM(player));
944 clk_disable_unprepare(player->clk);
947 player->state = UNIPERIF_STATE_STOPPED;
952 int uni_player_resume(struct uniperif *player)
957 if (player->clk_sel) {
958 ret = regmap_field_write(player->clk_sel, 1);
960 dev_err(player->dev,
967 SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player);
968 SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
969 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
970 SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player);
980 struct uniperif *player = priv->dai_data.uni;
984 return uni_player_start(player);
986 return uni_player_stop(player);
988 return uni_player_resume(player);
998 struct uniperif *player = priv->dai_data.uni;
1001 spin_lock_irqsave(&player->irq_lock, flags);
1002 if (player->state != UNIPERIF_STATE_STOPPED)
1003 /* Stop the player */
1004 uni_player_stop(player);
1006 player->substream = NULL;
1007 spin_unlock_irqrestore(&player->irq_lock, flags);
1011 struct uniperif *player)
1018 8 + player->id,
1019 8 + player->id),
1031 player->clk_sel = regmap_field_alloc(regmap, regfield[0]);
1032 player->valid_sel = regmap_field_alloc(regmap, regfield[1]);
1049 struct uniperif *player)
1053 player->dev = &pdev->dev;
1054 player->state = UNIPERIF_STATE_STOPPED;
1055 player->dai_ops = &uni_player_dai_ops;
1058 ret = uni_player_parse_dt_audio_glue(pdev, player);
1061 dev_err(player->dev, "Failed to parse DeviceTree\n");
1066 if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
1067 player->underflow_enabled = 1;
1069 if (UNIPERIF_TYPE_IS_TDM(player))
1070 player->hw = &uni_tdm_hw;
1072 player->hw = &uni_player_pcm_hw;
1075 player->clk = of_clk_get(pdev->dev.of_node, 0);
1076 if (IS_ERR(player->clk)) {
1077 dev_err(player->dev, "Failed to get clock\n");
1078 return PTR_ERR(player->clk);
1082 if (player->clk_sel) {
1083 ret = regmap_field_write(player->clk_sel, 1);
1085 dev_err(player->dev,
1093 if (player->valid_sel &&
1094 (player->id == UNIPERIF_PLAYER_I2S_OUT)) {
1095 ret = regmap_field_write(player->valid_sel, player->id);
1097 dev_err(player->dev,
1103 ret = devm_request_irq(&pdev->dev, player->irq,
1105 dev_name(&pdev->dev), player);
1107 dev_err(player->dev, "unable to request IRQ %d\n", player->irq);
1111 mutex_init(&player->ctrl_lock);
1112 spin_lock_init(&player->irq_lock);
1115 SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player);
1116 SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
1117 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
1118 SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player);
1120 if (UNIPERIF_TYPE_IS_IEC958(player)) {
1124 player->stream_settings.iec958.status[0] = 0x00;
1126 player->stream_settings.iec958.status[1] =
1129 player->stream_settings.iec958.status[2] =
1132 player->stream_settings.iec958.status[3] =
1135 player->stream_settings.iec958.status[4] =
1139 player->num_ctrls = ARRAY_SIZE(snd_sti_iec_ctl);
1140 player->snd_ctrls = snd_sti_iec_ctl[0];
1142 player->num_ctrls = ARRAY_SIZE(snd_sti_pcm_ctl);
1143 player->snd_ctrls = snd_sti_pcm_ctl[0];