1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2012 - 2018 Xilinx, Inc
6 * Author: Punnaiah Choudary Kalluri <punnaiah@xilinx.com>
7 * Author: Naga Sureshkumar Relli <nagasure@xilinx.com>
10 #include <linux/clk.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/of_platform.h>
15 #include <linux/platform_device.h>
16 #include <linux/slab.h>
17 #include <linux/pl353-smc.h>
18 #include <linux/amba/bus.h>
20 /* Register definitions */
21 #define PL353_SMC_MEMC_STATUS_OFFS 0 /* Controller status reg, RO */
22 #define PL353_SMC_CFG_CLR_OFFS 0xC /* Clear config reg, WO */
23 #define PL353_SMC_DIRECT_CMD_OFFS 0x10 /* Direct command reg, WO */
24 #define PL353_SMC_SET_CYCLES_OFFS 0x14 /* Set cycles register, WO */
25 #define PL353_SMC_SET_OPMODE_OFFS 0x18 /* Set opmode register, WO */
26 #define PL353_SMC_ECC_STATUS_OFFS 0x400 /* ECC status register */
27 #define PL353_SMC_ECC_MEMCFG_OFFS 0x404 /* ECC mem config reg */
28 #define PL353_SMC_ECC_MEMCMD1_OFFS 0x408 /* ECC mem cmd1 reg */
29 #define PL353_SMC_ECC_MEMCMD2_OFFS 0x40C /* ECC mem cmd2 reg */
30 #define PL353_SMC_ECC_VALUE0_OFFS 0x418 /* ECC value 0 reg */
32 /* Controller status register specific constants */
33 #define PL353_SMC_MEMC_STATUS_RAW_INT_1_SHIFT 6
35 /* Clear configuration register specific constants */
36 #define PL353_SMC_CFG_CLR_INT_CLR_1 0x10
37 #define PL353_SMC_CFG_CLR_ECC_INT_DIS_1 0x40
38 #define PL353_SMC_CFG_CLR_INT_DIS_1 0x2
39 #define PL353_SMC_CFG_CLR_DEFAULT_MASK (PL353_SMC_CFG_CLR_INT_CLR_1 | \
40 PL353_SMC_CFG_CLR_ECC_INT_DIS_1 | \
41 PL353_SMC_CFG_CLR_INT_DIS_1)
43 /* Set cycles register specific constants */
44 #define PL353_SMC_SET_CYCLES_T0_MASK 0xF
45 #define PL353_SMC_SET_CYCLES_T0_SHIFT 0
46 #define PL353_SMC_SET_CYCLES_T1_MASK 0xF
47 #define PL353_SMC_SET_CYCLES_T1_SHIFT 4
48 #define PL353_SMC_SET_CYCLES_T2_MASK 0x7
49 #define PL353_SMC_SET_CYCLES_T2_SHIFT 8
50 #define PL353_SMC_SET_CYCLES_T3_MASK 0x7
51 #define PL353_SMC_SET_CYCLES_T3_SHIFT 11
52 #define PL353_SMC_SET_CYCLES_T4_MASK 0x7
53 #define PL353_SMC_SET_CYCLES_T4_SHIFT 14
54 #define PL353_SMC_SET_CYCLES_T5_MASK 0x7
55 #define PL353_SMC_SET_CYCLES_T5_SHIFT 17
56 #define PL353_SMC_SET_CYCLES_T6_MASK 0xF
57 #define PL353_SMC_SET_CYCLES_T6_SHIFT 20
59 /* ECC status register specific constants */
60 #define PL353_SMC_ECC_STATUS_BUSY BIT(6)
61 #define PL353_SMC_ECC_REG_SIZE_OFFS 4
63 /* ECC memory config register specific constants */
64 #define PL353_SMC_ECC_MEMCFG_MODE_MASK 0xC
65 #define PL353_SMC_ECC_MEMCFG_MODE_SHIFT 2
66 #define PL353_SMC_ECC_MEMCFG_PGSIZE_MASK 0xC
68 #define PL353_SMC_DC_UPT_NAND_REGS ((4 << 23) | /* CS: NAND chip */ \
69 (2 << 21)) /* UpdateRegs operation */
71 #define PL353_NAND_ECC_CMD1 ((0x80) | /* Write command */ \
72 (0 << 8) | /* Read command */ \
73 (0x30 << 16) | /* Read End command */ \
74 (1 << 24)) /* Read End command calid */
76 #define PL353_NAND_ECC_CMD2 ((0x85) | /* Write col change cmd */ \
77 (5 << 8) | /* Read col change cmd */ \
78 (0xE0 << 16) | /* Read col change end cmd */ \
79 (1 << 24)) /* Read col change end cmd valid */
80 #define PL353_NAND_ECC_BUSY_TIMEOUT (1 * HZ)
82 * struct pl353_smc_data - Private smc driver structure
83 * @memclk: Pointer to the peripheral clock
84 * @aclk: Pointer to the APER clock
86 struct pl353_smc_data
{
91 /* SMC virtual register base */
92 static void __iomem
*pl353_smc_base
;
95 * pl353_smc_set_buswidth - Set memory buswidth
96 * @bw: Memory buswidth (8 | 16)
97 * Return: 0 on success or negative errno.
99 int pl353_smc_set_buswidth(unsigned int bw
)
101 if (bw
!= PL353_SMC_MEM_WIDTH_8
&& bw
!= PL353_SMC_MEM_WIDTH_16
)
104 writel(bw
, pl353_smc_base
+ PL353_SMC_SET_OPMODE_OFFS
);
105 writel(PL353_SMC_DC_UPT_NAND_REGS
, pl353_smc_base
+
106 PL353_SMC_DIRECT_CMD_OFFS
);
110 EXPORT_SYMBOL_GPL(pl353_smc_set_buswidth
);
113 * pl353_smc_set_cycles - Set memory timing parameters
114 * @timings: NAND controller timing parameters
116 * Sets NAND chip specific timing parameters.
118 void pl353_smc_set_cycles(u32 timings
[])
121 * Set write pulse timing. This one is easy to extract:
125 timings
[0] &= PL353_SMC_SET_CYCLES_T0_MASK
;
126 timings
[1] = (timings
[1] & PL353_SMC_SET_CYCLES_T1_MASK
) <<
127 PL353_SMC_SET_CYCLES_T1_SHIFT
;
128 timings
[2] = (timings
[2] & PL353_SMC_SET_CYCLES_T2_MASK
) <<
129 PL353_SMC_SET_CYCLES_T2_SHIFT
;
130 timings
[3] = (timings
[3] & PL353_SMC_SET_CYCLES_T3_MASK
) <<
131 PL353_SMC_SET_CYCLES_T3_SHIFT
;
132 timings
[4] = (timings
[4] & PL353_SMC_SET_CYCLES_T4_MASK
) <<
133 PL353_SMC_SET_CYCLES_T4_SHIFT
;
134 timings
[5] = (timings
[5] & PL353_SMC_SET_CYCLES_T5_MASK
) <<
135 PL353_SMC_SET_CYCLES_T5_SHIFT
;
136 timings
[6] = (timings
[6] & PL353_SMC_SET_CYCLES_T6_MASK
) <<
137 PL353_SMC_SET_CYCLES_T6_SHIFT
;
138 timings
[0] |= timings
[1] | timings
[2] | timings
[3] |
139 timings
[4] | timings
[5] | timings
[6];
141 writel(timings
[0], pl353_smc_base
+ PL353_SMC_SET_CYCLES_OFFS
);
142 writel(PL353_SMC_DC_UPT_NAND_REGS
, pl353_smc_base
+
143 PL353_SMC_DIRECT_CMD_OFFS
);
145 EXPORT_SYMBOL_GPL(pl353_smc_set_cycles
);
148 * pl353_smc_ecc_is_busy - Read ecc busy flag
149 * Return: the ecc_status bit from the ecc_status register. 1 = busy, 0 = idle
151 bool pl353_smc_ecc_is_busy(void)
153 return ((readl(pl353_smc_base
+ PL353_SMC_ECC_STATUS_OFFS
) &
154 PL353_SMC_ECC_STATUS_BUSY
) == PL353_SMC_ECC_STATUS_BUSY
);
156 EXPORT_SYMBOL_GPL(pl353_smc_ecc_is_busy
);
159 * pl353_smc_get_ecc_val - Read ecc_valueN registers
160 * @ecc_reg: Index of the ecc_value reg (0..3)
161 * Return: the content of the requested ecc_value register.
163 * There are four valid ecc_value registers. The argument is truncated to stay
164 * within this valid boundary.
166 u32
pl353_smc_get_ecc_val(int ecc_reg
)
170 addr
= PL353_SMC_ECC_VALUE0_OFFS
+
171 (ecc_reg
* PL353_SMC_ECC_REG_SIZE_OFFS
);
172 reg
= readl(pl353_smc_base
+ addr
);
176 EXPORT_SYMBOL_GPL(pl353_smc_get_ecc_val
);
179 * pl353_smc_get_nand_int_status_raw - Get NAND interrupt status bit
180 * Return: the raw_int_status1 bit from the memc_status register
182 int pl353_smc_get_nand_int_status_raw(void)
186 reg
= readl(pl353_smc_base
+ PL353_SMC_MEMC_STATUS_OFFS
);
187 reg
>>= PL353_SMC_MEMC_STATUS_RAW_INT_1_SHIFT
;
192 EXPORT_SYMBOL_GPL(pl353_smc_get_nand_int_status_raw
);
195 * pl353_smc_clr_nand_int - Clear NAND interrupt
197 void pl353_smc_clr_nand_int(void)
199 writel(PL353_SMC_CFG_CLR_INT_CLR_1
,
200 pl353_smc_base
+ PL353_SMC_CFG_CLR_OFFS
);
202 EXPORT_SYMBOL_GPL(pl353_smc_clr_nand_int
);
205 * pl353_smc_set_ecc_mode - Set SMC ECC mode
206 * @mode: ECC mode (BYPASS, APB, MEM)
207 * Return: 0 on success or negative errno.
209 int pl353_smc_set_ecc_mode(enum pl353_smc_ecc_mode mode
)
215 case PL353_SMC_ECCMODE_BYPASS
:
216 case PL353_SMC_ECCMODE_APB
:
217 case PL353_SMC_ECCMODE_MEM
:
219 reg
= readl(pl353_smc_base
+ PL353_SMC_ECC_MEMCFG_OFFS
);
220 reg
&= ~PL353_SMC_ECC_MEMCFG_MODE_MASK
;
221 reg
|= mode
<< PL353_SMC_ECC_MEMCFG_MODE_SHIFT
;
222 writel(reg
, pl353_smc_base
+ PL353_SMC_ECC_MEMCFG_OFFS
);
231 EXPORT_SYMBOL_GPL(pl353_smc_set_ecc_mode
);
234 * pl353_smc_set_ecc_pg_size - Set SMC ECC page size
235 * @pg_sz: ECC page size
236 * Return: 0 on success or negative errno.
238 int pl353_smc_set_ecc_pg_size(unsigned int pg_sz
)
259 reg
= readl(pl353_smc_base
+ PL353_SMC_ECC_MEMCFG_OFFS
);
260 reg
&= ~PL353_SMC_ECC_MEMCFG_PGSIZE_MASK
;
262 writel(reg
, pl353_smc_base
+ PL353_SMC_ECC_MEMCFG_OFFS
);
266 EXPORT_SYMBOL_GPL(pl353_smc_set_ecc_pg_size
);
268 static int __maybe_unused
pl353_smc_suspend(struct device
*dev
)
270 struct pl353_smc_data
*pl353_smc
= dev_get_drvdata(dev
);
272 clk_disable(pl353_smc
->memclk
);
273 clk_disable(pl353_smc
->aclk
);
278 static int __maybe_unused
pl353_smc_resume(struct device
*dev
)
281 struct pl353_smc_data
*pl353_smc
= dev_get_drvdata(dev
);
283 ret
= clk_enable(pl353_smc
->aclk
);
285 dev_err(dev
, "Cannot enable axi domain clock.\n");
289 ret
= clk_enable(pl353_smc
->memclk
);
291 dev_err(dev
, "Cannot enable memory clock.\n");
292 clk_disable(pl353_smc
->aclk
);
299 static struct amba_driver pl353_smc_driver
;
301 static SIMPLE_DEV_PM_OPS(pl353_smc_dev_pm_ops
, pl353_smc_suspend
,
305 * pl353_smc_init_nand_interface - Initialize the NAND interface
306 * @adev: Pointer to the amba_device struct
307 * @nand_node: Pointer to the pl353_nand device_node struct
309 static void pl353_smc_init_nand_interface(struct amba_device
*adev
,
310 struct device_node
*nand_node
)
312 unsigned long timeout
;
314 pl353_smc_set_buswidth(PL353_SMC_MEM_WIDTH_8
);
315 writel(PL353_SMC_CFG_CLR_INT_CLR_1
,
316 pl353_smc_base
+ PL353_SMC_CFG_CLR_OFFS
);
317 writel(PL353_SMC_DC_UPT_NAND_REGS
, pl353_smc_base
+
318 PL353_SMC_DIRECT_CMD_OFFS
);
320 timeout
= jiffies
+ PL353_NAND_ECC_BUSY_TIMEOUT
;
321 /* Wait till the ECC operation is complete */
323 if (pl353_smc_ecc_is_busy())
327 } while (!time_after_eq(jiffies
, timeout
));
329 if (time_after_eq(jiffies
, timeout
))
332 writel(PL353_NAND_ECC_CMD1
,
333 pl353_smc_base
+ PL353_SMC_ECC_MEMCMD1_OFFS
);
334 writel(PL353_NAND_ECC_CMD2
,
335 pl353_smc_base
+ PL353_SMC_ECC_MEMCMD2_OFFS
);
338 static const struct of_device_id pl353_smc_supported_children
[] = {
340 .compatible
= "cfi-flash"
343 .compatible
= "arm,pl353-nand-r2p1",
344 .data
= pl353_smc_init_nand_interface
349 static int pl353_smc_probe(struct amba_device
*adev
, const struct amba_id
*id
)
351 struct pl353_smc_data
*pl353_smc
;
352 struct device_node
*child
;
353 struct resource
*res
;
355 struct device_node
*of_node
= adev
->dev
.of_node
;
356 static void (*init
)(struct amba_device
*adev
,
357 struct device_node
*nand_node
);
358 const struct of_device_id
*match
= NULL
;
360 pl353_smc
= devm_kzalloc(&adev
->dev
, sizeof(*pl353_smc
), GFP_KERNEL
);
364 /* Get the NAND controller virtual address */
366 pl353_smc_base
= devm_ioremap_resource(&adev
->dev
, res
);
367 if (IS_ERR(pl353_smc_base
))
368 return PTR_ERR(pl353_smc_base
);
370 pl353_smc
->aclk
= devm_clk_get(&adev
->dev
, "apb_pclk");
371 if (IS_ERR(pl353_smc
->aclk
)) {
372 dev_err(&adev
->dev
, "aclk clock not found.\n");
373 return PTR_ERR(pl353_smc
->aclk
);
376 pl353_smc
->memclk
= devm_clk_get(&adev
->dev
, "memclk");
377 if (IS_ERR(pl353_smc
->memclk
)) {
378 dev_err(&adev
->dev
, "memclk clock not found.\n");
379 return PTR_ERR(pl353_smc
->memclk
);
382 err
= clk_prepare_enable(pl353_smc
->aclk
);
384 dev_err(&adev
->dev
, "Unable to enable AXI clock.\n");
388 err
= clk_prepare_enable(pl353_smc
->memclk
);
390 dev_err(&adev
->dev
, "Unable to enable memory clock.\n");
391 goto out_clk_dis_aper
;
394 amba_set_drvdata(adev
, pl353_smc
);
396 /* clear interrupts */
397 writel(PL353_SMC_CFG_CLR_DEFAULT_MASK
,
398 pl353_smc_base
+ PL353_SMC_CFG_CLR_OFFS
);
400 /* Find compatible children. Only a single child is supported */
401 for_each_available_child_of_node(of_node
, child
) {
402 match
= of_match_node(pl353_smc_supported_children
, child
);
404 dev_warn(&adev
->dev
, "unsupported child node\n");
410 dev_err(&adev
->dev
, "no matching children\n");
411 goto out_clk_disable
;
417 of_platform_device_create(child
, NULL
, &adev
->dev
);
422 clk_disable_unprepare(pl353_smc
->memclk
);
424 clk_disable_unprepare(pl353_smc
->aclk
);
429 static int pl353_smc_remove(struct amba_device
*adev
)
431 struct pl353_smc_data
*pl353_smc
= amba_get_drvdata(adev
);
433 clk_disable_unprepare(pl353_smc
->memclk
);
434 clk_disable_unprepare(pl353_smc
->aclk
);
439 static const struct amba_id pl353_ids
[] = {
446 MODULE_DEVICE_TABLE(amba
, pl353_ids
);
448 static struct amba_driver pl353_smc_driver
= {
450 .owner
= THIS_MODULE
,
452 .pm
= &pl353_smc_dev_pm_ops
,
454 .id_table
= pl353_ids
,
455 .probe
= pl353_smc_probe
,
456 .remove
= pl353_smc_remove
,
459 module_amba_driver(pl353_smc_driver
);
461 MODULE_AUTHOR("Xilinx, Inc.");
462 MODULE_DESCRIPTION("ARM PL353 SMC Driver");
463 MODULE_LICENSE("GPL");