Linux 3.13-rc3
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) iQEcBAABAgAGBQJSogqUAAoJEHm+PkMAQRiGM2MIAJrr5KEXEWuuAR4+JkkWBK7A +dVT4n1MM4wP/aCIyriSlq7kgT03Wxk4Q4wKsj2wZvDQkNgEQjrctgIihc75jqi5 126nmT3YXJLwgDpFA3RHZUWve3j3vfUG53rRuk7K9Xx1sGWU3Ls7BuInvQZ//+QS 6UB4UuEAalmose5U8ToXQfMqZhjwreZKeb64TEZwFvu2klv4cnka1L/zHbmQGgRg 2Pfv+aUrjsYE8s9lkEKX8MIQsDn28Q5Lsv7XIEQwo2at4rYbJaxX6usuC1OI0MQ5 BLUn1GgtvOidq6FzSg6kXiA/MJYH3J0S+p4uULWAprxA+KeJRbWNRroM94W1qAk= =1Wcq -----END PGP SIGNATURE----- Merge tag 'v3.13-rc3' into devel Linux 3.13-rc3
This commit is contained in:
		
						commit
						bdc54ef45d
					
				| @ -196,13 +196,6 @@ chmod 0644 /dev/cpu/microcode | ||||
| as root before you can use this.  You'll probably also want to | ||||
| get the user-space microcode_ctl utility to use with this. | ||||
| 
 | ||||
| Powertweak | ||||
| ---------- | ||||
| 
 | ||||
| If you are running v0.1.17 or earlier, you should upgrade to | ||||
| version v0.99.0 or higher. Running old versions may cause problems | ||||
| with programs using shared memory. | ||||
| 
 | ||||
| udev | ||||
| ---- | ||||
| udev is a userspace application for populating /dev dynamically with | ||||
| @ -366,10 +359,6 @@ Intel P6 microcode | ||||
| ------------------ | ||||
| o  <http://www.urbanmyth.org/microcode/> | ||||
| 
 | ||||
| Powertweak | ||||
| ---------- | ||||
| o  <http://powertweak.sourceforge.net/> | ||||
| 
 | ||||
| udev | ||||
| ---- | ||||
| o <http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html> | ||||
|  | ||||
| @ -58,7 +58,7 @@ | ||||
|      </sect1> | ||||
|      <sect1><title>Wait queues and Wake events</title> | ||||
| !Iinclude/linux/wait.h | ||||
| !Ekernel/wait.c | ||||
| !Ekernel/sched/wait.c | ||||
|      </sect1> | ||||
|      <sect1><title>High-resolution timers</title> | ||||
| !Iinclude/linux/ktime.h | ||||
|  | ||||
| @ -7,10 +7,18 @@ The MPU contain CPUs, GIC, L2 cache and a local PRCM. | ||||
| Required properties: | ||||
| - compatible : Should be "ti,omap3-mpu" for OMAP3 | ||||
|                Should be "ti,omap4-mpu" for OMAP4 | ||||
| 	       Should be "ti,omap5-mpu" for OMAP5 | ||||
| - ti,hwmods: "mpu" | ||||
| 
 | ||||
| Examples: | ||||
| 
 | ||||
| - For an OMAP5 SMP system: | ||||
| 
 | ||||
| mpu { | ||||
|     compatible = "ti,omap5-mpu"; | ||||
|     ti,hwmods = "mpu" | ||||
| }; | ||||
| 
 | ||||
| - For an OMAP4 SMP system: | ||||
| 
 | ||||
| mpu { | ||||
|  | ||||
| @ -7,6 +7,7 @@ representation in the device tree should be done as under:- | ||||
| Required properties: | ||||
| 
 | ||||
| - compatible : should be one of | ||||
| 	"arm,armv8-pmuv3" | ||||
| 	"arm,cortex-a15-pmu" | ||||
| 	"arm,cortex-a9-pmu" | ||||
| 	"arm,cortex-a8-pmu" | ||||
|  | ||||
| @ -49,7 +49,7 @@ adc@12D10000 { | ||||
| 	/* NTC thermistor is a hwmon device */ | ||||
| 	ncp15wb473@0 { | ||||
| 		compatible = "ntc,ncp15wb473"; | ||||
| 		pullup-uV = <1800000>; | ||||
| 		pullup-uv = <1800000>; | ||||
| 		pullup-ohm = <47000>; | ||||
| 		pulldown-ohm = <0>; | ||||
| 		io-channels = <&adc 4>; | ||||
|  | ||||
| @ -6,7 +6,7 @@ SoC's in the Exynos4 family. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
| - comptible: should be one of the following. | ||||
| - compatible: should be one of the following. | ||||
|   - "samsung,exynos4210-clock" - controller compatible with Exynos4210 SoC. | ||||
|   - "samsung,exynos4412-clock" - controller compatible with Exynos4412 SoC. | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ controllers within the Exynos5250 SoC. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
| - comptible: should be one of the following. | ||||
| - compatible: should be one of the following. | ||||
|   - "samsung,exynos5250-clock" - controller compatible with Exynos5250 SoC. | ||||
| 
 | ||||
| - reg: physical base address of the controller and length of memory mapped | ||||
|  | ||||
| @ -5,7 +5,7 @@ controllers within the Exynos5420 SoC. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
| - comptible: should be one of the following. | ||||
| - compatible: should be one of the following. | ||||
|   - "samsung,exynos5420-clock" - controller compatible with Exynos5420 SoC. | ||||
| 
 | ||||
| - reg: physical base address of the controller and length of memory mapped | ||||
|  | ||||
| @ -5,7 +5,7 @@ controllers within the Exynos5440 SoC. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
| - comptible: should be "samsung,exynos5440-clock". | ||||
| - compatible: should be "samsung,exynos5440-clock". | ||||
| 
 | ||||
| - reg: physical base address of the controller and length of memory mapped | ||||
|   region. | ||||
|  | ||||
| @ -5,16 +5,42 @@ This is for the non-QE/CPM/GUTs GPIO controllers as found on | ||||
| 
 | ||||
| Every GPIO controller node must have #gpio-cells property defined, | ||||
| this information will be used to translate gpio-specifiers. | ||||
| See bindings/gpio/gpio.txt for details of how to specify GPIO | ||||
| information for devices. | ||||
| 
 | ||||
| The GPIO module usually is connected to the SoC's internal interrupt | ||||
| controller, see bindings/interrupt-controller/interrupts.txt (the | ||||
| interrupt client nodes section) for details how to specify this GPIO | ||||
| module's interrupt. | ||||
| 
 | ||||
| The GPIO module may serve as another interrupt controller (cascaded to | ||||
| the SoC's internal interrupt controller).  See the interrupt controller | ||||
| nodes section in bindings/interrupt-controller/interrupts.txt for | ||||
| details. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible : "fsl,<CHIP>-gpio" followed by "fsl,mpc8349-gpio" for | ||||
|   83xx, "fsl,mpc8572-gpio" for 85xx and "fsl,mpc8610-gpio" for 86xx. | ||||
| - #gpio-cells : Should be two. The first cell is the pin number and the | ||||
|   second cell is used to specify optional parameters (currently unused). | ||||
|  - interrupts : Interrupt mapping for GPIO IRQ. | ||||
|  - interrupt-parent : Phandle for the interrupt controller that | ||||
|    services interrupts for this device. | ||||
| - gpio-controller : Marks the port as GPIO controller. | ||||
| - compatible:		"fsl,<chip>-gpio" followed by "fsl,mpc8349-gpio" | ||||
| 			for 83xx, "fsl,mpc8572-gpio" for 85xx, or | ||||
| 			"fsl,mpc8610-gpio" for 86xx. | ||||
| - #gpio-cells:		Should be two. The first cell is the pin number | ||||
| 			and the second cell is used to specify optional | ||||
| 			parameters (currently unused). | ||||
| - interrupt-parent:	Phandle for the interrupt controller that | ||||
| 			services interrupts for this device. | ||||
| - interrupts:		Interrupt mapping for GPIO IRQ. | ||||
| - gpio-controller:	Marks the port as GPIO controller. | ||||
| 
 | ||||
| Optional properties: | ||||
| - interrupt-controller:	Empty boolean property which marks the GPIO | ||||
| 			module as an IRQ controller. | ||||
| - #interrupt-cells:	Should be two.  Defines the number of integer | ||||
| 			cells required to specify an interrupt within | ||||
| 			this interrupt controller.  The first cell | ||||
| 			defines the pin number, the second cell | ||||
| 			defines additional flags (trigger type, | ||||
| 			trigger polarity).  Note that the available | ||||
| 			set of trigger conditions supported by the | ||||
| 			GPIO module depends on the actual SoC. | ||||
| 
 | ||||
| Example of gpio-controller nodes for a MPC8347 SoC: | ||||
| 
 | ||||
| @ -22,39 +48,27 @@ Example of gpio-controller nodes for a MPC8347 SoC: | ||||
| 		#gpio-cells = <2>; | ||||
| 		compatible = "fsl,mpc8347-gpio", "fsl,mpc8349-gpio"; | ||||
| 		reg = <0xc00 0x100>; | ||||
| 		interrupts = <74 0x8>; | ||||
| 		interrupt-parent = <&ipic>; | ||||
| 		interrupts = <74 0x8>; | ||||
| 		gpio-controller; | ||||
| 		interrupt-controller; | ||||
| 		#interrupt-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	gpio2: gpio-controller@d00 { | ||||
| 		#gpio-cells = <2>; | ||||
| 		compatible = "fsl,mpc8347-gpio", "fsl,mpc8349-gpio"; | ||||
| 		reg = <0xd00 0x100>; | ||||
| 		interrupts = <75 0x8>; | ||||
| 		interrupt-parent = <&ipic>; | ||||
| 		interrupts = <75 0x8>; | ||||
| 		gpio-controller; | ||||
| 	}; | ||||
| 
 | ||||
| See booting-without-of.txt for details of how to specify GPIO | ||||
| information for devices. | ||||
| 
 | ||||
| To use GPIO pins as interrupt sources for peripherals, specify the | ||||
| GPIO controller as the interrupt parent and define GPIO number + | ||||
| trigger mode using the interrupts property, which is defined like | ||||
| this: | ||||
| 
 | ||||
| interrupts = <number trigger>, where: | ||||
|  - number: GPIO pin (0..31) | ||||
|  - trigger: trigger mode: | ||||
| 	2 = trigger on falling edge | ||||
| 	3 = trigger on both edges | ||||
| 
 | ||||
| Example of device using this is: | ||||
| Example of a peripheral using the GPIO module as an IRQ controller: | ||||
| 
 | ||||
| 	funkyfpga@0 { | ||||
| 		compatible = "funky-fpga"; | ||||
| 		... | ||||
| 		interrupts = <4 3>; | ||||
| 		interrupt-parent = <&gpio1>; | ||||
| 		interrupts = <4 3>; | ||||
| 	}; | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| I2C for OMAP platforms | ||||
| 
 | ||||
| Required properties : | ||||
| - compatible : Must be "ti,omap3-i2c" or "ti,omap4-i2c" | ||||
| - compatible : Must be "ti,omap2420-i2c", "ti,omap2430-i2c", "ti,omap3-i2c" | ||||
|   or "ti,omap4-i2c" | ||||
| - ti,hwmods : Must be "i2c<n>", n being the instance number (1-based) | ||||
| - #address-cells = <1>; | ||||
| - #size-cells = <0>; | ||||
|  | ||||
							
								
								
									
										54
									
								
								Documentation/devicetree/bindings/mmc/ti-omap.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								Documentation/devicetree/bindings/mmc/ti-omap.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| * TI MMC host controller for OMAP1 and 2420 | ||||
| 
 | ||||
| The MMC Host Controller on TI OMAP1 and 2420 family provides | ||||
| an interface for MMC, SD, and SDIO types of memory cards. | ||||
| 
 | ||||
| This file documents differences between the core properties described | ||||
| by mmc.txt and the properties used by the omap mmc driver. | ||||
| 
 | ||||
| Note that this driver will not work with omap2430 or later omaps, | ||||
| please see the omap hsmmc driver for the current omaps. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: Must be "ti,omap2420-mmc", for OMAP2420 controllers | ||||
| - ti,hwmods: For 2420, must be "msdi<n>", where n is controller | ||||
|   instance starting 1 | ||||
| 
 | ||||
| Examples: | ||||
| 
 | ||||
| 	msdi1: mmc@4809c000 { | ||||
| 		compatible = "ti,omap2420-mmc"; | ||||
| 		ti,hwmods = "msdi1"; | ||||
| 		reg = <0x4809c000 0x80>; | ||||
| 		interrupts = <83>; | ||||
| 		dmas = <&sdma 61 &sdma 62>; | ||||
| 		dma-names = "tx", "rx"; | ||||
| 	}; | ||||
| 
 | ||||
| * TI MMC host controller for OMAP1 and 2420 | ||||
| 
 | ||||
| The MMC Host Controller on TI OMAP1 and 2420 family provides | ||||
| an interface for MMC, SD, and SDIO types of memory cards. | ||||
| 
 | ||||
| This file documents differences between the core properties described | ||||
| by mmc.txt and the properties used by the omap mmc driver. | ||||
| 
 | ||||
| Note that this driver will not work with omap2430 or later omaps, | ||||
| please see the omap hsmmc driver for the current omaps. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: Must be "ti,omap2420-mmc", for OMAP2420 controllers | ||||
| - ti,hwmods: For 2420, must be "msdi<n>", where n is controller | ||||
|   instance starting 1 | ||||
| 
 | ||||
| Examples: | ||||
| 
 | ||||
| 	msdi1: mmc@4809c000 { | ||||
| 		compatible = "ti,omap2420-mmc"; | ||||
| 		ti,hwmods = "msdi1"; | ||||
| 		reg = <0x4809c000 0x80>; | ||||
| 		interrupts = <83>; | ||||
| 		dmas = <&sdma 61 &sdma 62>; | ||||
| 		dma-names = "tx", "rx"; | ||||
| 	}; | ||||
| 
 | ||||
| @ -15,6 +15,7 @@ Optional properties: | ||||
|   only if property "phy-reset-gpios" is available.  Missing the property | ||||
|   will have the duration be 1 millisecond.  Numbers greater than 1000 are | ||||
|   invalid and 1 millisecond will be used instead. | ||||
| - phy-supply: regulator that powers the Ethernet PHY. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| @ -25,4 +26,5 @@ ethernet@83fec000 { | ||||
| 	phy-mode = "mii"; | ||||
| 	phy-reset-gpios = <&gpio2 14 0>; /* GPIO2_14 */ | ||||
| 	local-mac-address = [00 04 9F 01 1B B9]; | ||||
| 	phy-supply = <®_fec_supply>; | ||||
| }; | ||||
|  | ||||
							
								
								
									
										17
									
								
								Documentation/devicetree/bindings/rng/qcom,prng.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Documentation/devicetree/bindings/rng/qcom,prng.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| Qualcomm MSM pseudo random number generator. | ||||
| 
 | ||||
| Required properties: | ||||
| 
 | ||||
| - compatible  : should be "qcom,prng" | ||||
| - reg         : specifies base physical address and size of the registers map | ||||
| - clocks      : phandle to clock-controller plus clock-specifier pair | ||||
| - clock-names : "core" clocks all registers, FIFO and circuits in PRNG IP block | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	rng@f9bff000 { | ||||
| 		compatible = "qcom,prng"; | ||||
| 		reg = <0xf9bff000 0x200>; | ||||
| 		clocks = <&clock GCC_PRNG_AHB_CLK>; | ||||
| 		clock-names = "core"; | ||||
| 	}; | ||||
| @ -1,5 +0,0 @@ | ||||
| NVIDIA Tegra 2 SPI device | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible : should be "nvidia,tegra20-spi". | ||||
| - gpios : should specify GPIOs used for chipselect. | ||||
| @ -32,12 +32,14 @@ est	ESTeem Wireless Modems | ||||
| fsl	Freescale Semiconductor | ||||
| GEFanuc	GE Fanuc Intelligent Platforms Embedded Systems, Inc. | ||||
| gef	GE Fanuc Intelligent Platforms Embedded Systems, Inc. | ||||
| gmt	Global Mixed-mode Technology, Inc. | ||||
| hisilicon	Hisilicon Limited. | ||||
| hp	Hewlett Packard | ||||
| ibm	International Business Machines (IBM) | ||||
| idt	Integrated Device Technologies, Inc. | ||||
| img	Imagination Technologies Ltd. | ||||
| intercontrol	Inter Control Group | ||||
| lg	LG Corporation | ||||
| linux	Linux-specific binding | ||||
| lsi	LSI Corp. (LSI Logic) | ||||
| marvell	Marvell Technology Group Ltd. | ||||
|  | ||||
							
								
								
									
										14
									
								
								Documentation/gpio/00-INDEX
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Documentation/gpio/00-INDEX
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| 00-INDEX | ||||
| 	- This file | ||||
| gpio.txt | ||||
| 	- Introduction to GPIOs and their kernel interfaces | ||||
| consumer.txt | ||||
| 	- How to obtain and use GPIOs in a driver | ||||
| driver.txt | ||||
| 	- How to write a GPIO driver | ||||
| board.txt | ||||
| 	- How to assign GPIOs to a consumer device and a function | ||||
| sysfs.txt | ||||
| 	- Information about the GPIO sysfs interface | ||||
| gpio-legacy.txt | ||||
| 	- Historical documentation of the deprecated GPIO integer interface | ||||
							
								
								
									
										115
									
								
								Documentation/gpio/board.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								Documentation/gpio/board.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | ||||
| GPIO Mappings | ||||
| ============= | ||||
| 
 | ||||
| This document explains how GPIOs can be assigned to given devices and functions. | ||||
| Note that it only applies to the new descriptor-based interface. For a | ||||
| description of the deprecated integer-based GPIO interface please refer to | ||||
| gpio-legacy.txt (actually, there is no real mapping possible with the old | ||||
| interface; you just fetch an integer from somewhere and request the | ||||
| corresponding GPIO. | ||||
| 
 | ||||
| Platforms that make use of GPIOs must select ARCH_REQUIRE_GPIOLIB (if GPIO usage | ||||
| is mandatory) or ARCH_WANT_OPTIONAL_GPIOLIB (if GPIO support can be omitted) in | ||||
| their Kconfig. Then, how GPIOs are mapped depends on what the platform uses to | ||||
| describe its hardware layout. Currently, mappings can be defined through device | ||||
| tree, ACPI, and platform data. | ||||
| 
 | ||||
| Device Tree | ||||
| ----------- | ||||
| GPIOs can easily be mapped to devices and functions in the device tree. The | ||||
| exact way to do it depends on the GPIO controller providing the GPIOs, see the | ||||
| device tree bindings for your controller. | ||||
| 
 | ||||
| GPIOs mappings are defined in the consumer device's node, in a property named | ||||
| <function>-gpios, where <function> is the function the driver will request | ||||
| through gpiod_get(). For example: | ||||
| 
 | ||||
| 	foo_device { | ||||
| 		compatible = "acme,foo"; | ||||
| 		... | ||||
| 		led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>, /* red */ | ||||
| 			    <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */ | ||||
| 			    <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */ | ||||
| 
 | ||||
| 		power-gpio = <&gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 	}; | ||||
| 
 | ||||
| This property will make GPIOs 15, 16 and 17 available to the driver under the | ||||
| "led" function, and GPIO 1 as the "power" GPIO: | ||||
| 
 | ||||
| 	struct gpio_desc *red, *green, *blue, *power; | ||||
| 
 | ||||
| 	red = gpiod_get_index(dev, "led", 0); | ||||
| 	green = gpiod_get_index(dev, "led", 1); | ||||
| 	blue = gpiod_get_index(dev, "led", 2); | ||||
| 
 | ||||
| 	power = gpiod_get(dev, "power"); | ||||
| 
 | ||||
| The led GPIOs will be active-high, while the power GPIO will be active-low (i.e. | ||||
| gpiod_is_active_low(power) will be true). | ||||
| 
 | ||||
| ACPI | ||||
| ---- | ||||
| ACPI does not support function names for GPIOs. Therefore, only the "idx" | ||||
| argument of gpiod_get_index() is useful to discriminate between GPIOs assigned | ||||
| to a device. The "con_id" argument can still be set for debugging purposes (it | ||||
| will appear under error messages as well as debug and sysfs nodes). | ||||
| 
 | ||||
| Platform Data | ||||
| ------------- | ||||
| Finally, GPIOs can be bound to devices and functions using platform data. Board | ||||
| files that desire to do so need to include the following header: | ||||
| 
 | ||||
| 	#include <linux/gpio/driver.h> | ||||
| 
 | ||||
| GPIOs are mapped by the means of tables of lookups, containing instances of the | ||||
| gpiod_lookup structure. Two macros are defined to help declaring such mappings: | ||||
| 
 | ||||
| 	GPIO_LOOKUP(chip_label, chip_hwnum, dev_id, con_id, flags) | ||||
| 	GPIO_LOOKUP_IDX(chip_label, chip_hwnum, dev_id, con_id, idx, flags) | ||||
| 
 | ||||
| where | ||||
| 
 | ||||
|   - chip_label is the label of the gpiod_chip instance providing the GPIO | ||||
|   - chip_hwnum is the hardware number of the GPIO within the chip | ||||
|   - dev_id is the identifier of the device that will make use of this GPIO. If | ||||
| 	NULL, the GPIO will be available to all devices. | ||||
|   - con_id is the name of the GPIO function from the device point of view. It | ||||
| 	can be NULL. | ||||
|   - idx is the index of the GPIO within the function. | ||||
|   - flags is defined to specify the following properties: | ||||
| 	* GPIOF_ACTIVE_LOW	- to configure the GPIO as active-low | ||||
| 	* GPIOF_OPEN_DRAIN	- GPIO pin is open drain type. | ||||
| 	* GPIOF_OPEN_SOURCE	- GPIO pin is open source type. | ||||
| 
 | ||||
| In the future, these flags might be extended to support more properties. | ||||
| 
 | ||||
| Note that GPIO_LOOKUP() is just a shortcut to GPIO_LOOKUP_IDX() where idx = 0. | ||||
| 
 | ||||
| A lookup table can then be defined as follows: | ||||
| 
 | ||||
| 	struct gpiod_lookup gpios_table[] = { | ||||
| 	GPIO_LOOKUP_IDX("gpio.0", 15, "foo.0", "led", 0, GPIO_ACTIVE_HIGH), | ||||
| 	GPIO_LOOKUP_IDX("gpio.0", 16, "foo.0", "led", 1, GPIO_ACTIVE_HIGH), | ||||
| 	GPIO_LOOKUP_IDX("gpio.0", 17, "foo.0", "led", 2, GPIO_ACTIVE_HIGH), | ||||
| 	GPIO_LOOKUP("gpio.0", 1, "foo.0", "power", GPIO_ACTIVE_LOW), | ||||
| 	}; | ||||
| 
 | ||||
| And the table can be added by the board code as follows: | ||||
| 
 | ||||
| 	gpiod_add_table(gpios_table, ARRAY_SIZE(gpios_table)); | ||||
| 
 | ||||
| The driver controlling "foo.0" will then be able to obtain its GPIOs as follows: | ||||
| 
 | ||||
| 	struct gpio_desc *red, *green, *blue, *power; | ||||
| 
 | ||||
| 	red = gpiod_get_index(dev, "led", 0); | ||||
| 	green = gpiod_get_index(dev, "led", 1); | ||||
| 	blue = gpiod_get_index(dev, "led", 2); | ||||
| 
 | ||||
| 	power = gpiod_get(dev, "power"); | ||||
| 	gpiod_direction_output(power, 1); | ||||
| 
 | ||||
| Since the "power" GPIO is mapped as active-low, its actual signal will be 0 | ||||
| after this code. Contrary to the legacy integer GPIO interface, the active-low | ||||
| property is handled during mapping and is thus transparent to GPIO consumers. | ||||
							
								
								
									
										197
									
								
								Documentation/gpio/consumer.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								Documentation/gpio/consumer.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,197 @@ | ||||
| GPIO Descriptor Consumer Interface | ||||
| ================================== | ||||
| 
 | ||||
| This document describes the consumer interface of the GPIO framework. Note that | ||||
| it describes the new descriptor-based interface. For a description of the | ||||
| deprecated integer-based GPIO interface please refer to gpio-legacy.txt. | ||||
| 
 | ||||
| 
 | ||||
| Guidelines for GPIOs consumers | ||||
| ============================== | ||||
| 
 | ||||
| Drivers that can't work without standard GPIO calls should have Kconfig entries | ||||
| that depend on GPIOLIB. The functions that allow a driver to obtain and use | ||||
| GPIOs are available by including the following file: | ||||
| 
 | ||||
| 	#include <linux/gpio/consumer.h> | ||||
| 
 | ||||
| All the functions that work with the descriptor-based GPIO interface are | ||||
| prefixed with gpiod_. The gpio_ prefix is used for the legacy interface. No | ||||
| other function in the kernel should use these prefixes. | ||||
| 
 | ||||
| 
 | ||||
| Obtaining and Disposing GPIOs | ||||
| ============================= | ||||
| 
 | ||||
| With the descriptor-based interface, GPIOs are identified with an opaque, | ||||
| non-forgeable handler that must be obtained through a call to one of the | ||||
| gpiod_get() functions. Like many other kernel subsystems, gpiod_get() takes the | ||||
| device that will use the GPIO and the function the requested GPIO is supposed to | ||||
| fulfill: | ||||
| 
 | ||||
| 	struct gpio_desc *gpiod_get(struct device *dev, const char *con_id) | ||||
| 
 | ||||
| If a function is implemented by using several GPIOs together (e.g. a simple LED | ||||
| device that displays digits), an additional index argument can be specified: | ||||
| 
 | ||||
| 	struct gpio_desc *gpiod_get_index(struct device *dev, | ||||
| 					  const char *con_id, unsigned int idx) | ||||
| 
 | ||||
| Both functions return either a valid GPIO descriptor, or an error code checkable | ||||
| with IS_ERR(). They will never return a NULL pointer. | ||||
| 
 | ||||
| Device-managed variants of these functions are also defined: | ||||
| 
 | ||||
| 	struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id) | ||||
| 
 | ||||
| 	struct gpio_desc *devm_gpiod_get_index(struct device *dev, | ||||
| 					       const char *con_id, | ||||
| 					       unsigned int idx) | ||||
| 
 | ||||
| A GPIO descriptor can be disposed of using the gpiod_put() function: | ||||
| 
 | ||||
| 	void gpiod_put(struct gpio_desc *desc) | ||||
| 
 | ||||
| It is strictly forbidden to use a descriptor after calling this function. The | ||||
| device-managed variant is, unsurprisingly: | ||||
| 
 | ||||
| 	void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) | ||||
| 
 | ||||
| 
 | ||||
| Using GPIOs | ||||
| =========== | ||||
| 
 | ||||
| Setting Direction | ||||
| ----------------- | ||||
| The first thing a driver must do with a GPIO is setting its direction. This is | ||||
| done by invoking one of the gpiod_direction_*() functions: | ||||
| 
 | ||||
| 	int gpiod_direction_input(struct gpio_desc *desc) | ||||
| 	int gpiod_direction_output(struct gpio_desc *desc, int value) | ||||
| 
 | ||||
| The return value is zero for success, else a negative errno. It should be | ||||
| checked, since the get/set calls don't return errors and since misconfiguration | ||||
| is possible. You should normally issue these calls from a task context. However, | ||||
| for spinlock-safe GPIOs it is OK to use them before tasking is enabled, as part | ||||
| of early board setup. | ||||
| 
 | ||||
| For output GPIOs, the value provided becomes the initial output value. This | ||||
| helps avoid signal glitching during system startup. | ||||
| 
 | ||||
| A driver can also query the current direction of a GPIO: | ||||
| 
 | ||||
| 	int gpiod_get_direction(const struct gpio_desc *desc) | ||||
| 
 | ||||
| This function will return either GPIOF_DIR_IN or GPIOF_DIR_OUT. | ||||
| 
 | ||||
| Be aware that there is no default direction for GPIOs. Therefore, **using a GPIO | ||||
| without setting its direction first is illegal and will result in undefined | ||||
| behavior!** | ||||
| 
 | ||||
| 
 | ||||
| Spinlock-Safe GPIO Access | ||||
| ------------------------- | ||||
| Most GPIO controllers can be accessed with memory read/write instructions. Those | ||||
| don't need to sleep, and can safely be done from inside hard (non-threaded) IRQ | ||||
| handlers and similar contexts. | ||||
| 
 | ||||
| Use the following calls to access GPIOs from an atomic context: | ||||
| 
 | ||||
| 	int gpiod_get_value(const struct gpio_desc *desc); | ||||
| 	void gpiod_set_value(struct gpio_desc *desc, int value); | ||||
| 
 | ||||
| The values are boolean, zero for low, nonzero for high. When reading the value | ||||
| of an output pin, the value returned should be what's seen on the pin. That | ||||
| won't always match the specified output value, because of issues including | ||||
| open-drain signaling and output latencies. | ||||
| 
 | ||||
| The get/set calls do not return errors because "invalid GPIO" should have been | ||||
| reported earlier from gpiod_direction_*(). However, note that not all platforms | ||||
| can read the value of output pins; those that can't should always return zero. | ||||
| Also, using these calls for GPIOs that can't safely be accessed without sleeping | ||||
| (see below) is an error. | ||||
| 
 | ||||
| 
 | ||||
| GPIO Access That May Sleep | ||||
| -------------------------- | ||||
| Some GPIO controllers must be accessed using message based buses like I2C or | ||||
| SPI. Commands to read or write those GPIO values require waiting to get to the | ||||
| head of a queue to transmit a command and get its response. This requires | ||||
| sleeping, which can't be done from inside IRQ handlers. | ||||
| 
 | ||||
| Platforms that support this type of GPIO distinguish them from other GPIOs by | ||||
| returning nonzero from this call: | ||||
| 
 | ||||
| 	int gpiod_cansleep(const struct gpio_desc *desc) | ||||
| 
 | ||||
| To access such GPIOs, a different set of accessors is defined: | ||||
| 
 | ||||
| 	int gpiod_get_value_cansleep(const struct gpio_desc *desc) | ||||
| 	void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) | ||||
| 
 | ||||
| Accessing such GPIOs requires a context which may sleep, for example a threaded | ||||
| IRQ handler, and those accessors must be used instead of spinlock-safe | ||||
| accessors without the cansleep() name suffix. | ||||
| 
 | ||||
| Other than the fact that these accessors might sleep, and will work on GPIOs | ||||
| that can't be accessed from hardIRQ handlers, these calls act the same as the | ||||
| spinlock-safe calls. | ||||
| 
 | ||||
| 
 | ||||
| Active-low State and Raw GPIO Values | ||||
| ------------------------------------ | ||||
| Device drivers like to manage the logical state of a GPIO, i.e. the value their | ||||
| device will actually receive, no matter what lies between it and the GPIO line. | ||||
| In some cases, it might make sense to control the actual GPIO line value. The | ||||
| following set of calls ignore the active-low property of a GPIO and work on the | ||||
| raw line value: | ||||
| 
 | ||||
| 	int gpiod_get_raw_value(const struct gpio_desc *desc) | ||||
| 	void gpiod_set_raw_value(struct gpio_desc *desc, int value) | ||||
| 	int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) | ||||
| 	void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value) | ||||
| 
 | ||||
| The active-low state of a GPIO can also be queried using the following call: | ||||
| 
 | ||||
| 	int gpiod_is_active_low(const struct gpio_desc *desc) | ||||
| 
 | ||||
| Note that these functions should only be used with great moderation ; a driver | ||||
| should not have to care about the physical line level. | ||||
| 
 | ||||
| GPIOs mapped to IRQs | ||||
| -------------------- | ||||
| GPIO lines can quite often be used as IRQs. You can get the IRQ number | ||||
| corresponding to a given GPIO using the following call: | ||||
| 
 | ||||
| 	int gpiod_to_irq(const struct gpio_desc *desc) | ||||
| 
 | ||||
| It will return an IRQ number, or an negative errno code if the mapping can't be | ||||
| done (most likely because that particular GPIO cannot be used as IRQ). It is an | ||||
| unchecked error to use a GPIO that wasn't set up as an input using | ||||
| gpiod_direction_input(), or to use an IRQ number that didn't originally come | ||||
| from gpiod_to_irq(). gpiod_to_irq() is not allowed to sleep. | ||||
| 
 | ||||
| Non-error values returned from gpiod_to_irq() can be passed to request_irq() or | ||||
| free_irq(). They will often be stored into IRQ resources for platform devices, | ||||
| by the board-specific initialization code. Note that IRQ trigger options are | ||||
| part of the IRQ interface, e.g. IRQF_TRIGGER_FALLING, as are system wakeup | ||||
| capabilities. | ||||
| 
 | ||||
| 
 | ||||
| Interacting With the Legacy GPIO Subsystem | ||||
| ========================================== | ||||
| Many kernel subsystems still handle GPIOs using the legacy integer-based | ||||
| interface. Although it is strongly encouraged to upgrade them to the safer | ||||
| descriptor-based API, the following two functions allow you to convert a GPIO | ||||
| descriptor into the GPIO integer namespace and vice-versa: | ||||
| 
 | ||||
| 	int desc_to_gpio(const struct gpio_desc *desc) | ||||
| 	struct gpio_desc *gpio_to_desc(unsigned gpio) | ||||
| 
 | ||||
| The GPIO number returned by desc_to_gpio() can be safely used as long as the | ||||
| GPIO descriptor has not been freed. All the same, a GPIO number passed to | ||||
| gpio_to_desc() must have been properly acquired, and usage of the returned GPIO | ||||
| descriptor is only possible after the GPIO number has been released. | ||||
| 
 | ||||
| Freeing a GPIO obtained by one API with the other API is forbidden and an | ||||
| unchecked error. | ||||
							
								
								
									
										75
									
								
								Documentation/gpio/driver.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								Documentation/gpio/driver.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| GPIO Descriptor Driver Interface | ||||
| ================================ | ||||
| 
 | ||||
| This document serves as a guide for GPIO chip drivers writers. Note that it | ||||
| describes the new descriptor-based interface. For a description of the | ||||
| deprecated integer-based GPIO interface please refer to gpio-legacy.txt. | ||||
| 
 | ||||
| Each GPIO controller driver needs to include the following header, which defines | ||||
| the structures used to define a GPIO driver: | ||||
| 
 | ||||
| 	#include <linux/gpio/driver.h> | ||||
| 
 | ||||
| 
 | ||||
| Internal Representation of GPIOs | ||||
| ================================ | ||||
| 
 | ||||
| Inside a GPIO driver, individual GPIOs are identified by their hardware number, | ||||
| which is a unique number between 0 and n, n being the number of GPIOs managed by | ||||
| the chip. This number is purely internal: the hardware number of a particular | ||||
| GPIO descriptor is never made visible outside of the driver. | ||||
| 
 | ||||
| On top of this internal number, each GPIO also need to have a global number in | ||||
| the integer GPIO namespace so that it can be used with the legacy GPIO | ||||
| interface. Each chip must thus have a "base" number (which can be automatically | ||||
| assigned), and for each GPIO the global number will be (base + hardware number). | ||||
| Although the integer representation is considered deprecated, it still has many | ||||
| users and thus needs to be maintained. | ||||
| 
 | ||||
| So for example one platform could use numbers 32-159 for GPIOs, with a | ||||
| controller defining 128 GPIOs at a "base" of 32 ; while another platform uses | ||||
| numbers 0..63 with one set of GPIO controllers, 64-79 with another type of GPIO | ||||
| controller, and on one particular board 80-95 with an FPGA. The numbers need not | ||||
| be contiguous; either of those platforms could also use numbers 2000-2063 to | ||||
| identify GPIOs in a bank of I2C GPIO expanders. | ||||
| 
 | ||||
| 
 | ||||
| Controller Drivers: gpio_chip | ||||
| ============================= | ||||
| 
 | ||||
| In the gpiolib framework each GPIO controller is packaged as a "struct | ||||
| gpio_chip" (see linux/gpio/driver.h for its complete definition) with members | ||||
| common to each controller of that type: | ||||
| 
 | ||||
|  - methods to establish GPIO direction | ||||
|  - methods used to access GPIO values | ||||
|  - method to return the IRQ number associated to a given GPIO | ||||
|  - flag saying whether calls to its methods may sleep | ||||
|  - optional debugfs dump method (showing extra state like pullup config) | ||||
|  - optional base number (will be automatically assigned if omitted) | ||||
|  - label for diagnostics and GPIOs mapping using platform data | ||||
| 
 | ||||
| The code implementing a gpio_chip should support multiple instances of the | ||||
| controller, possibly using the driver model. That code will configure each | ||||
| gpio_chip and issue gpiochip_add(). Removing a GPIO controller should be rare; | ||||
| use gpiochip_remove() when it is unavoidable. | ||||
| 
 | ||||
| Most often a gpio_chip is part of an instance-specific structure with state not | ||||
| exposed by the GPIO interfaces, such as addressing, power management, and more. | ||||
| Chips such as codecs will have complex non-GPIO state. | ||||
| 
 | ||||
| Any debugfs dump method should normally ignore signals which haven't been | ||||
| requested as GPIOs. They can use gpiochip_is_requested(), which returns either | ||||
| NULL or the label associated with that GPIO when it was requested. | ||||
| 
 | ||||
| Locking IRQ usage | ||||
| ----------------- | ||||
| Input GPIOs can be used as IRQ signals. When this happens, a driver is requested | ||||
| to mark the GPIO as being used as an IRQ: | ||||
| 
 | ||||
| 	int gpiod_lock_as_irq(struct gpio_desc *desc) | ||||
| 
 | ||||
| This will prevent the use of non-irq related GPIO APIs until the GPIO IRQ lock | ||||
| is released: | ||||
| 
 | ||||
| 	void gpiod_unlock_as_irq(struct gpio_desc *desc) | ||||
							
								
								
									
										119
									
								
								Documentation/gpio/gpio.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								Documentation/gpio/gpio.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| GPIO Interfaces | ||||
| =============== | ||||
| 
 | ||||
| The documents in this directory give detailed instructions on how to access | ||||
| GPIOs in drivers, and how to write a driver for a device that provides GPIOs | ||||
| itself. | ||||
| 
 | ||||
| Due to the history of GPIO interfaces in the kernel, there are two different | ||||
| ways to obtain and use GPIOs: | ||||
| 
 | ||||
|   - The descriptor-based interface is the preferred way to manipulate GPIOs, | ||||
| and is described by all the files in this directory excepted gpio-legacy.txt. | ||||
|   - The legacy integer-based interface which is considered deprecated (but still | ||||
| usable for compatibility reasons) is documented in gpio-legacy.txt. | ||||
| 
 | ||||
| The remainder of this document applies to the new descriptor-based interface. | ||||
| gpio-legacy.txt contains the same information applied to the legacy | ||||
| integer-based interface. | ||||
| 
 | ||||
| 
 | ||||
| What is a GPIO? | ||||
| =============== | ||||
| 
 | ||||
| A "General Purpose Input/Output" (GPIO) is a flexible software-controlled | ||||
| digital signal. They are provided from many kinds of chip, and are familiar | ||||
| to Linux developers working with embedded and custom hardware. Each GPIO | ||||
| represents a bit connected to a particular pin, or "ball" on Ball Grid Array | ||||
| (BGA) packages. Board schematics show which external hardware connects to | ||||
| which GPIOs. Drivers can be written generically, so that board setup code | ||||
| passes such pin configuration data to drivers. | ||||
| 
 | ||||
| System-on-Chip (SOC) processors heavily rely on GPIOs. In some cases, every | ||||
| non-dedicated pin can be configured as a GPIO; and most chips have at least | ||||
| several dozen of them. Programmable logic devices (like FPGAs) can easily | ||||
| provide GPIOs; multifunction chips like power managers, and audio codecs | ||||
| often have a few such pins to help with pin scarcity on SOCs; and there are | ||||
| also "GPIO Expander" chips that connect using the I2C or SPI serial buses. | ||||
| Most PC southbridges have a few dozen GPIO-capable pins (with only the BIOS | ||||
| firmware knowing how they're used). | ||||
| 
 | ||||
| The exact capabilities of GPIOs vary between systems. Common options: | ||||
| 
 | ||||
|   - Output values are writable (high=1, low=0). Some chips also have | ||||
|     options about how that value is driven, so that for example only one | ||||
|     value might be driven, supporting "wire-OR" and similar schemes for the | ||||
|     other value (notably, "open drain" signaling). | ||||
| 
 | ||||
|   - Input values are likewise readable (1, 0). Some chips support readback | ||||
|     of pins configured as "output", which is very useful in such "wire-OR" | ||||
|     cases (to support bidirectional signaling). GPIO controllers may have | ||||
|     input de-glitch/debounce logic, sometimes with software controls. | ||||
| 
 | ||||
|   - Inputs can often be used as IRQ signals, often edge triggered but | ||||
|     sometimes level triggered. Such IRQs may be configurable as system | ||||
|     wakeup events, to wake the system from a low power state. | ||||
| 
 | ||||
|   - Usually a GPIO will be configurable as either input or output, as needed | ||||
|     by different product boards; single direction ones exist too. | ||||
| 
 | ||||
|   - Most GPIOs can be accessed while holding spinlocks, but those accessed | ||||
|     through a serial bus normally can't. Some systems support both types. | ||||
| 
 | ||||
| On a given board each GPIO is used for one specific purpose like monitoring | ||||
| MMC/SD card insertion/removal, detecting card write-protect status, driving | ||||
| a LED, configuring a transceiver, bit-banging a serial bus, poking a hardware | ||||
| watchdog, sensing a switch, and so on. | ||||
| 
 | ||||
| 
 | ||||
| Common GPIO Properties | ||||
| ====================== | ||||
| 
 | ||||
| These properties are met through all the other documents of the GPIO interface | ||||
| and it is useful to understand them, especially if you need to define GPIO | ||||
| mappings. | ||||
| 
 | ||||
| Active-High and Active-Low | ||||
| -------------------------- | ||||
| It is natural to assume that a GPIO is "active" when its output signal is 1 | ||||
| ("high"), and inactive when it is 0 ("low"). However in practice the signal of a | ||||
| GPIO may be inverted before is reaches its destination, or a device could decide | ||||
| to have different conventions about what "active" means. Such decisions should | ||||
| be transparent to device drivers, therefore it is possible to define a GPIO as | ||||
| being either active-high ("1" means "active", the default) or active-low ("0" | ||||
| means "active") so that drivers only need to worry about the logical signal and | ||||
| not about what happens at the line level. | ||||
| 
 | ||||
| Open Drain and Open Source | ||||
| -------------------------- | ||||
| Sometimes shared signals need to use "open drain" (where only the low signal | ||||
| level is actually driven), or "open source" (where only the high signal level is | ||||
| driven) signaling. That term applies to CMOS transistors; "open collector" is | ||||
| used for TTL. A pullup or pulldown resistor causes the high or low signal level. | ||||
| This is sometimes called a "wire-AND"; or more practically, from the negative | ||||
| logic (low=true) perspective this is a "wire-OR". | ||||
| 
 | ||||
| One common example of an open drain signal is a shared active-low IRQ line. | ||||
| Also, bidirectional data bus signals sometimes use open drain signals. | ||||
| 
 | ||||
| Some GPIO controllers directly support open drain and open source outputs; many | ||||
| don't. When you need open drain signaling but your hardware doesn't directly | ||||
| support it, there's a common idiom you can use to emulate it with any GPIO pin | ||||
| that can be used as either an input or an output: | ||||
| 
 | ||||
|  LOW:	gpiod_direction_output(gpio, 0) ... this drives the signal and overrides | ||||
| 	the pullup. | ||||
| 
 | ||||
|  HIGH:	gpiod_direction_input(gpio) ... this turns off the output, so the pullup | ||||
| 	(or some other device) controls the signal. | ||||
| 
 | ||||
| The same logic can be applied to emulate open source signaling, by driving the | ||||
| high signal and configuring the GPIO as input for low. This open drain/open | ||||
| source emulation can be handled transparently by the GPIO framework. | ||||
| 
 | ||||
| If you are "driving" the signal high but gpiod_get_value(gpio) reports a low | ||||
| value (after the appropriate rise time passes), you know some other component is | ||||
| driving the shared signal low. That's not necessarily an error. As one common | ||||
| example, that's how I2C clocks are stretched:  a slave that needs a slower clock | ||||
| delays the rising edge of SCK, and the I2C master adjusts its signaling rate | ||||
| accordingly. | ||||
							
								
								
									
										155
									
								
								Documentation/gpio/sysfs.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								Documentation/gpio/sysfs.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | ||||
| GPIO Sysfs Interface for Userspace | ||||
| ================================== | ||||
| 
 | ||||
| Platforms which use the "gpiolib" implementors framework may choose to | ||||
| configure a sysfs user interface to GPIOs. This is different from the | ||||
| debugfs interface, since it provides control over GPIO direction and | ||||
| value instead of just showing a gpio state summary. Plus, it could be | ||||
| present on production systems without debugging support. | ||||
| 
 | ||||
| Given appropriate hardware documentation for the system, userspace could | ||||
| know for example that GPIO #23 controls the write protect line used to | ||||
| protect boot loader segments in flash memory. System upgrade procedures | ||||
| may need to temporarily remove that protection, first importing a GPIO, | ||||
| then changing its output state, then updating the code before re-enabling | ||||
| the write protection. In normal use, GPIO #23 would never be touched, | ||||
| and the kernel would have no need to know about it. | ||||
| 
 | ||||
| Again depending on appropriate hardware documentation, on some systems | ||||
| userspace GPIO can be used to determine system configuration data that | ||||
| standard kernels won't know about. And for some tasks, simple userspace | ||||
| GPIO drivers could be all that the system really needs. | ||||
| 
 | ||||
| Note that standard kernel drivers exist for common "LEDs and Buttons" | ||||
| GPIO tasks:  "leds-gpio" and "gpio_keys", respectively. Use those | ||||
| instead of talking directly to the GPIOs; they integrate with kernel | ||||
| frameworks better than your userspace code could. | ||||
| 
 | ||||
| 
 | ||||
| Paths in Sysfs | ||||
| -------------- | ||||
| There are three kinds of entry in /sys/class/gpio: | ||||
| 
 | ||||
|    -	Control interfaces used to get userspace control over GPIOs; | ||||
| 
 | ||||
|    -	GPIOs themselves; and | ||||
| 
 | ||||
|    -	GPIO controllers ("gpio_chip" instances). | ||||
| 
 | ||||
| That's in addition to standard files including the "device" symlink. | ||||
| 
 | ||||
| The control interfaces are write-only: | ||||
| 
 | ||||
|     /sys/class/gpio/ | ||||
| 
 | ||||
|     	"export" ... Userspace may ask the kernel to export control of | ||||
| 		a GPIO to userspace by writing its number to this file. | ||||
| 
 | ||||
| 		Example:  "echo 19 > export" will create a "gpio19" node | ||||
| 		for GPIO #19, if that's not requested by kernel code. | ||||
| 
 | ||||
|     	"unexport" ... Reverses the effect of exporting to userspace. | ||||
| 
 | ||||
| 		Example:  "echo 19 > unexport" will remove a "gpio19" | ||||
| 		node exported using the "export" file. | ||||
| 
 | ||||
| GPIO signals have paths like /sys/class/gpio/gpio42/ (for GPIO #42) | ||||
| and have the following read/write attributes: | ||||
| 
 | ||||
|     /sys/class/gpio/gpioN/ | ||||
| 
 | ||||
| 	"direction" ... reads as either "in" or "out". This value may | ||||
| 		normally be written. Writing as "out" defaults to | ||||
| 		initializing the value as low. To ensure glitch free | ||||
| 		operation, values "low" and "high" may be written to | ||||
| 		configure the GPIO as an output with that initial value. | ||||
| 
 | ||||
| 		Note that this attribute *will not exist* if the kernel | ||||
| 		doesn't support changing the direction of a GPIO, or | ||||
| 		it was exported by kernel code that didn't explicitly | ||||
| 		allow userspace to reconfigure this GPIO's direction. | ||||
| 
 | ||||
| 	"value" ... reads as either 0 (low) or 1 (high). If the GPIO | ||||
| 		is configured as an output, this value may be written; | ||||
| 		any nonzero value is treated as high. | ||||
| 
 | ||||
| 		If the pin can be configured as interrupt-generating interrupt | ||||
| 		and if it has been configured to generate interrupts (see the | ||||
| 		description of "edge"), you can poll(2) on that file and | ||||
| 		poll(2) will return whenever the interrupt was triggered. If | ||||
| 		you use poll(2), set the events POLLPRI and POLLERR. If you | ||||
| 		use select(2), set the file descriptor in exceptfds. After | ||||
| 		poll(2) returns, either lseek(2) to the beginning of the sysfs | ||||
| 		file and read the new value or close the file and re-open it | ||||
| 		to read the value. | ||||
| 
 | ||||
| 	"edge" ... reads as either "none", "rising", "falling", or | ||||
| 		"both". Write these strings to select the signal edge(s) | ||||
| 		that will make poll(2) on the "value" file return. | ||||
| 
 | ||||
| 		This file exists only if the pin can be configured as an | ||||
| 		interrupt generating input pin. | ||||
| 
 | ||||
| 	"active_low" ... reads as either 0 (false) or 1 (true). Write | ||||
| 		any nonzero value to invert the value attribute both | ||||
| 		for reading and writing. Existing and subsequent | ||||
| 		poll(2) support configuration via the edge attribute | ||||
| 		for "rising" and "falling" edges will follow this | ||||
| 		setting. | ||||
| 
 | ||||
| GPIO controllers have paths like /sys/class/gpio/gpiochip42/ (for the | ||||
| controller implementing GPIOs starting at #42) and have the following | ||||
| read-only attributes: | ||||
| 
 | ||||
|     /sys/class/gpio/gpiochipN/ | ||||
| 
 | ||||
|     	"base" ... same as N, the first GPIO managed by this chip | ||||
| 
 | ||||
|     	"label" ... provided for diagnostics (not always unique) | ||||
| 
 | ||||
|     	"ngpio" ... how many GPIOs this manges (N to N + ngpio - 1) | ||||
| 
 | ||||
| Board documentation should in most cases cover what GPIOs are used for | ||||
| what purposes. However, those numbers are not always stable; GPIOs on | ||||
| a daughtercard might be different depending on the base board being used, | ||||
| or other cards in the stack. In such cases, you may need to use the | ||||
| gpiochip nodes (possibly in conjunction with schematics) to determine | ||||
| the correct GPIO number to use for a given signal. | ||||
| 
 | ||||
| 
 | ||||
| Exporting from Kernel code | ||||
| -------------------------- | ||||
| Kernel code can explicitly manage exports of GPIOs which have already been | ||||
| requested using gpio_request(): | ||||
| 
 | ||||
| 	/* export the GPIO to userspace */ | ||||
| 	int gpiod_export(struct gpio_desc *desc, bool direction_may_change); | ||||
| 
 | ||||
| 	/* reverse gpio_export() */ | ||||
| 	void gpiod_unexport(struct gpio_desc *desc); | ||||
| 
 | ||||
| 	/* create a sysfs link to an exported GPIO node */ | ||||
| 	int gpiod_export_link(struct device *dev, const char *name, | ||||
| 		      struct gpio_desc *desc); | ||||
| 
 | ||||
| 	/* change the polarity of a GPIO node in sysfs */ | ||||
| 	int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value); | ||||
| 
 | ||||
| After a kernel driver requests a GPIO, it may only be made available in | ||||
| the sysfs interface by gpiod_export(). The driver can control whether the | ||||
| signal direction may change. This helps drivers prevent userspace code | ||||
| from accidentally clobbering important system state. | ||||
| 
 | ||||
| This explicit exporting can help with debugging (by making some kinds | ||||
| of experiments easier), or can provide an always-there interface that's | ||||
| suitable for documenting as part of a board support package. | ||||
| 
 | ||||
| After the GPIO has been exported, gpiod_export_link() allows creating | ||||
| symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can | ||||
| use this to provide the interface under their own device in sysfs with | ||||
| a descriptive name. | ||||
| 
 | ||||
| Drivers can use gpiod_sysfs_set_active_low() to hide GPIO line polarity | ||||
| differences between boards from user space. Polarity change can be done both | ||||
| before and after gpiod_export(), and previously enabled poll(2) support for | ||||
| either rising or falling edge will be reconfigured to follow this setting. | ||||
							
								
								
									
										23
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -1934,7 +1934,8 @@ S:	Maintained | ||||
| F:	drivers/gpio/gpio-bt8xx.c | ||||
| 
 | ||||
| BTRFS FILE SYSTEM | ||||
| M:	Chris Mason <chris.mason@fusionio.com> | ||||
| M:	Chris Mason <clm@fb.com> | ||||
| M:	Josef Bacik <jbacik@fb.com> | ||||
| L:	linux-btrfs@vger.kernel.org | ||||
| W:	http://btrfs.wiki.kernel.org/ | ||||
| Q:	http://patchwork.kernel.org/project/linux-btrfs/list/ | ||||
| @ -2142,6 +2143,11 @@ L:	linux-usb@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/usb/chipidea/ | ||||
| 
 | ||||
| CHROME HARDWARE PLATFORM SUPPORT | ||||
| M:	Olof Johansson <olof@lixom.net> | ||||
| S:	Maintained | ||||
| F:	drivers/platform/chrome/ | ||||
| 
 | ||||
| CISCO VIC ETHERNET NIC DRIVER | ||||
| M:	Christian Benvenuti <benve@cisco.com> | ||||
| M:	Sujith Sankar <ssujith@cisco.com> | ||||
| @ -4044,6 +4050,12 @@ W:	http://www.pharscape.org | ||||
| S:	Maintained | ||||
| F:	drivers/net/usb/hso.c | ||||
| 
 | ||||
| HSR NETWORK PROTOCOL | ||||
| M:	Arvid Brodin <arvid.brodin@alten.se> | ||||
| L:	netdev@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	net/hsr/ | ||||
| 
 | ||||
| HTCPEN TOUCHSCREEN DRIVER | ||||
| M:	Pau Oliva Fora <pof@eslack.org> | ||||
| L:	linux-input@vger.kernel.org | ||||
| @ -5256,7 +5268,7 @@ S:	Maintained | ||||
| F:	Documentation/lockdep*.txt | ||||
| F:	Documentation/lockstat.txt | ||||
| F:	include/linux/lockdep.h | ||||
| F:	kernel/lockdep* | ||||
| F:	kernel/locking/ | ||||
| 
 | ||||
| LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP/Vista Dynamic Disks) | ||||
| M:	"Richard Russon (FlatCap)" <ldm@flatcap.org> | ||||
| @ -5968,10 +5980,10 @@ F:	drivers/nfc/ | ||||
| F:	include/linux/platform_data/pn544.h | ||||
| 
 | ||||
| NFS, SUNRPC, AND LOCKD CLIENTS | ||||
| M:	Trond Myklebust <Trond.Myklebust@netapp.com> | ||||
| M:	Trond Myklebust <trond.myklebust@primarydata.com> | ||||
| L:	linux-nfs@vger.kernel.org | ||||
| W:	http://client.linux-nfs.org | ||||
| T:	git git://git.linux-nfs.org/pub/linux/nfs-2.6.git | ||||
| T:	git git://git.linux-nfs.org/projects/trondmy/linux-nfs.git | ||||
| S:	Maintained | ||||
| F:	fs/lockd/ | ||||
| F:	fs/nfs/ | ||||
| @ -6238,8 +6250,8 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS | ||||
| M:	Rob Herring <rob.herring@calxeda.com> | ||||
| M:	Pawel Moll <pawel.moll@arm.com> | ||||
| M:	Mark Rutland <mark.rutland@arm.com> | ||||
| M:	Stephen Warren <swarren@wwwdotorg.org> | ||||
| M:	Ian Campbell <ijc+devicetree@hellion.org.uk> | ||||
| M:	Kumar Gala <galak@codeaurora.org> | ||||
| L:	devicetree@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	Documentation/devicetree/ | ||||
| @ -7380,7 +7392,6 @@ S:	Maintained | ||||
| F:	kernel/sched/ | ||||
| F:	include/linux/sched.h | ||||
| F:	include/uapi/linux/sched.h | ||||
| F:	kernel/wait.c | ||||
| F:	include/linux/wait.h | ||||
| 
 | ||||
| SCORE ARCHITECTURE | ||||
|  | ||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | ||||
| VERSION = 3 | ||||
| PATCHLEVEL = 13 | ||||
| SUBLEVEL = 0 | ||||
| EXTRAVERSION = -rc1 | ||||
| EXTRAVERSION = -rc3 | ||||
| NAME = One Giant Leap for Frogkind | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  | ||||
| @ -13,4 +13,83 @@ | ||||
| / { | ||||
| 	model = "IGEP COM AM335x on AQUILA Expansion"; | ||||
| 	compatible = "isee,am335x-base0033", "isee,am335x-igep0033", "ti,am33xx"; | ||||
| 
 | ||||
| 	hdmi { | ||||
| 		compatible = "ti,tilcdc,slave"; | ||||
| 		i2c = <&i2c0>; | ||||
| 		pinctrl-names = "default", "off"; | ||||
| 		pinctrl-0 = <&nxp_hdmi_pins>; | ||||
| 		pinctrl-1 = <&nxp_hdmi_off_pins>; | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| 
 | ||||
| 	leds_base { | ||||
| 		pinctrl-names = "default"; | ||||
| 		pinctrl-0 = <&leds_base_pins>; | ||||
| 
 | ||||
| 		compatible = "gpio-leds"; | ||||
| 
 | ||||
| 		led@0 { | ||||
| 			label = "base:red:user"; | ||||
| 			gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;	/* gpio1_21 */ | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 
 | ||||
| 		led@1 { | ||||
| 			label = "base:green:user"; | ||||
| 			gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;	/* gpio2_0 */ | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &am33xx_pinmux { | ||||
| 	nxp_hdmi_pins: pinmux_nxp_hdmi_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x1b0 (PIN_OUTPUT | MUX_MODE3)	/* xdma_event_intr0.clkout1 */ | ||||
| 			0xa0 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data0 */ | ||||
| 			0xa4 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data1 */ | ||||
| 			0xa8 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data2 */ | ||||
| 			0xac (PIN_OUTPUT | MUX_MODE0)	/* lcd_data3 */ | ||||
| 			0xb0 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data4 */ | ||||
| 			0xb4 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data5 */ | ||||
| 			0xb8 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data6 */ | ||||
| 			0xbc (PIN_OUTPUT | MUX_MODE0)	/* lcd_data7 */ | ||||
| 			0xc0 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data8 */ | ||||
| 			0xc4 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data9 */ | ||||
| 			0xc8 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data10 */ | ||||
| 			0xcc (PIN_OUTPUT | MUX_MODE0)	/* lcd_data11 */ | ||||
| 			0xd0 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data12 */ | ||||
| 			0xd4 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data13 */ | ||||
| 			0xd8 (PIN_OUTPUT | MUX_MODE0)	/* lcd_data14 */ | ||||
| 			0xdc (PIN_OUTPUT | MUX_MODE0)	/* lcd_data15 */ | ||||
| 			0xe0 (PIN_OUTPUT | MUX_MODE0)	/* lcd_vsync */ | ||||
| 			0xe4 (PIN_OUTPUT | MUX_MODE0)	/* lcd_hsync */ | ||||
| 			0xe8 (PIN_OUTPUT | MUX_MODE0)	/* lcd_pclk */ | ||||
| 			0xec (PIN_OUTPUT | MUX_MODE0)	/* lcd_ac_bias_en */ | ||||
| 		>; | ||||
| 	}; | ||||
| 	nxp_hdmi_off_pins: pinmux_nxp_hdmi_off_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x1b0 (PIN_OUTPUT | MUX_MODE3)	/* xdma_event_intr0.clkout1 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	leds_base_pins: pinmux_leds_base_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a5.gpio1_21 */ | ||||
| 			0x88 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* gpmc_csn3.gpio2_0 */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &lcdc { | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
| &i2c0 { | ||||
| 	eeprom: eeprom@50 { | ||||
| 		compatible = "at,24c256"; | ||||
| 		reg = <0x50>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| @ -199,6 +199,35 @@ | ||||
| 	pinctrl-0 = <&uart0_pins>; | ||||
| }; | ||||
| 
 | ||||
| &usb { | ||||
| 	status = "okay"; | ||||
| 
 | ||||
| 	control@44e10000 { | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| 
 | ||||
| 	usb-phy@47401300 { | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| 
 | ||||
| 	usb-phy@47401b00 { | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| 
 | ||||
| 	usb@47401000 { | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| 
 | ||||
| 	usb@47401800 { | ||||
| 		status = "okay"; | ||||
| 		dr_mode = "host"; | ||||
| 	}; | ||||
| 
 | ||||
| 	dma-controller@07402000  { | ||||
| 		status = "okay"; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| #include "tps65910.dtsi" | ||||
| 
 | ||||
| &tps { | ||||
|  | ||||
| @ -99,22 +99,22 @@ | ||||
| 					spi-max-frequency = <50000000>; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 			pcie-controller { | ||||
| 		pcie-controller { | ||||
| 			status = "okay"; | ||||
| 			/* | ||||
| 			 * The two PCIe units are accessible through | ||||
| 			 * both standard PCIe slots and mini-PCIe | ||||
| 			 * slots on the board. | ||||
| 			 */ | ||||
| 			pcie@1,0 { | ||||
| 				/* Port 0, Lane 0 */ | ||||
| 				status = "okay"; | ||||
| 			}; | ||||
| 			pcie@2,0 { | ||||
| 				/* Port 1, Lane 0 */ | ||||
| 				status = "okay"; | ||||
| 				/* | ||||
| 				 * The two PCIe units are accessible through | ||||
| 				 * both standard PCIe slots and mini-PCIe | ||||
| 				 * slots on the board. | ||||
| 				 */ | ||||
| 				pcie@1,0 { | ||||
| 					/* Port 0, Lane 0 */ | ||||
| 					status = "okay"; | ||||
| 				}; | ||||
| 				pcie@2,0 { | ||||
| 					/* Port 1, Lane 0 */ | ||||
| 					status = "okay"; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| @ -118,7 +118,7 @@ | ||||
| 
 | ||||
| 			coherency-fabric@20200 { | ||||
| 				compatible = "marvell,coherency-fabric"; | ||||
| 				reg = <0x20200 0xb0>, <0x21810 0x1c>; | ||||
| 				reg = <0x20200 0xb0>, <0x21010 0x1c>; | ||||
| 			}; | ||||
| 
 | ||||
| 			serial@12000 { | ||||
|  | ||||
| @ -47,7 +47,7 @@ | ||||
| 		/* | ||||
| 		 * MV78230 has 2 PCIe units Gen2.0: One unit can be | ||||
| 		 * configured as x4 or quad x1 lanes. One unit is | ||||
| 		 * x4/x1. | ||||
| 		 * x1 only. | ||||
| 		 */ | ||||
| 		pcie-controller { | ||||
| 			compatible = "marvell,armada-xp-pcie"; | ||||
| @ -62,10 +62,10 @@ | ||||
| 
 | ||||
| 			ranges = | ||||
| 			       <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000   /* Port 0.0 registers */ | ||||
| 				0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000   /* Port 2.0 registers */ | ||||
| 				0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000   /* Port 0.1 registers */ | ||||
| 				0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000   /* Port 0.2 registers */ | ||||
| 				0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000   /* Port 0.3 registers */ | ||||
| 				0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000   /* Port 1.0 registers */ | ||||
| 				0x82000000 0x1 0       MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ | ||||
| 				0x81000000 0x1 0       MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO  */ | ||||
| 				0x82000000 0x2 0       MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ | ||||
| @ -74,8 +74,8 @@ | ||||
| 				0x81000000 0x3 0       MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO  */ | ||||
| 				0x82000000 0x4 0       MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ | ||||
| 				0x81000000 0x4 0       MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO  */ | ||||
| 				0x82000000 0x9 0       MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */ | ||||
| 				0x81000000 0x9 0       MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO  */>; | ||||
| 				0x82000000 0x5 0       MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ | ||||
| 				0x81000000 0x5 0       MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO  */>; | ||||
| 
 | ||||
| 			pcie@1,0 { | ||||
| 				device_type = "pci"; | ||||
| @ -145,20 +145,20 @@ | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@9,0 { | ||||
| 			pcie@5,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x42000 0 0x2000>; | ||||
| 				reg = <0x4800 0 0 0 0>; | ||||
| 				assigned-addresses = <0x82000800 0 0x80000 0 0x2000>; | ||||
| 				reg = <0x2800 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x9 0 1 0>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x5 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 99>; | ||||
| 				marvell,pcie-port = <2>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 62>; | ||||
| 				marvell,pcie-port = <1>; | ||||
| 				marvell,pcie-lane = <0>; | ||||
| 				clocks = <&gateclk 26>; | ||||
| 				clocks = <&gateclk 9>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| @ -48,7 +48,7 @@ | ||||
| 		/* | ||||
| 		 * MV78260 has 3 PCIe units Gen2.0: Two units can be | ||||
| 		 * configured as x4 or quad x1 lanes. One unit is | ||||
| 		 * x4/x1. | ||||
| 		 * x4 only. | ||||
| 		 */ | ||||
| 		pcie-controller { | ||||
| 			compatible = "marvell,armada-xp-pcie"; | ||||
| @ -68,7 +68,9 @@ | ||||
| 				0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000   /* Port 0.2 registers */ | ||||
| 				0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000   /* Port 0.3 registers */ | ||||
| 				0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000   /* Port 1.0 registers */ | ||||
| 				0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000   /* Port 3.0 registers */ | ||||
| 				0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000   /* Port 1.1 registers */ | ||||
| 				0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000   /* Port 1.2 registers */ | ||||
| 				0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000   /* Port 1.3 registers */ | ||||
| 				0x82000000 0x1 0     MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ | ||||
| 				0x81000000 0x1 0     MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO  */ | ||||
| 				0x82000000 0x2 0     MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ | ||||
| @ -77,10 +79,18 @@ | ||||
| 				0x81000000 0x3 0     MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO  */ | ||||
| 				0x82000000 0x4 0     MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ | ||||
| 				0x81000000 0x4 0     MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO  */ | ||||
| 				0x82000000 0x9 0     MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ | ||||
| 				0x81000000 0x9 0     MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO  */ | ||||
| 				0x82000000 0xa 0     MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */ | ||||
| 				0x81000000 0xa 0     MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO  */>; | ||||
| 
 | ||||
| 				0x82000000 0x5 0     MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ | ||||
| 				0x81000000 0x5 0     MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO  */ | ||||
| 				0x82000000 0x6 0     MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */ | ||||
| 				0x81000000 0x6 0     MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO  */ | ||||
| 				0x82000000 0x7 0     MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */ | ||||
| 				0x81000000 0x7 0     MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO  */ | ||||
| 				0x82000000 0x8 0     MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */ | ||||
| 				0x81000000 0x8 0     MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO  */ | ||||
| 
 | ||||
| 				0x82000000 0x9 0     MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */ | ||||
| 				0x81000000 0x9 0     MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO  */>; | ||||
| 
 | ||||
| 			pcie@1,0 { | ||||
| 				device_type = "pci"; | ||||
| @ -106,8 +116,8 @@ | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
|                                 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0 | ||||
|                                           0x81000000 0 0 0x81000000 0x2 0 1 0>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x2 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 59>; | ||||
| 				marvell,pcie-port = <0>; | ||||
| @ -150,6 +160,74 @@ | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@5,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x80000 0 0x2000>; | ||||
| 				reg = <0x2800 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x5 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 62>; | ||||
| 				marvell,pcie-port = <1>; | ||||
| 				marvell,pcie-lane = <0>; | ||||
| 				clocks = <&gateclk 9>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@6,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x84000 0 0x2000>; | ||||
| 				reg = <0x3000 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x6 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 63>; | ||||
| 				marvell,pcie-port = <1>; | ||||
| 				marvell,pcie-lane = <1>; | ||||
| 				clocks = <&gateclk 10>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@7,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x88000 0 0x2000>; | ||||
| 				reg = <0x3800 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x7 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 64>; | ||||
| 				marvell,pcie-port = <1>; | ||||
| 				marvell,pcie-lane = <2>; | ||||
| 				clocks = <&gateclk 11>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@8,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>; | ||||
| 				reg = <0x4000 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0x8 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 65>; | ||||
| 				marvell,pcie-port = <1>; | ||||
| 				marvell,pcie-lane = <3>; | ||||
| 				clocks = <&gateclk 12>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@9,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x42000 0 0x2000>; | ||||
| @ -166,23 +244,6 @@ | ||||
| 				clocks = <&gateclk 26>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
| 			pcie@10,0 { | ||||
| 				device_type = "pci"; | ||||
| 				assigned-addresses = <0x82000800 0 0x82000 0 0x2000>; | ||||
| 				reg = <0x5000 0 0 0 0>; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0 | ||||
| 					  0x81000000 0 0 0x81000000 0xa 0 1 0>; | ||||
| 				interrupt-map-mask = <0 0 0 0>; | ||||
| 				interrupt-map = <0 0 0 0 &mpic 103>; | ||||
| 				marvell,pcie-port = <3>; | ||||
| 				marvell,pcie-lane = <0>; | ||||
| 				clocks = <&gateclk 27>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 		internal-regs { | ||||
|  | ||||
| @ -11,6 +11,10 @@ | ||||
| #include <dt-bindings/interrupt-controller/irq.h> | ||||
| 
 | ||||
| / { | ||||
| 	aliases { | ||||
| 		serial4 = &usart3; | ||||
| 	}; | ||||
| 
 | ||||
| 	ahb { | ||||
| 		apb { | ||||
| 			pinctrl@fffff400 { | ||||
|  | ||||
| @ -85,6 +85,8 @@ | ||||
| 			reg = <0x7e205000 0x1000>; | ||||
| 			interrupts = <2 21>; | ||||
| 			clocks = <&clk_i2c>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
| @ -93,6 +95,8 @@ | ||||
| 			reg = <0x7e804000 0x1000>; | ||||
| 			interrupts = <2 21>; | ||||
| 			clocks = <&clk_i2c>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
|  | ||||
| @ -27,6 +27,13 @@ | ||||
| 		i2c2_bus: i2c2-bus { | ||||
| 			samsung,pin-pud = <0>; | ||||
| 		}; | ||||
| 
 | ||||
| 		max77686_irq: max77686-irq { | ||||
| 			samsung,pins = "gpx3-2"; | ||||
| 			samsung,pin-function = <0>; | ||||
| 			samsung,pin-pud = <0>; | ||||
| 			samsung,pin-drv = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	i2c@12C60000 { | ||||
| @ -35,6 +42,11 @@ | ||||
| 
 | ||||
| 		max77686@09 { | ||||
| 			compatible = "maxim,max77686"; | ||||
| 			interrupt-parent = <&gpx3>; | ||||
| 			interrupts = <2 0>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			pinctrl-0 = <&max77686_irq>; | ||||
| 			wakeup-source; | ||||
| 			reg = <0x09>; | ||||
| 
 | ||||
| 			voltage-regulators { | ||||
|  | ||||
| @ -161,7 +161,7 @@ | ||||
| 					clocks = <&clks 197>, <&clks 3>, | ||||
| 						 <&clks 197>, <&clks 107>, | ||||
| 						 <&clks 0>,   <&clks 118>, | ||||
| 						 <&clks 62>,  <&clks 139>, | ||||
| 						 <&clks 0>,  <&clks 139>, | ||||
| 						 <&clks 0>; | ||||
| 					clock-names = "core",  "rxtx0", | ||||
| 						      "rxtx1", "rxtx2", | ||||
|  | ||||
| @ -44,8 +44,8 @@ | ||||
| 		gpmc,wr-access-ns = <186>; | ||||
| 		gpmc,cycle2cycle-samecsen; | ||||
| 		gpmc,cycle2cycle-diffcsen; | ||||
| 		vmmc-supply = <&vddvario>; | ||||
| 		vmmc_aux-supply = <&vdd33a>; | ||||
| 		vddvario-supply = <&vddvario>; | ||||
| 		vdd33a-supply = <&vdd33a>; | ||||
| 		reg-io-width = <4>; | ||||
| 		smsc,save-mac-address; | ||||
| 	}; | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
| 	 * they probably share the same GPIO IRQ | ||||
| 	 * REVISIT: Add timing support from slls644g.pdf | ||||
| 	 */ | ||||
| 	8250@3,0 { | ||||
| 	uart@3,0 { | ||||
| 		compatible = "ns16550a"; | ||||
| 		reg = <3 0 0x100>; | ||||
| 		bank-width = <2>; | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/interrupt-controller/irq.h> | ||||
| #include <dt-bindings/pinctrl/omap.h> | ||||
| 
 | ||||
| #include "skeleton.dtsi" | ||||
| @ -21,6 +22,8 @@ | ||||
| 		serial0 = &uart1; | ||||
| 		serial1 = &uart2; | ||||
| 		serial2 = &uart3; | ||||
| 		i2c0 = &i2c1; | ||||
| 		i2c1 = &i2c2; | ||||
| 	}; | ||||
| 
 | ||||
| 	cpus { | ||||
| @ -53,6 +56,28 @@ | ||||
| 		ranges; | ||||
| 		ti,hwmods = "l3_main"; | ||||
| 
 | ||||
| 		aes: aes@480a6000 { | ||||
| 			compatible = "ti,omap2-aes"; | ||||
| 			ti,hwmods = "aes"; | ||||
| 			reg = <0x480a6000 0x50>; | ||||
| 			dmas = <&sdma 9 &sdma 10>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		hdq1w: 1w@480b2000 { | ||||
| 			compatible = "ti,omap2420-1w"; | ||||
| 			ti,hwmods = "hdq1w"; | ||||
| 			reg = <0x480b2000 0x1000>; | ||||
| 			interrupts = <58>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mailbox: mailbox@48094000 { | ||||
| 			compatible = "ti,omap2-mailbox"; | ||||
| 			ti,hwmods = "mailbox"; | ||||
| 			reg = <0x48094000 0x200>; | ||||
| 			interrupts = <26>; | ||||
| 		}; | ||||
| 
 | ||||
| 		intc: interrupt-controller@1 { | ||||
| 			compatible = "ti,omap2-intc"; | ||||
| 			interrupt-controller; | ||||
| @ -63,6 +88,7 @@ | ||||
| 
 | ||||
| 		sdma: dma-controller@48056000 { | ||||
| 			compatible = "ti,omap2430-sdma", "ti,omap2420-sdma"; | ||||
| 			ti,hwmods = "dma"; | ||||
| 			reg = <0x48056000 0x1000>; | ||||
| 			interrupts = <12>, | ||||
| 				     <13>, | ||||
| @ -73,21 +99,91 @@ | ||||
| 			#dma-requests = <64>; | ||||
| 		}; | ||||
| 
 | ||||
| 		i2c1: i2c@48070000 { | ||||
| 			compatible = "ti,omap2-i2c"; | ||||
| 			ti,hwmods = "i2c1"; | ||||
| 			reg = <0x48070000 0x80>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			interrupts = <56>; | ||||
| 			dmas = <&sdma 27 &sdma 28>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		i2c2: i2c@48072000 { | ||||
| 			compatible = "ti,omap2-i2c"; | ||||
| 			ti,hwmods = "i2c2"; | ||||
| 			reg = <0x48072000 0x80>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			interrupts = <57>; | ||||
| 			dmas = <&sdma 29 &sdma 30>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mcspi1: mcspi@48098000 { | ||||
| 			compatible = "ti,omap2-mcspi"; | ||||
| 			ti,hwmods = "mcspi1"; | ||||
| 			reg = <0x48098000 0x100>; | ||||
| 			interrupts = <65>; | ||||
| 			dmas = <&sdma 35 &sdma 36 &sdma 37 &sdma 38 | ||||
| 				&sdma 39 &sdma 40 &sdma 41 &sdma 42>; | ||||
| 			dma-names = "tx0", "rx0", "tx1", "rx1", | ||||
| 				    "tx2", "rx2", "tx3", "rx3"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mcspi2: mcspi@4809a000 { | ||||
| 			compatible = "ti,omap2-mcspi"; | ||||
| 			ti,hwmods = "mcspi2"; | ||||
| 			reg = <0x4809a000 0x100>; | ||||
| 			interrupts = <66>; | ||||
| 			dmas = <&sdma 43 &sdma 44 &sdma 45 &sdma 46>; | ||||
| 			dma-names = "tx0", "rx0", "tx1", "rx1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		rng: rng@480a0000 { | ||||
| 			compatible = "ti,omap2-rng"; | ||||
| 			ti,hwmods = "rng"; | ||||
| 			reg = <0x480a0000 0x50>; | ||||
| 			interrupts = <36>; | ||||
| 		}; | ||||
| 
 | ||||
| 		sham: sham@480a4000 { | ||||
| 			compatible = "ti,omap2-sham"; | ||||
| 			ti,hwmods = "sham"; | ||||
| 			reg = <0x480a4000 0x64>; | ||||
| 			interrupts = <51>; | ||||
| 			dmas = <&sdma 13>; | ||||
| 			dma-names = "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart1: serial@4806a000 { | ||||
| 			compatible = "ti,omap2-uart"; | ||||
| 			ti,hwmods = "uart1"; | ||||
| 			reg = <0x4806a000 0x2000>; | ||||
| 			interrupts = <72>; | ||||
| 			dmas = <&sdma 49 &sdma 50>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 			clock-frequency = <48000000>; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart2: serial@4806c000 { | ||||
| 			compatible = "ti,omap2-uart"; | ||||
| 			ti,hwmods = "uart2"; | ||||
| 			reg = <0x4806c000 0x400>; | ||||
| 			interrupts = <73>; | ||||
| 			dmas = <&sdma 51 &sdma 52>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 			clock-frequency = <48000000>; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart3: serial@4806e000 { | ||||
| 			compatible = "ti,omap2-uart"; | ||||
| 			ti,hwmods = "uart3"; | ||||
| 			reg = <0x4806e000 0x400>; | ||||
| 			interrupts = <74>; | ||||
| 			dmas = <&sdma 53 &sdma 54>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 			clock-frequency = <48000000>; | ||||
| 		}; | ||||
| 
 | ||||
|  | ||||
| @ -114,6 +114,15 @@ | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		msdi1: mmc@4809c000 { | ||||
| 			compatible = "ti,omap2420-mmc"; | ||||
| 			ti,hwmods = "msdi1"; | ||||
| 			reg = <0x4809c000 0x80>; | ||||
| 			interrupts = <83>; | ||||
| 			dmas = <&sdma 61 &sdma 62>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		timer1: timer@48028000 { | ||||
| 			compatible = "ti,omap2420-timer"; | ||||
| 			reg = <0x48028000 0x400>; | ||||
| @ -121,5 +130,19 @@ | ||||
| 			ti,hwmods = "timer1"; | ||||
| 			ti,timer-alwon; | ||||
| 		}; | ||||
| 
 | ||||
| 		wd_timer2: wdt@48022000 { | ||||
| 			compatible = "ti,omap2-wdt"; | ||||
| 			ti,hwmods = "wd_timer2"; | ||||
| 			reg = <0x48022000 0x80>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &i2c1 { | ||||
| 	compatible = "ti,omap2420-i2c"; | ||||
| }; | ||||
| 
 | ||||
| &i2c2 { | ||||
| 	compatible = "ti,omap2420-i2c"; | ||||
| }; | ||||
|  | ||||
| @ -175,6 +175,25 @@ | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mmc1: mmc@4809c000 { | ||||
| 			compatible = "ti,omap2-hsmmc"; | ||||
| 			reg = <0x4809c000 0x200>; | ||||
| 			interrupts = <83>; | ||||
| 			ti,hwmods = "mmc1"; | ||||
| 			ti,dual-volt; | ||||
| 			dmas = <&sdma 61>, <&sdma 62>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mmc2: mmc@480b4000 { | ||||
| 			compatible = "ti,omap2-hsmmc"; | ||||
| 			reg = <0x480b4000 0x200>; | ||||
| 			interrupts = <86>; | ||||
| 			ti,hwmods = "mmc2"; | ||||
| 			dmas = <&sdma 47>, <&sdma 48>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		timer1: timer@49018000 { | ||||
| 			compatible = "ti,omap2420-timer"; | ||||
| 			reg = <0x49018000 0x400>; | ||||
| @ -182,5 +201,35 @@ | ||||
| 			ti,hwmods = "timer1"; | ||||
| 			ti,timer-alwon; | ||||
| 		}; | ||||
| 
 | ||||
| 		mcspi3: mcspi@480b8000 { | ||||
| 			compatible = "ti,omap2-mcspi"; | ||||
| 			ti,hwmods = "mcspi3"; | ||||
| 			reg = <0x480b8000 0x100>; | ||||
| 			interrupts = <91>; | ||||
| 			dmas = <&sdma 15 &sdma 16 &sdma 23 &sdma 24>; | ||||
| 			dma-names = "tx0", "rx0", "tx1", "rx1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		usb_otg_hs: usb_otg_hs@480ac000 { | ||||
| 			compatible = "ti,omap2-musb"; | ||||
| 			ti,hwmods = "usb_otg_hs"; | ||||
| 			reg = <0x480ac000 0x1000>; | ||||
| 			interrupts = <93>; | ||||
| 		}; | ||||
| 
 | ||||
| 		wd_timer2: wdt@49016000 { | ||||
| 			compatible = "ti,omap2-wdt"; | ||||
| 			ti,hwmods = "wd_timer2"; | ||||
| 			reg = <0x49016000 0x80>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &i2c1 { | ||||
| 	compatible = "ti,omap2430-i2c"; | ||||
| }; | ||||
| 
 | ||||
| &i2c2 { | ||||
| 	compatible = "ti,omap2430-i2c"; | ||||
| }; | ||||
|  | ||||
| @ -215,3 +215,10 @@ | ||||
| &usbhsehci { | ||||
| 	phys = <0 &hsusb2_phy>; | ||||
| }; | ||||
| 
 | ||||
| &vaux2 { | ||||
| 	regulator-name = "usb_1v8"; | ||||
| 	regulator-min-microvolt = <1800000>; | ||||
| 	regulator-max-microvolt = <1800000>; | ||||
| 	regulator-always-on; | ||||
| }; | ||||
|  | ||||
| @ -61,6 +61,14 @@ | ||||
| 		vcc-supply = <&hsusb2_power>; | ||||
| 	}; | ||||
| 
 | ||||
| 	sound { | ||||
| 		compatible = "ti,omap-twl4030"; | ||||
| 		ti,model = "omap3beagle"; | ||||
| 
 | ||||
| 		ti,mcbsp = <&mcbsp2>; | ||||
| 		ti,codec = <&twl_audio>; | ||||
| 	}; | ||||
| 
 | ||||
| 	gpio_keys { | ||||
| 		compatible = "gpio-keys"; | ||||
| 
 | ||||
| @ -120,6 +128,12 @@ | ||||
| 		reg = <0x48>; | ||||
| 		interrupts = <7>; /* SYS_NIRQ cascaded to intc */ | ||||
| 		interrupt-parent = <&intc>; | ||||
| 
 | ||||
| 		twl_audio: audio { | ||||
| 			compatible = "ti,twl4030-audio"; | ||||
| 			codec { | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| @ -178,3 +192,10 @@ | ||||
| 	mode = <3>; | ||||
| 	power = <50>; | ||||
| }; | ||||
| 
 | ||||
| &vaux2 { | ||||
| 	regulator-name = "vdd_ehci"; | ||||
| 	regulator-min-microvolt = <1800000>; | ||||
| 	regulator-max-microvolt = <1800000>; | ||||
| 	regulator-always-on; | ||||
| }; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Device Tree Source for IGEP Technology devices | ||||
|  * Common device tree for IGEP boards based on AM/DM37x | ||||
|  * | ||||
|  * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | ||||
|  * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | ||||
| @ -10,7 +10,7 @@ | ||||
|  */ | ||||
| /dts-v1/; | ||||
| 
 | ||||
| #include "omap34xx.dtsi" | ||||
| #include "omap36xx.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	memory { | ||||
| @ -24,6 +24,25 @@ | ||||
| 		ti,mcbsp = <&mcbsp2>; | ||||
| 		ti,codec = <&twl_audio>; | ||||
| 	}; | ||||
| 
 | ||||
| 	vdd33: regulator-vdd33 { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "vdd33"; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
| 
 | ||||
| 	lbee1usjyc_vmmc: lbee1usjyc_vmmc { | ||||
| 		pinctrl-names = "default"; | ||||
| 		pinctrl-0 = <&lbee1usjyc_pins>; | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "regulator-lbee1usjyc"; | ||||
| 		regulator-min-microvolt = <3300000>; | ||||
| 		regulator-max-microvolt = <3300000>; | ||||
| 		gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;	/* gpio_138 WIFI_PDN */ | ||||
| 		startup-delay-us = <10000>; | ||||
| 		enable-active-high; | ||||
| 		vin-supply = <&vdd33>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &omap3_pmx_core { | ||||
| @ -48,6 +67,15 @@ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	/* WiFi/BT combo */ | ||||
| 	lbee1usjyc_pins: pinmux_lbee1usjyc_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x136 (PIN_OUTPUT | MUX_MODE4)	/* sdmmc2_dat5.gpio_137 */ | ||||
| 			0x138 (PIN_OUTPUT | MUX_MODE4)	/* sdmmc2_dat6.gpio_138 */ | ||||
| 			0x13a (PIN_OUTPUT | MUX_MODE4)	/* sdmmc2_dat7.gpio_139 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	mcbsp2_pins: pinmux_mcbsp2_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x10c (PIN_INPUT | MUX_MODE0)		/* mcbsp2_fsx.mcbsp2_fsx */ | ||||
| @ -65,10 +93,17 @@ | ||||
| 			0x11a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc1_dat1.sdmmc1_dat1 */ | ||||
| 			0x11c (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc1_dat2.sdmmc1_dat2 */ | ||||
| 			0x11e (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc1_dat3.sdmmc1_dat3 */ | ||||
| 			0x120 (PIN_INPUT | MUX_MODE0)		/* sdmmc1_dat4.sdmmc1_dat4 */ | ||||
| 			0x122 (PIN_INPUT | MUX_MODE0)		/* sdmmc1_dat5.sdmmc1_dat5 */ | ||||
| 			0x124 (PIN_INPUT | MUX_MODE0)		/* sdmmc1_dat6.sdmmc1_dat6 */ | ||||
| 			0x126 (PIN_INPUT | MUX_MODE0)		/* sdmmc1_dat7.sdmmc1_dat7 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	mmc2_pins: pinmux_mmc2_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x128 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_clk.sdmmc2_clk */ | ||||
| 			0x12a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_cmd.sdmmc2_cmd */ | ||||
| 			0x12c (PIN_INPUT_PULLUP | MUX_MODE0) 	/* sdmmc2_dat0.sdmmc2_dat0 */ | ||||
| 			0x12e (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat1.sdmmc2_dat1 */ | ||||
| 			0x130 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat2.sdmmc2_dat2 */ | ||||
| 			0x132 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat3.sdmmc2_dat3 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| @ -78,10 +113,33 @@ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	i2c1_pins: pinmux_i2c1_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x18a (PIN_INPUT | MUX_MODE0)   /* i2c1_scl.i2c1_scl */ | ||||
| 			0x18c (PIN_INPUT | MUX_MODE0)   /* i2c1_sda.i2c1_sda */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	i2c2_pins: pinmux_i2c2_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x18e (PIN_INPUT | MUX_MODE0)   /* i2c2_scl.i2c2_scl */ | ||||
| 			0x190 (PIN_INPUT | MUX_MODE0)   /* i2c2_sda.i2c2_sda */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	i2c3_pins: pinmux_i2c3_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x192 (PIN_INPUT | MUX_MODE0)   /* i2c3_scl.i2c3_scl */ | ||||
| 			0x194 (PIN_INPUT | MUX_MODE0)   /* i2c3_sda.i2c3_sda */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	leds_pins: pinmux_leds_pins { }; | ||||
| }; | ||||
| 
 | ||||
| &i2c1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&i2c1_pins>; | ||||
| 	clock-frequency = <2600000>; | ||||
| 
 | ||||
| 	twl: twl@48 { | ||||
| @ -101,9 +159,16 @@ | ||||
| #include "twl4030_omap3.dtsi" | ||||
| 
 | ||||
| &i2c2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&i2c2_pins>; | ||||
| 	clock-frequency = <400000>; | ||||
| }; | ||||
| 
 | ||||
| &i2c3 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&i2c3_pins>; | ||||
| }; | ||||
| 
 | ||||
| &mcbsp2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&mcbsp2_pins>; | ||||
| @ -114,11 +179,15 @@ | ||||
|       pinctrl-0 = <&mmc1_pins>; | ||||
|       vmmc-supply = <&vmmc1>; | ||||
|       vmmc_aux-supply = <&vsim>; | ||||
|       bus-width = <8>; | ||||
|       bus-width = <4>; | ||||
| }; | ||||
| 
 | ||||
| &mmc2 { | ||||
| 	status = "disabled"; | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&mmc2_pins>; | ||||
| 	vmmc-supply = <&lbee1usjyc_vmmc>; | ||||
| 	bus-width = <4>; | ||||
| 	non-removable; | ||||
| }; | ||||
| 
 | ||||
| &mmc3 { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Device Tree Source for IGEPv2 board | ||||
|  * Device Tree Source for IGEPv2 Rev. (TI OMAP AM/DM37x) | ||||
|  * | ||||
|  * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | ||||
|  * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | ||||
| @ -13,7 +13,7 @@ | ||||
| #include "omap-gpmc-smsc911x.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	model = "IGEPv2"; | ||||
| 	model = "IGEPv2 (TI OMAP AM/DM37x)"; | ||||
| 	compatible = "isee,omap3-igep0020", "ti,omap3"; | ||||
| 
 | ||||
| 	leds { | ||||
| @ -67,6 +67,8 @@ | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = < | ||||
| 		&hsusbb1_pins | ||||
| 		&tfp410_pins | ||||
| 		&dss_pins | ||||
| 	>; | ||||
| 
 | ||||
| 	hsusbb1_pins: pinmux_hsusbb1_pins { | ||||
| @ -85,6 +87,45 @@ | ||||
| 			0x5ba (PIN_INPUT_PULLDOWN | MUX_MODE3)	/* etk_d7.hsusb1_data3 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	tfp410_pins: tfp410_dvi_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x196 (PIN_OUTPUT | MUX_MODE4)   /* hdq_sio.gpio_170 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	dss_pins: pinmux_dss_dvi_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x0a4 (PIN_OUTPUT | MUX_MODE0)   /* dss_pclk.dss_pclk */ | ||||
| 			0x0a6 (PIN_OUTPUT | MUX_MODE0)   /* dss_hsync.dss_hsync */ | ||||
| 			0x0a8 (PIN_OUTPUT | MUX_MODE0)   /* dss_vsync.dss_vsync */ | ||||
| 			0x0aa (PIN_OUTPUT | MUX_MODE0)   /* dss_acbias.dss_acbias */ | ||||
| 			0x0ac (PIN_OUTPUT | MUX_MODE0)   /* dss_data0.dss_data0 */ | ||||
| 			0x0ae (PIN_OUTPUT | MUX_MODE0)   /* dss_data1.dss_data1 */ | ||||
| 			0x0b0 (PIN_OUTPUT | MUX_MODE0)   /* dss_data2.dss_data2 */ | ||||
| 			0x0b2 (PIN_OUTPUT | MUX_MODE0)   /* dss_data3.dss_data3 */ | ||||
| 			0x0b4 (PIN_OUTPUT | MUX_MODE0)   /* dss_data4.dss_data4 */ | ||||
| 			0x0b6 (PIN_OUTPUT | MUX_MODE0)   /* dss_data5.dss_data5 */ | ||||
| 			0x0b8 (PIN_OUTPUT | MUX_MODE0)   /* dss_data6.dss_data6 */ | ||||
| 			0x0ba (PIN_OUTPUT | MUX_MODE0)   /* dss_data7.dss_data7 */ | ||||
| 			0x0bc (PIN_OUTPUT | MUX_MODE0)   /* dss_data8.dss_data8 */ | ||||
| 			0x0be (PIN_OUTPUT | MUX_MODE0)   /* dss_data9.dss_data9 */ | ||||
| 			0x0c0 (PIN_OUTPUT | MUX_MODE0)   /* dss_data10.dss_data10 */ | ||||
| 			0x0c2 (PIN_OUTPUT | MUX_MODE0)   /* dss_data11.dss_data11 */ | ||||
| 			0x0c4 (PIN_OUTPUT | MUX_MODE0)   /* dss_data12.dss_data12 */ | ||||
| 			0x0c6 (PIN_OUTPUT | MUX_MODE0)   /* dss_data13.dss_data13 */ | ||||
| 			0x0c8 (PIN_OUTPUT | MUX_MODE0)   /* dss_data14.dss_data14 */ | ||||
| 			0x0ca (PIN_OUTPUT | MUX_MODE0)   /* dss_data15.dss_data15 */ | ||||
| 			0x0cc (PIN_OUTPUT | MUX_MODE0)   /* dss_data16.dss_data16 */ | ||||
| 			0x0ce (PIN_OUTPUT | MUX_MODE0)   /* dss_data17.dss_data17 */ | ||||
| 			0x0d0 (PIN_OUTPUT | MUX_MODE0)   /* dss_data18.dss_data18 */ | ||||
| 			0x0d2 (PIN_OUTPUT | MUX_MODE0)   /* dss_data19.dss_data19 */ | ||||
| 			0x0d4 (PIN_OUTPUT | MUX_MODE0)   /* dss_data20.dss_data20 */ | ||||
| 			0x0d6 (PIN_OUTPUT | MUX_MODE0)   /* dss_data21.dss_data21 */ | ||||
| 			0x0d8 (PIN_OUTPUT | MUX_MODE0)   /* dss_data22.dss_data22 */ | ||||
| 			0x0da (PIN_OUTPUT | MUX_MODE0)   /* dss_data23.dss_data23 */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &leds_pins { | ||||
| @ -174,3 +215,8 @@ | ||||
| &usbhsehci { | ||||
| 	phys = <&hsusb1_phy>; | ||||
| }; | ||||
| 
 | ||||
| &vpll2 { | ||||
|         /* Needed for DSS */ | ||||
|         regulator-name = "vdds_dsi"; | ||||
| }; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Device Tree Source for IGEP COM Module | ||||
|  * Device Tree Source for IGEP COM MODULE (TI OMAP AM/DM37x) | ||||
|  * | ||||
|  * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | ||||
|  * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | ||||
| @ -12,7 +12,7 @@ | ||||
| #include "omap3-igep.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	model = "IGEP COM Module"; | ||||
| 	model = "IGEP COM MODULE (TI OMAP AM/DM37x)"; | ||||
| 	compatible = "isee,omap3-igep0030", "ti,omap3"; | ||||
| 
 | ||||
| 	leds { | ||||
|  | ||||
| @ -125,6 +125,21 @@ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	mmc2_pins: pinmux_mmc2_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x128 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_clk */ | ||||
| 			0x12a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_cmd */ | ||||
| 			0x12c (PIN_INPUT_PULLUP | MUX_MODE0) 	/* sdmmc2_dat0 */ | ||||
| 			0x12e (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat1 */ | ||||
| 			0x130 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat2 */ | ||||
| 			0x132 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat3 */ | ||||
| 			0x134 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat4 */ | ||||
| 			0x136 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat5 */ | ||||
| 			0x138 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat6 */ | ||||
| 			0x13a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc2_dat7 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	display_pins: pinmux_display_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x0d4 (PIN_OUTPUT | MUX_MODE4)		/* RX51_LCD_RESET_GPIO */ | ||||
| @ -358,8 +373,14 @@ | ||||
| 	cd-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* 160 */ | ||||
| }; | ||||
| 
 | ||||
| /* most boards use vaux3, only some old versions use vmmc2 instead */ | ||||
| &mmc2 { | ||||
| 	status = "disabled"; | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&mmc2_pins>; | ||||
| 	vmmc-supply = <&vaux3>; | ||||
| 	vmmc_aux-supply = <&vsim>; | ||||
| 	bus-width = <8>; | ||||
| 	non-removable; | ||||
| }; | ||||
| 
 | ||||
| &mmc3 { | ||||
|  | ||||
| @ -82,6 +82,13 @@ | ||||
| 		ranges; | ||||
| 		ti,hwmods = "l3_main"; | ||||
| 
 | ||||
| 		aes: aes@480c5000 { | ||||
| 			compatible = "ti,omap3-aes"; | ||||
| 			ti,hwmods = "aes"; | ||||
| 			reg = <0x480c5000 0x50>; | ||||
| 			interrupts = <0>; | ||||
| 		}; | ||||
| 
 | ||||
| 		counter32k: counter@48320000 { | ||||
| 			compatible = "ti,omap-counter32k"; | ||||
| 			reg = <0x48320000 0x20>; | ||||
| @ -260,6 +267,13 @@ | ||||
| 			ti,hwmods = "i2c3"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mailbox: mailbox@48094000 { | ||||
| 			compatible = "ti,omap3-mailbox"; | ||||
| 			ti,hwmods = "mailbox"; | ||||
| 			reg = <0x48094000 0x200>; | ||||
| 			interrupts = <26>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mcspi1: spi@48098000 { | ||||
| 			compatible = "ti,omap2-mcspi"; | ||||
| 			reg = <0x48098000 0x100>; | ||||
| @ -357,6 +371,13 @@ | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mmu_isp: mmu@480bd400 { | ||||
| 			compatible = "ti,omap3-mmu-isp"; | ||||
| 			ti,hwmods = "mmu_isp"; | ||||
| 			reg = <0x480bd400 0x80>; | ||||
| 			interrupts = <8>; | ||||
| 		}; | ||||
| 
 | ||||
| 		wdt2: wdt@48314000 { | ||||
| 			compatible = "ti,omap3-wdt"; | ||||
| 			reg = <0x48314000 0x80>; | ||||
| @ -442,6 +463,27 @@ | ||||
| 			dma-names = "tx", "rx"; | ||||
| 		}; | ||||
| 
 | ||||
| 		sham: sham@480c3000 { | ||||
| 			compatible = "ti,omap3-sham"; | ||||
| 			ti,hwmods = "sham"; | ||||
| 			reg = <0x480c3000 0x64>; | ||||
| 			interrupts = <49>; | ||||
| 		}; | ||||
| 
 | ||||
| 		smartreflex_core: smartreflex@480cb000 { | ||||
| 			compatible = "ti,omap3-smartreflex-core"; | ||||
| 			ti,hwmods = "smartreflex_core"; | ||||
| 			reg = <0x480cb000 0x400>; | ||||
| 			interrupts = <19>; | ||||
| 		}; | ||||
| 
 | ||||
| 		smartreflex_mpu_iva: smartreflex@480c9000 { | ||||
| 			compatible = "ti,omap3-smartreflex-iva"; | ||||
| 			ti,hwmods = "smartreflex_mpu_iva"; | ||||
| 			reg = <0x480c9000 0x400>; | ||||
| 			interrupts = <18>; | ||||
| 		}; | ||||
| 
 | ||||
| 		timer1: timer@48318000 { | ||||
| 			compatible = "ti,omap3430-timer"; | ||||
| 			reg = <0x48318000 0x400>; | ||||
|  | ||||
| @ -246,15 +246,6 @@ | ||||
| 			0xf0 (PIN_INPUT_PULLUP | MUX_MODE0)	/* i2c4_sda */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &omap4_pmx_wkup { | ||||
| 	led_wkgpio_pins: pinmux_leds_wkpins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x1a (PIN_OUTPUT | MUX_MODE3)	/* gpio_wk7 */ | ||||
| 			0x1c (PIN_OUTPUT | MUX_MODE3)	/* gpio_wk8 */ | ||||
| 		>; | ||||
| 	}; | ||||
| 
 | ||||
| 	/* | ||||
| 	 * wl12xx GPIO outputs for WLAN_EN, BT_EN, FM_EN, BT_WAKEUP | ||||
| @ -274,7 +265,7 @@ | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x38 (PIN_INPUT | MUX_MODE3)		/* gpmc_ncs2.gpio_52 */ | ||||
| 			0x3a (PIN_INPUT | MUX_MODE3)		/* gpmc_ncs3.gpio_53 */ | ||||
| 			0x108 (PIN_OUTPUT | MUX_MODE0)		/* sdmmc5_clk.sdmmc5_clk */ | ||||
| 			0x108 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_clk.sdmmc5_clk */ | ||||
| 			0x10a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_cmd.sdmmc5_cmd */ | ||||
| 			0x10c (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat0.sdmmc5_dat0 */ | ||||
| 			0x10e (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat1.sdmmc5_dat1 */ | ||||
| @ -284,6 +275,15 @@ | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &omap4_pmx_wkup { | ||||
| 	led_wkgpio_pins: pinmux_leds_wkpins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x1a (PIN_OUTPUT | MUX_MODE3)	/* gpio_wk7 */ | ||||
| 			0x1c (PIN_OUTPUT | MUX_MODE3)	/* gpio_wk8 */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &i2c1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&i2c1_pins>; | ||||
|  | ||||
| @ -300,12 +300,12 @@ | ||||
| 	wl12xx_pins: pinmux_wl12xx_pins { | ||||
| 		pinctrl-single,pins = < | ||||
| 			0x3a (PIN_INPUT | MUX_MODE3)		/* gpmc_ncs3.gpio_53 */ | ||||
| 			0x108 (PIN_OUTPUT | MUX_MODE3)		/* sdmmc5_clk.sdmmc5_clk */ | ||||
| 			0x10a (PIN_INPUT_PULLUP | MUX_MODE3)	/* sdmmc5_cmd.sdmmc5_cmd */ | ||||
| 			0x10c (PIN_INPUT_PULLUP | MUX_MODE3)	/* sdmmc5_dat0.sdmmc5_dat0 */ | ||||
| 			0x10e (PIN_INPUT_PULLUP | MUX_MODE3)	/* sdmmc5_dat1.sdmmc5_dat1 */ | ||||
| 			0x110 (PIN_INPUT_PULLUP | MUX_MODE3)	/* sdmmc5_dat2.sdmmc5_dat2 */ | ||||
| 			0x112 (PIN_INPUT_PULLUP | MUX_MODE3)	/* sdmmc5_dat3.sdmmc5_dat3 */ | ||||
| 			0x108 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_clk.sdmmc5_clk */ | ||||
| 			0x10a (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_cmd.sdmmc5_cmd */ | ||||
| 			0x10c (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat0.sdmmc5_dat0 */ | ||||
| 			0x10e (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat1.sdmmc5_dat1 */ | ||||
| 			0x110 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat2.sdmmc5_dat2 */ | ||||
| 			0x112 (PIN_INPUT_PULLUP | MUX_MODE0)	/* sdmmc5_dat3.sdmmc5_dat3 */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| @ -245,14 +245,14 @@ | ||||
| 
 | ||||
| 					mpu_periph_clk: mpu_periph_clk { | ||||
| 						#clock-cells = <0>; | ||||
| 						compatible = "altr,socfpga-gate-clk"; | ||||
| 						compatible = "altr,socfpga-perip-clk"; | ||||
| 						clocks = <&mpuclk>; | ||||
| 						fixed-divider = <4>; | ||||
| 					}; | ||||
| 
 | ||||
| 					mpu_l2_ram_clk: mpu_l2_ram_clk { | ||||
| 						#clock-cells = <0>; | ||||
| 						compatible = "altr,socfpga-gate-clk"; | ||||
| 						compatible = "altr,socfpga-perip-clk"; | ||||
| 						clocks = <&mpuclk>; | ||||
| 						fixed-divider = <2>; | ||||
| 					}; | ||||
| @ -266,8 +266,9 @@ | ||||
| 
 | ||||
| 					l3_main_clk: l3_main_clk { | ||||
| 						#clock-cells = <0>; | ||||
| 						compatible = "altr,socfpga-gate-clk"; | ||||
| 						compatible = "altr,socfpga-perip-clk"; | ||||
| 						clocks = <&mainclk>; | ||||
| 						fixed-divider = <1>; | ||||
| 					}; | ||||
| 
 | ||||
| 					l3_mp_clk: l3_mp_clk { | ||||
|  | ||||
| @ -69,6 +69,7 @@ CONFIG_KS8851=y | ||||
| CONFIG_SMSC911X=y | ||||
| CONFIG_STMMAC_ETH=y | ||||
| CONFIG_MDIO_SUN4I=y | ||||
| CONFIG_TI_CPSW=y | ||||
| CONFIG_KEYBOARD_SPEAR=y | ||||
| CONFIG_SERIO_AMBAKMI=y | ||||
| CONFIG_SERIAL_8250=y | ||||
| @ -133,12 +134,14 @@ CONFIG_USB_GPIO_VBUS=y | ||||
| CONFIG_USB_ISP1301=y | ||||
| CONFIG_USB_MXS_PHY=y | ||||
| CONFIG_MMC=y | ||||
| CONFIG_MMC_BLOCK_MINORS=16 | ||||
| CONFIG_MMC_ARMMMCI=y | ||||
| CONFIG_MMC_SDHCI=y | ||||
| CONFIG_MMC_SDHCI_PLTFM=y | ||||
| CONFIG_MMC_SDHCI_ESDHC_IMX=y | ||||
| CONFIG_MMC_SDHCI_TEGRA=y | ||||
| CONFIG_MMC_SDHCI_SPEAR=y | ||||
| CONFIG_MMC_SDHCI_BCM_KONA=y | ||||
| CONFIG_MMC_OMAP=y | ||||
| CONFIG_MMC_OMAP_HS=y | ||||
| CONFIG_EDAC=y | ||||
|  | ||||
| @ -173,6 +173,7 @@ CONFIG_MFD_PALMAS=y | ||||
| CONFIG_MFD_TPS65217=y | ||||
| CONFIG_MFD_TPS65910=y | ||||
| CONFIG_TWL6040_CORE=y | ||||
| CONFIG_REGULATOR_FIXED_VOLTAGE=y | ||||
| CONFIG_REGULATOR_PALMAS=y | ||||
| CONFIG_REGULATOR_TPS65023=y | ||||
| CONFIG_REGULATOR_TPS6507X=y | ||||
|  | ||||
| @ -12,6 +12,9 @@ CONFIG_NET=y | ||||
| CONFIG_PACKET=y | ||||
| CONFIG_UNIX=y | ||||
| CONFIG_INET=y | ||||
| CONFIG_IP_PNP=y | ||||
| CONFIG_IP_PNP_DHCP=y | ||||
| CONFIG_IP_PNP_BOOTP=y | ||||
| # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||||
| # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||||
| # CONFIG_INET_XFRM_MODE_BEET is not set | ||||
| @ -58,4 +61,8 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||||
| CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | ||||
| CONFIG_COMMON_CLK_DEBUG=y | ||||
| # CONFIG_IOMMU_SUPPORT is not set | ||||
| CONFIG_TMPFS=y | ||||
| CONFIG_NFS_FS=y | ||||
| CONFIG_ROOT_NFS=y | ||||
| CONFIG_NLS=y | ||||
| CONFIG_PRINTK_TIME=y | ||||
|  | ||||
| @ -22,6 +22,7 @@ CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8" | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_IDLE=y | ||||
| CONFIG_ARM_U8500_CPUIDLE=y | ||||
| CONFIG_VFP=y | ||||
| CONFIG_NEON=y | ||||
| CONFIG_PM_RUNTIME=y | ||||
| @ -109,6 +110,8 @@ CONFIG_EXT2_FS_SECURITY=y | ||||
| CONFIG_EXT3_FS=y | ||||
| CONFIG_EXT4_FS=y | ||||
| CONFIG_VFAT_FS=y | ||||
| CONFIG_DEVTMPFS=y | ||||
| CONFIG_DEVTMPFS_MOUNT=y | ||||
| CONFIG_TMPFS=y | ||||
| CONFIG_TMPFS_POSIX_ACL=y | ||||
| # CONFIG_MISC_FILESYSTEMS is not set | ||||
|  | ||||
| @ -61,7 +61,7 @@ extern void __pgd_error(const char *file, int line, pgd_t); | ||||
|  * mapping to be mapped at.  This is particularly important for | ||||
|  * non-high vector CPUs. | ||||
|  */ | ||||
| #define FIRST_USER_ADDRESS	PAGE_SIZE | ||||
| #define FIRST_USER_ADDRESS	(PAGE_SIZE * 2) | ||||
| 
 | ||||
| /*
 | ||||
|  * Use TASK_SIZE as the ceiling argument for free_pgtables() and | ||||
|  | ||||
| @ -14,11 +14,12 @@ | ||||
| #include <asm/pgalloc.h> | ||||
| #include <asm/mmu_context.h> | ||||
| #include <asm/cacheflush.h> | ||||
| #include <asm/fncpy.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/smp_plat.h> | ||||
| #include <asm/system_misc.h> | ||||
| 
 | ||||
| extern const unsigned char relocate_new_kernel[]; | ||||
| extern void relocate_new_kernel(void); | ||||
| extern const unsigned int relocate_new_kernel_size; | ||||
| 
 | ||||
| extern unsigned long kexec_start_address; | ||||
| @ -142,6 +143,8 @@ void machine_kexec(struct kimage *image) | ||||
| { | ||||
| 	unsigned long page_list; | ||||
| 	unsigned long reboot_code_buffer_phys; | ||||
| 	unsigned long reboot_entry = (unsigned long)relocate_new_kernel; | ||||
| 	unsigned long reboot_entry_phys; | ||||
| 	void *reboot_code_buffer; | ||||
| 
 | ||||
| 	/*
 | ||||
| @ -168,16 +171,16 @@ void machine_kexec(struct kimage *image) | ||||
| 
 | ||||
| 
 | ||||
| 	/* copy our kernel relocation code to the control code page */ | ||||
| 	memcpy(reboot_code_buffer, | ||||
| 	       relocate_new_kernel, relocate_new_kernel_size); | ||||
| 	reboot_entry = fncpy(reboot_code_buffer, | ||||
| 			     reboot_entry, | ||||
| 			     relocate_new_kernel_size); | ||||
| 	reboot_entry_phys = (unsigned long)reboot_entry + | ||||
| 		(reboot_code_buffer_phys - (unsigned long)reboot_code_buffer); | ||||
| 
 | ||||
| 
 | ||||
| 	flush_icache_range((unsigned long) reboot_code_buffer, | ||||
| 			   (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); | ||||
| 	printk(KERN_INFO "Bye!\n"); | ||||
| 
 | ||||
| 	if (kexec_reinit) | ||||
| 		kexec_reinit(); | ||||
| 
 | ||||
| 	soft_restart(reboot_code_buffer_phys); | ||||
| 	soft_restart(reboot_entry_phys); | ||||
| } | ||||
|  | ||||
| @ -2,10 +2,12 @@ | ||||
|  * relocate_kernel.S - put the kernel image in place to boot | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/linkage.h> | ||||
| #include <asm/kexec.h> | ||||
| 
 | ||||
| 	.globl relocate_new_kernel
 | ||||
| relocate_new_kernel: | ||||
| 	.align	3	/* not needed for this code, but keeps fncpy() happy */ | ||||
| 
 | ||||
| ENTRY(relocate_new_kernel) | ||||
| 
 | ||||
| 	ldr	r0,kexec_indirection_page | ||||
| 	ldr	r1,kexec_start_address | ||||
| @ -79,6 +81,8 @@ kexec_mach_type: | ||||
| kexec_boot_atags: | ||||
| 	.long	0x0
 | ||||
| 
 | ||||
| ENDPROC(relocate_new_kernel) | ||||
| 
 | ||||
| relocate_new_kernel_end: | ||||
| 
 | ||||
| 	.globl relocate_new_kernel_size
 | ||||
|  | ||||
| @ -30,6 +30,27 @@ | ||||
|  * snippets. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * In CPU_THUMBONLY case kernel arm opcodes are not allowed. | ||||
|  * Note in this case codes skips those instructions but it uses .org | ||||
|  * directive to keep correct layout of sigreturn_codes array. | ||||
|  */ | ||||
| #ifndef CONFIG_CPU_THUMBONLY | ||||
| #define ARM_OK(code...)	code | ||||
| #else | ||||
| #define ARM_OK(code...) | ||||
| #endif | ||||
| 
 | ||||
| 	.macro arm_slot n | ||||
| 	.org	sigreturn_codes + 12 * (\n) | ||||
| ARM_OK(	.arm	) | ||||
| 	.endm | ||||
| 
 | ||||
| 	.macro thumb_slot n | ||||
| 	.org	sigreturn_codes + 12 * (\n) + 8 | ||||
| 	.thumb | ||||
| 	.endm | ||||
| 
 | ||||
| #if __LINUX_ARM_ARCH__ <= 4 | ||||
| 	/* | ||||
| 	 * Note we manually set minimally required arch that supports | ||||
| @ -45,26 +66,27 @@ | ||||
| 	.global sigreturn_codes
 | ||||
| 	.type	sigreturn_codes, #object | ||||
| 
 | ||||
| 	.arm | ||||
| 	.align | ||||
| 
 | ||||
| sigreturn_codes: | ||||
| 
 | ||||
| 	/* ARM sigreturn syscall code snippet */ | ||||
| 	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | ||||
| 	swi	#(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE) | ||||
| 	arm_slot 0 | ||||
| ARM_OK(	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)	) | ||||
| ARM_OK(	swi	#(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)	) | ||||
| 
 | ||||
| 	/* Thumb sigreturn syscall code snippet */ | ||||
| 	.thumb | ||||
| 	thumb_slot 0 | ||||
| 	movs	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | ||||
| 	swi	#0 | ||||
| 
 | ||||
| 	/* ARM sigreturn_rt syscall code snippet */ | ||||
| 	.arm | ||||
| 	mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | ||||
| 	swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE) | ||||
| 	arm_slot 1 | ||||
| ARM_OK(	mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)	) | ||||
| ARM_OK(	swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)	) | ||||
| 
 | ||||
| 	/* Thumb sigreturn_rt syscall code snippet */ | ||||
| 	.thumb | ||||
| 	thumb_slot 1 | ||||
| 	movs	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | ||||
| 	swi	#0 | ||||
| 
 | ||||
| @ -74,7 +96,7 @@ sigreturn_codes: | ||||
| 	 * it is thumb case or not, so we need additional | ||||
| 	 * word after real last entry. | ||||
| 	 */ | ||||
| 	.arm | ||||
| 	arm_slot 2 | ||||
| 	.space	4
 | ||||
| 
 | ||||
| 	.size	sigreturn_codes, . - sigreturn_codes | ||||
|  | ||||
| @ -40,6 +40,7 @@ ENTRY(__loop_const_udelay)			@ 0 <= r0 <= 0x7fffff06 | ||||
| /* | ||||
|  * loops = r0 * HZ * loops_per_jiffy / 1000000 | ||||
|  */ | ||||
| 		.align 3
 | ||||
| 
 | ||||
| @ Delay routine
 | ||||
| ENTRY(__loop_delay) | ||||
|  | ||||
| @ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) | ||||
| static struct clock_event_device clkevt = { | ||||
| 	.name		= "at91_tick", | ||||
| 	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | ||||
| 	.shift		= 32, | ||||
| 	.rating		= 150, | ||||
| 	.set_next_event	= clkevt32k_next_event, | ||||
| 	.set_mode	= clkevt32k_mode, | ||||
| @ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void) | ||||
| 	at91_st_write(AT91_ST_RTMR, 1); | ||||
| 
 | ||||
| 	/* Setup timer clockevent, with minimum of two ticks (important!!) */ | ||||
| 	clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift); | ||||
| 	clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt); | ||||
| 	clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1; | ||||
| 	clkevt.cpumask = cpumask_of(0); | ||||
| 	clockevents_register_device(&clkevt); | ||||
| 	clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK, | ||||
| 					2, AT91_ST_ALMV); | ||||
| 
 | ||||
| 	/* register clocksource */ | ||||
| 	clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); | ||||
|  | ||||
| @ -16,7 +16,11 @@ | ||||
| #include <mach/at91_ramc.h> | ||||
| #include <mach/at91rm9200_sdramc.h> | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| extern void at91_pm_set_standby(void (*at91_standby)(void)); | ||||
| #else | ||||
| static inline void at91_pm_set_standby(void (*at91_standby)(void)) { } | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * The AT91RM9200 goes into self-refresh mode with this command, and will | ||||
|  | ||||
| @ -95,19 +95,19 @@ static struct clk twi0_clk = { | ||||
| 	.name		= "twi0_clk", | ||||
| 	.pid		= SAMA5D3_ID_TWI0, | ||||
| 	.type		= CLK_TYPE_PERIPHERAL, | ||||
| 	.div		= AT91_PMC_PCR_DIV2, | ||||
| 	.div		= AT91_PMC_PCR_DIV8, | ||||
| }; | ||||
| static struct clk twi1_clk = { | ||||
| 	.name		= "twi1_clk", | ||||
| 	.pid		= SAMA5D3_ID_TWI1, | ||||
| 	.type		= CLK_TYPE_PERIPHERAL, | ||||
| 	.div		= AT91_PMC_PCR_DIV2, | ||||
| 	.div		= AT91_PMC_PCR_DIV8, | ||||
| }; | ||||
| static struct clk twi2_clk = { | ||||
| 	.name		= "twi2_clk", | ||||
| 	.pid		= SAMA5D3_ID_TWI2, | ||||
| 	.type		= CLK_TYPE_PERIPHERAL, | ||||
| 	.div		= AT91_PMC_PCR_DIV2, | ||||
| 	.div		= AT91_PMC_PCR_DIV8, | ||||
| }; | ||||
| static struct clk mmc0_clk = { | ||||
| 	.name		= "mci0_clk", | ||||
|  | ||||
| @ -15,6 +15,7 @@ | ||||
| #include <linux/init.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <video/vga.h> | ||||
| 
 | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/page.h> | ||||
| @ -196,6 +197,8 @@ void __init footbridge_map_io(void) | ||||
| 		iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); | ||||
| 		pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO)); | ||||
| 	} | ||||
| 
 | ||||
| 	vga_base = PCIMEM_BASE; | ||||
| } | ||||
| 
 | ||||
| void footbridge_restart(enum reboot_mode mode, const char *cmd) | ||||
|  | ||||
| @ -18,7 +18,6 @@ | ||||
| #include <linux/irq.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <video/vga.h> | ||||
| 
 | ||||
| #include <asm/irq.h> | ||||
| #include <asm/mach/pci.h> | ||||
| @ -291,7 +290,6 @@ void __init dc21285_preinit(void) | ||||
| 	int cfn_mode; | ||||
| 
 | ||||
| 	pcibios_min_mem = 0x81000000; | ||||
| 	vga_base = PCIMEM_BASE; | ||||
| 
 | ||||
| 	mem_size = (unsigned int)high_memory - PAGE_OFFSET; | ||||
| 	for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1) | ||||
|  | ||||
| @ -30,21 +30,24 @@ static const struct { | ||||
| 	const char *name; | ||||
| 	const char *trigger; | ||||
| } ebsa285_leds[] = { | ||||
| 	{ "ebsa285:amber", "heartbeat", }, | ||||
| 	{ "ebsa285:green", "cpu0", }, | ||||
| 	{ "ebsa285:amber", "cpu0", }, | ||||
| 	{ "ebsa285:green", "heartbeat", }, | ||||
| 	{ "ebsa285:red",}, | ||||
| }; | ||||
| 
 | ||||
| static unsigned char hw_led_state; | ||||
| 
 | ||||
| static void ebsa285_led_set(struct led_classdev *cdev, | ||||
| 		enum led_brightness b) | ||||
| { | ||||
| 	struct ebsa285_led *led = container_of(cdev, | ||||
| 			struct ebsa285_led, cdev); | ||||
| 
 | ||||
| 	if (b != LED_OFF) | ||||
| 		*XBUS_LEDS |= led->mask; | ||||
| 	if (b == LED_OFF) | ||||
| 		hw_led_state |= led->mask; | ||||
| 	else | ||||
| 		*XBUS_LEDS &= ~led->mask; | ||||
| 		hw_led_state &= ~led->mask; | ||||
| 	*XBUS_LEDS = hw_led_state; | ||||
| } | ||||
| 
 | ||||
| static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) | ||||
| @ -52,18 +55,19 @@ static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) | ||||
| 	struct ebsa285_led *led = container_of(cdev, | ||||
| 			struct ebsa285_led, cdev); | ||||
| 
 | ||||
| 	return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF; | ||||
| 	return hw_led_state & led->mask ? LED_OFF : LED_FULL; | ||||
| } | ||||
| 
 | ||||
| static int __init ebsa285_leds_init(void) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (machine_is_ebsa285()) | ||||
| 	if (!machine_is_ebsa285()) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* 3 LEDS All ON */ | ||||
| 	*XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; | ||||
| 	/* 3 LEDS all off */ | ||||
| 	hw_led_state = XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; | ||||
| 	*XBUS_LEDS = hw_led_state; | ||||
| 
 | ||||
| 	for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) { | ||||
| 		struct ebsa285_led *led; | ||||
|  | ||||
| @ -19,11 +19,11 @@ secure-common				= omap-smc.o omap-secure.o | ||||
| 
 | ||||
| obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) | ||||
| obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_ARCH_OMAP4) += $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common) | ||||
| obj-$(CONFIG_SOC_OMAP5)	 += prm44xx.o $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_SOC_OMAP5)	 += $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_SOC_DRA7XX) += prm44xx.o $(hwmod-common) $(secure-common) | ||||
| obj-$(CONFIG_SOC_DRA7XX) += $(hwmod-common) $(secure-common) | ||||
| 
 | ||||
| ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) | ||||
| obj-y += mcbsp.o | ||||
|  | ||||
| @ -299,7 +299,6 @@ struct omap_sdrc_params; | ||||
| extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, | ||||
| 				      struct omap_sdrc_params *sdrc_cs1); | ||||
| struct omap2_hsmmc_info; | ||||
| extern int omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers); | ||||
| extern void omap_reserve(void); | ||||
| 
 | ||||
| struct omap_hwmod; | ||||
|  | ||||
| @ -32,7 +32,6 @@ | ||||
| 
 | ||||
| #include "soc.h" | ||||
| #include "iomap.h" | ||||
| #include "mux.h" | ||||
| #include "control.h" | ||||
| #include "display.h" | ||||
| #include "prm.h" | ||||
| @ -102,90 +101,13 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initconst = { | ||||
| 	{ "dss_hdmi", "omapdss_hdmi", -1 }, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap4_tpd12s015_mux_pads(void) | ||||
| { | ||||
| 	omap_mux_init_signal("hdmi_cec", | ||||
| 			OMAP_PIN_INPUT_PULLUP); | ||||
| 	omap_mux_init_signal("hdmi_ddc_scl", | ||||
| 			OMAP_PIN_INPUT_PULLUP); | ||||
| 	omap_mux_init_signal("hdmi_ddc_sda", | ||||
| 			OMAP_PIN_INPUT_PULLUP); | ||||
| } | ||||
| 
 | ||||
| static void __init omap4_hdmi_mux_pads(enum omap_hdmi_flags flags) | ||||
| { | ||||
| 	u32 reg; | ||||
| 	u16 control_i2c_1; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * CONTROL_I2C_1: HDMI_DDC_SDA_PULLUPRESX (bit 28) and | ||||
| 	 * HDMI_DDC_SCL_PULLUPRESX (bit 24) are set to disable | ||||
| 	 * internal pull up resistor. | ||||
| 	 */ | ||||
| 	if (flags & OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP) { | ||||
| 		control_i2c_1 = OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_1; | ||||
| 		reg = omap4_ctrl_pad_readl(control_i2c_1); | ||||
| 		reg |= (OMAP4_HDMI_DDC_SDA_PULLUPRESX_MASK | | ||||
| 			OMAP4_HDMI_DDC_SCL_PULLUPRESX_MASK); | ||||
| 			omap4_ctrl_pad_writel(reg, control_i2c_1); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) | ||||
| { | ||||
| 	u32 enable_mask, enable_shift; | ||||
| 	u32 pipd_mask, pipd_shift; | ||||
| 	u32 reg; | ||||
| 
 | ||||
| 	if (dsi_id == 0) { | ||||
| 		enable_mask = OMAP4_DSI1_LANEENABLE_MASK; | ||||
| 		enable_shift = OMAP4_DSI1_LANEENABLE_SHIFT; | ||||
| 		pipd_mask = OMAP4_DSI1_PIPD_MASK; | ||||
| 		pipd_shift = OMAP4_DSI1_PIPD_SHIFT; | ||||
| 	} else if (dsi_id == 1) { | ||||
| 		enable_mask = OMAP4_DSI2_LANEENABLE_MASK; | ||||
| 		enable_shift = OMAP4_DSI2_LANEENABLE_SHIFT; | ||||
| 		pipd_mask = OMAP4_DSI2_PIPD_MASK; | ||||
| 		pipd_shift = OMAP4_DSI2_PIPD_SHIFT; | ||||
| 	} else { | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	reg = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); | ||||
| 
 | ||||
| 	reg &= ~enable_mask; | ||||
| 	reg &= ~pipd_mask; | ||||
| 
 | ||||
| 	reg |= (lanes << enable_shift) & enable_mask; | ||||
| 	reg |= (lanes << pipd_shift) & pipd_mask; | ||||
| 
 | ||||
| 	omap4_ctrl_pad_writel(reg, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int __init omap_hdmi_init(enum omap_hdmi_flags flags) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) { | ||||
| 		omap4_hdmi_mux_pads(flags); | ||||
| 		omap4_tpd12s015_mux_pads(); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) | ||||
| 		return omap4_dsi_mux_pads(dsi_id, lane_mask); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) | ||||
| 		omap4_dsi_mux_pads(dsi_id, 0); | ||||
| } | ||||
| 
 | ||||
| static int omap_dss_set_min_bus_tput(struct device *dev, unsigned long tput) | ||||
|  | ||||
| @ -223,7 +223,7 @@ void __init omap_4430sdp_display_init_of(void) | ||||
| static struct connector_dvi_platform_data omap3_igep2_dvi_connector_pdata = { | ||||
| 	.name                   = "dvi", | ||||
| 	.source                 = "tfp410.0", | ||||
| 	.i2c_bus_num            = 3, | ||||
| 	.i2c_bus_num            = 2, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device omap3_igep2_dvi_connector_device = { | ||||
|  | ||||
| @ -1501,6 +1501,22 @@ static int gpmc_probe_generic_child(struct platform_device *pdev, | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * For some GPMC devices we still need to rely on the bootloader | ||||
| 	 * timings because the devices can be connected via FPGA. So far | ||||
| 	 * the list is smc91x on the omap2 SDP boards, and 8250 on zooms. | ||||
| 	 * REVISIT: Add timing support from slls644g.pdf and from the | ||||
| 	 * lan91c96 manual. | ||||
| 	 */ | ||||
| 	if (of_device_is_compatible(child, "ns16550a") || | ||||
| 	    of_device_is_compatible(child, "smsc,lan91c94") || | ||||
| 	    of_device_is_compatible(child, "smsc,lan91c111")) { | ||||
| 		dev_warn(&pdev->dev, | ||||
| 			 "%s using bootloader timings on CS%d\n", | ||||
| 			 child->name, cs); | ||||
| 		goto no_timings; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * FIXME: gpmc_cs_request() will map the CS to an arbitary | ||||
| 	 * location in the gpmc address space. When booting with | ||||
| @ -1529,6 +1545,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev, | ||||
| 	gpmc_read_timings_dt(child, &gpmc_t); | ||||
| 	gpmc_cs_set_timings(cs, &gpmc_t); | ||||
| 
 | ||||
| no_timings: | ||||
| 	if (of_platform_device_create(child, NULL, &pdev->dev)) | ||||
| 		return 0; | ||||
| 
 | ||||
| @ -1541,42 +1558,6 @@ err: | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * REVISIT: Add timing support from slls644g.pdf | ||||
|  */ | ||||
| static int gpmc_probe_8250(struct platform_device *pdev, | ||||
| 				struct device_node *child) | ||||
| { | ||||
| 	struct resource res; | ||||
| 	unsigned long base; | ||||
| 	int ret, cs; | ||||
| 
 | ||||
| 	if (of_property_read_u32(child, "reg", &cs) < 0) { | ||||
| 		dev_err(&pdev->dev, "%s has no 'reg' property\n", | ||||
| 			child->full_name); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	if (of_address_to_resource(child, 0, &res) < 0) { | ||||
| 		dev_err(&pdev->dev, "%s has malformed 'reg' property\n", | ||||
| 			child->full_name); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = gpmc_cs_request(cs, resource_size(&res), &base); | ||||
| 	if (ret < 0) { | ||||
| 		dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs); | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	if (of_platform_device_create(child, NULL, &pdev->dev)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name); | ||||
| 
 | ||||
| 	return -ENODEV; | ||||
| } | ||||
| 
 | ||||
| static int gpmc_probe_dt(struct platform_device *pdev) | ||||
| { | ||||
| 	int ret; | ||||
| @ -1618,10 +1599,9 @@ static int gpmc_probe_dt(struct platform_device *pdev) | ||||
| 		else if (of_node_cmp(child->name, "onenand") == 0) | ||||
| 			ret = gpmc_probe_onenand_child(pdev, child); | ||||
| 		else if (of_node_cmp(child->name, "ethernet") == 0 || | ||||
| 			 of_node_cmp(child->name, "nor") == 0) | ||||
| 			 of_node_cmp(child->name, "nor") == 0 || | ||||
| 			 of_node_cmp(child->name, "uart") == 0) | ||||
| 			ret = gpmc_probe_generic_child(pdev, child); | ||||
| 		else if (of_node_cmp(child->name, "8250") == 0) | ||||
| 			ret = gpmc_probe_8250(pdev, child); | ||||
| 
 | ||||
| 		if (WARN(ret < 0, "%s: probing gpmc child %s failed\n", | ||||
| 			 __func__, child->full_name)) | ||||
|  | ||||
| @ -76,6 +76,13 @@ static inline void omap_barrier_reserve_memblock(void) | ||||
| { } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER | ||||
| void set_cntfreq(void); | ||||
| #else | ||||
| static inline void set_cntfreq(void) | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __ASSEMBLER__ */ | ||||
| #endif /* OMAP_ARCH_OMAP_SECURE_H */ | ||||
|  | ||||
| @ -35,7 +35,6 @@ | ||||
| #include "iomap.h" | ||||
| #include "common.h" | ||||
| #include "mmc.h" | ||||
| #include "hsmmc.h" | ||||
| #include "prminst44xx.h" | ||||
| #include "prcm_mpu44xx.h" | ||||
| #include "omap4-sar-layout.h" | ||||
| @ -284,59 +283,3 @@ skip_errata_init: | ||||
| 	omap_wakeupgen_init(); | ||||
| 	irqchip_init(); | ||||
| } | ||||
| 
 | ||||
| #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) | ||||
| static int omap4_twl6030_hsmmc_late_init(struct device *dev) | ||||
| { | ||||
| 	int irq = 0; | ||||
| 	struct platform_device *pdev = container_of(dev, | ||||
| 				struct platform_device, dev); | ||||
| 	struct omap_mmc_platform_data *pdata = dev->platform_data; | ||||
| 
 | ||||
| 	/* Setting MMC1 Card detect Irq */ | ||||
| 	if (pdev->id == 0) { | ||||
| 		irq = twl6030_mmc_card_detect_config(); | ||||
| 		if (irq < 0) { | ||||
| 			dev_err(dev, "%s: Error card detect config(%d)\n", | ||||
| 				__func__, irq); | ||||
| 			return irq; | ||||
| 		} | ||||
| 		pdata->slots[0].card_detect_irq = irq; | ||||
| 		pdata->slots[0].card_detect = twl6030_mmc_card_detect; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev) | ||||
| { | ||||
| 	struct omap_mmc_platform_data *pdata; | ||||
| 
 | ||||
| 	/* dev can be null if CONFIG_MMC_OMAP_HS is not set */ | ||||
| 	if (!dev) { | ||||
| 		pr_err("Failed %s\n", __func__); | ||||
| 		return; | ||||
| 	} | ||||
| 	pdata = dev->platform_data; | ||||
| 	pdata->init =	omap4_twl6030_hsmmc_late_init; | ||||
| } | ||||
| 
 | ||||
| int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | ||||
| { | ||||
| 	struct omap2_hsmmc_info *c; | ||||
| 
 | ||||
| 	omap_hsmmc_init(controllers); | ||||
| 	for (c = controllers; c->mmc; c++) { | ||||
| 		/* pdev can be null if CONFIG_MMC_OMAP_HS is not set */ | ||||
| 		if (!c->pdev) | ||||
| 			continue; | ||||
| 		omap4_twl6030_hsmmc_set_late_init(&c->pdev->dev); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| #else | ||||
| int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -139,6 +139,7 @@ struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { | ||||
| 
 | ||||
| static struct pdata_init pdata_quirks[] __initdata = { | ||||
| #ifdef CONFIG_ARCH_OMAP3 | ||||
| 	{ "nokia,omap3-n900", hsmmc2_internal_input_clk, }, | ||||
| 	{ "nokia,omap3-n9", hsmmc2_internal_input_clk, }, | ||||
| 	{ "nokia,omap3-n950", hsmmc2_internal_input_clk, }, | ||||
| 	{ "isee,omap3-igep0020", omap3_igep0020_legacy_init, }, | ||||
|  | ||||
| @ -120,7 +120,7 @@ static void omap3_save_secure_ram_context(void) | ||||
| 		 * will hang the system. | ||||
| 		 */ | ||||
| 		pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | ||||
| 		ret = _omap_save_secure_sram((u32 *) | ||||
| 		ret = _omap_save_secure_sram((u32 *)(unsigned long) | ||||
| 				__pa(omap3_secure_ram_storage)); | ||||
| 		pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); | ||||
| 		/* Following is for error tracking, it should not happen */ | ||||
|  | ||||
| @ -128,7 +128,8 @@ skip_voltdm: | ||||
| 	for (i = 0; i < pwrdm->banks; i++) | ||||
| 		pwrdm->ret_mem_off_counter[i] = 0; | ||||
| 
 | ||||
| 	arch_pwrdm->pwrdm_wait_transition(pwrdm); | ||||
| 	if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition) | ||||
| 		arch_pwrdm->pwrdm_wait_transition(pwrdm); | ||||
| 	pwrdm->state = pwrdm_read_pwrst(pwrdm); | ||||
| 	pwrdm->state_counter[pwrdm->state] = 1; | ||||
| 
 | ||||
|  | ||||
| @ -43,7 +43,7 @@ extern void omap4_prm_vcvp_write(u32 val, u8 offset); | ||||
| extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); | ||||
| 
 | ||||
| #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ | ||||
| 	defined(CONFIG_SOC_DRA7XX) | ||||
| 	defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM43XX) | ||||
| void omap44xx_prm_reconfigure_io_chain(void); | ||||
| #else | ||||
| static inline void omap44xx_prm_reconfigure_io_chain(void) | ||||
|  | ||||
| @ -10,6 +10,7 @@ config ARCH_SOCFPGA | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GPIO_PL061 if GPIOLIB | ||||
| 	select HAVE_ARM_SCU | ||||
| 	select HAVE_ARM_TWD if SMP | ||||
| 	select HAVE_SMP | ||||
| 	select MFD_SYSCON | ||||
| 	select SPARSE_IRQ | ||||
|  | ||||
| @ -209,13 +209,3 @@ void __init tegra_init_fuse(void) | ||||
| 		tegra_sku_id, tegra_cpu_process_id, | ||||
| 		tegra_core_process_id); | ||||
| } | ||||
| 
 | ||||
| unsigned long long tegra_chip_uid(void) | ||||
| { | ||||
| 	unsigned long long lo, hi; | ||||
| 
 | ||||
| 	lo = tegra_fuse_readl(FUSE_UID_LOW); | ||||
| 	hi = tegra_fuse_readl(FUSE_UID_HIGH); | ||||
| 	return (hi << 32ull) | lo; | ||||
| } | ||||
| EXPORT_SYMBOL(tegra_chip_uid); | ||||
|  | ||||
| @ -140,6 +140,10 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | ||||
| 	/* Requires call-back bindings. */ | ||||
| 	OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), | ||||
| 	/* Requires DMA bindings. */ | ||||
| 	OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0",  &mop500_sdi0_data), | ||||
| 	OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1",  &mop500_sdi1_data), | ||||
| 	OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2",  &mop500_sdi2_data), | ||||
| 	OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4",  &mop500_sdi4_data), | ||||
| 	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, | ||||
| 		       "ux500-msp-i2s.0", &msp0_platform_data), | ||||
| 	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, | ||||
|  | ||||
| @ -53,6 +53,11 @@ | ||||
| #define A15_BX_ADDR0		0x68 | ||||
| #define A7_BX_ADDR0		0x78 | ||||
| 
 | ||||
| /* SPC CPU/cluster reset statue */ | ||||
| #define STANDBYWFI_STAT		0x3c | ||||
| #define STANDBYWFI_STAT_A15_CPU_MASK(cpu)	(1 << (cpu)) | ||||
| #define STANDBYWFI_STAT_A7_CPU_MASK(cpu)	(1 << (3 + (cpu))) | ||||
| 
 | ||||
| /* SPC system config interface registers */ | ||||
| #define SYSCFG_WDATA		0x70 | ||||
| #define SYSCFG_RDATA		0x74 | ||||
| @ -213,6 +218,41 @@ void ve_spc_powerdown(u32 cluster, bool enable) | ||||
| 	writel_relaxed(enable, info->baseaddr + pwdrn_reg); | ||||
| } | ||||
| 
 | ||||
| static u32 standbywfi_cpu_mask(u32 cpu, u32 cluster) | ||||
| { | ||||
| 	return cluster_is_a15(cluster) ? | ||||
| 		  STANDBYWFI_STAT_A15_CPU_MASK(cpu) | ||||
| 		: STANDBYWFI_STAT_A7_CPU_MASK(cpu); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * ve_spc_cpu_in_wfi(u32 cpu, u32 cluster) | ||||
|  * | ||||
|  * @cpu: mpidr[7:0] bitfield describing CPU affinity level within cluster | ||||
|  * @cluster: mpidr[15:8] bitfield describing cluster affinity level | ||||
|  * | ||||
|  * @return: non-zero if and only if the specified CPU is in WFI | ||||
|  * | ||||
|  * Take care when interpreting the result of this function: a CPU might | ||||
|  * be in WFI temporarily due to idle, and is not necessarily safely | ||||
|  * parked. | ||||
|  */ | ||||
| int ve_spc_cpu_in_wfi(u32 cpu, u32 cluster) | ||||
| { | ||||
| 	int ret; | ||||
| 	u32 mask = standbywfi_cpu_mask(cpu, cluster); | ||||
| 
 | ||||
| 	if (cluster >= MAX_CLUSTERS) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	ret = readl_relaxed(info->baseaddr + STANDBYWFI_STAT); | ||||
| 
 | ||||
| 	pr_debug("%s: PCFGREG[0x%X] = 0x%08X, mask = 0x%X\n", | ||||
| 		 __func__, STANDBYWFI_STAT, ret, mask); | ||||
| 
 | ||||
| 	return ret & mask; | ||||
| } | ||||
| 
 | ||||
| static int ve_spc_get_performance(int cluster, u32 *freq) | ||||
| { | ||||
| 	struct ve_spc_opp *opps = info->opps[cluster]; | ||||
|  | ||||
| @ -20,5 +20,6 @@ void ve_spc_global_wakeup_irq(bool set); | ||||
| void ve_spc_cpu_wakeup_irq(u32 cluster, u32 cpu, bool set); | ||||
| void ve_spc_set_resume_addr(u32 cluster, u32 cpu, u32 addr); | ||||
| void ve_spc_powerdown(u32 cluster, bool enable); | ||||
| int ve_spc_cpu_in_wfi(u32 cpu, u32 cluster); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -12,6 +12,7 @@ | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/delay.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/kernel.h> | ||||
| @ -32,11 +33,17 @@ | ||||
| #include "spc.h" | ||||
| 
 | ||||
| /* SCC conf registers */ | ||||
| #define RESET_CTRL		0x018 | ||||
| #define RESET_A15_NCORERESET(cpu)	(1 << (2 + (cpu))) | ||||
| #define RESET_A7_NCORERESET(cpu)	(1 << (16 + (cpu))) | ||||
| 
 | ||||
| #define A15_CONF		0x400 | ||||
| #define A7_CONF			0x500 | ||||
| #define SYS_INFO		0x700 | ||||
| #define SPC_BASE		0xb00 | ||||
| 
 | ||||
| static void __iomem *scc; | ||||
| 
 | ||||
| /*
 | ||||
|  * We can't use regular spinlocks. In the switcher case, it is possible | ||||
|  * for an outbound CPU to call power_down() after its inbound counterpart | ||||
| @ -190,6 +197,55 @@ static void tc2_pm_power_down(void) | ||||
| 	tc2_pm_down(0); | ||||
| } | ||||
| 
 | ||||
| static int tc2_core_in_reset(unsigned int cpu, unsigned int cluster) | ||||
| { | ||||
| 	u32 mask = cluster ? | ||||
| 		  RESET_A7_NCORERESET(cpu) | ||||
| 		: RESET_A15_NCORERESET(cpu); | ||||
| 
 | ||||
| 	return !(readl_relaxed(scc + RESET_CTRL) & mask); | ||||
| } | ||||
| 
 | ||||
| #define POLL_MSEC 10 | ||||
| #define TIMEOUT_MSEC 1000 | ||||
| 
 | ||||
| static int tc2_pm_power_down_finish(unsigned int cpu, unsigned int cluster) | ||||
| { | ||||
| 	unsigned tries; | ||||
| 
 | ||||
| 	pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); | ||||
| 	BUG_ON(cluster >= TC2_CLUSTERS || cpu >= TC2_MAX_CPUS_PER_CLUSTER); | ||||
| 
 | ||||
| 	for (tries = 0; tries < TIMEOUT_MSEC / POLL_MSEC; ++tries) { | ||||
| 		/*
 | ||||
| 		 * Only examine the hardware state if the target CPU has | ||||
| 		 * caught up at least as far as tc2_pm_down(): | ||||
| 		 */ | ||||
| 		if (ACCESS_ONCE(tc2_pm_use_count[cpu][cluster]) == 0) { | ||||
| 			pr_debug("%s(cpu=%u, cluster=%u): RESET_CTRL = 0x%08X\n", | ||||
| 				 __func__, cpu, cluster, | ||||
| 				 readl_relaxed(scc + RESET_CTRL)); | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * We need the CPU to reach WFI, but the power | ||||
| 			 * controller may put the cluster in reset and | ||||
| 			 * power it off as soon as that happens, before | ||||
| 			 * we have a chance to see STANDBYWFI. | ||||
| 			 * | ||||
| 			 * So we need to check for both conditions: | ||||
| 			 */ | ||||
| 			if (tc2_core_in_reset(cpu, cluster) || | ||||
| 			    ve_spc_cpu_in_wfi(cpu, cluster)) | ||||
| 				return 0; /* success: the CPU is halted */ | ||||
| 		} | ||||
| 
 | ||||
| 		/* Otherwise, wait and retry: */ | ||||
| 		msleep(POLL_MSEC); | ||||
| 	} | ||||
| 
 | ||||
| 	return -ETIMEDOUT; /* timeout */ | ||||
| } | ||||
| 
 | ||||
| static void tc2_pm_suspend(u64 residency) | ||||
| { | ||||
| 	unsigned int mpidr, cpu, cluster; | ||||
| @ -232,10 +288,11 @@ static void tc2_pm_powered_up(void) | ||||
| } | ||||
| 
 | ||||
| static const struct mcpm_platform_ops tc2_pm_power_ops = { | ||||
| 	.power_up	= tc2_pm_power_up, | ||||
| 	.power_down	= tc2_pm_power_down, | ||||
| 	.suspend	= tc2_pm_suspend, | ||||
| 	.powered_up	= tc2_pm_powered_up, | ||||
| 	.power_up		= tc2_pm_power_up, | ||||
| 	.power_down		= tc2_pm_power_down, | ||||
| 	.power_down_finish	= tc2_pm_power_down_finish, | ||||
| 	.suspend		= tc2_pm_suspend, | ||||
| 	.powered_up		= tc2_pm_powered_up, | ||||
| }; | ||||
| 
 | ||||
| static bool __init tc2_pm_usage_count_init(void) | ||||
| @ -269,7 +326,6 @@ static void __naked tc2_pm_power_up_setup(unsigned int affinity_level) | ||||
| static int __init tc2_pm_init(void) | ||||
| { | ||||
| 	int ret, irq; | ||||
| 	void __iomem *scc; | ||||
| 	u32 a15_cluster_id, a7_cluster_id, sys_info; | ||||
| 	struct device_node *np; | ||||
| 
 | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
|  * | ||||
|  *  DMA uncached mapping support. | ||||
|  */ | ||||
| #include <linux/bootmem.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/mm.h> | ||||
| #include <linux/gfp.h> | ||||
| @ -162,6 +163,8 @@ static u64 get_coherent_dma_mask(struct device *dev) | ||||
| 	u64 mask = (u64)DMA_BIT_MASK(32); | ||||
| 
 | ||||
| 	if (dev) { | ||||
| 		unsigned long max_dma_pfn; | ||||
| 
 | ||||
| 		mask = dev->coherent_dma_mask; | ||||
| 
 | ||||
| 		/*
 | ||||
| @ -173,6 +176,8 @@ static u64 get_coherent_dma_mask(struct device *dev) | ||||
| 			return 0; | ||||
| 		} | ||||
| 
 | ||||
| 		max_dma_pfn = min(max_pfn, arm_dma_pfn_limit); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * If the mask allows for more memory than we can address, | ||||
| 		 * and we actually have that much memory, then fail the | ||||
| @ -180,7 +185,7 @@ static u64 get_coherent_dma_mask(struct device *dev) | ||||
| 		 */ | ||||
| 		if (sizeof(mask) != sizeof(dma_addr_t) && | ||||
| 		    mask > (dma_addr_t)~0 && | ||||
| 		    dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) { | ||||
| 		    dma_to_pfn(dev, ~0) > max_dma_pfn) { | ||||
| 			dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n", | ||||
| 				 mask); | ||||
| 			dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n"); | ||||
| @ -192,7 +197,7 @@ static u64 get_coherent_dma_mask(struct device *dev) | ||||
| 		 * fits within the allowable addresses which we can | ||||
| 		 * allocate. | ||||
| 		 */ | ||||
| 		if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) { | ||||
| 		if (dma_to_pfn(dev, mask) < max_dma_pfn) { | ||||
| 			dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n", | ||||
| 				 mask, | ||||
| 				 dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1, | ||||
|  | ||||
| @ -146,7 +146,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | ||||
| 
 | ||||
| 	info.flags = VM_UNMAPPED_AREA_TOPDOWN; | ||||
| 	info.length = len; | ||||
| 	info.low_limit = PAGE_SIZE; | ||||
| 	info.low_limit = FIRST_USER_ADDRESS; | ||||
| 	info.high_limit = mm->mmap_base; | ||||
| 	info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; | ||||
| 	info.align_offset = pgoff << PAGE_SHIFT; | ||||
|  | ||||
| @ -87,7 +87,8 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | ||||
| 		init_pud = pud_offset(init_pgd, 0); | ||||
| 		init_pmd = pmd_offset(init_pud, 0); | ||||
| 		init_pte = pte_offset_map(init_pmd, 0); | ||||
| 		set_pte_ext(new_pte, *init_pte, 0); | ||||
| 		set_pte_ext(new_pte + 0, init_pte[0], 0); | ||||
| 		set_pte_ext(new_pte + 1, init_pte[1], 0); | ||||
| 		pte_unmap(init_pte); | ||||
| 		pte_unmap(new_pte); | ||||
| 	} | ||||
|  | ||||
| @ -336,8 +336,11 @@ static inline void __omap_dm_timer_enable_posted(struct omap_dm_timer *timer) | ||||
| 	if (timer->posted) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) | ||||
| 	if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) { | ||||
| 		timer->posted = OMAP_TIMER_NONPOSTED; | ||||
| 		__omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0, 0); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	__omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, | ||||
| 			      OMAP_TIMER_CTRL_POSTED, 0); | ||||
|  | ||||
| @ -25,8 +25,9 @@ struct xen_p2m_entry { | ||||
| 	struct rb_node rbnode_phys; | ||||
| }; | ||||
| 
 | ||||
| rwlock_t p2m_lock; | ||||
| static rwlock_t p2m_lock; | ||||
| struct rb_root phys_to_mach = RB_ROOT; | ||||
| EXPORT_SYMBOL_GPL(phys_to_mach); | ||||
| static struct rb_root mach_to_phys = RB_ROOT; | ||||
| 
 | ||||
| static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new) | ||||
| @ -200,7 +201,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(__set_phys_to_machine); | ||||
| 
 | ||||
| int p2m_init(void) | ||||
| static int p2m_init(void) | ||||
| { | ||||
| 	rwlock_init(&p2m_lock); | ||||
| 	return 0; | ||||
|  | ||||
| @ -6,6 +6,8 @@ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| 
 | ||||
| /memreserve/ 0x80000000 0x00010000; | ||||
| 
 | ||||
| / { | ||||
| 	model = "Foundation-v8A"; | ||||
| 	compatible = "arm,foundation-aarch64", "arm,vexpress"; | ||||
|  | ||||
| @ -56,6 +56,9 @@ static inline void arch_local_irq_disable(void) | ||||
| #define local_fiq_enable()	asm("msr	daifclr, #1" : : : "memory") | ||||
| #define local_fiq_disable()	asm("msr	daifset, #1" : : : "memory") | ||||
| 
 | ||||
| #define local_async_enable()	asm("msr	daifclr, #4" : : : "memory") | ||||
| #define local_async_disable()	asm("msr	daifset, #4" : : : "memory") | ||||
| 
 | ||||
| /*
 | ||||
|  * Save the current interrupt enable state. | ||||
|  */ | ||||
|  | ||||
| @ -25,10 +25,11 @@ | ||||
|  * Software defined PTE bits definition. | ||||
|  */ | ||||
| #define PTE_VALID		(_AT(pteval_t, 1) << 0) | ||||
| #define PTE_PROT_NONE		(_AT(pteval_t, 1) << 2)	/* only when !PTE_VALID */ | ||||
| #define PTE_FILE		(_AT(pteval_t, 1) << 3)	/* only when !pte_present() */ | ||||
| #define PTE_FILE		(_AT(pteval_t, 1) << 2)	/* only when !pte_present() */ | ||||
| #define PTE_DIRTY		(_AT(pteval_t, 1) << 55) | ||||
| #define PTE_SPECIAL		(_AT(pteval_t, 1) << 56) | ||||
| 				/* bit 57 for PMD_SECT_SPLITTING */ | ||||
| #define PTE_PROT_NONE		(_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */ | ||||
| 
 | ||||
| /*
 | ||||
|  * VMALLOC and SPARSEMEM_VMEMMAP ranges. | ||||
| @ -254,7 +255,7 @@ static inline int has_transparent_hugepage(void) | ||||
| #define pgprot_noncached(prot) \ | ||||
| 	__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) | ||||
| #define pgprot_writecombine(prot) \ | ||||
| 	__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_GRE)) | ||||
| 	__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) | ||||
| #define pgprot_dmacoherent(prot) \ | ||||
| 	__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) | ||||
| #define __HAVE_PHYS_MEM_ACCESS_PROT | ||||
| @ -357,18 +358,20 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | ||||
| 
 | ||||
| /*
 | ||||
|  * Encode and decode a swap entry: | ||||
|  *	bits 0, 2:	present (must both be zero) | ||||
|  *	bit  3:		PTE_FILE | ||||
|  *	bits 4-8:	swap type | ||||
|  *	bits 9-63:	swap offset | ||||
|  *	bits 0-1:	present (must be zero) | ||||
|  *	bit  2:		PTE_FILE | ||||
|  *	bits 3-8:	swap type | ||||
|  *	bits 9-57:	swap offset | ||||
|  */ | ||||
| #define __SWP_TYPE_SHIFT	4 | ||||
| #define __SWP_TYPE_SHIFT	3 | ||||
| #define __SWP_TYPE_BITS		6 | ||||
| #define __SWP_OFFSET_BITS	49 | ||||
| #define __SWP_TYPE_MASK		((1 << __SWP_TYPE_BITS) - 1) | ||||
| #define __SWP_OFFSET_SHIFT	(__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) | ||||
| #define __SWP_OFFSET_MASK	((1UL << __SWP_OFFSET_BITS) - 1) | ||||
| 
 | ||||
| #define __swp_type(x)		(((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) | ||||
| #define __swp_offset(x)		((x).val >> __SWP_OFFSET_SHIFT) | ||||
| #define __swp_offset(x)		(((x).val >> __SWP_OFFSET_SHIFT) & __SWP_OFFSET_MASK) | ||||
| #define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) }) | ||||
| 
 | ||||
| #define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) }) | ||||
| @ -382,15 +385,15 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | ||||
| 
 | ||||
| /*
 | ||||
|  * Encode and decode a file entry: | ||||
|  *	bits 0, 2:	present (must both be zero) | ||||
|  *	bit  3:		PTE_FILE | ||||
|  *	bits 4-63:	file offset / PAGE_SIZE | ||||
|  *	bits 0-1:	present (must be zero) | ||||
|  *	bit  2:		PTE_FILE | ||||
|  *	bits 3-57:	file offset / PAGE_SIZE | ||||
|  */ | ||||
| #define pte_file(pte)		(pte_val(pte) & PTE_FILE) | ||||
| #define pte_to_pgoff(x)		(pte_val(x) >> 4) | ||||
| #define pgoff_to_pte(x)		__pte(((x) << 4) | PTE_FILE) | ||||
| #define pte_to_pgoff(x)		(pte_val(x) >> 3) | ||||
| #define pgoff_to_pte(x)		__pte(((x) << 3) | PTE_FILE) | ||||
| 
 | ||||
| #define PTE_FILE_MAX_BITS	60 | ||||
| #define PTE_FILE_MAX_BITS	55 | ||||
| 
 | ||||
| extern int kern_addr_valid(unsigned long addr); | ||||
| 
 | ||||
|  | ||||
| @ -248,7 +248,8 @@ static int brk_handler(unsigned long addr, unsigned int esr, | ||||
| int aarch32_break_handler(struct pt_regs *regs) | ||||
| { | ||||
| 	siginfo_t info; | ||||
| 	unsigned int instr; | ||||
| 	u32 arm_instr; | ||||
| 	u16 thumb_instr; | ||||
| 	bool bp = false; | ||||
| 	void __user *pc = (void __user *)instruction_pointer(regs); | ||||
| 
 | ||||
| @ -257,18 +258,21 @@ int aarch32_break_handler(struct pt_regs *regs) | ||||
| 
 | ||||
| 	if (compat_thumb_mode(regs)) { | ||||
| 		/* get 16-bit Thumb instruction */ | ||||
| 		get_user(instr, (u16 __user *)pc); | ||||
| 		if (instr == AARCH32_BREAK_THUMB2_LO) { | ||||
| 		get_user(thumb_instr, (u16 __user *)pc); | ||||
| 		thumb_instr = le16_to_cpu(thumb_instr); | ||||
| 		if (thumb_instr == AARCH32_BREAK_THUMB2_LO) { | ||||
| 			/* get second half of 32-bit Thumb-2 instruction */ | ||||
| 			get_user(instr, (u16 __user *)(pc + 2)); | ||||
| 			bp = instr == AARCH32_BREAK_THUMB2_HI; | ||||
| 			get_user(thumb_instr, (u16 __user *)(pc + 2)); | ||||
| 			thumb_instr = le16_to_cpu(thumb_instr); | ||||
| 			bp = thumb_instr == AARCH32_BREAK_THUMB2_HI; | ||||
| 		} else { | ||||
| 			bp = instr == AARCH32_BREAK_THUMB; | ||||
| 			bp = thumb_instr == AARCH32_BREAK_THUMB; | ||||
| 		} | ||||
| 	} else { | ||||
| 		/* 32-bit ARM instruction */ | ||||
| 		get_user(instr, (u32 __user *)pc); | ||||
| 		bp = (instr & ~0xf0000000) == AARCH32_BREAK_ARM; | ||||
| 		get_user(arm_instr, (u32 __user *)pc); | ||||
| 		arm_instr = le32_to_cpu(arm_instr); | ||||
| 		bp = (arm_instr & ~0xf0000000) == AARCH32_BREAK_ARM; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!bp) | ||||
|  | ||||
| @ -309,15 +309,12 @@ el1_irq: | ||||
| #ifdef CONFIG_TRACE_IRQFLAGS | ||||
| 	bl	trace_hardirqs_off | ||||
| #endif | ||||
| 
 | ||||
| 	irq_handler | ||||
| 
 | ||||
| #ifdef CONFIG_PREEMPT | ||||
| 	get_thread_info tsk | ||||
| 	ldr	w24, [tsk, #TI_PREEMPT]		// get preempt count | ||||
| 	add	w0, w24, #1			// increment it | ||||
| 	str	w0, [tsk, #TI_PREEMPT] | ||||
| #endif | ||||
| 	irq_handler | ||||
| #ifdef CONFIG_PREEMPT | ||||
| 	str	w24, [tsk, #TI_PREEMPT]		// restore preempt count | ||||
| 	ldr	w24, [tsk, #TI_PREEMPT]		// restore preempt count | ||||
| 	cbnz	w24, 1f				// preempt count != 0 | ||||
| 	ldr	x0, [tsk, #TI_FLAGS]		// get flags | ||||
| 	tbz	x0, #TIF_NEED_RESCHED, 1f	// needs rescheduling? | ||||
| @ -507,22 +504,10 @@ el0_irq_naked: | ||||
| #ifdef CONFIG_TRACE_IRQFLAGS | ||||
| 	bl	trace_hardirqs_off | ||||
| #endif | ||||
| 	get_thread_info tsk | ||||
| #ifdef CONFIG_PREEMPT | ||||
| 	ldr	w24, [tsk, #TI_PREEMPT]		// get preempt count | ||||
| 	add	w23, w24, #1			// increment it | ||||
| 	str	w23, [tsk, #TI_PREEMPT] | ||||
| #endif | ||||
| 
 | ||||
| 	irq_handler | ||||
| #ifdef CONFIG_PREEMPT | ||||
| 	ldr	w0, [tsk, #TI_PREEMPT] | ||||
| 	str	w24, [tsk, #TI_PREEMPT] | ||||
| 	cmp	w0, w23 | ||||
| 	b.eq	1f | ||||
| 	mov	x1, #0 | ||||
| 	str	x1, [x1]			// BUG | ||||
| 1: | ||||
| #endif | ||||
| 	get_thread_info tsk | ||||
| 
 | ||||
| #ifdef CONFIG_TRACE_IRQFLAGS | ||||
| 	bl	trace_hardirqs_on | ||||
| #endif | ||||
|  | ||||
| @ -636,28 +636,27 @@ static int compat_gpr_get(struct task_struct *target, | ||||
| 
 | ||||
| 	for (i = 0; i < num_regs; ++i) { | ||||
| 		unsigned int idx = start + i; | ||||
| 		void *reg; | ||||
| 		compat_ulong_t reg; | ||||
| 
 | ||||
| 		switch (idx) { | ||||
| 		case 15: | ||||
| 			reg = (void *)&task_pt_regs(target)->pc; | ||||
| 			reg = task_pt_regs(target)->pc; | ||||
| 			break; | ||||
| 		case 16: | ||||
| 			reg = (void *)&task_pt_regs(target)->pstate; | ||||
| 			reg = task_pt_regs(target)->pstate; | ||||
| 			break; | ||||
| 		case 17: | ||||
| 			reg = (void *)&task_pt_regs(target)->orig_x0; | ||||
| 			reg = task_pt_regs(target)->orig_x0; | ||||
| 			break; | ||||
| 		default: | ||||
| 			reg = (void *)&task_pt_regs(target)->regs[idx]; | ||||
| 			reg = task_pt_regs(target)->regs[idx]; | ||||
| 		} | ||||
| 
 | ||||
| 		ret = copy_to_user(ubuf, reg, sizeof(compat_ulong_t)); | ||||
| 
 | ||||
| 		ret = copy_to_user(ubuf, ®, sizeof(reg)); | ||||
| 		if (ret) | ||||
| 			break; | ||||
| 		else | ||||
| 			ubuf += sizeof(compat_ulong_t); | ||||
| 
 | ||||
| 		ubuf += sizeof(reg); | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| @ -685,28 +684,28 @@ static int compat_gpr_set(struct task_struct *target, | ||||
| 
 | ||||
| 	for (i = 0; i < num_regs; ++i) { | ||||
| 		unsigned int idx = start + i; | ||||
| 		void *reg; | ||||
| 		compat_ulong_t reg; | ||||
| 
 | ||||
| 		ret = copy_from_user(®, ubuf, sizeof(reg)); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		ubuf += sizeof(reg); | ||||
| 
 | ||||
| 		switch (idx) { | ||||
| 		case 15: | ||||
| 			reg = (void *)&newregs.pc; | ||||
| 			newregs.pc = reg; | ||||
| 			break; | ||||
| 		case 16: | ||||
| 			reg = (void *)&newregs.pstate; | ||||
| 			newregs.pstate = reg; | ||||
| 			break; | ||||
| 		case 17: | ||||
| 			reg = (void *)&newregs.orig_x0; | ||||
| 			newregs.orig_x0 = reg; | ||||
| 			break; | ||||
| 		default: | ||||
| 			reg = (void *)&newregs.regs[idx]; | ||||
| 			newregs.regs[idx] = reg; | ||||
| 		} | ||||
| 
 | ||||
| 		ret = copy_from_user(reg, ubuf, sizeof(compat_ulong_t)); | ||||
| 
 | ||||
| 		if (ret) | ||||
| 			goto out; | ||||
| 		else | ||||
| 			ubuf += sizeof(compat_ulong_t); | ||||
| 	} | ||||
| 
 | ||||
| 	if (valid_user_regs(&newregs.user_regs)) | ||||
| @ -714,7 +713,6 @@ static int compat_gpr_set(struct task_struct *target, | ||||
| 	else | ||||
| 		ret = -EINVAL; | ||||
| 
 | ||||
| out: | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -205,6 +205,11 @@ u64 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = INVALID_HWID }; | ||||
| 
 | ||||
| void __init setup_arch(char **cmdline_p) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * Unmask asynchronous aborts early to catch possible system errors. | ||||
| 	 */ | ||||
| 	local_async_enable(); | ||||
| 
 | ||||
| 	setup_processor(); | ||||
| 
 | ||||
| 	setup_machine_fdt(__fdt_pointer); | ||||
|  | ||||
| @ -160,6 +160,7 @@ asmlinkage void secondary_start_kernel(void) | ||||
| 
 | ||||
| 	local_irq_enable(); | ||||
| 	local_fiq_enable(); | ||||
| 	local_async_enable(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * OK, it's off to the idle thread for us | ||||
|  | ||||
| @ -50,7 +50,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m | ||||
| CONFIG_IDE=y | ||||
| CONFIG_BLK_DEV_IDECD=y | ||||
| CONFIG_BLK_DEV_NS87415=y | ||||
| CONFIG_BLK_DEV_SIIMAGE=m | ||||
| CONFIG_PATA_SIL680=m | ||||
| CONFIG_SCSI=y | ||||
| CONFIG_BLK_DEV_SD=y | ||||
| CONFIG_CHR_DEV_ST=y | ||||
|  | ||||
| @ -20,7 +20,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y | ||||
| CONFIG_MODVERSIONS=y | ||||
| CONFIG_BLK_DEV_INTEGRITY=y | ||||
| CONFIG_PA8X00=y | ||||
| CONFIG_MLONGCALLS=y | ||||
| CONFIG_64BIT=y | ||||
| CONFIG_SMP=y | ||||
| CONFIG_PREEMPT=y | ||||
| @ -81,8 +80,6 @@ CONFIG_IDE=y | ||||
| CONFIG_BLK_DEV_IDECD=y | ||||
| CONFIG_BLK_DEV_PLATFORM=y | ||||
| CONFIG_BLK_DEV_GENERIC=y | ||||
| CONFIG_BLK_DEV_SIIMAGE=y | ||||
| CONFIG_SCSI=y | ||||
| CONFIG_BLK_DEV_SD=y | ||||
| CONFIG_CHR_DEV_ST=m | ||||
| CONFIG_BLK_DEV_SR=m | ||||
| @ -94,6 +91,8 @@ CONFIG_SCSI_FC_ATTRS=y | ||||
| CONFIG_SCSI_SAS_LIBSAS=m | ||||
| CONFIG_ISCSI_TCP=m | ||||
| CONFIG_ISCSI_BOOT_SYSFS=m | ||||
| CONFIG_ATA=y | ||||
| CONFIG_PATA_SIL680=y | ||||
| CONFIG_FUSION=y | ||||
| CONFIG_FUSION_SPI=y | ||||
| CONFIG_FUSION_SAS=y | ||||
| @ -114,9 +113,8 @@ CONFIG_INPUT_FF_MEMLESS=m | ||||
| # CONFIG_KEYBOARD_ATKBD is not set | ||||
| # CONFIG_KEYBOARD_HIL_OLD is not set | ||||
| # CONFIG_KEYBOARD_HIL is not set | ||||
| CONFIG_MOUSE_PS2=m | ||||
| # CONFIG_MOUSE_PS2 is not set | ||||
| CONFIG_INPUT_MISC=y | ||||
| CONFIG_INPUT_CM109=m | ||||
| CONFIG_SERIO_SERPORT=m | ||||
| CONFIG_SERIO_PARKBD=m | ||||
| CONFIG_SERIO_GSCPS2=m | ||||
| @ -167,34 +165,6 @@ CONFIG_SND_VERBOSE_PRINTK=y | ||||
| CONFIG_SND_AD1889=m | ||||
| # CONFIG_SND_USB is not set | ||||
| # CONFIG_SND_GSC is not set | ||||
| CONFIG_HID_A4TECH=m | ||||
| CONFIG_HID_APPLE=m | ||||
| CONFIG_HID_BELKIN=m | ||||
| CONFIG_HID_CHERRY=m | ||||
| CONFIG_HID_CHICONY=m | ||||
| CONFIG_HID_CYPRESS=m | ||||
| CONFIG_HID_DRAGONRISE=m | ||||
| CONFIG_HID_EZKEY=m | ||||
| CONFIG_HID_KYE=m | ||||
| CONFIG_HID_GYRATION=m | ||||
| CONFIG_HID_TWINHAN=m | ||||
| CONFIG_HID_KENSINGTON=m | ||||
| CONFIG_HID_LOGITECH=m | ||||
| CONFIG_HID_LOGITECH_DJ=m | ||||
| CONFIG_HID_MICROSOFT=m | ||||
| CONFIG_HID_MONTEREY=m | ||||
| CONFIG_HID_NTRIG=m | ||||
| CONFIG_HID_ORTEK=m | ||||
| CONFIG_HID_PANTHERLORD=m | ||||
| CONFIG_HID_PETALYNX=m | ||||
| CONFIG_HID_SAMSUNG=m | ||||
| CONFIG_HID_SUNPLUS=m | ||||
| CONFIG_HID_GREENASIA=m | ||||
| CONFIG_HID_SMARTJOYPLUS=m | ||||
| CONFIG_HID_TOPSEED=m | ||||
| CONFIG_HID_THRUSTMASTER=m | ||||
| CONFIG_HID_ZEROPLUS=m | ||||
| CONFIG_USB_HID=m | ||||
| CONFIG_USB=y | ||||
| CONFIG_USB_OHCI_HCD=y | ||||
| CONFIG_USB_STORAGE=y | ||||
|  | ||||
| @ -24,7 +24,6 @@ CONFIG_MODVERSIONS=y | ||||
| CONFIG_BLK_DEV_INTEGRITY=y | ||||
| # CONFIG_IOSCHED_DEADLINE is not set | ||||
| CONFIG_PA8X00=y | ||||
| CONFIG_MLONGCALLS=y | ||||
| CONFIG_64BIT=y | ||||
| CONFIG_SMP=y | ||||
| # CONFIG_COMPACTION is not set | ||||
| @ -68,7 +67,6 @@ CONFIG_IDE_GD=m | ||||
| CONFIG_IDE_GD_ATAPI=y | ||||
| CONFIG_BLK_DEV_IDECD=m | ||||
| CONFIG_BLK_DEV_NS87415=y | ||||
| CONFIG_BLK_DEV_SIIMAGE=y | ||||
| # CONFIG_SCSI_PROC_FS is not set | ||||
| CONFIG_BLK_DEV_SD=y | ||||
| CONFIG_BLK_DEV_SR=y | ||||
| @ -82,6 +80,7 @@ CONFIG_SCSI_ZALON=y | ||||
| CONFIG_SCSI_QLA_ISCSI=m | ||||
| CONFIG_SCSI_DH=y | ||||
| CONFIG_ATA=y | ||||
| CONFIG_PATA_SIL680=y | ||||
| CONFIG_ATA_GENERIC=y | ||||
| CONFIG_MD=y | ||||
| CONFIG_MD_LINEAR=m | ||||
| @ -162,7 +161,7 @@ CONFIG_SLIP_MODE_SLIP6=y | ||||
| CONFIG_INPUT_EVDEV=y | ||||
| # CONFIG_KEYBOARD_HIL_OLD is not set | ||||
| # CONFIG_KEYBOARD_HIL is not set | ||||
| # CONFIG_INPUT_MOUSE is not set | ||||
| # CONFIG_MOUSE_PS2 is not set | ||||
| CONFIG_INPUT_MISC=y | ||||
| CONFIG_SERIO_SERPORT=m | ||||
| # CONFIG_HP_SDC is not set | ||||
| @ -216,32 +215,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||||
| CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||||
| CONFIG_LOGO=y | ||||
| # CONFIG_LOGO_LINUX_MONO is not set | ||||
| CONFIG_HID=m | ||||
| CONFIG_HIDRAW=y | ||||
| CONFIG_HID_DRAGONRISE=m | ||||
| CONFIG_DRAGONRISE_FF=y | ||||
| CONFIG_HID_KYE=m | ||||
| CONFIG_HID_GYRATION=m | ||||
| CONFIG_HID_TWINHAN=m | ||||
| CONFIG_LOGITECH_FF=y | ||||
| CONFIG_LOGIRUMBLEPAD2_FF=y | ||||
| CONFIG_HID_NTRIG=m | ||||
| CONFIG_HID_PANTHERLORD=m | ||||
| CONFIG_PANTHERLORD_FF=y | ||||
| CONFIG_HID_PETALYNX=m | ||||
| CONFIG_HID_SAMSUNG=m | ||||
| CONFIG_HID_SONY=m | ||||
| CONFIG_HID_SUNPLUS=m | ||||
| CONFIG_HID_GREENASIA=m | ||||
| CONFIG_GREENASIA_FF=y | ||||
| CONFIG_HID_SMARTJOYPLUS=m | ||||
| CONFIG_SMARTJOYPLUS_FF=y | ||||
| CONFIG_HID_TOPSEED=m | ||||
| CONFIG_HID_THRUSTMASTER=m | ||||
| CONFIG_THRUSTMASTER_FF=y | ||||
| CONFIG_HID_ZEROPLUS=m | ||||
| CONFIG_ZEROPLUS_FF=y | ||||
| CONFIG_USB_HID=m | ||||
| CONFIG_HID_PID=y | ||||
| CONFIG_USB_HIDDEV=y | ||||
| CONFIG_USB=y | ||||
| @ -251,13 +225,8 @@ CONFIG_USB_DYNAMIC_MINORS=y | ||||
| CONFIG_USB_MON=m | ||||
| CONFIG_USB_WUSB_CBAF=m | ||||
| CONFIG_USB_XHCI_HCD=m | ||||
| CONFIG_USB_EHCI_HCD=m | ||||
| CONFIG_USB_OHCI_HCD=m | ||||
| CONFIG_USB_R8A66597_HCD=m | ||||
| CONFIG_USB_ACM=m | ||||
| CONFIG_USB_PRINTER=m | ||||
| CONFIG_USB_WDM=m | ||||
| CONFIG_USB_TMC=m | ||||
| CONFIG_USB_EHCI_HCD=y | ||||
| CONFIG_USB_OHCI_HCD=y | ||||
| CONFIG_NEW_LEDS=y | ||||
| CONFIG_LEDS_CLASS=y | ||||
| CONFIG_LEDS_TRIGGERS=y | ||||
|  | ||||
| @ -6,5 +6,3 @@ | ||||
|  * This is used for 16550-compatible UARTs | ||||
|  */ | ||||
| #define BASE_BAUD ( 1843200 / 16 ) | ||||
| 
 | ||||
| #define SERIAL_PORT_DFNS | ||||
|  | ||||
| @ -36,6 +36,9 @@ | ||||
|  *	HP PARISC Hardware Database | ||||
|  *	Access to this database is only possible during bootup | ||||
|  *	so don't reference this table after starting the init process | ||||
|  * | ||||
|  *	NOTE: Product names which are listed here and ends with a '?' | ||||
|  *	are guessed. If you know the correct name, please let us know. | ||||
|  */ | ||||
|   | ||||
| static struct hp_hardware hp_hardware_list[] = { | ||||
| @ -222,7 +225,7 @@ static struct hp_hardware hp_hardware_list[] = { | ||||
| 	{HPHW_NPROC,0x5DD,0x4,0x81,"Duet W2"}, | ||||
| 	{HPHW_NPROC,0x5DE,0x4,0x81,"Piccolo W+"}, | ||||
| 	{HPHW_NPROC,0x5DF,0x4,0x81,"Cantata W2"}, | ||||
| 	{HPHW_NPROC,0x5DF,0x0,0x00,"Marcato W+? (rp5470)"}, | ||||
| 	{HPHW_NPROC,0x5DF,0x0,0x00,"Marcato W+ (rp5470)?"}, | ||||
| 	{HPHW_NPROC,0x5E0,0x4,0x91,"Cantata DC- W2"}, | ||||
| 	{HPHW_NPROC,0x5E1,0x4,0x91,"Crescendo DC- W2"}, | ||||
| 	{HPHW_NPROC,0x5E2,0x4,0x91,"Crescendo 650 W2"}, | ||||
| @ -276,9 +279,11 @@ static struct hp_hardware hp_hardware_list[] = { | ||||
| 	{HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"}, | ||||
| 	{HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"}, | ||||
| 	{HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak Slow"}, | ||||
| 	{HPHW_NPROC,0x88B,0x4,0x91,"Crestone Peak Fast?"}, | ||||
| 	{HPHW_NPROC,0x88C,0x4,0x91,"Orca Mako+"}, | ||||
| 	{HPHW_NPROC,0x88D,0x4,0x91,"Rainier/Medel Mako+ Slow"}, | ||||
| 	{HPHW_NPROC,0x88E,0x4,0x91,"Rainier/Medel Mako+ Fast"}, | ||||
| 	{HPHW_NPROC,0x892,0x4,0x91,"Mt. Hamilton Slow Mako+?"}, | ||||
| 	{HPHW_NPROC,0x894,0x4,0x91,"Mt. Hamilton Fast Mako+"}, | ||||
| 	{HPHW_NPROC,0x895,0x4,0x91,"Storm Peak Slow Mako+"}, | ||||
| 	{HPHW_NPROC,0x896,0x4,0x91,"Storm Peak Fast Mako+"}, | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user