static int __init au1000_pcmcia_driver_init(void) { servinfo_t info; struct pcmcia_init pcmcia_init; struct pcmcia_state state; unsigned int i; unsigned long timing3; printk("\nAu1x00 PCMCIA (CS release %s)\n", CS_RELEASE); CardServices(GetCardServicesInfo, &info); if(info.Revision!=CS_RELEASE_CODE){ printk(KERN_ERR "Card Services release codes do not match\n"); return -1; } #ifdef CONFIG_MIPS_PB1000 pcmcia_low_level=&pb1000_pcmcia_ops; #elif defined(CONFIG_MIPS_PB1500) pcmcia_low_level=&pb1500_pcmcia_ops; #else #error Unsupported AU1000 board. #endif pcmcia_init.handler=au1000_pcmcia_interrupt; if((socket_count=pcmcia_low_level->init(&pcmcia_init))<0) { printk(KERN_ERR "Unable to initialize PCMCIA service.\n"); return -EIO; } /* setup the static bus controller */ timing3 = 0x100e3a07; writel(0x00000002, MEM_STCFG3); /* type = PCMCIA */ writel(timing3, MEM_STTIME3); writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */ au_sync_delay(1); pcmcia_socket = kmalloc(sizeof(struct au1000_pcmcia_socket) * socket_count, GFP_KERNEL); if (!pcmcia_socket) { printk(KERN_ERR "Card Services can't get memory \n"); return -1; } memset(pcmcia_socket, 0, sizeof(struct au1000_pcmcia_socket) * socket_count); for(i=0; i < socket_count; i++) { if(pcmcia_low_level->socket_state(i, &state)<0){ printk(KERN_ERR "Unable to get PCMCIA status\n"); return -EIO; } pcmcia_socket[i].k_state=state; pcmcia_socket[i].cs_state.csc_mask=SS_DETECT; if (i == 0) { pcmcia_socket[i].virt_io = (u32)ioremap(0xC0000000, 0x1000); pcmcia_socket[i].phys_attr = 0xC4000000; pcmcia_socket[i].phys_mem = 0xC8000000; } else { printk(KERN_ERR "au1000: socket 1 not supported\n"); return 1; } } /* Only advertise as many sockets as we can detect: */ if(register_ss_entry(socket_count, &au1000_pcmcia_operations)<0){ printk(KERN_ERR "Unable to register socket service routine\n"); return -ENXIO; } /* Start the event poll timer. * It will reschedule by itself afterwards. */ au1000_pcmcia_poll_event(0); DEBUG(1, "au1000: initialization complete\n"); return 0; } /* au1000_pcmcia_driver_init() */
static int __init au1000_pcmcia_driver_init(void) { servinfo_t info; struct pcmcia_init pcmcia_init; struct pcmcia_state state; unsigned int i; printk("\nAu1x00 PCMCIA (CS release %s)\n", CS_RELEASE); #ifndef CONFIG_64BIT_PHYS_ADDR printk(KERN_ERR "Au1x00 PCMCIA 36 bit IO support not enabled\n"); return -1; #endif CardServices(GetCardServicesInfo, &info); if(info.Revision!=CS_RELEASE_CODE){ printk(KERN_ERR "Card Services release codes do not match\n"); return -1; } #if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_PB1500) pcmcia_low_level=&pb1x00_pcmcia_ops; #elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || defined(CONFIG_MIPS_DB1500) pcmcia_low_level=&db1x00_pcmcia_ops; #elif defined(CONFIG_MIPS_XXS1500) pcmcia_low_level=&xxs1500_pcmcia_ops; #else #error Unsupported AU1000 board. #endif pcmcia_init.handler=au1000_pcmcia_interrupt; if((socket_count=pcmcia_low_level->init(&pcmcia_init))<0) { printk(KERN_ERR "Unable to initialize PCMCIA service.\n"); return -EIO; } /* NOTE: the chip select must already be setup */ pcmcia_socket = kmalloc(sizeof(struct au1000_pcmcia_socket) * socket_count, GFP_KERNEL); if (!pcmcia_socket) { printk(KERN_ERR "Card Services can't get memory \n"); return -1; } memset(pcmcia_socket, 0, sizeof(struct au1000_pcmcia_socket) * socket_count); /* * Assuming max of 2 sockets, which the Au1000 supports. * WARNING: the Pb1000 has two sockets, and both work, but you * can't use them both at the same time due to glue logic conflicts. */ for(i=0; i < socket_count; i++) { if(pcmcia_low_level->socket_state(i, &state)<0){ printk(KERN_ERR "Unable to get PCMCIA status\n"); return -EIO; } pcmcia_socket[i].k_state=state; pcmcia_socket[i].cs_state.csc_mask=SS_DETECT; /* * PCMCIA drivers use the inb/outb macros to access the * IO registers. Since mips_io_port_base is added to the * access address, we need to subtract it here. */ if (i == 0) { pcmcia_socket[i].virt_io = (u32)ioremap((ioaddr_t)AU1X_SOCK0_IO, 0x1000) - mips_io_port_base; pcmcia_socket[i].phys_attr = (ioaddr_t)AU1X_SOCK0_PHYS_ATTR; pcmcia_socket[i].phys_mem = (ioaddr_t)AU1X_SOCK0_PHYS_MEM; } #ifndef CONFIG_MIPS_XXS1500 else { pcmcia_socket[i].virt_io = (u32)ioremap((ioaddr_t)AU1X_SOCK1_IO, 0x1000) - mips_io_port_base; pcmcia_socket[i].phys_attr = (ioaddr_t)AU1X_SOCK1_PHYS_ATTR; pcmcia_socket[i].phys_mem = (ioaddr_t)AU1X_SOCK1_PHYS_MEM; } #endif } /* Only advertise as many sockets as we can detect: */ if(register_ss_entry(socket_count, &au1000_pcmcia_operations)<0){ printk(KERN_ERR "Unable to register socket service routine\n"); return -ENXIO; } /* Start the event poll timer. * It will reschedule by itself afterwards. */ au1000_pcmcia_poll_event(0); DEBUG(1, "au1000: initialization complete\n"); return 0; } /* au1000_pcmcia_driver_init() */