Index: stable/10/sys/arm/samsung/exynos/exynos_uart.c
===================================================================
--- stable/10/sys/arm/samsung/exynos/exynos_uart.c (revision 283322)
+++ stable/10/sys/arm/samsung/exynos/exynos_uart.c (revision 283323)
@@ -1,382 +1,382 @@
/*
* Copyright (c) 2003 Marcel Moolenaar
* Copyright (c) 2007-2009 Andrew Turner
* Copyright (c) 2013 Ruslan Bukin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include
__FBSDID("$FreeBSD$");
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "uart_if.h"
#define DEF_CLK 100000000
static int sscomspeed(long, long);
-static int s3c24x0_uart_param(struct uart_bas *, int, int, int, int);
+static int exynos4210_uart_param(struct uart_bas *, int, int, int, int);
/*
* Low-level UART interface.
*/
-static int s3c2410_probe(struct uart_bas *bas);
-static void s3c2410_init(struct uart_bas *bas, int, int, int, int);
-static void s3c2410_term(struct uart_bas *bas);
-static void s3c2410_putc(struct uart_bas *bas, int);
-static int s3c2410_rxready(struct uart_bas *bas);
-static int s3c2410_getc(struct uart_bas *bas, struct mtx *mtx);
+static int exynos4210_probe(struct uart_bas *bas);
+static void exynos4210_init(struct uart_bas *bas, int, int, int, int);
+static void exynos4210_term(struct uart_bas *bas);
+static void exynos4210_putc(struct uart_bas *bas, int);
+static int exynos4210_rxready(struct uart_bas *bas);
+static int exynos4210_getc(struct uart_bas *bas, struct mtx *mtx);
extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
static int
sscomspeed(long speed, long frequency)
{
int x;
if (speed <= 0 || frequency <= 0)
return (-1);
x = (frequency / 16) / speed;
return (x-1);
}
static int
-s3c24x0_uart_param(struct uart_bas *bas, int baudrate, int databits,
+exynos4210_uart_param(struct uart_bas *bas, int baudrate, int databits,
int stopbits, int parity)
{
int brd, ulcon;
ulcon = 0;
switch(databits) {
case 5:
ulcon |= ULCON_LENGTH_5;
break;
case 6:
ulcon |= ULCON_LENGTH_6;
break;
case 7:
ulcon |= ULCON_LENGTH_7;
break;
case 8:
ulcon |= ULCON_LENGTH_8;
break;
default:
return (EINVAL);
}
switch (parity) {
case UART_PARITY_NONE:
ulcon |= ULCON_PARITY_NONE;
break;
case UART_PARITY_ODD:
ulcon |= ULCON_PARITY_ODD;
break;
case UART_PARITY_EVEN:
ulcon |= ULCON_PARITY_EVEN;
break;
case UART_PARITY_MARK:
case UART_PARITY_SPACE:
default:
return (EINVAL);
}
if (stopbits == 2)
ulcon |= ULCON_STOP;
uart_setreg(bas, SSCOM_ULCON, ulcon);
brd = sscomspeed(baudrate, bas->rclk);
uart_setreg(bas, SSCOM_UBRDIV, brd);
return (0);
}
-struct uart_ops uart_s3c2410_ops = {
- .probe = s3c2410_probe,
- .init = s3c2410_init,
- .term = s3c2410_term,
- .putc = s3c2410_putc,
- .rxready = s3c2410_rxready,
- .getc = s3c2410_getc,
+struct uart_ops uart_exynos4210_ops = {
+ .probe = exynos4210_probe,
+ .init = exynos4210_init,
+ .term = exynos4210_term,
+ .putc = exynos4210_putc,
+ .rxready = exynos4210_rxready,
+ .getc = exynos4210_getc,
};
static int
-s3c2410_probe(struct uart_bas *bas)
+exynos4210_probe(struct uart_bas *bas)
{
return (0);
}
static void
-s3c2410_init(struct uart_bas *bas, int baudrate, int databits, int stopbits,
+exynos4210_init(struct uart_bas *bas, int baudrate, int databits, int stopbits,
int parity)
{
if (bas->rclk == 0)
bas->rclk = DEF_CLK;
- KASSERT(bas->rclk != 0, ("s3c2410_init: Invalid rclk"));
+ KASSERT(bas->rclk != 0, ("exynos4210_init: Invalid rclk"));
uart_setreg(bas, SSCOM_UCON, 0);
uart_setreg(bas, SSCOM_UFCON,
UFCON_TXTRIGGER_8 | UFCON_RXTRIGGER_8 |
UFCON_TXFIFO_RESET | UFCON_RXFIFO_RESET |
UFCON_FIFO_ENABLE);
- s3c24x0_uart_param(bas, baudrate, databits, stopbits, parity);
+ exynos4210_uart_param(bas, baudrate, databits, stopbits, parity);
/* Enable UART. */
uart_setreg(bas, SSCOM_UCON, UCON_TXMODE_INT | UCON_RXMODE_INT |
UCON_TOINT);
uart_setreg(bas, SSCOM_UMCON, UMCON_RTS);
}
static void
-s3c2410_term(struct uart_bas *bas)
+exynos4210_term(struct uart_bas *bas)
{
/* XXX */
}
static void
-s3c2410_putc(struct uart_bas *bas, int c)
+exynos4210_putc(struct uart_bas *bas, int c)
{
while ((bus_space_read_4(bas->bst, bas->bsh, SSCOM_UFSTAT) &
UFSTAT_TXFULL) == UFSTAT_TXFULL)
continue;
uart_setreg(bas, SSCOM_UTXH, c);
}
static int
-s3c2410_rxready(struct uart_bas *bas)
+exynos4210_rxready(struct uart_bas *bas)
{
return ((uart_getreg(bas, SSCOM_UTRSTAT) & UTRSTAT_RXREADY) ==
UTRSTAT_RXREADY);
}
static int
-s3c2410_getc(struct uart_bas *bas, struct mtx *mtx)
+exynos4210_getc(struct uart_bas *bas, struct mtx *mtx)
{
int utrstat;
utrstat = bus_space_read_1(bas->bst, bas->bsh, SSCOM_UTRSTAT);
while (!(utrstat & UTRSTAT_RXREADY)) {
utrstat = bus_space_read_1(bas->bst, bas->bsh, SSCOM_UTRSTAT);
continue;
}
return (bus_space_read_1(bas->bst, bas->bsh, SSCOM_URXH));
}
-static int s3c2410_bus_probe(struct uart_softc *sc);
-static int s3c2410_bus_attach(struct uart_softc *sc);
-static int s3c2410_bus_flush(struct uart_softc *, int);
-static int s3c2410_bus_getsig(struct uart_softc *);
-static int s3c2410_bus_ioctl(struct uart_softc *, int, intptr_t);
-static int s3c2410_bus_ipend(struct uart_softc *);
-static int s3c2410_bus_param(struct uart_softc *, int, int, int, int);
-static int s3c2410_bus_receive(struct uart_softc *);
-static int s3c2410_bus_setsig(struct uart_softc *, int);
-static int s3c2410_bus_transmit(struct uart_softc *);
+static int exynos4210_bus_probe(struct uart_softc *sc);
+static int exynos4210_bus_attach(struct uart_softc *sc);
+static int exynos4210_bus_flush(struct uart_softc *, int);
+static int exynos4210_bus_getsig(struct uart_softc *);
+static int exynos4210_bus_ioctl(struct uart_softc *, int, intptr_t);
+static int exynos4210_bus_ipend(struct uart_softc *);
+static int exynos4210_bus_param(struct uart_softc *, int, int, int, int);
+static int exynos4210_bus_receive(struct uart_softc *);
+static int exynos4210_bus_setsig(struct uart_softc *, int);
+static int exynos4210_bus_transmit(struct uart_softc *);
-static kobj_method_t s3c2410_methods[] = {
- KOBJMETHOD(uart_probe, s3c2410_bus_probe),
- KOBJMETHOD(uart_attach, s3c2410_bus_attach),
- KOBJMETHOD(uart_flush, s3c2410_bus_flush),
- KOBJMETHOD(uart_getsig, s3c2410_bus_getsig),
- KOBJMETHOD(uart_ioctl, s3c2410_bus_ioctl),
- KOBJMETHOD(uart_ipend, s3c2410_bus_ipend),
- KOBJMETHOD(uart_param, s3c2410_bus_param),
- KOBJMETHOD(uart_receive, s3c2410_bus_receive),
- KOBJMETHOD(uart_setsig, s3c2410_bus_setsig),
- KOBJMETHOD(uart_transmit, s3c2410_bus_transmit),
+static kobj_method_t exynos4210_methods[] = {
+ KOBJMETHOD(uart_probe, exynos4210_bus_probe),
+ KOBJMETHOD(uart_attach, exynos4210_bus_attach),
+ KOBJMETHOD(uart_flush, exynos4210_bus_flush),
+ KOBJMETHOD(uart_getsig, exynos4210_bus_getsig),
+ KOBJMETHOD(uart_ioctl, exynos4210_bus_ioctl),
+ KOBJMETHOD(uart_ipend, exynos4210_bus_ipend),
+ KOBJMETHOD(uart_param, exynos4210_bus_param),
+ KOBJMETHOD(uart_receive, exynos4210_bus_receive),
+ KOBJMETHOD(uart_setsig, exynos4210_bus_setsig),
+ KOBJMETHOD(uart_transmit, exynos4210_bus_transmit),
{0, 0 }
};
int
-s3c2410_bus_probe(struct uart_softc *sc)
+exynos4210_bus_probe(struct uart_softc *sc)
{
sc->sc_txfifosz = 16;
sc->sc_rxfifosz = 16;
return (0);
}
static int
-s3c2410_bus_attach(struct uart_softc *sc)
+exynos4210_bus_attach(struct uart_softc *sc)
{
sc->sc_hwiflow = 0;
sc->sc_hwoflow = 0;
return (0);
}
static int
-s3c2410_bus_transmit(struct uart_softc *sc)
+exynos4210_bus_transmit(struct uart_softc *sc)
{
int i;
int reg;
uart_lock(sc->sc_hwmtx);
for (i = 0; i < sc->sc_txdatasz; i++) {
- s3c2410_putc(&sc->sc_bas, sc->sc_txbuf[i]);
+ exynos4210_putc(&sc->sc_bas, sc->sc_txbuf[i]);
uart_barrier(&sc->sc_bas);
}
sc->sc_txbusy = 1;
uart_unlock(sc->sc_hwmtx);
/* unmask TX interrupt */
reg = bus_space_read_4(sc->sc_bas.bst, sc->sc_bas.bsh, SSCOM_UINTM);
reg &= ~(1 << 2);
bus_space_write_4(sc->sc_bas.bst, sc->sc_bas.bsh, SSCOM_UINTM, reg);
return (0);
}
static int
-s3c2410_bus_setsig(struct uart_softc *sc, int sig)
+exynos4210_bus_setsig(struct uart_softc *sc, int sig)
{
return (0);
}
static int
-s3c2410_bus_receive(struct uart_softc *sc)
+exynos4210_bus_receive(struct uart_softc *sc)
{
struct uart_bas *bas;
bas = &sc->sc_bas;
while (bus_space_read_4(bas->bst, bas->bsh,
SSCOM_UFSTAT) & UFSTAT_RXCOUNT)
uart_rx_put(sc, uart_getreg(&sc->sc_bas, SSCOM_URXH));
return (0);
}
static int
-s3c2410_bus_param(struct uart_softc *sc, int baudrate, int databits,
+exynos4210_bus_param(struct uart_softc *sc, int baudrate, int databits,
int stopbits, int parity)
{
int error;
if (sc->sc_bas.rclk == 0)
sc->sc_bas.rclk = DEF_CLK;
- KASSERT(sc->sc_bas.rclk != 0, ("s3c2410_init: Invalid rclk"));
+ KASSERT(sc->sc_bas.rclk != 0, ("exynos4210_init: Invalid rclk"));
uart_lock(sc->sc_hwmtx);
- error = s3c24x0_uart_param(&sc->sc_bas, baudrate, databits, stopbits,
+ error = exynos4210_uart_param(&sc->sc_bas, baudrate, databits, stopbits,
parity);
uart_unlock(sc->sc_hwmtx);
return (error);
}
static int
-s3c2410_bus_ipend(struct uart_softc *sc)
+exynos4210_bus_ipend(struct uart_softc *sc)
{
uint32_t ints;
uint32_t txempty, rxready;
int reg;
int ipend;
uart_lock(sc->sc_hwmtx);
ints = bus_space_read_4(sc->sc_bas.bst, sc->sc_bas.bsh, SSCOM_UINTP);
bus_space_write_4(sc->sc_bas.bst, sc->sc_bas.bsh, SSCOM_UINTP, ints);
txempty = (1 << 2);
rxready = (1 << 0);
ipend = 0;
if ((ints & txempty) > 0) {
if (sc->sc_txbusy != 0)
ipend |= SER_INT_TXIDLE;
/* mask TX interrupt */
reg = bus_space_read_4(sc->sc_bas.bst, sc->sc_bas.bsh,
SSCOM_UINTM);
reg |= (1 << 2);
bus_space_write_4(sc->sc_bas.bst, sc->sc_bas.bsh,
SSCOM_UINTM, reg);
}
if ((ints & rxready) > 0) {
ipend |= SER_INT_RXREADY;
}
uart_unlock(sc->sc_hwmtx);
return (ipend);
}
static int
-s3c2410_bus_flush(struct uart_softc *sc, int what)
+exynos4210_bus_flush(struct uart_softc *sc, int what)
{
return (0);
}
static int
-s3c2410_bus_getsig(struct uart_softc *sc)
+exynos4210_bus_getsig(struct uart_softc *sc)
{
return (0);
}
static int
-s3c2410_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
+exynos4210_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
{
return (EINVAL);
}
-struct uart_class uart_s3c2410_class = {
- "s3c2410 class",
- s3c2410_methods,
+struct uart_class uart_exynos4210_class = {
+ "exynos4210 class",
+ exynos4210_methods,
1,
- .uc_ops = &uart_s3c2410_ops,
+ .uc_ops = &uart_exynos4210_ops,
.uc_range = 8,
.uc_rclk = 0,
};
Index: stable/10/sys/dev/uart/uart.h
===================================================================
--- stable/10/sys/dev/uart/uart.h (revision 283322)
+++ stable/10/sys/dev/uart/uart.h (revision 283323)
@@ -1,110 +1,111 @@
/*-
* Copyright (c) 2003 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _DEV_UART_H_
#define _DEV_UART_H_
/*
* Bus access structure. This structure holds the minimum information needed
* to access the UART. The rclk field, although not important to actually
* access the UART, is important for baudrate programming, delay loops and
* other timing related computations.
*/
struct uart_bas {
bus_space_tag_t bst;
bus_space_handle_t bsh;
u_int chan;
u_int rclk;
u_int regshft;
};
#define uart_regofs(bas, reg) ((reg) << (bas)->regshft)
#define uart_getreg(bas, reg) \
bus_space_read_1((bas)->bst, (bas)->bsh, uart_regofs(bas, reg))
#define uart_setreg(bas, reg, value) \
bus_space_write_1((bas)->bst, (bas)->bsh, uart_regofs(bas, reg), value)
/*
* XXX we don't know the length of the bus space address range in use by
* the UART. Since barriers don't use the length field currently, we put
* a zero there for now.
*/
#define uart_barrier(bas) \
bus_space_barrier((bas)->bst, (bas)->bsh, 0, 0, \
BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE)
/*
* UART device classes.
*/
struct uart_class;
extern struct uart_class uart_imx_class __attribute__((weak));
extern struct uart_class uart_msm_class __attribute__((weak));
extern struct uart_class uart_ns8250_class __attribute__((weak));
extern struct uart_class uart_quicc_class __attribute__((weak));
extern struct uart_class uart_s3c2410_class __attribute__((weak));
extern struct uart_class uart_sab82532_class __attribute__((weak));
extern struct uart_class uart_sbbc_class __attribute__((weak));
extern struct uart_class uart_z8530_class __attribute__((weak));
extern struct uart_class uart_lpc_class __attribute__((weak));
extern struct uart_class uart_pl011_class __attribute__((weak));
extern struct uart_class uart_cdnc_class __attribute__((weak));
extern struct uart_class uart_ti8250_class __attribute__((weak));
extern struct uart_class uart_vybrid_class __attribute__((weak));
extern struct uart_class at91_usart_class __attribute__((weak));
+extern struct uart_class uart_exynos4210_class __attribute__((weak));
#ifdef FDT
struct ofw_compat_data;
extern const struct ofw_compat_data *uart_fdt_compat_data;
#endif
#ifdef PC98
struct uart_class *uart_pc98_getdev(u_long port);
#endif
/*
* Device flags.
*/
#define UART_FLAGS_CONSOLE(f) ((f) & 0x10)
#define UART_FLAGS_DBGPORT(f) ((f) & 0x80)
#define UART_FLAGS_FCR_RX_LOW(f) ((f) & 0x100)
#define UART_FLAGS_FCR_RX_MEDL(f) ((f) & 0x200)
#define UART_FLAGS_FCR_RX_MEDH(f) ((f) & 0x400)
#define UART_FLAGS_FCR_RX_HIGH(f) ((f) & 0x800)
/*
* Data parity values (magical numbers related to ns8250).
*/
#define UART_PARITY_NONE 0
#define UART_PARITY_ODD 1
#define UART_PARITY_EVEN 3
#define UART_PARITY_MARK 5
#define UART_PARITY_SPACE 7
#endif /* _DEV_UART_H_ */
Index: stable/10/sys/dev/uart/uart_bus_fdt.c
===================================================================
--- stable/10/sys/dev/uart/uart_bus_fdt.c (revision 283322)
+++ stable/10/sys/dev/uart/uart_bus_fdt.c (revision 283323)
@@ -1,160 +1,160 @@
/*-
* Copyright (c) 2009-2010 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed by Semihalf under sponsorship from
* the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include
__FBSDID("$FreeBSD$");
#include "opt_platform.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int uart_fdt_probe(device_t);
static device_method_t uart_fdt_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, uart_fdt_probe),
DEVMETHOD(device_attach, uart_bus_attach),
DEVMETHOD(device_detach, uart_bus_detach),
{ 0, 0 }
};
static driver_t uart_fdt_driver = {
uart_driver_name,
uart_fdt_methods,
sizeof(struct uart_softc),
};
/*
* Compatible devices. Keep this sorted in most- to least-specific order first,
* alphabetical second. That is, "zwie,ns16550" should appear before "ns16550"
* on the theory that the zwie driver knows how to make better use of the
* hardware than the generic driver. Likewise with chips within a family, the
* highest-numbers / most recent models should probably appear earlier.
*/
static struct ofw_compat_data compat_data[] = {
{"arm,pl011", (uintptr_t)&uart_pl011_class},
{"atmel,at91rm9200-usart",(uintptr_t)&at91_usart_class},
{"atmel,at91sam9260-usart",(uintptr_t)&at91_usart_class},
{"cadence,uart", (uintptr_t)&uart_cdnc_class},
- {"exynos", (uintptr_t)&uart_s3c2410_class},
+ {"exynos", (uintptr_t)&uart_exynos4210_class},
{"fsl,imx6q-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx53-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx51-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx31-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx27-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx25-uart", (uintptr_t)&uart_imx_class},
{"fsl,imx21-uart", (uintptr_t)&uart_imx_class},
{"fsl,mvf600-uart", (uintptr_t)&uart_vybrid_class},
{"lpc,uart", (uintptr_t)&uart_lpc_class},
{"qcom,msm-uartdm", (uintptr_t)&uart_msm_class},
{"ti,ns16550", (uintptr_t)&uart_ti8250_class},
{"ns16550", (uintptr_t)&uart_ns8250_class},
{NULL, (uintptr_t)NULL},
};
/* Export the compat_data table for use by the uart_cpu_fdt.c probe routine. */
const struct ofw_compat_data *uart_fdt_compat_data = compat_data;
static int
uart_fdt_get_clock(phandle_t node, pcell_t *cell)
{
pcell_t clock;
/*
* clock-frequency is a FreeBSD-specific hack. Make its presence optional.
*/
if ((OF_getprop(node, "clock-frequency", &clock,
sizeof(clock))) <= 0)
clock = 0;
if (clock == 0)
/* Try to retrieve parent 'bus-frequency' */
/* XXX this should go to simple-bus fixup or so */
if ((OF_getprop(OF_parent(node), "bus-frequency", &clock,
sizeof(clock))) <= 0)
clock = 0;
*cell = fdt32_to_cpu(clock);
return (0);
}
static int
uart_fdt_get_shift(phandle_t node, pcell_t *cell)
{
pcell_t shift;
if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) <= 0)
shift = 0;
*cell = fdt32_to_cpu(shift);
return (0);
}
static int
uart_fdt_probe(device_t dev)
{
struct uart_softc *sc;
phandle_t node;
pcell_t clock, shift;
int err;
const struct ofw_compat_data * cd;
sc = device_get_softc(dev);
if (!ofw_bus_status_okay(dev))
return (ENXIO);
cd = ofw_bus_search_compatible(dev, compat_data);
if (cd->ocd_data == (uintptr_t)NULL)
return (ENXIO);
sc->sc_class = (struct uart_class *)cd->ocd_data;
node = ofw_bus_get_node(dev);
if ((err = uart_fdt_get_clock(node, &clock)) != 0)
return (err);
uart_fdt_get_shift(node, &shift);
return (uart_bus_probe(dev, (int)shift, (int)clock, 0, 0));
}
DRIVER_MODULE(uart, simplebus, uart_fdt_driver, uart_devclass, 0, 0);
DRIVER_MODULE(uart, ofwbus, uart_fdt_driver, uart_devclass, 0, 0);
Index: stable/10
===================================================================
--- stable/10 (revision 283322)
+++ stable/10 (revision 283323)
Property changes on: stable/10
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
Merged /head:r277132