blob: 9c6ca0f0b07522785fabaa7e6ea0213e248b1dda [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/******************************************************************************
2 *
3 * (C)Copyright 2014 Marvell Hefei Branch. All Rights Reserved.
4 *
5 * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MARVELL.
6 * The copyright notice above does not evidence any actual or intended
7 * publication of such source code.
8 * This Module contains Proprietary Information of Marvell and should be
9 * treated as Confidential.
10 * The information in this file is provided for the exclusive use of the
11 * licensees of Marvell.
12 * Such users have the right to use, modify, and incorporate this code into
13 * products for purposes authorized by the license agreement provided they
14 * include this notice and the associated copyright notice with any such
15 * product.
16 * The information in this file is provided "AS IS" without warranty.
17 *
18 ******************************************************************************/
19
20#include "spi.h"
21#include "PlatformConfig.h"
22#include "xllp_dmac.h"
23
24UINT gpio_cs_bit = 12; /* SPI_CS: NezhaS using GPIO76, 76%64=12 */
25UINT gpio_base = GPIO2_BASE;
26
27#define GPIO_CS_BIT gpio_cs_bit
28#define pGPIO_LR (volatile int *)(gpio_base + GPIO_PLR) //Pin level. set 0
29#define pGPIO_DR (volatile int *)(gpio_base + GPIO_PDR) //Direction. set 0
30#define pGPIO_SR (volatile int *)(gpio_base + GPIO_PSR) //Set. set 0
31#define pGPIO_CR (volatile int *)(gpio_base + GPIO_PCR) //Clear. set 0
32#define pGPIO_SDR (volatile int *)(gpio_base + GPIO_SDR) //Bit set. set 0
33
34#define GPIO_CS_SET (1<< GPIO_CS_BIT)
35
36void SPI_Clk_Init(void)
37{
38 UINT_T offset;
39#if SSP_BASE_FOR_SPI == SSP1_BASE
40 offset = 0x1c;
41#elif SSP_BASE_FOR_SPI == SSP2_BASE
42 offset = 0x20;
43#elif SSP_BASE_FOR_SPI == SSP3_BASE
44 offset = 0x4c;
45#endif
46
47 reg_write(APBC_BASE + offset, BIT0 | BIT1 | BIT2);
48 reg_write(APBC_BASE + offset, BIT0 | BIT1 | (2 << 4)); // 26MHZ
49}
50
51void SPI_ConfigCS(void)
52{
53#ifdef SSP_CS_USE_GPIO
54 gpio_cs_bit = (PlatformIsNezhac() || PlatformIsFalconA0())?12:13;
55 gpio_base = (PlatformIsNezhac() || PlatformIsFalconA0())?GPIO2_BASE:GPIO0_BASE;
56 obm_printf("SPI %d 0x%x\n\r", gpio_cs_bit, gpio_base);
57 *pGPIO_DR |= (0x1<<gpio_cs_bit);
58#endif
59}
60
61void Assert_CS(void)
62{
63#ifdef SSP_CS_USE_GPIO
64 *pGPIO_CR |= GPIO_CS_SET;
65 while (*pGPIO_LR & GPIO_CS_SET);
66#else
67 UINT_T top_ctrl = BU_REG_READ(SSP_TCR);
68 if(top_ctrl & SSP_TCR_SSE)
69 reg_bit_clr(SSP_TCR, SSP_TCR_SSE);
70 reg_bit_set(SSP_TCR, SSP_TCR_HFL);
71 if(top_ctrl & SSP_TCR_SSE)
72 reg_bit_set(SSP_TCR, SSP_TCR_SSE);
73#endif
74}
75
76void Deassert_CS(void)
77{
78#ifdef SSP_CS_USE_GPIO
79 *pGPIO_SR |= GPIO_CS_SET;
80 while (!(*pGPIO_LR & GPIO_CS_SET));
81#else
82 UINT_T top_ctrl = BU_REG_READ(SSP_TCR);
83 if(top_ctrl & SSP_TCR_SSE)
84 reg_bit_clr(SSP_TCR, SSP_TCR_SSE);
85 reg_bit_clr(SSP_TCR, SSP_TCR_HFL);
86 if(top_ctrl & SSP_TCR_SSE)
87 reg_bit_set(SSP_TCR, SSP_TCR_SSE);
88#endif
89}
90
91void SPI_DisableSSP(void)
92{
93 //make sure SSP is disabled
94 reg_bit_clr(SSP_TCR, SSP_TCR_SSE);
95
96 //reset SSP CR's
97 reg_write(SSP_TCR, SSP_TCR_INITIAL);
98 reg_write(SSP_FCR, SSP_FCR_INITIAL);
99 reg_write(SSP_IER, SSP_IER_INITIAL);
100}
101
102void SPI_WaitSSPComplete(void)
103{
104 volatile int timeout = 0xFFFF;
105
106 while ((*SSP_SR & (SSP_SSSR_TFL | SSP_SSSR_TF_NF | SSP_SSSR_BSY)) != SSP_SSSR_TF_NF)
107 {
108 ROW_DELAY(DEFAULT_TIMEOUT);
109
110 if((timeout--) <= 0)
111 {
112 obm_printf("SPI_WaitSSPComplete timeout\n\r");
113 break;
114 }
115 }
116}
117
118void ROW_DELAY(UINT_T x)
119{
120 while (x > 0)
121 {
122 x--;
123 }
124}
125
126
127/***********************************************************
128* SPI_Write_Read
129* PIO mode to write and then read out the data
130* Returns:
131* None
132*************************************************************/
133void SPI_Write_Read(unsigned char *cmd, unsigned char *data, unsigned char len)
134{
135 unsigned char i;
136
137 for (i = 0; i < len; i++)
138 {
139 BU_REG_WRITE8(SSP_DR, cmd[i]);
140 SPI_WaitSSPComplete();
141
142 data[i] = BU_REG_READ8(SSP_DR);
143 }
144}
145
146void SPI_FireUp(void)
147{
148 reg_bit_set(SSP_TCR, SSP_TCR_SSE);
149}
150
151void SPI_ConfigDSS(int dss)
152{
153 UINT_T top_ctrl;
154 top_ctrl = BU_REG_READ(SSP_TCR);
155 if(top_ctrl & SSP_TCR_SSE)
156 reg_bit_clr(SSP_TCR, SSP_TCR_SSE);
157 reg_bit_clr(SSP_TCR, SSP_TCR_DSS_MASK);
158 reg_bit_set(SSP_TCR, SHIFT5(dss-1));
159 if(top_ctrl & SSP_TCR_SSE)
160 reg_bit_set(SSP_TCR, SSP_TCR_SSE);
161}
162
163UINT_T SPI_ReadData(void)
164{
165 return BU_REG_READ(SSP_DR);
166}
167
168void SPI_WriteData(UINT_T data)
169{
170 BU_REG_WRITE(SSP_DR, data);
171}
172
173
174void SPI_ConfigInt(int setting)
175{
176 reg_bit_set(SSP_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
177}
178
179void SPI_ConfigDMA(int rft, int tft, int rre, int twe, int rafc)
180{
181 UINT_T fcr;
182
183 reg_write(SSP_TOR, SSP_TOR_TIMEOUT);
184 reg_bit_set(SSP_TCR, SSP_TCR_TRIAL);
185
186 fcr = SSP_FCR_TWE(twe) | SSP_FCR_RRE(rre) | SSP_FCR_RFT(rft) | SSP_FCR_TFT(tft);
187 fcr |= SSP_FCR_TSRE;
188 fcr |= SSP_FCR_RSRE;
189 if(rafc)
190 fcr |= SSP_FCR_RAFC;
191
192 reg_write(SSP_FCR, fcr);
193
194 return;
195}