Blame view

cmd/pcmcia.c 7.07 KB
c609719b8   wdenk   Initial revision
1
  /*
8cba090c5   Wolfgang Denk   Add support for V...
2
   * (C) Copyright 2000-2006
c609719b8   wdenk   Initial revision
3
4
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
c609719b8   wdenk   Initial revision
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
   *
   ********************************************************************
   *
   * Lots of code copied from:
   *
   * m8xx_pcmcia.c - Linux PCMCIA socket driver for the mpc8xx series.
   * (C) 1999-2000 Magnus Damm <damm@bitsmart.com>
   *
   * "The ExCA standard specifies that socket controllers should provide
   * two IO and five memory windows per socket, which can be independently
   * configured and positioned in the host address space and mapped to
   * arbitrary segments of card address space. " - David A Hinds. 1999
   *
   * This controller does _not_ meet the ExCA standard.
   *
   * m8xx pcmcia controller brief info:
   * + 8 windows (attrib, mem, i/o)
   * + up to two slots (SLOT_A and SLOT_B)
   * + inputpins, outputpins, event and mask registers.
   * - no offset register. sigh.
   *
   * Because of the lacking offset register we must map the whole card.
   * We assign each memory window PCMCIA_MEM_WIN_SIZE address space.
   * Make sure there is (PCMCIA_MEM_WIN_SIZE * PCMCIA_MEM_WIN_NO
   * * PCMCIA_SOCKETS_NO) bytes at PCMCIA_MEM_WIN_BASE.
   * The i/o windows are dynamically allocated at PCMCIA_IO_WIN_BASE.
   * They are maximum 64KByte each...
   */
  
  /* #define DEBUG	1	*/
  
  /*
   * PCMCIA support
   */
  #include <common.h>
  #include <command.h>
  #include <config.h>
  #include <pcmcia.h>
e2ffd59b4   wdenk   * Code cleanup, m...
44
  #include <asm/io.h>
1f53a4160   wdenk   Add LED indicatio...
45
  /* -------------------------------------------------------------------- */
c609719b8   wdenk   Initial revision
46

fd9bcaa35   Jon Loeliger   common/cmd_[p-x]*...
47
  #if defined(CONFIG_CMD_PCMCIA)
db01a2ea9   wdenk   * Patch by Stephe...
48

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
49
50
  extern int pcmcia_on (void);
  extern int pcmcia_off (void);
c609719b8   wdenk   Initial revision
51

54841ab50   Wolfgang Denk   Make sure that ar...
52
  int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
c609719b8   wdenk   Initial revision
53
54
55
56
57
58
59
60
61
  {
  	int rcode = 0;
  
  	if (argc != 2) {
  		printf ("Usage: pinit {on | off}
  ");
  		return 1;
  	}
  	if (strcmp(argv[1],"on") == 0) {
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
62
  		rcode = pcmcia_on ();
c609719b8   wdenk   Initial revision
63
64
65
66
67
68
69
70
71
72
  	} else if (strcmp(argv[1],"off") == 0) {
  		rcode = pcmcia_off ();
  	} else {
  		printf ("Usage: pinit {on | off}
  ");
  		return 1;
  	}
  
  	return rcode;
  }
66fd3d1ce   wdenk   Add support for C...
73

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
74
  U_BOOT_CMD(
9912121f7   Detlev Zundel   Change 'repeatabl...
75
  	pinit,	2,	0,	do_pinit,
2fb2604d5   Peter Tyser   Command usage cle...
76
  	"PCMCIA sub-system",
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
77
78
  	"on  - power on PCMCIA socket
  "
a89c33db9   Wolfgang Denk   General help mess...
79
80
  	"pinit off - power off PCMCIA socket"
  );
66fd3d1ce   wdenk   Add support for C...
81

fd9bcaa35   Jon Loeliger   common/cmd_[p-x]*...
82
  #endif
66fd3d1ce   wdenk   Add support for C...
83

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
84
  /* -------------------------------------------------------------------- */
66fd3d1ce   wdenk   Add support for C...
85

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
86
  #undef	CHECK_IDE_DEVICE
db01a2ea9   wdenk   * Patch by Stephe...
87

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
88
89
  #if	defined(CONFIG_PXA_PCMCIA)
  #define	CHECK_IDE_DEVICE
c609719b8   wdenk   Initial revision
90
  #endif
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
91
  #ifdef	CHECK_IDE_DEVICE
c609719b8   wdenk   Initial revision
92

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
93
94
95
96
97
  int		ide_devices_found;
  static uchar	*known_cards[] = {
  	(uchar *)"ARGOSY PnPIDE D5",
  	NULL
  };
c609719b8   wdenk   Initial revision
98

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
99
100
  #define	MAX_TUPEL_SZ	512
  #define MAX_FEATURES	4
c609719b8   wdenk   Initial revision
101

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
102
103
  #define MAX_IDENT_CHARS		64
  #define	MAX_IDENT_FIELDS	4
c609719b8   wdenk   Initial revision
104

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
105
  #define	indent	"\t   "
c609719b8   wdenk   Initial revision
106

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
107
108
109
110
111
112
  static void print_funcid (int func)
  {
  	puts (indent);
  	switch (func) {
  		case CISTPL_FUNCID_MULTI:
  			puts (" Multi-Function");
a6cccaea5   wdenk   * Patch by Wolter...
113
  			break;
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
114
115
  		case CISTPL_FUNCID_MEMORY:
  			puts (" Memory");
c609719b8   wdenk   Initial revision
116
  			break;
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
117
118
  		case CISTPL_FUNCID_SERIAL:
  			puts (" Serial Port");
c609719b8   wdenk   Initial revision
119
  			break;
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
120
121
  		case CISTPL_FUNCID_PARALLEL:
  			puts (" Parallel Port");
c609719b8   wdenk   Initial revision
122
  			break;
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
123
124
  		case CISTPL_FUNCID_FIXED:
  			puts (" Fixed Disk");
7cb22f97e   wdenk   * Make CPU clock ...
125
  			break;
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  		case CISTPL_FUNCID_VIDEO:
  			puts (" Video Adapter");
  			break;
  		case CISTPL_FUNCID_NETWORK:
  			puts (" Network Adapter");
  			break;
  		case CISTPL_FUNCID_AIMS:
  			puts (" AIMS Card");
  			break;
  		case CISTPL_FUNCID_SCSI:
  			puts (" SCSI Adapter");
  			break;
  		default:
  			puts (" Unknown");
c609719b8   wdenk   Initial revision
140
  			break;
ea909b760   wdenk   * Added support f...
141
  	}
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
142
143
  	puts (" Card
  ");
db01a2ea9   wdenk   * Patch by Stephe...
144
  }
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
145
  static void print_fixed (volatile uchar *p)
db01a2ea9   wdenk   * Patch by Stephe...
146
  {
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
147
148
  	if (p == NULL)
  		return;
db01a2ea9   wdenk   * Patch by Stephe...
149

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
150
  	puts(indent);
db01a2ea9   wdenk   * Patch by Stephe...
151

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
152
153
154
  	switch (*p) {
  		case CISTPL_FUNCE_IDE_IFACE:
  		{   uchar iface = *(p+2);
db01a2ea9   wdenk   * Patch by Stephe...
155

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
156
157
158
159
160
161
162
163
  		puts ((iface == CISTPL_IDE_INTERFACE) ? " IDE" : " unknown");
  		puts (" interface ");
  		break;
  		}
  		case CISTPL_FUNCE_IDE_MASTER:
  		case CISTPL_FUNCE_IDE_SLAVE:
  		{   uchar f1 = *(p+2);
  		uchar f2 = *(p+4);
db01a2ea9   wdenk   * Patch by Stephe...
164

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
165
  		puts ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]");
db01a2ea9   wdenk   * Patch by Stephe...
166

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
167
168
  		if (f1 & CISTPL_IDE_UNIQUE)
  			puts (" [unique]");
db01a2ea9   wdenk   * Patch by Stephe...
169

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
170
  		puts ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]");
db01a2ea9   wdenk   * Patch by Stephe...
171

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
172
173
  		if (f2 & CISTPL_IDE_HAS_SLEEP)
  			puts (" [sleep]");
db01a2ea9   wdenk   * Patch by Stephe...
174

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
175
176
  		if (f2 & CISTPL_IDE_HAS_STANDBY)
  			puts (" [standby]");
db01a2ea9   wdenk   * Patch by Stephe...
177

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
178
179
  		if (f2 & CISTPL_IDE_HAS_IDLE)
  			puts (" [idle]");
db01a2ea9   wdenk   * Patch by Stephe...
180

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
181
182
  		if (f2 & CISTPL_IDE_LOW_POWER)
  			puts (" [low power]");
c609719b8   wdenk   Initial revision
183

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
184
185
  		if (f2 & CISTPL_IDE_REG_INHIBIT)
  			puts (" [reg inhibit]");
c609719b8   wdenk   Initial revision
186

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
187
188
  		if (f2 & CISTPL_IDE_HAS_INDEX)
  			puts (" [index]");
66fd3d1ce   wdenk   Add support for C...
189

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
190
191
  		if (f2 & CISTPL_IDE_IOIS16)
  			puts (" [IOis16]");
66fd3d1ce   wdenk   Add support for C...
192

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
193
194
195
196
197
  		break;
  		}
  	}
  	putc ('
  ');
66fd3d1ce   wdenk   Add support for C...
198
  }
db01a2ea9   wdenk   * Patch by Stephe...
199

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
200
  static int identify  (volatile uchar *p)
c609719b8   wdenk   Initial revision
201
  {
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
202
203
204
205
206
  	uchar id_str[MAX_IDENT_CHARS];
  	uchar data;
  	uchar *t;
  	uchar **card;
  	int i, done;
c609719b8   wdenk   Initial revision
207

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
208
209
  	if (p == NULL)
  		return (0);	/* Don't know */
c609719b8   wdenk   Initial revision
210

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
211
212
  	t = id_str;
  	done =0;
c609719b8   wdenk   Initial revision
213

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  	for (i=0; i<=4 && !done; ++i, p+=2) {
  		while ((data = *p) != '\0') {
  			if (data == 0xFF) {
  				done = 1;
  				break;
  			}
  			*t++ = data;
  			if (t == &id_str[MAX_IDENT_CHARS-1]) {
  				done = 1;
  				break;
  			}
  			p += 2;
  		}
  		if (!done)
  			*t++ = ' ';
c609719b8   wdenk   Initial revision
229
  	}
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
230
231
232
233
234
235
236
237
238
239
  	*t = '\0';
  	while (--t > id_str) {
  		if (*t == ' ')
  			*t = '\0';
  		else
  			break;
  	}
  	puts ((char *)id_str);
  	putc ('
  ');
c609719b8   wdenk   Initial revision
240

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
241
242
243
244
245
246
247
248
249
  	for (card=known_cards; *card; ++card) {
  		debug ("## Compare against \"%s\"
  ", *card);
  		if (strcmp((char *)*card, (char *)id_str) == 0) {	/* found! */
  			debug ("## CARD FOUND ##
  ");
  			return (1);
  		}
  	}
c609719b8   wdenk   Initial revision
250

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
251
  	return (0);	/* don't know */
db01a2ea9   wdenk   * Patch by Stephe...
252
  }
c609719b8   wdenk   Initial revision
253

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
254
  int check_ide_device (int slot)
c609719b8   wdenk   Initial revision
255
256
257
  {
  	volatile uchar *ident = NULL;
  	volatile uchar *feature_p[MAX_FEATURES];
ea909b760   wdenk   * Added support f...
258
  	volatile uchar *p, *start, *addr;
c609719b8   wdenk   Initial revision
259
260
261
262
263
264
  	int n_features = 0;
  	uchar func_id = ~0;
  	uchar code, len;
  	ushort config_base = 0;
  	int found = 0;
  	int i;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
265
266
  	addr = (volatile uchar *)(CONFIG_SYS_PCMCIA_MEM_ADDR +
  				  CONFIG_SYS_PCMCIA_MEM_SIZE * (slot * 4));
d0fb80c30   wdenk   * Restrict baudra...
267
268
  	debug ("PCMCIA MEM: %08lX
  ", (ulong)addr);
c609719b8   wdenk   Initial revision
269

ea909b760   wdenk   * Added support f...
270
  	start = p = (volatile uchar *) addr;
c609719b8   wdenk   Initial revision
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  
  	while ((p - start) < MAX_TUPEL_SZ) {
  
  		code = *p; p += 2;
  
  		if (code == 0xFF) { /* End of chain */
  			break;
  		}
  
  		len = *p; p += 2;
  #if defined(DEBUG) && (DEBUG > 1)
  		{ volatile uchar *q = p;
  			printf ("
  Tuple code %02x  length %d
  \tData:",
  				code, len);
  
  			for (i = 0; i < len; ++i) {
  				printf (" %02x", *q);
  				q+= 2;
  			}
  		}
  #endif	/* DEBUG */
  		switch (code) {
  		case CISTPL_VERS_1:
  			ident = p + 4;
  			break;
  		case CISTPL_FUNCID:
  			/* Fix for broken SanDisk which may have 0x80 bit set */
  			func_id = *p & 0x7F;
  			break;
  		case CISTPL_FUNCE:
  			if (n_features < MAX_FEATURES)
  				feature_p[n_features++] = p;
  			break;
  		case CISTPL_CONFIG:
  			config_base = (*(p+6) << 8) + (*(p+4));
  			debug ("
  ## Config_base = %04x ###
  ", config_base);
  		default:
  			break;
  		}
  		p += 2 * len;
  	}
  
  	found = identify (ident);
  
  	if (func_id != ((uchar)~0)) {
  		print_funcid (func_id);
  
  		if (func_id == CISTPL_FUNCID_FIXED)
  			found = 1;
  		else
  			return (1);	/* no disk drive */
  	}
  
  	for (i=0; i<n_features; ++i) {
  		print_fixed (feature_p[i]);
  	}
  
  	if (!found) {
  		printf ("unknown card type
  ");
  		return (1);
  	}
6069ff265   wdenk   * Add support for...
337
  	ide_devices_found |= (1 << slot);
c609719b8   wdenk   Initial revision
338
  	/* set I/O area in config reg -> only valid for ARGOSY D5!!! */
ea909b760   wdenk   * Added support f...
339
  	*((uchar *)(addr + config_base)) = 1;
e2ffd59b4   wdenk   * Code cleanup, m...
340
341
342
343
344
345
346
347
348
349
350
351
352
  #if 0
  	printf("
  ## Config_base = %04x ###
  ", config_base);
  	printf("Configuration Option Register: %02x @ %x
  ", readb(addr + config_base), addr + config_base);
  	printf("Card Configuration and Status Register: %02x
  ", readb(addr + config_base + 2));
  	printf("Pin Replacement Register Register: %02x
  ", readb(addr + config_base + 4));
  	printf("Socket and Copy Register: %02x
  ", readb(addr + config_base + 6));
  #endif
c609719b8   wdenk   Initial revision
353
354
  	return (0);
  }
c609719b8   wdenk   Initial revision
355

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
356
  #endif	/* CHECK_IDE_DEVICE */