diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-06-19 14:27:36 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-06-19 14:27:36 +0000 |
commit | 67fceb1ed80b1388f6181f05ce55e2889ab60e71 (patch) | |
tree | ab9a1a3f0af205f67ad25f233ec710365a310bce /sys/arch/armv7/omap | |
parent | 0227fedc1b7883abeed6fc4b263160d3ef70ad63 (diff) |
dynamically attach omap uart with fdt
Diffstat (limited to 'sys/arch/armv7/omap')
-rw-r--r-- | sys/arch/armv7/omap/files.omap | 4 | ||||
-rw-r--r-- | sys/arch/armv7/omap/omap.c | 6 | ||||
-rw-r--r-- | sys/arch/armv7/omap/omap_com.c | 34 |
3 files changed, 30 insertions, 14 deletions
diff --git a/sys/arch/armv7/omap/files.omap b/sys/arch/armv7/omap/files.omap index 712aedf40f4..092b27e67b5 100644 --- a/sys/arch/armv7/omap/files.omap +++ b/sys/arch/armv7/omap/files.omap @@ -1,4 +1,4 @@ -# $OpenBSD: files.omap,v 1.9 2016/06/18 05:59:26 jsg Exp $ +# $OpenBSD: files.omap,v 1.10 2016/06/19 14:27:35 jsg Exp $ define omap {} device omap: omap @@ -65,7 +65,7 @@ attach ehci at omap with omehci file arch/armv7/omap/omehci.c omehci # NS16550 compatible serial ports -attach com at omap with com_omap +attach com at fdt with com_omap file arch/armv7/omap/omap_com.c com_omap device omusbtll diff --git a/sys/arch/armv7/omap/omap.c b/sys/arch/armv7/omap/omap.c index 30690dba403..67d407f60b7 100644 --- a/sys/arch/armv7/omap/omap.c +++ b/sys/arch/armv7/omap/omap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: omap.c,v 1.11 2016/06/18 05:59:26 jsg Exp $ */ +/* $OpenBSD: omap.c,v 1.12 2016/06/19 14:27:35 jsg Exp $ */ /* * Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.com> * @@ -48,7 +48,6 @@ struct board_dev beagleboard_devs[] = { { "omgpio", 3 }, { "omgpio", 4 }, { "omgpio", 5 }, - { "com", 2 }, /* UART3 */ { NULL, 0 } }; @@ -67,7 +66,6 @@ struct board_dev beaglebone_devs[] = { { "tiiic", 0 }, { "tiiic", 1 }, { "tiiic", 2 }, - { "com", 0 }, /* UART0 */ { "cpsw", 0 }, { NULL, 0 } }; @@ -84,7 +82,6 @@ struct board_dev overo_devs[] = { { "omgpio", 3 }, { "omgpio", 4 }, { "omgpio", 5 }, - { "com", 2 }, /* UART3 */ { NULL, 0 } }; @@ -98,7 +95,6 @@ struct board_dev pandaboard_devs[] = { { "omgpio", 3 }, { "omgpio", 4 }, { "omgpio", 5 }, - { "com", 2 }, /* UART3 */ { "ehci", 0 }, { NULL, 0 } }; diff --git a/sys/arch/armv7/omap/omap_com.c b/sys/arch/armv7/omap/omap_com.c index a7ee6ba427f..05aafdc2dde 100644 --- a/sys/arch/armv7/omap/omap_com.c +++ b/sys/arch/armv7/omap/omap_com.c @@ -1,4 +1,4 @@ -/* $OpenBSD: omap_com.c,v 1.3 2016/06/08 15:27:05 jsg Exp $ */ +/* $OpenBSD: omap_com.c,v 1.4 2016/06/19 14:27:35 jsg Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. * All rights reserved. @@ -41,6 +41,7 @@ #include <machine/intr.h> #include <machine/bus.h> +#include <machine/fdt.h> #include <dev/ic/comreg.h> #include <dev/ic/comvar.h> @@ -52,10 +53,12 @@ #include <armv7/armv7/armv7_machdep.h> #include <dev/ofw/fdt.h> +#include <dev/ofw/openfirm.h> #define com_isr 8 #define ISR_RECV (ISR_RXPL | ISR_XMODE | ISR_RCVEIR) +int omapuart_match(struct device *, void *, void *); void omapuart_attach(struct device *, struct device *, void *); int omapuart_activate(struct device *, int); @@ -63,7 +66,7 @@ extern int comcnspeed; extern int comcnmode; struct cfattach com_omap_ca = { - sizeof (struct com_softc), NULL, omapuart_attach, NULL, + sizeof (struct com_softc), omapuart_match, omapuart_attach, NULL, omapuart_activate }; @@ -83,26 +86,43 @@ omapuart_init_cons(void) comdefaultrate = comcnspeed; } +int +omapuart_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "ti,omap3-uart"); +} + void omapuart_attach(struct device *parent, struct device *self, void *aux) { struct com_softc *sc = (struct com_softc *)self; - struct armv7_attach_args *aa = aux; + struct fdt_attach_args *faa = aux; + int irq; + + if (faa->fa_nreg != 2 || (faa->fa_nintr != 1 && faa->fa_nintr != 3)) + return; - sc->sc_iot = &armv7_a4x_bs_tag; /* XXX: This sucks */ - sc->sc_iobase = aa->aa_dev->mem[0].addr; + sc->sc_iot = &armv7_a4x_bs_tag; /* XXX: This sucks */ + sc->sc_iobase = faa->fa_reg[0]; sc->sc_frequency = 48000000; sc->sc_uarttype = COM_UART_TI16750; + if (faa->fa_nintr == 1) + irq = faa->fa_intr[0]; + else + irq = faa->fa_intr[1]; + if (bus_space_map(sc->sc_iot, sc->sc_iobase, - aa->aa_dev->mem[0].size, 0, &sc->sc_ioh)) { + faa->fa_reg[1], 0, &sc->sc_ioh)) { printf("%s: bus_space_map failed\n", __func__); return; } com_attach_subr(sc); - (void)arm_intr_establish(aa->aa_dev->irq[0], IPL_TTY, comintr, + (void)arm_intr_establish(irq, IPL_TTY, comintr, sc, sc->sc_dev.dv_xname); } |