uart_bus_at91usart.c revision 266095
1284345Ssjg/*-
2284345Ssjg * Copyright (c) 2005 Olivier Houchard.  All rights reserved.
3284345Ssjg *
4284345Ssjg * Redistribution and use in source and binary forms, with or without
5284345Ssjg * modification, are permitted provided that the following conditions
6284345Ssjg * are met:
7284345Ssjg * 1. Redistributions of source code must retain the above copyright
8284345Ssjg *    notice, this list of conditions and the following disclaimer.
9284345Ssjg * 2. Redistributions in binary form must reproduce the above copyright
10284345Ssjg *    notice, this list of conditions and the following disclaimer in the
11284345Ssjg *    documentation and/or other materials provided with the distribution.
12284345Ssjg *
13284345Ssjg * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14284345Ssjg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15284345Ssjg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16284345Ssjg * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17284345Ssjg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18284345Ssjg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19284345Ssjg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20284345Ssjg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21284345Ssjg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#include "opt_uart.h"
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: stable/10/sys/arm/at91/uart_bus_at91usart.c 266095 2014-05-14 23:17:33Z ian $");
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/bus.h>
34#include <sys/conf.h>
35#include <sys/kernel.h>
36#include <sys/module.h>
37#include <machine/bus.h>
38#include <sys/rman.h>
39#include <machine/resource.h>
40
41#include <dev/uart/uart.h>
42#include <dev/uart/uart_bus.h>
43#include <dev/uart/uart_cpu.h>
44
45#include <arm/at91/at91var.h>
46
47#include "uart_if.h"
48
49static int usart_at91_probe(device_t dev);
50
51static device_method_t usart_at91_methods[] = {
52	/* Device interface */
53	DEVMETHOD(device_probe,		usart_at91_probe),
54	DEVMETHOD(device_attach,	uart_bus_attach),
55	DEVMETHOD(device_detach,	uart_bus_detach),
56	{ 0, 0 }
57};
58
59static driver_t usart_at91_driver = {
60	uart_driver_name,
61	usart_at91_methods,
62	sizeof(struct uart_softc),
63};
64
65extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
66
67static int
68usart_at91_probe(device_t dev)
69{
70	struct uart_softc *sc;
71
72	sc = device_get_softc(dev);
73	switch (device_get_unit(dev))
74	{
75	case 0:
76		device_set_desc(dev, "DBGU");
77		/*
78		 * Setting sc_sysdev makes this device a 'system device' and
79		 * indirectly makes it the system console.
80		 */
81		sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs);
82		bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas));
83		break;
84	case 1:
85		device_set_desc(dev, "USART0");
86		break;
87	case 2:
88		device_set_desc(dev, "USART1");
89		break;
90	case 3:
91		device_set_desc(dev, "USART2");
92		break;
93	case 4:
94		device_set_desc(dev, "USART3");
95		break;
96	case 5:
97		device_set_desc(dev, "USART4");
98		break;
99	case 6:
100		device_set_desc(dev, "USART5");
101		break;
102	}
103	sc->sc_class = &at91_usart_class;
104	if (sc->sc_class->uc_rclk == 0)
105		sc->sc_class->uc_rclk = at91_master_clock;
106	return (uart_bus_probe(dev, 0, 0, 0, device_get_unit(dev)));
107}
108
109
110DRIVER_MODULE(uart, atmelarm, usart_at91_driver, uart_devclass, 0, 0);
111