亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 8250_pci.c

?? IXP425 平臺下嵌入式LINUX的串口的驅(qū)動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* *  linux/drivers/char/serial_8250_pci.c * *  Probe module for 8250/16550-type PCI serial ports. * *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. * *  Copyright (C) 2001 Russell King, All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * *  $Id: 8250_pci.c,v 1.8.2.1 2002/10/24 09:53:24 rmk Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/init.h>#include <linux/pci.h>#include <linux/sched.h>#include <linux/string.h>#include <linux/kernel.h>#include <linux/slab.h>#include <linux/serial.h>/* 2.4.6 compatibility cruft ;( */#define pci_board __pci_board#include <linux/serialP.h>#undef pci_board#include <asm/bitops.h>#include <asm/byteorder.h>#include <asm/serial.h>#include "serial_8250.h"#ifndef IS_PCI_REGION_IOPORT#define IS_PCI_REGION_IOPORT(dev, r) (pci_resource_flags((dev), (r)) & \				      IORESOURCE_IO)#endif#ifndef IS_PCI_REGION_IOMEM#define IS_PCI_REGION_IOMEM(dev, r) (pci_resource_flags((dev), (r)) & \				      IORESOURCE_MEM)#endif#ifndef PCI_IRQ_RESOURCE#define PCI_IRQ_RESOURCE(dev, r) ((dev)->irq_resource[r].start)#endif#ifndef pci_get_subvendor#define pci_get_subvendor(dev) ((dev)->subsystem_vendor)#define pci_get_subdevice(dev)  ((dev)->subsystem_device)#endifstruct serial_private {	unsigned int nr;	struct pci_board *board;	int line[0];};struct pci_board {	int flags;	int num_ports;	int base_baud;	int uart_offset;	int reg_shift;	int (*init_fn)(struct pci_dev *dev, struct pci_board *board,			int enable);	int first_uart_offset;};static intget_pci_port(struct pci_dev *dev, struct pci_board *board,	     struct serial_struct *req, int idx){	unsigned long port;	int base_idx;	int max_port;	int offset;	base_idx = SPCI_FL_GET_BASE(board->flags);	if (board->flags & SPCI_FL_BASE_TABLE)		base_idx += idx;	if (board->flags & SPCI_FL_REGION_SZ_CAP) {		max_port = pci_resource_len(dev, base_idx) / 8;		if (idx >= max_port)			return 1;	}				offset = board->first_uart_offset;	/* Timedia/SUNIX uses a mixture of BARs and offsets */	/* Ugh, this is ugly as all hell --- TYT */	if(dev->vendor == PCI_VENDOR_ID_TIMEDIA )  /* 0x1409 */		switch(idx) {			case 0: base_idx=0;				break;			case 1: base_idx=0; offset=8;				break;			case 2: base_idx=1; 				break;			case 3: base_idx=1; offset=8;				break;			case 4: /* BAR 2*/			case 5: /* BAR 3 */			case 6: /* BAR 4*/			case 7: base_idx=idx-2; /* BAR 5*/		}	/* Some Titan cards are also a little weird */	if (dev->vendor == PCI_VENDOR_ID_TITAN &&	    (dev->device == PCI_DEVICE_ID_TITAN_400L ||	     dev->device == PCI_DEVICE_ID_TITAN_800L)) {		switch (idx) {		case 0: base_idx = 1;			break;		case 1: base_idx = 2;			break;		default:			base_idx = 4;			offset = 8 * (idx - 2);		}	}  	port =  pci_resource_start(dev, base_idx) + offset;	if ((board->flags & SPCI_FL_BASE_TABLE) == 0)		port += idx * (board->uart_offset ? board->uart_offset : 8);	if (IS_PCI_REGION_IOPORT(dev, base_idx)) {		req->port = port;		if (HIGH_BITS_OFFSET)			req->port_high = port >> HIGH_BITS_OFFSET;		else			req->port_high = 0;		return 0;	}	req->io_type = SERIAL_IO_MEM;	req->iomem_base = ioremap(port, board->uart_offset);	req->iomem_reg_shift = board->reg_shift;	req->port = 0;	return 0;}static _INLINE_ int get_pci_irq(struct pci_dev *dev,				struct pci_board *board,				int idx){	int base_idx;	if ((board->flags & SPCI_FL_IRQRESOURCE) == 0)		return dev->irq;	base_idx = SPCI_FL_GET_IRQBASE(board->flags);	if (board->flags & SPCI_FL_IRQ_TABLE)		base_idx += idx;		return PCI_IRQ_RESOURCE(dev, base_idx);}/* * Some PCI serial cards using the PLX 9050 PCI interface chip require * that the card interrupt be explicitly enabled or disabled.  This * seems to be mainly needed on card using the PLX which also use I/O * mapped memory. */static int __devinitpci_plx9050_fn(struct pci_dev *dev, struct pci_board *board, int enable){	u8 data, *p, irq_config;	int pci_config;	irq_config = 0x41;	pci_config = PCI_COMMAND_MEMORY;	if (dev->vendor == PCI_VENDOR_ID_PANACOM)		irq_config = 0x43;	if ((dev->vendor == PCI_VENDOR_ID_PLX) &&	    (dev->device == PCI_DEVICE_ID_PLX_ROMULUS)) {		/*		 * As the megawolf cards have the int pins active		 * high, and have 2 UART chips, both ints must be		 * enabled on the 9050. Also, the UARTS are set in		 * 16450 mode by default, so we have to enable the		 * 16C950 'enhanced' mode so that we can use the deep		 * FIFOs		 */		irq_config = 0x5b;		pci_config = PCI_COMMAND_MEMORY | PCI_COMMAND_IO;	}		pci_read_config_byte(dev, PCI_COMMAND, &data);	if (enable)		pci_write_config_byte(dev, PCI_COMMAND,				      data | pci_config);		/* enable/disable interrupts */	p = ioremap(pci_resource_start(dev, 0), 0x80);	writel(enable ? irq_config : 0x00, (unsigned long)p + 0x4c);	iounmap(p);	if (!enable)		pci_write_config_byte(dev, PCI_COMMAND,				      data & ~pci_config);	return 0;}/* * SIIG serial cards have an PCI interface chip which also controls * the UART clocking frequency. Each UART can be clocked independently * (except cards equiped with 4 UARTs) and initial clocking settings * are stored in the EEPROM chip. It can cause problems because this * version of serial driver doesn't support differently clocked UART's * on single PCI card. To prevent this, initialization functions set * high frequency clocking for all UART's on given card. It is safe (I * hope) because it doesn't touch EEPROM settings to prevent conflicts * with other OSes (like M$ DOS). * *  SIIG support added by Andrey Panin <pazke@mail.tp.ru>, 10/1999 *  * There is two family of SIIG serial cards with different PCI * interface chip and different configuration methods: *     - 10x cards have control registers in IO and/or memory space; *     - 20x cards have control registers in standard PCI configuration space. */#define PCI_DEVICE_ID_SIIG_1S_10x (PCI_DEVICE_ID_SIIG_1S_10x_550 & 0xfffc)#define PCI_DEVICE_ID_SIIG_2S_10x (PCI_DEVICE_ID_SIIG_2S_10x_550 & 0xfff8)static int __devinitpci_siig10x_fn(struct pci_dev *dev, struct pci_board *board, int enable){       u16 data, *p;       if (!enable) return 0;       p = ioremap(pci_resource_start(dev, 0), 0x80);       switch (dev->device & 0xfff8) {               case PCI_DEVICE_ID_SIIG_1S_10x:         /* 1S */                       data = 0xffdf;                       break;               case PCI_DEVICE_ID_SIIG_2S_10x:         /* 2S, 2S1P */                       data = 0xf7ff;                       break;               default:                                /* 1S1P, 4S */                       data = 0xfffb;                       break;       }       writew(readw((unsigned long) p + 0x28) & data, (unsigned long) p + 0x28);       iounmap(p);       return 0;}#define PCI_DEVICE_ID_SIIG_2S_20x (PCI_DEVICE_ID_SIIG_2S_20x_550 & 0xfffc)#define PCI_DEVICE_ID_SIIG_2S1P_20x (PCI_DEVICE_ID_SIIG_2S1P_20x_550 & 0xfffc)static int __devinitpci_siig20x_fn(struct pci_dev *dev, struct pci_board *board, int enable){       u8 data;       if (!enable) return 0;       /* Change clock frequency for the first UART. */       pci_read_config_byte(dev, 0x6f, &data);       pci_write_config_byte(dev, 0x6f, data & 0xef);       /* If this card has 2 UART, we have to do the same with second UART. */       if (((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S_20x) ||           ((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S1P_20x)) {               pci_read_config_byte(dev, 0x73, &data);               pci_write_config_byte(dev, 0x73, data & 0xef);       }       return 0;}/* Added for EKF Intel i960 serial boards */static int __devinitpci_inteli960ni_fn(struct pci_dev *dev,		   struct pci_board *board,		   int enable){	unsigned long oldval;		if (!(pci_get_subdevice(dev) & 0x1000))		return(-1);	if (!enable) /* is there something to deinit? */		return(0);   	/* is firmware started? */	pci_read_config_dword(dev, 0x44, (void*) &oldval); 	if (oldval == 0x00001000L) { /* RESET value */ 		printk(KERN_DEBUG "Local i960 firmware missing");		return(-1); 	}	return(0);}/* * Timedia has an explosion of boards, and to avoid the PCI table from * growing *huge*, we use this function to collapse some 70 entries * in the PCI table into one, for sanity's and compactness's sake. */static unsigned short timedia_single_port[] = {	0x4025, 0x4027, 0x4028, 0x5025, 0x5027, 0 };static unsigned short timedia_dual_port[] = {	0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,	0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079, 	0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079, 	0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,	0xD079, 0 };static unsigned short timedia_quad_port[] = {	0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157, 	0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159, 	0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,	0xB157, 0 };static unsigned short timedia_eight_port[] = {	0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166, 	0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0 };static struct timedia_struct {	int num;	unsigned short *ids;} timedia_data[] = {	{ 1, timedia_single_port },	{ 2, timedia_dual_port },	{ 4, timedia_quad_port },	{ 8, timedia_eight_port },	{ 0, 0 }};static int __devinitpci_timedia_fn(struct pci_dev *dev, struct pci_board *board, int enable){	int	i, j;	unsigned short *ids;	if (!enable)		return 0;	for (i=0; timedia_data[i].num; i++) {		ids = timedia_data[i].ids;		for (j=0; ids[j]; j++) {			if (pci_get_subdevice(dev) == ids[j]) {				board->num_ports = timedia_data[i].num;				return 0;			}		}	}	return 0;}static int __devinitpci_xircom_fn(struct pci_dev *dev, struct pci_board *board, int enable){	__set_current_state(TASK_UNINTERRUPTIBLE);	schedule_timeout(HZ/10);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99热99精品| 欧美国产激情一区二区三区蜜月| 日韩西西人体444www| 欧美国产精品v| 免费日本视频一区| 色婷婷亚洲婷婷| 久久久精品免费网站| 日本中文字幕一区二区视频 | 久久精品无码一区二区三区| 国产精品福利一区| 韩国av一区二区三区在线观看| 色婷婷av一区二区三区大白胸| 国产清纯白嫩初高生在线观看91| 日韩在线一区二区| 色8久久精品久久久久久蜜| 久久精品视频一区二区三区| 一区二区三区在线免费| 成人免费看的视频| 国产午夜久久久久| 黑人巨大精品欧美一区| 制服丝袜中文字幕亚洲| 亚洲激情第一区| 91污片在线观看| 国产精品久久久久久久久免费桃花 | 日本一区二区三区电影| 综合久久综合久久| 成人激情小说乱人伦| 久久嫩草精品久久久久| 青青草97国产精品免费观看无弹窗版 | 99精品久久久久久| 国产精品久久久久久久岛一牛影视 | 91丨porny丨国产入口| 久久精品一二三| 国产成人av电影在线观看| 久久先锋影音av| 久久精品二区亚洲w码| 中文一区二区在线观看| 国产呦精品一区二区三区网站| 欧美一区二区三区小说| 麻豆精品蜜桃视频网站| 精品少妇一区二区三区| 国内一区二区视频| 久久久99久久精品欧美| 国产寡妇亲子伦一区二区| 国产欧美视频在线观看| 99久久久无码国产精品| 一区二区三区在线影院| 欧美日本免费一区二区三区| 秋霞成人午夜伦在线观看| 日韩欧美国产午夜精品| 国产成人精品三级麻豆| 中文字幕在线观看一区二区| 在线影院国内精品| 日产欧产美韩系列久久99| 精品99久久久久久| 99热99精品| 日韩成人精品在线| 国产性做久久久久久| 色婷婷国产精品| 蜜桃精品视频在线| 国产精品青草综合久久久久99| 色综合久久中文字幕| 日韩精品高清不卡| 国产精品网站在线| 欧美性极品少妇| 国产一区二区三区在线观看免费视频 | 麻豆国产91在线播放| 国产欧美一区二区精品仙草咪| 91麻豆自制传媒国产之光| 午夜精品成人在线视频| 久久久av毛片精品| 欧美日韩第一区日日骚| 国产激情视频一区二区在线观看| 亚洲男人的天堂在线aⅴ视频 | 丝袜脚交一区二区| 久久精品视频一区| 欧美色视频在线观看| 国产成人免费高清| 日韩不卡一区二区| 亚洲码国产岛国毛片在线| 精品美女在线观看| 欧美伊人久久久久久久久影院 | 久久av资源站| 一区二区三区91| 日本一区二区三区dvd视频在线| 色婷婷综合久久久久中文一区二区| 免费观看日韩电影| 亚洲第四色夜色| 国产精品久久久久毛片软件| 日韩欧美自拍偷拍| 欧美日韩国产成人在线免费| 成人激情黄色小说| 国产在线麻豆精品观看| 石原莉奈在线亚洲二区| 尤物av一区二区| 国产精品成人一区二区艾草| 欧美成人福利视频| 欧美伊人精品成人久久综合97 | 在线精品视频一区二区| 粗大黑人巨茎大战欧美成人| 久久国产剧场电影| 爽爽淫人综合网网站| 一区二区三区中文字幕| 中文字幕制服丝袜一区二区三区| 2022国产精品视频| 日韩欧美一级片| 91精品国产综合久久福利| 精品视频资源站| 欧美亚洲禁片免费| 欧洲av一区二区嗯嗯嗯啊| 99精品欧美一区二区三区小说| 国产91精品在线观看| 国产成人午夜片在线观看高清观看| 日产欧产美韩系列久久99| 日韩中文字幕一区二区三区| 亚洲成人tv网| 日韩高清不卡在线| 日韩国产精品久久久久久亚洲| 亚洲综合在线五月| 国产乱人伦偷精品视频免下载| 日本不卡一二三区黄网| 麻豆精品国产传媒mv男同| 免费观看91视频大全| 日本三级亚洲精品| 麻豆精品蜜桃视频网站| 美女mm1313爽爽久久久蜜臀| 久久成人免费电影| 国产福利精品一区| 91麻豆精东视频| 欧美色精品在线视频| 91精品麻豆日日躁夜夜躁| 欧美成人精品高清在线播放| 2023国产精品视频| 国产精品久久精品日日| 一区二区三区四区乱视频| 亚洲综合激情网| 麻豆精品视频在线| 成人免费毛片嘿嘿连载视频| 97精品久久久久中文字幕| 欧美性感一区二区三区| 日韩欧美精品在线视频| 国产精品三级久久久久三级| 洋洋成人永久网站入口| 日韩精品欧美成人高清一区二区| 久久精品99久久久| 91蜜桃免费观看视频| 欧美一区二区在线播放| 国产精品久久午夜| 视频在线观看国产精品| 国产不卡免费视频| 欧美伊人久久久久久午夜久久久久| 日韩免费在线观看| 亚洲欧美综合在线精品| 日韩电影免费在线| 99精品久久只有精品| 91精品国产麻豆| 中文字幕一区二区不卡| 日韩电影在线一区| 91老司机福利 在线| 精品国产青草久久久久福利| 中文字幕日韩一区| 韩国女主播成人在线| 欧美专区亚洲专区| 欧美激情一区二区在线| 秋霞国产午夜精品免费视频| 97国产精品videossex| 日韩欧美色电影| 亚洲一二三区视频在线观看| 国产乱子伦视频一区二区三区| 欧美亚洲禁片免费| 国产精品久久久久久久蜜臀| 激情小说欧美图片| 欧美美女喷水视频| 亚洲欧洲一区二区在线播放| 久久99久久99小草精品免视看| 欧美在线观看禁18| 中文字幕日韩av资源站| 国产精品一二一区| 日韩精品一区二区三区四区 | 在线观看视频一区二区 | 日本视频一区二区三区| 91麻豆国产福利在线观看| xnxx国产精品| 老司机午夜精品| 欧美群妇大交群中文字幕| 亚洲桃色在线一区| 高清不卡一区二区| 久久久综合网站| 久久精品国产一区二区三| 欧美日韩国产天堂| 亚洲无线码一区二区三区| 日本韩国一区二区三区视频| 久久九九影视网| 国产乱码精品一区二区三区av| 91精品在线一区二区| 日本欧美一区二区三区乱码| 5566中文字幕一区二区电影| 石原莉奈在线亚洲二区| 在线不卡一区二区| 麻豆精品蜜桃视频网站|