183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2511ed5fdSRajeshwari Shinde /* 3511ed5fdSRajeshwari Shinde * Copyright (C) 2012 Samsung Electronics 4511ed5fdSRajeshwari Shinde * R. Chandrasekar <rcsekar@samsung.com> 5511ed5fdSRajeshwari Shinde */ 6511ed5fdSRajeshwari Shinde 7511ed5fdSRajeshwari Shinde #ifndef __I2S_H__ 8511ed5fdSRajeshwari Shinde #define __I2S_H__ 9511ed5fdSRajeshwari Shinde 10511ed5fdSRajeshwari Shinde /* 11511ed5fdSRajeshwari Shinde * DAI hardware audio formats. 12511ed5fdSRajeshwari Shinde * 13511ed5fdSRajeshwari Shinde * Describes the physical PCM data formating and clocking. Add new formats 14511ed5fdSRajeshwari Shinde * to the end. 15511ed5fdSRajeshwari Shinde */ 16511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_I2S 1 /* I2S mode */ 17511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_RIGHT_J 2 /* Right Justified mode */ 18511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_LEFT_J 3 /* Left Justified mode */ 19511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_DSP_A 4 /* L data MSB after FRM LRC */ 20511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_DSP_B 5 /* L data MSB during FRM LRC */ 21511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_AC97 6 /* AC97 */ 22511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_PDM 7 /* Pulse density modulation */ 23511ed5fdSRajeshwari Shinde 24511ed5fdSRajeshwari Shinde /* left and right justified also known as MSB and LSB respectively */ 25511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J 26511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J 27511ed5fdSRajeshwari Shinde 28511ed5fdSRajeshwari Shinde /* 29511ed5fdSRajeshwari Shinde * DAI hardware signal inversions. 30511ed5fdSRajeshwari Shinde * 31511ed5fdSRajeshwari Shinde * Specifies whether the DAI can also support inverted clocks for the specified 32511ed5fdSRajeshwari Shinde * format. 33511ed5fdSRajeshwari Shinde */ 34511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_NB_NF (1 << 8) /* normal bit clock + frame */ 35511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_NB_IF (2 << 8) /* normal BCLK + inv FRM */ 36511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_IB_NF (3 << 8) /* invert BCLK + nor FRM */ 37511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_IB_IF (4 << 8) /* invert BCLK + FRM */ 38511ed5fdSRajeshwari Shinde 39511ed5fdSRajeshwari Shinde /* 40511ed5fdSRajeshwari Shinde * DAI hardware clock masters. 41511ed5fdSRajeshwari Shinde * 42511ed5fdSRajeshwari Shinde * This is wrt the codec, the inverse is true for the interface 43511ed5fdSRajeshwari Shinde * i.e. if the codec is clk and FRM master then the interface is 44511ed5fdSRajeshwari Shinde * clk and frame slave. 45511ed5fdSRajeshwari Shinde */ 46511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & FRM master */ 47511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk slave & FRM master */ 48511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame slave */ 49511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM slave */ 50511ed5fdSRajeshwari Shinde 51511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_FORMAT_MASK 0x000f 52511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0 53511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_INV_MASK 0x0f00 54511ed5fdSRajeshwari Shinde #define SND_SOC_DAIFMT_MASTER_MASK 0xf000 55511ed5fdSRajeshwari Shinde 56511ed5fdSRajeshwari Shinde /* 57511ed5fdSRajeshwari Shinde * Master Clock Directions 58511ed5fdSRajeshwari Shinde */ 59511ed5fdSRajeshwari Shinde #define SND_SOC_CLOCK_IN 0 60511ed5fdSRajeshwari Shinde #define SND_SOC_CLOCK_OUT 1 61511ed5fdSRajeshwari Shinde 62511ed5fdSRajeshwari Shinde /* I2S Tx Control */ 63511ed5fdSRajeshwari Shinde #define I2S_TX_ON 1 64511ed5fdSRajeshwari Shinde #define I2S_TX_OFF 0 65511ed5fdSRajeshwari Shinde 66511ed5fdSRajeshwari Shinde #define FIFO_LENGTH 64 67511ed5fdSRajeshwari Shinde 68511ed5fdSRajeshwari Shinde /* I2s Registers */ 69511ed5fdSRajeshwari Shinde struct i2s_reg { 70511ed5fdSRajeshwari Shinde unsigned int con; /* base + 0 , Control register */ 71511ed5fdSRajeshwari Shinde unsigned int mod; /* Mode register */ 72511ed5fdSRajeshwari Shinde unsigned int fic; /* FIFO control register */ 73511ed5fdSRajeshwari Shinde unsigned int psr; /* Reserved */ 74511ed5fdSRajeshwari Shinde unsigned int txd; /* Transmit data register */ 75511ed5fdSRajeshwari Shinde unsigned int rxd; /* Receive Data Register */ 76511ed5fdSRajeshwari Shinde }; 77511ed5fdSRajeshwari Shinde 78511ed5fdSRajeshwari Shinde /* This structure stores the i2s related information */ 7945863db5SSimon Glass struct i2s_uc_priv { 80511ed5fdSRajeshwari Shinde unsigned int rfs; /* LR clock frame size */ 81*f0b02f3dSSimon Glass unsigned int bfs; /* Bit clock frame size */ 82511ed5fdSRajeshwari Shinde unsigned int audio_pll_clk; /* Audio pll frequency in Hz */ 83511ed5fdSRajeshwari Shinde unsigned int samplingrate; /* sampling rate */ 84511ed5fdSRajeshwari Shinde unsigned int bitspersample; /* bits per sample */ 85511ed5fdSRajeshwari Shinde unsigned int channels; /* audio channels */ 86511ed5fdSRajeshwari Shinde unsigned int base_address; /* I2S Register Base */ 87d981d80dSDani Krishna Mohan unsigned int id; /* I2S controller id */ 88511ed5fdSRajeshwari Shinde }; 89511ed5fdSRajeshwari Shinde 90e96fa6c9SSimon Glass /* Operations for i2s devices */ 91e96fa6c9SSimon Glass struct i2s_ops { 92e96fa6c9SSimon Glass /** 93e96fa6c9SSimon Glass * tx_data() - Transmit audio data 94e96fa6c9SSimon Glass * 95e96fa6c9SSimon Glass * @dev: I2C device 96e96fa6c9SSimon Glass * @data: Data buffer to play 97e96fa6c9SSimon Glass * @data_size: Size of data buffer in bytes 98e96fa6c9SSimon Glass * @return 0 if OK, -ve on error 99e96fa6c9SSimon Glass */ 100e96fa6c9SSimon Glass int (*tx_data)(struct udevice *dev, void *data, uint data_size); 101e96fa6c9SSimon Glass }; 102e96fa6c9SSimon Glass 103e96fa6c9SSimon Glass #define i2s_get_ops(dev) ((struct i2s_ops *)(dev)->driver->ops) 104e96fa6c9SSimon Glass 105e96fa6c9SSimon Glass /** 106e96fa6c9SSimon Glass * i2s_tx_data() - Transmit audio data 107e96fa6c9SSimon Glass * 108e96fa6c9SSimon Glass * @dev: I2C device 109e96fa6c9SSimon Glass * @data: Data buffer to play 110e96fa6c9SSimon Glass * @data_size: Size of data buffer in bytes 111e96fa6c9SSimon Glass * @return 0 if OK, -ve on error 112e96fa6c9SSimon Glass */ 113e96fa6c9SSimon Glass int i2s_tx_data(struct udevice *dev, void *data, uint data_size); 114e96fa6c9SSimon Glass 115511ed5fdSRajeshwari Shinde /* 116511ed5fdSRajeshwari Shinde * Sends the given data through i2s tx 117511ed5fdSRajeshwari Shinde * 118511ed5fdSRajeshwari Shinde * @param pi2s_tx pointer of i2s transmitter parameter structure. 119511ed5fdSRajeshwari Shinde * @param data address of the data buffer 120e96fa6c9SSimon Glass * @param data_size size of the data (in bytes) 121511ed5fdSRajeshwari Shinde * @return int value 0 for success, -1 in case of error 122511ed5fdSRajeshwari Shinde */ 123e96fa6c9SSimon Glass int i2s_transfer_tx_data(struct i2s_uc_priv *pi2s_tx, void *data, 124e96fa6c9SSimon Glass uint data_size); 125511ed5fdSRajeshwari Shinde 126511ed5fdSRajeshwari Shinde #endif /* __I2S_H__ */ 127