Merge 3.14-rc4 into char-misc-next
We want these fixes here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
				commit
				
					
						35efc5a425
					
				
			
		
					 373 changed files with 3473 additions and 2190 deletions
				
			
		|  | @ -3,8 +3,7 @@ Date:		Nov 2010 | ||||||
| Contact:	Kay Sievers <kay.sievers@vrfy.org> | Contact:	Kay Sievers <kay.sievers@vrfy.org> | ||||||
| Description: | Description: | ||||||
| 		 Shows the list of currently configured | 		 Shows the list of currently configured | ||||||
| 		 tty devices used for the console, | 		 console devices, like 'tty1 ttyS0'. | ||||||
| 		 like 'tty1 ttyS0'. |  | ||||||
| 		 The last entry in the file is the active | 		 The last entry in the file is the active | ||||||
| 		 device connected to /dev/console. | 		 device connected to /dev/console. | ||||||
| 		 The file supports poll() to detect virtual | 		 The file supports poll() to detect virtual | ||||||
|  |  | ||||||
|  | @ -82,7 +82,19 @@ Most of the hard work is done for the driver in the PCI layer.  It simply | ||||||
| has to request that the PCI layer set up the MSI capability for this | has to request that the PCI layer set up the MSI capability for this | ||||||
| device. | device. | ||||||
| 
 | 
 | ||||||
| 4.2.1 pci_enable_msi_range | 4.2.1 pci_enable_msi | ||||||
|  | 
 | ||||||
|  | int pci_enable_msi(struct pci_dev *dev) | ||||||
|  | 
 | ||||||
|  | A successful call allocates ONE interrupt to the device, regardless | ||||||
|  | of how many MSIs the device supports.  The device is switched from | ||||||
|  | pin-based interrupt mode to MSI mode.  The dev->irq number is changed | ||||||
|  | to a new number which represents the message signaled interrupt; | ||||||
|  | consequently, this function should be called before the driver calls | ||||||
|  | request_irq(), because an MSI is delivered via a vector that is | ||||||
|  | different from the vector of a pin-based interrupt. | ||||||
|  | 
 | ||||||
|  | 4.2.2 pci_enable_msi_range | ||||||
| 
 | 
 | ||||||
| int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) | ||||||
| 
 | 
 | ||||||
|  | @ -147,6 +159,11 @@ static int foo_driver_enable_msi(struct pci_dev *pdev, int nvec) | ||||||
| 	return pci_enable_msi_range(pdev, nvec, nvec); | 	return pci_enable_msi_range(pdev, nvec, nvec); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Note, unlike pci_enable_msi_exact() function, which could be also used to | ||||||
|  | enable a particular number of MSI-X interrupts, pci_enable_msi_range() | ||||||
|  | returns either a negative errno or 'nvec' (not negative errno or 0 - as | ||||||
|  | pci_enable_msi_exact() does). | ||||||
|  | 
 | ||||||
| 4.2.1.3 Single MSI mode | 4.2.1.3 Single MSI mode | ||||||
| 
 | 
 | ||||||
| The most notorious example of the request type described above is | The most notorious example of the request type described above is | ||||||
|  | @ -158,7 +175,27 @@ static int foo_driver_enable_single_msi(struct pci_dev *pdev) | ||||||
| 	return pci_enable_msi_range(pdev, 1, 1); | 	return pci_enable_msi_range(pdev, 1, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 4.2.2 pci_disable_msi | Note, unlike pci_enable_msi() function, which could be also used to | ||||||
|  | enable the single MSI mode, pci_enable_msi_range() returns either a | ||||||
|  | negative errno or 1 (not negative errno or 0 - as pci_enable_msi() | ||||||
|  | does). | ||||||
|  | 
 | ||||||
|  | 4.2.3 pci_enable_msi_exact | ||||||
|  | 
 | ||||||
|  | int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||||||
|  | 
 | ||||||
|  | This variation on pci_enable_msi_range() call allows a device driver to | ||||||
|  | request exactly 'nvec' MSIs. | ||||||
|  | 
 | ||||||
|  | If this function returns a negative number, it indicates an error and | ||||||
|  | the driver should not attempt to request any more MSI interrupts for | ||||||
|  | this device. | ||||||
|  | 
 | ||||||
|  | By contrast with pci_enable_msi_range() function, pci_enable_msi_exact() | ||||||
|  | returns zero in case of success, which indicates MSI interrupts have been | ||||||
|  | successfully allocated. | ||||||
|  | 
 | ||||||
|  | 4.2.4 pci_disable_msi | ||||||
| 
 | 
 | ||||||
| void pci_disable_msi(struct pci_dev *dev) | void pci_disable_msi(struct pci_dev *dev) | ||||||
| 
 | 
 | ||||||
|  | @ -172,7 +209,7 @@ on any interrupt for which it previously called request_irq(). | ||||||
| Failure to do so results in a BUG_ON(), leaving the device with | Failure to do so results in a BUG_ON(), leaving the device with | ||||||
| MSI enabled and thus leaking its vector. | MSI enabled and thus leaking its vector. | ||||||
| 
 | 
 | ||||||
| 4.2.3 pci_msi_vec_count | 4.2.4 pci_msi_vec_count | ||||||
| 
 | 
 | ||||||
| int pci_msi_vec_count(struct pci_dev *dev) | int pci_msi_vec_count(struct pci_dev *dev) | ||||||
| 
 | 
 | ||||||
|  | @ -257,8 +294,8 @@ possible, likely up to the limit returned by pci_msix_vec_count() function: | ||||||
| 
 | 
 | ||||||
| static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | ||||||
| { | { | ||||||
| 	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 	return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, | ||||||
| 				    1, nvec); | 				     1, nvec); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Note the value of 'minvec' parameter is 1.  As 'minvec' is inclusive, | Note the value of 'minvec' parameter is 1.  As 'minvec' is inclusive, | ||||||
|  | @ -269,8 +306,8 @@ In this case the function could look like this: | ||||||
| 
 | 
 | ||||||
| static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | ||||||
| { | { | ||||||
| 	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 	return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, | ||||||
| 				    FOO_DRIVER_MINIMUM_NVEC, nvec); | 				     FOO_DRIVER_MINIMUM_NVEC, nvec); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 4.3.1.2 Exact number of MSI-X interrupts | 4.3.1.2 Exact number of MSI-X interrupts | ||||||
|  | @ -282,10 +319,15 @@ parameters: | ||||||
| 
 | 
 | ||||||
| static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | ||||||
| { | { | ||||||
| 	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 	return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, | ||||||
| 				    nvec, nvec); | 				     nvec, nvec); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Note, unlike pci_enable_msix_exact() function, which could be also used to | ||||||
|  | enable a particular number of MSI-X interrupts, pci_enable_msix_range() | ||||||
|  | returns either a negative errno or 'nvec' (not negative errno or 0 - as | ||||||
|  | pci_enable_msix_exact() does). | ||||||
|  | 
 | ||||||
| 4.3.1.3 Specific requirements to the number of MSI-X interrupts | 4.3.1.3 Specific requirements to the number of MSI-X interrupts | ||||||
| 
 | 
 | ||||||
| As noted above, there could be devices that can not operate with just any | As noted above, there could be devices that can not operate with just any | ||||||
|  | @ -332,7 +374,64 @@ Note how pci_enable_msix_range() return value is analized for a fallback - | ||||||
| any error code other than -ENOSPC indicates a fatal error and should not | any error code other than -ENOSPC indicates a fatal error and should not | ||||||
| be retried. | be retried. | ||||||
| 
 | 
 | ||||||
| 4.3.2 pci_disable_msix | 4.3.2 pci_enable_msix_exact | ||||||
|  | 
 | ||||||
|  | int pci_enable_msix_exact(struct pci_dev *dev, | ||||||
|  | 			  struct msix_entry *entries, int nvec) | ||||||
|  | 
 | ||||||
|  | This variation on pci_enable_msix_range() call allows a device driver to | ||||||
|  | request exactly 'nvec' MSI-Xs. | ||||||
|  | 
 | ||||||
|  | If this function returns a negative number, it indicates an error and | ||||||
|  | the driver should not attempt to allocate any more MSI-X interrupts for | ||||||
|  | this device. | ||||||
|  | 
 | ||||||
|  | By contrast with pci_enable_msix_range() function, pci_enable_msix_exact() | ||||||
|  | returns zero in case of success, which indicates MSI-X interrupts have been | ||||||
|  | successfully allocated. | ||||||
|  | 
 | ||||||
|  | Another version of a routine that enables MSI-X mode for a device with | ||||||
|  | specific requirements described in chapter 4.3.1.3 might look like this: | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * Assume 'minvec' and 'maxvec' are non-zero | ||||||
|  |  */ | ||||||
|  | static int foo_driver_enable_msix(struct foo_adapter *adapter, | ||||||
|  | 				  int minvec, int maxvec) | ||||||
|  | { | ||||||
|  | 	int rc; | ||||||
|  | 
 | ||||||
|  | 	minvec = roundup_pow_of_two(minvec); | ||||||
|  | 	maxvec = rounddown_pow_of_two(maxvec); | ||||||
|  | 
 | ||||||
|  | 	if (minvec > maxvec) | ||||||
|  | 		return -ERANGE; | ||||||
|  | 
 | ||||||
|  | retry: | ||||||
|  | 	rc = pci_enable_msix_exact(adapter->pdev, | ||||||
|  | 				   adapter->msix_entries, maxvec); | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	 * -ENOSPC is the only error code allowed to be analyzed | ||||||
|  | 	 */ | ||||||
|  | 	if (rc == -ENOSPC) { | ||||||
|  | 		if (maxvec == 1) | ||||||
|  | 			return -ENOSPC; | ||||||
|  | 
 | ||||||
|  | 		maxvec /= 2; | ||||||
|  | 
 | ||||||
|  | 		if (minvec > maxvec) | ||||||
|  | 			return -ENOSPC; | ||||||
|  | 
 | ||||||
|  | 		goto retry; | ||||||
|  | 	} else if (rc < 0) { | ||||||
|  | 		return rc; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return maxvec; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 4.3.3 pci_disable_msix | ||||||
| 
 | 
 | ||||||
| void pci_disable_msix(struct pci_dev *dev) | void pci_disable_msix(struct pci_dev *dev) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -91,7 +91,7 @@ Boards: | ||||||
|   compatible = "ti,omap3-beagle", "ti,omap3" |   compatible = "ti,omap3-beagle", "ti,omap3" | ||||||
| 
 | 
 | ||||||
| - OMAP3 Tobi with Overo : Commercial expansion board with daughter board | - OMAP3 Tobi with Overo : Commercial expansion board with daughter board | ||||||
|   compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3" |   compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3" | ||||||
| 
 | 
 | ||||||
| - OMAP4 SDP : Software Development Board | - OMAP4 SDP : Software Development Board | ||||||
|   compatible = "ti,omap4-sdp", "ti,omap4430" |   compatible = "ti,omap4-sdp", "ti,omap4430" | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								Documentation/devicetree/bindings/net/sti-dwmac.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Documentation/devicetree/bindings/net/sti-dwmac.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | ||||||
|  | STMicroelectronics SoC DWMAC glue layer controller | ||||||
|  | 
 | ||||||
|  | The device node has following properties. | ||||||
|  | 
 | ||||||
|  | Required properties: | ||||||
|  |  - compatible	: Can be "st,stih415-dwmac", "st,stih416-dwmac" or | ||||||
|  |    "st,stid127-dwmac". | ||||||
|  |  - reg		: Offset of the glue configuration register map in system | ||||||
|  |    configuration regmap pointed by st,syscon property and size. | ||||||
|  | 
 | ||||||
|  |  - reg-names	: Should be "sti-ethconf". | ||||||
|  | 
 | ||||||
|  |  - st,syscon	: Should be phandle to system configuration node which | ||||||
|  |    encompases this glue registers. | ||||||
|  | 
 | ||||||
|  |  - st,tx-retime-src: On STi Parts for Giga bit speeds, 125Mhz clocks can be | ||||||
|  |    wired up in from different sources. One via TXCLK pin and other via CLK_125 | ||||||
|  |    pin. This wiring is totally board dependent. However the retiming glue | ||||||
|  |    logic should be configured accordingly. Possible values for this property | ||||||
|  | 
 | ||||||
|  | 	   "txclk" - if 125Mhz clock is wired up via txclk line. | ||||||
|  | 	   "clk_125" - if 125Mhz clock is wired up via clk_125 line. | ||||||
|  | 
 | ||||||
|  |    This property is only valid for Giga bit setup( GMII, RGMII), and it is | ||||||
|  |    un-used for non-giga bit (MII and RMII) setups. Also note that internal | ||||||
|  |    clockgen can not generate stable 125Mhz clock. | ||||||
|  | 
 | ||||||
|  |  - st,ext-phyclk: This boolean property indicates who is generating the clock | ||||||
|  |   for tx and rx. This property is only valid for RMII case where the clock can | ||||||
|  |   be generated from the MAC or PHY. | ||||||
|  | 
 | ||||||
|  |  - clock-names: should be "sti-ethclk". | ||||||
|  |  - clocks: Should point to ethernet clockgen which can generate phyclk. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Example: | ||||||
|  | 
 | ||||||
|  | ethernet0: dwmac@fe810000 { | ||||||
|  | 	device_type 	= "network"; | ||||||
|  | 	compatible	= "st,stih416-dwmac", "snps,dwmac", "snps,dwmac-3.710"; | ||||||
|  | 	reg 		= <0xfe810000 0x8000>, <0x8bc 0x4>; | ||||||
|  | 	reg-names	= "stmmaceth", "sti-ethconf"; | ||||||
|  | 	interrupts	= <0 133 0>, <0 134 0>, <0 135 0>; | ||||||
|  | 	interrupt-names	= "macirq", "eth_wake_irq", "eth_lpi"; | ||||||
|  | 	phy-mode	= "mii"; | ||||||
|  | 
 | ||||||
|  | 	st,syscon	= <&syscfg_rear>; | ||||||
|  | 
 | ||||||
|  | 	snps,pbl 	= <32>; | ||||||
|  | 	snps,mixed-burst; | ||||||
|  | 
 | ||||||
|  | 	resets		= <&softreset STIH416_ETH0_SOFTRESET>; | ||||||
|  | 	reset-names	= "stmmaceth"; | ||||||
|  | 	pinctrl-0	= <&pinctrl_mii0>; | ||||||
|  | 	pinctrl-names 	= "default"; | ||||||
|  | 	clocks		= <&CLK_S_GMAC0_PHY>; | ||||||
|  | 	clock-names	= "stmmaceth"; | ||||||
|  | }; | ||||||
|  | @ -1,45 +0,0 @@ | ||||||
| The 3Com Etherlink Plus (3c505) driver. |  | ||||||
| 
 |  | ||||||
| This driver now uses DMA.  There is currently no support for PIO operation. |  | ||||||
| The default DMA channel is 6; this is _not_ autoprobed, so you must |  | ||||||
| make sure you configure it correctly.  If loading the driver as a |  | ||||||
| module, you can do this with "modprobe 3c505 dma=n".  If the driver is |  | ||||||
| linked statically into the kernel, you must either use an "ether=" |  | ||||||
| statement on the command line, or change the definition of ELP_DMA in 3c505.h. |  | ||||||
| 
 |  | ||||||
| The driver will warn you if it has to fall back on the compiled in |  | ||||||
| default DMA channel.  |  | ||||||
| 
 |  | ||||||
| If no base address is given at boot time, the driver will autoprobe |  | ||||||
| ports 0x300, 0x280 and 0x310 (in that order).  If no IRQ is given, the driver |  | ||||||
| will try to probe for it. |  | ||||||
| 
 |  | ||||||
| The driver can be used as a loadable module. |  | ||||||
| 
 |  | ||||||
| Theoretically, one instance of the driver can now run multiple cards, |  | ||||||
| in the standard way (when loading a module, say "modprobe 3c505 |  | ||||||
| io=0x300,0x340 irq=10,11 dma=6,7" or whatever).  I have not tested |  | ||||||
| this, though. |  | ||||||
| 
 |  | ||||||
| The driver may now support revision 2 hardware; the dependency on |  | ||||||
| being able to read the host control register has been removed.  This |  | ||||||
| is also untested, since I don't have a suitable card. |  | ||||||
| 
 |  | ||||||
| Known problems: |  | ||||||
|  I still see "DMA upload timed out" messages from time to time.  These |  | ||||||
| seem to be fairly non-fatal though. |  | ||||||
|  The card is old and slow. |  | ||||||
| 
 |  | ||||||
| To do: |  | ||||||
|  Improve probe/setup code |  | ||||||
|  Test multicast and promiscuous operation |  | ||||||
| 
 |  | ||||||
| Authors: |  | ||||||
|  The driver is mainly written by Craig Southeren, email |  | ||||||
|  <craigs@ineluki.apana.org.au>. |  | ||||||
|  Parts of the driver (adapting the driver to 1.1.4+ kernels, |  | ||||||
|  IRQ/address detection, some changes) and this README by |  | ||||||
|  Juha Laiho <jlaiho@ichaos.nullnet.fi>. |  | ||||||
|  DMA mode, more fixes, etc, by Philip Blundell <pjb27@cam.ac.uk> |  | ||||||
|  Multicard support, Software configurable DMA, etc., by |  | ||||||
|  Christopher Collins <ccollins@pcug.org.au> |  | ||||||
							
								
								
									
										15
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								MAINTAINERS
									
										
									
									
									
								
							|  | @ -1860,6 +1860,7 @@ F:	drivers/net/ethernet/broadcom/bnx2x/ | ||||||
| 
 | 
 | ||||||
| BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE | BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE | ||||||
| M:	Christian Daudt <bcm@fixthebug.org> | M:	Christian Daudt <bcm@fixthebug.org> | ||||||
|  | M:	Matt Porter <mporter@linaro.org> | ||||||
| L:	bcm-kernel-feedback-list@broadcom.com | L:	bcm-kernel-feedback-list@broadcom.com | ||||||
| T:	git git://git.github.com/broadcom/bcm11351 | T:	git git://git.github.com/broadcom/bcm11351 | ||||||
| S:	Maintained | S:	Maintained | ||||||
|  | @ -2408,8 +2409,10 @@ F:	tools/power/cpupower/ | ||||||
| 
 | 
 | ||||||
| CPUSETS | CPUSETS | ||||||
| M:	Li Zefan <lizefan@huawei.com> | M:	Li Zefan <lizefan@huawei.com> | ||||||
|  | L:	cgroups@vger.kernel.org | ||||||
| W:	http://www.bullopensource.org/cpuset/ | W:	http://www.bullopensource.org/cpuset/ | ||||||
| W:	http://oss.sgi.com/projects/cpusets/ | W:	http://oss.sgi.com/projects/cpusets/ | ||||||
|  | T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/cgroups/cpusets.txt | F:	Documentation/cgroups/cpusets.txt | ||||||
| F:	include/linux/cpuset.h | F:	include/linux/cpuset.h | ||||||
|  | @ -3324,6 +3327,17 @@ S:	Maintained | ||||||
| F:	include/linux/netfilter_bridge/ | F:	include/linux/netfilter_bridge/ | ||||||
| F:	net/bridge/ | F:	net/bridge/ | ||||||
| 
 | 
 | ||||||
|  | ETHERNET PHY LIBRARY | ||||||
|  | M:	Florian Fainelli <f.fainelli@gmail.com> | ||||||
|  | L:	netdev@vger.kernel.org | ||||||
|  | S:	Maintained | ||||||
|  | F:	include/linux/phy.h | ||||||
|  | F:	include/linux/phy_fixed.h | ||||||
|  | F:	drivers/net/phy/ | ||||||
|  | F:	Documentation/networking/phy.txt | ||||||
|  | F:	drivers/of/of_mdio.c | ||||||
|  | F:	drivers/of/of_net.c | ||||||
|  | 
 | ||||||
| EXT2 FILE SYSTEM | EXT2 FILE SYSTEM | ||||||
| M:	Jan Kara <jack@suse.cz> | M:	Jan Kara <jack@suse.cz> | ||||||
| L:	linux-ext4@vger.kernel.org | L:	linux-ext4@vger.kernel.org | ||||||
|  | @ -9715,7 +9729,6 @@ F:	drivers/xen/*swiotlb* | ||||||
| XFS FILESYSTEM | XFS FILESYSTEM | ||||||
| P:	Silicon Graphics Inc | P:	Silicon Graphics Inc | ||||||
| M:	Dave Chinner <david@fromorbit.com> | M:	Dave Chinner <david@fromorbit.com> | ||||||
| M:	Ben Myers <bpm@sgi.com> |  | ||||||
| M:	xfs@oss.sgi.com | M:	xfs@oss.sgi.com | ||||||
| L:	xfs@oss.sgi.com | L:	xfs@oss.sgi.com | ||||||
| W:	http://oss.sgi.com/projects/xfs | W:	http://oss.sgi.com/projects/xfs | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | ||||||
| VERSION = 3 | VERSION = 3 | ||||||
| PATCHLEVEL = 14 | PATCHLEVEL = 14 | ||||||
| SUBLEVEL = 0 | SUBLEVEL = 0 | ||||||
| EXTRAVERSION = -rc3 | EXTRAVERSION = -rc4 | ||||||
| NAME = Shuffling Zombie Juror | NAME = Shuffling Zombie Juror | ||||||
| 
 | 
 | ||||||
| # *DOCUMENTATION*
 | # *DOCUMENTATION*
 | ||||||
|  |  | ||||||
|  | @ -209,7 +209,8 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ | ||||||
| 	omap3-n900.dtb \
 | 	omap3-n900.dtb \
 | ||||||
| 	omap3-n9.dtb \
 | 	omap3-n9.dtb \
 | ||||||
| 	omap3-n950.dtb \
 | 	omap3-n950.dtb \
 | ||||||
| 	omap3-tobi.dtb \
 | 	omap3-overo-tobi.dtb \
 | ||||||
|  | 	omap3-overo-storm-tobi.dtb \
 | ||||||
| 	omap3-gta04.dtb \
 | 	omap3-gta04.dtb \
 | ||||||
| 	omap3-igep0020.dtb \
 | 	omap3-igep0020.dtb \
 | ||||||
| 	omap3-igep0030.dtb \
 | 	omap3-igep0030.dtb \
 | ||||||
|  |  | ||||||
|  | @ -121,7 +121,7 @@ | ||||||
| 		ti,model = "AM335x-EVMSK"; | 		ti,model = "AM335x-EVMSK"; | ||||||
| 		ti,audio-codec = <&tlv320aic3106>; | 		ti,audio-codec = <&tlv320aic3106>; | ||||||
| 		ti,mcasp-controller = <&mcasp1>; | 		ti,mcasp-controller = <&mcasp1>; | ||||||
| 		ti,codec-clock-rate = <24576000>; | 		ti,codec-clock-rate = <24000000>; | ||||||
| 		ti,audio-routing = | 		ti,audio-routing = | ||||||
| 			"Headphone Jack",       "HPLOUT", | 			"Headphone Jack",       "HPLOUT", | ||||||
| 			"Headphone Jack",       "HPROUT"; | 			"Headphone Jack",       "HPROUT"; | ||||||
|  | @ -256,6 +256,12 @@ | ||||||
| 		>; | 		>; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	mmc1_pins: pinmux_mmc1_pins { | ||||||
|  | 		pinctrl-single,pins = < | ||||||
|  | 			0x160 (PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */ | ||||||
|  | 		>; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	mcasp1_pins: mcasp1_pins { | 	mcasp1_pins: mcasp1_pins { | ||||||
| 		pinctrl-single,pins = < | 		pinctrl-single,pins = < | ||||||
| 			0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ | 			0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ | ||||||
|  | @ -456,6 +462,9 @@ | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| 	vmmc-supply = <&vmmc_reg>; | 	vmmc-supply = <&vmmc_reg>; | ||||||
| 	bus-width = <4>; | 	bus-width = <4>; | ||||||
|  | 	pinctrl-names = "default"; | ||||||
|  | 	pinctrl-0 = <&mmc1_pins>; | ||||||
|  | 	cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| &sham { | &sham { | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ | ||||||
| 		gpio0 = &gpio0; | 		gpio0 = &gpio0; | ||||||
| 		gpio1 = &gpio1; | 		gpio1 = &gpio1; | ||||||
| 		gpio2 = &gpio2; | 		gpio2 = &gpio2; | ||||||
|  | 		eth3 = ð3; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	cpus { | 	cpus { | ||||||
|  | @ -291,7 +292,7 @@ | ||||||
| 				interrupts = <91>; | 				interrupts = <91>; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			ethernet@34000 { | 			eth3: ethernet@34000 { | ||||||
| 				compatible = "marvell,armada-370-neta"; | 				compatible = "marvell,armada-370-neta"; | ||||||
| 				reg = <0x34000 0x4000>; | 				reg = <0x34000 0x4000>; | ||||||
| 				interrupts = <14>; | 				interrupts = <14>; | ||||||
|  |  | ||||||
|  | @ -379,15 +379,6 @@ | ||||||
| 				#clock-cells = <1>; | 				#clock-cells = <1>; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			pmu_intc: pmu-interrupt-ctrl@d0050 { |  | ||||||
| 				compatible = "marvell,dove-pmu-intc"; |  | ||||||
| 				interrupt-controller; |  | ||||||
| 				#interrupt-cells = <1>; |  | ||||||
| 				reg = <0xd0050 0x8>; |  | ||||||
| 				interrupts = <33>; |  | ||||||
| 				marvell,#interrupts = <7>; |  | ||||||
| 			}; |  | ||||||
| 
 |  | ||||||
| 			pinctrl: pin-ctrl@d0200 { | 			pinctrl: pin-ctrl@d0200 { | ||||||
| 				compatible = "marvell,dove-pinctrl"; | 				compatible = "marvell,dove-pinctrl"; | ||||||
| 				reg = <0xd0200 0x10>; | 				reg = <0xd0200 0x10>; | ||||||
|  | @ -610,8 +601,6 @@ | ||||||
| 			rtc: real-time-clock@d8500 { | 			rtc: real-time-clock@d8500 { | ||||||
| 				compatible = "marvell,orion-rtc"; | 				compatible = "marvell,orion-rtc"; | ||||||
| 				reg = <0xd8500 0x20>; | 				reg = <0xd8500 0x20>; | ||||||
| 				interrupt-parent = <&pmu_intc>; |  | ||||||
| 				interrupts = <5>; |  | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			gpio2: gpio-ctrl@e8400 { | 			gpio2: gpio-ctrl@e8400 { | ||||||
|  |  | ||||||
|  | @ -52,12 +52,6 @@ | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	codec: spdif-transmitter { |  | ||||||
| 		compatible = "linux,spdif-dit"; |  | ||||||
| 		pinctrl-names = "default"; |  | ||||||
| 		pinctrl-0 = <&pinctrl_hummingboard_spdif>; |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	sound-spdif { | 	sound-spdif { | ||||||
| 		compatible = "fsl,imx-audio-spdif"; | 		compatible = "fsl,imx-audio-spdif"; | ||||||
| 		model = "imx-spdif"; | 		model = "imx-spdif"; | ||||||
|  | @ -111,7 +105,7 @@ | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		pinctrl_hummingboard_spdif: hummingboard-spdif { | 		pinctrl_hummingboard_spdif: hummingboard-spdif { | ||||||
| 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x1b0b0>; | 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		pinctrl_hummingboard_usbh1_vbus: hummingboard-usbh1-vbus { | 		pinctrl_hummingboard_usbh1_vbus: hummingboard-usbh1-vbus { | ||||||
|  | @ -142,6 +136,8 @@ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| &spdif { | &spdif { | ||||||
|  | 	pinctrl-names = "default"; | ||||||
|  | 	pinctrl-0 = <&pinctrl_hummingboard_spdif>; | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,12 +46,6 @@ | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	codec: spdif-transmitter { |  | ||||||
| 		compatible = "linux,spdif-dit"; |  | ||||||
| 		pinctrl-names = "default"; |  | ||||||
| 		pinctrl-0 = <&pinctrl_cubox_i_spdif>; |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	sound-spdif { | 	sound-spdif { | ||||||
| 		compatible = "fsl,imx-audio-spdif"; | 		compatible = "fsl,imx-audio-spdif"; | ||||||
| 		model = "imx-spdif"; | 		model = "imx-spdif"; | ||||||
|  | @ -89,7 +83,7 @@ | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		pinctrl_cubox_i_spdif: cubox-i-spdif { | 		pinctrl_cubox_i_spdif: cubox-i-spdif { | ||||||
| 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x1b0b0>; | 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { | 		pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { | ||||||
|  | @ -121,6 +115,8 @@ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| &spdif { | &spdif { | ||||||
|  | 	pinctrl-names = "default"; | ||||||
|  | 	pinctrl-0 = <&pinctrl_cubox_i_spdif>; | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ | ||||||
| 		aux-button { | 		aux-button { | ||||||
| 			label = "aux"; | 			label = "aux"; | ||||||
| 			linux,code = <169>; | 			linux,code = <169>; | ||||||
| 			gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; | 			gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; | ||||||
| 			gpio-key,wakeup; | 			gpio-key,wakeup; | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
|  | @ -92,6 +92,8 @@ | ||||||
| 	bmp085@77 { | 	bmp085@77 { | ||||||
| 		compatible = "bosch,bmp085"; | 		compatible = "bosch,bmp085"; | ||||||
| 		reg = <0x77>; | 		reg = <0x77>; | ||||||
|  | 		interrupt-parent = <&gpio4>; | ||||||
|  | 		interrupts = <17 IRQ_TYPE_EDGE_RISING>; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	/* leds */ | 	/* leds */ | ||||||
|  | @ -141,8 +143,8 @@ | ||||||
| 	pinctrl-names = "default"; | 	pinctrl-names = "default"; | ||||||
| 	pinctrl-0 = <&mmc1_pins>; | 	pinctrl-0 = <&mmc1_pins>; | ||||||
| 	vmmc-supply = <&vmmc1>; | 	vmmc-supply = <&vmmc1>; | ||||||
| 	vmmc_aux-supply = <&vsim>; |  | ||||||
| 	bus-width = <4>; | 	bus-width = <4>; | ||||||
|  | 	ti,non-removable; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| &mmc2 { | &mmc2 { | ||||||
|  |  | ||||||
|  | @ -14,5 +14,5 @@ | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	model = "Nokia N9"; | 	model = "Nokia N9"; | ||||||
| 	compatible = "nokia,omap3-n9", "ti,omap3"; | 	compatible = "nokia,omap3-n9", "ti,omap36xx", "ti,omap3"; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| /* | /* | ||||||
|  * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> |  * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> | ||||||
|  * Copyright 2013 Aaro Koskinen <aaro.koskinen@iki.fi> |  * Copyright (C) 2013-2014 Aaro Koskinen <aaro.koskinen@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or modify |  * This program is free software; you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License version 2 (or later) as |  * it under the terms of the GNU General Public License version 2 (or later) as | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	model = "Nokia N900"; | 	model = "Nokia N900"; | ||||||
| 	compatible = "nokia,omap3-n900", "ti,omap3"; | 	compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3"; | ||||||
| 
 | 
 | ||||||
| 	cpus { | 	cpus { | ||||||
| 		cpu@0 { | 		cpu@0 { | ||||||
|  |  | ||||||
|  | @ -14,5 +14,5 @@ | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	model = "Nokia N950"; | 	model = "Nokia N950"; | ||||||
| 	compatible = "nokia,omap3-n950", "ti,omap3"; | 	compatible = "nokia,omap3-n950", "ti,omap36xx", "ti,omap3"; | ||||||
| }; | }; | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-storm-tobi.dts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-storm-tobi.dts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * Tobi expansion board is manufactured by Gumstix Inc. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /dts-v1/; | ||||||
|  | 
 | ||||||
|  | #include "omap36xx.dtsi" | ||||||
|  | #include "omap3-overo-tobi-common.dtsi" | ||||||
|  | 
 | ||||||
|  | / { | ||||||
|  | 	model = "OMAP36xx/AM37xx/DM37xx Gumstix Overo on Tobi"; | ||||||
|  | 	compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap36xx", "ti,omap3"; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | @ -13,9 +13,6 @@ | ||||||
| #include "omap3-overo.dtsi" | #include "omap3-overo.dtsi" | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	model = "TI OMAP3 Gumstix Overo on Tobi"; |  | ||||||
| 	compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3"; |  | ||||||
| 
 |  | ||||||
| 	leds { | 	leds { | ||||||
| 		compatible = "gpio-leds"; | 		compatible = "gpio-leds"; | ||||||
| 		heartbeat { | 		heartbeat { | ||||||
							
								
								
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-tobi.dts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-tobi.dts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * Tobi expansion board is manufactured by Gumstix Inc. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /dts-v1/; | ||||||
|  | 
 | ||||||
|  | #include "omap34xx.dtsi" | ||||||
|  | #include "omap3-overo-tobi-common.dtsi" | ||||||
|  | 
 | ||||||
|  | / { | ||||||
|  | 	model = "OMAP35xx Gumstix Overo on Tobi"; | ||||||
|  | 	compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3430", "ti,omap3"; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | @ -9,9 +9,6 @@ | ||||||
| /* | /* | ||||||
|  * The Gumstix Overo must be combined with an expansion board. |  * The Gumstix Overo must be combined with an expansion board. | ||||||
|  */ |  */ | ||||||
| /dts-v1/; |  | ||||||
| 
 |  | ||||||
| #include "omap34xx.dtsi" |  | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	pwmleds { | 	pwmleds { | ||||||
|  |  | ||||||
|  | @ -57,6 +57,8 @@ | ||||||
| 			resets = <&tegra_car 27>; | 			resets = <&tegra_car 27>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <0>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  | @ -72,6 +74,8 @@ | ||||||
| 			resets = <&tegra_car 26>; | 			resets = <&tegra_car 26>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <1>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
|  | @ -94,6 +94,8 @@ | ||||||
| 			resets = <&tegra_car 27>; | 			resets = <&tegra_car 27>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <0>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  | @ -109,6 +111,8 @@ | ||||||
| 			resets = <&tegra_car 26>; | 			resets = <&tegra_car 26>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <1>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ | ||||||
| 	compatible = "nvidia,cardhu", "nvidia,tegra30"; | 	compatible = "nvidia,cardhu", "nvidia,tegra30"; | ||||||
| 
 | 
 | ||||||
| 	aliases { | 	aliases { | ||||||
| 		rtc0 = "/i2c@7000d000/tps6586x@34"; | 		rtc0 = "/i2c@7000d000/tps65911@2d"; | ||||||
| 		rtc1 = "/rtc@7000e000"; | 		rtc1 = "/rtc@7000e000"; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -170,6 +170,8 @@ | ||||||
| 			resets = <&tegra_car 27>; | 			resets = <&tegra_car 27>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <0>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  | @ -185,6 +187,8 @@ | ||||||
| 			resets = <&tegra_car 26>; | 			resets = <&tegra_car 26>; | ||||||
| 			reset-names = "dc"; | 			reset-names = "dc"; | ||||||
| 
 | 
 | ||||||
|  | 			nvidia,head = <1>; | ||||||
|  | 
 | ||||||
| 			rgb { | 			rgb { | ||||||
| 				status = "disabled"; | 				status = "disabled"; | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| /include/ "tests-phandle.dtsi" |  | ||||||
| /include/ "tests-interrupts.dtsi" |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| /include/ "versatile-ab.dts" | #include <versatile-ab.dts> | ||||||
| 
 | 
 | ||||||
| / { | / { | ||||||
| 	model = "ARM Versatile PB"; | 	model = "ARM Versatile PB"; | ||||||
|  | @ -47,4 +47,4 @@ | ||||||
| 	}; | 	}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /include/ "testcases/tests.dtsi" | #include <testcases.dtsi> | ||||||
|  |  | ||||||
|  | @ -212,6 +212,7 @@ extern void copy_to_user_page(struct vm_area_struct *, struct page *, | ||||||
| static inline void __flush_icache_all(void) | static inline void __flush_icache_all(void) | ||||||
| { | { | ||||||
| 	__flush_icache_preferred(); | 	__flush_icache_preferred(); | ||||||
|  | 	dsb(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -120,13 +120,16 @@ | ||||||
| /*
 | /*
 | ||||||
|  * 2nd stage PTE definitions for LPAE. |  * 2nd stage PTE definitions for LPAE. | ||||||
|  */ |  */ | ||||||
| #define L_PTE_S2_MT_UNCACHED	 (_AT(pteval_t, 0x5) << 2) /* MemAttr[3:0] */ | #define L_PTE_S2_MT_UNCACHED		(_AT(pteval_t, 0x0) << 2) /* strongly ordered */ | ||||||
| #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ | #define L_PTE_S2_MT_WRITETHROUGH	(_AT(pteval_t, 0xa) << 2) /* normal inner write-through */ | ||||||
| #define L_PTE_S2_MT_WRITEBACK	 (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ | #define L_PTE_S2_MT_WRITEBACK		(_AT(pteval_t, 0xf) << 2) /* normal inner write-back */ | ||||||
| #define L_PTE_S2_RDONLY		 (_AT(pteval_t, 1) << 6)   /* HAP[1]   */ | #define L_PTE_S2_MT_DEV_SHARED		(_AT(pteval_t, 0x1) << 2) /* device */ | ||||||
| #define L_PTE_S2_RDWR		 (_AT(pteval_t, 3) << 6)   /* HAP[2:1] */ | #define L_PTE_S2_MT_MASK		(_AT(pteval_t, 0xf) << 2) | ||||||
| 
 | 
 | ||||||
| #define L_PMD_S2_RDWR		 (_AT(pmdval_t, 3) << 6)   /* HAP[2:1] */ | #define L_PTE_S2_RDONLY			(_AT(pteval_t, 1) << 6)   /* HAP[1]   */ | ||||||
|  | #define L_PTE_S2_RDWR			(_AT(pteval_t, 3) << 6)   /* HAP[2:1] */ | ||||||
|  | 
 | ||||||
|  | #define L_PMD_S2_RDWR			(_AT(pmdval_t, 3) << 6)   /* HAP[2:1] */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Hyp-mode PL2 PTE definitions for LPAE. |  * Hyp-mode PL2 PTE definitions for LPAE. | ||||||
|  |  | ||||||
|  | @ -37,18 +37,9 @@ | ||||||
| 
 | 
 | ||||||
| static inline void dsb_sev(void) | static inline void dsb_sev(void) | ||||||
| { | { | ||||||
| #if __LINUX_ARM_ARCH__ >= 7 | 
 | ||||||
| 	__asm__ __volatile__ ( | 	dsb(ishst); | ||||||
| 		"dsb ishst\n" | 	__asm__(SEV); | ||||||
| 		SEV |  | ||||||
| 	); |  | ||||||
| #else |  | ||||||
| 	__asm__ __volatile__ ( |  | ||||||
| 		"mcr p15, 0, %0, c7, c10, 4\n" |  | ||||||
| 		SEV |  | ||||||
| 		: : "r" (0) |  | ||||||
| 	); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -731,7 +731,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc) | ||||||
| 	kernel_data.end     = virt_to_phys(_end - 1); | 	kernel_data.end     = virt_to_phys(_end - 1); | ||||||
| 
 | 
 | ||||||
| 	for_each_memblock(memory, region) { | 	for_each_memblock(memory, region) { | ||||||
| 		res = memblock_virt_alloc_low(sizeof(*res), 0); | 		res = memblock_virt_alloc(sizeof(*res), 0); | ||||||
| 		res->name  = "System RAM"; | 		res->name  = "System RAM"; | ||||||
| 		res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); | 		res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); | ||||||
| 		res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; | 		res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; | ||||||
|  |  | ||||||
|  | @ -101,11 +101,9 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | ||||||
| obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o | ||||||
| obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o | obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o | ||||||
| 
 | 
 | ||||||
| ifeq ($(CONFIG_PM),y) |  | ||||||
| obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o | ||||||
| # i.MX6SL reuses i.MX6Q code
 | # i.MX6SL reuses i.MX6Q code
 | ||||||
| obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o | obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o | ||||||
| endif |  | ||||||
| 
 | 
 | ||||||
| # i.MX5 based machines
 | # i.MX5 based machines
 | ||||||
| obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | ||||||
|  |  | ||||||
|  | @ -144,13 +144,11 @@ void imx6q_set_chicken_bit(void); | ||||||
| void imx_cpu_die(unsigned int cpu); | void imx_cpu_die(unsigned int cpu); | ||||||
| int imx_cpu_kill(unsigned int cpu); | int imx_cpu_kill(unsigned int cpu); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_PM |  | ||||||
| void imx6q_pm_init(void); | void imx6q_pm_init(void); | ||||||
| void imx6q_pm_set_ccm_base(void __iomem *base); | void imx6q_pm_set_ccm_base(void __iomem *base); | ||||||
|  | #ifdef CONFIG_PM | ||||||
| void imx5_pm_init(void); | void imx5_pm_init(void); | ||||||
| #else | #else | ||||||
| static inline void imx6q_pm_init(void) {} |  | ||||||
| static inline void imx6q_pm_set_ccm_base(void __iomem *base) {} |  | ||||||
| static inline void imx5_pm_init(void) {} | static inline void imx5_pm_init(void) {} | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -156,6 +156,7 @@ static struct omap_usb_config nokia770_usb_config __initdata = { | ||||||
| 	.register_dev	= 1, | 	.register_dev	= 1, | ||||||
| 	.hmc_mode	= 16, | 	.hmc_mode	= 16, | ||||||
| 	.pins[0]	= 6, | 	.pins[0]	= 6, | ||||||
|  | 	.extcon		= "tahvo-usb", | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ config SOC_OMAP5 | ||||||
| 	bool "TI OMAP5" | 	bool "TI OMAP5" | ||||||
| 	depends on ARCH_MULTI_V7 | 	depends on ARCH_MULTI_V7 | ||||||
| 	select ARCH_OMAP2PLUS | 	select ARCH_OMAP2PLUS | ||||||
|  | 	select ARCH_HAS_OPP | ||||||
| 	select ARM_CPU_SUSPEND if PM | 	select ARM_CPU_SUSPEND if PM | ||||||
| 	select ARM_GIC | 	select ARM_GIC | ||||||
| 	select CPU_V7 | 	select CPU_V7 | ||||||
|  | @ -63,6 +64,7 @@ config SOC_AM33XX | ||||||
| 	bool "TI AM33XX" | 	bool "TI AM33XX" | ||||||
| 	depends on ARCH_MULTI_V7 | 	depends on ARCH_MULTI_V7 | ||||||
| 	select ARCH_OMAP2PLUS | 	select ARCH_OMAP2PLUS | ||||||
|  | 	select ARCH_HAS_OPP | ||||||
| 	select ARM_CPU_SUSPEND if PM | 	select ARM_CPU_SUSPEND if PM | ||||||
| 	select CPU_V7 | 	select CPU_V7 | ||||||
| 	select MULTI_IRQ_HANDLER | 	select MULTI_IRQ_HANDLER | ||||||
|  | @ -72,6 +74,7 @@ config SOC_AM43XX | ||||||
| 	depends on ARCH_MULTI_V7 | 	depends on ARCH_MULTI_V7 | ||||||
| 	select CPU_V7 | 	select CPU_V7 | ||||||
| 	select ARCH_OMAP2PLUS | 	select ARCH_OMAP2PLUS | ||||||
|  | 	select ARCH_HAS_OPP | ||||||
| 	select MULTI_IRQ_HANDLER | 	select MULTI_IRQ_HANDLER | ||||||
| 	select ARM_GIC | 	select ARM_GIC | ||||||
| 	select MACH_OMAP_GENERIC | 	select MACH_OMAP_GENERIC | ||||||
|  | @ -80,6 +83,7 @@ config SOC_DRA7XX | ||||||
| 	bool "TI DRA7XX" | 	bool "TI DRA7XX" | ||||||
| 	depends on ARCH_MULTI_V7 | 	depends on ARCH_MULTI_V7 | ||||||
| 	select ARCH_OMAP2PLUS | 	select ARCH_OMAP2PLUS | ||||||
|  | 	select ARCH_HAS_OPP | ||||||
| 	select ARM_CPU_SUSPEND if PM | 	select ARM_CPU_SUSPEND if PM | ||||||
| 	select ARM_GIC | 	select ARM_GIC | ||||||
| 	select CPU_V7 | 	select CPU_V7 | ||||||
|  | @ -268,9 +272,6 @@ config MACH_OMAP_3430SDP | ||||||
| 	default y | 	default y | ||||||
| 	select OMAP_PACKAGE_CBB | 	select OMAP_PACKAGE_CBB | ||||||
| 
 | 
 | ||||||
| config MACH_NOKIA_N800 |  | ||||||
|        bool |  | ||||||
| 
 |  | ||||||
| config MACH_NOKIA_N810 | config MACH_NOKIA_N810 | ||||||
|        bool |        bool | ||||||
| 
 | 
 | ||||||
|  | @ -281,7 +282,6 @@ config MACH_NOKIA_N8X0 | ||||||
| 	bool "Nokia N800/N810" | 	bool "Nokia N800/N810" | ||||||
| 	depends on SOC_OMAP2420 | 	depends on SOC_OMAP2420 | ||||||
| 	default y | 	default y | ||||||
| 	select MACH_NOKIA_N800 |  | ||||||
| 	select MACH_NOKIA_N810 | 	select MACH_NOKIA_N810 | ||||||
| 	select MACH_NOKIA_N810_WIMAX | 	select MACH_NOKIA_N810_WIMAX | ||||||
| 	select OMAP_PACKAGE_ZAC | 	select OMAP_PACKAGE_ZAC | ||||||
|  |  | ||||||
|  | @ -1339,7 +1339,7 @@ static void __maybe_unused gpmc_read_timings_dt(struct device_node *np, | ||||||
| 		of_property_read_bool(np, "gpmc,time-para-granularity"); | 		of_property_read_bool(np, "gpmc,time-para-granularity"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_MTD_NAND | #if IS_ENABLED(CONFIG_MTD_NAND) | ||||||
| 
 | 
 | ||||||
| static const char * const nand_xfer_types[] = { | static const char * const nand_xfer_types[] = { | ||||||
| 	[NAND_OMAP_PREFETCH_POLLED]		= "prefetch-polled", | 	[NAND_OMAP_PREFETCH_POLLED]		= "prefetch-polled", | ||||||
|  | @ -1429,7 +1429,7 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_MTD_ONENAND | #if IS_ENABLED(CONFIG_MTD_ONENAND) | ||||||
| static int gpmc_probe_onenand_child(struct platform_device *pdev, | static int gpmc_probe_onenand_child(struct platform_device *pdev, | ||||||
| 				 struct device_node *child) | 				 struct device_node *child) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -179,15 +179,6 @@ static struct map_desc omap34xx_io_desc[] __initdata = { | ||||||
| 		.length		= L4_EMU_34XX_SIZE, | 		.length		= L4_EMU_34XX_SIZE, | ||||||
| 		.type		= MT_DEVICE | 		.type		= MT_DEVICE | ||||||
| 	}, | 	}, | ||||||
| #if defined(CONFIG_DEBUG_LL) &&							\ |  | ||||||
| 	(defined(CONFIG_MACH_OMAP_ZOOM2) || defined(CONFIG_MACH_OMAP_ZOOM3)) |  | ||||||
| 	{ |  | ||||||
| 		.virtual	= ZOOM_UART_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(ZOOM_UART_BASE), |  | ||||||
| 		.length		= SZ_1M, |  | ||||||
| 		.type		= MT_DEVICE |  | ||||||
| 	}, |  | ||||||
| #endif |  | ||||||
| }; | }; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ | ||||||
| #include <linux/mtd/physmap.h> | #include <linux/mtd/physmap.h> | ||||||
| #include <linux/usb/gpio_vbus.h> | #include <linux/usb/gpio_vbus.h> | ||||||
| #include <linux/reboot.h> | #include <linux/reboot.h> | ||||||
|  | #include <linux/regulator/fixed.h> | ||||||
| #include <linux/regulator/max1586.h> | #include <linux/regulator/max1586.h> | ||||||
| #include <linux/slab.h> | #include <linux/slab.h> | ||||||
| #include <linux/i2c/pxa-i2c.h> | #include <linux/i2c/pxa-i2c.h> | ||||||
|  | @ -714,6 +715,10 @@ static struct gpio global_gpios[] = { | ||||||
| 	{ GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, | 	{ GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static struct regulator_consumer_supply fixed_5v0_consumers[] = { | ||||||
|  | 	REGULATOR_SUPPLY("power", "pwm-backlight"), | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| static void __init mioa701_machine_init(void) | static void __init mioa701_machine_init(void) | ||||||
| { | { | ||||||
| 	int rc; | 	int rc; | ||||||
|  | @ -753,6 +758,10 @@ static void __init mioa701_machine_init(void) | ||||||
| 	pxa_set_i2c_info(&i2c_pdata); | 	pxa_set_i2c_info(&i2c_pdata); | ||||||
| 	pxa27x_set_i2c_power_info(NULL); | 	pxa27x_set_i2c_power_info(NULL); | ||||||
| 	pxa_set_camera_info(&mioa701_pxacamera_platform_data); | 	pxa_set_camera_info(&mioa701_pxacamera_platform_data); | ||||||
|  | 
 | ||||||
|  | 	regulator_register_always_on(0, "fixed-5.0V", fixed_5v0_consumers, | ||||||
|  | 				     ARRAY_SIZE(fixed_5v0_consumers), | ||||||
|  | 				     5000000); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void mioa701_machine_exit(void) | static void mioa701_machine_exit(void) | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| #include <linux/cpu_pm.h> | #include <linux/cpu_pm.h> | ||||||
| #include <linux/suspend.h> | #include <linux/suspend.h> | ||||||
| #include <linux/err.h> | #include <linux/err.h> | ||||||
|  | #include <linux/slab.h> | ||||||
| #include <linux/clk/tegra.h> | #include <linux/clk/tegra.h> | ||||||
| 
 | 
 | ||||||
| #include <asm/smp_plat.h> | #include <asm/smp_plat.h> | ||||||
|  |  | ||||||
|  | @ -73,10 +73,20 @@ u32 tegra_uart_config[3] = { | ||||||
| static void __init tegra_init_cache(void) | static void __init tegra_init_cache(void) | ||||||
| { | { | ||||||
| #ifdef CONFIG_CACHE_L2X0 | #ifdef CONFIG_CACHE_L2X0 | ||||||
|  | 	static const struct of_device_id pl310_ids[] __initconst = { | ||||||
|  | 		{ .compatible = "arm,pl310-cache",  }, | ||||||
|  | 		{} | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	struct device_node *np; | ||||||
| 	int ret; | 	int ret; | ||||||
| 	void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | 	void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | ||||||
| 	u32 aux_ctrl, cache_type; | 	u32 aux_ctrl, cache_type; | ||||||
| 
 | 
 | ||||||
|  | 	np = of_find_matching_node(NULL, pl310_ids); | ||||||
|  | 	if (!np) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	cache_type = readl(p + L2X0_CACHE_TYPE); | 	cache_type = readl(p + L2X0_CACHE_TYPE); | ||||||
| 	aux_ctrl = (cache_type & 0x700) << (17-8); | 	aux_ctrl = (cache_type & 0x700) << (17-8); | ||||||
| 	aux_ctrl |= 0x7C400001; | 	aux_ctrl |= 0x7C400001; | ||||||
|  |  | ||||||
|  | @ -1358,7 +1358,7 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | ||||||
| 	*handle = DMA_ERROR_CODE; | 	*handle = DMA_ERROR_CODE; | ||||||
| 	size = PAGE_ALIGN(size); | 	size = PAGE_ALIGN(size); | ||||||
| 
 | 
 | ||||||
| 	if (gfp & GFP_ATOMIC) | 	if (!(gfp & __GFP_WAIT)) | ||||||
| 		return __iommu_alloc_atomic(dev, size, handle); | 		return __iommu_alloc_atomic(dev, size, handle); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ static inline pmd_t *pmd_off_k(unsigned long virt) | ||||||
| 
 | 
 | ||||||
| struct mem_type { | struct mem_type { | ||||||
| 	pteval_t prot_pte; | 	pteval_t prot_pte; | ||||||
|  | 	pteval_t prot_pte_s2; | ||||||
| 	pmdval_t prot_l1; | 	pmdval_t prot_l1; | ||||||
| 	pmdval_t prot_sect; | 	pmdval_t prot_sect; | ||||||
| 	unsigned int domain; | 	unsigned int domain; | ||||||
|  |  | ||||||
|  | @ -232,12 +232,16 @@ __setup("noalign", noalign_setup); | ||||||
| #endif /* ifdef CONFIG_CPU_CP15 / else */ | #endif /* ifdef CONFIG_CPU_CP15 / else */ | ||||||
| 
 | 
 | ||||||
| #define PROT_PTE_DEVICE		L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN | #define PROT_PTE_DEVICE		L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN | ||||||
|  | #define PROT_PTE_S2_DEVICE	PROT_PTE_DEVICE | ||||||
| #define PROT_SECT_DEVICE	PMD_TYPE_SECT|PMD_SECT_AP_WRITE | #define PROT_SECT_DEVICE	PMD_TYPE_SECT|PMD_SECT_AP_WRITE | ||||||
| 
 | 
 | ||||||
| static struct mem_type mem_types[] = { | static struct mem_type mem_types[] = { | ||||||
| 	[MT_DEVICE] = {		  /* Strongly ordered / ARMv6 shared device */ | 	[MT_DEVICE] = {		  /* Strongly ordered / ARMv6 shared device */ | ||||||
| 		.prot_pte	= PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | | 		.prot_pte	= PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | | ||||||
| 				  L_PTE_SHARED, | 				  L_PTE_SHARED, | ||||||
|  | 		.prot_pte_s2	= s2_policy(PROT_PTE_S2_DEVICE) | | ||||||
|  | 				  s2_policy(L_PTE_S2_MT_DEV_SHARED) | | ||||||
|  | 				  L_PTE_SHARED, | ||||||
| 		.prot_l1	= PMD_TYPE_TABLE, | 		.prot_l1	= PMD_TYPE_TABLE, | ||||||
| 		.prot_sect	= PROT_SECT_DEVICE | PMD_SECT_S, | 		.prot_sect	= PROT_SECT_DEVICE | PMD_SECT_S, | ||||||
| 		.domain		= DOMAIN_IO, | 		.domain		= DOMAIN_IO, | ||||||
|  | @ -508,7 +512,8 @@ static void __init build_mem_type_table(void) | ||||||
| 	cp = &cache_policies[cachepolicy]; | 	cp = &cache_policies[cachepolicy]; | ||||||
| 	vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; | 	vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; | ||||||
| 	s2_pgprot = cp->pte_s2; | 	s2_pgprot = cp->pte_s2; | ||||||
| 	hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte; | 	hyp_device_pgprot = mem_types[MT_DEVICE].prot_pte; | ||||||
|  | 	s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2; | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * ARMv6 and above have extended page tables. | 	 * ARMv6 and above have extended page tables. | ||||||
|  |  | ||||||
|  | @ -208,7 +208,6 @@ __v6_setup: | ||||||
| 	mcr	p15, 0, r0, c7, c14, 0		@ clean+invalidate D cache
 | 	mcr	p15, 0, r0, c7, c14, 0		@ clean+invalidate D cache
 | ||||||
| 	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
 | 	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
 | ||||||
| 	mcr	p15, 0, r0, c7, c15, 0		@ clean+invalidate cache
 | 	mcr	p15, 0, r0, c7, c15, 0		@ clean+invalidate cache
 | ||||||
| 	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer
 |  | ||||||
| #ifdef CONFIG_MMU | #ifdef CONFIG_MMU | ||||||
| 	mcr	p15, 0, r0, c8, c7, 0		@ invalidate I + D TLBs
 | 	mcr	p15, 0, r0, c8, c7, 0		@ invalidate I + D TLBs
 | ||||||
| 	mcr	p15, 0, r0, c2, c0, 2		@ TTB control register
 | 	mcr	p15, 0, r0, c2, c0, 2		@ TTB control register
 | ||||||
|  | @ -218,6 +217,8 @@ __v6_setup: | ||||||
| 	ALT_UP(orr	r8, r8, #TTB_FLAGS_UP) | 	ALT_UP(orr	r8, r8, #TTB_FLAGS_UP) | ||||||
| 	mcr	p15, 0, r8, c2, c0, 1		@ load TTB1
 | 	mcr	p15, 0, r8, c2, c0, 1		@ load TTB1
 | ||||||
| #endif /* CONFIG_MMU */ | #endif /* CONFIG_MMU */ | ||||||
|  | 	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer and
 | ||||||
|  | 						@ complete invalidations
 | ||||||
| 	adr	r5, v6_crval | 	adr	r5, v6_crval | ||||||
| 	ldmia	r5, {r5, r6} | 	ldmia	r5, {r5, r6} | ||||||
|  ARM_BE8(orr	r6, r6, #1 << 25)		@ big-endian page tables
 |  ARM_BE8(orr	r6, r6, #1 << 25)		@ big-endian page tables
 | ||||||
|  |  | ||||||
|  | @ -351,7 +351,6 @@ __v7_setup: | ||||||
| 
 | 
 | ||||||
| 4:	mov	r10, #0 | 4:	mov	r10, #0 | ||||||
| 	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate
 | 	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate
 | ||||||
| 	dsb |  | ||||||
| #ifdef CONFIG_MMU | #ifdef CONFIG_MMU | ||||||
| 	mcr	p15, 0, r10, c8, c7, 0		@ invalidate I + D TLBs
 | 	mcr	p15, 0, r10, c8, c7, 0		@ invalidate I + D TLBs
 | ||||||
| 	v7_ttb_setup r10, r4, r8, r5		@ TTBCR, TTBRx setup
 | 	v7_ttb_setup r10, r4, r8, r5		@ TTBCR, TTBRx setup
 | ||||||
|  | @ -360,6 +359,7 @@ __v7_setup: | ||||||
| 	mcr	p15, 0, r5, c10, c2, 0		@ write PRRR
 | 	mcr	p15, 0, r5, c10, c2, 0		@ write PRRR
 | ||||||
| 	mcr	p15, 0, r6, c10, c2, 1		@ write NMRR
 | 	mcr	p15, 0, r6, c10, c2, 1		@ write NMRR
 | ||||||
| #endif | #endif | ||||||
|  | 	dsb					@ Complete invalidations
 | ||||||
| #ifndef CONFIG_ARM_THUMBEE | #ifndef CONFIG_ARM_THUMBEE | ||||||
| 	mrc	p15, 0, r0, c0, c1, 0		@ read ID_PFR0 for ThumbEE
 | 	mrc	p15, 0, r0, c0, c1, 0		@ read ID_PFR0 for ThumbEE
 | ||||||
| 	and	r0, r0, #(0xf << 12)		@ ThumbEE enabled field
 | 	and	r0, r0, #(0xf << 12)		@ ThumbEE enabled field
 | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ all: uImage vmlinux.elf | ||||||
| 
 | 
 | ||||||
| KBUILD_DEFCONFIG	:= atstk1002_defconfig | KBUILD_DEFCONFIG	:= atstk1002_defconfig | ||||||
| 
 | 
 | ||||||
| KBUILD_CFLAGS	+= -pipe -fno-builtin -mno-pic | KBUILD_CFLAGS	+= -pipe -fno-builtin -mno-pic -D__linux__ | ||||||
| KBUILD_AFLAGS	+= -mrelax -mno-pic | KBUILD_AFLAGS	+= -mrelax -mno-pic | ||||||
| KBUILD_CFLAGS_MODULE += -mno-relax | KBUILD_CFLAGS_MODULE += -mno-relax | ||||||
| LDFLAGS_vmlinux	+= --relax | LDFLAGS_vmlinux	+= --relax | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| #define FRAM_VERSION	"1.0" | #define FRAM_VERSION	"1.0" | ||||||
| 
 | 
 | ||||||
| #include <linux/miscdevice.h> | #include <linux/miscdevice.h> | ||||||
|  | #include <linux/module.h> | ||||||
| #include <linux/proc_fs.h> | #include <linux/proc_fs.h> | ||||||
| #include <linux/mm.h> | #include <linux/mm.h> | ||||||
| #include <linux/io.h> | #include <linux/io.h> | ||||||
|  |  | ||||||
|  | @ -17,5 +17,6 @@ generic-y       += scatterlist.h | ||||||
| generic-y       += sections.h | generic-y       += sections.h | ||||||
| generic-y       += topology.h | generic-y       += topology.h | ||||||
| generic-y	+= trace_clock.h | generic-y	+= trace_clock.h | ||||||
|  | generic-y += vga.h | ||||||
| generic-y       += xor.h | generic-y       += xor.h | ||||||
| generic-y	+= hash.h | generic-y	+= hash.h | ||||||
|  |  | ||||||
|  | @ -295,6 +295,8 @@ extern void __iounmap(void __iomem *addr); | ||||||
| #define iounmap(addr)				\ | #define iounmap(addr)				\ | ||||||
| 	__iounmap(addr) | 	__iounmap(addr) | ||||||
| 
 | 
 | ||||||
|  | #define ioremap_wc ioremap_nocache | ||||||
|  | 
 | ||||||
| #define cached(addr) P1SEGADDR(addr) | #define cached(addr) P1SEGADDR(addr) | ||||||
| #define uncached(addr) P2SEGADDR(addr) | #define uncached(addr) P2SEGADDR(addr) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -172,10 +172,20 @@ struct eeh_ops { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern struct eeh_ops *eeh_ops; | extern struct eeh_ops *eeh_ops; | ||||||
| extern int eeh_subsystem_enabled; | extern bool eeh_subsystem_enabled; | ||||||
| extern raw_spinlock_t confirm_error_lock; | extern raw_spinlock_t confirm_error_lock; | ||||||
| extern int eeh_probe_mode; | extern int eeh_probe_mode; | ||||||
| 
 | 
 | ||||||
|  | static inline bool eeh_enabled(void) | ||||||
|  | { | ||||||
|  | 	return eeh_subsystem_enabled; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void eeh_set_enable(bool mode) | ||||||
|  | { | ||||||
|  | 	eeh_subsystem_enabled = mode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define EEH_PROBE_MODE_DEV	(1<<0)	/* From PCI device	*/ | #define EEH_PROBE_MODE_DEV	(1<<0)	/* From PCI device	*/ | ||||||
| #define EEH_PROBE_MODE_DEVTREE	(1<<1)	/* From device tree	*/ | #define EEH_PROBE_MODE_DEVTREE	(1<<1)	/* From device tree	*/ | ||||||
| 
 | 
 | ||||||
|  | @ -246,7 +256,7 @@ void eeh_remove_device(struct pci_dev *); | ||||||
|  * If this macro yields TRUE, the caller relays to eeh_check_failure() |  * If this macro yields TRUE, the caller relays to eeh_check_failure() | ||||||
|  * which does further tests out of line. |  * which does further tests out of line. | ||||||
|  */ |  */ | ||||||
| #define EEH_POSSIBLE_ERROR(val, type)	((val) == (type)~0 && eeh_subsystem_enabled) | #define EEH_POSSIBLE_ERROR(val, type)	((val) == (type)~0 && eeh_enabled()) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Reads from a device which has been isolated by EEH will return |  * Reads from a device which has been isolated by EEH will return | ||||||
|  | @ -257,6 +267,13 @@ void eeh_remove_device(struct pci_dev *); | ||||||
| 
 | 
 | ||||||
| #else /* !CONFIG_EEH */ | #else /* !CONFIG_EEH */ | ||||||
| 
 | 
 | ||||||
|  | static inline bool eeh_enabled(void) | ||||||
|  | { | ||||||
|  |         return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void eeh_set_enable(bool mode) { } | ||||||
|  | 
 | ||||||
| static inline int eeh_init(void) | static inline int eeh_init(void) | ||||||
| { | { | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|  | @ -127,7 +127,7 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | ||||||
| 					    unsigned long addr, pte_t *ptep) | 					    unsigned long addr, pte_t *ptep) | ||||||
| { | { | ||||||
| #ifdef CONFIG_PPC64 | #ifdef CONFIG_PPC64 | ||||||
| 	return __pte(pte_update(mm, addr, ptep, ~0UL, 1)); | 	return __pte(pte_update(mm, addr, ptep, ~0UL, 0, 1)); | ||||||
| #else | #else | ||||||
| 	return __pte(pte_update(ptep, ~0UL, 0)); | 	return __pte(pte_update(ptep, ~0UL, 0)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -195,6 +195,7 @@ extern void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | ||||||
| static inline unsigned long pte_update(struct mm_struct *mm, | static inline unsigned long pte_update(struct mm_struct *mm, | ||||||
| 				       unsigned long addr, | 				       unsigned long addr, | ||||||
| 				       pte_t *ptep, unsigned long clr, | 				       pte_t *ptep, unsigned long clr, | ||||||
|  | 				       unsigned long set, | ||||||
| 				       int huge) | 				       int huge) | ||||||
| { | { | ||||||
| #ifdef PTE_ATOMIC_UPDATES | #ifdef PTE_ATOMIC_UPDATES | ||||||
|  | @ -205,14 +206,15 @@ static inline unsigned long pte_update(struct mm_struct *mm, | ||||||
| 	andi.	%1,%0,%6\n\ | 	andi.	%1,%0,%6\n\ | ||||||
| 	bne-	1b \n\ | 	bne-	1b \n\ | ||||||
| 	andc	%1,%0,%4 \n\ | 	andc	%1,%0,%4 \n\ | ||||||
|  | 	or	%1,%1,%7\n\ | ||||||
| 	stdcx.	%1,0,%3 \n\ | 	stdcx.	%1,0,%3 \n\ | ||||||
| 	bne-	1b" | 	bne-	1b" | ||||||
| 	: "=&r" (old), "=&r" (tmp), "=m" (*ptep) | 	: "=&r" (old), "=&r" (tmp), "=m" (*ptep) | ||||||
| 	: "r" (ptep), "r" (clr), "m" (*ptep), "i" (_PAGE_BUSY) | 	: "r" (ptep), "r" (clr), "m" (*ptep), "i" (_PAGE_BUSY), "r" (set) | ||||||
| 	: "cc" ); | 	: "cc" ); | ||||||
| #else | #else | ||||||
| 	unsigned long old = pte_val(*ptep); | 	unsigned long old = pte_val(*ptep); | ||||||
| 	*ptep = __pte(old & ~clr); | 	*ptep = __pte((old & ~clr) | set); | ||||||
| #endif | #endif | ||||||
| 	/* huge pages use the old page table lock */ | 	/* huge pages use the old page table lock */ | ||||||
| 	if (!huge) | 	if (!huge) | ||||||
|  | @ -231,9 +233,9 @@ static inline int __ptep_test_and_clear_young(struct mm_struct *mm, | ||||||
| { | { | ||||||
| 	unsigned long old; | 	unsigned long old; | ||||||
| 
 | 
 | ||||||
|        	if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | 	if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0); | 	old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0); | ||||||
| 	return (old & _PAGE_ACCESSED) != 0; | 	return (old & _PAGE_ACCESSED) != 0; | ||||||
| } | } | ||||||
| #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | ||||||
|  | @ -252,7 +254,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | ||||||
| 	if ((pte_val(*ptep) & _PAGE_RW) == 0) | 	if ((pte_val(*ptep) & _PAGE_RW) == 0) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	pte_update(mm, addr, ptep, _PAGE_RW, 0); | 	pte_update(mm, addr, ptep, _PAGE_RW, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | ||||||
|  | @ -261,7 +263,7 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | ||||||
| 	if ((pte_val(*ptep) & _PAGE_RW) == 0) | 	if ((pte_val(*ptep) & _PAGE_RW) == 0) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	pte_update(mm, addr, ptep, _PAGE_RW, 1); | 	pte_update(mm, addr, ptep, _PAGE_RW, 0, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -284,14 +286,14 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | ||||||
| static inline pte_t ptep_get_and_clear(struct mm_struct *mm, | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, | ||||||
| 				       unsigned long addr, pte_t *ptep) | 				       unsigned long addr, pte_t *ptep) | ||||||
| { | { | ||||||
| 	unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0); | 	unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0, 0); | ||||||
| 	return __pte(old); | 	return __pte(old); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void pte_clear(struct mm_struct *mm, unsigned long addr, | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, | ||||||
| 			     pte_t * ptep) | 			     pte_t * ptep) | ||||||
| { | { | ||||||
| 	pte_update(mm, addr, ptep, ~0UL, 0); | 	pte_update(mm, addr, ptep, ~0UL, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -506,7 +508,9 @@ extern int pmdp_set_access_flags(struct vm_area_struct *vma, | ||||||
| 
 | 
 | ||||||
| extern unsigned long pmd_hugepage_update(struct mm_struct *mm, | extern unsigned long pmd_hugepage_update(struct mm_struct *mm, | ||||||
| 					 unsigned long addr, | 					 unsigned long addr, | ||||||
| 					 pmd_t *pmdp, unsigned long clr); | 					 pmd_t *pmdp, | ||||||
|  | 					 unsigned long clr, | ||||||
|  | 					 unsigned long set); | ||||||
| 
 | 
 | ||||||
| static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, | static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, | ||||||
| 					      unsigned long addr, pmd_t *pmdp) | 					      unsigned long addr, pmd_t *pmdp) | ||||||
|  | @ -515,7 +519,7 @@ static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, | ||||||
| 
 | 
 | ||||||
| 	if ((pmd_val(*pmdp) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | 	if ((pmd_val(*pmdp) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	old = pmd_hugepage_update(mm, addr, pmdp, _PAGE_ACCESSED); | 	old = pmd_hugepage_update(mm, addr, pmdp, _PAGE_ACCESSED, 0); | ||||||
| 	return ((old & _PAGE_ACCESSED) != 0); | 	return ((old & _PAGE_ACCESSED) != 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -542,7 +546,7 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr, | ||||||
| 	if ((pmd_val(*pmdp) & _PAGE_RW) == 0) | 	if ((pmd_val(*pmdp) & _PAGE_RW) == 0) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	pmd_hugepage_update(mm, addr, pmdp, _PAGE_RW); | 	pmd_hugepage_update(mm, addr, pmdp, _PAGE_RW, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH | #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH | ||||||
|  |  | ||||||
|  | @ -75,12 +75,34 @@ static inline pte_t pte_mknuma(pte_t pte) | ||||||
| 	return pte; | 	return pte; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #define ptep_set_numa ptep_set_numa | ||||||
|  | static inline void ptep_set_numa(struct mm_struct *mm, unsigned long addr, | ||||||
|  | 				 pte_t *ptep) | ||||||
|  | { | ||||||
|  | 	if ((pte_val(*ptep) & _PAGE_PRESENT) == 0) | ||||||
|  | 		VM_BUG_ON(1); | ||||||
|  | 
 | ||||||
|  | 	pte_update(mm, addr, ptep, _PAGE_PRESENT, _PAGE_NUMA, 0); | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define pmd_numa pmd_numa | #define pmd_numa pmd_numa | ||||||
| static inline int pmd_numa(pmd_t pmd) | static inline int pmd_numa(pmd_t pmd) | ||||||
| { | { | ||||||
| 	return pte_numa(pmd_pte(pmd)); | 	return pte_numa(pmd_pte(pmd)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #define pmdp_set_numa pmdp_set_numa | ||||||
|  | static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr, | ||||||
|  | 				 pmd_t *pmdp) | ||||||
|  | { | ||||||
|  | 	if ((pmd_val(*pmdp) & _PAGE_PRESENT) == 0) | ||||||
|  | 		VM_BUG_ON(1); | ||||||
|  | 
 | ||||||
|  | 	pmd_hugepage_update(mm, addr, pmdp, _PAGE_PRESENT, _PAGE_NUMA); | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define pmd_mknonnuma pmd_mknonnuma | #define pmd_mknonnuma pmd_mknonnuma | ||||||
| static inline pmd_t pmd_mknonnuma(pmd_t pmd) | static inline pmd_t pmd_mknonnuma(pmd_t pmd) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -4,11 +4,11 @@ | ||||||
| #ifdef __KERNEL__ | #ifdef __KERNEL__ | ||||||
| 
 | 
 | ||||||
| /* Default link addresses for the vDSOs */ | /* Default link addresses for the vDSOs */ | ||||||
| #define VDSO32_LBASE	0x100000 | #define VDSO32_LBASE	0x0 | ||||||
| #define VDSO64_LBASE	0x100000 | #define VDSO64_LBASE	0x0 | ||||||
| 
 | 
 | ||||||
| /* Default map addresses for 32bit vDSO */ | /* Default map addresses for 32bit vDSO */ | ||||||
| #define VDSO32_MBASE	VDSO32_LBASE | #define VDSO32_MBASE	0x100000 | ||||||
| 
 | 
 | ||||||
| #define VDSO_VERSION_STRING	LINUX_2.6.15 | #define VDSO_VERSION_STRING	LINUX_2.6.15 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ | ||||||
| #include <linux/pci.h> | #include <linux/pci.h> | ||||||
| #include <linux/proc_fs.h> | #include <linux/proc_fs.h> | ||||||
| #include <linux/rbtree.h> | #include <linux/rbtree.h> | ||||||
|  | #include <linux/reboot.h> | ||||||
| #include <linux/seq_file.h> | #include <linux/seq_file.h> | ||||||
| #include <linux/spinlock.h> | #include <linux/spinlock.h> | ||||||
| #include <linux/export.h> | #include <linux/export.h> | ||||||
|  | @ -89,7 +90,7 @@ | ||||||
| /* Platform dependent EEH operations */ | /* Platform dependent EEH operations */ | ||||||
| struct eeh_ops *eeh_ops = NULL; | struct eeh_ops *eeh_ops = NULL; | ||||||
| 
 | 
 | ||||||
| int eeh_subsystem_enabled; | bool eeh_subsystem_enabled = false; | ||||||
| EXPORT_SYMBOL(eeh_subsystem_enabled); | EXPORT_SYMBOL(eeh_subsystem_enabled); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -364,7 +365,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev) | ||||||
| 
 | 
 | ||||||
| 	eeh_stats.total_mmio_ffs++; | 	eeh_stats.total_mmio_ffs++; | ||||||
| 
 | 
 | ||||||
| 	if (!eeh_subsystem_enabled) | 	if (!eeh_enabled()) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	if (!edev) { | 	if (!edev) { | ||||||
|  | @ -747,6 +748,17 @@ int __exit eeh_ops_unregister(const char *name) | ||||||
| 	return -EEXIST; | 	return -EEXIST; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int eeh_reboot_notifier(struct notifier_block *nb, | ||||||
|  | 			       unsigned long action, void *unused) | ||||||
|  | { | ||||||
|  | 	eeh_set_enable(false); | ||||||
|  | 	return NOTIFY_DONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct notifier_block eeh_reboot_nb = { | ||||||
|  | 	.notifier_call = eeh_reboot_notifier, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * eeh_init - EEH initialization |  * eeh_init - EEH initialization | ||||||
|  * |  * | ||||||
|  | @ -778,6 +790,14 @@ int eeh_init(void) | ||||||
| 	if (machine_is(powernv) && cnt++ <= 0) | 	if (machine_is(powernv) && cnt++ <= 0) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
|  | 	/* Register reboot notifier */ | ||||||
|  | 	ret = register_reboot_notifier(&eeh_reboot_nb); | ||||||
|  | 	if (ret) { | ||||||
|  | 		pr_warn("%s: Failed to register notifier (%d)\n", | ||||||
|  | 			__func__, ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* call platform initialization function */ | 	/* call platform initialization function */ | ||||||
| 	if (!eeh_ops) { | 	if (!eeh_ops) { | ||||||
| 		pr_warning("%s: Platform EEH operation not found\n", | 		pr_warning("%s: Platform EEH operation not found\n", | ||||||
|  | @ -822,7 +842,7 @@ int eeh_init(void) | ||||||
| 			return ret; | 			return ret; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (eeh_subsystem_enabled) | 	if (eeh_enabled()) | ||||||
| 		pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n"); | 		pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n"); | ||||||
| 	else | 	else | ||||||
| 		pr_warning("EEH: No capable adapters found\n"); | 		pr_warning("EEH: No capable adapters found\n"); | ||||||
|  | @ -897,7 +917,7 @@ void eeh_add_device_late(struct pci_dev *dev) | ||||||
| 	struct device_node *dn; | 	struct device_node *dn; | ||||||
| 	struct eeh_dev *edev; | 	struct eeh_dev *edev; | ||||||
| 
 | 
 | ||||||
| 	if (!dev || !eeh_subsystem_enabled) | 	if (!dev || !eeh_enabled()) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	pr_debug("EEH: Adding device %s\n", pci_name(dev)); | 	pr_debug("EEH: Adding device %s\n", pci_name(dev)); | ||||||
|  | @ -1005,7 +1025,7 @@ void eeh_remove_device(struct pci_dev *dev) | ||||||
| { | { | ||||||
| 	struct eeh_dev *edev; | 	struct eeh_dev *edev; | ||||||
| 
 | 
 | ||||||
| 	if (!dev || !eeh_subsystem_enabled) | 	if (!dev || !eeh_enabled()) | ||||||
| 		return; | 		return; | ||||||
| 	edev = pci_dev_to_eeh_dev(dev); | 	edev = pci_dev_to_eeh_dev(dev); | ||||||
| 
 | 
 | ||||||
|  | @ -1045,7 +1065,7 @@ void eeh_remove_device(struct pci_dev *dev) | ||||||
| 
 | 
 | ||||||
| static int proc_eeh_show(struct seq_file *m, void *v) | static int proc_eeh_show(struct seq_file *m, void *v) | ||||||
| { | { | ||||||
| 	if (0 == eeh_subsystem_enabled) { | 	if (!eeh_enabled()) { | ||||||
| 		seq_printf(m, "EEH Subsystem is globally disabled\n"); | 		seq_printf(m, "EEH Subsystem is globally disabled\n"); | ||||||
| 		seq_printf(m, "eeh_total_mmio_ffs=%llu\n", eeh_stats.total_mmio_ffs); | 		seq_printf(m, "eeh_total_mmio_ffs=%llu\n", eeh_stats.total_mmio_ffs); | ||||||
| 	} else { | 	} else { | ||||||
|  |  | ||||||
|  | @ -57,11 +57,14 @@ _GLOBAL(call_do_softirq) | ||||||
| 	mtlr	r0 | 	mtlr	r0 | ||||||
| 	blr | 	blr | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
|  |  * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
 | ||||||
|  |  */ | ||||||
| _GLOBAL(call_do_irq) | _GLOBAL(call_do_irq) | ||||||
| 	mflr	r0 | 	mflr	r0 | ||||||
| 	stw	r0,4(r1) | 	stw	r0,4(r1) | ||||||
| 	lwz	r10,THREAD+KSP_LIMIT(r2) | 	lwz	r10,THREAD+KSP_LIMIT(r2) | ||||||
| 	addi	r11,r3,THREAD_INFO_GAP | 	addi	r11,r4,THREAD_INFO_GAP | ||||||
| 	stwu	r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) | 	stwu	r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) | ||||||
| 	mr	r1,r4 | 	mr	r1,r4 | ||||||
| 	stw	r10,8(r1) | 	stw	r10,8(r1) | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| 	.globl vdso32_start, vdso32_end | 	.globl vdso32_start, vdso32_end | ||||||
| 	.balign PAGE_SIZE
 | 	.balign PAGE_SIZE
 | ||||||
| vdso32_start: | vdso32_start: | ||||||
| 	.incbin "arch/powerpc/kernel/vdso32/vdso32.so" | 	.incbin "arch/powerpc/kernel/vdso32/vdso32.so.dbg" | ||||||
| 	.balign PAGE_SIZE
 | 	.balign PAGE_SIZE
 | ||||||
| vdso32_end: | vdso32_end: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| 	.globl vdso64_start, vdso64_end | 	.globl vdso64_start, vdso64_end | ||||||
| 	.balign PAGE_SIZE
 | 	.balign PAGE_SIZE
 | ||||||
| vdso64_start: | vdso64_start: | ||||||
| 	.incbin "arch/powerpc/kernel/vdso64/vdso64.so" | 	.incbin "arch/powerpc/kernel/vdso64/vdso64.so.dbg" | ||||||
| 	.balign PAGE_SIZE
 | 	.balign PAGE_SIZE
 | ||||||
| vdso64_end: | vdso64_end: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -510,7 +510,8 @@ int pmdp_set_access_flags(struct vm_area_struct *vma, unsigned long address, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | ||||||
| 				  pmd_t *pmdp, unsigned long clr) | 				  pmd_t *pmdp, unsigned long clr, | ||||||
|  | 				  unsigned long set) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	unsigned long old, tmp; | 	unsigned long old, tmp; | ||||||
|  | @ -526,14 +527,15 @@ unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | ||||||
| 		andi.	%1,%0,%6\n\ | 		andi.	%1,%0,%6\n\ | ||||||
| 		bne-	1b \n\ | 		bne-	1b \n\ | ||||||
| 		andc	%1,%0,%4 \n\ | 		andc	%1,%0,%4 \n\ | ||||||
|  | 		or	%1,%1,%7\n\ | ||||||
| 		stdcx.	%1,0,%3 \n\ | 		stdcx.	%1,0,%3 \n\ | ||||||
| 		bne-	1b" | 		bne-	1b" | ||||||
| 	: "=&r" (old), "=&r" (tmp), "=m" (*pmdp) | 	: "=&r" (old), "=&r" (tmp), "=m" (*pmdp) | ||||||
| 	: "r" (pmdp), "r" (clr), "m" (*pmdp), "i" (_PAGE_BUSY) | 	: "r" (pmdp), "r" (clr), "m" (*pmdp), "i" (_PAGE_BUSY), "r" (set) | ||||||
| 	: "cc" ); | 	: "cc" ); | ||||||
| #else | #else | ||||||
| 	old = pmd_val(*pmdp); | 	old = pmd_val(*pmdp); | ||||||
| 	*pmdp = __pmd(old & ~clr); | 	*pmdp = __pmd((old & ~clr) | set); | ||||||
| #endif | #endif | ||||||
| 	if (old & _PAGE_HASHPTE) | 	if (old & _PAGE_HASHPTE) | ||||||
| 		hpte_do_hugepage_flush(mm, addr, pmdp); | 		hpte_do_hugepage_flush(mm, addr, pmdp); | ||||||
|  | @ -708,7 +710,7 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||||||
| void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | ||||||
| 		     pmd_t *pmdp) | 		     pmd_t *pmdp) | ||||||
| { | { | ||||||
| 	pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT); | 	pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -835,7 +837,7 @@ pmd_t pmdp_get_and_clear(struct mm_struct *mm, | ||||||
| 	unsigned long old; | 	unsigned long old; | ||||||
| 	pgtable_t *pgtable_slot; | 	pgtable_t *pgtable_slot; | ||||||
| 
 | 
 | ||||||
| 	old = pmd_hugepage_update(mm, addr, pmdp, ~0UL); | 	old = pmd_hugepage_update(mm, addr, pmdp, ~0UL, 0); | ||||||
| 	old_pmd = __pmd(old); | 	old_pmd = __pmd(old); | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * We have pmd == none and we are holding page_table_lock. | 	 * We have pmd == none and we are holding page_table_lock. | ||||||
|  |  | ||||||
|  | @ -78,7 +78,7 @@ static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, | ||||||
| 	pte = pte_offset_map_lock(mm, pmd, addr, &ptl); | 	pte = pte_offset_map_lock(mm, pmd, addr, &ptl); | ||||||
| 	arch_enter_lazy_mmu_mode(); | 	arch_enter_lazy_mmu_mode(); | ||||||
| 	for (; npages > 0; --npages) { | 	for (; npages > 0; --npages) { | ||||||
| 		pte_update(mm, addr, pte, 0, 0); | 		pte_update(mm, addr, pte, 0, 0, 0); | ||||||
| 		addr += PAGE_SIZE; | 		addr += PAGE_SIZE; | ||||||
| 		++pte; | 		++pte; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -44,7 +44,8 @@ static int ioda_eeh_event(struct notifier_block *nb, | ||||||
| 
 | 
 | ||||||
| 	/* We simply send special EEH event */ | 	/* We simply send special EEH event */ | ||||||
| 	if ((changed_evts & OPAL_EVENT_PCI_ERROR) && | 	if ((changed_evts & OPAL_EVENT_PCI_ERROR) && | ||||||
| 	    (events & OPAL_EVENT_PCI_ERROR)) | 	    (events & OPAL_EVENT_PCI_ERROR) && | ||||||
|  | 	    eeh_enabled()) | ||||||
| 		eeh_send_failure_event(NULL); | 		eeh_send_failure_event(NULL); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  | @ -489,8 +490,7 @@ static int ioda_eeh_bridge_reset(struct pci_controller *hose, | ||||||
| static int ioda_eeh_reset(struct eeh_pe *pe, int option) | static int ioda_eeh_reset(struct eeh_pe *pe, int option) | ||||||
| { | { | ||||||
| 	struct pci_controller *hose = pe->phb; | 	struct pci_controller *hose = pe->phb; | ||||||
| 	struct eeh_dev *edev; | 	struct pci_bus *bus; | ||||||
| 	struct pci_dev *dev; |  | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
|  | @ -519,31 +519,11 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) | ||||||
| 	if (pe->type & EEH_PE_PHB) { | 	if (pe->type & EEH_PE_PHB) { | ||||||
| 		ret = ioda_eeh_phb_reset(hose, option); | 		ret = ioda_eeh_phb_reset(hose, option); | ||||||
| 	} else { | 	} else { | ||||||
| 		if (pe->type & EEH_PE_DEVICE) { | 		bus = eeh_pe_bus_get(pe); | ||||||
| 			/*
 | 		if (pci_is_root_bus(bus)) | ||||||
| 			 * If it's device PE, we didn't refer to the parent |  | ||||||
| 			 * PCI bus yet. So we have to figure it out indirectly. |  | ||||||
| 			 */ |  | ||||||
| 			edev = list_first_entry(&pe->edevs, |  | ||||||
| 					struct eeh_dev, list); |  | ||||||
| 			dev = eeh_dev_to_pci_dev(edev); |  | ||||||
| 			dev = dev->bus->self; |  | ||||||
| 		} else { |  | ||||||
| 			/*
 |  | ||||||
| 			 * If it's bus PE, the parent PCI bus is already there |  | ||||||
| 			 * and just pick it up. |  | ||||||
| 			 */ |  | ||||||
| 			dev = pe->bus->self; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/*
 |  | ||||||
| 		 * Do reset based on the fact that the direct upstream bridge |  | ||||||
| 		 * is root bridge (port) or not. |  | ||||||
| 		 */ |  | ||||||
| 		if (dev->bus->number == 0) |  | ||||||
| 			ret = ioda_eeh_root_reset(hose, option); | 			ret = ioda_eeh_root_reset(hose, option); | ||||||
| 		else | 		else | ||||||
| 			ret = ioda_eeh_bridge_reset(hose, dev, option); | 			ret = ioda_eeh_bridge_reset(hose, bus->self, option); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return ret; | 	return ret; | ||||||
|  |  | ||||||
|  | @ -145,7 +145,7 @@ static int powernv_eeh_dev_probe(struct pci_dev *dev, void *flag) | ||||||
| 	 * Enable EEH explicitly so that we will do EEH check | 	 * Enable EEH explicitly so that we will do EEH check | ||||||
| 	 * while accessing I/O stuff | 	 * while accessing I/O stuff | ||||||
| 	 */ | 	 */ | ||||||
| 	eeh_subsystem_enabled = 1; | 	eeh_set_enable(true); | ||||||
| 
 | 
 | ||||||
| 	/* Save memory bars */ | 	/* Save memory bars */ | ||||||
| 	eeh_save_bars(edev); | 	eeh_save_bars(edev); | ||||||
|  |  | ||||||
|  | @ -265,7 +265,7 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag) | ||||||
| 			enable = 1; | 			enable = 1; | ||||||
| 
 | 
 | ||||||
| 		if (enable) { | 		if (enable) { | ||||||
| 			eeh_subsystem_enabled = 1; | 			eeh_set_enable(true); | ||||||
| 			eeh_add_to_parent_pe(edev); | 			eeh_add_to_parent_pe(edev); | ||||||
| 
 | 
 | ||||||
| 			pr_debug("%s: EEH enabled on %s PHB#%d-PE#%x, config addr#%x\n", | 			pr_debug("%s: EEH enabled on %s PHB#%d-PE#%x, config addr#%x\n", | ||||||
|  |  | ||||||
|  | @ -113,7 +113,8 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | ||||||
| { | { | ||||||
| 	struct device_node *dn, *pdn; | 	struct device_node *dn, *pdn; | ||||||
| 	struct pci_bus *bus; | 	struct pci_bus *bus; | ||||||
| 	const __be32 *pcie_link_speed_stats; | 	u32 pcie_link_speed_stats[2]; | ||||||
|  | 	int rc; | ||||||
| 
 | 
 | ||||||
| 	bus = bridge->bus; | 	bus = bridge->bus; | ||||||
| 
 | 
 | ||||||
|  | @ -122,38 +123,45 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { | 	for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { | ||||||
| 		pcie_link_speed_stats = of_get_property(pdn, | 		rc = of_property_read_u32_array(pdn, | ||||||
| 			"ibm,pcie-link-speed-stats", NULL); | 				"ibm,pcie-link-speed-stats", | ||||||
| 		if (pcie_link_speed_stats) | 				&pcie_link_speed_stats[0], 2); | ||||||
|  | 		if (!rc) | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	of_node_put(pdn); | 	of_node_put(pdn); | ||||||
| 
 | 
 | ||||||
| 	if (!pcie_link_speed_stats) { | 	if (rc) { | ||||||
| 		pr_err("no ibm,pcie-link-speed-stats property\n"); | 		pr_err("no ibm,pcie-link-speed-stats property\n"); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	switch (be32_to_cpup(pcie_link_speed_stats)) { | 	switch (pcie_link_speed_stats[0]) { | ||||||
| 	case 0x01: | 	case 0x01: | ||||||
| 		bus->max_bus_speed = PCIE_SPEED_2_5GT; | 		bus->max_bus_speed = PCIE_SPEED_2_5GT; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x02: | 	case 0x02: | ||||||
| 		bus->max_bus_speed = PCIE_SPEED_5_0GT; | 		bus->max_bus_speed = PCIE_SPEED_5_0GT; | ||||||
| 		break; | 		break; | ||||||
|  | 	case 0x04: | ||||||
|  | 		bus->max_bus_speed = PCIE_SPEED_8_0GT; | ||||||
|  | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		bus->max_bus_speed = PCI_SPEED_UNKNOWN; | 		bus->max_bus_speed = PCI_SPEED_UNKNOWN; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	switch (be32_to_cpup(pcie_link_speed_stats)) { | 	switch (pcie_link_speed_stats[1]) { | ||||||
| 	case 0x01: | 	case 0x01: | ||||||
| 		bus->cur_bus_speed = PCIE_SPEED_2_5GT; | 		bus->cur_bus_speed = PCIE_SPEED_2_5GT; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x02: | 	case 0x02: | ||||||
| 		bus->cur_bus_speed = PCIE_SPEED_5_0GT; | 		bus->cur_bus_speed = PCIE_SPEED_5_0GT; | ||||||
| 		break; | 		break; | ||||||
|  | 	case 0x04: | ||||||
|  | 		bus->cur_bus_speed = PCIE_SPEED_8_0GT; | ||||||
|  | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		bus->cur_bus_speed = PCI_SPEED_UNKNOWN; | 		bus->cur_bus_speed = PCI_SPEED_UNKNOWN; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ config SPARC | ||||||
| 	select RTC_DRV_M48T59 | 	select RTC_DRV_M48T59 | ||||||
| 	select HAVE_DMA_ATTRS | 	select HAVE_DMA_ATTRS | ||||||
| 	select HAVE_DMA_API_DEBUG | 	select HAVE_DMA_API_DEBUG | ||||||
| 	select HAVE_ARCH_JUMP_LABEL | 	select HAVE_ARCH_JUMP_LABEL if SPARC64 | ||||||
| 	select GENERIC_IRQ_SHOW | 	select GENERIC_IRQ_SHOW | ||||||
| 	select ARCH_WANT_IPC_PARSE_VERSION | 	select ARCH_WANT_IPC_PARSE_VERSION | ||||||
| 	select GENERIC_PCI_IOMAP | 	select GENERIC_PCI_IOMAP | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
| #include <linux/pagemap.h> | #include <linux/pagemap.h> | ||||||
| #include <linux/vmalloc.h> | #include <linux/vmalloc.h> | ||||||
| #include <linux/kdebug.h> | #include <linux/kdebug.h> | ||||||
|  | #include <linux/export.h> | ||||||
| #include <linux/kernel.h> | #include <linux/kernel.h> | ||||||
| #include <linux/init.h> | #include <linux/init.h> | ||||||
| #include <linux/log2.h> | #include <linux/log2.h> | ||||||
|  | @ -62,6 +63,7 @@ extern unsigned long last_valid_pfn; | ||||||
| static pgd_t *srmmu_swapper_pg_dir; | static pgd_t *srmmu_swapper_pg_dir; | ||||||
| 
 | 
 | ||||||
| const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; | const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; | ||||||
|  | EXPORT_SYMBOL(sparc32_cachetlb_ops); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SMP | #ifdef CONFIG_SMP | ||||||
| const struct sparc32_cachetlb_ops *local_ops; | const struct sparc32_cachetlb_ops *local_ops; | ||||||
|  |  | ||||||
|  | @ -66,6 +66,6 @@ extern void tsc_save_sched_clock_state(void); | ||||||
| extern void tsc_restore_sched_clock_state(void); | extern void tsc_restore_sched_clock_state(void); | ||||||
| 
 | 
 | ||||||
| /* MSR based TSC calibration for Intel Atom SoC platforms */ | /* MSR based TSC calibration for Intel Atom SoC platforms */ | ||||||
| int try_msr_calibrate_tsc(unsigned long *fast_calibrate); | unsigned long try_msr_calibrate_tsc(void); | ||||||
| 
 | 
 | ||||||
| #endif /* _ASM_X86_TSC_H */ | #endif /* _ASM_X86_TSC_H */ | ||||||
|  |  | ||||||
|  | @ -1521,6 +1521,8 @@ static int __init init_hw_perf_events(void) | ||||||
| 
 | 
 | ||||||
| 	pr_cont("%s PMU driver.\n", x86_pmu.name); | 	pr_cont("%s PMU driver.\n", x86_pmu.name); | ||||||
| 
 | 
 | ||||||
|  | 	x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ | ||||||
|  | 
 | ||||||
| 	for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) | 	for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) | ||||||
| 		quirk->func(); | 		quirk->func(); | ||||||
| 
 | 
 | ||||||
|  | @ -1534,7 +1536,6 @@ static int __init init_hw_perf_events(void) | ||||||
| 		__EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, | 		__EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, | ||||||
| 				   0, x86_pmu.num_counters, 0, 0); | 				   0, x86_pmu.num_counters, 0, 0); | ||||||
| 
 | 
 | ||||||
| 	x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ |  | ||||||
| 	x86_pmu_format_group.attrs = x86_pmu.format_attrs; | 	x86_pmu_format_group.attrs = x86_pmu.format_attrs; | ||||||
| 
 | 
 | ||||||
| 	if (x86_pmu.event_attrs) | 	if (x86_pmu.event_attrs) | ||||||
|  | @ -1820,9 +1821,12 @@ static ssize_t set_attr_rdpmc(struct device *cdev, | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
|  | 	if (x86_pmu.attr_rdpmc_broken) | ||||||
|  | 		return -ENOTSUPP; | ||||||
|  | 
 | ||||||
| 	if (!!val != !!x86_pmu.attr_rdpmc) { | 	if (!!val != !!x86_pmu.attr_rdpmc) { | ||||||
| 		x86_pmu.attr_rdpmc = !!val; | 		x86_pmu.attr_rdpmc = !!val; | ||||||
| 		smp_call_function(change_rdpmc, (void *)val, 1); | 		on_each_cpu(change_rdpmc, (void *)val, 1); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return count; | 	return count; | ||||||
|  |  | ||||||
|  | @ -409,6 +409,7 @@ struct x86_pmu { | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * sysfs attrs | 	 * sysfs attrs | ||||||
| 	 */ | 	 */ | ||||||
|  | 	int		attr_rdpmc_broken; | ||||||
| 	int		attr_rdpmc; | 	int		attr_rdpmc; | ||||||
| 	struct attribute **format_attrs; | 	struct attribute **format_attrs; | ||||||
| 	struct attribute **event_attrs; | 	struct attribute **event_attrs; | ||||||
|  |  | ||||||
|  | @ -1361,10 +1361,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) | ||||||
| 	intel_pmu_disable_all(); | 	intel_pmu_disable_all(); | ||||||
| 	handled = intel_pmu_drain_bts_buffer(); | 	handled = intel_pmu_drain_bts_buffer(); | ||||||
| 	status = intel_pmu_get_status(); | 	status = intel_pmu_get_status(); | ||||||
| 	if (!status) { | 	if (!status) | ||||||
| 		intel_pmu_enable_all(0); | 		goto done; | ||||||
| 		return handled; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	loops = 0; | 	loops = 0; | ||||||
| again: | again: | ||||||
|  | @ -2310,10 +2308,7 @@ __init int intel_pmu_init(void) | ||||||
| 	if (version > 1) | 	if (version > 1) | ||||||
| 		x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); | 		x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	if (boot_cpu_has(X86_FEATURE_PDCM)) { | ||||||
| 	 * v2 and above have a perf capabilities MSR |  | ||||||
| 	 */ |  | ||||||
| 	if (version > 1) { |  | ||||||
| 		u64 capabilities; | 		u64 capabilities; | ||||||
| 
 | 
 | ||||||
| 		rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); | 		rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); | ||||||
|  |  | ||||||
|  | @ -501,8 +501,11 @@ static struct extra_reg snbep_uncore_cbox_extra_regs[] = { | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | ||||||
| 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), | ||||||
|  | @ -1178,10 +1181,15 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = { | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | ||||||
| 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), |  | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), |  | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | ||||||
|  | 	SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), | ||||||
| 	SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), | 	SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), | ||||||
|  |  | ||||||
|  | @ -231,31 +231,49 @@ static __initconst const struct x86_pmu p6_pmu = { | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static __init void p6_pmu_rdpmc_quirk(void) | ||||||
|  | { | ||||||
|  | 	if (boot_cpu_data.x86_mask < 9) { | ||||||
|  | 		/*
 | ||||||
|  | 		 * PPro erratum 26; fixed in stepping 9 and above. | ||||||
|  | 		 */ | ||||||
|  | 		pr_warn("Userspace RDPMC support disabled due to a CPU erratum\n"); | ||||||
|  | 		x86_pmu.attr_rdpmc_broken = 1; | ||||||
|  | 		x86_pmu.attr_rdpmc = 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| __init int p6_pmu_init(void) | __init int p6_pmu_init(void) | ||||||
| { | { | ||||||
|  | 	x86_pmu = p6_pmu; | ||||||
|  | 
 | ||||||
| 	switch (boot_cpu_data.x86_model) { | 	switch (boot_cpu_data.x86_model) { | ||||||
| 	case 1: | 	case  1: /* Pentium Pro */ | ||||||
| 	case 3:  /* Pentium Pro */ | 		x86_add_quirk(p6_pmu_rdpmc_quirk); | ||||||
| 	case 5: |  | ||||||
| 	case 6:  /* Pentium II */ |  | ||||||
| 	case 7: |  | ||||||
| 	case 8: |  | ||||||
| 	case 11: /* Pentium III */ |  | ||||||
| 	case 9: |  | ||||||
| 	case 13: |  | ||||||
| 		/* Pentium M */ |  | ||||||
| 		break; | 		break; | ||||||
|  | 
 | ||||||
|  | 	case  3: /* Pentium II - Klamath */ | ||||||
|  | 	case  5: /* Pentium II - Deschutes */ | ||||||
|  | 	case  6: /* Pentium II - Mendocino */ | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case  7: /* Pentium III - Katmai */ | ||||||
|  | 	case  8: /* Pentium III - Coppermine */ | ||||||
|  | 	case 10: /* Pentium III Xeon */ | ||||||
|  | 	case 11: /* Pentium III - Tualatin */ | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case  9: /* Pentium M - Banias */ | ||||||
|  | 	case 13: /* Pentium M - Dothan */ | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
| 	default: | 	default: | ||||||
| 		pr_cont("unsupported p6 CPU model %d ", | 		pr_cont("unsupported p6 CPU model %d ", boot_cpu_data.x86_model); | ||||||
| 			boot_cpu_data.x86_model); |  | ||||||
| 		return -ENODEV; | 		return -ENODEV; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	x86_pmu = p6_pmu; |  | ||||||
| 
 |  | ||||||
| 	memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, | 	memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, | ||||||
| 		sizeof(hw_cache_event_ids)); | 		sizeof(hw_cache_event_ids)); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -100,8 +100,10 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, | ||||||
| 	flag |= __GFP_ZERO; | 	flag |= __GFP_ZERO; | ||||||
| again: | again: | ||||||
| 	page = NULL; | 	page = NULL; | ||||||
| 	if (!(flag & GFP_ATOMIC)) | 	/* CMA can be used only in the context which permits sleeping */ | ||||||
|  | 	if (flag & __GFP_WAIT) | ||||||
| 		page = dma_alloc_from_contiguous(dev, count, get_order(size)); | 		page = dma_alloc_from_contiguous(dev, count, get_order(size)); | ||||||
|  | 	/* fallback */ | ||||||
| 	if (!page) | 	if (!page) | ||||||
| 		page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); | 		page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); | ||||||
| 	if (!page) | 	if (!page) | ||||||
|  |  | ||||||
|  | @ -653,13 +653,10 @@ unsigned long native_calibrate_tsc(void) | ||||||
| 
 | 
 | ||||||
| 	/* Calibrate TSC using MSR for Intel Atom SoCs */ | 	/* Calibrate TSC using MSR for Intel Atom SoCs */ | ||||||
| 	local_irq_save(flags); | 	local_irq_save(flags); | ||||||
| 	i = try_msr_calibrate_tsc(&fast_calibrate); | 	fast_calibrate = try_msr_calibrate_tsc(); | ||||||
| 	local_irq_restore(flags); | 	local_irq_restore(flags); | ||||||
| 	if (i >= 0) { | 	if (fast_calibrate) | ||||||
| 		if (i == 0) |  | ||||||
| 			pr_warn("Fast TSC calibration using MSR failed\n"); |  | ||||||
| 		return fast_calibrate; | 		return fast_calibrate; | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	local_irq_save(flags); | 	local_irq_save(flags); | ||||||
| 	fast_calibrate = quick_pit_calibrate(); | 	fast_calibrate = quick_pit_calibrate(); | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ static struct freq_desc freq_desc_tables[] = { | ||||||
| 	/* TNG */ | 	/* TNG */ | ||||||
| 	{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, | 	{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, | ||||||
| 	/* VLV2 */ | 	/* VLV2 */ | ||||||
| 	{ 6, 0x37, 1, { 0, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, | 	{ 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, | ||||||
| 	/* ANN */ | 	/* ANN */ | ||||||
| 	{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, | 	{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, | ||||||
| }; | }; | ||||||
|  | @ -77,21 +77,18 @@ static int match_cpu(u8 family, u8 model) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Do MSR calibration only for known/supported CPUs. |  * Do MSR calibration only for known/supported CPUs. | ||||||
|  * Return values: |  * | ||||||
|  * -1: CPU is unknown/unsupported for MSR based calibration |  * Returns the calibration value or 0 if MSR calibration failed. | ||||||
|  *  0: CPU is known/supported, but calibration failed |  | ||||||
|  *  1: CPU is known/supported, and calibration succeeded |  | ||||||
|  */ |  */ | ||||||
| int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | unsigned long try_msr_calibrate_tsc(void) | ||||||
| { | { | ||||||
| 	int cpu_index; |  | ||||||
| 	u32 lo, hi, ratio, freq_id, freq; | 	u32 lo, hi, ratio, freq_id, freq; | ||||||
|  | 	unsigned long res; | ||||||
|  | 	int cpu_index; | ||||||
| 
 | 
 | ||||||
| 	cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); | 	cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); | ||||||
| 	if (cpu_index < 0) | 	if (cpu_index < 0) | ||||||
| 		return -1; | 		return 0; | ||||||
| 
 |  | ||||||
| 	*fast_calibrate = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (freq_desc_tables[cpu_index].msr_plat) { | 	if (freq_desc_tables[cpu_index].msr_plat) { | ||||||
| 		rdmsr(MSR_PLATFORM_INFO, lo, hi); | 		rdmsr(MSR_PLATFORM_INFO, lo, hi); | ||||||
|  | @ -103,7 +100,7 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | ||||||
| 	pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); | 	pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); | ||||||
| 
 | 
 | ||||||
| 	if (!ratio) | 	if (!ratio) | ||||||
| 		return 0; | 		goto fail; | ||||||
| 
 | 
 | ||||||
| 	/* Get FSB FREQ ID */ | 	/* Get FSB FREQ ID */ | ||||||
| 	rdmsr(MSR_FSB_FREQ, lo, hi); | 	rdmsr(MSR_FSB_FREQ, lo, hi); | ||||||
|  | @ -112,16 +109,19 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | ||||||
| 	pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", | 	pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", | ||||||
| 				freq_id, freq); | 				freq_id, freq); | ||||||
| 	if (!freq) | 	if (!freq) | ||||||
| 		return 0; | 		goto fail; | ||||||
| 
 | 
 | ||||||
| 	/* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ | 	/* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ | ||||||
| 	*fast_calibrate = freq * ratio; | 	res = freq * ratio; | ||||||
| 	pr_info("TSC runs at %lu KHz\n", *fast_calibrate); | 	pr_info("TSC runs at %lu KHz\n", res); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_X86_LOCAL_APIC | #ifdef CONFIG_X86_LOCAL_APIC | ||||||
| 	lapic_timer_frequency = (freq * 1000) / HZ; | 	lapic_timer_frequency = (freq * 1000) / HZ; | ||||||
| 	pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); | 	pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); | ||||||
| #endif | #endif | ||||||
|  | 	return res; | ||||||
| 
 | 
 | ||||||
| 	return 1; | fail: | ||||||
|  | 	pr_warn("Fast TSC calibration using MSR failed\n"); | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -243,6 +243,8 @@ static int acpi_ac_resume(struct device *dev) | ||||||
| 		kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | 		kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | #else | ||||||
|  | #define acpi_ac_resume NULL | ||||||
| #endif | #endif | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); | static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -841,6 +841,8 @@ static int acpi_battery_resume(struct device *dev) | ||||||
| 	acpi_battery_update(battery); | 	acpi_battery_update(battery); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | #else | ||||||
|  | #define acpi_battery_resume NULL | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); | static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); | ||||||
|  |  | ||||||
|  | @ -260,14 +260,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 	.callback = dmi_disable_osi_win8, | 	.callback = dmi_disable_osi_win8, | ||||||
| 	.ident = "Dell Inspiron 15R SE", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7520"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "ThinkPad Edge E530", | 	.ident = "ThinkPad Edge E530", | ||||||
| 	.matches = { | 	.matches = { | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||||
|  | @ -322,56 +314,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), | 		     DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP ProBook 2013 models", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, " G1"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP EliteBook 2013 models", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, " G1"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP ZBook 14", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP ZBook 15", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP ZBook 17", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = dmi_disable_osi_win8, |  | ||||||
| 	.ident = "HP EliteBook 8780w", |  | ||||||
| 	.matches = { |  | ||||||
| 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		     DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. | 	 * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. | ||||||
|  |  | ||||||
|  | @ -80,6 +80,8 @@ static void acpi_button_notify(struct acpi_device *device, u32 event); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_PM_SLEEP | #ifdef CONFIG_PM_SLEEP | ||||||
| static int acpi_button_resume(struct device *dev); | static int acpi_button_resume(struct device *dev); | ||||||
|  | #else | ||||||
|  | #define acpi_button_resume NULL | ||||||
| #endif | #endif | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_button_pm, NULL, acpi_button_resume); | static SIMPLE_DEV_PM_OPS(acpi_button_pm, NULL, acpi_button_resume); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -713,13 +713,11 @@ static acpi_status __init find_dock_devices(acpi_handle handle, u32 lvl, | ||||||
| static ssize_t show_docked(struct device *dev, | static ssize_t show_docked(struct device *dev, | ||||||
| 			   struct device_attribute *attr, char *buf) | 			   struct device_attribute *attr, char *buf) | ||||||
| { | { | ||||||
| 	struct acpi_device *tmp; |  | ||||||
| 
 |  | ||||||
| 	struct dock_station *dock_station = dev->platform_data; | 	struct dock_station *dock_station = dev->platform_data; | ||||||
|  | 	struct acpi_device *adev = NULL; | ||||||
| 
 | 
 | ||||||
| 	if (!acpi_bus_get_device(dock_station->handle, &tmp)) | 	acpi_bus_get_device(dock_station->handle, &adev); | ||||||
| 		return snprintf(buf, PAGE_SIZE, "1\n"); | 	return snprintf(buf, PAGE_SIZE, "%u\n", acpi_device_enumerated(adev)); | ||||||
| 	return snprintf(buf, PAGE_SIZE, "0\n"); |  | ||||||
| } | } | ||||||
| static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); | static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,6 +55,9 @@ MODULE_DEVICE_TABLE(acpi, fan_device_ids); | ||||||
| #ifdef CONFIG_PM_SLEEP | #ifdef CONFIG_PM_SLEEP | ||||||
| static int acpi_fan_suspend(struct device *dev); | static int acpi_fan_suspend(struct device *dev); | ||||||
| static int acpi_fan_resume(struct device *dev); | static int acpi_fan_resume(struct device *dev); | ||||||
|  | #else | ||||||
|  | #define acpi_fan_suspend NULL | ||||||
|  | #define acpi_fan_resume NULL | ||||||
| #endif | #endif | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume); | static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -430,6 +430,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | ||||||
| 				 pin_name(pin)); | 				 pin_name(pin)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		kfree(entry); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -450,7 +450,7 @@ static ssize_t acpi_battery_alarm_store(struct device *dev, | ||||||
| { | { | ||||||
| 	unsigned long x; | 	unsigned long x; | ||||||
| 	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); | 	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); | ||||||
| 	if (sscanf(buf, "%ld\n", &x) == 1) | 	if (sscanf(buf, "%lu\n", &x) == 1) | ||||||
| 		battery->alarm_capacity = x / | 		battery->alarm_capacity = x / | ||||||
| 			(1000 * acpi_battery_scale(battery)); | 			(1000 * acpi_battery_scale(battery)); | ||||||
| 	if (battery->present) | 	if (battery->present) | ||||||
|  | @ -668,6 +668,8 @@ static int acpi_sbs_resume(struct device *dev) | ||||||
| 	acpi_sbs_callback(sbs); | 	acpi_sbs_callback(sbs); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | #else | ||||||
|  | #define acpi_sbs_resume NULL | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_sbs_pm, NULL, acpi_sbs_resume); | static SIMPLE_DEV_PM_OPS(acpi_sbs_pm, NULL, acpi_sbs_resume); | ||||||
|  |  | ||||||
|  | @ -102,6 +102,8 @@ MODULE_DEVICE_TABLE(acpi, thermal_device_ids); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_PM_SLEEP | #ifdef CONFIG_PM_SLEEP | ||||||
| static int acpi_thermal_resume(struct device *dev); | static int acpi_thermal_resume(struct device *dev); | ||||||
|  | #else | ||||||
|  | #define acpi_thermal_resume NULL | ||||||
| #endif | #endif | ||||||
| static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume); | static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -81,11 +81,12 @@ static bool allow_duplicates; | ||||||
| module_param(allow_duplicates, bool, 0644); | module_param(allow_duplicates, bool, 0644); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * For Windows 8 systems: if set ture and the GPU driver has |  * For Windows 8 systems: used to decide if video module | ||||||
|  * registered a backlight interface, skip registering ACPI video's. |  * should skip registering backlight interface of its own. | ||||||
|  */ |  */ | ||||||
| static bool use_native_backlight = false; | static int use_native_backlight_param = -1; | ||||||
| module_param(use_native_backlight, bool, 0644); | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); | ||||||
|  | static bool use_native_backlight_dmi = false; | ||||||
| 
 | 
 | ||||||
| static int register_count; | static int register_count; | ||||||
| static struct mutex video_list_lock; | static struct mutex video_list_lock; | ||||||
|  | @ -231,9 +232,17 @@ static int acpi_video_get_next_level(struct acpi_video_device *device, | ||||||
| static int acpi_video_switch_brightness(struct acpi_video_device *device, | static int acpi_video_switch_brightness(struct acpi_video_device *device, | ||||||
| 					 int event); | 					 int event); | ||||||
| 
 | 
 | ||||||
|  | static bool acpi_video_use_native_backlight(void) | ||||||
|  | { | ||||||
|  | 	if (use_native_backlight_param != -1) | ||||||
|  | 		return use_native_backlight_param; | ||||||
|  | 	else | ||||||
|  | 		return use_native_backlight_dmi; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool acpi_video_verify_backlight_support(void) | static bool acpi_video_verify_backlight_support(void) | ||||||
| { | { | ||||||
| 	if (acpi_osi_is_win8() && use_native_backlight && | 	if (acpi_osi_is_win8() && acpi_video_use_native_backlight() && | ||||||
| 	    backlight_device_registered(BACKLIGHT_RAW)) | 	    backlight_device_registered(BACKLIGHT_RAW)) | ||||||
| 		return false; | 		return false; | ||||||
| 	return acpi_video_backlight_support(); | 	return acpi_video_backlight_support(); | ||||||
|  | @ -398,6 +407,12 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int __init video_set_use_native_backlight(const struct dmi_system_id *d) | ||||||
|  | { | ||||||
|  | 	use_native_backlight_dmi = true; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static struct dmi_system_id video_dmi_table[] __initdata = { | static struct dmi_system_id video_dmi_table[] __initdata = { | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
 | 	 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
 | ||||||
|  | @ -442,6 +457,120 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | ||||||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), | 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "ThinkPad T430s", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "ThinkPad X230", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "ThinkPad X1 Carbon", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X1 Carbon"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "Lenovo Yoga 13", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "Dell Inspiron 7520", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "Inspiron 7520"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "Acer Aspire 5733Z", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5733Z"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	 .callback = video_set_use_native_backlight, | ||||||
|  | 	 .ident = "Acer Aspire V5-431", | ||||||
|  | 	 .matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-431"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP ProBook 4340s", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_VERSION, "HP ProBook 4340s"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP ProBook 2013 models", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP EliteBook 2013 models", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP ZBook 14", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP ZBook 15", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP ZBook 17", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 	.callback = video_set_use_native_backlight, | ||||||
|  | 	.ident = "HP EliteBook 8780w", | ||||||
|  | 	.matches = { | ||||||
|  | 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||||||
|  | 		DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	{} | 	{} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -685,6 +814,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) | ||||||
| 	union acpi_object *o; | 	union acpi_object *o; | ||||||
| 	struct acpi_video_device_brightness *br = NULL; | 	struct acpi_video_device_brightness *br = NULL; | ||||||
| 	int result = -EINVAL; | 	int result = -EINVAL; | ||||||
|  | 	u32 value; | ||||||
| 
 | 
 | ||||||
| 	if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { | 	if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { | ||||||
| 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " | 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " | ||||||
|  | @ -715,7 +845,12 @@ acpi_video_init_brightness(struct acpi_video_device *device) | ||||||
| 			printk(KERN_ERR PREFIX "Invalid data\n"); | 			printk(KERN_ERR PREFIX "Invalid data\n"); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		br->levels[count] = (u32) o->integer.value; | 		value = (u32) o->integer.value; | ||||||
|  | 		/* Skip duplicate entries */ | ||||||
|  | 		if (count > 2 && br->levels[count - 1] == value) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		br->levels[count] = value; | ||||||
| 
 | 
 | ||||||
| 		if (br->levels[count] > max_level) | 		if (br->levels[count] > max_level) | ||||||
| 			max_level = br->levels[count]; | 			max_level = br->levels[count]; | ||||||
|  |  | ||||||
|  | @ -168,22 +168,6 @@ static struct dmi_system_id video_detect_dmi_table[] = { | ||||||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), | 		DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	{ |  | ||||||
| 	.callback = video_detect_force_vendor, |  | ||||||
| 	.ident = "HP EliteBook Revolve 810", |  | ||||||
| 	.matches = { |  | ||||||
| 		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |  | ||||||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook Revolve 810 G1"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 	.callback = video_detect_force_vendor, |  | ||||||
| 	.ident = "Lenovo Yoga 13", |  | ||||||
| 	.matches = { |  | ||||||
| 		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |  | ||||||
| 		DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	{ }, | 	{ }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -247,6 +247,7 @@ config SATA_HIGHBANK | ||||||
| 
 | 
 | ||||||
| config SATA_MV | config SATA_MV | ||||||
| 	tristate "Marvell SATA support" | 	tristate "Marvell SATA support" | ||||||
|  | 	select GENERIC_PHY | ||||||
| 	help | 	help | ||||||
| 	  This option enables support for the Marvell Serial ATA family. | 	  This option enables support for the Marvell Serial ATA family. | ||||||
| 	  Currently supports 88SX[56]0[48][01] PCI(-X) chips, | 	  Currently supports 88SX[56]0[48][01] PCI(-X) chips, | ||||||
|  |  | ||||||
|  | @ -61,6 +61,7 @@ enum board_ids { | ||||||
| 	/* board IDs by feature in alphabetical order */ | 	/* board IDs by feature in alphabetical order */ | ||||||
| 	board_ahci, | 	board_ahci, | ||||||
| 	board_ahci_ign_iferr, | 	board_ahci_ign_iferr, | ||||||
|  | 	board_ahci_noncq, | ||||||
| 	board_ahci_nosntf, | 	board_ahci_nosntf, | ||||||
| 	board_ahci_yes_fbs, | 	board_ahci_yes_fbs, | ||||||
| 
 | 
 | ||||||
|  | @ -121,6 +122,13 @@ static const struct ata_port_info ahci_port_info[] = { | ||||||
| 		.udma_mask	= ATA_UDMA6, | 		.udma_mask	= ATA_UDMA6, | ||||||
| 		.port_ops	= &ahci_ops, | 		.port_ops	= &ahci_ops, | ||||||
| 	}, | 	}, | ||||||
|  | 	[board_ahci_noncq] = { | ||||||
|  | 		AHCI_HFLAGS	(AHCI_HFLAG_NO_NCQ), | ||||||
|  | 		.flags		= AHCI_FLAG_COMMON, | ||||||
|  | 		.pio_mask	= ATA_PIO4, | ||||||
|  | 		.udma_mask	= ATA_UDMA6, | ||||||
|  | 		.port_ops	= &ahci_ops, | ||||||
|  | 	}, | ||||||
| 	[board_ahci_nosntf] = { | 	[board_ahci_nosntf] = { | ||||||
| 		AHCI_HFLAGS	(AHCI_HFLAG_NO_SNTF), | 		AHCI_HFLAGS	(AHCI_HFLAG_NO_SNTF), | ||||||
| 		.flags		= AHCI_FLAG_COMMON, | 		.flags		= AHCI_FLAG_COMMON, | ||||||
|  | @ -452,6 +460,12 @@ static const struct pci_device_id ahci_pci_tbl[] = { | ||||||
| 	{ PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci },	/* ASM1061 */ | 	{ PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci },	/* ASM1061 */ | ||||||
| 	{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },	/* ASM1062 */ | 	{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },	/* ASM1062 */ | ||||||
| 
 | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Samsung SSDs found on some macbooks.  NCQ times out. | ||||||
|  | 	 * https://bugzilla.kernel.org/show_bug.cgi?id=60731
 | ||||||
|  | 	 */ | ||||||
|  | 	{ PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_noncq }, | ||||||
|  | 
 | ||||||
| 	/* Enmotus */ | 	/* Enmotus */ | ||||||
| 	{ PCI_DEVICE(0x1c44, 0x8000), board_ahci }, | 	{ PCI_DEVICE(0x1c44, 0x8000), board_ahci }, | ||||||
| 
 | 
 | ||||||
|  | @ -1170,8 +1184,10 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | ||||||
| 
 | 
 | ||||||
| 	nvec = rc; | 	nvec = rc; | ||||||
| 	rc = pci_enable_msi_block(pdev, nvec); | 	rc = pci_enable_msi_block(pdev, nvec); | ||||||
| 	if (rc) | 	if (rc < 0) | ||||||
| 		goto intx; | 		goto intx; | ||||||
|  | 	else if (rc > 0) | ||||||
|  | 		goto single_msi; | ||||||
| 
 | 
 | ||||||
| 	return nvec; | 	return nvec; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -447,8 +447,11 @@ static void sata_pmp_quirks(struct ata_port *ap) | ||||||
| 		 * otherwise.  Don't try hard to recover it. | 		 * otherwise.  Don't try hard to recover it. | ||||||
| 		 */ | 		 */ | ||||||
| 		ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY; | 		ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY; | ||||||
| 	} else if (vendor == 0x197b && devid == 0x2352) { | 	} else if (vendor == 0x197b && (devid == 0x2352 || devid == 0x0325)) { | ||||||
| 		/* chip found in Thermaltake BlackX Duet, jmicron JMB350? */ | 		/*
 | ||||||
|  | 		 * 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350? | ||||||
|  | 		 * 0x0325: jmicron JMB394. | ||||||
|  | 		 */ | ||||||
| 		ata_for_each_link(link, ap, EDGE) { | 		ata_for_each_link(link, ap, EDGE) { | ||||||
| 			/* SRST breaks detection and disks get misclassified
 | 			/* SRST breaks detection and disks get misclassified
 | ||||||
| 			 * LPM disabled to avoid potential problems | 			 * LPM disabled to avoid potential problems | ||||||
|  |  | ||||||
|  | @ -119,7 +119,9 @@ static int pata_imx_probe(struct platform_device *pdev) | ||||||
| 		return PTR_ERR(priv->clk); | 		return PTR_ERR(priv->clk); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	clk_prepare_enable(priv->clk); | 	ret = clk_prepare_enable(priv->clk); | ||||||
|  | 	if (ret) | ||||||
|  | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	host = ata_host_alloc(&pdev->dev, 1); | 	host = ata_host_alloc(&pdev->dev, 1); | ||||||
| 	if (!host) { | 	if (!host) { | ||||||
|  | @ -212,7 +214,9 @@ static int pata_imx_resume(struct device *dev) | ||||||
| 	struct ata_host *host = dev_get_drvdata(dev); | 	struct ata_host *host = dev_get_drvdata(dev); | ||||||
| 	struct pata_imx_priv *priv = host->private_data; | 	struct pata_imx_priv *priv = host->private_data; | ||||||
| 
 | 
 | ||||||
| 	clk_prepare_enable(priv->clk); | 	int ret = clk_prepare_enable(priv->clk); | ||||||
|  | 	if (ret) | ||||||
|  | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	__raw_writel(priv->ata_ctl, priv->host_regs + PATA_IMX_ATA_CONTROL); | 	__raw_writel(priv->ata_ctl, priv->host_regs + PATA_IMX_ATA_CONTROL); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4104,7 +4104,6 @@ static int mv_platform_probe(struct platform_device *pdev) | ||||||
| 	if (!hpriv->port_phys) | 	if (!hpriv->port_phys) | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
| 	host->private_data = hpriv; | 	host->private_data = hpriv; | ||||||
| 	hpriv->n_ports = n_ports; |  | ||||||
| 	hpriv->board_idx = chip_soc; | 	hpriv->board_idx = chip_soc; | ||||||
| 
 | 
 | ||||||
| 	host->iomap = NULL; | 	host->iomap = NULL; | ||||||
|  | @ -4132,13 +4131,18 @@ static int mv_platform_probe(struct platform_device *pdev) | ||||||
| 			rc = PTR_ERR(hpriv->port_phys[port]); | 			rc = PTR_ERR(hpriv->port_phys[port]); | ||||||
| 			hpriv->port_phys[port] = NULL; | 			hpriv->port_phys[port] = NULL; | ||||||
| 			if (rc != -EPROBE_DEFER) | 			if (rc != -EPROBE_DEFER) | ||||||
| 				dev_warn(&pdev->dev, "error getting phy %d", | 				dev_warn(&pdev->dev, "error getting phy %d", rc); | ||||||
| 					rc); | 
 | ||||||
|  | 			/* Cleanup only the initialized ports */ | ||||||
|  | 			hpriv->n_ports = port; | ||||||
| 			goto err; | 			goto err; | ||||||
| 		} else | 		} else | ||||||
| 			phy_power_on(hpriv->port_phys[port]); | 			phy_power_on(hpriv->port_phys[port]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* All the ports have been initialized */ | ||||||
|  | 	hpriv->n_ports = n_ports; | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * (Re-)program MBUS remapping windows if we are asked to. | 	 * (Re-)program MBUS remapping windows if we are asked to. | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -4176,7 +4180,7 @@ err: | ||||||
| 		clk_disable_unprepare(hpriv->clk); | 		clk_disable_unprepare(hpriv->clk); | ||||||
| 		clk_put(hpriv->clk); | 		clk_put(hpriv->clk); | ||||||
| 	} | 	} | ||||||
| 	for (port = 0; port < n_ports; port++) { | 	for (port = 0; port < hpriv->n_ports; port++) { | ||||||
| 		if (!IS_ERR(hpriv->port_clks[port])) { | 		if (!IS_ERR(hpriv->port_clks[port])) { | ||||||
| 			clk_disable_unprepare(hpriv->port_clks[port]); | 			clk_disable_unprepare(hpriv->port_clks[port]); | ||||||
| 			clk_put(hpriv->port_clks[port]); | 			clk_put(hpriv->port_clks[port]); | ||||||
|  |  | ||||||
|  | @ -157,6 +157,7 @@ static const struct sil_drivelist { | ||||||
| 	{ "ST380011ASL",	SIL_QUIRK_MOD15WRITE }, | 	{ "ST380011ASL",	SIL_QUIRK_MOD15WRITE }, | ||||||
| 	{ "ST3120022ASL",	SIL_QUIRK_MOD15WRITE }, | 	{ "ST3120022ASL",	SIL_QUIRK_MOD15WRITE }, | ||||||
| 	{ "ST3160021ASL",	SIL_QUIRK_MOD15WRITE }, | 	{ "ST3160021ASL",	SIL_QUIRK_MOD15WRITE }, | ||||||
|  | 	{ "TOSHIBA MK2561GSYN",	SIL_QUIRK_MOD15WRITE }, | ||||||
| 	{ "Maxtor 4D060H3",	SIL_QUIRK_UDMA5MAX }, | 	{ "Maxtor 4D060H3",	SIL_QUIRK_UDMA5MAX }, | ||||||
| 	{ } | 	{ } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -616,36 +616,35 @@ static int dma_buf_describe(struct seq_file *s) | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	seq_printf(s, "\nDma-buf Objects:\n"); | 	seq_puts(s, "\nDma-buf Objects:\n"); | ||||||
| 	seq_printf(s, "\texp_name\tsize\tflags\tmode\tcount\n"); | 	seq_puts(s, "size\tflags\tmode\tcount\texp_name\n"); | ||||||
| 
 | 
 | ||||||
| 	list_for_each_entry(buf_obj, &db_list.head, list_node) { | 	list_for_each_entry(buf_obj, &db_list.head, list_node) { | ||||||
| 		ret = mutex_lock_interruptible(&buf_obj->lock); | 		ret = mutex_lock_interruptible(&buf_obj->lock); | ||||||
| 
 | 
 | ||||||
| 		if (ret) { | 		if (ret) { | ||||||
| 			seq_printf(s, | 			seq_puts(s, | ||||||
| 				  "\tERROR locking buffer object: skipping\n"); | 				 "\tERROR locking buffer object: skipping\n"); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		seq_printf(s, "\t"); | 		seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\n", | ||||||
| 
 | 				buf_obj->size, | ||||||
| 		seq_printf(s, "\t%s\t%08zu\t%08x\t%08x\t%08ld\n", |  | ||||||
| 				buf_obj->exp_name, buf_obj->size, |  | ||||||
| 				buf_obj->file->f_flags, buf_obj->file->f_mode, | 				buf_obj->file->f_flags, buf_obj->file->f_mode, | ||||||
| 				(long)(buf_obj->file->f_count.counter)); | 				(long)(buf_obj->file->f_count.counter), | ||||||
|  | 				buf_obj->exp_name); | ||||||
| 
 | 
 | ||||||
| 		seq_printf(s, "\t\tAttached Devices:\n"); | 		seq_puts(s, "\tAttached Devices:\n"); | ||||||
| 		attach_count = 0; | 		attach_count = 0; | ||||||
| 
 | 
 | ||||||
| 		list_for_each_entry(attach_obj, &buf_obj->attachments, node) { | 		list_for_each_entry(attach_obj, &buf_obj->attachments, node) { | ||||||
| 			seq_printf(s, "\t\t"); | 			seq_puts(s, "\t"); | ||||||
| 
 | 
 | ||||||
| 			seq_printf(s, "%s\n", attach_obj->dev->init_name); | 			seq_printf(s, "%s\n", dev_name(attach_obj->dev)); | ||||||
| 			attach_count++; | 			attach_count++; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		seq_printf(s, "\n\t\tTotal %d devices attached\n", | 		seq_printf(s, "Total %d devices attached\n\n", | ||||||
| 				attach_count); | 				attach_count); | ||||||
| 
 | 
 | ||||||
| 		count++; | 		count++; | ||||||
|  |  | ||||||
|  | @ -1323,8 +1323,7 @@ static int __cpufreq_remove_dev_prepare(struct device *dev, | ||||||
| 	up_read(&policy->rwsem); | 	up_read(&policy->rwsem); | ||||||
| 
 | 
 | ||||||
| 	if (cpu != policy->cpu) { | 	if (cpu != policy->cpu) { | ||||||
| 		if (!frozen) | 		sysfs_remove_link(&dev->kobj, "cpufreq"); | ||||||
| 			sysfs_remove_link(&dev->kobj, "cpufreq"); |  | ||||||
| 	} else if (cpus > 1) { | 	} else if (cpus > 1) { | ||||||
| 		new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu); | 		new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu); | ||||||
| 		if (new_cpu >= 0) { | 		if (new_cpu >= 0) { | ||||||
|  |  | ||||||
|  | @ -34,8 +34,10 @@ | ||||||
| 
 | 
 | ||||||
| #define SAMPLE_COUNT		3 | #define SAMPLE_COUNT		3 | ||||||
| 
 | 
 | ||||||
| #define BYT_RATIOS	0x66a | #define BYT_RATIOS		0x66a | ||||||
| #define BYT_VIDS        0x66b | #define BYT_VIDS		0x66b | ||||||
|  | #define BYT_TURBO_RATIOS	0x66c | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define FRAC_BITS 8 | #define FRAC_BITS 8 | ||||||
| #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) | #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) | ||||||
|  | @ -357,7 +359,7 @@ static int byt_get_min_pstate(void) | ||||||
| { | { | ||||||
| 	u64 value; | 	u64 value; | ||||||
| 	rdmsrl(BYT_RATIOS, value); | 	rdmsrl(BYT_RATIOS, value); | ||||||
| 	return value & 0xFF; | 	return (value >> 8) & 0xFF; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int byt_get_max_pstate(void) | static int byt_get_max_pstate(void) | ||||||
|  | @ -367,6 +369,13 @@ static int byt_get_max_pstate(void) | ||||||
| 	return (value >> 16) & 0xFF; | 	return (value >> 16) & 0xFF; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int byt_get_turbo_pstate(void) | ||||||
|  | { | ||||||
|  | 	u64 value; | ||||||
|  | 	rdmsrl(BYT_TURBO_RATIOS, value); | ||||||
|  | 	return value & 0x3F; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void byt_set_pstate(struct cpudata *cpudata, int pstate) | static void byt_set_pstate(struct cpudata *cpudata, int pstate) | ||||||
| { | { | ||||||
| 	u64 val; | 	u64 val; | ||||||
|  | @ -469,7 +478,7 @@ static struct cpu_defaults byt_params = { | ||||||
| 	.funcs = { | 	.funcs = { | ||||||
| 		.get_max = byt_get_max_pstate, | 		.get_max = byt_get_max_pstate, | ||||||
| 		.get_min = byt_get_min_pstate, | 		.get_min = byt_get_min_pstate, | ||||||
| 		.get_turbo = byt_get_max_pstate, | 		.get_turbo = byt_get_turbo_pstate, | ||||||
| 		.set = byt_set_pstate, | 		.set = byt_set_pstate, | ||||||
| 		.get_vid = byt_get_vid, | 		.get_vid = byt_get_vid, | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | @ -1076,7 +1076,7 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||||
| { | { | ||||||
| 	struct powernow_k8_data *data; | 	struct powernow_k8_data *data; | ||||||
| 	struct init_on_cpu init_on_cpu; | 	struct init_on_cpu init_on_cpu; | ||||||
| 	int rc; | 	int rc, cpu; | ||||||
| 
 | 
 | ||||||
| 	smp_call_function_single(pol->cpu, check_supported_cpu, &rc, 1); | 	smp_call_function_single(pol->cpu, check_supported_cpu, &rc, 1); | ||||||
| 	if (rc) | 	if (rc) | ||||||
|  | @ -1140,7 +1140,9 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||||
| 	pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", | 	pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", | ||||||
| 		 data->currfid, data->currvid); | 		 data->currfid, data->currvid); | ||||||
| 
 | 
 | ||||||
| 	per_cpu(powernow_data, pol->cpu) = data; | 	/* Point all the CPUs in this policy to the same data */ | ||||||
|  | 	for_each_cpu(cpu, pol->cpus) | ||||||
|  | 		per_cpu(powernow_data, cpu) = data; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| 
 | 
 | ||||||
|  | @ -1155,6 +1157,7 @@ err_out: | ||||||
| static int powernowk8_cpu_exit(struct cpufreq_policy *pol) | static int powernowk8_cpu_exit(struct cpufreq_policy *pol) | ||||||
| { | { | ||||||
| 	struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | 	struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | ||||||
|  | 	int cpu; | ||||||
| 
 | 
 | ||||||
| 	if (!data) | 	if (!data) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
|  | @ -1165,7 +1168,8 @@ static int powernowk8_cpu_exit(struct cpufreq_policy *pol) | ||||||
| 
 | 
 | ||||||
| 	kfree(data->powernow_table); | 	kfree(data->powernow_table); | ||||||
| 	kfree(data); | 	kfree(data); | ||||||
| 	per_cpu(powernow_data, pol->cpu) = NULL; | 	for_each_cpu(cpu, pol->cpus) | ||||||
|  | 		per_cpu(powernow_data, cpu) = NULL; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -296,6 +296,18 @@ int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv) | ||||||
| 	case DRM_CAP_ASYNC_PAGE_FLIP: | 	case DRM_CAP_ASYNC_PAGE_FLIP: | ||||||
| 		req->value = dev->mode_config.async_page_flip; | 		req->value = dev->mode_config.async_page_flip; | ||||||
| 		break; | 		break; | ||||||
|  | 	case DRM_CAP_CURSOR_WIDTH: | ||||||
|  | 		if (dev->mode_config.cursor_width) | ||||||
|  | 			req->value = dev->mode_config.cursor_width; | ||||||
|  | 		else | ||||||
|  | 			req->value = 64; | ||||||
|  | 		break; | ||||||
|  | 	case DRM_CAP_CURSOR_HEIGHT: | ||||||
|  | 		if (dev->mode_config.cursor_height) | ||||||
|  | 			req->value = dev->mode_config.cursor_height; | ||||||
|  | 		else | ||||||
|  | 			req->value = 64; | ||||||
|  | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1151,8 +1151,10 @@ tda998x_encoder_init(struct i2c_client *client, | ||||||
| 
 | 
 | ||||||
| 	priv->current_page = 0xff; | 	priv->current_page = 0xff; | ||||||
| 	priv->cec = i2c_new_dummy(client->adapter, 0x34); | 	priv->cec = i2c_new_dummy(client->adapter, 0x34); | ||||||
| 	if (!priv->cec) | 	if (!priv->cec) { | ||||||
|  | 		kfree(priv); | ||||||
| 		return -ENODEV; | 		return -ENODEV; | ||||||
|  | 	} | ||||||
| 	priv->dpms = DRM_MODE_DPMS_OFF; | 	priv->dpms = DRM_MODE_DPMS_OFF; | ||||||
| 
 | 
 | ||||||
| 	encoder_slave->slave_priv = priv; | 	encoder_slave->slave_priv = priv; | ||||||
|  |  | ||||||
|  | @ -8586,6 +8586,20 @@ static int intel_gen7_queue_flip(struct drm_device *dev, | ||||||
| 	if (ring->id == RCS) | 	if (ring->id == RCS) | ||||||
| 		len += 6; | 		len += 6; | ||||||
| 
 | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * BSpec MI_DISPLAY_FLIP for IVB: | ||||||
|  | 	 * "The full packet must be contained within the same cache line." | ||||||
|  | 	 * | ||||||
|  | 	 * Currently the LRI+SRM+MI_DISPLAY_FLIP all fit within the same | ||||||
|  | 	 * cacheline, if we ever start emitting more commands before | ||||||
|  | 	 * the MI_DISPLAY_FLIP we may need to first emit everything else, | ||||||
|  | 	 * then do the cacheline alignment, and finally emit the | ||||||
|  | 	 * MI_DISPLAY_FLIP. | ||||||
|  | 	 */ | ||||||
|  | 	ret = intel_ring_cacheline_align(ring); | ||||||
|  | 	if (ret) | ||||||
|  | 		goto err_unpin; | ||||||
|  | 
 | ||||||
| 	ret = intel_ring_begin(ring, len); | 	ret = intel_ring_begin(ring, len); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto err_unpin; | 		goto err_unpin; | ||||||
|  |  | ||||||
|  | @ -537,6 +537,7 @@ intel_dp_aux_native_write(struct intel_dp *intel_dp, | ||||||
| 	uint8_t	msg[20]; | 	uint8_t	msg[20]; | ||||||
| 	int msg_bytes; | 	int msg_bytes; | ||||||
| 	uint8_t	ack; | 	uint8_t	ack; | ||||||
|  | 	int retry; | ||||||
| 
 | 
 | ||||||
| 	if (WARN_ON(send_bytes > 16)) | 	if (WARN_ON(send_bytes > 16)) | ||||||
| 		return -E2BIG; | 		return -E2BIG; | ||||||
|  | @ -548,19 +549,21 @@ intel_dp_aux_native_write(struct intel_dp *intel_dp, | ||||||
| 	msg[3] = send_bytes - 1; | 	msg[3] = send_bytes - 1; | ||||||
| 	memcpy(&msg[4], send, send_bytes); | 	memcpy(&msg[4], send, send_bytes); | ||||||
| 	msg_bytes = send_bytes + 4; | 	msg_bytes = send_bytes + 4; | ||||||
| 	for (;;) { | 	for (retry = 0; retry < 7; retry++) { | ||||||
| 		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, &ack, 1); | 		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, &ack, 1); | ||||||
| 		if (ret < 0) | 		if (ret < 0) | ||||||
| 			return ret; | 			return ret; | ||||||
| 		ack >>= 4; | 		ack >>= 4; | ||||||
| 		if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) | 		if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) | ||||||
| 			break; | 			return send_bytes; | ||||||
| 		else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | 		else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | ||||||
| 			udelay(100); | 			usleep_range(400, 500); | ||||||
| 		else | 		else | ||||||
| 			return -EIO; | 			return -EIO; | ||||||
| 	} | 	} | ||||||
| 	return send_bytes; | 
 | ||||||
|  | 	DRM_ERROR("too many retries, giving up\n"); | ||||||
|  | 	return -EIO; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Write a single byte to the aux channel in native mode */ | /* Write a single byte to the aux channel in native mode */ | ||||||
|  | @ -582,6 +585,7 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp, | ||||||
| 	int reply_bytes; | 	int reply_bytes; | ||||||
| 	uint8_t ack; | 	uint8_t ack; | ||||||
| 	int ret; | 	int ret; | ||||||
|  | 	int retry; | ||||||
| 
 | 
 | ||||||
| 	if (WARN_ON(recv_bytes > 19)) | 	if (WARN_ON(recv_bytes > 19)) | ||||||
| 		return -E2BIG; | 		return -E2BIG; | ||||||
|  | @ -595,7 +599,7 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp, | ||||||
| 	msg_bytes = 4; | 	msg_bytes = 4; | ||||||
| 	reply_bytes = recv_bytes + 1; | 	reply_bytes = recv_bytes + 1; | ||||||
| 
 | 
 | ||||||
| 	for (;;) { | 	for (retry = 0; retry < 7; retry++) { | ||||||
| 		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, | 		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, | ||||||
| 				      reply, reply_bytes); | 				      reply, reply_bytes); | ||||||
| 		if (ret == 0) | 		if (ret == 0) | ||||||
|  | @ -608,10 +612,13 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp, | ||||||
| 			return ret - 1; | 			return ret - 1; | ||||||
| 		} | 		} | ||||||
| 		else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | 		else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | ||||||
| 			udelay(100); | 			usleep_range(400, 500); | ||||||
| 		else | 		else | ||||||
| 			return -EIO; | 			return -EIO; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	DRM_ERROR("too many retries, giving up\n"); | ||||||
|  | 	return -EIO; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Greg Kroah-Hartman
				Greg Kroah-Hartman