1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2012
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/delay.h>
14 #include <linux/slab.h>
18 #include <sound/soc.h>
20 #include "ux500_msp_i2s.h"
22 /* Protocol desciptors */
23 static const struct msp_protdesc prot_descs[] = {
27 MSP_PHASE2_START_MODE_IMEDIATE,
28 MSP_PHASE2_START_MODE_IMEDIATE,
47 MSP_COMPRESS_MODE_LINEAR,
48 MSP_EXPAND_MODE_LINEAR,
56 MSP_PHASE2_START_MODE_FSYNC,
57 MSP_PHASE2_START_MODE_FSYNC,
76 MSP_COMPRESS_MODE_LINEAR,
77 MSP_EXPAND_MODE_LINEAR,
82 }, { /* Companded PCM */
85 MSP_PHASE2_START_MODE_FSYNC,
86 MSP_PHASE2_START_MODE_FSYNC,
101 MSP_FSYNC_POL_ACT_HI,
102 MSP_FSYNC_POL_ACT_HI,
105 MSP_COMPRESS_MODE_LINEAR,
106 MSP_EXPAND_MODE_LINEAR,
114 static void set_prot_desc_tx(struct ux500_msp *msp,
115 struct msp_protdesc *protdesc,
116 enum msp_data_size data_size)
120 temp_reg |= MSP_P2_ENABLE_BIT(protdesc->tx_phase_mode);
121 temp_reg |= MSP_P2_START_MODE_BIT(protdesc->tx_phase2_start_mode);
122 temp_reg |= MSP_P1_FRAME_LEN_BITS(protdesc->tx_frame_len_1);
123 temp_reg |= MSP_P2_FRAME_LEN_BITS(protdesc->tx_frame_len_2);
124 if (msp->def_elem_len) {
125 temp_reg |= MSP_P1_ELEM_LEN_BITS(protdesc->tx_elem_len_1);
126 temp_reg |= MSP_P2_ELEM_LEN_BITS(protdesc->tx_elem_len_2);
128 temp_reg |= MSP_P1_ELEM_LEN_BITS(data_size);
129 temp_reg |= MSP_P2_ELEM_LEN_BITS(data_size);
131 temp_reg |= MSP_DATA_DELAY_BITS(protdesc->tx_data_delay);
132 temp_reg |= MSP_SET_ENDIANNES_BIT(protdesc->tx_byte_order);
133 temp_reg |= MSP_FSYNC_POL(protdesc->tx_fsync_pol);
134 temp_reg |= MSP_DATA_WORD_SWAP(protdesc->tx_half_word_swap);
135 temp_reg |= MSP_SET_COMPANDING_MODE(protdesc->compression_mode);
136 temp_reg |= MSP_SET_FSYNC_IGNORE(protdesc->frame_sync_ignore);
138 writel(temp_reg, msp->registers + MSP_TCF);
141 static void set_prot_desc_rx(struct ux500_msp *msp,
142 struct msp_protdesc *protdesc,
143 enum msp_data_size data_size)
147 temp_reg |= MSP_P2_ENABLE_BIT(protdesc->rx_phase_mode);
148 temp_reg |= MSP_P2_START_MODE_BIT(protdesc->rx_phase2_start_mode);
149 temp_reg |= MSP_P1_FRAME_LEN_BITS(protdesc->rx_frame_len_1);
150 temp_reg |= MSP_P2_FRAME_LEN_BITS(protdesc->rx_frame_len_2);
151 if (msp->def_elem_len) {
152 temp_reg |= MSP_P1_ELEM_LEN_BITS(protdesc->rx_elem_len_1);
153 temp_reg |= MSP_P2_ELEM_LEN_BITS(protdesc->rx_elem_len_2);
155 temp_reg |= MSP_P1_ELEM_LEN_BITS(data_size);
156 temp_reg |= MSP_P2_ELEM_LEN_BITS(data_size);
159 temp_reg |= MSP_DATA_DELAY_BITS(protdesc->rx_data_delay);
160 temp_reg |= MSP_SET_ENDIANNES_BIT(protdesc->rx_byte_order);
161 temp_reg |= MSP_FSYNC_POL(protdesc->rx_fsync_pol);
162 temp_reg |= MSP_DATA_WORD_SWAP(protdesc->rx_half_word_swap);
163 temp_reg |= MSP_SET_COMPANDING_MODE(protdesc->expansion_mode);
164 temp_reg |= MSP_SET_FSYNC_IGNORE(protdesc->frame_sync_ignore);
166 writel(temp_reg, msp->registers + MSP_RCF);
169 static int configure_protocol(struct ux500_msp *msp,
170 struct ux500_msp_config *config)
172 struct msp_protdesc *protdesc;
173 enum msp_data_size data_size;
176 data_size = config->data_size;
177 msp->def_elem_len = config->def_elem_len;
178 if (config->default_protdesc == 1) {
179 if (config->protocol >= MSP_INVALID_PROTOCOL) {
180 dev_err(msp->dev, "%s: ERROR: Invalid protocol!\n",
185 (struct msp_protdesc *)&prot_descs[config->protocol];
187 protdesc = (struct msp_protdesc *)&config->protdesc;
190 if (data_size < MSP_DATA_BITS_DEFAULT || data_size > MSP_DATA_BITS_32) {
192 "%s: ERROR: Invalid data-size requested (data_size = %d)!\n",
193 __func__, data_size);
197 if (config->direction & MSP_DIR_TX)
198 set_prot_desc_tx(msp, protdesc, data_size);
199 if (config->direction & MSP_DIR_RX)
200 set_prot_desc_rx(msp, protdesc, data_size);
202 /* The code below should not be separated. */
203 temp_reg = readl(msp->registers + MSP_GCR) & ~TX_CLK_POL_RISING;
204 temp_reg |= MSP_TX_CLKPOL_BIT(~protdesc->tx_clk_pol);
205 writel(temp_reg, msp->registers + MSP_GCR);
206 temp_reg = readl(msp->registers + MSP_GCR) & ~RX_CLK_POL_RISING;
207 temp_reg |= MSP_RX_CLKPOL_BIT(protdesc->rx_clk_pol);
208 writel(temp_reg, msp->registers + MSP_GCR);
213 static int setup_bitclk(struct ux500_msp *msp, struct ux500_msp_config *config)
220 struct msp_protdesc *protdesc = NULL;
222 reg_val_GCR = readl(msp->registers + MSP_GCR);
223 writel(reg_val_GCR & ~SRG_ENABLE, msp->registers + MSP_GCR);
225 if (config->default_protdesc)
227 (struct msp_protdesc *)&prot_descs[config->protocol];
229 protdesc = (struct msp_protdesc *)&config->protdesc;
231 switch (config->protocol) {
232 case MSP_PCM_PROTOCOL:
233 case MSP_PCM_COMPAND_PROTOCOL:
234 frame_width = protdesc->frame_width;
235 sck_div = config->f_inputclk / (config->frame_freq *
236 (protdesc->clocks_per_frame));
237 frame_per = protdesc->frame_period;
239 case MSP_I2S_PROTOCOL:
240 frame_width = protdesc->frame_width;
241 sck_div = config->f_inputclk / (config->frame_freq *
242 (protdesc->clocks_per_frame));
243 frame_per = protdesc->frame_period;
246 dev_err(msp->dev, "%s: ERROR: Unknown protocol (%d)!\n",
252 temp_reg = (sck_div - 1) & SCK_DIV_MASK;
253 temp_reg |= FRAME_WIDTH_BITS(frame_width);
254 temp_reg |= FRAME_PERIOD_BITS(frame_per);
255 writel(temp_reg, msp->registers + MSP_SRG);
257 msp->f_bitclk = (config->f_inputclk)/(sck_div + 1);
259 /* Enable bit-clock */
261 reg_val_GCR = readl(msp->registers + MSP_GCR);
262 writel(reg_val_GCR | SRG_ENABLE, msp->registers + MSP_GCR);
268 static int configure_multichannel(struct ux500_msp *msp,
269 struct ux500_msp_config *config)
271 struct msp_protdesc *protdesc;
272 struct msp_multichannel_config *mcfg;
275 if (config->default_protdesc == 1) {
276 if (config->protocol >= MSP_INVALID_PROTOCOL) {
278 "%s: ERROR: Invalid protocol (%d)!\n",
279 __func__, config->protocol);
282 protdesc = (struct msp_protdesc *)
283 &prot_descs[config->protocol];
285 protdesc = (struct msp_protdesc *)&config->protdesc;
288 mcfg = &config->multichannel_config;
289 if (mcfg->tx_multichannel_enable) {
290 if (protdesc->tx_phase_mode == MSP_SINGLE_PHASE) {
291 reg_val_MCR = readl(msp->registers + MSP_MCR);
292 writel(reg_val_MCR | (mcfg->tx_multichannel_enable ?
294 msp->registers + MSP_MCR);
295 writel(mcfg->tx_channel_0_enable,
296 msp->registers + MSP_TCE0);
297 writel(mcfg->tx_channel_1_enable,
298 msp->registers + MSP_TCE1);
299 writel(mcfg->tx_channel_2_enable,
300 msp->registers + MSP_TCE2);
301 writel(mcfg->tx_channel_3_enable,
302 msp->registers + MSP_TCE3);
305 "%s: ERROR: Only single-phase supported (TX-mode: %d)!\n",
306 __func__, protdesc->tx_phase_mode);
310 if (mcfg->rx_multichannel_enable) {
311 if (protdesc->rx_phase_mode == MSP_SINGLE_PHASE) {
312 reg_val_MCR = readl(msp->registers + MSP_MCR);
313 writel(reg_val_MCR | (mcfg->rx_multichannel_enable ?
315 msp->registers + MSP_MCR);
316 writel(mcfg->rx_channel_0_enable,
317 msp->registers + MSP_RCE0);
318 writel(mcfg->rx_channel_1_enable,
319 msp->registers + MSP_RCE1);
320 writel(mcfg->rx_channel_2_enable,
321 msp->registers + MSP_RCE2);
322 writel(mcfg->rx_channel_3_enable,
323 msp->registers + MSP_RCE3);
326 "%s: ERROR: Only single-phase supported (RX-mode: %d)!\n",
327 __func__, protdesc->rx_phase_mode);
330 if (mcfg->rx_comparison_enable_mode) {
331 reg_val_MCR = readl(msp->registers + MSP_MCR);
333 (mcfg->rx_comparison_enable_mode << RCMPM_BIT),
334 msp->registers + MSP_MCR);
336 writel(mcfg->comparison_mask,
337 msp->registers + MSP_RCM);
338 writel(mcfg->comparison_value,
339 msp->registers + MSP_RCV);
347 static int enable_msp(struct ux500_msp *msp, struct ux500_msp_config *config)
350 u32 reg_val_DMACR, reg_val_GCR;
352 /* Configure msp with protocol dependent settings */
353 configure_protocol(msp, config);
354 setup_bitclk(msp, config);
355 if (config->multichannel_configured == 1) {
356 status = configure_multichannel(msp, config);
359 "%s: WARN: configure_multichannel failed (%d)!\n",
363 reg_val_DMACR = readl(msp->registers + MSP_DMACR);
364 if (config->direction & MSP_DIR_RX)
365 reg_val_DMACR |= RX_DMA_ENABLE;
366 if (config->direction & MSP_DIR_TX)
367 reg_val_DMACR |= TX_DMA_ENABLE;
368 writel(reg_val_DMACR, msp->registers + MSP_DMACR);
370 writel(config->iodelay, msp->registers + MSP_IODLY);
372 /* Enable frame generation logic */
373 reg_val_GCR = readl(msp->registers + MSP_GCR);
374 writel(reg_val_GCR | FRAME_GEN_ENABLE, msp->registers + MSP_GCR);
379 static void flush_fifo_rx(struct ux500_msp *msp)
381 u32 reg_val_GCR, reg_val_FLR;
384 reg_val_GCR = readl(msp->registers + MSP_GCR);
385 writel(reg_val_GCR | RX_ENABLE, msp->registers + MSP_GCR);
387 reg_val_FLR = readl(msp->registers + MSP_FLR);
388 while (!(reg_val_FLR & RX_FIFO_EMPTY) && limit--) {
389 readl(msp->registers + MSP_DR);
390 reg_val_FLR = readl(msp->registers + MSP_FLR);
393 writel(reg_val_GCR, msp->registers + MSP_GCR);
396 static void flush_fifo_tx(struct ux500_msp *msp)
398 u32 reg_val_GCR, reg_val_FLR;
401 reg_val_GCR = readl(msp->registers + MSP_GCR);
402 writel(reg_val_GCR | TX_ENABLE, msp->registers + MSP_GCR);
403 writel(MSP_ITCR_ITEN | MSP_ITCR_TESTFIFO, msp->registers + MSP_ITCR);
405 reg_val_FLR = readl(msp->registers + MSP_FLR);
406 while (!(reg_val_FLR & TX_FIFO_EMPTY) && limit--) {
407 readl(msp->registers + MSP_TSTDR);
408 reg_val_FLR = readl(msp->registers + MSP_FLR);
410 writel(0x0, msp->registers + MSP_ITCR);
411 writel(reg_val_GCR, msp->registers + MSP_GCR);
414 int ux500_msp_i2s_open(struct ux500_msp *msp,
415 struct ux500_msp_config *config)
417 u32 old_reg, new_reg, mask;
419 unsigned int tx_sel, rx_sel, tx_busy, rx_busy;
421 if (in_interrupt()) {
423 "%s: ERROR: Open called in interrupt context!\n",
428 tx_sel = (config->direction & MSP_DIR_TX) > 0;
429 rx_sel = (config->direction & MSP_DIR_RX) > 0;
430 if (!tx_sel && !rx_sel) {
431 dev_err(msp->dev, "%s: Error: No direction selected!\n",
436 tx_busy = (msp->dir_busy & MSP_DIR_TX) > 0;
437 rx_busy = (msp->dir_busy & MSP_DIR_RX) > 0;
438 if (tx_busy && tx_sel) {
439 dev_err(msp->dev, "%s: Error: TX is in use!\n", __func__);
442 if (rx_busy && rx_sel) {
443 dev_err(msp->dev, "%s: Error: RX is in use!\n", __func__);
447 msp->dir_busy |= (tx_sel ? MSP_DIR_TX : 0) | (rx_sel ? MSP_DIR_RX : 0);
449 /* First do the global config register */
450 mask = RX_CLK_SEL_MASK | TX_CLK_SEL_MASK | RX_FSYNC_MASK |
451 TX_FSYNC_MASK | RX_SYNC_SEL_MASK | TX_SYNC_SEL_MASK |
452 RX_FIFO_ENABLE_MASK | TX_FIFO_ENABLE_MASK | SRG_CLK_SEL_MASK |
453 LOOPBACK_MASK | TX_EXTRA_DELAY_MASK;
455 new_reg = (config->tx_clk_sel | config->rx_clk_sel |
456 config->rx_fsync_pol | config->tx_fsync_pol |
457 config->rx_fsync_sel | config->tx_fsync_sel |
458 config->rx_fifo_config | config->tx_fifo_config |
459 config->srg_clk_sel | config->loopback_enable |
460 config->tx_data_enable);
462 old_reg = readl(msp->registers + MSP_GCR);
465 writel(new_reg, msp->registers + MSP_GCR);
467 res = enable_msp(msp, config);
469 dev_err(msp->dev, "%s: ERROR: enable_msp failed (%d)!\n",
473 if (config->loopback_enable & 0x80)
474 msp->loopback_enable = 1;
480 msp->msp_state = MSP_STATE_CONFIGURED;
484 static void disable_msp_rx(struct ux500_msp *msp)
486 u32 reg_val_GCR, reg_val_DMACR, reg_val_IMSC;
488 reg_val_GCR = readl(msp->registers + MSP_GCR);
489 writel(reg_val_GCR & ~RX_ENABLE, msp->registers + MSP_GCR);
490 reg_val_DMACR = readl(msp->registers + MSP_DMACR);
491 writel(reg_val_DMACR & ~RX_DMA_ENABLE, msp->registers + MSP_DMACR);
492 reg_val_IMSC = readl(msp->registers + MSP_IMSC);
493 writel(reg_val_IMSC &
494 ~(RX_SERVICE_INT | RX_OVERRUN_ERROR_INT),
495 msp->registers + MSP_IMSC);
497 msp->dir_busy &= ~MSP_DIR_RX;
500 static void disable_msp_tx(struct ux500_msp *msp)
502 u32 reg_val_GCR, reg_val_DMACR, reg_val_IMSC;
504 reg_val_GCR = readl(msp->registers + MSP_GCR);
505 writel(reg_val_GCR & ~TX_ENABLE, msp->registers + MSP_GCR);
506 reg_val_DMACR = readl(msp->registers + MSP_DMACR);
507 writel(reg_val_DMACR & ~TX_DMA_ENABLE, msp->registers + MSP_DMACR);
508 reg_val_IMSC = readl(msp->registers + MSP_IMSC);
509 writel(reg_val_IMSC &
510 ~(TX_SERVICE_INT | TX_UNDERRUN_ERR_INT),
511 msp->registers + MSP_IMSC);
513 msp->dir_busy &= ~MSP_DIR_TX;
516 static int disable_msp(struct ux500_msp *msp, unsigned int dir)
519 unsigned int disable_tx, disable_rx;
521 reg_val_GCR = readl(msp->registers + MSP_GCR);
522 disable_tx = dir & MSP_DIR_TX;
523 disable_rx = dir & MSP_DIR_TX;
524 if (disable_tx && disable_rx) {
525 reg_val_GCR = readl(msp->registers + MSP_GCR);
526 writel(reg_val_GCR | LOOPBACK_MASK,
527 msp->registers + MSP_GCR);
532 /* Disable TX-channel */
533 writel((readl(msp->registers + MSP_GCR) &
534 (~TX_ENABLE)), msp->registers + MSP_GCR);
539 /* Disable Loopback and Receive channel */
540 writel((readl(msp->registers + MSP_GCR) &
541 (~(RX_ENABLE | LOOPBACK_MASK))),
542 msp->registers + MSP_GCR);
546 } else if (disable_tx)
554 int ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd, int direction)
556 u32 reg_val_GCR, enable_bit;
558 if (msp->msp_state == MSP_STATE_IDLE) {
559 dev_err(msp->dev, "%s: ERROR: MSP is not configured!\n",
565 case SNDRV_PCM_TRIGGER_START:
566 case SNDRV_PCM_TRIGGER_RESUME:
567 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
568 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
569 enable_bit = TX_ENABLE;
571 enable_bit = RX_ENABLE;
572 reg_val_GCR = readl(msp->registers + MSP_GCR);
573 writel(reg_val_GCR | enable_bit, msp->registers + MSP_GCR);
576 case SNDRV_PCM_TRIGGER_STOP:
577 case SNDRV_PCM_TRIGGER_SUSPEND:
578 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
579 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
591 int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir)
595 dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir);
597 status = disable_msp(msp, dir);
598 if (msp->dir_busy == 0) {
599 /* disable sample rate and frame generators */
600 msp->msp_state = MSP_STATE_IDLE;
601 writel((readl(msp->registers + MSP_GCR) &
602 (~(FRAME_GEN_ENABLE | SRG_ENABLE))),
603 msp->registers + MSP_GCR);
605 writel(0, msp->registers + MSP_GCR);
606 writel(0, msp->registers + MSP_TCF);
607 writel(0, msp->registers + MSP_RCF);
608 writel(0, msp->registers + MSP_DMACR);
609 writel(0, msp->registers + MSP_SRG);
610 writel(0, msp->registers + MSP_MCR);
611 writel(0, msp->registers + MSP_RCM);
612 writel(0, msp->registers + MSP_RCV);
613 writel(0, msp->registers + MSP_TCE0);
614 writel(0, msp->registers + MSP_TCE1);
615 writel(0, msp->registers + MSP_TCE2);
616 writel(0, msp->registers + MSP_TCE3);
617 writel(0, msp->registers + MSP_RCE0);
618 writel(0, msp->registers + MSP_RCE1);
619 writel(0, msp->registers + MSP_RCE2);
620 writel(0, msp->registers + MSP_RCE3);
627 int ux500_msp_i2s_init_msp(struct platform_device *pdev,
628 struct ux500_msp **msp_p)
630 struct resource *res = NULL;
631 struct ux500_msp *msp;
633 *msp_p = devm_kzalloc(&pdev->dev, sizeof(struct ux500_msp), GFP_KERNEL);
638 msp->dev = &pdev->dev;
640 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
642 dev_err(&pdev->dev, "%s: ERROR: Unable to get resource!\n",
647 msp->tx_rx_addr = res->start + MSP_DR;
648 msp->registers = devm_ioremap(&pdev->dev, res->start,
650 if (msp->registers == NULL) {
651 dev_err(&pdev->dev, "%s: ERROR: ioremap failed!\n", __func__);
655 msp->msp_state = MSP_STATE_IDLE;
656 msp->loopback_enable = 0;
661 void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev,
662 struct ux500_msp *msp)
664 dev_dbg(msp->dev, "%s: Enter (id = %d).\n", __func__, msp->id);
667 MODULE_LICENSE("GPL v2");