Skip to content
Snippets Groups Projects
cmd_pcmcia.c 54.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
      0x0fffffff, 0xffffffff, 0xffffffff, 0xffffffff,
      0x01000000, 0x02000000, 0xffffffff, 0x04000000,
      0x00010000, 0x00020000, 0x00080000, 0x00040000,
      0x00800000, 0x00400000, 0x00100000, 0x00200000 };
    
    
    /* ---------------------------------------------------------------------------- */
    
    static u_int m8xx_get_graycode(u_int size)
    {
    	u_int k;
    
    	for (k = 0; k < M8XX_SIZES_NO; k++) {
    		if(m8xx_size_to_gray[k] == size)
    			break;
    	}
    
    	if((k == M8XX_SIZES_NO) || (m8xx_size_to_gray[k] == -1))
    		k = -1;
    
    	return k;
    }
    
    /* ------------------------------------------------------------------------- */
    
    #if 0
    static u_int m8xx_get_speed(u_int ns, u_int is_io)
    {
    	u_int reg, clocks, psst, psl, psht;
    
    	if(!ns) {
    
    		/*
    		 * We get called with IO maps setup to 0ns
    		 * if not specified by the user.
    		 * They should be 255ns.
    		 */
    
    		if(is_io)
    			ns = 255;
    		else
    			ns = 100;  /* fast memory if 0 */
    	}
    
    	/*
    	 * In PSST, PSL, PSHT fields we tell the controller
    	 * timing parameters in CLKOUT clock cycles.
    	 * CLKOUT is the same as GCLK2_50.
    	 */
    
    /* how we want to adjust the timing - in percent */
    
    #define ADJ 180 /* 80 % longer accesstime - to be sure */
    
    	clocks = ((M8XX_BUSFREQ / 1000) * ns) / 1000;
    	clocks = (clocks * ADJ) / (100*1000);
    
    	if(clocks >= PCMCIA_BMT_LIMIT) {
    		DEBUG(0, "Max access time limit reached\n");
    		clocks = PCMCIA_BMT_LIMIT-1;
    	}
    
    	psst = clocks / 7;          /* setup time */
    	psht = clocks / 7;          /* hold time */
    	psl  = (clocks * 5) / 7;    /* strobe length */
    
    	psst += clocks - (psst + psht + psl);
    
    	reg =  psst << 12;
    	reg |= psl  << 7;
    	reg |= psht << 16;
    
    	return reg;
    }
    #endif
    
    /* ------------------------------------------------------------------------- */
    
    #ifdef CONFIG_IDE_8xx_PCCARD
    static void print_funcid (int func)
    {
    	puts (indent);
    	switch (func) {
    	case CISTPL_FUNCID_MULTI:
    		puts (" Multi-Function");
    		break;
    	case CISTPL_FUNCID_MEMORY:
    		puts (" Memory");
    		break;
    	case CISTPL_FUNCID_SERIAL:
    		puts (" Serial Port");
    		break;
    	case CISTPL_FUNCID_PARALLEL:
    		puts (" Parallel Port");
    		break;
    	case CISTPL_FUNCID_FIXED:
    		puts (" Fixed Disk");
    		break;
    	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");
    		break;
    	}
    	puts (" Card\n");
    }
    #endif	/* CONFIG_IDE_8xx_PCCARD */
    
    /* ------------------------------------------------------------------------- */
    
    #ifdef CONFIG_IDE_8xx_PCCARD
    static void print_fixed (volatile uchar *p)
    {
    	if (p == NULL)
    		return;
    
    	puts(indent);
    
    	switch (*p) {
    	case CISTPL_FUNCE_IDE_IFACE:
    	    {   uchar iface = *(p+2);
    
    		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);
    
    		puts ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]");
    
    		if (f1 & CISTPL_IDE_UNIQUE)
    			puts (" [unique]");
    
    		puts ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]");
    
    		if (f2 & CISTPL_IDE_HAS_SLEEP)
    			puts (" [sleep]");
    
    		if (f2 & CISTPL_IDE_HAS_STANDBY)
    			puts (" [standby]");
    
    		if (f2 & CISTPL_IDE_HAS_IDLE)
    			puts (" [idle]");
    
    		if (f2 & CISTPL_IDE_LOW_POWER)
    			puts (" [low power]");
    
    		if (f2 & CISTPL_IDE_REG_INHIBIT)
    			puts (" [reg inhibit]");
    
    		if (f2 & CISTPL_IDE_HAS_INDEX)
    			puts (" [index]");
    
    		if (f2 & CISTPL_IDE_IOIS16)
    			puts (" [IOis16]");
    
    		break;
    	    }
    	}
    	putc ('\n');
    }
    #endif	/* CONFIG_IDE_8xx_PCCARD */
    
    /* ------------------------------------------------------------------------- */
    
    #ifdef CONFIG_IDE_8xx_PCCARD
    
    #define MAX_IDENT_CHARS		64
    #define	MAX_IDENT_FIELDS	4
    
    static uchar *known_cards[] = {
    	"ARGOSY PnPIDE D5",
    	NULL
    };
    
    static int identify  (volatile uchar *p)
    {
    	uchar id_str[MAX_IDENT_CHARS];
    	uchar data;
    	uchar *t;
    	uchar **card;
    	int i, done;
    
    	if (p == NULL)
    		return (0);	/* Don't know */
    
    	t = id_str;
    	done =0;
    
    	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++ = ' ';
    	}
    	*t = '\0';
    	while (--t > id_str) {
    		if (*t == ' ')
    			*t = '\0';
    		else
    			break;
    	}
    	puts (id_str);
    	putc ('\n');
    
    	for (card=known_cards; *card; ++card) {
    		debug ("## Compare against \"%s\"\n", *card);
    		if (strcmp(*card, id_str) == 0) {	/* found! */
    			debug ("## CARD FOUND ##\n");
    			return (1);
    		}
    	}
    
    	return (0);	/* don't know */
    }
    #endif	/* CONFIG_IDE_8xx_PCCARD */
    
    /* ------------------------------------------------------------------------- */
    
    #endif /* CFG_CMD_PCMCIA || (CFG_CMD_IDE && CONFIG_IDE_8xx_PCCARD) */