Hi, i would like to attach sxisyscon(4) on a few more compatibles, and register the regmap once per child with a phandle.
here is a complete example of the relevant node(s) from sun7i-a20: Node 0xda8 name: 'system-control' compatible: 'allwinner,sun7i-a20-system-control' + 'allwinner,sun4i-a10-system-control' reg: 01c00000.00000030 #address-cells: 00000001 #size-cells: 00000001 ranges: Node 0xe58 name: 'sram' compatible: 'mmio-sram' reg: 00000000.0000c000 #address-cells: 00000001 #size-cells: 00000001 ranges: 00000000.00000000.0000c000 Node 0xec8 name: 'sram-section' compatible: 'allwinner,sun7i-a20-sram-a3-a4' + 'allwinner,sun4i-a10-sram-a3-a4' reg: 00008000.00004000 status: 'disabled' phandle: 0000000c Node 0xf70 name: 'sram' compatible: 'mmio-sram' reg: 00010000.00001000 #address-cells: 00000001 #size-cells: 00000001 ranges: 00000000.00010000.00001000 Node 0xfe4 name: 'sram-section' compatible: 'allwinner,sun7i-a20-sram-d' + 'allwinner,sun4i-a10-sram-d' reg: 00000000.00001000 status: 'okay' phandle: 00000018 Node 0x107c name: 'sram' compatible: 'mmio-sram' reg: 01d00000.000d0000 #address-cells: 00000001 #size-cells: 00000001 ranges: 00000000.01d00000.000d0000 Node 0x10f4 name: 'sram-section' compatible: 'allwinner,sun7i-a20-sram-c1' + 'allwinner,sun4i-a10-sram-c1' reg: 00000000.00080000 phandle: 00000013 and an example node using above is like this: Node 0x215c name: 'usb' compatible: 'allwinner,sun4i-a10-musb' reg: 01c13000.00000400 clocks: 00000002.0000001a interrupts: 00000000.00000026.00000004 interrupt-names: 'mc' phys: 00000017.00000000 phy-names: 'usb' extcon: 00000017.00000000 allwinner,sram: 00000018.00000001 status: 'okay' dr_mode: 'otg' diff below does allow the use of "allwinner,sram"-property to reach the regmap without teaching "the user"(=driver) of all the possible compatibles for 'system-control', nor how the phandle X is useful only for regmap_bynode(OF_parent(OF_parent(OF_getnodebyphandle(X)))) to use. in short; i want to get rid of the need to hardcode OF_parent(OF_parent()). any comments? -Artturi diff --git a/sys/dev/fdt/sxisyscon.c b/sys/dev/fdt/sxisyscon.c index 30021d9f6aa..7b0da0d77c4 100644 --- a/sys/dev/fdt/sxisyscon.c +++ b/sys/dev/fdt/sxisyscon.c @@ -49,7 +49,11 @@ sxisyscon_match(struct device *parent, void *match, void *aux) struct fdt_attach_args *faa = aux; int node = faa->fa_node; - if (OF_is_compatible(node, "allwinner,sun8i-h3-system-control") || + if (OF_is_compatible(node, "allwinner,sun4i-a10-system-control") || + OF_is_compatible(node, "allwinner,sun5i-a13-system-control") || + OF_is_compatible(node, "allwinner,sun7i-a20-system-control") || + OF_is_compatible(node, "allwinner,sun8i-a23-system-control") || + OF_is_compatible(node, "allwinner,sun8i-h3-system-control") || OF_is_compatible(node, "allwinner,sun50i-a64-system-control") || OF_is_compatible(node, "allwinner,sun50i-h5-system-control") || OF_is_compatible(node, "allwinner,sun50i-h6-system-control")) @@ -63,6 +67,7 @@ sxisyscon_attach(struct device *parent, struct device *self, void *aux) { struct sxisyscon_softc *sc = (struct sxisyscon_softc *)self; struct fdt_attach_args *faa = aux; + int cnode, pnode; if (faa->fa_nreg < 1) { printf(": no registers\n"); @@ -76,8 +81,24 @@ sxisyscon_attach(struct device *parent, struct device *self, void *aux) return; } + /* + * Register us, and all our child nodes with a phandle, to allow + * the use of either regmap_bycompatible() or regmap_byphandle(). + * Other device nodes have "allwinner,sram" property with phandle + * to these, also they should know the sram-section they want by + * compatible. Which doesn't really matter as they get the same + * regmap contents no matter what.. but this gives them both. + */ regmap_register(faa->fa_node, sc->sc_iot, sc->sc_ioh, faa->fa_reg[0].size); + for (pnode = OF_child(faa->fa_node); pnode; pnode = OF_peer(pnode)) { + if (!OF_is_compatible(pnode, "mmio-sram")) + continue; + for (cnode = OF_child(pnode); cnode; cnode = OF_peer(cnode)) + if (OF_getpropint(cnode, "phandle", 0)) + regmap_register(cnode, sc->sc_iot, sc->sc_ioh, + faa->fa_reg[0].size); + } printf("\n"); }