Lines Matching +full:ifc +full:- +full:nand
1 // SPDX-License-Identifier: GPL-2.0-or-later
29 * convert_ifc_address - convert the base address
39 * fsl_ifc_find - find IFC bank
42 * This function walks IFC banks comparing "Base address" field of the CSPR
51 if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->gregs) in fsl_ifc_find()
52 return -ENODEV; in fsl_ifc_find()
54 for (i = 0; i < fsl_ifc_ctrl_dev->banks; i++) { in fsl_ifc_find()
55 u32 cspr = ifc_in32(&fsl_ifc_ctrl_dev->gregs->cspr_cs[i].cspr); in fsl_ifc_find()
62 return -ENOENT; in fsl_ifc_find()
68 struct fsl_ifc_global __iomem *ifc = ctrl->gregs; in fsl_ifc_ctrl_init() local
73 if (ifc_in32(&ifc->cm_evter_stat) & IFC_CM_EVTER_STAT_CSER) in fsl_ifc_ctrl_init()
74 ifc_out32(IFC_CM_EVTER_STAT_CSER, &ifc->cm_evter_stat); in fsl_ifc_ctrl_init()
77 ifc_out32(IFC_CM_EVTER_EN_CSEREN, &ifc->cm_evter_en); in fsl_ifc_ctrl_init()
80 ifc_out32(IFC_CM_EVTER_INTR_EN_CSERIREN, &ifc->cm_evter_intr_en); in fsl_ifc_ctrl_init()
81 ifc_out32(0x0, &ifc->cm_erattr0); in fsl_ifc_ctrl_init()
82 ifc_out32(0x0, &ifc->cm_erattr1); in fsl_ifc_ctrl_init()
89 struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(&dev->dev); in fsl_ifc_ctrl_remove()
91 free_irq(ctrl->nand_irq, ctrl); in fsl_ifc_ctrl_remove()
92 free_irq(ctrl->irq, ctrl); in fsl_ifc_ctrl_remove()
94 irq_dispose_mapping(ctrl->nand_irq); in fsl_ifc_ctrl_remove()
95 irq_dispose_mapping(ctrl->irq); in fsl_ifc_ctrl_remove()
97 iounmap(ctrl->gregs); in fsl_ifc_ctrl_remove()
99 dev_set_drvdata(&dev->dev, NULL); in fsl_ifc_ctrl_remove()
105 * NAND events are split between an operational interrupt which only
107 * including non-NAND errors. Whichever interrupt gets to it first
114 struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; in check_nand_stat() local
120 stat = ifc_in32(&ifc->ifc_nand.nand_evter_stat); in check_nand_stat()
122 ifc_out32(stat, &ifc->ifc_nand.nand_evter_stat); in check_nand_stat()
123 ctrl->nand_stat = stat; in check_nand_stat()
124 wake_up(&ctrl->nand_wait); in check_nand_stat()
143 * NOTE: This interrupt is used to report ifc events of various kinds,
149 struct fsl_ifc_global __iomem *ifc = ctrl->gregs; in fsl_ifc_ctrl_irq() local
154 cs_err = ifc_in32(&ifc->cm_evter_stat); in fsl_ifc_ctrl_irq()
156 dev_err(ctrl->dev, "transaction sent to IFC is not mapped to any memory bank 0x%08X\n", in fsl_ifc_ctrl_irq()
159 ifc_out32(IFC_CM_EVTER_STAT_CSER, &ifc->cm_evter_stat); in fsl_ifc_ctrl_irq()
162 status = ifc_in32(&ifc->cm_erattr0); in fsl_ifc_ctrl_irq()
163 err_addr = ifc_in32(&ifc->cm_erattr1); in fsl_ifc_ctrl_irq()
166 dev_err(ctrl->dev, "Read transaction error CM_ERATTR0 0x%08X\n", in fsl_ifc_ctrl_irq()
169 dev_err(ctrl->dev, "Write transaction error CM_ERATTR0 0x%08X\n", in fsl_ifc_ctrl_irq()
174 dev_err(ctrl->dev, "AXI ID of the error transaction 0x%08X\n", in fsl_ifc_ctrl_irq()
179 dev_err(ctrl->dev, "SRC ID of the error transaction 0x%08X\n", in fsl_ifc_ctrl_irq()
182 dev_err(ctrl->dev, "Transaction Address corresponding to error ERADDR 0x%08X\n", in fsl_ifc_ctrl_irq()
200 * resources for the NAND banks themselves are allocated
209 dev_info(&dev->dev, "Freescale Integrated Flash Controller\n"); in fsl_ifc_ctrl_probe()
211 fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev), in fsl_ifc_ctrl_probe()
214 return -ENOMEM; in fsl_ifc_ctrl_probe()
216 dev_set_drvdata(&dev->dev, fsl_ifc_ctrl_dev); in fsl_ifc_ctrl_probe()
218 /* IOMAP the entire IFC region */ in fsl_ifc_ctrl_probe()
219 fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0); in fsl_ifc_ctrl_probe()
220 if (!fsl_ifc_ctrl_dev->gregs) { in fsl_ifc_ctrl_probe()
221 dev_err(&dev->dev, "failed to get memory region\n"); in fsl_ifc_ctrl_probe()
222 return -ENODEV; in fsl_ifc_ctrl_probe()
225 if (of_property_read_bool(dev->dev.of_node, "little-endian")) { in fsl_ifc_ctrl_probe()
226 fsl_ifc_ctrl_dev->little_endian = true; in fsl_ifc_ctrl_probe()
227 dev_dbg(&dev->dev, "IFC REGISTERS are LITTLE endian\n"); in fsl_ifc_ctrl_probe()
229 fsl_ifc_ctrl_dev->little_endian = false; in fsl_ifc_ctrl_probe()
230 dev_dbg(&dev->dev, "IFC REGISTERS are BIG endian\n"); in fsl_ifc_ctrl_probe()
233 version = ifc_in32(&fsl_ifc_ctrl_dev->gregs->ifc_rev) & in fsl_ifc_ctrl_probe()
237 dev_info(&dev->dev, "IFC version %d.%d, %d banks\n", in fsl_ifc_ctrl_probe()
240 fsl_ifc_ctrl_dev->version = version; in fsl_ifc_ctrl_probe()
241 fsl_ifc_ctrl_dev->banks = banks; in fsl_ifc_ctrl_probe()
243 addr = fsl_ifc_ctrl_dev->gregs; in fsl_ifc_ctrl_probe()
248 fsl_ifc_ctrl_dev->rregs = addr; in fsl_ifc_ctrl_probe()
251 fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0); in fsl_ifc_ctrl_probe()
252 if (fsl_ifc_ctrl_dev->irq == 0) { in fsl_ifc_ctrl_probe()
253 dev_err(&dev->dev, "failed to get irq resource for IFC\n"); in fsl_ifc_ctrl_probe()
254 ret = -ENODEV; in fsl_ifc_ctrl_probe()
258 /* get the nand machine irq */ in fsl_ifc_ctrl_probe()
259 fsl_ifc_ctrl_dev->nand_irq = in fsl_ifc_ctrl_probe()
260 irq_of_parse_and_map(dev->dev.of_node, 1); in fsl_ifc_ctrl_probe()
262 fsl_ifc_ctrl_dev->dev = &dev->dev; in fsl_ifc_ctrl_probe()
268 init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait); in fsl_ifc_ctrl_probe()
270 ret = request_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_irq, IRQF_SHARED, in fsl_ifc_ctrl_probe()
271 "fsl-ifc", fsl_ifc_ctrl_dev); in fsl_ifc_ctrl_probe()
273 dev_err(&dev->dev, "failed to install irq (%d)\n", in fsl_ifc_ctrl_probe()
274 fsl_ifc_ctrl_dev->irq); in fsl_ifc_ctrl_probe()
278 if (fsl_ifc_ctrl_dev->nand_irq) { in fsl_ifc_ctrl_probe()
279 ret = request_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_nand_irq, in fsl_ifc_ctrl_probe()
280 0, "fsl-ifc-nand", fsl_ifc_ctrl_dev); in fsl_ifc_ctrl_probe()
282 dev_err(&dev->dev, "failed to install irq (%d)\n", in fsl_ifc_ctrl_probe()
283 fsl_ifc_ctrl_dev->nand_irq); in fsl_ifc_ctrl_probe()
291 free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev); in fsl_ifc_ctrl_probe()
293 irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq); in fsl_ifc_ctrl_probe()
294 irq_dispose_mapping(fsl_ifc_ctrl_dev->irq); in fsl_ifc_ctrl_probe()
296 iounmap(fsl_ifc_ctrl_dev->gregs); in fsl_ifc_ctrl_probe()
302 .compatible = "fsl,ifc",
309 .name = "fsl-ifc",