Lines Matching +full:bank +full:- +full:width

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright © 2007-2008 MontaVista Software, Inc.
10 * Author: Roy Zang <tie-fei.zang@freescale.com>
35 * fsl_lbc_addr - convert the base address
36 * @addr_base: base address of the memory bank
45 struct device_node *np = fsl_lbc_ctrl_dev->dev->of_node; in fsl_lbc_addr()
56 * fsl_lbc_find - find Localbus bank
57 * @addr_base: base address of the memory bank
61 * function returns bank number (starting with 0), otherwise it returns
69 if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs) in fsl_lbc_find()
70 return -ENODEV; in fsl_lbc_find()
72 lbc = fsl_lbc_ctrl_dev->regs; in fsl_lbc_find()
73 for (i = 0; i < ARRAY_SIZE(lbc->bank); i++) { in fsl_lbc_find()
74 u32 br = in_be32(&lbc->bank[i].br); in fsl_lbc_find()
75 u32 or = in_be32(&lbc->bank[i].or); in fsl_lbc_find()
81 return -ENOENT; in fsl_lbc_find()
86 * fsl_upm_find - find pre-programmed UPM via base address
87 * @addr_base: base address of the memory bank controlled by the UPM
96 int bank; in fsl_upm_find() local
100 bank = fsl_lbc_find(addr_base); in fsl_upm_find()
101 if (bank < 0) in fsl_upm_find()
102 return bank; in fsl_upm_find()
104 if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs) in fsl_upm_find()
105 return -ENODEV; in fsl_upm_find()
107 lbc = fsl_lbc_ctrl_dev->regs; in fsl_upm_find()
108 br = in_be32(&lbc->bank[bank].br); in fsl_upm_find()
112 upm->mxmr = &lbc->mamr; in fsl_upm_find()
115 upm->mxmr = &lbc->mbmr; in fsl_upm_find()
118 upm->mxmr = &lbc->mcmr; in fsl_upm_find()
121 return -EINVAL; in fsl_upm_find()
126 upm->width = 8; in fsl_upm_find()
129 upm->width = 16; in fsl_upm_find()
132 upm->width = 32; in fsl_upm_find()
135 return -EINVAL; in fsl_upm_find()
143 * fsl_upm_run_pattern - actually run an UPM pattern
150 * pre-programmed AMX bits in the UPM RAM.
157 if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs) in fsl_upm_run_pattern()
158 return -ENODEV; in fsl_upm_run_pattern()
162 out_be32(&fsl_lbc_ctrl_dev->regs->mar, mar); in fsl_upm_run_pattern()
164 switch (upm->width) { in fsl_upm_run_pattern()
175 ret = -EINVAL; in fsl_upm_run_pattern()
188 struct fsl_lbc_regs __iomem *lbc = ctrl->regs; in fsl_lbc_ctrl_init()
191 setbits32(&lbc->ltesr, LTESR_CLEAR); in fsl_lbc_ctrl_init()
192 out_be32(&lbc->lteatr, 0); in fsl_lbc_ctrl_init()
193 out_be32(&lbc->ltear, 0); in fsl_lbc_ctrl_init()
194 out_be32(&lbc->lteccr, LTECCR_CLEAR); in fsl_lbc_ctrl_init()
195 out_be32(&lbc->ltedr, LTEDR_ENABLE); in fsl_lbc_ctrl_init()
199 clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); in fsl_lbc_ctrl_init()
212 struct fsl_lbc_regs __iomem *lbc = ctrl->regs; in fsl_lbc_ctrl_irq()
217 status = in_be32(&lbc->ltesr); in fsl_lbc_ctrl_irq()
223 out_be32(&lbc->ltesr, LTESR_CLEAR); in fsl_lbc_ctrl_irq()
224 out_be32(&lbc->lteatr, 0); in fsl_lbc_ctrl_irq()
225 out_be32(&lbc->ltear, 0); in fsl_lbc_ctrl_irq()
226 ctrl->irq_status = status; in fsl_lbc_ctrl_irq()
229 dev_err(ctrl->dev, "Local bus monitor time-out: " in fsl_lbc_ctrl_irq()
232 dev_err(ctrl->dev, "Write protect error: " in fsl_lbc_ctrl_irq()
235 dev_err(ctrl->dev, "Atomic write error: " in fsl_lbc_ctrl_irq()
238 dev_err(ctrl->dev, "Atomic read error: " in fsl_lbc_ctrl_irq()
241 dev_err(ctrl->dev, "Chip select error: " in fsl_lbc_ctrl_irq()
244 dev_err(ctrl->dev, "FCM command time-out: " in fsl_lbc_ctrl_irq()
247 wake_up(&ctrl->irq_wait); in fsl_lbc_ctrl_irq()
250 dev_err(ctrl->dev, "Parity or Uncorrectable ECC error: " in fsl_lbc_ctrl_irq()
253 wake_up(&ctrl->irq_wait); in fsl_lbc_ctrl_irq()
257 wake_up(&ctrl->irq_wait); in fsl_lbc_ctrl_irq()
260 dev_err(ctrl->dev, "Unknown error: " in fsl_lbc_ctrl_irq()
280 if (!dev->dev.of_node) { in fsl_lbc_ctrl_probe()
281 dev_err(&dev->dev, "Device OF-Node is NULL"); in fsl_lbc_ctrl_probe()
282 return -EFAULT; in fsl_lbc_ctrl_probe()
287 return -ENOMEM; in fsl_lbc_ctrl_probe()
289 dev_set_drvdata(&dev->dev, fsl_lbc_ctrl_dev); in fsl_lbc_ctrl_probe()
291 spin_lock_init(&fsl_lbc_ctrl_dev->lock); in fsl_lbc_ctrl_probe()
292 init_waitqueue_head(&fsl_lbc_ctrl_dev->irq_wait); in fsl_lbc_ctrl_probe()
294 fsl_lbc_ctrl_dev->regs = of_iomap(dev->dev.of_node, 0); in fsl_lbc_ctrl_probe()
295 if (!fsl_lbc_ctrl_dev->regs) { in fsl_lbc_ctrl_probe()
296 dev_err(&dev->dev, "failed to get memory region\n"); in fsl_lbc_ctrl_probe()
297 ret = -ENODEV; in fsl_lbc_ctrl_probe()
301 fsl_lbc_ctrl_dev->irq[0] = irq_of_parse_and_map(dev->dev.of_node, 0); in fsl_lbc_ctrl_probe()
302 if (!fsl_lbc_ctrl_dev->irq[0]) { in fsl_lbc_ctrl_probe()
303 dev_err(&dev->dev, "failed to get irq resource\n"); in fsl_lbc_ctrl_probe()
304 ret = -ENODEV; in fsl_lbc_ctrl_probe()
308 fsl_lbc_ctrl_dev->dev = &dev->dev; in fsl_lbc_ctrl_probe()
310 ret = fsl_lbc_ctrl_init(fsl_lbc_ctrl_dev, dev->dev.of_node); in fsl_lbc_ctrl_probe()
314 ret = request_irq(fsl_lbc_ctrl_dev->irq[0], fsl_lbc_ctrl_irq, 0, in fsl_lbc_ctrl_probe()
315 "fsl-lbc", fsl_lbc_ctrl_dev); in fsl_lbc_ctrl_probe()
317 dev_err(&dev->dev, "failed to install irq (%d)\n", in fsl_lbc_ctrl_probe()
318 fsl_lbc_ctrl_dev->irq[0]); in fsl_lbc_ctrl_probe()
319 ret = fsl_lbc_ctrl_dev->irq[0]; in fsl_lbc_ctrl_probe()
323 fsl_lbc_ctrl_dev->irq[1] = irq_of_parse_and_map(dev->dev.of_node, 1); in fsl_lbc_ctrl_probe()
324 if (fsl_lbc_ctrl_dev->irq[1]) { in fsl_lbc_ctrl_probe()
325 ret = request_irq(fsl_lbc_ctrl_dev->irq[1], fsl_lbc_ctrl_irq, in fsl_lbc_ctrl_probe()
326 IRQF_SHARED, "fsl-lbc-err", fsl_lbc_ctrl_dev); in fsl_lbc_ctrl_probe()
328 dev_err(&dev->dev, "failed to install irq (%d)\n", in fsl_lbc_ctrl_probe()
329 fsl_lbc_ctrl_dev->irq[1]); in fsl_lbc_ctrl_probe()
330 ret = fsl_lbc_ctrl_dev->irq[1]; in fsl_lbc_ctrl_probe()
336 out_be32(&fsl_lbc_ctrl_dev->regs->lteir, LTEIR_ENABLE); in fsl_lbc_ctrl_probe()
341 free_irq(fsl_lbc_ctrl_dev->irq[0], fsl_lbc_ctrl_dev); in fsl_lbc_ctrl_probe()
343 iounmap(fsl_lbc_ctrl_dev->regs); in fsl_lbc_ctrl_probe()
361 lbc = ctrl->regs; in fsl_lbc_syscore_suspend()
365 ctrl->saved_regs = kmalloc(sizeof(struct fsl_lbc_regs), GFP_KERNEL); in fsl_lbc_syscore_suspend()
366 if (!ctrl->saved_regs) in fsl_lbc_syscore_suspend()
367 return -ENOMEM; in fsl_lbc_syscore_suspend()
369 _memcpy_fromio(ctrl->saved_regs, lbc, sizeof(struct fsl_lbc_regs)); in fsl_lbc_syscore_suspend()
385 lbc = ctrl->regs; in fsl_lbc_syscore_resume()
389 if (ctrl->saved_regs) { in fsl_lbc_syscore_resume()
390 _memcpy_toio(lbc, ctrl->saved_regs, in fsl_lbc_syscore_resume()
392 kfree(ctrl->saved_regs); in fsl_lbc_syscore_resume()
393 ctrl->saved_regs = NULL; in fsl_lbc_syscore_resume()
403 { .compatible = "fsl,pq3-localbus", },
404 { .compatible = "fsl,pq2-localbus", },
405 { .compatible = "fsl,pq2pro-localbus", },
418 .name = "fsl-lbc",