162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) ST-Ericsson SA 2012 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Ola Lilja <ola.o.lilja@stericsson.com>, 662306a36Sopenharmony_ci * for ST-Ericsson. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef UX500_MSP_I2S_H 1162306a36Sopenharmony_ci#define UX500_MSP_I2S_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/platform_device.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define MSP_INPUT_FREQ_APB 48000000 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/*** Stereo mode. Used for APB data accesses as 16 bits accesses (mono), 1862306a36Sopenharmony_ci * 32 bits accesses (stereo). 1962306a36Sopenharmony_ci ***/ 2062306a36Sopenharmony_cienum msp_stereo_mode { 2162306a36Sopenharmony_ci MSP_MONO, 2262306a36Sopenharmony_ci MSP_STEREO 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* Direction (Transmit/Receive mode) */ 2662306a36Sopenharmony_cienum msp_direction { 2762306a36Sopenharmony_ci MSP_TX = 1, 2862306a36Sopenharmony_ci MSP_RX = 2 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* Transmit and receive configuration register */ 3262306a36Sopenharmony_ci#define MSP_BIG_ENDIAN 0x00000000 3362306a36Sopenharmony_ci#define MSP_LITTLE_ENDIAN 0x00001000 3462306a36Sopenharmony_ci#define MSP_UNEXPECTED_FS_ABORT 0x00000000 3562306a36Sopenharmony_ci#define MSP_UNEXPECTED_FS_IGNORE 0x00008000 3662306a36Sopenharmony_ci#define MSP_NON_MODE_BIT_MASK 0x00009000 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* Global configuration register */ 3962306a36Sopenharmony_ci#define RX_ENABLE 0x00000001 4062306a36Sopenharmony_ci#define RX_FIFO_ENABLE 0x00000002 4162306a36Sopenharmony_ci#define RX_SYNC_SRG 0x00000010 4262306a36Sopenharmony_ci#define RX_CLK_POL_RISING 0x00000020 4362306a36Sopenharmony_ci#define RX_CLK_SEL_SRG 0x00000040 4462306a36Sopenharmony_ci#define TX_ENABLE 0x00000100 4562306a36Sopenharmony_ci#define TX_FIFO_ENABLE 0x00000200 4662306a36Sopenharmony_ci#define TX_SYNC_SRG_PROG 0x00001800 4762306a36Sopenharmony_ci#define TX_SYNC_SRG_AUTO 0x00001000 4862306a36Sopenharmony_ci#define TX_CLK_POL_RISING 0x00002000 4962306a36Sopenharmony_ci#define TX_CLK_SEL_SRG 0x00004000 5062306a36Sopenharmony_ci#define TX_EXTRA_DELAY_ENABLE 0x00008000 5162306a36Sopenharmony_ci#define SRG_ENABLE 0x00010000 5262306a36Sopenharmony_ci#define FRAME_GEN_ENABLE 0x00100000 5362306a36Sopenharmony_ci#define SRG_CLK_SEL_APB 0x00000000 5462306a36Sopenharmony_ci#define RX_FIFO_SYNC_HI 0x00000000 5562306a36Sopenharmony_ci#define TX_FIFO_SYNC_HI 0x00000000 5662306a36Sopenharmony_ci#define SPI_CLK_MODE_NORMAL 0x00000000 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define MSP_FRAME_SIZE_AUTO -1 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define MSP_DR 0x00 6162306a36Sopenharmony_ci#define MSP_GCR 0x04 6262306a36Sopenharmony_ci#define MSP_TCF 0x08 6362306a36Sopenharmony_ci#define MSP_RCF 0x0c 6462306a36Sopenharmony_ci#define MSP_SRG 0x10 6562306a36Sopenharmony_ci#define MSP_FLR 0x14 6662306a36Sopenharmony_ci#define MSP_DMACR 0x18 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define MSP_IMSC 0x20 6962306a36Sopenharmony_ci#define MSP_RIS 0x24 7062306a36Sopenharmony_ci#define MSP_MIS 0x28 7162306a36Sopenharmony_ci#define MSP_ICR 0x2c 7262306a36Sopenharmony_ci#define MSP_MCR 0x30 7362306a36Sopenharmony_ci#define MSP_RCV 0x34 7462306a36Sopenharmony_ci#define MSP_RCM 0x38 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#define MSP_TCE0 0x40 7762306a36Sopenharmony_ci#define MSP_TCE1 0x44 7862306a36Sopenharmony_ci#define MSP_TCE2 0x48 7962306a36Sopenharmony_ci#define MSP_TCE3 0x4c 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define MSP_RCE0 0x60 8262306a36Sopenharmony_ci#define MSP_RCE1 0x64 8362306a36Sopenharmony_ci#define MSP_RCE2 0x68 8462306a36Sopenharmony_ci#define MSP_RCE3 0x6c 8562306a36Sopenharmony_ci#define MSP_IODLY 0x70 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define MSP_ITCR 0x80 8862306a36Sopenharmony_ci#define MSP_ITIP 0x84 8962306a36Sopenharmony_ci#define MSP_ITOP 0x88 9062306a36Sopenharmony_ci#define MSP_TSTDR 0x8c 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define MSP_PID0 0xfe0 9362306a36Sopenharmony_ci#define MSP_PID1 0xfe4 9462306a36Sopenharmony_ci#define MSP_PID2 0xfe8 9562306a36Sopenharmony_ci#define MSP_PID3 0xfec 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define MSP_CID0 0xff0 9862306a36Sopenharmony_ci#define MSP_CID1 0xff4 9962306a36Sopenharmony_ci#define MSP_CID2 0xff8 10062306a36Sopenharmony_ci#define MSP_CID3 0xffc 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Protocol dependant parameters list */ 10362306a36Sopenharmony_ci#define RX_ENABLE_MASK BIT(0) 10462306a36Sopenharmony_ci#define RX_FIFO_ENABLE_MASK BIT(1) 10562306a36Sopenharmony_ci#define RX_FSYNC_MASK BIT(2) 10662306a36Sopenharmony_ci#define DIRECT_COMPANDING_MASK BIT(3) 10762306a36Sopenharmony_ci#define RX_SYNC_SEL_MASK BIT(4) 10862306a36Sopenharmony_ci#define RX_CLK_POL_MASK BIT(5) 10962306a36Sopenharmony_ci#define RX_CLK_SEL_MASK BIT(6) 11062306a36Sopenharmony_ci#define LOOPBACK_MASK BIT(7) 11162306a36Sopenharmony_ci#define TX_ENABLE_MASK BIT(8) 11262306a36Sopenharmony_ci#define TX_FIFO_ENABLE_MASK BIT(9) 11362306a36Sopenharmony_ci#define TX_FSYNC_MASK BIT(10) 11462306a36Sopenharmony_ci#define TX_MSP_TDR_TSR BIT(11) 11562306a36Sopenharmony_ci#define TX_SYNC_SEL_MASK (BIT(12) | BIT(11)) 11662306a36Sopenharmony_ci#define TX_CLK_POL_MASK BIT(13) 11762306a36Sopenharmony_ci#define TX_CLK_SEL_MASK BIT(14) 11862306a36Sopenharmony_ci#define TX_EXTRA_DELAY_MASK BIT(15) 11962306a36Sopenharmony_ci#define SRG_ENABLE_MASK BIT(16) 12062306a36Sopenharmony_ci#define SRG_CLK_POL_MASK BIT(17) 12162306a36Sopenharmony_ci#define SRG_CLK_SEL_MASK (BIT(19) | BIT(18)) 12262306a36Sopenharmony_ci#define FRAME_GEN_EN_MASK BIT(20) 12362306a36Sopenharmony_ci#define SPI_CLK_MODE_MASK (BIT(22) | BIT(21)) 12462306a36Sopenharmony_ci#define SPI_BURST_MODE_MASK BIT(23) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define RXEN_SHIFT 0 12762306a36Sopenharmony_ci#define RFFEN_SHIFT 1 12862306a36Sopenharmony_ci#define RFSPOL_SHIFT 2 12962306a36Sopenharmony_ci#define DCM_SHIFT 3 13062306a36Sopenharmony_ci#define RFSSEL_SHIFT 4 13162306a36Sopenharmony_ci#define RCKPOL_SHIFT 5 13262306a36Sopenharmony_ci#define RCKSEL_SHIFT 6 13362306a36Sopenharmony_ci#define LBM_SHIFT 7 13462306a36Sopenharmony_ci#define TXEN_SHIFT 8 13562306a36Sopenharmony_ci#define TFFEN_SHIFT 9 13662306a36Sopenharmony_ci#define TFSPOL_SHIFT 10 13762306a36Sopenharmony_ci#define TFSSEL_SHIFT 11 13862306a36Sopenharmony_ci#define TCKPOL_SHIFT 13 13962306a36Sopenharmony_ci#define TCKSEL_SHIFT 14 14062306a36Sopenharmony_ci#define TXDDL_SHIFT 15 14162306a36Sopenharmony_ci#define SGEN_SHIFT 16 14262306a36Sopenharmony_ci#define SCKPOL_SHIFT 17 14362306a36Sopenharmony_ci#define SCKSEL_SHIFT 18 14462306a36Sopenharmony_ci#define FGEN_SHIFT 20 14562306a36Sopenharmony_ci#define SPICKM_SHIFT 21 14662306a36Sopenharmony_ci#define TBSWAP_SHIFT 28 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define RCKPOL_MASK BIT(0) 14962306a36Sopenharmony_ci#define TCKPOL_MASK BIT(0) 15062306a36Sopenharmony_ci#define SPICKM_MASK (BIT(1) | BIT(0)) 15162306a36Sopenharmony_ci#define MSP_RX_CLKPOL_BIT(n) ((n & RCKPOL_MASK) << RCKPOL_SHIFT) 15262306a36Sopenharmony_ci#define MSP_TX_CLKPOL_BIT(n) ((n & TCKPOL_MASK) << TCKPOL_SHIFT) 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#define P1ELEN_SHIFT 0 15562306a36Sopenharmony_ci#define P1FLEN_SHIFT 3 15662306a36Sopenharmony_ci#define DTYP_SHIFT 10 15762306a36Sopenharmony_ci#define ENDN_SHIFT 12 15862306a36Sopenharmony_ci#define DDLY_SHIFT 13 15962306a36Sopenharmony_ci#define FSIG_SHIFT 15 16062306a36Sopenharmony_ci#define P2ELEN_SHIFT 16 16162306a36Sopenharmony_ci#define P2FLEN_SHIFT 19 16262306a36Sopenharmony_ci#define P2SM_SHIFT 26 16362306a36Sopenharmony_ci#define P2EN_SHIFT 27 16462306a36Sopenharmony_ci#define FSYNC_SHIFT 15 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define P1ELEN_MASK 0x00000007 16762306a36Sopenharmony_ci#define P2ELEN_MASK 0x00070000 16862306a36Sopenharmony_ci#define P1FLEN_MASK 0x00000378 16962306a36Sopenharmony_ci#define P2FLEN_MASK 0x03780000 17062306a36Sopenharmony_ci#define DDLY_MASK 0x00003000 17162306a36Sopenharmony_ci#define DTYP_MASK 0x00000600 17262306a36Sopenharmony_ci#define P2SM_MASK 0x04000000 17362306a36Sopenharmony_ci#define P2EN_MASK 0x08000000 17462306a36Sopenharmony_ci#define ENDN_MASK 0x00001000 17562306a36Sopenharmony_ci#define TFSPOL_MASK 0x00000400 17662306a36Sopenharmony_ci#define TBSWAP_MASK 0x30000000 17762306a36Sopenharmony_ci#define COMPANDING_MODE_MASK 0x00000c00 17862306a36Sopenharmony_ci#define FSYNC_MASK 0x00008000 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci#define MSP_P1_ELEM_LEN_BITS(n) (n & P1ELEN_MASK) 18162306a36Sopenharmony_ci#define MSP_P2_ELEM_LEN_BITS(n) (((n) << P2ELEN_SHIFT) & P2ELEN_MASK) 18262306a36Sopenharmony_ci#define MSP_P1_FRAME_LEN_BITS(n) (((n) << P1FLEN_SHIFT) & P1FLEN_MASK) 18362306a36Sopenharmony_ci#define MSP_P2_FRAME_LEN_BITS(n) (((n) << P2FLEN_SHIFT) & P2FLEN_MASK) 18462306a36Sopenharmony_ci#define MSP_DATA_DELAY_BITS(n) (((n) << DDLY_SHIFT) & DDLY_MASK) 18562306a36Sopenharmony_ci#define MSP_DATA_TYPE_BITS(n) (((n) << DTYP_SHIFT) & DTYP_MASK) 18662306a36Sopenharmony_ci#define MSP_P2_START_MODE_BIT(n) ((n << P2SM_SHIFT) & P2SM_MASK) 18762306a36Sopenharmony_ci#define MSP_P2_ENABLE_BIT(n) ((n << P2EN_SHIFT) & P2EN_MASK) 18862306a36Sopenharmony_ci#define MSP_SET_ENDIANNES_BIT(n) ((n << ENDN_SHIFT) & ENDN_MASK) 18962306a36Sopenharmony_ci#define MSP_FSYNC_POL(n) ((n << TFSPOL_SHIFT) & TFSPOL_MASK) 19062306a36Sopenharmony_ci#define MSP_DATA_WORD_SWAP(n) ((n << TBSWAP_SHIFT) & TBSWAP_MASK) 19162306a36Sopenharmony_ci#define MSP_SET_COMPANDING_MODE(n) ((n << DTYP_SHIFT) & \ 19262306a36Sopenharmony_ci COMPANDING_MODE_MASK) 19362306a36Sopenharmony_ci#define MSP_SET_FSYNC_IGNORE(n) ((n << FSYNC_SHIFT) & FSYNC_MASK) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* Flag register */ 19662306a36Sopenharmony_ci#define RX_BUSY BIT(0) 19762306a36Sopenharmony_ci#define RX_FIFO_EMPTY BIT(1) 19862306a36Sopenharmony_ci#define RX_FIFO_FULL BIT(2) 19962306a36Sopenharmony_ci#define TX_BUSY BIT(3) 20062306a36Sopenharmony_ci#define TX_FIFO_EMPTY BIT(4) 20162306a36Sopenharmony_ci#define TX_FIFO_FULL BIT(5) 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci#define RBUSY_SHIFT 0 20462306a36Sopenharmony_ci#define RFE_SHIFT 1 20562306a36Sopenharmony_ci#define RFU_SHIFT 2 20662306a36Sopenharmony_ci#define TBUSY_SHIFT 3 20762306a36Sopenharmony_ci#define TFE_SHIFT 4 20862306a36Sopenharmony_ci#define TFU_SHIFT 5 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* Multichannel control register */ 21162306a36Sopenharmony_ci#define RMCEN_SHIFT 0 21262306a36Sopenharmony_ci#define RMCSF_SHIFT 1 21362306a36Sopenharmony_ci#define RCMPM_SHIFT 3 21462306a36Sopenharmony_ci#define TMCEN_SHIFT 5 21562306a36Sopenharmony_ci#define TNCSF_SHIFT 6 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/* Sample rate generator register */ 21862306a36Sopenharmony_ci#define SCKDIV_SHIFT 0 21962306a36Sopenharmony_ci#define FRWID_SHIFT 10 22062306a36Sopenharmony_ci#define FRPER_SHIFT 16 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci#define SCK_DIV_MASK 0x0000003FF 22362306a36Sopenharmony_ci#define FRAME_WIDTH_BITS(n) (((n) << FRWID_SHIFT) & 0x0000FC00) 22462306a36Sopenharmony_ci#define FRAME_PERIOD_BITS(n) (((n) << FRPER_SHIFT) & 0x1FFF0000) 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci/* DMA controller register */ 22762306a36Sopenharmony_ci#define RX_DMA_ENABLE BIT(0) 22862306a36Sopenharmony_ci#define TX_DMA_ENABLE BIT(1) 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define RDMAE_SHIFT 0 23162306a36Sopenharmony_ci#define TDMAE_SHIFT 1 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci/* Interrupt Register */ 23462306a36Sopenharmony_ci#define RX_SERVICE_INT BIT(0) 23562306a36Sopenharmony_ci#define RX_OVERRUN_ERROR_INT BIT(1) 23662306a36Sopenharmony_ci#define RX_FSYNC_ERR_INT BIT(2) 23762306a36Sopenharmony_ci#define RX_FSYNC_INT BIT(3) 23862306a36Sopenharmony_ci#define TX_SERVICE_INT BIT(4) 23962306a36Sopenharmony_ci#define TX_UNDERRUN_ERR_INT BIT(5) 24062306a36Sopenharmony_ci#define TX_FSYNC_ERR_INT BIT(6) 24162306a36Sopenharmony_ci#define TX_FSYNC_INT BIT(7) 24262306a36Sopenharmony_ci#define ALL_INT 0x000000ff 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci/* MSP test control register */ 24562306a36Sopenharmony_ci#define MSP_ITCR_ITEN BIT(0) 24662306a36Sopenharmony_ci#define MSP_ITCR_TESTFIFO BIT(1) 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci#define RMCEN_BIT 0 24962306a36Sopenharmony_ci#define RMCSF_BIT 1 25062306a36Sopenharmony_ci#define RCMPM_BIT 3 25162306a36Sopenharmony_ci#define TMCEN_BIT 5 25262306a36Sopenharmony_ci#define TNCSF_BIT 6 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci/* Single or dual phase mode */ 25562306a36Sopenharmony_cienum msp_phase_mode { 25662306a36Sopenharmony_ci MSP_SINGLE_PHASE, 25762306a36Sopenharmony_ci MSP_DUAL_PHASE 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci/* Frame length */ 26162306a36Sopenharmony_cienum msp_frame_length { 26262306a36Sopenharmony_ci MSP_FRAME_LEN_1 = 0, 26362306a36Sopenharmony_ci MSP_FRAME_LEN_2 = 1, 26462306a36Sopenharmony_ci MSP_FRAME_LEN_4 = 3, 26562306a36Sopenharmony_ci MSP_FRAME_LEN_8 = 7, 26662306a36Sopenharmony_ci MSP_FRAME_LEN_12 = 11, 26762306a36Sopenharmony_ci MSP_FRAME_LEN_16 = 15, 26862306a36Sopenharmony_ci MSP_FRAME_LEN_20 = 19, 26962306a36Sopenharmony_ci MSP_FRAME_LEN_32 = 31, 27062306a36Sopenharmony_ci MSP_FRAME_LEN_48 = 47, 27162306a36Sopenharmony_ci MSP_FRAME_LEN_64 = 63 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci/* Element length */ 27562306a36Sopenharmony_cienum msp_elem_length { 27662306a36Sopenharmony_ci MSP_ELEM_LEN_8 = 0, 27762306a36Sopenharmony_ci MSP_ELEM_LEN_10 = 1, 27862306a36Sopenharmony_ci MSP_ELEM_LEN_12 = 2, 27962306a36Sopenharmony_ci MSP_ELEM_LEN_14 = 3, 28062306a36Sopenharmony_ci MSP_ELEM_LEN_16 = 4, 28162306a36Sopenharmony_ci MSP_ELEM_LEN_20 = 5, 28262306a36Sopenharmony_ci MSP_ELEM_LEN_24 = 6, 28362306a36Sopenharmony_ci MSP_ELEM_LEN_32 = 7 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_cienum msp_data_xfer_width { 28762306a36Sopenharmony_ci MSP_DATA_TRANSFER_WIDTH_BYTE, 28862306a36Sopenharmony_ci MSP_DATA_TRANSFER_WIDTH_HALFWORD, 28962306a36Sopenharmony_ci MSP_DATA_TRANSFER_WIDTH_WORD 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cienum msp_frame_sync { 29362306a36Sopenharmony_ci MSP_FSYNC_UNIGNORE = 0, 29462306a36Sopenharmony_ci MSP_FSYNC_IGNORE = 1, 29562306a36Sopenharmony_ci}; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cienum msp_phase2_start_mode { 29862306a36Sopenharmony_ci MSP_PHASE2_START_MODE_IMEDIATE, 29962306a36Sopenharmony_ci MSP_PHASE2_START_MODE_FSYNC 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cienum msp_btf { 30362306a36Sopenharmony_ci MSP_BTF_MS_BIT_FIRST = 0, 30462306a36Sopenharmony_ci MSP_BTF_LS_BIT_FIRST = 1 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cienum msp_fsync_pol { 30862306a36Sopenharmony_ci MSP_FSYNC_POL_ACT_HI = 0, 30962306a36Sopenharmony_ci MSP_FSYNC_POL_ACT_LO = 1 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci/* Data delay (in bit clock cycles) */ 31362306a36Sopenharmony_cienum msp_delay { 31462306a36Sopenharmony_ci MSP_DELAY_0 = 0, 31562306a36Sopenharmony_ci MSP_DELAY_1 = 1, 31662306a36Sopenharmony_ci MSP_DELAY_2 = 2, 31762306a36Sopenharmony_ci MSP_DELAY_3 = 3 31862306a36Sopenharmony_ci}; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci/* Configurations of clocks (transmit, receive or sample rate generator) */ 32162306a36Sopenharmony_cienum msp_edge { 32262306a36Sopenharmony_ci MSP_FALLING_EDGE = 0, 32362306a36Sopenharmony_ci MSP_RISING_EDGE = 1, 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cienum msp_hws { 32762306a36Sopenharmony_ci MSP_SWAP_NONE = 0, 32862306a36Sopenharmony_ci MSP_SWAP_BYTE_PER_WORD = 1, 32962306a36Sopenharmony_ci MSP_SWAP_BYTE_PER_HALF_WORD = 2, 33062306a36Sopenharmony_ci MSP_SWAP_HALF_WORD_PER_WORD = 3 33162306a36Sopenharmony_ci}; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cienum msp_compress_mode { 33462306a36Sopenharmony_ci MSP_COMPRESS_MODE_LINEAR = 0, 33562306a36Sopenharmony_ci MSP_COMPRESS_MODE_MU_LAW = 2, 33662306a36Sopenharmony_ci MSP_COMPRESS_MODE_A_LAW = 3 33762306a36Sopenharmony_ci}; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cienum msp_expand_mode { 34062306a36Sopenharmony_ci MSP_EXPAND_MODE_LINEAR = 0, 34162306a36Sopenharmony_ci MSP_EXPAND_MODE_LINEAR_SIGNED = 1, 34262306a36Sopenharmony_ci MSP_EXPAND_MODE_MU_LAW = 2, 34362306a36Sopenharmony_ci MSP_EXPAND_MODE_A_LAW = 3 34462306a36Sopenharmony_ci}; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci#define MSP_FRAME_PERIOD_IN_MONO_MODE 256 34762306a36Sopenharmony_ci#define MSP_FRAME_PERIOD_IN_STEREO_MODE 32 34862306a36Sopenharmony_ci#define MSP_FRAME_WIDTH_IN_STEREO_MODE 16 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cienum msp_protocol { 35162306a36Sopenharmony_ci MSP_I2S_PROTOCOL, 35262306a36Sopenharmony_ci MSP_PCM_PROTOCOL, 35362306a36Sopenharmony_ci MSP_PCM_COMPAND_PROTOCOL, 35462306a36Sopenharmony_ci MSP_INVALID_PROTOCOL 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/* 35862306a36Sopenharmony_ci * No of registers to backup during 35962306a36Sopenharmony_ci * suspend resume 36062306a36Sopenharmony_ci */ 36162306a36Sopenharmony_ci#define MAX_MSP_BACKUP_REGS 36 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cienum i2s_direction_t { 36462306a36Sopenharmony_ci MSP_DIR_TX = 0x01, 36562306a36Sopenharmony_ci MSP_DIR_RX = 0x02, 36662306a36Sopenharmony_ci}; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cienum msp_data_size { 36962306a36Sopenharmony_ci MSP_DATA_BITS_DEFAULT = -1, 37062306a36Sopenharmony_ci MSP_DATA_BITS_8 = 0x00, 37162306a36Sopenharmony_ci MSP_DATA_BITS_10, 37262306a36Sopenharmony_ci MSP_DATA_BITS_12, 37362306a36Sopenharmony_ci MSP_DATA_BITS_14, 37462306a36Sopenharmony_ci MSP_DATA_BITS_16, 37562306a36Sopenharmony_ci MSP_DATA_BITS_20, 37662306a36Sopenharmony_ci MSP_DATA_BITS_24, 37762306a36Sopenharmony_ci MSP_DATA_BITS_32, 37862306a36Sopenharmony_ci}; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cienum msp_state { 38162306a36Sopenharmony_ci MSP_STATE_IDLE = 0, 38262306a36Sopenharmony_ci MSP_STATE_CONFIGURED = 1, 38362306a36Sopenharmony_ci MSP_STATE_RUNNING = 2, 38462306a36Sopenharmony_ci}; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cienum msp_rx_comparison_enable_mode { 38762306a36Sopenharmony_ci MSP_COMPARISON_DISABLED = 0, 38862306a36Sopenharmony_ci MSP_COMPARISON_NONEQUAL_ENABLED = 2, 38962306a36Sopenharmony_ci MSP_COMPARISON_EQUAL_ENABLED = 3 39062306a36Sopenharmony_ci}; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_cistruct msp_multichannel_config { 39362306a36Sopenharmony_ci bool rx_multichannel_enable; 39462306a36Sopenharmony_ci bool tx_multichannel_enable; 39562306a36Sopenharmony_ci enum msp_rx_comparison_enable_mode rx_comparison_enable_mode; 39662306a36Sopenharmony_ci u8 padding; 39762306a36Sopenharmony_ci u32 comparison_value; 39862306a36Sopenharmony_ci u32 comparison_mask; 39962306a36Sopenharmony_ci u32 rx_channel_0_enable; 40062306a36Sopenharmony_ci u32 rx_channel_1_enable; 40162306a36Sopenharmony_ci u32 rx_channel_2_enable; 40262306a36Sopenharmony_ci u32 rx_channel_3_enable; 40362306a36Sopenharmony_ci u32 tx_channel_0_enable; 40462306a36Sopenharmony_ci u32 tx_channel_1_enable; 40562306a36Sopenharmony_ci u32 tx_channel_2_enable; 40662306a36Sopenharmony_ci u32 tx_channel_3_enable; 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistruct msp_protdesc { 41062306a36Sopenharmony_ci u32 rx_phase_mode; 41162306a36Sopenharmony_ci u32 tx_phase_mode; 41262306a36Sopenharmony_ci u32 rx_phase2_start_mode; 41362306a36Sopenharmony_ci u32 tx_phase2_start_mode; 41462306a36Sopenharmony_ci u32 rx_byte_order; 41562306a36Sopenharmony_ci u32 tx_byte_order; 41662306a36Sopenharmony_ci u32 rx_frame_len_1; 41762306a36Sopenharmony_ci u32 rx_frame_len_2; 41862306a36Sopenharmony_ci u32 tx_frame_len_1; 41962306a36Sopenharmony_ci u32 tx_frame_len_2; 42062306a36Sopenharmony_ci u32 rx_elem_len_1; 42162306a36Sopenharmony_ci u32 rx_elem_len_2; 42262306a36Sopenharmony_ci u32 tx_elem_len_1; 42362306a36Sopenharmony_ci u32 tx_elem_len_2; 42462306a36Sopenharmony_ci u32 rx_data_delay; 42562306a36Sopenharmony_ci u32 tx_data_delay; 42662306a36Sopenharmony_ci u32 rx_clk_pol; 42762306a36Sopenharmony_ci u32 tx_clk_pol; 42862306a36Sopenharmony_ci u32 rx_fsync_pol; 42962306a36Sopenharmony_ci u32 tx_fsync_pol; 43062306a36Sopenharmony_ci u32 rx_half_word_swap; 43162306a36Sopenharmony_ci u32 tx_half_word_swap; 43262306a36Sopenharmony_ci u32 compression_mode; 43362306a36Sopenharmony_ci u32 expansion_mode; 43462306a36Sopenharmony_ci u32 frame_sync_ignore; 43562306a36Sopenharmony_ci u32 frame_period; 43662306a36Sopenharmony_ci u32 frame_width; 43762306a36Sopenharmony_ci u32 clocks_per_frame; 43862306a36Sopenharmony_ci}; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistruct ux500_msp_config { 44162306a36Sopenharmony_ci unsigned int f_inputclk; 44262306a36Sopenharmony_ci unsigned int rx_clk_sel; 44362306a36Sopenharmony_ci unsigned int tx_clk_sel; 44462306a36Sopenharmony_ci unsigned int srg_clk_sel; 44562306a36Sopenharmony_ci unsigned int rx_fsync_pol; 44662306a36Sopenharmony_ci unsigned int tx_fsync_pol; 44762306a36Sopenharmony_ci unsigned int rx_fsync_sel; 44862306a36Sopenharmony_ci unsigned int tx_fsync_sel; 44962306a36Sopenharmony_ci unsigned int rx_fifo_config; 45062306a36Sopenharmony_ci unsigned int tx_fifo_config; 45162306a36Sopenharmony_ci unsigned int loopback_enable; 45262306a36Sopenharmony_ci unsigned int tx_data_enable; 45362306a36Sopenharmony_ci unsigned int default_protdesc; 45462306a36Sopenharmony_ci struct msp_protdesc protdesc; 45562306a36Sopenharmony_ci int multichannel_configured; 45662306a36Sopenharmony_ci struct msp_multichannel_config multichannel_config; 45762306a36Sopenharmony_ci unsigned int direction; 45862306a36Sopenharmony_ci unsigned int protocol; 45962306a36Sopenharmony_ci unsigned int frame_freq; 46062306a36Sopenharmony_ci enum msp_data_size data_size; 46162306a36Sopenharmony_ci unsigned int def_elem_len; 46262306a36Sopenharmony_ci unsigned int iodelay; 46362306a36Sopenharmony_ci}; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistruct ux500_msp { 46662306a36Sopenharmony_ci int id; 46762306a36Sopenharmony_ci void __iomem *registers; 46862306a36Sopenharmony_ci struct device *dev; 46962306a36Sopenharmony_ci dma_addr_t tx_rx_addr; 47062306a36Sopenharmony_ci enum msp_state msp_state; 47162306a36Sopenharmony_ci int def_elem_len; 47262306a36Sopenharmony_ci unsigned int dir_busy; 47362306a36Sopenharmony_ci int loopback_enable; 47462306a36Sopenharmony_ci unsigned int f_bitclk; 47562306a36Sopenharmony_ci}; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ciint ux500_msp_i2s_init_msp(struct platform_device *pdev, 47862306a36Sopenharmony_ci struct ux500_msp **msp_p); 47962306a36Sopenharmony_civoid ux500_msp_i2s_cleanup_msp(struct platform_device *pdev, 48062306a36Sopenharmony_ci struct ux500_msp *msp); 48162306a36Sopenharmony_ciint ux500_msp_i2s_open(struct ux500_msp *msp, struct ux500_msp_config *config); 48262306a36Sopenharmony_ciint ux500_msp_i2s_close(struct ux500_msp *msp, 48362306a36Sopenharmony_ci unsigned int dir); 48462306a36Sopenharmony_ciint ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd, 48562306a36Sopenharmony_ci int direction); 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci#endif 488