powerpc/scom: Add support for "reg" property

When devices are direct children of a scom controller node, they
should be able to use the normal "reg" property instead of "scom-reg".

In that case, they also use #address-cells rather than #scom-cells
to indicate the size of an entry.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent aaa63093
...@@ -53,7 +53,7 @@ scom_map_t scom_map_device(struct device_node *dev, int index) ...@@ -53,7 +53,7 @@ scom_map_t scom_map_device(struct device_node *dev, int index)
{ {
struct device_node *parent; struct device_node *parent;
unsigned int cells, size; unsigned int cells, size;
const u32 *prop; const __be32 *prop, *sprop;
u64 reg, cnt; u64 reg, cnt;
scom_map_t ret; scom_map_t ret;
...@@ -62,12 +62,24 @@ scom_map_t scom_map_device(struct device_node *dev, int index) ...@@ -62,12 +62,24 @@ scom_map_t scom_map_device(struct device_node *dev, int index)
if (parent == NULL) if (parent == NULL)
return 0; return 0;
prop = of_get_property(parent, "#scom-cells", NULL); /*
cells = prop ? *prop : 1; * We support "scom-reg" properties for adding scom registers
* to a random device-tree node with an explicit scom-parent
*
* We also support the simple "reg" property if the device is
* a direct child of a scom controller.
*
* In case both exist, "scom-reg" takes precedence.
*/
prop = of_get_property(dev, "scom-reg", &size); prop = of_get_property(dev, "scom-reg", &size);
sprop = of_get_property(parent, "#scom-cells", NULL);
if (!prop && parent == dev->parent) {
prop = of_get_property(dev, "reg", &size);
sprop = of_get_property(parent, "#address-cells", NULL);
}
if (!prop) if (!prop)
return 0; return NULL;
cells = sprop ? be32_to_cpup(sprop) : 1;
size >>= 2; size >>= 2;
if (index >= (size / (2*cells))) if (index >= (size / (2*cells)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment