mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
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