154359Sroberto/* Copyright (c) 1995 Vixie Enterprises
254359Sroberto *
354359Sroberto * Permission to use, copy, modify, and distribute this software for any
454359Sroberto * purpose with or without fee is hereby granted, provided that the above
554359Sroberto * copyright notice and this permission notice appear in all copies, and that
654359Sroberto * the name of Vixie Enterprises not be used in advertising or publicity
754359Sroberto * pertaining to distribution of the document or software without specific,
854359Sroberto * written prior permission.
954359Sroberto *
1054359Sroberto * THE SOFTWARE IS PROVIDED "AS IS" AND VIXIE ENTERPRISES DISCLAIMS ALL
1154359Sroberto * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
1254359Sroberto * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL VIXIE ENTERPRISES
1354359Sroberto * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
1454359Sroberto * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
1554359Sroberto * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
1654359Sroberto * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
1754359Sroberto * SOFTWARE.
1854359Sroberto */
1954359Sroberto
2054359Sroberto#ifndef _PCL720_DEFINED
2154359Sroberto#define _PCL720_DEFINED
2254359Sroberto
2354359Sroberto#define	pcl720_data(base,bit)	(base+(bit>>3))
2454359Sroberto#define pcl720_data_0_7(base)	(base+0)
2554359Sroberto#define pcl720_data_8_15(base)	(base+1)
2654359Sroberto#define pcl720_data_16_23(base)	(base+2)
2754359Sroberto#define pcl720_data_24_31(base)	(base+3)
2854359Sroberto#define pcl720_cntr(base,cntr)	(base+4+cntr)	/* cntr: 0..2 */
2954359Sroberto#define pcl720_cntr_0(base)	(base+4)
3054359Sroberto#define pcl720_cntr_1(base)	(base+5)
3154359Sroberto#define pcl720_cntr_2(base)	(base+6)
3254359Sroberto#define pcl720_ctrl(base)	(base+7)
3354359Sroberto
3454359Sroberto#ifndef DEBUG_PCL720
3554359Sroberto#define	pcl720_inb(x)		inb(x)
3654359Sroberto#define	pcl720_outb(x,y)	outb(x,y)
3754359Sroberto#else
3854359Srobertostatic unsigned char pcl720_inb(int addr) {
3954359Sroberto	unsigned char x = inb(addr);
4054359Sroberto	fprintf(DEBUG_PCL720, "inb(0x%x) -> 0x%x\n", addr, x);
4154359Sroberto	return (x);
4254359Sroberto}
4354359Srobertostatic void pcl720_outb(int addr, unsigned char x) {
4454359Sroberto	outb(addr, x);
4554359Sroberto	fprintf(DEBUG_PCL720, "outb(0x%x, 0x%x)\n", addr, x);
4654359Sroberto}
4754359Sroberto#endif
4854359Sroberto
4954359Sroberto#define	pcl720_load(Base,Cntr,Mode,Val) \
5054359Sroberto	({	register unsigned int	b = Base, c = Cntr, v = Val; \
5154359Sroberto		i8253_ctrl ctrl; \
5254359Sroberto		\
5354359Sroberto		ctrl.s.bcd = i8253_binary; \
5454359Sroberto		ctrl.s.mode = Mode; \
5554359Sroberto		ctrl.s.rl = i8253_lmb; \
5654359Sroberto		ctrl.s.cntr = c; \
5754359Sroberto		pcl720_outb(pcl720_ctrl(b), ctrl.i); \
5854359Sroberto		pcl720_outb(pcl720_cntr(b,c), v); \
5954359Sroberto		pcl720_outb(pcl720_cntr(b,c), v >> 8); \
6054359Sroberto		v; \
6154359Sroberto	})
6254359Sroberto
6354359Sroberto#define	pcl720_read(Base,Cntr) \
6482498Sroberto	({	register unsigned int	b = Base, v; \
6554359Sroberto		i8253_ctrl ctrl; \
6654359Sroberto		\
6754359Sroberto		ctrl.s.rl = i8253_latch; \
6854359Sroberto		ctrl.s.cntr = i8253_cntr_0; \
6954359Sroberto		pcl720_outb(pcl720_ctrl(b), ctrl.i); \
7054359Sroberto		v = pcl720_inb(pcl720_cntr_0(b)); \
7154359Sroberto		v |= (pcl720_inb(pcl720_cntr_0(b)) << 8); \
7254359Sroberto		v; \
7354359Sroberto	})
7454359Sroberto
7554359Sroberto#define	pcl720_input(Base) \
7654359Sroberto	({	register unsigned int	b = Base, v; \
7754359Sroberto		\
7854359Sroberto		v = pcl720_inb(pcl720_data_0_7(b)); \
7954359Sroberto		v |= (pcl720_inb(pcl720_data_8_15(b)) << 8); \
8054359Sroberto		v |= (pcl720_inb(pcl720_data_16_23(b)) << 16); \
8154359Sroberto		v |= (pcl720_inb(pcl720_data_24_31(b)) << 24); \
8254359Sroberto		v; \
8354359Sroberto	})
8454359Sroberto
8554359Sroberto#define	pcl720_output(Base,Value) \
8654359Sroberto	({	register unsigned int	b = Base, v = Value; \
8754359Sroberto		\
8854359Sroberto		pcl720_outb(pcl720_data_0_7(b), v); \
8954359Sroberto		pcl720_outb(pcl720_data_8_15(b), v << 8); \
9054359Sroberto		pcl720_outb(pcl720_data_16_23(b), v << 16); \
9154359Sroberto		pcl720_outb(pcl720_data_24_31(b), v << 24); \
9254359Sroberto		v; \
9354359Sroberto	})
9454359Sroberto
9554359Sroberto#endif /*_PCL720_DEFINED*/
96