static int rs_open(struct tty_struct *tty, struct file * filp) { struct async_struct *info; int retval, line; line = tty->index; if ((line < 0) || (line >= NR_PORTS)) { return -ENODEV; } retval = get_async_struct(line, &info); if (retval) { return retval; } tty->driver_data = info; info->tty = tty; if (serial_paranoia_check(info, tty->name, "rs_open")) return -ENODEV; #ifdef SERIAL_DEBUG_OPEN printk("rs_open %s, count = %d\n", tty->name, info->state->count); #endif info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; /* * If the port is the middle of closing, bail out now */ if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) { if (info->flags & ASYNC_CLOSING) interruptible_sleep_on(&info->close_wait); #ifdef SERIAL_DO_RESTART return ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS); #else return -EAGAIN; #endif } /* * Start up serial port */ retval = startup(info); if (retval) { return retval; } retval = block_til_ready(tty, filp, info); if (retval) { #ifdef SERIAL_DEBUG_OPEN printk("rs_open returning after block_til_ready with %d\n", retval); #endif return retval; } #ifdef SERIAL_DEBUG_OPEN printk("rs_open %s successful...", tty->name); #endif return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its S structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int rs_open(struct tty_struct *tty, struct file * filp) { struct m68k_serial *info; int retval, line; line = tty->index; if (line >= NR_PORTS || line < 0) /* we have exactly one */ return -ENODEV; info = &m68k_soft[line]; if (serial_paranoia_check(info, tty->name, "rs_open")) return -ENODEV; info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; return block_til_ready(tty, filp, info); }
int gbatxt_open(struct tty_struct *tty, struct file * filp) { struct gbatxt_serial *info; int retval, line; line = MINOR(tty->device) - tty->driver.minor_start; if ((line < 0) || (line >= NR_PORTS)) return -ENODEV; info = gbatxt_table + line; #ifdef SERIAL_DEBUG_OPEN printk("gbatxt_open %s%d, count = %d\n", tty->driver.name, info->line, info->count); #endif info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; retval = block_til_ready(tty, filp, info); if (retval) { #ifdef SERIAL_DEBUG_OPEN printk("gbatxt_open returning after block_til_ready with %d\n", retval); #endif return retval; } if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { if (tty->driver.subtype == SERIAL_TYPE_NORMAL) *tty->termios = info->normal_termios; else *tty->termios = info->callout_termios; gbatxt_change_speed(info); } info->session = current->session; info->pgrp = current->pgrp; #ifdef SERIAL_DEBUG_OPEN printk("gbatxt_open ttyS%d successful...\n", info->line); #endif return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its S structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int rs_open(struct tty_struct *tty, struct file * filp) { int retval, line; struct cnxt_serial *info; line = MINOR(tty->device) - tty->driver.minor_start; if (line != 0) /* we have exactly one */ return -ENODEV; info = &uart_info; if (serial_paranoia_check(info, tty->device, "rs_open")) return -ENODEV; info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; retval = block_til_ready(tty, filp, info); if (retval) { printk("rs_open returning after block_til_ready with %d\n", retval); return retval; } if ((info->count == 1) && (info->flags & S_SPLIT_TERMIOS)) { if (tty->driver.subtype == SERIAL_TYPE_NORMAL) *tty->termios = info->normal_termios; else *tty->termios = info->callout_termios; change_speed(info); } info->session = current->session; info->pgrp = current->pgrp; // Enable GPIO interrupt line for console uart SetGPIOIntEnable(GPIOINT_UART1, IRQ_ON); return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port. It also performs the * serial-specific initialization for the tty structure. */ static int dz_open(struct tty_struct *tty, struct file *filp) { struct dz_serial *info; int retval, line; line = MINOR(tty->device) - tty->driver.minor_start; /* The dz lines for the mouse/keyboard must be * opened using their respective drivers. */ if ((line < 0) || (line >= DZ_NB_PORT)) return -ENODEV; if ((line == DZ_KEYBOARD) || (line == DZ_MOUSE)) return -ENODEV; info = lines[line]; info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; retval = block_til_ready(tty, filp, info); if (retval) return retval; if ((info->count == 1) && (info->flags & DZ_SPLIT_TERMIOS)) { if (tty->driver.subtype == SERIAL_TYPE_NORMAL) *tty->termios = info->normal_termios; else *tty->termios = info->callout_termios; change_speed(info); } info->session = current->session; info->pgrp = current->pgrp; return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its S structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int rs_open(struct tty_struct *tty, struct file * filp) { struct NIOS_serial *info; int retval, line; line = MINOR(tty->device) - tty->driver.minor_start; if (line >=serial_driver.num) /* too many */ return -ENODEV; info = &nios_soft[line]; if (serial_paranoia_check(info, tty->device, "rs_open")) return -ENODEV; info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; retval = block_til_ready(tty, filp, info); if (retval) { return retval; } if ((info->count == 1) && (info->flags & S_SPLIT_TERMIOS)) { if (tty->driver.subtype == SERIAL_TYPE_NORMAL) *tty->termios = info->normal_termios; else *tty->termios = info->callout_termios; change_speed(info); } info->session = current->session; info->pgrp = current->pgrp; return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int mcfrs_open(struct tty_struct *tty, struct file * filp) { struct mcf_serial *info; int retval, line; line = tty->index; if ((line < 0) || (line >= NR_PORTS)) return -ENODEV; info = mcfrs_table + line; if (serial_paranoia_check(info, tty->name, "mcfrs_open")) return -ENODEV; #ifdef SERIAL_DEBUG_OPEN printk("mcfrs_open %s, count = %d\n", tty->name, info->count); #endif info->count++; tty->driver_data = info; info->port.tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; retval = block_til_ready(tty, filp, info); if (retval) { #ifdef SERIAL_DEBUG_OPEN printk("mcfrs_open returning after block_til_ready with %d\n", retval); #endif return retval; } #ifdef SERIAL_DEBUG_OPEN printk("mcfrs_open %s successful...\n", tty->name); #endif return 0; }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its S structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int rs_open(struct tty_struct *tty, struct file * filp) { struct m68k_serial *info; int retval; info = &m68k_soft[tty->index]; if (serial_paranoia_check(info, tty->name, "rs_open")) return -ENODEV; info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; return block_til_ready(tty, filp, info); }
/* * This routine is called whenever a serial port is opened. It * enables interrupts for a serial port, linking in its async structure into * the IRQ chain. It also performs the serial-specific * initialization for the tty structure. */ int rs_open(struct tty_struct *tty, struct file * filp) { struct async_struct *info; int retval, line; line = MINOR(tty->device) - tty->driver.minor_start; if ((line < 0) || (line >= NR_PORTS)) return -ENODEV; info = rs_table + line; if (serial_paranoia_check(info, tty->device, "rs_open")) return -ENODEV; #ifdef SERIAL_DEBUG_OPEN printk("rs_open %s%d, count = %d\n", tty->driver.name, info->line, info->count); #endif if (!(info->flags & ASYNC_INITIALIZED)) { char device_name[25]; mach_port_t device_port; dev_mode_t device_mode; kern_return_t kr; int word, count; sprintf(device_name, "com%d", line); device_mode = D_READ | D_WRITE; kr = device_open(device_server_port, MACH_PORT_NULL, device_mode, server_security_token, device_name, &device_port); if (kr != D_SUCCESS) { if (kr != D_NO_SUCH_DEVICE) { MACH3_DEBUG(2, kr, ("rs_open(dev 0x%x): " "device_open(\"%s\")", tty->device, device_name)); } return -ENODEV; } info->flags &= ~ASYNC_DCD_PRESENT; count = TTY_MODEM_COUNT; kr = device_get_status(device_port, TTY_MODEM, &word, &count); if (kr == D_SUCCESS && (word & TM_CAR) != 0) info->flags |= ASYNC_DCD_PRESENT; else info->flags &= ~ASYNC_DCD_PRESENT; /* Flush any garbage data which might be left over.. */ count = TTY_FLUSH_COUNT; word = D_READ|D_WRITE; kr = device_set_status(device_port, TTY_FLUSH, &word, count); info->device_port = device_port; tty->flip.char_buf_ptr = tty->flip.char_buf; tty->flip.flag_buf_ptr = tty->flip.flag_buf; tty->flip.count = 0; /* Now register a few asynchronous routines.. */ device_reply_register(&info->reply_port, (char *) info, serial_read_reply, serial_write_reply); } ASSERT(MACH_PORT_VALID(info->device_port)); info->count++; tty->driver_data = info; info->tty = tty; /* * Start up serial port */ retval = startup(info); if (retval) return retval; if (info->count == 1) server_thread_start(serial_read_thread, (void *) line); retval = block_til_ready(tty, filp, info); if (retval) { #ifdef SERIAL_DEBUG_OPEN printk("rs_open returning after block_til_ready with %d\n", retval); #endif return retval; } if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { if (tty->driver.subtype == SERIAL_TYPE_NORMAL) *tty->termios = info->normal_termios; else *tty->termios = info->callout_termios; change_speed(info); } info->session = current->session; info->pgrp = current->pgrp; #ifdef SERIAL_DEBUG_OPEN printk("rs_open ttys%d successful...", info->line); #endif return 0; }