1af3dc4a7SPedro F. Giffuni /*-
20050ea24SMichal Meloun * Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.org>
3af3dc4a7SPedro F. Giffuni *
40050ea24SMichal Meloun * Copyright (c) 2020 Oskar Holmlund <oskar.holmlund@ohdata.se>
5e53470feSOleksandr Tymoshenko *
6e53470feSOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without
7e53470feSOleksandr Tymoshenko * modification, are permitted provided that the following conditions
8e53470feSOleksandr Tymoshenko * are met:
9e53470feSOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright
10e53470feSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer.
11e53470feSOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright
12e53470feSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the
13e53470feSOleksandr Tymoshenko * documentation and/or other materials provided with the distribution.
14e53470feSOleksandr Tymoshenko *
150050ea24SMichal Meloun * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16e53470feSOleksandr Tymoshenko * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17e53470feSOleksandr Tymoshenko * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
180050ea24SMichal Meloun * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
190050ea24SMichal Meloun * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
200050ea24SMichal Meloun * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
210050ea24SMichal Meloun * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
220050ea24SMichal Meloun * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
230050ea24SMichal Meloun * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
240050ea24SMichal Meloun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
250050ea24SMichal Meloun * SUCH DAMAGE.
26e53470feSOleksandr Tymoshenko */
27e53470feSOleksandr Tymoshenko
28e53470feSOleksandr Tymoshenko #include <sys/cdefs.h>
290050ea24SMichal Meloun /* Based on sys/arm/ti/ti_sysc.c */
300050ea24SMichal Meloun
31e53470feSOleksandr Tymoshenko #include <sys/param.h>
32e53470feSOleksandr Tymoshenko #include <sys/systm.h>
330050ea24SMichal Meloun #include <sys/bus.h>
340050ea24SMichal Meloun #include <sys/fbio.h>
35e53470feSOleksandr Tymoshenko #include <sys/kernel.h>
36e53470feSOleksandr Tymoshenko #include <sys/module.h>
37e53470feSOleksandr Tymoshenko #include <sys/rman.h>
380050ea24SMichal Meloun #include <sys/resource.h>
39e53470feSOleksandr Tymoshenko #include <machine/bus.h>
400050ea24SMichal Meloun #include <vm/vm.h>
410050ea24SMichal Meloun #include <vm/vm_extern.h>
420050ea24SMichal Meloun #include <vm/vm_kern.h>
430050ea24SMichal Meloun #include <vm/pmap.h>
44e53470feSOleksandr Tymoshenko
450050ea24SMichal Meloun #include <dev/fdt/simplebus.h>
460050ea24SMichal Meloun
47e53470feSOleksandr Tymoshenko #include <dev/ofw/ofw_bus.h>
48e53470feSOleksandr Tymoshenko #include <dev/ofw/ofw_bus_subr.h>
49e53470feSOleksandr Tymoshenko
500050ea24SMichal Meloun #define TI_AM3_SCM 14
510050ea24SMichal Meloun #define TI_AM4_SCM 13
520050ea24SMichal Meloun #define TI_DM814_SCRM 12
530050ea24SMichal Meloun #define TI_DM816_SCRM 11
540050ea24SMichal Meloun #define TI_OMAP2_SCM 10
550050ea24SMichal Meloun #define TI_OMAP3_SCM 9
560050ea24SMichal Meloun #define TI_OMAP4_SCM_CORE 8
570050ea24SMichal Meloun #define TI_OMAP4_SCM_PADCONF_CORE 7
580050ea24SMichal Meloun #define TI_OMAP4_SCM_WKUP 6
590050ea24SMichal Meloun #define TI_OMAP4_SCM_PADCONF_WKUP 5
600050ea24SMichal Meloun #define TI_OMAP5_SCM_CORE 4
610050ea24SMichal Meloun #define TI_OMAP5_SCM_PADCONF_CORE 3
620050ea24SMichal Meloun #define TI_OMAP5_SCM_WKUP_PAD_CONF 2
630050ea24SMichal Meloun #define TI_DRA7_SCM_CORE 1
640050ea24SMichal Meloun #define TI_SCM_END 0
65e53470feSOleksandr Tymoshenko
660050ea24SMichal Meloun static struct ofw_compat_data compat_data[] = {
670050ea24SMichal Meloun { "ti,am3-scm", TI_AM3_SCM },
680050ea24SMichal Meloun { "ti,am4-scm", TI_AM4_SCM },
690050ea24SMichal Meloun { "ti,dm814-scrm", TI_DM814_SCRM },
700050ea24SMichal Meloun { "ti,dm816-scrm", TI_DM816_SCRM },
710050ea24SMichal Meloun { "ti,omap2-scm", TI_OMAP2_SCM },
720050ea24SMichal Meloun { "ti,omap3-scm", TI_OMAP3_SCM },
730050ea24SMichal Meloun { "ti,omap4-scm-core", TI_OMAP4_SCM_CORE },
740050ea24SMichal Meloun { "ti,omap4-scm-padconf-core", TI_OMAP4_SCM_PADCONF_CORE },
750050ea24SMichal Meloun { "ti,omap4-scm-wkup", TI_OMAP4_SCM_WKUP },
760050ea24SMichal Meloun { "ti,omap4-scm-padconf-wkup", TI_OMAP4_SCM_PADCONF_WKUP },
770050ea24SMichal Meloun { "ti,omap5-scm-core", TI_OMAP5_SCM_CORE },
780050ea24SMichal Meloun { "ti,omap5-scm-padconf-core", TI_OMAP5_SCM_PADCONF_CORE },
790050ea24SMichal Meloun { "ti,omap5-scm-wkup-pad-conf", TI_OMAP5_SCM_WKUP_PAD_CONF },
800050ea24SMichal Meloun { "ti,dra7-scm-core", TI_DRA7_SCM_CORE },
810050ea24SMichal Meloun { NULL, TI_SCM_END }
82e53470feSOleksandr Tymoshenko };
83e53470feSOleksandr Tymoshenko
840050ea24SMichal Meloun struct ti_scm_softc {
850050ea24SMichal Meloun struct simplebus_softc sc;
860050ea24SMichal Meloun device_t dev;
870050ea24SMichal Meloun };
88e53470feSOleksandr Tymoshenko
890050ea24SMichal Meloun static int ti_scm_probe(device_t dev);
900050ea24SMichal Meloun static int ti_scm_attach(device_t dev);
910050ea24SMichal Meloun static int ti_scm_detach(device_t dev);
92e53470feSOleksandr Tymoshenko
93e53470feSOleksandr Tymoshenko static int
ti_scm_probe(device_t dev)94e53470feSOleksandr Tymoshenko ti_scm_probe(device_t dev)
95e53470feSOleksandr Tymoshenko {
96add35ed5SIan Lepore if (!ofw_bus_status_okay(dev))
97add35ed5SIan Lepore return (ENXIO);
98add35ed5SIan Lepore
990050ea24SMichal Meloun if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
100e53470feSOleksandr Tymoshenko return (ENXIO);
101e53470feSOleksandr Tymoshenko
1020050ea24SMichal Meloun device_set_desc(dev, "TI OMAP Control Module");
1035b03aba6SOleksandr Tymoshenko
104e53470feSOleksandr Tymoshenko return (BUS_PROBE_DEFAULT);
105e53470feSOleksandr Tymoshenko }
106e53470feSOleksandr Tymoshenko
107e53470feSOleksandr Tymoshenko static int
ti_scm_attach(device_t dev)108e53470feSOleksandr Tymoshenko ti_scm_attach(device_t dev)
109e53470feSOleksandr Tymoshenko {
1100050ea24SMichal Meloun struct ti_scm_softc *sc;
1110050ea24SMichal Meloun device_t cdev;
1120050ea24SMichal Meloun phandle_t node, child;
113e53470feSOleksandr Tymoshenko
1140050ea24SMichal Meloun sc = device_get_softc(dev);
1150050ea24SMichal Meloun sc->dev = dev;
1160050ea24SMichal Meloun node = ofw_bus_get_node(dev);
117e53470feSOleksandr Tymoshenko
1180050ea24SMichal Meloun simplebus_init(dev, node);
1190050ea24SMichal Meloun if (simplebus_fill_ranges(node, &sc->sc) < 0) {
1200050ea24SMichal Meloun device_printf(dev, "could not get ranges\n");
121e53470feSOleksandr Tymoshenko return (ENXIO);
122e53470feSOleksandr Tymoshenko }
123e53470feSOleksandr Tymoshenko
1240050ea24SMichal Meloun for (child = OF_child(node); child > 0; child = OF_peer(child)) {
1250050ea24SMichal Meloun cdev = simplebus_add_device(dev, child, 0, NULL, -1, NULL);
1260050ea24SMichal Meloun if (cdev != NULL)
1270050ea24SMichal Meloun device_probe_and_attach(cdev);
1280050ea24SMichal Meloun }
12973e69441SLuiz Otavio O Souza
130*18250ec6SJohn Baldwin bus_attach_children(dev);
131*18250ec6SJohn Baldwin return (0);
132e53470feSOleksandr Tymoshenko }
133e53470feSOleksandr Tymoshenko
1340050ea24SMichal Meloun static int
ti_scm_detach(device_t dev)1350050ea24SMichal Meloun ti_scm_detach(device_t dev)
136e53470feSOleksandr Tymoshenko {
1370050ea24SMichal Meloun return (EBUSY);
138e53470feSOleksandr Tymoshenko }
139e53470feSOleksandr Tymoshenko
140e53470feSOleksandr Tymoshenko static device_method_t ti_scm_methods[] = {
1410050ea24SMichal Meloun /* Device interface */
142e53470feSOleksandr Tymoshenko DEVMETHOD(device_probe, ti_scm_probe),
143e53470feSOleksandr Tymoshenko DEVMETHOD(device_attach, ti_scm_attach),
1440050ea24SMichal Meloun DEVMETHOD(device_detach, ti_scm_detach),
1455b03aba6SOleksandr Tymoshenko
1460050ea24SMichal Meloun DEVMETHOD_END
147e53470feSOleksandr Tymoshenko };
148e53470feSOleksandr Tymoshenko
1490050ea24SMichal Meloun DEFINE_CLASS_1(ti_scm, ti_scm_driver, ti_scm_methods,
1500050ea24SMichal Meloun sizeof(struct ti_scm_softc), simplebus_driver);
151e53470feSOleksandr Tymoshenko
1528537e671SJohn Baldwin EARLY_DRIVER_MODULE(ti_scm, simplebus, ti_scm_driver, 0, 0,
1538537e671SJohn Baldwin BUS_PASS_BUS + BUS_PASS_ORDER_FIRST);
1540050ea24SMichal Meloun MODULE_VERSION(ti_scm, 1);
1550050ea24SMichal Meloun MODULE_DEPEND(ti_scm, ti_sysc, 1, 1, 1);
156