> Date: Thu, 28 Dec 2017 10:07:12 +0800
> From: Kevin Lo <ke...@openbsd.org>
> 
> On Wed, Dec 27, 2017 at 10:48:16AM +0100, Mark Kettenis wrote:
> > 
> > > Date: Wed, 27 Dec 2017 09:37:12 +0800
> > > From: Kevin Lo <ke...@openbsd.org>
> > > 
> > > On Tue, Dec 26, 2017 at 06:20:59PM +0100, Mark Kettenis wrote:
> > > > 
> > > > > Date: Tue, 26 Dec 2017 22:51:38 +0800
> > > > > From: Kevin Lo <ke...@openbsd.org>
> > > > > 
> > > > > > Shouldn't be too difficult to add support for that one to 
> > > > > > axppmic(4).
> > > > > > Do you want me to create a diff for you to test?
> > > > > 
> > > > > That'd be great, thanks.  Testing is easier than writing code :)
> > > > 
> > > > Here's a diff.  Should give you a couple of sensors and working
> > > > regulators.  That might make the on-board eMMC work.
> > > > 
> > > 
> > > Thanks, but I keep getting these messages:
> > > 
> > > axppmic0 at sxirsb0 addr 0x3a3: AXP223
> > > sxirsb0: RD8 failed for run-time address 0x2d
> > > sxirsb0: RD8 failed for run-time address 0x2d
> > > sxirsb0: WR8 failed for run-time address 0x2d
> > > sxirsb0: RD8 failed for run-time address 0x2d
> > > sxirsb0: RD8 failed for run-time address 0x2d
> > 
> > That suggests communication with the device over the RSB is failing.
> > 
> > Can you send me the output of
> > 
> > # eeprom -p
> > 
> > for that board?
> 
> Sure, here you go: http://ix.io/DsI

Ok.  Looks like a was a bit quick ok'ing that initial sxiccmu(4) diff.
The PRCM clocks that you defined aren't actually being hooked up since
the nodes in the device tree are subnodes of the "prcm" node.  They
also don't have a "reg" property.  So hooking them up is slightly
non-trivial.  Diff below adds code to do that, but I can't test this
unfortunately.  Can you give it a go, and maybe add some printfs in
sxiccmu_attach_clocks() to see wether the PRCM clocks are really
registered?  Hopefully this will fix the RSB issue.

> BTW, mine is BPI-M2 Magic, the board without eMMC [1].

A right.  But the device tree has the eMMC controller enabled, so that
is why you get some error messages.


Index: dev/fdt/sxiccmu.c
===================================================================
RCS file: /cvs/src/sys/dev/fdt/sxiccmu.c,v
retrieving revision 1.14
diff -u -p -r1.14 sxiccmu.c
--- dev/fdt/sxiccmu.c   28 Dec 2017 18:11:13 -0000      1.14
+++ dev/fdt/sxiccmu.c   29 Dec 2017 12:57:01 -0000
@@ -79,7 +79,7 @@ struct cfdriver sxiccmu_cd = {
        NULL, "sxiccmu", DV_DULL
 };
 
-void sxiccmu_attach_clock(struct sxiccmu_softc *, int);
+void sxiccmu_attach_clock(struct sxiccmu_softc *, int, int);
 
 uint32_t sxiccmu_ccu_get_frequency(void *, uint32_t *);
 int    sxiccmu_ccu_set_frequency(void *, uint32_t *, uint32_t);
@@ -124,6 +124,7 @@ sxiccmu_match(struct device *parent, voi
        return (OF_is_compatible(node, "allwinner,sun4i-a10-ccu") ||
            OF_is_compatible(node, "allwinner,sun7i-a20-ccu") ||
            OF_is_compatible(node, "allwinner,sun8i-a23-ccu") ||
+           OF_is_compatible(node, "allwinner,sun8i-a23-prcm") ||
            OF_is_compatible(node, "allwinner,sun8i-a33-ccu") ||
            OF_is_compatible(node, "allwinner,sun8i-h3-ccu") ||
            OF_is_compatible(node, "allwinner,sun8i-h3-r-ccu") ||
@@ -218,7 +219,7 @@ sxiccmu_attach(struct device *parent, st
                sc->sc_set_frequency = sxiccmu_a64_set_frequency;
        } else {
                for (node = OF_child(node); node; node = OF_peer(node))
-                       sxiccmu_attach_clock(sc, node);
+                       sxiccmu_attach_clock(sc, node, faa->fa_nreg);
        }
 
        if (sc->sc_gates) {
@@ -259,6 +260,7 @@ struct sxiccmu_device {
        int     (*set_frequency)(void *, uint32_t *, uint32_t);
        void    (*enable)(void *, uint32_t *, int);
        void    (*reset)(void *, uint32_t *, int);
+       bus_size_t offset;
 };
 
 uint32_t sxiccmu_gen_get_frequency(void *, uint32_t *);
@@ -356,7 +358,8 @@ struct sxiccmu_device sxiccmu_devices[] 
        },
        {
                .compat = "allwinner,sun6i-a31-clock-reset",
-               .reset = sxiccmu_reset
+               .reset = sxiccmu_reset,
+               .offset = 0x00b0
        },
        {
                .compat = "allwinner,sun7i-a20-ahb-gates-clk",
@@ -379,7 +382,8 @@ struct sxiccmu_device sxiccmu_devices[] 
        },
        {
                .compat = "allwinner,sun8i-a23-apb0-clk",
-               .get_frequency = sxiccmu_apbs_get_frequency
+               .get_frequency = sxiccmu_apbs_get_frequency,
+               .offset = 0x000c
        },
        {
                .compat = "allwinner,sun8i-a23-ahb1-gates-clk",
@@ -389,7 +393,8 @@ struct sxiccmu_device sxiccmu_devices[] 
        {
                .compat = "allwinner,sun8i-a23-apb0-gates-clk",
                .get_frequency = sxiccmu_gen_get_frequency,
-               .enable = sxiccmu_gate_enable
+               .enable = sxiccmu_gate_enable,
+               .offset = 0x0028
        },
        {
                .compat = "allwinner,sun8i-a23-apb1-gates-clk",
@@ -470,11 +475,11 @@ struct sxiccmu_device sxiccmu_devices[] 
 };
 
 void
-sxiccmu_attach_clock(struct sxiccmu_softc *sc, int node)
+sxiccmu_attach_clock(struct sxiccmu_softc *sc, int node, int nreg)
 {
        struct sxiccmu_clock *clock;
        uint32_t reg[2];
-       int i;
+       int i, error = ENODEV;
 
        for (i = 0; i < nitems(sxiccmu_devices); i++)
                if (OF_is_compatible(node, sxiccmu_devices[i].compat))
@@ -485,14 +490,18 @@ sxiccmu_attach_clock(struct sxiccmu_soft
        clock = malloc(sizeof(*clock), M_DEVBUF, M_WAITOK);
        clock->sc_node = node;
 
+       clock->sc_iot = sc->sc_iot;
        if (OF_getpropintarray(node, "reg", reg, sizeof(reg)) == sizeof(reg)) {
-               clock->sc_iot = sc->sc_iot;
-               if (bus_space_map(clock->sc_iot, reg[0], reg[1], 0,
-                   &clock->sc_ioh)) {
-                       printf("%s: can't map registers", sc->sc_dev.dv_xname);
-                       free(clock, M_DEVBUF, sizeof(*clock));
-                       return;
-               }
+               error = bus_space_map(clock->sc_iot, reg[0], reg[1], 0,
+                   &clock->sc_ioh);
+       } else if (nreg > 0) {
+               error = bus_space_subregion(clock->sc_iot, sc->sc_ioh,
+                   sxiccmu_devices[i].offset, 4, &clock->sc_ioh);
+       }
+       if (error) {
+               printf("%s: can't map registers", sc->sc_dev.dv_xname);
+               free(clock, M_DEVBUF, sizeof(*clock));
+               return;
        }
 
        clock->sc_cd.cd_node = node;

Reply via email to