From: Pete P. <pp...@us...> - 2001-10-03 22:49:33
|
Update of /cvsroot/linux-mips/linux/drivers/pcmcia In directory usw-pr-cvs1:/tmp/cvs-serv25362/drivers/pcmcia Modified Files: au1000_generic.c au1000_pb1000.c Log Message: * Added pcmcia ide support. * fixed interrupt handler to work with new pb1000 pcmcia cpld * modified pcmcia driver to reflect cpld changes * hardcoded pcmcia driver to apply 3.3V if XV is detected, which seems to be a socket/hardware problem. Index: au1000_generic.c =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/pcmcia/au1000_generic.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- au1000_generic.c 2001/09/25 03:36:35 1.3 +++ au1000_generic.c 2001/10/03 22:49:23 1.4 @@ -1,4 +1,5 @@ /* + * * Alchemy Semi Au1000 pcmcia driver * * Copyright 2001 MontaVista Software Inc. @@ -80,18 +81,16 @@ /* Prototypes for routines which are used internally: */ -static int au1000_pcmcia_driver_init(void); +static int au1000_pcmcia_driver_init(void); static void au1000_pcmcia_driver_shutdown(void); static void au1000_pcmcia_task_handler(void *data); -static void au1000_pcmcia_poll_event(unsigned long data); -static void au1000_pcmcia_interrupt(int irq, void *dev, - struct pt_regs *regs); +static void au1000_pcmcia_poll_event(u32 data); +static void au1000_pcmcia_interrupt(int irq, void *dev, struct pt_regs *regs); static struct tq_struct au1000_pcmcia_task; #ifdef CONFIG_PROC_FS -static int au1000_pcmcia_proc_status(char *buf, char **start, - off_t pos, int count, int *eof, - void *data); +static int au1000_pcmcia_proc_status(char *buf, char **start, + off_t pos, int count, int *eof, void *data); #endif @@ -99,30 +98,20 @@ * new-and-impr^H^H^H^H^H^H^H^H^H^H in-kernel PCMCIA core: */ -static int au1000_pcmcia_init(unsigned int sock); -static int au1000_pcmcia_suspend(unsigned int sock); -static int au1000_pcmcia_register_callback(unsigned int sock, - void (*handler) (void *, - unsigned int), - void *info); -static int au1000_pcmcia_inquire_socket(unsigned int sock, - socket_cap_t * cap); -static int au1000_pcmcia_get_status(unsigned int sock, u_int * value); -static int au1000_pcmcia_get_socket(unsigned int sock, - socket_state_t * state); -static int au1000_pcmcia_set_socket(unsigned int sock, - socket_state_t * state); -static int au1000_pcmcia_get_io_map(unsigned int sock, - struct pccard_io_map *io); -static int au1000_pcmcia_set_io_map(unsigned int sock, - struct pccard_io_map *io); -static int au1000_pcmcia_get_mem_map(unsigned int sock, - struct pccard_mem_map *mem); -static int au1000_pcmcia_set_mem_map(unsigned int sock, - struct pccard_mem_map *mem); +static int au1000_pcmcia_init(u32 sock); +static int au1000_pcmcia_suspend(u32 sock); +static int au1000_pcmcia_register_callback(u32 sock, + void (*handler)(void *, u32), void *info); +static int au1000_pcmcia_inquire_socket(u32 sock, socket_cap_t *cap); +static int au1000_pcmcia_get_status(u32 sock, u_int *value); +static int au1000_pcmcia_get_socket(u32 sock, socket_state_t *state); +static int au1000_pcmcia_set_socket(u32 sock, socket_state_t *state); +static int au1000_pcmcia_get_io_map(u32 sock, struct pccard_io_map *io); +static int au1000_pcmcia_set_io_map(u32 sock, struct pccard_io_map *io); +static int au1000_pcmcia_get_mem_map(u32 sock, struct pccard_mem_map *mem); +static int au1000_pcmcia_set_mem_map(u32 sock, struct pccard_mem_map *mem); #ifdef CONFIG_PROC_FS -static void au1000_pcmcia_proc_setup(unsigned int sock, - struct proc_dir_entry *base); +static void au1000_pcmcia_proc_setup(u32 sock, struct proc_dir_entry *base); #endif static struct pccard_operations au1000_pcmcia_operations = { @@ -154,76 +143,76 @@ CardServices(GetCardServicesInfo, &info); - if (info.Revision != CS_RELEASE_CODE) { - printk(KERN_ERR - "Card Services release codes do not match\n"); + 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; + pcmcia_low_level=&pb1000_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 kernel PCMCIA service.\n"); + 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, STATIC_CONFIG_3); /* type = PCMCIA */ - writel(timing3, STATIC_TIMING_3); - writel(0x10000000, STATIC_ADDRESS_3); /* any PCMCIA select */ + writel(0x00000002, STATIC_CONFIG_3); /* type = PCMCIA */ + writel(timing3, STATIC_TIMING_3); + writel(0x10000000, STATIC_ADDRESS_3); /* any PCMCIA select */ + au_sync_delay(1); - pcmcia_socket = - kmalloc(sizeof(struct au1000_pcmcia_socket) * socket_count, - GFP_KERNEL); - memset(pcmcia_socket, 0, - sizeof(struct au1000_pcmcia_socket) * socket_count); + pcmcia_socket = + kmalloc(sizeof(struct au1000_pcmcia_socket) * socket_count, + GFP_KERNEL); + memset(pcmcia_socket, 0, + sizeof(struct au1000_pcmcia_socket) * socket_count); if (!pcmcia_socket) { printk(KERN_ERR "Card Services can't get memory \n"); return -1; } - - for (i = 0; i < socket_count; i++) { + + for(i=0; i < socket_count; i++) { - if (pcmcia_low_level->socket_state(i, &state) < 0) { - printk(KERN_ERR - "Unable to get PCMCIA status from kernel.\n"); + 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_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].virt_io = + (u32)ioremap(0xC0000000, 0x1000); pcmcia_socket[i].phys_attr = 0xC4000000; pcmcia_socket[i].phys_mem = 0xC8000000; - } else { - printk(KERN_ERR - "au1000: pcmcia socket 1 not supported\n"); + } + 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"); + 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. */ + /* 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() */ +} /* au1000_pcmcia_driver_init() */ module_init(au1000_pcmcia_driver_init); @@ -235,19 +224,16 @@ unregister_ss_entry(&au1000_pcmcia_operations); pcmcia_low_level->shutdown(); flush_scheduled_tasks(); - for (i = 0; i < socket_count; i++) { - if (pcmcia_socket[i].virt_io) - iounmap((void *) pcmcia_socket[i].virt_io); + for(i=0; i < socket_count; i++) { + if (pcmcia_socket[i].virt_io) + iounmap((void *)pcmcia_socket[i].virt_io); } DEBUG(1, "au1000: shutdown complete\n"); } module_exit(au1000_pcmcia_driver_shutdown); -static int au1000_pcmcia_init(unsigned int sock) -{ - return 0; -} +static int au1000_pcmcia_init(unsigned int sock) { return 0; } static int au1000_pcmcia_suspend(unsigned int sock) { @@ -255,85 +241,68 @@ } -static inline unsigned au1000_pcmcia_events(struct pcmcia_state *state, struct pcmcia_state - *prev_state, unsigned int mask, - unsigned int flags) +static inline unsigned +au1000_pcmcia_events(struct pcmcia_state *state, + struct pcmcia_state *prev_state, + unsigned int mask, unsigned int flags) { - unsigned int events = 0; + unsigned int events=0; - if (state->detect != prev_state->detect) { - DEBUG(2, "%s(): card detect value %u\n", __FUNCTION__, - state->detect); - events |= mask & SS_DETECT; + if(state->detect!=prev_state->detect){ + DEBUG(2, "%s(): card detect value %u\n", + __FUNCTION__, state->detect); + events |= mask&SS_DETECT; } - if (state->ready != prev_state->ready) { - DEBUG(2, "%s(): card ready value %u\n", __FUNCTION__, - state->ready); - events |= mask & ((flags & SS_IOCARD) ? 0 : SS_READY); - } - if (state->bvd1 != prev_state->bvd1) { - DEBUG(2, "%s(): card BVD1 value %u\n", __FUNCTION__, - state->bvd1); - events |= - mask & (flags & SS_IOCARD) ? SS_STSCHG : SS_BATDEAD; - } - - if (state->bvd2 != prev_state->bvd2) { - DEBUG(2, "%s(): card BVD2 value %u\n", __FUNCTION__, - state->bvd2); - events |= mask & (flags & SS_IOCARD) ? 0 : SS_BATWARN; + if(state->ready!=prev_state->ready){ + DEBUG(2, "%s(): card ready value %u\n", + __FUNCTION__, state->ready); + events |= mask&((flags&SS_IOCARD)?0:SS_READY); } - *prev_state = *state; + *prev_state=*state; return events; -} /* au1000_pcmcia_events() */ +} /* au1000_pcmcia_events() */ /* * Au1000_pcmcia_task_handler() * Processes socket events. */ -static void au1000_pcmcia_task_handler(void *data) +static void au1000_pcmcia_task_handler(void *data) { struct pcmcia_state state; int i, events, irq_status; - for (i = 0; i < socket_count; i++) { - if ( - (irq_status = - pcmcia_low_level->socket_state(i, &state)) < 0) - printk(KERN_ERR - "Error in kernel low-level PCMCIA service.\n"); + for(i=0; i<socket_count; i++) { + if((irq_status = pcmcia_low_level->socket_state(i, &state))<0) + printk(KERN_ERR "low-level PCMCIA error\n"); - events = au1000_pcmcia_events(&state, - &pcmcia_socket[i].k_state, - pcmcia_socket[i]. - cs_state.csc_mask, - pcmcia_socket[i]. - cs_state.flags); - if (pcmcia_socket[i].handler != NULL) { - pcmcia_socket[i]. - handler(pcmcia_socket[i].handler_info, events); + events = au1000_pcmcia_events(&state, + &pcmcia_socket[i].k_state, + pcmcia_socket[i].cs_state.csc_mask, + pcmcia_socket[i].cs_state.flags); + if(pcmcia_socket[i].handler!=NULL) { + pcmcia_socket[i].handler(pcmcia_socket[i].handler_info, + events); } } -} /* au1000_pcmcia_task_handler() */ +} /* au1000_pcmcia_task_handler() */ static struct tq_struct au1000_pcmcia_task = { - routine:au1000_pcmcia_task_handler + routine: au1000_pcmcia_task_handler }; -static void au1000_pcmcia_poll_event(unsigned long dummy) +static void au1000_pcmcia_poll_event(u32 dummy) { poll_timer.function = au1000_pcmcia_poll_event; poll_timer.expires = jiffies + AU1000_PCMCIA_POLL_PERIOD; add_timer(&poll_timer); schedule_task(&au1000_pcmcia_task); - //au1000_pcmcia_task_handler(0); } @@ -343,25 +312,24 @@ * because the Card Services event handling code performs scheduling * operations which cannot be executed from within an interrupt context. */ -static void au1000_pcmcia_interrupt(int irq, void *dev, - struct pt_regs *regs) +static void +au1000_pcmcia_interrupt(int irq, void *dev, struct pt_regs *regs) { schedule_task(&au1000_pcmcia_task); } -static int -au1000_pcmcia_register_callback(unsigned int sock, - void (*handler) (void *, unsigned int), - void *info) +static int +au1000_pcmcia_register_callback(unsigned int sock, + void (*handler)(void *, unsigned int), void *info) { - if (handler == NULL) { - pcmcia_socket[sock].handler = NULL; + if(handler==NULL){ + pcmcia_socket[sock].handler=NULL; MOD_DEC_USE_COUNT; } else { MOD_INC_USE_COUNT; - pcmcia_socket[sock].handler = handler; - pcmcia_socket[sock].handler_info = info; + pcmcia_socket[sock].handler=handler; + pcmcia_socket[sock].handler_info=info; } return 0; } @@ -385,140 +353,134 @@ * * Returns: 0 on success, -1 if no pin has been configured for `sock' */ -static int au1000_pcmcia_inquire_socket(unsigned int sock, - socket_cap_t * cap) +static int au1000_pcmcia_inquire_socket(unsigned int sock, socket_cap_t *cap) { struct pcmcia_irq_info irq_info; - if (sock > socket_count) { - printk(KERN_ERR "au1000: socket %u not configured\n", - sock); + if(sock > socket_count){ + printk(KERN_ERR "au1000: socket %u not configured\n", sock); return -1; } /* from the sa1100_generic driver: */ /* SS_CAP_PAGE_REGS: used by setup_cis_mem() in cistpl.c to set the - * force_low argument to validate_mem() in rsrc_mgr.c -- since in - * general, the mapped * addresses of the PCMCIA memory regions - * will not be within 0xffff, setting force_low would be - * undesirable. - * - * SS_CAP_STATIC_MAP: don't bother with the (user-configured) memory - * resource database; we instead pass up physical address ranges - * and allow other parts of Card Services to deal with remapping. - * - * SS_CAP_PCCARD: we can deal with 16-bit PCMCIA & CF cards, but - * not 32-bit CardBus devices. - */ - cap->features = - (SS_CAP_PAGE_REGS | SS_CAP_STATIC_MAP | SS_CAP_PCCARD); + * force_low argument to validate_mem() in rsrc_mgr.c -- since in + * general, the mapped * addresses of the PCMCIA memory regions + * will not be within 0xffff, setting force_low would be + * undesirable. + * + * SS_CAP_STATIC_MAP: don't bother with the (user-configured) memory + * resource database; we instead pass up physical address ranges + * and allow other parts of Card Services to deal with remapping. + * + * SS_CAP_PCCARD: we can deal with 16-bit PCMCIA & CF cards, but + * not 32-bit CardBus devices. + */ + cap->features=(SS_CAP_PAGE_REGS | SS_CAP_STATIC_MAP | SS_CAP_PCCARD); - irq_info.sock = sock; - irq_info.irq = -1; + irq_info.sock=sock; + irq_info.irq=-1; - if (pcmcia_low_level->get_irq_info(&irq_info) < 0) { - printk(KERN_ERR - "Error obtaining IRQ info from kernel for socket %u\n", - sock); + if(pcmcia_low_level->get_irq_info(&irq_info)<0){ + printk(KERN_ERR "Error obtaining IRQ info socket %u\n", sock); return -1; } - cap->irq_mask = 0; - cap->map_size = MAP_SIZE; - cap->pci_irq = irq_info.irq; - cap->io_offset = pcmcia_socket[sock].virt_io; + cap->irq_mask=0; + cap->map_size=MAP_SIZE; + cap->pci_irq=irq_info.irq; + cap->io_offset=pcmcia_socket[sock].virt_io; return 0; -} /* au1000_pcmcia_inquire_socket() */ +} /* au1000_pcmcia_inquire_socket() */ -static int +static int au1000_pcmcia_get_status(unsigned int sock, unsigned int *status) { struct pcmcia_state state; - if ((pcmcia_low_level->socket_state(sock, &state)) < 0) { - printk(KERN_ERR - "Unable to get PCMCIA status from kernel.\n"); + if((pcmcia_low_level->socket_state(sock, &state))<0){ + printk(KERN_ERR "Unable to get PCMCIA status from kernel.\n"); return -1; } pcmcia_socket[sock].k_state = state; - *status = state.detect ? SS_DETECT : 0; + *status = state.detect?SS_DETECT:0; - *status |= state.ready ? SS_READY : 0; + *status |= state.ready?SS_READY:0; - *status |= pcmcia_socket[sock].cs_state.Vcc ? SS_POWERON : 0; + *status |= pcmcia_socket[sock].cs_state.Vcc?SS_POWERON:0; - if (pcmcia_socket[sock].cs_state.flags & SS_IOCARD) - *status |= state.bvd1 ? SS_STSCHG : 0; + if(pcmcia_socket[sock].cs_state.flags&SS_IOCARD) + *status |= state.bvd1?SS_STSCHG:0; else { - if (state.bvd1 == 0) + if(state.bvd1==0) *status |= SS_BATDEAD; - else if (state.bvd2 == 0) + else if(state.bvd2 == 0) *status |= SS_BATWARN; } - *status |= state.vs_3v ? SS_3VCARD : 0; + *status|=state.vs_3v?SS_3VCARD:0; - *status |= state.vs_Xv ? SS_XVCARD : 0; + *status|=state.vs_Xv?SS_XVCARD:0; DEBUG(2, "\tstatus: %s%s%s%s%s%s%s%s\n", - (*status & SS_DETECT) ? "DETECT " : "", - (*status & SS_READY) ? "READY " : "", - (*status & SS_BATDEAD) ? "BATDEAD " : "", - (*status & SS_BATWARN) ? "BATWARN " : "", - (*status & SS_POWERON) ? "POWERON " : "", - (*status & SS_STSCHG) ? "STSCHG " : "", - (*status & SS_3VCARD) ? "3VCARD " : "", - (*status & SS_XVCARD) ? "XVCARD " : ""); + (*status&SS_DETECT)?"DETECT ":"", + (*status&SS_READY)?"READY ":"", + (*status&SS_BATDEAD)?"BATDEAD ":"", + (*status&SS_BATWARN)?"BATWARN ":"", + (*status&SS_POWERON)?"POWERON ":"", + (*status&SS_STSCHG)?"STSCHG ":"", + (*status&SS_3VCARD)?"3VCARD ":"", + (*status&SS_XVCARD)?"XVCARD ":""); return 0; -} /* au1000_pcmcia_get_status() */ +} /* au1000_pcmcia_get_status() */ -static int -au1000_pcmcia_get_socket(unsigned int sock, socket_state_t * state) +static int +au1000_pcmcia_get_socket(unsigned int sock, socket_state_t *state) { *state = pcmcia_socket[sock].cs_state; return 0; } -static int -au1000_pcmcia_set_socket(unsigned int sock, socket_state_t * state) +static int +au1000_pcmcia_set_socket(unsigned int sock, socket_state_t *state) { struct pcmcia_configure configure; DEBUG(2, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n" - "\tVcc %d Vpp %d irq %d\n", - (state->csc_mask == 0) ? "<NONE>" : "", - (state->csc_mask & SS_DETECT) ? "DETECT " : "", - (state->csc_mask & SS_READY) ? "READY " : "", - (state->csc_mask & SS_BATDEAD) ? "BATDEAD " : "", - (state->csc_mask & SS_BATWARN) ? "BATWARN " : "", - (state->csc_mask & SS_STSCHG) ? "STSCHG " : "", - (state->flags == 0) ? "<NONE>" : "", - (state->flags & SS_PWR_AUTO) ? "PWR_AUTO " : "", - (state->flags & SS_IOCARD) ? "IOCARD " : "", - (state->flags & SS_RESET) ? "RESET " : "", - (state->flags & SS_SPKR_ENA) ? "SPKR_ENA " : "", - (state->flags & SS_OUTPUT_ENA) ? "OUTPUT_ENA " : "", - state->Vcc, state->Vpp, state->io_irq); + "\tVcc %d Vpp %d irq %d\n", + (state->csc_mask==0)?"<NONE>":"", + (state->csc_mask&SS_DETECT)?"DETECT ":"", + (state->csc_mask&SS_READY)?"READY ":"", + (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"", + (state->csc_mask&SS_BATWARN)?"BATWARN ":"", + (state->csc_mask&SS_STSCHG)?"STSCHG ":"", + (state->flags==0)?"<NONE>":"", + (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"", + (state->flags&SS_IOCARD)?"IOCARD ":"", + (state->flags&SS_RESET)?"RESET ":"", + (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"", + (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"", + state->Vcc, state->Vpp, state->io_irq); - configure.sock = sock; - configure.vcc = state->Vcc; - configure.vpp = state->Vpp; - configure.output = (state->flags & SS_OUTPUT_ENA) ? 1 : 0; - configure.speaker = (state->flags & SS_SPKR_ENA) ? 1 : 0; - configure.reset = (state->flags & SS_RESET) ? 1 : 0; + configure.sock=sock; + configure.vcc=state->Vcc; + configure.vpp=state->Vpp; + configure.output=(state->flags&SS_OUTPUT_ENA)?1:0; + configure.speaker=(state->flags&SS_SPKR_ENA)?1:0; + configure.reset=(state->flags&SS_RESET)?1:0; - if (pcmcia_low_level->configure_socket(&configure) < 0) { + if(pcmcia_low_level->configure_socket(&configure)<0){ printk(KERN_ERR "Unable to configure socket %u\n", sock); return -1; } @@ -526,136 +488,136 @@ pcmcia_socket[sock].cs_state = *state; return 0; -} /* au1000_pcmcia_set_socket() */ +} /* au1000_pcmcia_set_socket() */ -static int +static int au1000_pcmcia_get_io_map(unsigned int sock, struct pccard_io_map *map) { DEBUG(1, "au1000_pcmcia_get_io_map: sock %d\n", sock); - if (map->map >= MAX_IO_WIN) { - printk(KERN_ERR "%s(): map (%d) out of range\n", - __FUNCTION__, map->map); + if(map->map>=MAX_IO_WIN){ + printk(KERN_ERR "%s(): map (%d) out of range\n", + __FUNCTION__, map->map); return -1; } - *map = pcmcia_socket[sock].io_map[map->map]; + *map=pcmcia_socket[sock].io_map[map->map]; return 0; } -int au1000_pcmcia_set_io_map(unsigned int sock, struct pccard_io_map *map) +int +au1000_pcmcia_set_io_map(unsigned int sock, struct pccard_io_map *map) { unsigned int speed; unsigned long start; - if (map->map >= MAX_IO_WIN) { - printk(KERN_ERR "%s(): map (%d) out of range\n", - __FUNCTION__, map->map); + if(map->map>=MAX_IO_WIN){ + printk(KERN_ERR "%s(): map (%d) out of range\n", + __FUNCTION__, map->map); return -1; } - if (map->flags & MAP_ACTIVE) { - speed = - (map->speed > 0) ? map->speed : AU1000_PCMCIA_IO_SPEED; - pcmcia_socket[sock].speed_io = speed; + if(map->flags&MAP_ACTIVE){ + speed=(map->speed>0)?map->speed:AU1000_PCMCIA_IO_SPEED; + pcmcia_socket[sock].speed_io=speed; } - start = map->start; + start=map->start; - if (map->stop == 1) { - map->stop = PAGE_SIZE - 1; + if(map->stop==1) { + map->stop=PAGE_SIZE-1; } - map->start = pcmcia_socket[sock].virt_io; - map->stop = map->start + (map->stop - start); - pcmcia_socket[sock].io_map[map->map] = *map; - DEBUG(3, "set_io_map %d start %x stop %x\n", map->map, map->start, - map->stop); + map->start=pcmcia_socket[sock].virt_io; + map->stop=map->start+(map->stop-start); + pcmcia_socket[sock].io_map[map->map]=*map; + DEBUG(3, "set_io_map %d start %x stop %x\n", + map->map, map->start, map->stop); return 0; -} +} /* au1000_pcmcia_set_io_map() */ -static int +static int au1000_pcmcia_get_mem_map(unsigned int sock, struct pccard_mem_map *map) { - if (map->map >= MAX_WIN) { - printk(KERN_ERR "%s(): map (%d) out of range\n", - __FUNCTION__, map->map); + if(map->map>=MAX_WIN) { + printk(KERN_ERR "%s(): map (%d) out of range\n", + __FUNCTION__, map->map); return -1; } - *map = pcmcia_socket[sock].mem_map[map->map]; + *map=pcmcia_socket[sock].mem_map[map->map]; return 0; } -static int +static int au1000_pcmcia_set_mem_map(unsigned int sock, struct pccard_mem_map *map) { unsigned int speed; unsigned long start; u_long flags; - if (map->map >= MAX_WIN) { - printk(KERN_ERR "%s(): map (%d) out of range\n", - __FUNCTION__, map->map); + if(map->map>=MAX_WIN){ + printk(KERN_ERR "%s(): map (%d) out of range\n", + __FUNCTION__, map->map); return -1; } - if (map->flags & MAP_ACTIVE) { - speed = - (map->speed > - 0) ? map->speed : AU1000_PCMCIA_MEM_SPEED; + if(map->flags&MAP_ACTIVE){ + speed=(map->speed>0)?map->speed:AU1000_PCMCIA_MEM_SPEED; /* TBD */ - if (map->flags & MAP_ATTRIB) { - pcmcia_socket[sock].speed_attr = speed; - } else { - pcmcia_socket[sock].speed_mem = speed; + if(map->flags&MAP_ATTRIB){ + pcmcia_socket[sock].speed_attr=speed; + } + else { + pcmcia_socket[sock].speed_mem=speed; } } save_flags(flags); cli(); - start = map->sys_start; + start=map->sys_start; - if (map->sys_stop == 0) - map->sys_stop = MAP_SIZE - 1; + if(map->sys_stop==0) + map->sys_stop=MAP_SIZE-1; if (map->flags & MAP_ATTRIB) { - map->sys_start = - pcmcia_socket[sock].phys_attr + map->card_start; - } else { - map->sys_start = - pcmcia_socket[sock].phys_mem + map->card_start; + map->sys_start = pcmcia_socket[sock].phys_attr + + map->card_start; + } + else { + map->sys_start = pcmcia_socket[sock].phys_mem + + map->card_start; } - map->sys_stop = map->sys_start + (map->sys_stop - start); - pcmcia_socket[sock].mem_map[map->map] = *map; + map->sys_stop=map->sys_start+(map->sys_stop-start); + pcmcia_socket[sock].mem_map[map->map]=*map; restore_flags(flags); - DEBUG(3, "set_mem_map %d start %x stop %x card_start %x\n", - map->map, map->sys_start, map->sys_stop, map->card_start); + DEBUG(3, "set_mem_map %d start %x stop %x card_start %x\n", + map->map, map->sys_start, map->sys_stop, + map->card_start); return 0; -} +} /* au1000_pcmcia_set_mem_map() */ #if defined(CONFIG_PROC_FS) -static void +static void au1000_pcmcia_proc_setup(unsigned int sock, struct proc_dir_entry *base) { struct proc_dir_entry *entry; - if ((entry = create_proc_entry("status", 0, base)) == NULL) { - printk(KERN_ERR - "Unable to install \"status\" procfs entry\n"); + if((entry=create_proc_entry("status", 0, base))==NULL){ + printk(KERN_ERR "Unable to install \"status\" procfs entry\n"); return; } - entry->read_proc = au1000_pcmcia_proc_status; - entry->data = (void *) sock; + entry->read_proc=au1000_pcmcia_proc_status; + entry->data=(void *)sock; } @@ -664,86 +626,69 @@ * * Returns: the number of characters added to the buffer */ -static int -au1000_pcmcia_proc_status(char *buf, char **start, off_t pos, - int count, int *eof, void *data) +static int +au1000_pcmcia_proc_status(char *buf, char **start, off_t pos, + int count, int *eof, void *data) { - char *p = buf; - unsigned int sock = (unsigned int) data; - - p += sprintf(p, "k_flags : %s%s%s%s%s%s%s\n", - pcmcia_socket[sock].k_state.detect ? "detect " : "", - pcmcia_socket[sock].k_state.ready ? "ready " : "", - pcmcia_socket[sock].k_state.bvd1 ? "bvd1 " : "", - pcmcia_socket[sock].k_state.bvd2 ? "bvd2 " : "", - pcmcia_socket[sock].k_state.wrprot ? "wrprot " : "", - pcmcia_socket[sock].k_state.vs_3v ? "vs_3v " : "", - pcmcia_socket[sock].k_state.vs_Xv ? "vs_Xv " : ""); - - p += sprintf(p, "status : %s%s%s%s%s%s%s%s%s\n", - pcmcia_socket[sock]. - k_state.detect ? "SS_DETECT " : "", - pcmcia_socket[sock].k_state.ready ? "SS_READY " : "", - pcmcia_socket[sock].cs_state.Vcc ? "SS_POWERON " : "", - pcmcia_socket[sock]. - cs_state.flags & SS_IOCARD ? \"SS_IOCARD " : "", - (pcmcia_socket[sock].cs_state.flags & SS_IOCARD - && pcmcia_socket[sock]. - k_state.bvd1) ? "SS_STSCHG " : "", - ((pcmcia_socket[sock].cs_state.flags & SS_IOCARD) == 0 - && (pcmcia_socket[sock].k_state.bvd1 == - 0)) ? "SS_BATDEAD " : "", - ((pcmcia_socket[sock].cs_state.flags & SS_IOCARD) == 0 - && (pcmcia_socket[sock].k_state.bvd2 == - 0)) ? "SS_BATWARN " : "", - pcmcia_socket[sock].k_state.vs_3v ? "SS_3VCARD " : "", - pcmcia_socket[sock]. - k_state.vs_Xv ? "SS_XVCARD " : ""); - - p += sprintf(p, "mask : %s%s%s%s%s\n", - pcmcia_socket[sock]. - cs_state.csc_mask & SS_DETECT ? \"SS_DETECT " : "", - pcmcia_socket[sock]. - cs_state.csc_mask & SS_READY ? \"SS_READY " : "", - pcmcia_socket[sock]. - cs_state.csc_mask & SS_BATDEAD ? \"SS_BATDEAD " : "", - pcmcia_socket[sock]. - cs_state.csc_mask & SS_BATWARN ? \"SS_BATWARN " : "", - pcmcia_socket[sock]. - cs_state.csc_mask & SS_STSCHG ? \"SS_STSCHG " : ""); - - p += sprintf(p, "cs_flags : %s%s%s%s%s\n", - pcmcia_socket[sock]. - cs_state.flags & SS_PWR_AUTO ? \"SS_PWR_AUTO " : "", - pcmcia_socket[sock]. - cs_state.flags & SS_IOCARD ? \"SS_IOCARD " : "", - pcmcia_socket[sock]. - cs_state.flags & SS_RESET ? \"SS_RESET " : "", - pcmcia_socket[sock]. - cs_state.flags & SS_SPKR_ENA ? \"SS_SPKR_ENA " : "", - pcmcia_socket[sock]. - cs_state.flags & SS_OUTPUT_ENA ? \"SS_OUTPUT_ENA " : - ""); - - p += - sprintf(p, "Vcc : %d\n", - pcmcia_socket[sock].cs_state.Vcc); - - p += - sprintf(p, "Vpp : %d\n", - pcmcia_socket[sock].cs_state.Vpp); + char *p=buf; + unsigned int sock=(unsigned int)data; - p += - sprintf(p, "irq : %d\n", - pcmcia_socket[sock].cs_state.io_irq); + p+=sprintf(p, "k_flags : %s%s%s%s%s%s%s\n", + pcmcia_socket[sock].k_state.detect?"detect ":"", + pcmcia_socket[sock].k_state.ready?"ready ":"", + pcmcia_socket[sock].k_state.bvd1?"bvd1 ":"", + pcmcia_socket[sock].k_state.bvd2?"bvd2 ":"", + pcmcia_socket[sock].k_state.wrprot?"wrprot ":"", + pcmcia_socket[sock].k_state.vs_3v?"vs_3v ":"", + pcmcia_socket[sock].k_state.vs_Xv?"vs_Xv ":""); - p += sprintf(p, "I/O : %u\n", pcmcia_socket[sock].speed_io); + p+=sprintf(p, "status : %s%s%s%s%s%s%s%s%s\n", + pcmcia_socket[sock].k_state.detect?"SS_DETECT ":"", + pcmcia_socket[sock].k_state.ready?"SS_READY ":"", + pcmcia_socket[sock].cs_state.Vcc?"SS_POWERON ":"", + pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\ + "SS_IOCARD ":"", + (pcmcia_socket[sock].cs_state.flags&SS_IOCARD && + pcmcia_socket[sock].k_state.bvd1)?"SS_STSCHG ":"", + ((pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 && + (pcmcia_socket[sock].k_state.bvd1==0))?"SS_BATDEAD ":"", + ((pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 && + (pcmcia_socket[sock].k_state.bvd2==0))?"SS_BATWARN ":"", + pcmcia_socket[sock].k_state.vs_3v?"SS_3VCARD ":"", + pcmcia_socket[sock].k_state.vs_Xv?"SS_XVCARD ":""); - p += sprintf(p, "attribute: %u\n", pcmcia_socket[sock].speed_attr); + p+=sprintf(p, "mask : %s%s%s%s%s\n", + pcmcia_socket[sock].cs_state.csc_mask&SS_DETECT?\ + "SS_DETECT ":"", + pcmcia_socket[sock].cs_state.csc_mask&SS_READY?\ + "SS_READY ":"", + pcmcia_socket[sock].cs_state.csc_mask&SS_BATDEAD?\ + "SS_BATDEAD ":"", + pcmcia_socket[sock].cs_state.csc_mask&SS_BATWARN?\ + "SS_BATWARN ":"", + pcmcia_socket[sock].cs_state.csc_mask&SS_STSCHG?\ + "SS_STSCHG ":""); - p += sprintf(p, "common : %u\n", pcmcia_socket[sock].speed_mem); + p+=sprintf(p, "cs_flags : %s%s%s%s%s\n", + pcmcia_socket[sock].cs_state.flags&SS_PWR_AUTO?\ + "SS_PWR_AUTO ":"", + pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\ + "SS_IOCARD ":"", + pcmcia_socket[sock].cs_state.flags&SS_RESET?\ + "SS_RESET ":"", + pcmcia_socket[sock].cs_state.flags&SS_SPKR_ENA?\ + "SS_SPKR_ENA ":"", + pcmcia_socket[sock].cs_state.flags&SS_OUTPUT_ENA?\ + "SS_OUTPUT_ENA ":""); - return p - buf; + p+=sprintf(p, "Vcc : %d\n", pcmcia_socket[sock].cs_state.Vcc); + p+=sprintf(p, "Vpp : %d\n", pcmcia_socket[sock].cs_state.Vpp); + p+=sprintf(p, "irq : %d\n", pcmcia_socket[sock].cs_state.io_irq); + p+=sprintf(p, "I/O : %u\n", pcmcia_socket[sock].speed_io); + p+=sprintf(p, "attribute: %u\n", pcmcia_socket[sock].speed_attr); + p+=sprintf(p, "common : %u\n", pcmcia_socket[sock].speed_mem); + return p-buf; } -#endif /* defined(CONFIG_PROC_FS) */ + +#endif /* defined(CONFIG_PROC_FS) */ Index: au1000_pb1000.c =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/pcmcia/au1000_pb1000.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- au1000_pb1000.c 2001/09/05 18:30:03 1.1 +++ au1000_pb1000.c 2001/10/03 22:49:23 1.2 @@ -1,4 +1,5 @@ /* + * * Alchemy Semi PB1000 board specific pcmcia routines. * * Copyright 2001 MontaVista Software Inc. @@ -61,15 +62,17 @@ { u32 pcr; pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; - //writel(readl(PIN_FUNCTION) & ~(1<<8), PIN_FUNCTION); /* pin15 is gpio */ - writel(0, PIN_FUNCTION); /* pin15 is gpio */ - writel(readl(TSTATE_STATE_SET) | (1 << 15), TSTATE_STATE_SET); /* tristate gpio15 */ - au_sync(); - writel(0x8000, AU1000_MDR); /* clear pcmcia interrupt */ - writel(0x4000, AU1000_MDR); /* enable pcmcia interrupt */ + writel(0x8000, AU1000_MDR); /* clear pcmcia interrupt */ + au_sync_delay(100); + writel(0x4000, AU1000_MDR); /* enable pcmcia interrupt */ au_sync(); + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0); + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,1); + writew(pcr, AU1000_PCR); + au_sync_delay(20); + /* There's two sockets, but only the first one, 0, is used and tested */ return 1; } @@ -77,13 +80,15 @@ static int pb1000_pcmcia_shutdown(void) { u16 pcr; - pcr = 0; + pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0); + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,1); writew(pcr, AU1000_PCR); - mdelay(20); + au_sync_delay(20); return 0; } -static int +static int pb1000_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) { u16 levels, pcr; @@ -98,57 +103,74 @@ state->detect = 0; /* + * This is tricky. The READY pin is also the #IRQ pin. We'll treat + * READY as #IRQ and set state->ready to 1 whenever state->detect + * is true. + */ + + /* * CD1/2 are active low; so are the VSS pins; Ready is active high */ if (sock == 0) { - if ((levels & ACR1_SLOT_0_READY)) - state->ready = 1; if (!(levels & (ACR1_SLOT_0_CD1 | ACR1_SLOT_0_CD2))) { state->detect = 1; - vs = (levels >> 4) & 0x3; + vs = (levels >> 4) & 0x3; switch (vs) { - case 0: - case 1: - DEBUG(1, "%d: vs_3v\n", sock); - state->vs_3v = 1; - break; - case 2: - state->vs_Xv = 1; - DEBUG(1, "%d: vs_Xv\n", sock); - break; - case 3: - default: - break; + case 0: + case 1: + DEBUG("%d: vs_3v\n", sock); + state->vs_3v=1; + break; + case 2: + /* + * This should be Xv voltage. + * Don't know why with some cards the + * register is reporting Xv voltage. + * For now assume case 2 is really 3V. + */ + state->vs_3v=1; + break; + case 3: + default: + break; } } - } else if (sock == 1) { - if ((levels & ACR1_SLOT_1_READY)) - state->ready = 1; + } + else if (sock == 1) { if (!(levels & (ACR1_SLOT_1_CD1 | ACR1_SLOT_1_CD2))) { state->detect = 1; - vs = (levels >> 12) & 0x3; + vs = (levels >> 12) & 0x3; switch (vs) { - case 0: - case 1: - state->vs_3v = 1; - DEBUG(1, "%d: vs_3v\n", sock); - break; - case 2: - state->vs_Xv = 1; - DEBUG(1, "%d: vs_Xv\n", sock); - break; - case 3: - default: - break; + case 0: + case 1: + state->vs_3v=1; + DEBUG(1, "%d: vs_3v\n", sock); + break; + case 2: + /* + * This should be Xv voltage. + * Don't know why with some cards the + * register is reporting Xv voltage. + * For now assume case 2 is really 3V. + */ + state->vs_3v=1; + break; + case 3: + default: + break; } } - } else { + } + else { printk(KERN_ERR "pb1000 socket_state bad sock %d\n", sock); } - state->bvd1 = 1; - state->bvd2 = 1; - state->wrprot = 0; + if (state->detect) + state->ready = 1; + + state->bvd1=1; + state->bvd2=1; + state->wrprot=0; return 1; } @@ -156,142 +178,153 @@ static int pb1000_pcmcia_get_irq_info(struct pcmcia_irq_info *info) { - if (info->sock > PCMCIA_MAX_SOCK) - return -1; + if(info->sock > PCMCIA_MAX_SOCK) return -1; - if (info->sock == 0) + if(info->sock == 0) info->irq = AU1000_GPIO_15; - else + else info->irq = -1; return 0; } -static int +static int pb1000_pcmcia_configure_socket(const struct pcmcia_configure *configure) { u16 pcr; - if (configure->sock > PCMCIA_MAX_SOCK) - return -1; + if(configure->sock > PCMCIA_MAX_SOCK) return -1; pcr = readw(AU1000_PCR); - if (configure->sock == 0) - pcr &= ~(PCR_SLOT_0_VCC0 | PCR_SLOT_0_VCC1); - else - pcr &= ~(PCR_SLOT_1_VCC0 | PCR_SLOT_1_VCC1); + if (configure->sock == 0) { + pcr &= ~(PCR_SLOT_0_VCC0 | PCR_SLOT_0_VCC1 | + PCR_SLOT_0_VPP0 | PCR_SLOT_0_VPP1); + } + else { + pcr &= ~(PCR_SLOT_1_VCC0 | PCR_SLOT_1_VCC1 | + PCR_SLOT_1_VPP0 | PCR_SLOT_1_VPP1); + } pcr &= ~PCR_SLOT_0_RST; writew(pcr, AU1000_PCR); - mdelay(20); + au_sync_delay(200); - switch (configure->vcc) { - case 0: /* Vcc 0 */ - switch (configure->vpp) { - case 0: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_GND, configure->sock); - DEBUG(3, "Vcc 0V Vpp 0V, pcr %x\n", pcr); - break; - case 12: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_12V, configure->sock); - DEBUG(3, "Vcc 0V Vpp 12V, pcr %x\n", pcr); - break; - case 50: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_5V, configure->sock); - DEBUG(3, "Vcc 0V Vpp 5V, pcr %x\n", pcr); - break; - case 33: - default: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_HIZ, configure->sock); - printk(KERN_ERR "%s: bad Vcc/Vpp combo (%d:%d)\n", - __FUNCTION__, configure->vcc, - configure->vpp); - break; - } - break; - case 50: /* Vcc 5V */ - switch (configure->vpp) { - case 0: - pcr |= - SET_VCC_VPP(VCC_5V, VPP_GND, configure->sock); - DEBUG(3, "Vcc 5V Vpp 0V, pcr %x\n", pcr); - break; - case 50: - pcr |= - SET_VCC_VPP(VCC_5V, VPP_5V, configure->sock); - DEBUG(3, "Vcc 5V Vpp 5V, pcr %x\n", pcr); - break; - case 12: - pcr |= - SET_VCC_VPP(VCC_5V, VPP_12V, configure->sock); - DEBUG(3, "Vcc 5V Vpp 12V, pcr %x\n", pcr); - break; - case 33: - default: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_HIZ, configure->sock); - printk(KERN_ERR "%s: bad Vcc/Vpp combo (%d:%d)\n", - __FUNCTION__, configure->vcc, - configure->vpp); - break; - } - break; - case 33: /* Vcc 3.3V */ - switch (configure->vpp) { - case 0: - pcr |= - SET_VCC_VPP(VCC_3V, VPP_GND, configure->sock); - DEBUG(3, "Vcc 3V Vpp 0V, pcr %x\n", pcr); + DEBUG(KERN_INFO "Vcc %dV Vpp %dV, pcr %x\n", + configure->vcc, configure->vpp, pcr); + switch(configure->vcc){ + case 0: /* Vcc 0 */ + switch(configure->vpp) { + case 0: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_GND, + configure->sock); + break; + case 12: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_12V, + configure->sock); + break; + case 50: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_5V, + configure->sock); + break; + case 33: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_3V, + configure->sock); + break; + default: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, + configure->sock); + printk("%s: bad Vcc/Vpp (%d:%d)\n", + __FUNCTION__, + configure->vcc, + configure->vpp); + break; + } break; - case 50: - pcr |= - SET_VCC_VPP(VCC_3V, VPP_5V, configure->sock); - DEBUG(3, "Vcc 3V Vpp 5V, pcr %x\n", pcr); + case 50: /* Vcc 5V */ + switch(configure->vpp) { + case 0: + pcr |= SET_VCC_VPP(VCC_5V,VPP_GND, + configure->sock); + break; + case 50: + pcr |= SET_VCC_VPP(VCC_5V,VPP_5V, + configure->sock); + break; + case 12: + pcr |= SET_VCC_VPP(VCC_5V,VPP_12V, + configure->sock); + break; + case 33: + pcr |= SET_VCC_VPP(VCC_5V,VPP_3V, + configure->sock); + break; + default: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, + configure->sock); + printk("%s: bad Vcc/Vpp (%d:%d)\n", + __FUNCTION__, + configure->vcc, + configure->vpp); + break; + } break; - case 12: - pcr |= - SET_VCC_VPP(VCC_3V, VPP_12V, configure->sock); - DEBUG(3, "Vcc 3V Vpp 12V, pcr %x\n", pcr); + case 33: /* Vcc 3.3V */ + switch(configure->vpp) { + case 0: + pcr |= SET_VCC_VPP(VCC_3V,VPP_GND, + configure->sock); + break; + case 50: + pcr |= SET_VCC_VPP(VCC_3V,VPP_5V, + configure->sock); + break; + case 12: + pcr |= SET_VCC_VPP(VCC_3V,VPP_12V, + configure->sock); + break; + case 33: + pcr |= SET_VCC_VPP(VCC_3V,VPP_3V, + configure->sock); + break; + default: + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, + configure->sock); + printk("%s: bad Vcc/Vpp (%d:%d)\n", + __FUNCTION__, + configure->vcc, + configure->vpp); + break; + } break; - case 33: - default: - pcr |= - SET_VCC_VPP(VCC_HIZ, VPP_HIZ, configure->sock); - printk(KERN_ERR "%s: bad Vcc/Vpp combo (%d:%d)\n", - __FUNCTION__, configure->vcc, - configure->vpp); + default: /* what's this ? */ + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,configure->sock); + printk(KERN_ERR "%s: bad Vcc %d\n", + __FUNCTION__, configure->vcc); break; - } - break; - default: /* what's this ? */ - pcr |= SET_VCC_VPP(VCC_HIZ, VPP_HIZ, configure->sock); - printk(KERN_ERR "%s: bad Vcc %d\n", __FUNCTION__, - configure->vcc); - break; } writew(pcr, AU1000_PCR); - mdelay(400); + au_sync_delay(300); - pcr &= ~PCR_SLOT_0_RST; + writew(pcr | PCR_SLOT_0_RST, AU1000_PCR); + au_sync_delay(100); + + pcr &= ~(PCR_SLOT_0_RST); if (configure->reset) { pcr |= PCR_SLOT_0_RST; } writew(pcr, AU1000_PCR); - mdelay(200); + au_sync_delay(100); return 0; } -struct pcmcia_low_level pb1000_pcmcia_ops = { +struct pcmcia_low_level pb1000_pcmcia_ops = { pb1000_pcmcia_init, pb1000_pcmcia_shutdown, pb1000_pcmcia_socket_state, pb1000_pcmcia_get_irq_info, pb1000_pcmcia_configure_socket }; + |