mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-26 19:30:53 +07:00
Merge branch 'next/drivers' into HEAD
Conflicts: arch/arm/boot/dts/omap4.dtsi arch/arm/mach-clps711x/common.c arch/arm/mach-omap1/board-h2.c arch/arm/mach-omap1/board-h3.c arch/arm/mach-omap1/leds-h2p2-debug.c arch/arm/mach-omap1/leds.c arch/arm/mach-pnx4008/time.c arch/arm/plat-omap/debug-leds.c drivers/Makefile drivers/bus/omap_l3_noc.c
This commit is contained in:
commit
8b1a13b028
10
Documentation/devicetree/bindings/bus/omap-ocp2scp.txt
Normal file
10
Documentation/devicetree/bindings/bus/omap-ocp2scp.txt
Normal file
@ -0,0 +1,10 @@
|
||||
* OMAP OCP2SCP - ocp interface to scp interface
|
||||
|
||||
properties:
|
||||
- compatible : Should be "ti,omap-ocp2scp"
|
||||
- #address-cells, #size-cells : Must be present if the device has sub-nodes
|
||||
- ranges : the child address space are mapped 1:1 onto the parent address space
|
||||
- ti,hwmods : must be "ocp2scp_usb_phy"
|
||||
|
||||
Sub-nodes:
|
||||
All the devices connected to ocp2scp are described using sub-node to ocp2scp
|
30
Documentation/devicetree/bindings/media/exynos5-gsc.txt
Normal file
30
Documentation/devicetree/bindings/media/exynos5-gsc.txt
Normal file
@ -0,0 +1,30 @@
|
||||
* Samsung Exynos5 G-Scaler device
|
||||
|
||||
G-Scaler is used for scaling and color space conversion on EXYNOS5 SoCs.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "samsung,exynos5-gsc"
|
||||
- reg: should contain G-Scaler physical address location and length.
|
||||
- interrupts: should contain G-Scaler interrupt number
|
||||
|
||||
Example:
|
||||
|
||||
gsc_0: gsc@0x13e00000 {
|
||||
compatible = "samsung,exynos5-gsc";
|
||||
reg = <0x13e00000 0x1000>;
|
||||
interrupts = <0 85 0>;
|
||||
};
|
||||
|
||||
Aliases:
|
||||
Each G-Scaler node should have a numbered alias in the aliases node,
|
||||
in the form of gscN, N = 0...3. G-Scaler driver uses these aliases
|
||||
to retrieve the device IDs using "of_alias_get_id()" call.
|
||||
|
||||
Example:
|
||||
|
||||
aliases {
|
||||
gsc0 =&gsc_0;
|
||||
gsc1 =&gsc_1;
|
||||
gsc2 =&gsc_2;
|
||||
gsc3 =&gsc_3;
|
||||
};
|
196
Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
Normal file
196
Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
Normal file
@ -0,0 +1,196 @@
|
||||
Samsung GPIO and Pin Mux/Config controller
|
||||
|
||||
Samsung's ARM based SoC's integrates a GPIO and Pin mux/config hardware
|
||||
controller. It controls the input/output settings on the available pads/pins
|
||||
and also provides ability to multiplex and configure the output of various
|
||||
on-chip controllers onto these pads.
|
||||
|
||||
Required Properties:
|
||||
- compatible: should be one of the following.
|
||||
- "samsung,pinctrl-exynos4210": for Exynos4210 compatible pin-controller.
|
||||
- "samsung,pinctrl-exynos5250": for Exynos5250 compatible pin-controller.
|
||||
|
||||
- reg: Base address of the pin controller hardware module and length of
|
||||
the address space it occupies.
|
||||
|
||||
- interrupts: interrupt specifier for the controller. The format and value of
|
||||
the interrupt specifier depends on the interrupt parent for the controller.
|
||||
|
||||
- Pin mux/config groups as child nodes: The pin mux (selecting pin function
|
||||
mode) and pin config (pull up/down, driver strength) settings are represented
|
||||
as child nodes of the pin-controller node. There should be atleast one
|
||||
child node and there is no limit on the count of these child nodes.
|
||||
|
||||
The child node should contain a list of pin(s) on which a particular pin
|
||||
function selection or pin configuration (or both) have to applied. This
|
||||
list of pins is specified using the property name "samsung,pins". There
|
||||
should be atleast one pin specfied for this property and there is no upper
|
||||
limit on the count of pins that can be specified. The pins are specified
|
||||
using pin names which are derived from the hardware manual of the SoC. As
|
||||
an example, the pins in GPA0 bank of the pin controller can be represented
|
||||
as "gpa0-0", "gpa0-1", "gpa0-2" and so on. The names should be in lower case.
|
||||
The format of the pin names should be (as per the hardware manual)
|
||||
"[pin bank name]-[pin number within the bank]".
|
||||
|
||||
The pin function selection that should be applied on the pins listed in the
|
||||
child node is specified using the "samsung,pin-function" property. The value
|
||||
of this property that should be applied to each of the pins listed in the
|
||||
"samsung,pins" property should be picked from the hardware manual of the SoC
|
||||
for the specified pin group. This property is optional in the child node if
|
||||
no specific function selection is desired for the pins listed in the child
|
||||
node. The value of this property is used as-is to program the pin-controller
|
||||
function selector register of the pin-bank.
|
||||
|
||||
The child node can also optionally specify one or more of the pin
|
||||
configuration that should be applied on all the pins listed in the
|
||||
"samsung,pins" property of the child node. The following pin configuration
|
||||
properties are supported.
|
||||
|
||||
- samsung,pin-pud: Pull up/down configuration.
|
||||
- samsung,pin-drv: Drive strength configuration.
|
||||
- samsung,pin-pud-pdn: Pull up/down configuration in power down mode.
|
||||
- samsung,pin-drv-pdn: Drive strength configuration in power down mode.
|
||||
|
||||
The values specified by these config properties should be derived from the
|
||||
hardware manual and these values are programmed as-is into the pin
|
||||
pull up/down and driver strength register of the pin-controller.
|
||||
|
||||
Note: A child should include atleast a pin function selection property or
|
||||
pin configuration property (one or more) or both.
|
||||
|
||||
The client nodes that require a particular pin function selection and/or
|
||||
pin configuration should use the bindings listed in the "pinctrl-bindings.txt"
|
||||
file.
|
||||
|
||||
External GPIO and Wakeup Interrupts:
|
||||
|
||||
The controller supports two types of external interrupts over gpio. The first
|
||||
is the external gpio interrupt and second is the external wakeup interrupts.
|
||||
The difference between the two is that the external wakeup interrupts can be
|
||||
used as system wakeup events.
|
||||
|
||||
A. External GPIO Interrupts: For supporting external gpio interrupts, the
|
||||
following properties should be specified in the pin-controller device node.
|
||||
|
||||
- interrupt-controller: identifies the controller node as interrupt-parent.
|
||||
- #interrupt-cells: the value of this property should be 2.
|
||||
- First Cell: represents the external gpio interrupt number local to the
|
||||
external gpio interrupt space of the controller.
|
||||
- Second Cell: flags to identify the type of the interrupt
|
||||
- 1 = rising edge triggered
|
||||
- 2 = falling edge triggered
|
||||
- 3 = rising and falling edge triggered
|
||||
- 4 = high level triggered
|
||||
- 8 = low level triggered
|
||||
|
||||
B. External Wakeup Interrupts: For supporting external wakeup interrupts, a
|
||||
child node representing the external wakeup interrupt controller should be
|
||||
included in the pin-controller device node. This child node should include
|
||||
the following properties.
|
||||
|
||||
- compatible: identifies the type of the external wakeup interrupt controller
|
||||
The possible values are:
|
||||
- samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller
|
||||
found on Samsung Exynos4210 SoC.
|
||||
- interrupt-parent: phandle of the interrupt parent to which the external
|
||||
wakeup interrupts are forwarded to.
|
||||
- interrupt-controller: identifies the node as interrupt-parent.
|
||||
- #interrupt-cells: the value of this property should be 2
|
||||
- First Cell: represents the external wakeup interrupt number local to
|
||||
the external wakeup interrupt space of the controller.
|
||||
- Second Cell: flags to identify the type of the interrupt
|
||||
- 1 = rising edge triggered
|
||||
- 2 = falling edge triggered
|
||||
- 3 = rising and falling edge triggered
|
||||
- 4 = high level triggered
|
||||
- 8 = low level triggered
|
||||
|
||||
Aliases:
|
||||
|
||||
All the pin controller nodes should be represented in the aliases node using
|
||||
the following format 'pinctrl{n}' where n is a unique number for the alias.
|
||||
|
||||
Example 1: A pin-controller node with pin groups.
|
||||
|
||||
pinctrl_0: pinctrl@11400000 {
|
||||
compatible = "samsung,pinctrl-exynos4210";
|
||||
reg = <0x11400000 0x1000>;
|
||||
interrupts = <0 47 0>;
|
||||
|
||||
uart0_data: uart0-data {
|
||||
samsung,pins = "gpa0-0", "gpa0-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart0_fctl: uart0-fctl {
|
||||
samsung,pins = "gpa0-2", "gpa0-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart1_data: uart1-data {
|
||||
samsung,pins = "gpa0-4", "gpa0-5";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart1_fctl: uart1-fctl {
|
||||
samsung,pins = "gpa0-6", "gpa0-7";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c2_bus: i2c2-bus {
|
||||
samsung,pins = "gpa0-6", "gpa0-7";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 2: A pin-controller node with external wakeup interrupt controller node.
|
||||
|
||||
pinctrl_1: pinctrl@11000000 {
|
||||
compatible = "samsung,pinctrl-exynos4210";
|
||||
reg = <0x11000000 0x1000>;
|
||||
interrupts = <0 46 0>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
wakup_eint: wakeup-interrupt-controller {
|
||||
compatible = "samsung,exynos4210-wakeup-eint";
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
|
||||
<0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>,
|
||||
<0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
|
||||
<0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>,
|
||||
<0 32 0>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 3: A uart client node that supports 'default' and 'flow-control' states.
|
||||
|
||||
uart@13800000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x13800000 0x100>;
|
||||
interrupts = <0 52 0>;
|
||||
pinctrl-names = "default", "flow-control;
|
||||
pinctrl-0 = <&uart0_data>;
|
||||
pinctrl-1 = <&uart0_data &uart0_fctl>;
|
||||
};
|
||||
|
||||
Example 4: Set up the default pin state for uart controller.
|
||||
|
||||
static int s3c24xx_serial_probe(struct platform_device *pdev) {
|
||||
struct pinctrl *pinctrl;
|
||||
...
|
||||
...
|
||||
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
|
||||
}
|
@ -1768,59 +1768,6 @@ config FORCE_MAX_ZONEORDER
|
||||
This config option is actually maximum order plus one. For example,
|
||||
a value of 11 means that the largest free memory block is 2^10 pages.
|
||||
|
||||
config LEDS
|
||||
bool "Timer and CPU usage LEDs"
|
||||
depends on ARCH_CDB89712 || ARCH_EBSA110 || \
|
||||
ARCH_EBSA285 || ARCH_INTEGRATOR || \
|
||||
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
|
||||
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
|
||||
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
|
||||
ARCH_AT91 || ARCH_DAVINCI || \
|
||||
ARCH_KS8695 || MACH_RD88F5182 || ARCH_REALVIEW
|
||||
help
|
||||
If you say Y here, the LEDs on your machine will be used
|
||||
to provide useful information about your current system status.
|
||||
|
||||
If you are compiling a kernel for a NetWinder or EBSA-285, you will
|
||||
be able to select which LEDs are active using the options below. If
|
||||
you are compiling a kernel for the EBSA-110 or the LART however, the
|
||||
red LED will simply flash regularly to indicate that the system is
|
||||
still functional. It is safe to say Y here if you have a CATS
|
||||
system, but the driver will do nothing.
|
||||
|
||||
config LEDS_TIMER
|
||||
bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \
|
||||
OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
|
||||
|| MACH_OMAP_PERSEUS2
|
||||
depends on LEDS
|
||||
depends on !GENERIC_CLOCKEVENTS
|
||||
default y if ARCH_EBSA110
|
||||
help
|
||||
If you say Y here, one of the system LEDs (the green one on the
|
||||
NetWinder, the amber one on the EBSA285, or the red one on the LART)
|
||||
will flash regularly to indicate that the system is still
|
||||
operational. This is mainly useful to kernel hackers who are
|
||||
debugging unstable kernels.
|
||||
|
||||
The LART uses the same LED for both Timer LED and CPU usage LED
|
||||
functions. You may choose to use both, but the Timer LED function
|
||||
will overrule the CPU usage LED.
|
||||
|
||||
config LEDS_CPU
|
||||
bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110 && \
|
||||
!ARCH_OMAP) \
|
||||
|| OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
|
||||
|| MACH_OMAP_PERSEUS2
|
||||
depends on LEDS
|
||||
help
|
||||
If you say Y here, the red LED will be used to give a good real
|
||||
time indication of CPU usage, by lighting whenever the idle task
|
||||
is not currently executing.
|
||||
|
||||
The LART uses the same LED for both Timer LED and CPU usage LED
|
||||
functions. You may choose to use both, but the Timer LED function
|
||||
will overrule the CPU usage LED.
|
||||
|
||||
config ALIGNMENT_TRAP
|
||||
bool
|
||||
depends on CPU_CP15_MMU
|
||||
|
457
arch/arm/boot/dts/exynos4210-pinctrl.dtsi
Normal file
457
arch/arm/boot/dts/exynos4210-pinctrl.dtsi
Normal file
@ -0,0 +1,457 @@
|
||||
/*
|
||||
* Samsung's Exynos4210 SoC pin-mux and pin-config device tree source
|
||||
*
|
||||
* Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2011-2012 Linaro Ltd.
|
||||
* www.linaro.org
|
||||
*
|
||||
* Samsung's Exynos4210 SoC pin-mux and pin-config optiosn are listed as device
|
||||
* tree nodes are listed in this file.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/ {
|
||||
pinctrl@11400000 {
|
||||
uart0_data: uart0-data {
|
||||
samsung,pins = "gpa0-0", "gpa0-1";
|
||||
samsung,pin-function = <0x2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart0_fctl: uart0-fctl {
|
||||
samsung,pins = "gpa0-2", "gpa0-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart1_data: uart1-data {
|
||||
samsung,pins = "gpa0-4", "gpa0-5";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart1_fctl: uart1-fctl {
|
||||
samsung,pins = "gpa0-6", "gpa0-7";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c2_bus: i2c2-bus {
|
||||
samsung,pins = "gpa0-6", "gpa0-7";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart2_data: uart2-data {
|
||||
samsung,pins = "gpa1-0", "gpa1-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart2_fctl: uart2-fctl {
|
||||
samsung,pins = "gpa1-2", "gpa1-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart_audio_a: uart-audio-a {
|
||||
samsung,pins = "gpa1-0", "gpa1-1";
|
||||
samsung,pin-function = <4>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c3_bus: i2c3-bus {
|
||||
samsung,pins = "gpa1-2", "gpa1-3";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart3_data: uart3-data {
|
||||
samsung,pins = "gpa1-4", "gpa1-5";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
uart_audio_b: uart-audio-b {
|
||||
samsung,pins = "gpa1-4", "gpa1-5";
|
||||
samsung,pin-function = <4>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
spi0_bus: spi0-bus {
|
||||
samsung,pins = "gpb-0", "gpb-2", "gpb-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c4_bus: i2c4-bus {
|
||||
samsung,pins = "gpb-2", "gpb-3";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
spi1_bus: spi1-bus {
|
||||
samsung,pins = "gpb-4", "gpb-6", "gpb-7";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c5_bus: i2c5-bus {
|
||||
samsung,pins = "gpb-6", "gpb-7";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2s1_bus: i2s1-bus {
|
||||
samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
|
||||
"gpc0-4";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
pcm1_bus: pcm1-bus {
|
||||
samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
|
||||
"gpc0-4";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
ac97_bus: ac97-bus {
|
||||
samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
|
||||
"gpc0-4";
|
||||
samsung,pin-function = <4>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2s2_bus: i2s2-bus {
|
||||
samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
|
||||
"gpc1-4";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
pcm2_bus: pcm2-bus {
|
||||
samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
|
||||
"gpc1-4";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
spdif_bus: spdif-bus {
|
||||
samsung,pins = "gpc1-0", "gpc1-1";
|
||||
samsung,pin-function = <4>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c6_bus: i2c6-bus {
|
||||
samsung,pins = "gpc1-3", "gpc1-4";
|
||||
samsung,pin-function = <4>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
spi2_bus: spi2-bus {
|
||||
samsung,pins = "gpc1-1", "gpc1-2", "gpc1-3", "gpc1-4";
|
||||
samsung,pin-function = <5>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c7_bus: i2c7-bus {
|
||||
samsung,pins = "gpd0-2", "gpd0-3";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c0_bus: i2c0-bus {
|
||||
samsung,pins = "gpd1-0", "gpd1-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
i2c1_bus: i2c1-bus {
|
||||
samsung,pins = "gpd1-2", "gpd1-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
pinctrl@11000000 {
|
||||
sd0_clk: sd0-clk {
|
||||
samsung,pins = "gpk0-0";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd0_cmd: sd0-cmd {
|
||||
samsung,pins = "gpk0-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd0_cd: sd0-cd {
|
||||
samsung,pins = "gpk0-2";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd0_bus1: sd0-bus-width1 {
|
||||
samsung,pins = "gpk0-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd0_bus4: sd0-bus-width4 {
|
||||
samsung,pins = "gpk0-3", "gpk0-4", "gpk0-5", "gpk0-6";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd0_bus8: sd0-bus-width8 {
|
||||
samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_clk: sd4-clk {
|
||||
samsung,pins = "gpk0-0";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_cmd: sd4-cmd {
|
||||
samsung,pins = "gpk0-1";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_cd: sd4-cd {
|
||||
samsung,pins = "gpk0-2";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_bus1: sd4-bus-width1 {
|
||||
samsung,pins = "gpk0-3";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_bus4: sd4-bus-width4 {
|
||||
samsung,pins = "gpk0-3", "gpk0-4", "gpk0-5", "gpk0-6";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd4_bus8: sd4-bus-width8 {
|
||||
samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <4>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd1_clk: sd1-clk {
|
||||
samsung,pins = "gpk1-0";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd1_cmd: sd1-cmd {
|
||||
samsung,pins = "gpk1-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd1_cd: sd1-cd {
|
||||
samsung,pins = "gpk1-2";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd1_bus1: sd1-bus-width1 {
|
||||
samsung,pins = "gpk1-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd1_bus4: sd1-bus-width4 {
|
||||
samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_clk: sd2-clk {
|
||||
samsung,pins = "gpk2-0";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_cmd: sd2-cmd {
|
||||
samsung,pins = "gpk2-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_cd: sd2-cd {
|
||||
samsung,pins = "gpk2-2";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_bus1: sd2-bus-width1 {
|
||||
samsung,pins = "gpk2-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_bus4: sd2-bus-width4 {
|
||||
samsung,pins = "gpk2-3", "gpk2-4", "gpk2-5", "gpk2-6";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd2_bus8: sd2-bus-width8 {
|
||||
samsung,pins = "gpk3-3", "gpk3-4", "gpk3-5", "gpk3-6";
|
||||
samsung,pin-function = <3>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd3_clk: sd3-clk {
|
||||
samsung,pins = "gpk3-0";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd3_cmd: sd3-cmd {
|
||||
samsung,pins = "gpk3-1";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd3_cd: sd3-cd {
|
||||
samsung,pins = "gpk3-2";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd3_bus1: sd3-bus-width1 {
|
||||
samsung,pins = "gpk3-3";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
sd3_bus4: sd3-bus-width4 {
|
||||
samsung,pins = "gpk3-3", "gpk3-4", "gpk3-5", "gpk3-6";
|
||||
samsung,pin-function = <2>;
|
||||
samsung,pin-pud = <3>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
eint0: ext-int0 {
|
||||
samsung,pins = "gpx0-0";
|
||||
samsung,pin-function = <0xf>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
eint8: ext-int8 {
|
||||
samsung,pins = "gpx1-0";
|
||||
samsung,pin-function = <0xf>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
eint15: ext-int15 {
|
||||
samsung,pins = "gpx1-7";
|
||||
samsung,pin-function = <0xf>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
eint16: ext-int16 {
|
||||
samsung,pins = "gpx2-0";
|
||||
samsung,pin-function = <0xf>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
eint31: ext-int31 {
|
||||
samsung,pins = "gpx3-7";
|
||||
samsung,pin-function = <0xf>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
pinctrl@03860000 {
|
||||
i2s0_bus: i2s0-bus {
|
||||
samsung,pins = "gpz-0", "gpz-1", "gpz-2", "gpz-3",
|
||||
"gpz-4", "gpz-5", "gpz-6";
|
||||
samsung,pin-function = <0x2>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
|
||||
pcm0_bus: pcm0-bus {
|
||||
samsung,pins = "gpz-0", "gpz-1", "gpz-2", "gpz-3",
|
||||
"gpz-4";
|
||||
samsung,pin-function = <0x3>;
|
||||
samsung,pin-pud = <0>;
|
||||
samsung,pin-drv = <0>;
|
||||
};
|
||||
};
|
||||
};
|
@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
/include/ "skeleton.dtsi"
|
||||
/include/ "exynos4210-pinctrl.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "samsung,exynos4210";
|
||||
@ -29,6 +30,9 @@ aliases {
|
||||
spi0 = &spi_0;
|
||||
spi1 = &spi_1;
|
||||
spi2 = &spi_2;
|
||||
pinctrl0 = &pinctrl_0;
|
||||
pinctrl1 = &pinctrl_1;
|
||||
pinctrl2 = &pinctrl_2;
|
||||
};
|
||||
|
||||
gic:interrupt-controller@10490000 {
|
||||
@ -50,6 +54,39 @@ combiner:interrupt-controller@10440000 {
|
||||
<0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>;
|
||||
};
|
||||
|
||||
pinctrl_0: pinctrl@11400000 {
|
||||
compatible = "samsung,pinctrl-exynos4210";
|
||||
reg = <0x11400000 0x1000>;
|
||||
interrupts = <0 47 0>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
pinctrl_1: pinctrl@11000000 {
|
||||
compatible = "samsung,pinctrl-exynos4210";
|
||||
reg = <0x11000000 0x1000>;
|
||||
interrupts = <0 46 0>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
wakup_eint: wakeup-interrupt-controller {
|
||||
compatible = "samsung,exynos4210-wakeup-eint";
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
|
||||
<0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>,
|
||||
<0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
|
||||
<0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>,
|
||||
<0 32 0>;
|
||||
};
|
||||
};
|
||||
|
||||
pinctrl_2: pinctrl@03860000 {
|
||||
compatible = "samsung,pinctrl-exynos4210";
|
||||
reg = <0x03860000 0x1000>;
|
||||
};
|
||||
|
||||
watchdog@10060000 {
|
||||
compatible = "samsung,s3c2410-wdt";
|
||||
reg = <0x10060000 0x100>;
|
||||
|
@ -27,6 +27,10 @@ aliases {
|
||||
spi0 = &spi_0;
|
||||
spi1 = &spi_1;
|
||||
spi2 = &spi_2;
|
||||
gsc0 = &gsc_0;
|
||||
gsc1 = &gsc_1;
|
||||
gsc2 = &gsc_2;
|
||||
gsc3 = &gsc_3;
|
||||
};
|
||||
|
||||
gic:interrupt-controller@10481000 {
|
||||
@ -460,4 +464,28 @@ gpz: gpio-controller@03860000 {
|
||||
#gpio-cells = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
gsc_0: gsc@0x13e00000 {
|
||||
compatible = "samsung,exynos5-gsc";
|
||||
reg = <0x13e00000 0x1000>;
|
||||
interrupts = <0 85 0>;
|
||||
};
|
||||
|
||||
gsc_1: gsc@0x13e10000 {
|
||||
compatible = "samsung,exynos5-gsc";
|
||||
reg = <0x13e10000 0x1000>;
|
||||
interrupts = <0 86 0>;
|
||||
};
|
||||
|
||||
gsc_2: gsc@0x13e20000 {
|
||||
compatible = "samsung,exynos5-gsc";
|
||||
reg = <0x13e20000 0x1000>;
|
||||
interrupts = <0 87 0>;
|
||||
};
|
||||
|
||||
gsc_3: gsc@0x13e30000 {
|
||||
compatible = "samsung,exynos5-gsc";
|
||||
reg = <0x13e30000 0x1000>;
|
||||
interrupts = <0 88 0>;
|
||||
};
|
||||
};
|
||||
|
@ -430,5 +430,13 @@ emif2: emif@4d000000 {
|
||||
hw-caps-ll-interface;
|
||||
hw-caps-temp-alert;
|
||||
};
|
||||
|
||||
ocp2scp {
|
||||
compatible = "ti,omap-ocp2scp";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
ti,hwmods = "ocp2scp_usb_phy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -39,7 +39,6 @@ CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_DATAFLASH=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_SSC=y
|
||||
|
@ -232,7 +232,7 @@ CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_USB_MASS_STORAGE=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=y
|
||||
CONFIG_MMC_ATMELMCI=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -128,7 +128,7 @@ CONFIG_USB_GADGETFS=m
|
||||
CONFIG_USB_FILE_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -61,7 +61,6 @@ CONFIG_MTD_DATAFLASH=y
|
||||
CONFIG_MTD_BLOCK2MTD=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_GLUEBI=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
@ -138,7 +137,7 @@ CONFIG_USB_FILE_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_SDIO_UART=m
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_ATMEL_PWM=y
|
||||
|
@ -99,7 +99,7 @@ CONFIG_USB_GADGETFS=m
|
||||
CONFIG_USB_FILE_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -60,7 +60,7 @@ CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_ATMEL=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
|
@ -82,7 +82,7 @@ CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -82,7 +82,7 @@ CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -50,7 +50,6 @@ CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_DATAFLASH=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_SCSI=y
|
||||
@ -87,7 +86,7 @@ CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_MMC_ATMELMCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
|
@ -100,7 +100,6 @@ CONFIG_USB_ETH=m
|
||||
CONFIG_USB_FILE_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_MMC_AT91 is not set
|
||||
CONFIG_MMC_ATMELMCI=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
@ -49,7 +49,6 @@ CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_DATAFLASH=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_SCSI=y
|
||||
|
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* arch/arm/include/asm/leds.h
|
||||
*
|
||||
* Copyright (C) 1998 Russell King
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Event-driven interface for LEDs on machines
|
||||
* Added led_start and led_stop- Alex Holden, 28th Dec 1998.
|
||||
*/
|
||||
#ifndef ASM_ARM_LEDS_H
|
||||
#define ASM_ARM_LEDS_H
|
||||
|
||||
|
||||
typedef enum {
|
||||
led_idle_start,
|
||||
led_idle_end,
|
||||
led_timer,
|
||||
led_start,
|
||||
led_stop,
|
||||
led_claim, /* override idle & timer leds */
|
||||
led_release, /* restore idle & timer leds */
|
||||
led_start_timer_mode,
|
||||
led_stop_timer_mode,
|
||||
led_green_on,
|
||||
led_green_off,
|
||||
led_amber_on,
|
||||
led_amber_off,
|
||||
led_red_on,
|
||||
led_red_off,
|
||||
led_blue_on,
|
||||
led_blue_off,
|
||||
/*
|
||||
* I want this between led_timer and led_start, but
|
||||
* someone has decided to export this to user space
|
||||
*/
|
||||
led_halted
|
||||
} led_event_t;
|
||||
|
||||
/* Use this routine to handle LEDs */
|
||||
|
||||
#ifdef CONFIG_LEDS
|
||||
extern void (*leds_event)(led_event_t);
|
||||
#else
|
||||
#define leds_event(e)
|
||||
#endif
|
||||
|
||||
#endif
|
@ -21,7 +21,6 @@ obj-y := elf.o entry-armv.o entry-common.o irq.o opcodes.o \
|
||||
|
||||
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
|
||||
|
||||
obj-$(CONFIG_LEDS) += leds.o
|
||||
obj-$(CONFIG_OC_ETM) += etm.o
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||
|
@ -1,121 +0,0 @@
|
||||
/*
|
||||
* LED support code, ripped out of arch/arm/kernel/time.c
|
||||
*
|
||||
* Copyright (C) 1994-2001 Russell King
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
|
||||
static void dummy_leds_event(led_event_t evt)
|
||||
{
|
||||
}
|
||||
|
||||
void (*leds_event)(led_event_t) = dummy_leds_event;
|
||||
|
||||
struct leds_evt_name {
|
||||
const char name[8];
|
||||
int on;
|
||||
int off;
|
||||
};
|
||||
|
||||
static const struct leds_evt_name evt_names[] = {
|
||||
{ "amber", led_amber_on, led_amber_off },
|
||||
{ "blue", led_blue_on, led_blue_off },
|
||||
{ "green", led_green_on, led_green_off },
|
||||
{ "red", led_red_on, led_red_off },
|
||||
};
|
||||
|
||||
static ssize_t leds_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t size)
|
||||
{
|
||||
int ret = -EINVAL, len = strcspn(buf, " ");
|
||||
|
||||
if (len > 0 && buf[len] == '\0')
|
||||
len--;
|
||||
|
||||
if (strncmp(buf, "claim", len) == 0) {
|
||||
leds_event(led_claim);
|
||||
ret = size;
|
||||
} else if (strncmp(buf, "release", len) == 0) {
|
||||
leds_event(led_release);
|
||||
ret = size;
|
||||
} else {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(evt_names); i++) {
|
||||
if (strlen(evt_names[i].name) != len ||
|
||||
strncmp(buf, evt_names[i].name, len) != 0)
|
||||
continue;
|
||||
if (strncmp(buf+len, " on", 3) == 0) {
|
||||
leds_event(evt_names[i].on);
|
||||
ret = size;
|
||||
} else if (strncmp(buf+len, " off", 4) == 0) {
|
||||
leds_event(evt_names[i].off);
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(event, 0200, NULL, leds_store);
|
||||
|
||||
static struct bus_type leds_subsys = {
|
||||
.name = "leds",
|
||||
.dev_name = "leds",
|
||||
};
|
||||
|
||||
static struct device leds_device = {
|
||||
.id = 0,
|
||||
.bus = &leds_subsys,
|
||||
};
|
||||
|
||||
static int leds_suspend(void)
|
||||
{
|
||||
leds_event(led_stop);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void leds_resume(void)
|
||||
{
|
||||
leds_event(led_start);
|
||||
}
|
||||
|
||||
static void leds_shutdown(void)
|
||||
{
|
||||
leds_event(led_halted);
|
||||
}
|
||||
|
||||
static struct syscore_ops leds_syscore_ops = {
|
||||
.shutdown = leds_shutdown,
|
||||
.suspend = leds_suspend,
|
||||
.resume = leds_resume,
|
||||
};
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
int ret;
|
||||
ret = subsys_system_register(&leds_subsys, NULL);
|
||||
if (ret == 0)
|
||||
ret = device_register(&leds_device);
|
||||
if (ret == 0)
|
||||
ret = device_create_file(&leds_device, &dev_attr_event);
|
||||
if (ret == 0)
|
||||
register_syscore_ops(&leds_syscore_ops);
|
||||
return ret;
|
||||
}
|
||||
|
||||
device_initcall(leds_init);
|
||||
|
||||
EXPORT_SYMBOL(leds_event);
|
@ -31,9 +31,9 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/thread_notify.h>
|
||||
#include <asm/stacktrace.h>
|
||||
@ -189,7 +189,7 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
tick_nohz_idle_enter();
|
||||
rcu_idle_enter();
|
||||
leds_event(led_idle_start);
|
||||
ledtrig_cpu(CPU_LED_IDLE_START);
|
||||
while (!need_resched()) {
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (cpu_is_offline(smp_processor_id()))
|
||||
@ -220,7 +220,7 @@ void cpu_idle(void)
|
||||
} else
|
||||
local_irq_enable();
|
||||
}
|
||||
leds_event(led_idle_end);
|
||||
ledtrig_cpu(CPU_LED_IDLE_END);
|
||||
rcu_idle_exit();
|
||||
tick_nohz_idle_exit();
|
||||
schedule_preempt_disabled();
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/sched_clock.h>
|
||||
#include <asm/stacktrace.h>
|
||||
@ -80,21 +79,6 @@ u32 arch_gettimeoffset(void)
|
||||
}
|
||||
#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
static inline void do_leds(void)
|
||||
{
|
||||
static unsigned int count = HZ/2;
|
||||
|
||||
if (--count == 0) {
|
||||
count = HZ/2;
|
||||
leds_event(led_timer);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define do_leds()
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
||||
/*
|
||||
* Kernel system timer support.
|
||||
@ -102,7 +86,6 @@ static inline void do_leds(void)
|
||||
void timer_tick(void)
|
||||
{
|
||||
profile_tick(CPU_PROFILING);
|
||||
do_leds();
|
||||
xtime_update(1);
|
||||
#ifndef CONFIG_SMP
|
||||
update_process_times(user_mode(get_irq_regs()));
|
||||
|
@ -294,9 +294,9 @@ void __init at91_add_device_cf(struct at91_cf_data *data) {}
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
static struct mci_platform_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
[0] = {
|
||||
@ -312,7 +312,7 @@ static struct resource mmc_resources[] = {
|
||||
};
|
||||
|
||||
static struct platform_device at91rm9200_mmc_device = {
|
||||
.name = "at91_mci",
|
||||
.name = "atmel_mci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
@ -323,53 +323,69 @@ static struct platform_device at91rm9200_mmc_device = {
|
||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int slot_count = 0;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->det_pin)) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
}
|
||||
if (gpio_is_valid(data->wp_pin))
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (gpio_is_valid(data->vcc_pin))
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
|
||||
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA27, 0);
|
||||
if (!data->slot[i].bus_width)
|
||||
continue;
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_B_periph(AT91_PIN_PA8, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_B_periph(AT91_PIN_PA9, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_B_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA11, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA12, 1);
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->slot[i].detect_pin)) {
|
||||
at91_set_gpio_input(data->slot[i].detect_pin, 1);
|
||||
at91_set_deglitch(data->slot[i].detect_pin, 1);
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA28, 1);
|
||||
if (gpio_is_valid(data->slot[i].wp_pin))
|
||||
at91_set_gpio_input(data->slot[i].wp_pin, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA29, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_B_periph(AT91_PIN_PB3, 1);
|
||||
at91_set_B_periph(AT91_PIN_PB4, 1);
|
||||
at91_set_B_periph(AT91_PIN_PB5, 1);
|
||||
switch (i) {
|
||||
case 0: /* slot A */
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA28, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA29, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_B_periph(AT91_PIN_PB3, 1);
|
||||
at91_set_B_periph(AT91_PIN_PB4, 1);
|
||||
at91_set_B_periph(AT91_PIN_PB5, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
case 1: /* slot B */
|
||||
/* CMD */
|
||||
at91_set_B_periph(AT91_PIN_PA8, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_B_periph(AT91_PIN_PA9, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_B_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA11, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA12, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
"AT91: SD/MMC slot %d not available\n", i);
|
||||
break;
|
||||
}
|
||||
if (slot_count) {
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA27, 0);
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91rm9200_mmc_device);
|
||||
}
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91rm9200_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -208,93 +208,11 @@ void __init at91_add_device_eth(struct macb_platform_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9260_BASE_MCI,
|
||||
.end = AT91SAM9260_BASE_MCI + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = NR_IRQS_LEGACY + AT91SAM9260_ID_MCI,
|
||||
.end = NR_IRQS_LEGACY + AT91SAM9260_ID_MCI,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9260_mmc_device = {
|
||||
.name = "at91_mci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc_data,
|
||||
},
|
||||
.resource = mmc_resources,
|
||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->det_pin)) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
}
|
||||
if (gpio_is_valid(data->wp_pin))
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (gpio_is_valid(data->vcc_pin))
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA8, 0);
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_B_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_B_periph(AT91_PIN_PA0, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_B_periph(AT91_PIN_PA5, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA3, 1);
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA7, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA6, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA9, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA11, 1);
|
||||
}
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91sam9260_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* MMC / SD Slot for Atmel MCI Driver
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
||||
#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct mci_platform_data mmc_data;
|
||||
|
||||
|
@ -137,9 +137,9 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
static struct mci_platform_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
[0] = {
|
||||
@ -155,7 +155,7 @@ static struct resource mmc_resources[] = {
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9261_mmc_device = {
|
||||
.name = "at91_mci",
|
||||
.name = "atmel_mci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
@ -166,40 +166,40 @@ static struct platform_device at91sam9261_mmc_device = {
|
||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->det_pin)) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
if (data->slot[0].bus_width) {
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->slot[0].detect_pin)) {
|
||||
at91_set_gpio_input(data->slot[0].detect_pin, 1);
|
||||
at91_set_deglitch(data->slot[0].detect_pin, 1);
|
||||
}
|
||||
if (gpio_is_valid(data->slot[0].wp_pin))
|
||||
at91_set_gpio_input(data->slot[0].wp_pin, 1);
|
||||
|
||||
/* CLK */
|
||||
at91_set_B_periph(AT91_PIN_PA2, 0);
|
||||
|
||||
/* CMD */
|
||||
at91_set_B_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_B_periph(AT91_PIN_PA0, 1);
|
||||
if (data->slot[0].bus_width == 4) {
|
||||
at91_set_B_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA5, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA6, 1);
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91sam9261_mmc_device);
|
||||
}
|
||||
if (gpio_is_valid(data->wp_pin))
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (gpio_is_valid(data->vcc_pin))
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
|
||||
/* CLK */
|
||||
at91_set_B_periph(AT91_PIN_PA2, 0);
|
||||
|
||||
/* CMD */
|
||||
at91_set_B_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_B_periph(AT91_PIN_PA0, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_B_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA5, 1);
|
||||
at91_set_B_periph(AT91_PIN_PA6, 1);
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91sam9261_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -188,8 +188,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
||||
CLKDEV_CON_ID("hclk", &macb_clk),
|
||||
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
||||
CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.0", &mmc0_clk),
|
||||
CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk),
|
||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
|
||||
|
@ -218,9 +218,9 @@ void __init at91_add_device_eth(struct macb_platform_data *data) {}
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc0_data, mmc1_data;
|
||||
static struct mci_platform_data mmc0_data, mmc1_data;
|
||||
|
||||
static struct resource mmc0_resources[] = {
|
||||
[0] = {
|
||||
@ -236,7 +236,7 @@ static struct resource mmc0_resources[] = {
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_mmc0_device = {
|
||||
.name = "at91_mci",
|
||||
.name = "atmel_mci",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
@ -261,7 +261,7 @@ static struct resource mmc1_resources[] = {
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_mmc1_device = {
|
||||
.name = "at91_mci",
|
||||
.name = "atmel_mci",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
@ -272,85 +272,110 @@ static struct platform_device at91sam9263_mmc1_device = {
|
||||
.num_resources = ARRAY_SIZE(mmc1_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int slot_count = 0;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->det_pin)) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
}
|
||||
if (gpio_is_valid(data->wp_pin))
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (gpio_is_valid(data->vcc_pin))
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
|
||||
|
||||
if (mmc_id == 0) { /* MCI0 */
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA12, 0);
|
||||
if (!data->slot[i].bus_width)
|
||||
continue;
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA16, 1);
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->slot[i].detect_pin)) {
|
||||
at91_set_gpio_input(data->slot[i].detect_pin,
|
||||
1);
|
||||
at91_set_deglitch(data->slot[i].detect_pin,
|
||||
1);
|
||||
}
|
||||
if (gpio_is_valid(data->slot[i].wp_pin))
|
||||
at91_set_gpio_input(data->slot[i].wp_pin, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA17, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA18, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA19, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA20, 1);
|
||||
if (mmc_id == 0) { /* MCI0 */
|
||||
switch (i) {
|
||||
case 0: /* slot A */
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
case 1: /* slot B */
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA16, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA17, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_A_periph(AT91_PIN_PA18, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA19, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA20, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
"AT91: SD/MMC slot %d not available\n", i);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||
if (slot_count) {
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA12, 0);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
||||
mmc0_data = *data;
|
||||
platform_device_register(&at91sam9263_mmc0_device);
|
||||
}
|
||||
} else if (mmc_id == 1) { /* MCI1 */
|
||||
switch (i) {
|
||||
case 0: /* slot A */
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA7, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA8, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_A_periph(AT91_PIN_PA9, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA11, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
case 1: /* slot B */
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA21, 1);
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA22, 1);
|
||||
if (data->slot[i].bus_width == 4) {
|
||||
at91_set_A_periph(AT91_PIN_PA23, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA24, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA25, 1);
|
||||
}
|
||||
slot_count++;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
"AT91: SD/MMC slot %d not available\n", i);
|
||||
break;
|
||||
}
|
||||
if (slot_count) {
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA6, 0);
|
||||
|
||||
mmc1_data = *data;
|
||||
platform_device_register(&at91sam9263_mmc1_device);
|
||||
}
|
||||
}
|
||||
|
||||
mmc0_data = *data;
|
||||
platform_device_register(&at91sam9263_mmc0_device);
|
||||
} else { /* MCI1 */
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA6, 0);
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA21, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA22, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA23, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA24, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA25, 1);
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA7, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA8, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA9, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA11, 1);
|
||||
}
|
||||
}
|
||||
|
||||
mmc1_data = *data;
|
||||
platform_device_register(&at91sam9263_mmc1_device);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
|
@ -161,9 +161,9 @@ void __init at91_add_device_usba(struct usba_platform_data *data) {}
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
static struct mci_platform_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
[0] = {
|
||||
@ -179,7 +179,7 @@ static struct resource mmc_resources[] = {
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9rl_mmc_device = {
|
||||
.name = "at91_mci",
|
||||
.name = "atmel_mci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
@ -190,40 +190,40 @@ static struct platform_device at91sam9rl_mmc_device = {
|
||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->det_pin)) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
if (data->slot[0].bus_width) {
|
||||
/* input/irq */
|
||||
if (gpio_is_valid(data->slot[0].detect_pin)) {
|
||||
at91_set_gpio_input(data->slot[0].detect_pin, 1);
|
||||
at91_set_deglitch(data->slot[0].detect_pin, 1);
|
||||
}
|
||||
if (gpio_is_valid(data->slot[0].wp_pin))
|
||||
at91_set_gpio_input(data->slot[0].wp_pin, 1);
|
||||
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA2, 0);
|
||||
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
||||
if (data->slot[0].bus_width == 4) {
|
||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91sam9rl_mmc_device);
|
||||
}
|
||||
if (gpio_is_valid(data->wp_pin))
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (gpio_is_valid(data->vcc_pin))
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA2, 0);
|
||||
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
||||
}
|
||||
|
||||
mmc_data = *data;
|
||||
platform_device_register(&at91sam9rl_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -133,12 +133,12 @@ static struct atmel_nand_data __initdata afeb9260_nand_data = {
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata afeb9260_mmc_data = {
|
||||
.det_pin = AT91_PIN_PC9,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
.slot_b = 1,
|
||||
.wire4 = 1,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata afeb9260_mci0_data = {
|
||||
.slot[1] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PC9,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -199,7 +199,7 @@ static void __init afeb9260_board_init(void)
|
||||
at91_set_B_periph(AT91_PIN_PA10, 0); /* ETX2 */
|
||||
at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &afeb9260_mmc_data);
|
||||
at91_add_device_mci(0, &afeb9260_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(afeb9260_i2c_devices,
|
||||
ARRAY_SIZE(afeb9260_i2c_devices));
|
||||
|
@ -71,12 +71,12 @@ static struct at91_udc_data __initdata carmeva_udc_data = {
|
||||
// .vcc_pin = -EINVAL,
|
||||
// };
|
||||
|
||||
static struct at91_mmc_data __initdata carmeva_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PB10,
|
||||
.wp_pin = AT91_PIN_PC14,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata carmeva_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB10,
|
||||
.wp_pin = AT91_PIN_PC14,
|
||||
},
|
||||
};
|
||||
|
||||
static struct spi_board_info carmeva_spi_devices[] = {
|
||||
@ -150,7 +150,7 @@ static void __init carmeva_board_init(void)
|
||||
/* Compact Flash */
|
||||
// at91_add_device_cf(&carmeva_cf_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &carmeva_mmc_data);
|
||||
at91_add_device_mci(0, &carmeva_mci0_data);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(carmeva_leds, ARRAY_SIZE(carmeva_leds));
|
||||
}
|
||||
|
@ -254,8 +254,7 @@ static struct gpio_led cpu9krea_leds[] = {
|
||||
|
||||
static struct i2c_board_info __initdata cpu9krea_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-ds1307", 0x68),
|
||||
.type = "ds1339",
|
||||
I2C_BOARD_INFO("ds1339", 0x68),
|
||||
},
|
||||
};
|
||||
|
||||
@ -312,12 +311,12 @@ static void __init cpu9krea_add_device_buttons(void)
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata cpu9krea_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PA29,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata cpu9krea_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PA29,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init cpu9krea_board_init(void)
|
||||
@ -359,7 +358,7 @@ static void __init cpu9krea_board_init(void)
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&cpu9krea_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &cpu9krea_mmc_data);
|
||||
at91_add_device_mci(0, &cpu9krea_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(cpu9krea_i2c_devices,
|
||||
ARRAY_SIZE(cpu9krea_i2c_devices));
|
||||
|
@ -78,11 +78,12 @@ static struct at91_udc_data __initdata cpuat91_udc_data = {
|
||||
.pullup_pin = AT91_PIN_PC14,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata cpuat91_mmc_data = {
|
||||
.det_pin = AT91_PIN_PC2,
|
||||
.wire4 = 1,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata cpuat91_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PC2,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data cpuat91_flash_data = {
|
||||
@ -168,7 +169,7 @@ static void __init cpuat91_board_init(void)
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&cpuat91_udc_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &cpuat91_mmc_data);
|
||||
at91_add_device_mci(0, &cpuat91_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* Platform devices */
|
||||
|
@ -87,12 +87,12 @@ static struct at91_cf_data __initdata csb337_cf_data = {
|
||||
.rst_pin = AT91_PIN_PD2,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata csb337_mmc_data = {
|
||||
.det_pin = AT91_PIN_PD5,
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = AT91_PIN_PD6,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata csb337_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PD5,
|
||||
.wp_pin = AT91_PIN_PD6,
|
||||
},
|
||||
};
|
||||
|
||||
static struct spi_board_info csb337_spi_devices[] = {
|
||||
@ -220,8 +220,6 @@ static struct gpio_led csb_leds[] = {
|
||||
|
||||
static void __init csb337_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1);
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0 */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -240,7 +238,7 @@ static void __init csb337_board_init(void)
|
||||
/* SPI */
|
||||
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &csb337_mmc_data);
|
||||
at91_add_device_mci(0, &csb337_mci0_data);
|
||||
/* NOR flash */
|
||||
platform_device_register(&csb_flash);
|
||||
/* LEDs */
|
||||
|
@ -70,12 +70,12 @@ static struct at91_cf_data __initdata eb9200_cf_data = {
|
||||
.rst_pin = AT91_PIN_PC5,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata eb9200_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata eb9200_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
|
||||
@ -113,7 +113,7 @@ static void __init eb9200_board_init(void)
|
||||
at91_add_device_spi(NULL, 0);
|
||||
/* MMC */
|
||||
/* only supports 1 or 4 bit interface, not wired through to SPI */
|
||||
at91_add_device_mmc(0, &eb9200_mmc_data);
|
||||
at91_add_device_mci(0, &eb9200_mci0_data);
|
||||
}
|
||||
|
||||
MACHINE_START(ATEB9200, "Embest ATEB9200")
|
||||
|
@ -64,12 +64,12 @@ static struct at91_usbh_data __initdata ecb_at91usbh_data = {
|
||||
.overcurrent_pin= {-EINVAL, -EINVAL},
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata ecb_at91mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata ecbat91_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -138,11 +138,20 @@ static struct spi_board_info __initdata ecb_at91spi_devices[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* LEDs
|
||||
*/
|
||||
static struct gpio_led ecb_leds[] = {
|
||||
{ /* D1 */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PC7,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
}
|
||||
};
|
||||
|
||||
static void __init ecb_at91board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PC7, AT91_PIN_PC7);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -161,10 +170,13 @@ static void __init ecb_at91board_init(void)
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ecb_at91mmc_data);
|
||||
at91_add_device_mci(0, &ecbat91_mci0_data);
|
||||
|
||||
/* SPI */
|
||||
at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices));
|
||||
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ecb_leds, ARRAY_SIZE(ecb_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(ECBAT91, "emQbit's ECB_AT91")
|
||||
|
@ -56,12 +56,12 @@ static struct at91_udc_data __initdata eco920_udc_data = {
|
||||
.pullup_pin = AT91_PIN_PB13,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata eco920_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 0,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata eco920_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 1,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data eco920_flash_data = {
|
||||
@ -93,10 +93,26 @@ static struct spi_board_info eco920_spi_devices[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* LEDs
|
||||
*/
|
||||
static struct gpio_led eco920_leds[] = {
|
||||
{ /* D1 */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PB0,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
{ /* D2 */
|
||||
.name = "led2",
|
||||
.gpio = AT91_PIN_PB1,
|
||||
.active_low = 1,
|
||||
.default_trigger = "timer",
|
||||
}
|
||||
};
|
||||
|
||||
static void __init eco920_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1);
|
||||
/* DBGU on ttyS0. (Rx & Tx only */
|
||||
at91_register_uart(0, 0, 0);
|
||||
at91_add_device_serial();
|
||||
@ -104,7 +120,7 @@ static void __init eco920_board_init(void)
|
||||
at91_add_device_usbh(&eco920_usbh_data);
|
||||
at91_add_device_udc(&eco920_udc_data);
|
||||
|
||||
at91_add_device_mmc(0, &eco920_mmc_data);
|
||||
at91_add_device_mci(0, &eco920_mci0_data);
|
||||
platform_device_register(&eco920_flash);
|
||||
|
||||
at91_ramc_write(0, AT91_SMC_CSR(7), AT91_SMC_RWHOLD_(1)
|
||||
@ -127,6 +143,8 @@ static void __init eco920_board_init(void)
|
||||
);
|
||||
|
||||
at91_add_device_spi(eco920_spi_devices, ARRAY_SIZE(eco920_spi_devices));
|
||||
/* LEDs */
|
||||
at91_gpio_leds(eco920_leds, ARRAY_SIZE(eco920_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(ECO920, "eco920")
|
||||
|
@ -75,12 +75,12 @@ static struct spi_board_info flexibity_spi_devices[] = {
|
||||
};
|
||||
|
||||
/* MCI (SD/MMC) */
|
||||
static struct at91_mmc_data __initdata flexibity_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PC9,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata flexibity_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PC9,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
},
|
||||
};
|
||||
|
||||
/* LEDs */
|
||||
@ -152,7 +152,7 @@ static void __init flexibity_board_init(void)
|
||||
at91_add_device_spi(flexibity_spi_devices,
|
||||
ARRAY_SIZE(flexibity_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &flexibity_mmc_data);
|
||||
at91_add_device_mci(0, &flexibity_mci0_data);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(flexibity_leds, ARRAY_SIZE(flexibity_leds));
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ static struct at91_udc_data __initdata foxg20_udc_data = {
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info foxg20_spi_devices[] = {
|
||||
#if !defined(CONFIG_MMC_AT91)
|
||||
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
{
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 1,
|
||||
@ -109,12 +109,12 @@ static struct macb_platform_data __initdata foxg20_macb_data = {
|
||||
* MCI (SD/MMC)
|
||||
* det_pin, wp_pin and vcc_pin are not connected
|
||||
*/
|
||||
static struct at91_mmc_data __initdata foxg20_mmc_data = {
|
||||
.slot_b = 1,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata foxg20_mci0_data = {
|
||||
.slot[1] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -247,7 +247,7 @@ static void __init foxg20_board_init(void)
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&foxg20_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &foxg20_mmc_data);
|
||||
at91_add_device_mci(0, &foxg20_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(foxg20_i2c_devices, ARRAY_SIZE(foxg20_i2c_devices));
|
||||
/* LEDs */
|
||||
|
@ -66,11 +66,20 @@ static struct at91_udc_data __initdata kafa_udc_data = {
|
||||
.pullup_pin = AT91_PIN_PB7,
|
||||
};
|
||||
|
||||
/*
|
||||
* LEDs
|
||||
*/
|
||||
static struct gpio_led kafa_leds[] = {
|
||||
{ /* D1 */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PB4,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
};
|
||||
|
||||
static void __init kafa_board_init(void)
|
||||
{
|
||||
/* Set up the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB4, AT91_PIN_PB4);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -88,6 +97,8 @@ static void __init kafa_board_init(void)
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* SPI */
|
||||
at91_add_device_spi(NULL, 0);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(kafa_leds, ARRAY_SIZE(kafa_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(KAFA, "Sperry-Sun KAFA")
|
||||
|
@ -69,12 +69,12 @@ static struct at91_udc_data __initdata kb9202_udc_data = {
|
||||
.pullup_pin = AT91_PIN_PB22,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata kb9202_mmc_data = {
|
||||
.det_pin = AT91_PIN_PB2,
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata kb9202_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB2,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition __initdata kb9202_nand_partition[] = {
|
||||
@ -96,11 +96,26 @@ static struct atmel_nand_data __initdata kb9202_nand_data = {
|
||||
.num_parts = ARRAY_SIZE(kb9202_nand_partition),
|
||||
};
|
||||
|
||||
/*
|
||||
* LEDs
|
||||
*/
|
||||
static struct gpio_led kb9202_leds[] = {
|
||||
{ /* D1 */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PC19,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
{ /* D2 */
|
||||
.name = "led2",
|
||||
.gpio = AT91_PIN_PC18,
|
||||
.active_low = 1,
|
||||
.default_trigger = "timer",
|
||||
}
|
||||
};
|
||||
|
||||
static void __init kb9202_board_init(void)
|
||||
{
|
||||
/* Set up the LEDs */
|
||||
at91_init_leds(AT91_PIN_PC19, AT91_PIN_PC18);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -121,13 +136,15 @@ static void __init kb9202_board_init(void)
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&kb9202_udc_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &kb9202_mmc_data);
|
||||
at91_add_device_mci(0, &kb9202_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* SPI */
|
||||
at91_add_device_spi(NULL, 0);
|
||||
/* NAND */
|
||||
at91_add_device_nand(&kb9202_nand_data);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(kb9202_leds, ARRAY_SIZE(kb9202_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(KB9200, "KB920x")
|
||||
|
@ -138,11 +138,12 @@ static struct spi_board_info neocore926_spi_devices[] = {
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata neocore926_mmc_data = {
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PE18,
|
||||
.wp_pin = AT91_PIN_PE19,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata neocore926_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PE18,
|
||||
.wp_pin = AT91_PIN_PE19,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -354,7 +355,7 @@ static void __init neocore926_board_init(void)
|
||||
neocore926_add_device_ts();
|
||||
|
||||
/* MMC */
|
||||
at91_add_device_mmc(1, &neocore926_mmc_data);
|
||||
at91_add_device_mci(0, &neocore926_mci0_data);
|
||||
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&neocore926_macb_data);
|
||||
|
@ -62,12 +62,12 @@ static struct at91_usbh_data __initdata picotux200_usbh_data = {
|
||||
.overcurrent_pin= {-EINVAL, -EINVAL},
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata picotux200_mmc_data = {
|
||||
.det_pin = AT91_PIN_PB27,
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = AT91_PIN_PA17,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata picotux200_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB27,
|
||||
.wp_pin = AT91_PIN_PA17,
|
||||
},
|
||||
};
|
||||
|
||||
#define PICOTUX200_FLASH_BASE AT91_CHIPSELECT_0
|
||||
@ -112,7 +112,7 @@ static void __init picotux200_board_init(void)
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
||||
at91_add_device_mmc(0, &picotux200_mmc_data);
|
||||
at91_add_device_mci(0, &picotux200_mci0_data);
|
||||
/* NOR Flash */
|
||||
platform_device_register(&picotux200_flash);
|
||||
}
|
||||
|
@ -156,12 +156,12 @@ static void __init ek_add_device_nand(void)
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -245,7 +245,7 @@ static void __init ek_board_init(void)
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &ek_mci0_data);
|
||||
/* Push Buttons */
|
||||
ek_add_device_buttons();
|
||||
/* LEDs */
|
||||
|
@ -77,12 +77,12 @@ static struct at91_cf_data __initdata dk_cf_data = {
|
||||
};
|
||||
|
||||
#ifndef CONFIG_MTD_AT91_DATAFLASH_CARD
|
||||
static struct at91_mmc_data __initdata dk_mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata dk_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -177,9 +177,6 @@ static struct gpio_led dk_leds[] = {
|
||||
|
||||
static void __init dk_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -208,7 +205,7 @@ static void __init dk_board_init(void)
|
||||
#else
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
||||
at91_add_device_mmc(0, &dk_mmc_data);
|
||||
at91_add_device_mci(0, &dk_mci0_data);
|
||||
#endif
|
||||
/* NAND */
|
||||
at91_add_device_nand(&dk_nand_data);
|
||||
|
@ -70,12 +70,12 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||
};
|
||||
|
||||
#ifndef CONFIG_MTD_AT91_DATAFLASH_CARD
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.det_pin = AT91_PIN_PB27,
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = AT91_PIN_PA17,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB27,
|
||||
.wp_pin = AT91_PIN_PA17,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -148,9 +148,6 @@ static struct gpio_led ek_leds[] = {
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -177,7 +174,7 @@ static void __init ek_board_init(void)
|
||||
#else
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &ek_mci0_data);
|
||||
#endif
|
||||
/* NOR Flash */
|
||||
platform_device_register(&ek_flash);
|
||||
|
@ -58,11 +58,12 @@ static struct at91_usbh_data rsi_ews_usbh_data __initdata = {
|
||||
/*
|
||||
* SD/MC
|
||||
*/
|
||||
static struct at91_mmc_data rsi_ews_mmc_data __initdata = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PB27,
|
||||
.wp_pin = AT91_PIN_PB29,
|
||||
static struct mci_platform_data __initdata rsi_ews_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB27,
|
||||
.wp_pin = AT91_PIN_PB29,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -185,9 +186,6 @@ static struct platform_device rsiews_nor_flash = {
|
||||
*/
|
||||
static void __init rsi_ews_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PB6, AT91_PIN_PB9);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
/* This one is for debugging */
|
||||
@ -215,7 +213,7 @@ static void __init rsi_ews_board_init(void)
|
||||
at91_add_device_spi(rsi_ews_spi_devices,
|
||||
ARRAY_SIZE(rsi_ews_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &rsi_ews_mmc_data);
|
||||
at91_add_device_mci(0, &rsi_ews_mci0_data);
|
||||
/* NOR Flash */
|
||||
platform_device_register(&rsiews_nor_flash);
|
||||
/* LEDs */
|
||||
|
@ -73,7 +73,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info ek_spi_devices[] = {
|
||||
#if !defined(CONFIG_MMC_AT91)
|
||||
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
{ /* DataFlash chip */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 1,
|
||||
@ -158,19 +158,34 @@ static void __init ek_add_device_nand(void)
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.slot_b = 1,
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PC8,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||
.slot[1] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PC8,
|
||||
.wp_pin = AT91_PIN_PC4,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* LEDs
|
||||
*/
|
||||
static struct gpio_led ek_leds[] = {
|
||||
{ /* D1 */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PA9,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
{ /* D2 */
|
||||
.name = "led2",
|
||||
.gpio = AT91_PIN_PA6,
|
||||
.active_low = 1,
|
||||
.default_trigger = "timer",
|
||||
}
|
||||
};
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PA9, AT91_PIN_PA6);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -194,9 +209,11 @@ static void __init ek_board_init(void)
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &ek_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
|
||||
|
@ -108,7 +108,7 @@ static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info ek_spi_devices[] = {
|
||||
#if !defined(CONFIG_MMC_AT91)
|
||||
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
{ /* DataFlash chip */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 1,
|
||||
@ -211,12 +211,12 @@ static void __init ek_add_device_nand(void)
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.slot_b = 1,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||
.slot[1] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -329,7 +329,7 @@ static void __init ek_board_init(void)
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &ek_mci0_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||
/* SSC (to AT73C213) */
|
||||
|
@ -340,11 +340,12 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||
* MCI (SD/MMC)
|
||||
* det_pin, wp_pin and vcc_pin are not connected
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SPI_ATMEL_* */
|
||||
@ -569,9 +570,6 @@ static struct gpio_led ek_leds[] = {
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs */
|
||||
at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -598,7 +596,7 @@ static void __init ek_board_init(void)
|
||||
at91_add_device_ssc(AT91SAM9261_ID_SSC1, ATMEL_SSC_TX);
|
||||
#else
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &mci0_data);
|
||||
#endif
|
||||
/* LCD Controller */
|
||||
at91_add_device_lcdc(&ek_lcdc_data);
|
||||
|
@ -141,11 +141,12 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PE18,
|
||||
.wp_pin = AT91_PIN_PE19,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata mci1_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PE18,
|
||||
.wp_pin = AT91_PIN_PE19,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -420,7 +421,7 @@ static void __init ek_board_init(void)
|
||||
/* Touchscreen */
|
||||
ek_add_device_ts();
|
||||
/* MMC */
|
||||
at91_add_device_mmc(1, &ek_mmc_data);
|
||||
at91_add_device_mci(1, &mci1_data);
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_macb_data);
|
||||
/* NAND */
|
||||
|
@ -92,7 +92,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info ek_spi_devices[] = {
|
||||
#if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91))
|
||||
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||
{ /* DataFlash chip */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 1,
|
||||
@ -199,7 +199,6 @@ static void __init ek_add_device_nand(void)
|
||||
* MCI (SD/MMC)
|
||||
* wp_pin and vcc_pin are not connected
|
||||
*/
|
||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
||||
static struct mci_platform_data __initdata ek_mmc_data = {
|
||||
.slot[1] = {
|
||||
.bus_width = 4,
|
||||
@ -208,28 +207,15 @@ static struct mci_platform_data __initdata ek_mmc_data = {
|
||||
},
|
||||
|
||||
};
|
||||
#else
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.slot_b = 1, /* Only one slot so use slot B */
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PC9,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
};
|
||||
#endif
|
||||
|
||||
static void __init ek_add_device_mmc(void)
|
||||
{
|
||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
||||
if (ek_have_2mmc()) {
|
||||
ek_mmc_data.slot[0].bus_width = 4;
|
||||
ek_mmc_data.slot[0].detect_pin = AT91_PIN_PC2;
|
||||
ek_mmc_data.slot[0].wp_pin = -1;
|
||||
}
|
||||
at91_add_device_mci(0, &ek_mmc_data);
|
||||
#else
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -56,11 +56,12 @@ static struct usba_platform_data __initdata ek_usba_udc_data = {
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PA15,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PA15,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -303,7 +304,7 @@ static void __init ek_board_init(void)
|
||||
/* SPI */
|
||||
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
at91_add_device_mci(0, &mci0_data);
|
||||
/* LCD Controller */
|
||||
at91_add_device_lcdc(&ek_lcdc_data);
|
||||
/* AC97 */
|
||||
|
@ -83,7 +83,6 @@ static void __init add_device_nand(void)
|
||||
* MCI (SD/MMC)
|
||||
* det_pin, wp_pin and vcc_pin are not connected
|
||||
*/
|
||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
||||
static struct mci_platform_data __initdata mmc_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
@ -91,15 +90,6 @@ static struct mci_platform_data __initdata mmc_data = {
|
||||
.wp_pin = -1,
|
||||
},
|
||||
};
|
||||
#else
|
||||
static struct at91_mmc_data __initdata mmc_data = {
|
||||
.slot_b = 0,
|
||||
.wire4 = 1,
|
||||
.det_pin = -EINVAL,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@ -223,11 +213,7 @@ void __init stamp9g20_board_init(void)
|
||||
/* NAND */
|
||||
add_device_nand();
|
||||
/* MMC */
|
||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
||||
at91_add_device_mci(0, &mmc_data);
|
||||
#else
|
||||
at91_add_device_mmc(0, &mmc_data);
|
||||
#endif
|
||||
/* W1 */
|
||||
add_w1();
|
||||
}
|
||||
|
@ -109,14 +109,12 @@ static struct mmc_spi_platform_data at91_mmc_spi_pdata = {
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info usb_a9263_spi_devices[] = {
|
||||
#if !defined(CONFIG_MMC_AT91)
|
||||
{ /* DataFlash chip */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 15 * 1000 * 1000,
|
||||
.bus_num = 0,
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct spi_board_info usb_a9g20_spi_devices[] = {
|
||||
|
@ -119,11 +119,12 @@ static struct at91_udc_data __initdata yl9200_udc_data = {
|
||||
/*
|
||||
* MMC
|
||||
*/
|
||||
static struct at91_mmc_data __initdata yl9200_mmc_data = {
|
||||
.det_pin = AT91_PIN_PB9,
|
||||
.wire4 = 1,
|
||||
.wp_pin = -EINVAL,
|
||||
.vcc_pin = -EINVAL,
|
||||
static struct mci_platform_data __initdata yl9200_mci0_data = {
|
||||
.slot[0] = {
|
||||
.bus_width = 4,
|
||||
.detect_pin = AT91_PIN_PB9,
|
||||
.wp_pin = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -541,9 +542,6 @@ void __init yl9200_add_device_video(void) {}
|
||||
|
||||
static void __init yl9200_board_init(void)
|
||||
{
|
||||
/* Setup the LEDs D2=PB17 (timer), D3=PB16 (cpu) */
|
||||
at91_init_leds(AT91_PIN_PB16, AT91_PIN_PB17);
|
||||
|
||||
/* Serial */
|
||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||
at91_register_uart(0, 0, 0);
|
||||
@ -568,7 +566,7 @@ static void __init yl9200_board_init(void)
|
||||
/* I2C */
|
||||
at91_add_device_i2c(yl9200_i2c_devices, ARRAY_SIZE(yl9200_i2c_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &yl9200_mmc_data);
|
||||
at91_add_device_mci(0, &yl9200_mci0_data);
|
||||
/* NAND */
|
||||
at91_add_device_nand(&yl9200_nand_data);
|
||||
/* NOR Flash */
|
||||
|
@ -187,7 +187,6 @@ struct at91_can_data {
|
||||
extern void __init at91_add_device_can(struct at91_can_data *data);
|
||||
|
||||
/* LEDs */
|
||||
extern void __init at91_init_leds(u8 cpu_led, u8 timer_led);
|
||||
extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);
|
||||
extern void __init at91_pwm_leds(struct gpio_led *leds, int nr);
|
||||
|
||||
|
@ -90,108 +90,3 @@ void __init at91_pwm_leds(struct gpio_led *leds, int nr)
|
||||
#else
|
||||
void __init at91_pwm_leds(struct gpio_led *leds, int nr){}
|
||||
#endif
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
|
||||
#include <asm/leds.h>
|
||||
|
||||
/*
|
||||
* Old ARM-specific LED framework; not fully functional when generic time is
|
||||
* in use.
|
||||
*/
|
||||
|
||||
static u8 at91_leds_cpu;
|
||||
static u8 at91_leds_timer;
|
||||
|
||||
static inline void at91_led_on(unsigned int led)
|
||||
{
|
||||
at91_set_gpio_value(led, 0);
|
||||
}
|
||||
|
||||
static inline void at91_led_off(unsigned int led)
|
||||
{
|
||||
at91_set_gpio_value(led, 1);
|
||||
}
|
||||
|
||||
static inline void at91_led_toggle(unsigned int led)
|
||||
{
|
||||
unsigned long is_off = at91_get_gpio_value(led);
|
||||
if (is_off)
|
||||
at91_led_on(led);
|
||||
else
|
||||
at91_led_off(led);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Handle LED events.
|
||||
*/
|
||||
static void at91_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
switch(evt) {
|
||||
case led_start: /* System startup */
|
||||
at91_led_on(at91_leds_cpu);
|
||||
break;
|
||||
|
||||
case led_stop: /* System stop / suspend */
|
||||
at91_led_off(at91_leds_cpu);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer: /* Every 50 timer ticks */
|
||||
at91_led_toggle(at91_leds_timer);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start: /* Entering idle state */
|
||||
at91_led_off(at91_leds_cpu);
|
||||
break;
|
||||
|
||||
case led_idle_end: /* Exit idle state */
|
||||
at91_led_on(at91_leds_cpu);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
if (!at91_leds_timer || !at91_leds_cpu)
|
||||
return -ENODEV;
|
||||
|
||||
leds_event = at91_leds_event;
|
||||
|
||||
leds_event(led_start);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(leds_init);
|
||||
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
#endif
|
||||
|
@ -15,5 +15,3 @@ obj-$(CONFIG_ARCH_CLEP7312) += clep7312.o
|
||||
obj-$(CONFIG_ARCH_EDB7211) += edb7211-arch.o edb7211-mm.o
|
||||
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
||||
obj-$(CONFIG_ARCH_P720T) += p720t.o
|
||||
leds-$(CONFIG_ARCH_P720T) += p720t-leds.o
|
||||
obj-$(CONFIG_LEDS) += $(leds-y)
|
||||
|
@ -1,63 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-clps711x/leds.c
|
||||
*
|
||||
* Integrator LED control routines
|
||||
*
|
||||
* Copyright (C) 2000 Deep Blue Solutions Ltd
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static void p720t_leds_event(led_event_t ledevt)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 pddr;
|
||||
|
||||
local_irq_save(flags);
|
||||
switch(ledevt) {
|
||||
case led_idle_start:
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
break;
|
||||
|
||||
case led_timer:
|
||||
pddr = clps_readb(PDDR);
|
||||
clps_writeb(pddr ^ 1, PDDR);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
if (machine_is_p720t())
|
||||
leds_event = p720t_leds_event;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(leds_init);
|
@ -23,6 +23,8 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/pgtable.h>
|
||||
@ -34,6 +36,8 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/syspld.h>
|
||||
|
||||
#include <asm/hardware/clps7111.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
@ -107,6 +111,64 @@ static void __init p720t_init_early(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* LED controled by CPLD
|
||||
*/
|
||||
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||
static void p720t_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
u8 reg = clps_readb(PDDR);
|
||||
|
||||
if (b != LED_OFF)
|
||||
reg |= 0x1;
|
||||
else
|
||||
reg &= ~0x1;
|
||||
|
||||
clps_writeb(reg, PDDR);
|
||||
}
|
||||
|
||||
static enum led_brightness p720t_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
u8 reg = clps_readb(PDDR);
|
||||
|
||||
return (reg & 0x1) ? LED_FULL : LED_OFF;
|
||||
}
|
||||
|
||||
static int __init p720t_leds_init(void)
|
||||
{
|
||||
|
||||
struct led_classdev *cdev;
|
||||
int ret;
|
||||
|
||||
if (!machine_is_p720t())
|
||||
return -ENODEV;
|
||||
|
||||
cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
|
||||
if (!cdev)
|
||||
return -ENOMEM;
|
||||
|
||||
cdev->name = "p720t:0";
|
||||
cdev->brightness_set = p720t_led_set;
|
||||
cdev->brightness_get = p720t_led_get;
|
||||
cdev->default_trigger = "heartbeat";
|
||||
|
||||
ret = led_classdev_register(NULL, cdev);
|
||||
if (ret < 0) {
|
||||
kfree(cdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since we may have triggers on any subsystem, defer registration
|
||||
* until after subsystem_init.
|
||||
*/
|
||||
fs_initcall(p720t_leds_init);
|
||||
#endif
|
||||
|
||||
MACHINE_START(P720T, "ARM-Prospector720T")
|
||||
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
||||
.atag_offset = 0x100,
|
||||
|
@ -4,9 +4,7 @@
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y := core.o io.o
|
||||
obj-y := core.o io.o leds.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_LEDS) += leds.o
|
||||
|
@ -1,52 +1,71 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-ebsa110/leds.c
|
||||
* Driver for the LED found on the EBSA110 machine
|
||||
* Based on Versatile and RealView machine LED code
|
||||
*
|
||||
* Copyright (C) 1998 Russell King
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* EBSA-110 LED control routines. We use the led as follows:
|
||||
*
|
||||
* - Red - toggles state every 50 timer interrupts
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "core.h"
|
||||
|
||||
static spinlock_t leds_lock;
|
||||
|
||||
static void ebsa110_leds_event(led_event_t ledevt)
|
||||
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||
static void ebsa110_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 reg = __raw_readb(SOFT_BASE);
|
||||
|
||||
spin_lock_irqsave(&leds_lock, flags);
|
||||
if (b != LED_OFF)
|
||||
reg |= 0x80;
|
||||
else
|
||||
reg &= ~0x80;
|
||||
|
||||
switch(ledevt) {
|
||||
case led_timer:
|
||||
*(volatile unsigned char *)SOFT_BASE ^= 128;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&leds_lock, flags);
|
||||
__raw_writeb(reg, SOFT_BASE);
|
||||
}
|
||||
|
||||
static int __init leds_init(void)
|
||||
static enum led_brightness ebsa110_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
if (machine_is_ebsa110())
|
||||
leds_event = ebsa110_leds_event;
|
||||
u8 reg = __raw_readb(SOFT_BASE);
|
||||
|
||||
return (reg & 0x80) ? LED_FULL : LED_OFF;
|
||||
}
|
||||
|
||||
static int __init ebsa110_leds_init(void)
|
||||
{
|
||||
|
||||
struct led_classdev *cdev;
|
||||
int ret;
|
||||
|
||||
if (!machine_is_ebsa110())
|
||||
return -ENODEV;
|
||||
|
||||
cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
|
||||
if (!cdev)
|
||||
return -ENOMEM;
|
||||
|
||||
cdev->name = "ebsa110:0";
|
||||
cdev->brightness_set = ebsa110_led_set;
|
||||
cdev->brightness_get = ebsa110_led_get;
|
||||
cdev->default_trigger = "heartbeat";
|
||||
|
||||
ret = led_classdev_register(NULL, cdev);
|
||||
if (ret < 0) {
|
||||
kfree(cdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(leds_init);
|
||||
/*
|
||||
* Since we may have triggers on any subsystem, defer registration
|
||||
* until after subsystem_init.
|
||||
*/
|
||||
fs_initcall(ebsa110_leds_init);
|
||||
#endif
|
||||
|
@ -405,6 +405,8 @@ config MACH_EXYNOS4_DT
|
||||
select USE_OF
|
||||
select ARM_AMBA
|
||||
select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD
|
||||
select PINCTRL
|
||||
select PINCTRL_EXYNOS4
|
||||
help
|
||||
Machine support for Samsung Exynos4 machine with device tree enabled.
|
||||
Select this if a fdt blob is available for the Exynos4 SoC based board.
|
||||
|
@ -547,6 +547,68 @@ static struct clksrc_clk exynos5_clk_aclk_66 = {
|
||||
.reg_div = { .reg = EXYNOS5_CLKDIV_TOP0, .shift = 0, .size = 3 },
|
||||
};
|
||||
|
||||
static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl_mid = {
|
||||
.clk = {
|
||||
.name = "mout_aclk_300_gscl_mid",
|
||||
},
|
||||
.sources = &exynos5_clkset_aclk,
|
||||
.reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 24, .size = 1 },
|
||||
};
|
||||
|
||||
static struct clk *exynos5_clkset_aclk_300_mid1_list[] = {
|
||||
[0] = &exynos5_clk_sclk_vpll.clk,
|
||||
[1] = &exynos5_clk_mout_cpll.clk,
|
||||
};
|
||||
|
||||
static struct clksrc_sources exynos5_clkset_aclk_300_gscl_mid1 = {
|
||||
.sources = exynos5_clkset_aclk_300_mid1_list,
|
||||
.nr_sources = ARRAY_SIZE(exynos5_clkset_aclk_300_mid1_list),
|
||||
};
|
||||
|
||||
static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl_mid1 = {
|
||||
.clk = {
|
||||
.name = "mout_aclk_300_gscl_mid1",
|
||||
},
|
||||
.sources = &exynos5_clkset_aclk_300_gscl_mid1,
|
||||
.reg_src = { .reg = EXYNOS5_CLKSRC_TOP1, .shift = 12, .size = 1 },
|
||||
};
|
||||
|
||||
static struct clk *exynos5_clkset_aclk_300_gscl_list[] = {
|
||||
[0] = &exynos5_clk_mout_aclk_300_gscl_mid.clk,
|
||||
[1] = &exynos5_clk_mout_aclk_300_gscl_mid1.clk,
|
||||
};
|
||||
|
||||
static struct clksrc_sources exynos5_clkset_aclk_300_gscl = {
|
||||
.sources = exynos5_clkset_aclk_300_gscl_list,
|
||||
.nr_sources = ARRAY_SIZE(exynos5_clkset_aclk_300_gscl_list),
|
||||
};
|
||||
|
||||
static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl = {
|
||||
.clk = {
|
||||
.name = "mout_aclk_300_gscl",
|
||||
},
|
||||
.sources = &exynos5_clkset_aclk_300_gscl,
|
||||
.reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 25, .size = 1 },
|
||||
};
|
||||
|
||||
static struct clk *exynos5_clk_src_gscl_300_list[] = {
|
||||
[0] = &clk_ext_xtal_mux,
|
||||
[1] = &exynos5_clk_mout_aclk_300_gscl.clk,
|
||||
};
|
||||
|
||||
static struct clksrc_sources exynos5_clk_src_gscl_300 = {
|
||||
.sources = exynos5_clk_src_gscl_300_list,
|
||||
.nr_sources = ARRAY_SIZE(exynos5_clk_src_gscl_300_list),
|
||||
};
|
||||
|
||||
static struct clksrc_clk exynos5_clk_aclk_300_gscl = {
|
||||
.clk = {
|
||||
.name = "aclk_300_gscl",
|
||||
},
|
||||
.sources = &exynos5_clk_src_gscl_300,
|
||||
.reg_src = { .reg = EXYNOS5_CLKSRC_TOP3, .shift = 10, .size = 1 },
|
||||
};
|
||||
|
||||
static struct clk exynos5_init_clocks_off[] = {
|
||||
{
|
||||
.name = "timers",
|
||||
@ -754,6 +816,26 @@ static struct clk exynos5_init_clocks_off[] = {
|
||||
.parent = &exynos5_clk_aclk_66.clk,
|
||||
.enable = exynos5_clk_ip_peric_ctrl,
|
||||
.ctrlbit = (1 << 18),
|
||||
}, {
|
||||
.name = "gscl",
|
||||
.devname = "exynos-gsc.0",
|
||||
.enable = exynos5_clk_ip_gscl_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "gscl",
|
||||
.devname = "exynos-gsc.1",
|
||||
.enable = exynos5_clk_ip_gscl_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
}, {
|
||||
.name = "gscl",
|
||||
.devname = "exynos-gsc.2",
|
||||
.enable = exynos5_clk_ip_gscl_ctrl,
|
||||
.ctrlbit = (1 << 2),
|
||||
}, {
|
||||
.name = "gscl",
|
||||
.devname = "exynos-gsc.3",
|
||||
.enable = exynos5_clk_ip_gscl_ctrl,
|
||||
.ctrlbit = (1 << 3),
|
||||
}, {
|
||||
.name = SYSMMU_CLOCK_NAME,
|
||||
.devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
|
||||
@ -1225,6 +1307,10 @@ static struct clksrc_clk *exynos5_sysclks[] = {
|
||||
&exynos5_clk_aclk_266,
|
||||
&exynos5_clk_aclk_200,
|
||||
&exynos5_clk_aclk_166,
|
||||
&exynos5_clk_aclk_300_gscl,
|
||||
&exynos5_clk_mout_aclk_300_gscl,
|
||||
&exynos5_clk_mout_aclk_300_gscl_mid,
|
||||
&exynos5_clk_mout_aclk_300_gscl_mid1,
|
||||
&exynos5_clk_aclk_66_pre,
|
||||
&exynos5_clk_aclk_66,
|
||||
&exynos5_clk_dout_mmc0,
|
||||
|
@ -980,6 +980,32 @@ static int __init exynos_init_irq_eint(void)
|
||||
{
|
||||
int irq;
|
||||
|
||||
#ifdef CONFIG_PINCTRL_SAMSUNG
|
||||
/*
|
||||
* The Samsung pinctrl driver provides an integrated gpio/pinmux/pinconf
|
||||
* functionality along with support for external gpio and wakeup
|
||||
* interrupts. If the samsung pinctrl driver is enabled and includes
|
||||
* the wakeup interrupt support, then the setting up external wakeup
|
||||
* interrupts here can be skipped. This check here is temporary to
|
||||
* allow exynos4 platforms that do not use Samsung pinctrl driver to
|
||||
* co-exist with platforms that do. When all of the Samsung Exynos4
|
||||
* platforms switch over to using the pinctrl driver, the wakeup
|
||||
* interrupt support code here can be completely removed.
|
||||
*/
|
||||
struct device_node *pctrl_np, *wkup_np;
|
||||
const char *pctrl_compat = "samsung,pinctrl-exynos4210";
|
||||
const char *wkup_compat = "samsung,exynos4210-wakeup-eint";
|
||||
|
||||
for_each_compatible_node(pctrl_np, NULL, pctrl_compat) {
|
||||
if (of_device_is_available(pctrl_np)) {
|
||||
wkup_np = of_find_compatible_node(pctrl_np, NULL,
|
||||
wkup_compat);
|
||||
if (wkup_np)
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (soc_is_exynos5250())
|
||||
exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
|
||||
else
|
||||
|
@ -121,6 +121,11 @@
|
||||
#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000
|
||||
#define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000
|
||||
|
||||
#define EXYNOS5_PA_GSC0 0x13E00000
|
||||
#define EXYNOS5_PA_GSC1 0x13E10000
|
||||
#define EXYNOS5_PA_GSC2 0x13E20000
|
||||
#define EXYNOS5_PA_GSC3 0x13E30000
|
||||
|
||||
#define EXYNOS5_PA_SYSMMU_MDMA1 0x10A40000
|
||||
#define EXYNOS5_PA_SYSMMU_SSS 0x10A50000
|
||||
#define EXYNOS5_PA_SYSMMU_2D 0x10A60000
|
||||
|
@ -56,6 +56,14 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
|
||||
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL),
|
||||
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL),
|
||||
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL),
|
||||
OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC0,
|
||||
"exynos-gsc.0", NULL),
|
||||
OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC1,
|
||||
"exynos-gsc.1", NULL),
|
||||
OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC2,
|
||||
"exynos-gsc.2", NULL),
|
||||
OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC3,
|
||||
"exynos-gsc.3", NULL),
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -14,15 +14,11 @@ pci-$(CONFIG_ARCH_EBSA285_HOST) += ebsa285-pci.o
|
||||
pci-$(CONFIG_ARCH_NETWINDER) += netwinder-pci.o
|
||||
pci-$(CONFIG_ARCH_PERSONAL_SERVER) += personal-pci.o
|
||||
|
||||
leds-$(CONFIG_ARCH_EBSA285) += ebsa285-leds.o
|
||||
leds-$(CONFIG_ARCH_NETWINDER) += netwinder-leds.o
|
||||
|
||||
obj-$(CONFIG_ARCH_CATS) += cats-hw.o isa-timer.o
|
||||
obj-$(CONFIG_ARCH_EBSA285) += ebsa285.o dc21285-timer.o
|
||||
obj-$(CONFIG_ARCH_NETWINDER) += netwinder-hw.o isa-timer.o
|
||||
obj-$(CONFIG_ARCH_PERSONAL_SERVER) += personal.o dc21285-timer.o
|
||||
|
||||
obj-$(CONFIG_PCI) +=$(pci-y)
|
||||
obj-$(CONFIG_LEDS) +=$(leds-y)
|
||||
|
||||
obj-$(CONFIG_ISA) += isa.o isa-rtc.o
|
||||
|
@ -1,138 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-footbridge/ebsa285-leds.c
|
||||
*
|
||||
* Copyright (C) 1998-1999 Russell King
|
||||
*
|
||||
* 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.
|
||||
* EBSA-285 control routines.
|
||||
*
|
||||
* The EBSA-285 uses the leds as follows:
|
||||
* - Green - toggles state every 50 timer interrupts
|
||||
* - Amber - On if system is not idle
|
||||
* - Red - currently unused
|
||||
*
|
||||
* Changelog:
|
||||
* 02-05-1999 RMK Various cleanups
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define LED_STATE_ENABLED 1
|
||||
#define LED_STATE_CLAIMED 2
|
||||
static char led_state;
|
||||
static char hw_led_state;
|
||||
|
||||
static DEFINE_SPINLOCK(leds_lock);
|
||||
|
||||
static void ebsa285_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&leds_lock, flags);
|
||||
|
||||
switch (evt) {
|
||||
case led_start:
|
||||
hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN;
|
||||
#ifndef CONFIG_LEDS_CPU
|
||||
hw_led_state |= XBUS_LED_AMBER;
|
||||
#endif
|
||||
led_state |= LED_STATE_ENABLED;
|
||||
break;
|
||||
|
||||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
led_state |= LED_STATE_CLAIMED;
|
||||
hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER;
|
||||
break;
|
||||
|
||||
case led_release:
|
||||
led_state &= ~LED_STATE_CLAIMED;
|
||||
hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state ^= XBUS_LED_GREEN;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state |= XBUS_LED_AMBER;
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state &= ~XBUS_LED_AMBER;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case led_halted:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state &= ~XBUS_LED_RED;
|
||||
break;
|
||||
|
||||
case led_green_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~XBUS_LED_GREEN;
|
||||
break;
|
||||
|
||||
case led_green_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= XBUS_LED_GREEN;
|
||||
break;
|
||||
|
||||
case led_amber_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~XBUS_LED_AMBER;
|
||||
break;
|
||||
|
||||
case led_amber_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= XBUS_LED_AMBER;
|
||||
break;
|
||||
|
||||
case led_red_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~XBUS_LED_RED;
|
||||
break;
|
||||
|
||||
case led_red_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= XBUS_LED_RED;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (led_state & LED_STATE_ENABLED)
|
||||
*XBUS_LEDS = hw_led_state;
|
||||
|
||||
spin_unlock_irqrestore(&leds_lock, flags);
|
||||
}
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
if (machine_is_ebsa285())
|
||||
leds_event = ebsa285_leds_event;
|
||||
|
||||
leds_event(led_start);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(leds_init);
|
@ -5,6 +5,8 @@
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/hardware/dec21285.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -13,6 +15,85 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* LEDs */
|
||||
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||
struct ebsa285_led {
|
||||
struct led_classdev cdev;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* The triggers lines up below will only be used if the
|
||||
* LED triggers are compiled in.
|
||||
*/
|
||||
static const struct {
|
||||
const char *name;
|
||||
const char *trigger;
|
||||
} ebsa285_leds[] = {
|
||||
{ "ebsa285:amber", "heartbeat", },
|
||||
{ "ebsa285:green", "cpu0", },
|
||||
{ "ebsa285:red",},
|
||||
};
|
||||
|
||||
static void ebsa285_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
struct ebsa285_led *led = container_of(cdev,
|
||||
struct ebsa285_led, cdev);
|
||||
|
||||
if (b != LED_OFF)
|
||||
*XBUS_LEDS |= led->mask;
|
||||
else
|
||||
*XBUS_LEDS &= ~led->mask;
|
||||
}
|
||||
|
||||
static enum led_brightness ebsa285_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
struct ebsa285_led *led = container_of(cdev,
|
||||
struct ebsa285_led, cdev);
|
||||
|
||||
return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF;
|
||||
}
|
||||
|
||||
static int __init ebsa285_leds_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (machine_is_ebsa285())
|
||||
return -ENODEV;
|
||||
|
||||
/* 3 LEDS All ON */
|
||||
*XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) {
|
||||
struct ebsa285_led *led;
|
||||
|
||||
led = kzalloc(sizeof(*led), GFP_KERNEL);
|
||||
if (!led)
|
||||
break;
|
||||
|
||||
led->cdev.name = ebsa285_leds[i].name;
|
||||
led->cdev.brightness_set = ebsa285_led_set;
|
||||
led->cdev.brightness_get = ebsa285_led_get;
|
||||
led->cdev.default_trigger = ebsa285_leds[i].trigger;
|
||||
led->mask = BIT(i);
|
||||
|
||||
if (led_classdev_register(NULL, &led->cdev) < 0) {
|
||||
kfree(led);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since we may have triggers on any subsystem, defer registration
|
||||
* until after subsystem_init.
|
||||
*/
|
||||
fs_initcall(ebsa285_leds_init);
|
||||
#endif
|
||||
|
||||
MACHINE_START(EBSA285, "EBSA285")
|
||||
/* Maintainer: Russell King */
|
||||
.atag_offset = 0x100,
|
||||
|
@ -12,9 +12,10 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/hardware/dec21285.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/system_misc.h>
|
||||
@ -27,13 +28,6 @@
|
||||
#define GP1_IO_BASE 0x338
|
||||
#define GP2_IO_BASE 0x33a
|
||||
|
||||
|
||||
#ifdef CONFIG_LEDS
|
||||
#define DEFAULT_LEDS 0
|
||||
#else
|
||||
#define DEFAULT_LEDS GPIO_GREEN_LED
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Winbond WB83977F accessibility stuff
|
||||
*/
|
||||
@ -611,15 +605,9 @@ static void __init rwa010_init(void)
|
||||
static int __init nw_hw_init(void)
|
||||
{
|
||||
if (machine_is_netwinder()) {
|
||||
unsigned long flags;
|
||||
|
||||
wb977_init();
|
||||
cpld_init();
|
||||
rwa010_init();
|
||||
|
||||
raw_spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
nw_gpio_modify_op(GPIO_RED_LED|GPIO_GREEN_LED, DEFAULT_LEDS);
|
||||
raw_spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -672,6 +660,102 @@ static void netwinder_restart(char mode, const char *cmd)
|
||||
}
|
||||
}
|
||||
|
||||
/* LEDs */
|
||||
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||
struct netwinder_led {
|
||||
struct led_classdev cdev;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* The triggers lines up below will only be used if the
|
||||
* LED triggers are compiled in.
|
||||
*/
|
||||
static const struct {
|
||||
const char *name;
|
||||
const char *trigger;
|
||||
} netwinder_leds[] = {
|
||||
{ "netwinder:green", "heartbeat", },
|
||||
{ "netwinder:red", "cpu0", },
|
||||
};
|
||||
|
||||
/*
|
||||
* The LED control in Netwinder is reversed:
|
||||
* - setting bit means turn off LED
|
||||
* - clearing bit means turn on LED
|
||||
*/
|
||||
static void netwinder_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
struct netwinder_led *led = container_of(cdev,
|
||||
struct netwinder_led, cdev);
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
reg = nw_gpio_read();
|
||||
if (b != LED_OFF)
|
||||
reg &= ~led->mask;
|
||||
else
|
||||
reg |= led->mask;
|
||||
nw_gpio_modify_op(led->mask, reg);
|
||||
spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
}
|
||||
|
||||
static enum led_brightness netwinder_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
struct netwinder_led *led = container_of(cdev,
|
||||
struct netwinder_led, cdev);
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
reg = nw_gpio_read();
|
||||
spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
|
||||
return (reg & led->mask) ? LED_OFF : LED_FULL;
|
||||
}
|
||||
|
||||
static int __init netwinder_leds_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!machine_is_netwinder())
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(netwinder_leds); i++) {
|
||||
struct netwinder_led *led;
|
||||
|
||||
led = kzalloc(sizeof(*led), GFP_KERNEL);
|
||||
if (!led)
|
||||
break;
|
||||
|
||||
led->cdev.name = netwinder_leds[i].name;
|
||||
led->cdev.brightness_set = netwinder_led_set;
|
||||
led->cdev.brightness_get = netwinder_led_get;
|
||||
led->cdev.default_trigger = netwinder_leds[i].trigger;
|
||||
|
||||
if (i == 0)
|
||||
led->mask = GPIO_GREEN_LED;
|
||||
else
|
||||
led->mask = GPIO_RED_LED;
|
||||
|
||||
if (led_classdev_register(NULL, &led->cdev) < 0) {
|
||||
kfree(led);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since we may have triggers on any subsystem, defer registration
|
||||
* until after subsystem_init.
|
||||
*/
|
||||
fs_initcall(netwinder_leds_init);
|
||||
#endif
|
||||
|
||||
MACHINE_START(NETWINDER, "Rebel-NetWinder")
|
||||
/* Maintainer: Russell King/Rebel.com */
|
||||
.atag_offset = 0x100,
|
||||
|
@ -1,138 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-footbridge/netwinder-leds.c
|
||||
*
|
||||
* Copyright (C) 1998-1999 Russell King
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* NetWinder LED control routines.
|
||||
*
|
||||
* The Netwinder uses the leds as follows:
|
||||
* - Green - toggles state every 50 timer interrupts
|
||||
* - Red - On if the system is not idle
|
||||
*
|
||||
* Changelog:
|
||||
* 02-05-1999 RMK Various cleanups
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define LED_STATE_ENABLED 1
|
||||
#define LED_STATE_CLAIMED 2
|
||||
static char led_state;
|
||||
static char hw_led_state;
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(leds_lock);
|
||||
|
||||
static void netwinder_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&leds_lock, flags);
|
||||
|
||||
switch (evt) {
|
||||
case led_start:
|
||||
led_state |= LED_STATE_ENABLED;
|
||||
hw_led_state = GPIO_GREEN_LED;
|
||||
break;
|
||||
|
||||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
led_state |= LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
case led_release:
|
||||
led_state &= ~LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state ^= GPIO_GREEN_LED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state &= ~GPIO_RED_LED;
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state |= GPIO_RED_LED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case led_halted:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state |= GPIO_RED_LED;
|
||||
break;
|
||||
|
||||
case led_green_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= GPIO_GREEN_LED;
|
||||
break;
|
||||
|
||||
case led_green_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~GPIO_GREEN_LED;
|
||||
break;
|
||||
|
||||
case led_amber_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= GPIO_GREEN_LED | GPIO_RED_LED;
|
||||
break;
|
||||
|
||||
case led_amber_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~(GPIO_GREEN_LED | GPIO_RED_LED);
|
||||
break;
|
||||
|
||||
case led_red_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= GPIO_RED_LED;
|
||||
break;
|
||||
|
||||
case led_red_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~GPIO_RED_LED;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
raw_spin_unlock_irqrestore(&leds_lock, flags);
|
||||
|
||||
if (led_state & LED_STATE_ENABLED) {
|
||||
raw_spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
nw_gpio_modify_op(GPIO_RED_LED | GPIO_GREEN_LED, hw_led_state);
|
||||
raw_spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
if (machine_is_netwinder())
|
||||
leds_event = netwinder_leds_event;
|
||||
|
||||
leds_event(led_start);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(leds_init);
|
@ -4,11 +4,10 @@
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y := core.o lm.o
|
||||
obj-y := core.o lm.o leds.o
|
||||
obj-$(CONFIG_ARCH_INTEGRATOR_AP) += integrator_ap.o
|
||||
obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o
|
||||
|
||||
obj-$(CONFIG_LEDS) += leds.o
|
||||
obj-$(CONFIG_PCI) += pci_v3.o pci.o
|
||||
obj-$(CONFIG_CPU_FREQ_INTEGRATOR) += cpu.o
|
||||
obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include <mach/cm.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/pgtable.h>
|
||||
@ -128,8 +127,6 @@ static struct amba_pl010_data integrator_uart_data = {
|
||||
.set_mctrl = integrator_uart_set_mctrl,
|
||||
};
|
||||
|
||||
#define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL)
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(cm_lock);
|
||||
|
||||
/**
|
||||
|
@ -3,6 +3,8 @@
|
||||
*/
|
||||
void cm_control(u32, u32);
|
||||
|
||||
#define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL)
|
||||
|
||||
#define CM_CTRL_LED (1 << 0)
|
||||
#define CM_CTRL_nMBDET (1 << 1)
|
||||
#define CM_CTRL_REMAP (1 << 2)
|
||||
|
@ -1,90 +1,125 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-integrator/leds.c
|
||||
* Driver for the 4 user LEDs found on the Integrator AP/CP baseboard
|
||||
* Based on Versatile and RealView machine LED code
|
||||
*
|
||||
* Integrator/AP and Integrator/CP LED control routines
|
||||
*
|
||||
* Copyright (C) 1999 ARM Limited
|
||||
* Copyright (C) 2000 Deep Blue Solutions Ltd
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <mach/cm.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/cm.h>
|
||||
|
||||
static int saved_leds;
|
||||
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||
|
||||
static void integrator_leds_event(led_event_t ledevt)
|
||||
#define ALPHA_REG __io_address(INTEGRATOR_DBG_BASE)
|
||||
#define LEDREG (__io_address(INTEGRATOR_DBG_BASE) + INTEGRATOR_DBG_LEDS_OFFSET)
|
||||
|
||||
struct integrator_led {
|
||||
struct led_classdev cdev;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* The triggers lines up below will only be used if the
|
||||
* LED triggers are compiled in.
|
||||
*/
|
||||
static const struct {
|
||||
const char *name;
|
||||
const char *trigger;
|
||||
} integrator_leds[] = {
|
||||
{ "integrator:green0", "heartbeat", },
|
||||
{ "integrator:yellow", },
|
||||
{ "integrator:red", },
|
||||
{ "integrator:green1", },
|
||||
{ "integrator:core_module", "cpu0", },
|
||||
};
|
||||
|
||||
static void integrator_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
unsigned long flags;
|
||||
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
||||
unsigned int update_alpha_leds;
|
||||
struct integrator_led *led = container_of(cdev,
|
||||
struct integrator_led, cdev);
|
||||
u32 reg = __raw_readl(LEDREG);
|
||||
|
||||
// yup, change the LEDs
|
||||
local_irq_save(flags);
|
||||
update_alpha_leds = 0;
|
||||
if (b != LED_OFF)
|
||||
reg |= led->mask;
|
||||
else
|
||||
reg &= ~led->mask;
|
||||
|
||||
switch(ledevt) {
|
||||
case led_idle_start:
|
||||
cm_control(CM_CTRL_LED, 0);
|
||||
break;
|
||||
while (__raw_readl(ALPHA_REG) & 1)
|
||||
cpu_relax();
|
||||
|
||||
case led_idle_end:
|
||||
cm_control(CM_CTRL_LED, CM_CTRL_LED);
|
||||
break;
|
||||
|
||||
case led_timer:
|
||||
saved_leds ^= GREEN_LED;
|
||||
update_alpha_leds = 1;
|
||||
break;
|
||||
|
||||
case led_red_on:
|
||||
saved_leds |= RED_LED;
|
||||
update_alpha_leds = 1;
|
||||
break;
|
||||
|
||||
case led_red_off:
|
||||
saved_leds &= ~RED_LED;
|
||||
update_alpha_leds = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (update_alpha_leds) {
|
||||
while (__raw_readl(dbg_base + INTEGRATOR_DBG_ALPHA_OFFSET) & 1);
|
||||
__raw_writel(saved_leds, dbg_base + INTEGRATOR_DBG_LEDS_OFFSET);
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
__raw_writel(reg, LEDREG);
|
||||
}
|
||||
|
||||
static int __init leds_init(void)
|
||||
static enum led_brightness integrator_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
if (machine_is_integrator() || machine_is_cintegrator())
|
||||
leds_event = integrator_leds_event;
|
||||
struct integrator_led *led = container_of(cdev,
|
||||
struct integrator_led, cdev);
|
||||
u32 reg = __raw_readl(LEDREG);
|
||||
|
||||
return (reg & led->mask) ? LED_FULL : LED_OFF;
|
||||
}
|
||||
|
||||
static void cm_led_set(struct led_classdev *cdev,
|
||||
enum led_brightness b)
|
||||
{
|
||||
if (b != LED_OFF)
|
||||
cm_control(CM_CTRL_LED, CM_CTRL_LED);
|
||||
else
|
||||
cm_control(CM_CTRL_LED, 0);
|
||||
}
|
||||
|
||||
static enum led_brightness cm_led_get(struct led_classdev *cdev)
|
||||
{
|
||||
u32 reg = readl(CM_CTRL);
|
||||
|
||||
return (reg & CM_CTRL_LED) ? LED_FULL : LED_OFF;
|
||||
}
|
||||
|
||||
static int __init integrator_leds_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(integrator_leds); i++) {
|
||||
struct integrator_led *led;
|
||||
|
||||
led = kzalloc(sizeof(*led), GFP_KERNEL);
|
||||
if (!led)
|
||||
break;
|
||||
|
||||
|
||||
led->cdev.name = integrator_leds[i].name;
|
||||
|
||||
if (i == 4) { /* Setting for LED in core module */
|
||||
led->cdev.brightness_set = cm_led_set;
|
||||
led->cdev.brightness_get = cm_led_get;
|
||||
} else {
|
||||
led->cdev.brightness_set = integrator_led_set;
|
||||
led->cdev.brightness_get = integrator_led_get;
|
||||
}
|
||||
|
||||
led->cdev.default_trigger = integrator_leds[i].trigger;
|
||||
led->mask = BIT(i);
|
||||
|
||||
if (led_classdev_register(NULL, &led->cdev) < 0) {
|
||||
kfree(led);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(leds_init);
|
||||
/*
|
||||
* Since we may have triggers on any subsystem, defer registration
|
||||
* until after subsystem_init.
|
||||
*/
|
||||
fs_initcall(integrator_leds_init);
|
||||
#endif
|
||||
|
@ -11,9 +11,6 @@ obj- :=
|
||||
# PCI support is optional
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
|
||||
# LEDs
|
||||
obj-$(CONFIG_LEDS) += leds.o
|
||||
|
||||
# Board-specific support
|
||||
obj-$(CONFIG_MACH_KS8695) += board-micrel.o
|
||||
obj-$(CONFIG_MACH_DSM320) += board-dsm320.o
|
||||
|
@ -182,27 +182,6 @@ static void __init ks8695_add_device_watchdog(void)
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
short ks8695_leds_cpu = -1;
|
||||
short ks8695_leds_timer = -1;
|
||||
|
||||
void __init ks8695_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
gpio_direction_output(cpu_led, 1);
|
||||
gpio_direction_output(timer_led, 1);
|
||||
|
||||
ks8695_leds_cpu = cpu_led;
|
||||
ks8695_leds_timer = timer_led;
|
||||
}
|
||||
#else
|
||||
void __init ks8695_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
#endif
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
|
@ -18,11 +18,6 @@ extern void __init ks8695_add_device_wan(void);
|
||||
extern void __init ks8695_add_device_lan(void);
|
||||
extern void __init ks8695_add_device_hpna(void);
|
||||
|
||||
/* LEDs */
|
||||
extern short ks8695_leds_cpu;
|
||||
extern short ks8695_leds_timer;
|
||||
extern void __init ks8695_init_leds(u8 cpu_led, u8 timer_led);
|
||||
|
||||
/* PCI */
|
||||
#define KS8695_MODE_PCI 0
|
||||
#define KS8695_MODE_MINIPCI 1
|
||||
|
@ -1,92 +0,0 @@
|
||||
/*
|
||||
* LED driver for KS8695-based boards.
|
||||
*
|
||||
* Copyright (C) Andrew Victor
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <mach/devices.h>
|
||||
|
||||
|
||||
static inline void ks8695_led_on(unsigned int led)
|
||||
{
|
||||
gpio_set_value(led, 0);
|
||||
}
|
||||
|
||||
static inline void ks8695_led_off(unsigned int led)
|
||||
{
|
||||
gpio_set_value(led, 1);
|
||||
}
|
||||
|
||||
static inline void ks8695_led_toggle(unsigned int led)
|
||||
{
|
||||
unsigned long is_off = gpio_get_value(led);
|
||||
if (is_off)
|
||||
ks8695_led_on(led);
|
||||
else
|
||||
ks8695_led_off(led);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Handle LED events.
|
||||
*/
|
||||
static void ks8695_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
switch(evt) {
|
||||
case led_start: /* System startup */
|
||||
ks8695_led_on(ks8695_leds_cpu);
|
||||
break;
|
||||
|
||||
case led_stop: /* System stop / suspend */
|
||||
ks8695_led_off(ks8695_leds_cpu);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer: /* Every 50 timer ticks */
|
||||
ks8695_led_toggle(ks8695_leds_timer);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start: /* Entering idle state */
|
||||
ks8695_led_off(ks8695_leds_cpu);
|
||||
break;
|
||||
|
||||
case led_idle_end: /* Exit idle state */
|
||||
ks8695_led_on(ks8695_leds_cpu);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
if ((ks8695_leds_timer == -1) || (ks8695_leds_cpu == -1))
|
||||
return -ENODEV;
|
||||
|
||||
leds_event = ks8695_leds_event;
|
||||
|
||||
leds_event(led_start);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(leds_init);
|
@ -61,14 +61,6 @@ obj-$(CONFIG_ARCH_OMAP850) += gpio7xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP15XX) += gpio15xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += gpio16xx.o
|
||||
|
||||
# LEDs support
|
||||
led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
||||
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
||||
ifneq ($(CONFIG_FB_OMAP),)
|
||||
obj-y += lcd_dma.o
|
||||
endif
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/omapfb.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -307,12 +308,39 @@ static struct platform_device h2_irda_device = {
|
||||
.resource = h2_irda_resources,
|
||||
};
|
||||
|
||||
static struct gpio_led h2_gpio_led_pins[] = {
|
||||
{
|
||||
.name = "h2:red",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = 3,
|
||||
},
|
||||
{
|
||||
.name = "h2:green",
|
||||
.default_trigger = "cpu0",
|
||||
.gpio = OMAP_MPUIO(4),
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data h2_gpio_led_data = {
|
||||
.leds = h2_gpio_led_pins,
|
||||
.num_leds = ARRAY_SIZE(h2_gpio_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device h2_gpio_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &h2_gpio_led_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *h2_devices[] __initdata = {
|
||||
&h2_nor_device,
|
||||
&h2_nand_device,
|
||||
&h2_smc91x_device,
|
||||
&h2_irda_device,
|
||||
&h2_kp_device,
|
||||
&h2_gpio_leds,
|
||||
};
|
||||
|
||||
static void __init h2_init_smc91x(void)
|
||||
@ -407,6 +435,10 @@ static void __init h2_init(void)
|
||||
omap_cfg_reg(E19_1610_KBR4);
|
||||
omap_cfg_reg(N19_1610_KBR5);
|
||||
|
||||
/* GPIO based LEDs */
|
||||
omap_cfg_reg(P18_1610_GPIO3);
|
||||
omap_cfg_reg(MPUIO4);
|
||||
|
||||
h2_smc91x_resources[1].start = gpio_to_irq(0);
|
||||
h2_smc91x_resources[1].end = gpio_to_irq(0);
|
||||
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/omapfb.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/page.h>
|
||||
@ -325,6 +326,32 @@ static struct spi_board_info h3_spi_board_info[] __initdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led h3_gpio_led_pins[] = {
|
||||
{
|
||||
.name = "h3:red",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = 3,
|
||||
},
|
||||
{
|
||||
.name = "h3:green",
|
||||
.default_trigger = "cpu0",
|
||||
.gpio = OMAP_MPUIO(4),
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data h3_gpio_led_data = {
|
||||
.leds = h3_gpio_led_pins,
|
||||
.num_leds = ARRAY_SIZE(h3_gpio_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device h3_gpio_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &h3_gpio_led_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&nor_device,
|
||||
&nand_device,
|
||||
@ -332,6 +359,7 @@ static struct platform_device *devices[] __initdata = {
|
||||
&intlat_device,
|
||||
&h3_kp_device,
|
||||
&h3_lcd_device,
|
||||
&h3_gpio_leds,
|
||||
};
|
||||
|
||||
static struct omap_usb_config h3_usb_config __initdata = {
|
||||
@ -399,6 +427,10 @@ static void __init h3_init(void)
|
||||
omap_cfg_reg(E19_1610_KBR4);
|
||||
omap_cfg_reg(N19_1610_KBR5);
|
||||
|
||||
/* GPIO based LEDs */
|
||||
omap_cfg_reg(P18_1610_GPIO3);
|
||||
omap_cfg_reg(MPUIO4);
|
||||
|
||||
smc91x_resources[1].start = gpio_to_irq(40);
|
||||
smc91x_resources[1].end = gpio_to_irq(40);
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
@ -382,10 +382,37 @@ static struct platform_device osk5912_lcd_device = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpio_led mistral_gpio_led_pins[] = {
|
||||
{
|
||||
.name = "mistral:red",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = 3,
|
||||
},
|
||||
{
|
||||
.name = "mistral:green",
|
||||
.default_trigger = "cpu0",
|
||||
.gpio = OMAP_MPUIO(4),
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data mistral_gpio_led_data = {
|
||||
.leds = mistral_gpio_led_pins,
|
||||
.num_leds = ARRAY_SIZE(mistral_gpio_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device mistral_gpio_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &mistral_gpio_led_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *mistral_devices[] __initdata = {
|
||||
&osk5912_kp_device,
|
||||
&mistral_bl_device,
|
||||
&osk5912_lcd_device,
|
||||
&mistral_gpio_leds,
|
||||
};
|
||||
|
||||
static int mistral_get_pendown_state(void)
|
||||
@ -510,6 +537,12 @@ static void __init osk_mistral_init(void)
|
||||
if (gpio_request(2, "lcd_pwr") == 0)
|
||||
gpio_direction_output(2, 1);
|
||||
|
||||
/*
|
||||
* GPIO based LEDs
|
||||
*/
|
||||
omap_cfg_reg(P18_1610_GPIO3);
|
||||
omap_cfg_reg(MPUIO4);
|
||||
|
||||
i2c_register_board_info(1, mistral_i2c_board_info,
|
||||
ARRAY_SIZE(mistral_i2c_board_info));
|
||||
|
||||
|
@ -1,169 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap1/leds-h2p2-debug.c
|
||||
*
|
||||
* Copyright 2003 by Texas Instruments Incorporated
|
||||
*
|
||||
* There are 16 LEDs on the debug board (all green); four may be used
|
||||
* for logical 'green', 'amber', 'red', and 'blue' (after "claiming").
|
||||
*
|
||||
* The "surfer" expansion board and H2 sample board also have two-color
|
||||
* green+red LEDs (in parallel), used here for timer and idle indicators.
|
||||
*/
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/fpga.h>
|
||||
|
||||
#include "leds.h"
|
||||
|
||||
|
||||
#define GPIO_LED_RED 3
|
||||
#define GPIO_LED_GREEN OMAP_MPUIO(4)
|
||||
|
||||
|
||||
#define LED_STATE_ENABLED 0x01
|
||||
#define LED_STATE_CLAIMED 0x02
|
||||
#define LED_TIMER_ON 0x04
|
||||
|
||||
#define GPIO_IDLE GPIO_LED_GREEN
|
||||
#define GPIO_TIMER GPIO_LED_RED
|
||||
|
||||
|
||||
void h2p2_dbg_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
static struct h2p2_dbg_fpga __iomem *fpga;
|
||||
static u16 led_state, hw_led_state;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
if (!(led_state & LED_STATE_ENABLED) && evt != led_start)
|
||||
goto done;
|
||||
|
||||
switch (evt) {
|
||||
case led_start:
|
||||
if (!fpga)
|
||||
fpga = ioremap(H2P2_DBG_FPGA_START,
|
||||
H2P2_DBG_FPGA_SIZE);
|
||||
if (fpga) {
|
||||
led_state |= LED_STATE_ENABLED;
|
||||
__raw_writew(~0, &fpga->leds);
|
||||
}
|
||||
break;
|
||||
|
||||
case led_stop:
|
||||
case led_halted:
|
||||
/* all leds off during suspend or shutdown */
|
||||
|
||||
if (! machine_is_omap_perseus2()) {
|
||||
gpio_set_value(GPIO_TIMER, 0);
|
||||
gpio_set_value(GPIO_IDLE, 0);
|
||||
}
|
||||
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
if (fpga) {
|
||||
__raw_writew(~0, &fpga->leds);
|
||||
if (evt == led_halted) {
|
||||
iounmap(fpga);
|
||||
fpga = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
goto done;
|
||||
|
||||
case led_claim:
|
||||
led_state |= LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
case led_release:
|
||||
led_state &= ~LED_STATE_CLAIMED;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer:
|
||||
led_state ^= LED_TIMER_ON;
|
||||
|
||||
if (machine_is_omap_perseus2())
|
||||
hw_led_state ^= H2P2_DBG_FPGA_P2_LED_TIMER;
|
||||
else {
|
||||
gpio_set_value(GPIO_TIMER, led_state & LED_TIMER_ON);
|
||||
goto done;
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start:
|
||||
if (machine_is_omap_perseus2())
|
||||
hw_led_state |= H2P2_DBG_FPGA_P2_LED_IDLE;
|
||||
else {
|
||||
gpio_set_value(GPIO_IDLE, 1);
|
||||
goto done;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
if (machine_is_omap_perseus2())
|
||||
hw_led_state &= ~H2P2_DBG_FPGA_P2_LED_IDLE;
|
||||
else {
|
||||
gpio_set_value(GPIO_IDLE, 0);
|
||||
goto done;
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
|
||||
case led_green_on:
|
||||
hw_led_state |= H2P2_DBG_FPGA_LED_GREEN;
|
||||
break;
|
||||
case led_green_off:
|
||||
hw_led_state &= ~H2P2_DBG_FPGA_LED_GREEN;
|
||||
break;
|
||||
|
||||
case led_amber_on:
|
||||
hw_led_state |= H2P2_DBG_FPGA_LED_AMBER;
|
||||
break;
|
||||
case led_amber_off:
|
||||
hw_led_state &= ~H2P2_DBG_FPGA_LED_AMBER;
|
||||
break;
|
||||
|
||||
case led_red_on:
|
||||
hw_led_state |= H2P2_DBG_FPGA_LED_RED;
|
||||
break;
|
||||
case led_red_off:
|
||||
hw_led_state &= ~H2P2_DBG_FPGA_LED_RED;
|
||||
break;
|
||||
|
||||
case led_blue_on:
|
||||
hw_led_state |= H2P2_DBG_FPGA_LED_BLUE;
|
||||
break;
|
||||
case led_blue_off:
|
||||
hw_led_state &= ~H2P2_DBG_FPGA_LED_BLUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Actually burn the LEDs
|
||||
*/
|
||||
if (led_state & LED_STATE_ENABLED && fpga)
|
||||
__raw_writew(~hw_led_state, &fpga->leds);
|
||||
|
||||
done:
|
||||
local_irq_restore(flags);
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap1/leds-innovator.c
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
|
||||
#include "leds.h"
|
||||
|
||||
|
||||
#define LED_STATE_ENABLED 1
|
||||
#define LED_STATE_CLAIMED 2
|
||||
|
||||
static unsigned int led_state;
|
||||
static unsigned int hw_led_state;
|
||||
|
||||
void innovator_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
switch (evt) {
|
||||
case led_start:
|
||||
hw_led_state = 0;
|
||||
led_state = LED_STATE_ENABLED;
|
||||
break;
|
||||
|
||||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
led_state |= LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
case led_release:
|
||||
led_state &= ~LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state ^= 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state |= 0;
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
if (!(led_state & LED_STATE_CLAIMED))
|
||||
hw_led_state &= ~0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case led_halted:
|
||||
break;
|
||||
|
||||
case led_green_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~0;
|
||||
break;
|
||||
|
||||
case led_green_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= 0;
|
||||
break;
|
||||
|
||||
case led_amber_on:
|
||||
break;
|
||||
|
||||
case led_amber_off:
|
||||
break;
|
||||
|
||||
case led_red_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~0;
|
||||
break;
|
||||
|
||||
case led_red_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap1/leds-osk.c
|
||||
*
|
||||
* LED driver for OSK with optional Mistral QVGA board
|
||||
*/
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
|
||||
#include "leds.h"
|
||||
|
||||
|
||||
#define LED_STATE_ENABLED (1 << 0)
|
||||
#define LED_STATE_CLAIMED (1 << 1)
|
||||
static u8 led_state;
|
||||
|
||||
#define TIMER_LED (1 << 3) /* Mistral board */
|
||||
#define IDLE_LED (1 << 4) /* Mistral board */
|
||||
static u8 hw_led_state;
|
||||
|
||||
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
/* For now, all system indicators require the Mistral board, since that
|
||||
* LED can be manipulated without a task context. This LED is either red,
|
||||
* or green, but not both; it can't give the full "disco led" effect.
|
||||
*/
|
||||
|
||||
#define GPIO_LED_RED 3
|
||||
#define GPIO_LED_GREEN OMAP_MPUIO(4)
|
||||
|
||||
static void mistral_setled(void)
|
||||
{
|
||||
int red = 0;
|
||||
int green = 0;
|
||||
|
||||
if (hw_led_state & TIMER_LED)
|
||||
red = 1;
|
||||
else if (hw_led_state & IDLE_LED)
|
||||
green = 1;
|
||||
/* else both sides are disabled */
|
||||
|
||||
gpio_set_value(GPIO_LED_GREEN, green);
|
||||
gpio_set_value(GPIO_LED_RED, red);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void osk_leds_event(led_event_t evt)
|
||||
{
|
||||
unsigned long flags;
|
||||
u16 leds;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
if (!(led_state & LED_STATE_ENABLED) && evt != led_start)
|
||||
goto done;
|
||||
|
||||
leds = hw_led_state;
|
||||
switch (evt) {
|
||||
case led_start:
|
||||
led_state |= LED_STATE_ENABLED;
|
||||
hw_led_state = 0;
|
||||
leds = ~0;
|
||||
break;
|
||||
|
||||
case led_halted:
|
||||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
led_state |= LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
leds = ~0;
|
||||
break;
|
||||
|
||||
case led_release:
|
||||
led_state &= ~LED_STATE_CLAIMED;
|
||||
hw_led_state = 0;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
case led_timer:
|
||||
hw_led_state ^= TIMER_LED;
|
||||
mistral_setled();
|
||||
break;
|
||||
|
||||
case led_idle_start: /* idle == off */
|
||||
hw_led_state &= ~IDLE_LED;
|
||||
mistral_setled();
|
||||
break;
|
||||
|
||||
case led_idle_end:
|
||||
hw_led_state |= IDLE_LED;
|
||||
mistral_setled();
|
||||
break;
|
||||
|
||||
#endif /* CONFIG_OMAP_OSK_MISTRAL */
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
leds ^= hw_led_state;
|
||||
|
||||
done:
|
||||
local_irq_restore(flags);
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap1/leds.c
|
||||
*
|
||||
* OMAP LEDs dispatcher
|
||||
*/
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
|
||||
#include "leds.h"
|
||||
|
||||
static int __init
|
||||
omap_leds_init(void)
|
||||
{
|
||||
if (!cpu_class_is_omap1())
|
||||
return -ENODEV;
|
||||
|
||||
if (machine_is_omap_innovator())
|
||||
leds_event = innovator_leds_event;
|
||||
|
||||
else if (machine_is_omap_h2()
|
||||
|| machine_is_omap_h3()
|
||||
|| machine_is_omap_perseus2())
|
||||
leds_event = h2p2_dbg_leds_event;
|
||||
|
||||
else if (machine_is_omap_osk())
|
||||
leds_event = osk_leds_event;
|
||||
|
||||
else
|
||||
return -1;
|
||||
|
||||
if (machine_is_omap_h2()
|
||||
|| machine_is_omap_h3()
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|| machine_is_omap_osk()
|
||||
#endif
|
||||
) {
|
||||
|
||||
/* LED1/LED2 pins can be used as GPIO (as done here), or by
|
||||
* the LPG (works even in deep sleep!), to drive a bicolor
|
||||
* LED on the H2 sample board, and another on the H2/P2
|
||||
* "surfer" expansion board.
|
||||
*
|
||||
* The same pins drive a LED on the OSK Mistral board, but
|
||||
* that's a different kind of LED (just one color at a time).
|
||||
*/
|
||||
omap_cfg_reg(P18_1610_GPIO3);
|
||||
if (gpio_request(3, "LED red") == 0)
|
||||
gpio_direction_output(3, 1);
|
||||
else
|
||||
printk(KERN_WARNING "LED: can't get GPIO3/red?\n");
|
||||
|
||||
omap_cfg_reg(MPUIO4);
|
||||
if (gpio_request(OMAP_MPUIO(4), "LED green") == 0)
|
||||
gpio_direction_output(OMAP_MPUIO(4), 1);
|
||||
else
|
||||
printk(KERN_WARNING "LED: can't get MPUIO4/green?\n");
|
||||
}
|
||||
|
||||
leds_event(led_start);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(omap_leds_init);
|
@ -1,3 +0,0 @@
|
||||
extern void innovator_leds_event(led_event_t evt);
|
||||
extern void h2p2_dbg_leds_event(led_event_t evt);
|
||||
extern void osk_leds_event(led_event_t evt);
|
@ -44,7 +44,6 @@
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/sched_clock.h>
|
||||
|
||||
|
@ -46,7 +46,6 @@
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
@ -48,6 +48,7 @@ config ARCH_OMAP3
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select MULTI_IRQ_HANDLER
|
||||
select SOC_HAS_OMAP2_SDRC
|
||||
select OMAP_INTERCONNECT
|
||||
|
||||
config ARCH_OMAP4
|
||||
bool "TI OMAP4"
|
||||
@ -67,6 +68,7 @@ config ARCH_OMAP4
|
||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP
|
||||
select OMAP_INTERCONNECT
|
||||
|
||||
config SOC_OMAP5
|
||||
bool "TI OMAP5"
|
||||
|
@ -180,11 +180,6 @@ obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
|
||||
# EMU peripherals
|
||||
obj-$(CONFIG_OMAP3_EMU) += emu.o
|
||||
|
||||
# L3 interconnect
|
||||
obj-$(CONFIG_ARCH_OMAP3) += omap_l3_smx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += omap_l3_noc.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += omap_l3_noc.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
|
||||
mailbox_mach-objs := mailbox.o
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <net/dsa.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <mach/orion5x.h>
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <net/dsa.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <mach/orion5x.h>
|
||||
|
@ -19,8 +19,8 @@
|
||||
#include <linux/mv643xx_eth.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <mach/orion5x.h>
|
||||
@ -53,12 +53,6 @@
|
||||
#define RD88F5182_PCI_SLOT0_IRQ_A_PIN 7
|
||||
#define RD88F5182_PCI_SLOT0_IRQ_B_PIN 6
|
||||
|
||||
/*
|
||||
* GPIO Debug LED
|
||||
*/
|
||||
|
||||
#define RD88F5182_GPIO_DBG_LED 0
|
||||
|
||||
/*****************************************************************************
|
||||
* 16M NOR Flash on Device bus CS1
|
||||
****************************************************************************/
|
||||
@ -83,55 +77,32 @@ static struct platform_device rd88f5182_nor_flash = {
|
||||
.resource = &rd88f5182_nor_flash_resource,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_LEDS
|
||||
|
||||
/*****************************************************************************
|
||||
* Use GPIO debug led as CPU active indication
|
||||
* Use GPIO LED as CPU active indication
|
||||
****************************************************************************/
|
||||
|
||||
static void rd88f5182_dbgled_event(led_event_t evt)
|
||||
{
|
||||
int val;
|
||||
#define RD88F5182_GPIO_LED 0
|
||||
|
||||
if (evt == led_idle_end)
|
||||
val = 1;
|
||||
else if (evt == led_idle_start)
|
||||
val = 0;
|
||||
else
|
||||
return;
|
||||
static struct gpio_led rd88f5182_gpio_led_pins[] = {
|
||||
{
|
||||
.name = "rd88f5182:cpu",
|
||||
.default_trigger = "cpu0",
|
||||
.gpio = RD88F5182_GPIO_LED,
|
||||
},
|
||||
};
|
||||
|
||||
gpio_set_value(RD88F5182_GPIO_DBG_LED, val);
|
||||
}
|
||||
static struct gpio_led_platform_data rd88f5182_gpio_led_data = {
|
||||
.leds = rd88f5182_gpio_led_pins,
|
||||
.num_leds = ARRAY_SIZE(rd88f5182_gpio_led_pins),
|
||||
};
|
||||
|
||||
static int __init rd88f5182_dbgled_init(void)
|
||||
{
|
||||
int pin;
|
||||
|
||||
if (machine_is_rd88f5182()) {
|
||||
pin = RD88F5182_GPIO_DBG_LED;
|
||||
|
||||
if (gpio_request(pin, "DBGLED") == 0) {
|
||||
if (gpio_direction_output(pin, 0) != 0) {
|
||||
printk(KERN_ERR "rd88f5182_dbgled_init failed "
|
||||
"to set output pin %d\n", pin);
|
||||
gpio_free(pin);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
printk(KERN_ERR "rd88f5182_dbgled_init failed "
|
||||
"to request gpio %d\n", pin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
leds_event = rd88f5182_dbgled_event;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(rd88f5182_dbgled_init);
|
||||
|
||||
#endif
|
||||
static struct platform_device rd88f5182_gpio_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &rd88f5182_gpio_led_data,
|
||||
},
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* PCI
|
||||
@ -298,6 +269,7 @@ static void __init rd88f5182_init(void)
|
||||
|
||||
orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
|
||||
platform_device_register(&rd88f5182_nor_flash);
|
||||
platform_device_register(&rd88f5182_gpio_leds);
|
||||
|
||||
i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <net/dsa.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <mach/orion5x.h>
|
||||
|
@ -98,12 +98,4 @@ obj-$(CONFIG_MACH_RAUMFELD_CONNECTOR) += raumfeld.o
|
||||
obj-$(CONFIG_MACH_RAUMFELD_SPEAKER) += raumfeld.o
|
||||
obj-$(CONFIG_MACH_ZIPIT2) += z2.o
|
||||
|
||||
# Support for blinky lights
|
||||
led-y := leds.o
|
||||
led-$(CONFIG_ARCH_LUBBOCK) += leds-lubbock.o
|
||||
led-$(CONFIG_MACH_MAINSTONE) += leds-mainstone.o
|
||||
led-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o
|
||||
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
||||
obj-$(CONFIG_TOSA_BT) += tosa-bt.o
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user