vserver 2.0 rc7
[linux-2.6.git] / drivers / mmc / wbsd.h
1 /*
2  *  linux/drivers/mmc/wbsd.h - Winbond W83L51xD SD/MMC driver
3  *
4  *  Copyright (C) 2004-2005 Pierre Ossman, All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 const int config_ports[] = { 0x2E, 0x4E };
12 const int unlock_codes[] = { 0x83, 0x87 };
13
14 const int valid_ids[] = {
15         0x7112,
16         };
17
18 #define LOCK_CODE               0xAA
19
20 #define WBSD_CONF_SWRST         0x02
21 #define WBSD_CONF_DEVICE        0x07
22 #define WBSD_CONF_ID_HI         0x20
23 #define WBSD_CONF_ID_LO         0x21
24 #define WBSD_CONF_POWER         0x22
25 #define WBSD_CONF_PME           0x23
26 #define WBSD_CONF_PMES          0x24
27
28 #define WBSD_CONF_ENABLE        0x30
29 #define WBSD_CONF_PORT_HI       0x60
30 #define WBSD_CONF_PORT_LO       0x61
31 #define WBSD_CONF_IRQ           0x70
32 #define WBSD_CONF_DRQ           0x74
33
34 #define WBSD_CONF_PINS          0xF0
35
36 #define DEVICE_SD               0x03
37
38 #define WBSD_PINS_DAT3_HI       0x20
39 #define WBSD_PINS_DAT3_OUT      0x10
40 #define WBSD_PINS_GP11_HI       0x04
41 #define WBSD_PINS_DETECT_GP11   0x02
42 #define WBSD_PINS_DETECT_DAT3   0x01
43
44 #define WBSD_CMDR               0x00
45 #define WBSD_DFR                0x01
46 #define WBSD_EIR                0x02
47 #define WBSD_ISR                0x03
48 #define WBSD_FSR                0x04
49 #define WBSD_IDXR               0x05
50 #define WBSD_DATAR              0x06
51 #define WBSD_CSR                0x07
52
53 #define WBSD_EINT_CARD          0x40
54 #define WBSD_EINT_FIFO_THRE     0x20
55 #define WBSD_EINT_CCRC          0x10
56 #define WBSD_EINT_TIMEOUT       0x08
57 #define WBSD_EINT_PROGEND       0x04
58 #define WBSD_EINT_CRC           0x02
59 #define WBSD_EINT_TC            0x01
60
61 #define WBSD_INT_PENDING        0x80
62 #define WBSD_INT_CARD           0x40
63 #define WBSD_INT_FIFO_THRE      0x20
64 #define WBSD_INT_CRC            0x10
65 #define WBSD_INT_TIMEOUT        0x08
66 #define WBSD_INT_PROGEND        0x04
67 #define WBSD_INT_BUSYEND        0x02
68 #define WBSD_INT_TC             0x01
69
70 #define WBSD_FIFO_EMPTY         0x80
71 #define WBSD_FIFO_FULL          0x40
72 #define WBSD_FIFO_EMTHRE        0x20
73 #define WBSD_FIFO_FUTHRE        0x10
74 #define WBSD_FIFO_SZMASK        0x0F
75
76 #define WBSD_MSLED              0x20
77 #define WBSD_POWER_N            0x10
78 #define WBSD_WRPT               0x04
79 #define WBSD_CARDPRESENT        0x01
80
81 #define WBSD_IDX_CLK            0x01
82 #define WBSD_IDX_PBSMSB         0x02
83 #define WBSD_IDX_TAAC           0x03
84 #define WBSD_IDX_NSAC           0x04
85 #define WBSD_IDX_PBSLSB         0x05
86 #define WBSD_IDX_SETUP          0x06
87 #define WBSD_IDX_DMA            0x07
88 #define WBSD_IDX_FIFOEN         0x08
89 #define WBSD_IDX_STATUS         0x10
90 #define WBSD_IDX_RSPLEN         0x1E
91 #define WBSD_IDX_RESP0          0x1F
92 #define WBSD_IDX_RESP1          0x20
93 #define WBSD_IDX_RESP2          0x21
94 #define WBSD_IDX_RESP3          0x22
95 #define WBSD_IDX_RESP4          0x23
96 #define WBSD_IDX_RESP5          0x24
97 #define WBSD_IDX_RESP6          0x25
98 #define WBSD_IDX_RESP7          0x26
99 #define WBSD_IDX_RESP8          0x27
100 #define WBSD_IDX_RESP9          0x28
101 #define WBSD_IDX_RESP10         0x29
102 #define WBSD_IDX_RESP11         0x2A
103 #define WBSD_IDX_RESP12         0x2B
104 #define WBSD_IDX_RESP13         0x2C
105 #define WBSD_IDX_RESP14         0x2D
106 #define WBSD_IDX_RESP15         0x2E
107 #define WBSD_IDX_RESP16         0x2F
108 #define WBSD_IDX_CRCSTATUS      0x30
109 #define WBSD_IDX_ISR            0x3F
110
111 #define WBSD_CLK_375K           0x00
112 #define WBSD_CLK_12M            0x01
113 #define WBSD_CLK_16M            0x02
114 #define WBSD_CLK_24M            0x03
115
116 #define WBSD_DAT3_H             0x08
117 #define WBSD_FIFO_RESET         0x04
118 #define WBSD_SOFT_RESET         0x02
119 #define WBSD_INC_INDEX          0x01
120
121 #define WBSD_DMA_SINGLE         0x02
122 #define WBSD_DMA_ENABLE         0x01
123
124 #define WBSD_FIFOEN_EMPTY       0x20
125 #define WBSD_FIFOEN_FULL        0x10
126 #define WBSD_FIFO_THREMASK      0x0F
127
128 #define WBSD_BLOCK_READ         0x80
129 #define WBSD_BLOCK_WRITE        0x40
130 #define WBSD_BUSY               0x20
131 #define WBSD_CARDTRAFFIC        0x04
132 #define WBSD_SENDCMD            0x02
133 #define WBSD_RECVRES            0x01
134
135 #define WBSD_RSP_SHORT          0x00
136 #define WBSD_RSP_LONG           0x01
137
138 #define WBSD_CRC_MASK           0x1F
139 #define WBSD_CRC_OK             0x05 /* S010E (00101) */
140 #define WBSD_CRC_FAIL           0x0B /* S101E (01011) */
141
142 #define WBSD_DMA_SIZE           65536
143
144 struct wbsd_host
145 {
146         struct mmc_host*        mmc;            /* MMC structure */
147         
148         spinlock_t              lock;           /* Mutex */
149
150         int                     flags;          /* Driver states */
151
152 #define WBSD_FCARD_PRESENT      (1<<0)          /* Card is present */
153 #define WBSD_FIGNORE_DETECT     (1<<1)          /* Ignore card detection */
154         
155         struct mmc_request*     mrq;            /* Current request */
156         
157         u8                      isr;            /* Accumulated ISR */
158         
159         struct scatterlist*     cur_sg;         /* Current SG entry */
160         unsigned int            num_sg;         /* Number of entries left */
161         void*                   mapped_sg;      /* vaddr of mapped sg */
162         
163         unsigned int            offset;         /* Offset into current entry */
164         unsigned int            remain;         /* Data left in curren entry */
165
166         int                     size;           /* Total size of transfer */
167         
168         char*                   dma_buffer;     /* ISA DMA buffer */
169         dma_addr_t              dma_addr;       /* Physical address for same */
170
171         int                     firsterr;       /* See fifo functions */
172         
173         u8                      clk;            /* Current clock speed */
174         
175         int                     config;         /* Config port */
176         u8                      unlock_code;    /* Code to unlock config */
177
178         int                     chip_id;        /* ID of controller */
179         
180         int                     base;           /* I/O port base */
181         int                     irq;            /* Interrupt */
182         int                     dma;            /* DMA channel */
183         
184         struct tasklet_struct   card_tasklet;   /* Tasklet structures */
185         struct tasklet_struct   fifo_tasklet;
186         struct tasklet_struct   crc_tasklet;
187         struct tasklet_struct   timeout_tasklet;
188         struct tasklet_struct   finish_tasklet;
189         struct tasklet_struct   block_tasklet;
190 };