/* Query for input device type */ enum prom_input_device prom_query_input_device() { int st_p; char propb[64]; st_p = prom_inst2pkg(prom_stdin); if(prom_node_has_property(st_p, "keyboard")) return PROMDEV_IKBD; prom_getproperty(st_p, "device_type", propb, sizeof(propb)); if(strncmp(propb, "serial", 6)) return PROMDEV_I_UNK; /* FIXME: Is there any better way how to find out? */ memset(propb, 0, sizeof(propb)); st_p = prom_finddevice ("/options"); prom_getproperty(st_p, "input-device", propb, sizeof(propb)); /* * If we get here with propb == 'keyboard', we are on ttya, as * the PROM defaulted to this due to 'no input device'. */ if (!strncmp(propb, "keyboard", 8)) return PROMDEV_ITTYA; if (strncmp (propb, "tty", 3) || !propb[3]) return PROMDEV_I_UNK; switch (propb[3]) { case 'a': return PROMDEV_ITTYA; case 'b': return PROMDEV_ITTYB; default: return PROMDEV_I_UNK; } }
static int __init has_button_interrupt(unsigned int irq, int prom_node) { if (irq == PCI_IRQ_NONE) return 0; if (!prom_node_has_property(prom_node, "button")) return 0; return 1; }
static int __init has_button_interrupt(struct linux_ebus_device *edev) { if (edev->irqs[0] == PCI_IRQ_NONE) return 0; if (!prom_node_has_property(edev->prom_node, "button")) return 0; return 1; }
/* Query for input device type */ enum prom_input_device prom_query_input_device(void) { unsigned long flags; int st_p; char propb[64]; char *p; int propl; switch(prom_vers) { case PROM_V0: case PROM_V2: case PROM_SUN4: default: switch(*romvec->pv_stdin) { case PROMDEV_KBD: return PROMDEV_IKBD; case PROMDEV_TTYA: return PROMDEV_ITTYA; case PROMDEV_TTYB: return PROMDEV_ITTYB; default: return PROMDEV_I_UNK; }; case PROM_V3: spin_lock_irqsave(&prom_lock, flags); st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin); restore_current(); spin_unlock_irqrestore(&prom_lock, flags); if(prom_node_has_property(st_p, "keyboard")) return PROMDEV_IKBD; if (prom_getproperty(st_p, "name", propb, sizeof(propb)) != -1) { if(strncmp(propb, "keyboard", sizeof("serial")) == 0) return PROMDEV_IKBD; } if (prom_getproperty(st_p, "device_type", propb, sizeof(propb)) != -1) { if(strncmp(propb, "serial", sizeof("serial"))) return PROMDEV_I_UNK; } propl = prom_getproperty(prom_root_node, "stdin-path", propb, sizeof(propb)); if(propl > 2) { p = propb; while(*p) p++; p -= 2; if(p[0] == ':') { if(p[1] == 'a') return PROMDEV_ITTYA; else if(p[1] == 'b') return PROMDEV_ITTYB; } } return PROMDEV_I_UNK; } }
void sunserial_console_termios(struct console *con) { char mode[16], buf[16], *s; char *mode_prop = "ttyX-mode"; char *cd_prop = "ttyX-ignore-cd"; char *dtr_prop = "ttyX-rts-dtr-off"; int baud, bits, stop, cflag; char parity; int carrier = 0; int rtsdtr = 1; int topnd, nd; if (!serial_console) return; if (serial_console == 1) { mode_prop[3] = 'a'; cd_prop[3] = 'a'; dtr_prop[3] = 'a'; } else { mode_prop[3] = 'b'; cd_prop[3] = 'b'; dtr_prop[3] = 'b'; } topnd = prom_getchild(prom_root_node); nd = prom_searchsiblings(topnd, "options"); if (!nd) { strcpy(mode, "9600,8,n,1,-"); goto no_options; } if (!prom_node_has_property(nd, mode_prop)) { strcpy(mode, "9600,8,n,1,-"); goto no_options; } memset(mode, 0, sizeof(mode)); prom_getstring(nd, mode_prop, mode, sizeof(mode)); if (prom_node_has_property(nd, cd_prop)) { memset(buf, 0, sizeof(buf)); prom_getstring(nd, cd_prop, buf, sizeof(buf)); if (!strcmp(buf, "false")) carrier = 1; /* XXX: this is unused below. */ } if (prom_node_has_property(nd, cd_prop)) { memset(buf, 0, sizeof(buf)); prom_getstring(nd, cd_prop, buf, sizeof(buf)); if (!strcmp(buf, "false")) rtsdtr = 0; /* XXX: this is unused below. */ } no_options: cflag = CREAD | HUPCL | CLOCAL; s = mode; baud = simple_strtoul(s, 0, 0); s = strchr(s, ','); bits = simple_strtoul(++s, 0, 0); s = strchr(s, ','); parity = *(++s); s = strchr(s, ','); stop = simple_strtoul(++s, 0, 0); s = strchr(s, ','); /* XXX handshake is not handled here. */ switch (baud) { case 150: cflag |= B150; break; case 300: cflag |= B300; break; case 600: cflag |= B600; break; case 1200: cflag |= B1200; break; case 2400: cflag |= B2400; break; case 4800: cflag |= B4800; break; case 9600: cflag |= B9600; break; case 19200: cflag |= B19200; break; case 38400: cflag |= B38400; break; default: baud = 9600; cflag |= B9600; break; } switch (bits) { case 5: cflag |= CS5; break; case 6: cflag |= CS6; break; case 7: cflag |= CS7; break; case 8: cflag |= CS8; break; default: cflag |= CS8; break; } switch (parity) { case 'o': cflag |= (PARENB | PARODD); break; case 'e': cflag |= PARENB; break; case 'n': default: break; } switch (stop) { case 2: cflag |= CSTOPB; break; case 1: default: break; } con->cflag = cflag; }