Blame view

cmd/pcmcia.c 7.06 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
c609719b8   wdenk   Initial revision
2
  /*
8cba090c5   Wolfgang Denk   Add support for V...
3
   * (C) Copyright 2000-2006
c609719b8   wdenk   Initial revision
4
5
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
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
   ********************************************************************
   *
   * 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...
43
  #include <asm/io.h>
1f53a4160   wdenk   Add LED indicatio...
44
  /* -------------------------------------------------------------------- */
c609719b8   wdenk   Initial revision
45

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

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

54841ab50   Wolfgang Denk   Make sure that ar...
51
  int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
c609719b8   wdenk   Initial revision
52
53
54
55
56
57
58
59
60
  {
  	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...
61
  		rcode = pcmcia_on ();
c609719b8   wdenk   Initial revision
62
63
64
65
66
67
68
69
70
71
  	} 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...
72

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

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

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

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

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

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

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

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

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

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

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

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

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
155
156
157
158
159
160
161
162
  		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...
163

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
  	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
228
  	}
9d4079955   Wolfgang Denk   Major PCMCIA Clea...
229
230
231
232
233
234
235
236
237
238
  	*t = '\0';
  	while (--t > id_str) {
  		if (*t == ' ')
  			*t = '\0';
  		else
  			break;
  	}
  	puts ((char *)id_str);
  	putc ('
  ');
c609719b8   wdenk   Initial revision
239

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
240
241
242
243
244
245
246
247
248
  	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
249

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

9d4079955   Wolfgang Denk   Major PCMCIA Clea...
253
  int check_ide_device (int slot)
c609719b8   wdenk   Initial revision
254
255
256
  {
  	volatile uchar *ident = NULL;
  	volatile uchar *feature_p[MAX_FEATURES];
ea909b760   wdenk   * Added support f...
257
  	volatile uchar *p, *start, *addr;
c609719b8   wdenk   Initial revision
258
259
260
261
262
263
  	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...
264
265
  	addr = (volatile uchar *)(CONFIG_SYS_PCMCIA_MEM_ADDR +
  				  CONFIG_SYS_PCMCIA_MEM_SIZE * (slot * 4));
d0fb80c30   wdenk   * Restrict baudra...
266
267
  	debug ("PCMCIA MEM: %08lX
  ", (ulong)addr);
c609719b8   wdenk   Initial revision
268

ea909b760   wdenk   * Added support f...
269
  	start = p = (volatile uchar *) addr;
c609719b8   wdenk   Initial revision
270
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
  
  	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...
336
  	ide_devices_found |= (1 << slot);
c609719b8   wdenk   Initial revision
337
  	/* set I/O area in config reg -> only valid for ARGOSY D5!!! */
ea909b760   wdenk   * Added support f...
338
  	*((uchar *)(addr + config_base)) = 1;
e2ffd59b4   wdenk   * Code cleanup, m...
339
340
341
342
343
344
345
346
347
348
349
350
351
  #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
352
353
  	return (0);
  }
c609719b8   wdenk   Initial revision
354

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