cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

uniperif_player.c (32028B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) STMicroelectronics SA 2015
      4 * Authors: Arnaud Pouliquen <arnaud.pouliquen@st.com>
      5 *          for STMicroelectronics.
      6 */
      7
      8#include <linux/clk.h>
      9#include <linux/mfd/syscon.h>
     10
     11#include <sound/asoundef.h>
     12#include <sound/soc.h>
     13
     14#include "uniperif.h"
     15
     16/*
     17 * Some hardware-related definitions
     18 */
     19
     20/* sys config registers definitions */
     21#define SYS_CFG_AUDIO_GLUE 0xA4
     22
     23/*
     24 * Driver specific types.
     25 */
     26
     27#define UNIPERIF_PLAYER_CLK_ADJ_MIN  -999999
     28#define UNIPERIF_PLAYER_CLK_ADJ_MAX  1000000
     29#define UNIPERIF_PLAYER_I2S_OUT 1 /* player id connected to I2S/TDM TX bus */
     30
     31/*
     32 * Note: snd_pcm_hardware is linked to DMA controller but is declared here to
     33 * integrate  DAI_CPU capability in term of rate and supported channels
     34 */
     35static const struct snd_pcm_hardware uni_player_pcm_hw = {
     36	.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
     37		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP |
     38		SNDRV_PCM_INFO_MMAP_VALID,
     39	.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE,
     40
     41	.rates = SNDRV_PCM_RATE_CONTINUOUS,
     42	.rate_min = 8000,
     43	.rate_max = 192000,
     44
     45	.channels_min = 2,
     46	.channels_max = 8,
     47
     48	.periods_min = 2,
     49	.periods_max = 48,
     50
     51	.period_bytes_min = 128,
     52	.period_bytes_max = 64 * PAGE_SIZE,
     53	.buffer_bytes_max = 256 * PAGE_SIZE
     54};
     55
     56/*
     57 * uni_player_irq_handler
     58 * In case of error audio stream is stopped; stop action is protected via PCM
     59 * stream lock to avoid race condition with trigger callback.
     60 */
     61static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
     62{
     63	irqreturn_t ret = IRQ_NONE;
     64	struct uniperif *player = dev_id;
     65	unsigned int status;
     66	unsigned int tmp;
     67
     68	spin_lock(&player->irq_lock);
     69	if (!player->substream)
     70		goto irq_spin_unlock;
     71
     72	snd_pcm_stream_lock(player->substream);
     73	if (player->state == UNIPERIF_STATE_STOPPED)
     74		goto stream_unlock;
     75
     76	/* Get interrupt status & clear them immediately */
     77	status = GET_UNIPERIF_ITS(player);
     78	SET_UNIPERIF_ITS_BCLR(player, status);
     79
     80	/* Check for fifo error (underrun) */
     81	if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) {
     82		dev_err(player->dev, "FIFO underflow error detected\n");
     83
     84		/* Interrupt is just for information when underflow recovery */
     85		if (player->underflow_enabled) {
     86			/* Update state to underflow */
     87			player->state = UNIPERIF_STATE_UNDERFLOW;
     88
     89		} else {
     90			/* Disable interrupt so doesn't continually fire */
     91			SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(player);
     92
     93			/* Stop the player */
     94			snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
     95		}
     96
     97		ret = IRQ_HANDLED;
     98	}
     99
    100	/* Check for dma error (overrun) */
    101	if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) {
    102		dev_err(player->dev, "DMA error detected\n");
    103
    104		/* Disable interrupt so doesn't continually fire */
    105		SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player);
    106
    107		/* Stop the player */
    108		snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
    109
    110		ret = IRQ_HANDLED;
    111	}
    112
    113	/* Check for underflow recovery done */
    114	if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) {
    115		if (!player->underflow_enabled) {
    116			dev_err(player->dev,
    117				"unexpected Underflow recovering\n");
    118			ret = -EPERM;
    119			goto stream_unlock;
    120		}
    121		/* Read the underflow recovery duration */
    122		tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player);
    123		dev_dbg(player->dev, "Underflow recovered (%d LR clocks max)\n",
    124			tmp);
    125
    126		/* Clear the underflow recovery duration */
    127		SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player);
    128
    129		/* Update state to started */
    130		player->state = UNIPERIF_STATE_STARTED;
    131
    132		ret = IRQ_HANDLED;
    133	}
    134
    135	/* Check if underflow recovery failed */
    136	if (unlikely(status &
    137		     UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) {
    138		dev_err(player->dev, "Underflow recovery failed\n");
    139
    140		/* Stop the player */
    141		snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
    142
    143		ret = IRQ_HANDLED;
    144	}
    145
    146stream_unlock:
    147	snd_pcm_stream_unlock(player->substream);
    148irq_spin_unlock:
    149	spin_unlock(&player->irq_lock);
    150
    151	return ret;
    152}
    153
    154static int uni_player_clk_set_rate(struct uniperif *player, unsigned long rate)
    155{
    156	int rate_adjusted, rate_achieved, delta, ret;
    157	int adjustment = player->clk_adj;
    158
    159	/*
    160	 *             a
    161	 * F = f + --------- * f = f + d
    162	 *          1000000
    163	 *
    164	 *         a
    165	 * d = --------- * f
    166	 *      1000000
    167	 *
    168	 * where:
    169	 *   f - nominal rate
    170	 *   a - adjustment in ppm (parts per milion)
    171	 *   F - rate to be set in synthesizer
    172	 *   d - delta (difference) between f and F
    173	 */
    174	if (adjustment < 0) {
    175		/* div64_64 operates on unsigned values... */
    176		delta = -1;
    177		adjustment = -adjustment;
    178	} else {
    179		delta = 1;
    180	}
    181	/* 500000 ppm is 0.5, which is used to round up values */
    182	delta *= (int)div64_u64((uint64_t)rate *
    183				(uint64_t)adjustment + 500000, 1000000);
    184	rate_adjusted = rate + delta;
    185
    186	/* Adjusted rate should never be == 0 */
    187	if (!rate_adjusted)
    188		return -EINVAL;
    189
    190	ret = clk_set_rate(player->clk, rate_adjusted);
    191	if (ret < 0)
    192		return ret;
    193
    194	rate_achieved = clk_get_rate(player->clk);
    195	if (!rate_achieved)
    196		/* If value is 0 means that clock or parent not valid */
    197		return -EINVAL;
    198
    199	/*
    200	 * Using ALSA's adjustment control, we can modify the rate to be up
    201	 * to twice as much as requested, but no more
    202	 */
    203	delta = rate_achieved - rate;
    204	if (delta < 0) {
    205		/* div64_64 operates on unsigned values... */
    206		delta = -delta;
    207		adjustment = -1;
    208	} else {
    209		adjustment = 1;
    210	}
    211	/* Frequency/2 is added to round up result */
    212	adjustment *= (int)div64_u64((uint64_t)delta * 1000000 + rate / 2,
    213				     rate);
    214	player->clk_adj = adjustment;
    215	return 0;
    216}
    217
    218static void uni_player_set_channel_status(struct uniperif *player,
    219					  struct snd_pcm_runtime *runtime)
    220{
    221	int n;
    222	unsigned int status;
    223
    224	/*
    225	 * Some AVRs and TVs require the channel status to contain a correct
    226	 * sampling frequency. If no sample rate is already specified, then
    227	 * set one.
    228	 */
    229	if (runtime) {
    230		switch (runtime->rate) {
    231		case 22050:
    232			player->stream_settings.iec958.status[3] =
    233						IEC958_AES3_CON_FS_22050;
    234			break;
    235		case 44100:
    236			player->stream_settings.iec958.status[3] =
    237						IEC958_AES3_CON_FS_44100;
    238			break;
    239		case 88200:
    240			player->stream_settings.iec958.status[3] =
    241						IEC958_AES3_CON_FS_88200;
    242			break;
    243		case 176400:
    244			player->stream_settings.iec958.status[3] =
    245						IEC958_AES3_CON_FS_176400;
    246			break;
    247		case 24000:
    248			player->stream_settings.iec958.status[3] =
    249						IEC958_AES3_CON_FS_24000;
    250			break;
    251		case 48000:
    252			player->stream_settings.iec958.status[3] =
    253						IEC958_AES3_CON_FS_48000;
    254			break;
    255		case 96000:
    256			player->stream_settings.iec958.status[3] =
    257						IEC958_AES3_CON_FS_96000;
    258			break;
    259		case 192000:
    260			player->stream_settings.iec958.status[3] =
    261						IEC958_AES3_CON_FS_192000;
    262			break;
    263		case 32000:
    264			player->stream_settings.iec958.status[3] =
    265						IEC958_AES3_CON_FS_32000;
    266			break;
    267		default:
    268			/* Mark as sampling frequency not indicated */
    269			player->stream_settings.iec958.status[3] =
    270						IEC958_AES3_CON_FS_NOTID;
    271			break;
    272		}
    273	}
    274
    275	/* Audio mode:
    276	 * Use audio mode status to select PCM or encoded mode
    277	 */
    278	if (player->stream_settings.iec958.status[0] & IEC958_AES0_NONAUDIO)
    279		player->stream_settings.encoding_mode =
    280			UNIPERIF_IEC958_ENCODING_MODE_ENCODED;
    281	else
    282		player->stream_settings.encoding_mode =
    283			UNIPERIF_IEC958_ENCODING_MODE_PCM;
    284
    285	if (player->stream_settings.encoding_mode ==
    286		UNIPERIF_IEC958_ENCODING_MODE_PCM)
    287		/* Clear user validity bits */
    288		SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
    289	else
    290		/* Set user validity bits */
    291		SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 1);
    292
    293	/* Program the new channel status */
    294	for (n = 0; n < 6; ++n) {
    295		status  =
    296		player->stream_settings.iec958.status[0 + (n * 4)] & 0xf;
    297		status |=
    298		player->stream_settings.iec958.status[1 + (n * 4)] << 8;
    299		status |=
    300		player->stream_settings.iec958.status[2 + (n * 4)] << 16;
    301		status |=
    302		player->stream_settings.iec958.status[3 + (n * 4)] << 24;
    303		SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
    304	}
    305
    306	/* Update the channel status */
    307	if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
    308		SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
    309	else
    310		SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
    311}
    312
    313static int uni_player_prepare_iec958(struct uniperif *player,
    314				     struct snd_pcm_runtime *runtime)
    315{
    316	int clk_div;
    317
    318	clk_div = player->mclk / runtime->rate;
    319
    320	/* Oversampling must be multiple of 128 as iec958 frame is 32-bits */
    321	if ((clk_div % 128) || (clk_div <= 0)) {
    322		dev_err(player->dev, "%s: invalid clk_div %d\n",
    323			__func__, clk_div);
    324		return -EINVAL;
    325	}
    326
    327	switch (runtime->format) {
    328	case SNDRV_PCM_FORMAT_S16_LE:
    329		/* 16/16 memory format */
    330		SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
    331		/* 16-bits per sub-frame */
    332		SET_UNIPERIF_I2S_FMT_NBIT_32(player);
    333		/* Set 16-bit sample precision */
    334		SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
    335		break;
    336	case SNDRV_PCM_FORMAT_S32_LE:
    337		/* 16/0 memory format */
    338		SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
    339		/* 32-bits per sub-frame */
    340		SET_UNIPERIF_I2S_FMT_NBIT_32(player);
    341		/* Set 24-bit sample precision */
    342		SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player);
    343		break;
    344	default:
    345		dev_err(player->dev, "format not supported\n");
    346		return -EINVAL;
    347	}
    348
    349	/* Set parity to be calculated by the hardware */
    350	SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(player);
    351
    352	/* Set channel status bits to be inserted by the hardware */
    353	SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(player);
    354
    355	/* Set user data bits to be inserted by the hardware */
    356	SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(player);
    357
    358	/* Set validity bits to be inserted by the hardware */
    359	SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(player);
    360
    361	/* Set full software control to disabled */
    362	SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(player);
    363
    364	SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
    365
    366	mutex_lock(&player->ctrl_lock);
    367	/* Update the channel status */
    368	uni_player_set_channel_status(player, runtime);
    369	mutex_unlock(&player->ctrl_lock);
    370
    371	/* Clear the user validity user bits */
    372	SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
    373
    374	/* Disable one-bit audio mode */
    375	SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
    376
    377	/* Enable consecutive frames repetition of Z preamble (not for HBRA) */
    378	SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(player);
    379
    380	/* Change to SUF0_SUBF1 and left/right channels swap! */
    381	SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(player);
    382
    383	/* Set data output as MSB first */
    384	SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
    385
    386	if (player->stream_settings.encoding_mode ==
    387				UNIPERIF_IEC958_ENCODING_MODE_ENCODED)
    388		SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(player);
    389	else
    390		SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(player);
    391
    392	SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
    393
    394	/* Set rounding to off */
    395	SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
    396
    397	/* Set clock divisor */
    398	SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / 128);
    399
    400	/* Set the spdif latency to not wait before starting player */
    401	SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
    402
    403	/*
    404	 * Ensure iec958 formatting is off. It will be enabled in function
    405	 * uni_player_start() at the same time as the operation
    406	 * mode is set to work around a silicon issue.
    407	 */
    408	if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
    409		SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
    410	else
    411		SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player);
    412
    413	return 0;
    414}
    415
    416static int uni_player_prepare_pcm(struct uniperif *player,
    417				  struct snd_pcm_runtime *runtime)
    418{
    419	int output_frame_size, slot_width, clk_div;
    420
    421	/* Force slot width to 32 in I2S mode (HW constraint) */
    422	if ((player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
    423		SND_SOC_DAIFMT_I2S)
    424		slot_width = 32;
    425	else
    426		slot_width = snd_pcm_format_width(runtime->format);
    427
    428	output_frame_size = slot_width * runtime->channels;
    429
    430	clk_div = player->mclk / runtime->rate;
    431	/*
    432	 * For 32 bits subframe clk_div must be a multiple of 128,
    433	 * for 16 bits must be a multiple of 64
    434	 */
    435	if ((slot_width == 32) && (clk_div % 128)) {
    436		dev_err(player->dev, "%s: invalid clk_div\n", __func__);
    437		return -EINVAL;
    438	}
    439
    440	if ((slot_width == 16) && (clk_div % 64)) {
    441		dev_err(player->dev, "%s: invalid clk_div\n", __func__);
    442		return -EINVAL;
    443	}
    444
    445	/*
    446	 * Number of bits per subframe (which is one channel sample)
    447	 * on output - Transfer 16 or 32 bits from FIFO
    448	 */
    449	switch (slot_width) {
    450	case 32:
    451		SET_UNIPERIF_I2S_FMT_NBIT_32(player);
    452		SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
    453		break;
    454	case 16:
    455		SET_UNIPERIF_I2S_FMT_NBIT_16(player);
    456		SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
    457		break;
    458	default:
    459		dev_err(player->dev, "subframe format not supported\n");
    460		return -EINVAL;
    461	}
    462
    463	/* Configure data memory format */
    464	switch (runtime->format) {
    465	case SNDRV_PCM_FORMAT_S16_LE:
    466		/* One data word contains two samples */
    467		SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
    468		break;
    469
    470	case SNDRV_PCM_FORMAT_S32_LE:
    471		/*
    472		 * Actually "16 bits/0 bits" means "32/28/24/20/18/16 bits
    473		 * on the left than zeros (if less than 32 bytes)"... ;-)
    474		 */
    475		SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
    476		break;
    477
    478	default:
    479		dev_err(player->dev, "format not supported\n");
    480		return -EINVAL;
    481	}
    482
    483	/* Set rounding to off */
    484	SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
    485
    486	/* Set clock divisor */
    487	SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / (2 * output_frame_size));
    488
    489	/* Number of channelsmust be even*/
    490	if ((runtime->channels % 2) || (runtime->channels < 2) ||
    491	    (runtime->channels > 10)) {
    492		dev_err(player->dev, "%s: invalid nb of channels\n", __func__);
    493		return -EINVAL;
    494	}
    495
    496	SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
    497
    498	/* Set 1-bit audio format to disabled */
    499	SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
    500
    501	SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
    502
    503	/* No iec958 formatting as outputting to DAC  */
    504	SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
    505
    506	return 0;
    507}
    508
    509static int uni_player_prepare_tdm(struct uniperif *player,
    510				  struct snd_pcm_runtime *runtime)
    511{
    512	int tdm_frame_size; /* unip tdm frame size in bytes */
    513	int user_frame_size; /* user tdm frame size in bytes */
    514	/* default unip TDM_WORD_POS_X_Y */
    515	unsigned int word_pos[4] = {
    516		0x04060002, 0x0C0E080A, 0x14161012, 0x1C1E181A};
    517	int freq, ret;
    518
    519	tdm_frame_size =
    520		sti_uniperiph_get_unip_tdm_frame_size(player);
    521	user_frame_size =
    522		sti_uniperiph_get_user_frame_size(runtime);
    523
    524	/* fix 16/0 format */
    525	SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
    526	SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
    527
    528	/* number of words inserted on the TDM line */
    529	SET_UNIPERIF_I2S_FMT_NUM_CH(player, user_frame_size / 4 / 2);
    530
    531	SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
    532	SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
    533
    534	/* Enable the tdm functionality */
    535	SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(player);
    536
    537	/* number of 8 bits timeslots avail in unip tdm frame */
    538	SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(player, tdm_frame_size);
    539
    540	/* set the timeslot allocation for words in FIFO */
    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]);
    546
    547	/* set unip clk rate (not done vai set_sysclk ops) */
    548	freq = runtime->rate * tdm_frame_size * 8;
    549	mutex_lock(&player->ctrl_lock);
    550	ret = uni_player_clk_set_rate(player, freq);
    551	if (!ret)
    552		player->mclk = freq;
    553	mutex_unlock(&player->ctrl_lock);
    554
    555	return 0;
    556}
    557
    558/*
    559 * ALSA uniperipheral iec958 controls
    560 */
    561static int  uni_player_ctl_iec958_info(struct snd_kcontrol *kcontrol,
    562				       struct snd_ctl_elem_info *uinfo)
    563{
    564	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
    565	uinfo->count = 1;
    566
    567	return 0;
    568}
    569
    570static int uni_player_ctl_iec958_get(struct snd_kcontrol *kcontrol,
    571				     struct snd_ctl_elem_value *ucontrol)
    572{
    573	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
    574	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    575	struct uniperif *player = priv->dai_data.uni;
    576	struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
    577
    578	mutex_lock(&player->ctrl_lock);
    579	ucontrol->value.iec958.status[0] = iec958->status[0];
    580	ucontrol->value.iec958.status[1] = iec958->status[1];
    581	ucontrol->value.iec958.status[2] = iec958->status[2];
    582	ucontrol->value.iec958.status[3] = iec958->status[3];
    583	mutex_unlock(&player->ctrl_lock);
    584	return 0;
    585}
    586
    587static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
    588				     struct snd_ctl_elem_value *ucontrol)
    589{
    590	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
    591	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    592	struct uniperif *player = priv->dai_data.uni;
    593	struct snd_aes_iec958 *iec958 =  &player->stream_settings.iec958;
    594	unsigned long flags;
    595
    596	mutex_lock(&player->ctrl_lock);
    597	iec958->status[0] = ucontrol->value.iec958.status[0];
    598	iec958->status[1] = ucontrol->value.iec958.status[1];
    599	iec958->status[2] = ucontrol->value.iec958.status[2];
    600	iec958->status[3] = ucontrol->value.iec958.status[3];
    601
    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);
    606	else
    607		uni_player_set_channel_status(player, NULL);
    608
    609	spin_unlock_irqrestore(&player->irq_lock, flags);
    610	mutex_unlock(&player->ctrl_lock);
    611
    612	return 0;
    613}
    614
    615static struct snd_kcontrol_new uni_player_iec958_ctl = {
    616	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
    617	.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
    618	.info = uni_player_ctl_iec958_info,
    619	.get = uni_player_ctl_iec958_get,
    620	.put = uni_player_ctl_iec958_put,
    621};
    622
    623/*
    624 * uniperif rate adjustement control
    625 */
    626static int snd_sti_clk_adjustment_info(struct snd_kcontrol *kcontrol,
    627				       struct snd_ctl_elem_info *uinfo)
    628{
    629	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
    630	uinfo->count = 1;
    631	uinfo->value.integer.min = UNIPERIF_PLAYER_CLK_ADJ_MIN;
    632	uinfo->value.integer.max = UNIPERIF_PLAYER_CLK_ADJ_MAX;
    633	uinfo->value.integer.step = 1;
    634
    635	return 0;
    636}
    637
    638static int snd_sti_clk_adjustment_get(struct snd_kcontrol *kcontrol,
    639				      struct snd_ctl_elem_value *ucontrol)
    640{
    641	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
    642	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    643	struct uniperif *player = priv->dai_data.uni;
    644
    645	mutex_lock(&player->ctrl_lock);
    646	ucontrol->value.integer.value[0] = player->clk_adj;
    647	mutex_unlock(&player->ctrl_lock);
    648
    649	return 0;
    650}
    651
    652static int snd_sti_clk_adjustment_put(struct snd_kcontrol *kcontrol,
    653				      struct snd_ctl_elem_value *ucontrol)
    654{
    655	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
    656	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    657	struct uniperif *player = priv->dai_data.uni;
    658	int ret = 0;
    659
    660	if ((ucontrol->value.integer.value[0] < UNIPERIF_PLAYER_CLK_ADJ_MIN) ||
    661	    (ucontrol->value.integer.value[0] > UNIPERIF_PLAYER_CLK_ADJ_MAX))
    662		return -EINVAL;
    663
    664	mutex_lock(&player->ctrl_lock);
    665	player->clk_adj = ucontrol->value.integer.value[0];
    666
    667	if (player->mclk)
    668		ret = uni_player_clk_set_rate(player, player->mclk);
    669	mutex_unlock(&player->ctrl_lock);
    670
    671	return ret;
    672}
    673
    674static struct snd_kcontrol_new uni_player_clk_adj_ctl = {
    675	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
    676	.name = "PCM Playback Oversampling Freq. Adjustment",
    677	.info = snd_sti_clk_adjustment_info,
    678	.get = snd_sti_clk_adjustment_get,
    679	.put = snd_sti_clk_adjustment_put,
    680};
    681
    682static struct snd_kcontrol_new *snd_sti_pcm_ctl[] = {
    683	&uni_player_clk_adj_ctl,
    684};
    685
    686static struct snd_kcontrol_new *snd_sti_iec_ctl[] = {
    687	&uni_player_iec958_ctl,
    688	&uni_player_clk_adj_ctl,
    689};
    690
    691static int uni_player_startup(struct snd_pcm_substream *substream,
    692			      struct snd_soc_dai *dai)
    693{
    694	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    695	struct uniperif *player = priv->dai_data.uni;
    696	unsigned long flags;
    697	int ret;
    698
    699	spin_lock_irqsave(&player->irq_lock, flags);
    700	player->substream = substream;
    701	spin_unlock_irqrestore(&player->irq_lock, flags);
    702
    703	player->clk_adj = 0;
    704
    705	if (!UNIPERIF_TYPE_IS_TDM(player))
    706		return 0;
    707
    708	/* refine hw constraint in tdm mode */
    709	ret = snd_pcm_hw_rule_add(substream->runtime, 0,
    710				  SNDRV_PCM_HW_PARAM_CHANNELS,
    711				  sti_uniperiph_fix_tdm_chan,
    712				  player, SNDRV_PCM_HW_PARAM_CHANNELS,
    713				  -1);
    714	if (ret < 0)
    715		return ret;
    716
    717	return snd_pcm_hw_rule_add(substream->runtime, 0,
    718				   SNDRV_PCM_HW_PARAM_FORMAT,
    719				   sti_uniperiph_fix_tdm_format,
    720				   player, SNDRV_PCM_HW_PARAM_FORMAT,
    721				   -1);
    722}
    723
    724static int uni_player_set_sysclk(struct snd_soc_dai *dai, int clk_id,
    725				 unsigned int freq, int dir)
    726{
    727	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    728	struct uniperif *player = priv->dai_data.uni;
    729	int ret;
    730
    731	if (UNIPERIF_TYPE_IS_TDM(player) || (dir == SND_SOC_CLOCK_IN))
    732		return 0;
    733
    734	if (clk_id != 0)
    735		return -EINVAL;
    736
    737	mutex_lock(&player->ctrl_lock);
    738	ret = uni_player_clk_set_rate(player, freq);
    739	if (!ret)
    740		player->mclk = freq;
    741	mutex_unlock(&player->ctrl_lock);
    742
    743	return ret;
    744}
    745
    746static int uni_player_prepare(struct snd_pcm_substream *substream,
    747			      struct snd_soc_dai *dai)
    748{
    749	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    750	struct uniperif *player = priv->dai_data.uni;
    751	struct snd_pcm_runtime *runtime = substream->runtime;
    752	int transfer_size, trigger_limit;
    753	int ret;
    754
    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);
    759		return -EINVAL;
    760	}
    761
    762	/* Calculate transfer size (in fifo cells and bytes) for frame count */
    763	if (player->type == SND_ST_UNIPERIF_TYPE_TDM) {
    764		/* transfer size = user frame size (in 32 bits FIFO cell) */
    765		transfer_size =
    766			sti_uniperiph_get_user_frame_size(runtime) / 4;
    767	} else {
    768		transfer_size = runtime->channels * UNIPERIF_FIFO_FRAMES;
    769	}
    770
    771	/* Calculate number of empty cells available before asserting DREQ */
    772	if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) {
    773		trigger_limit = UNIPERIF_FIFO_SIZE - transfer_size;
    774	} else {
    775		/*
    776		 * Since SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0
    777		 * FDMA_TRIGGER_LIMIT also controls when the state switches
    778		 * from OFF or STANDBY to AUDIO DATA.
    779		 */
    780		trigger_limit = transfer_size;
    781	}
    782
    783	/* Trigger limit must be an even number */
    784	if ((!trigger_limit % 2) || (trigger_limit != 1 && transfer_size % 2) ||
    785	    (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) {
    786		dev_err(player->dev, "invalid trigger limit %d\n",
    787			trigger_limit);
    788		return -EINVAL;
    789	}
    790
    791	SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(player, trigger_limit);
    792
    793	/* Uniperipheral setup depends on player type */
    794	switch (player->type) {
    795	case SND_ST_UNIPERIF_TYPE_HDMI:
    796		ret = uni_player_prepare_iec958(player, runtime);
    797		break;
    798	case SND_ST_UNIPERIF_TYPE_PCM:
    799		ret = uni_player_prepare_pcm(player, runtime);
    800		break;
    801	case SND_ST_UNIPERIF_TYPE_SPDIF:
    802		ret = uni_player_prepare_iec958(player, runtime);
    803		break;
    804	case SND_ST_UNIPERIF_TYPE_TDM:
    805		ret = uni_player_prepare_tdm(player, runtime);
    806		break;
    807	default:
    808		dev_err(player->dev, "invalid player type\n");
    809		return -EINVAL;
    810	}
    811
    812	if (ret)
    813		return ret;
    814
    815	switch (player->daifmt & SND_SOC_DAIFMT_INV_MASK) {
    816	case SND_SOC_DAIFMT_NB_NF:
    817		SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
    818		SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
    819		break;
    820	case SND_SOC_DAIFMT_NB_IF:
    821		SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
    822		SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
    823		break;
    824	case SND_SOC_DAIFMT_IB_NF:
    825		SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
    826		SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
    827		break;
    828	case SND_SOC_DAIFMT_IB_IF:
    829		SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
    830		SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
    831		break;
    832	}
    833
    834	switch (player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    835	case SND_SOC_DAIFMT_I2S:
    836		SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
    837		SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(player);
    838		break;
    839	case SND_SOC_DAIFMT_LEFT_J:
    840		SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
    841		SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
    842		break;
    843	case SND_SOC_DAIFMT_RIGHT_J:
    844		SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(player);
    845		SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
    846		break;
    847	default:
    848		dev_err(player->dev, "format not supported\n");
    849		return -EINVAL;
    850	}
    851
    852	SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0);
    853
    854
    855	return sti_uniperiph_reset(player);
    856}
    857
    858static int uni_player_start(struct uniperif *player)
    859{
    860	int ret;
    861
    862	/* The player should be stopped */
    863	if (player->state != UNIPERIF_STATE_STOPPED) {
    864		dev_err(player->dev, "%s: invalid player state\n", __func__);
    865		return -EINVAL;
    866	}
    867
    868	ret = clk_prepare_enable(player->clk);
    869	if (ret) {
    870		dev_err(player->dev, "%s: Failed to enable clock\n", __func__);
    871		return ret;
    872	}
    873
    874	/* Clear any pending interrupts */
    875	SET_UNIPERIF_ITS_BCLR(player, GET_UNIPERIF_ITS(player));
    876
    877	/* Set the interrupt mask */
    878	SET_UNIPERIF_ITM_BSET_DMA_ERROR(player);
    879	SET_UNIPERIF_ITM_BSET_FIFO_ERROR(player);
    880
    881	/* Enable underflow recovery interrupts */
    882	if (player->underflow_enabled) {
    883		SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(player);
    884		SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player);
    885	}
    886
    887	ret = sti_uniperiph_reset(player);
    888	if (ret < 0) {
    889		clk_disable_unprepare(player->clk);
    890		return ret;
    891	}
    892
    893	/*
    894	 * Does not use IEC61937 features of the uniperipheral hardware.
    895	 * Instead it performs IEC61937 in software and inserts it directly
    896	 * into the audio data stream. As such, when encoded mode is selected,
    897	 * linear pcm mode is still used, but with the differences of the
    898	 * channel status bits set for encoded mode and the validity bits set.
    899	 */
    900	SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(player);
    901
    902	/*
    903	 * If iec958 formatting is required for hdmi or spdif, then it must be
    904	 * enabled after the operation mode is set. If set prior to this, it
    905	 * will not take affect and hang the player.
    906	 */
    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);
    910
    911	/* Force channel status update (no update if clk disable) */
    912	if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
    913		SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
    914	else
    915		SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
    916
    917	/* Update state to started */
    918	player->state = UNIPERIF_STATE_STARTED;
    919
    920	return 0;
    921}
    922
    923static int uni_player_stop(struct uniperif *player)
    924{
    925	int ret;
    926
    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__);
    930		return -EINVAL;
    931	}
    932
    933	/* Turn the player off */
    934	SET_UNIPERIF_CTRL_OPERATION_OFF(player);
    935
    936	ret = sti_uniperiph_reset(player);
    937	if (ret < 0)
    938		return ret;
    939
    940	/* Disable interrupts */
    941	SET_UNIPERIF_ITM_BCLR(player, GET_UNIPERIF_ITM(player));
    942
    943	/* Disable clock */
    944	clk_disable_unprepare(player->clk);
    945
    946	/* Update state to stopped and return */
    947	player->state = UNIPERIF_STATE_STOPPED;
    948
    949	return 0;
    950}
    951
    952int uni_player_resume(struct uniperif *player)
    953{
    954	int ret;
    955
    956	/* Select the frequency synthesizer clock */
    957	if (player->clk_sel) {
    958		ret = regmap_field_write(player->clk_sel, 1);
    959		if (ret) {
    960			dev_err(player->dev,
    961				"%s: Failed to select freq synth clock\n",
    962				__func__);
    963			return ret;
    964		}
    965	}
    966
    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);
    971
    972	return 0;
    973}
    974EXPORT_SYMBOL_GPL(uni_player_resume);
    975
    976static int uni_player_trigger(struct snd_pcm_substream *substream,
    977			      int cmd, struct snd_soc_dai *dai)
    978{
    979	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    980	struct uniperif *player = priv->dai_data.uni;
    981
    982	switch (cmd) {
    983	case SNDRV_PCM_TRIGGER_START:
    984		return uni_player_start(player);
    985	case SNDRV_PCM_TRIGGER_STOP:
    986		return uni_player_stop(player);
    987	case SNDRV_PCM_TRIGGER_RESUME:
    988		return uni_player_resume(player);
    989	default:
    990		return -EINVAL;
    991	}
    992}
    993
    994static void uni_player_shutdown(struct snd_pcm_substream *substream,
    995				struct snd_soc_dai *dai)
    996{
    997	struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
    998	struct uniperif *player = priv->dai_data.uni;
    999	unsigned long flags;
   1000
   1001	spin_lock_irqsave(&player->irq_lock, flags);
   1002	if (player->state != UNIPERIF_STATE_STOPPED)
   1003		/* Stop the player */
   1004		uni_player_stop(player);
   1005
   1006	player->substream = NULL;
   1007	spin_unlock_irqrestore(&player->irq_lock, flags);
   1008}
   1009
   1010static int uni_player_parse_dt_audio_glue(struct platform_device *pdev,
   1011					  struct uniperif *player)
   1012{
   1013	struct device_node *node = pdev->dev.of_node;
   1014	struct regmap *regmap;
   1015	struct reg_field regfield[2] = {
   1016		/* PCM_CLK_SEL */
   1017		REG_FIELD(SYS_CFG_AUDIO_GLUE,
   1018			  8 + player->id,
   1019			  8 + player->id),
   1020		/* PCMP_VALID_SEL */
   1021		REG_FIELD(SYS_CFG_AUDIO_GLUE, 0, 1)
   1022	};
   1023
   1024	regmap = syscon_regmap_lookup_by_phandle(node, "st,syscfg");
   1025
   1026	if (IS_ERR(regmap)) {
   1027		dev_err(&pdev->dev, "sti-audio-clk-glue syscf not found\n");
   1028		return PTR_ERR(regmap);
   1029	}
   1030
   1031	player->clk_sel = regmap_field_alloc(regmap, regfield[0]);
   1032	player->valid_sel = regmap_field_alloc(regmap, regfield[1]);
   1033
   1034	return 0;
   1035}
   1036
   1037static const struct snd_soc_dai_ops uni_player_dai_ops = {
   1038		.startup = uni_player_startup,
   1039		.shutdown = uni_player_shutdown,
   1040		.prepare = uni_player_prepare,
   1041		.trigger = uni_player_trigger,
   1042		.hw_params = sti_uniperiph_dai_hw_params,
   1043		.set_fmt = sti_uniperiph_dai_set_fmt,
   1044		.set_sysclk = uni_player_set_sysclk,
   1045		.set_tdm_slot = sti_uniperiph_set_tdm_slot
   1046};
   1047
   1048int uni_player_init(struct platform_device *pdev,
   1049		    struct uniperif *player)
   1050{
   1051	int ret = 0;
   1052
   1053	player->dev = &pdev->dev;
   1054	player->state = UNIPERIF_STATE_STOPPED;
   1055	player->dai_ops = &uni_player_dai_ops;
   1056
   1057	/* Get PCM_CLK_SEL & PCMP_VALID_SEL from audio-glue-ctrl SoC reg */
   1058	ret = uni_player_parse_dt_audio_glue(pdev, player);
   1059
   1060	if (ret < 0) {
   1061		dev_err(player->dev, "Failed to parse DeviceTree\n");
   1062		return ret;
   1063	}
   1064
   1065	/* Underflow recovery is only supported on later ip revisions */
   1066	if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
   1067		player->underflow_enabled = 1;
   1068
   1069	if (UNIPERIF_TYPE_IS_TDM(player))
   1070		player->hw = &uni_tdm_hw;
   1071	else
   1072		player->hw = &uni_player_pcm_hw;
   1073
   1074	/* Get uniperif resource */
   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);
   1079	}
   1080
   1081	/* Select the frequency synthesizer clock */
   1082	if (player->clk_sel) {
   1083		ret = regmap_field_write(player->clk_sel, 1);
   1084		if (ret) {
   1085			dev_err(player->dev,
   1086				"%s: Failed to select freq synth clock\n",
   1087				__func__);
   1088			return ret;
   1089		}
   1090	}
   1091
   1092	/* connect to I2S/TDM TX bus */
   1093	if (player->valid_sel &&
   1094	    (player->id == UNIPERIF_PLAYER_I2S_OUT)) {
   1095		ret = regmap_field_write(player->valid_sel, player->id);
   1096		if (ret) {
   1097			dev_err(player->dev,
   1098				"%s: unable to connect to tdm bus\n", __func__);
   1099			return ret;
   1100		}
   1101	}
   1102
   1103	ret = devm_request_irq(&pdev->dev, player->irq,
   1104			       uni_player_irq_handler, IRQF_SHARED,
   1105			       dev_name(&pdev->dev), player);
   1106	if (ret < 0) {
   1107		dev_err(player->dev, "unable to request IRQ %d\n", player->irq);
   1108		return ret;
   1109	}
   1110
   1111	mutex_init(&player->ctrl_lock);
   1112	spin_lock_init(&player->irq_lock);
   1113
   1114	/* Ensure that disabled by default */
   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);
   1119
   1120	if (UNIPERIF_TYPE_IS_IEC958(player)) {
   1121		/* Set default iec958 status bits  */
   1122
   1123		/* Consumer, PCM, copyright, 2ch, mode 0 */
   1124		player->stream_settings.iec958.status[0] = 0x00;
   1125		/* Broadcast reception category */
   1126		player->stream_settings.iec958.status[1] =
   1127					IEC958_AES1_CON_GENERAL;
   1128		/* Do not take into account source or channel number */
   1129		player->stream_settings.iec958.status[2] =
   1130					IEC958_AES2_CON_SOURCE_UNSPEC;
   1131		/* Sampling frequency not indicated */
   1132		player->stream_settings.iec958.status[3] =
   1133					IEC958_AES3_CON_FS_NOTID;
   1134		/* Max sample word 24-bit, sample word length not indicated */
   1135		player->stream_settings.iec958.status[4] =
   1136					IEC958_AES4_CON_MAX_WORDLEN_24 |
   1137					IEC958_AES4_CON_WORDLEN_24_20;
   1138
   1139		player->num_ctrls = ARRAY_SIZE(snd_sti_iec_ctl);
   1140		player->snd_ctrls = snd_sti_iec_ctl[0];
   1141	} else {
   1142		player->num_ctrls = ARRAY_SIZE(snd_sti_pcm_ctl);
   1143		player->snd_ctrls = snd_sti_pcm_ctl[0];
   1144	}
   1145
   1146	return 0;
   1147}
   1148EXPORT_SYMBOL_GPL(uni_player_init);