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@ftp.linux.org.uk>
 | 
				
			||||||
Al Viro <viro@zenIV.linux.org.uk>
 | 
					Al Viro <viro@zenIV.linux.org.uk>
 | 
				
			||||||
Andreas Herrmann <aherrman@de.ibm.com>
 | 
					Andreas Herrmann <aherrman@de.ibm.com>
 | 
				
			||||||
 | 
					Andrey Ryabinin <ryabinin.a.a@gmail.com> <a.ryabinin@samsung.com>
 | 
				
			||||||
Andrew Morton <akpm@linux-foundation.org>
 | 
					Andrew Morton <akpm@linux-foundation.org>
 | 
				
			||||||
Andrew Vasquez <andrew.vasquez@qlogic.com>
 | 
					Andrew Vasquez <andrew.vasquez@qlogic.com>
 | 
				
			||||||
Andy Adamson <andros@citi.umich.edu>
 | 
					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-v1"
 | 
				
			||||||
			    "qcom,kpss-acc-v2"
 | 
								    "qcom,kpss-acc-v2"
 | 
				
			||||||
			    "rockchip,rk3066-smp"
 | 
								    "rockchip,rk3066-smp"
 | 
				
			||||||
 | 
								    "ste,dbx500-smp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	- cpu-release-addr
 | 
						- cpu-release-addr
 | 
				
			||||||
		Usage: required for systems that have an "enable-method"
 | 
							Usage: required for systems that have an "enable-method"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ Example:
 | 
				
			||||||
			device_type = "dma";
 | 
								device_type = "dma";
 | 
				
			||||||
			reg = <0x0 0x1f270000 0x0 0x10000>,
 | 
								reg = <0x0 0x1f270000 0x0 0x10000>,
 | 
				
			||||||
			      <0x0 0x1f200000 0x0 0x10000>,
 | 
								      <0x0 0x1f200000 0x0 0x10000>,
 | 
				
			||||||
			      <0x0 0x1b008000 0x0 0x2000>,
 | 
								      <0x0 0x1b000000 0x0 0x400000>,
 | 
				
			||||||
			      <0x0 0x1054a000 0x0 0x100>;
 | 
								      <0x0 0x1054a000 0x0 0x100>;
 | 
				
			||||||
			interrupts = <0x0 0x82 0x4>,
 | 
								interrupts = <0x0 0x82 0x4>,
 | 
				
			||||||
				     <0x0 0xb8 0x4>,
 | 
									     <0x0 0xb8 0x4>,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,3 +35,6 @@ the PCIe specification.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      NOTE: this only applies to the SMMU itself, not
 | 
					                      NOTE: this only applies to the SMMU itself, not
 | 
				
			||||||
                      masters connected upstream of the SMMU.
 | 
					                      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"
 | 
						       "fsl,imx6sx-usdhc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Optional properties:
 | 
					Optional properties:
 | 
				
			||||||
- fsl,cd-controller : Indicate to use controller internal card detection
 | 
					 | 
				
			||||||
- fsl,wp-controller : Indicate to use controller internal write protection
 | 
					- fsl,wp-controller : Indicate to use controller internal write protection
 | 
				
			||||||
- fsl,delay-line : Specify the number of delay cells for override mode.
 | 
					- 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
 | 
					  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";
 | 
						compatible = "fsl,imx51-esdhc";
 | 
				
			||||||
	reg = <0x70004000 0x4000>;
 | 
						reg = <0x70004000 0x4000>;
 | 
				
			||||||
	interrupts = <1>;
 | 
						interrupts = <1>;
 | 
				
			||||||
	fsl,cd-controller;
 | 
					 | 
				
			||||||
	fsl,wp-controller;
 | 
						fsl,wp-controller;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,6 +82,9 @@ Optional properties:
 | 
				
			||||||
 - id: If there are multiple instance of the same type, in order to
 | 
					 - 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
 | 
					   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'.
 | 
					   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.
 | 
					This is usually a subnode of ocp2scp to which it is connected.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,3 +103,16 @@ usb3phy@4a084400 {
 | 
				
			||||||
			"sysclk",
 | 
								"sysclk",
 | 
				
			||||||
			"refclk";
 | 
								"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:
 | 
					Required properties:
 | 
				
			||||||
- compatible : "mediatek,mt8173-max98090"
 | 
					- compatible : "mediatek,mt8173-max98090"
 | 
				
			||||||
- mediatek,audio-codec: the phandle of the MAX98090 audio codec
 | 
					- mediatek,audio-codec: the phandle of the MAX98090 audio codec
 | 
				
			||||||
 | 
					- mediatek,platform: the phandle of MT8173 ASoC platform
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example:
 | 
					Example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sound {
 | 
						sound {
 | 
				
			||||||
		compatible = "mediatek,mt8173-max98090";
 | 
							compatible = "mediatek,mt8173-max98090";
 | 
				
			||||||
		mediatek,audio-codec = <&max98090>;
 | 
							mediatek,audio-codec = <&max98090>;
 | 
				
			||||||
 | 
							mediatek,platform = <&afe>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS
 | 
				
			||||||
Required properties:
 | 
					Required properties:
 | 
				
			||||||
- compatible : "mediatek,mt8173-rt5650-rt5676"
 | 
					- compatible : "mediatek,mt8173-rt5650-rt5676"
 | 
				
			||||||
- mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
 | 
					- mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
 | 
				
			||||||
 | 
					- mediatek,platform: the phandle of MT8173 ASoC platform
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example:
 | 
					Example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sound {
 | 
						sound {
 | 
				
			||||||
		compatible = "mediatek,mt8173-rt5650-rt5676";
 | 
							compatible = "mediatek,mt8173-rt5650-rt5676";
 | 
				
			||||||
		mediatek,audio-codec = <&rt5650 &rt5676>;
 | 
							mediatek,audio-codec = <&rt5650 &rt5676>;
 | 
				
			||||||
 | 
							mediatek,platform = <&afe>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@ Binding for Qualcomm Atheros AR7xxx/AR9xxx SPI controller
 | 
				
			||||||
Required properties:
 | 
					Required properties:
 | 
				
			||||||
- compatible: has to be "qca,<soc-type>-spi", "qca,ar7100-spi" as fallback.
 | 
					- compatible: has to be "qca,<soc-type>-spi", "qca,ar7100-spi" as fallback.
 | 
				
			||||||
- reg: Base address and size of the controllers memory area
 | 
					- 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".
 | 
					- clock-names: has to be "ahb".
 | 
				
			||||||
- #address-cells: <1>, as required by generic SPI binding.
 | 
					- #address-cells: <1>, as required by generic SPI binding.
 | 
				
			||||||
- #size-cells: <0>, also 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:
 | 
					Example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spi@1F000000 {
 | 
						spi@1f000000 {
 | 
				
			||||||
		compatible = "qca,ar9132-spi", "qca,ar7100-spi";
 | 
							compatible = "qca,ar9132-spi", "qca,ar7100-spi";
 | 
				
			||||||
		reg = <0x1F000000 0x10>;
 | 
							reg = <0x1f000000 0x10>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		clocks = <&pll 2>;
 | 
							clocks = <&pll 2>;
 | 
				
			||||||
		clock-names = "ahb";
 | 
							clock-names = "ahb";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,11 +35,11 @@ temp1_input		Local temperature (1/1000 degree,
 | 
				
			||||||
temp[2-9]_input		CPU temperatures (1/1000 degree,
 | 
					temp[2-9]_input		CPU temperatures (1/1000 degree,
 | 
				
			||||||
			0.125 degree resolution)
 | 
								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
 | 
								Setting SmartFan mode is supported only if it has been
 | 
				
			||||||
			previously configured by BIOS (or configuration EEPROM)
 | 
								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
 | 
					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
 | 
					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
 | 
					 byte 5:  0   z6   z5   z4   z3   z2   z1   z0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
 | 
					Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
 | 
				
			||||||
the DualPoint Stick. For non interleaved dualpoint devices the pointingstick
 | 
					the DualPoint Stick. The M, R and L bits signal the combined status of both
 | 
				
			||||||
buttons get reported separately in the PSM, PSR and PSL bits.
 | 
					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
 | 
					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/string.h>\n"
 | 
				
			||||||
	buf += "#include <linux/configfs.h>\n"
 | 
						buf += "#include <linux/configfs.h>\n"
 | 
				
			||||||
	buf += "#include <linux/ctype.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_base.h>\n"
 | 
				
			||||||
	buf += "#include <target/target_core_fabric.h>\n"
 | 
						buf += "#include <target/target_core_fabric.h>\n"
 | 
				
			||||||
	buf += "#include <target/target_core_fabric_configfs.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 += "	}\n"
 | 
				
			||||||
	buf += "	tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n"
 | 
						buf += "	tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n"
 | 
				
			||||||
	buf += "	tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\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 += "	if (ret < 0) {\n"
 | 
				
			||||||
	buf += "		kfree(tpg);\n"
 | 
						buf += "		kfree(tpg);\n"
 | 
				
			||||||
	buf += "		return NULL;\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 += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
 | 
				
			||||||
	buf += "	.module				= THIS_MODULE,\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 += "	.get_fabric_name		= " + fabric_mod_name + "_get_fabric_name,\n"
 | 
				
			||||||
	buf += "	.tpg_get_wwn			= " + fabric_mod_name + "_get_fabric_wwn,\n"
 | 
						buf += "	.tpg_get_wwn			= " + fabric_mod_name + "_get_fabric_wwn,\n"
 | 
				
			||||||
	buf += "	.tpg_get_tag			= " + fabric_mod_name + "_get_tag,\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_make_tpg		= " + fabric_mod_name + "_make_tpg,\n"
 | 
				
			||||||
	buf += "	.fabric_drop_tpg		= " + fabric_mod_name + "_drop_tpg,\n"
 | 
						buf += "	.fabric_drop_tpg		= " + fabric_mod_name + "_drop_tpg,\n"
 | 
				
			||||||
	buf += "\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 += "};\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf += "static int __init " + fabric_mod_name + "_init(void)\n"
 | 
						buf += "static int __init " + fabric_mod_name + "_init(void)\n"
 | 
				
			||||||
	buf += "{\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 += "};\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf += "static void __exit " + fabric_mod_name + "_exit(void)\n"
 | 
						buf += "static void __exit " + fabric_mod_name + "_exit(void)\n"
 | 
				
			||||||
	buf += "{\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 += "};\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf += "MODULE_DESCRIPTION(\"" + fabric_mod_name.upper() + " series fabric driver\");\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:	drivers/gpu/drm/rockchip/
 | 
				
			||||||
F:	Documentation/devicetree/bindings/video/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
 | 
					DSBR100 USB FM RADIO DRIVER
 | 
				
			||||||
M:	Alexey Klimov <klimov.linux@gmail.com>
 | 
					M:	Alexey Klimov <klimov.linux@gmail.com>
 | 
				
			||||||
L:	linux-media@vger.kernel.org
 | 
					L:	linux-media@vger.kernel.org
 | 
				
			||||||
| 
						 | 
					@ -5605,6 +5614,7 @@ F:	kernel/irq/
 | 
				
			||||||
IRQCHIP DRIVERS
 | 
					IRQCHIP DRIVERS
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
M:	Jason Cooper <jason@lakedaemon.net>
 | 
					M:	Jason Cooper <jason@lakedaemon.net>
 | 
				
			||||||
 | 
					M:	Marc Zyngier <marc.zyngier@arm.com>
 | 
				
			||||||
L:	linux-kernel@vger.kernel.org
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 | 
					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/
 | 
					F:	drivers/irqchip/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
 | 
					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
 | 
					S:	Maintained
 | 
				
			||||||
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 | 
				
			||||||
F:	Documentation/IRQ-domain.txt
 | 
					F:	Documentation/IRQ-domain.txt
 | 
				
			||||||
F:	include/linux/irqdomain.h
 | 
					F:	include/linux/irqdomain.h
 | 
				
			||||||
F:	kernel/irq/irqdomain.c
 | 
					F:	kernel/irq/irqdomain.c
 | 
				
			||||||
 | 
					F:	kernel/irq/msi.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ISAPNP
 | 
					ISAPNP
 | 
				
			||||||
M:	Jaroslav Kysela <perex@perex.cz>
 | 
					M:	Jaroslav Kysela <perex@perex.cz>
 | 
				
			||||||
| 
						 | 
					@ -5904,7 +5917,6 @@ S:	Supported
 | 
				
			||||||
F:	Documentation/s390/kvm.txt
 | 
					F:	Documentation/s390/kvm.txt
 | 
				
			||||||
F:	arch/s390/include/asm/kvm*
 | 
					F:	arch/s390/include/asm/kvm*
 | 
				
			||||||
F:	arch/s390/kvm/
 | 
					F:	arch/s390/kvm/
 | 
				
			||||||
F:	drivers/s390/kvm/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
KERNEL VIRTUAL MACHINE (KVM) FOR ARM
 | 
					KERNEL VIRTUAL MACHINE (KVM) FOR ARM
 | 
				
			||||||
M:	Christoffer Dall <christoffer.dall@linaro.org>
 | 
					M:	Christoffer Dall <christoffer.dall@linaro.org>
 | 
				
			||||||
| 
						 | 
					@ -6844,6 +6856,12 @@ T:	git git://linuxtv.org/anttip/media_tree.git
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/media/usb/msi2500/
 | 
					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
 | 
					MT9M032 APTINA SENSOR DRIVER
 | 
				
			||||||
M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 | 
					M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 | 
				
			||||||
L:	linux-media@vger.kernel.org
 | 
					L:	linux-media@vger.kernel.org
 | 
				
			||||||
| 
						 | 
					@ -10901,6 +10919,15 @@ F:	drivers/block/virtio_blk.c
 | 
				
			||||||
F:	include/linux/virtio_*.h
 | 
					F:	include/linux/virtio_*.h
 | 
				
			||||||
F:	include/uapi/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
 | 
					VIRTIO GPU DRIVER
 | 
				
			||||||
M:	David Airlie <airlied@linux.ie>
 | 
					M:	David Airlie <airlied@linux.ie>
 | 
				
			||||||
M:	Gerd Hoffmann <kraxel@redhat.com>
 | 
					M:	Gerd Hoffmann <kraxel@redhat.com>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
VERSION = 4
 | 
					VERSION = 4
 | 
				
			||||||
PATCHLEVEL = 2
 | 
					PATCHLEVEL = 2
 | 
				
			||||||
SUBLEVEL = 0
 | 
					SUBLEVEL = 0
 | 
				
			||||||
EXTRAVERSION = -rc3
 | 
					EXTRAVERSION = -rc7
 | 
				
			||||||
NAME = Hurr durr I'ma sheep
 | 
					NAME = Hurr durr I'ma sheep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# *DOCUMENTATION*
 | 
					# *DOCUMENTATION*
 | 
				
			||||||
| 
						 | 
					@ -597,6 +597,11 @@ endif # $(dot-config)
 | 
				
			||||||
# Defaults to vmlinux, but the arch makefile usually adds further targets
 | 
					# Defaults to vmlinux, but the arch makefile usually adds further targets
 | 
				
			||||||
all: vmlinux
 | 
					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
 | 
					include arch/$(SRCARCH)/Makefile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
KBUILD_CFLAGS	+= $(call cc-option,-fno-delete-null-pointer-checks,)
 | 
					KBUILD_CFLAGS	+= $(call cc-option,-fno-delete-null-pointer-checks,)
 | 
				
			||||||
| 
						 | 
					@ -848,10 +853,10 @@ export mod_strip_cmd
 | 
				
			||||||
mod_compress_cmd = true
 | 
					mod_compress_cmd = true
 | 
				
			||||||
ifdef CONFIG_MODULE_COMPRESS
 | 
					ifdef CONFIG_MODULE_COMPRESS
 | 
				
			||||||
  ifdef CONFIG_MODULE_COMPRESS_GZIP
 | 
					  ifdef CONFIG_MODULE_COMPRESS_GZIP
 | 
				
			||||||
    mod_compress_cmd = gzip -n
 | 
					    mod_compress_cmd = gzip -n -f
 | 
				
			||||||
  endif # CONFIG_MODULE_COMPRESS_GZIP
 | 
					  endif # CONFIG_MODULE_COMPRESS_GZIP
 | 
				
			||||||
  ifdef CONFIG_MODULE_COMPRESS_XZ
 | 
					  ifdef CONFIG_MODULE_COMPRESS_XZ
 | 
				
			||||||
    mod_compress_cmd = xz
 | 
					    mod_compress_cmd = xz -f
 | 
				
			||||||
  endif # CONFIG_MODULE_COMPRESS_XZ
 | 
					  endif # CONFIG_MODULE_COMPRESS_XZ
 | 
				
			||||||
endif # CONFIG_MODULE_COMPRESS
 | 
					endif # CONFIG_MODULE_COMPRESS
 | 
				
			||||||
export mod_compress_cmd
 | 
					export mod_compress_cmd
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -313,11 +313,11 @@ config ARC_PAGE_SIZE_8K
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config ARC_PAGE_SIZE_16K
 | 
					config ARC_PAGE_SIZE_16K
 | 
				
			||||||
	bool "16KB"
 | 
						bool "16KB"
 | 
				
			||||||
	depends on ARC_MMU_V3
 | 
						depends on ARC_MMU_V3 || ARC_MMU_V4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config ARC_PAGE_SIZE_4K
 | 
					config ARC_PAGE_SIZE_4K
 | 
				
			||||||
	bool "4KB"
 | 
						bool "4KB"
 | 
				
			||||||
	depends on ARC_MMU_V3
 | 
						depends on ARC_MMU_V3 || ARC_MMU_V4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endchoice
 | 
					endchoice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -365,6 +365,11 @@ config ARC_HAS_LLSC
 | 
				
			||||||
	default y
 | 
						default y
 | 
				
			||||||
	depends on !ARC_CANT_LLSC
 | 
						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
 | 
					config ARC_HAS_SWAPE
 | 
				
			||||||
	bool "Insn: SWAPE (endian-swap)"
 | 
						bool "Insn: SWAPE (endian-swap)"
 | 
				
			||||||
	default y
 | 
						default y
 | 
				
			||||||
| 
						 | 
					@ -379,6 +384,10 @@ config ARC_HAS_LL64
 | 
				
			||||||
	  dest operands with 2 possible source operands.
 | 
						  dest operands with 2 possible source operands.
 | 
				
			||||||
	default y
 | 
						default y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config ARC_HAS_DIV_REM
 | 
				
			||||||
 | 
						bool "Insn: div, divu, rem, remu"
 | 
				
			||||||
 | 
						default y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config ARC_HAS_RTC
 | 
					config ARC_HAS_RTC
 | 
				
			||||||
	bool "Local 64-bit r/o cycle counter"
 | 
						bool "Local 64-bit r/o cycle counter"
 | 
				
			||||||
	default n
 | 
						default n
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,16 @@ cflags-$(atleast_gcc44)			+= -fsection-anchors
 | 
				
			||||||
cflags-$(CONFIG_ARC_HAS_LLSC)		+= -mlock
 | 
					cflags-$(CONFIG_ARC_HAS_LLSC)		+= -mlock
 | 
				
			||||||
cflags-$(CONFIG_ARC_HAS_SWAPE)		+= -mswape
 | 
					cflags-$(CONFIG_ARC_HAS_SWAPE)		+= -mswape
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifdef CONFIG_ISA_ARCV2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifndef CONFIG_ARC_HAS_LL64
 | 
					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
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cflags-$(CONFIG_ARC_DW2_UNWIND)		+= -fasynchronous-unwind-tables
 | 
					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_LD_MISS		8
 | 
				
			||||||
#define ECR_C_BIT_DTLB_ST_MISS		9
 | 
					#define ECR_C_BIT_DTLB_ST_MISS		9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Auxiliary registers */
 | 
					/* Auxiliary registers */
 | 
				
			||||||
#define AUX_IDENTITY		4
 | 
					#define AUX_IDENTITY		4
 | 
				
			||||||
#define AUX_INTR_VEC_BASE	0x25
 | 
					#define AUX_INTR_VEC_BASE	0x25
 | 
				
			||||||
 | 
					#define AUX_NON_VOL		0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Floating Pt Registers
 | 
					 * Floating Pt Registers
 | 
				
			||||||
| 
						 | 
					@ -240,9 +239,9 @@ struct bcr_extn_xymem {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct bcr_perip {
 | 
					struct bcr_perip {
 | 
				
			||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
 | 
					#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
 | 
					#else
 | 
				
			||||||
	unsigned int pad:8, sz:8, pad2:8, start:8;
 | 
						unsigned int ver:8, sz:8, pad2:8, start:8;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,33 +23,60 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define atomic_set(v, i) (((v)->counter) = (i))
 | 
					#define atomic_set(v, i) (((v)->counter) = (i))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_ISA_ARCV2
 | 
					#ifdef CONFIG_ARC_STAR_9000923308
 | 
				
			||||||
#define PREFETCHW	"	prefetchw   [%1]	\n"
 | 
					
 | 
				
			||||||
#else
 | 
					#define SCOND_FAIL_RETRY_VAR_DEF						\
 | 
				
			||||||
#define PREFETCHW
 | 
						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
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ATOMIC_OP(op, c_op, asm_op)					\
 | 
					#define ATOMIC_OP(op, c_op, asm_op)					\
 | 
				
			||||||
static inline void atomic_##op(int i, atomic_t *v)			\
 | 
					static inline void atomic_##op(int i, atomic_t *v)			\
 | 
				
			||||||
{									\
 | 
					{									\
 | 
				
			||||||
	unsigned int temp;						\
 | 
						unsigned int val;				                \
 | 
				
			||||||
 | 
						SCOND_FAIL_RETRY_VAR_DEF                                        \
 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	__asm__ __volatile__(						\
 | 
						__asm__ __volatile__(						\
 | 
				
			||||||
	"1:				\n"				\
 | 
						"1:	llock   %[val], [%[ctr]]		\n"		\
 | 
				
			||||||
	PREFETCHW							\
 | 
						"	" #asm_op " %[val], %[val], %[i]	\n"		\
 | 
				
			||||||
	"	llock   %0, [%1]	\n"				\
 | 
						"	scond   %[val], [%[ctr]]		\n"		\
 | 
				
			||||||
	"	" #asm_op " %0, %0, %2	\n"				\
 | 
						"						\n"		\
 | 
				
			||||||
	"	scond   %0, [%1]	\n"				\
 | 
						SCOND_FAIL_RETRY_ASM						\
 | 
				
			||||||
	"	bnz     1b		\n"				\
 | 
														\
 | 
				
			||||||
	: "=&r"(temp)	/* Early clobber, to prevent reg reuse */	\
 | 
						: [val]	"=&r"	(val) /* Early clobber to prevent reg reuse */	\
 | 
				
			||||||
	: "r"(&v->counter), "ir"(i)					\
 | 
						  SCOND_FAIL_RETRY_VARS						\
 | 
				
			||||||
 | 
						: [ctr]	"r"	(&v->counter), /* Not "m": llock only supports reg direct addr mode */	\
 | 
				
			||||||
 | 
						  [i]	"ir"	(i)						\
 | 
				
			||||||
	: "cc");							\
 | 
						: "cc");							\
 | 
				
			||||||
}									\
 | 
					}									\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ATOMIC_OP_RETURN(op, c_op, asm_op)				\
 | 
					#define ATOMIC_OP_RETURN(op, c_op, asm_op)				\
 | 
				
			||||||
static inline int atomic_##op##_return(int i, atomic_t *v)		\
 | 
					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		\
 | 
						 * 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();							\
 | 
						smp_mb();							\
 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	__asm__ __volatile__(						\
 | 
						__asm__ __volatile__(						\
 | 
				
			||||||
	"1:				\n"				\
 | 
						"1:	llock   %[val], [%[ctr]]		\n"		\
 | 
				
			||||||
	PREFETCHW							\
 | 
						"	" #asm_op " %[val], %[val], %[i]	\n"		\
 | 
				
			||||||
	"	llock   %0, [%1]	\n"				\
 | 
						"	scond   %[val], [%[ctr]]		\n"		\
 | 
				
			||||||
	"	" #asm_op " %0, %0, %2	\n"				\
 | 
						"						\n"		\
 | 
				
			||||||
	"	scond   %0, [%1]	\n"				\
 | 
						SCOND_FAIL_RETRY_ASM						\
 | 
				
			||||||
	"	bnz     1b		\n"				\
 | 
														\
 | 
				
			||||||
	: "=&r"(temp)							\
 | 
						: [val]	"=&r"	(val)						\
 | 
				
			||||||
	: "r"(&v->counter), "ir"(i)					\
 | 
						  SCOND_FAIL_RETRY_VARS						\
 | 
				
			||||||
 | 
						: [ctr]	"r"	(&v->counter),					\
 | 
				
			||||||
 | 
						  [i]	"ir"	(i)						\
 | 
				
			||||||
	: "cc");							\
 | 
						: "cc");							\
 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	smp_mb();							\
 | 
						smp_mb();							\
 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	return temp;							\
 | 
						return val;							\
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else	/* !CONFIG_ARC_HAS_LLSC */
 | 
					#else	/* !CONFIG_ARC_HAS_LLSC */
 | 
				
			||||||
| 
						 | 
					@ -150,6 +179,9 @@ ATOMIC_OP(and, &=, and)
 | 
				
			||||||
#undef ATOMIC_OPS
 | 
					#undef ATOMIC_OPS
 | 
				
			||||||
#undef ATOMIC_OP_RETURN
 | 
					#undef ATOMIC_OP_RETURN
 | 
				
			||||||
#undef ATOMIC_OP
 | 
					#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
 | 
					 * __atomic_add_unless - add unless the number is a given value
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,20 +20,20 @@
 | 
				
			||||||
struct pt_regs {
 | 
					struct pt_regs {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Real registers */
 | 
						/* 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 */
 | 
						unsigned long status32;	/* status32_l1, status32_l2, erstatus */
 | 
				
			||||||
	long ret;	/* ilink1, ilink2 or eret */
 | 
						unsigned long ret;	/* ilink1, ilink2 or eret */
 | 
				
			||||||
	long blink;
 | 
						unsigned long blink;
 | 
				
			||||||
	long fp;
 | 
						unsigned long fp;
 | 
				
			||||||
	long r26;	/* gp */
 | 
						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  */
 | 
						unsigned long sp;	/* User/Kernel depending on where we came from */
 | 
				
			||||||
	long orig_r0;
 | 
						unsigned long orig_r0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * To distinguish bet excp, syscall, irq
 | 
						 * To distinguish bet excp, syscall, irq
 | 
				
			||||||
| 
						 | 
					@ -55,13 +55,13 @@ struct pt_regs {
 | 
				
			||||||
		unsigned long event;
 | 
							unsigned long event;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long user_r25;
 | 
						unsigned long user_r25;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct pt_regs {
 | 
					struct pt_regs {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long orig_r0;
 | 
						unsigned long orig_r0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	union {
 | 
						union {
 | 
				
			||||||
		struct {
 | 
							struct {
 | 
				
			||||||
| 
						 | 
					@ -76,26 +76,26 @@ struct pt_regs {
 | 
				
			||||||
		unsigned long event;
 | 
							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 */
 | 
						unsigned long r26;	/* gp */
 | 
				
			||||||
	long fp;
 | 
						unsigned long fp;
 | 
				
			||||||
	long sp;	/* user/kernel sp depending on where we came from  */
 | 
						unsigned long sp;	/* user/kernel sp depending on where we came from  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long r12;
 | 
						unsigned long r12;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*------- Below list auto saved by h/w -----------*/
 | 
						/*------- 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;
 | 
						unsigned long blink;
 | 
				
			||||||
	long lp_end, lp_start, lp_count;
 | 
						unsigned long lp_end, lp_start, lp_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long ei, ldi, jli;
 | 
						unsigned long ei, ldi, jli;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long ret;
 | 
						unsigned long ret;
 | 
				
			||||||
	long status32;
 | 
						unsigned long status32;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -103,10 +103,10 @@ struct pt_regs {
 | 
				
			||||||
/* Callee saved registers - need to be saved only when you are scheduled out */
 | 
					/* Callee saved registers - need to be saved only when you are scheduled out */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct callee_regs {
 | 
					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)
 | 
					#define profile_pc(regs)		instruction_pointer(regs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* return 1 if user mode or 0 if kernel mode */
 | 
					/* 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)
 | 
					static inline long regs_return_value(struct pt_regs *regs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return regs->r0;
 | 
						return (long)regs->r0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* !__ASSEMBLY__ */
 | 
					#endif /* !__ASSEMBLY__ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,9 +18,518 @@
 | 
				
			||||||
#define arch_spin_unlock_wait(x) \
 | 
					#define arch_spin_unlock_wait(x) \
 | 
				
			||||||
	do { while (arch_spin_is_locked(x)) cpu_relax(); } while (0)
 | 
						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)
 | 
					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
 | 
						 * 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__(
 | 
						__asm__ __volatile__(
 | 
				
			||||||
	"1:	ex  %0, [%1]		\n"
 | 
						"1:	ex  %0, [%1]		\n"
 | 
				
			||||||
	"	breq  %0, %2, 1b	\n"
 | 
						"	breq  %0, %2, 1b	\n"
 | 
				
			||||||
	: "+&r" (tmp)
 | 
						: "+&r" (val)
 | 
				
			||||||
	: "r"(&(lock->slock)), "ir"(__ARCH_SPIN_LOCK_LOCKED__)
 | 
						: "r"(&(lock->slock)), "ir"(__ARCH_SPIN_LOCK_LOCKED__)
 | 
				
			||||||
	: "memory");
 | 
						: "memory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,26 +557,27 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
 | 
				
			||||||
	smp_mb();
 | 
						smp_mb();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 1 - lock taken successfully */
 | 
				
			||||||
static inline int arch_spin_trylock(arch_spinlock_t *lock)
 | 
					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();
 | 
						smp_mb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__asm__ __volatile__(
 | 
						__asm__ __volatile__(
 | 
				
			||||||
	"1:	ex  %0, [%1]		\n"
 | 
						"1:	ex  %0, [%1]		\n"
 | 
				
			||||||
	: "+r" (tmp)
 | 
						: "+r" (val)
 | 
				
			||||||
	: "r"(&(lock->slock))
 | 
						: "r"(&(lock->slock))
 | 
				
			||||||
	: "memory");
 | 
						: "memory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	smp_mb();
 | 
						smp_mb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (tmp == __ARCH_SPIN_LOCK_UNLOCKED__);
 | 
						return (val == __ARCH_SPIN_LOCK_UNLOCKED__);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void arch_spin_unlock(arch_spinlock_t *lock)
 | 
					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
 | 
						 * 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__(
 | 
						__asm__ __volatile__(
 | 
				
			||||||
	"	ex  %0, [%1]		\n"
 | 
						"	ex  %0, [%1]		\n"
 | 
				
			||||||
	: "+r" (tmp)
 | 
						: "+r" (val)
 | 
				
			||||||
	: "r"(&(lock->slock))
 | 
						: "r"(&(lock->slock))
 | 
				
			||||||
	: "memory");
 | 
						: "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.
 | 
					 * 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
 | 
					 * The spinlock itself is contained in @counter and access to it is
 | 
				
			||||||
 * serialized with @lock_mutex.
 | 
					 * 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 */
 | 
					/* 1 - lock taken successfully */
 | 
				
			||||||
static inline int arch_read_trylock(arch_rwlock_t *rw)
 | 
					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));
 | 
						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_read_lock_flags(lock, flags)	arch_read_lock(lock)
 | 
				
			||||||
#define arch_write_lock_flags(lock, flags)	arch_write_lock(lock)
 | 
					#define arch_write_lock_flags(lock, flags)	arch_write_lock(lock)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,9 @@ typedef struct {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
	volatile unsigned int	counter;
 | 
						volatile unsigned int	counter;
 | 
				
			||||||
 | 
					#ifndef CONFIG_ARC_HAS_LLSC
 | 
				
			||||||
	arch_spinlock_t		lock_mutex;
 | 
						arch_spinlock_t		lock_mutex;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
} arch_rwlock_t;
 | 
					} arch_rwlock_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __ARCH_RW_LOCK_UNLOCKED__	0x01000000
 | 
					#define __ARCH_RW_LOCK_UNLOCKED__	0x01000000
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,20 +32,20 @@
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
struct user_regs_struct {
 | 
					struct user_regs_struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long pad;
 | 
						unsigned long pad;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		long bta, lp_start, lp_end, lp_count;
 | 
							unsigned long bta, lp_start, lp_end, lp_count;
 | 
				
			||||||
		long status32, ret, blink, fp, gp;
 | 
							unsigned long status32, ret, blink, fp, 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;
 | 
							unsigned long sp;
 | 
				
			||||||
	} scratch;
 | 
						} scratch;
 | 
				
			||||||
	long pad2;
 | 
						unsigned long pad2;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		long r25, r24, r23, r22, r21, r20;
 | 
							unsigned long r25, r24, r23, r22, r21, r20;
 | 
				
			||||||
		long r19, r18, r17, r16, r15, r14, r13;
 | 
							unsigned long r19, r18, r17, r16, r15, r14, r13;
 | 
				
			||||||
	} callee;
 | 
						} callee;
 | 
				
			||||||
	long efa;	/* break pt addr, for break points in delay slots */
 | 
						unsigned long efa;	/* break pt addr, for break points in delay slots */
 | 
				
			||||||
	long stop_pc;	/* give dbg stop_pc after ensuring brkpt trap */
 | 
						unsigned long stop_pc;	/* give dbg stop_pc after ensuring brkpt trap */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif /* !__ASSEMBLY__ */
 | 
					#endif /* !__ASSEMBLY__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,7 @@ static void read_arc_build_cfg_regs(void)
 | 
				
			||||||
	struct bcr_perip uncached_space;
 | 
						struct bcr_perip uncached_space;
 | 
				
			||||||
	struct bcr_generic bcr;
 | 
						struct bcr_generic bcr;
 | 
				
			||||||
	struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
 | 
						struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
 | 
				
			||||||
 | 
						unsigned long perip_space;
 | 
				
			||||||
	FIX_PTR(cpu);
 | 
						FIX_PTR(cpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	READ_BCR(AUX_IDENTITY, cpu->core);
 | 
						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);
 | 
						cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space);
 | 
						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);
 | 
						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");
 | 
							pr_warn("CONFIG_ARC_FPU_SAVE_RESTORE needed for working apps\n");
 | 
				
			||||||
	else if (!cpu->extn.fpu_dp && fpu_enabled)
 | 
						else if (!cpu->extn.fpu_dp && fpu_enabled)
 | 
				
			||||||
		panic("FPU non-existent, disable CONFIG_ARC_FPU_SAVE_RESTORE\n");
 | 
							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;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void arc_clkevent_set_mode(enum clock_event_mode mode,
 | 
					static int arc_clkevent_set_periodic(struct clock_event_device *dev)
 | 
				
			||||||
				  struct clock_event_device *dev)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (mode) {
 | 
					 | 
				
			||||||
	case CLOCK_EVT_MODE_PERIODIC:
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * At X Hz, 1 sec = 1000ms -> X cycles;
 | 
						 * At X Hz, 1 sec = 1000ms -> X cycles;
 | 
				
			||||||
	 *		      10ms -> X / 100 cycles
 | 
						 *		      10ms -> X / 100 cycles
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	arc_timer_event_setup(arc_get_core_freq() / HZ);
 | 
						arc_timer_event_setup(arc_get_core_freq() / HZ);
 | 
				
			||||||
		break;
 | 
						return 0;
 | 
				
			||||||
	case CLOCK_EVT_MODE_ONESHOT:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEFINE_PER_CPU(struct clock_event_device, arc_clockevent_device) = {
 | 
					static DEFINE_PER_CPU(struct clock_event_device, arc_clockevent_device) = {
 | 
				
			||||||
	.name			= "ARC Timer0",
 | 
						.name			= "ARC Timer0",
 | 
				
			||||||
	.features	= CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
 | 
						.features		= CLOCK_EVT_FEAT_ONESHOT |
 | 
				
			||||||
	.mode		= CLOCK_EVT_MODE_UNUSED,
 | 
									  CLOCK_EVT_FEAT_PERIODIC,
 | 
				
			||||||
	.rating			= 300,
 | 
						.rating			= 300,
 | 
				
			||||||
	.irq			= TIMER0_IRQ,	/* hardwired, no need for resources */
 | 
						.irq			= TIMER0_IRQ,	/* hardwired, no need for resources */
 | 
				
			||||||
	.set_next_event		= arc_clkevent_set_next_event,
 | 
						.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)
 | 
					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()
 | 
						 * irq_set_chip_and_handler() asked for handle_percpu_devid_irq()
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
 | 
						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
 | 
						 * Any write to CTRL reg ACks the interrupt, we rewrite the
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ unalignedOffby3:
 | 
				
			||||||
	ld.ab	r6, [r1, 4]
 | 
						ld.ab	r6, [r1, 4]
 | 
				
			||||||
	prefetch [r1, 28]	;Prefetch the next read location
 | 
						prefetch [r1, 28]	;Prefetch the next read location
 | 
				
			||||||
	ld.ab	r8, [r1,4]
 | 
						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)
 | 
						SHIFT_1	(r7, r6, 8)
 | 
				
			||||||
	or	r7, r7, r5
 | 
						or	r7, r7, r5
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,12 +10,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef PREALLOC_NOT_AVAIL
 | 
					#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)
 | 
					ENTRY(memset)
 | 
				
			||||||
	prefetchw [r0]		; Prefetch the write location
 | 
						prefetchw [r0]		; Prefetch the write location
 | 
				
			||||||
	mov.f	0, r2
 | 
						mov.f	0, r2
 | 
				
			||||||
| 
						 | 
					@ -51,9 +45,15 @@ ENTRY(memset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; Convert len to Dwords, unfold x8
 | 
					;;; Convert len to Dwords, unfold x8
 | 
				
			||||||
	lsr.f	lp_count, lp_count, 6
 | 
						lsr.f	lp_count, lp_count, 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lpnz	@.Lset64bytes
 | 
						lpnz	@.Lset64bytes
 | 
				
			||||||
	;; LOOP START
 | 
						;; 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]
 | 
						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]
 | 
						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:
 | 
					.Lset64bytes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lsr.f	lp_count, r2, 5 ;Last remaining  max 124 bytes
 | 
						lsr.f	lp_count, r2, 5 ;Last remaining  max 124 bytes
 | 
				
			||||||
	lpnz	.Lset32bytes
 | 
						lpnz	.Lset32bytes
 | 
				
			||||||
	;; LOOP START
 | 
						;; LOOP START
 | 
				
			||||||
	prefetchw   [r3, 32]	;Prefetch the next write location
 | 
						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]
 | 
				
			||||||
	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:
 | 
					.Lset32bytes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	and.f	lp_count, r2, 0x1F ;Last remaining 31 bytes
 | 
						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)
 | 
					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) {
 | 
						switch (arc_get_core_freq()/1000000) {
 | 
				
			||||||
	case 33:
 | 
						case 33:
 | 
				
			||||||
		axs103_set_freq(1, 1, 1);
 | 
							axs103_set_freq(1, 1, 1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,7 +116,7 @@
 | 
				
			||||||
				ranges = <0 0x2000 0x2000>;
 | 
									ranges = <0 0x2000 0x2000>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				scm_conf: scm_conf@0 {
 | 
									scm_conf: scm_conf@0 {
 | 
				
			||||||
					compatible = "syscon";
 | 
										compatible = "syscon", "simple-bus";
 | 
				
			||||||
					reg = <0x0 0x1400>;
 | 
										reg = <0x0 0x1400>;
 | 
				
			||||||
					#address-cells = <1>;
 | 
										#address-cells = <1>;
 | 
				
			||||||
					#size-cells = <1>;
 | 
										#size-cells = <1>;
 | 
				
			||||||
| 
						 | 
					@ -1140,6 +1140,7 @@
 | 
				
			||||||
				ctrl-module = <&omap_control_sata>;
 | 
									ctrl-module = <&omap_control_sata>;
 | 
				
			||||||
				clocks = <&sys_clkin1>, <&sata_ref_clk>;
 | 
									clocks = <&sys_clkin1>, <&sata_ref_clk>;
 | 
				
			||||||
				clock-names = "sysclk", "refclk";
 | 
									clock-names = "sysclk", "refclk";
 | 
				
			||||||
 | 
									syscon-pllreset = <&scm_conf 0x3fc>;
 | 
				
			||||||
				#phy-cells = <0>;
 | 
									#phy-cells = <0>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -138,8 +138,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mipi_phy: video-phy@10020710 {
 | 
							mipi_phy: video-phy@10020710 {
 | 
				
			||||||
			compatible = "samsung,s5pv210-mipi-video-phy";
 | 
								compatible = "samsung,s5pv210-mipi-video-phy";
 | 
				
			||||||
			reg = <0x10020710 8>;
 | 
					 | 
				
			||||||
			#phy-cells = <1>;
 | 
								#phy-cells = <1>;
 | 
				
			||||||
 | 
								syscon = <&pmu_system_controller>;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pd_cam: cam-power-domain@10023C00 {
 | 
							pd_cam: cam-power-domain@10023C00 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,6 +127,10 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&cpu0 {
 | 
				
			||||||
 | 
						cpu0-supply = <&buck1_reg>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&fimd {
 | 
					&fimd {
 | 
				
			||||||
	pinctrl-0 = <&lcd_en &lcd_clk &lcd_data24 &pwm0_out>;
 | 
						pinctrl-0 = <&lcd_en &lcd_clk &lcd_data24 &pwm0_out>;
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -188,6 +188,10 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&cpu0 {
 | 
				
			||||||
 | 
						cpu0-supply = <&varm_breg>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&dsi_0 {
 | 
					&dsi_0 {
 | 
				
			||||||
	vddcore-supply = <&vusb_reg>;
 | 
						vddcore-supply = <&vusb_reg>;
 | 
				
			||||||
	vddio-supply = <&vmipi_reg>;
 | 
						vddio-supply = <&vmipi_reg>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -548,6 +548,10 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&cpu0 {
 | 
				
			||||||
 | 
						cpu0-supply = <&vdd_arm_reg>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&pinctrl_1 {
 | 
					&pinctrl_1 {
 | 
				
			||||||
	hdmi_hpd: hdmi-hpd {
 | 
						hdmi_hpd: hdmi-hpd {
 | 
				
			||||||
		samsung,pins = "gpx3-7";
 | 
							samsung,pins = "gpx3-7";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,18 @@
 | 
				
			||||||
			device_type = "cpu";
 | 
								device_type = "cpu";
 | 
				
			||||||
			compatible = "arm,cortex-a9";
 | 
								compatible = "arm,cortex-a9";
 | 
				
			||||||
			reg = <0x900>;
 | 
								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-min-level = <4>;
 | 
				
			||||||
			cooling-max-level = <2>;
 | 
								cooling-max-level = <2>;
 | 
				
			||||||
			#cooling-cells = <2>; /* min followed by max */
 | 
								#cooling-cells = <2>; /* min followed by max */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/dts-v1/;
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
#include "imx25.dtsi"
 | 
					#include "imx25.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,8 +115,8 @@
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio2 1 0>;
 | 
						cd-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 0 0>;
 | 
						wp-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -286,8 +286,8 @@
 | 
				
			||||||
			can1: can@53fe4000 {
 | 
								can1: can@53fe4000 {
 | 
				
			||||||
				compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan";
 | 
									compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan";
 | 
				
			||||||
				reg = <0x53fe4000 0x1000>;
 | 
									reg = <0x53fe4000 0x1000>;
 | 
				
			||||||
				clocks = <&clks 33>;
 | 
									clocks = <&clks 33>, <&clks 33>;
 | 
				
			||||||
				clock-names = "ipg";
 | 
									clock-names = "ipg", "per";
 | 
				
			||||||
				interrupts = <43>;
 | 
									interrupts = <43>;
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -295,8 +295,8 @@
 | 
				
			||||||
			can2: can@53fe8000 {
 | 
								can2: can@53fe8000 {
 | 
				
			||||||
				compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan";
 | 
									compatible = "fsl,imx35-flexcan", "fsl,p1010-flexcan";
 | 
				
			||||||
				reg = <0x53fe8000 0x1000>;
 | 
									reg = <0x53fe8000 0x1000>;
 | 
				
			||||||
				clocks = <&clks 34>;
 | 
									clocks = <&clks 34>, <&clks 34>;
 | 
				
			||||||
				clock-names = "ipg";
 | 
									clock-names = "ipg", "per";
 | 
				
			||||||
				interrupts = <44>;
 | 
									interrupts = <44>;
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio2 29 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,8 +103,8 @@
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio1 1 0>;
 | 
						cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio1 9 0>;
 | 
						wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,8 +124,8 @@
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio1 1 0>;
 | 
						cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio1 9 0>;
 | 
						wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,8 +147,8 @@
 | 
				
			||||||
&esdhc3 {
 | 
					&esdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc3>;
 | 
						pinctrl-0 = <&pinctrl_esdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio3 11 0>;
 | 
						cd-gpios = <&gpio3 11 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio3 12 0>;
 | 
						wp-gpios = <&gpio3 12 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,8 +41,8 @@
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio3 13 0>;
 | 
						cd-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio4 11 0>;
 | 
						wp-gpios = <&gpio4 11 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,8 +41,8 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc2>,
 | 
						pinctrl-0 = <&pinctrl_esdhc2>,
 | 
				
			||||||
		    <&pinctrl_esdhc2_cdwp>;
 | 
							    <&pinctrl_esdhc2_cdwp>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	wp-gpios = <&gpio1 2 0>;
 | 
						wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	cd-gpios = <&gpio1 4 0>;
 | 
						cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "disabled";
 | 
						status = "disabled";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,7 @@
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&esdhc1 {
 | 
					&esdhc1 {
 | 
				
			||||||
	cd-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	fsl,wp-controller;
 | 
						fsl,wp-controller;
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc1>;
 | 
						pinctrl-0 = <&pinctrl_esdhc1>;
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,7 @@
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&esdhc2 {
 | 
					&esdhc2 {
 | 
				
			||||||
	cd-gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	fsl,wp-controller;
 | 
						fsl,wp-controller;
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc2>;
 | 
						pinctrl-0 = <&pinctrl_esdhc2>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,8 +119,8 @@
 | 
				
			||||||
&esdhc2 {
 | 
					&esdhc2 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_esdhc2>;
 | 
						pinctrl-0 = <&pinctrl_esdhc2>;
 | 
				
			||||||
	cd-gpios = <&gpio3 25 0>;
 | 
						cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 19 0>;
 | 
						wp-gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,8 +305,8 @@
 | 
				
			||||||
&usdhc2 {
 | 
					&usdhc2 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	cd-gpios = <&gpio1 4 0>;
 | 
						cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio1 2 0>;
 | 
						wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -314,8 +314,8 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 0>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio7 1 0>;
 | 
						wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/dts-v1/;
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include "imx6q.dtsi"
 | 
					#include "imx6q.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
| 
						 | 
					@ -196,8 +197,8 @@
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	cd-gpios = <&gpio6 11 0>;
 | 
						cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio6 14 0>;
 | 
						wp-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3
 | 
						pinctrl-0 = <&pinctrl_usdhc3
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/dts-v1/;
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include "imx6q.dtsi"
 | 
					#include "imx6q.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
| 
						 | 
					@ -161,7 +162,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	cd-gpios = <&gpio6 11 0>;
 | 
						cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,7 +251,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -260,7 +260,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 | 
						wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,7 +173,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc1>;
 | 
						pinctrl-0 = <&pinctrl_usdhc1>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,7 +181,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -392,7 +392,7 @@
 | 
				
			||||||
&usdhc1 {
 | 
					&usdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc1>;
 | 
						pinctrl-0 = <&pinctrl_usdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	no-1-8-v;
 | 
						no-1-8-v;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -400,7 +400,7 @@
 | 
				
			||||||
&usdhc2 {
 | 
					&usdhc2 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						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>;
 | 
						wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	no-1-8-v;
 | 
						no-1-8-v;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -258,6 +258,6 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	cd-gpios = <&gpio1 4 0>;
 | 
						cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,5 @@
 | 
				
			||||||
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	regulators {
 | 
						regulators {
 | 
				
			||||||
		compatible = "simple-bus";
 | 
							compatible = "simple-bus";
 | 
				
			||||||
| 
						 | 
					@ -181,7 +183,7 @@
 | 
				
			||||||
&usdhc2 { /* module slot */
 | 
					&usdhc2 { /* module slot */
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	cd-gpios = <&gpio2 2 0>;
 | 
						cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -318,7 +318,7 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,7 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -417,7 +417,7 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -299,6 +299,6 @@
 | 
				
			||||||
		&pinctrl_hummingboard_usdhc2
 | 
							&pinctrl_hummingboard_usdhc2
 | 
				
			||||||
	>;
 | 
						>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	cd-gpios = <&gpio1 4 0>;
 | 
						cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -453,7 +453,7 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 0>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -461,7 +461,7 @@
 | 
				
			||||||
&usdhc4 {
 | 
					&usdhc4 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc4>;
 | 
						pinctrl-0 = <&pinctrl_usdhc4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 6 0>;
 | 
						cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -409,8 +409,8 @@
 | 
				
			||||||
&usdhc2 {
 | 
					&usdhc2 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	cd-gpios = <&gpio1 4 0>;
 | 
						cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio1 2 0>;
 | 
						wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "disabled";
 | 
						status = "disabled";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -418,7 +418,7 @@
 | 
				
			||||||
        pinctrl-names = "default";
 | 
					        pinctrl-names = "default";
 | 
				
			||||||
        pinctrl-0 = <&pinctrl_usdhc3
 | 
					        pinctrl-0 = <&pinctrl_usdhc3
 | 
				
			||||||
		     &pinctrl_usdhc3_cdwp>;
 | 
							     &pinctrl_usdhc3_cdwp>;
 | 
				
			||||||
        cd-gpios = <&gpio1 27 0>;
 | 
						cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
        wp-gpios = <&gpio1 29 0>;
 | 
						wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
        status = "disabled";
 | 
					        status = "disabled";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -342,7 +342,7 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
 | 
						cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
 | 
						wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -351,6 +351,6 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
 | 
						cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
 | 
						wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -467,8 +467,8 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
				
			||||||
	cd-gpios = <&gpio6 15 0>;
 | 
						cd-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio1 13 0>;
 | 
						wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -448,8 +448,8 @@
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio7 0 0>;
 | 
						cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio7 1 0>;
 | 
						wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -457,7 +457,7 @@
 | 
				
			||||||
&usdhc4 {
 | 
					&usdhc4 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc4>;
 | 
						pinctrl-0 = <&pinctrl_usdhc4>;
 | 
				
			||||||
	cd-gpios = <&gpio2 6 0>;
 | 
						cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	vmmc-supply = <®_3p3v>;
 | 
						vmmc-supply = <®_3p3v>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -562,8 +562,8 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio2 2 0>;
 | 
						cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 3 0>;
 | 
						wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -571,8 +571,8 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio2 0 0>;
 | 
						cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 1 0>;
 | 
						wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -680,7 +680,7 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc1>;
 | 
						pinctrl-0 = <&pinctrl_usdhc1>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	no-1-8-v;
 | 
						no-1-8-v;
 | 
				
			||||||
	cd-gpios = <&gpio7 2 0>;
 | 
						cd-gpios = <&gpio7 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	fsl,wp-controller;
 | 
						fsl,wp-controller;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -690,7 +690,7 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
	no-1-8-v;
 | 
						no-1-8-v;
 | 
				
			||||||
	cd-gpios = <&gpio7 3 0>;
 | 
						cd-gpios = <&gpio7 3 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	fsl,wp-controller;
 | 
						fsl,wp-controller;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,8 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	regulators {
 | 
						regulators {
 | 
				
			||||||
		compatible = "simple-bus";
 | 
							compatible = "simple-bus";
 | 
				
			||||||
| 
						 | 
					@ -250,13 +252,13 @@
 | 
				
			||||||
&usdhc1 {
 | 
					&usdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc1>;
 | 
						pinctrl-0 = <&pinctrl_usdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio1 2 0>;
 | 
						cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&usdhc3 {
 | 
					&usdhc3 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	cd-gpios = <&gpio3 9 0>;
 | 
						cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,10 +181,10 @@
 | 
				
			||||||
			interrupt-names = "msi";
 | 
								interrupt-names = "msi";
 | 
				
			||||||
			#interrupt-cells = <1>;
 | 
								#interrupt-cells = <1>;
 | 
				
			||||||
			interrupt-map-mask = <0 0 0 0x7>;
 | 
								interrupt-map-mask = <0 0 0 0x7>;
 | 
				
			||||||
			interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
 | 
								interrupt-map = <0 0 0 1 &gpc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
 | 
				
			||||||
			                <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
 | 
								                <0 0 0 2 &gpc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
 | 
				
			||||||
			                <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
 | 
								                <0 0 0 3 &gpc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
 | 
				
			||||||
			                <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
 | 
								                <0 0 0 4 &gpc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
 | 
				
			||||||
			clocks = <&clks IMX6QDL_CLK_PCIE_AXI>,
 | 
								clocks = <&clks IMX6QDL_CLK_PCIE_AXI>,
 | 
				
			||||||
				 <&clks IMX6QDL_CLK_LVDS1_GATE>,
 | 
									 <&clks IMX6QDL_CLK_LVDS1_GATE>,
 | 
				
			||||||
				 <&clks IMX6QDL_CLK_PCIE_REF_125M>;
 | 
									 <&clks IMX6QDL_CLK_PCIE_REF_125M>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -617,8 +617,8 @@
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio4 7 0>;
 | 
						cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio4 6 0>;
 | 
						wp-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -627,8 +627,8 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc2>;
 | 
						pinctrl-0 = <&pinctrl_usdhc2>;
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
 | 
				
			||||||
	cd-gpios = <&gpio5 0 0>;
 | 
						cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio4 29 0>;
 | 
						wp-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -637,6 +637,6 @@
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc3>;
 | 
						pinctrl-0 = <&pinctrl_usdhc3>;
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
				
			||||||
	cd-gpios = <&gpio3 22 0>;
 | 
						cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
 | 
						wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	keep-power-in-suspend;
 | 
						keep-power-in-suspend;
 | 
				
			||||||
	enable-sdio-wakeup;
 | 
						enable-sdio-wakeup;
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc4>;
 | 
						pinctrl-0 = <&pinctrl_usdhc4>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	no-1-8-v;
 | 
						no-1-8-v;
 | 
				
			||||||
	keep-power-in-suspend;
 | 
						keep-power-in-suspend;
 | 
				
			||||||
	enable-sdio-wakup;
 | 
						enable-sdio-wakup;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -293,7 +293,7 @@
 | 
				
			||||||
	pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
						pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
 | 
				
			||||||
	pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
						pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
 | 
				
			||||||
	bus-width = <8>;
 | 
						bus-width = <8>;
 | 
				
			||||||
	cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
 | 
						cd-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
 | 
						wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	keep-power-in-suspend;
 | 
						keep-power-in-suspend;
 | 
				
			||||||
	enable-sdio-wakeup;
 | 
						enable-sdio-wakeup;
 | 
				
			||||||
| 
						 | 
					@ -304,7 +304,7 @@
 | 
				
			||||||
&usdhc4 {
 | 
					&usdhc4 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc4>;
 | 
						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>;
 | 
						wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -234,8 +234,8 @@
 | 
				
			||||||
&usdhc1 {
 | 
					&usdhc1 {
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&pinctrl_usdhc1>;
 | 
						pinctrl-0 = <&pinctrl_usdhc1>;
 | 
				
			||||||
	cd-gpios = <&gpio5 0 0>;
 | 
						cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
	wp-gpios = <&gpio5 1 0>;
 | 
						wp-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
	enable-sdio-wakeup;
 | 
						enable-sdio-wakeup;
 | 
				
			||||||
	keep-power-in-suspend;
 | 
						keep-power-in-suspend;
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,9 +13,8 @@ clocks {
 | 
				
			||||||
		#clock-cells = <0>;
 | 
							#clock-cells = <0>;
 | 
				
			||||||
		compatible = "ti,keystone,main-pll-clock";
 | 
							compatible = "ti,keystone,main-pll-clock";
 | 
				
			||||||
		clocks = <&refclksys>;
 | 
							clocks = <&refclksys>;
 | 
				
			||||||
		reg = <0x02620350 4>, <0x02310110 4>;
 | 
							reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>;
 | 
				
			||||||
		reg-names = "control", "multiplier";
 | 
							reg-names = "control", "multiplier", "post-divider";
 | 
				
			||||||
		fixed-postdiv = <2>;
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	papllclk: papllclk@2620358 {
 | 
						papllclk: papllclk@2620358 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,10 +131,17 @@
 | 
				
			||||||
					<GIC_SPI 376 IRQ_TYPE_EDGE_RISING>;
 | 
										<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"
 | 
							/include/ "k2e-netcp.dtsi"
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					 | 
				
			||||||
&mdio {
 | 
					 | 
				
			||||||
	reg = <0x24200f00 0x100>;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,9 +22,8 @@ clocks {
 | 
				
			||||||
		#clock-cells = <0>;
 | 
							#clock-cells = <0>;
 | 
				
			||||||
		compatible = "ti,keystone,main-pll-clock";
 | 
							compatible = "ti,keystone,main-pll-clock";
 | 
				
			||||||
		clocks = <&refclksys>;
 | 
							clocks = <&refclksys>;
 | 
				
			||||||
		reg = <0x02620350 4>, <0x02310110 4>;
 | 
							reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>;
 | 
				
			||||||
		reg-names = "control", "multiplier";
 | 
							reg-names = "control", "multiplier", "post-divider";
 | 
				
			||||||
		fixed-postdiv = <2>;
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	papllclk: papllclk@2620358 {
 | 
						papllclk: papllclk@2620358 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,6 +98,17 @@
 | 
				
			||||||
			#gpio-cells = <2>;
 | 
								#gpio-cells = <2>;
 | 
				
			||||||
			gpio,syscon-dev = <&devctrl 0x25c>;
 | 
								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"
 | 
							/include/ "k2hk-netcp.dtsi"
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,9 +22,8 @@ clocks {
 | 
				
			||||||
		#clock-cells = <0>;
 | 
							#clock-cells = <0>;
 | 
				
			||||||
		compatible = "ti,keystone,main-pll-clock";
 | 
							compatible = "ti,keystone,main-pll-clock";
 | 
				
			||||||
		clocks = <&refclksys>;
 | 
							clocks = <&refclksys>;
 | 
				
			||||||
		reg = <0x02620350 4>, <0x02310110 4>;
 | 
							reg = <0x02620350 4>, <0x02310110 4>, <0x02310108 4>;
 | 
				
			||||||
		reg-names = "control", "multiplier";
 | 
							reg-names = "control", "multiplier", "post-divider";
 | 
				
			||||||
		fixed-postdiv = <2>;
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	papllclk: papllclk@2620358 {
 | 
						papllclk: papllclk@2620358 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,6 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	soc {
 | 
						soc {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		/include/ "k2l-clocks.dtsi"
 | 
							/include/ "k2l-clocks.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uart2: serial@02348400 {
 | 
							uart2: serial@02348400 {
 | 
				
			||||||
| 
						 | 
					@ -79,6 +78,17 @@
 | 
				
			||||||
			#gpio-cells = <2>;
 | 
								#gpio-cells = <2>;
 | 
				
			||||||
			gpio,syscon-dev = <&devctrl 0x24c>;
 | 
								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"
 | 
							/include/ "k2l-netcp.dtsi"
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -96,7 +106,3 @@
 | 
				
			||||||
       /* Pin muxed. Enabled and configured by Bootloader */
 | 
					       /* Pin muxed. Enabled and configured by Bootloader */
 | 
				
			||||||
       status = "disabled";
 | 
					       status = "disabled";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					 | 
				
			||||||
&mdio {
 | 
					 | 
				
			||||||
	reg = <0x26200f00 0x100>;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,17 +267,6 @@
 | 
				
			||||||
				  1 0 0x21000A00 0x00000100>;
 | 
									  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 {
 | 
							kirq0: keystone_irq@26202a0 {
 | 
				
			||||||
			compatible = "ti,keystone-irq";
 | 
								compatible = "ti,keystone-irq";
 | 
				
			||||||
			interrupts = <GIC_SPI 4 IRQ_TYPE_EDGE_RISING>;
 | 
								interrupts = <GIC_SPI 4 IRQ_TYPE_EDGE_RISING>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,8 @@
 | 
				
			||||||
				};
 | 
									};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				scm_conf: scm_conf@270 {
 | 
									scm_conf: scm_conf@270 {
 | 
				
			||||||
					compatible = "syscon";
 | 
										compatible = "syscon",
 | 
				
			||||||
 | 
											     "simple-bus";
 | 
				
			||||||
					reg = <0x270 0x240>;
 | 
										reg = <0x270 0x240>;
 | 
				
			||||||
					#address-cells = <1>;
 | 
										#address-cells = <1>;
 | 
				
			||||||
					#size-cells = <1>;
 | 
										#size-cells = <1>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,8 @@
 | 
				
			||||||
				};
 | 
									};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				omap4_padconf_global: omap4_padconf_global@5a0 {
 | 
									omap4_padconf_global: omap4_padconf_global@5a0 {
 | 
				
			||||||
					compatible = "syscon";
 | 
										compatible = "syscon",
 | 
				
			||||||
 | 
											     "simple-bus";
 | 
				
			||||||
					reg = <0x5a0 0x170>;
 | 
										reg = <0x5a0 0x170>;
 | 
				
			||||||
					#address-cells = <1>;
 | 
										#address-cells = <1>;
 | 
				
			||||||
					#size-cells = <1>;
 | 
										#size-cells = <1>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -180,7 +180,8 @@
 | 
				
			||||||
				};
 | 
									};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				omap5_padconf_global: omap5_padconf_global@5a0 {
 | 
									omap5_padconf_global: omap5_padconf_global@5a0 {
 | 
				
			||||||
					compatible = "syscon";
 | 
										compatible = "syscon",
 | 
				
			||||||
 | 
											     "simple-bus";
 | 
				
			||||||
					reg = <0x5a0 0xec>;
 | 
										reg = <0x5a0 0xec>;
 | 
				
			||||||
					#address-cells = <1>;
 | 
										#address-cells = <1>;
 | 
				
			||||||
					#size-cells = <1>;
 | 
										#size-cells = <1>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,16 +15,10 @@
 | 
				
			||||||
#include "skeleton.dtsi"
 | 
					#include "skeleton.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	soc {
 | 
					 | 
				
			||||||
		#address-cells = <1>;
 | 
					 | 
				
			||||||
		#size-cells = <1>;
 | 
					 | 
				
			||||||
		compatible = "stericsson,db8500";
 | 
					 | 
				
			||||||
		interrupt-parent = <&intc>;
 | 
					 | 
				
			||||||
		ranges;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cpus {
 | 
						cpus {
 | 
				
			||||||
		#address-cells = <1>;
 | 
							#address-cells = <1>;
 | 
				
			||||||
		#size-cells = <0>;
 | 
							#size-cells = <0>;
 | 
				
			||||||
 | 
							enable-method = "ste,dbx500-smp";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cpu-map {
 | 
							cpu-map {
 | 
				
			||||||
			cluster0 {
 | 
								cluster0 {
 | 
				
			||||||
| 
						 | 
					@ -36,18 +30,25 @@
 | 
				
			||||||
				};
 | 
									};
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
			CPU0: cpu@0 {
 | 
							CPU0: cpu@300 {
 | 
				
			||||||
			device_type = "cpu";
 | 
								device_type = "cpu";
 | 
				
			||||||
			compatible = "arm,cortex-a9";
 | 
								compatible = "arm,cortex-a9";
 | 
				
			||||||
				reg = <0>;
 | 
								reg = <0x300>;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
			CPU1: cpu@1 {
 | 
							CPU1: cpu@301 {
 | 
				
			||||||
			device_type = "cpu";
 | 
								device_type = "cpu";
 | 
				
			||||||
			compatible = "arm,cortex-a9";
 | 
								compatible = "arm,cortex-a9";
 | 
				
			||||||
				reg = <1>;
 | 
								reg = <0x301>;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						soc {
 | 
				
			||||||
 | 
							#address-cells = <1>;
 | 
				
			||||||
 | 
							#size-cells = <1>;
 | 
				
			||||||
 | 
							compatible = "stericsson,db8500";
 | 
				
			||||||
 | 
							interrupt-parent = <&intc>;
 | 
				
			||||||
 | 
							ranges;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ptm@801ae000 {
 | 
							ptm@801ae000 {
 | 
				
			||||||
			compatible = "arm,coresight-etm3x", "arm,primecell";
 | 
								compatible = "arm,coresight-etm3x", "arm,primecell";
 | 
				
			||||||
			reg = <0x801ae000 0x1000>;
 | 
								reg = <0x801ae000 0x1000>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	aliases {
 | 
						aliases {
 | 
				
			||||||
 | 
							serial1 = &uart1;
 | 
				
			||||||
		stmpe-i2c0 = &stmpe0;
 | 
							stmpe-i2c0 = &stmpe0;
 | 
				
			||||||
		stmpe-i2c1 = &stmpe1;
 | 
							stmpe-i2c1 = &stmpe1;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,10 @@
 | 
				
			||||||
		bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
 | 
							bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						aliases {
 | 
				
			||||||
 | 
							serial1 = &uart1;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	src@101e0000 {
 | 
						src@101e0000 {
 | 
				
			||||||
		/* These chrystal drivers are not used on this board */
 | 
							/* These chrystal drivers are not used on this board */
 | 
				
			||||||
		disable-sxtalo;
 | 
							disable-sxtalo;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -757,6 +757,7 @@
 | 
				
			||||||
			clock-names = "uartclk", "apb_pclk";
 | 
								clock-names = "uartclk", "apb_pclk";
 | 
				
			||||||
			pinctrl-names = "default";
 | 
								pinctrl-names = "default";
 | 
				
			||||||
			pinctrl-0 = <&uart0_default_mux>;
 | 
								pinctrl-0 = <&uart0_default_mux>;
 | 
				
			||||||
 | 
								status = "disabled";
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uart1: uart@101fb000 {
 | 
							uart1: uart@101fb000 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,7 @@ work_pending:
 | 
				
			||||||
	movlt	scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE)
 | 
						movlt	scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE)
 | 
				
			||||||
	ldmia	sp, {r0 - r6}			@ have to reload r0 - r6
 | 
						ldmia	sp, {r0 - r6}			@ have to reload r0 - r6
 | 
				
			||||||
	b	local_restart			@ ... and off we go
 | 
						b	local_restart			@ ... and off we go
 | 
				
			||||||
 | 
					ENDPROC(ret_fast_syscall)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * "slow" syscall return path.  "why" tells us if this was a real 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
 | 
						sub	lr, r4, r5			@ mmu has been enabled
 | 
				
			||||||
	add	r3, r7, lr
 | 
						add	r3, r7, lr
 | 
				
			||||||
	ldrd	r4, [r3, #0]			@ get secondary_data.pgdir
 | 
						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
 | 
						ldr	r8, [r3, #8]			@ get secondary_data.swapper_pg_dir
 | 
				
			||||||
	badr	lr, __enable_mmu		@ return address
 | 
						badr	lr, __enable_mmu		@ return address
 | 
				
			||||||
	mov	r13, r12			@ __secondary_switched 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)
 | 
					void update_vsyscall(struct timekeeper *tk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct timespec xtime_coarse;
 | 
					 | 
				
			||||||
	struct timespec64 *wtm = &tk->wall_to_monotonic;
 | 
						struct timespec64 *wtm = &tk->wall_to_monotonic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!cntvct_ok) {
 | 
						if (!cntvct_ok) {
 | 
				
			||||||
| 
						 | 
					@ -308,10 +307,10 @@ void update_vsyscall(struct timekeeper *tk)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vdso_write_begin(vdso_data);
 | 
						vdso_write_begin(vdso_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xtime_coarse = __current_kernel_time();
 | 
					 | 
				
			||||||
	vdso_data->tk_is_cntvct			= tk_is_cntvct(tk);
 | 
						vdso_data->tk_is_cntvct			= tk_is_cntvct(tk);
 | 
				
			||||||
	vdso_data->xtime_coarse_sec		= xtime_coarse.tv_sec;
 | 
						vdso_data->xtime_coarse_sec		= tk->xtime_sec;
 | 
				
			||||||
	vdso_data->xtime_coarse_nsec		= xtime_coarse.tv_nsec;
 | 
						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_sec		= wtm->tv_sec;
 | 
				
			||||||
	vdso_data->wtm_clock_nsec		= wtm->tv_nsec;
 | 
						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);
 | 
							pd->base = of_iomap(np, 0);
 | 
				
			||||||
		if (!pd->base) {
 | 
							if (!pd->base) {
 | 
				
			||||||
			pr_warn("%s: failed to map memory\n", __func__);
 | 
								pr_warn("%s: failed to map memory\n", __func__);
 | 
				
			||||||
			kfree(pd->pd.name);
 | 
								kfree_const(pd->pd.name);
 | 
				
			||||||
			kfree(pd);
 | 
								kfree(pd);
 | 
				
			||||||
			of_node_put(np);
 | 
					 | 
				
			||||||
			continue;
 | 
								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
 | 
					 * registers.  This address is needed early so the OCP registers that
 | 
				
			||||||
 * are part of the device's address space can be ioremapped properly.
 | 
					 * 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
 | 
					 * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
 | 
				
			||||||
 * -ENXIO on absent or invalid register target address space.
 | 
					 * -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);
 | 
						_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)
 | 
						if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
 | 
				
			||||||
		return -ENXIO;
 | 
							return -ENXIO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2396,8 +2404,10 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
 | 
				
			||||||
			 oh->name);
 | 
								 oh->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Extract the IO space from device tree blob */
 | 
							/* 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;
 | 
								return -ENXIO;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		va_start = of_iomap(np, index + oh->mpu_rt_idx);
 | 
							va_start = of_iomap(np, index + oh->mpu_rt_idx);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -2456,14 +2466,12 @@ static int __init _init(struct omap_hwmod *oh, void *data)
 | 
				
			||||||
				oh->name, np->name);
 | 
									oh->name, np->name);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (oh->class->sysc) {
 | 
					 | 
				
			||||||
	r = _init_mpu_rt_base(oh, NULL, index, np);
 | 
						r = _init_mpu_rt_base(oh, NULL, index, np);
 | 
				
			||||||
	if (r < 0) {
 | 
						if (r < 0) {
 | 
				
			||||||
		WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
 | 
							WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
 | 
				
			||||||
		     oh->name);
 | 
							     oh->name);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = _init_clocks(oh, NULL);
 | 
						r = _init_clocks(oh, NULL);
 | 
				
			||||||
	if (r < 0) {
 | 
						if (r < 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -827,8 +827,7 @@ static struct omap_hwmod_class_sysconfig dra7xx_gpmc_sysc = {
 | 
				
			||||||
	.syss_offs	= 0x0014,
 | 
						.syss_offs	= 0x0014,
 | 
				
			||||||
	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
 | 
						.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
 | 
				
			||||||
			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
 | 
								   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
 | 
				
			||||||
	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
 | 
						.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 | 
				
			||||||
			   SIDLE_SMART_WKUP),
 | 
					 | 
				
			||||||
	.sysc_fields	= &omap_hwmod_sysc_type1,
 | 
						.sysc_fields	= &omap_hwmod_sysc_type1,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -844,7 +843,7 @@ static struct omap_hwmod dra7xx_gpmc_hwmod = {
 | 
				
			||||||
	.class		= &dra7xx_gpmc_hwmod_class,
 | 
						.class		= &dra7xx_gpmc_hwmod_class,
 | 
				
			||||||
	.clkdm_name	= "l3main1_clkdm",
 | 
						.clkdm_name	= "l3main1_clkdm",
 | 
				
			||||||
	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
 | 
						/* 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",
 | 
						.main_clk	= "l3_iclk_div",
 | 
				
			||||||
	.prcm = {
 | 
						.prcm = {
 | 
				
			||||||
		.omap4 = {
 | 
							.omap4 = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,31 +74,51 @@ struct jit_ctx {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int bpf_jit_enable __read_mostly;
 | 
					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;
 | 
						u8 ret;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (offset < 0)
 | 
				
			||||||
 | 
							err = call_neg_helper(skb, offset, &ret, 1);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
		err = skb_copy_bits(skb, offset, &ret, 1);
 | 
							err = skb_copy_bits(skb, offset, &ret, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (u64)err << 32 | ret;
 | 
						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;
 | 
						u16 ret;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (offset < 0)
 | 
				
			||||||
 | 
							err = call_neg_helper(skb, offset, &ret, 2);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
		err = skb_copy_bits(skb, offset, &ret, 2);
 | 
							err = skb_copy_bits(skb, offset, &ret, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (u64)err << 32 | ntohs(ret);
 | 
						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;
 | 
						u32 ret;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (offset < 0)
 | 
				
			||||||
 | 
							err = call_neg_helper(skb, offset, &ret, 4);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
		err = skb_copy_bits(skb, offset, &ret, 4);
 | 
							err = skb_copy_bits(skb, offset, &ret, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (u64)err << 32 | ntohl(ret);
 | 
						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:
 | 
							case BPF_LD | BPF_B | BPF_ABS:
 | 
				
			||||||
			load_order = 0;
 | 
								load_order = 0;
 | 
				
			||||||
load:
 | 
					load:
 | 
				
			||||||
			/* the interpreter will deal with the negative K */
 | 
					 | 
				
			||||||
			if ((int)k < 0)
 | 
					 | 
				
			||||||
				return -ENOTSUPP;
 | 
					 | 
				
			||||||
			emit_mov_i(r_off, k, ctx);
 | 
								emit_mov_i(r_off, k, ctx);
 | 
				
			||||||
load_common:
 | 
					load_common:
 | 
				
			||||||
			ctx->seen |= SEEN_DATA | SEEN_CALL;
 | 
								ctx->seen |= SEEN_DATA | SEEN_CALL;
 | 
				
			||||||
| 
						 | 
					@ -547,12 +564,24 @@ load_common:
 | 
				
			||||||
				emit(ARM_SUB_I(r_scratch, r_skb_hl,
 | 
									emit(ARM_SUB_I(r_scratch, r_skb_hl,
 | 
				
			||||||
					       1 << load_order), ctx);
 | 
										       1 << load_order), ctx);
 | 
				
			||||||
				emit(ARM_CMP_R(r_scratch, r_off), ctx);
 | 
									emit(ARM_CMP_R(r_scratch, r_off), ctx);
 | 
				
			||||||
				condt = ARM_COND_HS;
 | 
									condt = ARM_COND_GE;
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
 | 
									emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
 | 
				
			||||||
				condt = ARM_COND_HI;
 | 
									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),
 | 
								_emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data),
 | 
				
			||||||
			      ctx);
 | 
								      ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -860,9 +889,11 @@ b_epilogue:
 | 
				
			||||||
			off = offsetof(struct sk_buff, vlan_tci);
 | 
								off = offsetof(struct sk_buff, vlan_tci);
 | 
				
			||||||
			emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
 | 
								emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
 | 
				
			||||||
			if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
 | 
								if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
 | 
				
			||||||
				OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx);
 | 
									OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx);
 | 
				
			||||||
			else
 | 
								else {
 | 
				
			||||||
				OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx);
 | 
									OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx);
 | 
				
			||||||
 | 
									OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case BPF_ANC | SKF_AD_QUEUE:
 | 
							case BPF_ANC | SKF_AD_QUEUE:
 | 
				
			||||||
			ctx->seen |= SEEN_SKB;
 | 
								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 += -nostdlib -shared
 | 
				
			||||||
VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
 | 
					VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
 | 
				
			||||||
VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--build-id)
 | 
					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
 | 
					obj-$(CONFIG_VDSO) += vdso.o
 | 
				
			||||||
extra-$(CONFIG_VDSO) += vdso.lds
 | 
					extra-$(CONFIG_VDSO) += vdso.lds
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -823,7 +823,7 @@
 | 
				
			||||||
			device_type = "dma";
 | 
								device_type = "dma";
 | 
				
			||||||
			reg = <0x0 0x1f270000 0x0 0x10000>,
 | 
								reg = <0x0 0x1f270000 0x0 0x10000>,
 | 
				
			||||||
			      <0x0 0x1f200000 0x0 0x10000>,
 | 
								      <0x0 0x1f200000 0x0 0x10000>,
 | 
				
			||||||
			      <0x0 0x1b008000 0x0 0x2000>,
 | 
								      <0x0 0x1b000000 0x0 0x400000>,
 | 
				
			||||||
			      <0x0 0x1054a000 0x0 0x100>;
 | 
								      <0x0 0x1054a000 0x0 0x100>;
 | 
				
			||||||
			interrupts = <0x0 0x82 0x4>,
 | 
								interrupts = <0x0 0x82 0x4>,
 | 
				
			||||||
				     <0x0 0xb8 0x4>,
 | 
									     <0x0 0xb8 0x4>,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,12 +122,12 @@ static int __init uefi_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Show what we know for posterity */
 | 
						/* Show what we know for posterity */
 | 
				
			||||||
	c16 = early_memremap(efi_to_phys(efi.systab->fw_vendor),
 | 
						c16 = early_memremap(efi_to_phys(efi.systab->fw_vendor),
 | 
				
			||||||
			     sizeof(vendor));
 | 
								     sizeof(vendor) * sizeof(efi_char16_t));
 | 
				
			||||||
	if (c16) {
 | 
						if (c16) {
 | 
				
			||||||
		for (i = 0; i < (int) sizeof(vendor) - 1 && *c16; ++i)
 | 
							for (i = 0; i < (int) sizeof(vendor) - 1 && *c16; ++i)
 | 
				
			||||||
			vendor[i] = c16[i];
 | 
								vendor[i] = c16[i];
 | 
				
			||||||
		vendor[i] = '\0';
 | 
							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",
 | 
						pr_info("EFI v%u.%.02u by %s\n",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -585,7 +585,8 @@ ENDPROC(el0_irq)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
ENTRY(cpu_switch_to)
 | 
					ENTRY(cpu_switch_to)
 | 
				
			||||||
	add	x8, x0, #THREAD_CPU_CONTEXT
 | 
						mov	x10, #THREAD_CPU_CONTEXT
 | 
				
			||||||
 | 
						add	x8, x0, x10
 | 
				
			||||||
	mov	x9, sp
 | 
						mov	x9, sp
 | 
				
			||||||
	stp	x19, x20, [x8], #16		// store callee-saved registers
 | 
						stp	x19, x20, [x8], #16		// store callee-saved registers
 | 
				
			||||||
	stp	x21, x22, [x8], #16
 | 
						stp	x21, x22, [x8], #16
 | 
				
			||||||
| 
						 | 
					@ -594,7 +595,7 @@ ENTRY(cpu_switch_to)
 | 
				
			||||||
	stp	x27, x28, [x8], #16
 | 
						stp	x27, x28, [x8], #16
 | 
				
			||||||
	stp	x29, x9, [x8], #16
 | 
						stp	x29, x9, [x8], #16
 | 
				
			||||||
	str	lr, [x8]
 | 
						str	lr, [x8]
 | 
				
			||||||
	add	x8, x1, #THREAD_CPU_CONTEXT
 | 
						add	x8, x1, x10
 | 
				
			||||||
	ldp	x19, x20, [x8], #16		// restore callee-saved registers
 | 
						ldp	x19, x20, [x8], #16		// restore callee-saved registers
 | 
				
			||||||
	ldp	x21, x22, [x8], #16
 | 
						ldp	x21, x22, [x8], #16
 | 
				
			||||||
	ldp	x23, x24, [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)
 | 
					static bool migrate_one_irq(struct irq_desc *desc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct irq_data *d = irq_desc_get_irq_data(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;
 | 
						struct irq_chip *c;
 | 
				
			||||||
	bool ret = false;
 | 
						bool ret = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
 | 
				
			||||||
	if (!c->irq_set_affinity)
 | 
						if (!c->irq_set_affinity)
 | 
				
			||||||
		pr_debug("IRQ%u: unable to set affinity\n", d->irq);
 | 
							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)
 | 
						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;
 | 
						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,
 | 
							 * Other callers might not initialize the si_lsb field,
 | 
				
			||||||
		 * so check explicitely for the right codes here.
 | 
							 * 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);
 | 
								err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		break;
 | 
							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)
 | 
					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) ||
 | 
						if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) ||
 | 
				
			||||||
	    copy_from_user(to->_sifields._pad,
 | 
						    copy_from_user(to->_sifields._pad,
 | 
				
			||||||
			   from->_sifields._pad, SI_PAD_SIZE))
 | 
								   from->_sifields._pad, SI_PAD_SIZE))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,16 +199,15 @@ up_fail:
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void update_vsyscall(struct timekeeper *tk)
 | 
					void update_vsyscall(struct timekeeper *tk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct timespec xtime_coarse;
 | 
					 | 
				
			||||||
	u32 use_syscall = strcmp(tk->tkr_mono.clock->name, "arch_sys_counter");
 | 
						u32 use_syscall = strcmp(tk->tkr_mono.clock->name, "arch_sys_counter");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	++vdso_data->tb_seq_count;
 | 
						++vdso_data->tb_seq_count;
 | 
				
			||||||
	smp_wmb();
 | 
						smp_wmb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xtime_coarse = __current_kernel_time();
 | 
					 | 
				
			||||||
	vdso_data->use_syscall			= use_syscall;
 | 
						vdso_data->use_syscall			= use_syscall;
 | 
				
			||||||
	vdso_data->xtime_coarse_sec		= xtime_coarse.tv_sec;
 | 
						vdso_data->xtime_coarse_sec		= tk->xtime_sec;
 | 
				
			||||||
	vdso_data->xtime_coarse_nsec		= xtime_coarse.tv_nsec;
 | 
						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_sec		= tk->wall_to_monotonic.tv_sec;
 | 
				
			||||||
	vdso_data->wtm_clock_nsec		= tk->wall_to_monotonic.tv_nsec;
 | 
						vdso_data->wtm_clock_nsec		= tk->wall_to_monotonic.tv_nsec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <mach/pm.h>
 | 
					#include <mach/pm.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool disable_cpu_idle_poll;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static cycle_t read_cycle_count(struct clocksource *cs)
 | 
					static cycle_t read_cycle_count(struct clocksource *cs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -80,36 +81,34 @@ static int comparator_next_event(unsigned long delta,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void comparator_mode(enum clock_event_mode mode,
 | 
					static int comparator_shutdown(struct clock_event_device *evdev)
 | 
				
			||||||
		struct clock_event_device *evdev)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (mode) {
 | 
						pr_debug("%s: %s\n", __func__, evdev->name);
 | 
				
			||||||
	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:
 | 
					 | 
				
			||||||
	sysreg_write(COMPARE, 0);
 | 
						sysreg_write(COMPARE, 0);
 | 
				
			||||||
		pr_debug("%s: stop\n", evdev->name);
 | 
					
 | 
				
			||||||
		if (evdev->mode == CLOCK_EVT_MODE_ONESHOT ||
 | 
						if (disable_cpu_idle_poll) {
 | 
				
			||||||
		    evdev->mode == CLOCK_EVT_MODE_RESUME) {
 | 
							disable_cpu_idle_poll = false;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Only disable idle poll if we have forced that
 | 
							 * Only disable idle poll if we have forced that
 | 
				
			||||||
		 * in a previous call.
 | 
							 * in a previous call.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		cpu_idle_poll_ctrl(false);
 | 
							cpu_idle_poll_ctrl(false);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		break;
 | 
						return 0;
 | 
				
			||||||
	default:
 | 
					}
 | 
				
			||||||
		BUG();
 | 
					
 | 
				
			||||||
	}
 | 
					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 = {
 | 
					static struct clock_event_device comparator = {
 | 
				
			||||||
| 
						 | 
					@ -118,7 +117,9 @@ static struct clock_event_device comparator = {
 | 
				
			||||||
	.shift			= 16,
 | 
						.shift			= 16,
 | 
				
			||||||
	.rating			= 50,
 | 
						.rating			= 50,
 | 
				
			||||||
	.set_next_event		= comparator_next_event,
 | 
						.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)
 | 
					void read_persistent_clock(struct timespec *ts)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,6 +80,9 @@ int clk_enable(struct clk *clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!clk)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&clk_lock, flags);
 | 
						spin_lock_irqsave(&clk_lock, flags);
 | 
				
			||||||
	__clk_enable(clk);
 | 
						__clk_enable(clk);
 | 
				
			||||||
	spin_unlock_irqrestore(&clk_lock, flags);
 | 
						spin_unlock_irqrestore(&clk_lock, flags);
 | 
				
			||||||
| 
						 | 
					@ -106,6 +109,9 @@ void clk_disable(struct clk *clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (IS_ERR_OR_NULL(clk))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&clk_lock, flags);
 | 
						spin_lock_irqsave(&clk_lock, flags);
 | 
				
			||||||
	__clk_disable(clk);
 | 
						__clk_disable(clk);
 | 
				
			||||||
	spin_unlock_irqrestore(&clk_lock, flags);
 | 
						spin_unlock_irqrestore(&clk_lock, flags);
 | 
				
			||||||
| 
						 | 
					@ -117,6 +123,9 @@ unsigned long clk_get_rate(struct clk *clk)
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	unsigned long rate;
 | 
						unsigned long rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!clk)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&clk_lock, flags);
 | 
						spin_lock_irqsave(&clk_lock, flags);
 | 
				
			||||||
	rate = clk->get_rate(clk);
 | 
						rate = clk->get_rate(clk);
 | 
				
			||||||
	spin_unlock_irqrestore(&clk_lock, flags);
 | 
						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;
 | 
						unsigned long flags, actual_rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!clk)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!clk->set_rate)
 | 
						if (!clk->set_rate)
 | 
				
			||||||
		return -ENOSYS;
 | 
							return -ENOSYS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,6 +157,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	long ret;
 | 
						long ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!clk)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!clk->set_rate)
 | 
						if (!clk->set_rate)
 | 
				
			||||||
		return -ENOSYS;
 | 
							return -ENOSYS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,6 +176,9 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!clk)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!clk->set_parent)
 | 
						if (!clk->set_parent)
 | 
				
			||||||
		return -ENOSYS;
 | 
							return -ENOSYS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,7 +192,7 @@ EXPORT_SYMBOL(clk_set_parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct clk *clk_get_parent(struct clk *clk)
 | 
					struct clk *clk_get_parent(struct clk *clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return clk->parent;
 | 
						return !clk ? NULL : clk->parent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(clk_get_parent);
 | 
					EXPORT_SYMBOL(clk_get_parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,6 +174,11 @@ static inline void _writel(unsigned long l, unsigned long addr)
 | 
				
			||||||
#define iowrite16 writew
 | 
					#define iowrite16 writew
 | 
				
			||||||
#define iowrite32 writel
 | 
					#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 mmiowb()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define flush_write_buffers() do { } while (0)  /* M32R_FIXME */
 | 
					#define flush_write_buffers() do { } while (0)  /* M32R_FIXME */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,6 @@ config BMIPS_GENERIC
 | 
				
			||||||
	select BCM7120_L2_IRQ
 | 
						select BCM7120_L2_IRQ
 | 
				
			||||||
	select BRCMSTB_L2_IRQ
 | 
						select BRCMSTB_L2_IRQ
 | 
				
			||||||
	select IRQ_MIPS_CPU
 | 
						select IRQ_MIPS_CPU
 | 
				
			||||||
	select RAW_IRQ_ACCESSORS
 | 
					 | 
				
			||||||
	select DMA_NONCOHERENT
 | 
						select DMA_NONCOHERENT
 | 
				
			||||||
	select SYS_SUPPORTS_32BIT_KERNEL
 | 
						select SYS_SUPPORTS_32BIT_KERNEL
 | 
				
			||||||
	select SYS_SUPPORTS_LITTLE_ENDIAN
 | 
						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