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