xref: /freebsd/sys/kern/serdev_if.m (revision 2e3f49888ec8851bafb22011533217487764fdb0)
1#-
2# Copyright (c) 2006 Marcel Moolenaar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26#
27
28#include <sys/bus.h>
29#include <sys/serial.h>
30
31# The serdev interface is used by umbrella drivers and children thereof to
32# establish a more intimate relationship, necessary for efficient handling
33# of multiple (concurrent) serial communication channels.  Examples include
34# serial communications controller (SCC) drivers, multi-I/O adapter drivers
35# and intelligent multi-port serial drivers.  Methods specifically deal
36# with interrupt handling and configuration.  Conceptually, the umbrella
37# driver is responsible for the overall operation of the hardware and uses
38# child drivers to handle each individual channel.
39# The serdev interface is intended to inherit the device interface.
40
41INTERFACE serdev;
42
43# Default implementations of some methods.
44CODE {
45	static serdev_intr_t *
46	default_ihand(device_t dev, int ipend)
47	{
48		return (NULL);
49	}
50
51	static int
52	default_ipend(device_t dev)
53	{
54		return (-1);
55	}
56
57	static int
58	default_sysdev(device_t dev)
59	{
60		return (0);
61	}
62};
63
64# ihand() - Query serial device interrupt handler.
65# This method is called by the umbrella driver to obtain function pointers
66# to interrupt handlers for each individual interrupt source. This allows
67# the umbralla driver to control the servicing of interrupts between the
68# different channels in the most flexible way.
69METHOD serdev_intr_t* ihand {
70	device_t dev;
71	int ipend;
72} DEFAULT default_ihand;
73
74# ipend() - Query pending interrupt status.
75# This method is called by the umbrella driver to obtain interrupt status
76# for the UART in question. This allows the umbrella driver to build a
77# matrix and service the interrupts in the most flexible way by calling
78# interrupt handlers collected with the ihand() method.
79METHOD int ipend {
80	device_t dev;
81} DEFAULT default_ipend;
82
83# sysdev() - Query system device status
84# This method may be called by the umbrella driver for each child driver
85# to establish if a particular channel and mode is currently being used
86# for system specific usage. If this is the case, the hardware is not
87# reset and the channel will not change its operation mode.
88# The return value is !0 if the channel and mode are used for a system
89# device and 0 otherwise.
90METHOD int sysdev {
91	device_t dev;
92} DEFAULT default_sysdev;
93
94