1/*
2 * Copyright 1998 by Alan Hourihane, Wigan, England.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Alan Hourihane not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Alan Hourihane makes no representations
11 * about the suitability of this software for any purpose.  It is provided
12 * "as is" without express or implied warranty.
13 *
14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 *
22 * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
23 *
24 * tgaBTOutIndReg() and tgaBTInIndReg() are used to access
25 * the indirect TGA BT RAMDAC registers only.
26 */
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include "xf86.h"
33#include "xf86_OSproc.h"
34
35#include "xf86PciInfo.h"
36#include "xf86Pci.h"
37
38#include "tga_regs.h"
39#include "BT.h"
40#include "tga.h"
41
42void
43tgaBTOutIndReg(ScrnInfoPtr pScrn,
44		     CARD32 reg, unsigned char mask, unsigned char data)
45{
46  TGAPtr pTga;
47  unsigned char tmp = 0x00;
48
49  pTga = TGAPTR(pScrn);
50
51  TGA_WRITE_REG(reg << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
52
53  if (mask != 0x00)
54    tmp = (TGA_READ_REG(TGA_RAMDAC_REG)>>16) & mask;
55
56  TGA_WRITE_REG(reg << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
57
58  TGA_WRITE_REG ((tmp | data) | (reg<<9), TGA_RAMDAC_REG);
59}
60
61unsigned char
62tgaBTInIndReg (ScrnInfoPtr pScrn, CARD32 reg)
63{
64  TGAPtr pTga;
65  unsigned char ret;
66
67  pTga  = TGAPTR(pScrn);
68
69  TGA_WRITE_REG(reg << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
70  ret = TGA_READ_REG (TGA_RAMDAC_REG)>>16;
71
72  return (ret);
73}
74
75void
76tgaBTWriteAddress (ScrnInfoPtr pScrn, CARD32 index)
77{
78    TGAPtr pTga;
79
80    pTga = TGAPTR(pScrn);
81
82    TGA_WRITE_REG(BT_WRITE_ADDR << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
83    TGA_WRITE_REG(index | (BT_WRITE_ADDR<<9), TGA_RAMDAC_REG);
84    TGA_WRITE_REG(BT_RAMDAC_DATA << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
85}
86
87void
88tgaBTWriteData (ScrnInfoPtr pScrn, unsigned char data)
89{
90    TGAPtr pTga;
91
92    pTga = TGAPTR(pScrn);
93
94    TGA_WRITE_REG(data | (BT_RAMDAC_DATA << 9), TGA_RAMDAC_REG);
95}
96
97void
98tgaBTReadAddress (ScrnInfoPtr pScrn, CARD32 index)
99{
100    TGAPtr pTga;
101
102    pTga = TGAPTR(pScrn);
103
104    TGA_WRITE_REG(BT_PIXEL_MASK << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
105    TGA_WRITE_REG(0xFF | (BT_PIXEL_MASK<<9), TGA_RAMDAC_REG);
106    TGA_WRITE_REG(BT_READ_ADDR << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
107    TGA_WRITE_REG(index | (BT_READ_ADDR<<9), TGA_RAMDAC_REG);
108    TGA_WRITE_REG(BT_RAMDAC_DATA << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
109}
110
111unsigned char
112tgaBTReadData (ScrnInfoPtr pScrn)
113{
114    TGAPtr pTga;
115
116    pTga = TGAPTR(pScrn);
117
118    return(TGA_READ_REG(TGA_RAMDAC_REG)>>16);
119}
120
121/********************* TGA2 stuff below here ********************/
122
123void
124tga2BTOutIndReg(ScrnInfoPtr pScrn,
125		     CARD32 reg, unsigned char mask, unsigned char data)
126{
127  TGAPtr pTga;
128  unsigned char tmp = 0x00;
129  unsigned int addr = 0xe000U | (reg << 8);
130
131  pTga = TGAPTR(pScrn);
132
133  if (mask != 0x00)
134    tmp = TGA2_READ_RAMDAC_REG(addr) & mask;
135
136#if 0
137  xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "tga2OutIndReg: reg 0x%x data 0x%x\n",
138	     reg, tmp|data);
139#endif
140  TGA2_WRITE_RAMDAC_REG ((tmp | data), addr);
141}
142
143unsigned char
144tga2BTInIndReg (ScrnInfoPtr pScrn, CARD32 reg)
145{
146  TGAPtr pTga;
147  unsigned char ret;
148  unsigned int addr = 0xe000U | (reg << 8);
149
150  pTga  = TGAPTR(pScrn);
151
152  ret = TGA2_READ_RAMDAC_REG(addr);
153
154  return (ret);
155}
156
157void
158tga2BTWriteAddress (ScrnInfoPtr pScrn, CARD32 index)
159{
160    tga2BTOutIndReg(pScrn, BT_WRITE_ADDR, 0, index);
161}
162
163void
164tga2BTWriteData (ScrnInfoPtr pScrn, unsigned char data)
165{
166    tga2BTOutIndReg(pScrn, BT_RAMDAC_DATA, 0, data);
167}
168
169void
170tga2BTReadAddress (ScrnInfoPtr pScrn, CARD32 index)
171{
172    tga2BTOutIndReg(pScrn, BT_PIXEL_MASK, 0, 0xff);
173    tga2BTOutIndReg(pScrn, BT_READ_ADDR, 0, index);
174}
175
176unsigned char
177tga2BTReadData (ScrnInfoPtr pScrn)
178{
179    return tga2BTInIndReg(pScrn, BT_RAMDAC_DATA);
180}
181