Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) ST-Ericsson SA 2012
0004  *
0005  * Author: Ola Lilja <ola.o.lilja@stericsson.com>,
0006  *         for ST-Ericsson.
0007  */
0008 
0009 
0010 #ifndef UX500_MSP_I2S_H
0011 #define UX500_MSP_I2S_H
0012 
0013 #include <linux/platform_device.h>
0014 #include <linux/platform_data/asoc-ux500-msp.h>
0015 
0016 #define MSP_INPUT_FREQ_APB 48000000
0017 
0018 /*** Stereo mode. Used for APB data accesses as 16 bits accesses (mono),
0019  *   32 bits accesses (stereo).
0020  ***/
0021 enum msp_stereo_mode {
0022     MSP_MONO,
0023     MSP_STEREO
0024 };
0025 
0026 /* Direction (Transmit/Receive mode) */
0027 enum msp_direction {
0028     MSP_TX = 1,
0029     MSP_RX = 2
0030 };
0031 
0032 /* Transmit and receive configuration register */
0033 #define MSP_BIG_ENDIAN           0x00000000
0034 #define MSP_LITTLE_ENDIAN        0x00001000
0035 #define MSP_UNEXPECTED_FS_ABORT  0x00000000
0036 #define MSP_UNEXPECTED_FS_IGNORE 0x00008000
0037 #define MSP_NON_MODE_BIT_MASK    0x00009000
0038 
0039 /* Global configuration register */
0040 #define RX_ENABLE             0x00000001
0041 #define RX_FIFO_ENABLE        0x00000002
0042 #define RX_SYNC_SRG           0x00000010
0043 #define RX_CLK_POL_RISING     0x00000020
0044 #define RX_CLK_SEL_SRG        0x00000040
0045 #define TX_ENABLE             0x00000100
0046 #define TX_FIFO_ENABLE        0x00000200
0047 #define TX_SYNC_SRG_PROG      0x00001800
0048 #define TX_SYNC_SRG_AUTO      0x00001000
0049 #define TX_CLK_POL_RISING     0x00002000
0050 #define TX_CLK_SEL_SRG        0x00004000
0051 #define TX_EXTRA_DELAY_ENABLE 0x00008000
0052 #define SRG_ENABLE            0x00010000
0053 #define FRAME_GEN_ENABLE      0x00100000
0054 #define SRG_CLK_SEL_APB       0x00000000
0055 #define RX_FIFO_SYNC_HI       0x00000000
0056 #define TX_FIFO_SYNC_HI       0x00000000
0057 #define SPI_CLK_MODE_NORMAL   0x00000000
0058 
0059 #define MSP_FRAME_SIZE_AUTO -1
0060 
0061 #define MSP_DR      0x00
0062 #define MSP_GCR     0x04
0063 #define MSP_TCF     0x08
0064 #define MSP_RCF     0x0c
0065 #define MSP_SRG     0x10
0066 #define MSP_FLR     0x14
0067 #define MSP_DMACR   0x18
0068 
0069 #define MSP_IMSC    0x20
0070 #define MSP_RIS     0x24
0071 #define MSP_MIS     0x28
0072 #define MSP_ICR     0x2c
0073 #define MSP_MCR     0x30
0074 #define MSP_RCV     0x34
0075 #define MSP_RCM     0x38
0076 
0077 #define MSP_TCE0    0x40
0078 #define MSP_TCE1    0x44
0079 #define MSP_TCE2    0x48
0080 #define MSP_TCE3    0x4c
0081 
0082 #define MSP_RCE0    0x60
0083 #define MSP_RCE1    0x64
0084 #define MSP_RCE2    0x68
0085 #define MSP_RCE3    0x6c
0086 #define MSP_IODLY   0x70
0087 
0088 #define MSP_ITCR    0x80
0089 #define MSP_ITIP    0x84
0090 #define MSP_ITOP    0x88
0091 #define MSP_TSTDR   0x8c
0092 
0093 #define MSP_PID0    0xfe0
0094 #define MSP_PID1    0xfe4
0095 #define MSP_PID2    0xfe8
0096 #define MSP_PID3    0xfec
0097 
0098 #define MSP_CID0    0xff0
0099 #define MSP_CID1    0xff4
0100 #define MSP_CID2    0xff8
0101 #define MSP_CID3    0xffc
0102 
0103 /* Protocol dependant parameters list */
0104 #define RX_ENABLE_MASK      BIT(0)
0105 #define RX_FIFO_ENABLE_MASK BIT(1)
0106 #define RX_FSYNC_MASK       BIT(2)
0107 #define DIRECT_COMPANDING_MASK  BIT(3)
0108 #define RX_SYNC_SEL_MASK    BIT(4)
0109 #define RX_CLK_POL_MASK     BIT(5)
0110 #define RX_CLK_SEL_MASK     BIT(6)
0111 #define LOOPBACK_MASK       BIT(7)
0112 #define TX_ENABLE_MASK      BIT(8)
0113 #define TX_FIFO_ENABLE_MASK BIT(9)
0114 #define TX_FSYNC_MASK       BIT(10)
0115 #define TX_MSP_TDR_TSR      BIT(11)
0116 #define TX_SYNC_SEL_MASK    (BIT(12) | BIT(11))
0117 #define TX_CLK_POL_MASK     BIT(13)
0118 #define TX_CLK_SEL_MASK     BIT(14)
0119 #define TX_EXTRA_DELAY_MASK BIT(15)
0120 #define SRG_ENABLE_MASK     BIT(16)
0121 #define SRG_CLK_POL_MASK    BIT(17)
0122 #define SRG_CLK_SEL_MASK    (BIT(19) | BIT(18))
0123 #define FRAME_GEN_EN_MASK   BIT(20)
0124 #define SPI_CLK_MODE_MASK   (BIT(22) | BIT(21))
0125 #define SPI_BURST_MODE_MASK BIT(23)
0126 
0127 #define RXEN_SHIFT      0
0128 #define RFFEN_SHIFT     1
0129 #define RFSPOL_SHIFT        2
0130 #define DCM_SHIFT       3
0131 #define RFSSEL_SHIFT        4
0132 #define RCKPOL_SHIFT        5
0133 #define RCKSEL_SHIFT        6
0134 #define LBM_SHIFT       7
0135 #define TXEN_SHIFT      8
0136 #define TFFEN_SHIFT     9
0137 #define TFSPOL_SHIFT        10
0138 #define TFSSEL_SHIFT        11
0139 #define TCKPOL_SHIFT        13
0140 #define TCKSEL_SHIFT        14
0141 #define TXDDL_SHIFT     15
0142 #define SGEN_SHIFT      16
0143 #define SCKPOL_SHIFT        17
0144 #define SCKSEL_SHIFT        18
0145 #define FGEN_SHIFT      20
0146 #define SPICKM_SHIFT        21
0147 #define TBSWAP_SHIFT        28
0148 
0149 #define RCKPOL_MASK     BIT(0)
0150 #define TCKPOL_MASK     BIT(0)
0151 #define SPICKM_MASK     (BIT(1) | BIT(0))
0152 #define MSP_RX_CLKPOL_BIT(n)     ((n & RCKPOL_MASK) << RCKPOL_SHIFT)
0153 #define MSP_TX_CLKPOL_BIT(n)     ((n & TCKPOL_MASK) << TCKPOL_SHIFT)
0154 
0155 #define P1ELEN_SHIFT        0
0156 #define P1FLEN_SHIFT        3
0157 #define DTYP_SHIFT      10
0158 #define ENDN_SHIFT      12
0159 #define DDLY_SHIFT      13
0160 #define FSIG_SHIFT      15
0161 #define P2ELEN_SHIFT        16
0162 #define P2FLEN_SHIFT        19
0163 #define P2SM_SHIFT      26
0164 #define P2EN_SHIFT      27
0165 #define FSYNC_SHIFT     15
0166 
0167 #define P1ELEN_MASK     0x00000007
0168 #define P2ELEN_MASK     0x00070000
0169 #define P1FLEN_MASK     0x00000378
0170 #define P2FLEN_MASK     0x03780000
0171 #define DDLY_MASK       0x00003000
0172 #define DTYP_MASK       0x00000600
0173 #define P2SM_MASK       0x04000000
0174 #define P2EN_MASK       0x08000000
0175 #define ENDN_MASK       0x00001000
0176 #define TFSPOL_MASK     0x00000400
0177 #define TBSWAP_MASK     0x30000000
0178 #define COMPANDING_MODE_MASK    0x00000c00
0179 #define FSYNC_MASK      0x00008000
0180 
0181 #define MSP_P1_ELEM_LEN_BITS(n)     (n & P1ELEN_MASK)
0182 #define MSP_P2_ELEM_LEN_BITS(n)     (((n) << P2ELEN_SHIFT) & P2ELEN_MASK)
0183 #define MSP_P1_FRAME_LEN_BITS(n)    (((n) << P1FLEN_SHIFT) & P1FLEN_MASK)
0184 #define MSP_P2_FRAME_LEN_BITS(n)    (((n) << P2FLEN_SHIFT) & P2FLEN_MASK)
0185 #define MSP_DATA_DELAY_BITS(n)      (((n) << DDLY_SHIFT) & DDLY_MASK)
0186 #define MSP_DATA_TYPE_BITS(n)       (((n) << DTYP_SHIFT) & DTYP_MASK)
0187 #define MSP_P2_START_MODE_BIT(n)    ((n << P2SM_SHIFT) & P2SM_MASK)
0188 #define MSP_P2_ENABLE_BIT(n)        ((n << P2EN_SHIFT) & P2EN_MASK)
0189 #define MSP_SET_ENDIANNES_BIT(n)    ((n << ENDN_SHIFT) & ENDN_MASK)
0190 #define MSP_FSYNC_POL(n)        ((n << TFSPOL_SHIFT) & TFSPOL_MASK)
0191 #define MSP_DATA_WORD_SWAP(n)       ((n << TBSWAP_SHIFT) & TBSWAP_MASK)
0192 #define MSP_SET_COMPANDING_MODE(n)  ((n << DTYP_SHIFT) & \
0193                         COMPANDING_MODE_MASK)
0194 #define MSP_SET_FSYNC_IGNORE(n)     ((n << FSYNC_SHIFT) & FSYNC_MASK)
0195 
0196 /* Flag register */
0197 #define RX_BUSY         BIT(0)
0198 #define RX_FIFO_EMPTY       BIT(1)
0199 #define RX_FIFO_FULL        BIT(2)
0200 #define TX_BUSY         BIT(3)
0201 #define TX_FIFO_EMPTY       BIT(4)
0202 #define TX_FIFO_FULL        BIT(5)
0203 
0204 #define RBUSY_SHIFT     0
0205 #define RFE_SHIFT       1
0206 #define RFU_SHIFT       2
0207 #define TBUSY_SHIFT     3
0208 #define TFE_SHIFT       4
0209 #define TFU_SHIFT       5
0210 
0211 /* Multichannel control register */
0212 #define RMCEN_SHIFT     0
0213 #define RMCSF_SHIFT     1
0214 #define RCMPM_SHIFT     3
0215 #define TMCEN_SHIFT     5
0216 #define TNCSF_SHIFT     6
0217 
0218 /* Sample rate generator register */
0219 #define SCKDIV_SHIFT        0
0220 #define FRWID_SHIFT     10
0221 #define FRPER_SHIFT     16
0222 
0223 #define SCK_DIV_MASK        0x0000003FF
0224 #define FRAME_WIDTH_BITS(n) (((n) << FRWID_SHIFT)  & 0x0000FC00)
0225 #define FRAME_PERIOD_BITS(n)    (((n) << FRPER_SHIFT) & 0x1FFF0000)
0226 
0227 /* DMA controller register */
0228 #define RX_DMA_ENABLE       BIT(0)
0229 #define TX_DMA_ENABLE       BIT(1)
0230 
0231 #define RDMAE_SHIFT     0
0232 #define TDMAE_SHIFT     1
0233 
0234 /* Interrupt Register */
0235 #define RX_SERVICE_INT      BIT(0)
0236 #define RX_OVERRUN_ERROR_INT    BIT(1)
0237 #define RX_FSYNC_ERR_INT    BIT(2)
0238 #define RX_FSYNC_INT        BIT(3)
0239 #define TX_SERVICE_INT      BIT(4)
0240 #define TX_UNDERRUN_ERR_INT BIT(5)
0241 #define TX_FSYNC_ERR_INT    BIT(6)
0242 #define TX_FSYNC_INT        BIT(7)
0243 #define ALL_INT         0x000000ff
0244 
0245 /* MSP test control register */
0246 #define MSP_ITCR_ITEN       BIT(0)
0247 #define MSP_ITCR_TESTFIFO   BIT(1)
0248 
0249 #define RMCEN_BIT   0
0250 #define RMCSF_BIT   1
0251 #define RCMPM_BIT   3
0252 #define TMCEN_BIT   5
0253 #define TNCSF_BIT   6
0254 
0255 /* Single or dual phase mode */
0256 enum msp_phase_mode {
0257     MSP_SINGLE_PHASE,
0258     MSP_DUAL_PHASE
0259 };
0260 
0261 /* Frame length */
0262 enum msp_frame_length {
0263     MSP_FRAME_LEN_1 = 0,
0264     MSP_FRAME_LEN_2 = 1,
0265     MSP_FRAME_LEN_4 = 3,
0266     MSP_FRAME_LEN_8 = 7,
0267     MSP_FRAME_LEN_12 = 11,
0268     MSP_FRAME_LEN_16 = 15,
0269     MSP_FRAME_LEN_20 = 19,
0270     MSP_FRAME_LEN_32 = 31,
0271     MSP_FRAME_LEN_48 = 47,
0272     MSP_FRAME_LEN_64 = 63
0273 };
0274 
0275 /* Element length */
0276 enum msp_elem_length {
0277     MSP_ELEM_LEN_8 = 0,
0278     MSP_ELEM_LEN_10 = 1,
0279     MSP_ELEM_LEN_12 = 2,
0280     MSP_ELEM_LEN_14 = 3,
0281     MSP_ELEM_LEN_16 = 4,
0282     MSP_ELEM_LEN_20 = 5,
0283     MSP_ELEM_LEN_24 = 6,
0284     MSP_ELEM_LEN_32 = 7
0285 };
0286 
0287 enum msp_data_xfer_width {
0288     MSP_DATA_TRANSFER_WIDTH_BYTE,
0289     MSP_DATA_TRANSFER_WIDTH_HALFWORD,
0290     MSP_DATA_TRANSFER_WIDTH_WORD
0291 };
0292 
0293 enum msp_frame_sync {
0294     MSP_FSYNC_UNIGNORE = 0,
0295     MSP_FSYNC_IGNORE = 1,
0296 };
0297 
0298 enum msp_phase2_start_mode {
0299     MSP_PHASE2_START_MODE_IMEDIATE,
0300     MSP_PHASE2_START_MODE_FSYNC
0301 };
0302 
0303 enum msp_btf {
0304     MSP_BTF_MS_BIT_FIRST = 0,
0305     MSP_BTF_LS_BIT_FIRST = 1
0306 };
0307 
0308 enum msp_fsync_pol {
0309     MSP_FSYNC_POL_ACT_HI = 0,
0310     MSP_FSYNC_POL_ACT_LO = 1
0311 };
0312 
0313 /* Data delay (in bit clock cycles) */
0314 enum msp_delay {
0315     MSP_DELAY_0 = 0,
0316     MSP_DELAY_1 = 1,
0317     MSP_DELAY_2 = 2,
0318     MSP_DELAY_3 = 3
0319 };
0320 
0321 /* Configurations of clocks (transmit, receive or sample rate generator) */
0322 enum msp_edge {
0323     MSP_FALLING_EDGE = 0,
0324     MSP_RISING_EDGE = 1,
0325 };
0326 
0327 enum msp_hws {
0328     MSP_SWAP_NONE = 0,
0329     MSP_SWAP_BYTE_PER_WORD = 1,
0330     MSP_SWAP_BYTE_PER_HALF_WORD = 2,
0331     MSP_SWAP_HALF_WORD_PER_WORD = 3
0332 };
0333 
0334 enum msp_compress_mode {
0335     MSP_COMPRESS_MODE_LINEAR = 0,
0336     MSP_COMPRESS_MODE_MU_LAW = 2,
0337     MSP_COMPRESS_MODE_A_LAW = 3
0338 };
0339 
0340 enum msp_expand_mode {
0341     MSP_EXPAND_MODE_LINEAR = 0,
0342     MSP_EXPAND_MODE_LINEAR_SIGNED = 1,
0343     MSP_EXPAND_MODE_MU_LAW = 2,
0344     MSP_EXPAND_MODE_A_LAW = 3
0345 };
0346 
0347 #define MSP_FRAME_PERIOD_IN_MONO_MODE 256
0348 #define MSP_FRAME_PERIOD_IN_STEREO_MODE 32
0349 #define MSP_FRAME_WIDTH_IN_STEREO_MODE 16
0350 
0351 enum msp_protocol {
0352     MSP_I2S_PROTOCOL,
0353     MSP_PCM_PROTOCOL,
0354     MSP_PCM_COMPAND_PROTOCOL,
0355     MSP_INVALID_PROTOCOL
0356 };
0357 
0358 /*
0359  * No of registers to backup during
0360  * suspend resume
0361  */
0362 #define MAX_MSP_BACKUP_REGS 36
0363 
0364 enum i2s_direction_t {
0365     MSP_DIR_TX = 0x01,
0366     MSP_DIR_RX = 0x02,
0367 };
0368 
0369 enum msp_data_size {
0370     MSP_DATA_BITS_DEFAULT = -1,
0371     MSP_DATA_BITS_8 = 0x00,
0372     MSP_DATA_BITS_10,
0373     MSP_DATA_BITS_12,
0374     MSP_DATA_BITS_14,
0375     MSP_DATA_BITS_16,
0376     MSP_DATA_BITS_20,
0377     MSP_DATA_BITS_24,
0378     MSP_DATA_BITS_32,
0379 };
0380 
0381 enum msp_state {
0382     MSP_STATE_IDLE = 0,
0383     MSP_STATE_CONFIGURED = 1,
0384     MSP_STATE_RUNNING = 2,
0385 };
0386 
0387 enum msp_rx_comparison_enable_mode {
0388     MSP_COMPARISON_DISABLED = 0,
0389     MSP_COMPARISON_NONEQUAL_ENABLED = 2,
0390     MSP_COMPARISON_EQUAL_ENABLED = 3
0391 };
0392 
0393 struct msp_multichannel_config {
0394     bool rx_multichannel_enable;
0395     bool tx_multichannel_enable;
0396     enum msp_rx_comparison_enable_mode rx_comparison_enable_mode;
0397     u8 padding;
0398     u32 comparison_value;
0399     u32 comparison_mask;
0400     u32 rx_channel_0_enable;
0401     u32 rx_channel_1_enable;
0402     u32 rx_channel_2_enable;
0403     u32 rx_channel_3_enable;
0404     u32 tx_channel_0_enable;
0405     u32 tx_channel_1_enable;
0406     u32 tx_channel_2_enable;
0407     u32 tx_channel_3_enable;
0408 };
0409 
0410 struct msp_protdesc {
0411     u32 rx_phase_mode;
0412     u32 tx_phase_mode;
0413     u32 rx_phase2_start_mode;
0414     u32 tx_phase2_start_mode;
0415     u32 rx_byte_order;
0416     u32 tx_byte_order;
0417     u32 rx_frame_len_1;
0418     u32 rx_frame_len_2;
0419     u32 tx_frame_len_1;
0420     u32 tx_frame_len_2;
0421     u32 rx_elem_len_1;
0422     u32 rx_elem_len_2;
0423     u32 tx_elem_len_1;
0424     u32 tx_elem_len_2;
0425     u32 rx_data_delay;
0426     u32 tx_data_delay;
0427     u32 rx_clk_pol;
0428     u32 tx_clk_pol;
0429     u32 rx_fsync_pol;
0430     u32 tx_fsync_pol;
0431     u32 rx_half_word_swap;
0432     u32 tx_half_word_swap;
0433     u32 compression_mode;
0434     u32 expansion_mode;
0435     u32 frame_sync_ignore;
0436     u32 frame_period;
0437     u32 frame_width;
0438     u32 clocks_per_frame;
0439 };
0440 
0441 struct ux500_msp_config {
0442     unsigned int f_inputclk;
0443     unsigned int rx_clk_sel;
0444     unsigned int tx_clk_sel;
0445     unsigned int srg_clk_sel;
0446     unsigned int rx_fsync_pol;
0447     unsigned int tx_fsync_pol;
0448     unsigned int rx_fsync_sel;
0449     unsigned int tx_fsync_sel;
0450     unsigned int rx_fifo_config;
0451     unsigned int tx_fifo_config;
0452     unsigned int loopback_enable;
0453     unsigned int tx_data_enable;
0454     unsigned int default_protdesc;
0455     struct msp_protdesc protdesc;
0456     int multichannel_configured;
0457     struct msp_multichannel_config multichannel_config;
0458     unsigned int direction;
0459     unsigned int protocol;
0460     unsigned int frame_freq;
0461     enum msp_data_size data_size;
0462     unsigned int def_elem_len;
0463     unsigned int iodelay;
0464 };
0465 
0466 struct ux500_msp_dma_params {
0467     unsigned int data_size;
0468     dma_addr_t tx_rx_addr;
0469     struct stedma40_chan_cfg *dma_cfg;
0470 };
0471 
0472 struct ux500_msp {
0473     int id;
0474     void __iomem *registers;
0475     struct device *dev;
0476     struct ux500_msp_dma_params playback_dma_data;
0477     struct ux500_msp_dma_params capture_dma_data;
0478     enum msp_state msp_state;
0479     int def_elem_len;
0480     unsigned int dir_busy;
0481     int loopback_enable;
0482     unsigned int f_bitclk;
0483 };
0484 
0485 struct msp_i2s_platform_data;
0486 int ux500_msp_i2s_init_msp(struct platform_device *pdev,
0487             struct ux500_msp **msp_p,
0488             struct msp_i2s_platform_data *platform_data);
0489 void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev,
0490             struct ux500_msp *msp);
0491 int ux500_msp_i2s_open(struct ux500_msp *msp, struct ux500_msp_config *config);
0492 int ux500_msp_i2s_close(struct ux500_msp *msp,
0493             unsigned int dir);
0494 int ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd,
0495             int direction);
0496 
0497 #endif