Date: Sat, 27 Apr 2013 06:54:50 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r249973 - head/sys/powerpc/wii Message-ID: <201304270654.r3R6sov4057590@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rpaulo Date: Sat Apr 27 06:54:49 2013 New Revision: 249973 URL: http://svnweb.freebsd.org/changeset/base/249973 Log: Add reset support to the Wii. Modified: head/sys/powerpc/wii/platform_wii.c head/sys/powerpc/wii/wii_bus.c Modified: head/sys/powerpc/wii/platform_wii.c ============================================================================== --- head/sys/powerpc/wii/platform_wii.c Sat Apr 27 06:09:13 2013 (r249972) +++ head/sys/powerpc/wii/platform_wii.c Sat Apr 27 06:54:49 2013 (r249973) @@ -58,9 +58,11 @@ static int wii_probe(platform_t); static int wii_attach(platform_t); static void wii_mem_regions(platform_t, struct mem_region **, int *, struct mem_region **, int *); -static unsigned long wii_timebase_freq(platform_t, struct cpuref *cpuref); +static unsigned long wii_timebase_freq(platform_t, struct cpuref *); static void wii_reset(platform_t); -static void wii_cpu_idle(sbintime_t sbt); +static void wii_cpu_idle(sbintime_t); + +extern void wiibus_reset_system(void); static platform_method_t wii_methods[] = { PLATFORMMETHOD(platform_probe, wii_probe), @@ -150,8 +152,10 @@ wii_timebase_freq(platform_t plat, struc } static void -wii_reset(platform_t plat) +wii_reset(platform_t plat __unused) { + + wiibus_reset_system(); } static void Modified: head/sys/powerpc/wii/wii_bus.c ============================================================================== --- head/sys/powerpc/wii/wii_bus.c Sat Apr 27 06:09:13 2013 (r249972) +++ head/sys/powerpc/wii/wii_bus.c Sat Apr 27 06:54:49 2013 (r249973) @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include <machine/platform.h> #include <machine/pmap.h> #include <machine/resource.h> +#include <machine/platformvar.h> #include <powerpc/wii/wii_picreg.h> #include <powerpc/wii/wii_fbreg.h> @@ -51,6 +52,21 @@ __FBSDID("$FreeBSD$"); #include <powerpc/wii/wii_ipcreg.h> #include <powerpc/wii/wii_gpioreg.h> +#define WIIBUS_CSR_ADDR 0x0d800100 +#define WIIBUS_CSR_LEN 0x300 +#define WIIBUS_CSR_RESET 0x94 + +struct wiibus_softc { + device_t sc_dev; + struct rman sc_rman; + bus_space_tag_t sc_tag; + bus_space_handle_t sc_handle; +}; + +static struct wiibus_softc *wiibus_sc = NULL; + +static uint32_t wiibus_csr_read(struct wiibus_softc *, uint16_t); +static void wiibus_csr_write(struct wiibus_softc *, uint16_t, uint32_t); static void wiibus_identify(driver_t *, device_t); static int wiibus_probe(device_t); static int wiibus_attach(device_t); @@ -61,6 +77,7 @@ static struct resource * unsigned int); static int wiibus_activate_resource(device_t, device_t, int, int, struct resource *); + void wiibus_reset_system(void); static device_method_t wiibus_methods[] = { /* Device interface */ @@ -79,11 +96,6 @@ static device_method_t wiibus_methods[] DEVMETHOD_END }; -struct wiibus_softc { - device_t sc_dev; - struct rman sc_rman; -}; - static MALLOC_DEFINE(M_WIIBUS, "wiibus", "Nintendo Wii system bus"); struct wiibus_devinfo { @@ -101,6 +113,21 @@ static devclass_t wiibus_devclass; DRIVER_MODULE(wiibus, nexus, wiibus_driver, wiibus_devclass, 0, 0); +static uint32_t +wiibus_csr_read(struct wiibus_softc *sc, uint16_t reg) +{ + + return (bus_space_read_4(sc->sc_tag, sc->sc_handle, reg)); +} + +static void +wiibus_csr_write(struct wiibus_softc *sc, uint16_t reg, + uint32_t val) +{ + + bus_space_write_4(sc->sc_tag, sc->sc_handle, reg, val); +} + static void wiibus_identify(driver_t *driver, device_t parent) { @@ -153,6 +180,8 @@ wiibus_attach(device_t self) sc->sc_rman.rm_type = RMAN_ARRAY; sc->sc_rman.rm_descr = "Wii Bus Memory Mapped I/O"; rman_init(&sc->sc_rman); + KASSERT(wiibus_sc == NULL, ("wiibus_sc already initialised")); + wiibus_sc = sc; /* Nintendo PIC */ dinfo = malloc(sizeof(*dinfo), M_WIIBUS, M_WAITOK | M_ZERO); @@ -193,6 +222,11 @@ wiibus_attach(device_t self) cdev = BUS_ADD_CHILD(self, 0, "wiigpio", 0); device_set_ivars(cdev, dinfo); + /* The control registers */ + sc->sc_tag = &bs_be_tag; + sc->sc_handle = (bus_space_handle_t)pmap_mapdev(WIIBUS_CSR_ADDR, + WIIBUS_CSR_LEN); + return (bus_generic_attach(self)); } @@ -295,3 +329,12 @@ wiibus_activate_resource(device_t bus, d return (rman_activate_resource(res)); } +void +wiibus_reset_system(void) +{ + uint32_t r; + + r = wiibus_csr_read(wiibus_sc, WIIBUS_CSR_RESET); + r &= ~1; + wiibus_csr_write(wiibus_sc, WIIBUS_CSR_RESET, r); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304270654.r3R6sov4057590>