Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
		
						commit
						ddcc959634
					
				| @ -25,15 +25,6 @@ Who:	Pavel Machek <pavel@suse.cz> | ||||
| 
 | ||||
| --------------------------- | ||||
| 
 | ||||
| What:	PCI Name Database (CONFIG_PCI_NAMES) | ||||
| When:	July 2005 | ||||
| Why:	It bloats the kernel unnecessarily, and is handled by userspace better | ||||
| 	(pciutils supports it.)  Will eliminate the need to try to keep the | ||||
| 	pci.ids file in sync with the sf.net database all of the time. | ||||
| Who:	Greg Kroah-Hartman <gregkh@suse.de> | ||||
| 
 | ||||
| --------------------------- | ||||
| 
 | ||||
| What:	io_remap_page_range() (macro or function) | ||||
| When:	September 2005 | ||||
| Why:	Replaced by io_remap_pfn_range() which allows more memory space | ||||
|  | ||||
							
								
								
									
										203
									
								
								Documentation/input/yealink.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								Documentation/input/yealink.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| Driver documentation for yealink usb-p1k phones | ||||
| 
 | ||||
| 0. Status | ||||
| ~~~~~~~~~ | ||||
| 
 | ||||
| The p1k is a relatively cheap usb 1.1 phone with: | ||||
|   - keyboard		full support, yealink.ko / input event API | ||||
|   - LCD			full support, yealink.ko / sysfs API | ||||
|   - LED			full support, yealink.ko / sysfs API | ||||
|   - dialtone		full support, yealink.ko / sysfs API | ||||
|   - ringtone		full support, yealink.ko / sysfs API | ||||
|   - audio playback   	full support, snd_usb_audio.ko / alsa API | ||||
|   - audio record     	full support, snd_usb_audio.ko / alsa API | ||||
| 
 | ||||
| For vendor documentation see http://www.yealink.com | ||||
| 
 | ||||
| 
 | ||||
| 1. Compilation (stand alone version) | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| 
 | ||||
| Currently only kernel 2.6.x.y versions are supported. | ||||
| In order to build the yealink.ko module do: | ||||
| 
 | ||||
|   make | ||||
| 
 | ||||
| If you encounter problems please check if in the MAKE_OPTS variable in | ||||
| the Makefile is pointing to the location where your kernel sources | ||||
| are located, default /usr/src/linux. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 2. keyboard features | ||||
| ~~~~~~~~~~~~~~~~~~~~ | ||||
| The current mapping in the kernel is provided by the map_p1k_to_key | ||||
| function: | ||||
| 
 | ||||
|    Physical USB-P1K button layout	input events | ||||
| 
 | ||||
| 
 | ||||
|               up			     up | ||||
|         IN           OUT		left,	right | ||||
|              down			    down | ||||
| 
 | ||||
|       pickup   C    hangup		enter, backspace, escape | ||||
|         1      2      3			1, 2, 3 | ||||
|         4      5      6			4, 5, 6, | ||||
|         7      8      9			7, 8, 9, | ||||
|         *      0      #			*, 0, #, | ||||
| 
 | ||||
|   The "up" and "down" keys, are symbolised by arrows on the button. | ||||
|   The "pickup" and "hangup" keys are symbolised by a green and red phone | ||||
|   on the button. | ||||
| 
 | ||||
| 
 | ||||
| 3. LCD features | ||||
| ~~~~~~~~~~~~~~~ | ||||
| The LCD is divided and organised as a 3 line display: | ||||
| 
 | ||||
|     |[]   [][]   [][]   [][]   in   |[][] | ||||
|     |[] M [][] D [][] : [][]   out  |[][] | ||||
|                               store | ||||
| 
 | ||||
|     NEW REP         SU MO TU WE TH FR SA | ||||
| 
 | ||||
|     [] [] [] [] [] [] [] [] [] [] [] [] | ||||
|     [] [] [] [] [] [] [] [] [] [] [] [] | ||||
| 
 | ||||
| 
 | ||||
| Line 1	Format (see below)	: 18.e8.M8.88...188 | ||||
| 	Icon names		:   M  D  :  IN OUT STORE | ||||
| Line 2  Format			: ......... | ||||
| 	Icon name		: NEW REP SU MO TU WE TH FR SA | ||||
| Line 3  Format			: 888888888888 | ||||
| 
 | ||||
| 
 | ||||
| Format description: | ||||
|   From a user space perspective the world is seperated in "digits" and "icons". | ||||
|   A digit can have a character set, an icon can only be ON or OFF. | ||||
| 
 | ||||
|   Format specifier | ||||
|     '8' :  Generic 7 segment digit with individual addressable segments | ||||
| 
 | ||||
|     Reduced capabillity 7 segm digit, when segments are hard wired together. | ||||
|     '1' : 2 segments digit only able to produce a 1. | ||||
|     'e' : Most significant day of the month digit, | ||||
|           able to produce at least 1 2 3. | ||||
|     'M' : Most significant minute digit, | ||||
|           able to produce at least 0 1 2 3 4 5. | ||||
| 
 | ||||
|     Icons or pictograms: | ||||
|     '.' : For example like AM, PM, SU, a 'dot' .. or other single segment | ||||
| 	  elements. | ||||
| 
 | ||||
| 
 | ||||
| 4. Driver usage | ||||
| ~~~~~~~~~~~~~~~ | ||||
| For userland the following interfaces are available using the sysfs interface: | ||||
|   /sys/.../ | ||||
|            line1	Read/Write, lcd line1 | ||||
|            line2	Read/Write, lcd line2 | ||||
|            line3	Read/Write, lcd line3 | ||||
| 
 | ||||
| 	   get_icons    Read, returns a set of available icons. | ||||
| 	   hide_icon    Write, hide the element by writing the icon name. | ||||
| 	   show_icon    Write, display the element by writing the icon name. | ||||
| 
 | ||||
| 	   map_seg7	Read/Write, the 7 segments char set, common for all | ||||
| 	   		yealink phones. (see map_to_7segment.h) | ||||
| 
 | ||||
| 	   ringtone	Write, upload binary representation of a ringtone, | ||||
| 	   		see yealink.c. status EXPERIMENTAL due to potential | ||||
| 			races between async. and sync usb calls. | ||||
| 
 | ||||
| 
 | ||||
| 4.1 lineX | ||||
| ~~~~~~~~~ | ||||
| Reading /sys/../lineX will return the format string with its current value: | ||||
| 
 | ||||
|   Example: | ||||
|   cat ./line3 | ||||
|   888888888888 | ||||
|   Linux Rocks! | ||||
| 
 | ||||
| Writing to /sys/../lineX will set the coresponding LCD line. | ||||
|  - Excess characters are ignored. | ||||
|  - If less characters are written than allowed, the remaining digits are | ||||
|    unchanged. | ||||
|  - The tab '\t'and '\n' char does not overwrite the original content. | ||||
|  - Writing a space to an icon will always hide its content. | ||||
| 
 | ||||
|   Example: | ||||
|   date +"%m.%e.%k:%M"  | sed 's/^0/ /' > ./line1 | ||||
| 
 | ||||
|   Will update the LCD with the current date & time. | ||||
| 
 | ||||
| 
 | ||||
| 4.2 get_icons | ||||
| ~~~~~~~~~~~~~ | ||||
| Reading will return all available icon names and its current settings: | ||||
| 
 | ||||
|   cat ./get_icons | ||||
|   on M | ||||
|   on D | ||||
|   on : | ||||
|      IN | ||||
|      OUT | ||||
|      STORE | ||||
|      NEW | ||||
|      REP | ||||
|      SU | ||||
|      MO | ||||
|      TU | ||||
|      WE | ||||
|      TH | ||||
|      FR | ||||
|      SA | ||||
|      LED | ||||
|      DIALTONE | ||||
|      RINGTONE | ||||
| 
 | ||||
| 
 | ||||
| 4.3 show/hide icons | ||||
| ~~~~~~~~~~~~~~~~~~~ | ||||
| Writing to these files will update the state of the icon. | ||||
| Only one icon at a time can be updated. | ||||
| 
 | ||||
| If an icon is also on a ./lineX the corresponding value is | ||||
| updated with the first letter of the icon. | ||||
| 
 | ||||
|   Example - light up the store icon: | ||||
|   echo -n "STORE" > ./show_icon | ||||
| 
 | ||||
|   cat ./line1 | ||||
|   18.e8.M8.88...188 | ||||
|                S | ||||
| 
 | ||||
|   Example - sound the ringtone for 10 seconds: | ||||
|   echo -n RINGTONE > /sys/..../show_icon | ||||
|   sleep 10 | ||||
|   echo -n RINGTONE > /sys/..../hide_icon | ||||
| 
 | ||||
| 
 | ||||
| 5. Sound features | ||||
| ~~~~~~~~~~~~~~~~~ | ||||
| Sound is supported by the ALSA driver: snd_usb_audio | ||||
| 
 | ||||
| One 16-bit channel with sample and playback rates of 8000 Hz is the practical | ||||
| limit of the device. | ||||
| 
 | ||||
|   Example - recording test: | ||||
|   arecord -v -d 10 -r 8000 -f S16_LE -t wav  foobar.wav | ||||
| 
 | ||||
|   Example - playback test: | ||||
|   aplay foobar.wav | ||||
| 
 | ||||
| 
 | ||||
| 6. Credits & Acknowledgments | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|   - Olivier Vandorpe, for starting the usbb2k-api project doing much of | ||||
| 	the reverse engineering. | ||||
|   - Martin Diehl, for pointing out how to handle USB memory allocation. | ||||
|   - Dmitry Torokhov, for the numerous code reviews and suggestions. | ||||
| 
 | ||||
							
								
								
									
										13
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -116,6 +116,12 @@ M:	ajk@iehk.rwth-aachen.de | ||||
| L:	linux-hams@vger.kernel.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| YEALINK PHONE DRIVER | ||||
| P:	Henk Vergonet | ||||
| M:	Henk.Vergonet@gmail.com | ||||
| L:	usbb2k-api-dev@nongnu.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| 8139CP 10/100 FAST ETHERNET DRIVER | ||||
| P:	Jeff Garzik | ||||
| M:	jgarzik@pobox.com | ||||
| @ -1813,13 +1819,6 @@ M:	hch@infradead.org | ||||
| L:	linux-abi-devel@lists.sourceforge.net | ||||
| S:	Maintained | ||||
| 
 | ||||
| PCI ID DATABASE | ||||
| P:	Martin Mares | ||||
| M:	mj@ucw.cz | ||||
| L:	pciids-devel@lists.sourceforge.net | ||||
| W:	http://pciids.sourceforge.net/ | ||||
| S:	Maintained | ||||
| 
 | ||||
| PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES) | ||||
| P:	Thomas Sailer | ||||
| M:	sailer@ife.ee.ethz.ch | ||||
|  | ||||
| @ -373,12 +373,11 @@ marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||||
| 		irq += 0x80;			/* offset for lsi       */ | ||||
| 
 | ||||
| #if 1 | ||||
| 		printk("PCI:%d:%d:%d (hose %d) [%s] is using MSI\n", | ||||
| 		printk("PCI:%d:%d:%d (hose %d) is using MSI\n", | ||||
| 		       dev->bus->number,  | ||||
| 		       PCI_SLOT(dev->devfn),  | ||||
| 		       PCI_FUNC(dev->devfn), | ||||
| 		       hose->index, | ||||
| 		       pci_pretty_name (dev)); | ||||
| 		       hose->index); | ||||
| 		printk("  %d message(s) from 0x%04x\n",  | ||||
| 		       1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4), | ||||
| 		       msg_dat); | ||||
|  | ||||
| @ -541,6 +541,103 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| 
 | ||||
| struct locomo_save_data { | ||||
| 	u16	LCM_GPO; | ||||
| 	u16	LCM_SPICT; | ||||
| 	u16	LCM_GPE; | ||||
| 	u16	LCM_ASD; | ||||
| 	u16	LCM_SPIMD; | ||||
| }; | ||||
| 
 | ||||
| static int locomo_suspend(struct device *dev, u32 pm_message_t, u32 level) | ||||
| { | ||||
| 	struct locomo *lchip = dev_get_drvdata(dev); | ||||
| 	struct locomo_save_data *save; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (level != SUSPEND_DISABLE) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL); | ||||
| 	if (!save) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	dev->power.saved_state = (void *) save; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&lchip->lock, flags); | ||||
| 
 | ||||
| 	save->LCM_GPO     = locomo_readl(lchip->base + LOCOMO_GPO);	/* GPIO */ | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_GPO); | ||||
| 	save->LCM_SPICT   = locomo_readl(lchip->base + LOCOMO_SPICT);	/* SPI */ | ||||
| 	locomo_writel(0x40, lchip->base + LOCOMO_SPICT); | ||||
| 	save->LCM_GPE     = locomo_readl(lchip->base + LOCOMO_GPE);	/* GPIO */ | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_GPE); | ||||
| 	save->LCM_ASD     = locomo_readl(lchip->base + LOCOMO_ASD);	/* ADSTART */ | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_ASD); | ||||
| 	save->LCM_SPIMD   = locomo_readl(lchip->base + LOCOMO_SPIMD);	/* SPI */ | ||||
| 	locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD); | ||||
| 
 | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_PAIF); | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_DAC); | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); | ||||
| 
 | ||||
| 	if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) ) | ||||
| 		locomo_writel(0x00, lchip->base + LOCOMO_C32K); 	/* CLK32 off */ | ||||
| 	else | ||||
| 		/* 18MHz already enabled, so no wait */ | ||||
| 		locomo_writel(0xc1, lchip->base + LOCOMO_C32K); 	/* CLK32 on */ | ||||
| 
 | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_TADC);		/* 18MHz clock off*/ | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC);			/* 22MHz/24MHz clock off */ | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);			/* FL */ | ||||
| 
 | ||||
| 	spin_unlock_irqrestore(&lchip->lock, flags); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int locomo_resume(struct device *dev, u32 level) | ||||
| { | ||||
| 	struct locomo *lchip = dev_get_drvdata(dev); | ||||
| 	struct locomo_save_data *save; | ||||
| 	unsigned long r; | ||||
| 	unsigned long flags; | ||||
| 	 | ||||
| 	if (level != RESUME_ENABLE) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	save = (struct locomo_save_data *) dev->power.saved_state; | ||||
| 	if (!save) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&lchip->lock, flags); | ||||
| 
 | ||||
| 	locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); | ||||
| 	locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT); | ||||
| 	locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); | ||||
| 	locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); | ||||
| 	locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD); | ||||
| 
 | ||||
| 	locomo_writel(0x00, lchip->base + LOCOMO_C32K); | ||||
| 	locomo_writel(0x90, lchip->base + LOCOMO_TADC); | ||||
| 
 | ||||
| 	locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC); | ||||
| 	r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||||
| 	r &= 0xFEFF; | ||||
| 	locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||||
| 	locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD); | ||||
| 
 | ||||
| 	spin_unlock_irqrestore(&lchip->lock, flags); | ||||
| 
 | ||||
| 	dev->power.saved_state = NULL; | ||||
| 	kfree(save); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  *	locomo_probe - probe for a single LoCoMo chip. | ||||
|  *	@phys_addr: physical address of device. | ||||
| @ -707,6 +804,10 @@ static struct device_driver locomo_device_driver = { | ||||
| 	.bus		= &platform_bus_type, | ||||
| 	.probe		= locomo_probe, | ||||
| 	.remove		= locomo_remove, | ||||
| #ifdef CONFIG_PM | ||||
| 	.suspend	= locomo_suspend, | ||||
| 	.resume		= locomo_resume, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.12-git4 | ||||
| # Wed Jun 22 15:56:42 2005 | ||||
| # Linux kernel version: 2.6.13-git8 | ||||
| # Thu Sep  8 19:24:02 2005 | ||||
| # | ||||
| CONFIG_ARM=y | ||||
| CONFIG_MMU=y | ||||
| @ -22,6 +22,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | ||||
| # General setup | ||||
| # | ||||
| CONFIG_LOCALVERSION="" | ||||
| CONFIG_LOCALVERSION_AUTO=y | ||||
| CONFIG_SWAP=y | ||||
| CONFIG_SYSVIPC=y | ||||
| # CONFIG_POSIX_MQUEUE is not set | ||||
| @ -31,6 +32,7 @@ CONFIG_SYSCTL=y | ||||
| # CONFIG_HOTPLUG is not set | ||||
| CONFIG_KOBJECT_UEVENT=y | ||||
| # CONFIG_IKCONFIG is not set | ||||
| CONFIG_INITRAMFS_SOURCE="" | ||||
| # CONFIG_EMBEDDED is not set | ||||
| CONFIG_KALLSYMS=y | ||||
| # CONFIG_KALLSYMS_ALL is not set | ||||
| @ -88,7 +90,9 @@ CONFIG_ARCH_S3C2410=y | ||||
| # | ||||
| # S3C24XX Implementations | ||||
| # | ||||
| CONFIG_MACH_ANUBIS=y | ||||
| CONFIG_ARCH_BAST=y | ||||
| CONFIG_BAST_PC104_IRQ=y | ||||
| CONFIG_ARCH_H1940=y | ||||
| CONFIG_MACH_N30=y | ||||
| CONFIG_ARCH_SMDK2410=y | ||||
| @ -112,6 +116,7 @@ CONFIG_S3C2410_DMA=y | ||||
| # CONFIG_S3C2410_DMA_DEBUG is not set | ||||
| # CONFIG_S3C2410_PM_DEBUG is not set | ||||
| # CONFIG_S3C2410_PM_CHECK is not set | ||||
| CONFIG_PM_SIMTEC=y | ||||
| CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 | ||||
| 
 | ||||
| # | ||||
| @ -149,7 +154,15 @@ CONFIG_ISA_DMA_API=y | ||||
| # | ||||
| # CONFIG_SMP is not set | ||||
| # CONFIG_PREEMPT is not set | ||||
| # CONFIG_DISCONTIGMEM is not set | ||||
| # CONFIG_NO_IDLE_HZ is not set | ||||
| # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||||
| CONFIG_SELECT_MEMORY_MODEL=y | ||||
| CONFIG_FLATMEM_MANUAL=y | ||||
| # CONFIG_DISCONTIGMEM_MANUAL is not set | ||||
| # CONFIG_SPARSEMEM_MANUAL is not set | ||||
| CONFIG_FLATMEM=y | ||||
| CONFIG_FLAT_NODE_MEM_MAP=y | ||||
| # CONFIG_SPARSEMEM_STATIC is not set | ||||
| CONFIG_ALIGNMENT_TRAP=y | ||||
| 
 | ||||
| # | ||||
| @ -185,6 +198,74 @@ CONFIG_BINFMT_AOUT=y | ||||
| CONFIG_PM=y | ||||
| CONFIG_APM=y | ||||
| 
 | ||||
| # | ||||
| # Networking | ||||
| # | ||||
| CONFIG_NET=y | ||||
| 
 | ||||
| # | ||||
| # Networking options | ||||
| # | ||||
| # CONFIG_PACKET is not set | ||||
| CONFIG_UNIX=y | ||||
| # CONFIG_NET_KEY is not set | ||||
| CONFIG_INET=y | ||||
| # CONFIG_IP_MULTICAST is not set | ||||
| # CONFIG_IP_ADVANCED_ROUTER is not set | ||||
| CONFIG_IP_FIB_HASH=y | ||||
| CONFIG_IP_PNP=y | ||||
| # CONFIG_IP_PNP_DHCP is not set | ||||
| CONFIG_IP_PNP_BOOTP=y | ||||
| # CONFIG_IP_PNP_RARP is not set | ||||
| # CONFIG_NET_IPIP is not set | ||||
| # CONFIG_NET_IPGRE is not set | ||||
| # CONFIG_ARPD is not set | ||||
| # CONFIG_SYN_COOKIES is not set | ||||
| # CONFIG_INET_AH is not set | ||||
| # CONFIG_INET_ESP is not set | ||||
| # CONFIG_INET_IPCOMP is not set | ||||
| # CONFIG_INET_TUNNEL is not set | ||||
| CONFIG_INET_DIAG=y | ||||
| CONFIG_INET_TCP_DIAG=y | ||||
| # CONFIG_TCP_CONG_ADVANCED is not set | ||||
| CONFIG_TCP_CONG_BIC=y | ||||
| # CONFIG_IPV6 is not set | ||||
| # CONFIG_NETFILTER is not set | ||||
| 
 | ||||
| # | ||||
| # DCCP Configuration (EXPERIMENTAL) | ||||
| # | ||||
| # CONFIG_IP_DCCP is not set | ||||
| 
 | ||||
| # | ||||
| # SCTP Configuration (EXPERIMENTAL) | ||||
| # | ||||
| # CONFIG_IP_SCTP is not set | ||||
| # CONFIG_ATM is not set | ||||
| # CONFIG_BRIDGE is not set | ||||
| # CONFIG_VLAN_8021Q is not set | ||||
| # CONFIG_DECNET is not set | ||||
| # CONFIG_LLC2 is not set | ||||
| # CONFIG_IPX is not set | ||||
| # CONFIG_ATALK is not set | ||||
| # CONFIG_X25 is not set | ||||
| # CONFIG_LAPB is not set | ||||
| # CONFIG_NET_DIVERT is not set | ||||
| # CONFIG_ECONET is not set | ||||
| # CONFIG_WAN_ROUTER is not set | ||||
| # CONFIG_NET_SCHED is not set | ||||
| # CONFIG_NET_CLS_ROUTE is not set | ||||
| 
 | ||||
| # | ||||
| # Network testing | ||||
| # | ||||
| # CONFIG_NET_PKTGEN is not set | ||||
| # CONFIG_NETFILTER_NETLINK is not set | ||||
| # CONFIG_HAMRADIO is not set | ||||
| # CONFIG_IRDA is not set | ||||
| # CONFIG_BT is not set | ||||
| # CONFIG_IEEE80211 is not set | ||||
| 
 | ||||
| # | ||||
| # Device Drivers | ||||
| # | ||||
| @ -258,6 +339,7 @@ CONFIG_MTD_ROM=y | ||||
| # CONFIG_MTD_IMPA7 is not set | ||||
| CONFIG_MTD_BAST=y | ||||
| CONFIG_MTD_BAST_MAXSIZE=4 | ||||
| # CONFIG_MTD_PLATRAM is not set | ||||
| 
 | ||||
| # | ||||
| # Self-contained MTD device drivers | ||||
| @ -312,7 +394,6 @@ CONFIG_BLK_DEV_RAM=y | ||||
| CONFIG_BLK_DEV_RAM_COUNT=16 | ||||
| CONFIG_BLK_DEV_RAM_SIZE=4096 | ||||
| CONFIG_BLK_DEV_INITRD=y | ||||
| CONFIG_INITRAMFS_SOURCE="" | ||||
| # CONFIG_CDROM_PKTCDVD is not set | ||||
| 
 | ||||
| # | ||||
| @ -354,6 +435,7 @@ CONFIG_BLK_DEV_IDE_BAST=y | ||||
| # | ||||
| # SCSI device support | ||||
| # | ||||
| # CONFIG_RAID_ATTRS is not set | ||||
| # CONFIG_SCSI is not set | ||||
| 
 | ||||
| # | ||||
| @ -376,76 +458,19 @@ CONFIG_BLK_DEV_IDE_BAST=y | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Networking support | ||||
| # Network device support | ||||
| # | ||||
| CONFIG_NET=y | ||||
| 
 | ||||
| # | ||||
| # Networking options | ||||
| # | ||||
| # CONFIG_PACKET is not set | ||||
| CONFIG_UNIX=y | ||||
| # CONFIG_NET_KEY is not set | ||||
| CONFIG_INET=y | ||||
| CONFIG_IP_FIB_HASH=y | ||||
| # CONFIG_IP_FIB_TRIE is not set | ||||
| # CONFIG_IP_MULTICAST is not set | ||||
| # CONFIG_IP_ADVANCED_ROUTER is not set | ||||
| CONFIG_IP_PNP=y | ||||
| # CONFIG_IP_PNP_DHCP is not set | ||||
| CONFIG_IP_PNP_BOOTP=y | ||||
| # CONFIG_IP_PNP_RARP is not set | ||||
| # CONFIG_NET_IPIP is not set | ||||
| # CONFIG_NET_IPGRE is not set | ||||
| # CONFIG_ARPD is not set | ||||
| # CONFIG_SYN_COOKIES is not set | ||||
| # CONFIG_INET_AH is not set | ||||
| # CONFIG_INET_ESP is not set | ||||
| # CONFIG_INET_IPCOMP is not set | ||||
| # CONFIG_INET_TUNNEL is not set | ||||
| CONFIG_IP_TCPDIAG=y | ||||
| # CONFIG_IP_TCPDIAG_IPV6 is not set | ||||
| # CONFIG_IPV6 is not set | ||||
| # CONFIG_NETFILTER is not set | ||||
| 
 | ||||
| # | ||||
| # SCTP Configuration (EXPERIMENTAL) | ||||
| # | ||||
| # CONFIG_IP_SCTP is not set | ||||
| # CONFIG_ATM is not set | ||||
| # CONFIG_BRIDGE is not set | ||||
| # CONFIG_VLAN_8021Q is not set | ||||
| # CONFIG_DECNET is not set | ||||
| # CONFIG_LLC2 is not set | ||||
| # CONFIG_IPX is not set | ||||
| # CONFIG_ATALK is not set | ||||
| # CONFIG_X25 is not set | ||||
| # CONFIG_LAPB is not set | ||||
| # CONFIG_NET_DIVERT is not set | ||||
| # CONFIG_ECONET is not set | ||||
| # CONFIG_WAN_ROUTER is not set | ||||
| 
 | ||||
| # | ||||
| # QoS and/or fair queueing | ||||
| # | ||||
| # CONFIG_NET_SCHED is not set | ||||
| # CONFIG_NET_CLS_ROUTE is not set | ||||
| 
 | ||||
| # | ||||
| # Network testing | ||||
| # | ||||
| # CONFIG_NET_PKTGEN is not set | ||||
| # CONFIG_NETPOLL is not set | ||||
| # CONFIG_NET_POLL_CONTROLLER is not set | ||||
| # CONFIG_HAMRADIO is not set | ||||
| # CONFIG_IRDA is not set | ||||
| # CONFIG_BT is not set | ||||
| CONFIG_NETDEVICES=y | ||||
| # CONFIG_DUMMY is not set | ||||
| # CONFIG_BONDING is not set | ||||
| # CONFIG_EQUALIZER is not set | ||||
| # CONFIG_TUN is not set | ||||
| 
 | ||||
| # | ||||
| # PHY device support | ||||
| # | ||||
| # CONFIG_PHYLIB is not set | ||||
| 
 | ||||
| # | ||||
| # Ethernet (10 or 100Mbit) | ||||
| # | ||||
| @ -480,6 +505,8 @@ CONFIG_DM9000=m | ||||
| # CONFIG_SLIP is not set | ||||
| # CONFIG_SHAPER is not set | ||||
| # CONFIG_NETCONSOLE is not set | ||||
| # CONFIG_NETPOLL is not set | ||||
| # CONFIG_NET_POLL_CONTROLLER is not set | ||||
| 
 | ||||
| # | ||||
| # ISDN subsystem | ||||
| @ -562,7 +589,6 @@ CONFIG_SERIAL_8250_EXTENDED=y | ||||
| CONFIG_SERIAL_8250_MANY_PORTS=y | ||||
| CONFIG_SERIAL_8250_SHARE_IRQ=y | ||||
| # CONFIG_SERIAL_8250_DETECT_IRQ is not set | ||||
| # CONFIG_SERIAL_8250_MULTIPORT is not set | ||||
| # CONFIG_SERIAL_8250_RSA is not set | ||||
| 
 | ||||
| # | ||||
| @ -605,7 +631,6 @@ CONFIG_S3C2410_RTC=y | ||||
| # | ||||
| # Ftape, the floppy tape device driver | ||||
| # | ||||
| # CONFIG_DRM is not set | ||||
| # CONFIG_RAW_DRIVER is not set | ||||
| 
 | ||||
| # | ||||
| @ -628,7 +653,7 @@ CONFIG_I2C_ALGOBIT=m | ||||
| # | ||||
| # I2C Hardware Bus support | ||||
| # | ||||
| # CONFIG_I2C_ISA is not set | ||||
| CONFIG_I2C_ISA=m | ||||
| # CONFIG_I2C_PARPORT is not set | ||||
| # CONFIG_I2C_PARPORT_LIGHT is not set | ||||
| CONFIG_I2C_S3C2410=y | ||||
| @ -636,14 +661,33 @@ CONFIG_I2C_S3C2410=y | ||||
| # CONFIG_I2C_PCA_ISA is not set | ||||
| 
 | ||||
| # | ||||
| # Hardware Sensors Chip support | ||||
| # Miscellaneous I2C Chip support | ||||
| # | ||||
| CONFIG_I2C_SENSOR=m | ||||
| # CONFIG_SENSORS_DS1337 is not set | ||||
| # CONFIG_SENSORS_DS1374 is not set | ||||
| CONFIG_SENSORS_EEPROM=m | ||||
| # CONFIG_SENSORS_PCF8574 is not set | ||||
| # CONFIG_SENSORS_PCA9539 is not set | ||||
| # CONFIG_SENSORS_PCF8591 is not set | ||||
| # CONFIG_SENSORS_RTC8564 is not set | ||||
| # CONFIG_SENSORS_MAX6875 is not set | ||||
| # CONFIG_I2C_DEBUG_CORE is not set | ||||
| # CONFIG_I2C_DEBUG_ALGO is not set | ||||
| # CONFIG_I2C_DEBUG_BUS is not set | ||||
| # CONFIG_I2C_DEBUG_CHIP is not set | ||||
| 
 | ||||
| # | ||||
| # Hardware Monitoring support | ||||
| # | ||||
| CONFIG_HWMON=y | ||||
| CONFIG_HWMON_VID=m | ||||
| # CONFIG_SENSORS_ADM1021 is not set | ||||
| # CONFIG_SENSORS_ADM1025 is not set | ||||
| # CONFIG_SENSORS_ADM1026 is not set | ||||
| # CONFIG_SENSORS_ADM1031 is not set | ||||
| # CONFIG_SENSORS_ADM9240 is not set | ||||
| # CONFIG_SENSORS_ASB100 is not set | ||||
| # CONFIG_SENSORS_ATXP1 is not set | ||||
| # CONFIG_SENSORS_DS1621 is not set | ||||
| # CONFIG_SENSORS_FSCHER is not set | ||||
| # CONFIG_SENSORS_FSCPOS is not set | ||||
| @ -662,29 +706,23 @@ CONFIG_SENSORS_LM85=m | ||||
| # CONFIG_SENSORS_LM92 is not set | ||||
| # CONFIG_SENSORS_MAX1619 is not set | ||||
| # CONFIG_SENSORS_PC87360 is not set | ||||
| # CONFIG_SENSORS_SMSC47B397 is not set | ||||
| # CONFIG_SENSORS_SMSC47M1 is not set | ||||
| # CONFIG_SENSORS_SMSC47B397 is not set | ||||
| # CONFIG_SENSORS_W83781D is not set | ||||
| # CONFIG_SENSORS_W83792D is not set | ||||
| # CONFIG_SENSORS_W83L785TS is not set | ||||
| # CONFIG_SENSORS_W83627HF is not set | ||||
| 
 | ||||
| # | ||||
| # Other I2C Chip support | ||||
| # | ||||
| # CONFIG_SENSORS_DS1337 is not set | ||||
| CONFIG_SENSORS_EEPROM=m | ||||
| # CONFIG_SENSORS_PCF8574 is not set | ||||
| # CONFIG_SENSORS_PCF8591 is not set | ||||
| # CONFIG_SENSORS_RTC8564 is not set | ||||
| # CONFIG_I2C_DEBUG_CORE is not set | ||||
| # CONFIG_I2C_DEBUG_ALGO is not set | ||||
| # CONFIG_I2C_DEBUG_BUS is not set | ||||
| # CONFIG_I2C_DEBUG_CHIP is not set | ||||
| # CONFIG_SENSORS_W83627EHF is not set | ||||
| # CONFIG_HWMON_DEBUG_CHIP is not set | ||||
| 
 | ||||
| # | ||||
| # Misc devices | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Multimedia Capabilities Port drivers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Multimedia devices | ||||
| # | ||||
| @ -731,7 +769,7 @@ CONFIG_DUMMY_CONSOLE=y | ||||
| # USB support | ||||
| # | ||||
| CONFIG_USB_ARCH_HAS_HCD=y | ||||
| # CONFIG_USB_ARCH_HAS_OHCI is not set | ||||
| CONFIG_USB_ARCH_HAS_OHCI=y | ||||
| # CONFIG_USB is not set | ||||
| 
 | ||||
| # | ||||
| @ -749,6 +787,7 @@ CONFIG_USB_ARCH_HAS_HCD=y | ||||
| # | ||||
| CONFIG_EXT2_FS=y | ||||
| # CONFIG_EXT2_FS_XATTR is not set | ||||
| # CONFIG_EXT2_FS_XIP is not set | ||||
| CONFIG_EXT3_FS=y | ||||
| CONFIG_EXT3_FS_XATTR=y | ||||
| # CONFIG_EXT3_FS_POSIX_ACL is not set | ||||
| @ -758,6 +797,7 @@ CONFIG_JBD=y | ||||
| CONFIG_FS_MBCACHE=y | ||||
| # CONFIG_REISERFS_FS is not set | ||||
| # CONFIG_JFS_FS is not set | ||||
| # CONFIG_FS_POSIX_ACL is not set | ||||
| 
 | ||||
| # | ||||
| # XFS support | ||||
| @ -765,6 +805,7 @@ CONFIG_FS_MBCACHE=y | ||||
| # CONFIG_XFS_FS is not set | ||||
| # CONFIG_MINIX_FS is not set | ||||
| CONFIG_ROMFS_FS=y | ||||
| CONFIG_INOTIFY=y | ||||
| # CONFIG_QUOTA is not set | ||||
| CONFIG_DNOTIFY=y | ||||
| # CONFIG_AUTOFS_FS is not set | ||||
| @ -791,11 +832,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||||
| # | ||||
| CONFIG_PROC_FS=y | ||||
| CONFIG_SYSFS=y | ||||
| # CONFIG_DEVPTS_FS_XATTR is not set | ||||
| # CONFIG_TMPFS is not set | ||||
| # CONFIG_HUGETLBFS is not set | ||||
| # CONFIG_HUGETLB_PAGE is not set | ||||
| CONFIG_RAMFS=y | ||||
| # CONFIG_RELAYFS_FS is not set | ||||
| 
 | ||||
| # | ||||
| # Miscellaneous filesystems | ||||
| @ -812,8 +853,7 @@ CONFIG_JFFS_FS_VERBOSE=0 | ||||
| # CONFIG_JFFS_PROC_FS is not set | ||||
| CONFIG_JFFS2_FS=y | ||||
| CONFIG_JFFS2_FS_DEBUG=0 | ||||
| # CONFIG_JFFS2_FS_NAND is not set | ||||
| # CONFIG_JFFS2_FS_NOR_ECC is not set | ||||
| CONFIG_JFFS2_FS_WRITEBUFFER=y | ||||
| # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||||
| CONFIG_JFFS2_ZLIB=y | ||||
| CONFIG_JFFS2_RTIME=y | ||||
| @ -835,6 +875,7 @@ CONFIG_NFS_FS=y | ||||
| # CONFIG_NFSD is not set | ||||
| CONFIG_ROOT_NFS=y | ||||
| CONFIG_LOCKD=y | ||||
| CONFIG_NFS_COMMON=y | ||||
| CONFIG_SUNRPC=y | ||||
| # CONFIG_RPCSEC_GSS_KRB5 is not set | ||||
| # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||||
| @ -920,6 +961,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | ||||
| CONFIG_DEBUG_KERNEL=y | ||||
| # CONFIG_MAGIC_SYSRQ is not set | ||||
| CONFIG_LOG_BUF_SHIFT=16 | ||||
| CONFIG_DETECT_SOFTLOCKUP=y | ||||
| # CONFIG_SCHEDSTATS is not set | ||||
| # CONFIG_DEBUG_SLAB is not set | ||||
| # CONFIG_DEBUG_SPINLOCK is not set | ||||
|  | ||||
| @ -354,7 +354,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -219,7 +219,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -52,7 +52,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -34,7 +34,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -90,7 +90,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -174,7 +174,7 @@ static struct resource ixp2000_uart_resource = { | ||||
| 
 | ||||
| static struct platform_device ixp2000_serial_device = { | ||||
| 	.name		= "serial8250", | ||||
| 	.id		= 0, | ||||
| 	.id		= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev		= { | ||||
| 		.platform_data		= ixp2000_serial_port, | ||||
| 	}, | ||||
|  | ||||
| @ -66,7 +66,7 @@ static struct plat_serial8250_port coyote_uart_data[] = { | ||||
| 
 | ||||
| static struct platform_device coyote_uart = { | ||||
| 	.name		= "serial8250", | ||||
| 	.id		= 0, | ||||
| 	.id		= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= coyote_uart_data, | ||||
| 	}, | ||||
|  | ||||
| @ -93,7 +93,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device gtwx5715_uart_device = { | ||||
| 	.name		= "serial8250", | ||||
| 	.id		= 0, | ||||
| 	.id		= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= gtwx5715_uart_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -96,7 +96,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = { | ||||
| 
 | ||||
| static struct platform_device ixdp425_uart = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev.platform_data	= ixdp425_uart_data, | ||||
| 	.num_resources		= 2, | ||||
| 	.resource		= ixdp425_uart_resources | ||||
|  | ||||
| @ -47,6 +47,14 @@ config MACH_OMAP_OSK | ||||
| 	  TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here | ||||
|           if you have such a board. | ||||
| 
 | ||||
| config OMAP_OSK_MISTRAL | ||||
| 	bool "Mistral QVGA board Support" | ||||
| 	depends on MACH_OMAP_OSK | ||||
|     	help | ||||
| 	  The OSK supports an optional add-on board with a Quarter-VGA | ||||
| 	  touchscreen, PDA-ish buttons, a resume button, bicolor LED, | ||||
| 	  and camera connector.  Say Y here if you have this board. | ||||
| 
 | ||||
| config MACH_OMAP_PERSEUS2 | ||||
| 	bool "TI Perseus2" | ||||
| 	depends on ARCH_OMAP1 && ARCH_OMAP730 | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| #
 | ||||
| 
 | ||||
| # Common support
 | ||||
| obj-y := io.o id.o irq.o time.o serial.o | ||||
| obj-y := io.o id.o irq.o time.o serial.o devices.o | ||||
| led-y := leds.o | ||||
| 
 | ||||
| # Specific board support
 | ||||
| @ -23,6 +23,7 @@ endif | ||||
| 
 | ||||
| # LEDs support
 | ||||
| led-$(CONFIG_MACH_OMAP_H2)		+= leds-h2p2-debug.o | ||||
| led-$(CONFIG_MACH_OMAP_H3)		+= leds-h2p2-debug.o | ||||
| led-$(CONFIG_MACH_OMAP_INNOVATOR)	+= leds-innovator.o | ||||
| led-$(CONFIG_MACH_OMAP_PERSEUS2)	+= leds-h2p2-debug.o | ||||
| led-$(CONFIG_MACH_OMAP_OSK)		+= leds-osk.o | ||||
|  | ||||
| @ -48,19 +48,43 @@ static struct omap_usb_config generic1510_usb_config __initdata = { | ||||
| 
 | ||||
| #if defined(CONFIG_ARCH_OMAP16XX) | ||||
| static struct omap_usb_config generic1610_usb_config __initdata = { | ||||
| #ifdef CONFIG_USB_OTG | ||||
| 	.otg		= 1, | ||||
| #endif | ||||
| 	.register_host	= 1, | ||||
| 	.register_dev	= 1, | ||||
| 	.hmc_mode	= 16, | ||||
| 	.pins[0]	= 6, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_mmc_config generic_mmc_config __initdata = { | ||||
| 	.mmc [0] = { | ||||
| 		.enabled 	= 0, | ||||
| 		.wire4		= 0, | ||||
| 		.wp_pin		= -1, | ||||
| 		.power_pin	= -1, | ||||
| 		.switch_pin	= -1, | ||||
| 	}, | ||||
| 	.mmc [1] = { | ||||
| 		.enabled 	= 0, | ||||
| 		.wire4		= 0, | ||||
| 		.wp_pin		= -1, | ||||
| 		.power_pin	= -1, | ||||
| 		.switch_pin	= -1, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| static struct omap_board_config_kernel generic_config[] = { | ||||
| 	{ OMAP_TAG_USB,           NULL }, | ||||
| 	{ OMAP_TAG_MMC,           &generic_mmc_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap_generic_init(void) | ||||
| { | ||||
| 	const struct omap_uart_config *uart_conf; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Make sure the serial ports are muxed on at this point. | ||||
| 	 * You have to mux them off in device drivers later on | ||||
| @ -76,6 +100,18 @@ static void __init omap_generic_init(void) | ||||
| 		generic_config[0].data = &generic1610_usb_config; | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	uart_conf = omap_get_config(OMAP_TAG_UART, struct omap_uart_config); | ||||
| 	if (uart_conf != NULL) { | ||||
| 		unsigned int enabled_ports, i; | ||||
| 
 | ||||
| 		enabled_ports = uart_conf->enabled_uarts; | ||||
| 		for (i = 0; i < 3; i++) { | ||||
| 			if (!(enabled_ports & (1 << i))) | ||||
| 				generic_serial_ports[i] = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	omap_board_config = generic_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(generic_config); | ||||
| 	omap_serial_init(generic_serial_ports); | ||||
| @ -83,7 +119,7 @@ static void __init omap_generic_init(void) | ||||
| 
 | ||||
| static void __init omap_generic_map_io(void) | ||||
| { | ||||
| 	omap_map_common_io() | ||||
| 	omap_map_common_io(); | ||||
| } | ||||
| 
 | ||||
| MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") | ||||
|  | ||||
| @ -33,6 +33,7 @@ | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/usb.h> | ||||
| #include <asm/arch/common.h> | ||||
| @ -80,8 +81,7 @@ static struct flash_platform_data h2_flash_data = { | ||||
| }; | ||||
| 
 | ||||
| static struct resource h2_flash_resource = { | ||||
| 	.start		= OMAP_CS2B_PHYS, | ||||
| 	.end		= OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1, | ||||
| 	/* This is on CS3, wherever it's mapped */ | ||||
| 	.flags		= IORESOURCE_MEM, | ||||
| }; | ||||
| 
 | ||||
| @ -126,10 +126,9 @@ static void __init h2_init_smc91x(void) | ||||
| 		printk("Error requesting gpio 0 for smc91x irq\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	omap_set_gpio_edge_ctrl(0, OMAP_GPIO_FALLING_EDGE); | ||||
| } | ||||
| 
 | ||||
| void h2_init_irq(void) | ||||
| static void __init h2_init_irq(void) | ||||
| { | ||||
| 	omap_init_irq(); | ||||
| 	omap_gpio_init(); | ||||
| @ -152,9 +151,13 @@ static struct omap_usb_config h2_usb_config __initdata = { | ||||
| }; | ||||
| 
 | ||||
| static struct omap_mmc_config h2_mmc_config __initdata = { | ||||
| 	.mmc_blocks		= 1, | ||||
| 	.mmc1_power_pin		= -1,	/* tps65010 gpio3 */ | ||||
| 	.mmc1_switch_pin	= OMAP_MPUIO(1), | ||||
| 	.mmc [0] = { | ||||
| 		.enabled 	= 1, | ||||
| 		.wire4		= 1, | ||||
| 		.wp_pin		= OMAP_MPUIO(3), | ||||
| 		.power_pin	= -1,	/* tps65010 gpio3 */ | ||||
| 		.switch_pin	= OMAP_MPUIO(1), | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel h2_config[] = { | ||||
| @ -164,6 +167,16 @@ static struct omap_board_config_kernel h2_config[] = { | ||||
| 
 | ||||
| static void __init h2_init(void) | ||||
| { | ||||
| 	/* NOTE: revC boards support NAND-boot, which can put NOR on CS2B
 | ||||
| 	 * and NAND (either 16bit or 8bit) on CS3. | ||||
| 	 */ | ||||
| 	h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys(); | ||||
| 	h2_flash_resource.end += SZ_32M - 1; | ||||
| 
 | ||||
| 	/* MMC:  card detect and WP */ | ||||
| 	// omap_cfg_reg(U19_ARMIO1);		/* CD */
 | ||||
| 	omap_cfg_reg(BALLOUT_V8_ARMIO3);	/* WP */ | ||||
| 
 | ||||
| 	platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); | ||||
| 	omap_board_config = h2_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(h2_config); | ||||
|  | ||||
| @ -82,8 +82,7 @@ static struct flash_platform_data h3_flash_data = { | ||||
| }; | ||||
| 
 | ||||
| static struct resource h3_flash_resource = { | ||||
| 	.start		= OMAP_CS2B_PHYS, | ||||
| 	.end		= OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1, | ||||
| 	/* This is on CS3, wherever it's mapped */ | ||||
| 	.flags		= IORESOURCE_MEM, | ||||
| }; | ||||
| 
 | ||||
| @ -161,13 +160,26 @@ static struct omap_usb_config h3_usb_config __initdata = { | ||||
| 	.pins[1]	= 3, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_mmc_config h3_mmc_config __initdata = { | ||||
| 	.mmc[0] = { | ||||
| 		.enabled 	= 1, | ||||
| 		.power_pin	= -1,   /* tps65010 GPIO4 */ | ||||
| 		.switch_pin	= OMAP_MPUIO(1), | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel h3_config[] = { | ||||
| 	{ OMAP_TAG_USB,	 &h3_usb_config }, | ||||
| 	{ OMAP_TAG_MMC,  &h3_mmc_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init h3_init(void) | ||||
| { | ||||
| 	h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys(); | ||||
| 	h3_flash_resource.end += OMAP_CS3_SIZE - 1; | ||||
| 	(void) platform_add_devices(devices, ARRAY_SIZE(devices)); | ||||
| 	omap_board_config = h3_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(h3_config); | ||||
| } | ||||
| 
 | ||||
| static void __init h3_init_smc91x(void) | ||||
| @ -177,7 +189,6 @@ static void __init h3_init_smc91x(void) | ||||
| 		printk("Error requesting gpio 40 for smc91x irq\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	omap_set_gpio_edge_ctrl(40, OMAP_GPIO_FALLING_EDGE); | ||||
| } | ||||
| 
 | ||||
| void h3_init_irq(void) | ||||
|  | ||||
| @ -29,6 +29,7 @@ | ||||
| #include <asm/mach/flash.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/fpga.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/tc.h> | ||||
| @ -173,7 +174,6 @@ static void __init innovator_init_smc91x(void) | ||||
| 			printk("Error requesting gpio 0 for smc91x irq\n"); | ||||
| 			return; | ||||
| 		} | ||||
| 		omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -220,8 +220,19 @@ static struct omap_usb_config h2_usb_config __initdata = { | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| static struct omap_mmc_config innovator_mmc_config __initdata = { | ||||
| 	.mmc [0] = { | ||||
| 		.enabled 	= 1, | ||||
| 		.wire4		= 1, | ||||
| 		.wp_pin		= OMAP_MPUIO(3), | ||||
| 		.power_pin	= -1,	/* FPGA F3 UIO42 */ | ||||
| 		.switch_pin	= -1,	/* FPGA F4 UIO43 */ | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel innovator_config[] = { | ||||
| 	{ OMAP_TAG_USB,         NULL }, | ||||
| 	{ OMAP_TAG_MMC,		&innovator_mmc_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init innovator_init(void) | ||||
|  | ||||
| @ -75,16 +75,15 @@ static void __init netstar_init(void) | ||||
| 	mdelay(50);	/* 50ms until PHY ready */ | ||||
| 	/* smc91x interrupt pin */ | ||||
| 	omap_request_gpio(8); | ||||
| 	omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE); | ||||
| 
 | ||||
| 	omap_request_gpio(12); | ||||
| 	omap_request_gpio(13); | ||||
| 	omap_request_gpio(14); | ||||
| 	omap_request_gpio(15); | ||||
| 	omap_set_gpio_edge_ctrl(12, OMAP_GPIO_FALLING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(13, OMAP_GPIO_FALLING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(15, OMAP_GPIO_FALLING_EDGE); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING); | ||||
| 
 | ||||
| 	platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices)); | ||||
| 
 | ||||
|  | ||||
| @ -29,11 +29,16 @@ | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/device.h> | ||||
| #include <linux/interrupt.h> | ||||
| 
 | ||||
| #include <linux/mtd/mtd.h> | ||||
| #include <linux/mtd/partitions.h> | ||||
| 
 | ||||
| #include <asm/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/usb.h> | ||||
| @ -41,12 +46,56 @@ | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/common.h> | ||||
| 
 | ||||
| static struct map_desc osk5912_io_desc[] __initdata = { | ||||
| { OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE, | ||||
| 	MT_DEVICE }, | ||||
| static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0}; | ||||
| 
 | ||||
| static struct mtd_partition osk_partitions[] = { | ||||
| 	/* bootloader (U-Boot, etc) in first sector */ | ||||
| 	{ | ||||
| 	      .name		= "bootloader", | ||||
| 	      .offset		= 0, | ||||
| 	      .size		= SZ_128K, | ||||
| 	      .mask_flags	= MTD_WRITEABLE, /* force read-only */ | ||||
| 	}, | ||||
| 	/* bootloader params in the next sector */ | ||||
| 	{ | ||||
| 	      .name		= "params", | ||||
| 	      .offset		= MTDPART_OFS_APPEND, | ||||
| 	      .size		= SZ_128K, | ||||
| 	      .mask_flags	= 0, | ||||
| 	}, { | ||||
| 	      .name		= "kernel", | ||||
| 	      .offset		= MTDPART_OFS_APPEND, | ||||
| 	      .size		= SZ_2M, | ||||
| 	      .mask_flags	= 0 | ||||
| 	}, { | ||||
| 	      .name		= "filesystem", | ||||
| 	      .offset		= MTDPART_OFS_APPEND, | ||||
| 	      .size		= MTDPART_SIZ_FULL, | ||||
| 	      .mask_flags	= 0 | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0}; | ||||
| static struct flash_platform_data osk_flash_data = { | ||||
| 	.map_name	= "cfi_probe", | ||||
| 	.width		= 2, | ||||
| 	.parts		= osk_partitions, | ||||
| 	.nr_parts	= ARRAY_SIZE(osk_partitions), | ||||
| }; | ||||
| 
 | ||||
| static struct resource osk_flash_resource = { | ||||
| 	/* this is on CS3, wherever it's mapped */ | ||||
| 	.flags		= IORESOURCE_MEM, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device osk5912_flash_device = { | ||||
| 	.name		= "omapflash", | ||||
| 	.id		= 0, | ||||
| 	.dev		= { | ||||
| 		.platform_data	= &osk_flash_data, | ||||
| 	}, | ||||
| 	.num_resources	= 1, | ||||
| 	.resource	= &osk_flash_resource, | ||||
| }; | ||||
| 
 | ||||
| static struct resource osk5912_smc91x_resources[] = { | ||||
| 	[0] = { | ||||
| @ -86,9 +135,16 @@ static struct platform_device osk5912_cf_device = { | ||||
| 	.resource	= osk5912_cf_resources, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device osk5912_mcbsp1_device = { | ||||
| 	.name		= "omap_mcbsp", | ||||
| 	.id		= 1, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *osk5912_devices[] __initdata = { | ||||
| 	&osk5912_flash_device, | ||||
| 	&osk5912_smc91x_device, | ||||
| 	&osk5912_cf_device, | ||||
| 	&osk5912_mcbsp1_device, | ||||
| }; | ||||
| 
 | ||||
| static void __init osk_init_smc91x(void) | ||||
| @ -97,7 +153,6 @@ static void __init osk_init_smc91x(void) | ||||
| 		printk("Error requesting gpio 0 for smc91x irq\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE); | ||||
| 
 | ||||
| 	/* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */ | ||||
| 	EMIFS_CCS(1) |= 0x2; | ||||
| @ -110,11 +165,11 @@ static void __init osk_init_cf(void) | ||||
| 		printk("Error requesting gpio 62 for CF irq\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	/* it's really active-low */ | ||||
| 	omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE); | ||||
| 	/* the CF I/O IRQ is really active-low */ | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(62), IRQT_FALLING); | ||||
| } | ||||
| 
 | ||||
| void osk_init_irq(void) | ||||
| static void __init osk_init_irq(void) | ||||
| { | ||||
| 	omap_init_irq(); | ||||
| 	omap_gpio_init(); | ||||
| @ -142,18 +197,69 @@ static struct omap_board_config_kernel osk_config[] = { | ||||
| 	{ OMAP_TAG_USB,           &osk_usb_config }, | ||||
| }; | ||||
| 
 | ||||
| #ifdef	CONFIG_OMAP_OSK_MISTRAL | ||||
| 
 | ||||
| #ifdef	CONFIG_PM | ||||
| static irqreturn_t | ||||
| osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs) | ||||
| { | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static void __init osk_mistral_init(void) | ||||
| { | ||||
| 	/* FIXME here's where to feed in framebuffer, touchpad, and
 | ||||
| 	 * keyboard setup ...  not in the drivers for those devices! | ||||
| 	 * | ||||
| 	 * NOTE:  we could actually tell if there's a Mistral board | ||||
| 	 * attached, e.g. by trying to read something from the ads7846. | ||||
| 	 * But this is too early for that... | ||||
| 	 */ | ||||
| 
 | ||||
| 	/* the sideways button (SW1) is for use as a "wakeup" button */ | ||||
| 	omap_cfg_reg(N15_1610_MPUIO2); | ||||
| 	if (omap_request_gpio(OMAP_MPUIO(2)) == 0) { | ||||
| 		int ret = 0; | ||||
| 		omap_set_gpio_direction(OMAP_MPUIO(2), 1); | ||||
| 		set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING); | ||||
| #ifdef	CONFIG_PM | ||||
| 		/* share the IRQ in case someone wants to use the
 | ||||
| 		 * button for more than wakeup from system sleep. | ||||
| 		 */ | ||||
| 		ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), | ||||
| 				&osk_mistral_wake_interrupt, | ||||
| 				SA_SHIRQ, "mistral_wakeup", | ||||
| 				&osk_mistral_wake_interrupt); | ||||
| 		if (ret != 0) { | ||||
| 			omap_free_gpio(OMAP_MPUIO(2)); | ||||
| 			printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n", | ||||
| 				ret); | ||||
| 		} else | ||||
| 			enable_irq_wake(OMAP_GPIO_IRQ(OMAP_MPUIO(2))); | ||||
| #endif | ||||
| 	} else | ||||
| 		printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n"); | ||||
| } | ||||
| #else | ||||
| static void __init osk_mistral_init(void) { } | ||||
| #endif | ||||
| 
 | ||||
| static void __init osk_init(void) | ||||
| { | ||||
| 	osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys(); | ||||
| 	osk_flash_resource.end += SZ_32M - 1; | ||||
| 	platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); | ||||
| 	omap_board_config = osk_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(osk_config); | ||||
| 	USB_TRANSCEIVER_CTRL_REG |= (3 << 1); | ||||
| 
 | ||||
| 	osk_mistral_init(); | ||||
| } | ||||
| 
 | ||||
| static void __init osk_map_io(void) | ||||
| { | ||||
| 	omap_map_common_io(); | ||||
| 	iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc)); | ||||
| 	omap_serial_init(osk_serial_ports); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -24,6 +24,7 @@ | ||||
| #include <asm/mach/flash.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/fpga.h> | ||||
| @ -83,8 +84,8 @@ static struct flash_platform_data p2_flash_data = { | ||||
| }; | ||||
| 
 | ||||
| static struct resource p2_flash_resource = { | ||||
| 	.start		= OMAP_FLASH_0_START, | ||||
| 	.end		= OMAP_FLASH_0_START + OMAP_FLASH_0_SIZE - 1, | ||||
| 	.start		= OMAP_CS0_PHYS, | ||||
| 	.end		= OMAP_CS0_PHYS + SZ_32M - 1, | ||||
| 	.flags		= IORESOURCE_MEM, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -25,13 +25,14 @@ | ||||
| #include <asm/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/usb.h> | ||||
| #include <asm/arch/common.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/usb.h> | ||||
| 
 | ||||
| extern void omap_init_time(void); | ||||
| extern int omap_gpio_init(void); | ||||
| @ -74,7 +75,7 @@ static struct plat_serial8250_port voiceblue_ports[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 1, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM1, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= voiceblue_ports, | ||||
| 	}, | ||||
| @ -86,6 +87,27 @@ static int __init ext_uart_init(void) | ||||
| } | ||||
| arch_initcall(ext_uart_init); | ||||
| 
 | ||||
| static struct flash_platform_data voiceblue_flash_data = { | ||||
| 	.map_name	= "cfi_probe", | ||||
| 	.width		= 2, | ||||
| }; | ||||
| 
 | ||||
| static struct resource voiceblue_flash_resource = { | ||||
| 	.start	= OMAP_CS0_PHYS, | ||||
| 	.end	= OMAP_CS0_PHYS + SZ_32M - 1, | ||||
| 	.flags	= IORESOURCE_MEM, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device voiceblue_flash_device = { | ||||
| 	.name		= "omapflash", | ||||
| 	.id		= 0, | ||||
| 	.dev		= { | ||||
| 		.platform_data	= &voiceblue_flash_data, | ||||
| 	}, | ||||
| 	.num_resources	= 1, | ||||
| 	.resource	= &voiceblue_flash_resource, | ||||
| }; | ||||
| 
 | ||||
| static struct resource voiceblue_smc91x_resources[] = { | ||||
| 	[0] = { | ||||
| 		.start	= OMAP_CS2_PHYS + 0x300, | ||||
| @ -107,6 +129,7 @@ static struct platform_device voiceblue_smc91x_device = { | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *voiceblue_devices[] __initdata = { | ||||
| 	&voiceblue_flash_device, | ||||
| 	&voiceblue_smc91x_device, | ||||
| }; | ||||
| 
 | ||||
| @ -119,8 +142,17 @@ static struct omap_usb_config voiceblue_usb_config __initdata = { | ||||
| 	.pins[2]	= 6, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_mmc_config voiceblue_mmc_config __initdata = { | ||||
| 	.mmc[0] = { | ||||
| 		.enabled	= 1, | ||||
| 		.power_pin	= 2, | ||||
| 		.switch_pin	= -1, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel voiceblue_config[] = { | ||||
| 	{ OMAP_TAG_USB, &voiceblue_usb_config }, | ||||
| 	{ OMAP_TAG_MMC, &voiceblue_mmc_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init voiceblue_init_irq(void) | ||||
| @ -131,9 +163,6 @@ static void __init voiceblue_init_irq(void) | ||||
| 
 | ||||
| static void __init voiceblue_init(void) | ||||
| { | ||||
| 	/* There is a good chance board is going up, so enable Power LED
 | ||||
| 	 * (it is connected through invertor) */ | ||||
| 	omap_writeb(0x00, OMAP_LPG1_LCR); | ||||
| 	/* Watchdog */ | ||||
| 	omap_request_gpio(0); | ||||
| 	/* smc91x reset */ | ||||
| @ -145,7 +174,6 @@ static void __init voiceblue_init(void) | ||||
| 	mdelay(50);	/* 50ms until PHY ready */ | ||||
| 	/* smc91x interrupt pin */ | ||||
| 	omap_request_gpio(8); | ||||
| 	omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE); | ||||
| 	/* 16C554 reset*/ | ||||
| 	omap_request_gpio(6); | ||||
| 	omap_set_gpio_direction(6, 0); | ||||
| @ -155,14 +183,19 @@ static void __init voiceblue_init(void) | ||||
| 	omap_request_gpio(13); | ||||
| 	omap_request_gpio(14); | ||||
| 	omap_request_gpio(15); | ||||
| 	omap_set_gpio_edge_ctrl(12, OMAP_GPIO_RISING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(14, OMAP_GPIO_RISING_EDGE); | ||||
| 	omap_set_gpio_edge_ctrl(15, OMAP_GPIO_RISING_EDGE); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(12), IRQT_RISING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(14), IRQT_RISING); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(15), IRQT_RISING); | ||||
| 
 | ||||
| 	platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices)); | ||||
| 	omap_board_config = voiceblue_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(voiceblue_config); | ||||
| 
 | ||||
| 	/* There is a good chance board is going up, so enable power LED
 | ||||
| 	 * (it is connected through invertor) */ | ||||
| 	omap_writeb(0x00, OMAP_LPG1_LCR); | ||||
| 	omap_writeb(0x00, OMAP_LPG1_PMR);	/* Disable clock */ | ||||
| } | ||||
| 
 | ||||
| static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1}; | ||||
| @ -184,9 +217,9 @@ static int panic_event(struct notifier_block *this, unsigned long event, | ||||
| 	if (test_and_set_bit(MACHINE_PANICED, &machine_state)) | ||||
| 		return NOTIFY_DONE; | ||||
| 
 | ||||
| 	/* Flash Power LED
 | ||||
| 	 * (TODO: Enable clock right way (enabled in bootloader already)) */ | ||||
| 	/* Flash power LED */ | ||||
| 	omap_writeb(0x78, OMAP_LPG1_LCR); | ||||
| 	omap_writeb(0x01, OMAP_LPG1_PMR);	/* Enable clock */ | ||||
| 
 | ||||
| 	return NOTIFY_DONE; | ||||
| } | ||||
| @ -195,15 +228,14 @@ static struct notifier_block panic_block = { | ||||
| 	.notifier_call	= panic_event, | ||||
| }; | ||||
| 
 | ||||
| static int __init setup_notifier(void) | ||||
| static int __init voiceblue_setup(void) | ||||
| { | ||||
| 	/* Setup panic notifier */ | ||||
| 	notifier_chain_register(&panic_notifier_list, &panic_block); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| postcore_initcall(setup_notifier); | ||||
| postcore_initcall(voiceblue_setup); | ||||
| 
 | ||||
| static int wdt_gpio_state; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										351
									
								
								arch/arm/mach-omap1/devices.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										351
									
								
								arch/arm/mach-omap1/devices.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,351 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap1/devices.c | ||||
|  * | ||||
|  * OMAP1 platform device setup/initialization | ||||
|  * | ||||
|  * 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, or | ||||
|  * (at your option) any later version. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/device.h> | ||||
| 
 | ||||
| #include <asm/hardware.h> | ||||
| #include <asm/io.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <asm/arch/tc.h> | ||||
| #include <asm/arch/board.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| 
 | ||||
| 
 | ||||
| static void omap_nop_release(struct device *dev) | ||||
| { | ||||
|         /* Nothing */ | ||||
| } | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||||
| 
 | ||||
| #define	OMAP_I2C_BASE		0xfffb3800 | ||||
| 
 | ||||
| static struct resource i2c_resources[] = { | ||||
| 	{ | ||||
| 		.start		= OMAP_I2C_BASE, | ||||
| 		.end		= OMAP_I2C_BASE + 0x3f, | ||||
| 		.flags		= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start		= INT_I2C, | ||||
| 		.flags		= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* DMA not used; works around erratum writing to non-empty i2c fifo */ | ||||
| 
 | ||||
| static struct platform_device omap_i2c_device = { | ||||
|         .name           = "i2c_omap", | ||||
|         .id             = -1, | ||||
|         .dev = { | ||||
|                 .release        = omap_nop_release, | ||||
|         }, | ||||
| 	.num_resources	= ARRAY_SIZE(i2c_resources), | ||||
| 	.resource	= i2c_resources, | ||||
| }; | ||||
| 
 | ||||
| static void omap_init_i2c(void) | ||||
| { | ||||
| 	/* FIXME define and use a boot tag, in case of boards that
 | ||||
| 	 * either don't wire up I2C, or chips that mux it differently... | ||||
| 	 * it can include clocking and address info, maybe more. | ||||
| 	 */ | ||||
| 	omap_cfg_reg(I2C_SCL); | ||||
| 	omap_cfg_reg(I2C_SDA); | ||||
| 
 | ||||
| 	(void) platform_device_register(&omap_i2c_device); | ||||
| } | ||||
| #else | ||||
| static inline void omap_init_i2c(void) {} | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE) | ||||
| 
 | ||||
| static u64 irda_dmamask = 0xffffffff; | ||||
| 
 | ||||
| static struct platform_device omap1610ir_device = { | ||||
| 	.name = "omap1610-ir", | ||||
| 	.id = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &irda_dmamask, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static void omap_init_irda(void) | ||||
| { | ||||
| 	/* FIXME define and use a boot tag, members something like:
 | ||||
| 	 *  u8		uart;		// uart1, or uart3
 | ||||
| 	 * ... but driver only handles uart3 for now | ||||
| 	 *  s16		fir_sel;	// gpio for SIR vs FIR
 | ||||
| 	 * ... may prefer a callback for SIR/MIR/FIR mode select; | ||||
| 	 * while h2 uses a GPIO, H3 uses a gpio expander | ||||
| 	 */ | ||||
| 	if (machine_is_omap_h2() | ||||
| 			|| machine_is_omap_h3()) | ||||
| 		(void) platform_device_register(&omap1610ir_device); | ||||
| } | ||||
| #else | ||||
| static inline void omap_init_irda(void) {} | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | ||||
| 
 | ||||
| #define	OMAP_MMC1_BASE		0xfffb7800 | ||||
| #define	OMAP_MMC2_BASE		0xfffb7c00	/* omap16xx only */ | ||||
| 
 | ||||
| static struct omap_mmc_conf mmc1_conf; | ||||
| 
 | ||||
| static u64 mmc1_dmamask = 0xffffffff; | ||||
| 
 | ||||
| static struct resource mmc1_resources[] = { | ||||
| 	{ | ||||
| 		.start		= IO_ADDRESS(OMAP_MMC1_BASE), | ||||
| 		.end		= IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f, | ||||
| 		.flags		= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start		= INT_MMC, | ||||
| 		.flags		= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device mmc_omap_device1 = { | ||||
| 	.name		= "mmci-omap", | ||||
| 	.id		= 1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &mmc1_dmamask, | ||||
| 		.platform_data	= &mmc1_conf, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(mmc1_resources), | ||||
| 	.resource	= mmc1_resources, | ||||
| }; | ||||
| 
 | ||||
| #ifdef	CONFIG_ARCH_OMAP16XX | ||||
| 
 | ||||
| static struct omap_mmc_conf mmc2_conf; | ||||
| 
 | ||||
| static u64 mmc2_dmamask = 0xffffffff; | ||||
| 
 | ||||
| static struct resource mmc2_resources[] = { | ||||
| 	{ | ||||
| 		.start		= IO_ADDRESS(OMAP_MMC2_BASE), | ||||
| 		.end		= IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f, | ||||
| 		.flags		= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start		= INT_1610_MMC2, | ||||
| 		.flags		= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device mmc_omap_device2 = { | ||||
| 	.name		= "mmci-omap", | ||||
| 	.id		= 2, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &mmc2_dmamask, | ||||
| 		.platform_data	= &mmc2_conf, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(mmc2_resources), | ||||
| 	.resource	= mmc2_resources, | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| static void __init omap_init_mmc(void) | ||||
| { | ||||
| 	const struct omap_mmc_config	*mmc_conf; | ||||
| 	const struct omap_mmc_conf	*mmc; | ||||
| 
 | ||||
| 	/* NOTE:  assumes MMC was never (wrongly) enabled */ | ||||
| 	mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config); | ||||
| 	if (!mmc_conf) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* block 1 is always available and has just one pinout option */ | ||||
| 	mmc = &mmc_conf->mmc[0]; | ||||
| 	if (mmc->enabled) { | ||||
| 		omap_cfg_reg(MMC_CMD); | ||||
| 		omap_cfg_reg(MMC_CLK); | ||||
| 		omap_cfg_reg(MMC_DAT0); | ||||
| 		if (cpu_is_omap1710()) { | ||||
| 	              omap_cfg_reg(M15_1710_MMC_CLKI); | ||||
| 	              omap_cfg_reg(P19_1710_MMC_CMDDIR); | ||||
| 	              omap_cfg_reg(P20_1710_MMC_DATDIR0); | ||||
| 	        } | ||||
| 		if (mmc->wire4) { | ||||
| 			omap_cfg_reg(MMC_DAT1); | ||||
| 			/* NOTE:  DAT2 can be on W10 (here) or M15 */ | ||||
| 			if (!mmc->nomux) | ||||
| 				omap_cfg_reg(MMC_DAT2); | ||||
| 			omap_cfg_reg(MMC_DAT3); | ||||
| 		} | ||||
| 		mmc1_conf = *mmc; | ||||
| 		(void) platform_device_register(&mmc_omap_device1); | ||||
| 	} | ||||
| 
 | ||||
| #ifdef	CONFIG_ARCH_OMAP16XX | ||||
| 	/* block 2 is on newer chips, and has many pinout options */ | ||||
| 	mmc = &mmc_conf->mmc[1]; | ||||
| 	if (mmc->enabled) { | ||||
| 		if (!mmc->nomux) { | ||||
| 			omap_cfg_reg(Y8_1610_MMC2_CMD); | ||||
| 			omap_cfg_reg(Y10_1610_MMC2_CLK); | ||||
| 			omap_cfg_reg(R18_1610_MMC2_CLKIN); | ||||
| 			omap_cfg_reg(W8_1610_MMC2_DAT0); | ||||
| 			if (mmc->wire4) { | ||||
| 				omap_cfg_reg(V8_1610_MMC2_DAT1); | ||||
| 				omap_cfg_reg(W15_1610_MMC2_DAT2); | ||||
| 				omap_cfg_reg(R10_1610_MMC2_DAT3); | ||||
| 			} | ||||
| 
 | ||||
| 			/* These are needed for the level shifter */ | ||||
| 			omap_cfg_reg(V9_1610_MMC2_CMDDIR); | ||||
| 			omap_cfg_reg(V5_1610_MMC2_DATDIR0); | ||||
| 			omap_cfg_reg(W19_1610_MMC2_DATDIR1); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Feedback clock must be set on OMAP-1710 MMC2 */ | ||||
| 		if (cpu_is_omap1710()) | ||||
| 			omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), | ||||
| 				     MOD_CONF_CTRL_1); | ||||
| 		mmc2_conf = *mmc; | ||||
| 		(void) platform_device_register(&mmc_omap_device2); | ||||
| 	} | ||||
| #endif | ||||
| 	return; | ||||
| } | ||||
| #else | ||||
| static inline void omap_init_mmc(void) {} | ||||
| #endif | ||||
| 
 | ||||
| #if	defined(CONFIG_OMAP_RTC) || defined(CONFIG_OMAP_RTC) | ||||
| 
 | ||||
| #define	OMAP_RTC_BASE		0xfffb4800 | ||||
| 
 | ||||
| static struct resource rtc_resources[] = { | ||||
| 	{ | ||||
| 		.start		= OMAP_RTC_BASE, | ||||
| 		.end		= OMAP_RTC_BASE + 0x5f, | ||||
| 		.flags		= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start		= INT_RTC_TIMER, | ||||
| 		.flags		= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start		= INT_RTC_ALARM, | ||||
| 		.flags		= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device omap_rtc_device = { | ||||
| 	.name           = "omap_rtc", | ||||
| 	.id             = -1, | ||||
| 	.dev = { | ||||
| 		.release        = omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(rtc_resources), | ||||
| 	.resource	= rtc_resources, | ||||
| }; | ||||
| 
 | ||||
| static void omap_init_rtc(void) | ||||
| { | ||||
| 	(void) platform_device_register(&omap_rtc_device); | ||||
| } | ||||
| #else | ||||
| static inline void omap_init_rtc(void) {} | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	defined(CONFIG_OMAP16XX_WATCHDOG) || defined(CONFIG_OMAP16XX_WATCHDOG_MODULE) | ||||
| 
 | ||||
| #define	OMAP_WDT_BASE		0xfffeb000 | ||||
| 
 | ||||
| static struct resource wdt_resources[] = { | ||||
| 	{ | ||||
| 		.start		= OMAP_WDT_BASE, | ||||
| 		.end		= OMAP_WDT_BASE + 0x4f, | ||||
| 		.flags		= IORESOURCE_MEM, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device omap_wdt_device = { | ||||
| 	.name	   = "omap1610_wdt", | ||||
| 	.id	     = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(wdt_resources), | ||||
| 	.resource	= wdt_resources, | ||||
| }; | ||||
| 
 | ||||
| static void omap_init_wdt(void) | ||||
| { | ||||
| 	(void) platform_device_register(&omap_wdt_device); | ||||
| } | ||||
| #else | ||||
| static inline void omap_init_wdt(void) {} | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /*
 | ||||
|  * This gets called after board-specific INIT_MACHINE, and initializes most | ||||
|  * on-chip peripherals accessible on this board (except for few like USB): | ||||
|  * | ||||
|  *  (a) Does any "standard config" pin muxing needed.  Board-specific | ||||
|  *	code will have muxed GPIO pins and done "nonstandard" setup; | ||||
|  *	that code could live in the boot loader. | ||||
|  *  (b) Populating board-specific platform_data with the data drivers | ||||
|  *	rely on to handle wiring variations. | ||||
|  *  (c) Creating platform devices as meaningful on this board and | ||||
|  *	with this kernel configuration. | ||||
|  * | ||||
|  * Claiming GPIOs, and setting their direction and initial values, is the | ||||
|  * responsibility of the device drivers.  So is responding to probe(). | ||||
|  * | ||||
|  * Board-specific knowlege like creating devices or pin setup is to be | ||||
|  * kept out of drivers as much as possible.  In particular, pin setup | ||||
|  * may be handled by the boot loader, and drivers should expect it will | ||||
|  * normally have been done by the time they're probed. | ||||
|  */ | ||||
| static int __init omap_init_devices(void) | ||||
| { | ||||
| 	/* please keep these calls, and their implementations above,
 | ||||
| 	 * in alphabetical order so they're easier to sort through. | ||||
| 	 */ | ||||
| 	omap_init_i2c(); | ||||
| 	omap_init_irda(); | ||||
| 	omap_init_mmc(); | ||||
| 	omap_init_rtc(); | ||||
| 	omap_init_wdt(); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| arch_initcall(omap_init_devices); | ||||
| 
 | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/fpga.c | ||||
|  * linux/arch/arm/mach-omap1/fpga.c | ||||
|  * | ||||
|  * Interrupt handler for OMAP-1510 Innovator FPGA | ||||
|  * | ||||
| @ -181,7 +181,7 @@ void omap1510_fpga_init_irq(void) | ||||
| 	 */ | ||||
| 	omap_request_gpio(13); | ||||
| 	omap_set_gpio_direction(13, 1); | ||||
| 	omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING); | ||||
| 	set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -19,6 +19,7 @@ | ||||
| 
 | ||||
| extern int clk_init(void); | ||||
| extern void omap_check_revision(void); | ||||
| extern void omap_sram_init(void); | ||||
| 
 | ||||
| /*
 | ||||
|  * The machine specific code may provide the extra mapping besides the | ||||
| @ -32,7 +33,6 @@ static struct map_desc omap_io_desc[] __initdata = { | ||||
| static struct map_desc omap730_io_desc[] __initdata = { | ||||
|  { OMAP730_DSP_BASE,    OMAP730_DSP_START,    OMAP730_DSP_SIZE,    MT_DEVICE }, | ||||
|  { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE }, | ||||
|  { OMAP730_SRAM_BASE,   OMAP730_SRAM_START,   OMAP730_SRAM_SIZE,   MT_DEVICE } | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| @ -40,27 +40,13 @@ static struct map_desc omap730_io_desc[] __initdata = { | ||||
| static struct map_desc omap1510_io_desc[] __initdata = { | ||||
|  { OMAP1510_DSP_BASE,    OMAP1510_DSP_START,    OMAP1510_DSP_SIZE,    MT_DEVICE }, | ||||
|  { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE }, | ||||
|  { OMAP1510_SRAM_BASE,   OMAP1510_SRAM_START,   OMAP1510_SRAM_SIZE,   MT_DEVICE } | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #if defined(CONFIG_ARCH_OMAP16XX) | ||||
| static struct map_desc omap1610_io_desc[] __initdata = { | ||||
| static struct map_desc omap16xx_io_desc[] __initdata = { | ||||
|  { OMAP16XX_DSP_BASE,    OMAP16XX_DSP_START,    OMAP16XX_DSP_SIZE,    MT_DEVICE }, | ||||
|  { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, | ||||
|  { OMAP16XX_SRAM_BASE,   OMAP16XX_SRAM_START,   OMAP1610_SRAM_SIZE,   MT_DEVICE } | ||||
| }; | ||||
| 
 | ||||
| static struct map_desc omap5912_io_desc[] __initdata = { | ||||
|  { OMAP16XX_DSP_BASE,    OMAP16XX_DSP_START,    OMAP16XX_DSP_SIZE,    MT_DEVICE }, | ||||
|  { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, | ||||
| /*
 | ||||
|  * The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page | ||||
|  * size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped. | ||||
|  * Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte | ||||
|  * can be used. | ||||
|  */ | ||||
|  { OMAP16XX_SRAM_BASE,   OMAP16XX_SRAM_START,   OMAP5912_SRAM_SIZE + 0x800,   MT_DEVICE } | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| @ -86,14 +72,13 @@ static void __init _omap_map_io(void) | ||||
| 	} | ||||
| #endif | ||||
| #if defined(CONFIG_ARCH_OMAP16XX) | ||||
| 	if (cpu_is_omap1610() || cpu_is_omap1710()) { | ||||
| 		iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc)); | ||||
| 	} | ||||
| 	if (cpu_is_omap5912()) { | ||||
| 		iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc)); | ||||
| 	if (cpu_is_omap16xx()) { | ||||
| 		iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc)); | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	omap_sram_init(); | ||||
| 
 | ||||
| 	/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
 | ||||
| 	 * on a Posted Write in the TIPB Bridge". | ||||
| 	 */ | ||||
| @ -108,8 +93,9 @@ static void __init _omap_map_io(void) | ||||
| /*
 | ||||
|  * This should only get called from board specific init | ||||
|  */ | ||||
| void omap_map_common_io(void) | ||||
| void __init omap_map_common_io(void) | ||||
| { | ||||
| 	if (!initialized) | ||||
| 		_omap_map_io(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/irq.c | ||||
|  * linux/arch/arm/mach-omap1/irq.c | ||||
|  * | ||||
|  * Interrupt handler for all OMAP boards | ||||
|  * | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/leds-h2p2-debug.c | ||||
|  * linux/arch/arm/mach-omap1/leds-h2p2-debug.c | ||||
|  * | ||||
|  * Copyright 2003 by Texas Instruments Incorporated | ||||
|  * | ||||
| @ -13,6 +13,7 @@ | ||||
| #include <linux/init.h> | ||||
| #include <linux/kernel_stat.h> | ||||
| #include <linux/sched.h> | ||||
| #include <linux/version.h> | ||||
| 
 | ||||
| #include <asm/io.h> | ||||
| #include <asm/hardware.h> | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/leds-innovator.c | ||||
|  * linux/arch/arm/mach-omap1/leds-innovator.c | ||||
|  */ | ||||
| #include <linux/config.h> | ||||
| #include <linux/init.h> | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/leds-osk.c | ||||
|  * linux/arch/arm/mach-omap1/leds-osk.c | ||||
|  * | ||||
|  * LED driver for OSK, and optionally Mistral QVGA, boards | ||||
|  */ | ||||
| @ -64,7 +64,7 @@ static void tps_work(void *unused) | ||||
| 
 | ||||
| static DECLARE_WORK(work, tps_work, NULL); | ||||
| 
 | ||||
| #ifdef	CONFIG_FB_OMAP | ||||
| #ifdef	CONFIG_OMAP_OSK_MISTRAL | ||||
| 
 | ||||
| /* For now, all system indicators require the Mistral board, since that
 | ||||
|  * LED can be manipulated without a task context.  This LED is either red, | ||||
| @ -127,7 +127,7 @@ void osk_leds_event(led_event_t evt) | ||||
| 		hw_led_state = 0; | ||||
| 		break; | ||||
| 
 | ||||
| #ifdef	CONFIG_FB_OMAP | ||||
| #ifdef	CONFIG_OMAP_OSK_MISTRAL | ||||
| 
 | ||||
| 	case led_timer: | ||||
| 		hw_led_state ^= TIMER_LED; | ||||
| @ -144,7 +144,7 @@ void osk_leds_event(led_event_t evt) | ||||
| 		mistral_setled(); | ||||
| 		break; | ||||
| 
 | ||||
| #endif	/* CONFIG_FB_OMAP */ | ||||
| #endif	/* CONFIG_OMAP_OSK_MISTRAL */ | ||||
| 
 | ||||
| 	/* "green" == tps LED1 (leftmost, normally power-good)
 | ||||
| 	 * works only with DC adapter, not on battery power! | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  * linux/arch/arm/mach-omap/leds.c | ||||
|  * linux/arch/arm/mach-omap1/leds.c | ||||
|  * | ||||
|  * OMAP LEDs dispatcher | ||||
|  */ | ||||
| @ -20,7 +20,9 @@ omap_leds_init(void) | ||||
| 	if (machine_is_omap_innovator()) | ||||
| 		leds_event = innovator_leds_event; | ||||
| 
 | ||||
| 	else if (machine_is_omap_h2() || machine_is_omap_perseus2()) | ||||
| 	else if (machine_is_omap_h2() | ||||
| 			|| machine_is_omap_h3() | ||||
| 			|| machine_is_omap_perseus2()) | ||||
| 		leds_event = h2p2_dbg_leds_event; | ||||
| 
 | ||||
| 	else if (machine_is_omap_osk()) | ||||
| @ -30,8 +32,12 @@ omap_leds_init(void) | ||||
| 		return -1; | ||||
| 
 | ||||
| 	if (machine_is_omap_h2() | ||||
| 			|| machine_is_omap_h3() | ||||
| 			|| machine_is_omap_perseus2() | ||||
| 			|| machine_is_omap_osk()) { | ||||
| #ifdef	CONFIG_OMAP_OSK_MISTRAL | ||||
| 			|| machine_is_omap_osk() | ||||
| #endif | ||||
| 			) { | ||||
| 
 | ||||
| 		/* LED1/LED2 pins can be used as GPIO (as done here), or by
 | ||||
| 		 * the LPG (works even in deep sleep!), to drive a bicolor | ||||
|  | ||||
| @ -24,7 +24,11 @@ | ||||
| 
 | ||||
| #include <asm/arch/board.h> | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/fpga.h> | ||||
| #ifdef CONFIG_PM | ||||
| #include <asm/arch/pm.h> | ||||
| #endif | ||||
| 
 | ||||
| static struct clk * uart1_ck = NULL; | ||||
| static struct clk * uart2_ck = NULL; | ||||
| @ -94,7 +98,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
| @ -193,6 +197,86 @@ void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS]) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_OMAP_SERIAL_WAKE | ||||
| 
 | ||||
| static irqreturn_t omap_serial_wake_interrupt(int irq, void *dev_id, | ||||
| 					      struct pt_regs *regs) | ||||
| { | ||||
| 	/* Need to do something with serial port right after wake-up? */ | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Reroutes serial RX lines to GPIO lines for the duration of | ||||
|  * sleep to allow waking up the device from serial port even | ||||
|  * in deep sleep. | ||||
|  */ | ||||
| void omap_serial_wake_trigger(int enable) | ||||
| { | ||||
| 	if (!cpu_is_omap16xx()) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (uart1_ck != NULL) { | ||||
| 		if (enable) | ||||
| 			omap_cfg_reg(V14_16XX_GPIO37); | ||||
| 		else | ||||
| 			omap_cfg_reg(V14_16XX_UART1_RX); | ||||
| 	} | ||||
| 	if (uart2_ck != NULL) { | ||||
| 		if (enable) | ||||
| 			omap_cfg_reg(R9_16XX_GPIO18); | ||||
| 		else | ||||
| 			omap_cfg_reg(R9_16XX_UART2_RX); | ||||
| 	} | ||||
| 	if (uart3_ck != NULL) { | ||||
| 		if (enable) | ||||
| 			omap_cfg_reg(L14_16XX_GPIO49); | ||||
| 		else | ||||
| 			omap_cfg_reg(L14_16XX_UART3_RX); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void __init omap_serial_set_port_wakeup(int gpio_nr) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = omap_request_gpio(gpio_nr); | ||||
| 	if (ret < 0) { | ||||
| 		printk(KERN_ERR "Could not request UART wake GPIO: %i\n", | ||||
| 		       gpio_nr); | ||||
| 		return; | ||||
| 	} | ||||
| 	omap_set_gpio_direction(gpio_nr, 1); | ||||
| 	set_irq_type(OMAP_GPIO_IRQ(gpio_nr), IRQT_RISING); | ||||
| 	ret = request_irq(OMAP_GPIO_IRQ(gpio_nr), &omap_serial_wake_interrupt, | ||||
| 			  0, "serial wakeup", NULL); | ||||
| 	if (ret) { | ||||
| 		omap_free_gpio(gpio_nr); | ||||
| 		printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n", | ||||
| 		       gpio_nr); | ||||
| 		return; | ||||
| 	} | ||||
| 	enable_irq_wake(OMAP_GPIO_IRQ(gpio_nr)); | ||||
| } | ||||
| 
 | ||||
| static int __init omap_serial_wakeup_init(void) | ||||
| { | ||||
| 	if (!cpu_is_omap16xx()) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (uart1_ck != NULL) | ||||
| 		omap_serial_set_port_wakeup(37); | ||||
| 	if (uart2_ck != NULL) | ||||
| 		omap_serial_set_port_wakeup(18); | ||||
| 	if (uart3_ck != NULL) | ||||
| 		omap_serial_set_port_wakeup(49); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| late_initcall(omap_serial_wakeup_init); | ||||
| 
 | ||||
| #endif	/* CONFIG_OMAP_SERIAL_WAKE */ | ||||
| 
 | ||||
| static int __init omap_init(void) | ||||
| { | ||||
| 	return platform_device_register(&serial_device); | ||||
|  | ||||
| @ -247,13 +247,6 @@ unsigned long long sched_clock(void) | ||||
| #define OMAP_32K_TIMER_TCR		0x04 | ||||
| 
 | ||||
| #define OMAP_32K_TICKS_PER_HZ		(32768 / HZ) | ||||
| #if (32768 % HZ) != 0 | ||||
| /* We cannot ignore modulo.
 | ||||
|  * Potential error can be as high as several percent. | ||||
|  */ | ||||
| #define OMAP_32K_TICK_MODULO		(32768 % HZ) | ||||
| static unsigned modulo_count = 0; /* Counts 1/HZ units */ | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1 | ||||
| @ -296,13 +289,22 @@ static inline void omap_32k_timer_stop(void) | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Rounds down to nearest usec | ||||
|  * Rounds down to nearest usec. Note that this will overflow for larger values. | ||||
|  */ | ||||
| static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k) | ||||
| { | ||||
| 	return (ticks_32k * 5*5*5*5*5*5) >> 9; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Rounds down to nearest nsec. | ||||
|  */ | ||||
| static inline unsigned long long | ||||
| omap_32k_ticks_to_nsecs(unsigned long ticks_32k) | ||||
| { | ||||
| 	return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9; | ||||
| } | ||||
| 
 | ||||
| static unsigned long omap_32k_last_tick = 0; | ||||
| 
 | ||||
| /*
 | ||||
| @ -314,6 +316,15 @@ static unsigned long omap_32k_timer_gettimeoffset(void) | ||||
| 	return omap_32k_ticks_to_usecs(now - omap_32k_last_tick); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Returns current time from boot in nsecs. It's OK for this to wrap | ||||
|  * around for now, as it's just a relative time stamp. | ||||
|  */ | ||||
| unsigned long long sched_clock(void) | ||||
| { | ||||
| 	return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read()); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this | ||||
|  * function is also called from other interrupts to remove latency | ||||
| @ -330,19 +341,6 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id, | ||||
| 	now = omap_32k_sync_timer_read(); | ||||
| 
 | ||||
| 	while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) { | ||||
| #ifdef OMAP_32K_TICK_MODULO | ||||
| 		/* Modulo addition may put omap_32k_last_tick ahead of now
 | ||||
| 		 * and cause unwanted repetition of the while loop. | ||||
| 		 */ | ||||
| 		if (unlikely(now - omap_32k_last_tick == ~0)) | ||||
| 			break; | ||||
| 
 | ||||
| 		modulo_count += OMAP_32K_TICK_MODULO; | ||||
| 		if (modulo_count > HZ) { | ||||
| 			++omap_32k_last_tick; | ||||
| 			modulo_count -= HZ; | ||||
| 		} | ||||
| #endif | ||||
| 		omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ; | ||||
| 		timer_tick(regs); | ||||
| 	} | ||||
|  | ||||
| @ -140,7 +140,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -381,7 +381,7 @@ static struct plat_serial8250_port bast_sio_data[] = { | ||||
| 
 | ||||
| static struct platform_device bast_sio = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= &bast_sio_data, | ||||
| 	}, | ||||
|  | ||||
| @ -221,7 +221,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -41,7 +41,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name			= "serial8250", | ||||
| 	.id			= 0, | ||||
| 	.id			= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev			= { | ||||
| 		.platform_data	= serial_platform_data, | ||||
| 	}, | ||||
|  | ||||
| @ -16,6 +16,58 @@ | ||||
| #include <asm/tlbflush.h> | ||||
| 
 | ||||
| #ifdef CONFIG_CPU_CACHE_VIPT | ||||
| 
 | ||||
| void flush_cache_mm(struct mm_struct *mm) | ||||
| { | ||||
| 	if (cache_is_vivt()) { | ||||
| 		if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) | ||||
| 			__cpuc_flush_user_all(); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cache_is_vipt_aliasing()) { | ||||
| 		asm(	"mcr	p15, 0, %0, c7, c14, 0\n" | ||||
| 		"	mcr	p15, 0, %0, c7, c5, 0\n" | ||||
| 		"	mcr	p15, 0, %0, c7, c10, 4" | ||||
| 		    : | ||||
| 		    : "r" (0) | ||||
| 		    : "cc"); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) | ||||
| { | ||||
| 	if (cache_is_vivt()) { | ||||
| 		if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) | ||||
| 			__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end), | ||||
| 						vma->vm_flags); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cache_is_vipt_aliasing()) { | ||||
| 		asm(	"mcr	p15, 0, %0, c7, c14, 0\n" | ||||
| 		"	mcr	p15, 0, %0, c7, c5, 0\n" | ||||
| 		"	mcr	p15, 0, %0, c7, c10, 4" | ||||
| 		    : | ||||
| 		    : "r" (0) | ||||
| 		    : "cc"); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn) | ||||
| { | ||||
| 	if (cache_is_vivt()) { | ||||
| 		if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) { | ||||
| 			unsigned long addr = user_addr & PAGE_MASK; | ||||
| 			__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); | ||||
| 		} | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cache_is_vipt_aliasing()) | ||||
| 		flush_pfn_alias(pfn, user_addr); | ||||
| } | ||||
| 
 | ||||
| #define ALIAS_FLUSH_START	0xffff4000 | ||||
| 
 | ||||
| #define TOP_PTE(x)	pte_offset_kernel(top_pmd, x) | ||||
|  | ||||
| @ -467,11 +467,11 @@ static void __init longhaul_setup_voltagescaling(void) | ||||
| 	} | ||||
| 
 | ||||
| 	if (vrmrev==0) { | ||||
| 		dprintk ("VRM 8.5 \n"); | ||||
| 		dprintk ("VRM 8.5\n"); | ||||
| 		memcpy (voltage_table, vrm85scales, sizeof(voltage_table)); | ||||
| 		numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25; | ||||
| 	} else { | ||||
| 		dprintk ("Mobile VRM \n"); | ||||
| 		dprintk ("Mobile VRM\n"); | ||||
| 		memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table)); | ||||
| 		numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5; | ||||
| 	} | ||||
|  | ||||
| @ -259,7 +259,7 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy) | ||||
| 
 | ||||
| 	if (model->op_points == NULL) { | ||||
| 		/* Matched a non-match */ | ||||
| 		dprintk(KERN_INFO PFX "no table support for CPU model \"%s\": \n", | ||||
| 		dprintk(KERN_INFO PFX "no table support for CPU model \"%s\"\n", | ||||
| 		       cpu->x86_model_id); | ||||
| #ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI | ||||
| 		dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); | ||||
| @ -402,7 +402,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | ||||
| 
 | ||||
| 	for (i=0; i<p.state_count; i++) { | ||||
| 		if (p.states[i].control != p.states[i].status) { | ||||
| 			dprintk("Different control (%x) and status values (%x)\n", | ||||
| 			dprintk("Different control (%llu) and status values (%llu)\n", | ||||
| 				p.states[i].control, p.states[i].status); | ||||
| 			result = -EINVAL; | ||||
| 			goto err_unreg; | ||||
| @ -415,7 +415,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | ||||
| 		} | ||||
| 
 | ||||
| 		if (p.states[i].core_frequency > p.states[0].core_frequency) { | ||||
| 			dprintk("P%u has larger frequency (%u) than P0 (%u), skipping\n", i, | ||||
| 			dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i, | ||||
| 				p.states[i].core_frequency, p.states[0].core_frequency); | ||||
| 			p.states[i].core_frequency = 0; | ||||
| 			continue; | ||||
| @ -498,13 +498,6 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | ||||
| 	if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	for (i = 0; i < N_IDS; i++) | ||||
| 		if (centrino_verify_cpu_id(cpu, &cpu_ids[i])) | ||||
| 			break; | ||||
| 
 | ||||
| 	if (i != N_IDS) | ||||
| 		centrino_cpu[policy->cpu] = &cpu_ids[i]; | ||||
| 
 | ||||
| 	if (is_const_loops_cpu(policy->cpu)) { | ||||
| 		centrino_driver.flags |= CPUFREQ_CONST_LOOPS; | ||||
| 	} | ||||
| @ -513,6 +506,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | ||||
| 		if (policy->cpu != 0) | ||||
| 			return -ENODEV; | ||||
| 
 | ||||
| 		for (i = 0; i < N_IDS; i++) | ||||
| 			if (centrino_verify_cpu_id(cpu, &cpu_ids[i])) | ||||
| 				break; | ||||
| 
 | ||||
| 		if (i != N_IDS) | ||||
| 			centrino_cpu[policy->cpu] = &cpu_ids[i]; | ||||
| 
 | ||||
| 		if (!centrino_cpu[policy->cpu]) { | ||||
| 			dprintk(KERN_INFO PFX "found unsupported CPU with " | ||||
| 			"Enhanced SpeedStep: send /proc/cpuinfo to " | ||||
|  | ||||
| @ -99,7 +99,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | ||||
| 	u32 function = GET_SPEEDSTEP_FREQS; | ||||
| 
 | ||||
| 	if (!(ist_info.event & 0xFFFF)) { | ||||
| 		dprintk("bug #1422 -- can't read freqs from BIOS\n", result); | ||||
| 		dprintk("bug #1422 -- can't read freqs from BIOS\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -283,9 +283,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | ||||
| 	/* Write-combine setting is ignored, it is changed via the mtrr
 | ||||
| 	 * interfaces on this platform. | ||||
| 	 */ | ||||
| 	if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | ||||
| 			     vma->vm_end - vma->vm_start, | ||||
| 			     vma->vm_page_prot)) | ||||
| 	if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | ||||
| 			       vma->vm_end - vma->vm_start, | ||||
| 			       vma->vm_page_prot)) | ||||
| 		return -EAGAIN; | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -339,12 +339,6 @@ config IA64_PALINFO | ||||
| 	  To use this option, you have to ensure that the "/proc file system | ||||
| 	  support" (CONFIG_PROC_FS) is enabled, too. | ||||
| 
 | ||||
| config ACPI_DEALLOCATE_IRQ | ||||
| 	bool | ||||
| 	depends on ACPI | ||||
| 	depends on IOSAPIC && EXPERIMENTAL | ||||
| 	default y | ||||
| 
 | ||||
| source "drivers/firmware/Kconfig" | ||||
| 
 | ||||
| source "fs/Kconfig.binfmt" | ||||
|  | ||||
| @ -111,7 +111,6 @@ CONFIG_COMPAT=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_ACPI_DEALLOCATE_IRQ=y | ||||
| 
 | ||||
| # | ||||
| # Firmware Drivers | ||||
|  | ||||
| @ -109,7 +109,6 @@ CONFIG_COMPAT=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_ACPI_DEALLOCATE_IRQ=y | ||||
| 
 | ||||
| # | ||||
| # Firmware Drivers | ||||
|  | ||||
| @ -109,7 +109,6 @@ CONFIG_COMPAT=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_ACPI_DEALLOCATE_IRQ=y | ||||
| 
 | ||||
| # | ||||
| # Firmware Drivers | ||||
|  | ||||
| @ -99,7 +99,6 @@ CONFIG_COMPAT=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_ACPI_DEALLOCATE_IRQ=y | ||||
| 
 | ||||
| # | ||||
| # Firmware Drivers | ||||
| @ -335,7 +334,7 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | ||||
| CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | ||||
| # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | ||||
| # CONFIG_SCSI_IPR is not set | ||||
| CONFIG_SCSI_QLOGIC_FC=y | ||||
| # CONFIG_SCSI_QLOGIC_FC is not set | ||||
| # CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set | ||||
| CONFIG_SCSI_QLOGIC_1280=y | ||||
| # CONFIG_SCSI_QLOGIC_1280_1040 is not set | ||||
|  | ||||
| @ -583,14 +583,12 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) | ||||
| 
 | ||||
| EXPORT_SYMBOL(acpi_register_gsi); | ||||
| 
 | ||||
| #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||||
| void acpi_unregister_gsi(u32 gsi) | ||||
| { | ||||
| 	iosapic_unregister_intr(gsi); | ||||
| } | ||||
| 
 | ||||
| EXPORT_SYMBOL(acpi_unregister_gsi); | ||||
| #endif				/* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||||
| 
 | ||||
| static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size) | ||||
| { | ||||
|  | ||||
| @ -204,9 +204,6 @@ GLOBAL_ENTRY(ia64_switch_to) | ||||
| (p6)	br.cond.dpnt .map | ||||
| 	;;
 | ||||
| .done: | ||||
| (p6)	ssm psr.ic			// if we had to map, reenable the psr.ic bit FIRST!!! | ||||
| 	;;
 | ||||
| (p6)	srlz.d | ||||
| 	ld8 sp=[r21]			// load kernel stack pointer of new task | ||||
| 	mov IA64_KR(CURRENT)=in0	// update "current" application register | ||||
| 	mov r8=r13			// return pointer to previously running task | ||||
| @ -234,6 +231,9 @@ GLOBAL_ENTRY(ia64_switch_to) | ||||
| 	mov IA64_KR(CURRENT_STACK)=r26	// remember last page we mapped... | ||||
| 	;;
 | ||||
| 	itr.d dtr[r25]=r23		// wire in new mapping... | ||||
| 	ssm psr.ic			// reenable the psr.ic bit | ||||
| 	;;
 | ||||
| 	srlz.d | ||||
| 	br.cond.sptk .done | ||||
| END(ia64_switch_to) | ||||
| 
 | ||||
|  | ||||
| @ -782,7 +782,6 @@ again: | ||||
| 	return vector; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||||
| void | ||||
| iosapic_unregister_intr (unsigned int gsi) | ||||
| { | ||||
| @ -865,7 +864,6 @@ iosapic_unregister_intr (unsigned int gsi) | ||||
| 	spin_unlock(&iosapic_lock); | ||||
| 	spin_unlock_irqrestore(&idesc->lock, flags); | ||||
| } | ||||
| #endif /* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||||
| 
 | ||||
| /*
 | ||||
|  * ACPI calls this when it finds an entry for a platform interrupt. | ||||
|  | ||||
| @ -625,8 +625,11 @@ EK(.ex_handler,  (p17)	st8	[dst1]=r39,8);						\ | ||||
| 	clrrrb | ||||
| 	;;
 | ||||
| 	alloc	saved_pfs_stack=ar.pfs,3,3,3,0 | ||||
| 	cmp.lt	p8,p0=A,r0 | ||||
| 	sub	B = dst0, saved_in0	// how many byte copied so far | ||||
| 	;;
 | ||||
| (p8)	mov	A = 0;			// A shouldn't be negative, cap it
 | ||||
| 	;;
 | ||||
| 	sub	C = A, B | ||||
| 	sub	D = saved_in2, A | ||||
| 	;;
 | ||||
|  | ||||
| @ -230,9 +230,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (ia64_done_with_exception(regs)) | ||||
| 		return; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Since we have no vma's for region 5, we might get here even if the address is | ||||
| 	 * valid, due to the VHPT walker inserting a non present translation that becomes | ||||
| @ -243,6 +240,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | ||||
| 	if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (ia64_done_with_exception(regs)) | ||||
| 		return; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Oops. The kernel tried to access some bad page. We'll have to terminate things | ||||
| 	 * with extreme prejudice. | ||||
|  | ||||
| @ -498,13 +498,11 @@ pcibios_enable_device (struct pci_dev *dev, int mask) | ||||
| 	return acpi_pci_irq_enable(dev); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||||
| void | ||||
| pcibios_disable_device (struct pci_dev *dev) | ||||
| { | ||||
| 	acpi_pci_irq_disable(dev); | ||||
| } | ||||
| #endif /* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||||
| 
 | ||||
| void | ||||
| pcibios_align_resource (void *data, struct resource *res, | ||||
|  | ||||
| @ -56,7 +56,7 @@ | ||||
| 
 | ||||
| DEFINE_PER_CPU(struct pda_s, pda_percpu); | ||||
| 
 | ||||
| #define MAX_PHYS_MEMORY		(1UL << 49)	/* 1 TB */ | ||||
| #define MAX_PHYS_MEMORY		(1UL << IA64_MAX_PHYS_BITS)	/* Max physical address supported */ | ||||
| 
 | ||||
| lboard_t *root_lboard[MAX_COMPACT_NODES]; | ||||
| 
 | ||||
|  | ||||
| @ -885,6 +885,10 @@ xpc_init(void) | ||||
| 	pid_t pid; | ||||
| 
 | ||||
| 
 | ||||
| 	if (!ia64_platform_is("sn2")) { | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng | ||||
| 	 * both a partition's reserved page and its XPC variables. Its size was | ||||
|  | ||||
| @ -636,6 +636,10 @@ xpnet_init(void) | ||||
| 	int result = -ENOMEM; | ||||
| 
 | ||||
| 
 | ||||
| 	if (!ia64_platform_is("sn2")) { | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME); | ||||
| 
 | ||||
| 	/*
 | ||||
|  | ||||
							
								
								
									
										19
									
								
								arch/m68knommu/platform/523x/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								arch/m68knommu/platform/523x/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| #
 | ||||
| # Makefile for the m68knommu linux kernel.
 | ||||
| #
 | ||||
| 
 | ||||
| #
 | ||||
| # If you want to play with the HW breakpoints then you will
 | ||||
| # need to add define this,  which will give you a stack backtrace
 | ||||
| # on the console port whenever a DBG interrupt occurs.  You have to
 | ||||
| # set up you HW breakpoints to trigger a DBG interrupt:
 | ||||
| #
 | ||||
| # EXTRA_CFLAGS += -DTRAP_DBG_INTERRUPT
 | ||||
| # EXTRA_AFLAGS += -DTRAP_DBG_INTERRUPT
 | ||||
| #
 | ||||
| 
 | ||||
| ifdef CONFIG_FULLDEBUG | ||||
| AFLAGS += -DDEBUGGER_COMPATIBLE_CACHE=1 | ||||
| endif | ||||
| 
 | ||||
| obj-y := config.o | ||||
| @ -104,11 +104,11 @@ int mcf_timerirqpending(int timer) | ||||
| 
 | ||||
| void config_BSP(char *commandp, int size) | ||||
| { | ||||
| #if 0 | ||||
| 	volatile unsigned long	*pivrp; | ||||
| #if defined (CONFIG_MOD5272) | ||||
| 	volatile unsigned char	*pivrp; | ||||
| 
 | ||||
| 	/* Set base of device vectors to be 64 */ | ||||
| 	pivrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PIVR); | ||||
| 	pivrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_PIVR); | ||||
| 	*pivrp = 0x40; | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -19,6 +19,7 @@ endif | ||||
| obj-$(CONFIG_COLDFIRE)	+= entry.o vectors.o ints.o | ||||
| obj-$(CONFIG_M5206)	+= timers.o | ||||
| obj-$(CONFIG_M5206e)	+= timers.o | ||||
| obj-$(CONFIG_M523x)	+= pit.o | ||||
| obj-$(CONFIG_M5249)	+= timers.o | ||||
| obj-$(CONFIG_M527x)     += pit.o | ||||
| obj-$(CONFIG_M5272)	+= timers.o | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| /*
 | ||||
|  *  linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c | ||||
|  *  linux/arch/m68knommu/platform/68328/config.c | ||||
|  * | ||||
|  *  Copyright (C) 1993 Hamish Macdonald | ||||
|  *  Copyright (C) 1999 D. Jeff Dionne | ||||
| @ -11,6 +13,8 @@ | ||||
|  * VZ Support/Fixes             Evan Stawnyczy <e@lineo.ca> | ||||
|  */ | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| #include <asm/dbg.h> | ||||
| #include <stdarg.h> | ||||
| #include <linux/config.h> | ||||
| @ -29,76 +33,16 @@ | ||||
| #include <asm/machdep.h> | ||||
| #include <asm/MC68328.h> | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void BSP_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) | ||||
| { | ||||
| void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); | ||||
| void m68328_timer_tick(void); | ||||
| unsigned long m68328_timer_gettimeoffset(void); | ||||
| void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); | ||||
| 
 | ||||
| #ifdef CONFIG_XCOPILOT_BUGS | ||||
|   /*
 | ||||
|    * The only thing I know is that CLK32 is not available on Xcopilot | ||||
|    * I have little idea about what frequency SYSCLK has on Xcopilot.  | ||||
|    * The values for prescaler and compare registers were simply  | ||||
|    * taken from the original source | ||||
|    */ | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
|   /* Restart mode, Enable int, SYSCLK, Enable timer */ | ||||
|   TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_SYSCLK | TCTL_TEN; | ||||
|   /* Set prescaler */ | ||||
|   TPRER2 = 2; | ||||
|   /* Set compare register */ | ||||
|   TCMP2 = 0xd7e4; | ||||
| #else | ||||
|   /* Restart mode, Enable int, 32KHz, Enable timer */ | ||||
|   TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||||
|   /* Set prescaler (Divide 32KHz by 32)*/ | ||||
|   TPRER2 = 31; | ||||
|   /* Set compare register  32Khz / 32 / 10 = 100 */ | ||||
|   TCMP2 = 10; | ||||
| #endif | ||||
|                                                                      | ||||
|   request_irq(TMR2_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||||
| } | ||||
| 
 | ||||
| void BSP_tick(void) | ||||
| { | ||||
|   /* Reset Timer2 */ | ||||
|   TSTAT2 &= 0; | ||||
| } | ||||
| 
 | ||||
| unsigned long BSP_gettimeoffset (void) | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_gettod (int *yearp, int *monp, int *dayp, | ||||
| 		   int *hourp, int *minp, int *secp) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| int BSP_hwclk(int op, struct hwclk_time *t) | ||||
| { | ||||
|   if (!op) { | ||||
|     /* read */ | ||||
|   } else { | ||||
|     /* write */ | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| int BSP_set_clock_mmss (unsigned long nowtime) | ||||
| { | ||||
| #if 0 | ||||
|   short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||||
| 
 | ||||
|   tod->second1 = real_seconds / 10; | ||||
|   tod->second2 = real_seconds % 10; | ||||
|   tod->minute1 = real_minutes / 10; | ||||
|   tod->minute2 = real_minutes % 10; | ||||
| #endif | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_reset (void) | ||||
| void m68328_reset (void) | ||||
| { | ||||
|   local_irq_disable(); | ||||
|   asm volatile ("moveal #0x10c00000, %a0;\n\t" | ||||
| @ -108,18 +52,22 @@ void BSP_reset (void) | ||||
| 		"jmp (%a0);"); | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void config_BSP(char *command, int len) | ||||
| { | ||||
|   printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n"); | ||||
|   printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n"); | ||||
|   printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n"); | ||||
| 
 | ||||
|   mach_sched_init      = BSP_sched_init; | ||||
|   mach_tick            = BSP_tick; | ||||
|   mach_gettimeoffset   = BSP_gettimeoffset; | ||||
|   mach_gettod          = BSP_gettod; | ||||
|   mach_sched_init      = m68328_timer_init; | ||||
|   mach_tick            = m68328_timer_tick; | ||||
|   mach_gettimeoffset   = m68328_timer_gettimeoffset; | ||||
|   mach_gettod          = m68328_timer_gettod; | ||||
|   mach_hwclk           = NULL; | ||||
|   mach_set_clock_mmss  = NULL; | ||||
|   mach_reset           = BSP_reset; | ||||
|   mach_reset           = m68328_reset; | ||||
|   *command = '\0'; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
|  | ||||
							
								
								
									
										106
									
								
								arch/m68knommu/platform/68328/timers.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								arch/m68knommu/platform/68328/timers.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,106 @@ | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| /*
 | ||||
|  *  linux/arch/m68knommu/platform/68328/timers.c | ||||
|  * | ||||
|  *  Copyright (C) 1993 Hamish Macdonald | ||||
|  *  Copyright (C) 1999 D. Jeff Dionne | ||||
|  *  Copyright (C) 2001 Georges Menie, Ken Desmet | ||||
|  * | ||||
|  * This file is subject to the terms and conditions of the GNU General Public | ||||
|  * License.  See the file COPYING in the main directory of this archive | ||||
|  * for more details. | ||||
|  */ | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/mm.h> | ||||
| #include <asm/setup.h> | ||||
| #include <asm/system.h> | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/machdep.h> | ||||
| #include <asm/MC68VZ328.h> | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| #if defined(CONFIG_DRAGEN2) | ||||
| /* with a 33.16 MHz clock, this will give usec resolution to the time functions */ | ||||
| #define CLOCK_SOURCE	TCTL_CLKSOURCE_SYSCLK | ||||
| #define CLOCK_PRE	7 | ||||
| #define TICKS_PER_JIFFY	41450 | ||||
| 
 | ||||
| #elif defined(CONFIG_XCOPILOT_BUGS) | ||||
| /*
 | ||||
|  * The only thing I know is that CLK32 is not available on Xcopilot | ||||
|  * I have little idea about what frequency SYSCLK has on Xcopilot. | ||||
|  * The values for prescaler and compare registers were simply | ||||
|  * taken from the original source | ||||
|  */ | ||||
| #define CLOCK_SOURCE	TCTL_CLKSOURCE_SYSCLK | ||||
| #define CLOCK_PRE	2 | ||||
| #define TICKS_PER_JIFFY	0xd7e4 | ||||
| 
 | ||||
| #else | ||||
| /* default to using the 32Khz clock */ | ||||
| #define CLOCK_SOURCE	TCTL_CLKSOURCE_32KHZ | ||||
| #define CLOCK_PRE	31 | ||||
| #define TICKS_PER_JIFFY	10 | ||||
| #endif | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)) | ||||
| { | ||||
| 	/* disable timer 1 */ | ||||
| 	TCTL = 0; | ||||
| 
 | ||||
| 	/* set ISR */ | ||||
| 	if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))  | ||||
| 		panic("Unable to attach timer interrupt\n"); | ||||
| 
 | ||||
| 	/* Restart mode, Enable int, Set clock source */ | ||||
| 	TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE; | ||||
| 	TPRER = CLOCK_PRE; | ||||
| 	TCMP = TICKS_PER_JIFFY; | ||||
| 
 | ||||
| 	/* Enable timer 1 */ | ||||
| 	TCTL |= TCTL_TEN; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void m68328_timer_tick(void) | ||||
| { | ||||
| 	/* Reset Timer1 */ | ||||
| 	TSTAT &= 0; | ||||
| } | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| unsigned long m68328_timer_gettimeoffset(void) | ||||
| { | ||||
| 	unsigned long ticks = TCN, offset = 0; | ||||
| 
 | ||||
| 	/* check for pending interrupt */ | ||||
| 	if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM))) | ||||
| 		offset = 1000000 / HZ; | ||||
| 	ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY; | ||||
| 	return ticks + offset; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec) | ||||
| { | ||||
| 	long now = RTCTIME; | ||||
| 
 | ||||
| 	*year = *mon = *day = 1; | ||||
| 	*hour = (now >> 24) % 24; | ||||
| 	*min = (now >> 16) % 60; | ||||
| 	*sec = now % 60; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| @ -1,5 +1,7 @@ | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| /*
 | ||||
|  *  linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c | ||||
|  *  linux/arch/m68knommu/platform/68EZ328/config.c | ||||
|  * | ||||
|  *  Copyright (C) 1993 Hamish Macdonald | ||||
|  *  Copyright (C) 1999 D. Jeff Dionne | ||||
| @ -9,6 +11,8 @@ | ||||
|  * for more details. | ||||
|  */ | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| #include <linux/config.h> | ||||
| #include <linux/types.h> | ||||
| @ -20,68 +24,22 @@ | ||||
| #include <asm/setup.h> | ||||
| #include <asm/system.h> | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/machdep.h> | ||||
| #include <asm/MC68EZ328.h> | ||||
| #ifdef CONFIG_UCSIMM | ||||
| #include <asm/bootstd.h> | ||||
| #endif | ||||
| #ifdef CONFIG_PILOT | ||||
| #include "PalmV/romfs.h" | ||||
| #endif | ||||
| 
 | ||||
| void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) | ||||
| { | ||||
|   /* Restart mode, Enable int, 32KHz, Enable timer */ | ||||
|   TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||||
|   /* Set prescaler (Divide 32KHz by 32)*/ | ||||
|   TPRER = 31; | ||||
|   /* Set compare register  32Khz / 32 / 10 = 100 */ | ||||
|   TCMP = 10;                                                               | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
|   request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||||
| } | ||||
| void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); | ||||
| void m68328_timer_tick(void); | ||||
| unsigned long m68328_timer_gettimeoffset(void); | ||||
| void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); | ||||
| 
 | ||||
| void BSP_tick(void) | ||||
| { | ||||
|   	/* Reset Timer1 */ | ||||
| 	TSTAT &= 0; | ||||
| } | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| unsigned long BSP_gettimeoffset (void) | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_gettod (int *yearp, int *monp, int *dayp, | ||||
| 		   int *hourp, int *minp, int *secp) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| int BSP_hwclk(int op, struct hwclk_time *t) | ||||
| { | ||||
|   if (!op) { | ||||
|     /* read */ | ||||
|   } else { | ||||
|     /* write */ | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| int BSP_set_clock_mmss (unsigned long nowtime) | ||||
| { | ||||
| #if 0 | ||||
|   short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||||
| 
 | ||||
|   tod->second1 = real_seconds / 10; | ||||
|   tod->second2 = real_seconds % 10; | ||||
|   tod->minute1 = real_minutes / 10; | ||||
|   tod->minute2 = real_minutes % 10; | ||||
| #endif | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_reset (void) | ||||
| void m68ez328_reset(void) | ||||
| { | ||||
|   local_irq_disable(); | ||||
|   asm volatile (" | ||||
| @ -93,6 +51,8 @@ void BSP_reset (void) | ||||
|     "); | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| unsigned char *cs8900a_hwaddr; | ||||
| static int errno; | ||||
| 
 | ||||
| @ -119,11 +79,13 @@ void config_BSP(char *command, int len) | ||||
|   else command[0] = 0; | ||||
| #endif | ||||
|   | ||||
|   mach_sched_init      = BSP_sched_init; | ||||
|   mach_tick            = BSP_tick; | ||||
|   mach_gettimeoffset   = BSP_gettimeoffset; | ||||
|   mach_gettod          = BSP_gettod; | ||||
|   mach_sched_init      = m68328_timer_init; | ||||
|   mach_tick            = m68328_timer_tick; | ||||
|   mach_gettimeoffset   = m68328_timer_gettimeoffset; | ||||
|   mach_gettod          = m68328_timer_gettod; | ||||
|   mach_hwclk           = NULL; | ||||
|   mach_set_clock_mmss  = NULL; | ||||
|   mach_reset           = BSP_reset; | ||||
|   mach_reset           = m68ez328_reset; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| /*
 | ||||
|  *  linux/arch/m68knommu/platform/MC68VZ328/de2/config.c | ||||
|  *  linux/arch/m68knommu/platform/68VZ328/config.c | ||||
|  * | ||||
|  *  Copyright (C) 1993 Hamish Macdonald | ||||
|  *  Copyright (C) 1999 D. Jeff Dionne | ||||
| @ -10,6 +12,8 @@ | ||||
|  * for more details. | ||||
|  */ | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/kernel.h> | ||||
| @ -25,66 +29,25 @@ | ||||
| #include <asm/irq.h> | ||||
| #include <asm/machdep.h> | ||||
| #include <asm/MC68VZ328.h> | ||||
| #include <asm/bootstd.h> | ||||
| 
 | ||||
| #ifdef CONFIG_INIT_LCD | ||||
| #include "screen.h" | ||||
| #include "bootlogo.h" | ||||
| #endif | ||||
| 
 | ||||
| /* with a 33.16 MHz clock, this will give usec resolution to the time functions */ | ||||
| #define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK | ||||
| #define CLOCK_PRE 7 | ||||
| #define TICKS_PER_JIFFY 41450 | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| static void | ||||
| dragen2_sched_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)) | ||||
| { | ||||
| 	/* disable timer 1 */ | ||||
| 	TCTL = 0; | ||||
| void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); | ||||
| void m68328_timer_tick(void); | ||||
| unsigned long m68328_timer_gettimeoffset(void); | ||||
| void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); | ||||
| 
 | ||||
| 	/* set ISR */ | ||||
| 	if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))  | ||||
| 		panic("Unable to attach timer interrupt\n"); | ||||
| /***************************************************************************/ | ||||
| /*                        Init Drangon Engine hardware                     */ | ||||
| /***************************************************************************/ | ||||
| #if defined(CONFIG_DRAGEN2) | ||||
| 
 | ||||
| 	/* Restart mode, Enable int, Set clock source */ | ||||
| 	TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE; | ||||
| 	TPRER = CLOCK_PRE; | ||||
| 	TCMP = TICKS_PER_JIFFY; | ||||
| 
 | ||||
| 	/* Enable timer 1 */ | ||||
| 	TCTL |= TCTL_TEN; | ||||
| } | ||||
| 
 | ||||
| static void dragen2_tick(void) | ||||
| { | ||||
| 	/* Reset Timer1 */ | ||||
| 	TSTAT &= 0; | ||||
| } | ||||
| 
 | ||||
| static unsigned long dragen2_gettimeoffset(void) | ||||
| { | ||||
| 	unsigned long ticks = TCN, offset = 0; | ||||
| 
 | ||||
| 	/* check for pending interrupt */ | ||||
| 	if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM))) | ||||
| 		offset = 1000000 / HZ; | ||||
| 
 | ||||
| 	ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY; | ||||
| 
 | ||||
| 	return ticks + offset; | ||||
| } | ||||
| 
 | ||||
| static void dragen2_gettod(int *year, int *mon, int *day, int *hour, | ||||
| 						   int *min, int *sec) | ||||
| { | ||||
| 	long now = RTCTIME; | ||||
| 
 | ||||
| 	*year = *mon = *day = 1; | ||||
| 	*hour = (now >> 24) % 24; | ||||
| 	*min = (now >> 16) % 60; | ||||
| 	*sec = now % 60; | ||||
| } | ||||
| 
 | ||||
| static void dragen2_reset(void) | ||||
| static void m68vz328_reset(void) | ||||
| { | ||||
| 	local_irq_disable(); | ||||
| 
 | ||||
| @ -103,7 +66,7 @@ static void dragen2_reset(void) | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| static void init_hardware(void) | ||||
| static void init_hardware(char *command, int size) | ||||
| { | ||||
| #ifdef CONFIG_DIRECT_IO_ACCESS | ||||
| 	SCR = 0x10;					/* allow user access to internal registers */ | ||||
| @ -170,6 +133,60 @@ static void init_hardware(void) | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| /*                      Init RT-Control uCdimm hardware                    */ | ||||
| /***************************************************************************/ | ||||
| #elif defined(CONFIG_UCDIMM) | ||||
| 
 | ||||
| static void m68vz328_reset(void) | ||||
| { | ||||
| 	local_irq_disable(); | ||||
| 	asm volatile (" | ||||
| 		moveal #0x10c00000, %a0; | ||||
| 		moveb #0, 0xFFFFF300; | ||||
| 		moveal 0(%a0), %sp; | ||||
| 		moveal 4(%a0), %a0; | ||||
| 		jmp (%a0); | ||||
| 	"); | ||||
| } | ||||
| 
 | ||||
| unsigned char *cs8900a_hwaddr; | ||||
| static int errno; | ||||
| 
 | ||||
| _bsc0(char *, getserialnum) | ||||
| _bsc1(unsigned char *, gethwaddr, int, a) | ||||
| _bsc1(char *, getbenv, char *, a) | ||||
| 
 | ||||
| static void init_hardware(char *command, int size) | ||||
| { | ||||
| 	char *p; | ||||
| 
 | ||||
| 	printk(KERN_INFO "uCdimm serial string [%s]\n", getserialnum()); | ||||
| 	p = cs8900a_hwaddr = gethwaddr(0); | ||||
| 	printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||
| 		p[0], p[1], p[2], p[3], p[4], p[5]); | ||||
| 	p = getbenv("APPEND"); | ||||
| 	if (p) | ||||
| 		strcpy(p, command); | ||||
| 	else | ||||
| 		command[0] = 0; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| #else | ||||
| 
 | ||||
| static void m68vz328_reset(void) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static void init_hardware(char *command, int size) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| #endif | ||||
| /***************************************************************************/ | ||||
| 
 | ||||
| void config_BSP(char *command, int size) | ||||
| { | ||||
| 	printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); | ||||
| @ -181,11 +198,13 @@ void config_BSP(char *command, int size) | ||||
| 	memset(command, 0, size); | ||||
| #endif | ||||
| 
 | ||||
| 	init_hardware(); | ||||
| 	init_hardware(command, size); | ||||
| 
 | ||||
| 	mach_sched_init = (void *)dragen2_sched_init; | ||||
| 	mach_tick = dragen2_tick; | ||||
| 	mach_gettimeoffset = dragen2_gettimeoffset; | ||||
| 	mach_reset = dragen2_reset; | ||||
| 	mach_gettod = dragen2_gettod; | ||||
| 	mach_sched_init = (void *) m68328_timer_init; | ||||
| 	mach_tick = m68328_timer_tick; | ||||
| 	mach_gettimeoffset = m68328_timer_gettimeoffset; | ||||
| 	mach_gettod = m68328_timer_gettod; | ||||
| 	mach_reset = m68vz328_reset; | ||||
| } | ||||
| 
 | ||||
| /***************************************************************************/ | ||||
| @ -1,117 +0,0 @@ | ||||
| /*
 | ||||
|  *  linux/arch/m68knommu/platform/68VZ328/ucdimm/config.c | ||||
|  * | ||||
|  *  Copyright (C) 1993 Hamish Macdonald | ||||
|  *  Copyright (C) 1999 D. Jeff Dionne | ||||
|  * | ||||
|  * This file is subject to the terms and conditions of the GNU General Public | ||||
|  * License.  See the file COPYING in the main directory of this archive | ||||
|  * for more details. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| #include <linux/config.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/mm.h> | ||||
| #include <linux/tty.h> | ||||
| #include <linux/console.h> | ||||
| 
 | ||||
| #include <asm/setup.h> | ||||
| #include <asm/system.h> | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/machdep.h> | ||||
| #include <asm/MC68VZ328.h> | ||||
| #include <asm/bootstd.h> | ||||
| 
 | ||||
| void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) | ||||
| { | ||||
| 	/* Restart mode, Enable int, 32KHz, Enable timer */ | ||||
| 	TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||||
| 	/* Set prescaler (Divide 32KHz by 32)*/ | ||||
| 	TPRER = 31; | ||||
| 	/* Set compare register  32Khz / 32 / 10 = 100 */ | ||||
| 	TCMP = 10;                                                               | ||||
| 
 | ||||
| 	request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||||
| } | ||||
| 
 | ||||
| void BSP_tick(void) | ||||
| { | ||||
|   	/* Reset Timer1 */ | ||||
| 	TSTAT &= 0; | ||||
| } | ||||
| 
 | ||||
| unsigned long BSP_gettimeoffset (void) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_gettod (int *yearp, int *monp, int *dayp, | ||||
| 		   int *hourp, int *minp, int *secp) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| int BSP_hwclk(int op, struct hwclk_time *t) | ||||
| { | ||||
| 	if (!op) { | ||||
| 		/* read */ | ||||
| 	} else { | ||||
| 		/* write */ | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int BSP_set_clock_mmss (unsigned long nowtime) | ||||
| { | ||||
| #if 0 | ||||
| 	short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||||
| 
 | ||||
| 	tod->second1 = real_seconds / 10; | ||||
| 	tod->second2 = real_seconds % 10; | ||||
| 	tod->minute1 = real_minutes / 10; | ||||
| 	tod->minute2 = real_minutes % 10; | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void BSP_reset (void) | ||||
| { | ||||
| 	local_irq_disable(); | ||||
| 	asm volatile (" | ||||
| 		moveal #0x10c00000, %a0; | ||||
| 		moveb #0, 0xFFFFF300; | ||||
| 		moveal 0(%a0), %sp; | ||||
| 		moveal 4(%a0), %a0; | ||||
| 		jmp (%a0); | ||||
| 	"); | ||||
| } | ||||
| 
 | ||||
| unsigned char *cs8900a_hwaddr; | ||||
| static int errno; | ||||
| 
 | ||||
| _bsc0(char *, getserialnum) | ||||
| _bsc1(unsigned char *, gethwaddr, int, a) | ||||
| _bsc1(char *, getbenv, char *, a) | ||||
| 
 | ||||
| void config_BSP(char *command, int len) | ||||
| { | ||||
| 	unsigned char *p; | ||||
| 
 | ||||
| 	printk(KERN_INFO "\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); | ||||
| 
 | ||||
| 	printk(KERN_INFO "uCdimm serial string [%s]\n",getserialnum()); | ||||
| 	p = cs8900a_hwaddr = gethwaddr(0); | ||||
| 	printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||
| 		p[0], p[1], p[2], p[3], p[4], p[5]); | ||||
| 	p = getbenv("APPEND"); | ||||
| 	if (p) strcpy(p,command); | ||||
| 	else command[0] = 0; | ||||
|   | ||||
| 	mach_sched_init      = BSP_sched_init; | ||||
| 	mach_tick            = BSP_tick; | ||||
| 	mach_gettimeoffset   = BSP_gettimeoffset; | ||||
| 	mach_gettod          = BSP_gettod; | ||||
| 	mach_reset           = BSP_reset; | ||||
| } | ||||
| @ -80,7 +80,6 @@ fixup_broken_pcnet32(struct pci_dev* dev) | ||||
| 	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { | ||||
| 		dev->vendor = PCI_VENDOR_ID_AMD; | ||||
| 		pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); | ||||
| 		pci_name_device(dev); | ||||
| 	} | ||||
| } | ||||
| DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT,	PCI_ANY_ID,			fixup_broken_pcnet32); | ||||
|  | ||||
| @ -140,12 +140,12 @@ struct platform_device ppc_sys_platform_devices[] = { | ||||
| 	}, | ||||
| 	[MPC10X_UART0] = { | ||||
| 		.name = "serial8250", | ||||
| 		.id	= 0, | ||||
| 		.id	= PLAT8250_DEV_PLATFORM, | ||||
| 		.dev.platform_data = serial_plat_uart0, | ||||
| 	}, | ||||
| 	[MPC10X_UART1] = { | ||||
| 		.name = "serial8250", | ||||
| 		.id	= 1, | ||||
| 		.id	= PLAT8250_DEV_PLATFORM1, | ||||
| 		.dev.platform_data = serial_plat_uart1, | ||||
| 	}, | ||||
| 
 | ||||
|  | ||||
| @ -165,7 +165,7 @@ struct platform_device ppc_sys_platform_devices[] = { | ||||
| 	}, | ||||
| 	[MPC83xx_DUART] = { | ||||
| 		.name = "serial8250", | ||||
| 		.id	= 0, | ||||
| 		.id	= PLAT8250_DEV_PLATFORM, | ||||
| 		.dev.platform_data = serial_platform_data, | ||||
| 	}, | ||||
| 	[MPC83xx_SEC2] = { | ||||
|  | ||||
| @ -282,7 +282,7 @@ struct platform_device ppc_sys_platform_devices[] = { | ||||
| 	}, | ||||
| 	[MPC85xx_DUART] = { | ||||
| 		.name = "serial8250", | ||||
| 		.id	= 0, | ||||
| 		.id	= PLAT8250_DEV_PLATFORM, | ||||
| 		.dev.platform_data = serial_platform_data, | ||||
| 	}, | ||||
| 	[MPC85xx_PERFMON] = { | ||||
|  | ||||
| @ -202,10 +202,9 @@ static void pci_addr_cache_print(struct pci_io_addr_cache *cache) | ||||
| 	while (n) { | ||||
| 		struct pci_io_addr_range *piar; | ||||
| 		piar = rb_entry(n, struct pci_io_addr_range, rb_node); | ||||
| 		printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s %s\n", | ||||
| 		printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s\n", | ||||
| 		       (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt, | ||||
| 		       piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev), | ||||
| 		       pci_pretty_name(piar->pcidev)); | ||||
| 		       piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev)); | ||||
| 		cnt++; | ||||
| 		n = rb_next(n); | ||||
| 	} | ||||
| @ -260,8 +259,8 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev) | ||||
| 
 | ||||
| 	dn = pci_device_to_OF_node(dev); | ||||
| 	if (!dn) { | ||||
| 		printk(KERN_WARNING "PCI: no pci dn found for dev=%s %s\n", | ||||
| 			pci_name(dev), pci_pretty_name(dev)); | ||||
| 		printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n", | ||||
| 			pci_name(dev)); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -269,8 +268,8 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev) | ||||
| 	if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) || | ||||
| 	    dn->eeh_mode & EEH_MODE_NOCHECK) { | ||||
| #ifdef DEBUG | ||||
| 		printk(KERN_INFO "PCI: skip building address cache for=%s %s\n", | ||||
| 		       pci_name(dev), pci_pretty_name(dev)); | ||||
| 		printk(KERN_INFO "PCI: skip building address cache for=%s\n", | ||||
| 		       pci_name(dev)); | ||||
| #endif | ||||
| 		return; | ||||
| 	} | ||||
| @ -447,12 +446,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state) | ||||
| 	 * in light of potential corruption, we can use it here. | ||||
| 	 */ | ||||
| 	if (panic_on_oops) | ||||
| 		panic("EEH: MMIO failure (%d) on device:%s %s\n", reset_state, | ||||
| 		      pci_name(dev), pci_pretty_name(dev)); | ||||
| 		panic("EEH: MMIO failure (%d) on device:%s\n", reset_state, | ||||
| 		      pci_name(dev)); | ||||
| 	else { | ||||
| 		__get_cpu_var(ignored_failures)++; | ||||
| 		printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s %s\n", | ||||
| 		       reset_state, pci_name(dev), pci_pretty_name(dev)); | ||||
| 		printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n", | ||||
| 		       reset_state, pci_name(dev)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -482,8 +481,8 @@ static void eeh_event_handler(void *dummy) | ||||
| 			break; | ||||
| 
 | ||||
| 		printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device " | ||||
| 		       "%s %s\n", event->reset_state, | ||||
| 		       pci_name(event->dev), pci_pretty_name(event->dev)); | ||||
| 		       "%s\n", event->reset_state, | ||||
| 		       pci_name(event->dev)); | ||||
| 
 | ||||
| 		atomic_set(&eeh_fail_count, 0); | ||||
| 		notifier_call_chain (&eeh_notifier_chain, | ||||
| @ -851,8 +850,7 @@ void eeh_add_device_late(struct pci_dev *dev) | ||||
| 		return; | ||||
| 
 | ||||
| #ifdef DEBUG | ||||
| 	printk(KERN_DEBUG "EEH: adding device %s %s\n", pci_name(dev), | ||||
| 	       pci_pretty_name(dev)); | ||||
| 	printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev)); | ||||
| #endif | ||||
| 
 | ||||
| 	pci_addr_cache_insert_device (dev); | ||||
| @ -873,8 +871,7 @@ void eeh_remove_device(struct pci_dev *dev) | ||||
| 
 | ||||
| 	/* Unregister the device with the EEH/PCI address search system */ | ||||
| #ifdef DEBUG | ||||
| 	printk(KERN_DEBUG "EEH: remove device %s %s\n", pci_name(dev), | ||||
| 	       pci_pretty_name(dev)); | ||||
| 	printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev)); | ||||
| #endif | ||||
| 	pci_addr_cache_remove_device(dev); | ||||
| } | ||||
|  | ||||
| @ -264,8 +264,5 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count) | ||||
| 	printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s  ", | ||||
| 			count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor, | ||||
| 			frame, card); | ||||
| 	if (pci_class_name(PciDev->class >> 8) == 0) | ||||
| 		printk("0x%04X\n", (int)(PciDev->class >> 8)); | ||||
| 	else | ||||
| 		printk("%s\n", pci_class_name(PciDev->class >> 8)); | ||||
| 	printk("0x%04X\n", (int)(PciDev->class >> 8)); | ||||
| } | ||||
|  | ||||
| @ -84,7 +84,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev) | ||||
| 	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { | ||||
| 		dev->vendor = PCI_VENDOR_ID_AMD; | ||||
| 		pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); | ||||
| 		pci_name_device(dev); | ||||
| 	} | ||||
| } | ||||
| DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); | ||||
|  | ||||
| @ -1283,7 +1283,7 @@ void __init generic_find_legacy_serial_ports(u64 *physport, | ||||
| 
 | ||||
| static struct platform_device serial_device = { | ||||
| 	.name	= "serial8250", | ||||
| 	.id	= 0, | ||||
| 	.id	= PLAT8250_DEV_PLATFORM, | ||||
| 	.dev	= { | ||||
| 		.platform_data = serial_ports, | ||||
| 	}, | ||||
|  | ||||
| @ -359,134 +359,17 @@ void pcibios_fixup_bus(struct pci_bus *pbus) | ||||
| 	pbus->resource[1] = &pbm->mem_space; | ||||
| } | ||||
| 
 | ||||
| int pci_claim_resource(struct pci_dev *pdev, int resource) | ||||
| struct resource *pcibios_select_root(struct pci_dev *pdev, struct resource *r) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm = pdev->bus->sysdata; | ||||
| 	struct resource *res = &pdev->resource[resource]; | ||||
| 	struct resource *root; | ||||
| 	struct resource *root = NULL; | ||||
| 
 | ||||
| 	if (!pbm) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (res->flags & IORESOURCE_IO) | ||||
| 	if (r->flags & IORESOURCE_IO) | ||||
| 		root = &pbm->io_space; | ||||
| 	else | ||||
| 	if (r->flags & IORESOURCE_MEM) | ||||
| 		root = &pbm->mem_space; | ||||
| 
 | ||||
| 	pbm->parent->resource_adjust(pdev, res, root); | ||||
| 
 | ||||
| 	return request_resource(root, res); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Given the PCI bus a device resides on, try to | ||||
|  * find an acceptable resource allocation for a | ||||
|  * specific device resource.. | ||||
|  */ | ||||
| static int pci_assign_bus_resource(const struct pci_bus *bus, | ||||
| 	struct pci_dev *dev, | ||||
| 	struct resource *res, | ||||
| 	unsigned long size, | ||||
| 	unsigned long min, | ||||
| 	int resno) | ||||
| { | ||||
| 	unsigned int type_mask; | ||||
| 	int i; | ||||
| 
 | ||||
| 	type_mask = IORESOURCE_IO | IORESOURCE_MEM; | ||||
| 	for (i = 0 ; i < 4; i++) { | ||||
| 		struct resource *r = bus->resource[i]; | ||||
| 		if (!r) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* type_mask must match */ | ||||
| 		if ((res->flags ^ r->flags) & type_mask) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* Ok, try it out.. */ | ||||
| 		if (allocate_resource(r, res, size, min, -1, size, NULL, NULL) < 0) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* PCI config space updated by caller.  */ | ||||
| 		return 0; | ||||
| 	} | ||||
| 	return -EBUSY; | ||||
| } | ||||
| 
 | ||||
| int pci_assign_resource(struct pci_dev *pdev, int resource) | ||||
| { | ||||
| 	struct pcidev_cookie *pcp = pdev->sysdata; | ||||
| 	struct pci_pbm_info *pbm = pcp->pbm; | ||||
| 	struct resource *res = &pdev->resource[resource]; | ||||
| 	unsigned long min, size; | ||||
| 	int err; | ||||
| 
 | ||||
| 	if (res->flags & IORESOURCE_IO) | ||||
| 		min = pbm->io_space.start + 0x400UL; | ||||
| 	else | ||||
| 		min = pbm->mem_space.start; | ||||
| 
 | ||||
| 	size = res->end - res->start + 1; | ||||
| 
 | ||||
| 	err = pci_assign_bus_resource(pdev->bus, pdev, res, size, min, resource); | ||||
| 
 | ||||
| 	if (err < 0) { | ||||
| 		printk("PCI: Failed to allocate resource %d for %s\n", | ||||
| 		       resource, pci_name(pdev)); | ||||
| 	} else { | ||||
| 		/* Update PCI config space. */ | ||||
| 		pbm->parent->base_address_update(pdev, resource); | ||||
| 	} | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| /* Sort resources by alignment */ | ||||
| void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||||
| 		struct resource *r; | ||||
| 		struct resource_list *list, *tmp; | ||||
| 		unsigned long r_align; | ||||
| 
 | ||||
| 		r = &dev->resource[i]; | ||||
| 		r_align = r->end - r->start; | ||||
| 		 | ||||
| 		if (!(r->flags) || r->parent) | ||||
| 			continue; | ||||
| 		if (!r_align) { | ||||
| 			printk(KERN_WARNING "PCI: Ignore bogus resource %d " | ||||
| 					    "[%lx:%lx] of %s\n", | ||||
| 					    i, r->start, r->end, pci_name(dev)); | ||||
| 			continue; | ||||
| 		} | ||||
| 		r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; | ||||
| 		for (list = head; ; list = list->next) { | ||||
| 			unsigned long align = 0; | ||||
| 			struct resource_list *ln = list->next; | ||||
| 			int idx; | ||||
| 
 | ||||
| 			if (ln) { | ||||
| 				idx = ln->res - &ln->dev->resource[0]; | ||||
| 				align = (idx < PCI_BRIDGE_RESOURCES) ? | ||||
| 					ln->res->end - ln->res->start + 1 : | ||||
| 					ln->res->start; | ||||
| 			} | ||||
| 			if (r_align > align) { | ||||
| 				tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||||
| 				if (!tmp) | ||||
| 					panic("pdev_sort_resources(): " | ||||
| 					      "kmalloc() failed!\n"); | ||||
| 				tmp->next = ln; | ||||
| 				tmp->res = r; | ||||
| 				tmp->dev = dev; | ||||
| 				list->next = tmp; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return root; | ||||
| } | ||||
| 
 | ||||
| void pcibios_update_irq(struct pci_dev *pdev, int irq) | ||||
|  | ||||
| @ -307,7 +307,7 @@ static unsigned char psycho_pil_table[] = { | ||||
| /*0x32*/15,		/* Power Management		*/ | ||||
| }; | ||||
| 
 | ||||
| static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| static int psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| @ -344,9 +344,9 @@ static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static unsigned int __init psycho_irq_build(struct pci_pbm_info *pbm, | ||||
| 					    struct pci_dev *pdev, | ||||
| 					    unsigned int ino) | ||||
| static unsigned int psycho_irq_build(struct pci_pbm_info *pbm, | ||||
| 				     struct pci_dev *pdev, | ||||
| 				     unsigned int ino) | ||||
| { | ||||
| 	struct ino_bucket *bucket; | ||||
| 	unsigned long imap, iclr; | ||||
| @ -1024,7 +1024,7 @@ static irqreturn_t psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *reg | ||||
| #define PSYCHO_CE_INO		0x2f | ||||
| #define PSYCHO_PCIERR_A_INO	0x30 | ||||
| #define PSYCHO_PCIERR_B_INO	0x31 | ||||
| static void __init psycho_register_error_handlers(struct pci_controller_info *p) | ||||
| static void psycho_register_error_handlers(struct pci_controller_info *p) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ | ||||
| 	unsigned long base = p->pbm_A.controller_regs; | ||||
| @ -1091,15 +1091,15 @@ static void __init psycho_register_error_handlers(struct pci_controller_info *p) | ||||
| } | ||||
| 
 | ||||
| /* PSYCHO boot time probing and initialization. */ | ||||
| static void __init psycho_resource_adjust(struct pci_dev *pdev, | ||||
| 					  struct resource *res, | ||||
| 					  struct resource *root) | ||||
| static void psycho_resource_adjust(struct pci_dev *pdev, | ||||
| 				   struct resource *res, | ||||
| 				   struct resource *root) | ||||
| { | ||||
| 	res->start += root->start; | ||||
| 	res->end += root->start; | ||||
| } | ||||
| 
 | ||||
| static void __init psycho_base_address_update(struct pci_dev *pdev, int resource) | ||||
| static void psycho_base_address_update(struct pci_dev *pdev, int resource) | ||||
| { | ||||
| 	struct pcidev_cookie *pcp = pdev->sysdata; | ||||
| 	struct pci_pbm_info *pbm = pcp->pbm; | ||||
| @ -1144,7 +1144,7 @@ static void __init psycho_base_address_update(struct pci_dev *pdev, int resource | ||||
| 		pci_write_config_dword(pdev, where + 4, 0); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| static void pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	u8 *addr; | ||||
| 
 | ||||
| @ -1161,8 +1161,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| 	pci_config_write8(addr, 64); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_scan_bus(struct pci_controller_info *p, | ||||
| 				struct pci_pbm_info *pbm) | ||||
| static void pbm_scan_bus(struct pci_controller_info *p, | ||||
| 			 struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); | ||||
| 
 | ||||
| @ -1189,7 +1189,7 @@ static void __init pbm_scan_bus(struct pci_controller_info *p, | ||||
| 	pci_setup_busmastering(pbm, pbm->pci_bus); | ||||
| } | ||||
| 
 | ||||
| static void __init psycho_scan_bus(struct pci_controller_info *p) | ||||
| static void psycho_scan_bus(struct pci_controller_info *p) | ||||
| { | ||||
| 	pbm_config_busmastering(&p->pbm_B); | ||||
| 	p->pbm_B.is_66mhz_capable = 0; | ||||
| @ -1204,7 +1204,7 @@ static void __init psycho_scan_bus(struct pci_controller_info *p) | ||||
| 	psycho_register_error_handlers(p); | ||||
| } | ||||
| 
 | ||||
| static void __init psycho_iommu_init(struct pci_controller_info *p) | ||||
| static void psycho_iommu_init(struct pci_controller_info *p) | ||||
| { | ||||
| 	struct pci_iommu *iommu = p->pbm_A.iommu; | ||||
| 	unsigned long tsbbase, i; | ||||
| @ -1327,8 +1327,8 @@ static void psycho_controller_hwinit(struct pci_controller_info *p) | ||||
| 	psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 						   struct pci_pbm_info *pbm) | ||||
| static void pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 					    struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	char *name = pbm->name; | ||||
| 
 | ||||
| @ -1481,7 +1481,7 @@ static void psycho_pbm_init(struct pci_controller_info *p, | ||||
| 
 | ||||
| #define PSYCHO_CONFIGSPACE	0x001000000UL | ||||
| 
 | ||||
| void __init psycho_init(int node, char *model_name) | ||||
| void psycho_init(int node, char *model_name) | ||||
| { | ||||
| 	struct linux_prom64_registers pr_regs[3]; | ||||
| 	struct pci_controller_info *p; | ||||
|  | ||||
| @ -554,7 +554,7 @@ static unsigned char sabre_pil_table[] = { | ||||
| /*0x32*/15,		/* Power Management		*/ | ||||
| }; | ||||
| 
 | ||||
| static int __init sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| static int sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| @ -612,9 +612,9 @@ static void sabre_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_a | ||||
| 	sabre_read(sync_reg); | ||||
| } | ||||
| 
 | ||||
| static unsigned int __init sabre_irq_build(struct pci_pbm_info *pbm, | ||||
| 					   struct pci_dev *pdev, | ||||
| 					   unsigned int ino) | ||||
| static unsigned int sabre_irq_build(struct pci_pbm_info *pbm, | ||||
| 				    struct pci_dev *pdev, | ||||
| 				    unsigned int ino) | ||||
| { | ||||
| 	struct ino_bucket *bucket; | ||||
| 	unsigned long imap, iclr; | ||||
| @ -1009,7 +1009,7 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs | ||||
| #define SABRE_UE_INO		0x2e | ||||
| #define SABRE_CE_INO		0x2f | ||||
| #define SABRE_PCIERR_INO	0x30 | ||||
| static void __init sabre_register_error_handlers(struct pci_controller_info *p) | ||||
| static void sabre_register_error_handlers(struct pci_controller_info *p) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ | ||||
| 	unsigned long base = pbm->controller_regs; | ||||
| @ -1056,9 +1056,9 @@ static void __init sabre_register_error_handlers(struct pci_controller_info *p) | ||||
| 	sabre_write(base + SABRE_PCICTRL, tmp); | ||||
| } | ||||
| 
 | ||||
| static void __init sabre_resource_adjust(struct pci_dev *pdev, | ||||
| 					 struct resource *res, | ||||
| 					 struct resource *root) | ||||
| static void sabre_resource_adjust(struct pci_dev *pdev, | ||||
| 				  struct resource *res, | ||||
| 				  struct resource *root) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm = pdev->bus->sysdata; | ||||
| 	unsigned long base; | ||||
| @ -1072,7 +1072,7 @@ static void __init sabre_resource_adjust(struct pci_dev *pdev, | ||||
| 	res->end += base; | ||||
| } | ||||
| 
 | ||||
| static void __init sabre_base_address_update(struct pci_dev *pdev, int resource) | ||||
| static void sabre_base_address_update(struct pci_dev *pdev, int resource) | ||||
| { | ||||
| 	struct pcidev_cookie *pcp = pdev->sysdata; | ||||
| 	struct pci_pbm_info *pbm = pcp->pbm; | ||||
| @ -1118,7 +1118,7 @@ static void __init sabre_base_address_update(struct pci_dev *pdev, int resource) | ||||
| 		pci_write_config_dword(pdev, where + 4, 0); | ||||
| } | ||||
| 
 | ||||
| static void __init apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus) | ||||
| static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus) | ||||
| { | ||||
| 	struct pci_dev *pdev; | ||||
| 
 | ||||
| @ -1181,7 +1181,7 @@ static struct pcidev_cookie *alloc_bridge_cookie(struct pci_pbm_info *pbm) | ||||
| 	return cookie; | ||||
| } | ||||
| 
 | ||||
| static void __init sabre_scan_bus(struct pci_controller_info *p) | ||||
| static void sabre_scan_bus(struct pci_controller_info *p) | ||||
| { | ||||
| 	static int once; | ||||
| 	struct pci_bus *sabre_bus, *pbus; | ||||
| @ -1262,9 +1262,9 @@ static void __init sabre_scan_bus(struct pci_controller_info *p) | ||||
| 	sabre_register_error_handlers(p); | ||||
| } | ||||
| 
 | ||||
| static void __init sabre_iommu_init(struct pci_controller_info *p, | ||||
| 				    int tsbsize, unsigned long dvma_offset, | ||||
| 				    u32 dma_mask) | ||||
| static void sabre_iommu_init(struct pci_controller_info *p, | ||||
| 			     int tsbsize, unsigned long dvma_offset, | ||||
| 			     u32 dma_mask) | ||||
| { | ||||
| 	struct pci_iommu *iommu = p->pbm_A.iommu; | ||||
| 	unsigned long tsbbase, i, order; | ||||
| @ -1345,8 +1345,8 @@ static void __init sabre_iommu_init(struct pci_controller_info *p, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 						   struct pci_pbm_info *pbm) | ||||
| static void pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 					    struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	char *name = pbm->name; | ||||
| 	unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; | ||||
| @ -1415,7 +1415,7 @@ static void __init pbm_register_toplevel_resources(struct pci_controller_info *p | ||||
| 					    &pbm->mem_space); | ||||
| } | ||||
| 
 | ||||
| static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin) | ||||
| static void sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm; | ||||
| 	char namebuf[128]; | ||||
| @ -1552,7 +1552,7 @@ static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void __init sabre_init(int pnode, char *model_name) | ||||
| void sabre_init(int pnode, char *model_name) | ||||
| { | ||||
| 	struct linux_prom64_registers pr_regs[2]; | ||||
| 	struct pci_controller_info *p; | ||||
|  | ||||
| @ -285,7 +285,7 @@ static unsigned char schizo_pil_table[] = { | ||||
| /*0x3f*/0,		/* Reserved for NewLink		*/ | ||||
| }; | ||||
| 
 | ||||
| static int __init schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| @ -1221,7 +1221,7 @@ static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs * | ||||
|  * PCI bus units of the same Tomatillo.  I still have not really | ||||
|  * figured this out... | ||||
|  */ | ||||
| static void __init tomatillo_register_error_handlers(struct pci_controller_info *p) | ||||
| static void tomatillo_register_error_handlers(struct pci_controller_info *p) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm; | ||||
| 	unsigned int irq; | ||||
| @ -1359,7 +1359,7 @@ static void __init tomatillo_register_error_handlers(struct pci_controller_info | ||||
| 		     (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); | ||||
| } | ||||
| 
 | ||||
| static void __init schizo_register_error_handlers(struct pci_controller_info *p) | ||||
| static void schizo_register_error_handlers(struct pci_controller_info *p) | ||||
| { | ||||
| 	struct pci_pbm_info *pbm; | ||||
| 	unsigned int irq; | ||||
| @ -1505,7 +1505,7 @@ static void __init schizo_register_error_handlers(struct pci_controller_info *p) | ||||
| 		     (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| static void pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	u8 *addr; | ||||
| 
 | ||||
| @ -1522,8 +1522,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | ||||
| 	pci_config_write8(addr, 64); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_scan_bus(struct pci_controller_info *p, | ||||
| 				struct pci_pbm_info *pbm) | ||||
| static void pbm_scan_bus(struct pci_controller_info *p, | ||||
| 			 struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); | ||||
| 
 | ||||
| @ -1550,8 +1550,8 @@ static void __init pbm_scan_bus(struct pci_controller_info *p, | ||||
| 	pci_setup_busmastering(pbm, pbm->pci_bus); | ||||
| } | ||||
| 
 | ||||
| static void __init __schizo_scan_bus(struct pci_controller_info *p, | ||||
| 				     int chip_type) | ||||
| static void __schizo_scan_bus(struct pci_controller_info *p, | ||||
| 			      int chip_type) | ||||
| { | ||||
| 	if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) { | ||||
| 		printk("PCI: Only one PCI bus module of controller found.\n"); | ||||
| @ -1577,17 +1577,17 @@ static void __init __schizo_scan_bus(struct pci_controller_info *p, | ||||
| 		schizo_register_error_handlers(p); | ||||
| } | ||||
| 
 | ||||
| static void __init schizo_scan_bus(struct pci_controller_info *p) | ||||
| static void schizo_scan_bus(struct pci_controller_info *p) | ||||
| { | ||||
| 	__schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO); | ||||
| } | ||||
| 
 | ||||
| static void __init tomatillo_scan_bus(struct pci_controller_info *p) | ||||
| static void tomatillo_scan_bus(struct pci_controller_info *p) | ||||
| { | ||||
| 	__schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO); | ||||
| } | ||||
| 
 | ||||
| static void __init schizo_base_address_update(struct pci_dev *pdev, int resource) | ||||
| static void schizo_base_address_update(struct pci_dev *pdev, int resource) | ||||
| { | ||||
| 	struct pcidev_cookie *pcp = pdev->sysdata; | ||||
| 	struct pci_pbm_info *pbm = pcp->pbm; | ||||
| @ -1632,9 +1632,9 @@ static void __init schizo_base_address_update(struct pci_dev *pdev, int resource | ||||
| 		pci_write_config_dword(pdev, where + 4, 0); | ||||
| } | ||||
| 
 | ||||
| static void __init schizo_resource_adjust(struct pci_dev *pdev, | ||||
| 					  struct resource *res, | ||||
| 					  struct resource *root) | ||||
| static void schizo_resource_adjust(struct pci_dev *pdev, | ||||
| 				   struct resource *res, | ||||
| 				   struct resource *root) | ||||
| { | ||||
| 	res->start += root->start; | ||||
| 	res->end += root->start; | ||||
| @ -1702,8 +1702,8 @@ static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm) | ||||
| 	       pbm->mem_space.start); | ||||
| } | ||||
| 
 | ||||
| static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 						   struct pci_pbm_info *pbm) | ||||
| static void pbm_register_toplevel_resources(struct pci_controller_info *p, | ||||
| 					    struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	pbm->io_space.name = pbm->mem_space.name = pbm->name; | ||||
| 
 | ||||
| @ -1932,7 +1932,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) | ||||
| #define TOMATILLO_PCI_IOC_TDIAG		(0x2250UL) | ||||
| #define TOMATILLO_PCI_IOC_DDIAG		(0x2290UL) | ||||
| 
 | ||||
| static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) | ||||
| static void schizo_pbm_hw_init(struct pci_pbm_info *pbm) | ||||
| { | ||||
| 	u64 tmp; | ||||
| 
 | ||||
| @ -1986,9 +1986,9 @@ static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void __init schizo_pbm_init(struct pci_controller_info *p, | ||||
| 				   int prom_node, u32 portid, | ||||
| 				   int chip_type) | ||||
| static void schizo_pbm_init(struct pci_controller_info *p, | ||||
| 			    int prom_node, u32 portid, | ||||
| 			    int chip_type) | ||||
| { | ||||
| 	struct linux_prom64_registers pr_regs[4]; | ||||
| 	unsigned int busrange[2]; | ||||
| @ -2145,7 +2145,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type) | ||||
| 	return (x == y); | ||||
| } | ||||
| 
 | ||||
| static void __init __schizo_init(int node, char *model_name, int chip_type) | ||||
| static void __schizo_init(int node, char *model_name, int chip_type) | ||||
| { | ||||
| 	struct pci_controller_info *p; | ||||
| 	struct pci_iommu *iommu; | ||||
| @ -2213,17 +2213,17 @@ static void __init __schizo_init(int node, char *model_name, int chip_type) | ||||
| 	schizo_pbm_init(p, node, portid, chip_type); | ||||
| } | ||||
| 
 | ||||
| void __init schizo_init(int node, char *model_name) | ||||
| void schizo_init(int node, char *model_name) | ||||
| { | ||||
| 	__schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO); | ||||
| } | ||||
| 
 | ||||
| void __init schizo_plus_init(int node, char *model_name) | ||||
| void schizo_plus_init(int node, char *model_name) | ||||
| { | ||||
| 	__schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS); | ||||
| } | ||||
| 
 | ||||
| void __init tomatillo_init(int node, char *model_name) | ||||
| void tomatillo_init(int node, char *model_name) | ||||
| { | ||||
| 	__schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO); | ||||
| } | ||||
|  | ||||
| @ -403,12 +403,3 @@ EXPORT_SYMBOL(xor_vis_4); | ||||
| EXPORT_SYMBOL(xor_vis_5); | ||||
| 
 | ||||
| EXPORT_SYMBOL(prom_palette); | ||||
| 
 | ||||
| /* memory barriers */ | ||||
| EXPORT_SYMBOL(mb); | ||||
| EXPORT_SYMBOL(rmb); | ||||
| EXPORT_SYMBOL(wmb); | ||||
| EXPORT_SYMBOL(membar_storeload); | ||||
| EXPORT_SYMBOL(membar_storeload_storestore); | ||||
| EXPORT_SYMBOL(membar_storeload_loadload); | ||||
| EXPORT_SYMBOL(membar_storestore_loadstore); | ||||
|  | ||||
| @ -12,7 +12,7 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \ | ||||
| 	 U1memcpy.o U1copy_from_user.o U1copy_to_user.o \
 | ||||
| 	 U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \
 | ||||
| 	 copy_in_user.o user_fixup.o memmove.o \
 | ||||
| 	 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o mb.o | ||||
| 	 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o | ||||
| 
 | ||||
| lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o | ||||
| lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o | ||||
|  | ||||
| @ -1,73 +0,0 @@ | ||||
| /* mb.S: Out of line memory barriers. | ||||
|  * | ||||
|  * Copyright (C) 2005 David S. Miller (davem@davemloft.net)
 | ||||
|  */ | ||||
| 
 | ||||
| 	/* These are here in an effort to more fully work around | ||||
| 	 * Spitfire Errata #51.  Essentially, if a memory barrier | ||||
| 	 * occurs soon after a mispredicted branch, the chip can stop | ||||
| 	 * executing instructions until a trap occurs.  Therefore, if | ||||
| 	 * interrupts are disabled, the chip can hang forever. | ||||
| 	 * | ||||
| 	 * It used to be believed that the memory barrier had to be | ||||
| 	 * right in the delay slot, but a case has been traced | ||||
| 	 * recently wherein the memory barrier was one instruction | ||||
| 	 * after the branch delay slot and the chip still hung.  The | ||||
| 	 * offending sequence was the following in sym_wakeup_done() | ||||
| 	 * of the sym53c8xx_2 driver: | ||||
| 	 * | ||||
| 	 *	call	sym_ccb_from_dsa, 0 | ||||
| 	 *	 movge	%icc, 0, %l0 | ||||
| 	 *	brz,pn	%o0, .LL1303 | ||||
| 	 *	 mov	%o0, %l2 | ||||
| 	 *	membar	#LoadLoad | ||||
| 	 * | ||||
| 	 * The branch has to be mispredicted for the bug to occur. | ||||
| 	 * Therefore, we put the memory barrier explicitly into a | ||||
| 	 * "branch always, predicted taken" delay slot to avoid the | ||||
| 	 * problem case. | ||||
| 	 */ | ||||
| 
 | ||||
| 	.text | ||||
| 
 | ||||
| 99:	retl | ||||
| 	 nop | ||||
| 
 | ||||
| 	.globl	mb
 | ||||
| mb:	ba,pt	%xcc, 99b | ||||
| 	 membar	#LoadLoad | #LoadStore | #StoreStore | #StoreLoad | ||||
| 	.size	mb, .-mb | ||||
| 
 | ||||
| 	.globl	rmb
 | ||||
| rmb:	ba,pt	%xcc, 99b | ||||
| 	 membar	#LoadLoad | ||||
| 	.size	rmb, .-rmb | ||||
| 
 | ||||
| 	.globl	wmb
 | ||||
| wmb:	ba,pt	%xcc, 99b | ||||
| 	 membar	#StoreStore | ||||
| 	.size	wmb, .-wmb | ||||
| 
 | ||||
| 	.globl	membar_storeload
 | ||||
| membar_storeload: | ||||
| 	ba,pt	%xcc, 99b | ||||
| 	 membar	#StoreLoad | ||||
| 	.size	membar_storeload, .-membar_storeload | ||||
| 
 | ||||
| 	.globl	membar_storeload_storestore
 | ||||
| membar_storeload_storestore: | ||||
| 	ba,pt	%xcc, 99b | ||||
| 	 membar	#StoreLoad | #StoreStore | ||||
| 	.size	membar_storeload_storestore, .-membar_storeload_storestore | ||||
| 
 | ||||
| 	.globl	membar_storeload_loadload
 | ||||
| membar_storeload_loadload: | ||||
| 	ba,pt	%xcc, 99b | ||||
| 	 membar	#StoreLoad | #LoadLoad | ||||
| 	.size	membar_storeload_loadload, .-membar_storeload_loadload | ||||
| 
 | ||||
| 	.globl	membar_storestore_loadstore
 | ||||
| membar_storestore_loadstore: | ||||
| 	ba,pt	%xcc, 99b | ||||
| 	 membar	#StoreStore | #LoadStore | ||||
| 	.size	membar_storestore_loadstore, .-membar_storestore_loadstore | ||||
| @ -16,9 +16,10 @@ | ||||
|  *  -- verify the 13 conditions and do bulk resets | ||||
|  *  -- kill last_pipe and simply do two-state clearing on both pipes | ||||
|  *  -- verify protocol (bulk) from USB descriptors (maybe...) | ||||
|  *  -- highmem and sg | ||||
|  *  -- highmem | ||||
|  *  -- move top_sense and work_bcs into separate allocations (if they survive) | ||||
|  *     for cache purists and esoteric architectures. | ||||
|  *  -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ? | ||||
|  *  -- prune comments, they are too volumnous | ||||
|  *  -- Exterminate P3 printks | ||||
|  *  -- Resove XXX's | ||||
| @ -171,7 +172,7 @@ struct bulk_cs_wrap { | ||||
|  */ | ||||
| struct ub_dev; | ||||
| 
 | ||||
| #define UB_MAX_REQ_SG	1 | ||||
| #define UB_MAX_REQ_SG	4 | ||||
| #define UB_MAX_SECTORS 64 | ||||
| 
 | ||||
| /*
 | ||||
| @ -234,13 +235,10 @@ struct ub_scsi_cmd { | ||||
| 
 | ||||
| 	int stat_count;			/* Retries getting status. */ | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We do not support transfers from highmem pages | ||||
| 	 * because the underlying USB framework does not do what we need. | ||||
| 	 */ | ||||
| 	char *data;			/* Requested buffer */ | ||||
| 	unsigned int len;		/* Requested length */ | ||||
| 	// struct scatterlist sgv[UB_MAX_REQ_SG];
 | ||||
| 	unsigned int current_sg; | ||||
| 	unsigned int nsg;		/* sgv[nsg] */ | ||||
| 	struct scatterlist sgv[UB_MAX_REQ_SG]; | ||||
| 
 | ||||
| 	struct ub_lun *lun; | ||||
| 	void (*done)(struct ub_dev *, struct ub_scsi_cmd *); | ||||
| @ -389,17 +387,18 @@ struct ub_dev { | ||||
| 	struct bulk_cs_wrap work_bcs; | ||||
| 	struct usb_ctrlrequest work_cr; | ||||
| 
 | ||||
| 	int sg_stat[UB_MAX_REQ_SG+1]; | ||||
| 	struct ub_scsi_trace tr; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  */ | ||||
| static void ub_cleanup(struct ub_dev *sc); | ||||
| static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq); | ||||
| static int ub_request_fn_1(struct ub_lun *lun, struct request *rq); | ||||
| static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | ||||
|     struct ub_scsi_cmd *cmd, struct request *rq); | ||||
| static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
|     struct request *rq); | ||||
| static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | ||||
|     struct ub_scsi_cmd *cmd, struct request *rq); | ||||
| static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| static void ub_end_rq(struct request *rq, int uptodate); | ||||
| static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| @ -407,6 +406,7 @@ static void ub_urb_complete(struct urb *urb, struct pt_regs *pt); | ||||
| static void ub_scsi_action(unsigned long _dev); | ||||
| static void ub_scsi_dispatch(struct ub_dev *sc); | ||||
| static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc); | ||||
| static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||||
| @ -500,7 +500,8 @@ static void ub_cmdtr_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, char *page) | ||||
| static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, | ||||
|     char *page) | ||||
| { | ||||
| 	struct usb_interface *intf; | ||||
| 	struct ub_dev *sc; | ||||
| @ -523,6 +524,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, c | ||||
| 	cnt += sprintf(page + cnt, | ||||
| 	    "qlen %d qmax %d\n", | ||||
| 	    sc->cmd_queue.qlen, sc->cmd_queue.qmax); | ||||
| 	cnt += sprintf(page + cnt, | ||||
| 	    "sg %d %d %d %d %d\n", | ||||
| 	    sc->sg_stat[0], | ||||
| 	    sc->sg_stat[1], | ||||
| 	    sc->sg_stat[2], | ||||
| 	    sc->sg_stat[3], | ||||
| 	    sc->sg_stat[4]); | ||||
| 
 | ||||
| 	list_for_each (p, &sc->luns) { | ||||
| 		lun = list_entry(p, struct ub_lun, link); | ||||
| @ -744,20 +752,20 @@ static struct ub_scsi_cmd *ub_cmdq_pop(struct ub_dev *sc) | ||||
|  * The request function is our main entry point | ||||
|  */ | ||||
| 
 | ||||
| static void ub_bd_rq_fn(request_queue_t *q) | ||||
| static void ub_request_fn(request_queue_t *q) | ||||
| { | ||||
| 	struct ub_lun *lun = q->queuedata; | ||||
| 	struct request *rq; | ||||
| 
 | ||||
| 	while ((rq = elv_next_request(q)) != NULL) { | ||||
| 		if (ub_bd_rq_fn_1(lun, rq) != 0) { | ||||
| 		if (ub_request_fn_1(lun, rq) != 0) { | ||||
| 			blk_stop_queue(q); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | ||||
| static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | ||||
| { | ||||
| 	struct ub_dev *sc = lun->udev; | ||||
| 	struct ub_scsi_cmd *cmd; | ||||
| @ -774,9 +782,8 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | ||||
| 	memset(cmd, 0, sizeof(struct ub_scsi_cmd)); | ||||
| 
 | ||||
| 	blkdev_dequeue_request(rq); | ||||
| 
 | ||||
| 	if (blk_pc_request(rq)) { | ||||
| 		rc = ub_cmd_build_packet(sc, cmd, rq); | ||||
| 		rc = ub_cmd_build_packet(sc, lun, cmd, rq); | ||||
| 	} else { | ||||
| 		rc = ub_cmd_build_block(sc, lun, cmd, rq); | ||||
| 	} | ||||
| @ -791,7 +798,7 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | ||||
| 	cmd->back = rq; | ||||
| 
 | ||||
| 	cmd->tag = sc->tagcnt++; | ||||
| 	if ((rc = ub_submit_scsi(sc, cmd)) != 0) { | ||||
| 	if (ub_submit_scsi(sc, cmd) != 0) { | ||||
| 		ub_put_cmd(lun, cmd); | ||||
| 		ub_end_rq(rq, 0); | ||||
| 		return 0; | ||||
| @ -804,58 +811,31 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | ||||
|     struct ub_scsi_cmd *cmd, struct request *rq) | ||||
| { | ||||
| 	int ub_dir; | ||||
| #if 0 /* We use rq->buffer for now */
 | ||||
| 	struct scatterlist *sg; | ||||
| 	int n_elem; | ||||
| #endif | ||||
| 	unsigned int block, nblks; | ||||
| 
 | ||||
| 	if (rq_data_dir(rq) == WRITE) | ||||
| 		ub_dir = UB_DIR_WRITE; | ||||
| 	else | ||||
| 		ub_dir = UB_DIR_READ; | ||||
| 	cmd->dir = ub_dir; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * get scatterlist from block layer | ||||
| 	 */ | ||||
| #if 0 /* We use rq->buffer for now */
 | ||||
| 	sg = &cmd->sgv[0]; | ||||
| 	n_elem = blk_rq_map_sg(q, rq, sg); | ||||
| 	n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]); | ||||
| 	if (n_elem <= 0) { | ||||
| 		ub_put_cmd(lun, cmd); | ||||
| 		ub_end_rq(rq, 0); | ||||
| 		blk_start_queue(q); | ||||
| 		return 0;		/* request with no s/g entries? */ | ||||
| 		printk(KERN_INFO "%s: failed request map (%d)\n", | ||||
| 		    sc->name, n_elem); /* P3 */ | ||||
| 		return -1;		/* request with no s/g entries? */ | ||||
| 	} | ||||
| 
 | ||||
| 	if (n_elem != 1) {		/* Paranoia */ | ||||
| 	if (n_elem > UB_MAX_REQ_SG) {	/* Paranoia */ | ||||
| 		printk(KERN_WARNING "%s: request with %d segments\n", | ||||
| 		    sc->name, n_elem); | ||||
| 		ub_put_cmd(lun, cmd); | ||||
| 		ub_end_rq(rq, 0); | ||||
| 		blk_start_queue(q); | ||||
| 		return 0; | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * XXX Unfortunately, this check does not work. It is quite possible | ||||
| 	 * to get bogus non-null rq->buffer if you allow sg by mistake. | ||||
| 	 */ | ||||
| 	if (rq->buffer == NULL) { | ||||
| 		/*
 | ||||
| 		 * This must not happen if we set the queue right. | ||||
| 		 * The block level must create bounce buffers for us. | ||||
| 		 */ | ||||
| 		static int do_print = 1; | ||||
| 		if (do_print) { | ||||
| 			printk(KERN_WARNING "%s: unmapped block request" | ||||
| 			    " flags 0x%lx sectors %lu\n", | ||||
| 			    sc->name, rq->flags, rq->nr_sectors); | ||||
| 			do_print = 0; | ||||
| 		} | ||||
| 		return -1; | ||||
| 	} | ||||
| 	cmd->nsg = n_elem; | ||||
| 	sc->sg_stat[n_elem]++; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * build the command | ||||
| @ -876,30 +856,15 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | ||||
| 	cmd->cdb[8] = nblks; | ||||
| 	cmd->cdb_len = 10; | ||||
| 
 | ||||
| 	cmd->dir = ub_dir; | ||||
| 	cmd->data = rq->buffer; | ||||
| 	cmd->len = rq->nr_sectors * 512; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
|     struct request *rq) | ||||
| static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | ||||
|     struct ub_scsi_cmd *cmd, struct request *rq) | ||||
| { | ||||
| 
 | ||||
| 	if (rq->data_len != 0 && rq->data == NULL) { | ||||
| 		static int do_print = 1; | ||||
| 		if (do_print) { | ||||
| 			printk(KERN_WARNING "%s: unmapped packet request" | ||||
| 			    " flags 0x%lx length %d\n", | ||||
| 			    sc->name, rq->flags, rq->data_len); | ||||
| 			do_print = 0; | ||||
| 		} | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | ||||
| 	cmd->cdb_len = rq->cmd_len; | ||||
| 	int n_elem; | ||||
| 
 | ||||
| 	if (rq->data_len == 0) { | ||||
| 		cmd->dir = UB_DIR_NONE; | ||||
| @ -908,8 +873,29 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
| 			cmd->dir = UB_DIR_WRITE; | ||||
| 		else | ||||
| 			cmd->dir = UB_DIR_READ; | ||||
| 
 | ||||
| 	} | ||||
| 	cmd->data = rq->data; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * get scatterlist from block layer | ||||
| 	 */ | ||||
| 	n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]); | ||||
| 	if (n_elem < 0) { | ||||
| 		printk(KERN_INFO "%s: failed request map (%d)\n", | ||||
| 		    sc->name, n_elem); /* P3 */ | ||||
| 		return -1; | ||||
| 	} | ||||
| 	if (n_elem > UB_MAX_REQ_SG) {	/* Paranoia */ | ||||
| 		printk(KERN_WARNING "%s: request with %d segments\n", | ||||
| 		    sc->name, n_elem); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	cmd->nsg = n_elem; | ||||
| 	sc->sg_stat[n_elem]++; | ||||
| 
 | ||||
| 	memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | ||||
| 	cmd->cdb_len = rq->cmd_len; | ||||
| 
 | ||||
| 	cmd->len = rq->data_len; | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -919,24 +905,34 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| { | ||||
| 	struct request *rq = cmd->back; | ||||
| 	struct ub_lun *lun = cmd->lun; | ||||
| 	struct gendisk *disk = lun->disk; | ||||
| 	request_queue_t *q = disk->queue; | ||||
| 	int uptodate; | ||||
| 
 | ||||
| 	if (blk_pc_request(rq)) { | ||||
| 		/* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ | ||||
| 		memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); | ||||
| 		rq->sense_len = UB_SENSE_SIZE; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cmd->error == 0) | ||||
| 	if (cmd->error == 0) { | ||||
| 		uptodate = 1; | ||||
| 	else | ||||
| 
 | ||||
| 		if (blk_pc_request(rq)) { | ||||
| 			if (cmd->act_len >= rq->data_len) | ||||
| 				rq->data_len = 0; | ||||
| 			else | ||||
| 				rq->data_len -= cmd->act_len; | ||||
| 		} | ||||
| 	} else { | ||||
| 		uptodate = 0; | ||||
| 
 | ||||
| 		if (blk_pc_request(rq)) { | ||||
| 			/* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ | ||||
| 			memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); | ||||
| 			rq->sense_len = UB_SENSE_SIZE; | ||||
| 			if (sc->top_sense[0] != 0) | ||||
| 				rq->errors = SAM_STAT_CHECK_CONDITION; | ||||
| 			else | ||||
| 				rq->errors = DID_ERROR << 16; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ub_put_cmd(lun, cmd); | ||||
| 	ub_end_rq(rq, uptodate); | ||||
| 	blk_start_queue(q); | ||||
| 	blk_start_queue(lun->disk->queue); | ||||
| } | ||||
| 
 | ||||
| static void ub_end_rq(struct request *rq, int uptodate) | ||||
| @ -1014,7 +1010,7 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| 	sc->last_pipe = sc->send_bulk_pipe; | ||||
| 	usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, | ||||
| 	    bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); | ||||
| 	sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | ||||
| 	sc->work_urb.transfer_flags = 0; | ||||
| 
 | ||||
| 	/* Fill what we shouldn't be filling, because usb-storage did so. */ | ||||
| 	sc->work_urb.actual_length = 0; | ||||
| @ -1103,7 +1099,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| { | ||||
| 	struct urb *urb = &sc->work_urb; | ||||
| 	struct bulk_cs_wrap *bcs; | ||||
| 	int pipe; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	if (atomic_read(&sc->poison)) { | ||||
| @ -1204,38 +1199,13 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| 			goto Bad_End; | ||||
| 		} | ||||
| 
 | ||||
| 		if (cmd->dir == UB_DIR_NONE) { | ||||
| 		if (cmd->dir == UB_DIR_NONE || cmd->nsg < 1) { | ||||
| 			ub_state_stat(sc, cmd); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		UB_INIT_COMPLETION(sc->work_done); | ||||
| 
 | ||||
| 		if (cmd->dir == UB_DIR_READ) | ||||
| 			pipe = sc->recv_bulk_pipe; | ||||
| 		else | ||||
| 			pipe = sc->send_bulk_pipe; | ||||
| 		sc->last_pipe = pipe; | ||||
| 		usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | ||||
| 		    cmd->data, cmd->len, ub_urb_complete, sc); | ||||
| 		sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | ||||
| 		sc->work_urb.actual_length = 0; | ||||
| 		sc->work_urb.error_count = 0; | ||||
| 		sc->work_urb.status = 0; | ||||
| 
 | ||||
| 		if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | ||||
| 			/* XXX Clear stalls */ | ||||
| 			printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||||
| 			ub_complete(&sc->work_done); | ||||
| 			ub_state_done(sc, cmd, rc); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT; | ||||
| 		add_timer(&sc->work_timer); | ||||
| 
 | ||||
| 		cmd->state = UB_CMDST_DATA; | ||||
| 		ub_cmdtr_state(sc, cmd); | ||||
| 		// udelay(125);		// usb-storage has this
 | ||||
| 		ub_data_start(sc, cmd); | ||||
| 
 | ||||
| 	} else if (cmd->state == UB_CMDST_DATA) { | ||||
| 		if (urb->status == -EPIPE) { | ||||
| @ -1257,16 +1227,22 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| 		if (urb->status == -EOVERFLOW) { | ||||
| 			/*
 | ||||
| 			 * A babble? Failure, but we must transfer CSW now. | ||||
| 			 * XXX This is going to end in perpetual babble. Reset. | ||||
| 			 */ | ||||
| 			cmd->error = -EOVERFLOW;	/* A cheap trick... */ | ||||
| 		} else { | ||||
| 			if (urb->status != 0) | ||||
| 				goto Bad_End; | ||||
| 			ub_state_stat(sc, cmd); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (urb->status != 0) | ||||
| 			goto Bad_End; | ||||
| 
 | ||||
| 		cmd->act_len = urb->actual_length; | ||||
| 		cmd->act_len += urb->actual_length; | ||||
| 		ub_cmdtr_act_len(sc, cmd); | ||||
| 
 | ||||
| 		if (++cmd->current_sg < cmd->nsg) { | ||||
| 			ub_data_start(sc, cmd); | ||||
| 			return; | ||||
| 		} | ||||
| 		ub_state_stat(sc, cmd); | ||||
| 
 | ||||
| 	} else if (cmd->state == UB_CMDST_STAT) { | ||||
| @ -1399,6 +1375,46 @@ Bad_End: /* Little Excel is dead */ | ||||
| 	ub_state_done(sc, cmd, -EIO); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Factorization helper for the command state machine: | ||||
|  * Initiate a data segment transfer. | ||||
|  */ | ||||
| static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| { | ||||
| 	struct scatterlist *sg = &cmd->sgv[cmd->current_sg]; | ||||
| 	int pipe; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	UB_INIT_COMPLETION(sc->work_done); | ||||
| 
 | ||||
| 	if (cmd->dir == UB_DIR_READ) | ||||
| 		pipe = sc->recv_bulk_pipe; | ||||
| 	else | ||||
| 		pipe = sc->send_bulk_pipe; | ||||
| 	sc->last_pipe = pipe; | ||||
| 	usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | ||||
| 	    page_address(sg->page) + sg->offset, sg->length, | ||||
| 	    ub_urb_complete, sc); | ||||
| 	sc->work_urb.transfer_flags = 0; | ||||
| 	sc->work_urb.actual_length = 0; | ||||
| 	sc->work_urb.error_count = 0; | ||||
| 	sc->work_urb.status = 0; | ||||
| 
 | ||||
| 	if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | ||||
| 		/* XXX Clear stalls */ | ||||
| 		printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||||
| 		ub_complete(&sc->work_done); | ||||
| 		ub_state_done(sc, cmd, rc); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT; | ||||
| 	add_timer(&sc->work_timer); | ||||
| 
 | ||||
| 	cmd->state = UB_CMDST_DATA; | ||||
| 	ub_cmdtr_state(sc, cmd); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Factorization helper for the command state machine: | ||||
|  * Finish the command. | ||||
| @ -1426,7 +1442,7 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| 	sc->last_pipe = sc->recv_bulk_pipe; | ||||
| 	usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, | ||||
| 	    &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); | ||||
| 	sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | ||||
| 	sc->work_urb.transfer_flags = 0; | ||||
| 	sc->work_urb.actual_length = 0; | ||||
| 	sc->work_urb.error_count = 0; | ||||
| 	sc->work_urb.status = 0; | ||||
| @ -1484,6 +1500,7 @@ static void ub_state_stat_counted(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| { | ||||
| 	struct ub_scsi_cmd *scmd; | ||||
| 	struct scatterlist *sg; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	if (cmd->cdb[0] == REQUEST_SENSE) { | ||||
| @ -1492,12 +1509,17 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||||
| 	} | ||||
| 
 | ||||
| 	scmd = &sc->top_rqs_cmd; | ||||
| 	memset(scmd, 0, sizeof(struct ub_scsi_cmd)); | ||||
| 	scmd->cdb[0] = REQUEST_SENSE; | ||||
| 	scmd->cdb[4] = UB_SENSE_SIZE; | ||||
| 	scmd->cdb_len = 6; | ||||
| 	scmd->dir = UB_DIR_READ; | ||||
| 	scmd->state = UB_CMDST_INIT; | ||||
| 	scmd->data = sc->top_sense; | ||||
| 	scmd->nsg = 1; | ||||
| 	sg = &scmd->sgv[0]; | ||||
| 	sg->page = virt_to_page(sc->top_sense); | ||||
| 	sg->offset = (unsigned int)sc->top_sense & (PAGE_SIZE-1); | ||||
| 	sg->length = UB_SENSE_SIZE; | ||||
| 	scmd->len = UB_SENSE_SIZE; | ||||
| 	scmd->lun = cmd->lun; | ||||
| 	scmd->done = ub_top_sense_done; | ||||
| @ -1541,7 +1563,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
| 
 | ||||
| 	usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | ||||
| 	    (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); | ||||
| 	sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | ||||
| 	sc->work_urb.transfer_flags = 0; | ||||
| 	sc->work_urb.actual_length = 0; | ||||
| 	sc->work_urb.error_count = 0; | ||||
| 	sc->work_urb.status = 0; | ||||
| @ -1560,7 +1582,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | ||||
|  */ | ||||
| static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd) | ||||
| { | ||||
| 	unsigned char *sense = scmd->data; | ||||
| 	unsigned char *sense = sc->top_sense; | ||||
| 	struct ub_scsi_cmd *cmd; | ||||
| 
 | ||||
| 	/*
 | ||||
| @ -1852,6 +1874,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | ||||
|     struct ub_capacity *ret) | ||||
| { | ||||
| 	struct ub_scsi_cmd *cmd; | ||||
| 	struct scatterlist *sg; | ||||
| 	char *p; | ||||
| 	enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 }; | ||||
| 	unsigned long flags; | ||||
| @ -1872,7 +1895,11 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | ||||
| 	cmd->cdb_len = 10; | ||||
| 	cmd->dir = UB_DIR_READ; | ||||
| 	cmd->state = UB_CMDST_INIT; | ||||
| 	cmd->data = p; | ||||
| 	cmd->nsg = 1; | ||||
| 	sg = &cmd->sgv[0]; | ||||
| 	sg->page = virt_to_page(p); | ||||
| 	sg->offset = (unsigned int)p & (PAGE_SIZE-1); | ||||
| 	sg->length = 8; | ||||
| 	cmd->len = 8; | ||||
| 	cmd->lun = lun; | ||||
| 	cmd->done = ub_probe_done; | ||||
| @ -2289,7 +2316,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum) | ||||
| 	disk->driverfs_dev = &sc->intf->dev;	/* XXX Many to one ok? */ | ||||
| 
 | ||||
| 	rc = -ENOMEM; | ||||
| 	if ((q = blk_init_queue(ub_bd_rq_fn, &sc->lock)) == NULL) | ||||
| 	if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) | ||||
| 		goto err_blkqinit; | ||||
| 
 | ||||
| 	disk->queue = q; | ||||
|  | ||||
| @ -429,7 +429,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev) | ||||
| 	struct pci_dev *dev1; | ||||
| 	int i; | ||||
| 	unsigned size = amd64_fetch_size(); | ||||
| 	printk(KERN_INFO "Setting up ULi AGP. \n"); | ||||
| 	printk(KERN_INFO "Setting up ULi AGP.\n"); | ||||
| 	dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0)); | ||||
| 	if (dev1 == NULL) { | ||||
| 		printk(KERN_INFO PFX "Detected a ULi chipset, " | ||||
|  | ||||
| @ -319,7 +319,6 @@ int agp_copy_info(struct agp_bridge_data *bridge, struct agp_kern_info *info) | ||||
| 		info->mode = bridge->mode & ~AGP3_RESERVED_MASK; | ||||
| 	else | ||||
| 		info->mode = bridge->mode & ~AGP2_RESERVED_MASK; | ||||
| 	info->mode = bridge->mode; | ||||
| 	info->aper_base = bridge->gart_bus_addr; | ||||
| 	info->aper_size = agp_return_size(); | ||||
| 	info->max_memory = bridge->max_memory_agp; | ||||
| @ -356,7 +355,7 @@ int agp_bind_memory(struct agp_memory *curr, off_t pg_start) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (curr->is_bound == TRUE) { | ||||
| 		printk (KERN_INFO PFX "memory %p is already bound!\n", curr); | ||||
| 		printk(KERN_INFO PFX "memory %p is already bound!\n", curr); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	if (curr->is_flushed == FALSE) { | ||||
| @ -391,7 +390,7 @@ int agp_unbind_memory(struct agp_memory *curr) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (curr->is_bound != TRUE) { | ||||
| 		printk (KERN_INFO PFX "memory %p was not bound!\n", curr); | ||||
| 		printk(KERN_INFO PFX "memory %p was not bound!\n", curr); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| @ -415,7 +414,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 	u32 tmp; | ||||
| 
 | ||||
| 	if (*requested_mode & AGP2_RESERVED_MASK) { | ||||
| 		printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | ||||
| 		printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | ||||
| 		*requested_mode &= ~AGP2_RESERVED_MASK; | ||||
| 	} | ||||
| 
 | ||||
| @ -423,7 +422,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 	tmp = *requested_mode & 7; | ||||
| 	switch (tmp) { | ||||
| 		case 0: | ||||
| 			printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm); | ||||
| 			printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm); | ||||
| 			*requested_mode |= AGPSTAT2_1X; | ||||
| 			break; | ||||
| 		case 1: | ||||
| @ -493,18 +492,18 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 	u32 tmp; | ||||
| 
 | ||||
| 	if (*requested_mode & AGP3_RESERVED_MASK) { | ||||
| 		printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | ||||
| 		printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | ||||
| 		*requested_mode &= ~AGP3_RESERVED_MASK; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Check the speed bits make sense. */ | ||||
| 	tmp = *requested_mode & 7; | ||||
| 	if (tmp == 0) { | ||||
| 		printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm); | ||||
| 		printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm); | ||||
| 		*requested_mode |= AGPSTAT3_4X; | ||||
| 	} | ||||
| 	if (tmp >= 3) { | ||||
| 		printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4); | ||||
| 		printk(KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4); | ||||
| 		*requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X; | ||||
| 	} | ||||
| 
 | ||||
| @ -533,7 +532,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 		 * AGP2.x 4x -> AGP3.0 4x. | ||||
| 		 */ | ||||
| 		if (*requested_mode & AGPSTAT2_4X) { | ||||
| 			printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", | ||||
| 			printk(KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", | ||||
| 						current->comm, *requested_mode); | ||||
| 			*requested_mode &= ~AGPSTAT2_4X; | ||||
| 			*requested_mode |= AGPSTAT3_4X; | ||||
| @ -544,7 +543,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 		 * but have been passed an AGP 2.x mode. | ||||
| 		 * Convert AGP 1x,2x,4x -> AGP 3.0 4x. | ||||
| 		 */ | ||||
| 		printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", | ||||
| 		printk(KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", | ||||
| 					current->comm, *requested_mode); | ||||
| 		*requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X); | ||||
| 		*requested_mode |= AGPSTAT3_4X; | ||||
| @ -554,13 +553,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 		if (!(*bridge_agpstat & AGPSTAT3_8X)) { | ||||
| 			*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); | ||||
| 			*bridge_agpstat |= AGPSTAT3_4X; | ||||
| 			printk ("%s requested AGPx8 but bridge not capable.\n", current->comm); | ||||
| 			printk(KERN_INFO PFX "%s requested AGPx8 but bridge not capable.\n", current->comm); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (!(*vga_agpstat & AGPSTAT3_8X)) { | ||||
| 			*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); | ||||
| 			*bridge_agpstat |= AGPSTAT3_4X; | ||||
| 			printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm); | ||||
| 			printk(KERN_INFO PFX "%s requested AGPx8 but graphic card not capable.\n", current->comm); | ||||
| 			return; | ||||
| 		} | ||||
| 		/* All set, bridge & device can do AGP x8*/ | ||||
| @ -578,13 +577,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | ||||
| 		if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X)) | ||||
| 			*bridge_agpstat |= AGPSTAT3_4X; | ||||
| 		else { | ||||
| 			printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. " | ||||
| 			printk(KERN_INFO PFX "Badness. Don't know which AGP mode to set. " | ||||
| 							"[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n", | ||||
| 							origbridge, origvga, *bridge_agpstat, *vga_agpstat); | ||||
| 			if (!(*bridge_agpstat & AGPSTAT3_4X)) | ||||
| 				printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); | ||||
| 				printk(KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); | ||||
| 			if (!(*vga_agpstat & AGPSTAT3_4X)) | ||||
| 				printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); | ||||
| 				printk(KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| @ -622,7 +621,7 @@ u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode | ||||
| 	for (;;) { | ||||
| 		device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device); | ||||
| 		if (!device) { | ||||
| 			printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n"); | ||||
| 			printk(KERN_INFO PFX "Couldn't find an AGP VGA controller.\n"); | ||||
| 			return 0; | ||||
| 		} | ||||
| 		cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP); | ||||
| @ -734,7 +733,7 @@ void agp_generic_enable(struct agp_bridge_data *bridge, u32 requested_mode) | ||||
| 		    pci_write_config_dword(bridge->dev, | ||||
| 					bridge->capndx+AGPCTRL, temp); | ||||
| 
 | ||||
| 		    printk (KERN_INFO PFX "Device is in legacy mode," | ||||
| 		    printk(KERN_INFO PFX "Device is in legacy mode," | ||||
| 				" falling back to 2.x\n"); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -1071,5 +1071,9 @@ extern void *drm_calloc(size_t nmemb, size_t size, int area); | ||||
| extern unsigned long drm_core_get_map_ofs(drm_map_t *map); | ||||
| extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); | ||||
| 
 | ||||
| #ifndef pci_pretty_name | ||||
| #define pci_pretty_name(dev) "" | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __KERNEL__ */ | ||||
| #endif | ||||
|  | ||||
| @ -627,7 +627,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev) | ||||
| 
 | ||||
| 	ret = kobject_register(&policy->kobj); | ||||
| 	if (ret) | ||||
| 		goto err_out; | ||||
| 		goto err_out_driver_exit; | ||||
| 
 | ||||
| 	/* set up files for this cpu device */ | ||||
| 	drv_attr = cpufreq_driver->attr; | ||||
| @ -673,6 +673,10 @@ err_out_unregister: | ||||
| 	kobject_unregister(&policy->kobj); | ||||
| 	wait_for_completion(&policy->kobj_unregister); | ||||
| 
 | ||||
| err_out_driver_exit: | ||||
| 	if (cpufreq_driver->exit) | ||||
| 		cpufreq_driver->exit(policy); | ||||
| 
 | ||||
| err_out: | ||||
| 	kfree(policy); | ||||
| 
 | ||||
|  | ||||
| @ -144,6 +144,22 @@ config I2C_I810 | ||||
| 	  This driver can also be built as a module.  If so, the module | ||||
| 	  will be called i2c-i810. | ||||
| 
 | ||||
| config I2C_PXA | ||||
| 	tristate "Intel PXA2XX I2C adapter (EXPERIMENTAL)" | ||||
| 	depends on I2C && EXPERIMENTAL && ARCH_PXA | ||||
| 	help | ||||
| 	  If you have devices in the PXA I2C bus, say yes to this option. | ||||
| 	  This driver can also be built as a module.  If so, the module | ||||
| 	  will be called i2c-pxa. | ||||
| 
 | ||||
| config I2C_PXA_SLAVE | ||||
| 	bool "Intel PXA2XX I2C Slave comms support" | ||||
| 	depends on I2C_PXA | ||||
| 	help | ||||
| 	  Support I2C slave mode communications on the PXA I2C bus.  This | ||||
| 	  is necessary for systems where the PXA may be a target on the | ||||
| 	  I2C bus. | ||||
| 
 | ||||
| config I2C_PIIX4 | ||||
| 	tristate "Intel PIIX4" | ||||
| 	depends on I2C && PCI | ||||
|  | ||||
| @ -28,6 +28,7 @@ obj-$(CONFIG_I2C_PARPORT_LIGHT)	+= i2c-parport-light.o | ||||
| obj-$(CONFIG_I2C_PCA_ISA)	+= i2c-pca-isa.o | ||||
| obj-$(CONFIG_I2C_PIIX4)		+= i2c-piix4.o | ||||
| obj-$(CONFIG_I2C_PROSAVAGE)	+= i2c-prosavage.o | ||||
| obj-$(CONFIG_I2C_PXA)		+= i2c-pxa.o | ||||
| obj-$(CONFIG_I2C_RPXLITE)	+= i2c-rpx.o | ||||
| obj-$(CONFIG_I2C_S3C2410)	+= i2c-s3c2410.o | ||||
| obj-$(CONFIG_I2C_SAVAGE4)	+= i2c-savage4.o | ||||
|  | ||||
							
								
								
									
										1022
									
								
								drivers/i2c/busses/i2c-pxa.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1022
									
								
								drivers/i2c/busses/i2c-pxa.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -937,12 +937,12 @@ static int __devinit mthca_init_one(struct pci_dev *pdev, | ||||
| 		++mthca_version_printed; | ||||
| 	} | ||||
| 
 | ||||
| 	printk(KERN_INFO PFX "Initializing %s (%s)\n", | ||||
| 	       pci_pretty_name(pdev), pci_name(pdev)); | ||||
| 	printk(KERN_INFO PFX "Initializing %s\n", | ||||
| 	       pci_name(pdev)); | ||||
| 
 | ||||
| 	if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) { | ||||
| 		printk(KERN_ERR PFX "%s (%s) has invalid driver data %lx\n", | ||||
| 		       pci_pretty_name(pdev), pci_name(pdev), id->driver_data); | ||||
| 		printk(KERN_ERR PFX "%s has invalid driver data %lx\n", | ||||
| 		       pci_name(pdev), id->driver_data); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -71,8 +71,8 @@ int mthca_reset(struct mthca_dev *mdev) | ||||
| 						bridge)) != NULL) { | ||||
| 			if (bridge->hdr_type    == PCI_HEADER_TYPE_BRIDGE && | ||||
| 			    bridge->subordinate == mdev->pdev->bus) { | ||||
| 				mthca_dbg(mdev, "Found bridge: %s (%s)\n", | ||||
| 					  pci_pretty_name(bridge), pci_name(bridge)); | ||||
| 				mthca_dbg(mdev, "Found bridge: %s\n", | ||||
| 					  pci_name(bridge)); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| @ -83,8 +83,8 @@ int mthca_reset(struct mthca_dev *mdev) | ||||
| 			 * assume we're in no-bridge mode and hope for | ||||
| 			 * the best. | ||||
| 			 */ | ||||
| 			mthca_warn(mdev, "No bridge found for %s (%s)\n", | ||||
| 				  pci_pretty_name(mdev->pdev), pci_name(mdev->pdev)); | ||||
| 			mthca_warn(mdev, "No bridge found for %s\n", | ||||
| 				  pci_name(mdev->pdev)); | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
|  | ||||
| @ -1079,13 +1079,17 @@ static void mmc_setup(struct mmc_host *host) | ||||
| /**
 | ||||
|  *	mmc_detect_change - process change of state on a MMC socket | ||||
|  *	@host: host which changed state. | ||||
|  *	@delay: optional delay to wait before detection (jiffies) | ||||
|  * | ||||
|  *	All we know is that card(s) have been inserted or removed | ||||
|  *	from the socket(s).  We don't know which socket or cards. | ||||
|  */ | ||||
| void mmc_detect_change(struct mmc_host *host) | ||||
| void mmc_detect_change(struct mmc_host *host, unsigned long delay) | ||||
| { | ||||
| 	schedule_work(&host->detect); | ||||
| 	if (delay) | ||||
| 		schedule_delayed_work(&host->detect, delay); | ||||
| 	else | ||||
| 		schedule_work(&host->detect); | ||||
| } | ||||
| 
 | ||||
| EXPORT_SYMBOL(mmc_detect_change); | ||||
| @ -1189,7 +1193,7 @@ int mmc_add_host(struct mmc_host *host) | ||||
| 	ret = mmc_add_host_sysfs(host); | ||||
| 	if (ret == 0) { | ||||
| 		mmc_power_off(host); | ||||
| 		mmc_detect_change(host); | ||||
| 		mmc_detect_change(host, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| @ -1259,7 +1263,7 @@ EXPORT_SYMBOL(mmc_suspend_host); | ||||
|  */ | ||||
| int mmc_resume_host(struct mmc_host *host) | ||||
| { | ||||
| 	mmc_detect_change(host); | ||||
| 	mmc_detect_change(host, 0); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -442,7 +442,7 @@ static void mmci_check_status(unsigned long data) | ||||
| 
 | ||||
| 	status = host->plat->status(mmc_dev(host->mmc)); | ||||
| 	if (status ^ host->oldstat) | ||||
| 		mmc_detect_change(host->mmc); | ||||
| 		mmc_detect_change(host->mmc, 0); | ||||
| 
 | ||||
| 	host->oldstat = status; | ||||
| 	mod_timer(&host->timer, jiffies + HZ); | ||||
|  | ||||
| @ -423,7 +423,9 @@ static void pxamci_dma_irq(int dma, void *devid, struct pt_regs *regs) | ||||
| 
 | ||||
| static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs) | ||||
| { | ||||
| 	mmc_detect_change(devid); | ||||
| 	struct pxamci_host *host = mmc_priv(devid); | ||||
| 
 | ||||
| 	mmc_detect_change(devid, host->pdata->detect_delay); | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1122,7 +1122,7 @@ static void wbsd_detect_card(unsigned long data) | ||||
| 	 | ||||
| 	DBG("Executing card detection\n"); | ||||
| 	 | ||||
| 	mmc_detect_change(host->mmc);	 | ||||
| 	mmc_detect_change(host->mmc, 0);	 | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -1198,7 +1198,7 @@ static void wbsd_tasklet_card(unsigned long param) | ||||
| 		 */ | ||||
| 		spin_unlock(&host->lock); | ||||
| 
 | ||||
| 		mmc_detect_change(host->mmc); | ||||
| 		mmc_detect_change(host->mmc, 0); | ||||
| 	} | ||||
| 	else | ||||
| 		spin_unlock(&host->lock); | ||||
|  | ||||
| @ -14,8 +14,8 @@ | ||||
| 
 | ||||
| #define DRV_MODULE_NAME		"bnx2" | ||||
| #define PFX DRV_MODULE_NAME	": " | ||||
| #define DRV_MODULE_VERSION	"1.2.20" | ||||
| #define DRV_MODULE_RELDATE	"August 22, 2005" | ||||
| #define DRV_MODULE_VERSION	"1.2.21" | ||||
| #define DRV_MODULE_RELDATE	"September 7, 2005" | ||||
| 
 | ||||
| #define RUN_AT(x) (jiffies + (x)) | ||||
| 
 | ||||
| @ -1533,6 +1533,7 @@ bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs) | ||||
| 	struct net_device *dev = dev_instance; | ||||
| 	struct bnx2 *bp = dev->priv; | ||||
| 
 | ||||
| 	prefetch(bp->status_blk); | ||||
| 	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, | ||||
| 		BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | | ||||
| 		BNX2_PCICFG_INT_ACK_CMD_MASK_INT); | ||||
| @ -1558,7 +1559,7 @@ bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs) | ||||
| 	 * When using MSI, the MSI message will always complete after | ||||
| 	 * the status block write. | ||||
| 	 */ | ||||
| 	if ((bp->status_blk->status_idx == bp->last_status_idx) || | ||||
| 	if ((bp->status_blk->status_idx == bp->last_status_idx) && | ||||
| 	    (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & | ||||
| 	     BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) | ||||
| 		return IRQ_NONE; | ||||
|  | ||||
| @ -50,6 +50,7 @@ | ||||
| #endif | ||||
| #include <linux/workqueue.h> | ||||
| #include <linux/crc32.h> | ||||
| #include <linux/prefetch.h> | ||||
| 
 | ||||
| /* Hardware data structures and register definitions automatically
 | ||||
|  * generated from RTL code. Do not modify. | ||||
|  | ||||
| @ -267,7 +267,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self) | ||||
|                       frame, IRDA_USB_SPEED_MTU, | ||||
|                       speed_bulk_callback, self); | ||||
| 	urb->transfer_buffer_length = USB_IRDA_HEADER; | ||||
| 	urb->transfer_flags = URB_ASYNC_UNLINK; | ||||
| 	urb->transfer_flags = 0; | ||||
| 
 | ||||
| 	/* Irq disabled -> GFP_ATOMIC */ | ||||
| 	if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { | ||||
| @ -401,15 +401,12 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | ||||
|                       skb->data, IRDA_SKB_MAX_MTU, | ||||
|                       write_bulk_callback, skb); | ||||
| 	urb->transfer_buffer_length = skb->len; | ||||
| 	/* Note : unlink *must* be Asynchronous because of the code in 
 | ||||
| 	 * irda_usb_net_timeout() -> call in irq - Jean II */ | ||||
| 	urb->transfer_flags = URB_ASYNC_UNLINK; | ||||
| 	/* This flag (URB_ZERO_PACKET) indicates that what we send is not
 | ||||
| 	 * a continuous stream of data but separate packets. | ||||
| 	 * In this case, the USB layer will insert an empty USB frame (TD) | ||||
| 	 * after each of our packets that is exact multiple of the frame size. | ||||
| 	 * This is how the dongle will detect the end of packet - Jean II */ | ||||
| 	urb->transfer_flags |= URB_ZERO_PACKET; | ||||
| 	urb->transfer_flags = URB_ZERO_PACKET; | ||||
| 
 | ||||
| 	/* Generate min turn time. FIXME: can we do better than this? */ | ||||
| 	/* Trying to a turnaround time at this level is trying to measure
 | ||||
| @ -630,8 +627,6 @@ static void irda_usb_net_timeout(struct net_device *netdev) | ||||
| 			 * in completion handler, because urb->status will | ||||
| 			 * be -ENOENT. We will fix that at the next watchdog, | ||||
| 			 * leaving more time to USB to recover... | ||||
| 			 * Also, we are in interrupt, so we need to have | ||||
| 			 * URB_ASYNC_UNLINK to work properly... | ||||
| 			 * Jean II */ | ||||
| 			done = 1; | ||||
| 			break; | ||||
| @ -1008,9 +1003,7 @@ static int irda_usb_net_close(struct net_device *netdev) | ||||
| 		} | ||||
| 	} | ||||
| 	/* Cancel Tx and speed URB - need to be synchronous to avoid races */ | ||||
| 	self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||||
| 	usb_kill_urb(self->tx_urb); | ||||
| 	self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||||
| 	usb_kill_urb(self->speed_urb); | ||||
| 
 | ||||
| 	/* Stop and remove instance of IrLAP */ | ||||
| @ -1521,9 +1514,7 @@ static void irda_usb_disconnect(struct usb_interface *intf) | ||||
| 			usb_kill_urb(self->rx_urb[i]); | ||||
| 		/* Cancel Tx and speed URB.
 | ||||
| 		 * Toggle flags to make sure it's synchronous. */ | ||||
| 		self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||||
| 		usb_kill_urb(self->tx_urb); | ||||
| 		self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||||
| 		usb_kill_urb(self->speed_urb); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -69,14 +69,8 @@ typedef void irqreturn_t; | ||||
| 
 | ||||
| #else /* 2.5 or later */ | ||||
| 
 | ||||
| /* recent 2.5/2.6 stores pci device names at varying places ;-) */ | ||||
| #ifdef CONFIG_PCI_NAMES | ||||
| /* human readable name */ | ||||
| #define PCIDEV_NAME(pdev)	((pdev)->pretty_name) | ||||
| #else | ||||
| /* whatever we get from the associated struct device - bus:slot:dev.fn id */ | ||||
| #define PCIDEV_NAME(pdev)	(pci_name(pdev)) | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -3010,7 +3010,7 @@ static int __init parport_pc_init_superio (int autoirq, int autodma) | ||||
| 	struct pci_dev *pdev = NULL; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) { | ||||
| 	for_each_pci_dev(pdev) { | ||||
| 		id = pci_match_id(parport_pc_pci_tbl, pdev); | ||||
| 		if (id == NULL || id->driver_data >= last_sio) | ||||
| 			continue; | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user