Merge 3.13-rc4 into char-misc-next
We want these fixes in here.
This commit is contained in:
		
						commit
						138a6d7ea2
					
				
							
								
								
									
										5
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								CREDITS
									
									
									
									
									
								
							| @ -655,6 +655,11 @@ S: Stanford University | ||||
| S: Stanford, California 94305 | ||||
| S: USA | ||||
| 
 | ||||
| N: Carlos Chinea | ||||
| E: carlos.chinea@nokia.com | ||||
| E: cch.devel@gmail.com | ||||
| D: Author of HSI Subsystem | ||||
| 
 | ||||
| N: Randolph Chung | ||||
| E: tausq@debian.org | ||||
| D: Linux/PA-RISC hacker | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -73,7 +73,8 @@ range from zero to the maximal number of valid planes for the currently active | ||||
| format. For the single-planar API, applications must set <structfield> plane | ||||
| </structfield> to zero.  Additional flags may be posted in the <structfield> | ||||
| flags </structfield> field.  Refer to a manual for open() for details. | ||||
| Currently only O_CLOEXEC is supported.  All other fields must be set to zero. | ||||
| Currently only O_CLOEXEC, O_RDONLY, O_WRONLY, and O_RDWR are supported.  All | ||||
| other fields must be set to zero. | ||||
| In the case of multi-planar API, every plane is exported separately using | ||||
| multiple <constant> VIDIOC_EXPBUF </constant> calls. </para> | ||||
| 
 | ||||
| @ -170,8 +171,9 @@ multi-planar API. Otherwise this value must be set to zero. </entry> | ||||
| 	    <entry>__u32</entry> | ||||
| 	    <entry><structfield>flags</structfield></entry> | ||||
| 	    <entry>Flags for the newly created file, currently only <constant> | ||||
| O_CLOEXEC </constant> is supported, refer to the manual of open() for more | ||||
| details.</entry> | ||||
| O_CLOEXEC </constant>, <constant>O_RDONLY</constant>, <constant>O_WRONLY | ||||
| </constant>, and <constant>O_RDWR</constant> are supported, refer to the manual | ||||
| of open() for more details.</entry> | ||||
| 	  </row> | ||||
| 	  <row> | ||||
| 	    <entry>__s32</entry> | ||||
|  | ||||
| @ -164,10 +164,10 @@ This points to a number of methods, all of which need to be provided: | ||||
| 
 | ||||
|  (4) Diff the index keys of two objects. | ||||
| 
 | ||||
| 	int (*diff_objects)(const void *a, const void *b); | ||||
| 	int (*diff_objects)(const void *object, const void *index_key); | ||||
| 
 | ||||
|      Return the bit position at which the index keys of two objects differ or | ||||
|      -1 if they are the same. | ||||
|      Return the bit position at which the index key of the specified object | ||||
|      differs from the given index key or -1 if they are the same. | ||||
| 
 | ||||
| 
 | ||||
|  (5) Free an object. | ||||
|  | ||||
| @ -266,10 +266,12 @@ E.g. | ||||
| Invalidation is removing an entry from the cache without writing it | ||||
| back.  Cache blocks can be invalidated via the invalidate_cblocks | ||||
| message, which takes an arbitrary number of cblock ranges.  Each cblock | ||||
| must be expressed as a decimal value, in the future a variant message | ||||
| that takes cblock ranges expressed in hexidecimal may be needed to | ||||
| better support efficient invalidation of larger caches.  The cache must | ||||
| be in passthrough mode when invalidate_cblocks is used. | ||||
| range's end value is "one past the end", meaning 5-10 expresses a range | ||||
| of values from 5 to 9.  Each cblock must be expressed as a decimal | ||||
| value, in the future a variant message that takes cblock ranges | ||||
| expressed in hexidecimal may be needed to better support efficient | ||||
| invalidation of larger caches.  The cache must be in passthrough mode | ||||
| when invalidate_cblocks is used. | ||||
| 
 | ||||
|    invalidate_cblocks [<cblock>|<cblock begin>-<cblock end>]* | ||||
| 
 | ||||
|  | ||||
| @ -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"; | ||||
| 	}; | ||||
| 
 | ||||
| @ -4,7 +4,7 @@ This file provides information, what the device node | ||||
| for the davinci_emac interface contains. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: "ti,davinci-dm6467-emac"; | ||||
| - compatible: "ti,davinci-dm6467-emac" or "ti,am3517-emac" | ||||
| - reg: Offset and length of the register set for the device | ||||
| - ti,davinci-ctrl-reg-offset: offset to control register | ||||
| - ti,davinci-ctrl-mod-reg-offset: offset to control module register | ||||
|  | ||||
| @ -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>; | ||||
| }; | ||||
|  | ||||
| @ -8,3 +8,7 @@ Required properties: | ||||
| Optional properties: | ||||
| - phy-device : phandle to Ethernet phy | ||||
| - local-mac-address : Ethernet mac address to use | ||||
| - reg-io-width : Mask of sizes (in bytes) of the IO accesses that | ||||
|   are supported on the device.  Valid value for SMSC LAN91c111 are | ||||
|   1, 2 or 4.  If it's omitted or invalid, the size would be 2 meaning | ||||
|   16-bit access only. | ||||
|  | ||||
							
								
								
									
										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. | ||||
| @ -313,7 +313,7 @@ static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type) | ||||
| 	int i; | ||||
| 	void *dp = get_dp(mic, type); | ||||
| 
 | ||||
| 	for (i = mic_aligned_size(struct mic_bootparam); i < PAGE_SIZE; | ||||
| 	for (i = sizeof(struct mic_bootparam); i < PAGE_SIZE; | ||||
| 		i += mic_total_desc_size(d)) { | ||||
| 		d = dp + i; | ||||
| 
 | ||||
| @ -445,8 +445,8 @@ init_vr(struct mic_info *mic, int fd, int type, | ||||
| 		__func__, mic->name, vr0->va, vr0->info, vr_size, | ||||
| 		vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN)); | ||||
| 	mpsslog("magic 0x%x expected 0x%x\n", | ||||
| 		vr0->info->magic, MIC_MAGIC + type); | ||||
| 	assert(vr0->info->magic == MIC_MAGIC + type); | ||||
| 		le32toh(vr0->info->magic), MIC_MAGIC + type); | ||||
| 	assert(le32toh(vr0->info->magic) == MIC_MAGIC + type); | ||||
| 	if (vr1) { | ||||
| 		vr1->va = (struct mic_vring *) | ||||
| 			&va[MIC_DEVICE_PAGE_END + vr_size]; | ||||
| @ -458,8 +458,8 @@ init_vr(struct mic_info *mic, int fd, int type, | ||||
| 			__func__, mic->name, vr1->va, vr1->info, vr_size, | ||||
| 			vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN)); | ||||
| 		mpsslog("magic 0x%x expected 0x%x\n", | ||||
| 			vr1->info->magic, MIC_MAGIC + type + 1); | ||||
| 		assert(vr1->info->magic == MIC_MAGIC + type + 1); | ||||
| 			le32toh(vr1->info->magic), MIC_MAGIC + type + 1); | ||||
| 		assert(le32toh(vr1->info->magic) == MIC_MAGIC + type + 1); | ||||
| 	} | ||||
| done: | ||||
| 	return va; | ||||
| @ -520,7 +520,7 @@ static void * | ||||
| virtio_net(void *arg) | ||||
| { | ||||
| 	static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)]; | ||||
| 	static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __aligned(64); | ||||
| 	static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __attribute__ ((aligned(64))); | ||||
| 	struct iovec vnet_iov[2][2] = { | ||||
| 		{ { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) }, | ||||
| 		  { .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } }, | ||||
| @ -1412,6 +1412,12 @@ mic_config(void *arg) | ||||
| 	} | ||||
| 
 | ||||
| 	do { | ||||
| 		ret = lseek(fd, 0, SEEK_SET); | ||||
| 		if (ret < 0) { | ||||
| 			mpsslog("%s: Failed to seek to file start '%s': %s\n", | ||||
| 				mic->name, pathname, strerror(errno)); | ||||
| 			goto close_error1; | ||||
| 		} | ||||
| 		ret = read(fd, value, sizeof(value)); | ||||
| 		if (ret < 0) { | ||||
| 			mpsslog("%s: Failed to read sysfs entry '%s': %s\n", | ||||
|  | ||||
| @ -123,6 +123,16 @@ Transmission process is similar to capture as shown below. | ||||
| [shutdown]  close() --------> destruction of the transmission socket and | ||||
|                               deallocation of all associated resources. | ||||
| 
 | ||||
| Socket creation and destruction is also straight forward, and is done | ||||
| the same way as in capturing described in the previous paragraph: | ||||
| 
 | ||||
|  int fd = socket(PF_PACKET, mode, 0); | ||||
| 
 | ||||
| The protocol can optionally be 0 in case we only want to transmit | ||||
| via this socket, which avoids an expensive call to packet_rcv(). | ||||
| In this case, you also need to bind(2) the TX_RING with sll_protocol = 0 | ||||
| set. Otherwise, htons(ETH_P_ALL) or any other protocol, for example. | ||||
| 
 | ||||
| Binding the socket to your network interface is mandatory (with zero copy) to | ||||
| know the header size of frames used in the circular buffer. | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										82
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -893,19 +893,14 @@ F:	arch/arm/include/asm/hardware/dec21285.h | ||||
| F:	arch/arm/mach-footbridge/ | ||||
| 
 | ||||
| ARM/FREESCALE IMX / MXC ARM ARCHITECTURE | ||||
| M:	Shawn Guo <shawn.guo@linaro.org> | ||||
| M:	Sascha Hauer <kernel@pengutronix.de> | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| T:	git git://git.pengutronix.de/git/imx/linux-2.6.git | ||||
| F:	arch/arm/mach-imx/ | ||||
| F:	arch/arm/configs/imx*_defconfig | ||||
| 
 | ||||
| ARM/FREESCALE IMX6 | ||||
| M:	Shawn Guo <shawn.guo@linaro.org> | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| T:	git git://git.linaro.org/people/shawnguo/linux-2.6.git | ||||
| F:	arch/arm/mach-imx/*imx6* | ||||
| F:	arch/arm/mach-imx/ | ||||
| F:	arch/arm/boot/dts/imx* | ||||
| F:	arch/arm/configs/imx*_defconfig | ||||
| 
 | ||||
| ARM/FREESCALE MXS ARM ARCHITECTURE | ||||
| M:	Shawn Guo <shawn.guo@linaro.org> | ||||
| @ -1934,7 +1929,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/ | ||||
| @ -2137,11 +2133,17 @@ S:	Maintained | ||||
| F:	Documentation/zh_CN/ | ||||
| 
 | ||||
| CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER | ||||
| M:	Alexander Shishkin <alexander.shishkin@linux.intel.com> | ||||
| M:	Peter Chen <Peter.Chen@freescale.com> | ||||
| T:	git://github.com/hzpeterchen/linux-usb.git | ||||
| 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> | ||||
| @ -4038,12 +4040,26 @@ W:	http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi | ||||
| S:	Maintained | ||||
| F:	fs/hpfs/ | ||||
| 
 | ||||
| HSI SUBSYSTEM | ||||
| M:	Sebastian Reichel <sre@debian.org> | ||||
| S:	Maintained | ||||
| F:	Documentation/ABI/testing/sysfs-bus-hsi | ||||
| F:	drivers/hsi/ | ||||
| F:	include/linux/hsi/ | ||||
| F:	include/uapi/linux/hsi/ | ||||
| 
 | ||||
| HSO 3G MODEM DRIVER | ||||
| M:	Jan Dumon <j.dumon@option.com> | ||||
| 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 | ||||
| @ -4450,10 +4466,8 @@ M:	Bruce Allan <bruce.w.allan@intel.com> | ||||
| M:	Carolyn Wyborny <carolyn.wyborny@intel.com> | ||||
| M:	Don Skidmore <donald.c.skidmore@intel.com> | ||||
| M:	Greg Rose <gregory.v.rose@intel.com> | ||||
| M:	Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> | ||||
| M:	Alex Duyck <alexander.h.duyck@intel.com> | ||||
| M:	John Ronciak <john.ronciak@intel.com> | ||||
| M:	Tushar Dave <tushar.n.dave@intel.com> | ||||
| L:	e1000-devel@lists.sourceforge.net | ||||
| W:	http://www.intel.com/support/feedback.htm | ||||
| W:	http://e1000.sourceforge.net/ | ||||
| @ -5256,7 +5270,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 +5982,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 +6252,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/ | ||||
| @ -6449,19 +6463,52 @@ F:	drivers/pci/ | ||||
| F:	include/linux/pci* | ||||
| F:	arch/x86/pci/ | ||||
| 
 | ||||
| PCI DRIVER FOR IMX6 | ||||
| M:	Richard Zhu <r65037@freescale.com> | ||||
| M:	Shawn Guo <shawn.guo@linaro.org> | ||||
| L:	linux-pci@vger.kernel.org | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| F:	drivers/pci/host/*imx6* | ||||
| 
 | ||||
| PCI DRIVER FOR MVEBU (Marvell Armada 370 and Armada XP SOC support) | ||||
| M:	Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||||
| M:	Jason Cooper <jason@lakedaemon.net> | ||||
| L:	linux-pci@vger.kernel.org | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| F:	drivers/pci/host/*mvebu* | ||||
| 
 | ||||
| PCI DRIVER FOR NVIDIA TEGRA | ||||
| M:	Thierry Reding <thierry.reding@gmail.com> | ||||
| L:	linux-tegra@vger.kernel.org | ||||
| L:	linux-pci@vger.kernel.org | ||||
| S:	Supported | ||||
| F:	Documentation/devicetree/bindings/pci/nvidia,tegra20-pcie.txt | ||||
| F:	drivers/pci/host/pci-tegra.c | ||||
| 
 | ||||
| PCI DRIVER FOR RENESAS R-CAR | ||||
| M:	Simon Horman <horms@verge.net.au> | ||||
| L:	linux-pci@vger.kernel.org | ||||
| L:	linux-sh@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/pci/host/*rcar* | ||||
| 
 | ||||
| PCI DRIVER FOR SAMSUNG EXYNOS | ||||
| M:	Jingoo Han <jg1.han@samsung.com> | ||||
| L:	linux-pci@vger.kernel.org | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| L:	linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| F:	drivers/pci/host/pci-exynos.c | ||||
| 
 | ||||
| PCI DRIVER FOR SYNOPSIS DESIGNWARE | ||||
| M:	Mohit Kumar <mohit.kumar@st.com> | ||||
| M:	Jingoo Han <jg1.han@samsung.com> | ||||
| L:	linux-pci@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/pci/host/*designware* | ||||
| 
 | ||||
| PCMCIA SUBSYSTEM | ||||
| P:	Linux PCMCIA Team | ||||
| L:	linux-pcmcia@lists.infradead.org | ||||
| @ -7380,7 +7427,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 = -rc4 | ||||
| NAME = One Giant Leap for Frogkind | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  | ||||
| @ -8,6 +8,7 @@ | ||||
| 
 | ||||
| config ARC | ||||
| 	def_bool y | ||||
| 	select BUILDTIME_EXTABLE_SORT | ||||
| 	select CLONE_BACKWARDS | ||||
| 	# ARC Busybox based initramfs absolutely relies on DEVTMPFS for /dev | ||||
| 	select DEVTMPFS if !INITRAMFS_SOURCE="" | ||||
|  | ||||
| @ -8,6 +8,9 @@ | ||||
| 
 | ||||
| /******** no-legacy-syscalls-ABI *******/ | ||||
| 
 | ||||
| #ifndef _UAPI_ASM_ARC_UNISTD_H | ||||
| #define _UAPI_ASM_ARC_UNISTD_H | ||||
| 
 | ||||
| #define __ARCH_WANT_SYS_EXECVE | ||||
| #define __ARCH_WANT_SYS_CLONE | ||||
| #define __ARCH_WANT_SYS_VFORK | ||||
| @ -32,3 +35,5 @@ __SYSCALL(__NR_arc_gettls, sys_arc_gettls) | ||||
| /* Generic syscall (fs/filesystems.c - lost in asm-generic/unistd.h */ | ||||
| #define __NR_sysfs		(__NR_arch_specific_syscall + 3) | ||||
| __SYSCALL(__NR_sysfs, sys_sysfs) | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -79,9 +79,9 @@ static int arc_pmu_cache_event(u64 config) | ||||
| 	cache_result	= (config >> 16) & 0xff; | ||||
| 	if (cache_type >= PERF_COUNT_HW_CACHE_MAX) | ||||
| 		return -EINVAL; | ||||
| 	if (cache_type >= PERF_COUNT_HW_CACHE_OP_MAX) | ||||
| 	if (cache_op >= PERF_COUNT_HW_CACHE_OP_MAX) | ||||
| 		return -EINVAL; | ||||
| 	if (cache_type >= PERF_COUNT_HW_CACHE_RESULT_MAX) | ||||
| 	if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	ret = arc_pmu_cache_map[cache_type][cache_op][cache_result]; | ||||
|  | ||||
| @ -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 { | ||||
|  | ||||
| @ -7,11 +7,11 @@ | ||||
|  */ | ||||
| /dts-v1/; | ||||
| 
 | ||||
| #include "omap34xx.dtsi" | ||||
| #include "am3517.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	model = "TI AM3517 EVM (AM3517/05)"; | ||||
| 	compatible = "ti,am3517-evm", "ti,omap3"; | ||||
| 	model = "TI AM3517 EVM (AM3517/05 TMDSEVM3517)"; | ||||
| 	compatible = "ti,am3517-evm", "ti,am3517", "ti,omap3"; | ||||
| 
 | ||||
| 	memory { | ||||
| 		device_type = "memory"; | ||||
|  | ||||
							
								
								
									
										63
									
								
								arch/arm/boot/dts/am3517.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								arch/arm/boot/dts/am3517.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | ||||
| /* | ||||
|  * Device Tree Source for am3517 SoC | ||||
|  * | ||||
|  * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ | ||||
|  * | ||||
|  * This file is licensed under the terms of the GNU General Public License | ||||
|  * version 2.  This program is licensed "as is" without any warranty of any | ||||
|  * kind, whether express or implied. | ||||
|  */ | ||||
| 
 | ||||
| #include "omap3.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	aliases { | ||||
| 		serial3 = &uart4; | ||||
| 	}; | ||||
| 
 | ||||
| 	ocp { | ||||
| 		am35x_otg_hs: am35x_otg_hs@5c040000 { | ||||
| 			compatible = "ti,omap3-musb"; | ||||
| 			ti,hwmods = "am35x_otg_hs"; | ||||
| 			status = "disabled"; | ||||
| 			reg = <0x5c040000 0x1000>; | ||||
| 			interrupts = <71>; | ||||
| 			interrupt-names = "mc"; | ||||
| 		}; | ||||
| 
 | ||||
| 		davinci_emac: ethernet@0x5c000000 { | ||||
| 			compatible = "ti,am3517-emac"; | ||||
| 			ti,hwmods = "davinci_emac"; | ||||
| 			status = "disabled"; | ||||
| 			reg = <0x5c000000 0x30000>; | ||||
| 			interrupts = <67 68 69 70>; | ||||
| 			ti,davinci-ctrl-reg-offset = <0x10000>; | ||||
| 			ti,davinci-ctrl-mod-reg-offset = <0>; | ||||
| 			ti,davinci-ctrl-ram-offset = <0x20000>; | ||||
| 			ti,davinci-ctrl-ram-size = <0x2000>; | ||||
| 			ti,davinci-rmii-en = /bits/ 8 <1>; | ||||
| 			local-mac-address = [ 00 00 00 00 00 00 ]; | ||||
| 		}; | ||||
| 
 | ||||
| 		davinci_mdio: ethernet@0x5c030000 { | ||||
| 			compatible = "ti,davinci_mdio"; | ||||
| 			ti,hwmods = "davinci_mdio"; | ||||
| 			status = "disabled"; | ||||
| 			reg = <0x5c030000 0x1000>; | ||||
| 			bus_freq = <1000000>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart4: serial@4809e000 { | ||||
| 			compatible = "ti,omap3-uart"; | ||||
| 			ti,hwmods = "uart4"; | ||||
| 			status = "disabled"; | ||||
| 			reg = <0x4809e000 0x400>; | ||||
| 			interrupts = <84>; | ||||
| 			dmas = <&sdma 55 &sdma 54>; | ||||
| 			dma-names = "tx", "rx"; | ||||
| 			clock-frequency = <48000000>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| @ -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 { | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| 
 | ||||
| #include "omap34xx.dtsi" | ||||
| #include "omap34xx-hs.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	model = "Nokia N900"; | ||||
| @ -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 { | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #include "omap36xx.dtsi" | ||||
| #include "omap36xx-hs.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	cpus { | ||||
|  | ||||
| @ -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>; | ||||
|  | ||||
							
								
								
									
										16
									
								
								arch/arm/boot/dts/omap34xx-hs.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								arch/arm/boot/dts/omap34xx-hs.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| /* Disabled modules for secure omaps */ | ||||
| 
 | ||||
| #include "omap34xx.dtsi" | ||||
| 
 | ||||
| /* Secure omaps have some devices inaccessible depending on the firmware */ | ||||
| &aes { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
| &sham { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
| &timer12 { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
							
								
								
									
										16
									
								
								arch/arm/boot/dts/omap36xx-hs.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								arch/arm/boot/dts/omap36xx-hs.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| /* Disabled modules for secure omaps */ | ||||
| 
 | ||||
| #include "omap36xx.dtsi" | ||||
| 
 | ||||
| /* Secure omaps have some devices inaccessible depending on the firmware */ | ||||
| &aes { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
| &sham { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| 
 | ||||
| &timer12 { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
| @ -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 { | ||||
|  | ||||
| @ -193,7 +193,10 @@ | ||||
| 		pio: pinctrl@01c20800 { | ||||
| 			compatible = "allwinner,sun6i-a31-pinctrl"; | ||||
| 			reg = <0x01c20800 0x400>; | ||||
| 			interrupts = <0 11 1>, <0 15 1>, <0 16 1>, <0 17 1>; | ||||
| 			interrupts = <0 11 4>, | ||||
| 				     <0 15 4>, | ||||
| 				     <0 16 4>, | ||||
| 				     <0 17 4>; | ||||
| 			clocks = <&apb1_gates 5>; | ||||
| 			gpio-controller; | ||||
| 			interrupt-controller; | ||||
| @ -212,11 +215,11 @@ | ||||
| 		timer@01c20c00 { | ||||
| 			compatible = "allwinner,sun4i-timer"; | ||||
| 			reg = <0x01c20c00 0xa0>; | ||||
| 			interrupts = <0 18 1>, | ||||
| 				     <0 19 1>, | ||||
| 				     <0 20 1>, | ||||
| 				     <0 21 1>, | ||||
| 				     <0 22 1>; | ||||
| 			interrupts = <0 18 4>, | ||||
| 				     <0 19 4>, | ||||
| 				     <0 20 4>, | ||||
| 				     <0 21 4>, | ||||
| 				     <0 22 4>; | ||||
| 			clocks = <&osc24M>; | ||||
| 		}; | ||||
| 
 | ||||
| @ -228,7 +231,7 @@ | ||||
| 		uart0: serial@01c28000 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28000 0x400>; | ||||
| 			interrupts = <0 0 1>; | ||||
| 			interrupts = <0 0 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 16>; | ||||
| @ -238,7 +241,7 @@ | ||||
| 		uart1: serial@01c28400 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28400 0x400>; | ||||
| 			interrupts = <0 1 1>; | ||||
| 			interrupts = <0 1 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 17>; | ||||
| @ -248,7 +251,7 @@ | ||||
| 		uart2: serial@01c28800 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28800 0x400>; | ||||
| 			interrupts = <0 2 1>; | ||||
| 			interrupts = <0 2 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 18>; | ||||
| @ -258,7 +261,7 @@ | ||||
| 		uart3: serial@01c28c00 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28c00 0x400>; | ||||
| 			interrupts = <0 3 1>; | ||||
| 			interrupts = <0 3 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 19>; | ||||
| @ -268,7 +271,7 @@ | ||||
| 		uart4: serial@01c29000 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29000 0x400>; | ||||
| 			interrupts = <0 4 1>; | ||||
| 			interrupts = <0 4 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 20>; | ||||
| @ -278,7 +281,7 @@ | ||||
| 		uart5: serial@01c29400 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29400 0x400>; | ||||
| 			interrupts = <0 5 1>; | ||||
| 			interrupts = <0 5 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb2_gates 21>; | ||||
|  | ||||
| @ -170,7 +170,7 @@ | ||||
| 		emac: ethernet@01c0b000 { | ||||
| 			compatible = "allwinner,sun4i-emac"; | ||||
| 			reg = <0x01c0b000 0x1000>; | ||||
| 			interrupts = <0 55 1>; | ||||
| 			interrupts = <0 55 4>; | ||||
| 			clocks = <&ahb_gates 17>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| @ -186,7 +186,7 @@ | ||||
| 		pio: pinctrl@01c20800 { | ||||
| 			compatible = "allwinner,sun7i-a20-pinctrl"; | ||||
| 			reg = <0x01c20800 0x400>; | ||||
| 			interrupts = <0 28 1>; | ||||
| 			interrupts = <0 28 4>; | ||||
| 			clocks = <&apb0_gates 5>; | ||||
| 			gpio-controller; | ||||
| 			interrupt-controller; | ||||
| @ -251,12 +251,12 @@ | ||||
| 		timer@01c20c00 { | ||||
| 			compatible = "allwinner,sun4i-timer"; | ||||
| 			reg = <0x01c20c00 0x90>; | ||||
| 			interrupts = <0 22 1>, | ||||
| 				     <0 23 1>, | ||||
| 				     <0 24 1>, | ||||
| 				     <0 25 1>, | ||||
| 				     <0 67 1>, | ||||
| 				     <0 68 1>; | ||||
| 			interrupts = <0 22 4>, | ||||
| 				     <0 23 4>, | ||||
| 				     <0 24 4>, | ||||
| 				     <0 25 4>, | ||||
| 				     <0 67 4>, | ||||
| 				     <0 68 4>; | ||||
| 			clocks = <&osc24M>; | ||||
| 		}; | ||||
| 
 | ||||
| @ -273,7 +273,7 @@ | ||||
| 		uart0: serial@01c28000 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28000 0x400>; | ||||
| 			interrupts = <0 1 1>; | ||||
| 			interrupts = <0 1 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 16>; | ||||
| @ -283,7 +283,7 @@ | ||||
| 		uart1: serial@01c28400 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28400 0x400>; | ||||
| 			interrupts = <0 2 1>; | ||||
| 			interrupts = <0 2 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 17>; | ||||
| @ -293,7 +293,7 @@ | ||||
| 		uart2: serial@01c28800 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28800 0x400>; | ||||
| 			interrupts = <0 3 1>; | ||||
| 			interrupts = <0 3 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 18>; | ||||
| @ -303,7 +303,7 @@ | ||||
| 		uart3: serial@01c28c00 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c28c00 0x400>; | ||||
| 			interrupts = <0 4 1>; | ||||
| 			interrupts = <0 4 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 19>; | ||||
| @ -313,7 +313,7 @@ | ||||
| 		uart4: serial@01c29000 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29000 0x400>; | ||||
| 			interrupts = <0 17 1>; | ||||
| 			interrupts = <0 17 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 20>; | ||||
| @ -323,7 +323,7 @@ | ||||
| 		uart5: serial@01c29400 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29400 0x400>; | ||||
| 			interrupts = <0 18 1>; | ||||
| 			interrupts = <0 18 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 21>; | ||||
| @ -333,7 +333,7 @@ | ||||
| 		uart6: serial@01c29800 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29800 0x400>; | ||||
| 			interrupts = <0 19 1>; | ||||
| 			interrupts = <0 19 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 22>; | ||||
| @ -343,7 +343,7 @@ | ||||
| 		uart7: serial@01c29c00 { | ||||
| 			compatible = "snps,dw-apb-uart"; | ||||
| 			reg = <0x01c29c00 0x400>; | ||||
| 			interrupts = <0 20 1>; | ||||
| 			interrupts = <0 20 4>; | ||||
| 			reg-shift = <2>; | ||||
| 			reg-io-width = <4>; | ||||
| 			clocks = <&apb1_gates 23>; | ||||
| @ -353,7 +353,7 @@ | ||||
| 		i2c0: i2c@01c2ac00 { | ||||
| 			compatible = "allwinner,sun4i-i2c"; | ||||
| 			reg = <0x01c2ac00 0x400>; | ||||
| 			interrupts = <0 7 1>; | ||||
| 			interrupts = <0 7 4>; | ||||
| 			clocks = <&apb1_gates 0>; | ||||
| 			clock-frequency = <100000>; | ||||
| 			status = "disabled"; | ||||
| @ -362,7 +362,7 @@ | ||||
| 		i2c1: i2c@01c2b000 { | ||||
| 			compatible = "allwinner,sun4i-i2c"; | ||||
| 			reg = <0x01c2b000 0x400>; | ||||
| 			interrupts = <0 8 1>; | ||||
| 			interrupts = <0 8 4>; | ||||
| 			clocks = <&apb1_gates 1>; | ||||
| 			clock-frequency = <100000>; | ||||
| 			status = "disabled"; | ||||
| @ -371,7 +371,7 @@ | ||||
| 		i2c2: i2c@01c2b400 { | ||||
| 			compatible = "allwinner,sun4i-i2c"; | ||||
| 			reg = <0x01c2b400 0x400>; | ||||
| 			interrupts = <0 9 1>; | ||||
| 			interrupts = <0 9 4>; | ||||
| 			clocks = <&apb1_gates 2>; | ||||
| 			clock-frequency = <100000>; | ||||
| 			status = "disabled"; | ||||
| @ -380,7 +380,7 @@ | ||||
| 		i2c3: i2c@01c2b800 { | ||||
| 			compatible = "allwinner,sun4i-i2c"; | ||||
| 			reg = <0x01c2b800 0x400>; | ||||
| 			interrupts = <0 88 1>; | ||||
| 			interrupts = <0 88 4>; | ||||
| 			clocks = <&apb1_gates 3>; | ||||
| 			clock-frequency = <100000>; | ||||
| 			status = "disabled"; | ||||
| @ -389,7 +389,7 @@ | ||||
| 		i2c4: i2c@01c2bc00 { | ||||
| 			compatible = "allwinner,sun4i-i2c"; | ||||
| 			reg = <0x01c2bc00 0x400>; | ||||
| 			interrupts = <0 89 1>; | ||||
| 			interrupts = <0 89 4>; | ||||
| 			clocks = <&apb1_gates 15>; | ||||
| 			clock-frequency = <100000>; | ||||
| 			status = "disabled"; | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -100,23 +100,19 @@ | ||||
| #define TASK_UNMAPPED_BASE	UL(0x00000000) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PHYS_OFFSET | ||||
| #define PHYS_OFFSET 		UL(CONFIG_DRAM_BASE) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef END_MEM | ||||
| #define END_MEM     		(UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PAGE_OFFSET | ||||
| #define PAGE_OFFSET		(PHYS_OFFSET) | ||||
| #define PAGE_OFFSET		PLAT_PHYS_OFFSET | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * The module can be at any place in ram in nommu mode. | ||||
|  */ | ||||
| #define MODULES_END		(END_MEM) | ||||
| #define MODULES_VADDR		(PHYS_OFFSET) | ||||
| #define MODULES_VADDR		PAGE_OFFSET | ||||
| 
 | ||||
| #define XIP_VIRT_ADDR(physaddr)  (physaddr) | ||||
| 
 | ||||
| @ -157,6 +153,16 @@ | ||||
| #endif | ||||
| #define ARCH_PGD_MASK		((1 << ARCH_PGD_SHIFT) - 1) | ||||
| 
 | ||||
| /*
 | ||||
|  * PLAT_PHYS_OFFSET is the offset (from zero) of the start of physical | ||||
|  * memory.  This is used for XIP and NoMMU kernels, or by kernels which | ||||
|  * have their own mach/memory.h.  Assembly code must always use | ||||
|  * PLAT_PHYS_OFFSET and not PHYS_OFFSET. | ||||
|  */ | ||||
| #ifndef PLAT_PHYS_OFFSET | ||||
| #define PLAT_PHYS_OFFSET	UL(CONFIG_PHYS_OFFSET) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| 
 | ||||
| /*
 | ||||
| @ -239,6 +245,8 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #define PHYS_OFFSET	PLAT_PHYS_OFFSET | ||||
| 
 | ||||
| static inline phys_addr_t __virt_to_phys(unsigned long x) | ||||
| { | ||||
| 	return (phys_addr_t)x - PAGE_OFFSET + PHYS_OFFSET; | ||||
| @ -251,17 +259,6 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | ||||
| 
 | ||||
| #endif | ||||
| #endif | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| 
 | ||||
| #ifndef PHYS_OFFSET | ||||
| #ifdef PLAT_PHYS_OFFSET | ||||
| #define PHYS_OFFSET	PLAT_PHYS_OFFSET | ||||
| #else | ||||
| #define PHYS_OFFSET	UL(CONFIG_PHYS_OFFSET) | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| 
 | ||||
| /*
 | ||||
|  * PFNs are used to describe any physical page; this means | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -68,7 +68,7 @@ ENTRY(stext) | ||||
| 
 | ||||
| #ifdef CONFIG_ARM_MPU | ||||
| 	/* Calculate the size of a region covering just the kernel */ | ||||
| 	ldr	r5, =PHYS_OFFSET		@ Region start: PHYS_OFFSET
 | ||||
| 	ldr	r5, =PLAT_PHYS_OFFSET		@ Region start: PHYS_OFFSET
 | ||||
| 	ldr     r6, =(_end)			@ Cover whole kernel
 | ||||
| 	sub	r6, r6, r5			@ Minimum size of region to map
 | ||||
| 	clz	r6, r6				@ Region size must be 2^N...
 | ||||
| @ -213,7 +213,7 @@ ENTRY(__setup_mpu) | ||||
| 	set_region_nr r0, #MPU_RAM_REGION | ||||
| 	isb | ||||
| 	/* Full access from PL0, PL1, shared for CONFIG_SMP, cacheable */ | ||||
| 	ldr	r0, =PHYS_OFFSET		@ RAM starts at PHYS_OFFSET
 | ||||
| 	ldr	r0, =PLAT_PHYS_OFFSET		@ RAM starts at PHYS_OFFSET
 | ||||
| 	ldr	r5,=(MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL) | ||||
| 
 | ||||
| 	setup_region r0, r5, r6, MPU_DATA_SIDE	@ PHYS_OFFSET, shared, enabled
 | ||||
|  | ||||
| @ -110,7 +110,7 @@ ENTRY(stext) | ||||
| 	sub	r4, r3, r4			@ (PHYS_OFFSET - PAGE_OFFSET)
 | ||||
| 	add	r8, r8, r4			@ PHYS_OFFSET
 | ||||
| #else | ||||
| 	ldr	r8, =PHYS_OFFSET		@ always constant in this case
 | ||||
| 	ldr	r8, =PLAT_PHYS_OFFSET		@ always constant in this case
 | ||||
| #endif | ||||
| 
 | ||||
| 	/* | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -404,6 +404,7 @@ EXPORT_SYMBOL(dump_fpu); | ||||
| unsigned long get_wchan(struct task_struct *p) | ||||
| { | ||||
| 	struct stackframe frame; | ||||
| 	unsigned long stack_page; | ||||
| 	int count = 0; | ||||
| 	if (!p || p == current || p->state == TASK_RUNNING) | ||||
| 		return 0; | ||||
| @ -412,9 +413,11 @@ unsigned long get_wchan(struct task_struct *p) | ||||
| 	frame.sp = thread_saved_sp(p); | ||||
| 	frame.lr = 0;			/* recovered from the stack */ | ||||
| 	frame.pc = thread_saved_pc(p); | ||||
| 	stack_page = (unsigned long)task_stack_page(p); | ||||
| 	do { | ||||
| 		int ret = unwind_frame(&frame); | ||||
| 		if (ret < 0) | ||||
| 		if (frame.sp < stack_page || | ||||
| 		    frame.sp >= stack_page + THREAD_SIZE || | ||||
| 		    unwind_frame(&frame) < 0) | ||||
| 			return 0; | ||||
| 		if (!in_sched_functions(frame.pc)) | ||||
| 			return frame.pc; | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -873,8 +873,6 @@ void __init setup_arch(char **cmdline_p) | ||||
| 	machine_desc = mdesc; | ||||
| 	machine_name = mdesc->name; | ||||
| 
 | ||||
| 	setup_dma_zone(mdesc); | ||||
| 
 | ||||
| 	if (mdesc->reboot_mode != REBOOT_HARD) | ||||
| 		reboot_mode = mdesc->reboot_mode; | ||||
| 
 | ||||
| @ -892,6 +890,7 @@ void __init setup_arch(char **cmdline_p) | ||||
| 	sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | ||||
| 
 | ||||
| 	early_paging_init(mdesc, lookup_processor_type(read_cpuid_id())); | ||||
| 	setup_dma_zone(mdesc); | ||||
| 	sanity_check_meminfo(); | ||||
| 	arm_memblock_init(&meminfo, mdesc); | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -31,7 +31,7 @@ int notrace unwind_frame(struct stackframe *frame) | ||||
| 	high = ALIGN(low, THREAD_SIZE); | ||||
| 
 | ||||
| 	/* check current frame pointer is within bounds */ | ||||
| 	if (fp < (low + 12) || fp + 4 >= high) | ||||
| 	if (fp < low + 12 || fp > high - 4) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	/* restore the registers from the stack frame */ | ||||
|  | ||||
| @ -509,9 +509,10 @@ static inline int | ||||
| __do_cache_op(unsigned long start, unsigned long end) | ||||
| { | ||||
| 	int ret; | ||||
| 	unsigned long chunk = PAGE_SIZE; | ||||
| 
 | ||||
| 	do { | ||||
| 		unsigned long chunk = min(PAGE_SIZE, end - start); | ||||
| 
 | ||||
| 		if (signal_pending(current)) { | ||||
| 			struct thread_info *ti = current_thread_info(); | ||||
| 
 | ||||
|  | ||||
| @ -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", | ||||
|  | ||||
| @ -487,7 +487,7 @@ int __init da8xx_register_emac(void) | ||||
| 
 | ||||
| static struct resource da830_mcasp1_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mcasp1", | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_DA830_MCASP1_REG_BASE, | ||||
| 		.end	= DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| @ -515,7 +515,7 @@ static struct platform_device da830_mcasp1_device = { | ||||
| 
 | ||||
| static struct resource da850_mcasp_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mcasp", | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_DA8XX_MCASP0_REG_BASE, | ||||
| 		.end	= DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
|  | ||||
| @ -641,6 +641,7 @@ static struct platform_device dm355_edma_device = { | ||||
| 
 | ||||
| static struct resource dm355_asp1_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_ASP1_BASE, | ||||
| 		.end	= DAVINCI_ASP1_BASE + SZ_8K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| @ -906,7 +907,7 @@ static struct davinci_gpio_platform_data dm355_gpio_platform_data = { | ||||
| int __init dm355_gpio_register(void) | ||||
| { | ||||
| 	return davinci_gpio_register(dm355_gpio_resources, | ||||
| 				     sizeof(dm355_gpio_resources), | ||||
| 				     ARRAY_SIZE(dm355_gpio_resources), | ||||
| 				     &dm355_gpio_platform_data); | ||||
| } | ||||
| /*----------------------------------------------------------------------*/ | ||||
|  | ||||
| @ -720,7 +720,7 @@ static struct davinci_gpio_platform_data dm365_gpio_platform_data = { | ||||
| int __init dm365_gpio_register(void) | ||||
| { | ||||
| 	return davinci_gpio_register(dm365_gpio_resources, | ||||
| 				     sizeof(dm365_gpio_resources), | ||||
| 				     ARRAY_SIZE(dm365_gpio_resources), | ||||
| 				     &dm365_gpio_platform_data); | ||||
| } | ||||
| 
 | ||||
| @ -942,6 +942,7 @@ static struct platform_device dm365_edma_device = { | ||||
| 
 | ||||
| static struct resource dm365_asp_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_DM365_ASP0_BASE, | ||||
| 		.end	= DAVINCI_DM365_ASP0_BASE + SZ_8K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
|  | ||||
| @ -572,6 +572,7 @@ static struct platform_device dm644x_edma_device = { | ||||
| /* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */ | ||||
| static struct resource dm644x_asp_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_ASP0_BASE, | ||||
| 		.end	= DAVINCI_ASP0_BASE + SZ_8K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| @ -792,7 +793,7 @@ static struct davinci_gpio_platform_data dm644_gpio_platform_data = { | ||||
| int __init dm644x_gpio_register(void) | ||||
| { | ||||
| 	return davinci_gpio_register(dm644_gpio_resources, | ||||
| 				     sizeof(dm644_gpio_resources), | ||||
| 				     ARRAY_SIZE(dm644_gpio_resources), | ||||
| 				     &dm644_gpio_platform_data); | ||||
| } | ||||
| /*----------------------------------------------------------------------*/ | ||||
|  | ||||
| @ -621,7 +621,7 @@ static struct platform_device dm646x_edma_device = { | ||||
| 
 | ||||
| static struct resource dm646x_mcasp0_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mcasp0", | ||||
| 		.name	= "mpu", | ||||
| 		.start 	= DAVINCI_DM646X_MCASP0_REG_BASE, | ||||
| 		.end 	= DAVINCI_DM646X_MCASP0_REG_BASE + (SZ_1K << 1) - 1, | ||||
| 		.flags 	= IORESOURCE_MEM, | ||||
| @ -641,7 +641,7 @@ static struct resource dm646x_mcasp0_resources[] = { | ||||
| 
 | ||||
| static struct resource dm646x_mcasp1_resources[] = { | ||||
| 	{ | ||||
| 		.name	= "mcasp1", | ||||
| 		.name	= "mpu", | ||||
| 		.start	= DAVINCI_DM646X_MCASP1_REG_BASE, | ||||
| 		.end	= DAVINCI_DM646X_MCASP1_REG_BASE + (SZ_1K << 1) - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| @ -769,7 +769,7 @@ static struct davinci_gpio_platform_data dm646x_gpio_platform_data = { | ||||
| int __init dm646x_gpio_register(void) | ||||
| { | ||||
| 	return davinci_gpio_register(dm646x_gpio_resources, | ||||
| 				     sizeof(dm646x_gpio_resources), | ||||
| 				     ARRAY_SIZE(dm646x_gpio_resources), | ||||
| 				     &dm646x_gpio_platform_data); | ||||
| } | ||||
| /*----------------------------------------------------------------------*/ | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -17,12 +17,15 @@ | ||||
| #include <linux/clkdev.h> | ||||
| #include <linux/clocksource.h> | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/input.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/irqchip.h> | ||||
| #include <linux/mailbox.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_irq.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/reboot.h> | ||||
| #include <linux/amba/bus.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| @ -130,6 +133,24 @@ static struct platform_device highbank_cpuidle_device = { | ||||
| 	.name = "cpuidle-calxeda", | ||||
| }; | ||||
| 
 | ||||
| static int hb_keys_notifier(struct notifier_block *nb, unsigned long event, void *data) | ||||
| { | ||||
| 	u32 key = *(u32 *)data; | ||||
| 
 | ||||
| 	if (event != 0x1000) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (key == KEY_POWER) | ||||
| 		orderly_poweroff(false); | ||||
| 	else if (key == 0xffff) | ||||
| 		ctrl_alt_del(); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| static struct notifier_block hb_keys_nb = { | ||||
| 	.notifier_call = hb_keys_notifier, | ||||
| }; | ||||
| 
 | ||||
| static void __init highbank_init(void) | ||||
| { | ||||
| 	struct device_node *np; | ||||
| @ -145,6 +166,8 @@ static void __init highbank_init(void) | ||||
| 	bus_register_notifier(&platform_bus_type, &highbank_platform_nb); | ||||
| 	bus_register_notifier(&amba_bustype, &highbank_amba_nb); | ||||
| 
 | ||||
| 	pl320_ipc_register_notifier(&hb_keys_nb); | ||||
| 
 | ||||
| 	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||||
| 
 | ||||
| 	if (psci_ops.cpu_suspend) | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -131,6 +131,24 @@ DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)") | ||||
| 	.dt_compat	= omap3_gp_boards_compat, | ||||
| 	.restart	= omap3xxx_restart, | ||||
| MACHINE_END | ||||
| 
 | ||||
| static const char *am3517_boards_compat[] __initdata = { | ||||
| 	"ti,am3517", | ||||
| 	NULL, | ||||
| }; | ||||
| 
 | ||||
| DT_MACHINE_START(AM3517_DT, "Generic AM3517 (Flattened Device Tree)") | ||||
| 	.reserve	= omap_reserve, | ||||
| 	.map_io		= omap3_map_io, | ||||
| 	.init_early	= am35xx_init_early, | ||||
| 	.init_irq	= omap_intc_of_init, | ||||
| 	.handle_irq	= omap3_intc_handle_irq, | ||||
| 	.init_machine	= omap_generic_init, | ||||
| 	.init_late	= omap3_init_late, | ||||
| 	.init_time	= omap3_gptimer_timer_init, | ||||
| 	.dt_compat	= am3517_boards_compat, | ||||
| 	.restart	= omap3xxx_restart, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_AM33XX | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user