mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-07 00:59:06 +00: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
162 changed files with 4914 additions and 3548 deletions
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,
|
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.
|
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
|
config ALIGNMENT_TRAP
|
||||||
bool
|
bool
|
||||||
depends on CPU_CP15_MMU
|
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/ "skeleton.dtsi"
|
||||||
|
/include/ "exynos4210-pinctrl.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
compatible = "samsung,exynos4210";
|
compatible = "samsung,exynos4210";
|
||||||
|
@ -29,6 +30,9 @@ aliases {
|
||||||
spi0 = &spi_0;
|
spi0 = &spi_0;
|
||||||
spi1 = &spi_1;
|
spi1 = &spi_1;
|
||||||
spi2 = &spi_2;
|
spi2 = &spi_2;
|
||||||
|
pinctrl0 = &pinctrl_0;
|
||||||
|
pinctrl1 = &pinctrl_1;
|
||||||
|
pinctrl2 = &pinctrl_2;
|
||||||
};
|
};
|
||||||
|
|
||||||
gic:interrupt-controller@10490000 {
|
gic:interrupt-controller@10490000 {
|
||||||
|
@ -50,6 +54,39 @@ combiner:interrupt-controller@10440000 {
|
||||||
<0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>;
|
<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 {
|
watchdog@10060000 {
|
||||||
compatible = "samsung,s3c2410-wdt";
|
compatible = "samsung,s3c2410-wdt";
|
||||||
reg = <0x10060000 0x100>;
|
reg = <0x10060000 0x100>;
|
||||||
|
|
|
@ -27,6 +27,10 @@ aliases {
|
||||||
spi0 = &spi_0;
|
spi0 = &spi_0;
|
||||||
spi1 = &spi_1;
|
spi1 = &spi_1;
|
||||||
spi2 = &spi_2;
|
spi2 = &spi_2;
|
||||||
|
gsc0 = &gsc_0;
|
||||||
|
gsc1 = &gsc_1;
|
||||||
|
gsc2 = &gsc_2;
|
||||||
|
gsc3 = &gsc_3;
|
||||||
};
|
};
|
||||||
|
|
||||||
gic:interrupt-controller@10481000 {
|
gic:interrupt-controller@10481000 {
|
||||||
|
@ -460,4 +464,28 @@ gpz: gpio-controller@03860000 {
|
||||||
#gpio-cells = <4>;
|
#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-ll-interface;
|
||||||
hw-caps-temp-alert;
|
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_DATAFLASH=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||||
CONFIG_ATMEL_SSC=y
|
CONFIG_ATMEL_SSC=y
|
||||||
|
|
|
@ -232,7 +232,7 @@ CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ETH=m
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_USB_MASS_STORAGE=m
|
CONFIG_USB_MASS_STORAGE=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=y
|
CONFIG_MMC_ATMELMCI=y
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -128,7 +128,7 @@ CONFIG_USB_GADGETFS=m
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -61,7 +61,6 @@ CONFIG_MTD_DATAFLASH=y
|
||||||
CONFIG_MTD_BLOCK2MTD=y
|
CONFIG_MTD_BLOCK2MTD=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
|
||||||
CONFIG_MTD_UBI=y
|
CONFIG_MTD_UBI=y
|
||||||
CONFIG_MTD_UBI_GLUEBI=y
|
CONFIG_MTD_UBI_GLUEBI=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
@ -138,7 +137,7 @@ CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_SDIO_UART=m
|
CONFIG_SDIO_UART=m
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_ATMEL_PWM=y
|
CONFIG_LEDS_ATMEL_PWM=y
|
||||||
|
|
|
@ -99,7 +99,7 @@ CONFIG_USB_GADGETFS=m
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -60,7 +60,7 @@ CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
CONFIG_FB_ATMEL=y
|
CONFIG_FB_ATMEL=y
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_AT91SAM9=y
|
CONFIG_RTC_DRV_AT91SAM9=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
|
|
|
@ -82,7 +82,7 @@ CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ETH=m
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -82,7 +82,7 @@ CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ETH=m
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -50,7 +50,6 @@ CONFIG_MTD_BLOCK=y
|
||||||
CONFIG_MTD_DATAFLASH=y
|
CONFIG_MTD_DATAFLASH=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
# CONFIG_MISC_DEVICES is not set
|
# CONFIG_MISC_DEVICES is not set
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
|
@ -87,7 +86,7 @@ CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ETH=m
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_ATMELMCI=m
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
|
|
|
@ -100,7 +100,6 @@ CONFIG_USB_ETH=m
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
# CONFIG_MMC_AT91 is not set
|
|
||||||
CONFIG_MMC_ATMELMCI=y
|
CONFIG_MMC_ATMELMCI=y
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
CONFIG_LEDS_CLASS=y
|
||||||
|
|
|
@ -49,7 +49,6 @@ CONFIG_MTD_BLOCK=y
|
||||||
CONFIG_MTD_DATAFLASH=y
|
CONFIG_MTD_DATAFLASH=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
# CONFIG_MISC_DEVICES is not set
|
# CONFIG_MISC_DEVICES is not set
|
||||||
CONFIG_SCSI=y
|
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_DEPRECATED_PARAM_STRUCT) += compat.o
|
||||||
|
|
||||||
obj-$(CONFIG_LEDS) += leds.o
|
|
||||||
obj-$(CONFIG_OC_ETM) += etm.o
|
obj-$(CONFIG_OC_ETM) += etm.o
|
||||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||||
obj-$(CONFIG_ISA_DMA_API) += dma.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/random.h>
|
||||||
#include <linux/hw_breakpoint.h>
|
#include <linux/hw_breakpoint.h>
|
||||||
#include <linux/cpuidle.h>
|
#include <linux/cpuidle.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/thread_notify.h>
|
#include <asm/thread_notify.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
@ -189,7 +189,7 @@ void cpu_idle(void)
|
||||||
while (1) {
|
while (1) {
|
||||||
tick_nohz_idle_enter();
|
tick_nohz_idle_enter();
|
||||||
rcu_idle_enter();
|
rcu_idle_enter();
|
||||||
leds_event(led_idle_start);
|
ledtrig_cpu(CPU_LED_IDLE_START);
|
||||||
while (!need_resched()) {
|
while (!need_resched()) {
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
if (cpu_is_offline(smp_processor_id()))
|
if (cpu_is_offline(smp_processor_id()))
|
||||||
|
@ -220,7 +220,7 @@ void cpu_idle(void)
|
||||||
} else
|
} else
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
leds_event(led_idle_end);
|
ledtrig_cpu(CPU_LED_IDLE_END);
|
||||||
rcu_idle_exit();
|
rcu_idle_exit();
|
||||||
tick_nohz_idle_exit();
|
tick_nohz_idle_exit();
|
||||||
schedule_preempt_disabled();
|
schedule_preempt_disabled();
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/sched_clock.h>
|
#include <asm/sched_clock.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
@ -80,21 +79,6 @@ u32 arch_gettimeoffset(void)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
|
#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
|
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
||||||
/*
|
/*
|
||||||
* Kernel system timer support.
|
* Kernel system timer support.
|
||||||
|
@ -102,7 +86,6 @@ static inline void do_leds(void)
|
||||||
void timer_tick(void)
|
void timer_tick(void)
|
||||||
{
|
{
|
||||||
profile_tick(CPU_PROFILING);
|
profile_tick(CPU_PROFILING);
|
||||||
do_leds();
|
|
||||||
xtime_update(1);
|
xtime_update(1);
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
update_process_times(user_mode(get_irq_regs()));
|
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
|
* 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 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[] = {
|
static struct resource mmc_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -312,7 +312,7 @@ static struct resource mmc_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91rm9200_mmc_device = {
|
static struct platform_device at91rm9200_mmc_device = {
|
||||||
.name = "at91_mci",
|
.name = "atmel_mci",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &mmc_dmamask,
|
.dma_mask = &mmc_dmamask,
|
||||||
|
@ -323,53 +323,69 @@ static struct platform_device at91rm9200_mmc_device = {
|
||||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
.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)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* input/irq */
|
for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
|
||||||
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 */
|
if (!data->slot[i].bus_width)
|
||||||
at91_set_A_periph(AT91_PIN_PA27, 0);
|
continue;
|
||||||
|
|
||||||
if (data->slot_b) {
|
/* input/irq */
|
||||||
/* CMD */
|
if (gpio_is_valid(data->slot[i].detect_pin)) {
|
||||||
at91_set_B_periph(AT91_PIN_PA8, 1);
|
at91_set_gpio_input(data->slot[i].detect_pin, 1);
|
||||||
|
at91_set_deglitch(data->slot[i].detect_pin, 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);
|
|
||||||
}
|
}
|
||||||
} else {
|
if (gpio_is_valid(data->slot[i].wp_pin))
|
||||||
/* CMD */
|
at91_set_gpio_input(data->slot[i].wp_pin, 1);
|
||||||
at91_set_A_periph(AT91_PIN_PA28, 1);
|
|
||||||
|
|
||||||
/* DAT0, maybe DAT1..DAT3 */
|
switch (i) {
|
||||||
at91_set_A_periph(AT91_PIN_PA29, 1);
|
case 0: /* slot A */
|
||||||
if (data->wire4) {
|
/* CMD */
|
||||||
at91_set_B_periph(AT91_PIN_PB3, 1);
|
at91_set_A_periph(AT91_PIN_PA28, 1);
|
||||||
at91_set_B_periph(AT91_PIN_PB4, 1);
|
/* DAT0, maybe DAT1..DAT3 */
|
||||||
at91_set_B_periph(AT91_PIN_PB5, 1);
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -208,93 +208,11 @@ void __init at91_add_device_eth(struct macb_platform_data *data) {}
|
||||||
#endif
|
#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
|
* 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 u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||||
static struct mci_platform_data mmc_data;
|
static struct mci_platform_data mmc_data;
|
||||||
|
|
||||||
|
|
|
@ -137,9 +137,9 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
||||||
* MMC / SD
|
* 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 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[] = {
|
static struct resource mmc_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -155,7 +155,7 @@ static struct resource mmc_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9261_mmc_device = {
|
static struct platform_device at91sam9261_mmc_device = {
|
||||||
.name = "at91_mci",
|
.name = "atmel_mci",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &mmc_dmamask,
|
.dma_mask = &mmc_dmamask,
|
||||||
|
@ -166,40 +166,40 @@ static struct platform_device at91sam9261_mmc_device = {
|
||||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
.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)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* input/irq */
|
if (data->slot[0].bus_width) {
|
||||||
if (gpio_is_valid(data->det_pin)) {
|
/* input/irq */
|
||||||
at91_set_gpio_input(data->det_pin, 1);
|
if (gpio_is_valid(data->slot[0].detect_pin)) {
|
||||||
at91_set_deglitch(data->det_pin, 1);
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -188,8 +188,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
CLKDEV_CON_ID("hclk", &macb_clk),
|
CLKDEV_CON_ID("hclk", &macb_clk),
|
||||||
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_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", "atmel_mci.0", &mmc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_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.0", &spi0_clk),
|
||||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_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
|
* 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 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[] = {
|
static struct resource mmc0_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -236,7 +236,7 @@ static struct resource mmc0_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9263_mmc0_device = {
|
static struct platform_device at91sam9263_mmc0_device = {
|
||||||
.name = "at91_mci",
|
.name = "atmel_mci",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &mmc_dmamask,
|
.dma_mask = &mmc_dmamask,
|
||||||
|
@ -261,7 +261,7 @@ static struct resource mmc1_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9263_mmc1_device = {
|
static struct platform_device at91sam9263_mmc1_device = {
|
||||||
.name = "at91_mci",
|
.name = "atmel_mci",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &mmc_dmamask,
|
.dma_mask = &mmc_dmamask,
|
||||||
|
@ -272,85 +272,110 @@ static struct platform_device at91sam9263_mmc1_device = {
|
||||||
.num_resources = ARRAY_SIZE(mmc1_resources),
|
.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)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* input/irq */
|
for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
|
||||||
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);
|
|
||||||
|
|
||||||
if (mmc_id == 0) { /* MCI0 */
|
if (!data->slot[i].bus_width)
|
||||||
/* CLK */
|
continue;
|
||||||
at91_set_A_periph(AT91_PIN_PA12, 0);
|
|
||||||
|
|
||||||
if (data->slot_b) {
|
/* input/irq */
|
||||||
/* CMD */
|
if (gpio_is_valid(data->slot[i].detect_pin)) {
|
||||||
at91_set_A_periph(AT91_PIN_PA16, 1);
|
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 */
|
if (mmc_id == 0) { /* MCI0 */
|
||||||
at91_set_A_periph(AT91_PIN_PA17, 1);
|
switch (i) {
|
||||||
if (data->wire4) {
|
case 0: /* slot A */
|
||||||
at91_set_A_periph(AT91_PIN_PA18, 1);
|
/* CMD */
|
||||||
at91_set_A_periph(AT91_PIN_PA19, 1);
|
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||||
at91_set_A_periph(AT91_PIN_PA20, 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 {
|
if (slot_count) {
|
||||||
/* CMD */
|
/* CLK */
|
||||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
at91_set_A_periph(AT91_PIN_PA12, 0);
|
||||||
|
|
||||||
/* DAT0, maybe DAT1..DAT3 */
|
mmc0_data = *data;
|
||||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
platform_device_register(&at91sam9263_mmc0_device);
|
||||||
if (data->wire4) {
|
}
|
||||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
} else if (mmc_id == 1) { /* MCI1 */
|
||||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
switch (i) {
|
||||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
|
|
|
@ -161,9 +161,9 @@ void __init at91_add_device_usba(struct usba_platform_data *data) {}
|
||||||
* MMC / SD
|
* 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 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[] = {
|
static struct resource mmc_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -179,7 +179,7 @@ static struct resource mmc_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9rl_mmc_device = {
|
static struct platform_device at91sam9rl_mmc_device = {
|
||||||
.name = "at91_mci",
|
.name = "atmel_mci",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &mmc_dmamask,
|
.dma_mask = &mmc_dmamask,
|
||||||
|
@ -190,40 +190,40 @@ static struct platform_device at91sam9rl_mmc_device = {
|
||||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
.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)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* input/irq */
|
if (data->slot[0].bus_width) {
|
||||||
if (gpio_is_valid(data->det_pin)) {
|
/* input/irq */
|
||||||
at91_set_gpio_input(data->det_pin, 1);
|
if (gpio_is_valid(data->slot[0].detect_pin)) {
|
||||||
at91_set_deglitch(data->det_pin, 1);
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -133,12 +133,12 @@ static struct atmel_nand_data __initdata afeb9260_nand_data = {
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata afeb9260_mmc_data = {
|
static struct mci_platform_data __initdata afeb9260_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PC9,
|
.slot[1] = {
|
||||||
.wp_pin = AT91_PIN_PC4,
|
.bus_width = 4,
|
||||||
.slot_b = 1,
|
.detect_pin = AT91_PIN_PC9,
|
||||||
.wire4 = 1,
|
.wp_pin = AT91_PIN_PC4,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -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_PA10, 0); /* ETX2 */
|
||||||
at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */
|
at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &afeb9260_mmc_data);
|
at91_add_device_mci(0, &afeb9260_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(afeb9260_i2c_devices,
|
at91_add_device_i2c(afeb9260_i2c_devices,
|
||||||
ARRAY_SIZE(afeb9260_i2c_devices));
|
ARRAY_SIZE(afeb9260_i2c_devices));
|
||||||
|
|
|
@ -71,12 +71,12 @@ static struct at91_udc_data __initdata carmeva_udc_data = {
|
||||||
// .vcc_pin = -EINVAL,
|
// .vcc_pin = -EINVAL,
|
||||||
// };
|
// };
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata carmeva_mmc_data = {
|
static struct mci_platform_data __initdata carmeva_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = AT91_PIN_PB10,
|
.detect_pin = AT91_PIN_PB10,
|
||||||
.wp_pin = AT91_PIN_PC14,
|
.wp_pin = AT91_PIN_PC14,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct spi_board_info carmeva_spi_devices[] = {
|
static struct spi_board_info carmeva_spi_devices[] = {
|
||||||
|
@ -150,7 +150,7 @@ static void __init carmeva_board_init(void)
|
||||||
/* Compact Flash */
|
/* Compact Flash */
|
||||||
// at91_add_device_cf(&carmeva_cf_data);
|
// at91_add_device_cf(&carmeva_cf_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &carmeva_mmc_data);
|
at91_add_device_mci(0, &carmeva_mci0_data);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
at91_gpio_leds(carmeva_leds, ARRAY_SIZE(carmeva_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[] = {
|
static struct i2c_board_info __initdata cpu9krea_i2c_devices[] = {
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("rtc-ds1307", 0x68),
|
I2C_BOARD_INFO("ds1339", 0x68),
|
||||||
.type = "ds1339",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -312,12 +311,12 @@ static void __init cpu9krea_add_device_buttons(void)
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata cpu9krea_mmc_data = {
|
static struct mci_platform_data __initdata cpu9krea_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = AT91_PIN_PA29,
|
.detect_pin = AT91_PIN_PA29,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init cpu9krea_board_init(void)
|
static void __init cpu9krea_board_init(void)
|
||||||
|
@ -359,7 +358,7 @@ static void __init cpu9krea_board_init(void)
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&cpu9krea_macb_data);
|
at91_add_device_eth(&cpu9krea_macb_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &cpu9krea_mmc_data);
|
at91_add_device_mci(0, &cpu9krea_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(cpu9krea_i2c_devices,
|
at91_add_device_i2c(cpu9krea_i2c_devices,
|
||||||
ARRAY_SIZE(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,
|
.pullup_pin = AT91_PIN_PC14,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata cpuat91_mmc_data = {
|
static struct mci_platform_data __initdata cpuat91_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PC2,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.wp_pin = -EINVAL,
|
.detect_pin = AT91_PIN_PC2,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct physmap_flash_data cpuat91_flash_data = {
|
static struct physmap_flash_data cpuat91_flash_data = {
|
||||||
|
@ -168,7 +169,7 @@ static void __init cpuat91_board_init(void)
|
||||||
/* USB Device */
|
/* USB Device */
|
||||||
at91_add_device_udc(&cpuat91_udc_data);
|
at91_add_device_udc(&cpuat91_udc_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &cpuat91_mmc_data);
|
at91_add_device_mci(0, &cpuat91_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
/* Platform devices */
|
/* Platform devices */
|
||||||
|
|
|
@ -87,12 +87,12 @@ static struct at91_cf_data __initdata csb337_cf_data = {
|
||||||
.rst_pin = AT91_PIN_PD2,
|
.rst_pin = AT91_PIN_PD2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata csb337_mmc_data = {
|
static struct mci_platform_data __initdata csb337_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PD5,
|
.slot[0] = {
|
||||||
.slot_b = 0,
|
.bus_width = 4,
|
||||||
.wire4 = 1,
|
.detect_pin = AT91_PIN_PD5,
|
||||||
.wp_pin = AT91_PIN_PD6,
|
.wp_pin = AT91_PIN_PD6,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct spi_board_info csb337_spi_devices[] = {
|
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)
|
static void __init csb337_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1);
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0 */
|
/* DBGU on ttyS0 */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -240,7 +238,7 @@ static void __init csb337_board_init(void)
|
||||||
/* SPI */
|
/* SPI */
|
||||||
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
|
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &csb337_mmc_data);
|
at91_add_device_mci(0, &csb337_mci0_data);
|
||||||
/* NOR flash */
|
/* NOR flash */
|
||||||
platform_device_register(&csb_flash);
|
platform_device_register(&csb_flash);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
|
|
|
@ -70,12 +70,12 @@ static struct at91_cf_data __initdata eb9200_cf_data = {
|
||||||
.rst_pin = AT91_PIN_PC5,
|
.rst_pin = AT91_PIN_PC5,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata eb9200_mmc_data = {
|
static struct mci_platform_data __initdata eb9200_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
|
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);
|
at91_add_device_spi(NULL, 0);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
/* only supports 1 or 4 bit interface, not wired through to SPI */
|
/* 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")
|
MACHINE_START(ATEB9200, "Embest ATEB9200")
|
||||||
|
|
|
@ -64,12 +64,12 @@ static struct at91_usbh_data __initdata ecb_at91usbh_data = {
|
||||||
.overcurrent_pin= {-EINVAL, -EINVAL},
|
.overcurrent_pin= {-EINVAL, -EINVAL},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata ecb_at91mmc_data = {
|
static struct mci_platform_data __initdata ecbat91_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_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)
|
static void __init ecb_at91board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PC7, AT91_PIN_PC7);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -161,10 +170,13 @@ static void __init ecb_at91board_init(void)
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
|
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ecb_at91mmc_data);
|
at91_add_device_mci(0, &ecbat91_mci0_data);
|
||||||
|
|
||||||
/* SPI */
|
/* SPI */
|
||||||
at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices));
|
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")
|
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,
|
.pullup_pin = AT91_PIN_PB13,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata eco920_mmc_data = {
|
static struct mci_platform_data __initdata eco920_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 0,
|
.bus_width = 1,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct physmap_flash_data eco920_flash_data = {
|
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)
|
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 */
|
/* DBGU on ttyS0. (Rx & Tx only */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
at91_add_device_serial();
|
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_usbh(&eco920_usbh_data);
|
||||||
at91_add_device_udc(&eco920_udc_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);
|
platform_device_register(&eco920_flash);
|
||||||
|
|
||||||
at91_ramc_write(0, AT91_SMC_CSR(7), AT91_SMC_RWHOLD_(1)
|
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));
|
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")
|
MACHINE_START(ECO920, "eco920")
|
||||||
|
|
|
@ -75,12 +75,12 @@ static struct spi_board_info flexibity_spi_devices[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* MCI (SD/MMC) */
|
/* MCI (SD/MMC) */
|
||||||
static struct at91_mmc_data __initdata flexibity_mmc_data = {
|
static struct mci_platform_data __initdata flexibity_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = AT91_PIN_PC9,
|
.detect_pin = AT91_PIN_PC9,
|
||||||
.wp_pin = AT91_PIN_PC4,
|
.wp_pin = AT91_PIN_PC4,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
|
@ -152,7 +152,7 @@ static void __init flexibity_board_init(void)
|
||||||
at91_add_device_spi(flexibity_spi_devices,
|
at91_add_device_spi(flexibity_spi_devices,
|
||||||
ARRAY_SIZE(flexibity_spi_devices));
|
ARRAY_SIZE(flexibity_spi_devices));
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &flexibity_mmc_data);
|
at91_add_device_mci(0, &flexibity_mci0_data);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
at91_gpio_leds(flexibity_leds, ARRAY_SIZE(flexibity_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.
|
* SPI devices.
|
||||||
*/
|
*/
|
||||||
static struct spi_board_info foxg20_spi_devices[] = {
|
static struct spi_board_info foxg20_spi_devices[] = {
|
||||||
#if !defined(CONFIG_MMC_AT91)
|
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||||
{
|
{
|
||||||
.modalias = "mtd_dataflash",
|
.modalias = "mtd_dataflash",
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
|
@ -109,12 +109,12 @@ static struct macb_platform_data __initdata foxg20_macb_data = {
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
* det_pin, wp_pin and vcc_pin are not connected
|
* det_pin, wp_pin and vcc_pin are not connected
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata foxg20_mmc_data = {
|
static struct mci_platform_data __initdata foxg20_mci0_data = {
|
||||||
.slot_b = 1,
|
.slot[1] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ static void __init foxg20_board_init(void)
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&foxg20_macb_data);
|
at91_add_device_eth(&foxg20_macb_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &foxg20_mmc_data);
|
at91_add_device_mci(0, &foxg20_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(foxg20_i2c_devices, ARRAY_SIZE(foxg20_i2c_devices));
|
at91_add_device_i2c(foxg20_i2c_devices, ARRAY_SIZE(foxg20_i2c_devices));
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
|
|
|
@ -66,11 +66,20 @@ static struct at91_udc_data __initdata kafa_udc_data = {
|
||||||
.pullup_pin = AT91_PIN_PB7,
|
.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)
|
static void __init kafa_board_init(void)
|
||||||
{
|
{
|
||||||
/* Set up the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PB4, AT91_PIN_PB4);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -88,6 +97,8 @@ static void __init kafa_board_init(void)
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
/* SPI */
|
/* SPI */
|
||||||
at91_add_device_spi(NULL, 0);
|
at91_add_device_spi(NULL, 0);
|
||||||
|
/* LEDs */
|
||||||
|
at91_gpio_leds(kafa_leds, ARRAY_SIZE(kafa_leds));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(KAFA, "Sperry-Sun KAFA")
|
MACHINE_START(KAFA, "Sperry-Sun KAFA")
|
||||||
|
|
|
@ -69,12 +69,12 @@ static struct at91_udc_data __initdata kb9202_udc_data = {
|
||||||
.pullup_pin = AT91_PIN_PB22,
|
.pullup_pin = AT91_PIN_PB22,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata kb9202_mmc_data = {
|
static struct mci_platform_data __initdata kb9202_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PB2,
|
.slot[0] = {
|
||||||
.slot_b = 0,
|
.bus_width = 4,
|
||||||
.wire4 = 1,
|
.detect_pin = AT91_PIN_PB2,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct mtd_partition __initdata kb9202_nand_partition[] = {
|
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),
|
.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)
|
static void __init kb9202_board_init(void)
|
||||||
{
|
{
|
||||||
/* Set up the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PC19, AT91_PIN_PC18);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -121,13 +136,15 @@ static void __init kb9202_board_init(void)
|
||||||
/* USB Device */
|
/* USB Device */
|
||||||
at91_add_device_udc(&kb9202_udc_data);
|
at91_add_device_udc(&kb9202_udc_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &kb9202_mmc_data);
|
at91_add_device_mci(0, &kb9202_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
/* SPI */
|
/* SPI */
|
||||||
at91_add_device_spi(NULL, 0);
|
at91_add_device_spi(NULL, 0);
|
||||||
/* NAND */
|
/* NAND */
|
||||||
at91_add_device_nand(&kb9202_nand_data);
|
at91_add_device_nand(&kb9202_nand_data);
|
||||||
|
/* LEDs */
|
||||||
|
at91_gpio_leds(kb9202_leds, ARRAY_SIZE(kb9202_leds));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(KB9200, "KB920x")
|
MACHINE_START(KB9200, "KB920x")
|
||||||
|
|
|
@ -138,11 +138,12 @@ static struct spi_board_info neocore926_spi_devices[] = {
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata neocore926_mmc_data = {
|
static struct mci_platform_data __initdata neocore926_mci0_data = {
|
||||||
.wire4 = 1,
|
.slot[0] = {
|
||||||
.det_pin = AT91_PIN_PE18,
|
.bus_width = 4,
|
||||||
.wp_pin = AT91_PIN_PE19,
|
.detect_pin = AT91_PIN_PE18,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = AT91_PIN_PE19,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -354,7 +355,7 @@ static void __init neocore926_board_init(void)
|
||||||
neocore926_add_device_ts();
|
neocore926_add_device_ts();
|
||||||
|
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(1, &neocore926_mmc_data);
|
at91_add_device_mci(0, &neocore926_mci0_data);
|
||||||
|
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&neocore926_macb_data);
|
at91_add_device_eth(&neocore926_macb_data);
|
||||||
|
|
|
@ -62,12 +62,12 @@ static struct at91_usbh_data __initdata picotux200_usbh_data = {
|
||||||
.overcurrent_pin= {-EINVAL, -EINVAL},
|
.overcurrent_pin= {-EINVAL, -EINVAL},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct at91_mmc_data __initdata picotux200_mmc_data = {
|
static struct mci_platform_data __initdata picotux200_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PB27,
|
.slot[0] = {
|
||||||
.slot_b = 0,
|
.bus_width = 4,
|
||||||
.wire4 = 1,
|
.detect_pin = AT91_PIN_PB27,
|
||||||
.wp_pin = AT91_PIN_PA17,
|
.wp_pin = AT91_PIN_PA17,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PICOTUX200_FLASH_BASE AT91_CHIPSELECT_0
|
#define PICOTUX200_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
|
@ -112,7 +112,7 @@ static void __init picotux200_board_init(void)
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
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 */
|
/* NOR Flash */
|
||||||
platform_device_register(&picotux200_flash);
|
platform_device_register(&picotux200_flash);
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,12 +156,12 @@ static void __init ek_add_device_nand(void)
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -245,7 +245,7 @@ static void __init ek_board_init(void)
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&ek_macb_data);
|
at91_add_device_eth(&ek_macb_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mci(0, &ek_mci0_data);
|
||||||
/* Push Buttons */
|
/* Push Buttons */
|
||||||
ek_add_device_buttons();
|
ek_add_device_buttons();
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
|
|
|
@ -77,12 +77,12 @@ static struct at91_cf_data __initdata dk_cf_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef CONFIG_MTD_AT91_DATAFLASH_CARD
|
#ifndef CONFIG_MTD_AT91_DATAFLASH_CARD
|
||||||
static struct at91_mmc_data __initdata dk_mmc_data = {
|
static struct mci_platform_data __initdata dk_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -177,9 +177,6 @@ static struct gpio_led dk_leds[] = {
|
||||||
|
|
||||||
static void __init dk_board_init(void)
|
static void __init dk_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -208,7 +205,7 @@ static void __init dk_board_init(void)
|
||||||
#else
|
#else
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
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
|
#endif
|
||||||
/* NAND */
|
/* NAND */
|
||||||
at91_add_device_nand(&dk_nand_data);
|
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
|
#ifndef CONFIG_MTD_AT91_DATAFLASH_CARD
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PB27,
|
.slot[0] = {
|
||||||
.slot_b = 0,
|
.bus_width = 4,
|
||||||
.wire4 = 1,
|
.detect_pin = AT91_PIN_PB27,
|
||||||
.wp_pin = AT91_PIN_PA17,
|
.wp_pin = AT91_PIN_PA17,
|
||||||
.vcc_pin = -EINVAL,
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -148,9 +148,6 @@ static struct gpio_led ek_leds[] = {
|
||||||
|
|
||||||
static void __init ek_board_init(void)
|
static void __init ek_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -177,7 +174,7 @@ static void __init ek_board_init(void)
|
||||||
#else
|
#else
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
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
|
#endif
|
||||||
/* NOR Flash */
|
/* NOR Flash */
|
||||||
platform_device_register(&ek_flash);
|
platform_device_register(&ek_flash);
|
||||||
|
|
|
@ -58,11 +58,12 @@ static struct at91_usbh_data rsi_ews_usbh_data __initdata = {
|
||||||
/*
|
/*
|
||||||
* SD/MC
|
* SD/MC
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data rsi_ews_mmc_data __initdata = {
|
static struct mci_platform_data __initdata rsi_ews_mci0_data = {
|
||||||
.slot_b = 0,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = AT91_PIN_PB27,
|
.detect_pin = AT91_PIN_PB27,
|
||||||
.wp_pin = AT91_PIN_PB29,
|
.wp_pin = AT91_PIN_PB29,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -185,9 +186,6 @@ static struct platform_device rsiews_nor_flash = {
|
||||||
*/
|
*/
|
||||||
static void __init rsi_ews_board_init(void)
|
static void __init rsi_ews_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PB6, AT91_PIN_PB9);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
/* This one is for debugging */
|
/* 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,
|
at91_add_device_spi(rsi_ews_spi_devices,
|
||||||
ARRAY_SIZE(rsi_ews_spi_devices));
|
ARRAY_SIZE(rsi_ews_spi_devices));
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &rsi_ews_mmc_data);
|
at91_add_device_mci(0, &rsi_ews_mci0_data);
|
||||||
/* NOR Flash */
|
/* NOR Flash */
|
||||||
platform_device_register(&rsiews_nor_flash);
|
platform_device_register(&rsiews_nor_flash);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
|
|
|
@ -73,7 +73,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||||
* SPI devices.
|
* SPI devices.
|
||||||
*/
|
*/
|
||||||
static struct spi_board_info ek_spi_devices[] = {
|
static struct spi_board_info ek_spi_devices[] = {
|
||||||
#if !defined(CONFIG_MMC_AT91)
|
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||||
{ /* DataFlash chip */
|
{ /* DataFlash chip */
|
||||||
.modalias = "mtd_dataflash",
|
.modalias = "mtd_dataflash",
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
|
@ -158,19 +158,34 @@ static void __init ek_add_device_nand(void)
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||||
.slot_b = 1,
|
.slot[1] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = AT91_PIN_PC8,
|
.detect_pin = AT91_PIN_PC8,
|
||||||
.wp_pin = AT91_PIN_PC4,
|
.wp_pin = AT91_PIN_PC4,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
static void __init ek_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PA9, AT91_PIN_PA6);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -194,9 +209,11 @@ static void __init ek_board_init(void)
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&ek_macb_data);
|
at91_add_device_eth(&ek_macb_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mci(0, &ek_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(NULL, 0);
|
||||||
|
/* LEDs */
|
||||||
|
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
|
MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
|
||||||
|
|
|
@ -108,7 +108,7 @@ static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
|
||||||
* SPI devices.
|
* SPI devices.
|
||||||
*/
|
*/
|
||||||
static struct spi_board_info ek_spi_devices[] = {
|
static struct spi_board_info ek_spi_devices[] = {
|
||||||
#if !defined(CONFIG_MMC_AT91)
|
#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
||||||
{ /* DataFlash chip */
|
{ /* DataFlash chip */
|
||||||
.modalias = "mtd_dataflash",
|
.modalias = "mtd_dataflash",
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
|
@ -211,12 +211,12 @@ static void __init ek_add_device_nand(void)
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata ek_mci0_data = {
|
||||||
.slot_b = 1,
|
.slot[1] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.det_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.wp_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ static void __init ek_board_init(void)
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&ek_macb_data);
|
at91_add_device_eth(&ek_macb_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mci(0, &ek_mci0_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||||
/* SSC (to AT73C213) */
|
/* SSC (to AT73C213) */
|
||||||
|
|
|
@ -340,11 +340,12 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
* det_pin, wp_pin and vcc_pin are not connected
|
* det_pin, wp_pin and vcc_pin are not connected
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata mci0_data = {
|
||||||
.wire4 = 1,
|
.slot[0] = {
|
||||||
.det_pin = -EINVAL,
|
.bus_width = 4,
|
||||||
.wp_pin = -EINVAL,
|
.detect_pin = -EINVAL,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_SPI_ATMEL_* */
|
#endif /* CONFIG_SPI_ATMEL_* */
|
||||||
|
@ -569,9 +570,6 @@ static struct gpio_led ek_leds[] = {
|
||||||
|
|
||||||
static void __init ek_board_init(void)
|
static void __init ek_board_init(void)
|
||||||
{
|
{
|
||||||
/* Setup the LEDs */
|
|
||||||
at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14);
|
|
||||||
|
|
||||||
/* Serial */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
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);
|
at91_add_device_ssc(AT91SAM9261_ID_SSC1, ATMEL_SSC_TX);
|
||||||
#else
|
#else
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mci(0, &mci0_data);
|
||||||
#endif
|
#endif
|
||||||
/* LCD Controller */
|
/* LCD Controller */
|
||||||
at91_add_device_lcdc(&ek_lcdc_data);
|
at91_add_device_lcdc(&ek_lcdc_data);
|
||||||
|
|
|
@ -141,11 +141,12 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||||
/*
|
/*
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata mci1_data = {
|
||||||
.wire4 = 1,
|
.slot[0] = {
|
||||||
.det_pin = AT91_PIN_PE18,
|
.bus_width = 4,
|
||||||
.wp_pin = AT91_PIN_PE19,
|
.detect_pin = AT91_PIN_PE18,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = AT91_PIN_PE19,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -420,7 +421,7 @@ static void __init ek_board_init(void)
|
||||||
/* Touchscreen */
|
/* Touchscreen */
|
||||||
ek_add_device_ts();
|
ek_add_device_ts();
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(1, &ek_mmc_data);
|
at91_add_device_mci(1, &mci1_data);
|
||||||
/* Ethernet */
|
/* Ethernet */
|
||||||
at91_add_device_eth(&ek_macb_data);
|
at91_add_device_eth(&ek_macb_data);
|
||||||
/* NAND */
|
/* NAND */
|
||||||
|
|
|
@ -92,7 +92,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||||
* SPI devices.
|
* SPI devices.
|
||||||
*/
|
*/
|
||||||
static struct spi_board_info ek_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 */
|
{ /* DataFlash chip */
|
||||||
.modalias = "mtd_dataflash",
|
.modalias = "mtd_dataflash",
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
|
@ -199,7 +199,6 @@ static void __init ek_add_device_nand(void)
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
* wp_pin and vcc_pin are not connected
|
* 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 = {
|
static struct mci_platform_data __initdata ek_mmc_data = {
|
||||||
.slot[1] = {
|
.slot[1] = {
|
||||||
.bus_width = 4,
|
.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)
|
static void __init ek_add_device_mmc(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
|
||||||
if (ek_have_2mmc()) {
|
if (ek_have_2mmc()) {
|
||||||
ek_mmc_data.slot[0].bus_width = 4;
|
ek_mmc_data.slot[0].bus_width = 4;
|
||||||
ek_mmc_data.slot[0].detect_pin = AT91_PIN_PC2;
|
ek_mmc_data.slot[0].detect_pin = AT91_PIN_PC2;
|
||||||
ek_mmc_data.slot[0].wp_pin = -1;
|
ek_mmc_data.slot[0].wp_pin = -1;
|
||||||
}
|
}
|
||||||
at91_add_device_mci(0, &ek_mmc_data);
|
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)
|
* MCI (SD/MMC)
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
static struct mci_platform_data __initdata mci0_data = {
|
||||||
.wire4 = 1,
|
.slot[0] = {
|
||||||
.det_pin = AT91_PIN_PA15,
|
.bus_width = 4,
|
||||||
.wp_pin = -EINVAL,
|
.detect_pin = AT91_PIN_PA15,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -303,7 +304,7 @@ static void __init ek_board_init(void)
|
||||||
/* SPI */
|
/* SPI */
|
||||||
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
|
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mci(0, &mci0_data);
|
||||||
/* LCD Controller */
|
/* LCD Controller */
|
||||||
at91_add_device_lcdc(&ek_lcdc_data);
|
at91_add_device_lcdc(&ek_lcdc_data);
|
||||||
/* AC97 */
|
/* AC97 */
|
||||||
|
|
|
@ -83,7 +83,6 @@ static void __init add_device_nand(void)
|
||||||
* MCI (SD/MMC)
|
* MCI (SD/MMC)
|
||||||
* det_pin, wp_pin and vcc_pin are not connected
|
* 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 = {
|
static struct mci_platform_data __initdata mmc_data = {
|
||||||
.slot[0] = {
|
.slot[0] = {
|
||||||
.bus_width = 4,
|
.bus_width = 4,
|
||||||
|
@ -91,15 +90,6 @@ static struct mci_platform_data __initdata mmc_data = {
|
||||||
.wp_pin = -1,
|
.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 */
|
/* NAND */
|
||||||
add_device_nand();
|
add_device_nand();
|
||||||
/* MMC */
|
/* MMC */
|
||||||
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
|
|
||||||
at91_add_device_mci(0, &mmc_data);
|
at91_add_device_mci(0, &mmc_data);
|
||||||
#else
|
|
||||||
at91_add_device_mmc(0, &mmc_data);
|
|
||||||
#endif
|
|
||||||
/* W1 */
|
/* W1 */
|
||||||
add_w1();
|
add_w1();
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,14 +109,12 @@ static struct mmc_spi_platform_data at91_mmc_spi_pdata = {
|
||||||
* SPI devices.
|
* SPI devices.
|
||||||
*/
|
*/
|
||||||
static struct spi_board_info usb_a9263_spi_devices[] = {
|
static struct spi_board_info usb_a9263_spi_devices[] = {
|
||||||
#if !defined(CONFIG_MMC_AT91)
|
|
||||||
{ /* DataFlash chip */
|
{ /* DataFlash chip */
|
||||||
.modalias = "mtd_dataflash",
|
.modalias = "mtd_dataflash",
|
||||||
.chip_select = 0,
|
.chip_select = 0,
|
||||||
.max_speed_hz = 15 * 1000 * 1000,
|
.max_speed_hz = 15 * 1000 * 1000,
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct spi_board_info usb_a9g20_spi_devices[] = {
|
static struct spi_board_info usb_a9g20_spi_devices[] = {
|
||||||
|
|
|
@ -119,11 +119,12 @@ static struct at91_udc_data __initdata yl9200_udc_data = {
|
||||||
/*
|
/*
|
||||||
* MMC
|
* MMC
|
||||||
*/
|
*/
|
||||||
static struct at91_mmc_data __initdata yl9200_mmc_data = {
|
static struct mci_platform_data __initdata yl9200_mci0_data = {
|
||||||
.det_pin = AT91_PIN_PB9,
|
.slot[0] = {
|
||||||
.wire4 = 1,
|
.bus_width = 4,
|
||||||
.wp_pin = -EINVAL,
|
.detect_pin = AT91_PIN_PB9,
|
||||||
.vcc_pin = -EINVAL,
|
.wp_pin = -EINVAL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -541,9 +542,6 @@ void __init yl9200_add_device_video(void) {}
|
||||||
|
|
||||||
static void __init yl9200_board_init(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 */
|
/* Serial */
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -568,7 +566,7 @@ static void __init yl9200_board_init(void)
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(yl9200_i2c_devices, ARRAY_SIZE(yl9200_i2c_devices));
|
at91_add_device_i2c(yl9200_i2c_devices, ARRAY_SIZE(yl9200_i2c_devices));
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &yl9200_mmc_data);
|
at91_add_device_mci(0, &yl9200_mci0_data);
|
||||||
/* NAND */
|
/* NAND */
|
||||||
at91_add_device_nand(&yl9200_nand_data);
|
at91_add_device_nand(&yl9200_nand_data);
|
||||||
/* NOR Flash */
|
/* NOR Flash */
|
||||||
|
|
|
@ -187,7 +187,6 @@ struct at91_can_data {
|
||||||
extern void __init at91_add_device_can(struct at91_can_data *data);
|
extern void __init at91_add_device_can(struct at91_can_data *data);
|
||||||
|
|
||||||
/* LEDs */
|
/* 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_gpio_leds(struct gpio_led *leds, int nr);
|
||||||
extern void __init at91_pwm_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
|
#else
|
||||||
void __init at91_pwm_leds(struct gpio_led *leds, int nr){}
|
void __init at91_pwm_leds(struct gpio_led *leds, int nr){}
|
||||||
#endif
|
#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_EDB7211) += edb7211-arch.o edb7211-mm.o
|
||||||
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
||||||
obj-$(CONFIG_ARCH_P720T) += p720t.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/string.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -34,6 +36,8 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <mach/syspld.h>
|
#include <mach/syspld.h>
|
||||||
|
|
||||||
|
#include <asm/hardware/clps7111.h>
|
||||||
|
|
||||||
#include "common.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")
|
MACHINE_START(P720T, "ARM-Prospector720T")
|
||||||
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
||||||
.atag_offset = 0x100,
|
.atag_offset = 0x100,
|
||||||
|
|
|
@ -4,9 +4,7 @@
|
||||||
|
|
||||||
# Object file lists.
|
# Object file lists.
|
||||||
|
|
||||||
obj-y := core.o io.o
|
obj-y := core.o io.o leds.o
|
||||||
obj-m :=
|
obj-m :=
|
||||||
obj-n :=
|
obj-n :=
|
||||||
obj- :=
|
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
|
* License terms: GNU General Public License (GPL) version 2
|
||||||
*
|
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||||
* 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
|
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/spinlock.h>
|
|
||||||
#include <linux/init.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 <asm/mach-types.h>
|
||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
static spinlock_t leds_lock;
|
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
|
||||||
|
static void ebsa110_led_set(struct led_classdev *cdev,
|
||||||
static void ebsa110_leds_event(led_event_t ledevt)
|
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) {
|
__raw_writeb(reg, SOFT_BASE);
|
||||||
case led_timer:
|
|
||||||
*(volatile unsigned char *)SOFT_BASE ^= 128;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&leds_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init leds_init(void)
|
static enum led_brightness ebsa110_led_get(struct led_classdev *cdev)
|
||||||
{
|
{
|
||||||
if (machine_is_ebsa110())
|
u8 reg = __raw_readb(SOFT_BASE);
|
||||||
leds_event = ebsa110_leds_event;
|
|
||||||
|
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;
|
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 USE_OF
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD
|
select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD
|
||||||
|
select PINCTRL
|
||||||
|
select PINCTRL_EXYNOS4
|
||||||
help
|
help
|
||||||
Machine support for Samsung Exynos4 machine with device tree enabled.
|
Machine support for Samsung Exynos4 machine with device tree enabled.
|
||||||
Select this if a fdt blob is available for the Exynos4 SoC based board.
|
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 },
|
.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[] = {
|
static struct clk exynos5_init_clocks_off[] = {
|
||||||
{
|
{
|
||||||
.name = "timers",
|
.name = "timers",
|
||||||
|
@ -754,6 +816,26 @@ static struct clk exynos5_init_clocks_off[] = {
|
||||||
.parent = &exynos5_clk_aclk_66.clk,
|
.parent = &exynos5_clk_aclk_66.clk,
|
||||||
.enable = exynos5_clk_ip_peric_ctrl,
|
.enable = exynos5_clk_ip_peric_ctrl,
|
||||||
.ctrlbit = (1 << 18),
|
.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,
|
.name = SYSMMU_CLOCK_NAME,
|
||||||
.devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
|
.devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
|
||||||
|
@ -1225,6 +1307,10 @@ static struct clksrc_clk *exynos5_sysclks[] = {
|
||||||
&exynos5_clk_aclk_266,
|
&exynos5_clk_aclk_266,
|
||||||
&exynos5_clk_aclk_200,
|
&exynos5_clk_aclk_200,
|
||||||
&exynos5_clk_aclk_166,
|
&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_pre,
|
||||||
&exynos5_clk_aclk_66,
|
&exynos5_clk_aclk_66,
|
||||||
&exynos5_clk_dout_mmc0,
|
&exynos5_clk_dout_mmc0,
|
||||||
|
|
|
@ -980,6 +980,32 @@ static int __init exynos_init_irq_eint(void)
|
||||||
{
|
{
|
||||||
int irq;
|
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())
|
if (soc_is_exynos5250())
|
||||||
exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
|
exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
|
||||||
else
|
else
|
||||||
|
|
|
@ -121,6 +121,11 @@
|
||||||
#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000
|
#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000
|
||||||
#define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000
|
#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_MDMA1 0x10A40000
|
||||||
#define EXYNOS5_PA_SYSMMU_SSS 0x10A50000
|
#define EXYNOS5_PA_SYSMMU_SSS 0x10A50000
|
||||||
#define EXYNOS5_PA_SYSMMU_2D 0x10A60000
|
#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_PDMA0, "dma-pl330.0", NULL),
|
||||||
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", 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("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_NETWINDER) += netwinder-pci.o
|
||||||
pci-$(CONFIG_ARCH_PERSONAL_SERVER) += personal-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_CATS) += cats-hw.o isa-timer.o
|
||||||
obj-$(CONFIG_ARCH_EBSA285) += ebsa285.o dc21285-timer.o
|
obj-$(CONFIG_ARCH_EBSA285) += ebsa285.o dc21285-timer.o
|
||||||
obj-$(CONFIG_ARCH_NETWINDER) += netwinder-hw.o isa-timer.o
|
obj-$(CONFIG_ARCH_NETWINDER) += netwinder-hw.o isa-timer.o
|
||||||
obj-$(CONFIG_ARCH_PERSONAL_SERVER) += personal.o dc21285-timer.o
|
obj-$(CONFIG_ARCH_PERSONAL_SERVER) += personal.o dc21285-timer.o
|
||||||
|
|
||||||
obj-$(CONFIG_PCI) +=$(pci-y)
|
obj-$(CONFIG_PCI) +=$(pci-y)
|
||||||
obj-$(CONFIG_LEDS) +=$(leds-y)
|
|
||||||
|
|
||||||
obj-$(CONFIG_ISA) += isa.o isa-rtc.o
|
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/init.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/hardware/dec21285.h>
|
#include <asm/hardware/dec21285.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
@ -13,6 +15,85 @@
|
||||||
|
|
||||||
#include "common.h"
|
#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")
|
MACHINE_START(EBSA285, "EBSA285")
|
||||||
/* Maintainer: Russell King */
|
/* Maintainer: Russell King */
|
||||||
.atag_offset = 0x100,
|
.atag_offset = 0x100,
|
||||||
|
|
|
@ -12,9 +12,10 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/hardware/dec21285.h>
|
#include <asm/hardware/dec21285.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/system_misc.h>
|
#include <asm/system_misc.h>
|
||||||
|
@ -27,13 +28,6 @@
|
||||||
#define GP1_IO_BASE 0x338
|
#define GP1_IO_BASE 0x338
|
||||||
#define GP2_IO_BASE 0x33a
|
#define GP2_IO_BASE 0x33a
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_LEDS
|
|
||||||
#define DEFAULT_LEDS 0
|
|
||||||
#else
|
|
||||||
#define DEFAULT_LEDS GPIO_GREEN_LED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Winbond WB83977F accessibility stuff
|
* Winbond WB83977F accessibility stuff
|
||||||
*/
|
*/
|
||||||
|
@ -611,15 +605,9 @@ static void __init rwa010_init(void)
|
||||||
static int __init nw_hw_init(void)
|
static int __init nw_hw_init(void)
|
||||||
{
|
{
|
||||||
if (machine_is_netwinder()) {
|
if (machine_is_netwinder()) {
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
wb977_init();
|
wb977_init();
|
||||||
cpld_init();
|
cpld_init();
|
||||||
rwa010_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;
|
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")
|
MACHINE_START(NETWINDER, "Rebel-NetWinder")
|
||||||
/* Maintainer: Russell King/Rebel.com */
|
/* Maintainer: Russell King/Rebel.com */
|
||||||
.atag_offset = 0x100,
|
.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.
|
# 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_AP) += integrator_ap.o
|
||||||
obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o
|
obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o
|
||||||
|
|
||||||
obj-$(CONFIG_LEDS) += leds.o
|
|
||||||
obj-$(CONFIG_PCI) += pci_v3.o pci.o
|
obj-$(CONFIG_PCI) += pci_v3.o pci.o
|
||||||
obj-$(CONFIG_CPU_FREQ_INTEGRATOR) += cpu.o
|
obj-$(CONFIG_CPU_FREQ_INTEGRATOR) += cpu.o
|
||||||
obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o
|
obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include <mach/cm.h>
|
#include <mach/cm.h>
|
||||||
#include <mach/irqs.h>
|
#include <mach/irqs.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -128,8 +127,6 @@ static struct amba_pl010_data integrator_uart_data = {
|
||||||
.set_mctrl = integrator_uart_set_mctrl,
|
.set_mctrl = integrator_uart_set_mctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL)
|
|
||||||
|
|
||||||
static DEFINE_RAW_SPINLOCK(cm_lock);
|
static DEFINE_RAW_SPINLOCK(cm_lock);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
*/
|
*/
|
||||||
void cm_control(u32, u32);
|
void cm_control(u32, u32);
|
||||||
|
|
||||||
|
#define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL)
|
||||||
|
|
||||||
#define CM_CTRL_LED (1 << 0)
|
#define CM_CTRL_LED (1 << 0)
|
||||||
#define CM_CTRL_nMBDET (1 << 1)
|
#define CM_CTRL_nMBDET (1 << 1)
|
||||||
#define CM_CTRL_REMAP (1 << 2)
|
#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
|
* License terms: GNU General Public License (GPL) version 2
|
||||||
*
|
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||||
* 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
|
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/smp.h>
|
|
||||||
#include <linux/spinlock.h>
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
|
#include <mach/cm.h>
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/platform.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;
|
struct integrator_led *led = container_of(cdev,
|
||||||
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
struct integrator_led, cdev);
|
||||||
unsigned int update_alpha_leds;
|
u32 reg = __raw_readl(LEDREG);
|
||||||
|
|
||||||
// yup, change the LEDs
|
if (b != LED_OFF)
|
||||||
local_irq_save(flags);
|
reg |= led->mask;
|
||||||
update_alpha_leds = 0;
|
else
|
||||||
|
reg &= ~led->mask;
|
||||||
|
|
||||||
switch(ledevt) {
|
while (__raw_readl(ALPHA_REG) & 1)
|
||||||
case led_idle_start:
|
cpu_relax();
|
||||||
cm_control(CM_CTRL_LED, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case led_idle_end:
|
__raw_writel(reg, LEDREG);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init leds_init(void)
|
static enum led_brightness integrator_led_get(struct led_classdev *cdev)
|
||||||
{
|
{
|
||||||
if (machine_is_integrator() || machine_is_cintegrator())
|
struct integrator_led *led = container_of(cdev,
|
||||||
leds_event = integrator_leds_event;
|
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;
|
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
|
# PCI support is optional
|
||||||
obj-$(CONFIG_PCI) += pci.o
|
obj-$(CONFIG_PCI) += pci.o
|
||||||
|
|
||||||
# LEDs
|
|
||||||
obj-$(CONFIG_LEDS) += leds.o
|
|
||||||
|
|
||||||
# Board-specific support
|
# Board-specific support
|
||||||
obj-$(CONFIG_MACH_KS8695) += board-micrel.o
|
obj-$(CONFIG_MACH_KS8695) += board-micrel.o
|
||||||
obj-$(CONFIG_MACH_DSM320) += board-dsm320.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_lan(void);
|
||||||
extern void __init ks8695_add_device_hpna(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 */
|
/* PCI */
|
||||||
#define KS8695_MODE_PCI 0
|
#define KS8695_MODE_PCI 0
|
||||||
#define KS8695_MODE_MINIPCI 1
|
#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_OMAP15XX) += gpio15xx.o
|
||||||
obj-$(CONFIG_ARCH_OMAP16XX) += gpio16xx.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),)
|
ifneq ($(CONFIG_FB_OMAP),)
|
||||||
obj-y += lcd_dma.o
|
obj-y += lcd_dma.o
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/smc91x.h>
|
#include <linux/smc91x.h>
|
||||||
#include <linux/omapfb.h>
|
#include <linux/omapfb.h>
|
||||||
#include <linux/platform_data/gpio-omap.h>
|
#include <linux/platform_data/gpio-omap.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
@ -307,12 +308,39 @@ static struct platform_device h2_irda_device = {
|
||||||
.resource = h2_irda_resources,
|
.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 = {
|
static struct platform_device *h2_devices[] __initdata = {
|
||||||
&h2_nor_device,
|
&h2_nor_device,
|
||||||
&h2_nand_device,
|
&h2_nand_device,
|
||||||
&h2_smc91x_device,
|
&h2_smc91x_device,
|
||||||
&h2_irda_device,
|
&h2_irda_device,
|
||||||
&h2_kp_device,
|
&h2_kp_device,
|
||||||
|
&h2_gpio_leds,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init h2_init_smc91x(void)
|
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(E19_1610_KBR4);
|
||||||
omap_cfg_reg(N19_1610_KBR5);
|
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].start = gpio_to_irq(0);
|
||||||
h2_smc91x_resources[1].end = gpio_to_irq(0);
|
h2_smc91x_resources[1].end = gpio_to_irq(0);
|
||||||
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
|
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/smc91x.h>
|
#include <linux/smc91x.h>
|
||||||
#include <linux/omapfb.h>
|
#include <linux/omapfb.h>
|
||||||
#include <linux/platform_data/gpio-omap.h>
|
#include <linux/platform_data/gpio-omap.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/page.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 = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&nor_device,
|
&nor_device,
|
||||||
&nand_device,
|
&nand_device,
|
||||||
|
@ -332,6 +359,7 @@ static struct platform_device *devices[] __initdata = {
|
||||||
&intlat_device,
|
&intlat_device,
|
||||||
&h3_kp_device,
|
&h3_kp_device,
|
||||||
&h3_lcd_device,
|
&h3_lcd_device,
|
||||||
|
&h3_gpio_leds,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct omap_usb_config h3_usb_config __initdata = {
|
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(E19_1610_KBR4);
|
||||||
omap_cfg_reg(N19_1610_KBR5);
|
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].start = gpio_to_irq(40);
|
||||||
smc91x_resources[1].end = gpio_to_irq(40);
|
smc91x_resources[1].end = gpio_to_irq(40);
|
||||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
|
|
@ -382,10 +382,37 @@ static struct platform_device osk5912_lcd_device = {
|
||||||
.id = -1,
|
.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 = {
|
static struct platform_device *mistral_devices[] __initdata = {
|
||||||
&osk5912_kp_device,
|
&osk5912_kp_device,
|
||||||
&mistral_bl_device,
|
&mistral_bl_device,
|
||||||
&osk5912_lcd_device,
|
&osk5912_lcd_device,
|
||||||
|
&mistral_gpio_leds,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mistral_get_pendown_state(void)
|
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)
|
if (gpio_request(2, "lcd_pwr") == 0)
|
||||||
gpio_direction_output(2, 1);
|
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,
|
i2c_register_board_info(1, mistral_i2c_board_info,
|
||||||
ARRAY_SIZE(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/clockchips.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/sched_clock.h>
|
#include <asm/sched_clock.h>
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
#include <linux/clockchips.h>
|
#include <linux/clockchips.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
|
@ -48,6 +48,7 @@ config ARCH_OMAP3
|
||||||
select ARM_CPU_SUSPEND if PM
|
select ARM_CPU_SUSPEND if PM
|
||||||
select MULTI_IRQ_HANDLER
|
select MULTI_IRQ_HANDLER
|
||||||
select SOC_HAS_OMAP2_SDRC
|
select SOC_HAS_OMAP2_SDRC
|
||||||
|
select OMAP_INTERCONNECT
|
||||||
|
|
||||||
config ARCH_OMAP4
|
config ARCH_OMAP4
|
||||||
bool "TI OMAP4"
|
bool "TI OMAP4"
|
||||||
|
@ -67,6 +68,7 @@ config ARCH_OMAP4
|
||||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||||
select ARM_CPU_SUSPEND if PM
|
select ARM_CPU_SUSPEND if PM
|
||||||
select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP
|
select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP
|
||||||
|
select OMAP_INTERCONNECT
|
||||||
|
|
||||||
config SOC_OMAP5
|
config SOC_OMAP5
|
||||||
bool "TI OMAP5"
|
bool "TI OMAP5"
|
||||||
|
|
|
@ -180,11 +180,6 @@ obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
|
||||||
# EMU peripherals
|
# EMU peripherals
|
||||||
obj-$(CONFIG_OMAP3_EMU) += emu.o
|
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
|
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
|
||||||
mailbox_mach-objs := mailbox.o
|
mailbox_mach-objs := mailbox.o
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include <linux/ethtool.h>
|
#include <linux/ethtool.h>
|
||||||
#include <net/dsa.h>
|
#include <net/dsa.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/pci.h>
|
#include <asm/mach/pci.h>
|
||||||
#include <mach/orion5x.h>
|
#include <mach/orion5x.h>
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <net/dsa.h>
|
#include <net/dsa.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/pci.h>
|
#include <asm/mach/pci.h>
|
||||||
#include <mach/orion5x.h>
|
#include <mach/orion5x.h>
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/pci.h>
|
#include <asm/mach/pci.h>
|
||||||
#include <mach/orion5x.h>
|
#include <mach/orion5x.h>
|
||||||
|
@ -53,12 +53,6 @@
|
||||||
#define RD88F5182_PCI_SLOT0_IRQ_A_PIN 7
|
#define RD88F5182_PCI_SLOT0_IRQ_A_PIN 7
|
||||||
#define RD88F5182_PCI_SLOT0_IRQ_B_PIN 6
|
#define RD88F5182_PCI_SLOT0_IRQ_B_PIN 6
|
||||||
|
|
||||||
/*
|
|
||||||
* GPIO Debug LED
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define RD88F5182_GPIO_DBG_LED 0
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* 16M NOR Flash on Device bus CS1
|
* 16M NOR Flash on Device bus CS1
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -83,55 +77,32 @@ static struct platform_device rd88f5182_nor_flash = {
|
||||||
.resource = &rd88f5182_nor_flash_resource,
|
.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)
|
#define RD88F5182_GPIO_LED 0
|
||||||
{
|
|
||||||
int val;
|
|
||||||
|
|
||||||
if (evt == led_idle_end)
|
static struct gpio_led rd88f5182_gpio_led_pins[] = {
|
||||||
val = 1;
|
{
|
||||||
else if (evt == led_idle_start)
|
.name = "rd88f5182:cpu",
|
||||||
val = 0;
|
.default_trigger = "cpu0",
|
||||||
else
|
.gpio = RD88F5182_GPIO_LED,
|
||||||
return;
|
},
|
||||||
|
};
|
||||||
|
|
||||||
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)
|
static struct platform_device rd88f5182_gpio_leds = {
|
||||||
{
|
.name = "leds-gpio",
|
||||||
int pin;
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
if (machine_is_rd88f5182()) {
|
.platform_data = &rd88f5182_gpio_led_data,
|
||||||
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
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* PCI
|
* PCI
|
||||||
|
@ -298,6 +269,7 @@ static void __init rd88f5182_init(void)
|
||||||
|
|
||||||
orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
|
orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
|
||||||
platform_device_register(&rd88f5182_nor_flash);
|
platform_device_register(&rd88f5182_nor_flash);
|
||||||
|
platform_device_register(&rd88f5182_gpio_leds);
|
||||||
|
|
||||||
i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
|
i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include <linux/ethtool.h>
|
#include <linux/ethtool.h>
|
||||||
#include <net/dsa.h>
|
#include <net/dsa.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/pci.h>
|
#include <asm/mach/pci.h>
|
||||||
#include <mach/orion5x.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_RAUMFELD_SPEAKER) += raumfeld.o
|
||||||
obj-$(CONFIG_MACH_ZIPIT2) += z2.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
|
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 a new issue