#include "opt_acpi.h"
#include "opt_platform.h"
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/systm.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/bus.h>
#include <dev/uart/uart.h>
#include <dev/uart/uart_bus.h>
#include <dev/uart/uart_cpu.h>
#ifdef DEV_ACPI
#include <contrib/dev/acpica/include/acpi.h>
#include <contrib/dev/acpica/include/accommon.h>
#include <contrib/dev/acpica/include/actables.h>
#include <dev/uart/uart_cpu_acpi.h>
#endif
#ifdef FDT
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#include <dev/uart/uart_cpu_fdt.h>
#endif
extern struct bus_space memmap_bus;
bus_space_tag_t uart_bus_space_io;
bus_space_tag_t uart_bus_space_mem = &memmap_bus;
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
{
if (pmap_kextract(b1->bsh) == 0)
return (0);
if (pmap_kextract(b2->bsh) == 0)
return (0);
return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? 1 : 0);
}
#ifdef FDT
static int
uart_cpu_fdt_setup(struct uart_class *class, int devtype, struct uart_devinfo *di)
{
bus_space_handle_t bsh;
bus_space_tag_t bst;
u_int rclk, shift, iowidth;
int br, err;
err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk,
&shift, &iowidth, devtype);
if (err != 0)
return (err);
di->bas.chan = 0;
di->bas.regshft = shift;
di->bas.regiowidth = iowidth;
di->baudrate = br;
di->bas.rclk = rclk;
di->ops = uart_getops(class);
di->databits = 8;
di->stopbits = 1;
di->parity = UART_PARITY_NONE;
di->bas.bst = bst;
di->bas.bsh = bsh;
uart_bus_space_mem = di->bas.bst;
uart_bus_space_io = NULL;
return (0);
}
#endif
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
struct uart_class *class;
int err;
class = &uart_ns8250_class;
err = uart_getenv(devtype, di, class);
if (err == 0)
return (0);
#ifdef DEV_ACPI
if (uart_cpu_acpi_setup(devtype, di) == 0)
return (0);
#endif
#ifdef FDT
if (uart_cpu_fdt_setup(class, devtype, di) == 0)
return (0);
#endif
return (ENXIO);
}