示例#1
0
static int __devinit
serial_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id)
{
	struct uart_port port;
	int ret, line, flags = dev_id->driver_data;

	if (flags & UNKNOWN_DEV) {
		ret = serial_pnp_guess_board(dev, &flags);
		if (ret < 0)
			return ret;
	}

	memset(&port, 0, sizeof(struct uart_port));
	port.irq = pnp_irq(dev,0);
	port.iobase = pnp_port_start(dev, 0);

#ifdef SERIAL_DEBUG_PNP
	printk("Setup PNP port: port %x, irq %d, type %d\n",
	       port.iobase, port.irq, port.iotype);
#endif

	port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
	port.uartclk = 1843200;
	port.dev = &dev->dev;

	line = serial8250_register_port(&port);

	if (line >= 0)
		pnp_set_drvdata(dev, (void *)((long)line + 1));
	return line >= 0 ? 0 : -ENODEV;

}
示例#2
0
static int
pnp_init_one(struct pci_dev *dev, const struct pnpbios_device_id *ent,
	     char *slot_name)
{
	struct serial_struct serial_req;
	int ret, line, flags = ent ? ent->driver_data : 0;

	if (!ent) {
		ret = serial_pnp_guess_board(dev, &flags);
		if (ret)
			return ret;
	}

	if (dev->prepare(dev) < 0) {
		printk("serial: PNP device '%s' prepare failed\n",
			slot_name);
		return -ENODEV;
	}

	if (dev->active)
		return -ENODEV;

	if (flags & SPCI_FL_NO_SHIRQ)
		avoid_irq_share(dev);

	if (dev->activate(dev) < 0) {
		printk("serial: PNP device '%s' activate failed\n",
			slot_name);
		return -ENODEV;
	}

	memset(&serial_req, 0, sizeof(serial_req));
	serial_req.irq = dev->irq_resource[0].start;
	serial_req.port = pci_resource_start(dev, 0);
	if (HIGH_BITS_OFFSET)
		serial_req.port = pci_resource_start(dev, 0) >> HIGH_BITS_OFFSET;

#ifdef SERIAL_DEBUG_PCI
	printk("Setup PCI/PNP port: port %x, irq %d, type %d\n",
	       serial_req.port, serial_req.irq, serial_req.io_type);
#endif

	serial_req.flags = ASYNC_SKIP_TEST | ASYNC_AUTOPROBE;
	serial_req.baud_base = 115200;
	line = register_serial(&serial_req);

	if (line >= 0) {
		pci_set_drvdata(dev, (void *)(line + 1));

		/*
		 * Public health warning: remove this once the 2.5
		 * pnpbios_module_init() stuff is incorporated.
		 */
		dev->driver = (void *)pnp_dev_table;
	} else
		dev->deactivate(dev);

	return line >= 0 ? 0 : -ENODEV;
}
示例#3
0
static int
serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
{
	struct uart_8250_port uart;
	int ret, line, flags = dev_id->driver_data;
	struct resource *res = NULL;

	if (flags & UNKNOWN_DEV) {
		ret = serial_pnp_guess_board(dev);
		if (ret < 0)
			return ret;
	}

	memset(&uart, 0, sizeof(uart));
	if (pnp_irq_valid(dev, 0))
		uart.port.irq = pnp_irq(dev, 0);
	if ((flags & CIR_PORT) && pnp_port_valid(dev, 2))
		res = pnp_get_resource(dev, IORESOURCE_IO, 2);
	else if (pnp_port_valid(dev, 0))
		res = pnp_get_resource(dev, IORESOURCE_IO, 0);
	if (pnp_resource_enabled(res)) {
		uart.port.iobase = res->start;
		uart.port.iotype = UPIO_PORT;
	} else if (pnp_mem_valid(dev, 0)) {
		uart.port.mapbase = pnp_mem_start(dev, 0);
		uart.port.iotype = UPIO_MEM;
		uart.port.flags = UPF_IOREMAP;
	} else
		return -ENODEV;

#ifdef SERIAL_DEBUG_PNP
	printk(KERN_DEBUG
		"Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
		       uart.port.iobase, uart.port.mapbase, uart.port.irq, uart.port.iotype);
#endif
	if (flags & CIR_PORT) {
		uart.port.flags |= UPF_FIXED_PORT | UPF_FIXED_TYPE;
		uart.port.type = PORT_8250_CIR;
	}

	uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
	if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
		uart.port.flags |= UPF_SHARE_IRQ;
	uart.port.uartclk = 1843200;
	uart.port.dev = &dev->dev;

	line = serial8250_register_8250_port(&uart);
	if (line < 0 || (flags & CIR_PORT))
		return -ENODEV;

	pnp_set_drvdata(dev, (void *)((long)line + 1));
	return 0;
}
static int __devinit
serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
{
	struct uart_port port;
	int ret, line, flags = dev_id->driver_data;

	if (flags & UNKNOWN_DEV) {
		ret = serial_pnp_guess_board(dev, &flags);
		if (ret < 0)
			return ret;
	}

	memset(&port, 0, sizeof(struct uart_port));
	if (pnp_irq_valid(dev, 0))
		port.irq = pnp_irq(dev, 0);
	if (pnp_port_valid(dev, 0)) {
		port.iobase = pnp_port_start(dev, 0);
		port.iotype = UPIO_PORT;
	} else if (pnp_mem_valid(dev, 0)) {
		port.mapbase = pnp_mem_start(dev, 0);
		port.iotype = UPIO_MEM;
		port.flags = UPF_IOREMAP;
	} else
		return -ENODEV;

#ifdef SERIAL_DEBUG_PNP
	printk(KERN_DEBUG
		"Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
		       port.iobase, port.mapbase, port.irq, port.iotype);
#endif

	port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
	if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
		port.flags |= UPF_SHARE_IRQ;
	port.uartclk = 1843200;
	port.dev = &dev->dev;

	line = serial8250_register_port(&port);
	if (line < 0)
		return -ENODEV;

	pnp_set_drvdata(dev, (void *)((long)line + 1));
	return 0;
}