Lines Matching +full:bus +full:- +full:range

1 // SPDX-License-Identifier: GPL-2.0-or-later
14 /* System Bus Controller registers */
43 dev_dbg(priv->dev,
44 "range found: bank = %d, addr = %08x, paddr = %08llx, size = %08x\n",
47 if (bank >= ARRAY_SIZE(priv->bank)) {
48 dev_err(priv->dev, "unsupported bank number %d\n", bank);
49 return -EINVAL;
52 if (priv->bank[bank].base || priv->bank[bank].end) {
53 dev_err(priv->dev,
54 "range for bank %d has already been specified\n", bank);
55 return -EINVAL;
59 dev_err(priv->dev, "base address %llx is too high\n", paddr);
60 return -EINVAL;
66 dev_err(priv->dev,
69 return -EINVAL;
71 paddr -= addr;
77 dev_err(priv->dev, "end address %08llx is too high\n", end);
78 return -EINVAL;
80 mask = paddr ^ (end - 1);
86 priv->bank[bank].base = paddr;
87 priv->bank[bank].end = end;
89 dev_dbg(priv->dev, "range added: bank = %d, addr = %08x, end = %08x\n",
90 bank, priv->bank[bank].base, priv->bank[bank].end);
100 for (i = 0; i < ARRAY_SIZE(priv->bank); i++) {
101 for (j = i + 1; j < ARRAY_SIZE(priv->bank); j++) {
102 if (priv->bank[i].end > priv->bank[j].base &&
103 priv->bank[i].base < priv->bank[j].end) {
104 dev_err(priv->dev,
107 return -EINVAL;
118 void __iomem *base_reg = priv->membase + UNIPHIER_SBC_BASE;
123 dev_dbg(priv->dev, "Boot Swap: %s\n", is_swapped ? "on" : "off");
126 * If BOOT_SWAP was asserted on power-on-reset, the CS0 and CS1 are
130 swap(priv->bank[0], priv->bank[1]);
136 void __iomem *base_reg = priv->membase + UNIPHIER_SBC_BASE;
140 for (i = 0; i < ARRAY_SIZE(priv->bank); i++) {
141 base = priv->bank[i].base;
142 end = priv->bank[i].end;
147 * to anywhere in the system bus space is routed to
163 mask = base ^ (end - 1);
169 dev_dbg(priv->dev, "SBC_BASE[%d] = 0x%08x\n", i, val);
177 struct device *dev = &pdev->dev;
180 struct of_range range;
185 return -ENOMEM;
187 priv->membase = devm_platform_ioremap_resource(pdev, 0);
188 if (IS_ERR(priv->membase))
189 return PTR_ERR(priv->membase);
191 priv->dev = dev;
193 ret = of_range_parser_init(&parser, dev->of_node);
197 for_each_of_range(&parser, &range) {
198 if (range.cpu_addr == OF_BAD_ADDR)
199 return -EINVAL;
201 upper_32_bits(range.bus_addr),
202 lower_32_bits(range.bus_addr),
203 range.cpu_addr, range.size);
218 /* Now, the bus is configured. Populate platform_devices below it */
219 return of_platform_default_populate(dev->of_node, NULL, dev);
234 { .compatible = "socionext,uniphier-system-bus" },
242 .name = "uniphier-system-bus",
250 MODULE_DESCRIPTION("UniPhier System Bus driver");