Linux 4.2-rc7
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJV0R4AAAoJEHm+PkMAQRiG8xIH/AmiRd+JDrs0qqEy46p6X8Gn 0lB5/KsGycvIGIBTiy2nZzcT0Ly6LeFUKUjzPytlOhIZPMrxMVMShDaQKCXXIMUr 1mN6hkvpkLNnUhvL2fR6mm0zkjbz3zZEazFY+Jic8wQrtSkHgfH0DXqSAo8le0f8 kNrd5BPPhIwvpHGaNGFdTpbgpPcalXyQk/fHyvDGidbyXzY/d7l05QfYJ6XCD4Zm IAy48iK5BFts2+z3aOYrOeuuCcm1qFX8YArqzE1rfPp+U/LQpfUfij4cmOqDLn/F qnv9E7bRRVovvrgKe4I3Trta8kT53VLJvqpdw2Usqo8zvhs4VyrYpHC+gEE6YUY= =9Rd4 -----END PGP SIGNATURE----- Merge tag 'v4.2-rc7' into drm-next Linux 4.2-rc7 Backmerge master for i915 fixes
This commit is contained in:
		
				commit
				
					
						4eebf60b74
					
				
			
		
					 825 changed files with 9359 additions and 5262 deletions
				
			
		
							
								
								
									
										1
									
								
								.mailmap
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								.mailmap
									
										
									
									
									
								
							|  | @ -17,6 +17,7 @@ Aleksey Gorelov <aleksey_gorelov@phoenix.com> | |||
| Al Viro <viro@ftp.linux.org.uk> | ||||
| Al Viro <viro@zenIV.linux.org.uk> | ||||
| Andreas Herrmann <aherrman@de.ibm.com> | ||||
| Andrey Ryabinin <ryabinin.a.a@gmail.com> <a.ryabinin@samsung.com> | ||||
| Andrew Morton <akpm@linux-foundation.org> | ||||
| Andrew Vasquez <andrew.vasquez@qlogic.com> | ||||
| Andy Adamson <andros@citi.umich.edu> | ||||
|  |  | |||
|  | @ -199,6 +199,7 @@ nodes to be present and contain the properties described below. | |||
| 			    "qcom,kpss-acc-v1" | ||||
| 			    "qcom,kpss-acc-v2" | ||||
| 			    "rockchip,rk3066-smp" | ||||
| 			    "ste,dbx500-smp" | ||||
| 
 | ||||
| 	- cpu-release-addr | ||||
| 		Usage: required for systems that have an "enable-method" | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ Example: | |||
| 			device_type = "dma"; | ||||
| 			reg = <0x0 0x1f270000 0x0 0x10000>, | ||||
| 			      <0x0 0x1f200000 0x0 0x10000>, | ||||
| 			      <0x0 0x1b008000 0x0 0x2000>, | ||||
| 			      <0x0 0x1b000000 0x0 0x400000>, | ||||
| 			      <0x0 0x1054a000 0x0 0x100>; | ||||
| 			interrupts = <0x0 0x82 0x4>, | ||||
| 				     <0x0 0xb8 0x4>, | ||||
|  |  | |||
|  | @ -35,3 +35,6 @@ the PCIe specification. | |||
| 
 | ||||
|                       NOTE: this only applies to the SMMU itself, not | ||||
|                       masters connected upstream of the SMMU. | ||||
| 
 | ||||
| - hisilicon,broken-prefetch-cmd | ||||
|                     : Avoid sending CMD_PREFETCH_* commands to the SMMU. | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ Required properties: | |||
| 	       "fsl,imx6sx-usdhc" | ||||
| 
 | ||||
| Optional properties: | ||||
| - fsl,cd-controller : Indicate to use controller internal card detection | ||||
| - fsl,wp-controller : Indicate to use controller internal write protection | ||||
| - fsl,delay-line : Specify the number of delay cells for override mode. | ||||
|   This is used to set the clock delay for DLL(Delay Line) on override mode | ||||
|  | @ -35,7 +34,6 @@ esdhc@70004000 { | |||
| 	compatible = "fsl,imx51-esdhc"; | ||||
| 	reg = <0x70004000 0x4000>; | ||||
| 	interrupts = <1>; | ||||
| 	fsl,cd-controller; | ||||
| 	fsl,wp-controller; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -82,6 +82,9 @@ Optional properties: | |||
|  - id: If there are multiple instance of the same type, in order to | ||||
|    differentiate between each instance "id" can be used (e.g., multi-lane PCIe | ||||
|    PHY). If "id" is not provided, it is set to default value of '1'. | ||||
|  - syscon-pllreset: Handle to system control region that contains the | ||||
|    CTRL_CORE_SMA_SW_0 register and register offset to the CTRL_CORE_SMA_SW_0 | ||||
|    register that contains the SATA_PLL_SOFT_RESET bit. Only valid for sata_phy. | ||||
| 
 | ||||
| This is usually a subnode of ocp2scp to which it is connected. | ||||
| 
 | ||||
|  | @ -100,3 +103,16 @@ usb3phy@4a084400 { | |||
| 			"sysclk", | ||||
| 			"refclk"; | ||||
| }; | ||||
| 
 | ||||
| sata_phy: phy@4A096000 { | ||||
| 	compatible = "ti,phy-pipe3-sata"; | ||||
| 	reg = <0x4A096000 0x80>, /* phy_rx */ | ||||
| 	      <0x4A096400 0x64>, /* phy_tx */ | ||||
| 	      <0x4A096800 0x40>; /* pll_ctrl */ | ||||
| 	reg-names = "phy_rx", "phy_tx", "pll_ctrl"; | ||||
| 	ctrl-module = <&omap_control_sata>; | ||||
| 	clocks = <&sys_clkin1>, <&sata_ref_clk>; | ||||
| 	clock-names = "sysclk", "refclk"; | ||||
| 	syscon-pllreset = <&scm_conf 0x3fc>; | ||||
| 	#phy-cells = <0>; | ||||
| }; | ||||
|  |  | |||
|  | @ -3,11 +3,13 @@ MT8173 with MAX98090 CODEC | |||
| Required properties: | ||||
| - compatible : "mediatek,mt8173-max98090" | ||||
| - mediatek,audio-codec: the phandle of the MAX98090 audio codec | ||||
| - mediatek,platform: the phandle of MT8173 ASoC platform | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	sound { | ||||
| 		compatible = "mediatek,mt8173-max98090"; | ||||
| 		mediatek,audio-codec = <&max98090>; | ||||
| 		mediatek,platform = <&afe>; | ||||
| 	}; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS | |||
| Required properties: | ||||
| - compatible : "mediatek,mt8173-rt5650-rt5676" | ||||
| - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs | ||||
| - mediatek,platform: the phandle of MT8173 ASoC platform | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	sound { | ||||
| 		compatible = "mediatek,mt8173-rt5650-rt5676"; | ||||
| 		mediatek,audio-codec = <&rt5650 &rt5676>; | ||||
| 		mediatek,platform = <&afe>; | ||||
| 	}; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ Binding for Qualcomm Atheros AR7xxx/AR9xxx SPI controller | |||
| Required properties: | ||||
| - compatible: has to be "qca,<soc-type>-spi", "qca,ar7100-spi" as fallback. | ||||
| - reg: Base address and size of the controllers memory area | ||||
| - clocks: phandle to the AHB clock. | ||||
| - clocks: phandle of the AHB clock. | ||||
| - clock-names: has to be "ahb". | ||||
| - #address-cells: <1>, as required by generic SPI binding. | ||||
| - #size-cells: <0>, also as required by generic SPI binding. | ||||
|  | @ -12,9 +12,9 @@ Child nodes as per the generic SPI binding. | |||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	spi@1F000000 { | ||||
| 	spi@1f000000 { | ||||
| 		compatible = "qca,ar9132-spi", "qca,ar7100-spi"; | ||||
| 		reg = <0x1F000000 0x10>; | ||||
| 		reg = <0x1f000000 0x10>; | ||||
| 
 | ||||
| 		clocks = <&pll 2>; | ||||
| 		clock-names = "ahb"; | ||||
|  |  | |||
|  | @ -35,11 +35,11 @@ temp1_input		Local temperature (1/1000 degree, | |||
| temp[2-9]_input		CPU temperatures (1/1000 degree, | ||||
| 			0.125 degree resolution) | ||||
| 
 | ||||
| fan[1-4]_mode		R/W, 0/1 for manual or SmartFan mode | ||||
| pwm[1-4]_enable		R/W, 1/2 for manual or SmartFan mode | ||||
| 			Setting SmartFan mode is supported only if it has been | ||||
| 			previously configured by BIOS (or configuration EEPROM) | ||||
| 
 | ||||
| fan[1-4]_pwm		R/O in SmartFan mode, R/W in manual control mode | ||||
| pwm[1-4]		R/O in SmartFan mode, R/W in manual control mode | ||||
| 
 | ||||
| The driver checks sensor control registers and does not export the sensors | ||||
| that are not enabled. Anyway, a sensor that is enabled may actually be not | ||||
|  |  | |||
|  | @ -119,8 +119,10 @@ ALPS Absolute Mode - Protocol Version 2 | |||
|  byte 5:  0   z6   z5   z4   z3   z2   z1   z0 | ||||
| 
 | ||||
| Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for | ||||
| the DualPoint Stick. For non interleaved dualpoint devices the pointingstick | ||||
| buttons get reported separately in the PSM, PSR and PSL bits. | ||||
| the DualPoint Stick. The M, R and L bits signal the combined status of both | ||||
| the pointingstick and touchpad buttons, except for Dell dualpoint devices | ||||
| where the pointingstick buttons get reported separately in the PSM, PSR | ||||
| and PSL bits. | ||||
| 
 | ||||
| Dualpoint device -- interleaved packet format | ||||
| --------------------------------------------- | ||||
|  |  | |||
|  | @ -199,7 +199,8 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 	buf += "#include <linux/string.h>\n" | ||||
| 	buf += "#include <linux/configfs.h>\n" | ||||
| 	buf += "#include <linux/ctype.h>\n" | ||||
| 	buf += "#include <asm/unaligned.h>\n\n" | ||||
| 	buf += "#include <asm/unaligned.h>\n" | ||||
| 	buf += "#include <scsi/scsi_proto.h>\n\n" | ||||
| 	buf += "#include <target/target_core_base.h>\n" | ||||
| 	buf += "#include <target/target_core_fabric.h>\n" | ||||
| 	buf += "#include <target/target_core_fabric_configfs.h>\n" | ||||
|  | @ -230,8 +231,14 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 	buf += "	}\n" | ||||
| 	buf += "	tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n" | ||||
| 	buf += "	tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\n" | ||||
| 	buf += "	ret = core_tpg_register(&" + fabric_mod_name + "_ops, wwn,\n" | ||||
| 	buf += "				&tpg->se_tpg, SCSI_PROTOCOL_SAS);\n" | ||||
| 
 | ||||
| 	if proto_ident == "FC": | ||||
| 		buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);\n" | ||||
| 	elif proto_ident == "SAS": | ||||
| 		buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS);\n" | ||||
| 	elif proto_ident == "iSCSI": | ||||
| 		buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_ISCSI);\n" | ||||
| 
 | ||||
| 	buf += "	if (ret < 0) {\n" | ||||
| 	buf += "		kfree(tpg);\n" | ||||
| 	buf += "		return NULL;\n" | ||||
|  | @ -292,7 +299,7 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 
 | ||||
| 	buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n" | ||||
| 	buf += "	.module				= THIS_MODULE,\n" | ||||
| 	buf += "	.name				= " + fabric_mod_name + ",\n" | ||||
| 	buf += "	.name				= \"" + fabric_mod_name + "\",\n" | ||||
| 	buf += "	.get_fabric_name		= " + fabric_mod_name + "_get_fabric_name,\n" | ||||
| 	buf += "	.tpg_get_wwn			= " + fabric_mod_name + "_get_fabric_wwn,\n" | ||||
| 	buf += "	.tpg_get_tag			= " + fabric_mod_name + "_get_tag,\n" | ||||
|  | @ -322,17 +329,17 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 	buf += "	.fabric_make_tpg		= " + fabric_mod_name + "_make_tpg,\n" | ||||
| 	buf += "	.fabric_drop_tpg		= " + fabric_mod_name + "_drop_tpg,\n" | ||||
| 	buf += "\n" | ||||
| 	buf += "	.tfc_wwn_attrs			= " + fabric_mod_name + "_wwn_attrs;\n" | ||||
| 	buf += "	.tfc_wwn_attrs			= " + fabric_mod_name + "_wwn_attrs,\n" | ||||
| 	buf += "};\n\n" | ||||
| 
 | ||||
| 	buf += "static int __init " + fabric_mod_name + "_init(void)\n" | ||||
| 	buf += "{\n" | ||||
| 	buf += "	return target_register_template(" + fabric_mod_name + "_ops);\n" | ||||
| 	buf += "	return target_register_template(&" + fabric_mod_name + "_ops);\n" | ||||
| 	buf += "};\n\n" | ||||
| 
 | ||||
| 	buf += "static void __exit " + fabric_mod_name + "_exit(void)\n" | ||||
| 	buf += "{\n" | ||||
| 	buf += "	target_unregister_template(" + fabric_mod_name + "_ops);\n" | ||||
| 	buf += "	target_unregister_template(&" + fabric_mod_name + "_ops);\n" | ||||
| 	buf += "};\n\n" | ||||
| 
 | ||||
| 	buf += "MODULE_DESCRIPTION(\"" + fabric_mod_name.upper() + " series fabric driver\");\n" | ||||
|  |  | |||
							
								
								
									
										31
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								MAINTAINERS
									
										
									
									
									
								
							|  | @ -3592,6 +3592,15 @@ S:	Maintained | |||
| F:	drivers/gpu/drm/rockchip/ | ||||
| F:	Documentation/devicetree/bindings/video/rockchip* | ||||
| 
 | ||||
| DRM DRIVERS FOR STI | ||||
| M:	Benjamin Gaignard <benjamin.gaignard@linaro.org> | ||||
| M:	Vincent Abriou <vincent.abriou@st.com> | ||||
| L:	dri-devel@lists.freedesktop.org | ||||
| T:	git http://git.linaro.org/people/benjamin.gaignard/kernel.git | ||||
| S:	Maintained | ||||
| F:	drivers/gpu/drm/sti | ||||
| F:	Documentation/devicetree/bindings/gpu/st,stih4xx.txt | ||||
| 
 | ||||
| DSBR100 USB FM RADIO DRIVER | ||||
| M:	Alexey Klimov <klimov.linux@gmail.com> | ||||
| L:	linux-media@vger.kernel.org | ||||
|  | @ -5605,6 +5614,7 @@ F:	kernel/irq/ | |||
| IRQCHIP DRIVERS | ||||
| M:	Thomas Gleixner <tglx@linutronix.de> | ||||
| M:	Jason Cooper <jason@lakedaemon.net> | ||||
| M:	Marc Zyngier <marc.zyngier@arm.com> | ||||
| L:	linux-kernel@vger.kernel.org | ||||
| S:	Maintained | ||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core | ||||
|  | @ -5613,11 +5623,14 @@ F:	Documentation/devicetree/bindings/interrupt-controller/ | |||
| F:	drivers/irqchip/ | ||||
| 
 | ||||
| IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY) | ||||
| M:	Benjamin Herrenschmidt <benh@kernel.crashing.org> | ||||
| M:	Jiang Liu <jiang.liu@linux.intel.com> | ||||
| M:	Marc Zyngier <marc.zyngier@arm.com> | ||||
| S:	Maintained | ||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core | ||||
| F:	Documentation/IRQ-domain.txt | ||||
| F:	include/linux/irqdomain.h | ||||
| F:	kernel/irq/irqdomain.c | ||||
| F:	kernel/irq/msi.c | ||||
| 
 | ||||
| ISAPNP | ||||
| M:	Jaroslav Kysela <perex@perex.cz> | ||||
|  | @ -5904,7 +5917,6 @@ S:	Supported | |||
| F:	Documentation/s390/kvm.txt | ||||
| F:	arch/s390/include/asm/kvm* | ||||
| F:	arch/s390/kvm/ | ||||
| F:	drivers/s390/kvm/ | ||||
| 
 | ||||
| KERNEL VIRTUAL MACHINE (KVM) FOR ARM | ||||
| M:	Christoffer Dall <christoffer.dall@linaro.org> | ||||
|  | @ -6844,6 +6856,12 @@ T:	git git://linuxtv.org/anttip/media_tree.git | |||
| S:	Maintained | ||||
| F:	drivers/media/usb/msi2500/ | ||||
| 
 | ||||
| MSYSTEMS DISKONCHIP G3 MTD DRIVER | ||||
| M:	Robert Jarzmik <robert.jarzmik@free.fr> | ||||
| L:	linux-mtd@lists.infradead.org | ||||
| S:	Maintained | ||||
| F:	drivers/mtd/devices/docg3* | ||||
| 
 | ||||
| MT9M032 APTINA SENSOR DRIVER | ||||
| M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||||
| L:	linux-media@vger.kernel.org | ||||
|  | @ -10901,6 +10919,15 @@ F:	drivers/block/virtio_blk.c | |||
| F:	include/linux/virtio_*.h | ||||
| F:	include/uapi/linux/virtio_*.h | ||||
| 
 | ||||
| VIRTIO DRIVERS FOR S390 | ||||
| M:	Christian Borntraeger <borntraeger@de.ibm.com> | ||||
| M:	Cornelia Huck <cornelia.huck@de.ibm.com> | ||||
| L:	linux-s390@vger.kernel.org | ||||
| L:	virtualization@lists.linux-foundation.org | ||||
| L:	kvm@vger.kernel.org | ||||
| S:	Supported | ||||
| F:	drivers/s390/virtio/ | ||||
| 
 | ||||
| VIRTIO GPU DRIVER | ||||
| M:	David Airlie <airlied@linux.ie> | ||||
| M:	Gerd Hoffmann <kraxel@redhat.com> | ||||
|  |  | |||
							
								
								
									
										11
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| VERSION = 4 | ||||
| PATCHLEVEL = 2 | ||||
| SUBLEVEL = 0 | ||||
| EXTRAVERSION = -rc3 | ||||
| EXTRAVERSION = -rc7 | ||||
| NAME = Hurr durr I'ma sheep | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  | @ -597,6 +597,11 @@ endif # $(dot-config) | |||
| # Defaults to vmlinux, but the arch makefile usually adds further targets
 | ||||
| all: vmlinux | ||||
| 
 | ||||
| # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
 | ||||
| # values of the respective KBUILD_* variables
 | ||||
| ARCH_CPPFLAGS := | ||||
| ARCH_AFLAGS := | ||||
| ARCH_CFLAGS := | ||||
| include arch/$(SRCARCH)/Makefile | ||||
| 
 | ||||
| KBUILD_CFLAGS	+= $(call cc-option,-fno-delete-null-pointer-checks,) | ||||
|  | @ -848,10 +853,10 @@ export mod_strip_cmd | |||
| mod_compress_cmd = true | ||||
| ifdef CONFIG_MODULE_COMPRESS | ||||
|   ifdef CONFIG_MODULE_COMPRESS_GZIP | ||||
|     mod_compress_cmd = gzip -n | ||||
|     mod_compress_cmd = gzip -n -f | ||||
|   endif # CONFIG_MODULE_COMPRESS_GZIP | ||||
|   ifdef CONFIG_MODULE_COMPRESS_XZ | ||||
|     mod_compress_cmd = xz | ||||
|     mod_compress_cmd = xz -f | ||||
|   endif # CONFIG_MODULE_COMPRESS_XZ | ||||
| endif # CONFIG_MODULE_COMPRESS
 | ||||
| export mod_compress_cmd | ||||
|  |  | |||
|  | @ -313,11 +313,11 @@ config ARC_PAGE_SIZE_8K | |||
| 
 | ||||
| config ARC_PAGE_SIZE_16K | ||||
| 	bool "16KB" | ||||
| 	depends on ARC_MMU_V3 | ||||
| 	depends on ARC_MMU_V3 || ARC_MMU_V4 | ||||
| 
 | ||||
| config ARC_PAGE_SIZE_4K | ||||
| 	bool "4KB" | ||||
| 	depends on ARC_MMU_V3 | ||||
| 	depends on ARC_MMU_V3 || ARC_MMU_V4 | ||||
| 
 | ||||
| endchoice | ||||
| 
 | ||||
|  | @ -365,6 +365,11 @@ config ARC_HAS_LLSC | |||
| 	default y | ||||
| 	depends on !ARC_CANT_LLSC | ||||
| 
 | ||||
| config ARC_STAR_9000923308 | ||||
| 	bool "Workaround for llock/scond livelock" | ||||
| 	default y | ||||
| 	depends on ISA_ARCV2 && SMP && ARC_HAS_LLSC | ||||
| 
 | ||||
| config ARC_HAS_SWAPE | ||||
| 	bool "Insn: SWAPE (endian-swap)" | ||||
| 	default y | ||||
|  | @ -379,6 +384,10 @@ config ARC_HAS_LL64 | |||
| 	  dest operands with 2 possible source operands. | ||||
| 	default y | ||||
| 
 | ||||
| config ARC_HAS_DIV_REM | ||||
| 	bool "Insn: div, divu, rem, remu" | ||||
| 	default y | ||||
| 
 | ||||
| config ARC_HAS_RTC | ||||
| 	bool "Local 64-bit r/o cycle counter" | ||||
| 	default n | ||||
|  |  | |||
|  | @ -36,8 +36,16 @@ cflags-$(atleast_gcc44)			+= -fsection-anchors | |||
| cflags-$(CONFIG_ARC_HAS_LLSC)		+= -mlock | ||||
| cflags-$(CONFIG_ARC_HAS_SWAPE)		+= -mswape | ||||
| 
 | ||||
| ifdef CONFIG_ISA_ARCV2 | ||||
| 
 | ||||
| ifndef CONFIG_ARC_HAS_LL64 | ||||
| cflags-$(CONFIG_ISA_ARCV2)		+= -mno-ll64 | ||||
| cflags-y				+= -mno-ll64 | ||||
| endif | ||||
| 
 | ||||
| ifndef CONFIG_ARC_HAS_DIV_REM | ||||
| cflags-y				+= -mno-div-rem | ||||
| endif | ||||
| 
 | ||||
| endif | ||||
| 
 | ||||
| cflags-$(CONFIG_ARC_DW2_UNWIND)		+= -fasynchronous-unwind-tables | ||||
|  |  | |||
|  | @ -89,11 +89,10 @@ | |||
| #define ECR_C_BIT_DTLB_LD_MISS		8 | ||||
| #define ECR_C_BIT_DTLB_ST_MISS		9 | ||||
| 
 | ||||
| 
 | ||||
| /* Auxiliary registers */ | ||||
| #define AUX_IDENTITY		4 | ||||
| #define AUX_INTR_VEC_BASE	0x25 | ||||
| 
 | ||||
| #define AUX_NON_VOL		0x5e | ||||
| 
 | ||||
| /*
 | ||||
|  * Floating Pt Registers | ||||
|  | @ -240,9 +239,9 @@ struct bcr_extn_xymem { | |||
| 
 | ||||
| struct bcr_perip { | ||||
| #ifdef CONFIG_CPU_BIG_ENDIAN | ||||
| 	unsigned int start:8, pad2:8, sz:8, pad:8; | ||||
| 	unsigned int start:8, pad2:8, sz:8, ver:8; | ||||
| #else | ||||
| 	unsigned int pad:8, sz:8, pad2:8, start:8; | ||||
| 	unsigned int ver:8, sz:8, pad2:8, start:8; | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,33 +23,60 @@ | |||
| 
 | ||||
| #define atomic_set(v, i) (((v)->counter) = (i)) | ||||
| 
 | ||||
| #ifdef CONFIG_ISA_ARCV2 | ||||
| #define PREFETCHW	"	prefetchw   [%1]	\n" | ||||
| #else | ||||
| #define PREFETCHW | ||||
| #ifdef CONFIG_ARC_STAR_9000923308 | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VAR_DEF						\ | ||||
| 	unsigned int delay = 1, tmp;						\ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_ASM							\ | ||||
| 	"	bz	4f			\n"				\ | ||||
| 	"   ; --- scond fail delay ---		\n"				\ | ||||
| 	"	mov	%[tmp], %[delay]	\n"	/* tmp = delay */	\ | ||||
| 	"2: 	brne.d	%[tmp], 0, 2b		\n"	/* while (tmp != 0) */	\ | ||||
| 	"	sub	%[tmp], %[tmp], 1	\n"	/* tmp-- */		\ | ||||
| 	"	rol	%[delay], %[delay]	\n"	/* delay *= 2 */	\ | ||||
| 	"	b	1b			\n"	/* start over */	\ | ||||
| 	"4: ; --- success ---			\n"				\ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VARS							\ | ||||
| 	  ,[delay] "+&r" (delay),[tmp] "=&r"	(tmp)				\ | ||||
| 
 | ||||
| #else	/* !CONFIG_ARC_STAR_9000923308 */ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VAR_DEF | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_ASM							\ | ||||
| 	"	bnz     1b			\n"				\ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VARS | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #define ATOMIC_OP(op, c_op, asm_op)					\ | ||||
| static inline void atomic_##op(int i, atomic_t *v)			\ | ||||
| {									\ | ||||
| 	unsigned int temp;						\ | ||||
| 	unsigned int val;				                \ | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF                                        \ | ||||
| 									\ | ||||
| 	__asm__ __volatile__(						\ | ||||
| 	"1:				\n"				\ | ||||
| 	PREFETCHW							\ | ||||
| 	"	llock   %0, [%1]	\n"				\ | ||||
| 	"	" #asm_op " %0, %0, %2	\n"				\ | ||||
| 	"	scond   %0, [%1]	\n"				\ | ||||
| 	"	bnz     1b		\n"				\ | ||||
| 	: "=&r"(temp)	/* Early clobber, to prevent reg reuse */	\ | ||||
| 	: "r"(&v->counter), "ir"(i)					\ | ||||
| 	"1:	llock   %[val], [%[ctr]]		\n"		\ | ||||
| 	"	" #asm_op " %[val], %[val], %[i]	\n"		\ | ||||
| 	"	scond   %[val], [%[ctr]]		\n"		\ | ||||
| 	"						\n"		\ | ||||
| 	SCOND_FAIL_RETRY_ASM						\ | ||||
| 									\ | ||||
| 	: [val]	"=&r"	(val) /* Early clobber to prevent reg reuse */	\ | ||||
| 	  SCOND_FAIL_RETRY_VARS						\ | ||||
| 	: [ctr]	"r"	(&v->counter), /* Not "m": llock only supports reg direct addr mode */	\ | ||||
| 	  [i]	"ir"	(i)						\ | ||||
| 	: "cc");							\ | ||||
| }									\ | ||||
| 
 | ||||
| #define ATOMIC_OP_RETURN(op, c_op, asm_op)				\ | ||||
| static inline int atomic_##op##_return(int i, atomic_t *v)		\ | ||||
| {									\ | ||||
| 	unsigned int temp;						\ | ||||
| 	unsigned int val;				                \ | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF                                        \ | ||||
| 									\ | ||||
| 	/*								\
 | ||||
| 	 * Explicit full memory barrier needed before/after as		\ | ||||
|  | @ -58,19 +85,21 @@ static inline int atomic_##op##_return(int i, atomic_t *v)		\ | |||
| 	smp_mb();							\ | ||||
| 									\ | ||||
| 	__asm__ __volatile__(						\ | ||||
| 	"1:				\n"				\ | ||||
| 	PREFETCHW							\ | ||||
| 	"	llock   %0, [%1]	\n"				\ | ||||
| 	"	" #asm_op " %0, %0, %2	\n"				\ | ||||
| 	"	scond   %0, [%1]	\n"				\ | ||||
| 	"	bnz     1b		\n"				\ | ||||
| 	: "=&r"(temp)							\ | ||||
| 	: "r"(&v->counter), "ir"(i)					\ | ||||
| 	"1:	llock   %[val], [%[ctr]]		\n"		\ | ||||
| 	"	" #asm_op " %[val], %[val], %[i]	\n"		\ | ||||
| 	"	scond   %[val], [%[ctr]]		\n"		\ | ||||
| 	"						\n"		\ | ||||
| 	SCOND_FAIL_RETRY_ASM						\ | ||||
| 									\ | ||||
| 	: [val]	"=&r"	(val)						\ | ||||
| 	  SCOND_FAIL_RETRY_VARS						\ | ||||
| 	: [ctr]	"r"	(&v->counter),					\ | ||||
| 	  [i]	"ir"	(i)						\ | ||||
| 	: "cc");							\ | ||||
| 									\ | ||||
| 	smp_mb();							\ | ||||
| 									\ | ||||
| 	return temp;							\ | ||||
| 	return val;							\ | ||||
| } | ||||
| 
 | ||||
| #else	/* !CONFIG_ARC_HAS_LLSC */ | ||||
|  | @ -150,6 +179,9 @@ ATOMIC_OP(and, &=, and) | |||
| #undef ATOMIC_OPS | ||||
| #undef ATOMIC_OP_RETURN | ||||
| #undef ATOMIC_OP | ||||
| #undef SCOND_FAIL_RETRY_VAR_DEF | ||||
| #undef SCOND_FAIL_RETRY_ASM | ||||
| #undef SCOND_FAIL_RETRY_VARS | ||||
| 
 | ||||
| /**
 | ||||
|  * __atomic_add_unless - add unless the number is a given value | ||||
|  |  | |||
|  | @ -20,20 +20,20 @@ | |||
| struct pt_regs { | ||||
| 
 | ||||
| 	/* Real registers */ | ||||
| 	long bta;	/* bta_l1, bta_l2, erbta */ | ||||
| 	unsigned long bta;	/* bta_l1, bta_l2, erbta */ | ||||
| 
 | ||||
| 	long lp_start, lp_end, lp_count; | ||||
| 	unsigned long lp_start, lp_end, lp_count; | ||||
| 
 | ||||
| 	long status32;	/* status32_l1, status32_l2, erstatus */ | ||||
| 	long ret;	/* ilink1, ilink2 or eret */ | ||||
| 	long blink; | ||||
| 	long fp; | ||||
| 	long r26;	/* gp */ | ||||
| 	unsigned long status32;	/* status32_l1, status32_l2, erstatus */ | ||||
| 	unsigned long ret;	/* ilink1, ilink2 or eret */ | ||||
| 	unsigned long blink; | ||||
| 	unsigned long fp; | ||||
| 	unsigned long r26;	/* gp */ | ||||
| 
 | ||||
| 	long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; | ||||
| 	unsigned long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; | ||||
| 
 | ||||
| 	long sp;	/* user/kernel sp depending on where we came from  */ | ||||
| 	long orig_r0; | ||||
| 	unsigned long sp;	/* User/Kernel depending on where we came from */ | ||||
| 	unsigned long orig_r0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * To distinguish bet excp, syscall, irq | ||||
|  | @ -55,13 +55,13 @@ struct pt_regs { | |||
| 		unsigned long event; | ||||
| 	}; | ||||
| 
 | ||||
| 	long user_r25; | ||||
| 	unsigned long user_r25; | ||||
| }; | ||||
| #else | ||||
| 
 | ||||
| struct pt_regs { | ||||
| 
 | ||||
| 	long orig_r0; | ||||
| 	unsigned long orig_r0; | ||||
| 
 | ||||
| 	union { | ||||
| 		struct { | ||||
|  | @ -76,26 +76,26 @@ struct pt_regs { | |||
| 		unsigned long event; | ||||
| 	}; | ||||
| 
 | ||||
| 	long bta;	/* bta_l1, bta_l2, erbta */ | ||||
| 	unsigned long bta;	/* bta_l1, bta_l2, erbta */ | ||||
| 
 | ||||
| 	long user_r25; | ||||
| 	unsigned long user_r25; | ||||
| 
 | ||||
| 	long r26;	/* gp */ | ||||
| 	long fp; | ||||
| 	long sp;	/* user/kernel sp depending on where we came from  */ | ||||
| 	unsigned long r26;	/* gp */ | ||||
| 	unsigned long fp; | ||||
| 	unsigned long sp;	/* user/kernel sp depending on where we came from  */ | ||||
| 
 | ||||
| 	long r12; | ||||
| 	unsigned long r12; | ||||
| 
 | ||||
| 	/*------- Below list auto saved by h/w -----------*/ | ||||
| 	long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11; | ||||
| 	unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11; | ||||
| 
 | ||||
| 	long blink; | ||||
| 	long lp_end, lp_start, lp_count; | ||||
| 	unsigned long blink; | ||||
| 	unsigned long lp_end, lp_start, lp_count; | ||||
| 
 | ||||
| 	long ei, ldi, jli; | ||||
| 	unsigned long ei, ldi, jli; | ||||
| 
 | ||||
| 	long ret; | ||||
| 	long status32; | ||||
| 	unsigned long ret; | ||||
| 	unsigned long status32; | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  | @ -103,10 +103,10 @@ struct pt_regs { | |||
| /* Callee saved registers - need to be saved only when you are scheduled out */ | ||||
| 
 | ||||
| struct callee_regs { | ||||
| 	long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13; | ||||
| 	unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13; | ||||
| }; | ||||
| 
 | ||||
| #define instruction_pointer(regs)	(unsigned long)((regs)->ret) | ||||
| #define instruction_pointer(regs)	((regs)->ret) | ||||
| #define profile_pc(regs)		instruction_pointer(regs) | ||||
| 
 | ||||
| /* return 1 if user mode or 0 if kernel mode */ | ||||
|  | @ -142,7 +142,7 @@ struct callee_regs { | |||
| 
 | ||||
| static inline long regs_return_value(struct pt_regs *regs) | ||||
| { | ||||
| 	return regs->r0; | ||||
| 	return (long)regs->r0; | ||||
| } | ||||
| 
 | ||||
| #endif /* !__ASSEMBLY__ */ | ||||
|  |  | |||
|  | @ -18,9 +18,518 @@ | |||
| #define arch_spin_unlock_wait(x) \ | ||||
| 	do { while (arch_spin_is_locked(x)) cpu_relax(); } while (0) | ||||
| 
 | ||||
| #ifdef CONFIG_ARC_HAS_LLSC | ||||
| 
 | ||||
| /*
 | ||||
|  * A normal LLOCK/SCOND based system, w/o need for livelock workaround | ||||
|  */ | ||||
| #ifndef CONFIG_ARC_STAR_9000923308 | ||||
| 
 | ||||
| static inline void arch_spin_lock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int tmp = __ARCH_SPIN_LOCK_LOCKED__; | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[slock]]	\n" | ||||
| 	"	breq	%[val], %[LOCKED], 1b	\n"	/* spin while LOCKED */ | ||||
| 	"	scond	%[LOCKED], [%[slock]]	\n"	/* acquire */ | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [slock]	"r"	(&(lock->slock)), | ||||
| 	  [LOCKED]	"r"	(__ARCH_SPIN_LOCK_LOCKED__) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_spin_trylock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[slock]]	\n" | ||||
| 	"	breq	%[val], %[LOCKED], 4f	\n"	/* already LOCKED, just bail */ | ||||
| 	"	scond	%[LOCKED], [%[slock]]	\n"	/* acquire */ | ||||
| 	"	bnz	1b			\n" | ||||
| 	"	mov	%[got_it], 1		\n" | ||||
| 	"4:					\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	: [slock]	"r"	(&(lock->slock)), | ||||
| 	  [LOCKED]	"r"	(__ARCH_SPIN_LOCK_LOCKED__) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_spin_unlock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	lock->slock = __ARCH_SPIN_LOCK_UNLOCKED__; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Read-write spinlocks, allowing multiple readers but only one writer. | ||||
|  * Unfair locking as Writers could be starved indefinitely by Reader(s) | ||||
|  */ | ||||
| 
 | ||||
| static inline void arch_read_lock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * zero means writer holds the lock exclusively, deny Reader. | ||||
| 	 * Otherwise grant lock to first/subseq reader | ||||
| 	 * | ||||
| 	 * 	if (rw->counter > 0) { | ||||
| 	 *		rw->counter--; | ||||
| 	 *		ret = 1; | ||||
| 	 *	} | ||||
| 	 */ | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brls	%[val], %[WR_LOCKED], 1b\n"	/* <= 0: spin while write locked */ | ||||
| 	"	sub	%[val], %[val], 1	\n"	/* reader lock */ | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_read_trylock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brls	%[val], %[WR_LOCKED], 4f\n"	/* <= 0: already write locked, bail */ | ||||
| 	"	sub	%[val], %[val], 1	\n"	/* counter-- */ | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n"	/* retry if collided with someone */ | ||||
| 	"	mov	%[got_it], 1		\n" | ||||
| 	"					\n" | ||||
| 	"4: ; --- done ---			\n" | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_write_lock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If reader(s) hold lock (lock < __ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	 * deny writer. Otherwise if unlocked grant to writer | ||||
| 	 * Hence the claim that Linux rwlocks are unfair to writers. | ||||
| 	 * (can be starved for an indefinite time by readers). | ||||
| 	 * | ||||
| 	 *	if (rw->counter == __ARCH_RW_LOCK_UNLOCKED__) { | ||||
| 	 *		rw->counter = 0; | ||||
| 	 *		ret = 1; | ||||
| 	 *	} | ||||
| 	 */ | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brne	%[val], %[UNLOCKED], 1b	\n"	/* while !UNLOCKED spin */ | ||||
| 	"	mov	%[val], %[WR_LOCKED]	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [UNLOCKED]	"ir"	(__ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_write_trylock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brne	%[val], %[UNLOCKED], 4f	\n"	/* !UNLOCKED, bail */ | ||||
| 	"	mov	%[val], %[WR_LOCKED]	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n"	/* retry if collided with someone */ | ||||
| 	"	mov	%[got_it], 1		\n" | ||||
| 	"					\n" | ||||
| 	"4: ; --- done ---			\n" | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [UNLOCKED]	"ir"	(__ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_read_unlock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * rw->counter++; | ||||
| 	 */ | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	add	%[val], %[val], 1	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| static inline void arch_write_unlock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	rw->counter = __ARCH_RW_LOCK_UNLOCKED__; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| #else	/* CONFIG_ARC_STAR_9000923308 */ | ||||
| 
 | ||||
| /*
 | ||||
|  * HS38x4 could get into a LLOCK/SCOND livelock in case of multiple overlapping | ||||
|  * coherency transactions in the SCU. The exclusive line state keeps rotating | ||||
|  * among contenting cores leading to a never ending cycle. So break the cycle | ||||
|  * by deferring the retry of failed exclusive access (SCOND). The actual delay | ||||
|  * needed is function of number of contending cores as well as the unrelated | ||||
|  * coherency traffic from other cores. To keep the code simple, start off with | ||||
|  * small delay of 1 which would suffice most cases and in case of contention | ||||
|  * double the delay. Eventually the delay is sufficient such that the coherency | ||||
|  * pipeline is drained, thus a subsequent exclusive access would succeed. | ||||
|  */ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VAR_DEF						\ | ||||
| 	unsigned int delay, tmp;						\ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_ASM							\ | ||||
| 	"   ; --- scond fail delay ---		\n"				\ | ||||
| 	"	mov	%[tmp], %[delay]	\n"	/* tmp = delay */	\ | ||||
| 	"2: 	brne.d	%[tmp], 0, 2b		\n"	/* while (tmp != 0) */	\ | ||||
| 	"	sub	%[tmp], %[tmp], 1	\n"	/* tmp-- */		\ | ||||
| 	"	rol	%[delay], %[delay]	\n"	/* delay *= 2 */	\ | ||||
| 	"	b	1b			\n"	/* start over */	\ | ||||
| 	"					\n"				\ | ||||
| 	"4: ; --- done ---			\n"				\ | ||||
| 
 | ||||
| #define SCOND_FAIL_RETRY_VARS							\ | ||||
| 	  ,[delay] "=&r" (delay), [tmp] "=&r"	(tmp)				\ | ||||
| 
 | ||||
| static inline void arch_spin_lock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[slock]]	\n" | ||||
| 	"	breq	%[val], %[LOCKED], 0b	\n"	/* spin while LOCKED */ | ||||
| 	"	scond	%[LOCKED], [%[slock]]	\n"	/* acquire */ | ||||
| 	"	bz	4f			\n"	/* done */ | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [slock]	"r"	(&(lock->slock)), | ||||
| 	  [LOCKED]	"r"	(__ARCH_SPIN_LOCK_LOCKED__) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_spin_trylock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[slock]]	\n" | ||||
| 	"	breq	%[val], %[LOCKED], 4f	\n"	/* already LOCKED, just bail */ | ||||
| 	"	scond	%[LOCKED], [%[slock]]	\n"	/* acquire */ | ||||
| 	"	bz.d	4f			\n" | ||||
| 	"	mov.z	%[got_it], 1		\n"	/* got it */ | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [slock]	"r"	(&(lock->slock)), | ||||
| 	  [LOCKED]	"r"	(__ARCH_SPIN_LOCK_LOCKED__) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_spin_unlock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	lock->slock = __ARCH_SPIN_LOCK_UNLOCKED__; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Read-write spinlocks, allowing multiple readers but only one writer. | ||||
|  * Unfair locking as Writers could be starved indefinitely by Reader(s) | ||||
|  */ | ||||
| 
 | ||||
| static inline void arch_read_lock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * zero means writer holds the lock exclusively, deny Reader. | ||||
| 	 * Otherwise grant lock to first/subseq reader | ||||
| 	 * | ||||
| 	 * 	if (rw->counter > 0) { | ||||
| 	 *		rw->counter--; | ||||
| 	 *		ret = 1; | ||||
| 	 *	} | ||||
| 	 */ | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brls	%[val], %[WR_LOCKED], 0b\n"	/* <= 0: spin while write locked */ | ||||
| 	"	sub	%[val], %[val], 1	\n"	/* reader lock */ | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bz	4f			\n"	/* done */ | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_read_trylock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brls	%[val], %[WR_LOCKED], 4f\n"	/* <= 0: already write locked, bail */ | ||||
| 	"	sub	%[val], %[val], 1	\n"	/* counter-- */ | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bz.d	4f			\n" | ||||
| 	"	mov.z	%[got_it], 1		\n"	/* got it */ | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_write_lock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If reader(s) hold lock (lock < __ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	 * deny writer. Otherwise if unlocked grant to writer | ||||
| 	 * Hence the claim that Linux rwlocks are unfair to writers. | ||||
| 	 * (can be starved for an indefinite time by readers). | ||||
| 	 * | ||||
| 	 *	if (rw->counter == __ARCH_RW_LOCK_UNLOCKED__) { | ||||
| 	 *		rw->counter = 0; | ||||
| 	 *		ret = 1; | ||||
| 	 *	} | ||||
| 	 */ | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brne	%[val], %[UNLOCKED], 0b	\n"	/* while !UNLOCKED spin */ | ||||
| 	"	mov	%[val], %[WR_LOCKED]	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bz	4f			\n" | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [UNLOCKED]	"ir"	(__ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_write_trylock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val, got_it = 0; | ||||
| 	SCOND_FAIL_RETRY_VAR_DEF; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"0:	mov	%[delay], 1		\n" | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	brne	%[val], %[UNLOCKED], 4f	\n"	/* !UNLOCKED, bail */ | ||||
| 	"	mov	%[val], %[WR_LOCKED]	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bz.d	4f			\n" | ||||
| 	"	mov.z	%[got_it], 1		\n"	/* got it */ | ||||
| 	"					\n" | ||||
| 	SCOND_FAIL_RETRY_ASM | ||||
| 
 | ||||
| 	: [val]		"=&r"	(val), | ||||
| 	  [got_it]	"+&r"	(got_it) | ||||
| 	  SCOND_FAIL_RETRY_VARS | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [UNLOCKED]	"ir"	(__ARCH_RW_LOCK_UNLOCKED__), | ||||
| 	  [WR_LOCKED]	"ir"	(0) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return got_it; | ||||
| } | ||||
| 
 | ||||
| static inline void arch_read_unlock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * rw->counter++; | ||||
| 	 */ | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	add	%[val], %[val], 1	\n" | ||||
| 	"	scond	%[val], [%[rwlock]]	\n" | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| static inline void arch_write_unlock(arch_rwlock_t *rw) | ||||
| { | ||||
| 	unsigned int val; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * rw->counter = __ARCH_RW_LOCK_UNLOCKED__; | ||||
| 	 */ | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	llock	%[val], [%[rwlock]]	\n" | ||||
| 	"	scond	%[UNLOCKED], [%[rwlock]]\n" | ||||
| 	"	bnz	1b			\n" | ||||
| 	"					\n" | ||||
| 	: [val]		"=&r"	(val) | ||||
| 	: [rwlock]	"r"	(&(rw->counter)), | ||||
| 	  [UNLOCKED]	"r"	(__ARCH_RW_LOCK_UNLOCKED__) | ||||
| 	: "memory", "cc"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| #undef SCOND_FAIL_RETRY_VAR_DEF | ||||
| #undef SCOND_FAIL_RETRY_ASM | ||||
| #undef SCOND_FAIL_RETRY_VARS | ||||
| 
 | ||||
| #endif	/* CONFIG_ARC_STAR_9000923308 */ | ||||
| 
 | ||||
| #else	/* !CONFIG_ARC_HAS_LLSC */ | ||||
| 
 | ||||
| static inline void arch_spin_lock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int val = __ARCH_SPIN_LOCK_LOCKED__; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * This smp_mb() is technically superfluous, we only need the one | ||||
|  | @ -33,7 +542,7 @@ static inline void arch_spin_lock(arch_spinlock_t *lock) | |||
| 	__asm__ __volatile__( | ||||
| 	"1:	ex  %0, [%1]		\n" | ||||
| 	"	breq  %0, %2, 1b	\n" | ||||
| 	: "+&r" (tmp) | ||||
| 	: "+&r" (val) | ||||
| 	: "r"(&(lock->slock)), "ir"(__ARCH_SPIN_LOCK_LOCKED__) | ||||
| 	: "memory"); | ||||
| 
 | ||||
|  | @ -48,26 +557,27 @@ static inline void arch_spin_lock(arch_spinlock_t *lock) | |||
| 	smp_mb(); | ||||
| } | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_spin_trylock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int tmp = __ARCH_SPIN_LOCK_LOCKED__; | ||||
| 	unsigned int val = __ARCH_SPIN_LOCK_LOCKED__; | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"1:	ex  %0, [%1]		\n" | ||||
| 	: "+r" (tmp) | ||||
| 	: "+r" (val) | ||||
| 	: "r"(&(lock->slock)) | ||||
| 	: "memory"); | ||||
| 
 | ||||
| 	smp_mb(); | ||||
| 
 | ||||
| 	return (tmp == __ARCH_SPIN_LOCK_UNLOCKED__); | ||||
| 	return (val == __ARCH_SPIN_LOCK_UNLOCKED__); | ||||
| } | ||||
| 
 | ||||
| static inline void arch_spin_unlock(arch_spinlock_t *lock) | ||||
| { | ||||
| 	unsigned int tmp = __ARCH_SPIN_LOCK_UNLOCKED__; | ||||
| 	unsigned int val = __ARCH_SPIN_LOCK_UNLOCKED__; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * RELEASE barrier: given the instructions avail on ARCv2, full barrier | ||||
|  | @ -77,7 +587,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock) | |||
| 
 | ||||
| 	__asm__ __volatile__( | ||||
| 	"	ex  %0, [%1]		\n" | ||||
| 	: "+r" (tmp) | ||||
| 	: "+r" (val) | ||||
| 	: "r"(&(lock->slock)) | ||||
| 	: "memory"); | ||||
| 
 | ||||
|  | @ -90,19 +600,12 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock) | |||
| 
 | ||||
| /*
 | ||||
|  * Read-write spinlocks, allowing multiple readers but only one writer. | ||||
|  * Unfair locking as Writers could be starved indefinitely by Reader(s) | ||||
|  * | ||||
|  * The spinlock itself is contained in @counter and access to it is | ||||
|  * serialized with @lock_mutex. | ||||
|  * | ||||
|  * Unfair locking as Writers could be starved indefinitely by Reader(s) | ||||
|  */ | ||||
| 
 | ||||
| /* Would read_trylock() succeed? */ | ||||
| #define arch_read_can_lock(x)	((x)->counter > 0) | ||||
| 
 | ||||
| /* Would write_trylock() succeed? */ | ||||
| #define arch_write_can_lock(x)	((x)->counter == __ARCH_RW_LOCK_UNLOCKED__) | ||||
| 
 | ||||
| /* 1 - lock taken successfully */ | ||||
| static inline int arch_read_trylock(arch_rwlock_t *rw) | ||||
| { | ||||
|  | @ -173,6 +676,11 @@ static inline void arch_write_unlock(arch_rwlock_t *rw) | |||
| 	arch_spin_unlock(&(rw->lock_mutex)); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #define arch_read_can_lock(x)	((x)->counter > 0) | ||||
| #define arch_write_can_lock(x)	((x)->counter == __ARCH_RW_LOCK_UNLOCKED__) | ||||
| 
 | ||||
| #define arch_read_lock_flags(lock, flags)	arch_read_lock(lock) | ||||
| #define arch_write_lock_flags(lock, flags)	arch_write_lock(lock) | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,7 +26,9 @@ typedef struct { | |||
|  */ | ||||
| typedef struct { | ||||
| 	volatile unsigned int	counter; | ||||
| #ifndef CONFIG_ARC_HAS_LLSC | ||||
| 	arch_spinlock_t		lock_mutex; | ||||
| #endif | ||||
| } arch_rwlock_t; | ||||
| 
 | ||||
| #define __ARCH_RW_LOCK_UNLOCKED__	0x01000000 | ||||
|  |  | |||
|  | @ -32,20 +32,20 @@ | |||
| */ | ||||
| struct user_regs_struct { | ||||
| 
 | ||||
| 	long pad; | ||||
| 	unsigned long pad; | ||||
| 	struct { | ||||
| 		long bta, lp_start, lp_end, lp_count; | ||||
| 		long status32, ret, blink, fp, gp; | ||||
| 		long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; | ||||
| 		long sp; | ||||
| 		unsigned long bta, lp_start, lp_end, lp_count; | ||||
| 		unsigned long status32, ret, blink, fp, gp; | ||||
| 		unsigned long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; | ||||
| 		unsigned long sp; | ||||
| 	} scratch; | ||||
| 	long pad2; | ||||
| 	unsigned long pad2; | ||||
| 	struct { | ||||
| 		long r25, r24, r23, r22, r21, r20; | ||||
| 		long r19, r18, r17, r16, r15, r14, r13; | ||||
| 		unsigned long r25, r24, r23, r22, r21, r20; | ||||
| 		unsigned long r19, r18, r17, r16, r15, r14, r13; | ||||
| 	} callee; | ||||
| 	long efa;	/* break pt addr, for break points in delay slots */ | ||||
| 	long stop_pc;	/* give dbg stop_pc after ensuring brkpt trap */ | ||||
| 	unsigned long efa;	/* break pt addr, for break points in delay slots */ | ||||
| 	unsigned long stop_pc;	/* give dbg stop_pc after ensuring brkpt trap */ | ||||
| }; | ||||
| #endif /* !__ASSEMBLY__ */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ static void read_arc_build_cfg_regs(void) | |||
| 	struct bcr_perip uncached_space; | ||||
| 	struct bcr_generic bcr; | ||||
| 	struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()]; | ||||
| 	unsigned long perip_space; | ||||
| 	FIX_PTR(cpu); | ||||
| 
 | ||||
| 	READ_BCR(AUX_IDENTITY, cpu->core); | ||||
|  | @ -56,7 +57,12 @@ static void read_arc_build_cfg_regs(void) | |||
| 	cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE); | ||||
| 
 | ||||
| 	READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space); | ||||
| 	BUG_ON((uncached_space.start << 24) != ARC_UNCACHED_ADDR_SPACE); | ||||
|         if (uncached_space.ver < 3) | ||||
| 		perip_space = uncached_space.start << 24; | ||||
| 	else | ||||
| 		perip_space = read_aux_reg(AUX_NON_VOL) & 0xF0000000; | ||||
| 
 | ||||
| 	BUG_ON(perip_space != ARC_UNCACHED_ADDR_SPACE); | ||||
| 
 | ||||
| 	READ_BCR(ARC_REG_MUL_BCR, cpu->extn_mpy); | ||||
| 
 | ||||
|  | @ -330,6 +336,10 @@ static void arc_chk_core_config(void) | |||
| 		pr_warn("CONFIG_ARC_FPU_SAVE_RESTORE needed for working apps\n"); | ||||
| 	else if (!cpu->extn.fpu_dp && fpu_enabled) | ||||
| 		panic("FPU non-existent, disable CONFIG_ARC_FPU_SAVE_RESTORE\n"); | ||||
| 
 | ||||
| 	if (is_isa_arcv2() && IS_ENABLED(CONFIG_SMP) && cpu->isa.atomic && | ||||
| 	    !IS_ENABLED(CONFIG_ARC_STAR_9000923308)) | ||||
| 		panic("llock/scond livelock workaround missing\n"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
|  | @ -203,34 +203,24 @@ static int arc_clkevent_set_next_event(unsigned long delta, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void arc_clkevent_set_mode(enum clock_event_mode mode, | ||||
| 				  struct clock_event_device *dev) | ||||
| static int arc_clkevent_set_periodic(struct clock_event_device *dev) | ||||
| { | ||||
| 	switch (mode) { | ||||
| 	case CLOCK_EVT_MODE_PERIODIC: | ||||
| 	/*
 | ||||
| 	 * At X Hz, 1 sec = 1000ms -> X cycles; | ||||
| 	 *		      10ms -> X / 100 cycles | ||||
| 	 */ | ||||
| 	arc_timer_event_setup(arc_get_core_freq() / HZ); | ||||
| 		break; | ||||
| 	case CLOCK_EVT_MODE_ONESHOT: | ||||
| 		break; | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	return; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static DEFINE_PER_CPU(struct clock_event_device, arc_clockevent_device) = { | ||||
| 	.name			= "ARC Timer0", | ||||
| 	.features	= CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, | ||||
| 	.mode		= CLOCK_EVT_MODE_UNUSED, | ||||
| 	.features		= CLOCK_EVT_FEAT_ONESHOT | | ||||
| 				  CLOCK_EVT_FEAT_PERIODIC, | ||||
| 	.rating			= 300, | ||||
| 	.irq			= TIMER0_IRQ,	/* hardwired, no need for resources */ | ||||
| 	.set_next_event		= arc_clkevent_set_next_event, | ||||
| 	.set_mode	= arc_clkevent_set_mode, | ||||
| 	.set_state_periodic	= arc_clkevent_set_periodic, | ||||
| }; | ||||
| 
 | ||||
| static irqreturn_t timer_irq_handler(int irq, void *dev_id) | ||||
|  | @ -240,7 +230,7 @@ static irqreturn_t timer_irq_handler(int irq, void *dev_id) | |||
| 	 * irq_set_chip_and_handler() asked for handle_percpu_devid_irq() | ||||
| 	 */ | ||||
| 	struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); | ||||
| 	int irq_reenable = evt->mode == CLOCK_EVT_MODE_PERIODIC; | ||||
| 	int irq_reenable = clockevent_state_periodic(evt); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Any write to CTRL reg ACks the interrupt, we rewrite the | ||||
|  |  | |||
|  | @ -206,7 +206,7 @@ unalignedOffby3: | |||
| 	ld.ab	r6, [r1, 4] | ||||
| 	prefetch [r1, 28]	;Prefetch the next read location
 | ||||
| 	ld.ab	r8, [r1,4] | ||||
| 	prefetch [r3, 32]	;Prefetch the next write location
 | ||||
| 	prefetchw [r3, 32]	;Prefetch the next write location
 | ||||
| 
 | ||||
| 	SHIFT_1	(r7, r6, 8) | ||||
| 	or	r7, r7, r5 | ||||
|  |  | |||
|  | @ -10,12 +10,6 @@ | |||
| 
 | ||||
| #undef PREALLOC_NOT_AVAIL | ||||
| 
 | ||||
| #ifdef PREALLOC_NOT_AVAIL | ||||
| #define PREWRITE(A,B)	prefetchw [(A),(B)] | ||||
| #else | ||||
| #define PREWRITE(A,B)	prealloc [(A),(B)] | ||||
| #endif | ||||
| 
 | ||||
| ENTRY(memset) | ||||
| 	prefetchw [r0]		; Prefetch the write location
 | ||||
| 	mov.f	0, r2 | ||||
|  | @ -51,9 +45,15 @@ ENTRY(memset) | |||
| 
 | ||||
| ;;; Convert len to Dwords, unfold x8
 | ||||
| 	lsr.f	lp_count, lp_count, 6 | ||||
| 
 | ||||
| 	lpnz	@.Lset64bytes
 | ||||
| 	;; LOOP START
 | ||||
| 	PREWRITE(r3, 64)	;Prefetch the next write location
 | ||||
| #ifdef PREALLOC_NOT_AVAIL | ||||
| 	prefetchw [r3, 64]	;Prefetch the next write location
 | ||||
| #else | ||||
| 	prealloc  [r3, 64] | ||||
| #endif | ||||
| #ifdef CONFIG_ARC_HAS_LL64 | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
|  | @ -62,16 +62,45 @@ ENTRY(memset) | |||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| #else | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| #endif | ||||
| .Lset64bytes: | ||||
| 
 | ||||
| 	lsr.f	lp_count, r2, 5 ;Last remaining  max 124 bytes
 | ||||
| 	lpnz	.Lset32bytes | ||||
| 	;; LOOP START
 | ||||
| 	prefetchw   [r3, 32]	;Prefetch the next write location
 | ||||
| #ifdef CONFIG_ARC_HAS_LL64 | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| 	std.ab	r4, [r3, 8] | ||||
| #else | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| 	st.ab	r4, [r3, 4] | ||||
| #endif | ||||
| .Lset32bytes: | ||||
| 
 | ||||
| 	and.f	lp_count, r2, 0x1F ;Last remaining 31 bytes
 | ||||
|  |  | |||
|  | @ -389,6 +389,21 @@ axs103_set_freq(unsigned int id, unsigned int fd, unsigned int od) | |||
| 
 | ||||
| static void __init axs103_early_init(void) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * AXS103 configurations for SMP/QUAD configurations share device tree | ||||
| 	 * which defaults to 90 MHz. However recent failures of Quad config | ||||
| 	 * revealed P&R timing violations so clamp it down to safe 50 MHz | ||||
| 	 * Instead of duplicating defconfig/DT for SMP/QUAD, add a small hack | ||||
| 	 * | ||||
| 	 * This hack is really hacky as of now. Fix it properly by getting the | ||||
| 	 * number of cores as return value of platform's early SMP callback | ||||
| 	 */ | ||||
| #ifdef CONFIG_ARC_MCIP | ||||
| 	unsigned int num_cores = (read_aux_reg(ARC_REG_MCIP_BCR) >> 16) & 0x3F; | ||||
| 	if (num_cores > 2) | ||||
| 		arc_set_core_freq(50 * 1000000); | ||||
| #endif | ||||
| 
 | ||||
| 	switch (arc_get_core_freq()/1000000) { | ||||
| 	case 33: | ||||
| 		axs103_set_freq(1, 1, 1); | ||||
|  |  | |||
|  | @ -116,7 +116,7 @@ | |||
| 				ranges = <0 0x2000 0x2000>; | ||||
| 
 | ||||
| 				scm_conf: scm_conf@0 { | ||||
| 					compatible = "syscon"; | ||||
| 					compatible = "syscon", "simple-bus"; | ||||
| 					reg = <0x0 0x1400>; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
|  | @ -1140,6 +1140,7 @@ | |||
| 				ctrl-module = <&omap_control_sata>; | ||||
| 				clocks = <&sys_clkin1>, <&sata_ref_clk>; | ||||
| 				clock-names = "sysclk", "refclk"; | ||||
| 				syscon-pllreset = <&scm_conf 0x3fc>; | ||||
| 				#phy-cells = <0>; | ||||
| 			}; | ||||
| 
 | ||||
|  |  | |||
|  | @ -138,8 +138,8 @@ | |||
| 
 | ||||
| 		mipi_phy: video-phy@10020710 { | ||||
| 			compatible = "samsung,s5pv210-mipi-video-phy"; | ||||
| 			reg = <0x10020710 8>; | ||||
| 			#phy-cells = <1>; | ||||
| 			syscon = <&pmu_system_controller>; | ||||
| 		}; | ||||
| 
 | ||||
| 		pd_cam: cam-power-domain@10023C00 { | ||||
|  |  | |||
|  | @ -127,6 +127,10 @@ | |||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &cpu0 { | ||||
| 	cpu0-supply = <&buck1_reg>; | ||||
| }; | ||||
| 
 | ||||
| &fimd { | ||||
| 	pinctrl-0 = <&lcd_en &lcd_clk &lcd_data24 &pwm0_out>; | ||||
| 	pinctrl-names = "default"; | ||||
|  |  | |||
|  | @ -188,6 +188,10 @@ | |||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &cpu0 { | ||||
| 	cpu0-supply = <&varm_breg>; | ||||
| }; | ||||
| 
 | ||||
| &dsi_0 { | ||||
| 	vddcore-supply = <&vusb_reg>; | ||||
| 	vddio-supply = <&vmipi_reg>; | ||||
|  |  | |||
|  | @ -548,6 +548,10 @@ | |||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &cpu0 { | ||||
| 	cpu0-supply = <&vdd_arm_reg>; | ||||
| }; | ||||
| 
 | ||||
| &pinctrl_1 { | ||||
| 	hdmi_hpd: hdmi-hpd { | ||||
| 		samsung,pins = "gpx3-7"; | ||||
|  |  | |||
|  | @ -40,6 +40,18 @@ | |||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a9"; | ||||
| 			reg = <0x900>; | ||||
| 			clocks = <&clock CLK_ARM_CLK>; | ||||
| 			clock-names = "cpu"; | ||||
| 			clock-latency = <160000>; | ||||
| 
 | ||||
| 			operating-points = < | ||||
| 				1200000 1250000 | ||||
| 				1000000 1150000 | ||||
| 				800000	1075000 | ||||
| 				500000	975000 | ||||
| 				400000	975000 | ||||
| 				200000	950000 | ||||
| 			>; | ||||
| 			cooling-min-level = <4>; | ||||
| 			cooling-max-level = <2>; | ||||
| 			#cooling-cells = <2>; /* min followed by max */ | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
| #include "imx25.dtsi" | ||||
| 
 | ||||
|  | @ -114,8 +115,8 @@ | |||
| &esdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
| 	cd-gpios = <&gpio2 1 0>; | ||||
| 	wp-gpios = <&gpio2 0 0>; | ||||
| 	cd-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -286,8 +286,8 @@ | |||
| 			can1: can@53fe4000 { | ||||
| 				compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan"; | ||||
| 				reg = <0x53fe4000 0x1000>; | ||||
| 				clocks = <&clks 33>; | ||||
| 				clock-names = "ipg"; | ||||
| 				clocks = <&clks 33>, <&clks 33>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				interrupts = <43>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | @ -295,8 +295,8 @@ | |||
| 			can2: can@53fe8000 { | ||||
| 				compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan"; | ||||
| 				reg = <0x53fe8000 0x1000>; | ||||
| 				clocks = <&clks 34>; | ||||
| 				clock-names = "ipg"; | ||||
| 				clocks = <&clks 34>, <&clks 34>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				interrupts = <44>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ | |||
| &esdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
| 	cd-gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio2 29 GPIO_ACTIVE_LOW>; | ||||
| 	bus-width = <4>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -103,8 +103,8 @@ | |||
| &esdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
| 	cd-gpios = <&gpio1 1 0>; | ||||
| 	wp-gpios = <&gpio1 9 0>; | ||||
| 	cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -124,8 +124,8 @@ | |||
| &esdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
| 	cd-gpios = <&gpio1 1 0>; | ||||
| 	wp-gpios = <&gpio1 9 0>; | ||||
| 	cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -147,8 +147,8 @@ | |||
| &esdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc3>; | ||||
| 	cd-gpios = <&gpio3 11 0>; | ||||
| 	wp-gpios = <&gpio3 12 0>; | ||||
| 	cd-gpios = <&gpio3 11 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio3 12 GPIO_ACTIVE_HIGH>; | ||||
| 	bus-width = <8>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -41,8 +41,8 @@ | |||
| &esdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
| 	cd-gpios = <&gpio3 13 0>; | ||||
| 	wp-gpios = <&gpio4 11 0>; | ||||
| 	cd-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio4 11 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -41,8 +41,8 @@ | |||
| 	pinctrl-0 = <&pinctrl_esdhc2>, | ||||
| 		    <&pinctrl_esdhc2_cdwp>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	wp-gpios = <&gpio1 2 0>; | ||||
| 	cd-gpios = <&gpio1 4 0>; | ||||
| 	wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -183,7 +183,7 @@ | |||
| }; | ||||
| 
 | ||||
| &esdhc1 { | ||||
| 	cd-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>; | ||||
| 	fsl,wp-controller; | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc1>; | ||||
|  | @ -191,7 +191,7 @@ | |||
| }; | ||||
| 
 | ||||
| &esdhc2 { | ||||
| 	cd-gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>; | ||||
| 	fsl,wp-controller; | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc2>; | ||||
|  |  | |||
|  | @ -119,8 +119,8 @@ | |||
| &esdhc2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_esdhc2>; | ||||
| 	cd-gpios = <&gpio3 25 0>; | ||||
| 	wp-gpios = <&gpio2 19 0>; | ||||
| 	cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -305,8 +305,8 @@ | |||
| &usdhc2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	cd-gpios = <&gpio1 4 0>; | ||||
| 	wp-gpios = <&gpio1 2 0>; | ||||
| 	cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -314,8 +314,8 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 0>; | ||||
| 	wp-gpios = <&gpio7 1 0>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include "imx6q.dtsi" | ||||
| 
 | ||||
| / { | ||||
|  | @ -196,8 +197,8 @@ | |||
| }; | ||||
| 
 | ||||
| &usdhc3 { | ||||
| 	cd-gpios = <&gpio6 11 0>; | ||||
| 	wp-gpios = <&gpio6 14 0>; | ||||
| 	cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3 | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include "imx6q.dtsi" | ||||
| 
 | ||||
| / { | ||||
|  | @ -161,7 +162,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	bus-width = <4>; | ||||
| 	cd-gpios = <&gpio6 11 0>; | ||||
| 	cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -251,7 +251,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	bus-width = <4>; | ||||
| 	cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -260,7 +260,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	bus-width = <4>; | ||||
| 	cd-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
|  |  | |||
|  | @ -173,7 +173,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc1>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -181,7 +181,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -392,7 +392,7 @@ | |||
| &usdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc1>; | ||||
| 	cd-gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>; | ||||
| 	no-1-8-v; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -400,7 +400,7 @@ | |||
| &usdhc2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	cd-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio4 5 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; | ||||
| 	no-1-8-v; | ||||
| 	status = "okay"; | ||||
|  |  | |||
|  | @ -258,6 +258,6 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	cd-gpios = <&gpio1 4 0>; | ||||
| 	cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| #include <dt-bindings/gpio/gpio.h> | ||||
| 
 | ||||
| / { | ||||
| 	regulators { | ||||
| 		compatible = "simple-bus"; | ||||
|  | @ -181,7 +183,7 @@ | |||
| &usdhc2 { /* module slot */ | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	cd-gpios = <&gpio2 2 0>; | ||||
| 	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -318,7 +318,7 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -324,7 +324,7 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -417,7 +417,7 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -299,6 +299,6 @@ | |||
| 		&pinctrl_hummingboard_usdhc2 | ||||
| 	>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	cd-gpios = <&gpio1 4 0>; | ||||
| 	cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -453,7 +453,7 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 0>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -461,7 +461,7 @@ | |||
| &usdhc4 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc4>; | ||||
| 	cd-gpios = <&gpio2 6 0>; | ||||
| 	cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -409,8 +409,8 @@ | |||
| &usdhc2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	cd-gpios = <&gpio1 4 0>; | ||||
| 	wp-gpios = <&gpio1 2 0>; | ||||
| 	cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -418,7 +418,7 @@ | |||
|         pinctrl-names = "default"; | ||||
|         pinctrl-0 = <&pinctrl_usdhc3 | ||||
| 		     &pinctrl_usdhc3_cdwp>; | ||||
|         cd-gpios = <&gpio1 27 0>; | ||||
|         wp-gpios = <&gpio1 29 0>; | ||||
| 	cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>; | ||||
|         status = "disabled"; | ||||
| }; | ||||
|  |  | |||
|  | @ -342,7 +342,7 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	bus-width = <4>; | ||||
| 	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -351,6 +351,6 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	bus-width = <4>; | ||||
| 	cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -467,8 +467,8 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	pinctrl-1 = <&pinctrl_usdhc3_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc3_200mhz>; | ||||
| 	cd-gpios = <&gpio6 15 0>; | ||||
| 	wp-gpios = <&gpio1 13 0>; | ||||
| 	cd-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -448,8 +448,8 @@ | |||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio7 0 0>; | ||||
| 	wp-gpios = <&gpio7 1 0>; | ||||
| 	cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -457,7 +457,7 @@ | |||
| &usdhc4 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc4>; | ||||
| 	cd-gpios = <&gpio2 6 0>; | ||||
| 	cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -562,8 +562,8 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio2 2 0>; | ||||
| 	wp-gpios = <&gpio2 3 0>; | ||||
| 	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -571,8 +571,8 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio2 0 0>; | ||||
| 	wp-gpios = <&gpio2 1 0>; | ||||
| 	cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -680,7 +680,7 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc1>; | ||||
| 	bus-width = <4>; | ||||
| 	no-1-8-v; | ||||
| 	cd-gpios = <&gpio7 2 0>; | ||||
| 	cd-gpios = <&gpio7 2 GPIO_ACTIVE_LOW>; | ||||
| 	fsl,wp-controller; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | @ -690,7 +690,7 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	bus-width = <4>; | ||||
| 	no-1-8-v; | ||||
| 	cd-gpios = <&gpio7 3 0>; | ||||
| 	cd-gpios = <&gpio7 3 GPIO_ACTIVE_LOW>; | ||||
| 	fsl,wp-controller; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -9,6 +9,8 @@ | |||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| 
 | ||||
| / { | ||||
| 	regulators { | ||||
| 		compatible = "simple-bus"; | ||||
|  | @ -250,13 +252,13 @@ | |||
| &usdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc1>; | ||||
| 	cd-gpios = <&gpio1 2 0>; | ||||
| 	cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
| &usdhc3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	cd-gpios = <&gpio3 9 0>; | ||||
| 	cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -181,10 +181,10 @@ | |||
| 			interrupt-names = "msi"; | ||||
| 			#interrupt-cells = <1>; | ||||
| 			interrupt-map-mask = <0 0 0 0x7>; | ||||
| 			interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			interrupt-map = <0 0 0 1 &gpc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 2 &gpc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 3 &gpc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			                <0 0 0 4 &gpc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&clks IMX6QDL_CLK_PCIE_AXI>, | ||||
| 				 <&clks IMX6QDL_CLK_LVDS1_GATE>, | ||||
| 				 <&clks IMX6QDL_CLK_PCIE_REF_125M>; | ||||
|  |  | |||
|  | @ -617,8 +617,8 @@ | |||
| 	pinctrl-1 = <&pinctrl_usdhc1_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc1_200mhz>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio4 7 0>; | ||||
| 	wp-gpios = <&gpio4 6 0>; | ||||
| 	cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -627,8 +627,8 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc2>; | ||||
| 	pinctrl-1 = <&pinctrl_usdhc2_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc2_200mhz>; | ||||
| 	cd-gpios = <&gpio5 0 0>; | ||||
| 	wp-gpios = <&gpio4 29 0>; | ||||
| 	cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | @ -637,6 +637,6 @@ | |||
| 	pinctrl-0 = <&pinctrl_usdhc3>; | ||||
| 	pinctrl-1 = <&pinctrl_usdhc3_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc3_200mhz>; | ||||
| 	cd-gpios = <&gpio3 22 0>; | ||||
| 	cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ | |||
| 	pinctrl-1 = <&pinctrl_usdhc3_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc3_200mhz>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; | ||||
| 	keep-power-in-suspend; | ||||
| 	enable-sdio-wakeup; | ||||
|  | @ -61,7 +61,7 @@ | |||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc4>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>; | ||||
| 	no-1-8-v; | ||||
| 	keep-power-in-suspend; | ||||
| 	enable-sdio-wakup; | ||||
|  |  | |||
|  | @ -293,7 +293,7 @@ | |||
| 	pinctrl-1 = <&pinctrl_usdhc3_100mhz>; | ||||
| 	pinctrl-2 = <&pinctrl_usdhc3_200mhz>; | ||||
| 	bus-width = <8>; | ||||
| 	cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; | ||||
| 	keep-power-in-suspend; | ||||
| 	enable-sdio-wakeup; | ||||
|  | @ -304,7 +304,7 @@ | |||
| &usdhc4 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc4>; | ||||
| 	cd-gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>; | ||||
| 	cd-gpios = <&gpio6 21 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  |  | |||
|  | @ -234,8 +234,8 @@ | |||
| &usdhc1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_usdhc1>; | ||||
| 	cd-gpios = <&gpio5 0 0>; | ||||
| 	wp-gpios = <&gpio5 1 0>; | ||||
| 	cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>; | ||||
| 	wp-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>; | ||||
| 	enable-sdio-wakeup; | ||||
| 	keep-power-in-suspend; | ||||
| 	status = "okay"; | ||||
|  |  | |||
|  | @ -13,9 +13,8 @@ clocks { | |||
| 		#clock-cells = <0>; | ||||
| 		compatible = "ti,keystone,main-pll-clock"; | ||||
| 		clocks = <&refclksys>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>; | ||||
| 		reg-names = "control", "multiplier"; | ||||
| 		fixed-postdiv = <2>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>; | ||||
| 		reg-names = "control", "multiplier", "post-divider"; | ||||
| 	}; | ||||
| 
 | ||||
| 	papllclk: papllclk@2620358 { | ||||
|  |  | |||
|  | @ -131,10 +131,17 @@ | |||
| 					<GIC_SPI 376 IRQ_TYPE_EDGE_RISING>; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio: mdio@24200f00 { | ||||
| 			compatible	= "ti,keystone_mdio", "ti,davinci_mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			reg = <0x24200f00 0x100>; | ||||
| 			status = "disabled"; | ||||
| 			clocks = <&clkcpgmac>; | ||||
| 			clock-names = "fck"; | ||||
| 			bus_freq	= <2500000>; | ||||
| 		}; | ||||
| 		/include/ "k2e-netcp.dtsi" | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &mdio { | ||||
| 	reg = <0x24200f00 0x100>; | ||||
| }; | ||||
|  |  | |||
|  | @ -22,9 +22,8 @@ clocks { | |||
| 		#clock-cells = <0>; | ||||
| 		compatible = "ti,keystone,main-pll-clock"; | ||||
| 		clocks = <&refclksys>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>; | ||||
| 		reg-names = "control", "multiplier"; | ||||
| 		fixed-postdiv = <2>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>; | ||||
| 		reg-names = "control", "multiplier", "post-divider"; | ||||
| 	}; | ||||
| 
 | ||||
| 	papllclk: papllclk@2620358 { | ||||
|  |  | |||
|  | @ -98,6 +98,17 @@ | |||
| 			#gpio-cells = <2>; | ||||
| 			gpio,syscon-dev = <&devctrl 0x25c>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio: mdio@02090300 { | ||||
| 			compatible	= "ti,keystone_mdio", "ti,davinci_mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			reg = <0x02090300 0x100>; | ||||
| 			status = "disabled"; | ||||
| 			clocks = <&clkcpgmac>; | ||||
| 			clock-names = "fck"; | ||||
| 			bus_freq	= <2500000>; | ||||
| 		}; | ||||
| 		/include/ "k2hk-netcp.dtsi" | ||||
| 	}; | ||||
| }; | ||||
|  |  | |||
|  | @ -22,9 +22,8 @@ clocks { | |||
| 		#clock-cells = <0>; | ||||
| 		compatible = "ti,keystone,main-pll-clock"; | ||||
| 		clocks = <&refclksys>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>; | ||||
| 		reg-names = "control", "multiplier"; | ||||
| 		fixed-postdiv = <2>; | ||||
| 		reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>; | ||||
| 		reg-names = "control", "multiplier", "post-divider"; | ||||
| 	}; | ||||
| 
 | ||||
| 	papllclk: papllclk@2620358 { | ||||
|  |  | |||
|  | @ -29,7 +29,6 @@ | |||
| 	}; | ||||
| 
 | ||||
| 	soc { | ||||
| 
 | ||||
| 		/include/ "k2l-clocks.dtsi" | ||||
| 
 | ||||
| 		uart2: serial@02348400 { | ||||
|  | @ -79,6 +78,17 @@ | |||
| 			#gpio-cells = <2>; | ||||
| 			gpio,syscon-dev = <&devctrl 0x24c>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio: mdio@26200f00 { | ||||
| 			compatible	= "ti,keystone_mdio", "ti,davinci_mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			reg = <0x26200f00 0x100>; | ||||
| 			status = "disabled"; | ||||
| 			clocks = <&clkcpgmac>; | ||||
| 			clock-names = "fck"; | ||||
| 			bus_freq	= <2500000>; | ||||
| 		}; | ||||
| 		/include/ "k2l-netcp.dtsi" | ||||
| 	}; | ||||
| }; | ||||
|  | @ -96,7 +106,3 @@ | |||
|        /* Pin muxed. Enabled and configured by Bootloader */ | ||||
|        status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
| &mdio { | ||||
| 	reg = <0x26200f00 0x100>; | ||||
| }; | ||||
|  |  | |||
|  | @ -267,17 +267,6 @@ | |||
| 				  1 0 0x21000A00 0x00000100>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio: mdio@02090300 { | ||||
| 			compatible	= "ti,keystone_mdio", "ti,davinci_mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			reg		= <0x02090300 0x100>; | ||||
| 			status = "disabled"; | ||||
| 			clocks = <&clkpa>; | ||||
| 			clock-names = "fck"; | ||||
| 			bus_freq	= <2500000>; | ||||
| 		}; | ||||
| 
 | ||||
| 		kirq0: keystone_irq@26202a0 { | ||||
| 			compatible = "ti,keystone-irq"; | ||||
| 			interrupts = <GIC_SPI 4 IRQ_TYPE_EDGE_RISING>; | ||||
|  |  | |||
|  | @ -51,7 +51,8 @@ | |||
| 				}; | ||||
| 
 | ||||
| 				scm_conf: scm_conf@270 { | ||||
| 					compatible = "syscon"; | ||||
| 					compatible = "syscon", | ||||
| 						     "simple-bus"; | ||||
| 					reg = <0x270 0x240>; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
|  |  | |||
|  | @ -191,7 +191,8 @@ | |||
| 				}; | ||||
| 
 | ||||
| 				omap4_padconf_global: omap4_padconf_global@5a0 { | ||||
| 					compatible = "syscon"; | ||||
| 					compatible = "syscon", | ||||
| 						     "simple-bus"; | ||||
| 					reg = <0x5a0 0x170>; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
|  |  | |||
|  | @ -180,7 +180,8 @@ | |||
| 				}; | ||||
| 
 | ||||
| 				omap5_padconf_global: omap5_padconf_global@5a0 { | ||||
| 					compatible = "syscon"; | ||||
| 					compatible = "syscon", | ||||
| 						     "simple-bus"; | ||||
| 					reg = <0x5a0 0xec>; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
|  |  | |||
|  | @ -15,16 +15,10 @@ | |||
| #include "skeleton.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	soc { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "stericsson,db8500"; | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		ranges; | ||||
| 
 | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		enable-method = "ste,dbx500-smp"; | ||||
| 
 | ||||
| 		cpu-map { | ||||
| 			cluster0 { | ||||
|  | @ -36,18 +30,25 @@ | |||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 			CPU0: cpu@0 { | ||||
| 		CPU0: cpu@300 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a9"; | ||||
| 				reg = <0>; | ||||
| 			reg = <0x300>; | ||||
| 		}; | ||||
| 			CPU1: cpu@1 { | ||||
| 		CPU1: cpu@301 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a9"; | ||||
| 				reg = <1>; | ||||
| 			reg = <0x301>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	soc { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "stericsson,db8500"; | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		ranges; | ||||
| 
 | ||||
| 		ptm@801ae000 { | ||||
| 			compatible = "arm,coresight-etm3x", "arm,primecell"; | ||||
| 			reg = <0x801ae000 0x1000>; | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ | |||
| 	}; | ||||
| 
 | ||||
| 	aliases { | ||||
| 		serial1 = &uart1; | ||||
| 		stmpe-i2c0 = &stmpe0; | ||||
| 		stmpe-i2c1 = &stmpe1; | ||||
| 	}; | ||||
|  |  | |||
|  | @ -15,6 +15,10 @@ | |||
| 		bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk"; | ||||
| 	}; | ||||
| 
 | ||||
| 	aliases { | ||||
| 		serial1 = &uart1; | ||||
| 	}; | ||||
| 
 | ||||
| 	src@101e0000 { | ||||
| 		/* These chrystal drivers are not used on this board */ | ||||
| 		disable-sxtalo; | ||||
|  |  | |||
|  | @ -757,6 +757,7 @@ | |||
| 			clock-names = "uartclk", "apb_pclk"; | ||||
| 			pinctrl-names = "default"; | ||||
| 			pinctrl-0 = <&uart0_default_mux>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart1: uart@101fb000 { | ||||
|  |  | |||
|  | @ -61,6 +61,7 @@ work_pending: | |||
| 	movlt	scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE) | ||||
| 	ldmia	sp, {r0 - r6}			@ have to reload r0 - r6
 | ||||
| 	b	local_restart			@ ... and off we go
 | ||||
| ENDPROC(ret_fast_syscall) | ||||
| 
 | ||||
| /* | ||||
|  * "slow" syscall return path.  "why" tells us if this was a real syscall. | ||||
|  |  | |||
|  | @ -399,6 +399,9 @@ ENTRY(secondary_startup) | |||
| 	sub	lr, r4, r5			@ mmu has been enabled
 | ||||
| 	add	r3, r7, lr | ||||
| 	ldrd	r4, [r3, #0]			@ get secondary_data.pgdir
 | ||||
| ARM_BE8(eor	r4, r4, r5)			@ Swap r5 and r4 in BE:
 | ||||
| ARM_BE8(eor	r5, r4, r5)			@ it can be done in 3 steps
 | ||||
| ARM_BE8(eor	r4, r4, r5)			@ without using a temp reg.
 | ||||
| 	ldr	r8, [r3, #8]			@ get secondary_data.swapper_pg_dir
 | ||||
| 	badr	lr, __enable_mmu		@ return address
 | ||||
| 	mov	r13, r12			@ __secondary_switched address
 | ||||
|  |  | |||
|  | @ -296,7 +296,6 @@ static bool tk_is_cntvct(const struct timekeeper *tk) | |||
|  */ | ||||
| void update_vsyscall(struct timekeeper *tk) | ||||
| { | ||||
| 	struct timespec xtime_coarse; | ||||
| 	struct timespec64 *wtm = &tk->wall_to_monotonic; | ||||
| 
 | ||||
| 	if (!cntvct_ok) { | ||||
|  | @ -308,10 +307,10 @@ void update_vsyscall(struct timekeeper *tk) | |||
| 
 | ||||
| 	vdso_write_begin(vdso_data); | ||||
| 
 | ||||
| 	xtime_coarse = __current_kernel_time(); | ||||
| 	vdso_data->tk_is_cntvct			= tk_is_cntvct(tk); | ||||
| 	vdso_data->xtime_coarse_sec		= xtime_coarse.tv_sec; | ||||
| 	vdso_data->xtime_coarse_nsec		= xtime_coarse.tv_nsec; | ||||
| 	vdso_data->xtime_coarse_sec		= tk->xtime_sec; | ||||
| 	vdso_data->xtime_coarse_nsec		= (u32)(tk->tkr_mono.xtime_nsec >> | ||||
| 							tk->tkr_mono.shift); | ||||
| 	vdso_data->wtm_clock_sec		= wtm->tv_sec; | ||||
| 	vdso_data->wtm_clock_nsec		= wtm->tv_nsec; | ||||
| 
 | ||||
|  |  | |||
|  | @ -146,9 +146,8 @@ static __init int exynos4_pm_init_power_domain(void) | |||
| 		pd->base = of_iomap(np, 0); | ||||
| 		if (!pd->base) { | ||||
| 			pr_warn("%s: failed to map memory\n", __func__); | ||||
| 			kfree(pd->pd.name); | ||||
| 			kfree_const(pd->pd.name); | ||||
| 			kfree(pd); | ||||
| 			of_node_put(np); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -2373,6 +2373,9 @@ static int of_dev_hwmod_lookup(struct device_node *np, | |||
|  * registers.  This address is needed early so the OCP registers that | ||||
|  * are part of the device's address space can be ioremapped properly. | ||||
|  * | ||||
|  * If SYSC access is not needed, the registers will not be remapped | ||||
|  * and non-availability of MPU access is not treated as an error. | ||||
|  * | ||||
|  * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and | ||||
|  * -ENXIO on absent or invalid register target address space. | ||||
|  */ | ||||
|  | @ -2387,6 +2390,11 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, | |||
| 
 | ||||
| 	_save_mpu_port_index(oh); | ||||
| 
 | ||||
| 	/* if we don't need sysc access we don't need to ioremap */ | ||||
| 	if (!oh->class->sysc) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/* we can't continue without MPU PORT if we need sysc access */ | ||||
| 	if (oh->_int_flags & _HWMOD_NO_MPU_PORT) | ||||
| 		return -ENXIO; | ||||
| 
 | ||||
|  | @ -2396,8 +2404,10 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, | |||
| 			 oh->name); | ||||
| 
 | ||||
| 		/* Extract the IO space from device tree blob */ | ||||
| 		if (!np) | ||||
| 		if (!np) { | ||||
| 			pr_err("omap_hwmod: %s: no dt node\n", oh->name); | ||||
| 			return -ENXIO; | ||||
| 		} | ||||
| 
 | ||||
| 		va_start = of_iomap(np, index + oh->mpu_rt_idx); | ||||
| 	} else { | ||||
|  | @ -2456,14 +2466,12 @@ static int __init _init(struct omap_hwmod *oh, void *data) | |||
| 				oh->name, np->name); | ||||
| 	} | ||||
| 
 | ||||
| 	if (oh->class->sysc) { | ||||
| 	r = _init_mpu_rt_base(oh, NULL, index, np); | ||||
| 	if (r < 0) { | ||||
| 		WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n", | ||||
| 		     oh->name); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	r = _init_clocks(oh, NULL); | ||||
| 	if (r < 0) { | ||||
|  |  | |||
|  | @ -827,8 +827,7 @@ static struct omap_hwmod_class_sysconfig dra7xx_gpmc_sysc = { | |||
| 	.syss_offs	= 0x0014, | ||||
| 	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE | | ||||
| 			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), | ||||
| 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | ||||
| 			   SIDLE_SMART_WKUP), | ||||
| 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | ||||
| 	.sysc_fields	= &omap_hwmod_sysc_type1, | ||||
| }; | ||||
| 
 | ||||
|  | @ -844,7 +843,7 @@ static struct omap_hwmod dra7xx_gpmc_hwmod = { | |||
| 	.class		= &dra7xx_gpmc_hwmod_class, | ||||
| 	.clkdm_name	= "l3main1_clkdm", | ||||
| 	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */ | ||||
| 	.flags		= HWMOD_SWSUP_SIDLE | DEBUG_OMAP_GPMC_HWMOD_FLAGS, | ||||
| 	.flags		= DEBUG_OMAP_GPMC_HWMOD_FLAGS, | ||||
| 	.main_clk	= "l3_iclk_div", | ||||
| 	.prcm = { | ||||
| 		.omap4 = { | ||||
|  |  | |||
|  | @ -74,31 +74,51 @@ struct jit_ctx { | |||
| 
 | ||||
| int bpf_jit_enable __read_mostly; | ||||
| 
 | ||||
| static u64 jit_get_skb_b(struct sk_buff *skb, unsigned offset) | ||||
| static inline int call_neg_helper(struct sk_buff *skb, int offset, void *ret, | ||||
| 		      unsigned int size) | ||||
| { | ||||
| 	void *ptr = bpf_internal_load_pointer_neg_helper(skb, offset, size); | ||||
| 
 | ||||
| 	if (!ptr) | ||||
| 		return -EFAULT; | ||||
| 	memcpy(ret, ptr, size); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static u64 jit_get_skb_b(struct sk_buff *skb, int offset) | ||||
| { | ||||
| 	u8 ret; | ||||
| 	int err; | ||||
| 
 | ||||
| 	if (offset < 0) | ||||
| 		err = call_neg_helper(skb, offset, &ret, 1); | ||||
| 	else | ||||
| 		err = skb_copy_bits(skb, offset, &ret, 1); | ||||
| 
 | ||||
| 	return (u64)err << 32 | ret; | ||||
| } | ||||
| 
 | ||||
| static u64 jit_get_skb_h(struct sk_buff *skb, unsigned offset) | ||||
| static u64 jit_get_skb_h(struct sk_buff *skb, int offset) | ||||
| { | ||||
| 	u16 ret; | ||||
| 	int err; | ||||
| 
 | ||||
| 	if (offset < 0) | ||||
| 		err = call_neg_helper(skb, offset, &ret, 2); | ||||
| 	else | ||||
| 		err = skb_copy_bits(skb, offset, &ret, 2); | ||||
| 
 | ||||
| 	return (u64)err << 32 | ntohs(ret); | ||||
| } | ||||
| 
 | ||||
| static u64 jit_get_skb_w(struct sk_buff *skb, unsigned offset) | ||||
| static u64 jit_get_skb_w(struct sk_buff *skb, int offset) | ||||
| { | ||||
| 	u32 ret; | ||||
| 	int err; | ||||
| 
 | ||||
| 	if (offset < 0) | ||||
| 		err = call_neg_helper(skb, offset, &ret, 4); | ||||
| 	else | ||||
| 		err = skb_copy_bits(skb, offset, &ret, 4); | ||||
| 
 | ||||
| 	return (u64)err << 32 | ntohl(ret); | ||||
|  | @ -536,9 +556,6 @@ static int build_body(struct jit_ctx *ctx) | |||
| 		case BPF_LD | BPF_B | BPF_ABS: | ||||
| 			load_order = 0; | ||||
| load: | ||||
| 			/* the interpreter will deal with the negative K */ | ||||
| 			if ((int)k < 0) | ||||
| 				return -ENOTSUPP; | ||||
| 			emit_mov_i(r_off, k, ctx); | ||||
| load_common: | ||||
| 			ctx->seen |= SEEN_DATA | SEEN_CALL; | ||||
|  | @ -547,12 +564,24 @@ load_common: | |||
| 				emit(ARM_SUB_I(r_scratch, r_skb_hl, | ||||
| 					       1 << load_order), ctx); | ||||
| 				emit(ARM_CMP_R(r_scratch, r_off), ctx); | ||||
| 				condt = ARM_COND_HS; | ||||
| 				condt = ARM_COND_GE; | ||||
| 			} else { | ||||
| 				emit(ARM_CMP_R(r_skb_hl, r_off), ctx); | ||||
| 				condt = ARM_COND_HI; | ||||
| 			} | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * test for negative offset, only if we are | ||||
| 			 * currently scheduled to take the fast | ||||
| 			 * path. this will update the flags so that | ||||
| 			 * the slowpath instruction are ignored if the | ||||
| 			 * offset is negative. | ||||
| 			 * | ||||
| 			 * for loard_order == 0 the HI condition will | ||||
| 			 * make loads at offset 0 take the slow path too. | ||||
| 			 */ | ||||
| 			_emit(condt, ARM_CMP_I(r_off, 0), ctx); | ||||
| 
 | ||||
| 			_emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data), | ||||
| 			      ctx); | ||||
| 
 | ||||
|  | @ -860,9 +889,11 @@ b_epilogue: | |||
| 			off = offsetof(struct sk_buff, vlan_tci); | ||||
| 			emit(ARM_LDRH_I(r_A, r_skb, off), ctx); | ||||
| 			if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) | ||||
| 				OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); | ||||
| 			else | ||||
| 				OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); | ||||
| 				OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx); | ||||
| 			else { | ||||
| 				OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx); | ||||
| 				OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx); | ||||
| 			} | ||||
| 			break; | ||||
| 		case BPF_ANC | SKF_AD_QUEUE: | ||||
| 			ctx->seen |= SEEN_SKB; | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ VDSO_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 | |||
| VDSO_LDFLAGS += -nostdlib -shared | ||||
| VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) | ||||
| VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--build-id) | ||||
| VDSO_LDFLAGS += $(call cc-option, -fuse-ld=bfd) | ||||
| VDSO_LDFLAGS += $(call cc-ldoption, -fuse-ld=bfd) | ||||
| 
 | ||||
| obj-$(CONFIG_VDSO) += vdso.o | ||||
| extra-$(CONFIG_VDSO) += vdso.lds | ||||
|  |  | |||
|  | @ -823,7 +823,7 @@ | |||
| 			device_type = "dma"; | ||||
| 			reg = <0x0 0x1f270000 0x0 0x10000>, | ||||
| 			      <0x0 0x1f200000 0x0 0x10000>, | ||||
| 			      <0x0 0x1b008000 0x0 0x2000>, | ||||
| 			      <0x0 0x1b000000 0x0 0x400000>, | ||||
| 			      <0x0 0x1054a000 0x0 0x100>; | ||||
| 			interrupts = <0x0 0x82 0x4>, | ||||
| 				     <0x0 0xb8 0x4>, | ||||
|  |  | |||
|  | @ -122,12 +122,12 @@ static int __init uefi_init(void) | |||
| 
 | ||||
| 	/* Show what we know for posterity */ | ||||
| 	c16 = early_memremap(efi_to_phys(efi.systab->fw_vendor), | ||||
| 			     sizeof(vendor)); | ||||
| 			     sizeof(vendor) * sizeof(efi_char16_t)); | ||||
| 	if (c16) { | ||||
| 		for (i = 0; i < (int) sizeof(vendor) - 1 && *c16; ++i) | ||||
| 			vendor[i] = c16[i]; | ||||
| 		vendor[i] = '\0'; | ||||
| 		early_memunmap(c16, sizeof(vendor)); | ||||
| 		early_memunmap(c16, sizeof(vendor) * sizeof(efi_char16_t)); | ||||
| 	} | ||||
| 
 | ||||
| 	pr_info("EFI v%u.%.02u by %s\n", | ||||
|  |  | |||
|  | @ -585,7 +585,8 @@ ENDPROC(el0_irq) | |||
|  * | ||||
|  */ | ||||
| ENTRY(cpu_switch_to) | ||||
| 	add	x8, x0, #THREAD_CPU_CONTEXT | ||||
| 	mov	x10, #THREAD_CPU_CONTEXT | ||||
| 	add	x8, x0, x10 | ||||
| 	mov	x9, sp | ||||
| 	stp	x19, x20, [x8], #16		// store callee-saved registers | ||||
| 	stp	x21, x22, [x8], #16 | ||||
|  | @ -594,7 +595,7 @@ ENTRY(cpu_switch_to) | |||
| 	stp	x27, x28, [x8], #16 | ||||
| 	stp	x29, x9, [x8], #16 | ||||
| 	str	lr, [x8] | ||||
| 	add	x8, x1, #THREAD_CPU_CONTEXT | ||||
| 	add	x8, x1, x10 | ||||
| 	ldp	x19, x20, [x8], #16		// restore callee-saved registers | ||||
| 	ldp	x21, x22, [x8], #16 | ||||
| 	ldp	x23, x24, [x8], #16 | ||||
|  |  | |||
|  | @ -61,7 +61,7 @@ void __init init_IRQ(void) | |||
| static bool migrate_one_irq(struct irq_desc *desc) | ||||
| { | ||||
| 	struct irq_data *d = irq_desc_get_irq_data(desc); | ||||
| 	const struct cpumask *affinity = d->affinity; | ||||
| 	const struct cpumask *affinity = irq_data_get_affinity_mask(d); | ||||
| 	struct irq_chip *c; | ||||
| 	bool ret = false; | ||||
| 
 | ||||
|  | @ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc) | |||
| 	if (!c->irq_set_affinity) | ||||
| 		pr_debug("IRQ%u: unable to set affinity\n", d->irq); | ||||
| 	else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) | ||||
| 		cpumask_copy(d->affinity, affinity); | ||||
| 		cpumask_copy(irq_data_get_affinity_mask(d), affinity); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
|  |  | |||
|  | @ -168,7 +168,8 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 		 * Other callers might not initialize the si_lsb field, | ||||
| 		 * so check explicitely for the right codes here. | ||||
| 		 */ | ||||
| 		if (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO) | ||||
| 		if (from->si_signo == SIGBUS && | ||||
| 		    (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) | ||||
| 			err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); | ||||
| #endif | ||||
| 		break; | ||||
|  | @ -201,8 +202,6 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 
 | ||||
| int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | ||||
| { | ||||
| 	memset(to, 0, sizeof *to); | ||||
| 
 | ||||
| 	if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || | ||||
| 	    copy_from_user(to->_sifields._pad, | ||||
| 			   from->_sifields._pad, SI_PAD_SIZE)) | ||||
|  |  | |||
|  | @ -199,16 +199,15 @@ up_fail: | |||
|  */ | ||||
| void update_vsyscall(struct timekeeper *tk) | ||||
| { | ||||
| 	struct timespec xtime_coarse; | ||||
| 	u32 use_syscall = strcmp(tk->tkr_mono.clock->name, "arch_sys_counter"); | ||||
| 
 | ||||
| 	++vdso_data->tb_seq_count; | ||||
| 	smp_wmb(); | ||||
| 
 | ||||
| 	xtime_coarse = __current_kernel_time(); | ||||
| 	vdso_data->use_syscall			= use_syscall; | ||||
| 	vdso_data->xtime_coarse_sec		= xtime_coarse.tv_sec; | ||||
| 	vdso_data->xtime_coarse_nsec		= xtime_coarse.tv_nsec; | ||||
| 	vdso_data->xtime_coarse_sec		= tk->xtime_sec; | ||||
| 	vdso_data->xtime_coarse_nsec		= tk->tkr_mono.xtime_nsec >> | ||||
| 							tk->tkr_mono.shift; | ||||
| 	vdso_data->wtm_clock_sec		= tk->wall_to_monotonic.tv_sec; | ||||
| 	vdso_data->wtm_clock_nsec		= tk->wall_to_monotonic.tv_nsec; | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ | |||
| 
 | ||||
| #include <mach/pm.h> | ||||
| 
 | ||||
| static bool disable_cpu_idle_poll; | ||||
| 
 | ||||
| static cycle_t read_cycle_count(struct clocksource *cs) | ||||
| { | ||||
|  | @ -80,36 +81,34 @@ static int comparator_next_event(unsigned long delta, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void comparator_mode(enum clock_event_mode mode, | ||||
| 		struct clock_event_device *evdev) | ||||
| static int comparator_shutdown(struct clock_event_device *evdev) | ||||
| { | ||||
| 	switch (mode) { | ||||
| 	case CLOCK_EVT_MODE_ONESHOT: | ||||
| 		pr_debug("%s: start\n", evdev->name); | ||||
| 		/* FALLTHROUGH */ | ||||
| 	case CLOCK_EVT_MODE_RESUME: | ||||
| 		/*
 | ||||
| 		 * If we're using the COUNT and COMPARE registers we | ||||
| 		 * need to force idle poll. | ||||
| 		 */ | ||||
| 		cpu_idle_poll_ctrl(true); | ||||
| 		break; | ||||
| 	case CLOCK_EVT_MODE_UNUSED: | ||||
| 	case CLOCK_EVT_MODE_SHUTDOWN: | ||||
| 	pr_debug("%s: %s\n", __func__, evdev->name); | ||||
| 	sysreg_write(COMPARE, 0); | ||||
| 		pr_debug("%s: stop\n", evdev->name); | ||||
| 		if (evdev->mode == CLOCK_EVT_MODE_ONESHOT || | ||||
| 		    evdev->mode == CLOCK_EVT_MODE_RESUME) { | ||||
| 
 | ||||
| 	if (disable_cpu_idle_poll) { | ||||
| 		disable_cpu_idle_poll = false; | ||||
| 		/*
 | ||||
| 		 * Only disable idle poll if we have forced that | ||||
| 		 * in a previous call. | ||||
| 		 */ | ||||
| 		cpu_idle_poll_ctrl(false); | ||||
| 	} | ||||
| 		break; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int comparator_set_oneshot(struct clock_event_device *evdev) | ||||
| { | ||||
| 	pr_debug("%s: %s\n", __func__, evdev->name); | ||||
| 
 | ||||
| 	disable_cpu_idle_poll = true; | ||||
| 	/*
 | ||||
| 	 * If we're using the COUNT and COMPARE registers we | ||||
| 	 * need to force idle poll. | ||||
| 	 */ | ||||
| 	cpu_idle_poll_ctrl(true); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct clock_event_device comparator = { | ||||
|  | @ -118,7 +117,9 @@ static struct clock_event_device comparator = { | |||
| 	.shift			= 16, | ||||
| 	.rating			= 50, | ||||
| 	.set_next_event		= comparator_next_event, | ||||
| 	.set_mode	= comparator_mode, | ||||
| 	.set_state_shutdown	= comparator_shutdown, | ||||
| 	.set_state_oneshot	= comparator_set_oneshot, | ||||
| 	.tick_resume		= comparator_set_oneshot, | ||||
| }; | ||||
| 
 | ||||
| void read_persistent_clock(struct timespec *ts) | ||||
|  |  | |||
|  | @ -80,6 +80,9 @@ int clk_enable(struct clk *clk) | |||
| { | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&clk_lock, flags); | ||||
| 	__clk_enable(clk); | ||||
| 	spin_unlock_irqrestore(&clk_lock, flags); | ||||
|  | @ -106,6 +109,9 @@ void clk_disable(struct clk *clk) | |||
| { | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (IS_ERR_OR_NULL(clk)) | ||||
| 		return; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&clk_lock, flags); | ||||
| 	__clk_disable(clk); | ||||
| 	spin_unlock_irqrestore(&clk_lock, flags); | ||||
|  | @ -117,6 +123,9 @@ unsigned long clk_get_rate(struct clk *clk) | |||
| 	unsigned long flags; | ||||
| 	unsigned long rate; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&clk_lock, flags); | ||||
| 	rate = clk->get_rate(clk); | ||||
| 	spin_unlock_irqrestore(&clk_lock, flags); | ||||
|  | @ -129,6 +138,9 @@ long clk_round_rate(struct clk *clk, unsigned long rate) | |||
| { | ||||
| 	unsigned long flags, actual_rate; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (!clk->set_rate) | ||||
| 		return -ENOSYS; | ||||
| 
 | ||||
|  | @ -145,6 +157,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
| 	unsigned long flags; | ||||
| 	long ret; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (!clk->set_rate) | ||||
| 		return -ENOSYS; | ||||
| 
 | ||||
|  | @ -161,6 +176,9 @@ int clk_set_parent(struct clk *clk, struct clk *parent) | |||
| 	unsigned long flags; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (!clk->set_parent) | ||||
| 		return -ENOSYS; | ||||
| 
 | ||||
|  | @ -174,7 +192,7 @@ EXPORT_SYMBOL(clk_set_parent); | |||
| 
 | ||||
| struct clk *clk_get_parent(struct clk *clk) | ||||
| { | ||||
| 	return clk->parent; | ||||
| 	return !clk ? NULL : clk->parent; | ||||
| } | ||||
| EXPORT_SYMBOL(clk_get_parent); | ||||
| 
 | ||||
|  |  | |||
|  | @ -174,6 +174,11 @@ static inline void _writel(unsigned long l, unsigned long addr) | |||
| #define iowrite16 writew | ||||
| #define iowrite32 writel | ||||
| 
 | ||||
| #define ioread16be(addr)	be16_to_cpu(readw(addr)) | ||||
| #define ioread32be(addr)	be32_to_cpu(readl(addr)) | ||||
| #define iowrite16be(v, addr)	writew(cpu_to_be16(v), (addr)) | ||||
| #define iowrite32be(v, addr)	writel(cpu_to_be32(v), (addr)) | ||||
| 
 | ||||
| #define mmiowb() | ||||
| 
 | ||||
| #define flush_write_buffers() do { } while (0)  /* M32R_FIXME */ | ||||
|  |  | |||
|  | @ -151,7 +151,6 @@ config BMIPS_GENERIC | |||
| 	select BCM7120_L2_IRQ | ||||
| 	select BRCMSTB_L2_IRQ | ||||
| 	select IRQ_MIPS_CPU | ||||
| 	select RAW_IRQ_ACCESSORS | ||||
| 	select DMA_NONCOHERENT | ||||
| 	select SYS_SUPPORTS_32BIT_KERNEL | ||||
| 	select SYS_SUPPORTS_LITTLE_ENDIAN | ||||
|  |  | |||
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
	
	 Dave Airlie
				Dave Airlie