static int synth_probe(struct spk_synth *synth) { unsigned int port_val = 0; int i = 0; struct synth_settings *sp; pr_info("Probing for DoubleTalk.\n"); if (port_forced) { speakup_info.port_tts = port_forced; pr_info("probe forced to %x by kernel command line\n", speakup_info.port_tts); if ((port_forced & 0xf) != 0xf) pr_info("warning: port base should probably end with f\n"); if (synth_request_region(speakup_info.port_tts-1, SYNTH_IO_EXTENT)) { pr_warn("sorry, port already reserved\n"); return -EBUSY; } port_val = inw(speakup_info.port_tts-1); synth_lpc = speakup_info.port_tts-1; } else { for (i = 0; synth_portlist[i]; i++) { if (synth_request_region(synth_portlist[i], SYNTH_IO_EXTENT)) continue; port_val = inw(synth_portlist[i]) & 0xfbff; if (port_val == 0x107f) { synth_lpc = synth_portlist[i]; speakup_info.port_tts = synth_lpc+1; break; } synth_release_region(synth_portlist[i], SYNTH_IO_EXTENT); } } port_val &= 0xfbff; if (port_val != 0x107f) { pr_info("DoubleTalk PC: not found\n"); synth_release_region(synth_lpc, SYNTH_IO_EXTENT); return -ENODEV; } while (inw_p(synth_lpc) != 0x147f) cpu_relax(); /* wait until it's ready */ sp = synth_interrogate(synth); pr_info("%s: %03x-%03x, ROM ver %s, s/n %u, driver: %s\n", synth->long_name, synth_lpc, synth_lpc+SYNTH_IO_EXTENT - 1, sp->rom_version, sp->serial_number, synth->version); synth->alive = 1; return 0; }
void spk_serial_release(void) { if (speakup_info.port_tts == 0) return; synth_release_region(speakup_info.port_tts, 8); speakup_info.port_tts = 0; }
static void keynote_release(void) { spk_stop_serial_interrupt(); if (synth_port) synth_release_region(synth_port, SYNTH_IO_EXTENT); synth_port = 0; }
static void dtpc_release(void) { spk_stop_serial_interrupt(); if (speakup_info.port_tts) synth_release_region(speakup_info.port_tts, SYNTH_IO_EXTENT); speakup_info.port_tts = 0; }
struct serial_state *spk_serial_init(int index) { int baud = 9600, quot = 0; unsigned int cval = 0; int cflag = CREAD | HUPCL | CLOCAL | B9600 | CS8; struct serial_state *ser = NULL; int err; ser = rs_table + index; /* Divisor, bytesize and parity */ quot = ser->baud_base / baud; cval = cflag & (CSIZE | CSTOPB); #if defined(__powerpc__) || defined(__alpha__) cval >>= 8; #else /* !__powerpc__ && !__alpha__ */ cval >>= 4; #endif /* !__powerpc__ && !__alpha__ */ if (cflag & PARENB) cval |= UART_LCR_PARITY; if (!(cflag & PARODD)) cval |= UART_LCR_EPAR; if (synth_request_region(ser->port, 8)) { /* try to take it back. */ printk(KERN_INFO "Ports not available, trying to steal them\n"); __release_region(&ioport_resource, ser->port, 8); err = synth_request_region(ser->port, 8); if (err) { pr_warn("Unable to allocate port at %lx, errno %i", ser->port, err); return NULL; } } /* Disable UART interrupts, set DTR and RTS high * and set speed. */ outb(cval | UART_LCR_DLAB, ser->port + UART_LCR); /* set DLAB */ outb(quot & 0xff, ser->port + UART_DLL); /* LS of divisor */ outb(quot >> 8, ser->port + UART_DLM); /* MS of divisor */ outb(cval, ser->port + UART_LCR); /* reset DLAB */ /* Turn off Interrupts */ outb(0, ser->port + UART_IER); outb(UART_MCR_DTR | UART_MCR_RTS, ser->port + UART_MCR); /* If we read 0xff from the LSR, there is no UART here. */ if (inb(ser->port + UART_LSR) == 0xff) { synth_release_region(ser->port, 8); serstate = NULL; return NULL; } mdelay(1); speakup_info.port_tts = ser->port; serstate = ser; start_serial_interrupt(ser->irq); return ser; }
const struct old_serial_port *spk_serial_init(int index) { int baud = 9600, quot = 0; unsigned int cval = 0; int cflag = CREAD | HUPCL | CLOCAL | B9600 | CS8; const struct old_serial_port *ser = rs_table + index; int err; quot = ser->baud_base / baud; cval = cflag & (CSIZE | CSTOPB); #if defined(__powerpc__) || defined(__alpha__) cval >>= 8; #else cval >>= 4; #endif if (cflag & PARENB) cval |= UART_LCR_PARITY; if (!(cflag & PARODD)) cval |= UART_LCR_EPAR; if (synth_request_region(ser->port, 8)) { printk(KERN_INFO "Ports not available, trying to steal them\n"); __release_region(&ioport_resource, ser->port, 8); err = synth_request_region(ser->port, 8); if (err) { pr_warn("Unable to allocate port at %x, errno %i", ser->port, err); return NULL; } } outb(cval | UART_LCR_DLAB, ser->port + UART_LCR); outb(quot & 0xff, ser->port + UART_DLL); outb(quot >> 8, ser->port + UART_DLM); outb(cval, ser->port + UART_LCR); outb(0, ser->port + UART_IER); outb(UART_MCR_DTR | UART_MCR_RTS, ser->port + UART_MCR); if (inb(ser->port + UART_LSR) == 0xff) { synth_release_region(ser->port, 8); serstate = NULL; return NULL; } mdelay(1); speakup_info.port_tts = ser->port; serstate = ser; start_serial_interrupt(ser->irq); return ser; }
static int synth_probe(struct spk_synth *synth) { unsigned int port_val = 0; int i = 0; pr_info("Probing for %s.\n", synth->long_name); if (port_forced) { speakup_info.port_tts = port_forced; pr_info("probe forced to %x by kernel command line\n", speakup_info.port_tts); if (synth_request_region(speakup_info.port_tts - 1, SYNTH_IO_EXTENT)) { pr_warn("sorry, port already reserved\n"); return -EBUSY; } port_val = inw(speakup_info.port_tts - 1); synth_port_control = speakup_info.port_tts - 1; } else { for (i = 0; synth_portlist[i]; i++) { if (synth_request_region(synth_portlist[i], SYNTH_IO_EXTENT)) { pr_warn ("request_region: failed with 0x%x, %d\n", synth_portlist[i], SYNTH_IO_EXTENT); continue; } port_val = inw(synth_portlist[i]) & 0xfffc; if (port_val == 0x53fc) { /* 'S' and out&input bits */ synth_port_control = synth_portlist[i]; speakup_info.port_tts = synth_port_control + 1; break; } } } port_val &= 0xfffc; if (port_val != 0x53fc) { /* 'S' and out&input bits */ pr_info("%s: not found\n", synth->long_name); synth_release_region(synth_port_control, SYNTH_IO_EXTENT); synth_port_control = 0; return -ENODEV; } pr_info("%s: %03x-%03x, driver version %s,\n", synth->long_name, synth_port_control, synth_port_control + SYNTH_IO_EXTENT - 1, synth->version); synth->alive = 1; return 0; }
static int synth_probe(struct spk_synth *synth) { unsigned int port_val = 0; int i = 0; pr_info("Probing for %s.\n", synth->long_name); if (port_forced) { synth_port = port_forced; pr_info("probe forced to %x by kernel command line\n", synth_port); if (synth_request_region(synth_port-1, SYNTH_IO_EXTENT)) { pr_warn("sorry, port already reserved\n"); return -EBUSY; } port_val = inb(synth_port); } else { for (i = 0; synth_portlist[i]; i++) { if (synth_request_region(synth_portlist[i], SYNTH_IO_EXTENT)) { pr_warn ("request_region: failed with 0x%x, %d\n", synth_portlist[i], SYNTH_IO_EXTENT); continue; } port_val = inb(synth_portlist[i]); if (port_val == 0x80) { synth_port = synth_portlist[i]; break; } } } if (port_val != 0x80) { pr_info("%s: not found\n", synth->long_name); synth_release_region(synth_port, SYNTH_IO_EXTENT); synth_port = 0; return -ENODEV; } pr_info("%s: %03x-%03x, driver version %s,\n", synth->long_name, synth_port, synth_port+SYNTH_IO_EXTENT-1, synth->version); synth->alive = 1; return 0; }
static int testkernel(void) { int status = 0; if (dt_getstatus() == 0xffff) { status = -1; goto oops; } dt_sendcmd(CMD_sync); if (!dt_waitbit(STAT_cmd_ready)) status = -2; else if (dt_stat&0x8000) return 0; else if (dt_stat == 0x0dec) pr_warn("dec_pc at 0x%x, software not loaded\n", speakup_info.port_tts); status = -3; oops: synth_release_region(speakup_info.port_tts, SYNTH_IO_EXTENT); speakup_info.port_tts = 0; return status; }
static void accent_release(void) { if (speakup_info.port_tts) synth_release_region(speakup_info.port_tts-1, SYNTH_IO_EXTENT); speakup_info.port_tts = 0; }
static void keynote_release(void) { if (synth_port) synth_release_region(synth_port, SYNTH_IO_EXTENT); synth_port = 0; }