ARM: SoC platform updates
SoC updates, mostly refactorings and cleanups of old legacy platforms.
 Major themes this release:
 
  - Conversion of ixp4xx to a modern platform (drivers, DT, bindings)
  - Moving some of the ep93xx headers around to get it closer to multiplatform enabled.
  - Cleanups of Davinci
 
 This tag also contains a few patches that were queued up as fixes before
 5.1 but I didn't get sent in before release.
 -----BEGIN PGP SIGNATURE-----
 
 iQJDBAABCAAtFiEElf+HevZ4QCAJmMQ+jBrnPN6EHHcFAlzc+sMPHG9sb2ZAbGl4
 b20ubmV0AAoJEIwa5zzehBx3ygQP/3mxLFGJxgHk6m/41V4Tepv9F2ZZ3BW4Lcp7
 vZtr6xiyhZXzIHOGzqQ4VGllfWhMWnjzZZe3iruSBY1gpJU7D4x054T3xVsIDs9F
 EIcbBm5fE0O0bdijfk7V8vBu7LOIP/KYdaD1n9WDhW0Hy4wTXN8NNLSKEU5Lq15p
 oz/A3QP5GcwhGAqaHyxx445La9yEKKWAsc2cOCRCdvfw6+n1GpoE6TI1YGjDvqbw
 xd73mIwXb0l0f7jhCV7OPyZ3t/aQgTD3ddr4gHUGNa8sSWmD5nupSVxj23FkbGby
 ejqJMxOfHpJJGIL/sxmR3+cFBYxyE+JNmrEq/kDW5ncWs/LY91juJxR1dkQKs6Mj
 4Y9CWruftDz34DlFs/J33hF/rdZ73O91ldk7zqND41Fi5aLrIKvZBJlTuqyZ0tGV
 YNRxsjWF953h8TXimDV0KvBgO4+E8d5ype/kIYtEGYO9DVmXQGMxFx2Gt2I/NfoH
 5tCtVFwDPpMxJShpXHLMzUT8sQL3mytg5L/MIPTGx+zAtDwx/qTLEEAElffG29oI
 vdzgJR0lrG/zzqQh25/M80UZYMdOrwtjAB42C+jAvlfQ0C4DtvSH+8OdcROOgj0b
 GbAJbTdHYTD6OpoxhSuRii7zzNxw+i7pQj+uLSt8s8ZReGkUk5a2wpRpoVoV2WxK
 RJHkMK95
 =pUeO
 -----END PGP SIGNATURE-----
Merge tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
Pull ARM SoC platform updates from Olof Johansson:
 "SoC updates, mostly refactorings and cleanups of old legacy platforms.
  Major themes this release:
   - Conversion of ixp4xx to a modern platform (drivers, DT, bindings)
   - Moving some of the ep93xx headers around to get it closer to
     multiplatform enabled.
   - Cleanups of Davinci
  This also contains a few patches that were queued up as fixes before
  5.1 but I didn't get sent in before release"
* tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (123 commits)
  ARM: debug-ll: add default address for digicolor
  ARM: u300: regulator: add MODULE_LICENSE()
  ARM: ep93xx: move private headers out of mach/*
  ARM: ep93xx: move pinctrl interfaces into include/linux/soc
  ARM: ep93xx: keypad: stop using mach/platform.h
  ARM: ep93xx: move network platform data to separate header
  ARM: stm32: add AMBA support for stm32 family
  MAINTAINERS: update arch/arm/mach-davinci
  ARM: rockchip: add missing of_node_put in rockchip_smp_prepare_pmu
  ARM: dts: Add queue manager and NPE to the IXP4xx DTSI
  soc: ixp4xx: qmgr: Add DT probe code
  soc: ixp4xx: qmgr: Add DT bindings for IXP4xx qmgr
  soc: ixp4xx: npe: Add DT probe code
  soc: ixp4xx: Add DT bindings for IXP4xx NPE
  soc: ixp4xx: qmgr: Pass resources
  soc: ixp4xx: Remove unused functions
  soc: ixp4xx: Uninline several functions
  soc: ixp4xx: npe: Pass addresses as resources
  ARM: ixp4xx: Turn the QMGR into a platform device
  ARM: ixp4xx: Turn the NPE into a platform device
  ...
			
			
This commit is contained in:
		
						commit
						22c58fd70c
					
				
							
								
								
									
										22
									
								
								Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0 | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/arm/intel-ixp4xx.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Intel IXP4xx Device Tree Bindings | ||||
| 
 | ||||
| maintainers: | ||||
|   - Linus Walleij <linus.walleij@linaro.org> | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     oneOf: | ||||
|       - items: | ||||
|           - enum: | ||||
|               - linksys,nslu2 | ||||
|           - const: intel,ixp42x | ||||
|       - items: | ||||
|           - enum: | ||||
|               - gateworks,gw2358 | ||||
|           - const: intel,ixp43x | ||||
| @ -94,6 +94,8 @@ Optional properties: | ||||
| 
 | ||||
| - ti,no-idle-on-init	interconnect target module should not be idled at init | ||||
| 
 | ||||
| - ti,no-idle		interconnect target module should not be idled | ||||
| 
 | ||||
| Example: Single instance of MUSB controller on omap4 using interconnect ranges | ||||
| using offsets from l4_cfg second segment (0x4a000000 + 0x80000 = 0x4a0ab000): | ||||
| 
 | ||||
| @ -131,6 +133,6 @@ using offsets from l4_cfg second segment (0x4a000000 + 0x80000 = 0x4a0ab000): | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| Note that other SoCs, such as am335x can have multipe child devices. On am335x | ||||
| Note that other SoCs, such as am335x can have multiple child devices. On am335x | ||||
| there are two MUSB instances, two USB PHY instances, and a single CPPI41 DMA | ||||
| instance as children of a single interconnet target module. | ||||
| instance as children of a single interconnect target module. | ||||
|  | ||||
| @ -0,0 +1,44 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||||
| # Copyright 2019 Linaro Ltd. | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: "http://devicetree.org/schemas/firmware/intel-ixp4xx-network-processing-engine.yaml#" | ||||
| $schema: "http://devicetree.org/meta-schemas/core.yaml#" | ||||
| 
 | ||||
| title: Intel IXP4xx Network Processing Engine | ||||
| 
 | ||||
| maintainers: | ||||
|   - Linus Walleij <linus.walleij@linaro.org> | ||||
| 
 | ||||
| description: | | ||||
|   On the IXP4xx SoCs, the Network Processing Engine (NPE) is a small | ||||
|   processor that can load a firmware to perform offloading of networking | ||||
|   and crypto tasks. It also manages the MDIO bus to the ethernet PHYs | ||||
|   on the IXP4xx platform. All IXP4xx platforms have three NPEs at | ||||
|   consecutive memory locations. They are all included in the same | ||||
|   device node since they are not independent of each other. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     oneOf: | ||||
|       - items: | ||||
|           - const: intel,ixp4xx-network-processing-engine | ||||
| 
 | ||||
|   reg: | ||||
|     minItems: 3 | ||||
|     maxItems: 3 | ||||
|     items: | ||||
|       - description: NPE0 register range | ||||
|       - description: NPE1 register range | ||||
|       - description: NPE2 register range | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     npe@c8006000 { | ||||
|          compatible = "intel,ixp4xx-network-processing-engine"; | ||||
|          reg = <0xc8006000 0x1000>, <0xc8007000 0x1000>, <0xc8008000 0x1000>; | ||||
|     }; | ||||
| @ -0,0 +1,54 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||||
| # Copyright 2018 Linaro Ltd. | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: "http://devicetree.org/schemas/interrupt/intel-ixp4xx-interrupt.yaml#" | ||||
| $schema: "http://devicetree.org/meta-schemas/core.yaml#" | ||||
| 
 | ||||
| title: Intel IXP4xx XScale Networking Processors Interrupt Controller | ||||
| 
 | ||||
| maintainers: | ||||
|   - Linus Walleij <linus.walleij@linaro.org> | ||||
| 
 | ||||
| description: | | ||||
|   This interrupt controller is found in the Intel IXP4xx processors. | ||||
|   Some processors have 32 interrupts, some have up to 64 interrupts. | ||||
|   The exact number of interrupts is determined from the compatible | ||||
|   string. | ||||
| 
 | ||||
|   The distinct IXP4xx families with different interrupt controller | ||||
|   variations are IXP42x, IXP43x, IXP45x and IXP46x. Those four | ||||
|   families were the only ones to reach the developer and consumer | ||||
|   market. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     items: | ||||
|       - enum: | ||||
|         - intel,ixp42x-interrupt | ||||
|         - intel,ixp43x-interrupt | ||||
|         - intel,ixp45x-interrupt | ||||
|         - intel,ixp46x-interrupt | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
|   interrupt-controller: true | ||||
| 
 | ||||
|   '#interrupt-cells': | ||||
|     const: 2 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - interrupt-controller | ||||
|   - '#interrupt-cells' | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     intcon: interrupt-controller@c8003000 { | ||||
|         compatible = "intel,ixp43x-interrupt"; | ||||
|         reg = <0xc8003000 0x100>; | ||||
|         interrupt-controller; | ||||
|         #interrupt-cells = <2>; | ||||
|     }; | ||||
| @ -0,0 +1,49 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||||
| # Copyright 2019 Linaro Ltd. | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: "http://devicetree.org/schemas/misc/intel-ixp4xx-ahb-queue-manager.yaml#" | ||||
| $schema: "http://devicetree.org/meta-schemas/core.yaml#" | ||||
| 
 | ||||
| title: Intel IXP4xx AHB Queue Manager | ||||
| 
 | ||||
| maintainers: | ||||
|   - Linus Walleij <linus.walleij@linaro.org> | ||||
| 
 | ||||
| description: | | ||||
|   The IXP4xx AHB Queue Manager maintains queues as circular buffers in | ||||
|   an 8KB embedded SRAM along with hardware pointers. It is used by both | ||||
|   the XScale processor and the NPEs (Network Processing Units) in the | ||||
|   IXP4xx for accelerating queues, especially for networking. Clients pick | ||||
|   queues from the queue manager with foo-queue = <&qmgr N> where the | ||||
|   &qmgr is a phandle to the queue manager and N is the queue resource | ||||
|   number. The queue resources available and their specific purpose | ||||
|   on a certain IXP4xx system will vary. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     items: | ||||
|       - const: intel,ixp4xx-ahb-queue-manager | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
|   interrupts: | ||||
|     items: | ||||
|       - description: Interrupt for queues 0-31 | ||||
|       - description: Interrupt for queues 32-63 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - interrupts | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/interrupt-controller/irq.h> | ||||
| 
 | ||||
|     qmgr: queue-manager@60000000 { | ||||
|          compatible = "intel,ixp4xx-ahb-queue-manager"; | ||||
|          reg = <0x60000000 0x4000>; | ||||
|          interrupts = <3 IRQ_TYPE_LEVEL_HIGH>, <4 IRQ_TYPE_LEVEL_HIGH>; | ||||
|     }; | ||||
| @ -0,0 +1,42 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||||
| # Copyright 2018 Linaro Ltd. | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: "http://devicetree.org/schemas/timer/intel-ixp4xx-timer.yaml#" | ||||
| $schema: "http://devicetree.org/meta-schemas/core.yaml#" | ||||
| 
 | ||||
| title: Intel IXP4xx XScale Networking Processors Timers | ||||
| 
 | ||||
| maintainers: | ||||
|   - Linus Walleij <linus.walleij@linaro.org> | ||||
| 
 | ||||
| description: This timer is found in the Intel IXP4xx processors. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     items: | ||||
|       - const: intel,ixp4xx-timer | ||||
| 
 | ||||
|   reg: | ||||
|     description: Should contain registers location and length | ||||
| 
 | ||||
|   interrupts: | ||||
|     minItems: 1 | ||||
|     maxItems: 2 | ||||
|     items: | ||||
|       - description: Timer 1 interrupt | ||||
|       - description: Timer 2 interrupt | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - interrupts | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/interrupt-controller/irq.h> | ||||
|     timer@c8005000 { | ||||
|         compatible = "intel,ixp4xx-timer"; | ||||
|         reg = <0xc8005000 0x100>; | ||||
|         interrupts = <5 IRQ_TYPE_LEVEL_HIGH>; | ||||
|     }; | ||||
							
								
								
									
										21
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -1733,11 +1733,21 @@ L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| 
 | ||||
| ARM/INTEL IXP4XX ARM ARCHITECTURE | ||||
| M:	Linus Walleij <linusw@kernel.org> | ||||
| M:	Imre Kaloz <kaloz@openwrt.org> | ||||
| M:	Krzysztof Halasa <khalasa@piap.pl> | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| S:	Maintained | ||||
| F:	Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml | ||||
| F:	Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt | ||||
| F:	Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml | ||||
| F:	Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml | ||||
| F:	arch/arm/mach-ixp4xx/ | ||||
| F:	drivers/clocksource/timer-ixp4xx.c | ||||
| F:	drivers/gpio/gpio-ixp4xx.c | ||||
| F:	drivers/irqchip/irq-ixp4xx.c | ||||
| F:	include/linux/irqchip/irq-ixp4xx.h | ||||
| F:	include/linux/platform_data/timer-ixp4xx.h | ||||
| 
 | ||||
| ARM/INTEL RESEARCH IMOTE/STARGATE 2 MACHINE SUPPORT | ||||
| M:	Jonathan Cameron <jic23@cam.ac.uk> | ||||
| @ -2238,6 +2248,7 @@ F:	arch/arm/mach-socfpga/ | ||||
| F:	arch/arm/boot/dts/socfpga* | ||||
| F:	arch/arm/configs/socfpga_defconfig | ||||
| F:	arch/arm64/boot/dts/altera/ | ||||
| F:	arch/arm64/boot/dts/intel/ | ||||
| W:	http://www.rocketboards.org | ||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git | ||||
| 
 | ||||
| @ -7990,10 +8001,10 @@ F:	Documentation/media/v4l-drivers/ipu3.rst | ||||
| INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT | ||||
| M:	Krzysztof Halasa <khalasa@piap.pl> | ||||
| S:	Maintained | ||||
| F:	arch/arm/mach-ixp4xx/include/mach/qmgr.h | ||||
| F:	arch/arm/mach-ixp4xx/include/mach/npe.h | ||||
| F:	arch/arm/mach-ixp4xx/ixp4xx_qmgr.c | ||||
| F:	arch/arm/mach-ixp4xx/ixp4xx_npe.c | ||||
| F:	include/linux/soc/ixp4xx/qmgr.h | ||||
| F:	include/linux/soc/ixp4xx/npe.h | ||||
| F:	drivers/soc/ixp4xx/ixp4xx-qmgr.c | ||||
| F:	drivers/soc/ixp4xx/ixp4xx-npe.c | ||||
| F:	drivers/net/ethernet/xscale/ixp4xx_eth.c | ||||
| F:	drivers/net/wan/ixp4xx_hss.c | ||||
| 
 | ||||
| @ -15654,7 +15665,7 @@ F:	include/linux/clk/ti.h | ||||
| 
 | ||||
| TI DAVINCI MACHINE SUPPORT | ||||
| M:	Sekhar Nori <nsekhar@ti.com> | ||||
| M:	Kevin Hilman <khilman@kernel.org> | ||||
| R:	Bartosz Golaszewski <bgolaszewski@baylibre.com> | ||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git | ||||
| S:	Supported | ||||
|  | ||||
| @ -426,12 +426,15 @@ config ARCH_IXP4XX | ||||
| 	depends on MMU | ||||
| 	select ARCH_HAS_DMA_SET_COHERENT_MASK | ||||
| 	select ARCH_SUPPORTS_BIG_ENDIAN | ||||
| 	select CLKSRC_MMIO | ||||
| 	select CPU_XSCALE | ||||
| 	select DMABOUNCE if PCI | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_IRQ_MULTI_HANDLER | ||||
| 	select GPIO_IXP4XX | ||||
| 	select GPIOLIB | ||||
| 	select HAVE_PCI | ||||
| 	select IXP4XX_IRQ | ||||
| 	select IXP4XX_TIMER | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select USB_EHCI_BIG_ENDIAN_DESC | ||||
| 	select USB_EHCI_BIG_ENDIAN_MMIO | ||||
| @ -897,8 +900,6 @@ config PLAT_PXA | ||||
| config PLAT_VERSATILE | ||||
| 	bool | ||||
| 
 | ||||
| source "arch/arm/firmware/Kconfig" | ||||
| 
 | ||||
| source "arch/arm/mm/Kconfig" | ||||
| 
 | ||||
| config IWMMXT | ||||
|  | ||||
| @ -1676,6 +1676,7 @@ config DEBUG_UART_PHYS | ||||
| 	default 0xe6e68000 if DEBUG_RCAR_GEN2_SCIF1 | ||||
| 	default 0xe6ee0000 if DEBUG_RCAR_GEN2_SCIF4 | ||||
| 	default 0xe8008000 if DEBUG_R7S72100_SCIF2 | ||||
| 	default 0xf0000000 if DEBUG_DIGICOLOR_UA0 | ||||
| 	default 0xf0000be0 if ARCH_EBSA110 | ||||
| 	default 0xf1012000 if DEBUG_MVEBU_UART0_ALTERNATE | ||||
| 	default 0xf1012100 if DEBUG_MVEBU_UART1_ALTERNATE | ||||
| @ -1727,6 +1728,7 @@ config DEBUG_UART_VIRT | ||||
| 	default 0xe0010fe0 if ARCH_RPC | ||||
| 	default 0xf0000be0 if ARCH_EBSA110 | ||||
| 	default 0xf0010000 if DEBUG_ASM9260_UART | ||||
| 	default 0xf0100000 if DEBUG_DIGICOLOR_UA0 | ||||
| 	default 0xf01fb000 if DEBUG_NOMADIK_UART | ||||
| 	default 0xf0201000 if DEBUG_BCM2835 || DEBUG_BCM2836 | ||||
| 	default 0xf1000300 if DEBUG_BCM_5301X | ||||
|  | ||||
| @ -290,7 +290,6 @@ core-y				+= arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ | ||||
| core-y				+= arch/arm/probes/ | ||||
| core-y				+= arch/arm/net/ | ||||
| core-y				+= arch/arm/crypto/ | ||||
| core-y				+= arch/arm/firmware/ | ||||
| core-y				+= $(machdirs) $(platdirs) | ||||
| 
 | ||||
| drivers-$(CONFIG_OPROFILE)      += arch/arm/oprofile/ | ||||
|  | ||||
| @ -229,6 +229,9 @@ dtb-$(CONFIG_ARCH_HIX5HD2) += \ | ||||
| dtb-$(CONFIG_ARCH_INTEGRATOR) += \
 | ||||
| 	integratorap.dtb \
 | ||||
| 	integratorcp.dtb | ||||
| dtb-$(CONFIG_ARCH_IXP4XX) += \
 | ||||
| 	intel-ixp42x-linksys-nslu2.dtb \
 | ||||
| 	intel-ixp43x-gateworks-gw2358.dtb | ||||
| dtb-$(CONFIG_ARCH_KEYSTONE) += \
 | ||||
| 	keystone-k2hk-evm.dtb \
 | ||||
| 	keystone-k2l-evm.dtb \
 | ||||
|  | ||||
| @ -88,6 +88,7 @@ | ||||
| 		regulator-min-microvolt = <5000000>; | ||||
| 		regulator-max-microvolt = <5000000>; | ||||
| 		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>; | ||||
| 		startup-delay-us = <70000>; | ||||
| 		enable-active-high; | ||||
| 	}; | ||||
| 
 | ||||
| @ -99,6 +100,7 @@ | ||||
| 		regulator-min-microvolt = <3300000>; | ||||
| 		regulator-max-microvolt = <3300000>; | ||||
| 		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>; | ||||
| 		startup-delay-us = <70000>; | ||||
| 		enable-active-high; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
| @ -216,7 +218,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-duration = <10>; | ||||
| 	phy-reset-gpios = <&gpio1 24 GPIO_ACTIVE_LOW>; | ||||
| 	phy-supply = <®_enet>; | ||||
|  | ||||
| @ -92,7 +92,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>; | ||||
| 	interrupts-extended = <&gpio1 6 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			      <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>; | ||||
|  | ||||
| @ -171,7 +171,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -110,7 +110,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| @ -98,7 +98,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| @ -51,7 +51,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-duration = <10>; | ||||
| 	phy-reset-gpios = <&gpio1 24 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| @ -292,7 +292,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	interrupts-extended = <&gpio1 6 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			      <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 	fsl,err006687-workaround-present; | ||||
|  | ||||
| @ -202,7 +202,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| @ -53,7 +53,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_microsom_enet_ar8035>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-duration = <2>; | ||||
| 	phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| @ -224,7 +224,7 @@ | ||||
| &fec { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-reset-gpios = <&gpio3 29 GPIO_ACTIVE_LOW>; | ||||
| 	interrupts-extended = <&gpio1 6 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 			      <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>; | ||||
|  | ||||
| @ -75,7 +75,7 @@ | ||||
| &fec1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet1>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-handle = <ðphy1>; | ||||
| 	fsl,magic-packet; | ||||
| 	status = "okay"; | ||||
|  | ||||
| @ -191,7 +191,7 @@ | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pinctrl_enet1>; | ||||
| 	phy-supply = <®_enet_3v3>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-handle = <ðphy1>; | ||||
| 	phy-reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| @ -92,7 +92,7 @@ | ||||
| 			  <&clks IMX7D_ENET1_TIME_ROOT_CLK>; | ||||
| 	assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>; | ||||
| 	assigned-clock-rates = <0>, <100000000>; | ||||
| 	phy-mode = "rgmii"; | ||||
| 	phy-mode = "rgmii-id"; | ||||
| 	phy-handle = <ðphy0>; | ||||
| 	fsl,magic-packet; | ||||
| 	phy-reset-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>; | ||||
|  | ||||
							
								
								
									
										109
									
								
								arch/arm/boot/dts/intel-ixp42x-linksys-nslu2.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								arch/arm/boot/dts/intel-ixp42x-linksys-nslu2.dts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,109 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Linksys NSLU2 | ||||
|  */ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| 
 | ||||
| #include "intel-ixp42x.dtsi" | ||||
| #include <dt-bindings/input/input.h> | ||||
| 
 | ||||
| / { | ||||
| 	model = "Linksys NSLU2 (Network Storage Link for USB 2.0 Disk Drives)"; | ||||
| 	compatible = "linksys,nslu2", "intel,ixp42x"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 
 | ||||
| 	memory@0 { | ||||
| 		/* 32 MB SDRAM */ | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x00000000 0x2000000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=squashfs,jffs2 rootwait"; | ||||
| 		stdout-path = "uart0:115200n8"; | ||||
| 	}; | ||||
| 
 | ||||
| 	aliases { | ||||
| 		serial0 = &uart0; | ||||
| 	}; | ||||
| 
 | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led-status { | ||||
| 			label = "nslu2:red:status"; | ||||
| 			gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "on"; | ||||
| 			linux,default-trigger = "heartbeat"; | ||||
| 		}; | ||||
| 		led-ready { | ||||
| 			label = "nslu2:green:ready"; | ||||
| 			gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "on"; | ||||
| 		}; | ||||
| 		led-disk-1 { | ||||
| 			label = "nslu2:green:disk-1"; | ||||
| 			gpios = <&gpio0 3 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 		led-disk-2 { | ||||
| 			label = "nslu2:green:disk-2"; | ||||
| 			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	gpio_keys { | ||||
| 		compatible = "gpio-keys"; | ||||
| 
 | ||||
| 		button-power { | ||||
| 			wakeup-source; | ||||
| 			linux,code = <KEY_POWER>; | ||||
| 			label = "power"; | ||||
| 			gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 		button-reset { | ||||
| 			wakeup-source; | ||||
| 			linux,code = <KEY_ESC>; | ||||
| 			label = "reset"; | ||||
| 			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	i2c { | ||||
| 		compatible = "i2c-gpio"; | ||||
| 		sda-gpios = <&gpio0 7 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; | ||||
| 		scl-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 
 | ||||
| 		rtc@6f { | ||||
| 			compatible = "xicor,x1205"; | ||||
| 			reg = <0x6f>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	gpio-poweroff { | ||||
| 		compatible = "gpio-poweroff"; | ||||
| 		gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>; | ||||
| 		timeout-ms = <5000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	/* The first 16MB region on the expansion bus */ | ||||
| 	flash@50000000 { | ||||
| 		compatible = "intel,ixp4xx-flash", "cfi-flash"; | ||||
| 		bank-width = <2>; | ||||
| 		/* | ||||
| 		 * 8 MB of Flash in 0x20000 byte blocks | ||||
| 		 * mapped in at 0x50000000 | ||||
| 		 */ | ||||
| 		reg = <0x50000000 0x800000>; | ||||
| 
 | ||||
| 		partitions { | ||||
| 			compatible = "redboot-fis"; | ||||
| 			/* Eraseblock at 0x7e0000 */ | ||||
| 			fis-index-block = <0x3f>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										25
									
								
								arch/arm/boot/dts/intel-ixp42x.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								arch/arm/boot/dts/intel-ixp42x.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Intel XScale Network Processors | ||||
|  * in the IXP 42x series. This series has 32 interrupts. | ||||
|  */ | ||||
| #include "intel-ixp4xx.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	soc { | ||||
| 		interrupt-controller@c8003000 { | ||||
| 			compatible = "intel,ixp42x-interrupt"; | ||||
| 		}; | ||||
| 
 | ||||
| 		/* | ||||
| 		 * This is the USB Device Mode (UDC) controller, which is used | ||||
| 		 * to present the IXP4xx as a device on a USB bus. | ||||
| 		 */ | ||||
| 		usb@c800b000 { | ||||
| 			compatible = "intel,ixp4xx-udc"; | ||||
| 			reg = <0xc800b000 0x1000>; | ||||
| 			interrupts = <12 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										94
									
								
								arch/arm/boot/dts/intel-ixp43x-gateworks-gw2358.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								arch/arm/boot/dts/intel-ixp43x-gateworks-gw2358.dts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,94 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Gateworks IXP43x-based Cambria GW2358 | ||||
|  */ | ||||
| 
 | ||||
| /dts-v1/; | ||||
| 
 | ||||
| #include "intel-ixp43x.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	model = "Gateworks Cambria GW2358"; | ||||
| 	compatible = "gateworks,gw2358", "intel,ixp43x"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 
 | ||||
| 	memory@0 { | ||||
| 		/* 128 MB SDRAM */ | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x00000000 0x8000000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=squashfs,jffs2 rootwait"; | ||||
| 		stdout-path = "uart0:115200n8"; | ||||
| 	}; | ||||
| 
 | ||||
| 	aliases { | ||||
| 		serial0 = &uart0; | ||||
| 	}; | ||||
| 
 | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led-user { | ||||
| 			label = "gw2358:green:LED"; | ||||
| 			gpios = <&pld1 0 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "on"; | ||||
| 			linux,default-trigger = "heartbeat"; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
| 	i2c { | ||||
| 		compatible = "i2c-gpio"; | ||||
| 		sda-gpios = <&gpio0 7 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; | ||||
| 		scl-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 
 | ||||
| 		hwmon@28 { | ||||
| 			compatible = "adi,ad7418"; | ||||
| 			reg = <0x28>; | ||||
| 		}; | ||||
| 		rtc: ds1672@68 { | ||||
| 			compatible = "dallas,ds1672"; | ||||
| 			reg = <0x68>; | ||||
| 		}; | ||||
| 		eeprom@51 { | ||||
| 			compatible = "atmel,24c08"; | ||||
| 			reg = <0x51>; | ||||
| 			pagesize = <16>; | ||||
| 			size = <1024>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 		pld0: pld@56 { | ||||
| 			compatible = "gateworks,pld-gpio"; | ||||
| 			reg = <0x56>; | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 		}; | ||||
| 		/* This PLD just handles the LED and user button */ | ||||
| 		pld1: pld@57 { | ||||
| 			compatible = "gateworks,pld-gpio"; | ||||
| 			reg = <0x57>; | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	flash@50000000 { | ||||
| 		compatible = "intel,ixp4xx-flash", "cfi-flash"; | ||||
| 		bank-width = <2>; | ||||
| 		/* | ||||
| 		 * 32 MB of Flash in 0x20000 byte blocks | ||||
| 		 * mapped in at 0x50000000 | ||||
| 		 */ | ||||
| 		reg = <0x50000000 0x2000000>; | ||||
| 
 | ||||
| 		partitions { | ||||
| 			compatible = "redboot-fis"; | ||||
| 			/* Eraseblock at 0x1fe0000 */ | ||||
| 			fis-index-block = <0xff>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										15
									
								
								arch/arm/boot/dts/intel-ixp43x.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								arch/arm/boot/dts/intel-ixp43x.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Intel XScale Network Processors | ||||
|  * in the IXP 43x series. This series has 64 interrupts and adds a few more | ||||
|  * peripherals over the 42x series. | ||||
|  */ | ||||
| #include "intel-ixp4xx.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	soc { | ||||
| 		interrupt-controller@c8003000 { | ||||
| 			compatible = "intel,ixp43x-interrupt"; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										34
									
								
								arch/arm/boot/dts/intel-ixp45x-ixp46x.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								arch/arm/boot/dts/intel-ixp45x-ixp46x.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Intel XScale Network Processors | ||||
|  * in the IXP45x and IXP46x series. This series has 64 interrupts and adds a | ||||
|  * few more peripherals over the 42x and 43x series so this extends the | ||||
|  * basic IXP4xx DTSI. | ||||
|  */ | ||||
| #include "intel-ixp4xx.dtsi" | ||||
| 
 | ||||
| / { | ||||
| 	soc { | ||||
| 		interrupt-controller@c8003000 { | ||||
| 			compatible = "intel,ixp43x-interrupt"; | ||||
| 		}; | ||||
| 
 | ||||
| 		/* | ||||
| 		 * This is the USB Device Mode (UDC) controller, which is used | ||||
| 		 * to present the IXP4xx as a device on a USB bus. | ||||
| 		 */ | ||||
| 		usb@c800b000 { | ||||
| 			compatible = "intel,ixp4xx-udc"; | ||||
| 			reg = <0xc800b000 0x1000>; | ||||
| 			interrupts = <12 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
| 		i2c@c8011000 { | ||||
| 			compatible = "intel,ixp4xx-i2c"; | ||||
| 			reg = <0xc8011000 0x18>; | ||||
| 			interrupts = <33 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										69
									
								
								arch/arm/boot/dts/intel-ixp4xx.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								arch/arm/boot/dts/intel-ixp4xx.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| // SPDX-License-Identifier: ISC | ||||
| /* | ||||
|  * Device Tree file for Intel XScale Network Processors | ||||
|  * in the IXP 4xx series. | ||||
|  */ | ||||
| #include <dt-bindings/interrupt-controller/irq.h> | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| 
 | ||||
| / { | ||||
| 	soc { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		ranges; | ||||
| 		compatible = "simple-bus"; | ||||
| 		interrupt-parent = <&intcon>; | ||||
| 
 | ||||
| 		qmgr: queue-manager@60000000 { | ||||
| 			compatible = "intel,ixp4xx-ahb-queue-manager"; | ||||
| 			reg = <0x60000000 0x4000>; | ||||
| 			interrupts = <3 IRQ_TYPE_LEVEL_HIGH>, <4 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 		}; | ||||
| 
 | ||||
| 		uart0: serial@c8000000 { | ||||
| 			compatible = "intel,xscale-uart"; | ||||
| 			reg = <0xc8000000 0x1000>; | ||||
| 			/* | ||||
| 			 * The reg-offset and reg-shift is a side effect | ||||
| 			 * of running the platform in big endian mode. | ||||
| 			 */ | ||||
| 			reg-offset = <3>; | ||||
| 			reg-shift = <2>; | ||||
| 			interrupts = <15 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clock-frequency = <14745600>; | ||||
| 			no-loopback-test; | ||||
| 		}; | ||||
| 
 | ||||
| 		gpio0: gpio@c8004000 { | ||||
| 			compatible = "intel,ixp4xx-gpio"; | ||||
| 			reg = <0xc8004000 0x1000>; | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 			interrupt-controller; | ||||
| 			#interrupt-cells = <2>; | ||||
| 		}; | ||||
| 
 | ||||
| 		intcon: interrupt-controller@c8003000 { | ||||
| 			/* | ||||
| 			 * Note: no compatible string. The subvariant of the | ||||
| 			 * chip needs to define what version it is. The | ||||
| 			 * location of the interrupt controller is fixed in | ||||
| 			 * memory across all variants. | ||||
| 			 */ | ||||
| 			reg = <0xc8003000 0x100>; | ||||
| 			interrupt-controller; | ||||
| 			#interrupt-cells = <2>; | ||||
| 		}; | ||||
| 
 | ||||
| 		timer@c8005000 { | ||||
| 			compatible = "intel,ixp4xx-timer"; | ||||
| 			reg = <0xc8005000 0x100>; | ||||
| 			interrupts = <5 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 		}; | ||||
| 
 | ||||
| 		npe@c8006000 { | ||||
| 			compatible = "intel,ixp4xx-network-processing-engine"; | ||||
| 			reg = <0xc8006000 0x1000>, <0xc8007000 0x1000>, <0xc8008000 0x1000>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| @ -145,7 +145,7 @@ | ||||
| }; | ||||
| 
 | ||||
| &enet0 { | ||||
| 	tbi-handle = <&tbi1>; | ||||
| 	tbi-handle = <&tbi0>; | ||||
| 	phy-handle = <&sgmii_phy2>; | ||||
| 	phy-connection-type = "sgmii"; | ||||
| 	status = "okay"; | ||||
| @ -225,6 +225,13 @@ | ||||
| 	sgmii_phy2: ethernet-phy@2 { | ||||
| 		reg = <0x2>; | ||||
| 	}; | ||||
| 	tbi0: tbi-phy@1f { | ||||
| 		reg = <0x1f>; | ||||
| 		device_type = "tbi-phy"; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| &mdio1 { | ||||
| 	tbi1: tbi-phy@1f { | ||||
| 		reg = <0x1f>; | ||||
| 		device_type = "tbi-phy"; | ||||
|  | ||||
| @ -729,7 +729,7 @@ | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio0: mdio@2d24000 { | ||||
| 			compatible = "gianfar"; | ||||
| 			compatible = "fsl,etsec2-mdio"; | ||||
| 			device_type = "mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| @ -737,6 +737,15 @@ | ||||
| 			      <0x0 0x2d10030 0x0 0x4>; | ||||
| 		}; | ||||
| 
 | ||||
| 		mdio1: mdio@2d64000 { | ||||
| 			compatible = "fsl,etsec2-mdio"; | ||||
| 			device_type = "mdio"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			reg = <0x0 0x2d64000 0x0 0x4000>, | ||||
| 			      <0x0 0x2d50030 0x0 0x4>; | ||||
| 		}; | ||||
| 
 | ||||
| 		ptp_clock@2d10e00 { | ||||
| 			compatible = "fsl,etsec-ptp"; | ||||
| 			reg = <0x0 0x2d10e00 0x0 0xb0>; | ||||
|  | ||||
| @ -169,6 +169,8 @@ | ||||
| 			clock-names = "ahb", "mod"; | ||||
| 			resets = <&ccu RST_BUS_NAND>; | ||||
| 			reset-names = "ahb"; | ||||
| 			pinctrl-names = "default"; | ||||
| 			pinctrl-0 = <&nand_pins &nand_pins_cs0 &nand_pins_rb0>; | ||||
| 			status = "disabled"; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
|  | ||||
| @ -9,7 +9,6 @@ CONFIG_MODULE_UNLOAD=y | ||||
| CONFIG_PARTITION_ADVANCED=y | ||||
| CONFIG_ARCH_EXYNOS=y | ||||
| CONFIG_ARCH_EXYNOS3=y | ||||
| CONFIG_EXYNOS5420_MCPM=y | ||||
| CONFIG_SMP=y | ||||
| CONFIG_BIG_LITTLE=y | ||||
| CONFIG_NR_CPUS=8 | ||||
|  | ||||
| @ -33,7 +33,6 @@ CONFIG_MACH_BERLIN_BG2CD=y | ||||
| CONFIG_MACH_BERLIN_BG2Q=y | ||||
| CONFIG_ARCH_DIGICOLOR=y | ||||
| CONFIG_ARCH_EXYNOS=y | ||||
| CONFIG_EXYNOS5420_MCPM=y | ||||
| CONFIG_ARCH_HIGHBANK=y | ||||
| CONFIG_ARCH_HISI=y | ||||
| CONFIG_ARCH_HI3xxx=y | ||||
|  | ||||
| @ -1,29 +0,0 @@ | ||||
| config ARCH_SUPPORTS_FIRMWARE | ||||
| 	bool | ||||
| 
 | ||||
| config ARCH_SUPPORTS_TRUSTED_FOUNDATIONS | ||||
| 	bool | ||||
| 	select ARCH_SUPPORTS_FIRMWARE | ||||
| 
 | ||||
| menu "Firmware options" | ||||
| 	depends on ARCH_SUPPORTS_FIRMWARE | ||||
| 
 | ||||
| config TRUSTED_FOUNDATIONS | ||||
| 	bool "Trusted Foundations secure monitor support" | ||||
| 	depends on ARCH_SUPPORTS_TRUSTED_FOUNDATIONS | ||||
| 	default y | ||||
| 	help | ||||
| 	  Some devices (including most Tegra-based consumer devices on the | ||||
| 	  market) are booted with the Trusted Foundations secure monitor | ||||
| 	  active, requiring some core operations to be performed by the secure | ||||
| 	  monitor instead of the kernel. | ||||
| 
 | ||||
| 	  This option allows the kernel to invoke the secure monitor whenever | ||||
| 	  required on devices using Trusted Foundations. See | ||||
| 	  arch/arm/include/asm/trusted_foundations.h or the | ||||
| 	  tlm,trusted-foundations device tree binding documentation for details | ||||
| 	  on how to use it. | ||||
| 
 | ||||
| 	  Say n if you don't know what this is about. | ||||
| 
 | ||||
| endmenu | ||||
| @ -1,4 +0,0 @@ | ||||
| obj-$(CONFIG_TRUSTED_FOUNDATIONS)	+= trusted_foundations.o | ||||
| 
 | ||||
| # tf_generic_smc() fails to build with -fsanitize-coverage=trace-pc
 | ||||
| KCOV_INSTRUMENT                := n | ||||
| @ -24,7 +24,7 @@ struct firmware_ops { | ||||
| 	/*
 | ||||
| 	 * Inform the firmware we intend to enter CPU idle mode | ||||
| 	 */ | ||||
| 	int (*prepare_idle)(void); | ||||
| 	int (*prepare_idle)(unsigned long mode); | ||||
| 	/*
 | ||||
| 	 * Enters CPU idle mode | ||||
| 	 */ | ||||
|  | ||||
| @ -29,6 +29,7 @@ | ||||
| #include <linux/platform_data/spi-davinci.h> | ||||
| #include <linux/platform_data/usb-davinci.h> | ||||
| #include <linux/platform_data/ti-aemif.h> | ||||
| #include <linux/regulator/fixed.h> | ||||
| #include <linux/regulator/machine.h> | ||||
| #include <linux/nvmem-provider.h> | ||||
| 
 | ||||
| @ -53,14 +54,50 @@ static const short da830_evm_usb11_pins[] = { | ||||
| 	-1 | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table da830_evm_usb_gpio_lookup = { | ||||
| static struct regulator_consumer_supply da830_evm_usb_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vbus", NULL), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data da830_evm_usb_vbus_data = { | ||||
| 	.consumer_supplies	= da830_evm_usb_supplies, | ||||
| 	.num_consumer_supplies	= ARRAY_SIZE(da830_evm_usb_supplies), | ||||
| }; | ||||
| 
 | ||||
| static struct fixed_voltage_config da830_evm_usb_vbus = { | ||||
| 	.supply_name		= "vbus", | ||||
| 	.microvolts		= 33000000, | ||||
| 	.init_data		= &da830_evm_usb_vbus_data, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device da830_evm_usb_vbus_device = { | ||||
| 	.name		= "reg-fixed-voltage", | ||||
| 	.id		= 0, | ||||
| 	.dev		= { | ||||
| 		.platform_data = &da830_evm_usb_vbus, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table da830_evm_usb_oc_gpio_lookup = { | ||||
| 	.dev_id		= "ohci-da8xx", | ||||
| 	.table = { | ||||
| 		GPIO_LOOKUP("davinci_gpio", ON_BD_USB_DRV, "vbus", 0), | ||||
| 		GPIO_LOOKUP("davinci_gpio", ON_BD_USB_OVC, "oc", 0), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table da830_evm_usb_vbus_gpio_lookup = { | ||||
| 	.dev_id		= "reg-fixed-voltage.0", | ||||
| 	.table = { | ||||
| 		GPIO_LOOKUP("davinci_gpio", ON_BD_USB_DRV, "vbus", 0), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table *da830_evm_usb_gpio_lookups[] = { | ||||
| 	&da830_evm_usb_oc_gpio_lookup, | ||||
| 	&da830_evm_usb_vbus_gpio_lookup, | ||||
| }; | ||||
| 
 | ||||
| static struct da8xx_ohci_root_hub da830_evm_usb11_pdata = { | ||||
| 	/* TPS2065 switch @ 5V */ | ||||
| 	.potpgt		= (3 + 1) / 2,	/* 3 ms max */ | ||||
| @ -75,6 +112,9 @@ static __init void da830_evm_usb_init(void) | ||||
| 		pr_warn("%s: USB PHY CLK registration failed: %d\n", | ||||
| 			__func__, ret); | ||||
| 
 | ||||
| 	gpiod_add_lookup_tables(da830_evm_usb_gpio_lookups, | ||||
| 				ARRAY_SIZE(da830_evm_usb_gpio_lookups)); | ||||
| 
 | ||||
| 	ret = da8xx_register_usb_phy(); | ||||
| 	if (ret) | ||||
| 		pr_warn("%s: USB PHY registration failed: %d\n", | ||||
| @ -100,7 +140,11 @@ static __init void da830_evm_usb_init(void) | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	gpiod_add_lookup_table(&da830_evm_usb_gpio_lookup); | ||||
| 	ret = platform_device_register(&da830_evm_usb_vbus_device); | ||||
| 	if (ret) { | ||||
| 		pr_warn("%s: Unable to register the vbus supply\n", __func__); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = da8xx_register_usb11(&da830_evm_usb11_pdata); | ||||
| 	if (ret) | ||||
| @ -156,6 +200,7 @@ static struct gpiod_lookup_table mmc_gpios_table = { | ||||
| 			    GPIO_ACTIVE_LOW), | ||||
| 		GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_WP_PIN, "wp", | ||||
| 			    GPIO_ACTIVE_LOW), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -784,6 +784,7 @@ static struct gpiod_lookup_table mmc_gpios_table = { | ||||
| 			    GPIO_ACTIVE_LOW), | ||||
| 		GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_WP_PIN, "wp", | ||||
| 			    GPIO_ACTIVE_HIGH), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -121,6 +121,7 @@ static struct gpiod_lookup_table i2c_recovery_gpiod_table = { | ||||
| 			    GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), | ||||
| 		GPIO_LOOKUP("davinci_gpio", DM355_I2C_SCL_PIN, "scl", | ||||
| 			    GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -663,6 +663,7 @@ static struct gpiod_lookup_table i2c_recovery_gpiod_table = { | ||||
| 			    GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), | ||||
| 		GPIO_LOOKUP("davinci_gpio", DM644X_I2C_SCL_PIN, "scl", | ||||
| 			    GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -21,6 +21,7 @@ | ||||
| #include <linux/platform_data/mtd-davinci.h> | ||||
| #include <linux/platform_data/mtd-davinci-aemif.h> | ||||
| #include <linux/platform_data/ti-aemif.h> | ||||
| #include <linux/regulator/fixed.h> | ||||
| #include <linux/regulator/machine.h> | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| @ -298,14 +299,50 @@ static const short da850_hawk_usb11_pins[] = { | ||||
| 	-1 | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table hawk_usb_gpio_lookup = { | ||||
| static struct regulator_consumer_supply hawk_usb_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vbus", NULL), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data hawk_usb_vbus_data = { | ||||
| 	.consumer_supplies	= hawk_usb_supplies, | ||||
| 	.num_consumer_supplies	= ARRAY_SIZE(hawk_usb_supplies), | ||||
| }; | ||||
| 
 | ||||
| static struct fixed_voltage_config hawk_usb_vbus = { | ||||
| 	.supply_name		= "vbus", | ||||
| 	.microvolts		= 3300000, | ||||
| 	.init_data		= &hawk_usb_vbus_data, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device hawk_usb_vbus_device = { | ||||
| 	.name		= "reg-fixed-voltage", | ||||
| 	.id		= 0, | ||||
| 	.dev		= { | ||||
| 		.platform_data = &hawk_usb_vbus, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table hawk_usb_oc_gpio_lookup = { | ||||
| 	.dev_id		= "ohci-da8xx", | ||||
| 	.table = { | ||||
| 		GPIO_LOOKUP("davinci_gpio", DA850_USB1_VBUS_PIN, "vbus", 0), | ||||
| 		GPIO_LOOKUP("davinci_gpio", DA850_USB1_OC_PIN, "oc", 0), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table hawk_usb_vbus_gpio_lookup = { | ||||
| 	.dev_id		= "reg-fixed-voltage.0", | ||||
| 	.table = { | ||||
| 		GPIO_LOOKUP("davinci_gpio", DA850_USB1_VBUS_PIN, NULL, 0), | ||||
| 		{ } | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gpiod_lookup_table *hawk_usb_gpio_lookups[] = { | ||||
| 	&hawk_usb_oc_gpio_lookup, | ||||
| 	&hawk_usb_vbus_gpio_lookup, | ||||
| }; | ||||
| 
 | ||||
| static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = { | ||||
| 	/* TPS2087 switch @ 5V */ | ||||
| 	.potpgt         = (3 + 1) / 2,  /* 3 ms max */ | ||||
| @ -326,12 +363,19 @@ static __init void omapl138_hawk_usb_init(void) | ||||
| 		pr_warn("%s: USB PHY CLK registration failed: %d\n", | ||||
| 			__func__, ret); | ||||
| 
 | ||||
| 	gpiod_add_lookup_tables(hawk_usb_gpio_lookups, | ||||
| 				ARRAY_SIZE(hawk_usb_gpio_lookups)); | ||||
| 
 | ||||
| 	ret = da8xx_register_usb_phy(); | ||||
| 	if (ret) | ||||
| 		pr_warn("%s: USB PHY registration failed: %d\n", | ||||
| 			__func__, ret); | ||||
| 
 | ||||
| 	gpiod_add_lookup_table(&hawk_usb_gpio_lookup); | ||||
| 	ret = platform_device_register(&hawk_usb_vbus_device); | ||||
| 	if (ret) { | ||||
| 		pr_warn("%s: Unable to register the vbus supply\n", __func__); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata); | ||||
| 	if (ret) | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/sizes.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -20,8 +20,9 @@ | ||||
| #include <linux/io.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <linux/clkdev.h> | ||||
| #include <linux/soc/cirrus/ep93xx.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| 
 | ||||
| #include <asm/div64.h> | ||||
| 
 | ||||
|  | ||||
| @ -39,11 +39,13 @@ | ||||
| #include <linux/usb/ohci_pdriver.h> | ||||
| #include <linux/random.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| #include <linux/platform_data/video-ep93xx.h> | ||||
| #include <linux/platform_data/keypad-ep93xx.h> | ||||
| #include <linux/platform_data/spi-ep93xx.h> | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include <linux/soc/cirrus/ep93xx.h> | ||||
| 
 | ||||
| #include "gpio-ep93xx.h" | ||||
| 
 | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/map.h> | ||||
| @ -123,7 +125,7 @@ void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits) | ||||
| /**
 | ||||
|  * ep93xx_chip_revision() - returns the EP93xx chip revision | ||||
|  * | ||||
|  * See <mach/platform.h> for more information. | ||||
|  * See "platform.h" for more information. | ||||
|  */ | ||||
| unsigned int ep93xx_chip_revision(void) | ||||
| { | ||||
|  | ||||
| @ -26,7 +26,7 @@ | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <linux/platform_data/dma-ep93xx.h> | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| 
 | ||||
| #include "soc.h" | ||||
| 
 | ||||
|  | ||||
| @ -33,10 +33,10 @@ | ||||
| 
 | ||||
| #include <sound/cs4271.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| #include <linux/platform_data/video-ep93xx.h> | ||||
| #include <linux/platform_data/spi-ep93xx.h> | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include "gpio-ep93xx.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/sizes.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| #ifndef __ASM_ARCH_HARDWARE_H | ||||
| #define __ASM_ARCH_HARDWARE_H | ||||
| 
 | ||||
| #include <mach/platform.h> | ||||
| #include "platform.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * The EP93xx has two external crystal oscillators.  To generate the | ||||
| @ -16,7 +16,7 @@ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/io.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| 
 | ||||
| #include <linux/platform_data/eth-ep93xx.h> | ||||
| #include <linux/reboot.h> | ||||
| 
 | ||||
| struct device; | ||||
| @ -15,23 +16,9 @@ struct ep93xxfb_mach_info; | ||||
| struct ep93xx_keypad_platform_data; | ||||
| struct ep93xx_spi_info; | ||||
| 
 | ||||
| struct ep93xx_eth_data | ||||
| { | ||||
| 	unsigned char	dev_addr[6]; | ||||
| 	unsigned char	phy_id; | ||||
| }; | ||||
| 
 | ||||
| void ep93xx_map_io(void); | ||||
| void ep93xx_init_irq(void); | ||||
| 
 | ||||
| #define EP93XX_CHIP_REV_D0	3 | ||||
| #define EP93XX_CHIP_REV_D1	4 | ||||
| #define EP93XX_CHIP_REV_E0	5 | ||||
| #define EP93XX_CHIP_REV_E1	6 | ||||
| #define EP93XX_CHIP_REV_E2	7 | ||||
| 
 | ||||
| unsigned int ep93xx_chip_revision(void); | ||||
| 
 | ||||
| void ep93xx_register_flash(unsigned int width, | ||||
| 			   resource_size_t start, resource_size_t size); | ||||
| 
 | ||||
| @ -41,19 +28,11 @@ void ep93xx_register_spi(struct ep93xx_spi_info *info, | ||||
| 			 struct spi_board_info *devices, int num); | ||||
| void ep93xx_register_fb(struct ep93xxfb_mach_info *data); | ||||
| void ep93xx_register_pwm(int pwm0, int pwm1); | ||||
| int ep93xx_pwm_acquire_gpio(struct platform_device *pdev); | ||||
| void ep93xx_pwm_release_gpio(struct platform_device *pdev); | ||||
| void ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data); | ||||
| int ep93xx_keypad_acquire_gpio(struct platform_device *pdev); | ||||
| void ep93xx_keypad_release_gpio(struct platform_device *pdev); | ||||
| void ep93xx_register_i2s(void); | ||||
| int ep93xx_i2s_acquire(void); | ||||
| void ep93xx_i2s_release(void); | ||||
| void ep93xx_register_ac97(void); | ||||
| void ep93xx_register_ide(void); | ||||
| void ep93xx_register_adc(void); | ||||
| int ep93xx_ide_acquire_gpio(struct platform_device *pdev); | ||||
| void ep93xx_ide_release_gpio(struct platform_device *pdev); | ||||
| 
 | ||||
| struct device *ep93xx_init_devices(void); | ||||
| extern void ep93xx_timer_init(void); | ||||
| @ -27,8 +27,8 @@ | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/gpio/machine.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include "hardware.h" | ||||
| #include "gpio-ep93xx.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -25,9 +25,9 @@ | ||||
| 
 | ||||
| #include <linux/mtd/platnand.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| #include <linux/platform_data/video-ep93xx.h> | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include "gpio-ep93xx.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
|  | ||||
| @ -24,8 +24,8 @@ | ||||
| #include <linux/platform_data/spi-ep93xx.h> | ||||
| #include <linux/gpio/machine.h> | ||||
| 
 | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include <mach/hardware.h> | ||||
| #include "gpio-ep93xx.h" | ||||
| #include "hardware.h" | ||||
| #include <mach/irqs.h> | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
|  | ||||
| @ -31,10 +31,10 @@ | ||||
| 
 | ||||
| #include <sound/cs4271.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include "hardware.h" | ||||
| #include <linux/platform_data/video-ep93xx.h> | ||||
| #include <linux/platform_data/spi-ep93xx.h> | ||||
| #include <mach/gpio-ep93xx.h> | ||||
| #include "gpio-ep93xx.h" | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/map.h> | ||||
|  | ||||
| @ -106,21 +106,15 @@ config SOC_EXYNOS5420 | ||||
| 	bool "SAMSUNG EXYNOS5420" | ||||
| 	default y | ||||
| 	depends on ARCH_EXYNOS5 | ||||
| 	select MCPM if SMP | ||||
| 	select ARM_CCI400_PORT_CTRL | ||||
| 	select ARM_CPU_SUSPEND | ||||
| 
 | ||||
| config SOC_EXYNOS5800 | ||||
| 	bool "SAMSUNG EXYNOS5800" | ||||
| 	default y | ||||
| 	depends on SOC_EXYNOS5420 | ||||
| 
 | ||||
| config EXYNOS5420_MCPM | ||||
| 	bool "Exynos5420 Multi-Cluster PM support" | ||||
| 	depends on MCPM && SOC_EXYNOS5420 | ||||
| 	select ARM_CCI400_PORT_CTRL | ||||
| 	select ARM_CPU_SUSPEND | ||||
| 	help | ||||
| 	  This is needed to provide CPU and cluster power management | ||||
| 	  on Exynos5420 implementing big.LITTLE. | ||||
| 
 | ||||
| config EXYNOS_CPU_SUSPEND | ||||
| 	bool | ||||
| 	select ARM_CPU_SUSPEND | ||||
|  | ||||
| @ -18,5 +18,5 @@ plus_sec := $(call as-instr,.arch_extension sec,+sec) | ||||
| AFLAGS_exynos-smc.o		:=-Wa,-march=armv7-a$(plus_sec) | ||||
| AFLAGS_sleep.o			:=-Wa,-march=armv7-a$(plus_sec) | ||||
| 
 | ||||
| obj-$(CONFIG_EXYNOS5420_MCPM)	+= mcpm-exynos.o | ||||
| obj-$(CONFIG_MCPM)		+= mcpm-exynos.o | ||||
| CFLAGS_mcpm-exynos.o		+= -march=armv7-a | ||||
|  | ||||
| @ -91,6 +91,7 @@ extern u32 cp15_save_power; | ||||
| 
 | ||||
| extern void __iomem *sysram_ns_base_addr; | ||||
| extern void __iomem *sysram_base_addr; | ||||
| extern phys_addr_t sysram_base_phys; | ||||
| extern void __iomem *pmu_base_addr; | ||||
| void exynos_sysram_init(void); | ||||
| 
 | ||||
|  | ||||
| @ -33,6 +33,7 @@ static struct platform_device exynos_cpuidle = { | ||||
| }; | ||||
| 
 | ||||
| void __iomem *sysram_base_addr __ro_after_init; | ||||
| phys_addr_t sysram_base_phys __ro_after_init; | ||||
| void __iomem *sysram_ns_base_addr __ro_after_init; | ||||
| 
 | ||||
| void __init exynos_sysram_init(void) | ||||
| @ -43,6 +44,8 @@ void __init exynos_sysram_init(void) | ||||
| 		if (!of_device_is_available(node)) | ||||
| 			continue; | ||||
| 		sysram_base_addr = of_iomap(node, 0); | ||||
| 		sysram_base_phys = of_translate_address(node, | ||||
| 					   of_get_address(node, 0, NULL, NULL)); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -196,6 +196,7 @@ bool __init exynos_secure_firmware_available(void) | ||||
| 		return false; | ||||
| 
 | ||||
| 	addr = of_get_address(nd, 0, NULL, NULL); | ||||
| 	of_node_put(nd); | ||||
| 	if (!addr) { | ||||
| 		pr_err("%s: No address specified.\n", __func__); | ||||
| 		return false; | ||||
|  | ||||
| @ -75,14 +75,25 @@ static int exynos_cpu_powerup(unsigned int cpu, unsigned int cluster) | ||||
| 		 */ | ||||
| 		if (cluster && | ||||
| 		    cluster == MPIDR_AFFINITY_LEVEL(cpu_logical_map(0), 1)) { | ||||
| 			unsigned int timeout = 16; | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * Before we reset the Little cores, we should wait | ||||
| 			 * the SPARE2 register is set to 1 because the init | ||||
| 			 * codes of the iROM will set the register after | ||||
| 			 * initialization. | ||||
| 			 */ | ||||
| 			while (!pmu_raw_readl(S5P_PMU_SPARE2)) | ||||
| 			while (timeout && !pmu_raw_readl(S5P_PMU_SPARE2)) { | ||||
| 				timeout--; | ||||
| 				udelay(10); | ||||
| 			} | ||||
| 
 | ||||
| 			if (timeout == 0) { | ||||
| 				pr_err("cpu %u cluster %u powerup failed\n", | ||||
| 				       cpu, cluster); | ||||
| 				exynos_cpu_power_down(cpunr); | ||||
| 				return -ETIMEDOUT; | ||||
| 			} | ||||
| 
 | ||||
| 			pmu_raw_writel(EXYNOS5420_KFC_CORE_RESET(cpu), | ||||
| 					EXYNOS_SWRESET); | ||||
|  | ||||
| @ -214,13 +214,20 @@ static inline void __iomem *cpu_boot_reg(int cpu) | ||||
|  */ | ||||
| void exynos_core_restart(u32 core_id) | ||||
| { | ||||
| 	unsigned int timeout = 16; | ||||
| 	u32 val; | ||||
| 
 | ||||
| 	if (!of_machine_is_compatible("samsung,exynos3250")) | ||||
| 		return; | ||||
| 
 | ||||
| 	while (!pmu_raw_readl(S5P_PMU_SPARE2)) | ||||
| 	while (timeout && !pmu_raw_readl(S5P_PMU_SPARE2)) { | ||||
| 		timeout--; | ||||
| 		udelay(10); | ||||
| 	} | ||||
| 	if (timeout == 0) { | ||||
| 		pr_err("cpu core %u restart failed\n", core_id); | ||||
| 		return; | ||||
| 	} | ||||
| 	udelay(10); | ||||
| 
 | ||||
| 	val = pmu_raw_readl(EXYNOS_ARM_CORE_STATUS(core_id)); | ||||
|  | ||||
| @ -25,6 +25,13 @@ | ||||
| #define SMC_CMD_L2X0INVALL	(-24) | ||||
| #define SMC_CMD_L2X0DEBUG	(-25) | ||||
| 
 | ||||
| /* For Accessing CP15/SFR (General) */ | ||||
| #define SMC_CMD_REG		(-101) | ||||
| 
 | ||||
| /* defines for SMC_CMD_REG */ | ||||
| #define SMC_REG_CLASS_SFR_W	(0x1 << 30) | ||||
| #define SMC_REG_ID_SFR_W(addr)	(SMC_REG_CLASS_SFR_W | ((addr) >> 2)) | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| 
 | ||||
| extern void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3); | ||||
|  | ||||
| @ -31,6 +31,7 @@ | ||||
| #include <asm/suspend.h> | ||||
| 
 | ||||
| #include "common.h" | ||||
| #include "smc.h" | ||||
| 
 | ||||
| #define REG_TABLE_END (-1U) | ||||
| 
 | ||||
| @ -62,6 +63,8 @@ struct exynos_pm_state { | ||||
| 	int cpu_state; | ||||
| 	unsigned int pmu_spare3; | ||||
| 	void __iomem *sysram_base; | ||||
| 	phys_addr_t sysram_phys; | ||||
| 	bool secure_firmware; | ||||
| }; | ||||
| 
 | ||||
| static const struct exynos_pm_data *pm_data __ro_after_init; | ||||
| @ -265,9 +268,7 @@ static int exynos5420_cpu_suspend(unsigned long arg) | ||||
| 	unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); | ||||
| 	unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); | ||||
| 
 | ||||
| 	writel_relaxed(0x0, pm_state.sysram_base + EXYNOS5420_CPU_STATE); | ||||
| 
 | ||||
| 	if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) { | ||||
| 	if (IS_ENABLED(CONFIG_MCPM)) { | ||||
| 		mcpm_set_entry_vector(cpu, cluster, exynos_cpu_resume); | ||||
| 		mcpm_cpu_suspend(); | ||||
| 	} | ||||
| @ -341,11 +342,16 @@ static void exynos5420_pm_prepare(void) | ||||
| 	 */ | ||||
| 	pm_state.cpu_state = readl_relaxed(pm_state.sysram_base + | ||||
| 					   EXYNOS5420_CPU_STATE); | ||||
| 	writel_relaxed(0x0, pm_state.sysram_base + EXYNOS5420_CPU_STATE); | ||||
| 	if (pm_state.secure_firmware) | ||||
| 		exynos_smc(SMC_CMD_REG, SMC_REG_ID_SFR_W(pm_state.sysram_phys + | ||||
| 							 EXYNOS5420_CPU_STATE), | ||||
| 			   0, 0); | ||||
| 
 | ||||
| 	exynos_pm_enter_sleep_mode(); | ||||
| 
 | ||||
| 	/* ensure at least INFORM0 has the resume address */ | ||||
| 	if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) | ||||
| 	if (IS_ENABLED(CONFIG_MCPM)) | ||||
| 		pmu_raw_writel(__pa_symbol(mcpm_entry_point), S5P_INFORM0); | ||||
| 
 | ||||
| 	tmp = pmu_raw_readl(EXYNOS_L2_OPTION(0)); | ||||
| @ -444,8 +450,27 @@ early_wakeup: | ||||
| 
 | ||||
| static void exynos5420_prepare_pm_resume(void) | ||||
| { | ||||
| 	if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) | ||||
| 	unsigned int mpidr, cluster; | ||||
| 
 | ||||
| 	mpidr = read_cpuid_mpidr(); | ||||
| 	cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); | ||||
| 
 | ||||
| 	if (IS_ENABLED(CONFIG_MCPM)) | ||||
| 		WARN_ON(mcpm_cpu_powered_up()); | ||||
| 
 | ||||
| 	if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) { | ||||
| 		/*
 | ||||
| 		 * When system is resumed on the LITTLE/KFC core (cluster 1), | ||||
| 		 * the DSCR is not properly updated until the power is turned | ||||
| 		 * on also for the cluster 0. Enable it for a while to | ||||
| 		 * propagate the SPNIDEN and SPIDEN signals from Secure JTAG | ||||
| 		 * block and avoid undefined instruction issue on CP14 reset. | ||||
| 		 */ | ||||
| 		pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN, | ||||
| 				EXYNOS_COMMON_CONFIGURATION(0)); | ||||
| 		pmu_raw_writel(0, | ||||
| 				EXYNOS_COMMON_CONFIGURATION(0)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void exynos5420_pm_resume(void) | ||||
| @ -460,6 +485,11 @@ static void exynos5420_pm_resume(void) | ||||
| 	/* Restore the sysram cpu state register */ | ||||
| 	writel_relaxed(pm_state.cpu_state, | ||||
| 		       pm_state.sysram_base + EXYNOS5420_CPU_STATE); | ||||
| 	if (pm_state.secure_firmware) | ||||
| 		exynos_smc(SMC_CMD_REG, | ||||
| 			   SMC_REG_ID_SFR_W(pm_state.sysram_phys + | ||||
| 					    EXYNOS5420_CPU_STATE), | ||||
| 			   EXYNOS_AFTR_MAGIC, 0); | ||||
| 
 | ||||
| 	pmu_raw_writel(EXYNOS5420_USE_STANDBY_WFI_ALL, | ||||
| 			S5P_CENTRAL_SEQ_OPTION); | ||||
| @ -639,8 +669,10 @@ void __init exynos_pm_init(void) | ||||
| 
 | ||||
| 	if (WARN_ON(!of_find_property(np, "interrupt-controller", NULL))) { | ||||
| 		pr_warn("Outdated DT detected, suspend/resume will NOT work\n"); | ||||
| 		of_node_put(np); | ||||
| 		return; | ||||
| 	} | ||||
| 	of_node_put(np); | ||||
| 
 | ||||
| 	pm_data = (const struct exynos_pm_data *) match->data; | ||||
| 
 | ||||
| @ -659,8 +691,11 @@ void __init exynos_pm_init(void) | ||||
| 	 * Applicable as of now only to Exynos542x. If booted under secure | ||||
| 	 * firmware, the non-secure region of sysram should be used. | ||||
| 	 */ | ||||
| 	if (exynos_secure_firmware_available()) | ||||
| 	if (exynos_secure_firmware_available()) { | ||||
| 		pm_state.sysram_phys = sysram_base_phys; | ||||
| 		pm_state.sysram_base = sysram_ns_base_addr; | ||||
| 	else | ||||
| 		pm_state.secure_firmware = true; | ||||
| 	} else { | ||||
| 		pm_state.sysram_base = sysram_base_addr; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -354,9 +354,11 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | ||||
| 	 * | ||||
| 	 * Note that IRQ #32 is GIC SPI #0. | ||||
| 	 */ | ||||
| 	imx_gpc_hwirq_unmask(0); | ||||
| 	if (mode != WAIT_CLOCKED) | ||||
| 		imx_gpc_hwirq_unmask(0); | ||||
| 	writel_relaxed(val, ccm_base + CLPCR); | ||||
| 	imx_gpc_hwirq_mask(0); | ||||
| 	if (mode != WAIT_CLOCKED) | ||||
| 		imx_gpc_hwirq_mask(0); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,20 @@ menu "Intel IXP4xx Implementation Options" | ||||
| 
 | ||||
| comment "IXP4xx Platforms" | ||||
| 
 | ||||
| config MACH_IXP4XX_OF | ||||
| 	bool | ||||
| 	prompt "Devce Tree IXP4xx boards" | ||||
| 	default y | ||||
| 	select ARM_APPENDED_DTB # Old Redboot bootloaders deployed | ||||
| 	select I2C | ||||
| 	select I2C_IOP3XX | ||||
| 	select PCI | ||||
| 	select SERIAL_OF_PLATFORM | ||||
| 	select TIMER_OF | ||||
| 	select USE_OF | ||||
| 	help | ||||
| 	  Say 'Y' here to support Device Tree-based IXP4xx platforms. | ||||
| 
 | ||||
| config MACH_NSLU2 | ||||
| 	bool | ||||
| 	prompt "Linksys NSLU2" | ||||
| @ -222,19 +236,6 @@ config IXP4XX_INDIRECT_PCI | ||||
| 	  need to use the indirect method instead. If you don't know | ||||
| 	  what you need, leave this option unselected. | ||||
| 
 | ||||
| config IXP4XX_QMGR | ||||
| 	tristate "IXP4xx Queue Manager support" | ||||
| 	help | ||||
| 	  This driver supports IXP4xx built-in hardware queue manager | ||||
| 	  and is automatically selected by Ethernet and HSS drivers. | ||||
| 
 | ||||
| config IXP4XX_NPE | ||||
| 	tristate "IXP4xx Network Processor Engine support" | ||||
| 	select FW_LOADER | ||||
| 	help | ||||
| 	  This driver supports IXP4xx built-in network coprocessors | ||||
| 	  and is automatically selected by Ethernet and HSS drivers. | ||||
| 
 | ||||
| endmenu | ||||
| 
 | ||||
| endif | ||||
|  | ||||
| @ -6,6 +6,9 @@ | ||||
| obj-pci-y	:= | ||||
| obj-pci-n	:= | ||||
| 
 | ||||
| # Device tree platform
 | ||||
| obj-pci-$(CONFIG_MACH_IXP4XX_OF)	+= ixp4xx-of.o | ||||
| 
 | ||||
| obj-pci-$(CONFIG_ARCH_IXDP4XX)		+= ixdp425-pci.o | ||||
| obj-pci-$(CONFIG_MACH_AVILA)		+= avila-pci.o | ||||
| obj-pci-$(CONFIG_MACH_IXDPG425)		+= ixdpg425-pci.o | ||||
| @ -40,5 +43,3 @@ obj-$(CONFIG_MACH_GORAMO_MLR)	+= goramo_mlr.o | ||||
| obj-$(CONFIG_MACH_ARCOM_VULCAN)	+= vulcan-setup.o | ||||
| 
 | ||||
| obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||
| obj-$(CONFIG_IXP4XX_QMGR)	+= ixp4xx_qmgr.o | ||||
| obj-$(CONFIG_IXP4XX_NPE)	+= ixp4xx_npe.o | ||||
|  | ||||
| @ -27,6 +27,8 @@ | ||||
| #include <mach/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define AVILA_MAX_DEV	4 | ||||
| #define LOFT_MAX_DEV	6 | ||||
| #define IRQ_LINES	4 | ||||
|  | ||||
| @ -28,6 +28,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define AVILA_SDA_PIN	7 | ||||
| #define AVILA_SCL_PIN	6 | ||||
| 
 | ||||
|  | ||||
| @ -22,42 +22,31 @@ | ||||
| #include <linux/serial_core.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/bitops.h> | ||||
| #include <linux/time.h> | ||||
| #include <linux/clocksource.h> | ||||
| #include <linux/clockchips.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/gpio/driver.h> | ||||
| #include <linux/cpu.h> | ||||
| #include <linux/pci.h> | ||||
| #include <linux/sched_clock.h> | ||||
| #include <linux/bitops.h> | ||||
| #include <linux/irqchip/irq-ixp4xx.h> | ||||
| #include <linux/platform_data/timer-ixp4xx.h> | ||||
| #include <mach/udc.h> | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/io.h> | ||||
| #include <linux/uaccess.h> | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/page.h> | ||||
| #include <asm/exception.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/system_misc.h> | ||||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/irq.h> | ||||
| #include <asm/mach/time.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define IXP4XX_TIMER_FREQ 66666000 | ||||
| 
 | ||||
| /*
 | ||||
|  * The timer register doesn't allow to specify the two least significant bits of | ||||
|  * the timeout value and assumes them being zero. So make sure IXP4XX_LATCH is | ||||
|  * the best value with the two least significant bits unset. | ||||
|  */ | ||||
| #define IXP4XX_LATCH DIV_ROUND_CLOSEST(IXP4XX_TIMER_FREQ, \ | ||||
| 				       (IXP4XX_OST_RELOAD_MASK + 1) * HZ) * \ | ||||
| 			(IXP4XX_OST_RELOAD_MASK + 1) | ||||
| 
 | ||||
| static void __init ixp4xx_clocksource_init(void); | ||||
| static void __init ixp4xx_clockevent_init(void); | ||||
| static struct clock_event_device clockevent_ixp4xx; | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * IXP4xx chipset I/O mapping | ||||
|  *************************************************************************/ | ||||
| @ -77,11 +66,6 @@ static struct map_desc ixp4xx_io_desc[] __initdata = { | ||||
| 		.pfn		= __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS), | ||||
| 		.length		= IXP4XX_PCI_CFG_REGION_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, {	/* Queue Manager */ | ||||
| 		.virtual	= (unsigned long)IXP4XX_QMGR_BASE_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(IXP4XX_QMGR_BASE_PHYS), | ||||
| 		.length		= IXP4XX_QMGR_REGION_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| @ -90,258 +74,23 @@ void __init ixp4xx_map_io(void) | ||||
|   	iotable_init(ixp4xx_io_desc, ARRAY_SIZE(ixp4xx_io_desc)); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * GPIO-functions | ||||
|  */ | ||||
| /*
 | ||||
|  * The following converted to the real HW bits the gpio_line_config | ||||
|  */ | ||||
| /* GPIO pin types */ | ||||
| #define IXP4XX_GPIO_OUT 		0x1 | ||||
| #define IXP4XX_GPIO_IN  		0x2 | ||||
| 
 | ||||
| /* GPIO signal types */ | ||||
| #define IXP4XX_GPIO_LOW			0 | ||||
| #define IXP4XX_GPIO_HIGH		1 | ||||
| 
 | ||||
| /* GPIO Clocks */ | ||||
| #define IXP4XX_GPIO_CLK_0		14 | ||||
| #define IXP4XX_GPIO_CLK_1		15 | ||||
| 
 | ||||
| static void gpio_line_config(u8 line, u32 direction) | ||||
| { | ||||
| 	if (direction == IXP4XX_GPIO_IN) | ||||
| 		*IXP4XX_GPIO_GPOER |= (1 << line); | ||||
| 	else | ||||
| 		*IXP4XX_GPIO_GPOER &= ~(1 << line); | ||||
| } | ||||
| 
 | ||||
| static void gpio_line_get(u8 line, int *value) | ||||
| { | ||||
| 	*value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; | ||||
| } | ||||
| 
 | ||||
| static void gpio_line_set(u8 line, int value) | ||||
| { | ||||
| 	if (value == IXP4XX_GPIO_HIGH) | ||||
| 	    *IXP4XX_GPIO_GPOUTR |= (1 << line); | ||||
| 	else if (value == IXP4XX_GPIO_LOW) | ||||
| 	    *IXP4XX_GPIO_GPOUTR &= ~(1 << line); | ||||
| } | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * IXP4xx chipset IRQ handling | ||||
|  * | ||||
|  * TODO: GPIO IRQs should be marked invalid until the user of the IRQ | ||||
|  *       (be it PCI or something else) configures that GPIO line | ||||
|  *       as an IRQ. | ||||
|  **************************************************************************/ | ||||
| enum ixp4xx_irq_type { | ||||
| 	IXP4XX_IRQ_LEVEL, IXP4XX_IRQ_EDGE | ||||
| }; | ||||
| 
 | ||||
| /* Each bit represents an IRQ: 1: edge-triggered, 0: level triggered */ | ||||
| static unsigned long long ixp4xx_irq_edge = 0; | ||||
| 
 | ||||
| /*
 | ||||
|  * IRQ -> GPIO mapping table | ||||
|  */ | ||||
| static signed char irq2gpio[32] = { | ||||
| 	-1, -1, -1, -1, -1, -1,  0,  1, | ||||
| 	-1, -1, -1, -1, -1, -1, -1, -1, | ||||
| 	-1, -1, -1,  2,  3,  4,  5,  6, | ||||
| 	 7,  8,  9, 10, 11, 12, -1, -1, | ||||
| }; | ||||
| 
 | ||||
| static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) | ||||
| { | ||||
| 	int irq; | ||||
| 
 | ||||
| 	for (irq = 0; irq < 32; irq++) { | ||||
| 		if (irq2gpio[irq] == gpio) | ||||
| 			return irq; | ||||
| 	} | ||||
| 	return -EINVAL; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_set_irq_type(struct irq_data *d, unsigned int type) | ||||
| { | ||||
| 	int line = irq2gpio[d->irq]; | ||||
| 	u32 int_style; | ||||
| 	enum ixp4xx_irq_type irq_type; | ||||
| 	volatile u32 *int_reg; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Only for GPIO IRQs | ||||
| 	 */ | ||||
| 	if (line < 0) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	switch (type){ | ||||
| 	case IRQ_TYPE_EDGE_BOTH: | ||||
| 		int_style = IXP4XX_GPIO_STYLE_TRANSITIONAL; | ||||
| 		irq_type = IXP4XX_IRQ_EDGE; | ||||
| 		break; | ||||
| 	case IRQ_TYPE_EDGE_RISING: | ||||
| 		int_style = IXP4XX_GPIO_STYLE_RISING_EDGE; | ||||
| 		irq_type = IXP4XX_IRQ_EDGE; | ||||
| 		break; | ||||
| 	case IRQ_TYPE_EDGE_FALLING: | ||||
| 		int_style = IXP4XX_GPIO_STYLE_FALLING_EDGE; | ||||
| 		irq_type = IXP4XX_IRQ_EDGE; | ||||
| 		break; | ||||
| 	case IRQ_TYPE_LEVEL_HIGH: | ||||
| 		int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH; | ||||
| 		irq_type = IXP4XX_IRQ_LEVEL; | ||||
| 		break; | ||||
| 	case IRQ_TYPE_LEVEL_LOW: | ||||
| 		int_style = IXP4XX_GPIO_STYLE_ACTIVE_LOW; | ||||
| 		irq_type = IXP4XX_IRQ_LEVEL; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (irq_type == IXP4XX_IRQ_EDGE) | ||||
| 		ixp4xx_irq_edge |= (1 << d->irq); | ||||
| 	else | ||||
| 		ixp4xx_irq_edge &= ~(1 << d->irq); | ||||
| 
 | ||||
| 	if (line >= 8) {	/* pins 8-15 */ | ||||
| 		line -= 8; | ||||
| 		int_reg = IXP4XX_GPIO_GPIT2R; | ||||
| 	} else {		/* pins 0-7 */ | ||||
| 		int_reg = IXP4XX_GPIO_GPIT1R; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Clear the style for the appropriate pin */ | ||||
| 	*int_reg &= ~(IXP4XX_GPIO_STYLE_CLEAR << | ||||
| 	    		(line * IXP4XX_GPIO_STYLE_SIZE)); | ||||
| 
 | ||||
| 	*IXP4XX_GPIO_GPISR = (1 << line); | ||||
| 
 | ||||
| 	/* Set the new style */ | ||||
| 	*int_reg |= (int_style << (line * IXP4XX_GPIO_STYLE_SIZE)); | ||||
| 
 | ||||
| 	/* Configure the line as an input */ | ||||
| 	gpio_line_config(irq2gpio[d->irq], IXP4XX_GPIO_IN); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ixp4xx_irq_mask(struct irq_data *d) | ||||
| { | ||||
| 	if ((cpu_is_ixp46x() || cpu_is_ixp43x()) && d->irq >= 32) | ||||
| 		*IXP4XX_ICMR2 &= ~(1 << (d->irq - 32)); | ||||
| 	else | ||||
| 		*IXP4XX_ICMR &= ~(1 << d->irq); | ||||
| } | ||||
| 
 | ||||
| static void ixp4xx_irq_ack(struct irq_data *d) | ||||
| { | ||||
| 	int line = (d->irq < 32) ? irq2gpio[d->irq] : -1; | ||||
| 
 | ||||
| 	if (line >= 0) | ||||
| 		*IXP4XX_GPIO_GPISR = (1 << line); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Level triggered interrupts on GPIO lines can only be cleared when the | ||||
|  * interrupt condition disappears. | ||||
|  */ | ||||
| static void ixp4xx_irq_unmask(struct irq_data *d) | ||||
| { | ||||
| 	if (!(ixp4xx_irq_edge & (1 << d->irq))) | ||||
| 		ixp4xx_irq_ack(d); | ||||
| 
 | ||||
| 	if ((cpu_is_ixp46x() || cpu_is_ixp43x()) && d->irq >= 32) | ||||
| 		*IXP4XX_ICMR2 |= (1 << (d->irq - 32)); | ||||
| 	else | ||||
| 		*IXP4XX_ICMR |= (1 << d->irq); | ||||
| } | ||||
| 
 | ||||
| static struct irq_chip ixp4xx_irq_chip = { | ||||
| 	.name		= "IXP4xx", | ||||
| 	.irq_ack	= ixp4xx_irq_ack, | ||||
| 	.irq_mask	= ixp4xx_irq_mask, | ||||
| 	.irq_unmask	= ixp4xx_irq_unmask, | ||||
| 	.irq_set_type	= ixp4xx_set_irq_type, | ||||
| }; | ||||
| 
 | ||||
| void __init ixp4xx_init_irq(void) | ||||
| { | ||||
| 	int i = 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * ixp4xx does not implement the XScale PWRMODE register | ||||
| 	 * so it must not call cpu_do_idle(). | ||||
| 	 */ | ||||
| 	cpu_idle_poll_ctrl(true); | ||||
| 
 | ||||
| 	/* Route all sources to IRQ instead of FIQ */ | ||||
| 	*IXP4XX_ICLR = 0x0; | ||||
| 
 | ||||
| 	/* Disable all interrupt */ | ||||
| 	*IXP4XX_ICMR = 0x0;  | ||||
| 
 | ||||
| 	if (cpu_is_ixp46x() || cpu_is_ixp43x()) { | ||||
| 		/* Route upper 32 sources to IRQ instead of FIQ */ | ||||
| 		*IXP4XX_ICLR2 = 0x00; | ||||
| 
 | ||||
| 		/* Disable upper 32 interrupts */ | ||||
| 		*IXP4XX_ICMR2 = 0x00; | ||||
| 	} | ||||
| 
 | ||||
|         /* Default to all level triggered */ | ||||
| 	for(i = 0; i < NR_IRQS; i++) { | ||||
| 		irq_set_chip_and_handler(i, &ixp4xx_irq_chip, | ||||
| 					 handle_level_irq); | ||||
| 		irq_clear_status_flags(i, IRQ_NOREQUEST); | ||||
| 	} | ||||
| 	ixp4xx_irq_init(IXP4XX_INTC_BASE_PHYS, | ||||
| 			(cpu_is_ixp46x() || cpu_is_ixp43x())); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * IXP4xx timer tick | ||||
|  * We use OS timer1 on the CPU for the timer tick and the timestamp  | ||||
|  * counter as a source of real clock ticks to account for missed jiffies. | ||||
|  *************************************************************************/ | ||||
| 
 | ||||
| static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id) | ||||
| { | ||||
| 	struct clock_event_device *evt = dev_id; | ||||
| 
 | ||||
| 	/* Clear Pending Interrupt by writing '1' to it */ | ||||
| 	*IXP4XX_OSST = IXP4XX_OSST_TIMER_1_PEND; | ||||
| 
 | ||||
| 	evt->event_handler(evt); | ||||
| 
 | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
| static struct irqaction ixp4xx_timer_irq = { | ||||
| 	.name		= "timer1", | ||||
| 	.flags		= IRQF_TIMER | IRQF_IRQPOLL, | ||||
| 	.handler	= ixp4xx_timer_interrupt, | ||||
| 	.dev_id		= &clockevent_ixp4xx, | ||||
| }; | ||||
| 
 | ||||
| void __init ixp4xx_timer_init(void) | ||||
| { | ||||
| 	/* Reset/disable counter */ | ||||
| 	*IXP4XX_OSRT1 = 0; | ||||
| 
 | ||||
| 	/* Clear Pending Interrupt by writing '1' to it */ | ||||
| 	*IXP4XX_OSST = IXP4XX_OSST_TIMER_1_PEND; | ||||
| 
 | ||||
| 	/* Reset time-stamp counter */ | ||||
| 	*IXP4XX_OSTS = 0; | ||||
| 
 | ||||
| 	/* Connect the interrupt handler and enable the interrupt */ | ||||
| 	setup_irq(IRQ_IXP4XX_TIMER1, &ixp4xx_timer_irq); | ||||
| 
 | ||||
| 	ixp4xx_clocksource_init(); | ||||
| 	ixp4xx_clockevent_init(); | ||||
| 	return ixp4xx_timer_setup(IXP4XX_TIMER_BASE_PHYS, | ||||
| 				  IRQ_IXP4XX_TIMER1, | ||||
| 				  IXP4XX_TIMER_FREQ); | ||||
| } | ||||
| 
 | ||||
| static struct pxa2xx_udc_mach_info ixp4xx_udc_info; | ||||
| @ -364,6 +113,24 @@ static struct resource ixp4xx_udc_resources[] = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct resource ixp4xx_gpio_resource[] = { | ||||
| 	{ | ||||
| 		.start = IXP4XX_GPIO_BASE_PHYS, | ||||
| 		.end = IXP4XX_GPIO_BASE_PHYS + 0xfff, | ||||
| 		.flags = IORESOURCE_MEM, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device ixp4xx_gpio_device = { | ||||
| 	.name           = "ixp4xx-gpio", | ||||
| 	.id             = -1, | ||||
| 	.dev = { | ||||
| 		.coherent_dma_mask      = DMA_BIT_MASK(32), | ||||
| 	}, | ||||
| 	.resource = ixp4xx_gpio_resource, | ||||
| 	.num_resources  = ARRAY_SIZE(ixp4xx_gpio_resource), | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * USB device controller. The IXP4xx uses the same controller as PXA25X, | ||||
|  * so we just use the same device. | ||||
| @ -378,7 +145,61 @@ static struct platform_device ixp4xx_udc_device = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct resource ixp4xx_npe_resources[] = { | ||||
| 	{ | ||||
| 		.start = IXP4XX_NPEA_BASE_PHYS, | ||||
| 		.end = IXP4XX_NPEA_BASE_PHYS + 0xfff, | ||||
| 		.flags = IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start = IXP4XX_NPEB_BASE_PHYS, | ||||
| 		.end = IXP4XX_NPEB_BASE_PHYS + 0xfff, | ||||
| 		.flags = IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start = IXP4XX_NPEC_BASE_PHYS, | ||||
| 		.end = IXP4XX_NPEC_BASE_PHYS + 0xfff, | ||||
| 		.flags = IORESOURCE_MEM, | ||||
| 	}, | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device ixp4xx_npe_device = { | ||||
| 	.name           = "ixp4xx-npe", | ||||
| 	.id             = -1, | ||||
| 	.num_resources  = ARRAY_SIZE(ixp4xx_npe_resources), | ||||
| 	.resource       = ixp4xx_npe_resources, | ||||
| }; | ||||
| 
 | ||||
| static struct resource ixp4xx_qmgr_resources[] = { | ||||
| 	{ | ||||
| 		.start = IXP4XX_QMGR_BASE_PHYS, | ||||
| 		.end = IXP4XX_QMGR_BASE_PHYS + 0x3fff, | ||||
| 		.flags = IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start = IRQ_IXP4XX_QM1, | ||||
| 		.end = IRQ_IXP4XX_QM1, | ||||
| 		.flags = IORESOURCE_IRQ, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.start = IRQ_IXP4XX_QM2, | ||||
| 		.end = IRQ_IXP4XX_QM2, | ||||
| 		.flags = IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device ixp4xx_qmgr_device = { | ||||
| 	.name           = "ixp4xx-qmgr", | ||||
| 	.id             = -1, | ||||
| 	.num_resources  = ARRAY_SIZE(ixp4xx_qmgr_resources), | ||||
| 	.resource       = ixp4xx_qmgr_resources, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *ixp4xx_devices[] __initdata = { | ||||
| 	&ixp4xx_npe_device, | ||||
| 	&ixp4xx_qmgr_device, | ||||
| 	&ixp4xx_gpio_device, | ||||
| 	&ixp4xx_udc_device, | ||||
| }; | ||||
| 
 | ||||
| @ -413,56 +234,12 @@ static struct platform_device *ixp46x_devices[] __initdata = { | ||||
| unsigned long ixp4xx_exp_bus_size; | ||||
| EXPORT_SYMBOL(ixp4xx_exp_bus_size); | ||||
| 
 | ||||
| static int ixp4xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) | ||||
| { | ||||
| 	gpio_line_config(gpio, IXP4XX_GPIO_IN); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, | ||||
| 					int level) | ||||
| { | ||||
| 	gpio_line_set(gpio, level); | ||||
| 	gpio_line_config(gpio, IXP4XX_GPIO_OUT); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_gpio_get_value(struct gpio_chip *chip, unsigned gpio) | ||||
| { | ||||
| 	int value; | ||||
| 
 | ||||
| 	gpio_line_get(gpio, &value); | ||||
| 
 | ||||
| 	return value; | ||||
| } | ||||
| 
 | ||||
| static void ixp4xx_gpio_set_value(struct gpio_chip *chip, unsigned gpio, | ||||
| 				  int value) | ||||
| { | ||||
| 	gpio_line_set(gpio, value); | ||||
| } | ||||
| 
 | ||||
| static struct gpio_chip ixp4xx_gpio_chip = { | ||||
| 	.label			= "IXP4XX_GPIO_CHIP", | ||||
| 	.direction_input	= ixp4xx_gpio_direction_input, | ||||
| 	.direction_output	= ixp4xx_gpio_direction_output, | ||||
| 	.get			= ixp4xx_gpio_get_value, | ||||
| 	.set			= ixp4xx_gpio_set_value, | ||||
| 	.to_irq			= ixp4xx_gpio_to_irq, | ||||
| 	.base			= 0, | ||||
| 	.ngpio			= 16, | ||||
| }; | ||||
| 
 | ||||
| void __init ixp4xx_sys_init(void) | ||||
| { | ||||
| 	ixp4xx_exp_bus_size = SZ_16M; | ||||
| 
 | ||||
| 	platform_add_devices(ixp4xx_devices, ARRAY_SIZE(ixp4xx_devices)); | ||||
| 
 | ||||
| 	gpiochip_add_data(&ixp4xx_gpio_chip, NULL); | ||||
| 
 | ||||
| 	if (cpu_is_ixp46x()) { | ||||
| 		int region; | ||||
| 
 | ||||
| @ -481,103 +258,8 @@ void __init ixp4xx_sys_init(void) | ||||
| 			ixp4xx_exp_bus_size >> 20); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * sched_clock() | ||||
|  */ | ||||
| static u64 notrace ixp4xx_read_sched_clock(void) | ||||
| { | ||||
| 	return *IXP4XX_OSTS; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * clocksource | ||||
|  */ | ||||
| 
 | ||||
| static u64 ixp4xx_clocksource_read(struct clocksource *c) | ||||
| { | ||||
| 	return *IXP4XX_OSTS; | ||||
| } | ||||
| 
 | ||||
| unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ; | ||||
| EXPORT_SYMBOL(ixp4xx_timer_freq); | ||||
| static void __init ixp4xx_clocksource_init(void) | ||||
| { | ||||
| 	sched_clock_register(ixp4xx_read_sched_clock, 32, ixp4xx_timer_freq); | ||||
| 
 | ||||
| 	clocksource_mmio_init(NULL, "OSTS", ixp4xx_timer_freq, 200, 32, | ||||
| 			ixp4xx_clocksource_read); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * clockevents | ||||
|  */ | ||||
| static int ixp4xx_set_next_event(unsigned long evt, | ||||
| 				 struct clock_event_device *unused) | ||||
| { | ||||
| 	unsigned long opts = *IXP4XX_OSRT1 & IXP4XX_OST_RELOAD_MASK; | ||||
| 
 | ||||
| 	*IXP4XX_OSRT1 = (evt & ~IXP4XX_OST_RELOAD_MASK) | opts; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_shutdown(struct clock_event_device *evt) | ||||
| { | ||||
| 	unsigned long opts = *IXP4XX_OSRT1 & IXP4XX_OST_RELOAD_MASK; | ||||
| 	unsigned long osrt = *IXP4XX_OSRT1 & ~IXP4XX_OST_RELOAD_MASK; | ||||
| 
 | ||||
| 	opts &= ~IXP4XX_OST_ENABLE; | ||||
| 	*IXP4XX_OSRT1 = osrt | opts; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_set_oneshot(struct clock_event_device *evt) | ||||
| { | ||||
| 	unsigned long opts = IXP4XX_OST_ENABLE | IXP4XX_OST_ONE_SHOT; | ||||
| 	unsigned long osrt = 0; | ||||
| 
 | ||||
| 	/* period set by 'set next_event' */ | ||||
| 	*IXP4XX_OSRT1 = osrt | opts; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_set_periodic(struct clock_event_device *evt) | ||||
| { | ||||
| 	unsigned long opts = IXP4XX_OST_ENABLE; | ||||
| 	unsigned long osrt = IXP4XX_LATCH & ~IXP4XX_OST_RELOAD_MASK; | ||||
| 
 | ||||
| 	*IXP4XX_OSRT1 = osrt | opts; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ixp4xx_resume(struct clock_event_device *evt) | ||||
| { | ||||
| 	unsigned long opts = *IXP4XX_OSRT1 & IXP4XX_OST_RELOAD_MASK; | ||||
| 	unsigned long osrt = *IXP4XX_OSRT1 & ~IXP4XX_OST_RELOAD_MASK; | ||||
| 
 | ||||
| 	opts |= IXP4XX_OST_ENABLE; | ||||
| 	*IXP4XX_OSRT1 = osrt | opts; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct clock_event_device clockevent_ixp4xx = { | ||||
| 	.name			= "ixp4xx timer1", | ||||
| 	.features		= CLOCK_EVT_FEAT_PERIODIC | | ||||
| 				  CLOCK_EVT_FEAT_ONESHOT, | ||||
| 	.rating			= 200, | ||||
| 	.set_state_shutdown	= ixp4xx_shutdown, | ||||
| 	.set_state_periodic	= ixp4xx_set_periodic, | ||||
| 	.set_state_oneshot	= ixp4xx_set_oneshot, | ||||
| 	.tick_resume		= ixp4xx_resume, | ||||
| 	.set_next_event		= ixp4xx_set_next_event, | ||||
| }; | ||||
| 
 | ||||
| static void __init ixp4xx_clockevent_init(void) | ||||
| { | ||||
| 	clockevent_ixp4xx.cpumask = cpumask_of(0); | ||||
| 	clockevents_config_and_register(&clockevent_ixp4xx, IXP4XX_TIMER_FREQ, | ||||
| 					0xf, 0xfffffffe); | ||||
| } | ||||
| 
 | ||||
| void ixp4xx_restart(enum reboot_mode mode, const char *cmd) | ||||
| { | ||||
|  | ||||
| @ -23,6 +23,8 @@ | ||||
| #include <asm/irq.h> | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define SLOT0_DEVID	14 | ||||
| #define SLOT1_DEVID	15 | ||||
| 
 | ||||
|  | ||||
| @ -25,6 +25,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define COYOTE_IDE_BASE_PHYS	IXP4XX_EXP_BUS_BASE(3) | ||||
| #define COYOTE_IDE_BASE_VIRT	0xFFFE1000 | ||||
| #define COYOTE_IDE_REGION_SIZE	0x1000 | ||||
|  | ||||
| @ -22,6 +22,8 @@ | ||||
| #include <asm/mach/pci.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define MAX_DEV		4 | ||||
| #define IRQ_LINES	3 | ||||
| 
 | ||||
|  | ||||
| @ -35,6 +35,8 @@ | ||||
| #include <asm/mach/flash.h> | ||||
| #include <asm/mach/time.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define DSMG600_SDA_PIN		5 | ||||
| #define DSMG600_SCL_PIN		4 | ||||
| 
 | ||||
| @ -268,9 +270,6 @@ static void __init dsmg600_init(void) | ||||
| { | ||||
| 	ixp4xx_sys_init(); | ||||
| 
 | ||||
| 	/* Make sure that GPIO14 and GPIO15 are not used as clocks */ | ||||
| 	*IXP4XX_GPIO_GPCLKR = 0; | ||||
| 
 | ||||
| 	dsmg600_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||
| 	dsmg600_flash_resource.end = | ||||
| 		IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; | ||||
|  | ||||
| @ -22,6 +22,8 @@ | ||||
| #include <asm/mach/pci.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define MAX_DEV		3 | ||||
| #define IRQ_LINES	3 | ||||
| 
 | ||||
|  | ||||
| @ -29,6 +29,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define FSG_SDA_PIN		12 | ||||
| #define FSG_SCL_PIN		13 | ||||
| 
 | ||||
|  | ||||
| @ -27,6 +27,8 @@ | ||||
| 
 | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| void __init gateway7001_pci_preinit(void) | ||||
| { | ||||
| 	irq_set_irq_type(IRQ_IXP4XX_GPIO10, IRQ_TYPE_LEVEL_LOW); | ||||
|  | ||||
| @ -28,6 +28,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| static struct flash_platform_data gateway7001_flash_data = { | ||||
| 	.map_name	= "cfi_probe", | ||||
| 	.width		= 2, | ||||
|  | ||||
| @ -30,6 +30,8 @@ | ||||
| #include <mach/hardware.h> | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define SLOT0_DEVID	0 | ||||
| #define SLOT1_DEVID	1 | ||||
| #define INTA		10 /* slot 1 has INTA and INTB crossed */ | ||||
|  | ||||
| @ -36,6 +36,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| /* GPIO 5,6,7 and 12 are hard wired to the Kendin KS8995M Switch
 | ||||
|    and operate as an SPI type interface.  The details of the interface | ||||
|    are available on Kendin/Micrel's web site. */ | ||||
|  | ||||
| @ -1,41 +0,0 @@ | ||||
| /* | ||||
|  * arch/arm/mach-ixp4xx/include/mach/entry-macro.S | ||||
|  * | ||||
|  * Low-level IRQ helper macros for IXP4xx-based platforms | ||||
|  * | ||||
|  * 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 <mach/hardware.h> | ||||
| 
 | ||||
| 		.macro  get_irqnr_preamble, base, tmp | ||||
| 		.endm | ||||
| 
 | ||||
| 		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp | ||||
| 		ldr	\irqstat, =(IXP4XX_INTC_BASE_VIRT+IXP4XX_ICIP_OFFSET) | ||||
| 		ldr	\irqstat, [\irqstat]		@ get interrupts
 | ||||
| 		cmp	\irqstat, #0 | ||||
| 		beq	1001f				@ upper IRQ?
 | ||||
| 		clz     \irqnr, \irqstat | ||||
| 		mov     \base, #31 | ||||
| 		sub     \irqnr, \base, \irqnr | ||||
| 		b	1002f				@ lower IRQ being
 | ||||
| 							@ handled
 | ||||
| 
 | ||||
| 1001: | ||||
| 		/* | ||||
| 		 * IXP465/IXP435 has an upper IRQ status register | ||||
| 		 */ | ||||
| #if defined(CONFIG_CPU_IXP46X) || defined(CONFIG_CPU_IXP43X) | ||||
| 		ldr	\irqstat, =(IXP4XX_INTC_BASE_VIRT+IXP4XX_ICIP2_OFFSET) | ||||
| 		ldr	\irqstat, [\irqstat]		@ get upper interrupts
 | ||||
| 		mov	\irqnr, #63 | ||||
| 		clz	\irqstat, \irqstat | ||||
|  		cmp	\irqstat, #32 | ||||
| 		subne	\irqnr, \irqnr, \irqstat | ||||
| #endif | ||||
| 1002: | ||||
| 		.endm | ||||
| 
 | ||||
| 
 | ||||
| @ -1,75 +0,0 @@ | ||||
| /*
 | ||||
|  * arch/arm/mach-ixp4xx/include/mach/irqs.h  | ||||
|  * | ||||
|  * IRQ definitions for IXP4XX based systems | ||||
|  * | ||||
|  * Copyright (C) 2002 Intel Corporation. | ||||
|  * Copyright (C) 2003 MontaVista Software, Inc. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _ARCH_IXP4XX_IRQS_H_ | ||||
| #define _ARCH_IXP4XX_IRQS_H_ | ||||
| 
 | ||||
| #define IRQ_IXP4XX_NPEA		0 | ||||
| #define IRQ_IXP4XX_NPEB		1 | ||||
| #define IRQ_IXP4XX_NPEC		2 | ||||
| #define IRQ_IXP4XX_QM1		3 | ||||
| #define IRQ_IXP4XX_QM2		4 | ||||
| #define IRQ_IXP4XX_TIMER1	5 | ||||
| #define IRQ_IXP4XX_GPIO0	6 | ||||
| #define IRQ_IXP4XX_GPIO1	7 | ||||
| #define IRQ_IXP4XX_PCI_INT	8 | ||||
| #define IRQ_IXP4XX_PCI_DMA1	9 | ||||
| #define IRQ_IXP4XX_PCI_DMA2	10 | ||||
| #define IRQ_IXP4XX_TIMER2	11 | ||||
| #define IRQ_IXP4XX_USB		12 | ||||
| #define IRQ_IXP4XX_UART2	13 | ||||
| #define IRQ_IXP4XX_TIMESTAMP	14 | ||||
| #define IRQ_IXP4XX_UART1	15 | ||||
| #define IRQ_IXP4XX_WDOG		16 | ||||
| #define IRQ_IXP4XX_AHB_PMU	17 | ||||
| #define IRQ_IXP4XX_XSCALE_PMU	18 | ||||
| #define IRQ_IXP4XX_GPIO2	19 | ||||
| #define IRQ_IXP4XX_GPIO3	20 | ||||
| #define IRQ_IXP4XX_GPIO4	21 | ||||
| #define IRQ_IXP4XX_GPIO5	22 | ||||
| #define IRQ_IXP4XX_GPIO6	23 | ||||
| #define IRQ_IXP4XX_GPIO7	24 | ||||
| #define IRQ_IXP4XX_GPIO8	25 | ||||
| #define IRQ_IXP4XX_GPIO9	26 | ||||
| #define IRQ_IXP4XX_GPIO10	27 | ||||
| #define IRQ_IXP4XX_GPIO11	28 | ||||
| #define IRQ_IXP4XX_GPIO12	29 | ||||
| #define IRQ_IXP4XX_SW_INT1	30 | ||||
| #define IRQ_IXP4XX_SW_INT2	31 | ||||
| #define IRQ_IXP4XX_USB_HOST	32 | ||||
| #define IRQ_IXP4XX_I2C		33 | ||||
| #define IRQ_IXP4XX_SSP		34 | ||||
| #define IRQ_IXP4XX_TSYNC	35 | ||||
| #define IRQ_IXP4XX_EAU_DONE	36 | ||||
| #define IRQ_IXP4XX_SHA_DONE	37 | ||||
| #define IRQ_IXP4XX_SWCP_PE	58 | ||||
| #define IRQ_IXP4XX_QM_PE	60 | ||||
| #define IRQ_IXP4XX_MCU_ECC	61 | ||||
| #define IRQ_IXP4XX_EXP_PE	62 | ||||
| 
 | ||||
| #define _IXP4XX_GPIO_IRQ(n)	(IRQ_IXP4XX_GPIO ## n) | ||||
| #define IXP4XX_GPIO_IRQ(n)	_IXP4XX_GPIO_IRQ(n) | ||||
| 
 | ||||
| /*
 | ||||
|  * Only first 32 sources are valid if running on IXP42x systems | ||||
|  */ | ||||
| #if defined(CONFIG_CPU_IXP46X) || defined(CONFIG_CPU_IXP43X) | ||||
| #define NR_IRQS			64 | ||||
| #else | ||||
| #define NR_IRQS			32 | ||||
| #endif | ||||
| 
 | ||||
| #define	XSCALE_PMU_IRQ		(IRQ_IXP4XX_XSCALE_PMU) | ||||
| 
 | ||||
| #endif | ||||
| @ -43,8 +43,6 @@ | ||||
|  * Queue Manager | ||||
|  */ | ||||
| #define IXP4XX_QMGR_BASE_PHYS		0x60000000 | ||||
| #define IXP4XX_QMGR_BASE_VIRT		IOMEM(0xFEF15000) | ||||
| #define IXP4XX_QMGR_REGION_SIZE		0x00004000 | ||||
| 
 | ||||
| /*
 | ||||
|  * Peripheral space, including debug UART. Must be section-aligned so that | ||||
| @ -132,9 +130,6 @@ | ||||
| #define IXP4XX_INTC_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000) | ||||
| #define IXP4XX_GPIO_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000) | ||||
| #define IXP4XX_TIMER_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000) | ||||
| #define IXP4XX_NPEA_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x6000) | ||||
| #define IXP4XX_NPEB_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x7000) | ||||
| #define IXP4XX_NPEC_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x8000) | ||||
| #define IXP4XX_EthB_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000) | ||||
| #define IXP4XX_EthC_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000) | ||||
| #define IXP4XX_USB_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000) | ||||
| @ -147,95 +142,6 @@ | ||||
| #define IXP4XX_I2C_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x11000) | ||||
| #define IXP4XX_SSP_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x12000) | ||||
| 
 | ||||
| /*
 | ||||
|  * Constants to make it easy to access  Interrupt Controller registers | ||||
|  */ | ||||
| #define IXP4XX_ICPR_OFFSET	0x00 /* Interrupt Status */ | ||||
| #define IXP4XX_ICMR_OFFSET	0x04 /* Interrupt Enable */ | ||||
| #define IXP4XX_ICLR_OFFSET	0x08 /* Interrupt IRQ/FIQ Select */ | ||||
| #define IXP4XX_ICIP_OFFSET      0x0C /* IRQ Status */ | ||||
| #define IXP4XX_ICFP_OFFSET	0x10 /* FIQ Status */ | ||||
| #define IXP4XX_ICHR_OFFSET	0x14 /* Interrupt Priority */ | ||||
| #define IXP4XX_ICIH_OFFSET	0x18 /* IRQ Highest Pri Int */ | ||||
| #define IXP4XX_ICFH_OFFSET	0x1C /* FIQ Highest Pri Int */ | ||||
| 
 | ||||
| /*
 | ||||
|  * IXP465-only | ||||
|  */ | ||||
| #define	IXP4XX_ICPR2_OFFSET	0x20 /* Interrupt Status 2 */ | ||||
| #define	IXP4XX_ICMR2_OFFSET	0x24 /* Interrupt Enable 2 */ | ||||
| #define	IXP4XX_ICLR2_OFFSET	0x28 /* Interrupt IRQ/FIQ Select 2 */ | ||||
| #define IXP4XX_ICIP2_OFFSET     0x2C /* IRQ Status */ | ||||
| #define IXP4XX_ICFP2_OFFSET	0x30 /* FIQ Status */ | ||||
| #define IXP4XX_ICEEN_OFFSET	0x34 /* Error High Pri Enable */ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Interrupt Controller Register Definitions. | ||||
|  */ | ||||
| 
 | ||||
| #define IXP4XX_INTC_REG(x) ((volatile u32 *)(IXP4XX_INTC_BASE_VIRT+(x))) | ||||
| 
 | ||||
| #define IXP4XX_ICPR	IXP4XX_INTC_REG(IXP4XX_ICPR_OFFSET) | ||||
| #define IXP4XX_ICMR     IXP4XX_INTC_REG(IXP4XX_ICMR_OFFSET) | ||||
| #define IXP4XX_ICLR     IXP4XX_INTC_REG(IXP4XX_ICLR_OFFSET) | ||||
| #define IXP4XX_ICIP     IXP4XX_INTC_REG(IXP4XX_ICIP_OFFSET) | ||||
| #define IXP4XX_ICFP     IXP4XX_INTC_REG(IXP4XX_ICFP_OFFSET) | ||||
| #define IXP4XX_ICHR     IXP4XX_INTC_REG(IXP4XX_ICHR_OFFSET) | ||||
| #define IXP4XX_ICIH     IXP4XX_INTC_REG(IXP4XX_ICIH_OFFSET)  | ||||
| #define IXP4XX_ICFH     IXP4XX_INTC_REG(IXP4XX_ICFH_OFFSET) | ||||
| #define IXP4XX_ICPR2	IXP4XX_INTC_REG(IXP4XX_ICPR2_OFFSET) | ||||
| #define IXP4XX_ICMR2    IXP4XX_INTC_REG(IXP4XX_ICMR2_OFFSET) | ||||
| #define IXP4XX_ICLR2    IXP4XX_INTC_REG(IXP4XX_ICLR2_OFFSET) | ||||
| #define IXP4XX_ICIP2    IXP4XX_INTC_REG(IXP4XX_ICIP2_OFFSET) | ||||
| #define IXP4XX_ICFP2    IXP4XX_INTC_REG(IXP4XX_ICFP2_OFFSET) | ||||
| #define IXP4XX_ICEEN    IXP4XX_INTC_REG(IXP4XX_ICEEN_OFFSET) | ||||
|                                                                                  | ||||
| /*
 | ||||
|  * Constants to make it easy to access GPIO registers | ||||
|  */ | ||||
| #define IXP4XX_GPIO_GPOUTR_OFFSET       0x00 | ||||
| #define IXP4XX_GPIO_GPOER_OFFSET        0x04 | ||||
| #define IXP4XX_GPIO_GPINR_OFFSET        0x08 | ||||
| #define IXP4XX_GPIO_GPISR_OFFSET        0x0C | ||||
| #define IXP4XX_GPIO_GPIT1R_OFFSET	0x10 | ||||
| #define IXP4XX_GPIO_GPIT2R_OFFSET	0x14 | ||||
| #define IXP4XX_GPIO_GPCLKR_OFFSET	0x18 | ||||
| #define IXP4XX_GPIO_GPDBSELR_OFFSET	0x1C | ||||
| 
 | ||||
| /* 
 | ||||
|  * GPIO Register Definitions. | ||||
|  * [Only perform 32bit reads/writes] | ||||
|  */ | ||||
| #define IXP4XX_GPIO_REG(x) ((volatile u32 *)(IXP4XX_GPIO_BASE_VIRT+(x))) | ||||
| 
 | ||||
| #define IXP4XX_GPIO_GPOUTR	IXP4XX_GPIO_REG(IXP4XX_GPIO_GPOUTR_OFFSET) | ||||
| #define IXP4XX_GPIO_GPOER       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPOER_OFFSET) | ||||
| #define IXP4XX_GPIO_GPINR       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPINR_OFFSET) | ||||
| #define IXP4XX_GPIO_GPISR       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPISR_OFFSET) | ||||
| #define IXP4XX_GPIO_GPIT1R      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPIT1R_OFFSET) | ||||
| #define IXP4XX_GPIO_GPIT2R      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPIT2R_OFFSET) | ||||
| #define IXP4XX_GPIO_GPCLKR      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPCLKR_OFFSET) | ||||
| #define IXP4XX_GPIO_GPDBSELR    IXP4XX_GPIO_REG(IXP4XX_GPIO_GPDBSELR_OFFSET) | ||||
| 
 | ||||
| /*
 | ||||
|  * GPIO register bit definitions | ||||
|  */ | ||||
| 
 | ||||
| /* Interrupt styles
 | ||||
|  */ | ||||
| #define IXP4XX_GPIO_STYLE_ACTIVE_HIGH	0x0 | ||||
| #define IXP4XX_GPIO_STYLE_ACTIVE_LOW	0x1 | ||||
| #define IXP4XX_GPIO_STYLE_RISING_EDGE	0x2 | ||||
| #define IXP4XX_GPIO_STYLE_FALLING_EDGE	0x3 | ||||
| #define IXP4XX_GPIO_STYLE_TRANSITIONAL	0x4 | ||||
| 
 | ||||
| /* 
 | ||||
|  * Mask used to clear interrupt styles  | ||||
|  */ | ||||
| #define IXP4XX_GPIO_STYLE_CLEAR		0x7 | ||||
| #define IXP4XX_GPIO_STYLE_SIZE		3 | ||||
| 
 | ||||
| /*
 | ||||
|  * Constants to make it easy to access Timer Control/Status registers | ||||
|  */ | ||||
|  | ||||
| @ -1,204 +0,0 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of version 2 of the GNU General Public License | ||||
|  * as published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef IXP4XX_QMGR_H | ||||
| #define IXP4XX_QMGR_H | ||||
| 
 | ||||
| #include <linux/io.h> | ||||
| #include <linux/kernel.h> | ||||
| 
 | ||||
| #define DEBUG_QMGR	0 | ||||
| 
 | ||||
| #define HALF_QUEUES	32 | ||||
| #define QUEUES		64 | ||||
| #define MAX_QUEUE_LENGTH 4	/* in dwords */ | ||||
| 
 | ||||
| #define QUEUE_STAT1_EMPTY		1 /* queue status bits */ | ||||
| #define QUEUE_STAT1_NEARLY_EMPTY	2 | ||||
| #define QUEUE_STAT1_NEARLY_FULL		4 | ||||
| #define QUEUE_STAT1_FULL		8 | ||||
| #define QUEUE_STAT2_UNDERFLOW		1 | ||||
| #define QUEUE_STAT2_OVERFLOW		2 | ||||
| 
 | ||||
| #define QUEUE_WATERMARK_0_ENTRIES	0 | ||||
| #define QUEUE_WATERMARK_1_ENTRY		1 | ||||
| #define QUEUE_WATERMARK_2_ENTRIES	2 | ||||
| #define QUEUE_WATERMARK_4_ENTRIES	3 | ||||
| #define QUEUE_WATERMARK_8_ENTRIES	4 | ||||
| #define QUEUE_WATERMARK_16_ENTRIES	5 | ||||
| #define QUEUE_WATERMARK_32_ENTRIES	6 | ||||
| #define QUEUE_WATERMARK_64_ENTRIES	7 | ||||
| 
 | ||||
| /* queue interrupt request conditions */ | ||||
| #define QUEUE_IRQ_SRC_EMPTY		0 | ||||
| #define QUEUE_IRQ_SRC_NEARLY_EMPTY	1 | ||||
| #define QUEUE_IRQ_SRC_NEARLY_FULL	2 | ||||
| #define QUEUE_IRQ_SRC_FULL		3 | ||||
| #define QUEUE_IRQ_SRC_NOT_EMPTY		4 | ||||
| #define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY	5 | ||||
| #define QUEUE_IRQ_SRC_NOT_NEARLY_FULL	6 | ||||
| #define QUEUE_IRQ_SRC_NOT_FULL		7 | ||||
| 
 | ||||
| struct qmgr_regs { | ||||
| 	u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */ | ||||
| 	u32 stat1[4];		/* 0x400 - 0x40F */ | ||||
| 	u32 stat2[2];		/* 0x410 - 0x417 */ | ||||
| 	u32 statne_h;		/* 0x418 - queue nearly empty */ | ||||
| 	u32 statf_h;		/* 0x41C - queue full */ | ||||
| 	u32 irqsrc[4];		/* 0x420 - 0x42F IRC source */ | ||||
| 	u32 irqen[2];		/* 0x430 - 0x437 IRQ enabled */ | ||||
| 	u32 irqstat[2];		/* 0x438 - 0x43F - IRQ access only */ | ||||
| 	u32 reserved[1776]; | ||||
| 	u32 sram[2048];		/* 0x2000 - 0x3FFF - config and buffer */ | ||||
| }; | ||||
| 
 | ||||
| void qmgr_set_irq(unsigned int queue, int src, | ||||
| 		  void (*handler)(void *pdev), void *pdev); | ||||
| void qmgr_enable_irq(unsigned int queue); | ||||
| void qmgr_disable_irq(unsigned int queue); | ||||
| 
 | ||||
| /* request_ and release_queue() must be called from non-IRQ context */ | ||||
| 
 | ||||
| #if DEBUG_QMGR | ||||
| extern char qmgr_queue_descs[QUEUES][32]; | ||||
| 
 | ||||
| int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, | ||||
| 		       unsigned int nearly_empty_watermark, | ||||
| 		       unsigned int nearly_full_watermark, | ||||
| 		       const char *desc_format, const char* name); | ||||
| #else | ||||
| int __qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, | ||||
| 			 unsigned int nearly_empty_watermark, | ||||
| 			 unsigned int nearly_full_watermark); | ||||
| #define qmgr_request_queue(queue, len, nearly_empty_watermark,		\ | ||||
| 			   nearly_full_watermark, desc_format, name)	\ | ||||
| 	__qmgr_request_queue(queue, len, nearly_empty_watermark,	\ | ||||
| 			     nearly_full_watermark) | ||||
| #endif | ||||
| 
 | ||||
| void qmgr_release_queue(unsigned int queue); | ||||
| 
 | ||||
| 
 | ||||
| static inline void qmgr_put_entry(unsigned int queue, u32 val) | ||||
| { | ||||
| 	struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| #if DEBUG_QMGR | ||||
| 	BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ | ||||
| 
 | ||||
| 	printk(KERN_DEBUG "Queue %s(%i) put %X\n", | ||||
| 	       qmgr_queue_descs[queue], queue, val); | ||||
| #endif | ||||
| 	__raw_writel(val, &qmgr_regs->acc[queue][0]); | ||||
| } | ||||
| 
 | ||||
| static inline u32 qmgr_get_entry(unsigned int queue) | ||||
| { | ||||
| 	u32 val; | ||||
| 	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| 	val = __raw_readl(&qmgr_regs->acc[queue][0]); | ||||
| #if DEBUG_QMGR | ||||
| 	BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ | ||||
| 
 | ||||
| 	printk(KERN_DEBUG "Queue %s(%i) get %X\n", | ||||
| 	       qmgr_queue_descs[queue], queue, val); | ||||
| #endif | ||||
| 	return val; | ||||
| } | ||||
| 
 | ||||
| static inline int __qmgr_get_stat1(unsigned int queue) | ||||
| { | ||||
| 	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| 	return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) | ||||
| 		>> ((queue & 7) << 2)) & 0xF; | ||||
| } | ||||
| 
 | ||||
| static inline int __qmgr_get_stat2(unsigned int queue) | ||||
| { | ||||
| 	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| 	BUG_ON(queue >= HALF_QUEUES); | ||||
| 	return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) | ||||
| 		>> ((queue & 0xF) << 1)) & 0x3; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_empty() - checks if a hardware queue is empty | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue is empty. | ||||
|  */ | ||||
| static inline int qmgr_stat_empty(unsigned int queue) | ||||
| { | ||||
| 	BUG_ON(queue >= HALF_QUEUES); | ||||
| 	return __qmgr_get_stat1(queue) & QUEUE_STAT1_EMPTY; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_below_low_watermark() - checks if a queue is below low watermark | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue is below low watermark. | ||||
|  */ | ||||
| static inline int qmgr_stat_below_low_watermark(unsigned int queue) | ||||
| { | ||||
| 	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| 	if (queue >= HALF_QUEUES) | ||||
| 		return (__raw_readl(&qmgr_regs->statne_h) >> | ||||
| 			(queue - HALF_QUEUES)) & 0x01; | ||||
| 	return __qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_EMPTY; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_above_high_watermark() - checks if a queue is above high watermark | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue is above high watermark | ||||
|  */ | ||||
| static inline int qmgr_stat_above_high_watermark(unsigned int queue) | ||||
| { | ||||
| 	BUG_ON(queue >= HALF_QUEUES); | ||||
| 	return __qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_FULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_full() - checks if a hardware queue is full | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue is full. | ||||
|  */ | ||||
| static inline int qmgr_stat_full(unsigned int queue) | ||||
| { | ||||
| 	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; | ||||
| 	if (queue >= HALF_QUEUES) | ||||
| 		return (__raw_readl(&qmgr_regs->statf_h) >> | ||||
| 			(queue - HALF_QUEUES)) & 0x01; | ||||
| 	return __qmgr_get_stat1(queue) & QUEUE_STAT1_FULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_underflow() - checks if a hardware queue experienced underflow | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue experienced underflow. | ||||
|  */ | ||||
| static inline int qmgr_stat_underflow(unsigned int queue) | ||||
| { | ||||
| 	return __qmgr_get_stat2(queue) & QUEUE_STAT2_UNDERFLOW; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * qmgr_stat_overflow() - checks if a hardware queue experienced overflow | ||||
|  * @queue:	queue number | ||||
|  * | ||||
|  * Returns non-zero value if the queue experienced overflow. | ||||
|  */ | ||||
| static inline int qmgr_stat_overflow(unsigned int queue) | ||||
| { | ||||
| 	return __qmgr_get_stat2(queue) & QUEUE_STAT2_OVERFLOW; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										68
									
								
								arch/arm/mach-ixp4xx/irqs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								arch/arm/mach-ixp4xx/irqs.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| /*
 | ||||
|  * arch/arm/mach-ixp4xx/include/mach/irqs.h  | ||||
|  * | ||||
|  * IRQ definitions for IXP4XX based systems | ||||
|  * | ||||
|  * Copyright (C) 2002 Intel Corporation. | ||||
|  * Copyright (C) 2003 MontaVista Software, Inc. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _ARCH_IXP4XX_IRQS_H_ | ||||
| #define _ARCH_IXP4XX_IRQS_H_ | ||||
| 
 | ||||
| #define IRQ_IXP4XX_BASE		16 | ||||
| 
 | ||||
| #define IRQ_IXP4XX_NPEA		(IRQ_IXP4XX_BASE + 0) | ||||
| #define IRQ_IXP4XX_NPEB		(IRQ_IXP4XX_BASE + 1) | ||||
| #define IRQ_IXP4XX_NPEC		(IRQ_IXP4XX_BASE + 2) | ||||
| #define IRQ_IXP4XX_QM1		(IRQ_IXP4XX_BASE + 3) | ||||
| #define IRQ_IXP4XX_QM2		(IRQ_IXP4XX_BASE + 4) | ||||
| #define IRQ_IXP4XX_TIMER1	(IRQ_IXP4XX_BASE + 5) | ||||
| #define IRQ_IXP4XX_GPIO0	(IRQ_IXP4XX_BASE + 6) | ||||
| #define IRQ_IXP4XX_GPIO1	(IRQ_IXP4XX_BASE + 7) | ||||
| #define IRQ_IXP4XX_PCI_INT	(IRQ_IXP4XX_BASE + 8) | ||||
| #define IRQ_IXP4XX_PCI_DMA1	(IRQ_IXP4XX_BASE + 9) | ||||
| #define IRQ_IXP4XX_PCI_DMA2	(IRQ_IXP4XX_BASE + 10) | ||||
| #define IRQ_IXP4XX_TIMER2	(IRQ_IXP4XX_BASE + 11) | ||||
| #define IRQ_IXP4XX_USB		(IRQ_IXP4XX_BASE + 12) | ||||
| #define IRQ_IXP4XX_UART2	(IRQ_IXP4XX_BASE + 13) | ||||
| #define IRQ_IXP4XX_TIMESTAMP	(IRQ_IXP4XX_BASE + 14) | ||||
| #define IRQ_IXP4XX_UART1	(IRQ_IXP4XX_BASE + 15) | ||||
| #define IRQ_IXP4XX_WDOG		(IRQ_IXP4XX_BASE + 16) | ||||
| #define IRQ_IXP4XX_AHB_PMU	(IRQ_IXP4XX_BASE + 17) | ||||
| #define IRQ_IXP4XX_XSCALE_PMU	(IRQ_IXP4XX_BASE + 18) | ||||
| #define IRQ_IXP4XX_GPIO2	(IRQ_IXP4XX_BASE + 19) | ||||
| #define IRQ_IXP4XX_GPIO3	(IRQ_IXP4XX_BASE + 20) | ||||
| #define IRQ_IXP4XX_GPIO4	(IRQ_IXP4XX_BASE + 21) | ||||
| #define IRQ_IXP4XX_GPIO5	(IRQ_IXP4XX_BASE + 22) | ||||
| #define IRQ_IXP4XX_GPIO6	(IRQ_IXP4XX_BASE + 23) | ||||
| #define IRQ_IXP4XX_GPIO7	(IRQ_IXP4XX_BASE + 24) | ||||
| #define IRQ_IXP4XX_GPIO8	(IRQ_IXP4XX_BASE + 25) | ||||
| #define IRQ_IXP4XX_GPIO9	(IRQ_IXP4XX_BASE + 26) | ||||
| #define IRQ_IXP4XX_GPIO10	(IRQ_IXP4XX_BASE + 27) | ||||
| #define IRQ_IXP4XX_GPIO11	(IRQ_IXP4XX_BASE + 28) | ||||
| #define IRQ_IXP4XX_GPIO12	(IRQ_IXP4XX_BASE + 29) | ||||
| #define IRQ_IXP4XX_SW_INT1	(IRQ_IXP4XX_BASE + 30) | ||||
| #define IRQ_IXP4XX_SW_INT2	(IRQ_IXP4XX_BASE + 31) | ||||
| #define IRQ_IXP4XX_USB_HOST	(IRQ_IXP4XX_BASE + 32) | ||||
| #define IRQ_IXP4XX_I2C		(IRQ_IXP4XX_BASE + 33) | ||||
| #define IRQ_IXP4XX_SSP		(IRQ_IXP4XX_BASE + 34) | ||||
| #define IRQ_IXP4XX_TSYNC	(IRQ_IXP4XX_BASE + 35) | ||||
| #define IRQ_IXP4XX_EAU_DONE	(IRQ_IXP4XX_BASE + 36) | ||||
| #define IRQ_IXP4XX_SHA_DONE	(IRQ_IXP4XX_BASE + 37) | ||||
| #define IRQ_IXP4XX_SWCP_PE	(IRQ_IXP4XX_BASE + 58) | ||||
| #define IRQ_IXP4XX_QM_PE	(IRQ_IXP4XX_BASE + 60) | ||||
| #define IRQ_IXP4XX_MCU_ECC	(IRQ_IXP4XX_BASE + 61) | ||||
| #define IRQ_IXP4XX_EXP_PE	(IRQ_IXP4XX_BASE + 62) | ||||
| 
 | ||||
| #define _IXP4XX_GPIO_IRQ(n)	(IRQ_IXP4XX_GPIO ## n) | ||||
| #define IXP4XX_GPIO_IRQ(n)	_IXP4XX_GPIO_IRQ(n) | ||||
| 
 | ||||
| #define	XSCALE_PMU_IRQ		(IRQ_IXP4XX_XSCALE_PMU) | ||||
| 
 | ||||
| #endif | ||||
| @ -24,6 +24,8 @@ | ||||
| #include <mach/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define MAX_DEV		4 | ||||
| #define IRQ_LINES	4 | ||||
| 
 | ||||
|  | ||||
| @ -32,6 +32,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define IXDP425_SDA_PIN		7 | ||||
| #define IXDP425_SCL_PIN		6 | ||||
| 
 | ||||
|  | ||||
| @ -23,6 +23,8 @@ | ||||
| 
 | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| void __init ixdpg425_pci_preinit(void) | ||||
| { | ||||
| 	irq_set_irq_type(IRQ_IXP4XX_GPIO6, IRQ_TYPE_LEVEL_LOW); | ||||
|  | ||||
							
								
								
									
										60
									
								
								arch/arm/mach-ixp4xx/ixp4xx-of.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								arch/arm/mach-ixp4xx/ixp4xx-of.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0
 | ||||
| /*
 | ||||
|  * IXP4xx Device Tree boot support | ||||
|  */ | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/io.h> | ||||
| 
 | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/ixp4xx-regs.h> | ||||
| 
 | ||||
| static struct map_desc ixp4xx_of_io_desc[] __initdata = { | ||||
| 	/*
 | ||||
| 	 * This is needed for runtime system configuration checks, | ||||
| 	 * such as reading if hardware so-and-so is present. This | ||||
| 	 * could eventually be converted into a syscon once all boards | ||||
| 	 * are converted to device tree. | ||||
| 	 */ | ||||
| 	{ | ||||
| 		.virtual = IXP4XX_EXP_CFG_BASE_VIRT, | ||||
| 		.pfn = __phys_to_pfn(IXP4XX_EXP_CFG_BASE_PHYS), | ||||
| 		.length = SZ_4K, | ||||
| 		.type = MT_DEVICE, | ||||
| 	}, | ||||
| #ifdef CONFIG_DEBUG_UART_8250 | ||||
| 	/* This is needed for LL-debug/earlyprintk/debug-macro.S */ | ||||
| 	{ | ||||
| 		.virtual = CONFIG_DEBUG_UART_VIRT, | ||||
| 		.pfn = __phys_to_pfn(CONFIG_DEBUG_UART_PHYS), | ||||
| 		.length = SZ_4K, | ||||
| 		.type = MT_DEVICE, | ||||
| 	}, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| static void __init ixp4xx_of_map_io(void) | ||||
| { | ||||
| 	iotable_init(ixp4xx_of_io_desc, ARRAY_SIZE(ixp4xx_of_io_desc)); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * We handle 4 differen SoC families. These compatible strings are enough | ||||
|  * to provide the core so that different boards can add their more detailed | ||||
|  * specifics. | ||||
|  */ | ||||
| static const char *ixp4xx_of_board_compat[] = { | ||||
| 	"intel,ixp42x", | ||||
| 	"intel,ixp43x", | ||||
| 	"intel,ixp45x", | ||||
| 	"intel,ixp46x", | ||||
| 	NULL, | ||||
| }; | ||||
| 
 | ||||
| DT_MACHINE_START(IXP4XX_DT, "IXP4xx (Device Tree)") | ||||
| 	.map_io		= ixp4xx_of_map_io, | ||||
| 	.dt_compat	= ixp4xx_of_board_compat, | ||||
| MACHINE_END | ||||
| @ -21,6 +21,8 @@ | ||||
| #include <asm/mach/pci.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define MAX_DEV		3 | ||||
| #define IRQ_LINES	3 | ||||
| 
 | ||||
|  | ||||
| @ -34,6 +34,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define NAS100D_SDA_PIN		5 | ||||
| #define NAS100D_SCL_PIN		6 | ||||
| 
 | ||||
| @ -279,9 +281,6 @@ static void __init nas100d_init(void) | ||||
| 
 | ||||
| 	ixp4xx_sys_init(); | ||||
| 
 | ||||
| 	/* gpio 14 and 15 are _not_ clocks */ | ||||
| 	*IXP4XX_GPIO_GPCLKR = 0; | ||||
| 
 | ||||
| 	nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||
| 	nas100d_flash_resource.end = | ||||
| 		IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; | ||||
|  | ||||
| @ -21,6 +21,8 @@ | ||||
| #include <asm/mach/pci.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define MAX_DEV		3 | ||||
| #define IRQ_LINES	3 | ||||
| 
 | ||||
|  | ||||
| @ -32,6 +32,8 @@ | ||||
| #include <asm/mach/flash.h> | ||||
| #include <asm/mach/time.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| #define NSLU2_SDA_PIN		7 | ||||
| #define NSLU2_SCL_PIN		6 | ||||
| 
 | ||||
| @ -125,10 +127,18 @@ static struct platform_device nslu2_i2c_gpio = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct resource nslu2_beeper_resources[] = { | ||||
| 	{ | ||||
| 		.start	= IRQ_IXP4XX_TIMER2, | ||||
| 		.flags	= IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device nslu2_beeper = { | ||||
| 	.name			= "ixp4xx-beeper", | ||||
| 	.id			= NSLU2_GPIO_BUZZ, | ||||
| 	.num_resources		= 0, | ||||
| 	.resource		= nslu2_beeper_resources, | ||||
| 	.num_resources		= ARRAY_SIZE(nslu2_beeper_resources), | ||||
| }; | ||||
| 
 | ||||
| static struct resource nslu2_uart_resources[] = { | ||||
|  | ||||
| @ -27,6 +27,8 @@ | ||||
| 
 | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| void __init wg302v2_pci_preinit(void) | ||||
| { | ||||
| 	irq_set_irq_type(IRQ_IXP4XX_GPIO8, IRQ_TYPE_LEVEL_LOW); | ||||
|  | ||||
| @ -29,6 +29,8 @@ | ||||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/flash.h> | ||||
| 
 | ||||
| #include "irqs.h" | ||||
| 
 | ||||
| static struct flash_platform_data wg302v2_flash_data = { | ||||
| 	.map_name	= "cfi_probe", | ||||
| 	.width		= 2, | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+
 | ||||
| /*
 | ||||
|  * Platform support for LPC32xx SoC | ||||
|  * | ||||
| @ -5,44 +6,14 @@ | ||||
|  * | ||||
|  * Copyright (C) 2012 Roland Stigge <stigge@antcom.de> | ||||
|  * Copyright (C) 2010 NXP Semiconductors | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/init.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/irq.h> | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/amba/bus.h> | ||||
| #include <linux/amba/clcd.h> | ||||
| #include <linux/amba/pl08x.h> | ||||
| #include <linux/amba/mmci.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/of_irq.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <linux/clk.h> | ||||
| #include <linux/mtd/lpc32xx_slc.h> | ||||
| #include <linux/mtd/lpc32xx_mlc.h> | ||||
| #include <linux/mtd/lpc32xx_slc.h> | ||||
| #include <linux/of_platform.h> | ||||
| 
 | ||||
| #include <asm/setup.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/arch.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/platform.h> | ||||
| #include <mach/board.h> | ||||
| #include "common.h" | ||||
| 
 | ||||
| static struct pl08x_channel_data pl08x_slave_channels[] = { | ||||
| @ -90,8 +61,6 @@ static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = { | ||||
| }; | ||||
| 
 | ||||
| static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = { | ||||
| 	OF_DEV_AUXDATA("arm,pl022", 0x20084000, "dev:ssp0", NULL), | ||||
| 	OF_DEV_AUXDATA("arm,pl022", 0x2008C000, "dev:ssp1", NULL), | ||||
| 	OF_DEV_AUXDATA("arm,pl080", 0x31000000, "pl08xdmac", &pl08x_pd), | ||||
| 	OF_DEV_AUXDATA("nxp,lpc3220-slc", 0x20020000, "20020000.flash", | ||||
| 		       &lpc32xx_slc_data), | ||||
| @ -104,11 +73,6 @@ static void __init lpc3250_machine_init(void) | ||||
| { | ||||
| 	lpc32xx_serial_init(); | ||||
| 
 | ||||
| 	/* Test clock needed for UDA1380 initial init */ | ||||
| 	__raw_writel(LPC32XX_CLKPWR_TESTCLK2_SEL_MOSC | | ||||
| 		LPC32XX_CLKPWR_TESTCLK_TESTCLK2_EN, | ||||
| 		LPC32XX_CLKPWR_TEST_CLK_SEL); | ||||
| 
 | ||||
| 	of_platform_default_populate(NULL, lpc32xx_auxdata_lookup, NULL); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -336,6 +336,15 @@ static inline void omap5_secondary_hyp_startup(void) | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_DRA7XX | ||||
| extern int dra7xx_pciess_reset(struct omap_hwmod *oh); | ||||
| #else | ||||
| static inline int dra7xx_pciess_reset(struct omap_hwmod *oh) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| void pdata_quirks_init(const struct of_device_id *); | ||||
| void omap_auxdata_legacy_init(struct device *dev); | ||||
| void omap_pcs_legacy_init(int irq, void (*rearm)(void)); | ||||
|  | ||||
| @ -53,15 +53,10 @@ int omap_i2c_reset(struct omap_hwmod *oh) | ||||
| 	u16 i2c_con; | ||||
| 	int c = 0; | ||||
| 
 | ||||
| 	if (oh->class->rev == OMAP_I2C_IP_VERSION_2) { | ||||
| 		i2c_con = OMAP4_I2C_CON_OFFSET; | ||||
| 	} else if (oh->class->rev == OMAP_I2C_IP_VERSION_1) { | ||||
| 	if (soc_is_omap24xx() || soc_is_omap34xx() || soc_is_am35xx()) | ||||
| 		i2c_con = OMAP2_I2C_CON_OFFSET; | ||||
| 	} else { | ||||
| 		WARN(1, "Cannot reset I2C block %s: unsupported revision\n", | ||||
| 		     oh->name); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	else | ||||
| 		i2c_con = OMAP4_I2C_CON_OFFSET; | ||||
| 
 | ||||
| 	/* Disable I2C */ | ||||
| 	v = omap_hwmod_read(oh, i2c_con); | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user