/*
 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 * @OSF_COPYRIGHT@
 */
/*
 * @APPLE_FREE_COPYRIGHT@
 */


#include <device/device_types.h>
#include <mach_kdp.h>

/*
 *	Console is on the Printer Port (chip channel 0)
 *	Debugger is on the Modem Port (chip channel 1)
 */

#define	CONSOLE_PORT	1

struct scc_tty {
	char *		t_addr;		/* device pointer */
	int		t_dev;		/* device number */
	int		t_ispeed;	/* input speed */
	int		t_ospeed;	/* output speed */
	char		t_breakc;	/* character to deliver when 'break'
					   condition received */
	int		t_flags;	/* mode flags */
	int		t_state;	/* current state */
	int		t_line;		/* fake line discipline number,
					   for old drivers - always 0 */
	int		t_outofband;	/* current out-of-band events */
	int		t_outofbandarg;	/* arg to first out-of-band event */
	int		t_nquoted;	/* number of quoted chars in inq */
	int		t_hiwater;	/* baud-rate limited high water mark */
	int		t_lowater;	/* baud-rate limited low water mark */
};
typedef struct scc_tty	*scc_tty_t;

/*
 * function declarations for performing serial i/o
 * other functions below are declared in kern/misc_protos.h
 *    cnputc, cngetc, cnmaygetc
 */

void initialize_serial(caddr_t scc_phys_base, int32_t serial_baud);

extern int		scc_probe(int32_t serial_baud);

#if 0
extern int		scc_open(
				dev_t		dev,
				dev_mode_t	flag,
				io_req_t	ior);

extern void		scc_close(
				dev_t		dev);

extern int		scc_read(
				dev_t		dev,
				io_req_t	ior);

extern io_return_t	scc_write(
				dev_t		dev,
				io_req_t	ior);

extern io_return_t	scc_get_status(
				dev_t			dev,
				dev_flavor_t		flavor,
				dev_status_t		data,
				mach_msg_type_number_t	*status_count);

extern io_return_t	scc_set_status(
				dev_t			dev,
				dev_flavor_t		flavor,
				dev_status_t		data,
				mach_msg_type_number_t	status_count);

extern boolean_t	scc_portdeath(
				dev_t		dev,
				ipc_port_t	port);

#endif /* 0 */

extern int	 	scc_putc(
				int			unit,
				int			line,
				int			c);

extern int		scc_getc(
				int			unit,
				int			line,
				boolean_t		wait,
				boolean_t		raw);

/* Functions in serial_console.c for switching between serial and video
   consoles.  */
extern boolean_t	console_is_serial(void);
extern int		switch_to_serial_console(
				void);

extern int		switch_to_video_console(
				void);

extern void		switch_to_old_console(
				int			old_console);

void serial_keyboard_init(void);
void serial_keyboard_start(void);
void serial_keyboard_poll(void);


/*
 * JMM - We are not really going to support this driver in SMP (barely
 * support it now - so just pick up the stubbed out versions.
 */
#define DECL_FUNNEL(class,f)
#define DECL_FUNNEL_VARS
#define FUNNEL_INIT(f,p)
#define FUNNEL_ENTER(f)
#define FUNNEL_EXIT(f)
#define FUNNEL_ESCAPE(f)		(1)
#define FUNNEL_REENTER(f,count)
#define FUNNEL_IN_USE(f)		(TRUE)

/*
 * Flags
 */
#define	TF_ODDP		0x00000002	/* get/send odd parity */
#define	TF_EVENP	0x00000004	/* get/send even parity */
#define	TF_ANYP		(TF_ODDP|TF_EVENP)
					/* get any parity/send none */
#define	TF_LITOUT	0x00000008	/* output all 8 bits
					   otherwise, characters >= 0x80
					   are time delays	XXX */
#define	TF_ECHO		0x00000080	/* device wants user to echo input */
#define	TS_MIN		0x00004000	/* buffer input chars, if possible */
