xref: /openbmc/u-boot/drivers/misc/ali512x.c (revision ece444b42b71eb5bce34a24ec584573b3c8c4a98)
1318c0b90SJean-Christophe PLAGNIOL-VILLARD /*
2318c0b90SJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2002
3318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Daniel Engstr�m, Omicron Ceti AB <daniel@omicron.se>.
4318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
5318c0b90SJean-Christophe PLAGNIOL-VILLARD  * See file CREDITS for list of people who contributed to this
6318c0b90SJean-Christophe PLAGNIOL-VILLARD  * project.
7318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
8318c0b90SJean-Christophe PLAGNIOL-VILLARD  * This program is free software; you can redistribute it and/or
9318c0b90SJean-Christophe PLAGNIOL-VILLARD  * modify it under the terms of the GNU General Public License as
10318c0b90SJean-Christophe PLAGNIOL-VILLARD  * published by the Free Software Foundation; either version 2 of
11318c0b90SJean-Christophe PLAGNIOL-VILLARD  * the License, or (at your option) any later version.
12318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
13318c0b90SJean-Christophe PLAGNIOL-VILLARD  * This program is distributed in the hope that it will be useful,
14318c0b90SJean-Christophe PLAGNIOL-VILLARD  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15318c0b90SJean-Christophe PLAGNIOL-VILLARD  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16318c0b90SJean-Christophe PLAGNIOL-VILLARD  * GNU General Public License for more details.
17318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
18318c0b90SJean-Christophe PLAGNIOL-VILLARD  * You should have received a copy of the GNU General Public License
19318c0b90SJean-Christophe PLAGNIOL-VILLARD  * along with this program; if not, write to the Free Software
20318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21318c0b90SJean-Christophe PLAGNIOL-VILLARD  * MA 02111-1307 USA
22318c0b90SJean-Christophe PLAGNIOL-VILLARD  */
23318c0b90SJean-Christophe PLAGNIOL-VILLARD 
24318c0b90SJean-Christophe PLAGNIOL-VILLARD /*
25318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Based on sc520cdp.c from rolo 1.6:
26318c0b90SJean-Christophe PLAGNIOL-VILLARD  *----------------------------------------------------------------------
27318c0b90SJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2000
28318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Sysgo Real-Time Solutions GmbH
29318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Klein-Winternheim, Germany
30318c0b90SJean-Christophe PLAGNIOL-VILLARD  *----------------------------------------------------------------------
31318c0b90SJean-Christophe PLAGNIOL-VILLARD  */
32318c0b90SJean-Christophe PLAGNIOL-VILLARD 
33318c0b90SJean-Christophe PLAGNIOL-VILLARD #include <config.h>
34318c0b90SJean-Christophe PLAGNIOL-VILLARD 
35318c0b90SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
36318c0b90SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
37*ece444b4SGraeme Russ #include <ali512x.h>
38318c0b90SJean-Christophe PLAGNIOL-VILLARD 
39318c0b90SJean-Christophe PLAGNIOL-VILLARD 
40318c0b90SJean-Christophe PLAGNIOL-VILLARD /* ALI M5123 Logical device numbers:
41318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0 FDC
42318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 1 unused?
43318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 2 unused?
44318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 3 lpt
45318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 4 UART1
46318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 5 UART2
47318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 6 RTC
48318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 7 mouse/kbd
49318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 8 CIO
50318c0b90SJean-Christophe PLAGNIOL-VILLARD  */
51318c0b90SJean-Christophe PLAGNIOL-VILLARD 
52318c0b90SJean-Christophe PLAGNIOL-VILLARD /*
53318c0b90SJean-Christophe PLAGNIOL-VILLARD  ************************************************************
54318c0b90SJean-Christophe PLAGNIOL-VILLARD  *  Some access primitives for the ALi chip:                *
55318c0b90SJean-Christophe PLAGNIOL-VILLARD  ************************************************************
56318c0b90SJean-Christophe PLAGNIOL-VILLARD  */
57318c0b90SJean-Christophe PLAGNIOL-VILLARD 
58318c0b90SJean-Christophe PLAGNIOL-VILLARD static void ali_write(u8 index, u8 value)
59318c0b90SJean-Christophe PLAGNIOL-VILLARD {
60318c0b90SJean-Christophe PLAGNIOL-VILLARD 	/* write an arbirary register */
61318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(index, ALI_INDEX);
62318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(value, ALI_DATA);
63318c0b90SJean-Christophe PLAGNIOL-VILLARD }
64318c0b90SJean-Christophe PLAGNIOL-VILLARD 
65318c0b90SJean-Christophe PLAGNIOL-VILLARD #if 0
66318c0b90SJean-Christophe PLAGNIOL-VILLARD static int ali_read(u8 index)
67318c0b90SJean-Christophe PLAGNIOL-VILLARD {
68318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(index, ALI_INDEX);
69318c0b90SJean-Christophe PLAGNIOL-VILLARD 	return inb(ALI_DATA);
70318c0b90SJean-Christophe PLAGNIOL-VILLARD }
71318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
72318c0b90SJean-Christophe PLAGNIOL-VILLARD 
73318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_OPEN() \
74318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(0x51, ALI_INDEX); \
75318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(0x23, ALI_INDEX)
76318c0b90SJean-Christophe PLAGNIOL-VILLARD 
77318c0b90SJean-Christophe PLAGNIOL-VILLARD 
78318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_CLOSE() \
79318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(0xbb, ALI_INDEX)
80318c0b90SJean-Christophe PLAGNIOL-VILLARD 
81318c0b90SJean-Christophe PLAGNIOL-VILLARD /* Select a logical device */
82318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_SELDEV(dev)	\
83318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x07, dev)
84318c0b90SJean-Christophe PLAGNIOL-VILLARD 
85318c0b90SJean-Christophe PLAGNIOL-VILLARD 
86318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_init(void)
87318c0b90SJean-Christophe PLAGNIOL-VILLARD {
88318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
89318c0b90SJean-Christophe PLAGNIOL-VILLARD 
90318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x02, 0x01);	/* soft reset */
91318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x03, 0x03);	/* disable access to CIOs */
92318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x22, 0x00);	/* disable direct powerdown */
93318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x23, 0x00);	/* disable auto powerdown */
94318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x24, 0x00);	/* IR 8 is active hi, pin26 is PDIR */
95318c0b90SJean-Christophe PLAGNIOL-VILLARD 
96318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
97318c0b90SJean-Christophe PLAGNIOL-VILLARD }
98318c0b90SJean-Christophe PLAGNIOL-VILLARD 
99318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_fdc(int enabled, u16 io, u8 irq, u8 dma_channel)
100318c0b90SJean-Christophe PLAGNIOL-VILLARD {
101318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
102318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(0);
103318c0b90SJean-Christophe PLAGNIOL-VILLARD 
104318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
105318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
106318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x60, io >> 8);
107318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x61, io & 0xff);
108318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x70, irq);
109318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x74, dma_channel);
110318c0b90SJean-Christophe PLAGNIOL-VILLARD 
111318c0b90SJean-Christophe PLAGNIOL-VILLARD 		/* AT mode, no drive swap */
112318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf0, 0x08);
113318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf1, 0x00);
114318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf2, 0xff);
115318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf4, 0x00);
116318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
117318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
118318c0b90SJean-Christophe PLAGNIOL-VILLARD }
119318c0b90SJean-Christophe PLAGNIOL-VILLARD 
120318c0b90SJean-Christophe PLAGNIOL-VILLARD 
121318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_pp(int enabled, u16 io, u8 irq, u8 dma_channel)
122318c0b90SJean-Christophe PLAGNIOL-VILLARD {
123318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
124318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(3);
125318c0b90SJean-Christophe PLAGNIOL-VILLARD 
126318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
127318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
128318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x60, io >> 8);
129318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x61, io & 0xff);
130318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x70, irq);
131318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x74, dma_channel);
132318c0b90SJean-Christophe PLAGNIOL-VILLARD 
133318c0b90SJean-Christophe PLAGNIOL-VILLARD 		/* mode: EPP 1.9, ECP FIFO threshold = 7, IRQ active low */
134318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf0, 0xbc);
135318c0b90SJean-Christophe PLAGNIOL-VILLARD 		/* 12 MHz, Burst DMA in ECP */
136318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf1, 0x05);
137318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
138318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
139318c0b90SJean-Christophe PLAGNIOL-VILLARD 
140318c0b90SJean-Christophe PLAGNIOL-VILLARD }
141318c0b90SJean-Christophe PLAGNIOL-VILLARD 
142318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_uart(int enabled, int index, u16 io, u8 irq)
143318c0b90SJean-Christophe PLAGNIOL-VILLARD {
144318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
145318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(index?5:4);
146318c0b90SJean-Christophe PLAGNIOL-VILLARD 
147318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
148318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
149318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x60, io >> 8);
150318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x61, io & 0xff);
151318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x70, irq);
152318c0b90SJean-Christophe PLAGNIOL-VILLARD 
153318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf0, 0x00);
154318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf1, 0x00);
155318c0b90SJean-Christophe PLAGNIOL-VILLARD 
156318c0b90SJean-Christophe PLAGNIOL-VILLARD 		/* huh? write 0xf2 twice - a typo in rolo
157318c0b90SJean-Christophe PLAGNIOL-VILLARD 		 * or some secret ali errata? Who knows?
158318c0b90SJean-Christophe PLAGNIOL-VILLARD 		 */
159318c0b90SJean-Christophe PLAGNIOL-VILLARD 		if (index) {
160318c0b90SJean-Christophe PLAGNIOL-VILLARD 			ali_write(0xf2, 0x00);
161318c0b90SJean-Christophe PLAGNIOL-VILLARD 		}
162318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf2, 0x0c);
163318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
164318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
165318c0b90SJean-Christophe PLAGNIOL-VILLARD 
166318c0b90SJean-Christophe PLAGNIOL-VILLARD }
167318c0b90SJean-Christophe PLAGNIOL-VILLARD 
168318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_uart2_irda(int enabled)
169318c0b90SJean-Christophe PLAGNIOL-VILLARD {
170318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
171318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(5);
172318c0b90SJean-Christophe PLAGNIOL-VILLARD 
173318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0xf1, enabled?0x48:0x00); /* fullduplex IrDa */
174318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
175318c0b90SJean-Christophe PLAGNIOL-VILLARD 
176318c0b90SJean-Christophe PLAGNIOL-VILLARD }
177318c0b90SJean-Christophe PLAGNIOL-VILLARD 
178318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_rtc(int enabled, u16 io, u8 irq)
179318c0b90SJean-Christophe PLAGNIOL-VILLARD {
180318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
181318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(6);
182318c0b90SJean-Christophe PLAGNIOL-VILLARD 
183318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
184318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
185318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x60, io >> 8);
186318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x61, io & 0xff);
187318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x70, irq);
188318c0b90SJean-Christophe PLAGNIOL-VILLARD 
189318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf0, 0x00);
190318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
191318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
192318c0b90SJean-Christophe PLAGNIOL-VILLARD }
193318c0b90SJean-Christophe PLAGNIOL-VILLARD 
194318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_kbc(int enabled, u8 kbc_irq, u8 mouse_irq)
195318c0b90SJean-Christophe PLAGNIOL-VILLARD {
196318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
197318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(7);
198318c0b90SJean-Christophe PLAGNIOL-VILLARD 
199318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
200318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
201318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x70, kbc_irq);
202318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x72, mouse_irq);
203318c0b90SJean-Christophe PLAGNIOL-VILLARD 
204318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0xf0, 0x00);
205318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
206318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
207318c0b90SJean-Christophe PLAGNIOL-VILLARD }
208318c0b90SJean-Christophe PLAGNIOL-VILLARD 
209318c0b90SJean-Christophe PLAGNIOL-VILLARD 
210318c0b90SJean-Christophe PLAGNIOL-VILLARD /* Common I/O
211318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
212318c0b90SJean-Christophe PLAGNIOL-VILLARD  * (This descripotsion is base on several incompete sources
213318c0b90SJean-Christophe PLAGNIOL-VILLARD  *  since I have not been able to obtain any datasheet for the device
214318c0b90SJean-Christophe PLAGNIOL-VILLARD  *  there may be some mis-understandings burried in here.
215318c0b90SJean-Christophe PLAGNIOL-VILLARD  *  -- Daniel daniel@omicron.se)
216318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
217318c0b90SJean-Christophe PLAGNIOL-VILLARD  * There are 22 CIO pins numbered
218318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 10-17
219318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 20-25
220318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 30-37
221318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
222318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 20-24 are dedicated CIO pins, the other 17 are muliplexed with
223318c0b90SJean-Christophe PLAGNIOL-VILLARD  * other functions.
224318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
225318c0b90SJean-Christophe PLAGNIOL-VILLARD  *           Secondary
226318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO Pin   Function    Decription
227318c0b90SJean-Christophe PLAGNIOL-VILLARD  * =======================================================
228318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO10     IRQIN1      Interrupt input 1?
229318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO11     IRQIN2      Interrupt input 2?
230318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO12     IRRX        IrDa Receive
231318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO13     IRTX        IrDa Transmit
232318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO14     P21         KBC P21 fucntion
233318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO15     P20         KBC P21 fucntion
234318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO16     I2C_CLK     I2C Clock
235318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO17     I2C_DAT     I2C Data
236318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
237318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO20     -
238318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO21     -
239318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO22     -
240318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO23     -
241318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO24     -
242318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO25     LOCK        Keylock
243318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
244318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO30     KBC_CLK     Keybaord Clock
245318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO31     CS0J        General Chip Select decoder CS0J
246318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO32     CS1J        General Chip Select decoder CS1J
247318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO33     ALT_KCLK    Alternative Keyboard Clock
248318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO34     ALT_KDAT    Alternative Keyboard Data
249318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO35     ALT_MCLK    Alternative Mouse Clock
250318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO36     ALT_MDAT    Alternative Mouse Data
251318c0b90SJean-Christophe PLAGNIOL-VILLARD  * CIO37     ALT_KBC     Alternative KBC select
252318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
253318c0b90SJean-Christophe PLAGNIOL-VILLARD  * The CIO use an indirect address scheme.
254318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
255318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Reigster 3 in the SIO is used to select the index and data
256318c0b90SJean-Christophe PLAGNIOL-VILLARD  * port addresses where the CIO I/O registers show up.
257318c0b90SJean-Christophe PLAGNIOL-VILLARD  * The function selection registers are accessible under
258318c0b90SJean-Christophe PLAGNIOL-VILLARD  * function SIO 8.
259318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
260318c0b90SJean-Christophe PLAGNIOL-VILLARD  * SIO reigster 3 (CIO Address Selection) bit definitions:
261318c0b90SJean-Christophe PLAGNIOL-VILLARD  * bit 7   CIO index and data registers enabled
262318c0b90SJean-Christophe PLAGNIOL-VILLARD  * bit 1-0 CIO indirect registers port address select
263318c0b90SJean-Christophe PLAGNIOL-VILLARD  *	 0  index = 0xE0 data = 0xE1
264318c0b90SJean-Christophe PLAGNIOL-VILLARD  *       1  index = 0xE2 data = 0xE3
265318c0b90SJean-Christophe PLAGNIOL-VILLARD  *       2  index = 0xE4 data = 0xE5
266318c0b90SJean-Christophe PLAGNIOL-VILLARD  *       3  index = 0xEA data = 0xEB
267318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
268318c0b90SJean-Christophe PLAGNIOL-VILLARD  * There are three CIO I/O register accessed via CIO index port and CIO data port
269318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0x01     CIO 10-17 data
270318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0x02     CIO 20-25 data (bits 7-6 unused)
271318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0x03     CIO 30-37 data
272318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
273318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
274318c0b90SJean-Christophe PLAGNIOL-VILLARD  * The pin function is accessed through normal
275318c0b90SJean-Christophe PLAGNIOL-VILLARD  * SIO registers, each register have the same format:
276318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
277318c0b90SJean-Christophe PLAGNIOL-VILLARD  * Bit   Function                     Value
278318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0     Input/output                 1=input
279318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 1     Polarity of signal           1=inverted
280318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 2     Unused                       ??
281318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 3     Function (normal or special) 1=special
282318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 7-4   Unused
283318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
284318c0b90SJean-Christophe PLAGNIOL-VILLARD  * SIO REG
285318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe0     CIO 10 Config
286318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe1     CIO 11 Config
287318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe2     CIO 12 Config
288318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe3     CIO 13 Config
289318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe4     CIO 14 Config
290318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe5     CIO 15 Config
291318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe6     CIO 16 Config
292318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe7     CIO 16 Config
293318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
294318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe8     CIO 20 Config
295318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xe9     CIO 21 Config
296318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xea     CIO 22 Config
297318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xeb     CIO 23 Config
298318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xec     CIO 24 Config
299318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xed     CIO 25 Config
300318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
301318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xf5     CIO 30 Config
302318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xf6     CIO 31 Config
303318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xf7     CIO 32 Config
304318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xf8     CIO 33 Config
305318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xf9     CIO 34 Config
306318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xfa     CIO 35 Config
307318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xfb     CIO 36 Config
308318c0b90SJean-Christophe PLAGNIOL-VILLARD  * 0xfc     CIO 37 Config
309318c0b90SJean-Christophe PLAGNIOL-VILLARD  *
310318c0b90SJean-Christophe PLAGNIOL-VILLARD  */
311318c0b90SJean-Christophe PLAGNIOL-VILLARD 
312318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_CIO_PORT_SEL 0x83
313318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_CIO_INDEX    0xea
314318c0b90SJean-Christophe PLAGNIOL-VILLARD #define ALI_CIO_DATA     0xeb
315318c0b90SJean-Christophe PLAGNIOL-VILLARD 
316318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_set_cio(int enabled)
317318c0b90SJean-Christophe PLAGNIOL-VILLARD {
318318c0b90SJean-Christophe PLAGNIOL-VILLARD 	int i;
319318c0b90SJean-Christophe PLAGNIOL-VILLARD 
320318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
321318c0b90SJean-Christophe PLAGNIOL-VILLARD 
322318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (enabled) {
323318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x3, ALI_CIO_PORT_SEL);    /* Enable CIO data register */
324318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else {
325318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(0x3, ALI_CIO_PORT_SEL & ~0x80);
326318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
327318c0b90SJean-Christophe PLAGNIOL-VILLARD 
328318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(8);
329318c0b90SJean-Christophe PLAGNIOL-VILLARD 
330318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(0x30, enabled?1:0);
331318c0b90SJean-Christophe PLAGNIOL-VILLARD 
332318c0b90SJean-Christophe PLAGNIOL-VILLARD 	/* set all pins to input to start with */
333318c0b90SJean-Christophe PLAGNIOL-VILLARD 	for (i=0xe0;i<0xee;i++) {
334318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(i, 1);
335318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
336318c0b90SJean-Christophe PLAGNIOL-VILLARD 
337318c0b90SJean-Christophe PLAGNIOL-VILLARD 	for (i=0xf5;i<0xfe;i++) {
338318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ali_write(i, 1);
339318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
340318c0b90SJean-Christophe PLAGNIOL-VILLARD 
341318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
342318c0b90SJean-Christophe PLAGNIOL-VILLARD }
343318c0b90SJean-Christophe PLAGNIOL-VILLARD 
344318c0b90SJean-Christophe PLAGNIOL-VILLARD 
345318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_cio_function(int pin, int special, int inv, int input)
346318c0b90SJean-Christophe PLAGNIOL-VILLARD {
347318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 data;
348318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 addr;
349318c0b90SJean-Christophe PLAGNIOL-VILLARD 
350318c0b90SJean-Christophe PLAGNIOL-VILLARD 	/* valid pins are 10-17, 20-25 and 30-37 */
351318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (pin >= 10 && pin <= 17) {
352318c0b90SJean-Christophe PLAGNIOL-VILLARD 		addr = 0xe0+(pin&7);
353318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else if (pin >= 20 && pin <= 25) {
354318c0b90SJean-Christophe PLAGNIOL-VILLARD 		addr = 0xe8+(pin&7);
355318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else if (pin >= 30 && pin <= 37) {
356318c0b90SJean-Christophe PLAGNIOL-VILLARD 		addr = 0xf5+(pin&7);
357318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else {
358318c0b90SJean-Christophe PLAGNIOL-VILLARD 		return;
359318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
360318c0b90SJean-Christophe PLAGNIOL-VILLARD 
361318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_OPEN();
362318c0b90SJean-Christophe PLAGNIOL-VILLARD 
363318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_SELDEV(8);
364318c0b90SJean-Christophe PLAGNIOL-VILLARD 
365318c0b90SJean-Christophe PLAGNIOL-VILLARD 
366318c0b90SJean-Christophe PLAGNIOL-VILLARD 	data=0xf4;
367318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (special) {
368318c0b90SJean-Christophe PLAGNIOL-VILLARD 		data |= 0x08;
369318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else {
370318c0b90SJean-Christophe PLAGNIOL-VILLARD 		if (inv) {
371318c0b90SJean-Christophe PLAGNIOL-VILLARD 			data |= 0x02;
372318c0b90SJean-Christophe PLAGNIOL-VILLARD 		}
373318c0b90SJean-Christophe PLAGNIOL-VILLARD 		if (input) {
374318c0b90SJean-Christophe PLAGNIOL-VILLARD 			data |= 0x01;
375318c0b90SJean-Christophe PLAGNIOL-VILLARD 		}
376318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
377318c0b90SJean-Christophe PLAGNIOL-VILLARD 
378318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ali_write(addr, data);
379318c0b90SJean-Christophe PLAGNIOL-VILLARD 
380318c0b90SJean-Christophe PLAGNIOL-VILLARD 	ALI_CLOSE();
381318c0b90SJean-Christophe PLAGNIOL-VILLARD }
382318c0b90SJean-Christophe PLAGNIOL-VILLARD 
383318c0b90SJean-Christophe PLAGNIOL-VILLARD void ali512x_cio_out(int pin, int value)
384318c0b90SJean-Christophe PLAGNIOL-VILLARD {
385318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 reg;
386318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 data;
387318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 bit;
388318c0b90SJean-Christophe PLAGNIOL-VILLARD 
389318c0b90SJean-Christophe PLAGNIOL-VILLARD 	reg = pin/10;
390318c0b90SJean-Christophe PLAGNIOL-VILLARD 	bit = 1 << (pin%10);
391318c0b90SJean-Christophe PLAGNIOL-VILLARD 
392318c0b90SJean-Christophe PLAGNIOL-VILLARD 
393318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(reg, ALI_CIO_INDEX);     /* select I/O register */
394318c0b90SJean-Christophe PLAGNIOL-VILLARD 	data = inb(ALI_CIO_DATA);
395318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (value) {
396318c0b90SJean-Christophe PLAGNIOL-VILLARD 		data |= bit;
397318c0b90SJean-Christophe PLAGNIOL-VILLARD 	} else {
398318c0b90SJean-Christophe PLAGNIOL-VILLARD 		data &= ~bit;
399318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
400318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(data, ALI_CIO_DATA);
401318c0b90SJean-Christophe PLAGNIOL-VILLARD }
402318c0b90SJean-Christophe PLAGNIOL-VILLARD 
403318c0b90SJean-Christophe PLAGNIOL-VILLARD int ali512x_cio_in(int pin)
404318c0b90SJean-Christophe PLAGNIOL-VILLARD {
405318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 reg;
406318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 data;
407318c0b90SJean-Christophe PLAGNIOL-VILLARD 	u8 bit;
408318c0b90SJean-Christophe PLAGNIOL-VILLARD 
409318c0b90SJean-Christophe PLAGNIOL-VILLARD 	/* valid pins are 10-17, 20-25 and 30-37 */
410318c0b90SJean-Christophe PLAGNIOL-VILLARD 	reg = pin/10;
411318c0b90SJean-Christophe PLAGNIOL-VILLARD 	bit = 1 << (pin%10);
412318c0b90SJean-Christophe PLAGNIOL-VILLARD 
413318c0b90SJean-Christophe PLAGNIOL-VILLARD 
414318c0b90SJean-Christophe PLAGNIOL-VILLARD 	outb(reg, ALI_CIO_INDEX);     /* select I/O register */
415318c0b90SJean-Christophe PLAGNIOL-VILLARD 	data = inb(ALI_CIO_DATA);
416318c0b90SJean-Christophe PLAGNIOL-VILLARD 
417318c0b90SJean-Christophe PLAGNIOL-VILLARD 	return data & bit;
418318c0b90SJean-Christophe PLAGNIOL-VILLARD }
419