1*9fdf0c62Smpi /* $OpenBSD: mvsysctrl.c,v 1.2 2021/10/24 17:52:27 mpi Exp $ */
28da60cd2Spatrick /*
38da60cd2Spatrick * Copyright (c) 2016 Patrick Wildt <patrick@blueri.se>
48da60cd2Spatrick *
58da60cd2Spatrick * Permission to use, copy, modify, and distribute this software for any
68da60cd2Spatrick * purpose with or without fee is hereby granted, provided that the above
78da60cd2Spatrick * copyright notice and this permission notice appear in all copies.
88da60cd2Spatrick *
98da60cd2Spatrick * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108da60cd2Spatrick * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118da60cd2Spatrick * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128da60cd2Spatrick * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138da60cd2Spatrick * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148da60cd2Spatrick * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158da60cd2Spatrick * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168da60cd2Spatrick */
178da60cd2Spatrick
188da60cd2Spatrick #include <sys/param.h>
198da60cd2Spatrick #include <sys/systm.h>
208da60cd2Spatrick #include <sys/device.h>
218da60cd2Spatrick #include <machine/bus.h>
228da60cd2Spatrick #include <machine/fdt.h>
238da60cd2Spatrick #include <armv7/armv7/armv7_machdep.h>
248da60cd2Spatrick
258da60cd2Spatrick #include <dev/ofw/openfirm.h>
268da60cd2Spatrick #include <dev/ofw/fdt.h>
278da60cd2Spatrick
288da60cd2Spatrick #define RSTOUTN 0x60
298da60cd2Spatrick #define RSTOUTN_GLOBAL_SOFT_RSTOUT_EN 1
308da60cd2Spatrick #define SYSSOFTRST 0x64
318da60cd2Spatrick #define SYSSOFTRST_GLOBAL_SOFT_RST 1
328da60cd2Spatrick
338da60cd2Spatrick #define HREAD4(sc, reg) \
348da60cd2Spatrick (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)))
358da60cd2Spatrick #define HWRITE4(sc, reg, val) \
368da60cd2Spatrick bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
378da60cd2Spatrick #define HSET4(sc, reg, bits) \
388da60cd2Spatrick HWRITE4((sc), (reg), HREAD4((sc), (reg)) | (bits))
398da60cd2Spatrick #define HCLR4(sc, reg, bits) \
408da60cd2Spatrick HWRITE4((sc), (reg), HREAD4((sc), (reg)) & ~(bits))
418da60cd2Spatrick
428da60cd2Spatrick struct mvsysctrl_softc {
438da60cd2Spatrick struct device sc_dev;
448da60cd2Spatrick bus_space_tag_t sc_iot;
458da60cd2Spatrick bus_space_handle_t sc_ioh;
468da60cd2Spatrick };
478da60cd2Spatrick
488da60cd2Spatrick int mvsysctrl_match(struct device *, void *, void *);
498da60cd2Spatrick void mvsysctrl_attach(struct device *, struct device *, void *);
508da60cd2Spatrick
518da60cd2Spatrick void mvsysctrl_reset(void);
528da60cd2Spatrick
538da60cd2Spatrick struct mvsysctrl_softc *mvsysctrl_sc;
548da60cd2Spatrick
55*9fdf0c62Smpi const struct cfattach mvsysctrl_ca = {
568da60cd2Spatrick sizeof (struct mvsysctrl_softc), mvsysctrl_match, mvsysctrl_attach
578da60cd2Spatrick };
588da60cd2Spatrick
598da60cd2Spatrick struct cfdriver mvsysctrl_cd = {
608da60cd2Spatrick NULL, "mvsysctrl", DV_DULL
618da60cd2Spatrick };
628da60cd2Spatrick
638da60cd2Spatrick int
mvsysctrl_match(struct device * parent,void * cfdata,void * aux)648da60cd2Spatrick mvsysctrl_match(struct device *parent, void *cfdata, void *aux)
658da60cd2Spatrick {
668da60cd2Spatrick struct fdt_attach_args *faa = aux;
678da60cd2Spatrick
688da60cd2Spatrick return OF_is_compatible(faa->fa_node,
698da60cd2Spatrick "marvell,armada-370-xp-system-controller");
708da60cd2Spatrick }
718da60cd2Spatrick
728da60cd2Spatrick void
mvsysctrl_attach(struct device * parent,struct device * self,void * args)738da60cd2Spatrick mvsysctrl_attach(struct device *parent, struct device *self, void *args)
748da60cd2Spatrick {
758da60cd2Spatrick struct mvsysctrl_softc *sc = (struct mvsysctrl_softc *)self;
768da60cd2Spatrick struct fdt_attach_args *faa = args;
778da60cd2Spatrick
788da60cd2Spatrick sc->sc_iot = faa->fa_iot;
798da60cd2Spatrick if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
808da60cd2Spatrick faa->fa_reg[0].size, 0, &sc->sc_ioh))
818da60cd2Spatrick panic("%s: bus_space_map failed!", __func__);
828da60cd2Spatrick
838da60cd2Spatrick printf("\n");
848da60cd2Spatrick
858da60cd2Spatrick mvsysctrl_sc = sc;
868da60cd2Spatrick cpuresetfn = mvsysctrl_reset;
878da60cd2Spatrick }
888da60cd2Spatrick
898da60cd2Spatrick void
mvsysctrl_reset(void)908da60cd2Spatrick mvsysctrl_reset(void)
918da60cd2Spatrick {
928da60cd2Spatrick struct mvsysctrl_softc *sc = mvsysctrl_sc;
938da60cd2Spatrick
948da60cd2Spatrick HWRITE4(sc, RSTOUTN, RSTOUTN_GLOBAL_SOFT_RSTOUT_EN);
958da60cd2Spatrick HWRITE4(sc, SYSSOFTRST, SYSSOFTRST_GLOBAL_SOFT_RST);
968da60cd2Spatrick
978da60cd2Spatrick for (;;)
988da60cd2Spatrick continue;
998da60cd2Spatrick }
100