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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mpc8xx.c

?? ep9315平臺下硬盤驅動的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/drivers/ide/ppc/ide-m8xx.c * *  Copyright (C) 2000, 2001 Wolfgang Denk, wd@denx.de *  Modified for direct IDE interface *	by Thomas Lange, thomas@corelatus.com *  Modified for direct IDE interface on 8xx without using the PCMCIA *  controller *	by Steven.Scholz@imc-berlin.de *  Moved out of arch/ppc/kernel/m8xx_setup.c, other minor cleanups *	by Mathew Locke <mattl@mvista.com> */#include <linux/config.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/stddef.h>#include <linux/unistd.h>#include <linux/ptrace.h>#include <linux/slab.h>#include <linux/user.h>#include <linux/a.out.h>#include <linux/tty.h>#include <linux/major.h>#include <linux/interrupt.h>#include <linux/reboot.h>#include <linux/init.h>#include <linux/blk.h>#include <linux/ioport.h>#include <linux/ide.h>#include <linux/bootmem.h>#include <asm/mpc8xx.h>#include <asm/mmu.h>#include <asm/processor.h>#include <asm/residual.h>#include <asm/io.h>#include <asm/pgtable.h>#include <asm/ide.h>#include <asm/8xx_immap.h>#include <asm/machdep.h>#include <asm/irq.h>#include "ide_modes.h"static int identify  (volatile u8 *p);static void print_fixed (volatile u8 *p);static void print_funcid (int func);static int check_ide_device (unsigned long base);static void ide_interrupt_ack (void *dev);static void m8xx_ide_tuneproc(ide_drive_t *drive, u8 pio);typedef	struct ide_ioport_desc {	unsigned long	base_off;		/* Offset to PCMCIA memory	*/	ide_ioreg_t	reg_off[IDE_NR_PORTS];	/* controller register offsets	*/	int		irq;			/* IRQ				*/} ide_ioport_desc_t;ide_ioport_desc_t ioport_dsc[MAX_HWIFS] = {#ifdef IDE0_BASE_OFFSET	{ IDE0_BASE_OFFSET,	    {		IDE0_DATA_REG_OFFSET,		IDE0_ERROR_REG_OFFSET,		IDE0_NSECTOR_REG_OFFSET,		IDE0_SECTOR_REG_OFFSET,		IDE0_LCYL_REG_OFFSET,		IDE0_HCYL_REG_OFFSET,		IDE0_SELECT_REG_OFFSET,		IDE0_STATUS_REG_OFFSET,		IDE0_CONTROL_REG_OFFSET,		IDE0_IRQ_REG_OFFSET,	    },	    IDE0_INTERRUPT,	},#ifdef IDE1_BASE_OFFSET	{ IDE1_BASE_OFFSET,	    {		IDE1_DATA_REG_OFFSET,		IDE1_ERROR_REG_OFFSET,		IDE1_NSECTOR_REG_OFFSET,		IDE1_SECTOR_REG_OFFSET,		IDE1_LCYL_REG_OFFSET,		IDE1_HCYL_REG_OFFSET,		IDE1_SELECT_REG_OFFSET,		IDE1_STATUS_REG_OFFSET,		IDE1_CONTROL_REG_OFFSET,		IDE1_IRQ_REG_OFFSET,	    },	    IDE1_INTERRUPT,	},#endif /* IDE1_BASE_OFFSET */#endif	/* IDE0_BASE_OFFSET */};ide_pio_timings_t ide_pio_clocks[6];int hold_time[6] =  {30, 20, 15, 10, 10, 10 };   /* PIO Mode 5 with IORDY (nonstandard) *//* * Warning: only 1 (ONE) PCMCIA slot supported here, * which must be correctly initialized by the firmware (PPCBoot). */static int _slot_ = -1;			/* will be read from PCMCIA registers   *//* Make clock cycles and always round up */#define PCMCIA_MK_CLKS( t, T ) (( (t) * ((T)/1000000) + 999U ) / 1000U )/* * IDE stuff. */static intm8xx_ide_default_irq(ide_ioreg_t base){#ifdef CONFIG_BLK_DEV_MPC8xx_IDE	if (base >= MAX_HWIFS)		return 0;	printk("[%d] m8xx_ide_default_irq %d\n",__LINE__,ioport_dsc[base].irq);		return (ioport_dsc[base].irq);#else        return 9;#endif}static ide_ioreg_tm8xx_ide_default_io_base(int index){        return index;}#define M8XX_PCMCIA_CD2(slot)      (0x10000000 >> (slot << 4))#define M8XX_PCMCIA_CD1(slot)      (0x08000000 >> (slot << 4))/* * The TQM850L hardware has two pins swapped! Grrrrgh! */#ifdef	CONFIG_TQM850L#define __MY_PCMCIA_GCRX_CXRESET	PCMCIA_GCRX_CXOE#define __MY_PCMCIA_GCRX_CXOE		PCMCIA_GCRX_CXRESET#else#define __MY_PCMCIA_GCRX_CXRESET	PCMCIA_GCRX_CXRESET#define __MY_PCMCIA_GCRX_CXOE		PCMCIA_GCRX_CXOE#endif#if defined(CONFIG_BLK_DEV_MPC8xx_IDE) && defined(CONFIG_IDE_8xx_PCCARD)#define PCMCIA_SCHLVL IDE0_INTERRUPT	/* Status Change Interrupt Level	*/static int pcmcia_schlvl = PCMCIA_SCHLVL;#endif/* * See include/linux/ide.h for definition of hw_regs_t (p, base) *//* * m8xx_ide_init_hwif_ports for a direct IDE interface _using_ */#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT)static voidm8xx_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, 		ide_ioreg_t ctrl_port, int *irq){	ide_ioreg_t *p = hw->io_ports;	int i;	typedef struct {		ulong br;		ulong or;	} pcmcia_win_t;	volatile pcmcia_win_t *win;	volatile pcmconf8xx_t *pcmp;	uint *pgcrx;	u32 pcmcia_phy_base;	u32 pcmcia_phy_end;	static unsigned long pcmcia_base = 0;	unsigned long base;	*p = 0;	if (irq)		*irq = 0;	pcmp = (pcmconf8xx_t *)(&(((immap_t *)IMAP_ADDR)->im_pcmcia));	if (!pcmcia_base) {                /*                 * Read out PCMCIA registers. Since the reset values                 * are undefined, we sure hope that they have been                 * set up by firmware		 */		/* Scan all registers for valid settings */		pcmcia_phy_base = 0xFFFFFFFF;		pcmcia_phy_end = 0;		/* br0 is start of brX and orX regs */		win = (pcmcia_win_t *) \			(&(((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0));		for (i = 0; i < 8; i++) {			if (win->or & 1) {	/* This bank is marked as valid */				if (win->br < pcmcia_phy_base) {					pcmcia_phy_base = win->br;				}				if ((win->br + PCMCIA_MEM_SIZE) > pcmcia_phy_end) {					pcmcia_phy_end  = win->br + PCMCIA_MEM_SIZE;				}				/* Check which slot that has been defined */				_slot_ = (win->or >> 2) & 1;			}					/* Valid bank */			win++;		}						/* for */		printk ("PCMCIA slot %c: phys mem %08x...%08x (size %08x)\n",			'A' + _slot_,			pcmcia_phy_base, pcmcia_phy_end,			pcmcia_phy_end - pcmcia_phy_base);		pcmcia_base=(unsigned long)ioremap(pcmcia_phy_base,						   pcmcia_phy_end-pcmcia_phy_base);#ifdef DEBUG		printk ("PCMCIA virt base: %08lx\n", pcmcia_base);#endif		/* Compute clock cycles for PIO timings */		for (i=0; i<6; ++i) {			bd_t	*binfo = (bd_t *)__res;			hold_time[i]   =				PCMCIA_MK_CLKS (hold_time[i],						binfo->bi_busfreq);			ide_pio_clocks[i].setup_time  =				PCMCIA_MK_CLKS (ide_pio_timings[i].setup_time,						binfo->bi_busfreq);			ide_pio_clocks[i].active_time =				PCMCIA_MK_CLKS (ide_pio_timings[i].active_time,						binfo->bi_busfreq);			ide_pio_clocks[i].cycle_time  =				PCMCIA_MK_CLKS (ide_pio_timings[i].cycle_time,						binfo->bi_busfreq);#if 0			printk ("PIO mode %d timings: %d/%d/%d => %d/%d/%d\n",				i,				ide_pio_clocks[i].setup_time,				ide_pio_clocks[i].active_time,				ide_pio_clocks[i].hold_time,				ide_pio_clocks[i].cycle_time,				ide_pio_timings[i].setup_time,				ide_pio_timings[i].active_time,				ide_pio_timings[i].hold_time,				ide_pio_timings[i].cycle_time);#endif		}	}	if (data_port >= MAX_HWIFS)		return;	if (_slot_ == -1) {		printk ("PCMCIA slot has not been defined! Using A as default\n");		_slot_ = 0;	}#ifdef CONFIG_IDE_8xx_PCCARD#ifdef DEBUG	printk ("PIPR = 0x%08X  slot %c ==> mask = 0x%X\n",		pcmp->pcmc_pipr,		'A' + _slot_,		M8XX_PCMCIA_CD1(_slot_) | M8XX_PCMCIA_CD2(_slot_) );#endif /* DEBUG */	if (pcmp->pcmc_pipr & (M8XX_PCMCIA_CD1(_slot_)|M8XX_PCMCIA_CD2(_slot_))) {		printk ("No card in slot %c: PIPR=%08x\n",			'A' + _slot_, (u32) pcmp->pcmc_pipr);		return;		/* No card in slot */	}	check_ide_device (pcmcia_base);#endif	/* CONFIG_IDE_8xx_PCCARD */	base = pcmcia_base + ioport_dsc[data_port].base_off;#ifdef DEBUG	printk ("base: %08x + %08x = %08x\n",			pcmcia_base, ioport_dsc[data_port].base_off, base);#endif	for (i = 0; i < IDE_NR_PORTS; ++i) {#ifdef DEBUG		printk ("port[%d]: %08x + %08x = %08x\n",			i,			base,			ioport_dsc[data_port].reg_off[i],			i, base + ioport_dsc[data_port].reg_off[i]);#endif	 	*p++ = base + ioport_dsc[data_port].reg_off[i];	}	if (irq) {#ifdef CONFIG_IDE_8xx_PCCARD		unsigned int reg;		*irq = ioport_dsc[data_port].irq;		if (_slot_)			pgcrx = &((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pgcrb;		else			pgcrx = &((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pgcra;		reg = *pgcrx;		reg |= mk_int_int_mask (pcmcia_schlvl) << 24;		reg |= mk_int_int_mask (pcmcia_schlvl) << 16;		*pgcrx = reg;#else	/* direct connected IDE drive, i.e. external IRQ, not the PCMCIA irq */		*irq = ioport_dsc[data_port].irq;#endif	/* CONFIG_IDE_8xx_PCCARD */	}	/* register routine to tune PIO mode */	ide_hwifs[data_port].tuneproc = m8xx_ide_tuneproc;	hw->ack_intr = (ide_ack_intr_t *) ide_interrupt_ack;	/* Enable Harddisk Interrupt,	 * and make it edge sensitive	 */	/* (11-18) Set edge detect for irq, no wakeup from low power mode */	((immap_t *)IMAP_ADDR)->im_siu_conf.sc_siel |=					(0x80000000 >> ioport_dsc[data_port].irq);#ifdef CONFIG_IDE_8xx_PCCARD	/* Make sure we dont get garbage irq */	((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pscr = 0xFFFF;	/* Enable falling edge irq */	pcmp->pcmc_per = 0x100000 >> (16 * _slot_);#endif	/* CONFIG_IDE_8xx_PCCARD */}	/* m8xx_ide_init_hwif_ports() using 8xx internal PCMCIA interface */#endif /* CONFIG_IDE_8xx_PCCARD || CONFIG_IDE_8xx_DIRECT *//* * m8xx_ide_init_hwif_ports for a direct IDE interface _not_ using * MPC8xx's internal PCMCIA interface */#if defined(CONFIG_IDE_EXT_DIRECT)void m8xx_ide_init_hwif_ports (hw_regs_t *hw,	ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq){	ide_ioreg_t *p = hw->io_ports;	int i;	u32 ide_phy_base;	u32 ide_phy_end;	static unsigned long ide_base = 0;	unsigned long base;	*p = 0;	if (irq)		*irq = 0;	if (!ide_base) {		/* TODO:		 * - add code to read ORx, BRx		 */		ide_phy_base = CFG_ATA_BASE_ADDR;		ide_phy_end  = CFG_ATA_BASE_ADDR + 0x200;		printk ("IDE phys mem : %08x...%08x (size %08x)\n",			ide_phy_base, ide_phy_end,			ide_phy_end - ide_phy_base);				ide_base=(unsigned long)ioremap(ide_phy_base,						ide_phy_end-ide_phy_base);#ifdef DEBUG		printk ("IDE virt base: %08lx\n", ide_base);#endif	}	if (data_port >= MAX_HWIFS)		return;	base = ide_base + ioport_dsc[data_port].base_off;#ifdef DEBUG	printk ("base: %08x + %08x = %08x\n",		ide_base, ioport_dsc[data_port].base_off, base);#endif	for (i = 0; i < IDE_NR_PORTS; ++i) {#ifdef DEBUG		printk ("port[%d]: %08x + %08x = %08x\n",			i,			base,			ioport_dsc[data_port].reg_off[i],			i, base + ioport_dsc[data_port].reg_off[i]);#endif	 	*p++ = base + ioport_dsc[data_port].reg_off[i];	}	if (irq) {		/* direct connected IDE drive, i.e. external IRQ */		*irq = ioport_dsc[data_port].irq;	}	/* register routine to tune PIO mode */	ide_hwifs[data_port].tuneproc = m8xx_ide_tuneproc;	hw->ack_intr = (ide_ack_intr_t *) ide_interrupt_ack;	/* Enable Harddisk Interrupt,	 * and make it edge sensitive	 */	/* (11-18) Set edge detect for irq, no wakeup from low power mode */	((immap_t *) IMAP_ADDR)->im_siu_conf.sc_siel |=			(0x80000000 >> ioport_dsc[data_port].irq);}	/* m8xx_ide_init_hwif_ports() for CONFIG_IDE_8xx_DIRECT */ #endif	/* CONFIG_IDE_8xx_DIRECT *//* -------------------------------------------------------------------- *//* PCMCIA Timing */#ifndef	PCMCIA_SHT#define PCMCIA_SHT(t)	((t & 0x0F)<<16)	/* Strobe Hold  Time 	*/#define PCMCIA_SST(t)	((t & 0x0F)<<12)	/* Strobe Setup Time	*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情文学综合插| 亚洲综合男人的天堂| 精品视频一区三区九区| 91同城在线观看| 不卡影院免费观看| 99精品久久久久久| 色综合网色综合| 欧洲视频一区二区| 欧美亚洲国产一区二区三区| 欧洲精品视频在线观看| 欧美色综合网站| 欧美日韩第一区日日骚| 日韩欧美在线网站| 日韩欧美成人午夜| 亚洲国产激情av| 亚洲欧美日韩在线播放| 亚洲成人精品影院| 肉丝袜脚交视频一区二区| 美女国产一区二区三区| 国产伦精品一区二区三区免费| 国产伦精品一区二区三区免费| 成人午夜在线播放| 欧美日韩在线播| 精品播放一区二区| √…a在线天堂一区| 亚洲va在线va天堂| 国产黄色成人av| 在线观看成人小视频| 精品国偷自产国产一区| 国产精品国产自产拍高清av王其 | 欧美一区二区三区成人| 精品久久人人做人人爱| 最新久久zyz资源站| 午夜久久久久久久久| 国产精品一区二区久久精品爱涩 | 亚洲大片在线观看| 国产资源在线一区| 91久久精品一区二区三| 精品美女一区二区| 亚洲人快播电影网| 国产在线精品视频| 欧美日韩综合不卡| 国产精品污网站| 激情五月婷婷综合网| 色婷婷综合中文久久一本| 日韩写真欧美这视频| 一区二区在线观看视频| 国产在线播放一区三区四| 欧美精选一区二区| 亚洲免费在线视频| 从欧美一区二区三区| 日韩欧美第一区| 日韩av午夜在线观看| 色综合久久久久| 亚洲国产精品精华液ab| 麻豆精品一区二区综合av| 在线免费观看日本欧美| 国产精品卡一卡二卡三| 国产高清成人在线| 久久精品人人做人人爽人人| 日韩av一二三| 日韩小视频在线观看专区| 首页国产丝袜综合| 欧美丝袜丝nylons| 亚洲成人自拍网| 一本色道a无线码一区v| 亚洲免费在线观看视频| 99国产精品久久久久久久久久 | 2017欧美狠狠色| 久久国产精品第一页| 91麻豆精品久久久久蜜臀| 亚洲国产一区视频| 欧美日韩高清影院| 天天综合色天天| 91麻豆精品国产自产在线观看一区 | 日韩视频在线永久播放| 日韩国产在线观看一区| 91精品国产麻豆国产自产在线| 亚洲国产va精品久久久不卡综合 | 日韩一级视频免费观看在线| 日韩国产欧美在线视频| 日韩欧美亚洲国产精品字幕久久久| 日日夜夜一区二区| 日韩欧美国产wwwww| 国产一区二区三区综合| 国产视频一区二区在线观看| 国产·精品毛片| 亚洲视频1区2区| 在线一区二区观看| 日本欧美一区二区| 久久综合色8888| 99精品欧美一区二区三区综合在线| 夜夜精品视频一区二区 | 综合久久久久综合| 91九色02白丝porn| 青青草精品视频| 久久精品免视看| 日本韩国欧美三级| 美女视频一区二区三区| 国产偷v国产偷v亚洲高清| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 一区二区久久久久久| 欧美精品乱码久久久久久按摩| 久久精品国产亚洲a| 中文字幕精品综合| 欧美高清视频www夜色资源网| 奇米色777欧美一区二区| 欧美国产精品专区| 在线综合+亚洲+欧美中文字幕| 国产精品一区二区三区四区| 亚洲精品国产第一综合99久久 | 国产成人免费9x9x人网站视频| 一区二区免费视频| 久久久精品黄色| 欧美日韩一二区| 成人av在线一区二区三区| 五月开心婷婷久久| 国产精品久久福利| 日韩精品一区二区三区在线播放| 91亚洲精品一区二区乱码| 久久成人免费日本黄色| 亚洲一区日韩精品中文字幕| 久久久久久久综合狠狠综合| 欧美日韩免费不卡视频一区二区三区| 国内精品伊人久久久久影院对白| 亚洲第一会所有码转帖| 亚洲美女免费在线| 国产日韩欧美综合一区| 制服.丝袜.亚洲.另类.中文 | 国内一区二区视频| 日本亚洲视频在线| 亚洲免费观看视频| 国产精品麻豆欧美日韩ww| 精品国产不卡一区二区三区| 在线成人免费观看| 欧洲一区在线观看| 91福利精品第一导航| 成人黄色免费短视频| 国产69精品久久久久777| 国产精品一区在线| 国产毛片精品视频| 国产精品白丝av| 国产在线播放一区二区三区| 精品午夜一区二区三区在线观看| 日日夜夜免费精品| 午夜精品福利一区二区三区蜜桃| 亚洲女人的天堂| 亚洲摸摸操操av| 亚洲精品中文在线影院| 亚洲欧洲综合另类| 亚洲综合图片区| 日韩黄色一级片| 青青草国产精品97视觉盛宴| 免费成人在线播放| 麻豆国产精品官网| 国产在线精品一区二区三区不卡 | 视频一区二区欧美| 午夜视频在线观看一区| 婷婷夜色潮精品综合在线| 午夜久久电影网| 老司机免费视频一区二区三区| 精品中文字幕一区二区小辣椒| 免费成人av在线| 国产一区不卡视频| 成人一区二区三区视频在线观看| 成人av第一页| 欧美另类高清zo欧美| 日韩午夜精品视频| 国产欧美一区在线| 亚洲六月丁香色婷婷综合久久| 亚洲国产va精品久久久不卡综合| 丝瓜av网站精品一区二区 | 欧美系列在线观看| 欧美一三区三区四区免费在线看 | 欧美久久一二区| 久久综合国产精品| 中文字幕一区二区三区四区| 亚洲日本欧美天堂| 首页国产欧美日韩丝袜| 国产精品18久久久| 欧美在线制服丝袜| 精品国产欧美一区二区| 国产精品国产三级国产aⅴ入口| 日韩精品福利网| 日韩国产在线观看| av在线综合网| 欧美精品亚洲二区| 中文天堂在线一区| 日韩和的一区二区| 99久久精品国产导航| 日韩精品一区二区三区视频在线观看| 国产欧美日产一区| 午夜久久电影网| 成人福利电影精品一区二区在线观看| 欧美图片一区二区三区| 国产丝袜在线精品| 日韩精品色哟哟| 成人免费视频视频| 日韩精品资源二区在线| 一区二区欧美视频|