xref: /freebsd/sys/arm/ti/ti_scm.c (revision 18250ec6c089c0c50cbd9fd87d78e03ff89916df)
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