summaryrefslogtreecommitdiff
path: root/drivers/video/sprdfb/spi/spi_simple_drv.h
blob: 07019387b2cbc662a3507cdd633689a7c75eeec6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#ifndef _SPI_TEST_H
#define _SPI_TEST_H

#include <linux/kernel.h>

#define SPI0_ID        0
#define SPI1_ID        1
#define SPI2_ID        2
#define SPI_USED_ID    SPI2_ID

#define CHN_SPI_INT			9
#define DMA_SPI_TX			0x13

#define SPI_TX_FIFO_DEPTH 		16
#define SPI_RX_FIFO_DEPTH 		16
#define SPI_INT_DIS_ALL		0
#define SPI_RX_FULL_INT_EN		BIT_6
#define SPI_RX_FULL_INT_STS 	BIT_6
#define SPI_RX_FULL_INT_CLR 	BIT_0
#define SPI_RX_FIFO_REAL_EMPTY	BIT_5
#define SPI_S8_MODE_EN			BIT_7
#define SPI_CD_SEL				0x2	//cs1 is sel as cd signal

/*
   Define the SPI interface mode for LCM
 */
#define  SPIMODE_DISABLE           0
#define  SPIMODE_3WIRE_9BIT_SDA    1  // 3 wire 9 bit, cd bit, SDI/SDO share  one IO
#define  SPIMODE_3WIRE_9BIT_SDIO   2  // 3 wire 9 bit, cd bit, SDI, SDO
#define  SPIMODE_4WIRE_8BIT_SDA    3  // 4 wire 8 bit, cd pin, SDI/SDO share one IO
#define  SPIMODE_4WIRE_8BIT_SDIO   4  // 4 wire 8 bit, cd pin, SDI, SDO

/*
   Define the clk src for SPI mode
 */
#define SPICLK_SEL_192M    0
#define SPICLK_SEL_154M    1
#define SPICLK_SEL_96M   2
#define SPICLK_SEL_26M    3

/*
   SPI CS sel in master mode
 */
#define SPI_SEL_CS0 0x0E  //2'B1110
#define SPI_SEL_CS1 0x0D  //2'B1101
#define SPI_SEL_CS2 0x0B  //2'B1011
#define SPI_SEL_CS3 0x07  //2'B0111

#define TX_MAX_LEN_MASK     0xFFFFF
#define TX_DUMY_LEN_MASK    0x3F    //[09:04]
#define TX_DATA_LEN_H_MASK  0x0F    //[03:00]
#define TX_DATA_LEN_L_MASK  0xFFFF  //[15:00]
#define SPI_MODE_SHIFT    3
#define SPI_MODE_MASK     (0x07<<SPI_MODE_SHIFT)
#define SPI_CD_MASK  BIT(15)
#define SPI_SEL_CS_SHIFT 8

#define SPI_DEF_SRC_CLK (26 * 1000 *1000)
#define SPI_DEF_CLK (13 * 1000 * 1000)

typedef enum
{
	TX_POS_EDGE = 0,
	TX_NEG_EDGE
}TX_EDGE;

typedef enum
{
	RX_POS_EDGE = 0,
	RX_NEG_EDGE
}RX_EDGE;

typedef enum
{
	TX_RX_MSB = 0,
	TX_RX_LSB
}MSB_LSB_SEL;

typedef enum
{
	IDLE_MODE = 0,
	RX_MODE,
	TX_MODE,
	RX_TX_MODE
}TRANCIEVE_MODE;

typedef enum
{
	NO_SWITCH    = 0,
	BYTE_SWITCH  = 1,
	HWORD_SWITCH = 2
}SWT_MODE;

typedef enum
{
	MASTER_MODE = 0,
	SLAVE_MODE = 1
}SPI_OPERATE_MODE_E;

typedef enum
{
	DMA_DISABLE = 0,
	DMA_ENABLE
}DMA_EN;

typedef enum
{
	CS_LOW = 0,
	CS_HIGH
}CS_SIGNAL;

#define SW_RX_REQ_MASK BIT(0)
#define SW_TX_REQ_MASK BIT(1)
#define RX_MAX_LEN_MASK     0xFFFFFF
#define RX_DUMY_LEN_MASK    0x3F
#define RX_DATA_LEN_H_MASK  0x0F
#define RX_DATA_LEN_L_MASK  0xFFFF

typedef struct _init_param
{
	TX_EDGE tx_edge;
	RX_EDGE rx_edge;
	MSB_LSB_SEL msb_lsb_sel;
	TRANCIEVE_MODE tx_rx_mode;
	SWT_MODE switch_mode;
	SPI_OPERATE_MODE_E op_mode;
	uint32_t DMAsrcSize;
	uint32_t DMAdesSize;
	uint32_t clk_div;
	uint8_t data_width;
	uint8_t tx_empty_watermark;
	uint8_t tx_full_watermark;
	uint8_t rx_empty_watermark;
	uint8_t rx_full_watermark;
}SPI_INIT_PARM,*SPI_INIT_PARM_P;

typedef struct
{
	uint32_t data;				// Transmit word or Receive word
	uint32_t clkd;				// clock dividor register
	uint32_t ctl0;				// control register
	uint32_t ctl1;				// Receive Data full threshold/Receive Data full threshold
	uint32_t ctl2;				// 2-wire mode reigster
	uint32_t ctl3;				// transmit data interval
	uint32_t ctl4;				// transmit data interval
	uint32_t ctl5;				// transmit data interval
	uint32_t ien;				// interrutp enable register
	uint32_t iclr;				// interrupt clear register
	uint32_t iraw;				// interrupt clear register
	uint32_t ists;				// interrupt clear register
	uint32_t sts1;				// fifo cnt register, bit[5:0] for RX and [13:8] for TX
	uint32_t sts2;				// masked interrupt status register
	uint32_t dsp_wait;   		// Used for DSP control
	uint32_t sts3;				// tx_empty_threshold and tx_full_threshold
	uint32_t ctl6;
	uint32_t sts4;
	uint32_t fifo_rst;
	uint32_t ctl7;               // SPI_RX_HLD_EN : SPI_TX_HLD_EN : SPI_MODE
	uint32_t sts5;               // CSN_IN_ERR_SYNC2
	uint32_t ctl8;               // SPI_CD_BIT : SPI_TX_DUMY_LEN : SPI_TX_DATA_LEN_H
	uint32_t ctl9;               // SPI_TX_DATA_LEN_L
	uint32_t ctl10;              // SPI_RX_DATA_LEN_H : SPI_RX_DUMY_LEN
	uint32_t ctl11;              // SPI_RX_DATA_LEN_L
	uint32_t ctl12;              // SW_TX_REQ : SW_RX_REQ
} SPI_CTL_REG_T;

void SPI_SetCsLow( uint32_t spi_sel_csx , bool is_low);
void SPI_SetCd( uint32_t cd);
void SPI_SetDatawidth(uint32_t datawidth);
#ifdef CONFIG_OF
void SPI_Init(struct device *device, u32 spi_id, SPI_INIT_PARM *spi_parm);
#else
void SPI_Init(u32 spi_id, SPI_INIT_PARM *spi_parm);
#endif
void SPI_WriteData(uint32_t data, uint32_t data_len, uint32_t dummy_bitlen);
uint32_t SPI_ReadData( uint32_t data_len, uint32_t dummy_bitlen );

#endif /*_SPI_TEST_H*/