ARM: SoC cleanups for v4.4
Again we have a sizable (but not huge) cleanup branch with a net delta of about -3k lines. Main contents here is: - A bunch of development/cleanup of a few PXA boards - Removal of bockw platforms on shmobile, since the platform has now gone completely multiplatform. Whee! - move of the 32kHz timer on OMAP to a proper timesource - Misc cleanup of older OMAP material (incl removal of one board file) - Switch over to new common PWM lookup support for several platforms There's also a handful of other cleanups across the tree, but the above are the major pieces. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWQCN8AAoJEIwa5zzehBx3WWUP/1uX+W9QDC3H1qrlVbHZRjGB ytvg/q/6pL9teBF4Dga2MAAKLTUomSLWL6xJGhsIUZJjgyik5KjbTMy6SJukk7VA R04nQ9oSYeaWP61X5glE6SndrKGBemfFUZ1+e6OKWEBSu9ScU678PfOcyzvOgILA +nE+13uGwSkIGTxLHGSHPFjj1/If/lZovb3MCAqXs76Hw/GkRN9jPvQrimJY/ndI ZqDDQEJzriB5BKpKMRfF+bwTRZzTKTv/pyvz8kfTzjs1u8DQ7zwNA2do3hm7iGRt Kf0OZZCRIyDIEXUQwUgr9KNasHLf+IH5A0edRUbP4gmMo3REiwCgkPhXXgbmR0pn +xtDHkMHg+KAWJYyeEJBCgwiOCZFpTw4fVKbq3aaOR7yagK9y0jdcFtid8BL0bfa iTauKpbApVlBG5EEjSNJSuIeeDzPsSf3mgLGQtZNyuR6XGMPj2cDzSrm94vnjuVJ 4gxslILTHtqpqg6jEsHZa/Ptd8G3VYQbja6MOvIsf0O8AULo8YpSU3P4RUbzX4Pq mUAFKzh9BuaSAMcLmwXCjy40f2DuzKTQUb2FkNFeompLGeCxTUh/2kuEJ9mxN5TB MstLTyqW2/Zu5RFnVUaI/G1vOkZ4ZDJeJIwPolG13ZwlCoTpnkWvLjJAVjChbpEX 0iBistrj5vXEFrjsAz6c =uI7R -----END PGP SIGNATURE----- Merge tag 'armsoc-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC cleanups from Olof Johansson: "Again we have a sizable (but not huge) cleanup branch with a net delta of about -3k lines. Main contents here is: - A bunch of development/cleanup of a few PXA boards - Removal of bockw platforms on shmobile, since the platform has now gone completely multiplatform. Whee! - move of the 32kHz timer on OMAP to a proper timesource - Misc cleanup of older OMAP material (incl removal of one board file) - Switch over to new common PWM lookup support for several platforms There's also a handful of other cleanups across the tree, but the above are the major pieces" * tag 'armsoc-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (103 commits) ARM: OMAP3: hwmod data: Remove legacy mailbox data and addrs ARM: DRA7: hwmod data: Remove spinlock hwmod addrs ARM: OMAP4: hwmod data: Remove spinlock hwmod addrs ARM: DRA7/AM335x/AM437x: hwmod: Remove gpmc address space from hwmod data ARM: Remove __ref on hotplug cpu die path ARM: Remove open-coded version of IRQCHIP_DECLARE arm: omap2: board-generic: use omap4_local_timer_init for AM437x ARM: DRA7/AM335x/AM437x: hwmod: Remove elm address space from hwmod data ARM: OMAP: Remove duplicated operand in OR operation clocksource: ti-32k: make it depend on GENERIC_CLOCKSOURCE ARM: pxa: remove incorrect __init annotation on pxa27x_set_pwrmode ARM: pxa: raumfeld: make some variables static ARM: OMAP: Change all cpu_is_* occurences to soc_is_* for id.c ARM: OMAP2+: Rename cpu_is macros to soc_is arm: omap2: timer: limit hwmod usage to non-DT boots arm: omap2+: select 32k clocksource driver clocksource: add TI 32.768 Hz counter driver arm: omap2: timer: rename omap_sync32k_timer_init() arm: omap2: timer: always call clocksource_of_init() when DT arm: omap2: timer: move realtime_counter_init() around ...
This commit is contained in:
commit
a5e1d715a8
|
@ -39,8 +39,6 @@ Boards:
|
|||
compatible = "renesas,armadillo800eva"
|
||||
- BOCK-W
|
||||
compatible = "renesas,bockw", "renesas,r8a7778"
|
||||
- BOCK-W - Reference Device Tree Implementation
|
||||
compatible = "renesas,bockw-reference", "renesas,r8a7778"
|
||||
- Genmai (RTK772100BC00000BR)
|
||||
compatible = "renesas,genmai", "renesas,r7s72100"
|
||||
- Gose
|
||||
|
@ -57,7 +55,3 @@ Boards:
|
|||
compatible = "renesas,lager", "renesas,r8a7790"
|
||||
- Marzen
|
||||
compatible = "renesas,marzen", "renesas,r8a7779"
|
||||
|
||||
Note: Reference Device Tree Implementations are temporary implementations
|
||||
to ease the migration from platform devices to Device Tree, and are
|
||||
intended to be removed in the future.
|
||||
|
|
|
@ -24,9 +24,9 @@ Required properties:
|
|||
Optional properties:
|
||||
- interrupts: Must contain a list of interrupt specifiers for memory
|
||||
controller interrupts, if available.
|
||||
- interrupts-names: Must contain a list of interrupt names corresponding to
|
||||
the interrupts in the interrupts property, if available.
|
||||
Valid interrupt names are:
|
||||
- interrupt-names: Must contain a list of interrupt names corresponding to
|
||||
the interrupts in the interrupts property, if available.
|
||||
Valid interrupt names are:
|
||||
- "sec" (secure interrupt)
|
||||
- "temp" (normal (temperature) interrupt)
|
||||
- power-domains: Must contain a reference to the PM domain that the memory
|
||||
|
|
|
@ -22,15 +22,10 @@ Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a
|
|||
found in include/linux/spi/pxa2xx_spi.h:
|
||||
|
||||
struct pxa2xx_spi_master {
|
||||
u32 clock_enable;
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_master.clock_enable" field is used to enable/disable the
|
||||
corresponding SSP peripheral block in the "Clock Enable Register (CKEN"). See
|
||||
the "PXA2xx Developer Manual" section "Clocks and Power Management".
|
||||
|
||||
The "pxa2xx_spi_master.num_chipselect" field is used to determine the number of
|
||||
slave device (chips) attached to this SPI master.
|
||||
|
||||
|
@ -57,7 +52,6 @@ static struct resource pxa_spi_nssp_resources[] = {
|
|||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_nssp_master_info = {
|
||||
.clock_enable = CKEN_NSSP, /* NSSP Peripheral clock */
|
||||
.num_chipselect = 1, /* Matches the number of chips attached to NSSP */
|
||||
.enable_dma = 1, /* Enables NSSP DMA */
|
||||
};
|
||||
|
|
|
@ -1516,8 +1516,6 @@ F: arch/arm/boot/dts/emev2*
|
|||
F: arch/arm/boot/dts/r7s*
|
||||
F: arch/arm/boot/dts/r8a*
|
||||
F: arch/arm/boot/dts/sh*
|
||||
F: arch/arm/configs/bockw_defconfig
|
||||
F: arch/arm/configs/marzen_defconfig
|
||||
F: arch/arm/configs/shmobile_defconfig
|
||||
F: arch/arm/include/debug/renesas-scif.S
|
||||
F: arch/arm/mach-shmobile/
|
||||
|
|
|
@ -621,28 +621,6 @@ config ARCH_PXA
|
|||
help
|
||||
Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
|
||||
|
||||
config ARCH_SHMOBILE_LEGACY
|
||||
bool "Renesas ARM SoCs (non-multiplatform)"
|
||||
select ARCH_SHMOBILE
|
||||
select ARM_PATCH_PHYS_VIRT if MMU
|
||||
select CLKDEV_LOOKUP
|
||||
select CPU_V7
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_ARM_SCU if SMP
|
||||
select HAVE_ARM_TWD if SMP
|
||||
select HAVE_SMP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select MULTI_IRQ_HANDLER
|
||||
select NO_IOPORT_MAP
|
||||
select PINCTRL
|
||||
select PM_GENERIC_DOMAINS if PM
|
||||
select SH_CLK_CPG
|
||||
select SPARSE_IRQ
|
||||
help
|
||||
Support for Renesas ARM SoC platforms using a non-multiplatform
|
||||
kernel. This includes the SH-Mobile, R-Mobile, EMMA-Mobile, R-Car
|
||||
and RZ families.
|
||||
|
||||
config ARCH_RPC
|
||||
bool "RiscPC"
|
||||
depends on MMU
|
||||
|
@ -1537,7 +1515,6 @@ config HZ_FIXED
|
|||
default 200 if ARCH_EBSA110 || ARCH_S3C24XX || \
|
||||
ARCH_S5PV210 || ARCH_EXYNOS4
|
||||
default 128 if SOC_AT91RM9200
|
||||
default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE_LEGACY
|
||||
default 0
|
||||
|
||||
choice
|
||||
|
@ -1756,8 +1733,7 @@ config ARM_MODULE_PLTS
|
|||
source "mm/Kconfig"
|
||||
|
||||
config FORCE_MAX_ZONEORDER
|
||||
int "Maximum zone order" if ARCH_SHMOBILE_LEGACY
|
||||
range 11 64 if ARCH_SHMOBILE_LEGACY
|
||||
int "Maximum zone order"
|
||||
default "12" if SOC_AM33XX
|
||||
default "9" if SA1111 || ARCH_EFM32
|
||||
default "11"
|
||||
|
|
|
@ -1621,8 +1621,7 @@ config DEBUG_UNCOMPRESS
|
|||
config UNCOMPRESS_INCLUDE
|
||||
string
|
||||
default "debug/uncompress.h" if ARCH_MULTIPLATFORM || ARCH_MSM || \
|
||||
PLAT_SAMSUNG || ARM_SINGLE_ARMV7M || \
|
||||
ARCH_SHMOBILE_LEGACY
|
||||
PLAT_SAMSUNG || ARM_SINGLE_ARMV7M
|
||||
default "mach/uncompress.h"
|
||||
|
||||
config EARLY_PRINTK
|
||||
|
|
|
@ -522,9 +522,6 @@ dtb-$(CONFIG_ARCH_S5PV210) += \
|
|||
s5pv210-smdkc110.dtb \
|
||||
s5pv210-smdkv210.dtb \
|
||||
s5pv210-torbreck.dtb
|
||||
dtb-$(CONFIG_ARCH_SHMOBILE_LEGACY) += \
|
||||
r8a7778-bockw.dtb \
|
||||
r8a7778-bockw-reference.dtb
|
||||
dtb-$(CONFIG_ARCH_SHMOBILE_MULTI) += \
|
||||
emev2-kzm9d.dtb \
|
||||
r7s72100-genmai.dtb \
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
};
|
||||
|
||||
i2c@4000a000 {
|
||||
efm32,location = <3>;
|
||||
energymicro,location = <3>;
|
||||
status = "ok";
|
||||
|
||||
temp@48 {
|
||||
|
@ -43,7 +43,7 @@
|
|||
|
||||
spi0: spi@4000c000 { /* USART0 */
|
||||
cs-gpios = <&gpio 68 1>; // E4
|
||||
location = <1>;
|
||||
energymicro,location = <1>;
|
||||
status = "ok";
|
||||
|
||||
microsd@0 {
|
||||
|
@ -57,7 +57,7 @@
|
|||
|
||||
spi1: spi@4000c400 { /* USART1 */
|
||||
cs-gpios = <&gpio 51 1>; // D3
|
||||
location = <1>;
|
||||
energymicro,location = <1>;
|
||||
status = "ok";
|
||||
|
||||
ks8851@0 {
|
||||
|
@ -70,7 +70,7 @@
|
|||
};
|
||||
|
||||
uart4: uart@4000e400 { /* UART1 */
|
||||
location = <2>;
|
||||
energymicro,location = <2>;
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
soc {
|
||||
adc: adc@40002000 {
|
||||
compatible = "efm32,adc";
|
||||
compatible = "energymicro,efm32-adc";
|
||||
reg = <0x40002000 0x400>;
|
||||
interrupts = <7>;
|
||||
clocks = <&cmu clk_HFPERCLKADC0>;
|
||||
|
@ -31,7 +31,7 @@
|
|||
};
|
||||
|
||||
gpio: gpio@40006000 {
|
||||
compatible = "efm32,gpio";
|
||||
compatible = "energymicro,efm32-gpio";
|
||||
reg = <0x40006000 0x1000>;
|
||||
interrupts = <1 11>;
|
||||
gpio-controller;
|
||||
|
@ -45,7 +45,7 @@
|
|||
i2c0: i2c@4000a000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "efm32,i2c";
|
||||
compatible = "energymicro,efm32-i2c";
|
||||
reg = <0x4000a000 0x400>;
|
||||
interrupts = <9>;
|
||||
clocks = <&cmu clk_HFPERCLKI2C0>;
|
||||
|
@ -56,7 +56,7 @@
|
|||
i2c1: i2c@4000a400 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "efm32,i2c";
|
||||
compatible = "energymicro,efm32-i2c";
|
||||
reg = <0x4000a400 0x400>;
|
||||
interrupts = <10>;
|
||||
clocks = <&cmu clk_HFPERCLKI2C1>;
|
||||
|
@ -67,7 +67,7 @@
|
|||
spi0: spi@4000c000 { /* USART0 */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "efm32,spi";
|
||||
compatible = "energymicro,efm32-spi";
|
||||
reg = <0x4000c000 0x400>;
|
||||
interrupts = <3 4>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART0>;
|
||||
|
@ -77,7 +77,7 @@
|
|||
spi1: spi@4000c400 { /* USART1 */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "efm32,spi";
|
||||
compatible = "energymicro,efm32-spi";
|
||||
reg = <0x4000c400 0x400>;
|
||||
interrupts = <15 16>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART1>;
|
||||
|
@ -87,7 +87,7 @@
|
|||
spi2: spi@4000c800 { /* USART2 */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "efm32,spi";
|
||||
compatible = "energymicro,efm32-spi";
|
||||
reg = <0x4000c800 0x400>;
|
||||
interrupts = <18 19>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART2>;
|
||||
|
@ -95,7 +95,7 @@
|
|||
};
|
||||
|
||||
uart0: uart@4000c000 { /* USART0 */
|
||||
compatible = "efm32,uart";
|
||||
compatible = "energymicro,efm32-uart";
|
||||
reg = <0x4000c000 0x400>;
|
||||
interrupts = <3 4>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART0>;
|
||||
|
@ -103,7 +103,7 @@
|
|||
};
|
||||
|
||||
uart1: uart@4000c400 { /* USART1 */
|
||||
compatible = "efm32,uart";
|
||||
compatible = "energymicro,efm32-uart";
|
||||
reg = <0x4000c400 0x400>;
|
||||
interrupts = <15 16>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART1>;
|
||||
|
@ -111,7 +111,7 @@
|
|||
};
|
||||
|
||||
uart2: uart@4000c800 { /* USART2 */
|
||||
compatible = "efm32,uart";
|
||||
compatible = "energymicro,efm32-uart";
|
||||
reg = <0x4000c800 0x400>;
|
||||
interrupts = <18 19>;
|
||||
clocks = <&cmu clk_HFPERCLKUSART2>;
|
||||
|
@ -119,7 +119,7 @@
|
|||
};
|
||||
|
||||
uart3: uart@4000e000 { /* UART0 */
|
||||
compatible = "efm32,uart";
|
||||
compatible = "energymicro,efm32-uart";
|
||||
reg = <0x4000e000 0x400>;
|
||||
interrupts = <20 21>;
|
||||
clocks = <&cmu clk_HFPERCLKUART0>;
|
||||
|
@ -127,7 +127,7 @@
|
|||
};
|
||||
|
||||
uart4: uart@4000e400 { /* UART1 */
|
||||
compatible = "efm32,uart";
|
||||
compatible = "energymicro,efm32-uart";
|
||||
reg = <0x4000e400 0x400>;
|
||||
interrupts = <22 23>;
|
||||
clocks = <&cmu clk_HFPERCLKUART1>;
|
||||
|
@ -135,28 +135,28 @@
|
|||
};
|
||||
|
||||
timer0: timer@40010000 {
|
||||
compatible = "efm32,timer";
|
||||
compatible = "energymicro,efm32-timer";
|
||||
reg = <0x40010000 0x400>;
|
||||
interrupts = <2>;
|
||||
clocks = <&cmu clk_HFPERCLKTIMER0>;
|
||||
};
|
||||
|
||||
timer1: timer@40010400 {
|
||||
compatible = "efm32,timer";
|
||||
compatible = "energymicro,efm32-timer";
|
||||
reg = <0x40010400 0x400>;
|
||||
interrupts = <12>;
|
||||
clocks = <&cmu clk_HFPERCLKTIMER1>;
|
||||
};
|
||||
|
||||
timer2: timer@40010800 {
|
||||
compatible = "efm32,timer";
|
||||
compatible = "energymicro,efm32-timer";
|
||||
reg = <0x40010800 0x400>;
|
||||
interrupts = <13>;
|
||||
clocks = <&cmu clk_HFPERCLKTIMER2>;
|
||||
};
|
||||
|
||||
timer3: timer@40010c00 {
|
||||
compatible = "efm32,timer";
|
||||
compatible = "energymicro,efm32-timer";
|
||||
reg = <0x40010c00 0x400>;
|
||||
interrupts = <14>;
|
||||
clocks = <&cmu clk_HFPERCLKTIMER3>;
|
||||
|
|
|
@ -1,139 +0,0 @@
|
|||
/*
|
||||
* Reference Device Tree Source for the Bock-W board
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* based on r8a7779
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Simon Horman
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "r8a7778.dtsi"
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
/ {
|
||||
model = "bockw";
|
||||
compatible = "renesas,bockw-reference", "renesas,r8a7778";
|
||||
|
||||
aliases {
|
||||
serial0 = &scif0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "ignore_loglevel root=/dev/nfs ip=dhcp rw";
|
||||
stdout-path = &scif0;
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x60000000 0x10000000>;
|
||||
};
|
||||
|
||||
fixedregulator3v3: fixedregulator@0 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-3.3V";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ethernet@18300000 {
|
||||
compatible = "smsc,lan9220", "smsc,lan9115";
|
||||
reg = <0x18300000 0x1000>;
|
||||
|
||||
phy-mode = "mii";
|
||||
interrupt-parent = <&irqpin>;
|
||||
interrupts = <0 IRQ_TYPE_EDGE_FALLING>;
|
||||
reg-io-width = <4>;
|
||||
vddvario-supply = <&fixedregulator3v3>;
|
||||
vdd33a-supply = <&fixedregulator3v3>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&mmcif {
|
||||
pinctrl-0 = <&mmc_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
vmmc-supply = <&fixedregulator3v3>;
|
||||
bus-width = <8>;
|
||||
broken-cd;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&irqpin {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tmu0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pfc {
|
||||
scif0_pins: serial0 {
|
||||
renesas,groups = "scif0_data_a", "scif0_ctrl";
|
||||
renesas,function = "scif0";
|
||||
};
|
||||
|
||||
mmc_pins: mmc {
|
||||
renesas,groups = "mmc_data8", "mmc_ctrl";
|
||||
renesas,function = "mmc";
|
||||
};
|
||||
|
||||
sdhi0_pins: sd0 {
|
||||
renesas,groups = "sdhi0_data4", "sdhi0_ctrl",
|
||||
"sdhi0_cd";
|
||||
renesas,function = "sdhi0";
|
||||
};
|
||||
|
||||
hspi0_pins: hspi0 {
|
||||
renesas,groups = "hspi0_a";
|
||||
renesas,function = "hspi0";
|
||||
};
|
||||
};
|
||||
|
||||
&sdhi0 {
|
||||
pinctrl-0 = <&sdhi0_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
vmmc-supply = <&fixedregulator3v3>;
|
||||
bus-width = <4>;
|
||||
status = "okay";
|
||||
wp-gpios = <&gpio3 18 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&hspi0 {
|
||||
pinctrl-0 = <&hspi0_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
flash: flash@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spansion,s25fl008k", "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <104000000>;
|
||||
m25p,fast-read;
|
||||
|
||||
partition@0 {
|
||||
label = "data(spi)";
|
||||
reg = <0x00000000 0x00100000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&scif0 {
|
||||
pinctrl-0 = <&scif0_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
status = "okay";
|
||||
};
|
|
@ -1,133 +0,0 @@
|
|||
# CONFIG_ARM_PATCH_PHYS_VIRT is not set
|
||||
CONFIG_KERNEL_LZMA=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_ARCH_SHMOBILE_LEGACY=y
|
||||
CONFIG_ARCH_R8A7778=y
|
||||
CONFIG_MACH_BOCKW=y
|
||||
CONFIG_MEMORY_START=0x60000000
|
||||
CONFIG_MEMORY_SIZE=0x10000000
|
||||
CONFIG_SHMOBILE_TIMER_HZ=1024
|
||||
# CONFIG_SH_TIMER_CMT is not set
|
||||
# CONFIG_EM_TIMER_STI is not set
|
||||
CONFIG_ARM_ERRATA_430973=y
|
||||
CONFIG_ARM_ERRATA_458693=y
|
||||
CONFIG_ARM_ERRATA_460075=y
|
||||
CONFIG_ARM_ERRATA_743622=y
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_VFP=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_PM=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CIRRUS is not set
|
||||
# CONFIG_NET_VENDOR_FARADAY is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
CONFIG_SMSC911X=y
|
||||
# CONFIG_NET_VENDOR_STMICRO is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
# CONFIG_INPUT is not set
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
CONFIG_SERIAL_SH_SCI=y
|
||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=6
|
||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_RCAR=y
|
||||
CONFIG_GPIO_RCAR=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_MEDIA_SUPPORT=y
|
||||
CONFIG_MEDIA_CAMERA_SUPPORT=y
|
||||
CONFIG_V4L_PLATFORM_DRIVERS=y
|
||||
CONFIG_SOC_CAMERA=y
|
||||
CONFIG_VIDEO_RCAR_VIN=y
|
||||
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
|
||||
CONFIG_VIDEO_ML86V7667=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SH_HSPI=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_SND_SOC_RCAR=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_OHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_EHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_RCAR_PHY=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHI=y
|
||||
CONFIG_MMC_SH_MMCIF=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_RX8581=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_RCAR_HPB_DMAE=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_UIO_PDRV_GENIRQ=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_NFS_V4_1=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_ARM_UNWIND is not set
|
||||
CONFIG_AVERAGE=y
|
|
@ -71,7 +71,7 @@ int psci_cpu_disable(unsigned int cpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void __ref psci_cpu_die(unsigned int cpu)
|
||||
void psci_cpu_die(unsigned int cpu)
|
||||
{
|
||||
u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
|
||||
PSCI_0_2_POWER_STATE_TYPE_SHIFT;
|
||||
|
@ -83,7 +83,7 @@ void __ref psci_cpu_die(unsigned int cpu)
|
|||
panic("psci: cpu %d failed to shutdown\n", cpu);
|
||||
}
|
||||
|
||||
int __ref psci_cpu_kill(unsigned int cpu)
|
||||
int psci_cpu_kill(unsigned int cpu)
|
||||
{
|
||||
int err, i;
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/cpu_pm.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -265,7 +266,7 @@ static int __init exynos_pmu_irq_init(struct device_node *node,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define EXYNOS_PMU_IRQ(symbol, name) OF_DECLARE_2(irqchip, symbol, name, exynos_pmu_irq_init)
|
||||
#define EXYNOS_PMU_IRQ(symbol, name) IRQCHIP_DECLARE(symbol, name, exynos_pmu_irq_init)
|
||||
|
||||
EXYNOS_PMU_IRQ(exynos3250_pmu_irq, "samsung,exynos3250-pmu");
|
||||
EXYNOS_PMU_IRQ(exynos4210_pmu_irq, "samsung,exynos4210-pmu");
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
@ -271,12 +272,7 @@ static int __init imx_gpc_init(struct device_node *node,
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot use the IRQCHIP_DECLARE macro that lives in
|
||||
* drivers/irqchip, so we're forced to roll our own. Not very nice.
|
||||
*/
|
||||
OF_DECLARE_2(irqchip, imx_gpc, "fsl,imx6q-gpc", imx_gpc_init);
|
||||
IRQCHIP_DECLARE(imx_gpc, "fsl,imx6q-gpc", imx_gpc_init);
|
||||
|
||||
void __init imx_gpc_check_dt(void)
|
||||
{
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/mbus.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
@ -105,27 +104,6 @@ static void __init mvebu_memblock_reserve(void)
|
|||
static void __init mvebu_memblock_reserve(void) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Early versions of Armada 375 SoC have a bug where the BootROM
|
||||
* leaves an external data abort pending. The kernel is hit by this
|
||||
* data abort as soon as it enters userspace, because it unmasks the
|
||||
* data aborts at this moment. We register a custom abort handler
|
||||
* below to ignore the first data abort to work around this
|
||||
* problem.
|
||||
*/
|
||||
static int armada_375_external_abort_wa(unsigned long addr, unsigned int fsr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
static int ignore_first;
|
||||
|
||||
if (!ignore_first && fsr == 0x1406) {
|
||||
ignore_first = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void __init mvebu_init_irq(void)
|
||||
{
|
||||
irqchip_init();
|
||||
|
@ -134,17 +112,6 @@ static void __init mvebu_init_irq(void)
|
|||
BUG_ON(mvebu_mbus_dt_init(coherency_available()));
|
||||
}
|
||||
|
||||
static void __init external_abort_quirk(void)
|
||||
{
|
||||
u32 dev, rev;
|
||||
|
||||
if (mvebu_get_soc_id(&dev, &rev) == 0 && rev > ARMADA_375_Z1_REV)
|
||||
return;
|
||||
|
||||
hook_fault_code(16 + 6, armada_375_external_abort_wa, SIGBUS, 0,
|
||||
"imprecise external abort");
|
||||
}
|
||||
|
||||
static void __init i2c_quirk(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
@ -177,8 +144,6 @@ static void __init mvebu_dt_init(void)
|
|||
{
|
||||
if (of_machine_is_compatible("marvell,armadaxp"))
|
||||
i2c_quirk();
|
||||
if (of_machine_is_compatible("marvell,a375-db"))
|
||||
external_abort_quirk();
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
|
|
@ -296,11 +296,11 @@ int armada_370_xp_pmsu_idle_enter(unsigned long deepidle)
|
|||
/* Test the CR_C bit and set it if it was cleared */
|
||||
asm volatile(
|
||||
"mrc p15, 0, r0, c1, c0, 0 \n\t"
|
||||
"tst r0, #(1 << 2) \n\t"
|
||||
"tst r0, %0 \n\t"
|
||||
"orreq r0, r0, #(1 << 2) \n\t"
|
||||
"mcreq p15, 0, r0, c1, c0, 0 \n\t"
|
||||
"isb "
|
||||
: : : "r0");
|
||||
: : "Ir" (CR_C) : "r0");
|
||||
|
||||
pr_debug("Failed to suspend the system\n");
|
||||
|
||||
|
|
|
@ -90,13 +90,6 @@ config MACH_OMAP_FSAMPLE
|
|||
Support for TI OMAP 850 F-Sample board. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_VOICEBLUE
|
||||
bool "Voiceblue"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP15XX
|
||||
help
|
||||
Support for Voiceblue GSM/VoIP gateway. Say Y here if you have
|
||||
such a board.
|
||||
|
||||
config MACH_OMAP_PALMTE
|
||||
bool "Palm Tungsten E"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP15XX
|
||||
|
|
|
@ -37,7 +37,6 @@ obj-$(CONFIG_MACH_OMAP_FSAMPLE) += board-fsample.o board-nand.o
|
|||
obj-$(CONFIG_MACH_OMAP_OSK) += board-osk.o
|
||||
obj-$(CONFIG_MACH_OMAP_H3) += board-h3.o board-h3-mmc.o \
|
||||
board-nand.o
|
||||
obj-$(CONFIG_MACH_VOICEBLUE) += board-voiceblue.o
|
||||
obj-$(CONFIG_MACH_OMAP_PALMTE) += board-palmte.o
|
||||
obj-$(CONFIG_MACH_OMAP_PALMZ71) += board-palmz71.o
|
||||
obj-$(CONFIG_MACH_OMAP_PALMTT) += board-palmtt.o
|
||||
|
|
|
@ -1,296 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap1/board-voiceblue.c
|
||||
*
|
||||
* Modified from board-generic.c
|
||||
*
|
||||
* Copyright (C) 2004 2N Telekomunikace, Ladislav Michl <michl@2n.cz>
|
||||
*
|
||||
* Code for OMAP5910 based VoiceBlue board (VoIP to GSM gateway).
|
||||
*
|
||||
* 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/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/board-voiceblue.h>
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <mach/tc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
static struct plat_serial8250_port voiceblue_ports[] = {
|
||||
{
|
||||
.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x40000),
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 1,
|
||||
.uartclk = 3686400,
|
||||
},
|
||||
{
|
||||
.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x50000),
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 1,
|
||||
.uartclk = 3686400,
|
||||
},
|
||||
{
|
||||
.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x60000),
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 1,
|
||||
.uartclk = 3686400,
|
||||
},
|
||||
{
|
||||
.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x70000),
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 1,
|
||||
.uartclk = 3686400,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_PLATFORM1,
|
||||
};
|
||||
|
||||
static int __init ext_uart_init(void)
|
||||
{
|
||||
if (!machine_is_voiceblue())
|
||||
return -ENODEV;
|
||||
|
||||
voiceblue_ports[0].irq = gpio_to_irq(12);
|
||||
voiceblue_ports[1].irq = gpio_to_irq(13);
|
||||
voiceblue_ports[2].irq = gpio_to_irq(14);
|
||||
voiceblue_ports[3].irq = gpio_to_irq(15);
|
||||
serial_device.dev.platform_data = voiceblue_ports;
|
||||
return platform_device_register(&serial_device);
|
||||
}
|
||||
arch_initcall(ext_uart_init);
|
||||
|
||||
static struct physmap_flash_data voiceblue_flash_data = {
|
||||
.width = 2,
|
||||
.set_vpp = omap1_set_vpp,
|
||||
};
|
||||
|
||||
static struct resource voiceblue_flash_resource = {
|
||||
.start = OMAP_CS0_PHYS,
|
||||
.end = OMAP_CS0_PHYS + SZ_32M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device voiceblue_flash_device = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &voiceblue_flash_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = &voiceblue_flash_resource,
|
||||
};
|
||||
|
||||
static struct smc91x_platdata voiceblue_smc91x_info = {
|
||||
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||
.leda = RPC_LED_100_10,
|
||||
.ledb = RPC_LED_TX_RX,
|
||||
};
|
||||
|
||||
static struct resource voiceblue_smc91x_resources[] = {
|
||||
[0] = {
|
||||
.start = OMAP_CS2_PHYS + 0x300,
|
||||
.end = OMAP_CS2_PHYS + 0x300 + 16,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device voiceblue_smc91x_device = {
|
||||
.name = "smc91x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &voiceblue_smc91x_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(voiceblue_smc91x_resources),
|
||||
.resource = voiceblue_smc91x_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *voiceblue_devices[] __initdata = {
|
||||
&voiceblue_flash_device,
|
||||
&voiceblue_smc91x_device,
|
||||
};
|
||||
|
||||
static struct omap_usb_config voiceblue_usb_config __initdata = {
|
||||
.hmc_mode = 3,
|
||||
.register_host = 1,
|
||||
.register_dev = 1,
|
||||
.pins[0] = 2,
|
||||
.pins[1] = 6,
|
||||
.pins[2] = 6,
|
||||
};
|
||||
|
||||
#define MACHINE_PANICED 1
|
||||
#define MACHINE_REBOOTING 2
|
||||
#define MACHINE_REBOOT 4
|
||||
static unsigned long machine_state;
|
||||
|
||||
static int panic_event(struct notifier_block *this, unsigned long event,
|
||||
void *ptr)
|
||||
{
|
||||
if (test_and_set_bit(MACHINE_PANICED, &machine_state))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Flash power LED */
|
||||
omap_writeb(0x78, OMAP_LPG1_LCR);
|
||||
omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block panic_block = {
|
||||
.notifier_call = panic_event,
|
||||
};
|
||||
|
||||
static int __init voiceblue_setup(void)
|
||||
{
|
||||
if (!machine_is_voiceblue())
|
||||
return -ENODEV;
|
||||
|
||||
/* Setup panic notifier */
|
||||
atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(voiceblue_setup);
|
||||
|
||||
static int wdt_gpio_state;
|
||||
|
||||
void voiceblue_wdt_enable(void)
|
||||
{
|
||||
gpio_direction_output(0, 0);
|
||||
gpio_set_value(0, 1);
|
||||
gpio_set_value(0, 0);
|
||||
wdt_gpio_state = 0;
|
||||
}
|
||||
|
||||
void voiceblue_wdt_disable(void)
|
||||
{
|
||||
gpio_set_value(0, 0);
|
||||
gpio_set_value(0, 1);
|
||||
gpio_set_value(0, 0);
|
||||
gpio_direction_input(0);
|
||||
}
|
||||
|
||||
void voiceblue_wdt_ping(void)
|
||||
{
|
||||
if (test_bit(MACHINE_REBOOT, &machine_state))
|
||||
return;
|
||||
|
||||
wdt_gpio_state = !wdt_gpio_state;
|
||||
gpio_set_value(0, wdt_gpio_state);
|
||||
}
|
||||
|
||||
static void voiceblue_restart(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
/*
|
||||
* Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28
|
||||
* "Global Software Reset Affects Traffic Controller Frequency".
|
||||
*/
|
||||
if (cpu_is_omap5912()) {
|
||||
omap_writew(omap_readw(DPLL_CTL) & ~(1 << 4), DPLL_CTL);
|
||||
omap_writew(0x8, ARM_RSTCT1);
|
||||
}
|
||||
|
||||
set_bit(MACHINE_REBOOT, &machine_state);
|
||||
voiceblue_wdt_enable();
|
||||
while (1) ;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(voiceblue_wdt_enable);
|
||||
EXPORT_SYMBOL(voiceblue_wdt_disable);
|
||||
EXPORT_SYMBOL(voiceblue_wdt_ping);
|
||||
|
||||
static void __init voiceblue_init(void)
|
||||
{
|
||||
/* mux pins for uarts */
|
||||
omap_cfg_reg(UART1_TX);
|
||||
omap_cfg_reg(UART1_RTS);
|
||||
omap_cfg_reg(UART2_TX);
|
||||
omap_cfg_reg(UART2_RTS);
|
||||
omap_cfg_reg(UART3_TX);
|
||||
omap_cfg_reg(UART3_RX);
|
||||
|
||||
/* Watchdog */
|
||||
gpio_request(0, "Watchdog");
|
||||
/* smc91x reset */
|
||||
gpio_request(7, "SMC91x reset");
|
||||
gpio_direction_output(7, 1);
|
||||
udelay(2); /* wait at least 100ns */
|
||||
gpio_set_value(7, 0);
|
||||
mdelay(50); /* 50ms until PHY ready */
|
||||
/* smc91x interrupt pin */
|
||||
gpio_request(8, "SMC91x irq");
|
||||
/* 16C554 reset*/
|
||||
gpio_request(6, "16C554 reset");
|
||||
gpio_direction_output(6, 0);
|
||||
/* 16C554 interrupt pins */
|
||||
gpio_request(12, "16C554 irq");
|
||||
gpio_request(13, "16C554 irq");
|
||||
gpio_request(14, "16C554 irq");
|
||||
gpio_request(15, "16C554 irq");
|
||||
irq_set_irq_type(gpio_to_irq(12), IRQ_TYPE_EDGE_RISING);
|
||||
irq_set_irq_type(gpio_to_irq(13), IRQ_TYPE_EDGE_RISING);
|
||||
irq_set_irq_type(gpio_to_irq(14), IRQ_TYPE_EDGE_RISING);
|
||||
irq_set_irq_type(gpio_to_irq(15), IRQ_TYPE_EDGE_RISING);
|
||||
|
||||
voiceblue_smc91x_resources[1].start = gpio_to_irq(8);
|
||||
voiceblue_smc91x_resources[1].end = gpio_to_irq(8);
|
||||
platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
|
||||
omap_serial_init();
|
||||
omap1_usb_init(&voiceblue_usb_config);
|
||||
omap_register_i2c_bus(1, 100, NULL, 0);
|
||||
|
||||
/* There is a good chance board is going up, so enable power LED
|
||||
* (it is connected through invertor) */
|
||||
omap_writeb(0x00, OMAP_LPG1_LCR);
|
||||
omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */
|
||||
}
|
||||
|
||||
MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
|
||||
/* Maintainer: Ladislav Michl <michl@2n.cz> */
|
||||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.init_irq = omap1_init_irq,
|
||||
.handle_irq = omap1_handle_irq,
|
||||
.init_machine = voiceblue_init,
|
||||
.init_late = omap1_init_late,
|
||||
.init_time = omap1_timer_init,
|
||||
.restart = voiceblue_restart,
|
||||
MACHINE_END
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 2N Telekomunikace, Ladislav Michl <michl@2n.cz>
|
||||
*
|
||||
* Hardware definitions for OMAP5910 based VoiceBlue board.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_VOICEBLUE_H
|
||||
#define __ASM_ARCH_VOICEBLUE_H
|
||||
|
||||
extern void voiceblue_wdt_enable(void);
|
||||
extern void voiceblue_wdt_disable(void);
|
||||
extern void voiceblue_wdt_ping(void);
|
||||
|
||||
#endif /* __ASM_ARCH_VOICEBLUE_H */
|
||||
|
|
@ -97,6 +97,7 @@ config ARCH_OMAP2PLUS
|
|||
select PINCTRL
|
||||
select SOC_BUS
|
||||
select OMAP_IRQCHIP
|
||||
select CLKSRC_TI_32K
|
||||
help
|
||||
Systems based on OMAP2, OMAP3, OMAP4 or OMAP5
|
||||
|
||||
|
|
|
@ -48,11 +48,9 @@ AFLAGS_sleep44xx.o :=-Wa,-march=armv7-a$(plus_sec)
|
|||
# Functions loaded to SRAM
|
||||
obj-$(CONFIG_SOC_OMAP2420) += sram242x.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += sram243x.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += sram34xx.o
|
||||
|
||||
AFLAGS_sram242x.o :=-Wa,-march=armv6
|
||||
AFLAGS_sram243x.o :=-Wa,-march=armv6
|
||||
AFLAGS_sram34xx.o :=-Wa,-march=armv7-a
|
||||
|
||||
# Restart code (OMAP4/5 currently in omap4-common.c)
|
||||
obj-$(CONFIG_SOC_OMAP2420) += omap2-restart.o
|
||||
|
@ -186,7 +184,6 @@ obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpllcore.o
|
|||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_virt_prcm_set.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpll.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(clock-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clkt34xx_dpll3m2.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(clock-common)
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(clock-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(clock-common)
|
||||
|
|
|
@ -46,7 +46,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")
|
|||
.map_io = omap242x_map_io,
|
||||
.init_early = omap2420_init_early,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_time = omap2_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.dt_compat = omap242x_boards_compat,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
@ -63,7 +63,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")
|
|||
.map_io = omap243x_map_io,
|
||||
.init_early = omap2430_init_early,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_time = omap2_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.dt_compat = omap243x_boards_compat,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
@ -82,7 +82,7 @@ DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board")
|
|||
.init_early = omap3430_init_early,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_late = omap3_init_late,
|
||||
.init_time = omap3_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.dt_compat = n900_boards_compat,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
@ -100,7 +100,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")
|
|||
.init_early = omap3430_init_early,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_late = omap3_init_late,
|
||||
.init_time = omap3_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.dt_compat = omap3_boards_compat,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
@ -117,7 +117,7 @@ DT_MACHINE_START(OMAP36XX_DT, "Generic OMAP36xx (Flattened Device Tree)")
|
|||
.init_early = omap3630_init_early,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_late = omap3_init_late,
|
||||
.init_time = omap3_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.dt_compat = omap36xx_boards_compat,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
@ -276,7 +276,7 @@ DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)")
|
|||
.init_late = am43xx_init_late,
|
||||
.init_irq = omap_gic_of_init,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_time = omap3_gptimer_timer_init,
|
||||
.init_time = omap4_local_timer_init,
|
||||
.dt_compat = am43_boards_compat,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -424,6 +424,6 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")
|
|||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_ldp_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.init_time = omap3_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -136,6 +136,6 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
|
|||
.init_irq = omap3_init_irq,
|
||||
.init_machine = rx51_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.init_time = omap3_sync32k_timer_init,
|
||||
.init_time = omap_init_time,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
* OMAP34xx M2 divider clock code
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2010 Nokia Corporation
|
||||
*
|
||||
* Paul Walmsley
|
||||
* Jouni Högander
|
||||
*
|
||||
* Parts of this code are based on code written by
|
||||
* Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock3xxx.h"
|
||||
#include "sdrc.h"
|
||||
#include "sram.h"
|
||||
|
||||
#define CYCLES_PER_MHZ 1000000
|
||||
|
||||
struct clk *sdrc_ick_p, *arm_fck_p;
|
||||
|
||||
/*
|
||||
* CORE DPLL (DPLL3) M2 divider rate programming functions
|
||||
*
|
||||
* These call into SRAM code to do the actual CM writes, since the SDRAM
|
||||
* is clocked from DPLL3.
|
||||
*/
|
||||
|
||||
/**
|
||||
* omap3_core_dpll_m2_set_rate - set CORE DPLL M2 divider
|
||||
* @clk: struct clk * of DPLL to set
|
||||
* @rate: rounded target rate
|
||||
*
|
||||
* Program the DPLL M2 divider with the rounded target rate. Returns
|
||||
* -EINVAL upon error, or 0 upon success.
|
||||
*/
|
||||
int omap3_core_dpll_m2_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 new_div = 0;
|
||||
u32 unlock_dll = 0;
|
||||
u32 c;
|
||||
unsigned long validrate, sdrcrate, _mpurate;
|
||||
struct omap_sdrc_params *sdrc_cs0;
|
||||
struct omap_sdrc_params *sdrc_cs1;
|
||||
int ret;
|
||||
unsigned long clkrate;
|
||||
|
||||
if (!clk || !rate)
|
||||
return -EINVAL;
|
||||
|
||||
new_div = DIV_ROUND_UP(parent_rate, rate);
|
||||
validrate = parent_rate / new_div;
|
||||
|
||||
if (validrate != rate)
|
||||
return -EINVAL;
|
||||
|
||||
sdrcrate = clk_get_rate(sdrc_ick_p);
|
||||
clkrate = clk_hw_get_rate(hw);
|
||||
if (rate > clkrate)
|
||||
sdrcrate <<= ((rate / clkrate) >> 1);
|
||||
else
|
||||
sdrcrate >>= ((clkrate / rate) >> 1);
|
||||
|
||||
ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) {
|
||||
pr_debug("clock: will unlock SDRC DLL\n");
|
||||
unlock_dll = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX This only needs to be done when the CPU frequency changes
|
||||
*/
|
||||
_mpurate = clk_get_rate(arm_fck_p) / CYCLES_PER_MHZ;
|
||||
c = (_mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT;
|
||||
c += 1; /* for safety */
|
||||
c *= SDRC_MPURATE_LOOPS;
|
||||
c >>= SDRC_MPURATE_SCALE;
|
||||
if (c == 0)
|
||||
c = 1;
|
||||
|
||||
pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n",
|
||||
clkrate, validrate);
|
||||
pr_debug("clock: SDRC CS0 timing params used: RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
|
||||
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
|
||||
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr);
|
||||
if (sdrc_cs1)
|
||||
pr_debug("clock: SDRC CS1 timing params used: RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
|
||||
sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
|
||||
sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
|
||||
|
||||
if (sdrc_cs1)
|
||||
omap3_configure_core_dpll(
|
||||
new_div, unlock_dll, c, rate > clkrate,
|
||||
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
|
||||
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
|
||||
sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
|
||||
sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
|
||||
else
|
||||
omap3_configure_core_dpll(
|
||||
new_div, unlock_dll, c, rate > clkrate,
|
||||
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
|
||||
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
|
||||
0, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -88,8 +88,7 @@ static inline int omap_mux_late_init(void)
|
|||
|
||||
extern void omap2_init_common_infrastructure(void);
|
||||
|
||||
extern void omap2_sync32k_timer_init(void);
|
||||
extern void omap3_sync32k_timer_init(void);
|
||||
extern void omap_init_time(void);
|
||||
extern void omap3_secure_sync32k_timer_init(void);
|
||||
extern void omap3_gptimer_timer_init(void);
|
||||
extern void omap4_local_timer_init(void);
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
#include "devices.h"
|
||||
#include "display.h"
|
||||
|
||||
#define L3_MODULES_MAX_LEN 12
|
||||
|
@ -67,58 +66,6 @@ static int __init omap3_l3_init(void)
|
|||
}
|
||||
omap_postcore_initcall(omap3_l3_init);
|
||||
|
||||
#if defined(CONFIG_IOMMU_API)
|
||||
|
||||
#include <linux/platform_data/iommu-omap.h>
|
||||
|
||||
static struct resource omap3isp_resources[] = {
|
||||
{
|
||||
.start = OMAP3430_ISP_BASE,
|
||||
.end = OMAP3430_ISP_BASE + 0x12fc,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = OMAP3430_ISP_BASE2,
|
||||
.end = OMAP3430_ISP_BASE2 + 0x0600,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = 24 + OMAP_INTC_START,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device omap3isp_device = {
|
||||
.name = "omap3isp",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(omap3isp_resources),
|
||||
.resource = omap3isp_resources,
|
||||
};
|
||||
|
||||
static struct omap_iommu_arch_data omap3_isp_iommu = {
|
||||
.name = "mmu_isp",
|
||||
};
|
||||
|
||||
int omap3_init_camera(struct isp_platform_data *pdata)
|
||||
{
|
||||
if (of_have_populated_dt())
|
||||
omap3_isp_iommu.name = "480bd400.mmu";
|
||||
|
||||
omap3isp_device.dev.platform_data = pdata;
|
||||
omap3isp_device.dev.archdata.iommu = &omap3_isp_iommu;
|
||||
|
||||
return platform_device_register(&omap3isp_device);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_IOMMU_API */
|
||||
|
||||
int omap3_init_camera(struct isp_platform_data *pdata)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OMAP2PLUS_MBOX) || defined(CONFIG_OMAP2PLUS_MBOX_MODULE)
|
||||
static inline void __init omap_init_mbox(void)
|
||||
{
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-omap2/devices.h
|
||||
*
|
||||
* OMAP2 platform device setup/initialization
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_MACH_OMAP_DEVICES_H
|
||||
#define __ARCH_ARM_MACH_OMAP_DEVICES_H
|
||||
|
||||
struct isp_platform_data;
|
||||
|
||||
int omap3_init_camera(struct isp_platform_data *pdata);
|
||||
|
||||
#endif
|
|
@ -57,15 +57,15 @@ int omap_type(void)
|
|||
if (val < OMAP2_DEVICETYPE_MASK)
|
||||
return val;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
if (soc_is_omap24xx()) {
|
||||
val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
|
||||
} else if (cpu_is_ti81xx()) {
|
||||
} else if (soc_is_ti81xx()) {
|
||||
val = omap_ctrl_readl(TI81XX_CONTROL_STATUS);
|
||||
} else if (soc_is_am33xx() || soc_is_am43xx()) {
|
||||
val = omap_ctrl_readl(AM33XX_CONTROL_STATUS);
|
||||
} else if (cpu_is_omap34xx()) {
|
||||
} else if (soc_is_omap34xx()) {
|
||||
val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
} else if (soc_is_omap44xx()) {
|
||||
val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
|
||||
} else if (soc_is_omap54xx() || soc_is_dra7xx()) {
|
||||
val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS);
|
||||
|
@ -122,7 +122,7 @@ static u16 tap_prod_id;
|
|||
|
||||
void omap_get_die_id(struct omap_die_id *odi)
|
||||
{
|
||||
if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
|
||||
if (soc_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
|
||||
odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);
|
||||
odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);
|
||||
odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2);
|
||||
|
@ -218,17 +218,17 @@ static void __init omap3_cpuinfo(void)
|
|||
* on available features. Upon detection, update the CPU id
|
||||
* and CPU class bits.
|
||||
*/
|
||||
if (cpu_is_omap3630()) {
|
||||
if (soc_is_omap3630()) {
|
||||
cpu_name = "OMAP3630";
|
||||
} else if (soc_is_am35xx()) {
|
||||
cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";
|
||||
} else if (cpu_is_ti816x()) {
|
||||
} else if (soc_is_ti816x()) {
|
||||
cpu_name = "TI816X";
|
||||
} else if (soc_is_am335x()) {
|
||||
cpu_name = "AM335X";
|
||||
} else if (soc_is_am437x()) {
|
||||
cpu_name = "AM437x";
|
||||
} else if (cpu_is_ti814x()) {
|
||||
} else if (soc_is_ti814x()) {
|
||||
cpu_name = "TI814X";
|
||||
} else if (omap3_has_iva() && omap3_has_sgx()) {
|
||||
/* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
|
||||
|
@ -275,11 +275,11 @@ void __init omap3xxx_check_features(void)
|
|||
OMAP3_CHECK_FEATURE(status, SGX);
|
||||
OMAP3_CHECK_FEATURE(status, NEON);
|
||||
OMAP3_CHECK_FEATURE(status, ISP);
|
||||
if (cpu_is_omap3630())
|
||||
if (soc_is_omap3630())
|
||||
omap_features |= OMAP3_HAS_192MHZ_CLK;
|
||||
if (cpu_is_omap3430() || cpu_is_omap3630())
|
||||
if (soc_is_omap3430() || soc_is_omap3630())
|
||||
omap_features |= OMAP3_HAS_IO_WAKEUP;
|
||||
if (cpu_is_omap3630() || omap_rev() == OMAP3430_REV_ES3_1 ||
|
||||
if (soc_is_omap3630() || omap_rev() == OMAP3430_REV_ES3_1 ||
|
||||
omap_rev() == OMAP3430_REV_ES3_1_2)
|
||||
omap_features |= OMAP3_HAS_IO_CHAIN_CTRL;
|
||||
|
||||
|
@ -701,7 +701,7 @@ void __init omap2_set_globals_tap(u32 class, void __iomem *tap)
|
|||
tap_base = tap;
|
||||
|
||||
/* XXX What is this intended to do? */
|
||||
if (cpu_is_omap34xx())
|
||||
if (soc_is_omap34xx())
|
||||
tap_prod_id = 0x0210;
|
||||
else
|
||||
tap_prod_id = 0x0208;
|
||||
|
@ -719,11 +719,11 @@ static const char * const omap_types[] = {
|
|||
|
||||
static const char * __init omap_get_family(void)
|
||||
{
|
||||
if (cpu_is_omap24xx())
|
||||
if (soc_is_omap24xx())
|
||||
return kasprintf(GFP_KERNEL, "OMAP2");
|
||||
else if (cpu_is_omap34xx())
|
||||
else if (soc_is_omap34xx())
|
||||
return kasprintf(GFP_KERNEL, "OMAP3");
|
||||
else if (cpu_is_omap44xx())
|
||||
else if (soc_is_omap44xx())
|
||||
return kasprintf(GFP_KERNEL, "OMAP4");
|
||||
else if (soc_is_omap54xx())
|
||||
return kasprintf(GFP_KERNEL, "OMAP5");
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
* platform-specific code to shutdown a CPU
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref omap4_cpu_die(unsigned int cpu)
|
||||
void omap4_cpu_die(unsigned int cpu)
|
||||
{
|
||||
unsigned int boot_cpu = 0;
|
||||
void __iomem *base = omap_get_wakeupgen_base();
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -330,7 +331,7 @@ static int irq_cpu_hotplug_notify(struct notifier_block *self,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __refdata irq_hotplug_notifier = {
|
||||
static struct notifier_block irq_hotplug_notifier = {
|
||||
.notifier_call = irq_cpu_hotplug_notify,
|
||||
};
|
||||
|
||||
|
@ -540,9 +541,4 @@ static int __init wakeupgen_init(struct device_node *node,
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot use the IRQCHIP_DECLARE macro that lives in
|
||||
* drivers/irqchip, so we're forced to roll our own. Not very nice.
|
||||
*/
|
||||
OF_DECLARE_2(irqchip, ti_wakeupgen, "ti,omap4-wugen-mpu", wakeupgen_init);
|
||||
IRQCHIP_DECLARE(ti_wakeupgen, "ti,omap4-wugen-mpu", wakeupgen_init);
|
||||
|
|
|
@ -152,20 +152,10 @@ struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = {
|
|||
.user = OCP_USER_MPU,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space am33xx_elm_addr_space[] = {
|
||||
{
|
||||
.pa_start = 0x48080000,
|
||||
.pa_end = 0x48080000 + SZ_8K - 1,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
struct omap_hwmod_ocp_if am33xx_l4_ls__elm = {
|
||||
.master = &am33xx_l4_ls_hwmod,
|
||||
.slave = &am33xx_elm_hwmod,
|
||||
.clk = "l4ls_gclk",
|
||||
.addr = am33xx_elm_addr_space,
|
||||
.user = OCP_USER_MPU,
|
||||
};
|
||||
|
||||
|
@ -285,20 +275,10 @@ struct omap_hwmod_ocp_if am33xx_epwmss2__ehrpwm2 = {
|
|||
};
|
||||
|
||||
/* l3s cfg -> gpmc */
|
||||
static struct omap_hwmod_addr_space am33xx_gpmc_addr_space[] = {
|
||||
{
|
||||
.pa_start = 0x50000000,
|
||||
.pa_end = 0x50000000 + SZ_8K - 1,
|
||||
.flags = ADDR_TYPE_RT,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
struct omap_hwmod_ocp_if am33xx_l3_s__gpmc = {
|
||||
.master = &am33xx_l3_s_hwmod,
|
||||
.slave = &am33xx_gpmc_hwmod,
|
||||
.clk = "l3s_gclk",
|
||||
.addr = am33xx_gpmc_addr_space,
|
||||
.user = OCP_USER_MPU,
|
||||
};
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
#include <linux/platform_data/iommu-omap.h>
|
||||
#include <linux/platform_data/mailbox-omap.h>
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#include "soc.h"
|
||||
|
@ -1506,26 +1505,9 @@ static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
|
|||
.sysc = &omap3xxx_mailbox_sysc,
|
||||
};
|
||||
|
||||
static struct omap_mbox_dev_info omap3xxx_mailbox_info[] = {
|
||||
{ .name = "dsp", .tx_id = 0, .rx_id = 1 },
|
||||
};
|
||||
|
||||
static struct omap_mbox_pdata omap3xxx_mailbox_attrs = {
|
||||
.num_users = 2,
|
||||
.num_fifos = 2,
|
||||
.info_cnt = ARRAY_SIZE(omap3xxx_mailbox_info),
|
||||
.info = omap3xxx_mailbox_info,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = {
|
||||
{ .irq = 26 + OMAP_INTC_START, },
|
||||
{ .irq = -1 },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_mailbox_hwmod = {
|
||||
.name = "mailbox",
|
||||
.class = &omap3xxx_mailbox_hwmod_class,
|
||||
.mpu_irqs = omap3xxx_mailbox_irqs,
|
||||
.main_clk = "mailboxes_ick",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
|
@ -1536,7 +1518,6 @@ static struct omap_hwmod omap3xxx_mailbox_hwmod = {
|
|||
.idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &omap3xxx_mailbox_attrs,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -3276,20 +3257,10 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = {
|
|||
.user = OCP_USER_MPU,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap3xxx_mailbox_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x48094000,
|
||||
.pa_end = 0x480941ff,
|
||||
.flags = ADDR_TYPE_RT,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
/* l4_core -> mailbox */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_mailbox_hwmod,
|
||||
.addr = omap3xxx_mailbox_addrs,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
|
|
@ -4471,21 +4471,11 @@ static struct omap_hwmod_ocp_if omap44xx_l4_cfg__smartreflex_mpu = {
|
|||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_spinlock_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4a0f6000,
|
||||
.pa_end = 0x4a0f6fff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
/* l4_cfg -> spinlock */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__spinlock = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_spinlock_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.addr = omap44xx_spinlock_addrs,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
|
|
@ -1844,8 +1844,7 @@ static struct omap_hwmod_class_sysconfig omap54xx_usb_host_hs_sysc = {
|
|||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x0010,
|
||||
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS |
|
||||
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_RESET_STATUS),
|
||||
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
|
||||
MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
|
||||
|
|
|
@ -2566,21 +2566,11 @@ static struct omap_hwmod_ocp_if dra7xx_l3_main_1__hdmi = {
|
|||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space dra7xx_elm_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x48078000,
|
||||
.pa_end = 0x48078fff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
/* l4_per1 -> elm */
|
||||
static struct omap_hwmod_ocp_if dra7xx_l4_per1__elm = {
|
||||
.master = &dra7xx_l4_per1_hwmod,
|
||||
.slave = &dra7xx_elm_hwmod,
|
||||
.clk = "l3_iclk_div",
|
||||
.addr = dra7xx_elm_addrs,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
@ -2648,21 +2638,11 @@ static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio8 = {
|
|||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space dra7xx_gpmc_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x50000000,
|
||||
.pa_end = 0x500003ff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
/* l3_main_1 -> gpmc */
|
||||
static struct omap_hwmod_ocp_if dra7xx_l3_main_1__gpmc = {
|
||||
.master = &dra7xx_l3_main_1_hwmod,
|
||||
.slave = &dra7xx_gpmc_hwmod,
|
||||
.clk = "l3_iclk_div",
|
||||
.addr = dra7xx_gpmc_addrs,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
@ -3029,21 +3009,11 @@ static struct omap_hwmod_ocp_if dra7xx_l4_cfg__smartreflex_mpu = {
|
|||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space dra7xx_spinlock_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4a0f6000,
|
||||
.pa_end = 0x4a0f6fff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
/* l4_cfg -> spinlock */
|
||||
static struct omap_hwmod_ocp_if dra7xx_l4_cfg__spinlock = {
|
||||
.master = &dra7xx_l4_cfg_hwmod,
|
||||
.slave = &dra7xx_spinlock_hwmod,
|
||||
.clk = "l3_iclk_div",
|
||||
.addr = dra7xx_spinlock_addrs,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
|
|
@ -210,7 +210,7 @@ static inline int omap4plus_init_static_deps(const struct static_dep_map *map)
|
|||
}
|
||||
|
||||
map++;
|
||||
};
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -582,7 +582,7 @@ void __init omap3xxx_powerdomains_init(void)
|
|||
|
||||
/* Only 81xx needs custom pwrdm_operations */
|
||||
if (!cpu_is_ti81xx())
|
||||
pwrdm_register_platform_funcs(&omap3_pwrdm_operations);;
|
||||
pwrdm_register_platform_funcs(&omap3_pwrdm_operations);
|
||||
|
||||
rev = omap_rev();
|
||||
|
||||
|
|
|
@ -129,9 +129,9 @@ int omap_type(void);
|
|||
|
||||
/*
|
||||
* omap_rev bits:
|
||||
* CPU id bits (0730, 1510, 1710, 2422...) [31:16]
|
||||
* CPU revision (See _REV_ defined in cpu.h) [15:08]
|
||||
* CPU class bits (15xx, 16xx, 24xx, 34xx...) [07:00]
|
||||
* SoC id bits (0730, 1510, 1710, 2422...) [31:16]
|
||||
* SoC revision (See _REV_ defined in cpu.h) [15:08]
|
||||
* SoC class bits (15xx, 16xx, 24xx, 34xx...) [07:00]
|
||||
*/
|
||||
unsigned int omap_rev(void);
|
||||
|
||||
|
@ -141,20 +141,20 @@ static inline int soc_is_omap(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Get the CPU revision for OMAP devices
|
||||
* Get the SoC revision for OMAP devices
|
||||
*/
|
||||
#define GET_OMAP_REVISION() ((omap_rev() >> 8) & 0xff)
|
||||
|
||||
/*
|
||||
* Macros to group OMAP into cpu classes.
|
||||
* These can be used in most places.
|
||||
* cpu_is_omap24xx(): True for OMAP2420, OMAP2422, OMAP2423, OMAP2430
|
||||
* cpu_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423
|
||||
* cpu_is_omap243x(): True for OMAP2430
|
||||
* cpu_is_omap343x(): True for OMAP3430
|
||||
* cpu_is_omap443x(): True for OMAP4430
|
||||
* cpu_is_omap446x(): True for OMAP4460
|
||||
* cpu_is_omap447x(): True for OMAP4470
|
||||
* soc_is_omap24xx(): True for OMAP2420, OMAP2422, OMAP2423, OMAP2430
|
||||
* soc_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423
|
||||
* soc_is_omap243x(): True for OMAP2430
|
||||
* soc_is_omap343x(): True for OMAP3430
|
||||
* soc_is_omap443x(): True for OMAP4430
|
||||
* soc_is_omap446x(): True for OMAP4460
|
||||
* soc_is_omap447x(): True for OMAP4470
|
||||
* soc_is_omap543x(): True for OMAP5430, OMAP5432
|
||||
*/
|
||||
#define GET_OMAP_CLASS (omap_rev() & 0xff)
|
||||
|
@ -225,23 +225,23 @@ IS_TI_SUBCLASS(814x, 0x814)
|
|||
IS_AM_SUBCLASS(335x, 0x335)
|
||||
IS_AM_SUBCLASS(437x, 0x437)
|
||||
|
||||
#define cpu_is_omap24xx() 0
|
||||
#define cpu_is_omap242x() 0
|
||||
#define cpu_is_omap243x() 0
|
||||
#define cpu_is_omap34xx() 0
|
||||
#define cpu_is_omap343x() 0
|
||||
#define cpu_is_ti81xx() 0
|
||||
#define cpu_is_ti816x() 0
|
||||
#define cpu_is_ti814x() 0
|
||||
#define soc_is_omap24xx() 0
|
||||
#define soc_is_omap242x() 0
|
||||
#define soc_is_omap243x() 0
|
||||
#define soc_is_omap34xx() 0
|
||||
#define soc_is_omap343x() 0
|
||||
#define soc_is_ti81xx() 0
|
||||
#define soc_is_ti816x() 0
|
||||
#define soc_is_ti814x() 0
|
||||
#define soc_is_am35xx() 0
|
||||
#define soc_is_am33xx() 0
|
||||
#define soc_is_am335x() 0
|
||||
#define soc_is_am43xx() 0
|
||||
#define soc_is_am437x() 0
|
||||
#define cpu_is_omap44xx() 0
|
||||
#define cpu_is_omap443x() 0
|
||||
#define cpu_is_omap446x() 0
|
||||
#define cpu_is_omap447x() 0
|
||||
#define soc_is_omap44xx() 0
|
||||
#define soc_is_omap443x() 0
|
||||
#define soc_is_omap446x() 0
|
||||
#define soc_is_omap447x() 0
|
||||
#define soc_is_omap54xx() 0
|
||||
#define soc_is_omap543x() 0
|
||||
#define soc_is_dra7xx() 0
|
||||
|
@ -250,54 +250,54 @@ IS_AM_SUBCLASS(437x, 0x437)
|
|||
|
||||
#if defined(MULTI_OMAP2)
|
||||
# if defined(CONFIG_ARCH_OMAP2)
|
||||
# undef cpu_is_omap24xx
|
||||
# define cpu_is_omap24xx() is_omap24xx()
|
||||
# undef soc_is_omap24xx
|
||||
# define soc_is_omap24xx() is_omap24xx()
|
||||
# endif
|
||||
# if defined (CONFIG_SOC_OMAP2420)
|
||||
# undef cpu_is_omap242x
|
||||
# define cpu_is_omap242x() is_omap242x()
|
||||
# undef soc_is_omap242x
|
||||
# define soc_is_omap242x() is_omap242x()
|
||||
# endif
|
||||
# if defined (CONFIG_SOC_OMAP2430)
|
||||
# undef cpu_is_omap243x
|
||||
# define cpu_is_omap243x() is_omap243x()
|
||||
# undef soc_is_omap243x
|
||||
# define soc_is_omap243x() is_omap243x()
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP3)
|
||||
# undef cpu_is_omap34xx
|
||||
# undef cpu_is_omap343x
|
||||
# define cpu_is_omap34xx() is_omap34xx()
|
||||
# define cpu_is_omap343x() is_omap343x()
|
||||
# undef soc_is_omap34xx
|
||||
# undef soc_is_omap343x
|
||||
# define soc_is_omap34xx() is_omap34xx()
|
||||
# define soc_is_omap343x() is_omap343x()
|
||||
# endif
|
||||
#else
|
||||
# if defined(CONFIG_ARCH_OMAP2)
|
||||
# undef cpu_is_omap24xx
|
||||
# define cpu_is_omap24xx() 1
|
||||
# undef soc_is_omap24xx
|
||||
# define soc_is_omap24xx() 1
|
||||
# endif
|
||||
# if defined(CONFIG_SOC_OMAP2420)
|
||||
# undef cpu_is_omap242x
|
||||
# define cpu_is_omap242x() 1
|
||||
# undef soc_is_omap242x
|
||||
# define soc_is_omap242x() 1
|
||||
# endif
|
||||
# if defined(CONFIG_SOC_OMAP2430)
|
||||
# undef cpu_is_omap243x
|
||||
# define cpu_is_omap243x() 1
|
||||
# undef soc_is_omap243x
|
||||
# define soc_is_omap243x() 1
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP3)
|
||||
# undef cpu_is_omap34xx
|
||||
# define cpu_is_omap34xx() 1
|
||||
# undef soc_is_omap34xx
|
||||
# define soc_is_omap34xx() 1
|
||||
# endif
|
||||
# if defined(CONFIG_SOC_OMAP3430)
|
||||
# undef cpu_is_omap343x
|
||||
# define cpu_is_omap343x() 1
|
||||
# undef soc_is_omap343x
|
||||
# define soc_is_omap343x() 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Macros to detect individual cpu types.
|
||||
* These are only rarely needed.
|
||||
* cpu_is_omap2420(): True for OMAP2420
|
||||
* cpu_is_omap2422(): True for OMAP2422
|
||||
* cpu_is_omap2423(): True for OMAP2423
|
||||
* cpu_is_omap2430(): True for OMAP2430
|
||||
* cpu_is_omap3430(): True for OMAP3430
|
||||
* soc_is_omap2420(): True for OMAP2420
|
||||
* soc_is_omap2422(): True for OMAP2422
|
||||
* soc_is_omap2423(): True for OMAP2423
|
||||
* soc_is_omap2430(): True for OMAP2430
|
||||
* soc_is_omap3430(): True for OMAP3430
|
||||
*/
|
||||
#define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff)
|
||||
|
||||
|
@ -313,51 +313,51 @@ IS_OMAP_TYPE(2423, 0x2423)
|
|||
IS_OMAP_TYPE(2430, 0x2430)
|
||||
IS_OMAP_TYPE(3430, 0x3430)
|
||||
|
||||
#define cpu_is_omap2420() 0
|
||||
#define cpu_is_omap2422() 0
|
||||
#define cpu_is_omap2423() 0
|
||||
#define cpu_is_omap2430() 0
|
||||
#define cpu_is_omap3430() 0
|
||||
#define cpu_is_omap3630() 0
|
||||
#define soc_is_omap2420() 0
|
||||
#define soc_is_omap2422() 0
|
||||
#define soc_is_omap2423() 0
|
||||
#define soc_is_omap2430() 0
|
||||
#define soc_is_omap3430() 0
|
||||
#define soc_is_omap3630() 0
|
||||
#define soc_is_omap5430() 0
|
||||
|
||||
/* These are needed for the common code */
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
#define cpu_is_omap7xx() 0
|
||||
#define cpu_is_omap15xx() 0
|
||||
#define cpu_is_omap16xx() 0
|
||||
#define cpu_is_omap1510() 0
|
||||
#define cpu_is_omap1610() 0
|
||||
#define cpu_is_omap1611() 0
|
||||
#define cpu_is_omap1621() 0
|
||||
#define cpu_is_omap1710() 0
|
||||
#define soc_is_omap7xx() 0
|
||||
#define soc_is_omap15xx() 0
|
||||
#define soc_is_omap16xx() 0
|
||||
#define soc_is_omap1510() 0
|
||||
#define soc_is_omap1610() 0
|
||||
#define soc_is_omap1611() 0
|
||||
#define soc_is_omap1621() 0
|
||||
#define soc_is_omap1710() 0
|
||||
#define cpu_class_is_omap1() 0
|
||||
#define cpu_class_is_omap2() 1
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2)
|
||||
# undef cpu_is_omap2420
|
||||
# undef cpu_is_omap2422
|
||||
# undef cpu_is_omap2423
|
||||
# undef cpu_is_omap2430
|
||||
# define cpu_is_omap2420() is_omap2420()
|
||||
# define cpu_is_omap2422() is_omap2422()
|
||||
# define cpu_is_omap2423() is_omap2423()
|
||||
# define cpu_is_omap2430() is_omap2430()
|
||||
# undef soc_is_omap2420
|
||||
# undef soc_is_omap2422
|
||||
# undef soc_is_omap2423
|
||||
# undef soc_is_omap2430
|
||||
# define soc_is_omap2420() is_omap2420()
|
||||
# define soc_is_omap2422() is_omap2422()
|
||||
# define soc_is_omap2423() is_omap2423()
|
||||
# define soc_is_omap2430() is_omap2430()
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
# undef cpu_is_omap3430
|
||||
# undef cpu_is_ti81xx
|
||||
# undef cpu_is_ti816x
|
||||
# undef cpu_is_ti814x
|
||||
# undef soc_is_omap3430
|
||||
# undef soc_is_ti81xx
|
||||
# undef soc_is_ti816x
|
||||
# undef soc_is_ti814x
|
||||
# undef soc_is_am35xx
|
||||
# define cpu_is_omap3430() is_omap3430()
|
||||
# undef cpu_is_omap3630
|
||||
# define cpu_is_omap3630() is_omap363x()
|
||||
# define cpu_is_ti81xx() is_ti81xx()
|
||||
# define cpu_is_ti816x() is_ti816x()
|
||||
# define cpu_is_ti814x() is_ti814x()
|
||||
# define soc_is_omap3430() is_omap3430()
|
||||
# undef soc_is_omap3630
|
||||
# define soc_is_omap3630() is_omap363x()
|
||||
# define soc_is_ti81xx() is_ti81xx()
|
||||
# define soc_is_ti816x() is_ti816x()
|
||||
# define soc_is_ti814x() is_ti814x()
|
||||
# define soc_is_am35xx() is_am35xx()
|
||||
#endif
|
||||
|
||||
|
@ -376,14 +376,14 @@ IS_OMAP_TYPE(3430, 0x3430)
|
|||
#endif
|
||||
|
||||
# if defined(CONFIG_ARCH_OMAP4)
|
||||
# undef cpu_is_omap44xx
|
||||
# undef cpu_is_omap443x
|
||||
# undef cpu_is_omap446x
|
||||
# undef cpu_is_omap447x
|
||||
# define cpu_is_omap44xx() is_omap44xx()
|
||||
# define cpu_is_omap443x() is_omap443x()
|
||||
# define cpu_is_omap446x() is_omap446x()
|
||||
# define cpu_is_omap447x() is_omap447x()
|
||||
# undef soc_is_omap44xx
|
||||
# undef soc_is_omap443x
|
||||
# undef soc_is_omap446x
|
||||
# undef soc_is_omap447x
|
||||
# define soc_is_omap44xx() is_omap44xx()
|
||||
# define soc_is_omap443x() is_omap443x()
|
||||
# define soc_is_omap446x() is_omap446x()
|
||||
# define soc_is_omap447x() is_omap447x()
|
||||
# endif
|
||||
|
||||
# if defined(CONFIG_SOC_OMAP5)
|
||||
|
@ -556,5 +556,22 @@ level(__##fn);
|
|||
#define omap_late_initcall(fn) omap_initcall(late_initcall, fn)
|
||||
#define omap_late_initcall_sync(fn) omap_initcall(late_initcall_sync, fn)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
/* Legacy defines, these can be removed when users are removed */
|
||||
#define cpu_is_omap2420() soc_is_omap2420()
|
||||
#define cpu_is_omap2422() soc_is_omap2422()
|
||||
#define cpu_is_omap242x() soc_is_omap242x()
|
||||
#define cpu_is_omap2430() soc_is_omap2430()
|
||||
#define cpu_is_omap243x() soc_is_omap243x()
|
||||
#define cpu_is_omap24xx() soc_is_omap24xx()
|
||||
#define cpu_is_omap3430() soc_is_omap3430()
|
||||
#define cpu_is_omap343x() soc_is_omap343x()
|
||||
#define cpu_is_omap34xx() soc_is_omap34xx()
|
||||
#define cpu_is_omap3630() soc_is_omap3630()
|
||||
#define cpu_is_omap443x() soc_is_omap443x()
|
||||
#define cpu_is_omap446x() soc_is_omap446x()
|
||||
#define cpu_is_omap44xx() soc_is_omap44xx()
|
||||
#define cpu_is_ti814x() soc_is_ti814x()
|
||||
#define cpu_is_ti816x() soc_is_ti816x()
|
||||
#define cpu_is_ti81xx() soc_is_ti81xx()
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
|
|
@ -211,35 +211,10 @@ static inline int omap243x_sram_init(void)
|
|||
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
|
||||
static u32 (*_omap3_sram_configure_core_dpll)(
|
||||
u32 m2, u32 unlock_dll, u32 f, u32 inc,
|
||||
u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
|
||||
u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
|
||||
u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
|
||||
u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
|
||||
|
||||
u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc,
|
||||
u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
|
||||
u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
|
||||
u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
|
||||
u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1)
|
||||
{
|
||||
BUG_ON(!_omap3_sram_configure_core_dpll);
|
||||
return _omap3_sram_configure_core_dpll(
|
||||
m2, unlock_dll, f, inc,
|
||||
sdrc_rfr_ctrl_0, sdrc_actim_ctrl_a_0,
|
||||
sdrc_actim_ctrl_b_0, sdrc_mr_0,
|
||||
sdrc_rfr_ctrl_1, sdrc_actim_ctrl_a_1,
|
||||
sdrc_actim_ctrl_b_1, sdrc_mr_1);
|
||||
}
|
||||
|
||||
void omap3_sram_restore_context(void)
|
||||
{
|
||||
omap_sram_reset();
|
||||
|
||||
_omap3_sram_configure_core_dpll =
|
||||
omap_sram_push(omap3_sram_configure_core_dpll,
|
||||
omap3_sram_configure_core_dpll_sz);
|
||||
omap_push_sram_idle();
|
||||
}
|
||||
|
||||
|
|
|
@ -15,12 +15,6 @@ extern void omap2_sram_reprogram_sdrc(u32 perf_level, u32 dll_val,
|
|||
u32 mem_type);
|
||||
extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass);
|
||||
|
||||
extern u32 omap3_configure_core_dpll(
|
||||
u32 m2, u32 unlock_dll, u32 f, u32 inc,
|
||||
u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
|
||||
u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
|
||||
u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
|
||||
u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
|
||||
extern void omap3_sram_restore_context(void);
|
||||
|
||||
/* Do not use these */
|
||||
|
@ -52,14 +46,6 @@ extern void omap243x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val,
|
|||
u32 mem_type);
|
||||
extern unsigned long omap243x_sram_reprogram_sdrc_sz;
|
||||
|
||||
extern u32 omap3_sram_configure_core_dpll(
|
||||
u32 m2, u32 unlock_dll, u32 f, u32 inc,
|
||||
u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
|
||||
u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
|
||||
u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
|
||||
u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
|
||||
extern unsigned long omap3_sram_configure_core_dpll_sz;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
extern void omap_push_sram_idle(void);
|
||||
#else
|
||||
|
|
|
@ -1,346 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap3/sram.S
|
||||
*
|
||||
* Omap3 specific functions that need to be run in internal SRAM
|
||||
*
|
||||
* Copyright (C) 2004, 2007, 2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2008 Nokia Corporation
|
||||
*
|
||||
* Rajendra Nayak <rnayak@ti.com>
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
* Paul Walmsley
|
||||
*
|
||||
* 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/linkage.h>
|
||||
|
||||
#include <asm/assembler.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "iomap.h"
|
||||
#include "sdrc.h"
|
||||
#include "cm3xxx.h"
|
||||
|
||||
/*
|
||||
* This file needs be built unconditionally as ARM to interoperate correctly
|
||||
* with non-Thumb-2-capable firmware.
|
||||
*/
|
||||
.arm
|
||||
|
||||
.text
|
||||
|
||||
/* r1 parameters */
|
||||
#define SDRC_NO_UNLOCK_DLL 0x0
|
||||
#define SDRC_UNLOCK_DLL 0x1
|
||||
|
||||
/* SDRC_DLLA_CTRL bit settings */
|
||||
#define FIXEDDELAY_SHIFT 24
|
||||
#define FIXEDDELAY_MASK (0xff << FIXEDDELAY_SHIFT)
|
||||
#define DLLIDLE_MASK 0x4
|
||||
|
||||
/*
|
||||
* SDRC_DLLA_CTRL default values: TI hardware team indicates that
|
||||
* FIXEDDELAY should be initialized to 0xf. This apparently was
|
||||
* empirically determined during process testing, so no derivation
|
||||
* was provided.
|
||||
*/
|
||||
#define FIXEDDELAY_DEFAULT (0x0f << FIXEDDELAY_SHIFT)
|
||||
|
||||
/* SDRC_DLLA_STATUS bit settings */
|
||||
#define LOCKSTATUS_MASK 0x4
|
||||
|
||||
/* SDRC_POWER bit settings */
|
||||
#define SRFRONIDLEREQ_MASK 0x40
|
||||
|
||||
/* CM_IDLEST1_CORE bit settings */
|
||||
#define ST_SDRC_MASK 0x2
|
||||
|
||||
/* CM_ICLKEN1_CORE bit settings */
|
||||
#define EN_SDRC_MASK 0x2
|
||||
|
||||
/* CM_CLKSEL1_PLL bit settings */
|
||||
#define CORE_DPLL_CLKOUT_DIV_SHIFT 0x1b
|
||||
|
||||
/*
|
||||
* omap3_sram_configure_core_dpll - change DPLL3 M2 divider
|
||||
*
|
||||
* Params passed in registers:
|
||||
* r0 = new M2 divider setting (only 1 and 2 supported right now)
|
||||
* r1 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for
|
||||
* SDRC rates < 83MHz
|
||||
* r2 = number of MPU cycles to wait for SDRC to stabilize after
|
||||
* reprogramming the SDRC when switching to a slower MPU speed
|
||||
* r3 = increasing SDRC rate? (1 = yes, 0 = no)
|
||||
*
|
||||
* Params passed via the stack. The needed params will be copied in SRAM
|
||||
* before use by the code in SRAM (SDRAM is not accessible during SDRC
|
||||
* reconfiguration):
|
||||
* new SDRC_RFR_CTRL_0 register contents
|
||||
* new SDRC_ACTIM_CTRL_A_0 register contents
|
||||
* new SDRC_ACTIM_CTRL_B_0 register contents
|
||||
* new SDRC_MR_0 register value
|
||||
* new SDRC_RFR_CTRL_1 register contents
|
||||
* new SDRC_ACTIM_CTRL_A_1 register contents
|
||||
* new SDRC_ACTIM_CTRL_B_1 register contents
|
||||
* new SDRC_MR_1 register value
|
||||
*
|
||||
* If the param SDRC_RFR_CTRL_1 is 0, the parameters are not programmed into
|
||||
* the SDRC CS1 registers
|
||||
*
|
||||
* NOTE: This code no longer attempts to program the SDRC AC timing and MR
|
||||
* registers. This is because the code currently cannot ensure that all
|
||||
* L3 initiators (e.g., sDMA, IVA, DSS DISPC, etc.) are not accessing the
|
||||
* SDRAM when the registers are written. If the registers are changed while
|
||||
* an initiator is accessing SDRAM, memory can be corrupted and/or the SDRC
|
||||
* may enter an unpredictable state. In the future, the intent is to
|
||||
* re-enable this code in cases where we can ensure that no initiators are
|
||||
* touching the SDRAM. Until that time, users who know that their use case
|
||||
* can satisfy the above requirement can enable the CONFIG_OMAP3_SDRC_AC_TIMING
|
||||
* option.
|
||||
*
|
||||
* Richard Woodruff notes that any changes to this code must be carefully
|
||||
* audited and tested to ensure that they don't cause a TLB miss while
|
||||
* the SDRAM is inaccessible. Such a situation will crash the system
|
||||
* since it will cause the ARM MMU to attempt to walk the page tables.
|
||||
* These crashes may be intermittent.
|
||||
*/
|
||||
.align 3
|
||||
ENTRY(omap3_sram_configure_core_dpll)
|
||||
stmfd sp!, {r1-r12, lr} @ store regs to stack
|
||||
|
||||
@ pull the extra args off the stack
|
||||
@ and store them in SRAM
|
||||
|
||||
/*
|
||||
* PC-relative stores are deprecated in ARMv7 and lead to undefined behaviour
|
||||
* in Thumb-2: use a r7 as a base instead.
|
||||
* Be careful not to clobber r7 when maintaing this file.
|
||||
*/
|
||||
THUMB( adr r7, omap3_sram_configure_core_dpll )
|
||||
.macro strtext Rt:req, label:req
|
||||
ARM( str \Rt, \label )
|
||||
THUMB( str \Rt, [r7, \label - omap3_sram_configure_core_dpll] )
|
||||
.endm
|
||||
|
||||
ldr r4, [sp, #52]
|
||||
strtext r4, omap_sdrc_rfr_ctrl_0_val
|
||||
ldr r4, [sp, #56]
|
||||
strtext r4, omap_sdrc_actim_ctrl_a_0_val
|
||||
ldr r4, [sp, #60]
|
||||
strtext r4, omap_sdrc_actim_ctrl_b_0_val
|
||||
ldr r4, [sp, #64]
|
||||
strtext r4, omap_sdrc_mr_0_val
|
||||
ldr r4, [sp, #68]
|
||||
strtext r4, omap_sdrc_rfr_ctrl_1_val
|
||||
cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0,
|
||||
beq skip_cs1_params @ do not use cs1 params
|
||||
ldr r4, [sp, #72]
|
||||
strtext r4, omap_sdrc_actim_ctrl_a_1_val
|
||||
ldr r4, [sp, #76]
|
||||
strtext r4, omap_sdrc_actim_ctrl_b_1_val
|
||||
ldr r4, [sp, #80]
|
||||
strtext r4, omap_sdrc_mr_1_val
|
||||
skip_cs1_params:
|
||||
mrc p15, 0, r8, c1, c0, 0 @ read ctrl register
|
||||
bic r10, r8, #0x800 @ clear Z-bit, disable branch prediction
|
||||
mcr p15, 0, r10, c1, c0, 0 @ write ctrl register
|
||||
dsb @ flush buffered writes to interconnect
|
||||
isb @ prevent speculative exec past here
|
||||
cmp r3, #1 @ if increasing SDRC clk rate,
|
||||
bleq configure_sdrc @ program the SDRC regs early (for RFR)
|
||||
cmp r1, #SDRC_UNLOCK_DLL @ set the intended DLL state
|
||||
bleq unlock_dll
|
||||
blne lock_dll
|
||||
bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC
|
||||
bl configure_core_dpll @ change the DPLL3 M2 divider
|
||||
mov r12, r2
|
||||
bl wait_clk_stable @ wait for SDRC to stabilize
|
||||
bl enable_sdrc @ take SDRC out of idle
|
||||
cmp r1, #SDRC_UNLOCK_DLL @ wait for DLL status to change
|
||||
bleq wait_dll_unlock
|
||||
blne wait_dll_lock
|
||||
cmp r3, #1 @ if increasing SDRC clk rate,
|
||||
beq return_to_sdram @ return to SDRAM code, otherwise,
|
||||
bl configure_sdrc @ reprogram SDRC regs now
|
||||
return_to_sdram:
|
||||
mcr p15, 0, r8, c1, c0, 0 @ restore ctrl register
|
||||
isb @ prevent speculative exec past here
|
||||
mov r0, #0 @ return value
|
||||
ldmfd sp!, {r1-r12, pc} @ restore regs and return
|
||||
unlock_dll:
|
||||
ldr r11, omap3_sdrc_dlla_ctrl
|
||||
ldr r12, [r11]
|
||||
bic r12, r12, #FIXEDDELAY_MASK
|
||||
orr r12, r12, #FIXEDDELAY_DEFAULT
|
||||
orr r12, r12, #DLLIDLE_MASK
|
||||
str r12, [r11] @ (no OCP barrier needed)
|
||||
bx lr
|
||||
lock_dll:
|
||||
ldr r11, omap3_sdrc_dlla_ctrl
|
||||
ldr r12, [r11]
|
||||
bic r12, r12, #DLLIDLE_MASK
|
||||
str r12, [r11] @ (no OCP barrier needed)
|
||||
bx lr
|
||||
sdram_in_selfrefresh:
|
||||
ldr r11, omap3_sdrc_power @ read the SDRC_POWER register
|
||||
ldr r12, [r11] @ read the contents of SDRC_POWER
|
||||
mov r9, r12 @ keep a copy of SDRC_POWER bits
|
||||
orr r12, r12, #SRFRONIDLEREQ_MASK @ enable self refresh on idle
|
||||
str r12, [r11] @ write back to SDRC_POWER register
|
||||
ldr r12, [r11] @ posted-write barrier for SDRC
|
||||
idle_sdrc:
|
||||
ldr r11, omap3_cm_iclken1_core @ read the CM_ICLKEN1_CORE reg
|
||||
ldr r12, [r11]
|
||||
bic r12, r12, #EN_SDRC_MASK @ disable iclk bit for SDRC
|
||||
str r12, [r11]
|
||||
wait_sdrc_idle:
|
||||
ldr r11, omap3_cm_idlest1_core
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #ST_SDRC_MASK @ check for SDRC idle
|
||||
cmp r12, #ST_SDRC_MASK
|
||||
bne wait_sdrc_idle
|
||||
bx lr
|
||||
configure_core_dpll:
|
||||
ldr r11, omap3_cm_clksel1_pll
|
||||
ldr r12, [r11]
|
||||
ldr r10, core_m2_mask_val @ modify m2 for core dpll
|
||||
and r12, r12, r10
|
||||
orr r12, r12, r0, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT
|
||||
str r12, [r11]
|
||||
ldr r12, [r11] @ posted-write barrier for CM
|
||||
bx lr
|
||||
wait_clk_stable:
|
||||
subs r12, r12, #1
|
||||
bne wait_clk_stable
|
||||
bx lr
|
||||
enable_sdrc:
|
||||
ldr r11, omap3_cm_iclken1_core
|
||||
ldr r12, [r11]
|
||||
orr r12, r12, #EN_SDRC_MASK @ enable iclk bit for SDRC
|
||||
str r12, [r11]
|
||||
wait_sdrc_idle1:
|
||||
ldr r11, omap3_cm_idlest1_core
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #ST_SDRC_MASK
|
||||
cmp r12, #0
|
||||
bne wait_sdrc_idle1
|
||||
restore_sdrc_power_val:
|
||||
ldr r11, omap3_sdrc_power
|
||||
str r9, [r11] @ restore SDRC_POWER, no barrier needed
|
||||
bx lr
|
||||
wait_dll_lock:
|
||||
ldr r11, omap3_sdrc_dlla_status
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #LOCKSTATUS_MASK
|
||||
cmp r12, #LOCKSTATUS_MASK
|
||||
bne wait_dll_lock
|
||||
bx lr
|
||||
wait_dll_unlock:
|
||||
ldr r11, omap3_sdrc_dlla_status
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #LOCKSTATUS_MASK
|
||||
cmp r12, #0x0
|
||||
bne wait_dll_unlock
|
||||
bx lr
|
||||
configure_sdrc:
|
||||
ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM
|
||||
ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM
|
||||
str r12, [r11] @ store
|
||||
#ifdef CONFIG_OMAP3_SDRC_AC_TIMING
|
||||
ldr r12, omap_sdrc_actim_ctrl_a_0_val
|
||||
ldr r11, omap3_sdrc_actim_ctrl_a_0
|
||||
str r12, [r11]
|
||||
ldr r12, omap_sdrc_actim_ctrl_b_0_val
|
||||
ldr r11, omap3_sdrc_actim_ctrl_b_0
|
||||
str r12, [r11]
|
||||
ldr r12, omap_sdrc_mr_0_val
|
||||
ldr r11, omap3_sdrc_mr_0
|
||||
str r12, [r11]
|
||||
#endif
|
||||
ldr r12, omap_sdrc_rfr_ctrl_1_val
|
||||
cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0,
|
||||
beq skip_cs1_prog @ do not program cs1 params
|
||||
ldr r11, omap3_sdrc_rfr_ctrl_1
|
||||
str r12, [r11]
|
||||
#ifdef CONFIG_OMAP3_SDRC_AC_TIMING
|
||||
ldr r12, omap_sdrc_actim_ctrl_a_1_val
|
||||
ldr r11, omap3_sdrc_actim_ctrl_a_1
|
||||
str r12, [r11]
|
||||
ldr r12, omap_sdrc_actim_ctrl_b_1_val
|
||||
ldr r11, omap3_sdrc_actim_ctrl_b_1
|
||||
str r12, [r11]
|
||||
ldr r12, omap_sdrc_mr_1_val
|
||||
ldr r11, omap3_sdrc_mr_1
|
||||
str r12, [r11]
|
||||
#endif
|
||||
skip_cs1_prog:
|
||||
ldr r12, [r11] @ posted-write barrier for SDRC
|
||||
bx lr
|
||||
|
||||
.align
|
||||
omap3_sdrc_power:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_POWER)
|
||||
omap3_cm_clksel1_pll:
|
||||
.word OMAP34XX_CM_REGADDR(PLL_MOD, CM_CLKSEL1)
|
||||
omap3_cm_idlest1_core:
|
||||
.word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST)
|
||||
omap3_cm_iclken1_core:
|
||||
.word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1)
|
||||
|
||||
omap3_sdrc_rfr_ctrl_0:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0)
|
||||
omap3_sdrc_rfr_ctrl_1:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_1)
|
||||
omap3_sdrc_actim_ctrl_a_0:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0)
|
||||
omap3_sdrc_actim_ctrl_a_1:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_1)
|
||||
omap3_sdrc_actim_ctrl_b_0:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0)
|
||||
omap3_sdrc_actim_ctrl_b_1:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_1)
|
||||
omap3_sdrc_mr_0:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_MR_0)
|
||||
omap3_sdrc_mr_1:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_MR_1)
|
||||
omap_sdrc_rfr_ctrl_0_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_rfr_ctrl_1_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_actim_ctrl_a_0_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_actim_ctrl_a_1_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_actim_ctrl_b_0_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_actim_ctrl_b_1_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_mr_0_val:
|
||||
.word 0xDEADBEEF
|
||||
omap_sdrc_mr_1_val:
|
||||
.word 0xDEADBEEF
|
||||
|
||||
omap3_sdrc_dlla_status:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
|
||||
omap3_sdrc_dlla_ctrl:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
core_m2_mask_val:
|
||||
.word 0x07FFFFFF
|
||||
ENDPROC(omap3_sram_configure_core_dpll)
|
||||
|
||||
ENTRY(omap3_sram_configure_core_dpll_sz)
|
||||
.word . - omap3_sram_configure_core_dpll
|
||||
|
|
@ -183,7 +183,8 @@ static struct device_node * __init omap_get_timer_dt(const struct of_device_id *
|
|||
of_get_property(np, "ti,timer-secure", NULL)))
|
||||
continue;
|
||||
|
||||
of_add_property(np, &device_disabled);
|
||||
if (!of_device_is_compatible(np, "ti,omap-counter32k"))
|
||||
of_add_property(np, &device_disabled);
|
||||
return np;
|
||||
}
|
||||
|
||||
|
@ -394,7 +395,6 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)
|
|||
int ret;
|
||||
struct device_node *np = NULL;
|
||||
struct omap_hwmod *oh;
|
||||
void __iomem *vbase;
|
||||
const char *oh_name = "counter_32k";
|
||||
|
||||
/*
|
||||
|
@ -420,18 +420,6 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)
|
|||
|
||||
omap_hwmod_setup_one(oh_name);
|
||||
|
||||
if (np) {
|
||||
vbase = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
} else {
|
||||
vbase = omap_hwmod_get_mpu_rt_va(oh);
|
||||
}
|
||||
|
||||
if (!vbase) {
|
||||
pr_warn("%s: failed to get counter_32k resource\n", __func__);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
ret = omap_hwmod_enable(oh);
|
||||
if (ret) {
|
||||
pr_warn("%s: failed to enable counter_32k module (%d)\n",
|
||||
|
@ -439,13 +427,18 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = omap_init_clocksource_32k(vbase);
|
||||
if (ret) {
|
||||
pr_warn("%s: failed to initialize counter_32k as a clocksource (%d)\n",
|
||||
__func__, ret);
|
||||
omap_hwmod_idle(oh);
|
||||
}
|
||||
if (!of_have_populated_dt()) {
|
||||
void __iomem *vbase;
|
||||
|
||||
vbase = omap_hwmod_get_mpu_rt_va(oh);
|
||||
|
||||
ret = omap_init_clocksource_32k(vbase);
|
||||
if (ret) {
|
||||
pr_warn("%s: failed to initialize counter_32k as a clocksource (%d)\n",
|
||||
__func__, ret);
|
||||
omap_hwmod_idle(oh);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -476,7 +469,64 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
|||
clocksource_gpt.name, clksrc.rate);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
|
||||
static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_src,
|
||||
const char *clkev_prop, int clksrc_nr, const char *clksrc_src,
|
||||
const char *clksrc_prop, bool gptimer)
|
||||
{
|
||||
omap_clk_init();
|
||||
omap_dmtimer_init();
|
||||
omap2_gp_clockevent_init(clkev_nr, clkev_src, clkev_prop);
|
||||
|
||||
/* Enable the use of clocksource="gp_timer" kernel parameter */
|
||||
if (use_gptimer_clksrc || gptimer)
|
||||
omap2_gptimer_clocksource_init(clksrc_nr, clksrc_src,
|
||||
clksrc_prop);
|
||||
else
|
||||
omap2_sync32k_clocksource_init();
|
||||
}
|
||||
|
||||
void __init omap_init_time(void)
|
||||
{
|
||||
__omap_sync32k_timer_init(1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "timer_sys_ck", NULL, false);
|
||||
|
||||
if (of_have_populated_dt())
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM43XX)
|
||||
void __init omap3_secure_sync32k_timer_init(void)
|
||||
{
|
||||
__omap_sync32k_timer_init(12, "secure_32k_fck", "ti,timer-secure",
|
||||
2, "timer_sys_ck", NULL, false);
|
||||
}
|
||||
#endif /* CONFIG_ARCH_OMAP3 */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX)
|
||||
void __init omap3_gptimer_timer_init(void)
|
||||
{
|
||||
__omap_sync32k_timer_init(2, "timer_sys_ck", NULL,
|
||||
1, "timer_sys_ck", "ti,timer-alwon", true);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \
|
||||
defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM43XX)
|
||||
static void __init omap4_sync32k_timer_init(void)
|
||||
{
|
||||
__omap_sync32k_timer_init(1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "sys_clkin_ck", NULL, false);
|
||||
}
|
||||
|
||||
void __init omap4_local_timer_init(void)
|
||||
{
|
||||
omap4_sync32k_timer_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
|
||||
|
||||
/*
|
||||
* The realtime counter also called master counter, is a free-running
|
||||
* counter, which is related to real time. It produces the count used
|
||||
|
@ -488,6 +538,7 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
|||
*/
|
||||
static void __init realtime_counter_init(void)
|
||||
{
|
||||
#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
|
||||
void __iomem *base;
|
||||
static struct clk *sys_clk;
|
||||
unsigned long rate;
|
||||
|
@ -586,78 +637,9 @@ sysclk1_based:
|
|||
set_cntfreq();
|
||||
|
||||
iounmap(base);
|
||||
}
|
||||
#else
|
||||
static inline void __init realtime_counter_init(void)
|
||||
{}
|
||||
#endif
|
||||
|
||||
#define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \
|
||||
clksrc_nr, clksrc_src, clksrc_prop) \
|
||||
void __init omap##name##_gptimer_timer_init(void) \
|
||||
{ \
|
||||
omap_clk_init(); \
|
||||
omap_dmtimer_init(); \
|
||||
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
||||
omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \
|
||||
clksrc_prop); \
|
||||
}
|
||||
|
||||
#define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \
|
||||
clksrc_nr, clksrc_src, clksrc_prop) \
|
||||
void __init omap##name##_sync32k_timer_init(void) \
|
||||
{ \
|
||||
omap_clk_init(); \
|
||||
omap_dmtimer_init(); \
|
||||
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
||||
/* Enable the use of clocksource="gp_timer" kernel parameter */ \
|
||||
if (use_gptimer_clksrc) \
|
||||
omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \
|
||||
clksrc_prop); \
|
||||
else \
|
||||
omap2_sync32k_clocksource_init(); \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2
|
||||
OMAP_SYS_32K_TIMER_INIT(2, 1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "timer_sys_ck", NULL);
|
||||
#endif /* CONFIG_ARCH_OMAP2 */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM43XX)
|
||||
OMAP_SYS_32K_TIMER_INIT(3, 1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "timer_sys_ck", NULL);
|
||||
OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure",
|
||||
2, "timer_sys_ck", NULL);
|
||||
#endif /* CONFIG_ARCH_OMAP3 */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX) || \
|
||||
defined(CONFIG_SOC_AM43XX)
|
||||
OMAP_SYS_GP_TIMER_INIT(3, 2, "timer_sys_ck", NULL,
|
||||
1, "timer_sys_ck", "ti,timer-alwon");
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \
|
||||
defined(CONFIG_SOC_DRA7XX)
|
||||
static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "sys_clkin_ck", NULL);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP4
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
void __init omap4_local_timer_init(void)
|
||||
{
|
||||
omap4_sync32k_timer_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
#else
|
||||
void __init omap4_local_timer_init(void)
|
||||
{
|
||||
omap4_sync32k_timer_init();
|
||||
}
|
||||
#endif /* CONFIG_HAVE_ARM_TWD */
|
||||
#endif /* CONFIG_ARCH_OMAP4 */
|
||||
|
||||
#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
|
||||
void __init omap5_realtime_timer_init(void)
|
||||
{
|
||||
omap4_sync32k_timer_init();
|
||||
|
|
|
@ -280,10 +280,6 @@ void omap3_vc_set_pmic_signaling(int core_next_state)
|
|||
}
|
||||
}
|
||||
|
||||
#define PRM_POLCTRL_TWL_MASK (OMAP3430_PRM_POLCTRL_CLKREQ_POL | \
|
||||
OMAP3430_PRM_POLCTRL_CLKREQ_POL)
|
||||
#define PRM_POLCTRL_TWL_VAL OMAP3430_PRM_POLCTRL_CLKREQ_POL
|
||||
|
||||
/*
|
||||
* Configure signal polarity for sys_clkreq and sys_off_mode pins
|
||||
* as the default values are wrong and can cause the system to hang
|
||||
|
|
|
@ -32,7 +32,7 @@ static inline void platform_do_lowpower(unsigned int cpu)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref sirfsoc_cpu_die(unsigned int cpu)
|
||||
void sirfsoc_cpu_die(unsigned int cpu)
|
||||
{
|
||||
platform_do_lowpower(cpu);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/dm9000.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/rtc-v3020.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
@ -305,11 +306,14 @@ static inline void cm_x300_init_lcd(void) {}
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static struct pwm_lookup cm_x300_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.0", NULL, 10000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data cm_x300_backlight_data = {
|
||||
.pwm_id = 2,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 10000,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -323,6 +327,7 @@ static struct platform_device cm_x300_backlight_device = {
|
|||
|
||||
static void cm_x300_init_bl(void)
|
||||
{
|
||||
pwm_add_table(cm_x300_pwm_lookup, ARRAY_SIZE(cm_x300_pwm_lookup));
|
||||
platform_device_register(&cm_x300_backlight_device);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
|
||||
|
@ -184,11 +185,14 @@ static inline void income_lcd_init(void) {}
|
|||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static struct pwm_lookup income_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 1000000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data income_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 0x3ff,
|
||||
.dft_brightness = 0x1ff,
|
||||
.pwm_period_ns = 1000000,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -202,6 +206,7 @@ static struct platform_device income_backlight = {
|
|||
|
||||
static void __init income_pwm_init(void)
|
||||
{
|
||||
pwm_add_table(income_pwm_lookup, ARRAY_SIZE(income_pwm_lookup));
|
||||
platform_device_register(&income_backlight);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -395,6 +395,26 @@ static struct resource pxa_ir_resources[] = {
|
|||
.end = IRQ_ICP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 0x40800000,
|
||||
.end = 0x4080001b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[4] = {
|
||||
.start = 0x40700000,
|
||||
.end = 0x40700023,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[5] = {
|
||||
.start = 17,
|
||||
.end = 17,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[6] = {
|
||||
.start = 18,
|
||||
.end = 18,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa_device_ficp = {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio.h>
|
||||
|
@ -49,11 +50,14 @@
|
|||
#define GPIO19_GEN1_CAM_RST 19
|
||||
#define GPIO28_GEN2_CAM_RST 28
|
||||
|
||||
static struct pwm_lookup ezx_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 78700,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data ezx_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 1023,
|
||||
.dft_brightness = 1023,
|
||||
.pwm_period_ns = 78770,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -817,6 +821,7 @@ static void __init a780_init(void)
|
|||
platform_device_register(&a780_camera);
|
||||
}
|
||||
|
||||
pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
|
||||
platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
|
||||
platform_add_devices(ARRAY_AND_SIZE(a780_devices));
|
||||
}
|
||||
|
|
|
@ -557,10 +557,8 @@ static struct platform_device hx4700_lcd = {
|
|||
*/
|
||||
|
||||
static struct platform_pwm_backlight_data backlight_data = {
|
||||
.pwm_id = -1, /* Superseded by pwm_lookup */
|
||||
.max_brightness = 200,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 30923,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -630,7 +628,6 @@ static struct spi_board_info tsc2046_board_info[] __initdata = {
|
|||
|
||||
static struct pxa2xx_spi_master pxa_ssp2_master_info = {
|
||||
.num_chipselect = 1,
|
||||
.clock_enable = CKEN_SSP2,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -116,13 +116,11 @@ static struct spi_board_info mcp251x_board_info[] = {
|
|||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp3_spi_master_info = {
|
||||
.clock_enable = CKEN_SSP3,
|
||||
.num_chipselect = 2,
|
||||
.enable_dma = 1
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp4_spi_master_info = {
|
||||
.clock_enable = CKEN_SSP4,
|
||||
.num_chipselect = 2,
|
||||
.enable_dma = 1
|
||||
};
|
||||
|
|
|
@ -52,9 +52,9 @@
|
|||
#define GPIO101_MAGICIAN_KEY_VOL_DOWN 101
|
||||
#define GPIO102_MAGICIAN_KEY_PHONE 102
|
||||
#define GPIO103_MAGICIAN_LED_KP 103
|
||||
#define GPIO104_MAGICIAN_LCD_POWER_1 104
|
||||
#define GPIO105_MAGICIAN_LCD_POWER_2 105
|
||||
#define GPIO106_MAGICIAN_LCD_POWER_3 106
|
||||
#define GPIO104_MAGICIAN_LCD_VOFF_EN 104
|
||||
#define GPIO105_MAGICIAN_LCD_VON_EN 105
|
||||
#define GPIO106_MAGICIAN_LCD_DCDC_NRESET 106
|
||||
#define GPIO107_MAGICIAN_DS1WM_IRQ 107
|
||||
#define GPIO108_MAGICIAN_GSM_READY 108
|
||||
#define GPIO114_MAGICIAN_UNKNOWN 114
|
||||
|
@ -78,43 +78,51 @@
|
|||
* CPLD EGPIOs
|
||||
*/
|
||||
|
||||
#define MAGICIAN_EGPIO_BASE PXA_NR_BUILTIN_GPIO
|
||||
#define MAGICIAN_EGPIO_BASE PXA_NR_BUILTIN_GPIO
|
||||
#define MAGICIAN_EGPIO(reg,bit) \
|
||||
(MAGICIAN_EGPIO_BASE + 8*reg + bit)
|
||||
|
||||
/* output */
|
||||
|
||||
#define EGPIO_MAGICIAN_TOPPOLY_POWER MAGICIAN_EGPIO(0, 2)
|
||||
#define EGPIO_MAGICIAN_LED_POWER MAGICIAN_EGPIO(0, 5)
|
||||
#define EGPIO_MAGICIAN_GSM_RESET MAGICIAN_EGPIO(0, 6)
|
||||
#define EGPIO_MAGICIAN_LCD_POWER MAGICIAN_EGPIO(0, 7)
|
||||
#define EGPIO_MAGICIAN_SPK_POWER MAGICIAN_EGPIO(1, 0)
|
||||
#define EGPIO_MAGICIAN_EP_POWER MAGICIAN_EGPIO(1, 1)
|
||||
#define EGPIO_MAGICIAN_IN_SEL0 MAGICIAN_EGPIO(1, 2)
|
||||
#define EGPIO_MAGICIAN_IN_SEL1 MAGICIAN_EGPIO(1, 3)
|
||||
#define EGPIO_MAGICIAN_MIC_POWER MAGICIAN_EGPIO(1, 4)
|
||||
#define EGPIO_MAGICIAN_CODEC_RESET MAGICIAN_EGPIO(1, 5)
|
||||
#define EGPIO_MAGICIAN_CODEC_POWER MAGICIAN_EGPIO(1, 6)
|
||||
#define EGPIO_MAGICIAN_BL_POWER MAGICIAN_EGPIO(1, 7)
|
||||
#define EGPIO_MAGICIAN_SD_POWER MAGICIAN_EGPIO(2, 0)
|
||||
#define EGPIO_MAGICIAN_CARKIT_MIC MAGICIAN_EGPIO(2, 1)
|
||||
#define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2)
|
||||
#define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3)
|
||||
#define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4)
|
||||
#define EGPIO_MAGICIAN_BQ24022_ISET2 MAGICIAN_EGPIO(2, 5)
|
||||
#define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7)
|
||||
#define EGPIO_MAGICIAN_TOPPOLY_POWER MAGICIAN_EGPIO(0, 2)
|
||||
#define EGPIO_MAGICIAN_LED_POWER MAGICIAN_EGPIO(0, 5)
|
||||
#define EGPIO_MAGICIAN_GSM_RESET MAGICIAN_EGPIO(0, 6)
|
||||
#define EGPIO_MAGICIAN_LCD_POWER MAGICIAN_EGPIO(0, 7)
|
||||
#define EGPIO_MAGICIAN_SPK_POWER MAGICIAN_EGPIO(1, 0)
|
||||
#define EGPIO_MAGICIAN_EP_POWER MAGICIAN_EGPIO(1, 1)
|
||||
#define EGPIO_MAGICIAN_IN_SEL0 MAGICIAN_EGPIO(1, 2)
|
||||
#define EGPIO_MAGICIAN_IN_SEL1 MAGICIAN_EGPIO(1, 3)
|
||||
#define EGPIO_MAGICIAN_MIC_POWER MAGICIAN_EGPIO(1, 4)
|
||||
#define EGPIO_MAGICIAN_CODEC_RESET MAGICIAN_EGPIO(1, 5)
|
||||
#define EGPIO_MAGICIAN_CODEC_POWER MAGICIAN_EGPIO(1, 6)
|
||||
#define EGPIO_MAGICIAN_BL_POWER MAGICIAN_EGPIO(1, 7)
|
||||
#define EGPIO_MAGICIAN_SD_POWER MAGICIAN_EGPIO(2, 0)
|
||||
#define EGPIO_MAGICIAN_CARKIT_MIC MAGICIAN_EGPIO(2, 1)
|
||||
#define EGPIO_MAGICIAN_IR_RX_SHUTDOWN MAGICIAN_EGPIO(2, 2)
|
||||
#define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3)
|
||||
#define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4)
|
||||
#define EGPIO_MAGICIAN_BQ24022_ISET2 MAGICIAN_EGPIO(2, 5)
|
||||
#define EGPIO_MAGICIAN_NICD_CHARGE MAGICIAN_EGPIO(2, 6)
|
||||
#define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7)
|
||||
|
||||
/* input */
|
||||
|
||||
#define EGPIO_MAGICIAN_CABLE_STATE_AC MAGICIAN_EGPIO(4, 0)
|
||||
#define EGPIO_MAGICIAN_CABLE_STATE_USB MAGICIAN_EGPIO(4, 1)
|
||||
/* USB or AC charger type */
|
||||
#define EGPIO_MAGICIAN_CABLE_TYPE MAGICIAN_EGPIO(4, 0)
|
||||
/*
|
||||
* Vbus is detected
|
||||
* FIXME behaves like (6,3), may differ for host/device
|
||||
*/
|
||||
#define EGPIO_MAGICIAN_CABLE_VBUS MAGICIAN_EGPIO(4, 1)
|
||||
|
||||
#define EGPIO_MAGICIAN_BOARD_ID0 MAGICIAN_EGPIO(5, 0)
|
||||
#define EGPIO_MAGICIAN_BOARD_ID1 MAGICIAN_EGPIO(5, 1)
|
||||
#define EGPIO_MAGICIAN_BOARD_ID2 MAGICIAN_EGPIO(5, 2)
|
||||
#define EGPIO_MAGICIAN_LCD_SELECT MAGICIAN_EGPIO(5, 3)
|
||||
#define EGPIO_MAGICIAN_nSD_READONLY MAGICIAN_EGPIO(5, 4)
|
||||
#define EGPIO_MAGICIAN_BOARD_ID0 MAGICIAN_EGPIO(5, 0)
|
||||
#define EGPIO_MAGICIAN_BOARD_ID1 MAGICIAN_EGPIO(5, 1)
|
||||
#define EGPIO_MAGICIAN_BOARD_ID2 MAGICIAN_EGPIO(5, 2)
|
||||
#define EGPIO_MAGICIAN_LCD_SELECT MAGICIAN_EGPIO(5, 3)
|
||||
#define EGPIO_MAGICIAN_nSD_READONLY MAGICIAN_EGPIO(5, 4)
|
||||
|
||||
#define EGPIO_MAGICIAN_EP_INSERT MAGICIAN_EGPIO(6, 1)
|
||||
#define EGPIO_MAGICIAN_EP_INSERT MAGICIAN_EGPIO(6, 1)
|
||||
/* FIXME behaves like (4,1), may differ for host/device */
|
||||
#define EGPIO_MAGICIAN_CABLE_INSERTED MAGICIAN_EGPIO(6, 3)
|
||||
|
||||
#endif /* _MAGICIAN_H_ */
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#define ARB_CORE_PARK (1<<24) /* Be parked with core when idle */
|
||||
#define ARB_LOCK_FLAG (1<<23) /* Only Locking masters gain access to the bus */
|
||||
|
||||
extern int __init pxa27x_set_pwrmode(unsigned int mode);
|
||||
extern int pxa27x_set_pwrmode(unsigned int mode);
|
||||
extern void pxa27x_cpu_pm_enter(suspend_state_t state);
|
||||
|
||||
#endif /* __MACH_PXA27x_H */
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/smc91x.h>
|
||||
|
||||
|
@ -271,11 +272,14 @@ static struct platform_device lpd270_flash_device[2] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct pwm_lookup lpd270_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 78770,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data lpd270_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 1,
|
||||
.dft_brightness = 1,
|
||||
.pwm_period_ns = 78770,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -474,6 +478,7 @@ static void __init lpd270_init(void)
|
|||
*/
|
||||
ARB_CNTRL = ARB_CORE_PARK | 0x234;
|
||||
|
||||
pwm_add_table(lpd270_pwm_lookup, ARRAY_SIZE(lpd270_pwm_lookup));
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
|
||||
pxa_set_ac97_info(NULL);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -26,6 +26,7 @@
|
|||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
|
@ -248,11 +249,14 @@ static struct platform_device mst_flash_device[2] = {
|
|||
};
|
||||
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
static struct pwm_lookup mainstone_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 78770,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data mainstone_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 1023,
|
||||
.dft_brightness = 1023,
|
||||
.pwm_period_ns = 78770,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -266,9 +270,16 @@ static struct platform_device mainstone_backlight_device = {
|
|||
|
||||
static void __init mainstone_backlight_register(void)
|
||||
{
|
||||
int ret = platform_device_register(&mainstone_backlight_device);
|
||||
if (ret)
|
||||
int ret;
|
||||
|
||||
pwm_add_table(mainstone_pwm_lookup, ARRAY_SIZE(mainstone_pwm_lookup));
|
||||
|
||||
ret = platform_device_register(&mainstone_backlight_device);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "mainstone: failed to register backlight device: %d\n", ret);
|
||||
pwm_remove_table(mainstone_pwm_lookup,
|
||||
ARRAY_SIZE(mainstone_pwm_lookup));
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define mainstone_backlight_register() do { } while (0)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/leds.h>
|
||||
|
@ -181,12 +182,15 @@ static unsigned long mioa701_pin_config[] = {
|
|||
MFP_CFG_OUT(GPIO116, AF0, DRIVE_HIGH),
|
||||
};
|
||||
|
||||
static struct pwm_lookup mioa701_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight", NULL, 4000 * 1024,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
/* LCD Screen and Backlight */
|
||||
static struct platform_pwm_backlight_data mioa701_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 50,
|
||||
.pwm_period_ns = 4000 * 1024, /* Fl = 250kHz */
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -678,6 +682,7 @@ MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info)
|
|||
MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL)
|
||||
MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL)
|
||||
MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL)
|
||||
MIO_SIMPLE_DEV(wm9713_acodec, "wm9713-codec", NULL);
|
||||
MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data);
|
||||
MIO_SIMPLE_DEV(mioa701_camera, "soc-camera-pdrv",&iclink);
|
||||
|
||||
|
@ -685,6 +690,7 @@ static struct platform_device *devices[] __initdata = {
|
|||
&mioa701_gpio_keys,
|
||||
&mioa701_backlight,
|
||||
&mioa701_led,
|
||||
&wm9713_acodec,
|
||||
&pxa2xx_pcm,
|
||||
&mioa701_sound,
|
||||
&power_dev,
|
||||
|
@ -751,6 +757,7 @@ static void __init mioa701_machine_init(void)
|
|||
pxa_set_udc_info(&mioa701_udc_info);
|
||||
pxa_set_ac97_info(&mioa701_ac97_info);
|
||||
pm_power_off = mioa701_poweroff;
|
||||
pwm_add_table(mioa701_pwm_lookup, ARRAY_SIZE(mioa701_pwm_lookup));
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
gsm_init();
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx.h>
|
||||
|
@ -270,6 +271,11 @@ void __init palm27x_ac97_init(int minv, int maxv, int jack, int reset)
|
|||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static struct pwm_lookup palm27x_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 3500 * 1024,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static int palm_bl_power;
|
||||
static int palm_lcd_power;
|
||||
|
||||
|
@ -318,10 +324,8 @@ static void palm27x_backlight_exit(struct device *dev)
|
|||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palm27x_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 0xfe,
|
||||
.dft_brightness = 0x7e,
|
||||
.pwm_period_ns = 3500 * 1024,
|
||||
.enable_gpio = -1,
|
||||
.init = palm27x_backlight_init,
|
||||
.notify = palm27x_backlight_notify,
|
||||
|
@ -340,6 +344,7 @@ void __init palm27x_pwm_init(int bl, int lcd)
|
|||
{
|
||||
palm_bl_power = bl;
|
||||
palm_lcd_power = lcd;
|
||||
pwm_add_lookup(palm27x_pwm_lookup, ARRAY_SIZE(palm27x_pwm_lookup));
|
||||
platform_device_register(&palm27x_backlight);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
|
@ -166,11 +167,14 @@ static inline void palmtc_keys_init(void) {}
|
|||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static struct pwm_lookup palmtc_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa25x-pwm.1", 0, "pwm-backlight.0", NULL, PALMTC_PERIOD_NS,
|
||||
PWM_PERIOD_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data palmtc_backlight_data = {
|
||||
.pwm_id = 1,
|
||||
.max_brightness = PALMTC_MAX_INTENSITY,
|
||||
.dft_brightness = PALMTC_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMTC_PERIOD_NS,
|
||||
.enable_gpio = GPIO_NR_PALMTC_BL_POWER,
|
||||
};
|
||||
|
||||
|
@ -184,6 +188,7 @@ static struct platform_device palmtc_backlight = {
|
|||
|
||||
static void __init palmtc_pwm_init(void)
|
||||
{
|
||||
pwm_add_table(palmtc_pwm_lookup, ARRAY_SIZE(palmtc_pwm_lookup));
|
||||
platform_device_register(&palmtc_backlight);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx.h>
|
||||
|
@ -138,6 +139,11 @@ static struct platform_device palmte2_pxa_keys = {
|
|||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static struct pwm_lookup palmte2_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa25x-pwm.0", 0, "pwm-backlight.0", NULL,
|
||||
PALMTE2_PERIOD_NS, PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct gpio palmte_bl_gpios[] = {
|
||||
{ GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" },
|
||||
{ GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" },
|
||||
|
@ -161,10 +167,8 @@ static void palmte2_backlight_exit(struct device *dev)
|
|||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmte2_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMTE2_MAX_INTENSITY,
|
||||
.dft_brightness = PALMTE2_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMTE2_PERIOD_NS,
|
||||
.enable_gpio = -1,
|
||||
.init = palmte2_backlight_init,
|
||||
.notify = palmte2_backlight_notify,
|
||||
|
@ -355,6 +359,7 @@ static void __init palmte2_init(void)
|
|||
pxa_set_ac97_info(&palmte2_ac97_pdata);
|
||||
pxa_set_ficp_info(&palmte2_ficp_platform_data);
|
||||
|
||||
pwm_add_table(palmte2_pwm_lookup, ARRAY_SIZE(palmte2_pwm_lookup));
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
|
||||
#include <media/mt9v022.h>
|
||||
|
@ -148,11 +149,14 @@ static struct pxafb_mach_info pcm990_fbinfo __initdata = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct pwm_lookup pcm990_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 78770,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data pcm990_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 1023,
|
||||
.dft_brightness = 1023,
|
||||
.pwm_period_ns = 78770,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -542,6 +546,7 @@ void __init pcm990_baseboard_init(void)
|
|||
#ifndef CONFIG_PCM990_DISPLAY_NONE
|
||||
pxa_set_fb_info(NULL, &pcm990_fbinfo);
|
||||
#endif
|
||||
pwm_add_table(pcm990_pwm_lookup, ARRAY_SIZE(pcm990_pwm_lookup));
|
||||
platform_device_register(&pcm990_backlight_device);
|
||||
|
||||
/* MMC */
|
||||
|
|
|
@ -84,7 +84,7 @@ EXPORT_SYMBOL_GPL(pxa27x_configure_ac97reset);
|
|||
*/
|
||||
static unsigned int pwrmode = PWRMODE_SLEEP;
|
||||
|
||||
int __init pxa27x_set_pwrmode(unsigned int mode)
|
||||
int pxa27x_set_pwrmode(unsigned int mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case PWRMODE_SLEEP:
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/leds.h>
|
||||
#include <linux/w1-gpio.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
|
@ -507,7 +508,7 @@ static struct w1_gpio_platform_data w1_gpio_platform_data = {
|
|||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
struct platform_device raumfeld_w1_gpio_device = {
|
||||
static struct platform_device raumfeld_w1_gpio_device = {
|
||||
.name = "w1-gpio",
|
||||
.dev = {
|
||||
.platform_data = &w1_gpio_platform_data
|
||||
|
@ -531,13 +532,15 @@ static void __init raumfeld_w1_init(void)
|
|||
* Framebuffer device
|
||||
*/
|
||||
|
||||
static struct pwm_lookup raumfeld_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight", NULL, 10000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
/* PWM controlled backlight */
|
||||
static struct platform_pwm_backlight_data raumfeld_pwm_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
/* 10000 ns = 10 ms ^= 100 kHz */
|
||||
.pwm_period_ns = 10000,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -618,6 +621,8 @@ static void __init raumfeld_lcd_init(void)
|
|||
} else {
|
||||
mfp_cfg_t raumfeld_pwm_pin_config = GPIO17_PWM0_OUT;
|
||||
pxa3xx_mfp_config(&raumfeld_pwm_pin_config, 1);
|
||||
pwm_add_table(raumfeld_pwm_lookup,
|
||||
ARRAY_SIZE(raumfeld_pwm_lookup));
|
||||
platform_device_register(&raumfeld_pwm_backlight_device);
|
||||
}
|
||||
|
||||
|
@ -629,7 +634,7 @@ static void __init raumfeld_lcd_init(void)
|
|||
* SPI devices
|
||||
*/
|
||||
|
||||
struct spi_gpio_platform_data raumfeld_spi_platform_data = {
|
||||
static struct spi_gpio_platform_data raumfeld_spi_platform_data = {
|
||||
.sck = GPIO_SPI_CLK,
|
||||
.mosi = GPIO_SPI_MOSI,
|
||||
.miso = GPIO_SPI_MISO,
|
||||
|
@ -848,7 +853,7 @@ static void __init raumfeld_power_init(void)
|
|||
static struct regulator_consumer_supply audio_va_consumer_supply =
|
||||
REGULATOR_SUPPLY("va", "0-0048");
|
||||
|
||||
struct regulator_init_data audio_va_initdata = {
|
||||
static struct regulator_init_data audio_va_initdata = {
|
||||
.consumer_supplies = &audio_va_consumer_supply,
|
||||
.num_consumer_supplies = 1,
|
||||
.constraints = {
|
||||
|
@ -880,7 +885,7 @@ static struct regulator_consumer_supply audio_dummy_supplies[] = {
|
|||
REGULATOR_SUPPLY("vlc", "0-0048"),
|
||||
};
|
||||
|
||||
struct regulator_init_data audio_dummy_initdata = {
|
||||
static struct regulator_init_data audio_dummy_initdata = {
|
||||
.consumer_supplies = audio_dummy_supplies,
|
||||
.num_consumer_supplies = ARRAY_SIZE(audio_dummy_supplies),
|
||||
.constraints = {
|
||||
|
@ -928,7 +933,7 @@ static struct regulator_init_data vcc_mmc_init_data = {
|
|||
.num_consumer_supplies = 1,
|
||||
};
|
||||
|
||||
struct max8660_subdev_data max8660_v6_subdev_data = {
|
||||
static struct max8660_subdev_data max8660_v6_subdev_data = {
|
||||
.id = MAX8660_V6,
|
||||
.name = "vmmc",
|
||||
.platform_data = &vcc_mmc_init_data,
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -168,21 +169,24 @@ static inline void tavorevb_init_keypad(void) {}
|
|||
#endif /* CONFIG_KEYBOARD_PXA27x || CONFIG_KEYBOARD_PXA27x_MODULE */
|
||||
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
static struct pwm_lookup tavorevb_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.0", NULL, 100000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.1", NULL, 100000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data tavorevb_backlight_data[] = {
|
||||
[0] = {
|
||||
/* primary backlight */
|
||||
.pwm_id = 2,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 100000,
|
||||
.enable_gpio = -1,
|
||||
},
|
||||
[1] = {
|
||||
/* secondary backlight */
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 100000,
|
||||
.enable_gpio = -1,
|
||||
},
|
||||
};
|
||||
|
@ -470,6 +474,7 @@ static struct pxafb_mach_info tavorevb_lcd_info = {
|
|||
|
||||
static void __init tavorevb_init_lcd(void)
|
||||
{
|
||||
pwm_add_table(tavorevb_pwm_lookup, ARRAY_SIZE(tavorevb_pwm_lookup));
|
||||
platform_device_register(&tavorevb_backlight_devices[0]);
|
||||
platform_device_register(&tavorevb_backlight_devices[1]);
|
||||
pxa_set_fb_info(NULL, &tavorevb_lcd_info);
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/usb/isp116x.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
@ -350,6 +351,11 @@ static struct pxafb_mach_info fb_info = {
|
|||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
static struct pwm_lookup viper_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa25x-pwm.0", 0, "pwm-backlight.0", NULL, 1000000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static int viper_backlight_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
@ -398,10 +404,8 @@ static void viper_backlight_exit(struct device *dev)
|
|||
}
|
||||
|
||||
static struct platform_pwm_backlight_data viper_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 1000000,
|
||||
.enable_gpio = -1,
|
||||
.init = viper_backlight_init,
|
||||
.notify = viper_backlight_notify,
|
||||
|
@ -939,6 +943,7 @@ static void __init viper_init(void)
|
|||
smc91x_device.num_resources--;
|
||||
|
||||
pxa_set_i2c_info(NULL);
|
||||
pwm_add_table(viper_pwm_lookup, ARRAY_SIZE(viper_pwm_lookup));
|
||||
platform_add_devices(viper_devs, ARRAY_SIZE(viper_devs));
|
||||
|
||||
viper_init_vcore_gpios();
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/z2_battery.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
@ -199,21 +200,24 @@ static inline void z2_nor_init(void) {}
|
|||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static struct pwm_lookup z2_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight.0", NULL, 1260320,
|
||||
PWM_POLARITY_NORMAL),
|
||||
PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.1", NULL, 1260320,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data z2_backlight_data[] = {
|
||||
[0] = {
|
||||
/* Keypad Backlight */
|
||||
.pwm_id = 1,
|
||||
.max_brightness = 1023,
|
||||
.dft_brightness = 0,
|
||||
.pwm_period_ns = 1260320,
|
||||
.enable_gpio = -1,
|
||||
},
|
||||
[1] = {
|
||||
/* LCD Backlight */
|
||||
.pwm_id = 2,
|
||||
.max_brightness = 1023,
|
||||
.dft_brightness = 512,
|
||||
.pwm_period_ns = 1260320,
|
||||
.enable_gpio = -1,
|
||||
},
|
||||
};
|
||||
|
@ -236,6 +240,7 @@ static struct platform_device z2_backlight_devices[2] = {
|
|||
};
|
||||
static void __init z2_pwm_init(void)
|
||||
{
|
||||
pwm_add_table(z2_pwm_lookup, ARRAY_SIZE(z2_pwm_lookup));
|
||||
platform_device_register(&z2_backlight_devices[0]);
|
||||
platform_device_register(&z2_backlight_devices[1]);
|
||||
}
|
||||
|
@ -595,13 +600,11 @@ static struct spi_board_info spi_board_info[] __initdata = {
|
|||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp1_master_info = {
|
||||
.clock_enable = CKEN_SSP,
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp2_master_info = {
|
||||
.clock_enable = CKEN_SSP2,
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/smc91x.h>
|
||||
|
||||
|
@ -120,11 +121,14 @@ static inline void zylonite_init_leds(void) {}
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
static struct pwm_lookup zylonite_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.1", 1, "pwm-backlight.0", NULL, 10000,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct platform_pwm_backlight_data zylonite_backlight_data = {
|
||||
.pwm_id = 3,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 100,
|
||||
.pwm_period_ns = 10000,
|
||||
.enable_gpio = -1,
|
||||
};
|
||||
|
||||
|
@ -206,6 +210,7 @@ static struct pxafb_mach_info zylonite_sharp_lcd_info = {
|
|||
|
||||
static void __init zylonite_init_lcd(void)
|
||||
{
|
||||
pwm_add_table(zylonite_pwm_lookup, ARRAY_SIZE(zylonite_pwm_lookup));
|
||||
platform_device_register(&zylonite_backlight_device);
|
||||
|
||||
if (lcd_id & 0x20) {
|
||||
|
|
|
@ -49,7 +49,7 @@ extern void secondary_startup_arm(void);
|
|||
static DEFINE_SPINLOCK(boot_lock);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void __ref qcom_cpu_die(unsigned int cpu)
|
||||
static void qcom_cpu_die(unsigned int cpu)
|
||||
{
|
||||
wfi();
|
||||
}
|
||||
|
|
|
@ -90,7 +90,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref realview_cpu_die(unsigned int cpu)
|
||||
void realview_cpu_die(unsigned int cpu)
|
||||
{
|
||||
int spurious = 0;
|
||||
|
||||
|
|
|
@ -98,76 +98,3 @@ config ARCH_SH73A0
|
|||
|
||||
comment "Renesas ARM SoCs System Configuration"
|
||||
endif
|
||||
|
||||
if ARCH_SHMOBILE_LEGACY
|
||||
|
||||
comment "Renesas ARM SoCs System Type"
|
||||
|
||||
config ARCH_R8A7778
|
||||
bool "R-Car M1A (R8A77781)"
|
||||
select ARCH_RCAR_GEN1
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_GIC
|
||||
|
||||
config ARCH_R8A7779
|
||||
bool "R-Car H1 (R8A77790)"
|
||||
select ARCH_RCAR_GEN1
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_GIC
|
||||
|
||||
comment "Renesas ARM SoCs Board Type"
|
||||
|
||||
config MACH_BOCKW
|
||||
bool "BOCK-W platform"
|
||||
depends on ARCH_R8A7778
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
select SND_SOC_AK4554 if SND_SIMPLE_CARD
|
||||
select SND_SOC_AK4642 if SND_SIMPLE_CARD && I2C
|
||||
select USE_OF
|
||||
|
||||
config MACH_BOCKW_REFERENCE
|
||||
bool "BOCK-W - Reference Device Tree Implementation"
|
||||
depends on ARCH_R8A7778
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
select USE_OF
|
||||
---help---
|
||||
Use reference implementation of BockW board support
|
||||
which makes use of device tree at the expense
|
||||
of not supporting a number of devices.
|
||||
|
||||
This is intended to aid developers
|
||||
|
||||
comment "Renesas ARM SoCs System Configuration"
|
||||
|
||||
config CPU_HAS_INTEVT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SH_CLK_CPG
|
||||
bool
|
||||
|
||||
source "drivers/sh/Kconfig"
|
||||
|
||||
endif
|
||||
|
||||
if ARCH_SHMOBILE
|
||||
|
||||
menu "Timer and clock configuration"
|
||||
|
||||
config SHMOBILE_TIMER_HZ
|
||||
int "Kernel HZ (jiffies per second)"
|
||||
range 32 1024
|
||||
default "128"
|
||||
help
|
||||
Allows the configuration of the timer frequency. It is customary
|
||||
to have the timer interrupt run at 1000 Hz or 100 Hz, but in the
|
||||
case of low timer frequencies other values may be more suitable.
|
||||
Renesas ARM SoC systems using a 32768 Hz RCLK for clock events may
|
||||
want to select a HZ value such as 128 that can evenly divide RCLK.
|
||||
A HZ value that does not divide evenly may cause timer drift.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
# Common objects
|
||||
obj-y := timer.o console.o
|
||||
obj-y := timer.o
|
||||
|
||||
# CPU objects
|
||||
obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o
|
||||
|
@ -18,12 +18,6 @@ obj-$(CONFIG_ARCH_R8A7794) += setup-r8a7794.o
|
|||
obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o
|
||||
obj-$(CONFIG_ARCH_R7S72100) += setup-r7s72100.o
|
||||
|
||||
# Clock objects
|
||||
ifndef CONFIG_COMMON_CLK
|
||||
obj-y += clock.o
|
||||
obj-$(CONFIG_ARCH_R8A7778) += clock-r8a7778.o
|
||||
endif
|
||||
|
||||
# CPU reset vector handling objects
|
||||
cpu-y := platsmp.o headsmp.o
|
||||
|
||||
|
@ -49,11 +43,5 @@ obj-$(CONFIG_PM_RCAR) += pm-rcar.o
|
|||
obj-$(CONFIG_PM_RMOBILE) += pm-rmobile.o
|
||||
obj-$(CONFIG_ARCH_RCAR_GEN2) += pm-rcar-gen2.o
|
||||
|
||||
# Board objects
|
||||
ifndef CONFIG_ARCH_SHMOBILE_MULTI
|
||||
obj-$(CONFIG_MACH_BOCKW) += board-bockw.o
|
||||
obj-$(CONFIG_MACH_BOCKW_REFERENCE) += board-bockw-reference.o
|
||||
endif
|
||||
|
||||
# Framework support
|
||||
obj-$(CONFIG_SMP) += $(smp-y)
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
# per-board load address for uImage
|
||||
loadaddr-y :=
|
||||
loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000
|
||||
loadaddr-$(CONFIG_MACH_BOCKW_REFERENCE) += 0x60008000
|
||||
|
||||
__ZRELADDR := $(sort $(loadaddr-y))
|
||||
zreladdr-y += $(__ZRELADDR)
|
||||
|
||||
# Unsupported legacy stuff
|
||||
#
|
||||
#params_phys-y (Instead: Pass atags pointer in r2)
|
||||
#initrd_phys-y (Instead: Use compiled-in initramfs)
|
|
@ -1,86 +0,0 @@
|
|||
/*
|
||||
* Bock-W board support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "r8a7778.h"
|
||||
|
||||
/*
|
||||
* see board-bock.c for checking detail of dip-switch
|
||||
*/
|
||||
|
||||
#define FPGA 0x18200000
|
||||
#define IRQ0MR 0x30
|
||||
#define COMCTLR 0x101c
|
||||
|
||||
#define PFC 0xfffc0000
|
||||
#define PUPR4 0x110
|
||||
static void __init bockw_init(void)
|
||||
{
|
||||
void __iomem *fpga;
|
||||
void __iomem *pfc;
|
||||
|
||||
#ifndef CONFIG_COMMON_CLK
|
||||
r8a7778_clock_init();
|
||||
#endif
|
||||
r8a7778_init_irq_extpin_dt(1);
|
||||
r8a7778_add_dt_devices();
|
||||
|
||||
fpga = ioremap_nocache(FPGA, SZ_1M);
|
||||
if (fpga) {
|
||||
/*
|
||||
* CAUTION
|
||||
*
|
||||
* IRQ0/1 is cascaded interrupt from FPGA.
|
||||
* it should be cared in the future
|
||||
* Now, it is assuming IRQ0 was used only from SMSC.
|
||||
*/
|
||||
u16 val = ioread16(fpga + IRQ0MR);
|
||||
val &= ~(1 << 4); /* enable SMSC911x */
|
||||
iowrite16(val, fpga + IRQ0MR);
|
||||
|
||||
iounmap(fpga);
|
||||
}
|
||||
|
||||
pfc = ioremap_nocache(PFC, 0x200);
|
||||
if (pfc) {
|
||||
/*
|
||||
* FIXME
|
||||
*
|
||||
* SDHI CD/WP pin needs pull-up
|
||||
*/
|
||||
iowrite32(ioread32(pfc + PUPR4) | (3 << 26), pfc + PUPR4);
|
||||
iounmap(pfc);
|
||||
}
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *const bockw_boards_compat_dt[] __initconst = {
|
||||
"renesas,bockw-reference",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(BOCKW_DT, "bockw")
|
||||
.init_early = shmobile_init_delay,
|
||||
.init_irq = r8a7778_init_irq_dt,
|
||||
.init_machine = bockw_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.dt_compat = bockw_boards_compat_dt,
|
||||
MACHINE_END
|
|
@ -1,737 +0,0 @@
|
|||
/*
|
||||
* Bock-W board support
|
||||
*
|
||||
* Copyright (C) 2013-2014 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
* Copyright (C) 2013-2014 Cogent Embedded, Inc.
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <linux/mmc/sh_mmcif.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/camera-rcar.h>
|
||||
#include <linux/platform_data/usb-rcar-phy.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/usb/renesas_usbhs.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <sound/rcar_snd.h>
|
||||
#include <sound/simple_card.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "irqs.h"
|
||||
#include "r8a7778.h"
|
||||
|
||||
#define FPGA 0x18200000
|
||||
#define IRQ0MR 0x30
|
||||
#define COMCTLR 0x101c
|
||||
static void __iomem *fpga;
|
||||
|
||||
/*
|
||||
* CN9(Upper side) SCIF/RCAN selection
|
||||
*
|
||||
* 1,4 3,6
|
||||
* SW40 SCIF RCAN
|
||||
* SW41 SCIF RCAN
|
||||
*/
|
||||
|
||||
/*
|
||||
* MMC (CN26) pin
|
||||
*
|
||||
* SW6 (D2) 3 pin
|
||||
* SW7 (D5) ON
|
||||
* SW8 (D3) 3 pin
|
||||
* SW10 (D4) 1 pin
|
||||
* SW12 (CLK) 1 pin
|
||||
* SW13 (D6) 3 pin
|
||||
* SW14 (CMD) ON
|
||||
* SW15 (D6) 1 pin
|
||||
* SW16 (D0) ON
|
||||
* SW17 (D1) ON
|
||||
* SW18 (D7) 3 pin
|
||||
* SW19 (MMC) 1 pin
|
||||
*/
|
||||
|
||||
/*
|
||||
* SSI settings
|
||||
*
|
||||
* SW45: 1-4 side (SSI5 out, ROUT/LOUT CN19 Mid)
|
||||
* SW46: 1101 (SSI6 Recorde)
|
||||
* SW47: 1110 (SSI5 Playback)
|
||||
* SW48: 11 (Recorde power)
|
||||
* SW49: 1 (SSI slave mode)
|
||||
* SW50: 1111 (SSI7, SSI8)
|
||||
* SW51: 1111 (SSI3, SSI4)
|
||||
* SW54: 1pin (ak4554 FPGA control)
|
||||
* SW55: 1 (CLKB is 24.5760MHz)
|
||||
* SW60: 1pin (ak4554 FPGA control)
|
||||
* SW61: 3pin (use X11 clock)
|
||||
* SW78: 3-6 (ak4642 connects I2C0)
|
||||
*
|
||||
* You can use sound as
|
||||
*
|
||||
* hw0: CN19: SSI56-AK4643
|
||||
* hw1: CN21: SSI3-AK4554(playback)
|
||||
* hw2: CN21: SSI4-AK4554(capture)
|
||||
* hw3: CN20: SSI7-AK4554(playback)
|
||||
* hw4: CN20: SSI8-AK4554(capture)
|
||||
*
|
||||
* this command is required when playback on hw0.
|
||||
*
|
||||
* # amixer set "LINEOUT Mixer DACL" on
|
||||
*/
|
||||
|
||||
/*
|
||||
* USB
|
||||
*
|
||||
* USB1 (CN29) can be Host/Function
|
||||
*
|
||||
* Host Func
|
||||
* SW98 1 2
|
||||
* SW99 1 3
|
||||
*/
|
||||
|
||||
/* Dummy supplies, where voltage doesn't matter */
|
||||
static struct regulator_consumer_supply dummy_supplies[] = {
|
||||
REGULATOR_SUPPLY("vddvario", "smsc911x"),
|
||||
REGULATOR_SUPPLY("vdd33a", "smsc911x"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply fixed3v3_power_consumers[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mmcif"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mmcif"),
|
||||
};
|
||||
|
||||
static struct smsc911x_platform_config smsc911x_data __initdata = {
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static struct resource smsc911x_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0x18300000, 0x1000),
|
||||
DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_RENESAS_USBHS_UDC)
|
||||
/*
|
||||
* When USB1 is Func
|
||||
*/
|
||||
static int usbhsf_get_id(struct platform_device *pdev)
|
||||
{
|
||||
return USBHS_GADGET;
|
||||
}
|
||||
|
||||
#define SUSPMODE 0x102
|
||||
static int usbhsf_power_ctrl(struct platform_device *pdev,
|
||||
void __iomem *base, int enable)
|
||||
{
|
||||
enable = !!enable;
|
||||
|
||||
r8a7778_usb_phy_power(enable);
|
||||
|
||||
iowrite16(enable << 14, base + SUSPMODE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct resource usbhsf_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffe60000, 0x110),
|
||||
DEFINE_RES_IRQ(gic_iid(0x4f)),
|
||||
};
|
||||
|
||||
static struct renesas_usbhs_platform_info usbhs_info __initdata = {
|
||||
.platform_callback = {
|
||||
.get_id = usbhsf_get_id,
|
||||
.power_ctrl = usbhsf_power_ctrl,
|
||||
},
|
||||
.driver_param = {
|
||||
.buswait_bwait = 4,
|
||||
.d0_tx_id = HPBDMA_SLAVE_USBFUNC_TX,
|
||||
.d1_rx_id = HPBDMA_SLAVE_USBFUNC_RX,
|
||||
},
|
||||
};
|
||||
|
||||
#define USB_PHY_SETTING {.port1_func = 1, .ovc_pin[1].active_high = 1,}
|
||||
#define USB1_DEVICE "renesas_usbhs"
|
||||
#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE() \
|
||||
platform_device_register_resndata( \
|
||||
NULL, "renesas_usbhs", -1, \
|
||||
usbhsf_resources, \
|
||||
ARRAY_SIZE(usbhsf_resources), \
|
||||
&usbhs_info, sizeof(struct renesas_usbhs_platform_info))
|
||||
|
||||
#else
|
||||
/*
|
||||
* When USB1 is Host
|
||||
*/
|
||||
#define USB_PHY_SETTING { }
|
||||
#define USB1_DEVICE "ehci-platform"
|
||||
#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE()
|
||||
|
||||
#endif
|
||||
|
||||
/* USB */
|
||||
static struct resource usb_phy_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffe70800, 0x100),
|
||||
DEFINE_RES_MEM(0xffe76000, 0x100),
|
||||
};
|
||||
|
||||
static struct rcar_phy_platform_data usb_phy_platform_data __initdata =
|
||||
USB_PHY_SETTING;
|
||||
|
||||
|
||||
/* SDHI */
|
||||
static struct tmio_mmc_data sdhi0_info __initdata = {
|
||||
.chan_priv_tx = (void *)HPBDMA_SLAVE_SDHI0_TX,
|
||||
.chan_priv_rx = (void *)HPBDMA_SLAVE_SDHI0_RX,
|
||||
.capabilities = MMC_CAP_SD_HIGHSPEED,
|
||||
.ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.flags = TMIO_MMC_HAS_IDLE_WAIT,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xFFE4C000, 0x100),
|
||||
DEFINE_RES_IRQ(gic_iid(0x77)),
|
||||
};
|
||||
|
||||
/* Ether */
|
||||
static struct resource ether_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfde00000, 0x400),
|
||||
DEFINE_RES_IRQ(gic_iid(0x89)),
|
||||
};
|
||||
|
||||
static struct sh_eth_plat_data ether_platform_data __initdata = {
|
||||
.phy = 0x01,
|
||||
.edmac_endian = EDMAC_LITTLE_ENDIAN,
|
||||
.phy_interface = PHY_INTERFACE_MODE_RMII,
|
||||
/*
|
||||
* Although the LINK signal is available on the board, it's connected to
|
||||
* the link/activity LED output of the PHY, thus the link disappears and
|
||||
* reappears after each packet. We'd be better off ignoring such signal
|
||||
* and getting the link state from the PHY indirectly.
|
||||
*/
|
||||
.no_ether_link = 1,
|
||||
};
|
||||
|
||||
static struct platform_device_info ether_info __initdata = {
|
||||
.name = "r8a777x-ether",
|
||||
.id = -1,
|
||||
.res = ether_resources,
|
||||
.num_res = ARRAY_SIZE(ether_resources),
|
||||
.data = ðer_platform_data,
|
||||
.size_data = sizeof(ether_platform_data),
|
||||
.dma_mask = DMA_BIT_MASK(32),
|
||||
};
|
||||
|
||||
/* I2C */
|
||||
static struct i2c_board_info i2c0_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rx8581", 0x51),
|
||||
}, {
|
||||
I2C_BOARD_INFO("ak4643", 0x12),
|
||||
}
|
||||
};
|
||||
|
||||
/* HSPI*/
|
||||
static struct mtd_partition m25p80_spi_flash_partitions[] = {
|
||||
{
|
||||
.name = "data(spi)",
|
||||
.size = 0x0100000,
|
||||
.offset = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data spi_flash_data = {
|
||||
.name = "m25p80",
|
||||
.type = "s25fl008k",
|
||||
.parts = m25p80_spi_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(m25p80_spi_flash_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.max_speed_hz = 104000000,
|
||||
.chip_select = 0,
|
||||
.bus_num = 0,
|
||||
.mode = SPI_MODE_0,
|
||||
.platform_data = &spi_flash_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* MMC */
|
||||
static struct resource mmc_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffe4e000, 0x100),
|
||||
DEFINE_RES_IRQ(gic_iid(0x5d)),
|
||||
};
|
||||
|
||||
static struct sh_mmcif_plat_data sh_mmcif_plat __initdata = {
|
||||
.sup_pclk = 0,
|
||||
.caps = MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_8_BIT_DATA |
|
||||
MMC_CAP_NEEDS_POLL,
|
||||
};
|
||||
|
||||
/* In the default configuration both decoders reside on I2C bus 0 */
|
||||
#define BOCKW_CAMERA(idx) \
|
||||
static struct i2c_board_info camera##idx##_info = { \
|
||||
I2C_BOARD_INFO("ml86v7667", 0x41 + 2 * (idx)), \
|
||||
}; \
|
||||
\
|
||||
static struct soc_camera_link iclink##idx##_ml86v7667 __initdata = { \
|
||||
.bus_id = idx, \
|
||||
.i2c_adapter_id = 0, \
|
||||
.board_info = &camera##idx##_info, \
|
||||
}
|
||||
|
||||
BOCKW_CAMERA(0);
|
||||
BOCKW_CAMERA(1);
|
||||
|
||||
/* VIN */
|
||||
static struct rcar_vin_platform_data vin_platform_data __initdata = {
|
||||
.flags = RCAR_VIN_BT656,
|
||||
};
|
||||
|
||||
#define R8A7778_VIN(idx) \
|
||||
static struct resource vin##idx##_resources[] __initdata = { \
|
||||
DEFINE_RES_MEM(0xffc50000 + 0x1000 * (idx), 0x1000), \
|
||||
DEFINE_RES_IRQ(gic_iid(0x5a)), \
|
||||
}; \
|
||||
\
|
||||
static struct platform_device_info vin##idx##_info __initdata = { \
|
||||
.name = "r8a7778-vin", \
|
||||
.id = idx, \
|
||||
.res = vin##idx##_resources, \
|
||||
.num_res = ARRAY_SIZE(vin##idx##_resources), \
|
||||
.dma_mask = DMA_BIT_MASK(32), \
|
||||
.data = &vin_platform_data, \
|
||||
.size_data = sizeof(vin_platform_data), \
|
||||
}
|
||||
R8A7778_VIN(0);
|
||||
R8A7778_VIN(1);
|
||||
|
||||
/* Sound */
|
||||
static struct resource rsnd_resources[] __initdata = {
|
||||
[RSND_GEN1_SRU] = DEFINE_RES_MEM(0xffd90000, 0x1000),
|
||||
[RSND_GEN1_SSI] = DEFINE_RES_MEM(0xffd91000, 0x1240),
|
||||
[RSND_GEN1_ADG] = DEFINE_RES_MEM(0xfffe0000, 0x24),
|
||||
};
|
||||
|
||||
static struct rsnd_ssi_platform_info rsnd_ssi[] = {
|
||||
RSND_SSI_UNUSED, /* SSI 0 */
|
||||
RSND_SSI_UNUSED, /* SSI 1 */
|
||||
RSND_SSI_UNUSED, /* SSI 2 */
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF3_TX, gic_iid(0x85), 0),
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF4_RX, gic_iid(0x85), RSND_SSI_CLK_PIN_SHARE),
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF5_TX, gic_iid(0x86), 0),
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF6_RX, gic_iid(0x86), 0),
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF7_TX, gic_iid(0x86), 0),
|
||||
RSND_SSI(HPBDMA_SLAVE_HPBIF8_RX, gic_iid(0x86), RSND_SSI_CLK_PIN_SHARE),
|
||||
};
|
||||
|
||||
static struct rsnd_src_platform_info rsnd_src[9] = {
|
||||
RSND_SRC_UNUSED, /* SRU 0 */
|
||||
RSND_SRC_UNUSED, /* SRU 1 */
|
||||
RSND_SRC_UNUSED, /* SRU 2 */
|
||||
RSND_SRC(0, 0),
|
||||
RSND_SRC(0, 0),
|
||||
RSND_SRC(0, 0),
|
||||
RSND_SRC(0, 0),
|
||||
RSND_SRC(0, 0),
|
||||
RSND_SRC(0, 0),
|
||||
};
|
||||
|
||||
static struct rsnd_dai_platform_info rsnd_dai[] = {
|
||||
{
|
||||
.playback = { .ssi = &rsnd_ssi[5], .src = &rsnd_src[5] },
|
||||
.capture = { .ssi = &rsnd_ssi[6], .src = &rsnd_src[6] },
|
||||
}, {
|
||||
.playback = { .ssi = &rsnd_ssi[3], .src = &rsnd_src[3] },
|
||||
}, {
|
||||
.capture = { .ssi = &rsnd_ssi[4], .src = &rsnd_src[4] },
|
||||
}, {
|
||||
.playback = { .ssi = &rsnd_ssi[7], .src = &rsnd_src[7] },
|
||||
}, {
|
||||
.capture = { .ssi = &rsnd_ssi[8], .src = &rsnd_src[8] },
|
||||
},
|
||||
};
|
||||
|
||||
enum {
|
||||
AK4554_34 = 0,
|
||||
AK4643_56,
|
||||
AK4554_78,
|
||||
SOUND_MAX,
|
||||
};
|
||||
|
||||
static int rsnd_codec_power(int id, int enable)
|
||||
{
|
||||
static int sound_user[SOUND_MAX] = {0, 0, 0};
|
||||
int *usr = NULL;
|
||||
u32 bit;
|
||||
|
||||
switch (id) {
|
||||
case 3:
|
||||
case 4:
|
||||
usr = sound_user + AK4554_34;
|
||||
bit = (1 << 10);
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
usr = sound_user + AK4643_56;
|
||||
bit = (1 << 6);
|
||||
break;
|
||||
case 7:
|
||||
case 8:
|
||||
usr = sound_user + AK4554_78;
|
||||
bit = (1 << 7);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!usr)
|
||||
return -EIO;
|
||||
|
||||
if (enable) {
|
||||
if (*usr == 0) {
|
||||
u32 val = ioread16(fpga + COMCTLR);
|
||||
val &= ~bit;
|
||||
iowrite16(val, fpga + COMCTLR);
|
||||
}
|
||||
|
||||
(*usr)++;
|
||||
} else {
|
||||
if (*usr == 0)
|
||||
return 0;
|
||||
|
||||
(*usr)--;
|
||||
|
||||
if (*usr == 0) {
|
||||
u32 val = ioread16(fpga + COMCTLR);
|
||||
val |= bit;
|
||||
iowrite16(val, fpga + COMCTLR);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rsnd_start(int id)
|
||||
{
|
||||
return rsnd_codec_power(id, 1);
|
||||
}
|
||||
|
||||
static int rsnd_stop(int id)
|
||||
{
|
||||
return rsnd_codec_power(id, 0);
|
||||
}
|
||||
|
||||
static struct rcar_snd_info rsnd_info = {
|
||||
.flags = RSND_GEN1,
|
||||
.ssi_info = rsnd_ssi,
|
||||
.ssi_info_nr = ARRAY_SIZE(rsnd_ssi),
|
||||
.src_info = rsnd_src,
|
||||
.src_info_nr = ARRAY_SIZE(rsnd_src),
|
||||
.dai_info = rsnd_dai,
|
||||
.dai_info_nr = ARRAY_SIZE(rsnd_dai),
|
||||
.start = rsnd_start,
|
||||
.stop = rsnd_stop,
|
||||
};
|
||||
|
||||
static struct asoc_simple_card_info rsnd_card_info[] = {
|
||||
/* SSI5, SSI6 */
|
||||
{
|
||||
.name = "AK4643",
|
||||
.card = "SSI56-AK4643",
|
||||
.codec = "ak4642-codec.0-0012",
|
||||
.platform = "rcar_sound",
|
||||
.daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM,
|
||||
.cpu_dai = {
|
||||
.name = "rsnd-dai.0",
|
||||
},
|
||||
.codec_dai = {
|
||||
.name = "ak4642-hifi",
|
||||
.sysclk = 11289600,
|
||||
},
|
||||
},
|
||||
/* SSI3 */
|
||||
{
|
||||
.name = "AK4554",
|
||||
.card = "SSI3-AK4554(playback)",
|
||||
.codec = "ak4554-adc-dac.0",
|
||||
.platform = "rcar_sound",
|
||||
.daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_RIGHT_J,
|
||||
.cpu_dai = {
|
||||
.name = "rsnd-dai.1",
|
||||
},
|
||||
.codec_dai = {
|
||||
.name = "ak4554-hifi",
|
||||
},
|
||||
},
|
||||
/* SSI4 */
|
||||
{
|
||||
.name = "AK4554",
|
||||
.card = "SSI4-AK4554(capture)",
|
||||
.codec = "ak4554-adc-dac.0",
|
||||
.platform = "rcar_sound",
|
||||
.daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_LEFT_J,
|
||||
.cpu_dai = {
|
||||
.name = "rsnd-dai.2",
|
||||
},
|
||||
.codec_dai = {
|
||||
.name = "ak4554-hifi",
|
||||
},
|
||||
},
|
||||
/* SSI7 */
|
||||
{
|
||||
.name = "AK4554",
|
||||
.card = "SSI7-AK4554(playback)",
|
||||
.codec = "ak4554-adc-dac.1",
|
||||
.platform = "rcar_sound",
|
||||
.daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_RIGHT_J,
|
||||
.cpu_dai = {
|
||||
.name = "rsnd-dai.3",
|
||||
},
|
||||
.codec_dai = {
|
||||
.name = "ak4554-hifi",
|
||||
},
|
||||
},
|
||||
/* SSI8 */
|
||||
{
|
||||
.name = "AK4554",
|
||||
.card = "SSI8-AK4554(capture)",
|
||||
.codec = "ak4554-adc-dac.1",
|
||||
.platform = "rcar_sound",
|
||||
.daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_LEFT_J,
|
||||
.cpu_dai = {
|
||||
.name = "rsnd-dai.4",
|
||||
},
|
||||
.codec_dai = {
|
||||
.name = "ak4554-hifi",
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
static const struct pinctrl_map bockw_pinctrl_map[] = {
|
||||
/* AUDIO */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"audio_clk_a", "audio_clk"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"audio_clk_b", "audio_clk"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi34_ctrl", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi3_data", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi4_data", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi5_ctrl", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi5_data", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi6_ctrl", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi6_data", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi78_ctrl", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi7_data", "ssi"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778",
|
||||
"ssi8_data", "ssi"),
|
||||
/* Ether */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778",
|
||||
"ether_rmii", "ether"),
|
||||
/* HSPI0 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-hspi.0", "pfc-r8a7778",
|
||||
"hspi0_a", "hspi0"),
|
||||
/* MMC */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif", "pfc-r8a7778",
|
||||
"mmc_data8", "mmc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif", "pfc-r8a7778",
|
||||
"mmc_ctrl", "mmc"),
|
||||
/* SCIF0 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
|
||||
"scif0_data_a", "scif0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
|
||||
"scif0_ctrl", "scif0"),
|
||||
/* USB */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778",
|
||||
"usb0", "usb0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT(USB1_DEVICE, "pfc-r8a7778",
|
||||
"usb1", "usb1"),
|
||||
/* SDHI0 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
|
||||
"sdhi0_data4", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
|
||||
"sdhi0_ctrl", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
|
||||
"sdhi0_cd", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
|
||||
"sdhi0_wp", "sdhi0"),
|
||||
/* VIN0 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778",
|
||||
"vin0_clk", "vin0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778",
|
||||
"vin0_data8", "vin0"),
|
||||
/* VIN1 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778",
|
||||
"vin1_clk", "vin1"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778",
|
||||
"vin1_data8", "vin1"),
|
||||
};
|
||||
|
||||
#define PFC 0xfffc0000
|
||||
#define PUPR4 0x110
|
||||
static void __init bockw_init(void)
|
||||
{
|
||||
void __iomem *base;
|
||||
struct clk *clk;
|
||||
struct platform_device *pdev;
|
||||
int i;
|
||||
|
||||
r8a7778_clock_init();
|
||||
r8a7778_init_irq_extpin(1);
|
||||
r8a7778_add_standard_devices();
|
||||
|
||||
platform_device_register_full(ðer_info);
|
||||
|
||||
platform_device_register_full(&vin0_info);
|
||||
/* VIN1 has a pin conflict with Ether */
|
||||
if (!IS_ENABLED(CONFIG_SH_ETH))
|
||||
platform_device_register_full(&vin1_info);
|
||||
platform_device_register_data(NULL, "soc-camera-pdrv", 0,
|
||||
&iclink0_ml86v7667,
|
||||
sizeof(iclink0_ml86v7667));
|
||||
platform_device_register_data(NULL, "soc-camera-pdrv", 1,
|
||||
&iclink1_ml86v7667,
|
||||
sizeof(iclink1_ml86v7667));
|
||||
|
||||
i2c_register_board_info(0, i2c0_devices,
|
||||
ARRAY_SIZE(i2c0_devices));
|
||||
spi_register_board_info(spi_board_info,
|
||||
ARRAY_SIZE(spi_board_info));
|
||||
pinctrl_register_mappings(bockw_pinctrl_map,
|
||||
ARRAY_SIZE(bockw_pinctrl_map));
|
||||
r8a7778_pinmux_init();
|
||||
|
||||
platform_device_register_resndata(
|
||||
NULL, "sh_mmcif", -1,
|
||||
mmc_resources, ARRAY_SIZE(mmc_resources),
|
||||
&sh_mmcif_plat, sizeof(struct sh_mmcif_plat_data));
|
||||
|
||||
platform_device_register_resndata(
|
||||
NULL, "rcar_usb_phy", -1,
|
||||
usb_phy_resources,
|
||||
ARRAY_SIZE(usb_phy_resources),
|
||||
&usb_phy_platform_data,
|
||||
sizeof(struct rcar_phy_platform_data));
|
||||
|
||||
regulator_register_fixed(0, dummy_supplies,
|
||||
ARRAY_SIZE(dummy_supplies));
|
||||
regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
|
||||
ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
|
||||
|
||||
/* for SMSC */
|
||||
fpga = ioremap_nocache(FPGA, SZ_1M);
|
||||
if (fpga) {
|
||||
/*
|
||||
* CAUTION
|
||||
*
|
||||
* IRQ0/1 is cascaded interrupt from FPGA.
|
||||
* it should be cared in the future
|
||||
* Now, it is assuming IRQ0 was used only from SMSC.
|
||||
*/
|
||||
u16 val = ioread16(fpga + IRQ0MR);
|
||||
val &= ~(1 << 4); /* enable SMSC911x */
|
||||
iowrite16(val, fpga + IRQ0MR);
|
||||
|
||||
platform_device_register_resndata(
|
||||
NULL, "smsc911x", -1,
|
||||
smsc911x_resources, ARRAY_SIZE(smsc911x_resources),
|
||||
&smsc911x_data, sizeof(smsc911x_data));
|
||||
}
|
||||
|
||||
/* for SDHI */
|
||||
base = ioremap_nocache(PFC, 0x200);
|
||||
if (base) {
|
||||
/*
|
||||
* FIXME
|
||||
*
|
||||
* SDHI CD/WP pin needs pull-up
|
||||
*/
|
||||
iowrite32(ioread32(base + PUPR4) | (3 << 26), base + PUPR4);
|
||||
iounmap(base);
|
||||
|
||||
platform_device_register_resndata(
|
||||
NULL, "sh_mobile_sdhi", 0,
|
||||
sdhi0_resources, ARRAY_SIZE(sdhi0_resources),
|
||||
&sdhi0_info, sizeof(struct tmio_mmc_data));
|
||||
}
|
||||
|
||||
/* for Audio */
|
||||
rsnd_codec_power(5, 1); /* enable ak4642 */
|
||||
|
||||
platform_device_register_simple(
|
||||
"ak4554-adc-dac", 0, NULL, 0);
|
||||
|
||||
platform_device_register_simple(
|
||||
"ak4554-adc-dac", 1, NULL, 0);
|
||||
|
||||
pdev = platform_device_register_resndata(
|
||||
NULL, "rcar_sound", -1,
|
||||
rsnd_resources, ARRAY_SIZE(rsnd_resources),
|
||||
&rsnd_info, sizeof(rsnd_info));
|
||||
|
||||
clk = clk_get(&pdev->dev, "clk_b");
|
||||
clk_set_rate(clk, 24576000);
|
||||
clk_put(clk);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rsnd_card_info); i++) {
|
||||
struct platform_device_info cardinfo = {
|
||||
.name = "asoc-simple-card",
|
||||
.id = i,
|
||||
.data = &rsnd_card_info[i],
|
||||
.size_data = sizeof(struct asoc_simple_card_info),
|
||||
.dma_mask = DMA_BIT_MASK(32),
|
||||
};
|
||||
|
||||
platform_device_register_full(&cardinfo);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init bockw_init_late(void)
|
||||
{
|
||||
r8a7778_init_late();
|
||||
ADD_USB_FUNC_DEVICE_IF_POSSIBLE();
|
||||
}
|
||||
|
||||
static const char *const bockw_boards_compat_dt[] __initconst = {
|
||||
"renesas,bockw",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(BOCKW_DT, "bockw")
|
||||
.init_early = shmobile_init_delay,
|
||||
.init_irq = r8a7778_init_irq_dt,
|
||||
.init_machine = bockw_init,
|
||||
.dt_compat = bockw_boards_compat_dt,
|
||||
.init_late = bockw_init_late,
|
||||
MACHINE_END
|
|
@ -1,342 +0,0 @@
|
|||
/*
|
||||
* r8a7778 clock framework support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* based on r8a7779
|
||||
*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MD MD MD MD PLLA PLLB EXTAL clki clkz
|
||||
* 19 18 12 11 (HMz) (MHz) (MHz)
|
||||
*----------------------------------------------------------------------------
|
||||
* 1 0 0 0 x21 x21 38.00 800 800
|
||||
* 1 0 0 1 x24 x24 33.33 800 800
|
||||
* 1 0 1 0 x28 x28 28.50 800 800
|
||||
* 1 0 1 1 x32 x32 25.00 800 800
|
||||
* 1 1 0 1 x24 x21 33.33 800 700
|
||||
* 1 1 1 0 x28 x21 28.50 800 600
|
||||
* 1 1 1 1 x32 x24 25.00 800 600
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/sh_clk.h>
|
||||
#include <linux/clkdev.h>
|
||||
#include "clock.h"
|
||||
#include "common.h"
|
||||
|
||||
#define MSTPCR0 IOMEM(0xffc80030)
|
||||
#define MSTPCR1 IOMEM(0xffc80034)
|
||||
#define MSTPCR3 IOMEM(0xffc8003c)
|
||||
#define MSTPSR1 IOMEM(0xffc80044)
|
||||
#define MSTPSR4 IOMEM(0xffc80048)
|
||||
#define MSTPSR6 IOMEM(0xffc8004c)
|
||||
#define MSTPCR4 IOMEM(0xffc80050)
|
||||
#define MSTPCR5 IOMEM(0xffc80054)
|
||||
#define MSTPCR6 IOMEM(0xffc80058)
|
||||
#define MODEMR 0xFFCC0020
|
||||
|
||||
#define MD(nr) BIT(nr)
|
||||
|
||||
/* ioremap() through clock mapping mandatory to avoid
|
||||
* collision with ARM coherent DMA virtual memory range.
|
||||
*/
|
||||
|
||||
static struct clk_mapping cpg_mapping = {
|
||||
.phys = 0xffc80000,
|
||||
.len = 0x80,
|
||||
};
|
||||
|
||||
static struct clk extal_clk = {
|
||||
/* .rate will be updated on r8a7778_clock_init() */
|
||||
.mapping = &cpg_mapping,
|
||||
};
|
||||
|
||||
static struct clk audio_clk_a = {
|
||||
};
|
||||
|
||||
static struct clk audio_clk_b = {
|
||||
};
|
||||
|
||||
static struct clk audio_clk_c = {
|
||||
};
|
||||
|
||||
/*
|
||||
* clock ratio of these clock will be updated
|
||||
* on r8a7778_clock_init()
|
||||
*/
|
||||
SH_FIXED_RATIO_CLK_SET(plla_clk, extal_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(pllb_clk, extal_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(i_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(s_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(s1_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(s3_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(s4_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(b_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(out_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(p_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(g_clk, plla_clk, 1, 1);
|
||||
SH_FIXED_RATIO_CLK_SET(z_clk, pllb_clk, 1, 1);
|
||||
|
||||
static struct clk *main_clks[] = {
|
||||
&extal_clk,
|
||||
&plla_clk,
|
||||
&pllb_clk,
|
||||
&i_clk,
|
||||
&s_clk,
|
||||
&s1_clk,
|
||||
&s3_clk,
|
||||
&s4_clk,
|
||||
&b_clk,
|
||||
&out_clk,
|
||||
&p_clk,
|
||||
&g_clk,
|
||||
&z_clk,
|
||||
&audio_clk_a,
|
||||
&audio_clk_b,
|
||||
&audio_clk_c,
|
||||
};
|
||||
|
||||
enum {
|
||||
MSTP531, MSTP530,
|
||||
MSTP529, MSTP528, MSTP527, MSTP526, MSTP525, MSTP524, MSTP523,
|
||||
MSTP331,
|
||||
MSTP323, MSTP322, MSTP321,
|
||||
MSTP311, MSTP310,
|
||||
MSTP309, MSTP308, MSTP307,
|
||||
MSTP114,
|
||||
MSTP110, MSTP109,
|
||||
MSTP100,
|
||||
MSTP030,
|
||||
MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
|
||||
MSTP016, MSTP015, MSTP012, MSTP011, MSTP010,
|
||||
MSTP009, MSTP008, MSTP007,
|
||||
MSTP_NR };
|
||||
|
||||
static struct clk mstp_clks[MSTP_NR] = {
|
||||
[MSTP531] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 31, 0), /* SCU0 */
|
||||
[MSTP530] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 30, 0), /* SCU1 */
|
||||
[MSTP529] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 29, 0), /* SCU2 */
|
||||
[MSTP528] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 28, 0), /* SCU3 */
|
||||
[MSTP527] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 27, 0), /* SCU4 */
|
||||
[MSTP526] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 26, 0), /* SCU5 */
|
||||
[MSTP525] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 25, 0), /* SCU6 */
|
||||
[MSTP524] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 24, 0), /* SCU7 */
|
||||
[MSTP523] = SH_CLK_MSTP32(&p_clk, MSTPCR5, 23, 0), /* SCU8 */
|
||||
[MSTP331] = SH_CLK_MSTP32(&s4_clk, MSTPCR3, 31, 0), /* MMC */
|
||||
[MSTP323] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 23, 0), /* SDHI0 */
|
||||
[MSTP322] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 22, 0), /* SDHI1 */
|
||||
[MSTP321] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 21, 0), /* SDHI2 */
|
||||
[MSTP311] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 11, 0), /* SSI4 */
|
||||
[MSTP310] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 10, 0), /* SSI5 */
|
||||
[MSTP309] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 9, 0), /* SSI6 */
|
||||
[MSTP308] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 8, 0), /* SSI7 */
|
||||
[MSTP307] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 7, 0), /* SSI8 */
|
||||
[MSTP114] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 14, 0), /* Ether */
|
||||
[MSTP110] = SH_CLK_MSTP32(&s_clk, MSTPCR1, 10, 0), /* VIN0 */
|
||||
[MSTP109] = SH_CLK_MSTP32(&s_clk, MSTPCR1, 9, 0), /* VIN1 */
|
||||
[MSTP100] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 0, 0), /* USB0/1 */
|
||||
[MSTP030] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 30, 0), /* I2C0 */
|
||||
[MSTP029] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 29, 0), /* I2C1 */
|
||||
[MSTP028] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 28, 0), /* I2C2 */
|
||||
[MSTP027] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 27, 0), /* I2C3 */
|
||||
[MSTP026] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 26, 0), /* SCIF0 */
|
||||
[MSTP025] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 25, 0), /* SCIF1 */
|
||||
[MSTP024] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 24, 0), /* SCIF2 */
|
||||
[MSTP023] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 23, 0), /* SCIF3 */
|
||||
[MSTP022] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 22, 0), /* SCIF4 */
|
||||
[MSTP021] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 21, 0), /* SCIF5 */
|
||||
[MSTP016] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 16, 0), /* TMU0 */
|
||||
[MSTP015] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 15, 0), /* TMU1 */
|
||||
[MSTP012] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 12, 0), /* SSI0 */
|
||||
[MSTP011] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 11, 0), /* SSI1 */
|
||||
[MSTP010] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 10, 0), /* SSI2 */
|
||||
[MSTP009] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 9, 0), /* SSI3 */
|
||||
[MSTP008] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 8, 0), /* SRU */
|
||||
[MSTP007] = SH_CLK_MSTP32(&s_clk, MSTPCR0, 7, 0), /* HSPI */
|
||||
};
|
||||
|
||||
static struct clk_lookup lookups[] = {
|
||||
/* main */
|
||||
CLKDEV_CON_ID("shyway_clk", &s_clk),
|
||||
CLKDEV_CON_ID("peripheral_clk", &p_clk),
|
||||
|
||||
/* MSTP32 clocks */
|
||||
CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP331]), /* MMC */
|
||||
CLKDEV_DEV_ID("ffe4e000.mmc", &mstp_clks[MSTP331]), /* MMC */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */
|
||||
CLKDEV_DEV_ID("ffe4c000.sd", &mstp_clks[MSTP323]), /* SDHI0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("ffe4d000.sd", &mstp_clks[MSTP322]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("ffe4f000.sd", &mstp_clks[MSTP321]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
|
||||
CLKDEV_DEV_ID("r8a7778-vin.0", &mstp_clks[MSTP110]), /* VIN0 */
|
||||
CLKDEV_DEV_ID("r8a7778-vin.1", &mstp_clks[MSTP109]), /* VIN1 */
|
||||
CLKDEV_DEV_ID("ehci-platform", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
|
||||
CLKDEV_DEV_ID("ohci-platform", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
|
||||
CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP100]), /* USB FUNC */
|
||||
CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
|
||||
CLKDEV_DEV_ID("ffc70000.i2c", &mstp_clks[MSTP030]), /* I2C0 */
|
||||
CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */
|
||||
CLKDEV_DEV_ID("ffc71000.i2c", &mstp_clks[MSTP029]), /* I2C1 */
|
||||
CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */
|
||||
CLKDEV_DEV_ID("ffc72000.i2c", &mstp_clks[MSTP028]), /* I2C2 */
|
||||
CLKDEV_DEV_ID("i2c-rcar.3", &mstp_clks[MSTP027]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("ffc73000.i2c", &mstp_clks[MSTP027]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP026]), /* SCIF0 */
|
||||
CLKDEV_DEV_ID("ffe40000.serial", &mstp_clks[MSTP026]), /* SCIF0 */
|
||||
CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP025]), /* SCIF1 */
|
||||
CLKDEV_DEV_ID("ffe41000.serial", &mstp_clks[MSTP025]), /* SCIF1 */
|
||||
CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP024]), /* SCIF2 */
|
||||
CLKDEV_DEV_ID("ffe42000.serial", &mstp_clks[MSTP024]), /* SCIF2 */
|
||||
CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */
|
||||
CLKDEV_DEV_ID("ffe43000.serial", &mstp_clks[MSTP023]), /* SCIF3 */
|
||||
CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */
|
||||
CLKDEV_DEV_ID("ffe44000.serial", &mstp_clks[MSTP022]), /* SCIF4 */
|
||||
CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */
|
||||
CLKDEV_DEV_ID("ffe45000.serial", &mstp_clks[MSTP021]), /* SCIF5 */
|
||||
CLKDEV_DEV_ID("sh-hspi.0", &mstp_clks[MSTP007]), /* HSPI0 */
|
||||
CLKDEV_DEV_ID("fffc7000.spi", &mstp_clks[MSTP007]), /* HSPI0 */
|
||||
CLKDEV_DEV_ID("sh-hspi.1", &mstp_clks[MSTP007]), /* HSPI1 */
|
||||
CLKDEV_DEV_ID("fffc8000.spi", &mstp_clks[MSTP007]), /* HSPI1 */
|
||||
CLKDEV_DEV_ID("sh-hspi.2", &mstp_clks[MSTP007]), /* HSPI2 */
|
||||
CLKDEV_DEV_ID("fffc6000.spi", &mstp_clks[MSTP007]), /* HSPI2 */
|
||||
CLKDEV_DEV_ID("rcar_sound", &mstp_clks[MSTP008]), /* SRU */
|
||||
|
||||
CLKDEV_ICK_ID("clk_a", "rcar_sound", &audio_clk_a),
|
||||
CLKDEV_ICK_ID("clk_b", "rcar_sound", &audio_clk_b),
|
||||
CLKDEV_ICK_ID("clk_c", "rcar_sound", &audio_clk_c),
|
||||
CLKDEV_ICK_ID("clk_i", "rcar_sound", &s1_clk),
|
||||
CLKDEV_ICK_ID("ssi.0", "rcar_sound", &mstp_clks[MSTP012]),
|
||||
CLKDEV_ICK_ID("ssi.1", "rcar_sound", &mstp_clks[MSTP011]),
|
||||
CLKDEV_ICK_ID("ssi.2", "rcar_sound", &mstp_clks[MSTP010]),
|
||||
CLKDEV_ICK_ID("ssi.3", "rcar_sound", &mstp_clks[MSTP009]),
|
||||
CLKDEV_ICK_ID("ssi.4", "rcar_sound", &mstp_clks[MSTP311]),
|
||||
CLKDEV_ICK_ID("ssi.5", "rcar_sound", &mstp_clks[MSTP310]),
|
||||
CLKDEV_ICK_ID("ssi.6", "rcar_sound", &mstp_clks[MSTP309]),
|
||||
CLKDEV_ICK_ID("ssi.7", "rcar_sound", &mstp_clks[MSTP308]),
|
||||
CLKDEV_ICK_ID("ssi.8", "rcar_sound", &mstp_clks[MSTP307]),
|
||||
CLKDEV_ICK_ID("src.0", "rcar_sound", &mstp_clks[MSTP531]),
|
||||
CLKDEV_ICK_ID("src.1", "rcar_sound", &mstp_clks[MSTP530]),
|
||||
CLKDEV_ICK_ID("src.2", "rcar_sound", &mstp_clks[MSTP529]),
|
||||
CLKDEV_ICK_ID("src.3", "rcar_sound", &mstp_clks[MSTP528]),
|
||||
CLKDEV_ICK_ID("src.4", "rcar_sound", &mstp_clks[MSTP527]),
|
||||
CLKDEV_ICK_ID("src.5", "rcar_sound", &mstp_clks[MSTP526]),
|
||||
CLKDEV_ICK_ID("src.6", "rcar_sound", &mstp_clks[MSTP525]),
|
||||
CLKDEV_ICK_ID("src.7", "rcar_sound", &mstp_clks[MSTP524]),
|
||||
CLKDEV_ICK_ID("src.8", "rcar_sound", &mstp_clks[MSTP523]),
|
||||
CLKDEV_ICK_ID("fck", "sh-tmu.0", &mstp_clks[MSTP016]),
|
||||
CLKDEV_ICK_ID("fck", "ffd80000.timer", &mstp_clks[MSTP016]),
|
||||
CLKDEV_ICK_ID("fck", "sh-tmu.1", &mstp_clks[MSTP015]),
|
||||
CLKDEV_ICK_ID("fck", "ffd81000.timer", &mstp_clks[MSTP015]),
|
||||
};
|
||||
|
||||
void __init r8a7778_clock_init(void)
|
||||
{
|
||||
void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
|
||||
u32 mode;
|
||||
int k, ret = 0;
|
||||
|
||||
BUG_ON(!modemr);
|
||||
mode = ioread32(modemr);
|
||||
iounmap(modemr);
|
||||
|
||||
switch (mode & (MD(19) | MD(18) | MD(12) | MD(11))) {
|
||||
case MD(19):
|
||||
extal_clk.rate = 38000000;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 21, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 21, 1);
|
||||
break;
|
||||
case MD(19) | MD(11):
|
||||
extal_clk.rate = 33333333;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 24, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 24, 1);
|
||||
break;
|
||||
case MD(19) | MD(12):
|
||||
extal_clk.rate = 28500000;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 28, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 28, 1);
|
||||
break;
|
||||
case MD(19) | MD(12) | MD(11):
|
||||
extal_clk.rate = 25000000;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 32, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 32, 1);
|
||||
break;
|
||||
case MD(19) | MD(18) | MD(11):
|
||||
extal_clk.rate = 33333333;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 24, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 21, 1);
|
||||
break;
|
||||
case MD(19) | MD(18) | MD(12):
|
||||
extal_clk.rate = 28500000;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 28, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 21, 1);
|
||||
break;
|
||||
case MD(19) | MD(18) | MD(12) | MD(11):
|
||||
extal_clk.rate = 25000000;
|
||||
SH_CLK_SET_RATIO(&plla_clk_ratio, 32, 1);
|
||||
SH_CLK_SET_RATIO(&pllb_clk_ratio, 24, 1);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (mode & MD(1)) {
|
||||
SH_CLK_SET_RATIO(&i_clk_ratio, 1, 1);
|
||||
SH_CLK_SET_RATIO(&s_clk_ratio, 1, 3);
|
||||
SH_CLK_SET_RATIO(&s1_clk_ratio, 1, 6);
|
||||
SH_CLK_SET_RATIO(&s3_clk_ratio, 1, 4);
|
||||
SH_CLK_SET_RATIO(&s4_clk_ratio, 1, 8);
|
||||
SH_CLK_SET_RATIO(&p_clk_ratio, 1, 12);
|
||||
SH_CLK_SET_RATIO(&g_clk_ratio, 1, 12);
|
||||
if (mode & MD(2)) {
|
||||
SH_CLK_SET_RATIO(&b_clk_ratio, 1, 18);
|
||||
SH_CLK_SET_RATIO(&out_clk_ratio, 1, 18);
|
||||
} else {
|
||||
SH_CLK_SET_RATIO(&b_clk_ratio, 1, 12);
|
||||
SH_CLK_SET_RATIO(&out_clk_ratio, 1, 12);
|
||||
}
|
||||
} else {
|
||||
SH_CLK_SET_RATIO(&i_clk_ratio, 1, 1);
|
||||
SH_CLK_SET_RATIO(&s_clk_ratio, 1, 4);
|
||||
SH_CLK_SET_RATIO(&s1_clk_ratio, 1, 8);
|
||||
SH_CLK_SET_RATIO(&s3_clk_ratio, 1, 4);
|
||||
SH_CLK_SET_RATIO(&s4_clk_ratio, 1, 8);
|
||||
SH_CLK_SET_RATIO(&p_clk_ratio, 1, 16);
|
||||
SH_CLK_SET_RATIO(&g_clk_ratio, 1, 12);
|
||||
if (mode & MD(2)) {
|
||||
SH_CLK_SET_RATIO(&b_clk_ratio, 1, 16);
|
||||
SH_CLK_SET_RATIO(&out_clk_ratio, 1, 16);
|
||||
} else {
|
||||
SH_CLK_SET_RATIO(&b_clk_ratio, 1, 12);
|
||||
SH_CLK_SET_RATIO(&out_clk_ratio, 1, 12);
|
||||
}
|
||||
}
|
||||
|
||||
for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
|
||||
ret = clk_register(main_clks[k]);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
|
||||
|
||||
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
||||
|
||||
if (!ret)
|
||||
shmobile_clk_init();
|
||||
else
|
||||
panic("failed to setup r8a7778 clocks\n");
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* SH-Mobile Clock Framework
|
||||
*
|
||||
* Copyright (C) 2010 Magnus Damm
|
||||
*
|
||||
* Used together with arch/arm/common/clkdev.c and drivers/sh/clk.c.
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sh_clk.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "common.h"
|
||||
|
||||
unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk)
|
||||
{
|
||||
struct clk_ratio *p = clk->priv;
|
||||
|
||||
return clk->parent->rate / p->div * p->mul;
|
||||
};
|
||||
|
||||
struct sh_clk_ops shmobile_fixed_ratio_clk_ops = {
|
||||
.recalc = shmobile_fixed_ratio_clk_recalc,
|
||||
};
|
||||
|
||||
int __init shmobile_clk_init(void)
|
||||
{
|
||||
/* Kick the child clocks.. */
|
||||
recalculate_root_clocks();
|
||||
|
||||
/* Enable the necessary init clocks */
|
||||
clk_enable_init_clocks();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
#ifndef CLOCK_H
|
||||
#define CLOCK_H
|
||||
|
||||
/* legacy clock implementation */
|
||||
|
||||
struct clk;
|
||||
unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk);
|
||||
extern struct sh_clk_ops shmobile_fixed_ratio_clk_ops;
|
||||
|
||||
/* clock ratio */
|
||||
struct clk_ratio {
|
||||
int mul;
|
||||
int div;
|
||||
};
|
||||
|
||||
#define SH_CLK_RATIO(name, m, d) \
|
||||
static struct clk_ratio name ##_ratio = { \
|
||||
.mul = m, \
|
||||
.div = d, \
|
||||
}
|
||||
|
||||
#define SH_FIXED_RATIO_CLKg(name, p, r) \
|
||||
struct clk name = { \
|
||||
.parent = &p, \
|
||||
.ops = &shmobile_fixed_ratio_clk_ops,\
|
||||
.priv = &r ## _ratio, \
|
||||
}
|
||||
|
||||
#define SH_FIXED_RATIO_CLK(name, p, r) \
|
||||
static SH_FIXED_RATIO_CLKg(name, p, r)
|
||||
|
||||
#define SH_FIXED_RATIO_CLK_SET(name, p, m, d) \
|
||||
SH_CLK_RATIO(name, m, d); \
|
||||
SH_FIXED_RATIO_CLK(name, p, name)
|
||||
|
||||
#define SH_CLK_SET_RATIO(p, m, d) \
|
||||
do { \
|
||||
(p)->mul = m; \
|
||||
(p)->div = d; \
|
||||
} while (0)
|
||||
|
||||
#endif
|
|
@ -1,10 +1,7 @@
|
|||
#ifndef __ARCH_MACH_COMMON_H
|
||||
#define __ARCH_MACH_COMMON_H
|
||||
|
||||
extern void shmobile_earlytimer_init(void);
|
||||
extern void shmobile_init_delay(void);
|
||||
struct twd_local_timer;
|
||||
extern void shmobile_setup_console(void);
|
||||
extern void shmobile_boot_vector(void);
|
||||
extern unsigned long shmobile_boot_fn;
|
||||
extern unsigned long shmobile_boot_arg;
|
||||
|
@ -18,8 +15,6 @@ extern void shmobile_boot_scu(void);
|
|||
extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
|
||||
extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
|
||||
extern int shmobile_smp_scu_cpu_kill(unsigned int cpu);
|
||||
struct clk;
|
||||
extern int shmobile_clk_init(void);
|
||||
extern struct platform_suspend_ops shmobile_suspend_ops;
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
* SH-Mobile Console
|
||||
*
|
||||
* Copyright (C) 2010 Magnus Damm
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include "common.h"
|
||||
|
||||
void __init shmobile_setup_console(void)
|
||||
{
|
||||
parse_early_param();
|
||||
|
||||
/* Let earlyprintk output early console messages */
|
||||
early_platform_driver_probe("earlyprintk", 1, 1);
|
||||
}
|
|
@ -1,295 +0,0 @@
|
|||
#ifndef __ASM_MACH_INTC_H
|
||||
#define __ASM_MACH_INTC_H
|
||||
#include <linux/sh_intc.h>
|
||||
|
||||
#define INTC_IRQ_PINS_ENUM_16L(p) \
|
||||
p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
||||
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7, \
|
||||
p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
||||
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15
|
||||
|
||||
#define INTC_IRQ_PINS_ENUM_16H(p) \
|
||||
p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
||||
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23, \
|
||||
p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
||||
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31
|
||||
|
||||
#define INTC_IRQ_PINS_VECT_16L(p, vect) \
|
||||
vect(p ## _IRQ0, 0x0200), vect(p ## _IRQ1, 0x0220), \
|
||||
vect(p ## _IRQ2, 0x0240), vect(p ## _IRQ3, 0x0260), \
|
||||
vect(p ## _IRQ4, 0x0280), vect(p ## _IRQ5, 0x02a0), \
|
||||
vect(p ## _IRQ6, 0x02c0), vect(p ## _IRQ7, 0x02e0), \
|
||||
vect(p ## _IRQ8, 0x0300), vect(p ## _IRQ9, 0x0320), \
|
||||
vect(p ## _IRQ10, 0x0340), vect(p ## _IRQ11, 0x0360), \
|
||||
vect(p ## _IRQ12, 0x0380), vect(p ## _IRQ13, 0x03a0), \
|
||||
vect(p ## _IRQ14, 0x03c0), vect(p ## _IRQ15, 0x03e0)
|
||||
|
||||
#define INTC_IRQ_PINS_VECT_16H(p, vect) \
|
||||
vect(p ## _IRQ16, 0x3200), vect(p ## _IRQ17, 0x3220), \
|
||||
vect(p ## _IRQ18, 0x3240), vect(p ## _IRQ19, 0x3260), \
|
||||
vect(p ## _IRQ20, 0x3280), vect(p ## _IRQ21, 0x32a0), \
|
||||
vect(p ## _IRQ22, 0x32c0), vect(p ## _IRQ23, 0x32e0), \
|
||||
vect(p ## _IRQ24, 0x3300), vect(p ## _IRQ25, 0x3320), \
|
||||
vect(p ## _IRQ26, 0x3340), vect(p ## _IRQ27, 0x3360), \
|
||||
vect(p ## _IRQ28, 0x3380), vect(p ## _IRQ29, 0x33a0), \
|
||||
vect(p ## _IRQ30, 0x33c0), vect(p ## _IRQ31, 0x33e0)
|
||||
|
||||
#define INTC_IRQ_PINS_MASK_16L(p, base) \
|
||||
{ base + 0x40, base + 0x60, 8, /* INTMSK00A / INTMSKCLR00A */ \
|
||||
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
||||
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
||||
{ base + 0x44, base + 0x64, 8, /* INTMSK10A / INTMSKCLR10A */ \
|
||||
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
||||
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
||||
|
||||
#define INTC_IRQ_PINS_MASK_16H(p, base) \
|
||||
{ base + 0x48, base + 0x68, 8, /* INTMSK20A / INTMSKCLR20A */ \
|
||||
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
||||
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
||||
{ base + 0x4c, base + 0x6c, 8, /* INTMSK30A / INTMSKCLR30A */ \
|
||||
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
||||
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
||||
|
||||
#define INTC_IRQ_PINS_PRIO_16L(p, base) \
|
||||
{ base + 0x10, 0, 32, 4, /* INTPRI00A */ \
|
||||
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
||||
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
||||
{ base + 0x14, 0, 32, 4, /* INTPRI10A */ \
|
||||
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
||||
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
||||
|
||||
#define INTC_IRQ_PINS_PRIO_16H(p, base) \
|
||||
{ base + 0x18, 0, 32, 4, /* INTPRI20A */ \
|
||||
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
||||
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
||||
{ base + 0x1c, 0, 32, 4, /* INTPRI30A */ \
|
||||
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
||||
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
||||
|
||||
#define INTC_IRQ_PINS_SENSE_16L(p, base) \
|
||||
{ base + 0x00, 32, 4, /* ICR1A */ \
|
||||
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
||||
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
||||
{ base + 0x04, 32, 4, /* ICR2A */ \
|
||||
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
||||
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
||||
|
||||
#define INTC_IRQ_PINS_SENSE_16H(p, base) \
|
||||
{ base + 0x08, 32, 4, /* ICR3A */ \
|
||||
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
||||
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
||||
{ base + 0x0c, 32, 4, /* ICR4A */ \
|
||||
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
||||
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
||||
|
||||
#define INTC_IRQ_PINS_ACK_16L(p, base) \
|
||||
{ base + 0x20, 0, 8, /* INTREQ00A */ \
|
||||
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
||||
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
||||
{ base + 0x24, 0, 8, /* INTREQ10A */ \
|
||||
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
||||
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
||||
|
||||
#define INTC_IRQ_PINS_ACK_16H(p, base) \
|
||||
{ base + 0x28, 0, 8, /* INTREQ20A */ \
|
||||
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
||||
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
||||
{ base + 0x2c, 0, 8, /* INTREQ30A */ \
|
||||
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
||||
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
||||
|
||||
#define INTC_IRQ_PINS_16(p, base, vect, str) \
|
||||
\
|
||||
static struct resource p ## _resources[] __initdata = { \
|
||||
[0] = { \
|
||||
.start = base, \
|
||||
.end = base + 0x64, \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
}; \
|
||||
\
|
||||
enum { \
|
||||
p ## _UNUSED = 0, \
|
||||
INTC_IRQ_PINS_ENUM_16L(p), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_vect p ## _vectors[] __initdata = { \
|
||||
INTC_IRQ_PINS_VECT_16L(p, vect), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_MASK_16L(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_PRIO_16L(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_SENSE_16L(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_ACK_16L(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_desc p ## _desc __initdata = { \
|
||||
.name = str, \
|
||||
.resource = p ## _resources, \
|
||||
.num_resources = ARRAY_SIZE(p ## _resources), \
|
||||
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
||||
p ## _mask_registers, p ## _prio_registers, \
|
||||
p ## _sense_registers, p ## _ack_registers) \
|
||||
}
|
||||
|
||||
#define INTC_IRQ_PINS_16H(p, base, vect, str) \
|
||||
\
|
||||
static struct resource p ## _resources[] __initdata = { \
|
||||
[0] = { \
|
||||
.start = base, \
|
||||
.end = base + 0x64, \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
}; \
|
||||
\
|
||||
enum { \
|
||||
p ## _UNUSED = 0, \
|
||||
INTC_IRQ_PINS_ENUM_16H(p), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_vect p ## _vectors[] __initdata = { \
|
||||
INTC_IRQ_PINS_VECT_16H(p, vect), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_MASK_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_PRIO_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_SENSE_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_ACK_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_desc p ## _desc __initdata = { \
|
||||
.name = str, \
|
||||
.resource = p ## _resources, \
|
||||
.num_resources = ARRAY_SIZE(p ## _resources), \
|
||||
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
||||
p ## _mask_registers, p ## _prio_registers, \
|
||||
p ## _sense_registers, p ## _ack_registers) \
|
||||
}
|
||||
|
||||
#define INTC_IRQ_PINS_32(p, base, vect, str) \
|
||||
\
|
||||
static struct resource p ## _resources[] __initdata = { \
|
||||
[0] = { \
|
||||
.start = base, \
|
||||
.end = base + 0x6c, \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
}; \
|
||||
\
|
||||
enum { \
|
||||
p ## _UNUSED = 0, \
|
||||
INTC_IRQ_PINS_ENUM_16L(p), \
|
||||
INTC_IRQ_PINS_ENUM_16H(p), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_vect p ## _vectors[] __initdata = { \
|
||||
INTC_IRQ_PINS_VECT_16L(p, vect), \
|
||||
INTC_IRQ_PINS_VECT_16H(p, vect), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_MASK_16L(p, base), \
|
||||
INTC_IRQ_PINS_MASK_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_PRIO_16L(p, base), \
|
||||
INTC_IRQ_PINS_PRIO_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_SENSE_16L(p, base), \
|
||||
INTC_IRQ_PINS_SENSE_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
||||
INTC_IRQ_PINS_ACK_16L(p, base), \
|
||||
INTC_IRQ_PINS_ACK_16H(p, base), \
|
||||
}; \
|
||||
\
|
||||
static struct intc_desc p ## _desc __initdata = { \
|
||||
.name = str, \
|
||||
.resource = p ## _resources, \
|
||||
.num_resources = ARRAY_SIZE(p ## _resources), \
|
||||
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
||||
p ## _mask_registers, p ## _prio_registers, \
|
||||
p ## _sense_registers, p ## _ack_registers) \
|
||||
}
|
||||
|
||||
#define INTC_PINT_E_EMPTY
|
||||
#define INTC_PINT_E_NONE 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
#define INTC_PINT_E(p) \
|
||||
PINT ## p ## 0, PINT ## p ## 1, PINT ## p ## 2, PINT ## p ## 3, \
|
||||
PINT ## p ## 4, PINT ## p ## 5, PINT ## p ## 6, PINT ## p ## 7,
|
||||
|
||||
#define INTC_PINT_V_NONE
|
||||
#define INTC_PINT_V(p, vect) \
|
||||
vect(PINT ## p ## 0, 0), vect(PINT ## p ## 1, 1), \
|
||||
vect(PINT ## p ## 2, 2), vect(PINT ## p ## 3, 3), \
|
||||
vect(PINT ## p ## 4, 4), vect(PINT ## p ## 5, 5), \
|
||||
vect(PINT ## p ## 6, 6), vect(PINT ## p ## 7, 7),
|
||||
|
||||
#define INTC_PINT(p, mask_reg, sense_base, str, \
|
||||
enums_1, enums_2, enums_3, enums_4, \
|
||||
vect_1, vect_2, vect_3, vect_4, \
|
||||
mask_a, mask_b, mask_c, mask_d, \
|
||||
sense_a, sense_b, sense_c, sense_d) \
|
||||
\
|
||||
enum { \
|
||||
PINT ## p ## _UNUSED = 0, \
|
||||
enums_1 enums_2 enums_3 enums_4 \
|
||||
}; \
|
||||
\
|
||||
static struct intc_vect p ## _vectors[] __initdata = { \
|
||||
vect_1 vect_2 vect_3 vect_4 \
|
||||
}; \
|
||||
\
|
||||
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
||||
{ mask_reg, 0, 32, /* PINTER */ \
|
||||
{ mask_a mask_b mask_c mask_d } } \
|
||||
}; \
|
||||
\
|
||||
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
||||
{ sense_base + 0x00, 16, 2, /* PINTCR */ \
|
||||
{ sense_a } }, \
|
||||
{ sense_base + 0x04, 16, 2, /* PINTCR */ \
|
||||
{ sense_b } }, \
|
||||
{ sense_base + 0x08, 16, 2, /* PINTCR */ \
|
||||
{ sense_c } }, \
|
||||
{ sense_base + 0x0c, 16, 2, /* PINTCR */ \
|
||||
{ sense_d } }, \
|
||||
}; \
|
||||
\
|
||||
static struct intc_desc p ## _desc __initdata = { \
|
||||
.name = str, \
|
||||
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
||||
p ## _mask_registers, NULL, \
|
||||
p ## _sense_registers, NULL), \
|
||||
}
|
||||
|
||||
/* INTCS */
|
||||
#define INTCS_VECT_BASE 0x3400
|
||||
#define INTCS_VECT(n, vect) INTC_VECT((n), INTCS_VECT_BASE + (vect))
|
||||
#define intcs_evt2irq(evt) evt2irq(INTCS_VECT_BASE + (evt))
|
||||
|
||||
#endif /* __ASM_MACH_INTC_H */
|
|
@ -88,7 +88,7 @@ static void apmu_init_cpu(struct resource *res, int cpu, int bit)
|
|||
static void apmu_parse_cfg(void (*fn)(struct resource *res, int cpu, int bit),
|
||||
struct rcar_apmu_config *apmu_config, int num)
|
||||
{
|
||||
u32 id;
|
||||
int id;
|
||||
int k;
|
||||
int bit, index;
|
||||
bool is_allowed;
|
||||
|
@ -170,7 +170,7 @@ static inline void cpu_enter_lowpower_a15(void)
|
|||
dsb();
|
||||
}
|
||||
|
||||
void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
|
||||
static void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
|
||||
{
|
||||
|
||||
/* Select next sleep mode using the APMU */
|
||||
|
|
|
@ -9,20 +9,8 @@
|
|||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/console.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "pm-rcar.h"
|
||||
#include "r8a7779.h"
|
||||
|
||||
|
@ -30,17 +18,6 @@
|
|||
#define SYSCIER 0x0c
|
||||
#define SYSCIMR 0x10
|
||||
|
||||
struct r8a7779_pm_domain {
|
||||
struct generic_pm_domain genpd;
|
||||
struct rcar_sysc_ch ch;
|
||||
};
|
||||
|
||||
static inline
|
||||
const struct rcar_sysc_ch *to_r8a7779_ch(struct generic_pm_domain *d)
|
||||
{
|
||||
return &container_of(d, struct r8a7779_pm_domain, genpd)->ch;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PM) || defined(CONFIG_SMP)
|
||||
|
||||
static void __init r8a7779_sysc_init(void)
|
||||
|
@ -58,82 +35,6 @@ static inline void r8a7779_sysc_init(void) {}
|
|||
|
||||
#endif /* CONFIG_PM || CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int pd_power_down(struct generic_pm_domain *genpd)
|
||||
{
|
||||
return rcar_sysc_power_down(to_r8a7779_ch(genpd));
|
||||
}
|
||||
|
||||
static int pd_power_up(struct generic_pm_domain *genpd)
|
||||
{
|
||||
return rcar_sysc_power_up(to_r8a7779_ch(genpd));
|
||||
}
|
||||
|
||||
static bool pd_is_off(struct generic_pm_domain *genpd)
|
||||
{
|
||||
return rcar_sysc_power_is_off(to_r8a7779_ch(genpd));
|
||||
}
|
||||
|
||||
static bool pd_active_wakeup(struct device *dev)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static void r8a7779_init_pm_domain(struct r8a7779_pm_domain *r8a7779_pd)
|
||||
{
|
||||
struct generic_pm_domain *genpd = &r8a7779_pd->genpd;
|
||||
|
||||
pm_genpd_init(genpd, NULL, false);
|
||||
genpd->dev_ops.active_wakeup = pd_active_wakeup;
|
||||
genpd->power_off = pd_power_down;
|
||||
genpd->power_on = pd_power_up;
|
||||
|
||||
if (pd_is_off(&r8a7779_pd->genpd))
|
||||
pd_power_up(&r8a7779_pd->genpd);
|
||||
}
|
||||
|
||||
static struct r8a7779_pm_domain r8a7779_pm_domains[] = {
|
||||
{
|
||||
.genpd.name = "SH4A",
|
||||
.ch = {
|
||||
.chan_offs = 0x80, /* PWRSR1 .. PWRER1 */
|
||||
.isr_bit = 16, /* SH4A */
|
||||
},
|
||||
},
|
||||
{
|
||||
.genpd.name = "SGX",
|
||||
.ch = {
|
||||
.chan_offs = 0xc0, /* PWRSR2 .. PWRER2 */
|
||||
.isr_bit = 20, /* SGX */
|
||||
},
|
||||
},
|
||||
{
|
||||
.genpd.name = "VDP1",
|
||||
.ch = {
|
||||
.chan_offs = 0x100, /* PWRSR3 .. PWRER3 */
|
||||
.isr_bit = 21, /* VDP */
|
||||
},
|
||||
},
|
||||
{
|
||||
.genpd.name = "IMPX3",
|
||||
.ch = {
|
||||
.chan_offs = 0x140, /* PWRSR4 .. PWRER4 */
|
||||
.isr_bit = 24, /* IMP */
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
void __init r8a7779_init_pm_domains(void)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j < ARRAY_SIZE(r8a7779_pm_domains); j++)
|
||||
r8a7779_init_pm_domain(&r8a7779_pm_domains[j]);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
void __init r8a7779_pm_init(void)
|
||||
{
|
||||
static int once;
|
||||
|
|
|
@ -342,8 +342,10 @@ static int __init rmobile_add_pm_domains(void __iomem *base,
|
|||
}
|
||||
|
||||
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd)
|
||||
if (!pd) {
|
||||
of_node_put(np);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pd->genpd.name = np->name;
|
||||
pd->base = base;
|
||||
|
|
|
@ -12,10 +12,6 @@
|
|||
|
||||
#include <linux/pm_domain.h>
|
||||
|
||||
#define DEFAULT_DEV_LATENCY_NS 250000
|
||||
|
||||
struct platform_device;
|
||||
|
||||
struct rmobile_pm_domain {
|
||||
struct generic_pm_domain genpd;
|
||||
struct dev_power_governor *gov;
|
||||
|
@ -26,9 +22,4 @@ struct rmobile_pm_domain {
|
|||
bool no_debug;
|
||||
};
|
||||
|
||||
struct pm_domain_device {
|
||||
const char *domain_name;
|
||||
struct platform_device *pdev;
|
||||
};
|
||||
|
||||
#endif /* PM_RMOBILE_H */
|
||||
|
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
* Copyright (C) 2013 Cogent Embedded, Inc.
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __ASM_R8A7778_H__
|
||||
#define __ASM_R8A7778_H__
|
||||
|
||||
#include <linux/sh_eth.h>
|
||||
|
||||
/* HPB-DMA slave IDs */
|
||||
enum {
|
||||
HPBDMA_SLAVE_DUMMY,
|
||||
HPBDMA_SLAVE_SDHI0_TX,
|
||||
HPBDMA_SLAVE_SDHI0_RX,
|
||||
HPBDMA_SLAVE_SSI0_TX,
|
||||
HPBDMA_SLAVE_SSI0_RX,
|
||||
HPBDMA_SLAVE_SSI1_TX,
|
||||
HPBDMA_SLAVE_SSI1_RX,
|
||||
HPBDMA_SLAVE_SSI2_TX,
|
||||
HPBDMA_SLAVE_SSI2_RX,
|
||||
HPBDMA_SLAVE_SSI3_TX,
|
||||
HPBDMA_SLAVE_SSI3_RX,
|
||||
HPBDMA_SLAVE_SSI4_TX,
|
||||
HPBDMA_SLAVE_SSI4_RX,
|
||||
HPBDMA_SLAVE_SSI5_TX,
|
||||
HPBDMA_SLAVE_SSI5_RX,
|
||||
HPBDMA_SLAVE_SSI6_TX,
|
||||
HPBDMA_SLAVE_SSI6_RX,
|
||||
HPBDMA_SLAVE_SSI7_TX,
|
||||
HPBDMA_SLAVE_SSI7_RX,
|
||||
HPBDMA_SLAVE_SSI8_TX,
|
||||
HPBDMA_SLAVE_SSI8_RX,
|
||||
HPBDMA_SLAVE_HPBIF0_TX,
|
||||
HPBDMA_SLAVE_HPBIF0_RX,
|
||||
HPBDMA_SLAVE_HPBIF1_TX,
|
||||
HPBDMA_SLAVE_HPBIF1_RX,
|
||||
HPBDMA_SLAVE_HPBIF2_TX,
|
||||
HPBDMA_SLAVE_HPBIF2_RX,
|
||||
HPBDMA_SLAVE_HPBIF3_TX,
|
||||
HPBDMA_SLAVE_HPBIF3_RX,
|
||||
HPBDMA_SLAVE_HPBIF4_TX,
|
||||
HPBDMA_SLAVE_HPBIF4_RX,
|
||||
HPBDMA_SLAVE_HPBIF5_TX,
|
||||
HPBDMA_SLAVE_HPBIF5_RX,
|
||||
HPBDMA_SLAVE_HPBIF6_TX,
|
||||
HPBDMA_SLAVE_HPBIF6_RX,
|
||||
HPBDMA_SLAVE_HPBIF7_TX,
|
||||
HPBDMA_SLAVE_HPBIF7_RX,
|
||||
HPBDMA_SLAVE_HPBIF8_TX,
|
||||
HPBDMA_SLAVE_HPBIF8_RX,
|
||||
HPBDMA_SLAVE_USBFUNC_TX,
|
||||
HPBDMA_SLAVE_USBFUNC_RX,
|
||||
};
|
||||
|
||||
extern void r8a7778_add_standard_devices(void);
|
||||
extern void r8a7778_add_standard_devices_dt(void);
|
||||
extern void r8a7778_add_dt_devices(void);
|
||||
|
||||
extern void r8a7778_init_late(void);
|
||||
extern void r8a7778_init_irq_dt(void);
|
||||
extern void r8a7778_clock_init(void);
|
||||
extern void r8a7778_init_irq_extpin(int irlm);
|
||||
extern void r8a7778_init_irq_extpin_dt(int irlm);
|
||||
extern void r8a7778_pinmux_init(void);
|
||||
|
||||
extern int r8a7778_usb_phy_power(bool enable);
|
||||
|
||||
#endif /* __ASM_R8A7778_H__ */
|
|
@ -1,16 +1,8 @@
|
|||
#ifndef __ASM_R8A7779_H__
|
||||
#define __ASM_R8A7779_H__
|
||||
|
||||
#include <linux/sh_clk.h>
|
||||
|
||||
extern void r8a7779_pm_init(void);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
extern void __init r8a7779_init_pm_domains(void);
|
||||
#else
|
||||
static inline void r8a7779_init_pm_domains(void) {}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
extern struct smp_operations r8a7779_smp_ops;
|
||||
|
||||
#endif /* __ASM_R8A7779_H__ */
|
||||
|
|
|
@ -16,35 +16,16 @@
|
|||
*/
|
||||
|
||||
#include <linux/clk/shmobile.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_data/dma-rcar-hpbdma.h>
|
||||
#include <linux/platform_data/gpio-rcar.h>
|
||||
#include <linux/platform_data/irq-renesas-intc-irqpin.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/usb/phy.h>
|
||||
#include <linux/usb/hcd.h>
|
||||
#include <linux/usb/ehci_pdriver.h>
|
||||
#include <linux/usb/ohci_pdriver.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "irqs.h"
|
||||
#include "r8a7778.h"
|
||||
|
||||
#define MODEMR 0xffcc0020
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
static void __init r8a7778_timer_init(void)
|
||||
{
|
||||
u32 mode;
|
||||
|
@ -55,555 +36,21 @@ static void __init r8a7778_timer_init(void)
|
|||
iounmap(modemr);
|
||||
r8a7778_clocks_init(mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* SCIF */
|
||||
#define R8A7778_SCIF(index, baseaddr, irq) \
|
||||
static struct plat_sci_port scif##index##_platform_data = { \
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP, \
|
||||
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, \
|
||||
.type = PORT_SCIF, \
|
||||
}; \
|
||||
\
|
||||
static struct resource scif##index##_resources[] = { \
|
||||
DEFINE_RES_MEM(baseaddr, 0x100), \
|
||||
DEFINE_RES_IRQ(irq), \
|
||||
}
|
||||
|
||||
R8A7778_SCIF(0, 0xffe40000, gic_iid(0x66));
|
||||
R8A7778_SCIF(1, 0xffe41000, gic_iid(0x67));
|
||||
R8A7778_SCIF(2, 0xffe42000, gic_iid(0x68));
|
||||
R8A7778_SCIF(3, 0xffe43000, gic_iid(0x69));
|
||||
R8A7778_SCIF(4, 0xffe44000, gic_iid(0x6a));
|
||||
R8A7778_SCIF(5, 0xffe45000, gic_iid(0x6b));
|
||||
|
||||
#define r8a7778_register_scif(index) \
|
||||
platform_device_register_resndata(NULL, "sh-sci", index, \
|
||||
scif##index##_resources, \
|
||||
ARRAY_SIZE(scif##index##_resources), \
|
||||
&scif##index##_platform_data, \
|
||||
sizeof(scif##index##_platform_data))
|
||||
|
||||
/* TMU */
|
||||
static struct sh_timer_config sh_tmu0_platform_data = {
|
||||
.channels_mask = 7,
|
||||
};
|
||||
|
||||
static struct resource sh_tmu0_resources[] = {
|
||||
DEFINE_RES_MEM(0xffd80000, 0x30),
|
||||
DEFINE_RES_IRQ(gic_iid(0x40)),
|
||||
DEFINE_RES_IRQ(gic_iid(0x41)),
|
||||
DEFINE_RES_IRQ(gic_iid(0x42)),
|
||||
};
|
||||
|
||||
#define r8a7778_register_tmu(idx) \
|
||||
platform_device_register_resndata( \
|
||||
NULL, "sh-tmu", idx, \
|
||||
sh_tmu##idx##_resources, \
|
||||
ARRAY_SIZE(sh_tmu##idx##_resources), \
|
||||
&sh_tmu##idx##_platform_data, \
|
||||
sizeof(sh_tmu##idx##_platform_data))
|
||||
|
||||
int r8a7778_usb_phy_power(bool enable)
|
||||
{
|
||||
static struct usb_phy *phy = NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (!phy)
|
||||
phy = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
|
||||
if (IS_ERR(phy)) {
|
||||
pr_err("kernel doesn't have usb phy driver\n");
|
||||
return PTR_ERR(phy);
|
||||
}
|
||||
|
||||
if (enable)
|
||||
ret = usb_phy_init(phy);
|
||||
else
|
||||
usb_phy_shutdown(phy);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* USB */
|
||||
static int usb_power_on(struct platform_device *pdev)
|
||||
{
|
||||
int ret = r8a7778_usb_phy_power(true);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void usb_power_off(struct platform_device *pdev)
|
||||
{
|
||||
if (r8a7778_usb_phy_power(false))
|
||||
return;
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
}
|
||||
|
||||
static int ehci_init_internal_buffer(struct usb_hcd *hcd)
|
||||
{
|
||||
/*
|
||||
* Below are recommended values from the datasheet;
|
||||
* see [USB :: Setting of EHCI Internal Buffer].
|
||||
*/
|
||||
/* EHCI IP internal buffer setting */
|
||||
iowrite32(0x00ff0040, hcd->regs + 0x0094);
|
||||
/* EHCI IP internal buffer enable */
|
||||
iowrite32(0x00000001, hcd->regs + 0x009C);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct usb_ehci_pdata ehci_pdata __initdata = {
|
||||
.power_on = usb_power_on,
|
||||
.power_off = usb_power_off,
|
||||
.power_suspend = usb_power_off,
|
||||
.pre_setup = ehci_init_internal_buffer,
|
||||
};
|
||||
|
||||
static struct resource ehci_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffe70000, 0x400),
|
||||
DEFINE_RES_IRQ(gic_iid(0x4c)),
|
||||
};
|
||||
|
||||
static struct usb_ohci_pdata ohci_pdata __initdata = {
|
||||
.power_on = usb_power_on,
|
||||
.power_off = usb_power_off,
|
||||
.power_suspend = usb_power_off,
|
||||
};
|
||||
|
||||
static struct resource ohci_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffe70400, 0x400),
|
||||
DEFINE_RES_IRQ(gic_iid(0x4c)),
|
||||
};
|
||||
|
||||
#define USB_PLATFORM_INFO(hci) \
|
||||
static struct platform_device_info hci##_info __initdata = { \
|
||||
.name = #hci "-platform", \
|
||||
.id = -1, \
|
||||
.res = hci##_resources, \
|
||||
.num_res = ARRAY_SIZE(hci##_resources), \
|
||||
.data = &hci##_pdata, \
|
||||
.size_data = sizeof(hci##_pdata), \
|
||||
.dma_mask = DMA_BIT_MASK(32), \
|
||||
}
|
||||
|
||||
USB_PLATFORM_INFO(ehci);
|
||||
USB_PLATFORM_INFO(ohci);
|
||||
|
||||
/* PFC/GPIO */
|
||||
static struct resource pfc_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfffc0000, 0x118),
|
||||
};
|
||||
|
||||
#define R8A7778_GPIO(idx) \
|
||||
static struct resource r8a7778_gpio##idx##_resources[] __initdata = { \
|
||||
DEFINE_RES_MEM(0xffc40000 + 0x1000 * (idx), 0x30), \
|
||||
DEFINE_RES_IRQ(gic_iid(0x87)), \
|
||||
}; \
|
||||
\
|
||||
static struct gpio_rcar_config r8a7778_gpio##idx##_platform_data __initdata = { \
|
||||
.gpio_base = 32 * (idx), \
|
||||
.irq_base = GPIO_IRQ_BASE(idx), \
|
||||
.number_of_pins = 32, \
|
||||
.pctl_name = "pfc-r8a7778", \
|
||||
}
|
||||
|
||||
R8A7778_GPIO(0);
|
||||
R8A7778_GPIO(1);
|
||||
R8A7778_GPIO(2);
|
||||
R8A7778_GPIO(3);
|
||||
R8A7778_GPIO(4);
|
||||
|
||||
#define r8a7778_register_gpio(idx) \
|
||||
platform_device_register_resndata( \
|
||||
NULL, "gpio_rcar", idx, \
|
||||
r8a7778_gpio##idx##_resources, \
|
||||
ARRAY_SIZE(r8a7778_gpio##idx##_resources), \
|
||||
&r8a7778_gpio##idx##_platform_data, \
|
||||
sizeof(r8a7778_gpio##idx##_platform_data))
|
||||
|
||||
void __init r8a7778_pinmux_init(void)
|
||||
{
|
||||
platform_device_register_simple(
|
||||
"pfc-r8a7778", -1,
|
||||
pfc_resources,
|
||||
ARRAY_SIZE(pfc_resources));
|
||||
|
||||
r8a7778_register_gpio(0);
|
||||
r8a7778_register_gpio(1);
|
||||
r8a7778_register_gpio(2);
|
||||
r8a7778_register_gpio(3);
|
||||
r8a7778_register_gpio(4);
|
||||
};
|
||||
|
||||
/* I2C */
|
||||
static struct resource i2c_resources[] __initdata = {
|
||||
/* I2C0 */
|
||||
DEFINE_RES_MEM(0xffc70000, 0x1000),
|
||||
DEFINE_RES_IRQ(gic_iid(0x63)),
|
||||
/* I2C1 */
|
||||
DEFINE_RES_MEM(0xffc71000, 0x1000),
|
||||
DEFINE_RES_IRQ(gic_iid(0x6e)),
|
||||
/* I2C2 */
|
||||
DEFINE_RES_MEM(0xffc72000, 0x1000),
|
||||
DEFINE_RES_IRQ(gic_iid(0x6c)),
|
||||
/* I2C3 */
|
||||
DEFINE_RES_MEM(0xffc73000, 0x1000),
|
||||
DEFINE_RES_IRQ(gic_iid(0x6d)),
|
||||
};
|
||||
|
||||
static void __init r8a7778_register_i2c(int id)
|
||||
{
|
||||
BUG_ON(id < 0 || id > 3);
|
||||
|
||||
platform_device_register_simple(
|
||||
"i2c-rcar", id,
|
||||
i2c_resources + (2 * id), 2);
|
||||
}
|
||||
|
||||
/* HSPI */
|
||||
static struct resource hspi_resources[] __initdata = {
|
||||
/* HSPI0 */
|
||||
DEFINE_RES_MEM(0xfffc7000, 0x18),
|
||||
DEFINE_RES_IRQ(gic_iid(0x5f)),
|
||||
/* HSPI1 */
|
||||
DEFINE_RES_MEM(0xfffc8000, 0x18),
|
||||
DEFINE_RES_IRQ(gic_iid(0x74)),
|
||||
/* HSPI2 */
|
||||
DEFINE_RES_MEM(0xfffc6000, 0x18),
|
||||
DEFINE_RES_IRQ(gic_iid(0x75)),
|
||||
};
|
||||
|
||||
static void __init r8a7778_register_hspi(int id)
|
||||
{
|
||||
BUG_ON(id < 0 || id > 2);
|
||||
|
||||
platform_device_register_simple(
|
||||
"sh-hspi", id,
|
||||
hspi_resources + (2 * id), 2);
|
||||
}
|
||||
|
||||
void __init r8a7778_add_dt_devices(void)
|
||||
{
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
void __iomem *base = ioremap_nocache(0xf0100000, 0x1000);
|
||||
if (base) {
|
||||
/*
|
||||
* Shared attribute override enable, 64K*16way
|
||||
* don't call iounmap(base)
|
||||
*/
|
||||
l2x0_init(base, 0x00400000, 0xc20f0fff);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* HPB-DMA */
|
||||
|
||||
/* Asynchronous mode register (ASYNCMDR) bits */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD22_MASK BIT(2) /* SDHI0 */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD22_SINGLE BIT(2) /* SDHI0 */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD22_MULTI 0 /* SDHI0 */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD21_MASK BIT(1) /* SDHI0 */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD21_SINGLE BIT(1) /* SDHI0 */
|
||||
#define HPB_DMAE_ASYNCMDR_ASMD21_MULTI 0 /* SDHI0 */
|
||||
|
||||
#define HPBDMA_SSI(_id) \
|
||||
{ \
|
||||
.id = HPBDMA_SLAVE_SSI## _id ##_TX, \
|
||||
.addr = 0xffd91008 + (_id * 0x40), \
|
||||
.dcr = HPB_DMAE_DCR_CT | \
|
||||
HPB_DMAE_DCR_DIP | \
|
||||
HPB_DMAE_DCR_SPDS_32BIT | \
|
||||
HPB_DMAE_DCR_DMDL | \
|
||||
HPB_DMAE_DCR_DPDS_32BIT, \
|
||||
.port = _id + (_id << 8), \
|
||||
.dma_ch = (28 + _id), \
|
||||
}, { \
|
||||
.id = HPBDMA_SLAVE_SSI## _id ##_RX, \
|
||||
.addr = 0xffd9100c + (_id * 0x40), \
|
||||
.dcr = HPB_DMAE_DCR_CT | \
|
||||
HPB_DMAE_DCR_DIP | \
|
||||
HPB_DMAE_DCR_SMDL | \
|
||||
HPB_DMAE_DCR_SPDS_32BIT | \
|
||||
HPB_DMAE_DCR_DPDS_32BIT, \
|
||||
.port = _id + (_id << 8), \
|
||||
.dma_ch = (28 + _id), \
|
||||
}
|
||||
|
||||
#define HPBDMA_HPBIF(_id) \
|
||||
{ \
|
||||
.id = HPBDMA_SLAVE_HPBIF## _id ##_TX, \
|
||||
.addr = 0xffda0000 + (_id * 0x1000), \
|
||||
.dcr = HPB_DMAE_DCR_CT | \
|
||||
HPB_DMAE_DCR_DIP | \
|
||||
HPB_DMAE_DCR_SPDS_32BIT | \
|
||||
HPB_DMAE_DCR_DMDL | \
|
||||
HPB_DMAE_DCR_DPDS_32BIT, \
|
||||
.port = 0x1111, \
|
||||
.dma_ch = (28 + _id), \
|
||||
}, { \
|
||||
.id = HPBDMA_SLAVE_HPBIF## _id ##_RX, \
|
||||
.addr = 0xffda0000 + (_id * 0x1000), \
|
||||
.dcr = HPB_DMAE_DCR_CT | \
|
||||
HPB_DMAE_DCR_DIP | \
|
||||
HPB_DMAE_DCR_SMDL | \
|
||||
HPB_DMAE_DCR_SPDS_32BIT | \
|
||||
HPB_DMAE_DCR_DPDS_32BIT, \
|
||||
.port = 0x1111, \
|
||||
.dma_ch = (28 + _id), \
|
||||
}
|
||||
|
||||
static const struct hpb_dmae_slave_config hpb_dmae_slaves[] = {
|
||||
{
|
||||
.id = HPBDMA_SLAVE_SDHI0_TX,
|
||||
.addr = 0xffe4c000 + 0x30,
|
||||
.dcr = HPB_DMAE_DCR_SPDS_16BIT |
|
||||
HPB_DMAE_DCR_DMDL |
|
||||
HPB_DMAE_DCR_DPDS_16BIT,
|
||||
.rstr = HPB_DMAE_ASYNCRSTR_ASRST21 |
|
||||
HPB_DMAE_ASYNCRSTR_ASRST22 |
|
||||
HPB_DMAE_ASYNCRSTR_ASRST23,
|
||||
.mdr = HPB_DMAE_ASYNCMDR_ASMD21_MULTI,
|
||||
.mdm = HPB_DMAE_ASYNCMDR_ASMD21_MASK,
|
||||
.port = 0x0D0C,
|
||||
.flags = HPB_DMAE_SET_ASYNC_RESET | HPB_DMAE_SET_ASYNC_MODE,
|
||||
.dma_ch = 21,
|
||||
}, {
|
||||
.id = HPBDMA_SLAVE_SDHI0_RX,
|
||||
.addr = 0xffe4c000 + 0x30,
|
||||
.dcr = HPB_DMAE_DCR_SMDL |
|
||||
HPB_DMAE_DCR_SPDS_16BIT |
|
||||
HPB_DMAE_DCR_DPDS_16BIT,
|
||||
.rstr = HPB_DMAE_ASYNCRSTR_ASRST21 |
|
||||
HPB_DMAE_ASYNCRSTR_ASRST22 |
|
||||
HPB_DMAE_ASYNCRSTR_ASRST23,
|
||||
.mdr = HPB_DMAE_ASYNCMDR_ASMD22_MULTI,
|
||||
.mdm = HPB_DMAE_ASYNCMDR_ASMD22_MASK,
|
||||
.port = 0x0D0C,
|
||||
.flags = HPB_DMAE_SET_ASYNC_RESET | HPB_DMAE_SET_ASYNC_MODE,
|
||||
.dma_ch = 22,
|
||||
}, {
|
||||
.id = HPBDMA_SLAVE_USBFUNC_TX, /* for D0 */
|
||||
.addr = 0xffe60018,
|
||||
.dcr = HPB_DMAE_DCR_SPDS_32BIT |
|
||||
HPB_DMAE_DCR_DMDL |
|
||||
HPB_DMAE_DCR_DPDS_32BIT,
|
||||
.port = 0x0000,
|
||||
.dma_ch = 14,
|
||||
}, {
|
||||
.id = HPBDMA_SLAVE_USBFUNC_RX, /* for D1 */
|
||||
.addr = 0xffe6001c,
|
||||
.dcr = HPB_DMAE_DCR_SMDL |
|
||||
HPB_DMAE_DCR_SPDS_32BIT |
|
||||
HPB_DMAE_DCR_DPDS_32BIT,
|
||||
.port = 0x0101,
|
||||
.dma_ch = 15,
|
||||
},
|
||||
|
||||
HPBDMA_SSI(0),
|
||||
HPBDMA_SSI(1),
|
||||
HPBDMA_SSI(2),
|
||||
HPBDMA_SSI(3),
|
||||
HPBDMA_SSI(4),
|
||||
HPBDMA_SSI(5),
|
||||
HPBDMA_SSI(6),
|
||||
HPBDMA_SSI(7),
|
||||
HPBDMA_SSI(8),
|
||||
|
||||
HPBDMA_HPBIF(0),
|
||||
HPBDMA_HPBIF(1),
|
||||
HPBDMA_HPBIF(2),
|
||||
HPBDMA_HPBIF(3),
|
||||
HPBDMA_HPBIF(4),
|
||||
HPBDMA_HPBIF(5),
|
||||
HPBDMA_HPBIF(6),
|
||||
HPBDMA_HPBIF(7),
|
||||
HPBDMA_HPBIF(8),
|
||||
};
|
||||
|
||||
static const struct hpb_dmae_channel hpb_dmae_channels[] = {
|
||||
HPB_DMAE_CHANNEL(0x7c, HPBDMA_SLAVE_USBFUNC_TX), /* ch. 14 */
|
||||
HPB_DMAE_CHANNEL(0x7c, HPBDMA_SLAVE_USBFUNC_RX), /* ch. 15 */
|
||||
HPB_DMAE_CHANNEL(0x7e, HPBDMA_SLAVE_SDHI0_TX), /* ch. 21 */
|
||||
HPB_DMAE_CHANNEL(0x7e, HPBDMA_SLAVE_SDHI0_RX), /* ch. 22 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI0_TX), /* ch. 28 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI0_RX), /* ch. 28 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF0_TX), /* ch. 28 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF0_RX), /* ch. 28 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI1_TX), /* ch. 29 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI1_RX), /* ch. 29 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF1_TX), /* ch. 29 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF1_RX), /* ch. 29 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI2_TX), /* ch. 30 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI2_RX), /* ch. 30 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF2_TX), /* ch. 30 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF2_RX), /* ch. 30 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI3_TX), /* ch. 31 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI3_RX), /* ch. 31 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF3_TX), /* ch. 31 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF3_RX), /* ch. 31 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI4_TX), /* ch. 32 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI4_RX), /* ch. 32 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF4_TX), /* ch. 32 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF4_RX), /* ch. 32 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI5_TX), /* ch. 33 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI5_RX), /* ch. 33 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF5_TX), /* ch. 33 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF5_RX), /* ch. 33 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI6_TX), /* ch. 34 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI6_RX), /* ch. 34 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF6_TX), /* ch. 34 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF6_RX), /* ch. 34 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI7_TX), /* ch. 35 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI7_RX), /* ch. 35 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF7_TX), /* ch. 35 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF7_RX), /* ch. 35 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI8_TX), /* ch. 36 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_SSI8_RX), /* ch. 36 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF8_TX), /* ch. 36 */
|
||||
HPB_DMAE_CHANNEL(0x7f, HPBDMA_SLAVE_HPBIF8_RX), /* ch. 36 */
|
||||
};
|
||||
|
||||
static struct hpb_dmae_pdata dma_platform_data __initdata = {
|
||||
.slaves = hpb_dmae_slaves,
|
||||
.num_slaves = ARRAY_SIZE(hpb_dmae_slaves),
|
||||
.channels = hpb_dmae_channels,
|
||||
.num_channels = ARRAY_SIZE(hpb_dmae_channels),
|
||||
.ts_shift = {
|
||||
[XMIT_SZ_8BIT] = 0,
|
||||
[XMIT_SZ_16BIT] = 1,
|
||||
[XMIT_SZ_32BIT] = 2,
|
||||
},
|
||||
.num_hw_channels = 39,
|
||||
};
|
||||
|
||||
static struct resource hpb_dmae_resources[] __initdata = {
|
||||
/* Channel registers */
|
||||
DEFINE_RES_MEM(0xffc08000, 0x1000),
|
||||
/* Common registers */
|
||||
DEFINE_RES_MEM(0xffc09000, 0x170),
|
||||
/* Asynchronous reset registers */
|
||||
DEFINE_RES_MEM(0xffc00300, 4),
|
||||
/* Asynchronous mode registers */
|
||||
DEFINE_RES_MEM(0xffc00400, 4),
|
||||
/* IRQ for DMA channels */
|
||||
DEFINE_RES_NAMED(gic_iid(0x7b), 5, NULL, IORESOURCE_IRQ),
|
||||
};
|
||||
|
||||
static void __init r8a7778_register_hpb_dmae(void)
|
||||
{
|
||||
platform_device_register_resndata(NULL, "hpb-dma-engine",
|
||||
-1, hpb_dmae_resources,
|
||||
ARRAY_SIZE(hpb_dmae_resources),
|
||||
&dma_platform_data,
|
||||
sizeof(dma_platform_data));
|
||||
}
|
||||
|
||||
void __init r8a7778_add_standard_devices(void)
|
||||
{
|
||||
r8a7778_add_dt_devices();
|
||||
r8a7778_register_tmu(0);
|
||||
r8a7778_register_scif(0);
|
||||
r8a7778_register_scif(1);
|
||||
r8a7778_register_scif(2);
|
||||
r8a7778_register_scif(3);
|
||||
r8a7778_register_scif(4);
|
||||
r8a7778_register_scif(5);
|
||||
r8a7778_register_i2c(0);
|
||||
r8a7778_register_i2c(1);
|
||||
r8a7778_register_i2c(2);
|
||||
r8a7778_register_i2c(3);
|
||||
r8a7778_register_hspi(0);
|
||||
r8a7778_register_hspi(1);
|
||||
r8a7778_register_hspi(2);
|
||||
|
||||
r8a7778_register_hpb_dmae();
|
||||
}
|
||||
|
||||
void __init r8a7778_init_late(void)
|
||||
{
|
||||
shmobile_init_late();
|
||||
platform_device_register_full(&ehci_info);
|
||||
platform_device_register_full(&ohci_info);
|
||||
}
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin_platform_data __initdata = {
|
||||
.irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
|
||||
.sense_bitfield_width = 2,
|
||||
};
|
||||
|
||||
static struct resource irqpin_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
|
||||
DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
|
||||
DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
|
||||
DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
|
||||
DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
|
||||
DEFINE_RES_IRQ(gic_iid(0x3b)), /* IRQ0 */
|
||||
DEFINE_RES_IRQ(gic_iid(0x3c)), /* IRQ1 */
|
||||
DEFINE_RES_IRQ(gic_iid(0x3d)), /* IRQ2 */
|
||||
DEFINE_RES_IRQ(gic_iid(0x3e)), /* IRQ3 */
|
||||
};
|
||||
|
||||
void __init r8a7778_init_irq_extpin_dt(int irlm)
|
||||
{
|
||||
void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
|
||||
unsigned long tmp;
|
||||
|
||||
if (!icr0) {
|
||||
pr_warn("r8a7778: unable to setup external irq pin mode\n");
|
||||
return;
|
||||
}
|
||||
|
||||
tmp = ioread32(icr0);
|
||||
if (irlm)
|
||||
tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
|
||||
else
|
||||
tmp &= ~(1 << 23); /* IRL mode - not supported */
|
||||
tmp |= (1 << 21); /* LVLMODE = 1 */
|
||||
iowrite32(tmp, icr0);
|
||||
iounmap(icr0);
|
||||
}
|
||||
|
||||
void __init r8a7778_init_irq_extpin(int irlm)
|
||||
{
|
||||
r8a7778_init_irq_extpin_dt(irlm);
|
||||
if (irlm)
|
||||
platform_device_register_resndata(
|
||||
NULL, "renesas_intc_irqpin", -1,
|
||||
irqpin_resources, ARRAY_SIZE(irqpin_resources),
|
||||
&irqpin_platform_data, sizeof(irqpin_platform_data));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
#define INT2SMSKCR0 0x82288 /* 0xfe782288 */
|
||||
#define INT2SMSKCR1 0x8228c /* 0xfe78228c */
|
||||
|
||||
#define INT2NTSR0 0x00018 /* 0xfe700018 */
|
||||
#define INT2NTSR1 0x0002c /* 0xfe70002c */
|
||||
void __init r8a7778_init_irq_dt(void)
|
||||
|
||||
static void __init r8a7778_init_irq_dt(void)
|
||||
{
|
||||
void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
|
||||
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||
void __iomem *gic_dist_base = ioremap_nocache(0xfe438000, 0x1000);
|
||||
void __iomem *gic_cpu_base = ioremap_nocache(0xfe430000, 0x1000);
|
||||
#endif
|
||||
|
||||
BUG_ON(!base);
|
||||
|
||||
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||
#else
|
||||
irqchip_init();
|
||||
#endif
|
||||
|
||||
/* route all interrupts to ARM */
|
||||
__raw_writel(0x73ffffff, base + INT2NTSR0);
|
||||
__raw_writel(0xffffffff, base + INT2NTSR1);
|
||||
|
@ -624,10 +71,6 @@ DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
|
|||
.init_early = shmobile_init_delay,
|
||||
.init_irq = r8a7778_init_irq_dt,
|
||||
.init_late = shmobile_init_late,
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
.init_time = r8a7778_timer_init,
|
||||
#endif
|
||||
.dt_compat = r8a7778_compat_dt,
|
||||
MACHINE_END
|
||||
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* Generic GPIO API and pinmux table support
|
||||
*
|
||||
* Copyright (c) 2008 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#ifndef __ASM_ARCH_GPIO_H
|
||||
#define __ASM_ARCH_GPIO_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
/*
|
||||
* FIXME !!
|
||||
*
|
||||
* current gpio frame work doesn't have
|
||||
* the method to control only pull up/down/free.
|
||||
* this function should be replaced by correct gpio function
|
||||
*/
|
||||
static inline void __init gpio_direction_none(void __iomem * addr)
|
||||
{
|
||||
__raw_writeb(0x00, addr);
|
||||
}
|
||||
|
||||
#endif /* __ASM_ARCH_GPIO_H */
|
|
@ -77,24 +77,3 @@ void __init shmobile_init_delay(void)
|
|||
shmobile_setup_delay_hz(max_freq, 2, 4);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init shmobile_late_time_init(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all compiled-in early timers register themselves.
|
||||
*
|
||||
* Run probe() for two "earlytimer" devices, these will be the
|
||||
* clockevents and clocksource devices respectively. In the event
|
||||
* that only a clockevents device is available, we -ENODEV on the
|
||||
* clocksource and the jiffies clocksource is used transparently
|
||||
* instead. No error handling is necessary here.
|
||||
*/
|
||||
early_platform_driver_register_all("earlytimer");
|
||||
early_platform_driver_probe("earlytimer", 2, 0);
|
||||
}
|
||||
|
||||
void __init shmobile_earlytimer_init(void)
|
||||
{
|
||||
late_time_init = shmobile_late_time_init;
|
||||
}
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref spear13xx_cpu_die(unsigned int cpu)
|
||||
void spear13xx_cpu_die(unsigned int cpu)
|
||||
{
|
||||
int spurious = 0;
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ int tegra_cpu_kill(unsigned cpu)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref tegra_cpu_die(unsigned int cpu)
|
||||
void tegra_cpu_die(unsigned int cpu)
|
||||
{
|
||||
if (!tegra_hotplug_shutdown) {
|
||||
WARN(1, "hotplug is not yet initialized\n");
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref ux500_cpu_die(unsigned int cpu)
|
||||
void ux500_cpu_die(unsigned int cpu)
|
||||
{
|
||||
/* directly enter low power state, skipping secure registers */
|
||||
for (;;) {
|
||||
|
|
|
@ -85,7 +85,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
void __ref vexpress_cpu_die(unsigned int cpu)
|
||||
void vexpress_cpu_die(unsigned int cpu)
|
||||
{
|
||||
int spurious = 0;
|
||||
|
||||
|
|
|
@ -123,6 +123,14 @@ config CLKSRC_PISTACHIO
|
|||
bool
|
||||
select CLKSRC_OF
|
||||
|
||||
config CLKSRC_TI_32K
|
||||
bool "Texas Instruments 32.768 Hz Clocksource" if COMPILE_TEST
|
||||
depends on GENERIC_SCHED_CLOCK
|
||||
select CLKSRC_OF if OF
|
||||
help
|
||||
This option enables support for Texas Instruments 32.768 Hz clocksource
|
||||
available on many OMAP-like platforms.
|
||||
|
||||
config CLKSRC_STM32
|
||||
bool "Clocksource for STM32 SoCs" if !ARCH_STM32
|
||||
depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)
|
||||
|
|
|
@ -45,6 +45,7 @@ obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o
|
|||
obj-$(CONFIG_CLKSRC_QCOM) += qcom-timer.o
|
||||
obj-$(CONFIG_MTK_TIMER) += mtk_timer.o
|
||||
obj-$(CONFIG_CLKSRC_PISTACHIO) += time-pistachio.o
|
||||
obj-$(CONFIG_CLKSRC_TI_32K) += timer-ti-32k.o
|
||||
|
||||
obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o
|
||||
obj-$(CONFIG_ARM_GLOBAL_TIMER) += arm_global_timer.o
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
/**
|
||||
* timer-ti-32k.c - OMAP2 32k Timer Support
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation
|
||||
*
|
||||
* Update to use new clocksource/clockevent layers
|
||||
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
|
||||
* Copyright (C) 2007 MontaVista Software, Inc.
|
||||
*
|
||||
* Original driver:
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Author: Paul Mundt <paul.mundt@nokia.com>
|
||||
* Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
* OMAP Dual-mode timer framework support by Timo Teras
|
||||
*
|
||||
* Some parts based off of TI's 24xx code:
|
||||
*
|
||||
* Copyright (C) 2004-2009 Texas Instruments, Inc.
|
||||
*
|
||||
* Roughly modelled after the OMAP1 MPU timer code.
|
||||
* Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
*
|
||||
* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.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 of
|
||||
* the License as published by the Free Software Foundation.
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/sched_clock.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
/*
|
||||
* 32KHz clocksource ... always available, on pretty most chips except
|
||||
* OMAP 730 and 1510. Other timers could be used as clocksources, with
|
||||
* higher resolution in free-running counter modes (e.g. 12 MHz xtal),
|
||||
* but systems won't necessarily want to spend resources that way.
|
||||
*/
|
||||
|
||||
#define OMAP2_32KSYNCNT_REV_OFF 0x0
|
||||
#define OMAP2_32KSYNCNT_REV_SCHEME (0x3 << 30)
|
||||
#define OMAP2_32KSYNCNT_CR_OFF_LOW 0x10
|
||||
#define OMAP2_32KSYNCNT_CR_OFF_HIGH 0x30
|
||||
|
||||
struct ti_32k {
|
||||
void __iomem *base;
|
||||
void __iomem *counter;
|
||||
struct clocksource cs;
|
||||
};
|
||||
|
||||
static inline struct ti_32k *to_ti_32k(struct clocksource *cs)
|
||||
{
|
||||
return container_of(cs, struct ti_32k, cs);
|
||||
}
|
||||
|
||||
static cycle_t ti_32k_read_cycles(struct clocksource *cs)
|
||||
{
|
||||
struct ti_32k *ti = to_ti_32k(cs);
|
||||
|
||||
return (cycle_t)readl_relaxed(ti->counter);
|
||||
}
|
||||
|
||||
static struct ti_32k ti_32k_timer = {
|
||||
.cs = {
|
||||
.name = "32k_counter",
|
||||
.rating = 250,
|
||||
.read = ti_32k_read_cycles,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS |
|
||||
CLOCK_SOURCE_SUSPEND_NONSTOP,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 notrace omap_32k_read_sched_clock(void)
|
||||
{
|
||||
return ti_32k_read_cycles(&ti_32k_timer.cs);
|
||||
}
|
||||
|
||||
static void __init ti_32k_timer_init(struct device_node *np)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ti_32k_timer.base = of_iomap(np, 0);
|
||||
if (!ti_32k_timer.base) {
|
||||
pr_err("Can't ioremap 32k timer base\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ti_32k_timer.counter = ti_32k_timer.base;
|
||||
|
||||
/*
|
||||
* 32k sync Counter IP register offsets vary between the highlander
|
||||
* version and the legacy ones.
|
||||
*
|
||||
* The 'SCHEME' bits(30-31) of the revision register is used to identify
|
||||
* the version.
|
||||
*/
|
||||
if (readl_relaxed(ti_32k_timer.base + OMAP2_32KSYNCNT_REV_OFF) &
|
||||
OMAP2_32KSYNCNT_REV_SCHEME)
|
||||
ti_32k_timer.counter += OMAP2_32KSYNCNT_CR_OFF_HIGH;
|
||||
else
|
||||
ti_32k_timer.counter += OMAP2_32KSYNCNT_CR_OFF_LOW;
|
||||
|
||||
ret = clocksource_register_hz(&ti_32k_timer.cs, 32768);
|
||||
if (ret) {
|
||||
pr_err("32k_counter: can't register clocksource\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sched_clock_register(omap_32k_read_sched_clock, 32, 32768);
|
||||
pr_info("OMAP clocksource: 32k_counter at 32768 Hz\n");
|
||||
}
|
||||
CLOCKSOURCE_OF_DECLARE(ti_32k_timer, "ti,omap-counter32k",
|
||||
ti_32k_timer_init);
|
|
@ -23,7 +23,6 @@ struct dma_chan;
|
|||
|
||||
/* device.platform_data for SSP controller devices */
|
||||
struct pxa2xx_spi_master {
|
||||
u32 clock_enable;
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
|
||||
|
|
Loading…
Reference in New Issue