xref: /rk3399_ARM-atf/drivers/st/spi/stm32_qspi.c (revision 0581a8877845d472f9bf6a2171e79050b8363fa7)
1*0581a887SLionel Debieve /*
2*0581a887SLionel Debieve  * Copyright (c) 2019, STMicroelectronics - All Rights Reserved
3*0581a887SLionel Debieve  *
4*0581a887SLionel Debieve  * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
5*0581a887SLionel Debieve  */
6*0581a887SLionel Debieve 
7*0581a887SLionel Debieve #include <libfdt.h>
8*0581a887SLionel Debieve 
9*0581a887SLionel Debieve #include <platform_def.h>
10*0581a887SLionel Debieve 
11*0581a887SLionel Debieve #include <common/debug.h>
12*0581a887SLionel Debieve #include <drivers/delay_timer.h>
13*0581a887SLionel Debieve #include <drivers/spi_mem.h>
14*0581a887SLionel Debieve #include <drivers/st/stm32_gpio.h>
15*0581a887SLionel Debieve #include <drivers/st/stm32mp_reset.h>
16*0581a887SLionel Debieve #include <lib/mmio.h>
17*0581a887SLionel Debieve #include <lib/utils_def.h>
18*0581a887SLionel Debieve 
19*0581a887SLionel Debieve /* QUADSPI registers */
20*0581a887SLionel Debieve #define QSPI_CR			0x00U
21*0581a887SLionel Debieve #define QSPI_DCR		0x04U
22*0581a887SLionel Debieve #define QSPI_SR			0x08U
23*0581a887SLionel Debieve #define QSPI_FCR		0x0CU
24*0581a887SLionel Debieve #define QSPI_DLR		0x10U
25*0581a887SLionel Debieve #define QSPI_CCR		0x14U
26*0581a887SLionel Debieve #define QSPI_AR			0x18U
27*0581a887SLionel Debieve #define QSPI_ABR		0x1CU
28*0581a887SLionel Debieve #define QSPI_DR			0x20U
29*0581a887SLionel Debieve #define QSPI_PSMKR		0x24U
30*0581a887SLionel Debieve #define QSPI_PSMAR		0x28U
31*0581a887SLionel Debieve #define QSPI_PIR		0x2CU
32*0581a887SLionel Debieve #define QSPI_LPTR		0x30U
33*0581a887SLionel Debieve 
34*0581a887SLionel Debieve /* QUADSPI control register */
35*0581a887SLionel Debieve #define QSPI_CR_EN		BIT(0)
36*0581a887SLionel Debieve #define QSPI_CR_ABORT		BIT(1)
37*0581a887SLionel Debieve #define QSPI_CR_DMAEN		BIT(2)
38*0581a887SLionel Debieve #define QSPI_CR_TCEN		BIT(3)
39*0581a887SLionel Debieve #define QSPI_CR_SSHIFT		BIT(4)
40*0581a887SLionel Debieve #define QSPI_CR_DFM		BIT(6)
41*0581a887SLionel Debieve #define QSPI_CR_FSEL		BIT(7)
42*0581a887SLionel Debieve #define QSPI_CR_FTHRES_SHIFT	8U
43*0581a887SLionel Debieve #define QSPI_CR_TEIE		BIT(16)
44*0581a887SLionel Debieve #define QSPI_CR_TCIE		BIT(17)
45*0581a887SLionel Debieve #define QSPI_CR_FTIE		BIT(18)
46*0581a887SLionel Debieve #define QSPI_CR_SMIE		BIT(19)
47*0581a887SLionel Debieve #define QSPI_CR_TOIE		BIT(20)
48*0581a887SLionel Debieve #define QSPI_CR_APMS		BIT(22)
49*0581a887SLionel Debieve #define QSPI_CR_PMM		BIT(23)
50*0581a887SLionel Debieve #define QSPI_CR_PRESCALER_MASK	GENMASK_32(31, 24)
51*0581a887SLionel Debieve #define QSPI_CR_PRESCALER_SHIFT	24U
52*0581a887SLionel Debieve 
53*0581a887SLionel Debieve /* QUADSPI device configuration register */
54*0581a887SLionel Debieve #define QSPI_DCR_CKMODE		BIT(0)
55*0581a887SLionel Debieve #define QSPI_DCR_CSHT_MASK	GENMASK_32(10, 8)
56*0581a887SLionel Debieve #define QSPI_DCR_CSHT_SHIFT	8U
57*0581a887SLionel Debieve #define QSPI_DCR_FSIZE_MASK	GENMASK_32(20, 16)
58*0581a887SLionel Debieve #define QSPI_DCR_FSIZE_SHIFT	16U
59*0581a887SLionel Debieve 
60*0581a887SLionel Debieve /* QUADSPI status register */
61*0581a887SLionel Debieve #define QSPI_SR_TEF		BIT(0)
62*0581a887SLionel Debieve #define QSPI_SR_TCF		BIT(1)
63*0581a887SLionel Debieve #define QSPI_SR_FTF		BIT(2)
64*0581a887SLionel Debieve #define QSPI_SR_SMF		BIT(3)
65*0581a887SLionel Debieve #define QSPI_SR_TOF		BIT(4)
66*0581a887SLionel Debieve #define QSPI_SR_BUSY		BIT(5)
67*0581a887SLionel Debieve 
68*0581a887SLionel Debieve /* QUADSPI flag clear register */
69*0581a887SLionel Debieve #define QSPI_FCR_CTEF		BIT(0)
70*0581a887SLionel Debieve #define QSPI_FCR_CTCF		BIT(1)
71*0581a887SLionel Debieve #define QSPI_FCR_CSMF		BIT(3)
72*0581a887SLionel Debieve #define QSPI_FCR_CTOF		BIT(4)
73*0581a887SLionel Debieve 
74*0581a887SLionel Debieve /* QUADSPI communication configuration register */
75*0581a887SLionel Debieve #define QSPI_CCR_DDRM		BIT(31)
76*0581a887SLionel Debieve #define QSPI_CCR_DHHC		BIT(30)
77*0581a887SLionel Debieve #define QSPI_CCR_SIOO		BIT(28)
78*0581a887SLionel Debieve #define QSPI_CCR_FMODE_SHIFT	26U
79*0581a887SLionel Debieve #define QSPI_CCR_DMODE_SHIFT	24U
80*0581a887SLionel Debieve #define QSPI_CCR_DCYC_SHIFT	18U
81*0581a887SLionel Debieve #define QSPI_CCR_ABSIZE_SHIFT	16U
82*0581a887SLionel Debieve #define QSPI_CCR_ABMODE_SHIFT	14U
83*0581a887SLionel Debieve #define QSPI_CCR_ADSIZE_SHIFT	12U
84*0581a887SLionel Debieve #define QSPI_CCR_ADMODE_SHIFT	10U
85*0581a887SLionel Debieve #define QSPI_CCR_IMODE_SHIFT	8U
86*0581a887SLionel Debieve #define QSPI_CCR_IND_WRITE	0U
87*0581a887SLionel Debieve #define QSPI_CCR_IND_READ	1U
88*0581a887SLionel Debieve #define QSPI_CCR_MEM_MAP	3U
89*0581a887SLionel Debieve 
90*0581a887SLionel Debieve #define QSPI_MAX_CHIP		2U
91*0581a887SLionel Debieve 
92*0581a887SLionel Debieve #define QSPI_FIFO_TIMEOUT_US	30U
93*0581a887SLionel Debieve #define QSPI_CMD_TIMEOUT_US	1000U
94*0581a887SLionel Debieve #define QSPI_BUSY_TIMEOUT_US	100U
95*0581a887SLionel Debieve #define QSPI_ABT_TIMEOUT_US	100U
96*0581a887SLionel Debieve 
97*0581a887SLionel Debieve #define DT_QSPI_COMPAT		"st,stm32f469-qspi"
98*0581a887SLionel Debieve 
99*0581a887SLionel Debieve #define FREQ_100MHZ		100000000U
100*0581a887SLionel Debieve 
101*0581a887SLionel Debieve struct stm32_qspi_ctrl {
102*0581a887SLionel Debieve 	uintptr_t reg_base;
103*0581a887SLionel Debieve 	uintptr_t mm_base;
104*0581a887SLionel Debieve 	size_t mm_size;
105*0581a887SLionel Debieve 	unsigned long clock_id;
106*0581a887SLionel Debieve 	unsigned int reset_id;
107*0581a887SLionel Debieve };
108*0581a887SLionel Debieve 
109*0581a887SLionel Debieve static struct stm32_qspi_ctrl stm32_qspi;
110*0581a887SLionel Debieve 
111*0581a887SLionel Debieve static uintptr_t qspi_base(void)
112*0581a887SLionel Debieve {
113*0581a887SLionel Debieve 	return stm32_qspi.reg_base;
114*0581a887SLionel Debieve }
115*0581a887SLionel Debieve 
116*0581a887SLionel Debieve static int stm32_qspi_wait_for_not_busy(void)
117*0581a887SLionel Debieve {
118*0581a887SLionel Debieve 	uint64_t timeout = timeout_init_us(QSPI_BUSY_TIMEOUT_US);
119*0581a887SLionel Debieve 
120*0581a887SLionel Debieve 	while ((mmio_read_32(qspi_base() + QSPI_SR) & QSPI_SR_BUSY) != 0U) {
121*0581a887SLionel Debieve 		if (timeout_elapsed(timeout)) {
122*0581a887SLionel Debieve 			ERROR("%s: busy timeout\n", __func__);
123*0581a887SLionel Debieve 			return -ETIMEDOUT;
124*0581a887SLionel Debieve 		}
125*0581a887SLionel Debieve 	}
126*0581a887SLionel Debieve 
127*0581a887SLionel Debieve 	return 0;
128*0581a887SLionel Debieve }
129*0581a887SLionel Debieve 
130*0581a887SLionel Debieve static int stm32_qspi_wait_cmd(const struct spi_mem_op *op)
131*0581a887SLionel Debieve {
132*0581a887SLionel Debieve 	int ret = 0;
133*0581a887SLionel Debieve 	uint64_t timeout;
134*0581a887SLionel Debieve 
135*0581a887SLionel Debieve 	if (op->data.nbytes == 0U) {
136*0581a887SLionel Debieve 		return stm32_qspi_wait_for_not_busy();
137*0581a887SLionel Debieve 	}
138*0581a887SLionel Debieve 
139*0581a887SLionel Debieve 	timeout = timeout_init_us(QSPI_CMD_TIMEOUT_US);
140*0581a887SLionel Debieve 	while ((mmio_read_32(qspi_base() + QSPI_SR) & QSPI_SR_TCF) == 0U) {
141*0581a887SLionel Debieve 		if (timeout_elapsed(timeout)) {
142*0581a887SLionel Debieve 			ret = -ETIMEDOUT;
143*0581a887SLionel Debieve 			break;
144*0581a887SLionel Debieve 		}
145*0581a887SLionel Debieve 	}
146*0581a887SLionel Debieve 
147*0581a887SLionel Debieve 	if (ret == 0) {
148*0581a887SLionel Debieve 		if ((mmio_read_32(qspi_base() + QSPI_SR) & QSPI_SR_TEF) != 0U) {
149*0581a887SLionel Debieve 			ERROR("%s: transfer error\n", __func__);
150*0581a887SLionel Debieve 			ret = -EIO;
151*0581a887SLionel Debieve 		}
152*0581a887SLionel Debieve 	} else {
153*0581a887SLionel Debieve 		ERROR("%s: cmd timeout\n", __func__);
154*0581a887SLionel Debieve 	}
155*0581a887SLionel Debieve 
156*0581a887SLionel Debieve 	/* Clear flags */
157*0581a887SLionel Debieve 	mmio_write_32(qspi_base() + QSPI_FCR, QSPI_FCR_CTCF | QSPI_FCR_CTEF);
158*0581a887SLionel Debieve 
159*0581a887SLionel Debieve 	return ret;
160*0581a887SLionel Debieve }
161*0581a887SLionel Debieve 
162*0581a887SLionel Debieve static void stm32_qspi_read_fifo(uint8_t *val, uintptr_t addr)
163*0581a887SLionel Debieve {
164*0581a887SLionel Debieve 	*val = mmio_read_8(addr);
165*0581a887SLionel Debieve }
166*0581a887SLionel Debieve 
167*0581a887SLionel Debieve static void stm32_qspi_write_fifo(uint8_t *val, uintptr_t addr)
168*0581a887SLionel Debieve {
169*0581a887SLionel Debieve 	mmio_write_8(addr, *val);
170*0581a887SLionel Debieve }
171*0581a887SLionel Debieve 
172*0581a887SLionel Debieve static int stm32_qspi_poll(const struct spi_mem_op *op)
173*0581a887SLionel Debieve {
174*0581a887SLionel Debieve 	void (*fifo)(uint8_t *val, uintptr_t addr);
175*0581a887SLionel Debieve 	uint32_t len = op->data.nbytes;
176*0581a887SLionel Debieve 	uint8_t *buf;
177*0581a887SLionel Debieve 	uint64_t timeout;
178*0581a887SLionel Debieve 
179*0581a887SLionel Debieve 	if (op->data.dir == SPI_MEM_DATA_IN) {
180*0581a887SLionel Debieve 		fifo = stm32_qspi_read_fifo;
181*0581a887SLionel Debieve 	} else {
182*0581a887SLionel Debieve 		fifo = stm32_qspi_write_fifo;
183*0581a887SLionel Debieve 	}
184*0581a887SLionel Debieve 
185*0581a887SLionel Debieve 	buf = (uint8_t *)op->data.buf;
186*0581a887SLionel Debieve 
187*0581a887SLionel Debieve 	for (len = op->data.nbytes; len != 0U; len--) {
188*0581a887SLionel Debieve 		timeout = timeout_init_us(QSPI_FIFO_TIMEOUT_US);
189*0581a887SLionel Debieve 		while ((mmio_read_32(qspi_base() + QSPI_SR) &
190*0581a887SLionel Debieve 			QSPI_SR_FTF) == 0U) {
191*0581a887SLionel Debieve 			if (timeout_elapsed(timeout)) {
192*0581a887SLionel Debieve 				ERROR("%s: fifo timeout\n", __func__);
193*0581a887SLionel Debieve 				return -ETIMEDOUT;
194*0581a887SLionel Debieve 			}
195*0581a887SLionel Debieve 		}
196*0581a887SLionel Debieve 
197*0581a887SLionel Debieve 		fifo(buf++, qspi_base() + QSPI_DR);
198*0581a887SLionel Debieve 	}
199*0581a887SLionel Debieve 
200*0581a887SLionel Debieve 	return 0;
201*0581a887SLionel Debieve }
202*0581a887SLionel Debieve 
203*0581a887SLionel Debieve static int stm32_qspi_mm(const struct spi_mem_op *op)
204*0581a887SLionel Debieve {
205*0581a887SLionel Debieve 	memcpy(op->data.buf,
206*0581a887SLionel Debieve 	       (void *)(stm32_qspi.mm_base + (size_t)op->addr.val),
207*0581a887SLionel Debieve 	       op->data.nbytes);
208*0581a887SLionel Debieve 
209*0581a887SLionel Debieve 	return 0;
210*0581a887SLionel Debieve }
211*0581a887SLionel Debieve 
212*0581a887SLionel Debieve static int stm32_qspi_tx(const struct spi_mem_op *op, uint8_t mode)
213*0581a887SLionel Debieve {
214*0581a887SLionel Debieve 	if (op->data.nbytes == 0U) {
215*0581a887SLionel Debieve 		return 0;
216*0581a887SLionel Debieve 	}
217*0581a887SLionel Debieve 
218*0581a887SLionel Debieve 	if (mode == QSPI_CCR_MEM_MAP) {
219*0581a887SLionel Debieve 		return stm32_qspi_mm(op);
220*0581a887SLionel Debieve 	}
221*0581a887SLionel Debieve 
222*0581a887SLionel Debieve 	return stm32_qspi_poll(op);
223*0581a887SLionel Debieve }
224*0581a887SLionel Debieve 
225*0581a887SLionel Debieve static unsigned int stm32_qspi_get_mode(uint8_t buswidth)
226*0581a887SLionel Debieve {
227*0581a887SLionel Debieve 	if (buswidth == 4U) {
228*0581a887SLionel Debieve 		return 3U;
229*0581a887SLionel Debieve 	}
230*0581a887SLionel Debieve 
231*0581a887SLionel Debieve 	return buswidth;
232*0581a887SLionel Debieve }
233*0581a887SLionel Debieve 
234*0581a887SLionel Debieve static int stm32_qspi_exec_op(const struct spi_mem_op *op)
235*0581a887SLionel Debieve {
236*0581a887SLionel Debieve 	uint64_t timeout;
237*0581a887SLionel Debieve 	uint32_t ccr;
238*0581a887SLionel Debieve 	size_t addr_max;
239*0581a887SLionel Debieve 	uint8_t mode = QSPI_CCR_IND_WRITE;
240*0581a887SLionel Debieve 	int ret;
241*0581a887SLionel Debieve 
242*0581a887SLionel Debieve 	VERBOSE("%s: cmd:%x mode:%d.%d.%d.%d addr:%llx len:%x\n",
243*0581a887SLionel Debieve 		__func__, op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth,
244*0581a887SLionel Debieve 		op->dummy.buswidth, op->data.buswidth,
245*0581a887SLionel Debieve 		op->addr.val, op->data.nbytes);
246*0581a887SLionel Debieve 
247*0581a887SLionel Debieve 	ret = stm32_qspi_wait_for_not_busy();
248*0581a887SLionel Debieve 	if (ret != 0) {
249*0581a887SLionel Debieve 		return ret;
250*0581a887SLionel Debieve 	}
251*0581a887SLionel Debieve 
252*0581a887SLionel Debieve 	addr_max = op->addr.val + op->data.nbytes + 1U;
253*0581a887SLionel Debieve 
254*0581a887SLionel Debieve 	if ((op->data.dir == SPI_MEM_DATA_IN) && (op->data.nbytes != 0U)) {
255*0581a887SLionel Debieve 		if ((addr_max < stm32_qspi.mm_size) &&
256*0581a887SLionel Debieve 		    (op->addr.buswidth != 0U)) {
257*0581a887SLionel Debieve 			mode = QSPI_CCR_MEM_MAP;
258*0581a887SLionel Debieve 		} else {
259*0581a887SLionel Debieve 			mode = QSPI_CCR_IND_READ;
260*0581a887SLionel Debieve 		}
261*0581a887SLionel Debieve 	}
262*0581a887SLionel Debieve 
263*0581a887SLionel Debieve 	if (op->data.nbytes != 0U) {
264*0581a887SLionel Debieve 		mmio_write_32(qspi_base() + QSPI_DLR, op->data.nbytes - 1U);
265*0581a887SLionel Debieve 	}
266*0581a887SLionel Debieve 
267*0581a887SLionel Debieve 	ccr = mode << QSPI_CCR_FMODE_SHIFT;
268*0581a887SLionel Debieve 	ccr |= op->cmd.opcode;
269*0581a887SLionel Debieve 	ccr |= stm32_qspi_get_mode(op->cmd.buswidth) << QSPI_CCR_IMODE_SHIFT;
270*0581a887SLionel Debieve 
271*0581a887SLionel Debieve 	if (op->addr.nbytes != 0U) {
272*0581a887SLionel Debieve 		ccr |= (op->addr.nbytes - 1U) << QSPI_CCR_ADSIZE_SHIFT;
273*0581a887SLionel Debieve 		ccr |= stm32_qspi_get_mode(op->addr.buswidth) <<
274*0581a887SLionel Debieve 			QSPI_CCR_ADMODE_SHIFT;
275*0581a887SLionel Debieve 	}
276*0581a887SLionel Debieve 
277*0581a887SLionel Debieve 	if ((op->dummy.buswidth != 0U) && (op->dummy.nbytes != 0U)) {
278*0581a887SLionel Debieve 		ccr |= (op->dummy.nbytes * 8U / op->dummy.buswidth) <<
279*0581a887SLionel Debieve 			QSPI_CCR_DCYC_SHIFT;
280*0581a887SLionel Debieve 	}
281*0581a887SLionel Debieve 
282*0581a887SLionel Debieve 	if (op->data.nbytes != 0U) {
283*0581a887SLionel Debieve 		ccr |= stm32_qspi_get_mode(op->data.buswidth) <<
284*0581a887SLionel Debieve 			QSPI_CCR_DMODE_SHIFT;
285*0581a887SLionel Debieve 	}
286*0581a887SLionel Debieve 
287*0581a887SLionel Debieve 	mmio_write_32(qspi_base() + QSPI_CCR, ccr);
288*0581a887SLionel Debieve 
289*0581a887SLionel Debieve 	if ((op->addr.nbytes != 0U) && (mode != QSPI_CCR_MEM_MAP)) {
290*0581a887SLionel Debieve 		mmio_write_32(qspi_base() + QSPI_AR, op->addr.val);
291*0581a887SLionel Debieve 	}
292*0581a887SLionel Debieve 
293*0581a887SLionel Debieve 	ret = stm32_qspi_tx(op, mode);
294*0581a887SLionel Debieve 
295*0581a887SLionel Debieve 	/*
296*0581a887SLionel Debieve 	 * Abort in:
297*0581a887SLionel Debieve 	 * - Error case.
298*0581a887SLionel Debieve 	 * - Memory mapped read: prefetching must be stopped if we read the last
299*0581a887SLionel Debieve 	 *   byte of device (device size - fifo size). If device size is not
300*0581a887SLionel Debieve 	 *   known then prefetching is always stopped.
301*0581a887SLionel Debieve 	 */
302*0581a887SLionel Debieve 	if ((ret != 0) || (mode == QSPI_CCR_MEM_MAP)) {
303*0581a887SLionel Debieve 		goto abort;
304*0581a887SLionel Debieve 	}
305*0581a887SLionel Debieve 
306*0581a887SLionel Debieve 	/* Wait end of TX in indirect mode */
307*0581a887SLionel Debieve 	ret = stm32_qspi_wait_cmd(op);
308*0581a887SLionel Debieve 	if (ret != 0) {
309*0581a887SLionel Debieve 		goto abort;
310*0581a887SLionel Debieve 	}
311*0581a887SLionel Debieve 
312*0581a887SLionel Debieve 	return 0;
313*0581a887SLionel Debieve 
314*0581a887SLionel Debieve abort:
315*0581a887SLionel Debieve 	mmio_setbits_32(qspi_base() + QSPI_CR, QSPI_CR_ABORT);
316*0581a887SLionel Debieve 
317*0581a887SLionel Debieve 	/* Wait clear of abort bit by hardware */
318*0581a887SLionel Debieve 	timeout = timeout_init_us(QSPI_ABT_TIMEOUT_US);
319*0581a887SLionel Debieve 	while ((mmio_read_32(qspi_base() + QSPI_CR) & QSPI_CR_ABORT) != 0U) {
320*0581a887SLionel Debieve 		if (timeout_elapsed(timeout)) {
321*0581a887SLionel Debieve 			ret = -ETIMEDOUT;
322*0581a887SLionel Debieve 			break;
323*0581a887SLionel Debieve 		}
324*0581a887SLionel Debieve 	}
325*0581a887SLionel Debieve 
326*0581a887SLionel Debieve 	mmio_write_32(qspi_base() + QSPI_FCR, QSPI_FCR_CTCF);
327*0581a887SLionel Debieve 
328*0581a887SLionel Debieve 	if (ret != 0) {
329*0581a887SLionel Debieve 		ERROR("%s: exec op error\n", __func__);
330*0581a887SLionel Debieve 	}
331*0581a887SLionel Debieve 
332*0581a887SLionel Debieve 	return ret;
333*0581a887SLionel Debieve }
334*0581a887SLionel Debieve 
335*0581a887SLionel Debieve static int stm32_qspi_claim_bus(unsigned int cs)
336*0581a887SLionel Debieve {
337*0581a887SLionel Debieve 	uint32_t cr;
338*0581a887SLionel Debieve 
339*0581a887SLionel Debieve 	if (cs >= QSPI_MAX_CHIP) {
340*0581a887SLionel Debieve 		return -ENODEV;
341*0581a887SLionel Debieve 	}
342*0581a887SLionel Debieve 
343*0581a887SLionel Debieve 	/* Set chip select and enable the controller */
344*0581a887SLionel Debieve 	cr = QSPI_CR_EN;
345*0581a887SLionel Debieve 	if (cs == 1U) {
346*0581a887SLionel Debieve 		cr |= QSPI_CR_FSEL;
347*0581a887SLionel Debieve 	}
348*0581a887SLionel Debieve 
349*0581a887SLionel Debieve 	mmio_clrsetbits_32(qspi_base() + QSPI_CR, QSPI_CR_FSEL, cr);
350*0581a887SLionel Debieve 
351*0581a887SLionel Debieve 	return 0;
352*0581a887SLionel Debieve }
353*0581a887SLionel Debieve 
354*0581a887SLionel Debieve static void stm32_qspi_release_bus(void)
355*0581a887SLionel Debieve {
356*0581a887SLionel Debieve 	mmio_clrbits_32(qspi_base() + QSPI_CR, QSPI_CR_EN);
357*0581a887SLionel Debieve }
358*0581a887SLionel Debieve 
359*0581a887SLionel Debieve static int stm32_qspi_set_speed(unsigned int hz)
360*0581a887SLionel Debieve {
361*0581a887SLionel Debieve 	unsigned long qspi_clk = stm32mp_clk_get_rate(stm32_qspi.clock_id);
362*0581a887SLionel Debieve 	uint32_t prescaler = UINT8_MAX;
363*0581a887SLionel Debieve 	uint32_t csht;
364*0581a887SLionel Debieve 	int ret;
365*0581a887SLionel Debieve 
366*0581a887SLionel Debieve 	if (qspi_clk == 0U) {
367*0581a887SLionel Debieve 		return -EINVAL;
368*0581a887SLionel Debieve 	}
369*0581a887SLionel Debieve 
370*0581a887SLionel Debieve 	if (hz > 0U) {
371*0581a887SLionel Debieve 		prescaler = div_round_up(qspi_clk, hz) - 1U;
372*0581a887SLionel Debieve 		if (prescaler > UINT8_MAX) {
373*0581a887SLionel Debieve 			prescaler = UINT8_MAX;
374*0581a887SLionel Debieve 		}
375*0581a887SLionel Debieve 	}
376*0581a887SLionel Debieve 
377*0581a887SLionel Debieve 	csht = div_round_up((5U * qspi_clk) / (prescaler + 1U), FREQ_100MHZ);
378*0581a887SLionel Debieve 	csht = ((csht - 1U) << QSPI_DCR_CSHT_SHIFT) & QSPI_DCR_CSHT_MASK;
379*0581a887SLionel Debieve 
380*0581a887SLionel Debieve 	ret = stm32_qspi_wait_for_not_busy();
381*0581a887SLionel Debieve 	if (ret != 0) {
382*0581a887SLionel Debieve 		return ret;
383*0581a887SLionel Debieve 	}
384*0581a887SLionel Debieve 
385*0581a887SLionel Debieve 	mmio_clrsetbits_32(qspi_base() + QSPI_CR, QSPI_CR_PRESCALER_MASK,
386*0581a887SLionel Debieve 			   prescaler << QSPI_CR_PRESCALER_SHIFT);
387*0581a887SLionel Debieve 
388*0581a887SLionel Debieve 	mmio_clrsetbits_32(qspi_base() + QSPI_DCR, QSPI_DCR_CSHT_MASK, csht);
389*0581a887SLionel Debieve 
390*0581a887SLionel Debieve 	VERBOSE("%s: speed=%lu\n", __func__, qspi_clk / (prescaler + 1U));
391*0581a887SLionel Debieve 
392*0581a887SLionel Debieve 	return 0;
393*0581a887SLionel Debieve }
394*0581a887SLionel Debieve 
395*0581a887SLionel Debieve static int stm32_qspi_set_mode(unsigned int mode)
396*0581a887SLionel Debieve {
397*0581a887SLionel Debieve 	int ret;
398*0581a887SLionel Debieve 
399*0581a887SLionel Debieve 	ret = stm32_qspi_wait_for_not_busy();
400*0581a887SLionel Debieve 	if (ret != 0) {
401*0581a887SLionel Debieve 		return ret;
402*0581a887SLionel Debieve 	}
403*0581a887SLionel Debieve 
404*0581a887SLionel Debieve 	if ((mode & SPI_CS_HIGH) != 0U) {
405*0581a887SLionel Debieve 		return -ENODEV;
406*0581a887SLionel Debieve 	}
407*0581a887SLionel Debieve 
408*0581a887SLionel Debieve 	if (((mode & SPI_CPHA) != 0U) && ((mode & SPI_CPOL) != 0U)) {
409*0581a887SLionel Debieve 		mmio_setbits_32(qspi_base() + QSPI_DCR, QSPI_DCR_CKMODE);
410*0581a887SLionel Debieve 	} else if (((mode & SPI_CPHA) == 0U) && ((mode & SPI_CPOL) == 0U)) {
411*0581a887SLionel Debieve 		mmio_clrbits_32(qspi_base() + QSPI_DCR, QSPI_DCR_CKMODE);
412*0581a887SLionel Debieve 	} else {
413*0581a887SLionel Debieve 		return -ENODEV;
414*0581a887SLionel Debieve 	}
415*0581a887SLionel Debieve 
416*0581a887SLionel Debieve 	VERBOSE("%s: mode=0x%x\n", __func__, mode);
417*0581a887SLionel Debieve 
418*0581a887SLionel Debieve 	if ((mode & SPI_RX_QUAD) != 0U) {
419*0581a887SLionel Debieve 		VERBOSE("rx: quad\n");
420*0581a887SLionel Debieve 	} else if ((mode & SPI_RX_DUAL) != 0U) {
421*0581a887SLionel Debieve 		VERBOSE("rx: dual\n");
422*0581a887SLionel Debieve 	} else {
423*0581a887SLionel Debieve 		VERBOSE("rx: single\n");
424*0581a887SLionel Debieve 	}
425*0581a887SLionel Debieve 
426*0581a887SLionel Debieve 	if ((mode & SPI_TX_QUAD) != 0U) {
427*0581a887SLionel Debieve 		VERBOSE("tx: quad\n");
428*0581a887SLionel Debieve 	} else if ((mode & SPI_TX_DUAL) != 0U) {
429*0581a887SLionel Debieve 		VERBOSE("tx: dual\n");
430*0581a887SLionel Debieve 	} else {
431*0581a887SLionel Debieve 		VERBOSE("tx: single\n");
432*0581a887SLionel Debieve 	}
433*0581a887SLionel Debieve 
434*0581a887SLionel Debieve 	return 0;
435*0581a887SLionel Debieve }
436*0581a887SLionel Debieve 
437*0581a887SLionel Debieve static const struct spi_bus_ops stm32_qspi_bus_ops = {
438*0581a887SLionel Debieve 	.claim_bus = stm32_qspi_claim_bus,
439*0581a887SLionel Debieve 	.release_bus = stm32_qspi_release_bus,
440*0581a887SLionel Debieve 	.set_speed = stm32_qspi_set_speed,
441*0581a887SLionel Debieve 	.set_mode = stm32_qspi_set_mode,
442*0581a887SLionel Debieve 	.exec_op = stm32_qspi_exec_op,
443*0581a887SLionel Debieve };
444*0581a887SLionel Debieve 
445*0581a887SLionel Debieve int stm32_qspi_init(void)
446*0581a887SLionel Debieve {
447*0581a887SLionel Debieve 	size_t size;
448*0581a887SLionel Debieve 	int qspi_node;
449*0581a887SLionel Debieve 	struct dt_node_info info;
450*0581a887SLionel Debieve 	void *fdt = NULL;
451*0581a887SLionel Debieve 	int ret;
452*0581a887SLionel Debieve 
453*0581a887SLionel Debieve 	if (fdt_get_address(&fdt) == 0) {
454*0581a887SLionel Debieve 		return -FDT_ERR_NOTFOUND;
455*0581a887SLionel Debieve 	}
456*0581a887SLionel Debieve 
457*0581a887SLionel Debieve 	qspi_node = dt_get_node(&info, -1, DT_QSPI_COMPAT);
458*0581a887SLionel Debieve 	if (qspi_node < 0) {
459*0581a887SLionel Debieve 		ERROR("No QSPI ctrl found\n");
460*0581a887SLionel Debieve 		return -FDT_ERR_NOTFOUND;
461*0581a887SLionel Debieve 	}
462*0581a887SLionel Debieve 
463*0581a887SLionel Debieve 	if (info.status == DT_DISABLED) {
464*0581a887SLionel Debieve 		return -FDT_ERR_NOTFOUND;
465*0581a887SLionel Debieve 	}
466*0581a887SLionel Debieve 
467*0581a887SLionel Debieve 	ret = fdt_get_reg_props_by_name(qspi_node, "qspi",
468*0581a887SLionel Debieve 					&stm32_qspi.reg_base, &size);
469*0581a887SLionel Debieve 	if (ret != 0) {
470*0581a887SLionel Debieve 		return ret;
471*0581a887SLionel Debieve 	}
472*0581a887SLionel Debieve 
473*0581a887SLionel Debieve 	ret = fdt_get_reg_props_by_name(qspi_node, "qspi_mm",
474*0581a887SLionel Debieve 					&stm32_qspi.mm_base,
475*0581a887SLionel Debieve 					&stm32_qspi.mm_size);
476*0581a887SLionel Debieve 	if (ret != 0) {
477*0581a887SLionel Debieve 		return ret;
478*0581a887SLionel Debieve 	}
479*0581a887SLionel Debieve 
480*0581a887SLionel Debieve 	if (dt_set_pinctrl_config(qspi_node) != 0) {
481*0581a887SLionel Debieve 		return -FDT_ERR_BADVALUE;
482*0581a887SLionel Debieve 	}
483*0581a887SLionel Debieve 
484*0581a887SLionel Debieve 	if ((info.clock < 0) || (info.reset < 0)) {
485*0581a887SLionel Debieve 		return -FDT_ERR_BADVALUE;
486*0581a887SLionel Debieve 	}
487*0581a887SLionel Debieve 
488*0581a887SLionel Debieve 	stm32_qspi.clock_id = (unsigned long)info.clock;
489*0581a887SLionel Debieve 	stm32_qspi.reset_id = (unsigned int)info.reset;
490*0581a887SLionel Debieve 
491*0581a887SLionel Debieve 	stm32mp_clk_enable(stm32_qspi.clock_id);
492*0581a887SLionel Debieve 
493*0581a887SLionel Debieve 	stm32mp_reset_assert(stm32_qspi.reset_id);
494*0581a887SLionel Debieve 	stm32mp_reset_deassert(stm32_qspi.reset_id);
495*0581a887SLionel Debieve 
496*0581a887SLionel Debieve 	mmio_write_32(qspi_base() + QSPI_CR, QSPI_CR_SSHIFT);
497*0581a887SLionel Debieve 	mmio_write_32(qspi_base() + QSPI_DCR, QSPI_DCR_FSIZE_MASK);
498*0581a887SLionel Debieve 
499*0581a887SLionel Debieve 	return spi_mem_init_slave(fdt, qspi_node, &stm32_qspi_bus_ops);
500*0581a887SLionel Debieve };
501