- Introduce an uart_cpu_identify() which is implemented in uart_cpu_<arch>.c
and that can be used as an identify function for all kinds of busses on a certain platform. Expect for sparc64 these are only stubs right now. [1] - For sparc64, add code to its uart_cpu_identify() for registering the on- board ISA UARTs and their resources based on information obtained from Open Firmware. It would be better if this would be done in the OFW ISA code. However, due to the common FreeBSD ISA code and PNP-IDs not always being present in the properties of the ISA nodes there seems to be no good way to implement that. Therefore special casing UARTs as the sole really relevant ISA devices on sparc64 seemed reasonable. [2] Approved by: marcel Discussed with: marcel [1], tmm [2] Tested by: make universe
This commit is contained in:
parent
a3cb350a8c
commit
e7f46aca57
@ -39,11 +39,13 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <dev/uart/uart.h>
|
#include <dev/uart/uart.h>
|
||||||
#include <dev/uart/uart_bus.h>
|
#include <dev/uart/uart_bus.h>
|
||||||
|
#include <dev/uart/uart_cpu.h>
|
||||||
|
|
||||||
static int uart_isa_probe(device_t dev);
|
static int uart_isa_probe(device_t dev);
|
||||||
|
|
||||||
static device_method_t uart_isa_methods[] = {
|
static device_method_t uart_isa_methods[] = {
|
||||||
/* Device interface */
|
/* Device interface */
|
||||||
|
DEVMETHOD(device_identify, uart_cpu_identify),
|
||||||
DEVMETHOD(device_probe, uart_isa_probe),
|
DEVMETHOD(device_probe, uart_isa_probe),
|
||||||
DEVMETHOD(device_attach, uart_bus_attach),
|
DEVMETHOD(device_attach, uart_bus_attach),
|
||||||
DEVMETHOD(device_detach, uart_bus_detach),
|
DEVMETHOD(device_detach, uart_bus_detach),
|
||||||
|
@ -75,6 +75,7 @@ int uart_cpu_getdev(int, struct uart_devinfo *);
|
|||||||
int uart_getenv(int, struct uart_devinfo *);
|
int uart_getenv(int, struct uart_devinfo *);
|
||||||
|
|
||||||
void uart_add_sysdev(struct uart_devinfo *);
|
void uart_add_sysdev(struct uart_devinfo *);
|
||||||
|
void uart_cpu_identify(driver_t *, device_t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Operations for low-level access to the UART. Primarily for use
|
* Operations for low-level access to the UART. Primarily for use
|
||||||
|
@ -123,3 +123,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -99,3 +99,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -99,3 +99,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -104,3 +104,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
/* Check the environment. */
|
/* Check the environment. */
|
||||||
return (uart_getenv(devtype, di));
|
return (uart_getenv(devtype, di));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -104,3 +104,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -27,18 +27,28 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include "opt_isa.h"
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
|
||||||
#include <machine/bus.h>
|
#include <machine/bus.h>
|
||||||
#include <machine/bus_private.h>
|
#include <machine/bus_private.h>
|
||||||
|
#include <machine/resource.h>
|
||||||
|
|
||||||
|
#include <dev/ofw/ofw_bus.h>
|
||||||
#include <dev/ofw/openfirm.h>
|
#include <dev/ofw/openfirm.h>
|
||||||
#include <machine/ofw_machdep.h>
|
#include <machine/ofw_machdep.h>
|
||||||
|
|
||||||
|
#include <isa/isavar.h>
|
||||||
|
|
||||||
#include <dev/uart/uart.h>
|
#include <dev/uart/uart.h>
|
||||||
|
#include <dev/uart/uart_bus.h>
|
||||||
#include <dev/uart/uart_cpu.h>
|
#include <dev/uart/uart_cpu.h>
|
||||||
|
|
||||||
|
#include <sparc64/pci/ofw_pci.h>
|
||||||
|
#include <sparc64/isa/ofw_isa.h>
|
||||||
|
|
||||||
bus_space_tag_t uart_bus_space_io;
|
bus_space_tag_t uart_bus_space_io;
|
||||||
bus_space_tag_t uart_bus_space_mem;
|
bus_space_tag_t uart_bus_space_mem;
|
||||||
|
|
||||||
@ -240,3 +250,39 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||||||
(par == 'o') ? UART_PARITY_ODD : UART_PARITY_EVEN;
|
(par == 'o') ? UART_PARITY_ODD : UART_PARITY_EVEN;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uart_cpu_identify(driver_t *driver, device_t parent)
|
||||||
|
{
|
||||||
|
#ifdef DEV_ISA
|
||||||
|
char buf[32];
|
||||||
|
struct isa_regs reg;
|
||||||
|
device_t child;
|
||||||
|
phandle_t node;
|
||||||
|
ofw_isa_intr_t intr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEV_ISA
|
||||||
|
if (strcmp(device_get_name(parent), "isa") == 0) {
|
||||||
|
if ((node = ofw_bus_get_node(device_get_parent(parent))) == 0)
|
||||||
|
return;
|
||||||
|
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
|
||||||
|
if (OF_getprop(node, "name", buf, sizeof(buf)) == -1)
|
||||||
|
continue;
|
||||||
|
if (strcmp(buf, "serial") != 0)
|
||||||
|
continue;
|
||||||
|
if ((OF_getprop(node, "reg", ®,
|
||||||
|
sizeof(reg)) == -1) ||
|
||||||
|
(OF_getprop(node, "interrupts", &intr,
|
||||||
|
sizeof(intr)) == -1))
|
||||||
|
continue;
|
||||||
|
if ((child = BUS_ADD_CHILD(parent, ISA_ORDER_SENSITIVE,
|
||||||
|
uart_driver_name, -1)) == NULL)
|
||||||
|
return;
|
||||||
|
bus_set_resource(child, SYS_RES_IOPORT, 0,
|
||||||
|
ISA_REG_PHYS(®), reg.size);
|
||||||
|
bus_set_resource(child, SYS_RES_IRQ, 0, intr, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
.if ${MACHINE_ARCH} == "sparc64"
|
.if ${MACHINE_ARCH} == "sparc64"
|
||||||
uart_bus_ebus= uart_bus_ebus.c
|
uart_bus_ebus= uart_bus_ebus.c
|
||||||
ofw_bus_if= ofw_bus_if.h
|
ofw_bus_if= ofw_bus_if.h
|
||||||
|
ofw_pci_if= ofw_pci_if.h
|
||||||
|
opt_isa= opt_isa.h
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
KMOD= uart
|
KMOD= uart
|
||||||
@ -12,7 +14,10 @@ SRCS= uart_bus_acpi.c ${uart_bus_ebus} uart_bus_isa.c uart_bus_pccard.c \
|
|||||||
uart_bus_pci.c uart_bus_puc.c uart_core.c uart_cpu_${MACHINE}.c \
|
uart_bus_pci.c uart_bus_puc.c uart_core.c uart_cpu_${MACHINE}.c \
|
||||||
uart_dbg.c uart_dev_i8251.c uart_dev_ns8250.c uart_dev_sab82532.c \
|
uart_dbg.c uart_dev_i8251.c uart_dev_ns8250.c uart_dev_sab82532.c \
|
||||||
uart_dev_z8530.c uart_if.c uart_subr.c uart_tty.c
|
uart_dev_z8530.c uart_if.c uart_subr.c uart_tty.c
|
||||||
SRCS+= bus_if.h card_if.h device_if.h isa_if.h ${ofw_bus_if} pci_if.h \
|
SRCS+= bus_if.h card_if.h device_if.h isa_if.h ${ofw_bus_if} ${ofw_pci_if} \
|
||||||
power_if.h uart_if.h pccarddevs.h
|
${opt_isa} pci_if.h power_if.h uart_if.h pccarddevs.h
|
||||||
|
|
||||||
|
opt_isa.h:
|
||||||
|
echo "#define DEV_ISA 1" > ${.TARGET}
|
||||||
|
|
||||||
.include <bsd.kmod.mk>
|
.include <bsd.kmod.mk>
|
||||||
|
Loading…
Reference in New Issue
Block a user