xref: /openbsd-src/sys/arch/armv7/marvell/mvsysctrl.c (revision 9fdf0c627b1fec102f212f847a6f7676c1829e65)
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