Lines Matching +full:bank +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
9 using the general purpose chip-select mode (GPCM).
17 compatible = "fsl,elbc-gpcm-uio";
19 elbc-gpcm-br = <0xff810800>;
20 elbc-gpcm-or = <0xffff09f7>;
21 interrupt-parent = <&mpic>;
25 netx5152,init-win0-offset = <0x0>;
29 Only the entries reg (to identify bank) and elbc-gpcm-* (initial BR/OR
31 are optional (as well as any type-specific options such as
32 netx5152,init-win0-offset). As long as no interrupt handler is needed,
33 this driver can be used without any type-specific implementation.
38 The netx5152 type should serve as a model to add new type-specific
58 u32 bank; member
59 const char *name; member
85 struct fsl_elbc_gpcm *priv = info->priv; in reg_show()
86 struct fsl_lbc_bank *bank = &priv->lbc->bank[priv->bank]; in reg_show() local
90 in_be32(&bank->br)); in reg_show()
94 in_be32(&bank->or)); in reg_show()
104 struct fsl_elbc_gpcm *priv = info->priv; in reg_store()
105 struct fsl_lbc_bank *bank = &priv->lbc->bank[priv->bank]; in reg_store() local
113 return -EINVAL; in reg_store()
117 reg_br_cur = in_be32(&bank->br); in reg_store()
118 reg_or_cur = in_be32(&bank->or); in reg_store()
124 return -EINVAL; in reg_store()
129 return -EINVAL; in reg_store()
132 out_be32(&bank->br, reg_new | BR_V); in reg_store()
137 return -EINVAL; in reg_store()
140 out_be32(&bank->or, reg_new); in reg_store()
143 return -EINVAL; in reg_store()
158 void __iomem *reg_int_en = info->mem[0].internal_addr + in netx5152_irq_handler()
161 void __iomem *reg_int_stat = info->mem[0].internal_addr + in netx5152_irq_handler()
180 struct fsl_elbc_gpcm *priv = info->priv; in netx5152_init()
184 prop = of_get_property(priv->dev->of_node, in netx5152_init()
185 "netx5152,init-win0-offset", NULL); in netx5152_init()
190 iowrite32(0, info->mem[0].internal_addr + win0_offset + in netx5152_init()
200 iowrite32(0, info->mem[0].internal_addr + DPM_HOST_WIN0_OFFSET + in netx5152_shutdown()
210 priv->irq_handler = netx5152_irq_handler; in setup_periph()
211 priv->init = netx5152_init; in setup_periph()
212 priv->shutdown = netx5152_shutdown; in setup_periph()
213 priv->name = "netX 51/52"; in setup_periph()
223 /* check specified bank */ in check_of_data()
224 if (priv->bank >= MAX_BANKS) { in check_of_data()
225 dev_err(priv->dev, "invalid bank\n"); in check_of_data()
226 return -ENODEV; in check_of_data()
231 dev_err(priv->dev, "unsupported mode\n"); in check_of_data()
232 return -ENODEV; in check_of_data()
237 dev_err(priv->dev, "address mask / size mismatch\n"); in check_of_data()
238 return -ENODEV; in check_of_data()
242 if ((reg_br & reg_or & BR_BA) != fsl_lbc_addr(res->start)) { in check_of_data()
243 dev_err(priv->dev, "base address mismatch\n"); in check_of_data()
244 return -ENODEV; in check_of_data()
252 u32 *reg_or, unsigned int *irq, char **name) in get_of_data() argument
261 dev_err(priv->dev, "failed to get resource\n"); in get_of_data()
265 /* get the bank number */ in get_of_data()
266 ret = of_property_read_u32(node, "reg", &priv->bank); in get_of_data()
268 dev_err(priv->dev, "failed to get bank number\n"); in get_of_data()
273 ret = of_property_read_u32(node, "elbc-gpcm-br", reg_br); in get_of_data()
275 dev_err(priv->dev, "missing elbc-gpcm-br value\n"); in get_of_data()
280 ret = of_property_read_u32(node, "elbc-gpcm-or", reg_or); in get_of_data()
282 dev_err(priv->dev, "missing elbc-gpcm-or value\n"); in get_of_data()
287 priv->name = "generic"; in get_of_data()
299 /* get optional uio name */ in get_of_data()
302 *name = devm_kstrdup(priv->dev, dt_name, GFP_KERNEL); in get_of_data()
303 if (!*name) in get_of_data()
304 return -ENOMEM; in get_of_data()
311 struct device_node *node = pdev->dev.of_node; in uio_fsl_elbc_gpcm_probe()
323 if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs) in uio_fsl_elbc_gpcm_probe()
324 return -ENODEV; in uio_fsl_elbc_gpcm_probe()
327 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in uio_fsl_elbc_gpcm_probe()
329 return -ENOMEM; in uio_fsl_elbc_gpcm_probe()
330 priv->dev = &pdev->dev; in uio_fsl_elbc_gpcm_probe()
331 priv->lbc = fsl_lbc_ctrl_dev->regs; in uio_fsl_elbc_gpcm_probe()
340 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in uio_fsl_elbc_gpcm_probe()
342 return -ENOMEM; in uio_fsl_elbc_gpcm_probe()
345 reg_br_cur = in_be32(&priv->lbc->bank[priv->bank].br); in uio_fsl_elbc_gpcm_probe()
346 reg_or_cur = in_be32(&priv->lbc->bank[priv->bank].or); in uio_fsl_elbc_gpcm_probe()
348 /* if bank already configured, make sure it matches */ in uio_fsl_elbc_gpcm_probe()
353 dev_err(priv->dev, in uio_fsl_elbc_gpcm_probe()
354 "bank in use by another peripheral\n"); in uio_fsl_elbc_gpcm_probe()
355 return -ENODEV; in uio_fsl_elbc_gpcm_probe()
361 dev_warn(priv->dev, in uio_fsl_elbc_gpcm_probe()
362 "modifying BR settings: 0x%08x -> 0x%08x", in uio_fsl_elbc_gpcm_probe()
366 dev_warn(priv->dev, in uio_fsl_elbc_gpcm_probe()
367 "modifying OR settings: 0x%08x -> 0x%08x", in uio_fsl_elbc_gpcm_probe()
372 /* configure the bank (force base address and GPCM) */ in uio_fsl_elbc_gpcm_probe()
375 out_be32(&priv->lbc->bank[priv->bank].or, reg_or_new); in uio_fsl_elbc_gpcm_probe()
376 out_be32(&priv->lbc->bank[priv->bank].br, reg_br_new); in uio_fsl_elbc_gpcm_probe()
379 info->mem[0].internal_addr = ioremap(res.start, resource_size(&res)); in uio_fsl_elbc_gpcm_probe()
380 if (!info->mem[0].internal_addr) { in uio_fsl_elbc_gpcm_probe()
381 dev_err(priv->dev, "failed to map chip region\n"); in uio_fsl_elbc_gpcm_probe()
382 return -ENODEV; in uio_fsl_elbc_gpcm_probe()
386 info->mem[0].name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn", node); in uio_fsl_elbc_gpcm_probe()
387 info->mem[0].addr = res.start; in uio_fsl_elbc_gpcm_probe()
388 info->mem[0].size = resource_size(&res); in uio_fsl_elbc_gpcm_probe()
389 info->mem[0].memtype = UIO_MEM_PHYS; in uio_fsl_elbc_gpcm_probe()
390 info->priv = priv; in uio_fsl_elbc_gpcm_probe()
391 info->name = uio_name; in uio_fsl_elbc_gpcm_probe()
392 info->version = "0.0.1"; in uio_fsl_elbc_gpcm_probe()
394 if (priv->irq_handler) { in uio_fsl_elbc_gpcm_probe()
395 info->irq = irq; in uio_fsl_elbc_gpcm_probe()
396 info->irq_flags = IRQF_SHARED; in uio_fsl_elbc_gpcm_probe()
397 info->handler = priv->irq_handler; in uio_fsl_elbc_gpcm_probe()
400 dev_warn(priv->dev, "ignoring irq, no handler\n"); in uio_fsl_elbc_gpcm_probe()
404 if (priv->init) in uio_fsl_elbc_gpcm_probe()
405 priv->init(info); in uio_fsl_elbc_gpcm_probe()
408 if (uio_register_device(priv->dev, info) != 0) { in uio_fsl_elbc_gpcm_probe()
409 dev_err(priv->dev, "UIO registration failed\n"); in uio_fsl_elbc_gpcm_probe()
410 ret = -ENODEV; in uio_fsl_elbc_gpcm_probe()
417 dev_info(priv->dev, in uio_fsl_elbc_gpcm_probe()
418 "eLBC/GPCM device (%s) at 0x%llx, bank %d, irq=%d\n", in uio_fsl_elbc_gpcm_probe()
419 priv->name, (unsigned long long)res.start, priv->bank, in uio_fsl_elbc_gpcm_probe()
420 irq ? : -1); in uio_fsl_elbc_gpcm_probe()
424 if (priv->shutdown) in uio_fsl_elbc_gpcm_probe()
425 priv->shutdown(info, true); in uio_fsl_elbc_gpcm_probe()
426 iounmap(info->mem[0].internal_addr); in uio_fsl_elbc_gpcm_probe()
433 struct fsl_elbc_gpcm *priv = info->priv; in uio_fsl_elbc_gpcm_remove()
437 if (priv->shutdown) in uio_fsl_elbc_gpcm_remove()
438 priv->shutdown(info, false); in uio_fsl_elbc_gpcm_remove()
439 iounmap(info->mem[0].internal_addr); in uio_fsl_elbc_gpcm_remove()
444 { .compatible = "fsl,elbc-gpcm-uio", },
451 .name = "fsl,elbc-gpcm-uio",