xref: /openbsd-src/sys/arch/armv7/omap/omap.c (revision 9fdf0c627b1fec102f212f847a6f7676c1829e65)
1*9fdf0c62Smpi /* $OpenBSD: omap.c,v 1.24 2021/10/24 17:52:27 mpi Exp $ */
28eda2d14Spatrick /*
31e299ff1Stb  * Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.org>
48eda2d14Spatrick  *
58eda2d14Spatrick  * Permission to use, copy, modify, and distribute this software for any
68eda2d14Spatrick  * purpose with or without fee is hereby granted, provided that the above
78eda2d14Spatrick  * copyright notice and this permission notice appear in all copies.
88eda2d14Spatrick  *
98eda2d14Spatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108eda2d14Spatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118eda2d14Spatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128eda2d14Spatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138eda2d14Spatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148eda2d14Spatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158eda2d14Spatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168eda2d14Spatrick  */
178eda2d14Spatrick 
188eda2d14Spatrick #include <sys/param.h>
198eda2d14Spatrick #include <sys/systm.h>
208d957e1aSsyl 
218eda2d14Spatrick #include <machine/bus.h>
228eda2d14Spatrick 
234eab9aacSpatrick #include <arm/mainbus/mainbus.h>
248d957e1aSsyl #include <armv7/armv7/armv7var.h>
258eda2d14Spatrick 
263c133ad4Sjsg #include <dev/ofw/fdt.h>
273c133ad4Sjsg 
2830a044c5Sjsg int	omap_match(struct device *, void *, void *);
2937e35e27Sjsg void	omap3_init(void);
3037e35e27Sjsg void	omap4_init(void);
3137e35e27Sjsg void	am335x_init(void);
32f93d18d6Sjsg 
33*9fdf0c62Smpi const struct cfattach omap_ca = {
3430a044c5Sjsg 	sizeof(struct armv7_softc), omap_match, armv7_attach
358eda2d14Spatrick };
368eda2d14Spatrick 
378eda2d14Spatrick struct cfdriver omap_cd = {
388eda2d14Spatrick 	NULL, "omap", DV_DULL
398eda2d14Spatrick };
408eda2d14Spatrick 
413c133ad4Sjsg struct board_dev omap3_dev[] = {
422cb278daSjsg 	{ "prcm",	0 },
432cb278daSjsg 	{ "gptimer",	0 },
442cb278daSjsg 	{ "gptimer",	1 },
452cb278daSjsg 	{ NULL,		0 }
462cb278daSjsg };
472cb278daSjsg 
483c133ad4Sjsg struct board_dev am33xx_dev[] = {
492cb278daSjsg 	{ "prcm",	0 },
502cb278daSjsg 	{ "dmtimer",	0 },
512cb278daSjsg 	{ "dmtimer",	1 },
522cb278daSjsg 	{ NULL,		0 }
532cb278daSjsg };
542cb278daSjsg 
553c133ad4Sjsg struct board_dev omap4_dev[] = {
562cb278daSjsg 	{ "omapid",	0 },
572cb278daSjsg 	{ "prcm",	0 },
582cb278daSjsg 	{ NULL,		0 }
592cb278daSjsg };
602cb278daSjsg 
613c133ad4Sjsg struct omap_soc {
623c133ad4Sjsg 	char			*compatible;
633c133ad4Sjsg 	struct board_dev	*devs;
643c133ad4Sjsg 	void			(*init)(void);
653c133ad4Sjsg };
663c133ad4Sjsg 
673c133ad4Sjsg struct omap_soc omap_socs[] = {
682cb278daSjsg 	{
693c133ad4Sjsg 		"ti,omap3",
703c133ad4Sjsg 		omap3_dev,
712cb278daSjsg 		omap3_init,
722cb278daSjsg 	},
732cb278daSjsg 	{
743c133ad4Sjsg 		"ti,am33xx",
753c133ad4Sjsg 		am33xx_dev,
762cb278daSjsg 		am335x_init,
772cb278daSjsg 	},
782cb278daSjsg 	{
793c133ad4Sjsg 		"ti,omap4",
803c133ad4Sjsg 		omap4_dev,
812cb278daSjsg 		omap4_init,
822cb278daSjsg 	},
833c133ad4Sjsg 	{ NULL, NULL, NULL },
842cb278daSjsg };
852cb278daSjsg 
862cb278daSjsg struct board_dev *
omap_board_devs(void)87f93d18d6Sjsg omap_board_devs(void)
88f93d18d6Sjsg {
893c133ad4Sjsg 	void *node;
90f93d18d6Sjsg 	int i;
91f93d18d6Sjsg 
923c133ad4Sjsg 	node = fdt_find_node("/");
933c133ad4Sjsg 	if (node == NULL)
943c133ad4Sjsg 		return NULL;
953c133ad4Sjsg 
963c133ad4Sjsg 	for (i = 0; omap_socs[i].compatible != NULL; i++) {
973c133ad4Sjsg 		if (fdt_is_compatible(node, omap_socs[i].compatible))
983c133ad4Sjsg 			return omap_socs[i].devs;
99f93d18d6Sjsg 	}
1003c133ad4Sjsg 	return NULL;
101f93d18d6Sjsg }
102f93d18d6Sjsg 
103f93d18d6Sjsg void
omap_board_init(void)104f93d18d6Sjsg omap_board_init(void)
1052cb278daSjsg {
1063c133ad4Sjsg 	void *node;
1072cb278daSjsg 	int i;
1082cb278daSjsg 
1093c133ad4Sjsg 	node = fdt_find_node("/");
1103c133ad4Sjsg 	if (node == NULL)
1113c133ad4Sjsg 		return;
1123c133ad4Sjsg 
1133c133ad4Sjsg 	for (i = 0; omap_socs[i].compatible != NULL; i++) {
1143c133ad4Sjsg 		if (fdt_is_compatible(node, omap_socs[i].compatible)) {
1153c133ad4Sjsg 			omap_socs[i].init();
1162cb278daSjsg 			break;
1172cb278daSjsg 		}
1182cb278daSjsg 	}
1192cb278daSjsg }
1202cb278daSjsg 
12130a044c5Sjsg int
omap_match(struct device * parent,void * cfdata,void * aux)12230a044c5Sjsg omap_match(struct device *parent, void *cfdata, void *aux)
12330a044c5Sjsg {
1244eab9aacSpatrick 	union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
1254eab9aacSpatrick 	struct cfdata *cf = (struct cfdata *)cfdata;
1264eab9aacSpatrick 
1274eab9aacSpatrick 	if (ma->ma_name == NULL)
1284eab9aacSpatrick 		return (0);
1294eab9aacSpatrick 
1304eab9aacSpatrick 	if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
1314eab9aacSpatrick 		return (0);
1324eab9aacSpatrick 
13330a044c5Sjsg 	return (omap_board_devs() != NULL);
13430a044c5Sjsg }
135