blob: 80510f2542be6897e0edef826b57c7a3f66c5bec [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Stefan Roese1c60fe72014-11-07 12:37:49 +01002/*
3 * Copyright (C) 2012
4 * Altera Corporation <www.altera.com>
Stefan Roese1c60fe72014-11-07 12:37:49 +01005 */
6
7#ifndef __CADENCE_QSPI_H__
8#define __CADENCE_QSPI_H__
9
Simon Goldschmidt46e56a42019-03-01 20:12:35 +010010#include <reset.h>
T Karthik Reddy8cc7e7e2022-05-12 04:05:31 -060011#include <linux/mtd/spi-nor.h>
12#include <spi-mem.h>
Simon Goldschmidt46e56a42019-03-01 20:12:35 +010013
Stefan Roese1c60fe72014-11-07 12:37:49 +010014#define CQSPI_IS_ADDR(cmd_len) (cmd_len > 1 ? 1 : 0)
15
16#define CQSPI_NO_DECODER_MAX_CS 4
17#define CQSPI_DECODER_MAX_CS 16
18#define CQSPI_READ_CAPTURE_MAX_DELAY 16
19
T Karthik Reddy8cc7e7e2022-05-12 04:05:31 -060020#define CQSPI_REG_POLL_US 1 /* 1us */
21#define CQSPI_REG_RETRY 10000
22#define CQSPI_POLL_IDLE_RETRY 3
23
24/* Transfer mode */
25#define CQSPI_INST_TYPE_SINGLE 0
26#define CQSPI_INST_TYPE_DUAL 1
27#define CQSPI_INST_TYPE_QUAD 2
28#define CQSPI_INST_TYPE_OCTAL 3
29
30#define CQSPI_STIG_DATA_LEN_MAX 8
31
32#define CQSPI_DUMMY_CLKS_PER_BYTE 8
33#define CQSPI_DUMMY_BYTES_MAX 4
34#define CQSPI_DUMMY_CLKS_MAX 31
35
Tejas Bhumkare56bc922024-01-28 12:07:46 +053036#define CMD_4BYTE_FAST_READ 0x0C
37#define CMD_4BYTE_OCTAL_READ 0x7c
38#define CMD_4BYTE_READ 0x13
39
T Karthik Reddy8cc7e7e2022-05-12 04:05:31 -060040/****************************************************************************
41 * Controller's configuration and status register (offset from QSPI_BASE)
42 ****************************************************************************/
43#define CQSPI_REG_CONFIG 0x00
44#define CQSPI_REG_CONFIG_ENABLE BIT(0)
45#define CQSPI_REG_CONFIG_CLK_POL BIT(1)
46#define CQSPI_REG_CONFIG_CLK_PHA BIT(2)
47#define CQSPI_REG_CONFIG_PHY_ENABLE_MASK BIT(3)
Venkatesh Yadav Abbarapu2dad94b2025-03-11 09:43:17 +053048#define CQSPI_REG_CONFIG_RESET_PIN_FLD_MASK BIT(5)
49#define CQSPI_REG_CONFIG_RESET_CFG_FLD_MASK BIT(6)
T Karthik Reddy8cc7e7e2022-05-12 04:05:31 -060050#define CQSPI_REG_CONFIG_DIRECT BIT(7)
51#define CQSPI_REG_CONFIG_DECODE BIT(9)
52#define CQSPI_REG_CONFIG_ENBL_DMA BIT(15)
53#define CQSPI_REG_CONFIG_XIP_IMM BIT(18)
54#define CQSPI_REG_CONFIG_DTR_PROT_EN_MASK BIT(24)
55#define CQSPI_REG_CONFIG_CHIPSELECT_LSB 10
56#define CQSPI_REG_CONFIG_BAUD_LSB 19
57#define CQSPI_REG_CONFIG_DTR_PROTO BIT(24)
58#define CQSPI_REG_CONFIG_DUAL_OPCODE BIT(30)
59#define CQSPI_REG_CONFIG_IDLE_LSB 31
60#define CQSPI_REG_CONFIG_CHIPSELECT_MASK 0xF
61#define CQSPI_REG_CONFIG_BAUD_MASK 0xF
62
63#define CQSPI_REG_RD_INSTR 0x04
64#define CQSPI_REG_RD_INSTR_OPCODE_LSB 0
65#define CQSPI_REG_RD_INSTR_TYPE_INSTR_LSB 8
66#define CQSPI_REG_RD_INSTR_TYPE_ADDR_LSB 12
67#define CQSPI_REG_RD_INSTR_TYPE_DATA_LSB 16
68#define CQSPI_REG_RD_INSTR_MODE_EN_LSB 20
69#define CQSPI_REG_RD_INSTR_DUMMY_LSB 24
70#define CQSPI_REG_RD_INSTR_TYPE_INSTR_MASK 0x3
71#define CQSPI_REG_RD_INSTR_TYPE_ADDR_MASK 0x3
72#define CQSPI_REG_RD_INSTR_TYPE_DATA_MASK 0x3
73#define CQSPI_REG_RD_INSTR_DUMMY_MASK 0x1F
74
75#define CQSPI_REG_WR_INSTR 0x08
76#define CQSPI_REG_WR_INSTR_OPCODE_LSB 0
77#define CQSPI_REG_WR_INSTR_TYPE_ADDR_LSB 12
78#define CQSPI_REG_WR_INSTR_TYPE_DATA_LSB 16
79
80#define CQSPI_REG_DELAY 0x0C
81#define CQSPI_REG_DELAY_TSLCH_LSB 0
82#define CQSPI_REG_DELAY_TCHSH_LSB 8
83#define CQSPI_REG_DELAY_TSD2D_LSB 16
84#define CQSPI_REG_DELAY_TSHSL_LSB 24
85#define CQSPI_REG_DELAY_TSLCH_MASK 0xFF
86#define CQSPI_REG_DELAY_TCHSH_MASK 0xFF
87#define CQSPI_REG_DELAY_TSD2D_MASK 0xFF
88#define CQSPI_REG_DELAY_TSHSL_MASK 0xFF
89
90#define CQSPI_REG_RD_DATA_CAPTURE 0x10
91#define CQSPI_REG_RD_DATA_CAPTURE_BYPASS BIT(0)
92#define CQSPI_REG_READCAPTURE_DQS_ENABLE BIT(8)
93#define CQSPI_REG_RD_DATA_CAPTURE_DELAY_LSB 1
94#define CQSPI_REG_RD_DATA_CAPTURE_DELAY_MASK 0xF
95
96#define CQSPI_REG_SIZE 0x14
97#define CQSPI_REG_SIZE_ADDRESS_LSB 0
98#define CQSPI_REG_SIZE_PAGE_LSB 4
99#define CQSPI_REG_SIZE_BLOCK_LSB 16
100#define CQSPI_REG_SIZE_ADDRESS_MASK 0xF
101#define CQSPI_REG_SIZE_PAGE_MASK 0xFFF
102#define CQSPI_REG_SIZE_BLOCK_MASK 0x3F
103
104#define CQSPI_REG_SRAMPARTITION 0x18
105#define CQSPI_REG_INDIRECTTRIGGER 0x1C
106
107#define CQSPI_REG_REMAP 0x24
108#define CQSPI_REG_MODE_BIT 0x28
109
110#define CQSPI_REG_SDRAMLEVEL 0x2C
111#define CQSPI_REG_SDRAMLEVEL_RD_LSB 0
112#define CQSPI_REG_SDRAMLEVEL_WR_LSB 16
113#define CQSPI_REG_SDRAMLEVEL_RD_MASK 0xFFFF
114#define CQSPI_REG_SDRAMLEVEL_WR_MASK 0xFFFF
115
116#define CQSPI_REG_WR_COMPLETION_CTRL 0x38
117#define CQSPI_REG_WR_DISABLE_AUTO_POLL BIT(14)
118
119#define CQSPI_REG_IRQSTATUS 0x40
120#define CQSPI_REG_IRQMASK 0x44
121
122#define CQSPI_REG_INDIRECTRD 0x60
123#define CQSPI_REG_INDIRECTRD_START BIT(0)
124#define CQSPI_REG_INDIRECTRD_CANCEL BIT(1)
125#define CQSPI_REG_INDIRECTRD_INPROGRESS BIT(2)
126#define CQSPI_REG_INDIRECTRD_DONE BIT(5)
127
128#define CQSPI_REG_INDIRECTRDWATERMARK 0x64
129#define CQSPI_REG_INDIRECTRDSTARTADDR 0x68
130#define CQSPI_REG_INDIRECTRDBYTES 0x6C
131
132#define CQSPI_REG_CMDCTRL 0x90
133#define CQSPI_REG_CMDCTRL_EXECUTE BIT(0)
134#define CQSPI_REG_CMDCTRL_INPROGRESS BIT(1)
135#define CQSPI_REG_CMDCTRL_DUMMY_LSB 7
136#define CQSPI_REG_CMDCTRL_WR_BYTES_LSB 12
137#define CQSPI_REG_CMDCTRL_WR_EN_LSB 15
138#define CQSPI_REG_CMDCTRL_ADD_BYTES_LSB 16
139#define CQSPI_REG_CMDCTRL_ADDR_EN_LSB 19
140#define CQSPI_REG_CMDCTRL_RD_BYTES_LSB 20
141#define CQSPI_REG_CMDCTRL_RD_EN_LSB 23
142#define CQSPI_REG_CMDCTRL_OPCODE_LSB 24
143#define CQSPI_REG_CMDCTRL_DUMMY_MASK 0x1F
144#define CQSPI_REG_CMDCTRL_WR_BYTES_MASK 0x7
145#define CQSPI_REG_CMDCTRL_ADD_BYTES_MASK 0x3
146#define CQSPI_REG_CMDCTRL_RD_BYTES_MASK 0x7
147#define CQSPI_REG_CMDCTRL_OPCODE_MASK 0xFF
148
149#define CQSPI_REG_INDIRECTWR 0x70
150#define CQSPI_REG_INDIRECTWR_START BIT(0)
151#define CQSPI_REG_INDIRECTWR_CANCEL BIT(1)
152#define CQSPI_REG_INDIRECTWR_INPROGRESS BIT(2)
153#define CQSPI_REG_INDIRECTWR_DONE BIT(5)
154
155#define CQSPI_REG_INDIRECTWRWATERMARK 0x74
156#define CQSPI_REG_INDIRECTWRSTARTADDR 0x78
157#define CQSPI_REG_INDIRECTWRBYTES 0x7C
158
159#define CQSPI_REG_CMDADDRESS 0x94
160#define CQSPI_REG_CMDREADDATALOWER 0xA0
161#define CQSPI_REG_CMDREADDATAUPPER 0xA4
162#define CQSPI_REG_CMDWRITEDATALOWER 0xA8
163#define CQSPI_REG_CMDWRITEDATAUPPER 0xAC
164
165#define CQSPI_REG_OP_EXT_LOWER 0xE0
166#define CQSPI_REG_OP_EXT_READ_LSB 24
167#define CQSPI_REG_OP_EXT_WRITE_LSB 16
168#define CQSPI_REG_OP_EXT_STIG_LSB 0
169
170#define CQSPI_REG_PHY_CONFIG 0xB4
171#define CQSPI_REG_PHY_CONFIG_RESET_FLD_MASK 0x40000000
172
173#define CQSPI_DMA_DST_ADDR_REG 0x1800
174#define CQSPI_DMA_DST_SIZE_REG 0x1804
175#define CQSPI_DMA_DST_STS_REG 0x1808
176#define CQSPI_DMA_DST_CTRL_REG 0x180C
177#define CQSPI_DMA_DST_I_STS_REG 0x1814
178#define CQSPI_DMA_DST_I_ENBL_REG 0x1818
179#define CQSPI_DMA_DST_I_DISBL_REG 0x181C
180#define CQSPI_DMA_DST_CTRL2_REG 0x1824
181#define CQSPI_DMA_DST_ADDR_MSB_REG 0x1828
182
183#define CQSPI_DMA_SRC_RD_ADDR_REG 0x1000
184
185#define CQSPI_REG_DMA_PERIPH_CFG 0x20
186#define CQSPI_REG_INDIR_TRIG_ADDR_RANGE 0x80
187#define CQSPI_DFLT_INDIR_TRIG_ADDR_RANGE 6
188#define CQSPI_DFLT_DMA_PERIPH_CFG 0x602
189#define CQSPI_DFLT_DST_CTRL_REG_VAL 0xF43FFA00
190
191#define CQSPI_DMA_DST_I_STS_DONE BIT(1)
192#define CQSPI_DMA_TIMEOUT 10000000
193
194#define CQSPI_REG_IS_IDLE(base) \
195 ((readl((base) + CQSPI_REG_CONFIG) >> \
196 CQSPI_REG_CONFIG_IDLE_LSB) & 0x1)
197
198#define CQSPI_GET_RD_SRAM_LEVEL(reg_base) \
199 (((readl((reg_base) + CQSPI_REG_SDRAMLEVEL)) >> \
200 CQSPI_REG_SDRAMLEVEL_RD_LSB) & CQSPI_REG_SDRAMLEVEL_RD_MASK)
201
202#define CQSPI_GET_WR_SRAM_LEVEL(reg_base) \
203 (((readl((reg_base) + CQSPI_REG_SDRAMLEVEL)) >> \
204 CQSPI_REG_SDRAMLEVEL_WR_LSB) & CQSPI_REG_SDRAMLEVEL_WR_MASK)
205
Simon Glassb75b15b2020-12-03 16:55:23 -0700206struct cadence_spi_plat {
Stefan Roese1c60fe72014-11-07 12:37:49 +0100207 unsigned int max_hz;
208 void *regbase;
209 void *ahbbase;
Jason Rush1b4df5e2018-01-23 17:13:09 -0600210 bool is_decoded_cs;
211 u32 fifo_depth;
212 u32 fifo_width;
213 u32 trigger_address;
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530214 fdt_addr_t ahbsize;
215 bool use_dac_mode;
Pratyush Yadav8e0be9e2021-06-26 00:47:07 +0530216 int read_delay;
Stefan Roese1c60fe72014-11-07 12:37:49 +0100217
Jason Rush1b4df5e2018-01-23 17:13:09 -0600218 /* Flash parameters */
Stefan Roese1c60fe72014-11-07 12:37:49 +0100219 u32 page_size;
220 u32 block_size;
221 u32 tshsl_ns;
222 u32 tsd2d_ns;
223 u32 tchsh_ns;
224 u32 tslch_ns;
Boon Khai Ng39a72a12025-04-16 11:17:51 +0800225 u32 quirks;
Pratyush Yadave1814ad2021-06-26 00:47:09 +0530226
T Karthik Reddy73701e72022-05-12 04:05:32 -0600227 bool is_dma;
Stefan Roese1c60fe72014-11-07 12:37:49 +0100228};
229
230struct cadence_spi_priv {
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600231 unsigned int ref_clk_hz;
232 unsigned int max_hz;
Stefan Roese1c60fe72014-11-07 12:37:49 +0100233 void *regbase;
234 void *ahbbase;
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600235 unsigned int fifo_depth;
236 unsigned int fifo_width;
237 unsigned int trigger_address;
238 fdt_addr_t ahbsize;
Stefan Roese1c60fe72014-11-07 12:37:49 +0100239 size_t cmd_len;
240 u8 cmd_buf[32];
241 size_t data_len;
242
243 int qspi_is_init;
244 unsigned int qspi_calibrated_hz;
245 unsigned int qspi_calibrated_cs;
Chin Liang See36431f92015-10-17 08:31:55 -0500246 unsigned int previous_hz;
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600247 u32 wr_delay;
248 int read_delay;
Simon Goldschmidt46e56a42019-03-01 20:12:35 +0100249
Christian Gmeinerd560a672022-02-22 17:23:25 +0100250 struct reset_ctl_bulk *resets;
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600251 u32 page_size;
252 u32 block_size;
253 u32 tshsl_ns;
254 u32 tsd2d_ns;
255 u32 tchsh_ns;
256 u32 tslch_ns;
Boon Khai Ng39a72a12025-04-16 11:17:51 +0800257 u32 quirks;
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600258 u8 edge_mode;
259 u8 dll_mode;
260 bool extra_dummy;
261 bool ddr_init;
262 bool is_decoded_cs;
263 bool use_dac_mode;
264 bool is_dma;
265
266 /* Transaction protocol parameters. */
267 u8 inst_width;
268 u8 addr_width;
269 u8 data_width;
270 bool dtr;
Stefan Roese1c60fe72014-11-07 12:37:49 +0100271};
272
Boon Khai Ng39a72a12025-04-16 11:17:51 +0800273struct cqspi_driver_platdata {
274 u32 hwcaps_mask;
275 u32 quirks;
276};
277
Stefan Roese1c60fe72014-11-07 12:37:49 +0100278/* Functions call declaration */
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600279void cadence_qspi_apb_controller_init(struct cadence_spi_priv *priv);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100280void cadence_qspi_apb_controller_enable(void *reg_base_addr);
281void cadence_qspi_apb_controller_disable(void *reg_base_addr);
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530282void cadence_qspi_apb_dac_mode_enable(void *reg_base);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100283
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600284int cadence_qspi_apb_command_read_setup(struct cadence_spi_priv *priv,
Pratyush Yadave1814ad2021-06-26 00:47:09 +0530285 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600286int cadence_qspi_apb_command_read(struct cadence_spi_priv *priv,
Vignesh Raghavendra27516a32020-01-27 10:36:39 +0530287 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600288int cadence_qspi_apb_command_write_setup(struct cadence_spi_priv *priv,
Pratyush Yadave1814ad2021-06-26 00:47:09 +0530289 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600290int cadence_qspi_apb_command_write(struct cadence_spi_priv *priv,
Vignesh Raghavendra27516a32020-01-27 10:36:39 +0530291 const struct spi_mem_op *op);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100292
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600293int cadence_qspi_apb_read_setup(struct cadence_spi_priv *priv,
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530294 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600295int cadence_qspi_apb_read_execute(struct cadence_spi_priv *priv,
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530296 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600297int cadence_qspi_apb_write_setup(struct cadence_spi_priv *priv,
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530298 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600299int cadence_qspi_apb_write_execute(struct cadence_spi_priv *priv,
Vignesh Raghavendra6b7df222020-01-27 10:36:40 +0530300 const struct spi_mem_op *op);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100301
302void cadence_qspi_apb_chipselect(void *reg_base,
303 unsigned int chip_select, unsigned int decoder_enable);
Phil Edworthyeef2edc2016-11-29 12:58:31 +0000304void cadence_qspi_apb_set_clk_mode(void *reg_base, uint mode);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100305void cadence_qspi_apb_config_baudrate_div(void *reg_base,
306 unsigned int ref_clk_hz, unsigned int sclk_hz);
307void cadence_qspi_apb_delay(void *reg_base,
308 unsigned int ref_clk, unsigned int sclk_hz,
309 unsigned int tshsl_ns, unsigned int tsd2d_ns,
310 unsigned int tchsh_ns, unsigned int tslch_ns);
311void cadence_qspi_apb_enter_xip(void *reg_base, char xip_dummy);
312void cadence_qspi_apb_readdata_capture(void *reg_base,
313 unsigned int bypass, unsigned int delay);
Tom Rini3fb5b2f2022-03-30 18:07:23 -0400314unsigned int cm_get_qspi_controller_clk_hz(void);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600315int cadence_qspi_apb_dma_read(struct cadence_spi_priv *priv,
T Karthik Reddy73701e72022-05-12 04:05:32 -0600316 const struct spi_mem_op *op);
Ashok Reddy Somaf5817652022-08-24 05:38:47 -0600317int cadence_qspi_apb_wait_for_dma_cmplt(struct cadence_spi_priv *priv);
T Karthik Reddy73701e72022-05-12 04:05:32 -0600318int cadence_qspi_apb_exec_flash_cmd(void *reg_base, unsigned int reg);
Venkatesh Yadav Abbarapubdad63b2025-01-22 19:23:34 +0530319int cadence_qspi_flash_reset(struct udevice *dev);
Udit Kumar88f53042023-09-12 15:20:35 +0530320ofnode cadence_qspi_get_subnode(struct udevice *dev);
T Karthik Reddy3b49fbf2022-05-12 04:05:34 -0600321void cadence_qspi_apb_enable_linear_mode(bool enable);
Venkatesh Yadav Abbarapu2dad94b2025-03-11 09:43:17 +0530322int cadence_device_reset(struct udevice *dev);
Stefan Roese1c60fe72014-11-07 12:37:49 +0100323
324#endif /* __CADENCE_QSPI_H__ */