include upstream ip1000a driver version 2.09f
[linux-2.4.git] / include / asm-i386 / sl811-hw.h
1 /*
2 File: include/asm-i386/sl811-hw.h
3
4 19.09.2003 hne@ist1.de
5 Use Kernel 2.4.20 and this source from 2.4.22
6 Splitt hardware depens into file sl811-x86.h and sl811-arm.h.
7 Functions are inline.
8
9 Handle multi instances. For two controller on one board.
10 "hc->data_io" not used for x86 arch.
11
12 22.09.2003 hne
13 Alternate IO-Base for second Controller (CF/USB1).
14
15 23.09.2003 hne
16 Move Hardware depend header sl811-x86.h into include/asm-i386/sl811-hw.h.
17
18 03.10.2003 hne
19 Low level only for port io into hardware-include.
20 */
21
22 #ifndef __LINUX_SL811_HW_H
23 #define __LINUX_SL811_HW_H
24
25 #define MAX_CONTROLERS  2       /* Max number of SL811 controllers per module */
26
27 static int io[MAX_CONTROLERS] = { 0x220, 0x222 };       /* IO ports for controllers */
28 static int irq[MAX_CONTROLERS] = { 12, 12 };            /* Interrupt list */
29
30 MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CONTROLERS) "i");
31 MODULE_PARM_DESC(io, "I/O base address(es), 0x220,0x222 default");
32 MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CONTROLERS) "i");
33 MODULE_PARM_DESC(irq, "IRQ number(s), 12,12 default");
34
35 #define OFFSET_DATA_REG         1       /* Offset from ADDR_IO to DATA_IO */
36                                         /* Do not change this! */
37 #define SIZEOF_IO_REGION        2       /* Size for request/release region */
38
39 /*
40  * Low level: Read from Data port [x86]
41  */
42 static __u8 inline sl811_read_data (struct sl811_hc *hc)
43 {
44         return ((__u8) inb (hc->addr_io+OFFSET_DATA_REG));
45 }
46
47 /*
48  * Low level: Write to index register [x86]
49  */
50 static void inline sl811_write_index (struct sl811_hc *hc, __u8 index)
51 {
52         outb (index, hc->addr_io);
53 }
54
55 /*
56  * Low level: Write to Data port [x86]
57  */
58 static void inline sl811_write_data (struct sl811_hc *hc, __u8 data)
59 {
60         outb (data, hc->addr_io+OFFSET_DATA_REG);
61 }
62
63 /*
64  * Low level: Write to index register and data port [x86]
65  */
66 static void inline sl811_write_index_data (struct sl811_hc *hc, __u8 index, __u8 data)
67 {
68         outw (index|(((__u16)data) << 8), hc->addr_io);
69 }
70
71 /*
72  * This function is board specific.  It sets up the interrupt to
73  * be an edge trigger and trigger on the rising edge
74  */
75 static void inline sl811_init_irq(void)
76 {
77         /* nothing for x86 */
78 }
79
80
81 /*****************************************************************
82  *
83  * Function Name: release_regions [x86]
84  *
85  * This function is board specific. It release all io address
86  * from memory (if can).
87  *
88  * Input: struct sl811_hc * *
89  *
90  * Return value  : 0 = OK
91  *
92  *****************************************************************/
93 static void inline sl811_release_regions(struct sl811_hc *hc)
94 {
95         if (hc->addr_io)
96                 release_region(hc->addr_io, SIZEOF_IO_REGION);
97         hc->addr_io = 0;
98
99         /* data_io unused for x86 */
100         /* ...
101         if (hc->data_io)
102                 release_region(hc->data_io, SIZEOF_IO_REGION);
103         hc->data_io = 0;
104         ... */
105 }
106
107 /*****************************************************************
108  *
109  * Function Name: request_regions [x86]
110  *
111  * This function is board specific. It request all io address and
112  * maps into memory (if can).
113  *
114  * Input: struct sl811_hc *
115  *
116  * Return value  : 0 = OK
117  *
118  *****************************************************************/
119 static int inline sl811_request_regions (struct sl811_hc *hc, int addr_io, int data_io, const char *name)
120 {
121         if (!request_region(addr_io, SIZEOF_IO_REGION, name)) {
122                 PDEBUG(3, "request address %d failed", addr_io);
123                 return -EBUSY;
124         }
125         hc->addr_io =   addr_io;
126
127         /* data_io unused for x86 */
128         /* hc->data_io = data_io; */
129
130         return 0;
131 }
132
133 #endif // __LINUX_SL811_HW_H