mirror of https://gitee.com/openkylin/linux.git
Second round of Renesas ARM based SoC cleanups for v3.12
* Remove mach/hardware.h which has no useful contents * Remove ag5evm board support * Remove kota2 board support * Use pm-rmobile on sh7372 and r8a7740 SoCs only, it is otherwise unneeded * Remove use of INTC header on r8a7779 and r8a7740 SoCs * Cleanup registration of usb phy in r8a7779 SoC * Remove '0x's from R8A7779 DTS file for r8a7779 SoC -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJR+hf1AAoJENfPZGlqN0+++0gP/2hSp6T9qQAmriOeOTE9NrOu fLx/d35Q70u5p14NfjKKs0vDIc/II8YqHizHlF5+mW1getnhBDNDS761f6nypmUw LE19YgBE/idDEyz4WBbr+YFrXVS1Mq494UzN4esePtTrG2joQIv6krE6SX1shsLz yCmUk+zPXEvhv/oVJLahm0pe+UjJHqWbST6gbscL5WTNnfQM3JhQQIJwGruge2Ui c0ja+irLphCVgFgVvn1YwgtuvDaoL/qSxqGgESISL2awPEUoF/nQExTQ3U/DjBZN VWAYpy6DFyYl5B8ZZh5UUowA7ed/trVVbblsrbu9Z93GxRRgNal/rU1pCS/uPoyw Giw3f51VGWrvw5Vrb/Fpl8OsMRn7rpcnWROsR0glkn/DHlNJkw5b60g2lLtYaL4m 33rNH18l2B+rmzbhsF+kwDR2JxYXyaE+iyfMXGBkhLsRfhCCiUq4iP3+u0hpsnPw FB0+ngnlsjypYVLgkkYSUOzvnDHmB3uz+bH+5psDD6+L5+mp7H4KhhTrQXCBqdVZ Up2qKT7lJz+T0nnzJQZtXS+n+I4O06ewtghwG3MxtQ/NbwS6mUrqE18YMRj/21Af d91bhBnMpWX251T5LRqUlqHQCmVn9F8EuO7VK1qEX0GavxT+71ChlBDSXlGK/uqY wZbyX/n24e9B50AeyNVv =ujiw -----END PGP SIGNATURE----- Merge tag 'renesas-cleanup2-for-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/renesas From Simon Horman: Second round of Renesas ARM based SoC cleanups for v3.12 * Remove mach/hardware.h which has no useful contents * Remove ag5evm board support * Remove kota2 board support * Use pm-rmobile on sh7372 and r8a7740 SoCs only, it is otherwise unneeded * Remove use of INTC header on r8a7779 and r8a7740 SoCs * Cleanup registration of usb phy in r8a7779 SoC * Remove '0x's from R8A7779 DTS file for r8a7779 SoC * tag 'renesas-cleanup2-for-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: (74 commits) ARM: shmobile: r8a7779: Remove '0x's from R8A7779 DTS file ARM: shmobile: r8a7779: cleanup registration of usb phy ARM: shmobile: No need to use INTC header on r8a7779 ARM: shmobile: No need to use INTC demux on r8a7740 ARM: shmobile: Use pm-rmobile on sh7372 and r8a7740 only ARM: shmobile: r8a73a4: Remove ->init_machine() special case ARM: shmobile: Remove include <mach/hardware.h> ARM: shmobile: Remove Marzen use of <mach/hardware.h> ARM: shmobile: Remove r8a7779 use of <mach/hardware.h> ARM: shmobile: Remove EMEV2 use of <mach/hardware.h> ARM: shmobile: Remove sh7372 use of <mach/hardware.h> ARM: shmobile: Remove sh73a0 use of <mach/hardware.h> ARCH: ARM: shmobile: Remove ag5evm board support ARCH: ARM: shmobile: Remove kota2 board support leds: Remove leds-renesas-tpu driver ARM: shmobile: sh73a0: Remove all GPIOs ARM: shmobile: kota2: Use leds-pwm + pwm-rmob ARM: shmobile: armadillo800eva: Add backlight support ARM: shmobile: Setup r8a7790 arch timer based on MD pins ARM: shmobile: Introduce r8a7790_read_mode_pins() ... Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
f0a108b722
arch
arm
boot/dts
Makefileemev2-kzm9d-reference.dtsemev2-kzm9d.dtsemev2.dtsir8a73a4-ape6evm.dtsr8a73a4.dtsir8a7779.dtsir8a7790.dtsi
configs
mach-shmobile
KconfigMakefileMakefile.bootboard-ag5evm.cboard-ape6evm.cboard-armadillo800eva.cboard-kota2.cboard-kzm9d-reference.cboard-kzm9d.cboard-kzm9g-reference.cboard-lager.cboard-mackerel.cboard-marzen.cclock-emev2.cclock-r8a73a4.cclock-r8a7790.cclock-sh73a0.c
include/mach
intc-r8a7779.csetup-emev2.csetup-r8a73a4.csetup-r8a7740.csetup-r8a7778.csetup-r8a7779.csetup-r8a7790.csetup-sh7372.csetup-sh73a0.csmp-emev2.csh
drivers
leds
video/backlight
include/linux/platform_data
|
@ -183,6 +183,7 @@ dtb-$(CONFIG_ARCH_U8500) += snowball.dtb \
|
|||
ccu9540.dtb
|
||||
dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb
|
||||
dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \
|
||||
emev2-kzm9d-reference.dtb \
|
||||
r8a7740-armadillo800eva.dtb \
|
||||
r8a7778-bockw.dtb \
|
||||
r8a7740-armadillo800eva-reference.dtb \
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Device Tree Source for the KZM9D board
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
*
|
||||
* 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/ "emev2.dtsi"
|
||||
|
||||
/ {
|
||||
model = "EMEV2 KZM9D Board";
|
||||
compatible = "renesas,kzm9d-reference", "renesas,emev2";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x40000000 0x8000000>;
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS1,115200n81 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096";
|
||||
};
|
||||
|
||||
reg_1p8v: regulator@0 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
reg_3p3v: regulator@1 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-3.3V";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
lan9220@20000000 {
|
||||
compatible = "smsc,lan9220", "smsc,lan9115";
|
||||
reg = <0x20000000 0x10000>;
|
||||
phy-mode = "mii";
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <1 1>; /* active high */
|
||||
reg-io-width = <4>;
|
||||
smsc,irq-active-high;
|
||||
smsc,irq-push-pull;
|
||||
vddvario-supply = <®_1p8v>;
|
||||
vdd33a-supply = <®_3p3v>;
|
||||
};
|
||||
};
|
|
@ -21,6 +21,6 @@ memory {
|
|||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=tty0 console=ttyS1,115200n81 earlyprintk=serial8250-em.1,115200n81 mem=128M@0x40000000 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096";
|
||||
bootargs = "console=ttyS1,115200n81 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -14,6 +14,14 @@ / {
|
|||
compatible = "renesas,emev2";
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
aliases {
|
||||
gpio0 = &gpio0;
|
||||
gpio1 = &gpio1;
|
||||
gpio2 = &gpio2;
|
||||
gpio3 = &gpio3;
|
||||
gpio4 = &gpio4;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -67,4 +75,55 @@ uart@e1050000 {
|
|||
reg = <0xe1050000 0x38>;
|
||||
interrupts = <0 11 0>;
|
||||
};
|
||||
|
||||
gpio0: gpio@e0050000 {
|
||||
compatible = "renesas,em-gio";
|
||||
reg = <0xe0050000 0x2c>, <0xe0050040 0x20>;
|
||||
interrupts = <0 67 0>, <0 68 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
ngpios = <32>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
gpio1: gpio@e0050080 {
|
||||
compatible = "renesas,em-gio";
|
||||
reg = <0xe0050080 0x2c>, <0xe00500c0 0x20>;
|
||||
interrupts = <0 69 0>, <0 70 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
ngpios = <32>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
gpio2: gpio@e0050100 {
|
||||
compatible = "renesas,em-gio";
|
||||
reg = <0xe0050100 0x2c>, <0xe0050140 0x20>;
|
||||
interrupts = <0 71 0>, <0 72 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
ngpios = <32>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
gpio3: gpio@e0050180 {
|
||||
compatible = "renesas,em-gio";
|
||||
reg = <0xe0050180 0x2c>, <0xe00501c0 0x20>;
|
||||
interrupts = <0 73 0>, <0 74 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
ngpios = <32>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
gpio4: gpio@e0050200 {
|
||||
compatible = "renesas,em-gio";
|
||||
reg = <0xe0050200 0x2c>, <0xe0050240 0x20>;
|
||||
interrupts = <0 75 0>, <0 76 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
ngpios = <31>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -50,3 +50,25 @@ ethernet@8000000 {
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2c5 {
|
||||
vdd_dvfs: max8973@1b {
|
||||
compatible = "maxim,max8973";
|
||||
reg = <0x1b>;
|
||||
|
||||
regulator-min-microvolt = <935000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
&cpu0 {
|
||||
cpu0-supply = <&vdd_dvfs>;
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
1950000 1115000
|
||||
1462500 995000
|
||||
>;
|
||||
voltage-tolerance = <1>; /* 1% */
|
||||
};
|
||||
|
|
|
@ -85,4 +85,130 @@ thermal@e61f0000 {
|
|||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 69 4>;
|
||||
};
|
||||
|
||||
i2c0: i2c@e6500000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6500000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 174 0x4>;
|
||||
};
|
||||
|
||||
i2c1: i2c@e6510000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6510000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 175 0x4>;
|
||||
};
|
||||
|
||||
i2c2: i2c@e6520000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6520000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 176 0x4>;
|
||||
};
|
||||
|
||||
i2c3: i2c@e6530000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6530000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 177 0x4>;
|
||||
};
|
||||
|
||||
i2c4: i2c@e6540000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6540000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 178 0x4>;
|
||||
};
|
||||
|
||||
i2c5: i2c@e60b0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe60b0000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 179 0x4>;
|
||||
};
|
||||
|
||||
i2c6: i2c@e6550000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6550000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 184 0x4>;
|
||||
};
|
||||
|
||||
i2c7: i2c@e6560000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6560000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 185 0x4>;
|
||||
};
|
||||
|
||||
i2c8: i2c@e6570000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
reg = <0 0xe6570000 0 0x428>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 173 0x4>;
|
||||
};
|
||||
|
||||
mmcif0: mmcif@ee200000 {
|
||||
compatible = "renesas,sh-mmcif";
|
||||
reg = <0 0xee200000 0 0x80>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 169 0x4>;
|
||||
reg-io-width = <4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mmcif1: mmcif@ee220000 {
|
||||
compatible = "renesas,sh-mmcif";
|
||||
reg = <0 0xee220000 0 0x80>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 170 0x4>;
|
||||
reg-io-width = <4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi0: sdhi@ee100000 {
|
||||
compatible = "renesas,r8a73a4-sdhi";
|
||||
reg = <0 0xee100000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 165 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi1: sdhi@ee120000 {
|
||||
compatible = "renesas,r8a73a4-sdhi";
|
||||
reg = <0 0xee120000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 166 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi2: sdhi@ee140000 {
|
||||
compatible = "renesas,r8a73a4-sdhi";
|
||||
reg = <0 0xee140000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 167 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -65,7 +65,7 @@ irqpin0: irqpin@fe780010 {
|
|||
sense-bitfield-width = <2>;
|
||||
};
|
||||
|
||||
i2c0: i2c@0xffc70000 {
|
||||
i2c0: i2c@ffc70000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
|
@ -74,7 +74,7 @@ i2c0: i2c@0xffc70000 {
|
|||
interrupts = <0 79 0x4>;
|
||||
};
|
||||
|
||||
i2c1: i2c@0xffc71000 {
|
||||
i2c1: i2c@ffc71000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
|
@ -83,7 +83,7 @@ i2c1: i2c@0xffc71000 {
|
|||
interrupts = <0 82 0x4>;
|
||||
};
|
||||
|
||||
i2c2: i2c@0xffc72000 {
|
||||
i2c2: i2c@ffc72000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
|
@ -92,7 +92,7 @@ i2c2: i2c@0xffc72000 {
|
|||
interrupts = <0 80 0x4>;
|
||||
};
|
||||
|
||||
i2c3: i2c@0xffc73000 {
|
||||
i2c3: i2c@ffc73000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,rmobile-iic";
|
||||
|
|
|
@ -54,4 +54,58 @@ irqc0: interrupt-controller@e61c0000 {
|
|||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>;
|
||||
};
|
||||
|
||||
mmcif0: mmcif@ee200000 {
|
||||
compatible = "renesas,sh-mmcif";
|
||||
reg = <0 0xee200000 0 0x80>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 169 0x4>;
|
||||
reg-io-width = <4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mmcif1: mmcif@ee220000 {
|
||||
compatible = "renesas,sh-mmcif";
|
||||
reg = <0 0xee220000 0 0x80>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 170 0x4>;
|
||||
reg-io-width = <4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi0: sdhi@ee100000 {
|
||||
compatible = "renesas,r8a7790-sdhi";
|
||||
reg = <0 0xee100000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 165 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi1: sdhi@ee120000 {
|
||||
compatible = "renesas,r8a7790-sdhi";
|
||||
reg = <0 0xee120000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 166 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi2: sdhi@ee140000 {
|
||||
compatible = "renesas,r8a7790-sdhi";
|
||||
reg = <0 0xee140000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 167 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhi3: sdhi@ee160000 {
|
||||
compatible = "renesas,r8a7790-sdhi";
|
||||
reg = <0 0xee160000 0 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 168 4>;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_NAMESPACES=y
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_IPC_NS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_ARCH_SHMOBILE=y
|
||||
CONFIG_ARCH_SH73A0=y
|
||||
CONFIG_MACH_AG5EVM=y
|
||||
CONFIG_MEMORY_SIZE=0x10000000
|
||||
CONFIG_CPU_BPREDICT_DISABLE=y
|
||||
CONFIG_ARM_ERRATA_430973=y
|
||||
CONFIG_ARM_ERRATA_458693=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=tty0 console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel"
|
||||
CONFIG_CMDLINE_FORCE=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_PM=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_PM_RUNTIME=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=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_WIRELESS is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_BLK_DEV is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMSC911X=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
CONFIG_INPUT_SPARSEKMAP=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_SERIAL_SH_SCI=y
|
||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=9
|
||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_SH_MOBILE=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_MFD_SUPPORT is not set
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_SH_MOBILE_LCDC=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_INOTIFY_USER is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_FTRACE is not set
|
|
@ -1,121 +0,0 @@
|
|||
# CONFIG_ARM_PATCH_PHYS_VIRT is not set
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_NAMESPACES=y
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_IPC_NS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_ARCH_SHMOBILE=y
|
||||
CONFIG_KEYBOARD_GPIO_POLLED=y
|
||||
CONFIG_ARCH_SH73A0=y
|
||||
CONFIG_MACH_KOTA2=y
|
||||
CONFIG_MEMORY_SIZE=0x1e000000
|
||||
# CONFIG_SH_TIMER_TMU is not set
|
||||
# CONFIG_SWP_EMULATE is not set
|
||||
CONFIG_CPU_BPREDICT_DISABLE=y
|
||||
CONFIG_ARM_ERRATA_460075=y
|
||||
CONFIG_ARM_ERRATA_742230=y
|
||||
CONFIG_ARM_ERRATA_742231=y
|
||||
CONFIG_PL310_ERRATA_588369=y
|
||||
CONFIG_ARM_ERRATA_720789=y
|
||||
CONFIG_PL310_ERRATA_727915=y
|
||||
CONFIG_ARM_ERRATA_743622=y
|
||||
CONFIG_ARM_ERRATA_751472=y
|
||||
CONFIG_PL310_ERRATA_753970=y
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_PL310_ERRATA_769419=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel"
|
||||
CONFIG_CMDLINE_FORCE=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_PM_RUNTIME=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_CFG80211=y
|
||||
CONFIG_WIRELESS_EXT_SYSFS=y
|
||||
CONFIG_MAC80211=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_BLK_DEV is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CHELSIO 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_B43=y
|
||||
CONFIG_B43_PHY_N=y
|
||||
CONFIG_B43_DEBUG=y
|
||||
CONFIG_INPUT_SPARSEKMAP=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_GPIO=y
|
||||
CONFIG_KEYBOARD_SH_KEYSC=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_SERIAL_SH_SCI=y
|
||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=9
|
||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C_SH_MOBILE=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_BCMA=y
|
||||
CONFIG_BCMA_DEBUG=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_SH_MOBILE_LCDC=y
|
||||
CONFIG_LCD_PLATFORM=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHI=y
|
||||
CONFIG_MMC_SH_MMCIF=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_RENESAS_TPU=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_INFO_REDUCED=y
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_DEBUG_USER=y
|
|
@ -23,9 +23,10 @@ config ARCH_R8A73A4
|
|||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_GIC
|
||||
select CPU_V7
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_IRQC
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select ARCH_HAS_OPP
|
||||
|
||||
config ARCH_R8A7740
|
||||
bool "R-Mobile A1 (R8A77400)"
|
||||
|
@ -59,7 +60,6 @@ config ARCH_R8A7790
|
|||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_GIC
|
||||
select CPU_V7
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_IRQC
|
||||
|
||||
|
@ -71,13 +71,6 @@ config ARCH_EMEV2
|
|||
|
||||
comment "SH-Mobile Board Type"
|
||||
|
||||
config MACH_AG5EVM
|
||||
bool "AG5EVM board"
|
||||
depends on ARCH_SH73A0
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
select SH_LCD_MIPI_DSI
|
||||
|
||||
config MACH_APE6EVM
|
||||
bool "APE6EVM board"
|
||||
depends on ARCH_R8A73A4
|
||||
|
@ -91,12 +84,6 @@ config MACH_MACKEREL
|
|||
select SND_SOC_AK4642 if SND_SIMPLE_CARD
|
||||
select USE_OF
|
||||
|
||||
config MACH_KOTA2
|
||||
bool "KOTA2 board"
|
||||
depends on ARCH_SH73A0
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
|
||||
config MACH_ARMADILLO800EVA
|
||||
bool "Armadillo-800 EVA board"
|
||||
depends on ARCH_R8A7740
|
||||
|
@ -156,6 +143,18 @@ config MACH_KZM9D
|
|||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
select USE_OF
|
||||
|
||||
config MACH_KZM9D_REFERENCE
|
||||
bool "KZM9D board - Reference Device Tree Implementation"
|
||||
depends on ARCH_EMEV2
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
select USE_OF
|
||||
---help---
|
||||
Use reference implementation of KZM9D board support
|
||||
which makes a greater use of device tree at the expense
|
||||
of not supporting a number of devices.
|
||||
|
||||
This is intended to aid developers
|
||||
|
||||
config MACH_KZM9G
|
||||
bool "KZM-A9-GT board"
|
||||
depends on ARCH_SH73A0
|
||||
|
|
|
@ -23,22 +23,18 @@ smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o
|
|||
|
||||
# IRQ objects
|
||||
obj-$(CONFIG_ARCH_SH7372) += entry-intc.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += entry-intc.o
|
||||
|
||||
# PM objects
|
||||
obj-$(CONFIG_SUSPEND) += suspend.o
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ARCH_SHMOBILE) += pm-rmobile.o
|
||||
obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o
|
||||
obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o pm-rmobile.o
|
||||
obj-$(CONFIG_ARCH_SH73A0) += pm-sh73a0.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o pm-rmobile.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o
|
||||
|
||||
# Board objects
|
||||
obj-$(CONFIG_MACH_AG5EVM) += board-ag5evm.o
|
||||
obj-$(CONFIG_MACH_APE6EVM) += board-ape6evm.o
|
||||
obj-$(CONFIG_MACH_MACKEREL) += board-mackerel.o
|
||||
obj-$(CONFIG_MACH_KOTA2) += board-kota2.o
|
||||
obj-$(CONFIG_MACH_BOCKW) += board-bockw.o
|
||||
obj-$(CONFIG_MACH_MARZEN) += board-marzen.o
|
||||
obj-$(CONFIG_MACH_MARZEN_REFERENCE) += board-marzen-reference.o
|
||||
|
@ -46,6 +42,7 @@ obj-$(CONFIG_MACH_LAGER) += board-lager.o
|
|||
obj-$(CONFIG_MACH_ARMADILLO800EVA) += board-armadillo800eva.o
|
||||
obj-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += board-armadillo800eva-reference.o
|
||||
obj-$(CONFIG_MACH_KZM9D) += board-kzm9d.o
|
||||
obj-$(CONFIG_MACH_KZM9D_REFERENCE) += board-kzm9d-reference.o
|
||||
obj-$(CONFIG_MACH_KZM9G) += board-kzm9g.o
|
||||
obj-$(CONFIG_MACH_KZM9G_REFERENCE) += board-kzm9g-reference.o
|
||||
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
# per-board load address for uImage
|
||||
loadaddr-y :=
|
||||
loadaddr-$(CONFIG_MACH_AG5EVM) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_APE6EVM) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_ARMADILLO800EVA) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000
|
||||
loadaddr-$(CONFIG_MACH_KOTA2) += 0x41008000
|
||||
loadaddr-$(CONFIG_MACH_KZM9D) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_KZM9D_REFERENCE) += 0x40008000
|
||||
loadaddr-$(CONFIG_MACH_KZM9G) += 0x41008000
|
||||
loadaddr-$(CONFIG_MACH_KZM9G_REFERENCE) += 0x41008000
|
||||
loadaddr-$(CONFIG_MACH_LAGER) += 0x40008000
|
||||
|
|
|
@ -1,672 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-shmobile/board-ag5evm.c
|
||||
*
|
||||
* Copyright (C) 2010 Takashi Yoshii <yoshii.takashi.zj@renesas.com>
|
||||
* Copyright (C) 2009 Yoshihiro Shimoda <shimoda.yoshihiro@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.
|
||||
*
|
||||
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mmcif.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/sh_clk.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <video/sh_mobile_lcdc.h>
|
||||
#include <video/sh_mipi_dsi.h>
|
||||
#include <sound/sh_fsi.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sh73a0.h>
|
||||
#include <mach/common.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
/* Dummy supplies, where voltage doesn't matter */
|
||||
static struct regulator_consumer_supply dummy_supplies[] = {
|
||||
REGULATOR_SUPPLY("vddvario", "smsc911x"),
|
||||
REGULATOR_SUPPLY("vdd33a", "smsc911x"),
|
||||
};
|
||||
|
||||
static struct resource smsc9220_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x14000000,
|
||||
.end = 0x14000000 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = SH73A0_PINT0_IRQ(2), /* PINTA2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct smsc911x_platform_config smsc9220_platdata = {
|
||||
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
|
||||
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
};
|
||||
|
||||
static struct platform_device eth_device = {
|
||||
.name = "smsc911x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &smsc9220_platdata,
|
||||
},
|
||||
.resource = smsc9220_resources,
|
||||
.num_resources = ARRAY_SIZE(smsc9220_resources),
|
||||
};
|
||||
|
||||
static struct sh_keysc_info keysc_platdata = {
|
||||
.mode = SH_KEYSC_MODE_6,
|
||||
.scan_timing = 3,
|
||||
.delay = 100,
|
||||
.keycodes = {
|
||||
KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G,
|
||||
KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N,
|
||||
KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U,
|
||||
KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP,
|
||||
KEY_SPACE, KEY_9, KEY_6, KEY_3, KEY_WAKEUP, KEY_RIGHT, \
|
||||
KEY_COFFEE,
|
||||
KEY_0, KEY_8, KEY_5, KEY_2, KEY_DOWN, KEY_ENTER, KEY_UP,
|
||||
KEY_KPASTERISK, KEY_7, KEY_4, KEY_1, KEY_STOP, KEY_LEFT, \
|
||||
KEY_COMPUTER,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource keysc_resources[] = {
|
||||
[0] = {
|
||||
.name = "KEYSC",
|
||||
.start = 0xe61b0000,
|
||||
.end = 0xe61b0098 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(71),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device keysc_device = {
|
||||
.name = "sh_keysc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(keysc_resources),
|
||||
.resource = keysc_resources,
|
||||
.dev = {
|
||||
.platform_data = &keysc_platdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* FSI A */
|
||||
static struct resource fsi_resources[] = {
|
||||
[0] = {
|
||||
.name = "FSI",
|
||||
.start = 0xEC230000,
|
||||
.end = 0xEC230400 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(146),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device fsi_device = {
|
||||
.name = "sh_fsi2",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(fsi_resources),
|
||||
.resource = fsi_resources,
|
||||
};
|
||||
|
||||
/* Fixed 1.8V regulator to be used by MMCIF */
|
||||
static struct regulator_consumer_supply fixed1v8_power_consumers[] =
|
||||
{
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
|
||||
};
|
||||
|
||||
static struct resource sh_mmcif_resources[] = {
|
||||
[0] = {
|
||||
.name = "MMCIF",
|
||||
.start = 0xe6bd0000,
|
||||
.end = 0xe6bd00ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(141),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(140),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_mmcif_plat_data sh_mmcif_platdata = {
|
||||
.sup_pclk = 0,
|
||||
.ocr = MMC_VDD_165_195,
|
||||
.caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
|
||||
.slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
|
||||
.slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
|
||||
};
|
||||
|
||||
static struct platform_device mmc_device = {
|
||||
.name = "sh_mmcif",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = NULL,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.platform_data = &sh_mmcif_platdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sh_mmcif_resources),
|
||||
.resource = sh_mmcif_resources,
|
||||
};
|
||||
|
||||
/* IrDA */
|
||||
static struct resource irda_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xE6D00000,
|
||||
.end = 0xE6D01FD4 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(95),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device irda_device = {
|
||||
.name = "sh_irda",
|
||||
.id = 0,
|
||||
.resource = irda_resources,
|
||||
.num_resources = ARRAY_SIZE(irda_resources),
|
||||
};
|
||||
|
||||
/* MIPI-DSI */
|
||||
static struct resource mipidsi0_resources[] = {
|
||||
[0] = {
|
||||
.name = "DSI0",
|
||||
.start = 0xfeab0000,
|
||||
.end = 0xfeab3fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "DSI0",
|
||||
.start = 0xfeab4000,
|
||||
.end = 0xfeab7fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static int sh_mipi_set_dot_clock(struct platform_device *pdev,
|
||||
void __iomem *base,
|
||||
int enable)
|
||||
{
|
||||
struct clk *pck, *phy;
|
||||
int ret;
|
||||
|
||||
pck = clk_get(&pdev->dev, "dsip_clk");
|
||||
if (IS_ERR(pck)) {
|
||||
ret = PTR_ERR(pck);
|
||||
goto sh_mipi_set_dot_clock_pck_err;
|
||||
}
|
||||
|
||||
phy = clk_get(&pdev->dev, "dsiphy_clk");
|
||||
if (IS_ERR(phy)) {
|
||||
ret = PTR_ERR(phy);
|
||||
goto sh_mipi_set_dot_clock_phy_err;
|
||||
}
|
||||
|
||||
if (enable) {
|
||||
clk_set_rate(pck, clk_round_rate(pck, 24000000));
|
||||
clk_set_rate(phy, clk_round_rate(pck, 510000000));
|
||||
clk_enable(pck);
|
||||
clk_enable(phy);
|
||||
} else {
|
||||
clk_disable(pck);
|
||||
clk_disable(phy);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
clk_put(phy);
|
||||
sh_mipi_set_dot_clock_phy_err:
|
||||
clk_put(pck);
|
||||
sh_mipi_set_dot_clock_pck_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct sh_mipi_dsi_info mipidsi0_info = {
|
||||
.data_format = MIPI_RGB888,
|
||||
.channel = LCDC_CHAN_MAINLCD,
|
||||
.lane = 2,
|
||||
.vsynw_offset = 20,
|
||||
.clksrc = 1,
|
||||
.flags = SH_MIPI_DSI_HSABM |
|
||||
SH_MIPI_DSI_SYNC_PULSES_MODE |
|
||||
SH_MIPI_DSI_HSbyteCLK,
|
||||
.set_dot_clock = sh_mipi_set_dot_clock,
|
||||
};
|
||||
|
||||
static struct platform_device mipidsi0_device = {
|
||||
.name = "sh-mipi-dsi",
|
||||
.num_resources = ARRAY_SIZE(mipidsi0_resources),
|
||||
.resource = mipidsi0_resources,
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &mipidsi0_info,
|
||||
},
|
||||
};
|
||||
|
||||
static unsigned char lcd_backlight_seq[3][2] = {
|
||||
{ 0x04, 0x07 },
|
||||
{ 0x23, 0x80 },
|
||||
{ 0x03, 0x01 },
|
||||
};
|
||||
|
||||
static int lcd_backlight_set_brightness(int brightness)
|
||||
{
|
||||
struct i2c_adapter *adap;
|
||||
struct i2c_msg msg;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (brightness == 0) {
|
||||
/* Reset the chip */
|
||||
gpio_set_value(235, 0);
|
||||
mdelay(24);
|
||||
gpio_set_value(235, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
adap = i2c_get_adapter(1);
|
||||
if (adap == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(lcd_backlight_seq); i++) {
|
||||
msg.addr = 0x6d;
|
||||
msg.buf = &lcd_backlight_seq[i][0];
|
||||
msg.len = 2;
|
||||
msg.flags = 0;
|
||||
|
||||
ret = i2c_transfer(adap, &msg, 1);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
i2c_put_adapter(adap);
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
/* LCDC0 */
|
||||
static const struct fb_videomode lcdc0_modes[] = {
|
||||
{
|
||||
.name = "R63302(QHD)",
|
||||
.xres = 544,
|
||||
.yres = 961,
|
||||
.left_margin = 72,
|
||||
.right_margin = 600,
|
||||
.hsync_len = 16,
|
||||
.upper_margin = 8,
|
||||
.lower_margin = 8,
|
||||
.vsync_len = 2,
|
||||
.sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_lcdc_info lcdc0_info = {
|
||||
.clock_source = LCDC_CLK_PERIPHERAL,
|
||||
.ch[0] = {
|
||||
.chan = LCDC_CHAN_MAINLCD,
|
||||
.interface_type = RGB24,
|
||||
.clock_divider = 1,
|
||||
.flags = LCDC_FLAGS_DWPOL,
|
||||
.fourcc = V4L2_PIX_FMT_RGB565,
|
||||
.lcd_modes = lcdc0_modes,
|
||||
.num_modes = ARRAY_SIZE(lcdc0_modes),
|
||||
.panel_cfg = {
|
||||
.width = 44,
|
||||
.height = 79,
|
||||
},
|
||||
.bl_info = {
|
||||
.name = "sh_mobile_lcdc_bl",
|
||||
.max_brightness = 1,
|
||||
.set_brightness = lcd_backlight_set_brightness,
|
||||
},
|
||||
.tx_dev = &mipidsi0_device,
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource lcdc0_resources[] = {
|
||||
[0] = {
|
||||
.name = "LCDC0",
|
||||
.start = 0xfe940000, /* P4-only space */
|
||||
.end = 0xfe943fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = intcs_evt2irq(0x580),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device lcdc0_device = {
|
||||
.name = "sh_mobile_lcdc_fb",
|
||||
.num_resources = ARRAY_SIZE(lcdc0_resources),
|
||||
.resource = lcdc0_resources,
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &lcdc0_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
},
|
||||
};
|
||||
|
||||
/* Fixed 2.8V regulators to be used by SDHI0 */
|
||||
static struct regulator_consumer_supply fixed2v8_power_consumers[] =
|
||||
{
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
|
||||
};
|
||||
|
||||
/* SDHI0 */
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
|
||||
.tmio_caps = MMC_CAP_SD_HIGHSPEED,
|
||||
.tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
|
||||
.cd_gpio = 251,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI0",
|
||||
.start = 0xee100000,
|
||||
.end = 0xee1000ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
|
||||
.start = gic_spi(83),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_SDCARD,
|
||||
.start = gic_spi(84),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_SDIO,
|
||||
.start = gic_spi(85),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi0_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(sdhi0_resources),
|
||||
.resource = sdhi0_resources,
|
||||
.dev = {
|
||||
.platform_data = &sdhi0_info,
|
||||
},
|
||||
};
|
||||
|
||||
/* Fixed 3.3V regulator to be used by SDHI1 */
|
||||
static struct regulator_consumer_supply cn4_power_consumers[] =
|
||||
{
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data cn4_power_init_data = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(cn4_power_consumers),
|
||||
.consumer_supplies = cn4_power_consumers,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config cn4_power_info = {
|
||||
.supply_name = "CN4 SD/MMC Vdd",
|
||||
.microvolts = 3300000,
|
||||
.gpio = 114,
|
||||
.enable_high = 1,
|
||||
.init_data = &cn4_power_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device cn4_power = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &cn4_power_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
|
||||
{
|
||||
static int power_gpio = -EINVAL;
|
||||
|
||||
if (power_gpio < 0) {
|
||||
int ret = gpio_request_one(114, GPIOF_OUT_INIT_LOW,
|
||||
"sdhi1_power");
|
||||
if (!ret)
|
||||
power_gpio = 114;
|
||||
}
|
||||
|
||||
/*
|
||||
* If requesting the GPIO above failed, it means, that the regulator got
|
||||
* probed and grabbed the GPIO, but we don't know, whether the sdhi
|
||||
* driver already uses the regulator. If it doesn't, we have to toggle
|
||||
* the GPIO ourselves, even though it is now owned by the fixed
|
||||
* regulator driver. We have to live with the race in case the driver
|
||||
* gets unloaded and the GPIO freed between these two steps.
|
||||
*/
|
||||
gpio_set_value(114, state);
|
||||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sh_sdhi1_info = {
|
||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
|
||||
.tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
|
||||
.tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.set_pwr = ag5evm_sdhi1_set_pwr,
|
||||
};
|
||||
|
||||
static struct resource sdhi1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI1",
|
||||
.start = 0xee120000,
|
||||
.end = 0xee1200ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
|
||||
.start = gic_spi(87),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_SDCARD,
|
||||
.start = gic_spi(88),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.name = SH_MOBILE_SDHI_IRQ_SDIO,
|
||||
.start = gic_spi(89),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi1_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &sh_sdhi1_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sdhi1_resources),
|
||||
.resource = sdhi1_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *ag5evm_devices[] __initdata = {
|
||||
&cn4_power,
|
||||
ð_device,
|
||||
&keysc_device,
|
||||
&fsi_device,
|
||||
&mmc_device,
|
||||
&irda_device,
|
||||
&mipidsi0_device,
|
||||
&lcdc0_device,
|
||||
&sdhi0_device,
|
||||
&sdhi1_device,
|
||||
};
|
||||
|
||||
static unsigned long pin_pullup_conf[] = {
|
||||
PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
|
||||
};
|
||||
|
||||
static const struct pinctrl_map ag5evm_pinctrl_map[] = {
|
||||
/* FSIA */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
|
||||
"fsia_mclk_in", "fsia"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
|
||||
"fsia_sclk_in", "fsia"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
|
||||
"fsia_data_in", "fsia"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
|
||||
"fsia_data_out", "fsia"),
|
||||
/* I2C2 & I2C3 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.2", "pfc-sh73a0",
|
||||
"i2c2_0", "i2c2"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.3", "pfc-sh73a0",
|
||||
"i2c3_0", "i2c3"),
|
||||
/* IrDA */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_irda.0", "pfc-sh73a0",
|
||||
"irda_0", "irda"),
|
||||
/* KEYSC */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_in8", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out04", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out5", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out6_0", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out7_0", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out8_0", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out9_2", "keysc"),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_in8", pin_pullup_conf),
|
||||
/* MMCIF */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_data8_0", "mmc0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_ctrl_0", "mmc0"),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"PORT279", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_data8_0", pin_pullup_conf),
|
||||
/* SCIFA2 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
|
||||
"scifa2_data_0", "scifa2"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
|
||||
"scifa2_ctrl_0", "scifa2"),
|
||||
/* SDHI0 (CN15 [SD I/F]) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_data4", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_ctrl", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_wp", "sdhi0"),
|
||||
/* SDHI1 (CN4 [WLAN I/F]) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_data4", "sdhi1"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_ctrl", "sdhi1"),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_data4", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"PORT263", pin_pullup_conf),
|
||||
};
|
||||
|
||||
static void __init ag5evm_init(void)
|
||||
{
|
||||
regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
|
||||
ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
|
||||
regulator_register_always_on(1, "fixed-2.8V", fixed2v8_power_consumers,
|
||||
ARRAY_SIZE(fixed2v8_power_consumers), 3300000);
|
||||
regulator_register_fixed(3, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
||||
|
||||
pinctrl_register_mappings(ag5evm_pinctrl_map,
|
||||
ARRAY_SIZE(ag5evm_pinctrl_map));
|
||||
sh73a0_pinmux_init();
|
||||
|
||||
/* enable MMCIF */
|
||||
gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
|
||||
|
||||
/* enable SMSC911X */
|
||||
gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
|
||||
gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
|
||||
|
||||
/* LCD panel */
|
||||
gpio_request_one(217, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
|
||||
mdelay(1);
|
||||
gpio_set_value(217, 1);
|
||||
mdelay(100);
|
||||
|
||||
/* LCD backlight controller */
|
||||
gpio_request_one(235, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
|
||||
lcd_backlight_set_brightness(0);
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
/* Shared attribute override enable, 64K*8way */
|
||||
l2x0_init(IOMEM(0xf0100000), 0x00460000, 0xc2000fff);
|
||||
#endif
|
||||
sh73a0_add_standard_devices();
|
||||
platform_add_devices(ag5evm_devices, ARRAY_SIZE(ag5evm_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(AG5EVM, "ag5evm")
|
||||
.smp = smp_ops(sh73a0_smp_ops),
|
||||
.map_io = sh73a0_map_io,
|
||||
.init_early = sh73a0_add_early_devices,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = sh73a0_init_irq,
|
||||
.init_machine = ag5evm_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.init_time = sh73a0_earlytimer_init,
|
||||
MACHINE_END
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -102,7 +101,7 @@ static const char *ape6evm_boards_compat_dt[] __initdata = {
|
|||
};
|
||||
|
||||
DT_MACHINE_START(APE6EVM_DT, "ape6evm")
|
||||
.init_irq = irqchip_init,
|
||||
.init_early = r8a73a4_init_delay,
|
||||
.init_time = shmobile_timer_init,
|
||||
.init_machine = ape6evm_add_standard_devices,
|
||||
.dt_compat = ape6evm_boards_compat_dt,
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/pwm-renesas-tpu.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/gpio-regulator.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -387,7 +389,50 @@ static struct platform_device sh_eth_device = {
|
|||
.num_resources = ARRAY_SIZE(sh_eth_resources),
|
||||
};
|
||||
|
||||
/* LCDC */
|
||||
/* PWM */
|
||||
static struct resource pwm_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe6600000,
|
||||
.end = 0xe66000ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct tpu_pwm_platform_data pwm_device_data = {
|
||||
.channels[2] = {
|
||||
.polarity = PWM_POLARITY_INVERSED,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device pwm_device = {
|
||||
.name = "renesas-tpu-pwm",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &pwm_device_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(pwm_resources),
|
||||
.resource = pwm_resources,
|
||||
};
|
||||
|
||||
static struct pwm_lookup pwm_lookup[] = {
|
||||
PWM_LOOKUP("renesas-tpu-pwm", 2, "pwm-backlight.0", NULL),
|
||||
};
|
||||
|
||||
/* LCDC and backlight */
|
||||
static struct platform_pwm_backlight_data pwm_backlight_data = {
|
||||
.lth_brightness = 50,
|
||||
.max_brightness = 255,
|
||||
.dft_brightness = 255,
|
||||
.pwm_period_ns = 33333, /* 30kHz */
|
||||
};
|
||||
|
||||
static struct platform_device pwm_backlight_device = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.platform_data = &pwm_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct fb_videomode lcdc0_mode = {
|
||||
.name = "AMPIER/AM-800480",
|
||||
.xres = 800,
|
||||
|
@ -679,15 +724,6 @@ static struct platform_device vcc_sdhi1 = {
|
|||
};
|
||||
|
||||
/* SDHI0 */
|
||||
/*
|
||||
* FIXME
|
||||
*
|
||||
* It use polling mode here, since
|
||||
* CD (= Card Detect) pin is not connected to SDHI0_CD.
|
||||
* We can use IRQ31 as card detect irq,
|
||||
* but it needs chattering removal operation
|
||||
*/
|
||||
#define IRQ31 irq_pin(31)
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
|
@ -1030,6 +1066,8 @@ static struct i2c_board_info i2c2_devices[] = {
|
|||
*/
|
||||
static struct platform_device *eva_devices[] __initdata = {
|
||||
&lcdc0_device,
|
||||
&pwm_device,
|
||||
&pwm_backlight_device,
|
||||
&gpio_keys_device,
|
||||
&sh_eth_device,
|
||||
&vcc_sdhi0,
|
||||
|
@ -1101,6 +1139,9 @@ static const struct pinctrl_map eva_pinctrl_map[] = {
|
|||
/* ST1232 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-r8a7740",
|
||||
"intc_irq10", "intc"),
|
||||
/* TPU0 */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("renesas-tpu-pwm", "pfc-r8a7740",
|
||||
"tpu0_to2_1", "tpu0"),
|
||||
/* USBHS */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7740",
|
||||
"intc_irq7_1", "intc"),
|
||||
|
@ -1154,13 +1195,13 @@ static void __init eva_init(void)
|
|||
ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
|
||||
|
||||
pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
|
||||
pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
|
||||
|
||||
r8a7740_pinmux_init();
|
||||
r8a7740_meram_workaround();
|
||||
|
||||
/* LCDC0 */
|
||||
gpio_request_one(61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
|
||||
gpio_request_one(202, GPIOF_OUT_INIT_LOW, NULL); /* LCD0_LED_CONT */
|
||||
|
||||
/* GETHER */
|
||||
gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
|
||||
|
|
|
@ -1,553 +0,0 @@
|
|||
/*
|
||||
* kota2 board support
|
||||
*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
* Copyright (C) 2010 Takashi Yoshii <yoshii.takashi.zj@renesas.com>
|
||||
* Copyright (C) 2009 Yoshihiro Shimoda <shimoda.yoshihiro@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.
|
||||
*
|
||||
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <linux/platform_data/leds-renesas-tpu.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mmcif.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sh73a0.h>
|
||||
#include <mach/common.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
/* Dummy supplies, where voltage doesn't matter */
|
||||
static struct regulator_consumer_supply dummy_supplies[] = {
|
||||
REGULATOR_SUPPLY("vddvario", "smsc911x"),
|
||||
REGULATOR_SUPPLY("vdd33a", "smsc911x"),
|
||||
};
|
||||
|
||||
/* SMSC 9220 */
|
||||
static struct resource smsc9220_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x14000000, /* CS5A */
|
||||
.end = 0x140000ff, /* A1->A7 */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = SH73A0_PINT0_IRQ(2), /* PINTA2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct smsc911x_platform_config smsc9220_platdata = {
|
||||
.flags = SMSC911X_USE_32BIT, /* 32-bit SW on 16-bit HW bus */
|
||||
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
};
|
||||
|
||||
static struct platform_device eth_device = {
|
||||
.name = "smsc911x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &smsc9220_platdata,
|
||||
},
|
||||
.resource = smsc9220_resources,
|
||||
.num_resources = ARRAY_SIZE(smsc9220_resources),
|
||||
};
|
||||
|
||||
/* KEYSC */
|
||||
static struct sh_keysc_info keysc_platdata = {
|
||||
.mode = SH_KEYSC_MODE_6,
|
||||
.scan_timing = 3,
|
||||
.delay = 100,
|
||||
.keycodes = {
|
||||
KEY_NUMERIC_STAR, KEY_NUMERIC_0, KEY_NUMERIC_POUND,
|
||||
0, 0, 0, 0, 0,
|
||||
KEY_NUMERIC_7, KEY_NUMERIC_8, KEY_NUMERIC_9,
|
||||
0, KEY_DOWN, 0, 0, 0,
|
||||
KEY_NUMERIC_4, KEY_NUMERIC_5, KEY_NUMERIC_6,
|
||||
KEY_LEFT, KEY_ENTER, KEY_RIGHT, 0, 0,
|
||||
KEY_NUMERIC_1, KEY_NUMERIC_2, KEY_NUMERIC_3,
|
||||
0, KEY_UP, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource keysc_resources[] = {
|
||||
[0] = {
|
||||
.name = "KEYSC",
|
||||
.start = 0xe61b0000,
|
||||
.end = 0xe61b0098 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(71),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device keysc_device = {
|
||||
.name = "sh_keysc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(keysc_resources),
|
||||
.resource = keysc_resources,
|
||||
.dev = {
|
||||
.platform_data = &keysc_platdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* GPIO KEY */
|
||||
#define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 }
|
||||
|
||||
static struct gpio_keys_button gpio_buttons[] = {
|
||||
GPIO_KEY(KEY_VOLUMEUP, 56, "+"), /* S2: VOL+ [IRQ9] */
|
||||
GPIO_KEY(KEY_VOLUMEDOWN, 54, "-"), /* S3: VOL- [IRQ10] */
|
||||
GPIO_KEY(KEY_MENU, 27, "Menu"), /* S4: MENU [IRQ30] */
|
||||
GPIO_KEY(KEY_HOMEPAGE, 26, "Home"), /* S5: HOME [IRQ31] */
|
||||
GPIO_KEY(KEY_BACK, 11, "Back"), /* S6: BACK [IRQ0] */
|
||||
GPIO_KEY(KEY_PHONE, 238, "Tel"), /* S7: TEL [IRQ11] */
|
||||
GPIO_KEY(KEY_POWER, 239, "C1"), /* S8: CAM [IRQ13] */
|
||||
GPIO_KEY(KEY_MAIL, 224, "Mail"), /* S9: MAIL [IRQ3] */
|
||||
/* Omitted button "C3?": 223 - S10: CUST [IRQ8] */
|
||||
GPIO_KEY(KEY_CAMERA, 164, "C2"), /* S11: CAM_HALF [IRQ25] */
|
||||
/* Omitted button "?": 152 - S12: CAM_FULL [No IRQ] */
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data gpio_key_info = {
|
||||
.buttons = gpio_buttons,
|
||||
.nbuttons = ARRAY_SIZE(gpio_buttons),
|
||||
};
|
||||
|
||||
static struct platform_device gpio_keys_device = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gpio_key_info,
|
||||
},
|
||||
};
|
||||
|
||||
/* GPIO LED */
|
||||
#define GPIO_LED(n, g) { .name = n, .gpio = g }
|
||||
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
GPIO_LED("G", 20), /* PORT20 [GPO0] -> LED7 -> "G" */
|
||||
GPIO_LED("H", 21), /* PORT21 [GPO1] -> LED8 -> "H" */
|
||||
GPIO_LED("J", 22), /* PORT22 [GPO2] -> LED9 -> "J" */
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data gpio_leds_info = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device gpio_leds_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gpio_leds_info,
|
||||
},
|
||||
};
|
||||
|
||||
/* TPU LED */
|
||||
static struct led_renesas_tpu_config led_renesas_tpu12_pdata = {
|
||||
.name = "V2513",
|
||||
.pin_gpio_fn = GPIO_FN_TPU1TO2,
|
||||
.pin_gpio = 153,
|
||||
.channel_offset = 0x90,
|
||||
.timer_bit = 2,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu12_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU12",
|
||||
.start = 0xe6610090,
|
||||
.end = 0xe66100b5,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu12_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 12,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu12_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu12_resources),
|
||||
.resource = tpu12_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu41_pdata = {
|
||||
.name = "V2514",
|
||||
.pin_gpio_fn = GPIO_FN_TPU4TO1,
|
||||
.pin_gpio = 199,
|
||||
.channel_offset = 0x50,
|
||||
.timer_bit = 1,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu41_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU41",
|
||||
.start = 0xe6640050,
|
||||
.end = 0xe6640075,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu41_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 41,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu41_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu41_resources),
|
||||
.resource = tpu41_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu21_pdata = {
|
||||
.name = "V2515",
|
||||
.pin_gpio_fn = GPIO_FN_TPU2TO1,
|
||||
.pin_gpio = 197,
|
||||
.channel_offset = 0x50,
|
||||
.timer_bit = 1,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu21_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU21",
|
||||
.start = 0xe6620050,
|
||||
.end = 0xe6620075,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu21_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 21,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu21_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu21_resources),
|
||||
.resource = tpu21_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu30_pdata = {
|
||||
.name = "KEYLED",
|
||||
.pin_gpio_fn = GPIO_FN_TPU3TO0,
|
||||
.pin_gpio = 163,
|
||||
.channel_offset = 0x10,
|
||||
.timer_bit = 0,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu30_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU30",
|
||||
.start = 0xe6630010,
|
||||
.end = 0xe6630035,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu30_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 30,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu30_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu30_resources),
|
||||
.resource = tpu30_resources,
|
||||
};
|
||||
|
||||
/* Fixed 1.8V regulator to be used by MMCIF */
|
||||
static struct regulator_consumer_supply fixed1v8_power_consumers[] =
|
||||
{
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
|
||||
};
|
||||
|
||||
/* MMCIF */
|
||||
static struct resource mmcif_resources[] = {
|
||||
[0] = {
|
||||
.name = "MMCIF",
|
||||
.start = 0xe6bd0000,
|
||||
.end = 0xe6bd00ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(140),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(141),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_mmcif_plat_data mmcif_info = {
|
||||
.ocr = MMC_VDD_165_195,
|
||||
.caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
|
||||
};
|
||||
|
||||
static struct platform_device mmcif_device = {
|
||||
.name = "sh_mmcif",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &mmcif_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(mmcif_resources),
|
||||
.resource = mmcif_resources,
|
||||
};
|
||||
|
||||
/* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */
|
||||
static struct regulator_consumer_supply fixed3v3_power_consumers[] =
|
||||
{
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
|
||||
REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
|
||||
REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
|
||||
};
|
||||
|
||||
/* SDHI0 */
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.tmio_caps = MMC_CAP_SD_HIGHSPEED,
|
||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI0",
|
||||
.start = 0xee100000,
|
||||
.end = 0xee1000ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(83),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(84),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = gic_spi(85),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi0_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(sdhi0_resources),
|
||||
.resource = sdhi0_resources,
|
||||
.dev = {
|
||||
.platform_data = &sdhi0_info,
|
||||
},
|
||||
};
|
||||
|
||||
/* SDHI1 */
|
||||
static struct sh_mobile_sdhi_info sdhi1_info = {
|
||||
.tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
|
||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
|
||||
};
|
||||
|
||||
static struct resource sdhi1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI1",
|
||||
.start = 0xee120000,
|
||||
.end = 0xee1200ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(87),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(88),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = gic_spi(89),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi1_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(sdhi1_resources),
|
||||
.resource = sdhi1_resources,
|
||||
.dev = {
|
||||
.platform_data = &sdhi1_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *kota2_devices[] __initdata = {
|
||||
ð_device,
|
||||
&keysc_device,
|
||||
&gpio_keys_device,
|
||||
&gpio_leds_device,
|
||||
&leds_tpu12_device,
|
||||
&leds_tpu41_device,
|
||||
&leds_tpu21_device,
|
||||
&leds_tpu30_device,
|
||||
&mmcif_device,
|
||||
&sdhi0_device,
|
||||
&sdhi1_device,
|
||||
};
|
||||
|
||||
static unsigned long pin_pullup_conf[] = {
|
||||
PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
|
||||
};
|
||||
|
||||
static const struct pinctrl_map kota2_pinctrl_map[] = {
|
||||
/* KEYSC */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_in8", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out04", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out5", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out6_0", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out7_0", "keysc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_out8_0", "keysc"),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
|
||||
"keysc_in8", pin_pullup_conf),
|
||||
/* MMCIF */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_data8_0", "mmc0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_ctrl_0", "mmc0"),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"PORT279", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
|
||||
"mmc0_data8_0", pin_pullup_conf),
|
||||
/* SCIFA2 (UART2) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
|
||||
"scifa2_data_0", "scifa2"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
|
||||
"scifa2_ctrl_0", "scifa2"),
|
||||
/* SCIFA4 (UART1) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
|
||||
"scifa4_data", "scifa4"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
|
||||
"scifa4_ctrl", "scifa4"),
|
||||
/* SCIFB (BT) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
|
||||
"scifb_data_0", "scifb"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
|
||||
"scifb_clk_0", "scifb"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
|
||||
"scifb_ctrl_0", "scifb"),
|
||||
/* SDHI0 (microSD) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_data4", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_ctrl", "sdhi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_cd", "sdhi0"),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"sdhi0_data4", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"PORT256", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
|
||||
"PORT251", pin_pullup_conf),
|
||||
/* SDHI1 (BCM4330) */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_data4", "sdhi1"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_ctrl", "sdhi1"),
|
||||
PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"sdhi1_data4", pin_pullup_conf),
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
|
||||
"PORT263", pin_pullup_conf),
|
||||
/* SMSC911X */
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
|
||||
"bsc_data_0_7", "bsc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
|
||||
"bsc_data_8_15", "bsc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
|
||||
"bsc_cs5_a", "bsc"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
|
||||
"bsc_we0", "bsc"),
|
||||
};
|
||||
|
||||
static void __init kota2_init(void)
|
||||
{
|
||||
regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
|
||||
ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
|
||||
regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
|
||||
ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
|
||||
regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
||||
|
||||
pinctrl_register_mappings(kota2_pinctrl_map,
|
||||
ARRAY_SIZE(kota2_pinctrl_map));
|
||||
sh73a0_pinmux_init();
|
||||
|
||||
/* SMSC911X */
|
||||
gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
|
||||
gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
|
||||
|
||||
/* MMCIF */
|
||||
gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
/* Early BRESP enable, Shared attribute override enable, 64K*8way */
|
||||
l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
|
||||
#endif
|
||||
sh73a0_add_standard_devices();
|
||||
platform_add_devices(kota2_devices, ARRAY_SIZE(kota2_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(KOTA2, "kota2")
|
||||
.smp = smp_ops(sh73a0_smp_ops),
|
||||
.map_io = sh73a0_map_io,
|
||||
.init_early = sh73a0_add_early_devices,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = sh73a0_init_irq,
|
||||
.init_machine = kota2_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.init_time = sh73a0_earlytimer_init,
|
||||
MACHINE_END
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* kzm9d board support - Reference DT implementation
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 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.
|
||||
*
|
||||
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <mach/emev2.h>
|
||||
#include <mach/common.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
static void __init kzm9d_add_standard_devices(void)
|
||||
{
|
||||
emev2_clock_init();
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *kzm9d_boards_compat_dt[] __initdata = {
|
||||
"renesas,kzm9d-reference",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(KZM9D_DT, "kzm9d")
|
||||
.smp = smp_ops(emev2_smp_ops),
|
||||
.map_io = emev2_map_io,
|
||||
.init_early = emev2_init_delay,
|
||||
.init_machine = kzm9d_add_standard_devices,
|
||||
.init_late = shmobile_init_late,
|
||||
.dt_compat = kzm9d_boards_compat_dt,
|
||||
MACHINE_END
|
|
@ -85,9 +85,7 @@ static const char *kzm9d_boards_compat_dt[] __initdata = {
|
|||
DT_MACHINE_START(KZM9D_DT, "kzm9d")
|
||||
.smp = smp_ops(emev2_smp_ops),
|
||||
.map_io = emev2_map_io,
|
||||
.init_early = emev2_add_early_devices,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = emev2_init_irq,
|
||||
.init_early = emev2_init_delay,
|
||||
.init_machine = kzm9d_add_standard_devices,
|
||||
.init_late = shmobile_init_late,
|
||||
.dt_compat = kzm9d_boards_compat_dt,
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
|
@ -99,7 +98,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g-reference")
|
|||
.map_io = sh73a0_map_io,
|
||||
.init_early = sh73a0_init_delay,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = irqchip_init,
|
||||
.init_machine = kzm_init,
|
||||
.init_time = shmobile_timer_init,
|
||||
.dt_compat = kzm9g_boards_compat_dt,
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
|
@ -103,7 +102,7 @@ static const char *lager_boards_compat_dt[] __initdata = {
|
|||
};
|
||||
|
||||
DT_MACHINE_START(LAGER_DT, "lager")
|
||||
.init_irq = irqchip_init,
|
||||
.init_early = r8a7790_init_delay,
|
||||
.init_time = r8a7790_timer_init,
|
||||
.init_machine = lager_add_standard_devices,
|
||||
.dt_compat = lager_boards_compat_dt,
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mtd/sh_flctl.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/gpio_backlight.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -49,7 +50,6 @@
|
|||
#include <linux/tca6416_keypad.h>
|
||||
#include <linux/usb/renesas_usbhs.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <video/sh_mobile_hdmi.h>
|
||||
#include <video/sh_mobile_lcdc.h>
|
||||
#include <media/sh_mobile_ceu.h>
|
||||
|
@ -346,7 +346,7 @@ static struct platform_device meram_device = {
|
|||
},
|
||||
};
|
||||
|
||||
/* LCDC */
|
||||
/* LCDC and backlight */
|
||||
static struct fb_videomode mackerel_lcdc_modes[] = {
|
||||
{
|
||||
.name = "WVGA Panel",
|
||||
|
@ -362,13 +362,6 @@ static struct fb_videomode mackerel_lcdc_modes[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int mackerel_set_brightness(int brightness)
|
||||
{
|
||||
gpio_set_value(31, brightness);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct sh_mobile_meram_cfg lcd_meram_cfg = {
|
||||
.icb[0] = {
|
||||
.meram_size = 0x40,
|
||||
|
@ -393,11 +386,6 @@ static struct sh_mobile_lcdc_info lcdc_info = {
|
|||
.width = 152,
|
||||
.height = 91,
|
||||
},
|
||||
.bl_info = {
|
||||
.name = "sh_mobile_lcdc_bl",
|
||||
.max_brightness = 1,
|
||||
.set_brightness = mackerel_set_brightness,
|
||||
},
|
||||
.meram_cfg = &lcd_meram_cfg,
|
||||
}
|
||||
};
|
||||
|
@ -425,6 +413,20 @@ static struct platform_device lcdc_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct gpio_backlight_platform_data gpio_backlight_data = {
|
||||
.fbdev = &lcdc_device.dev,
|
||||
.gpio = 31,
|
||||
.def_value = 1,
|
||||
.name = "backlight",
|
||||
};
|
||||
|
||||
static struct platform_device gpio_backlight_device = {
|
||||
.name = "gpio-backlight",
|
||||
.dev = {
|
||||
.platform_data = &gpio_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* HDMI */
|
||||
static struct sh_mobile_hdmi_info hdmi_info = {
|
||||
.flags = HDMI_SND_SRC_SPDIF,
|
||||
|
@ -1231,6 +1233,7 @@ static struct platform_device *mackerel_devices[] __initdata = {
|
|||
&nor_flash_device,
|
||||
&smc911x_device,
|
||||
&lcdc_device,
|
||||
&gpio_backlight_device,
|
||||
&usbhs0_device,
|
||||
&usbhs1_device,
|
||||
&leds_device,
|
||||
|
@ -1441,9 +1444,6 @@ static void __init mackerel_init(void)
|
|||
ARRAY_SIZE(mackerel_pinctrl_map));
|
||||
sh7372_pinmux_init();
|
||||
|
||||
/* backlight, off by default */
|
||||
gpio_request_one(31, GPIOF_OUT_INIT_LOW, NULL);
|
||||
|
||||
gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
|
||||
|
||||
/* USBHS0 */
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/gpio-rcar.h>
|
||||
#include <linux/platform_data/usb-rcar-phy.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/smsc911x.h>
|
||||
|
@ -37,7 +38,6 @@
|
|||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/r8a7779.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/irqs.h>
|
||||
|
@ -57,7 +57,26 @@ static struct regulator_consumer_supply dummy_supplies[] = {
|
|||
REGULATOR_SUPPLY("vdd33a", "smsc911x"),
|
||||
};
|
||||
|
||||
static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
|
||||
/* USB PHY */
|
||||
static struct resource usb_phy_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xffe70800,
|
||||
.end = 0xffe70900 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct rcar_phy_platform_data usb_phy_platform_data;
|
||||
|
||||
static struct platform_device usb_phy = {
|
||||
.name = "rcar_usb_phy",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &usb_phy_platform_data,
|
||||
},
|
||||
.resource = usb_phy_resources,
|
||||
.num_resources = ARRAY_SIZE(usb_phy_resources),
|
||||
};
|
||||
|
||||
/* SMSC LAN89218 */
|
||||
static struct resource smsc911x_resources[] = {
|
||||
|
@ -184,6 +203,7 @@ static struct platform_device *marzen_devices[] __initdata = {
|
|||
&thermal_device,
|
||||
&hspi_device,
|
||||
&leds_device,
|
||||
&usb_phy,
|
||||
};
|
||||
|
||||
static const struct pinctrl_map marzen_pinctrl_map[] = {
|
||||
|
@ -234,7 +254,6 @@ static void __init marzen_init(void)
|
|||
r8a7779_init_irq_extpin(1); /* IRQ1 as individual interrupt */
|
||||
|
||||
r8a7779_add_standard_devices();
|
||||
r8a7779_add_usb_phy_device(&usb_phy_platform_data);
|
||||
platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#define USIB2SCLKDIV 0x65c
|
||||
#define USIB3SCLKDIV 0x660
|
||||
#define STI_CLKSEL 0x688
|
||||
#define SMU_GENERAL_REG0 0x7c0
|
||||
|
||||
/* not pretty, but hey */
|
||||
static void __iomem *smu_base;
|
||||
|
@ -51,11 +50,6 @@ static void emev2_smu_write(unsigned long value, int offs)
|
|||
iowrite32(value, smu_base + offs);
|
||||
}
|
||||
|
||||
void emev2_set_boot_vector(unsigned long value)
|
||||
{
|
||||
emev2_smu_write(value, SMU_GENERAL_REG0);
|
||||
}
|
||||
|
||||
static struct clk_mapping smu_mapping = {
|
||||
.phys = EMEV2_SMU_BASE,
|
||||
.len = PAGE_SIZE,
|
||||
|
@ -205,23 +199,11 @@ static struct clk_lookup lookups[] = {
|
|||
void __init emev2_clock_init(void)
|
||||
{
|
||||
int k, ret = 0;
|
||||
static int is_setup;
|
||||
|
||||
/* yuck, this is ugly as hell, but the non-smp case of clocks
|
||||
* code is now designed to rely on ioremap() instead of static
|
||||
* entity maps. in the case of smp we need access to the SMU
|
||||
* register earlier than ioremap() is actually working without
|
||||
* any static maps. to enable SMP in ugly but with dynamic
|
||||
* mappings we have to call emev2_clock_init() from different
|
||||
* places depending on UP and SMP...
|
||||
*/
|
||||
if (is_setup++)
|
||||
return;
|
||||
|
||||
smu_base = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
|
||||
BUG_ON(!smu_base);
|
||||
|
||||
/* setup STI timer to run on 37.768 kHz and deassert reset */
|
||||
/* setup STI timer to run on 32.768 kHz and deassert reset */
|
||||
emev2_smu_write(0, STI_CLKSEL);
|
||||
emev2_smu_write(1, STI_RSTCTRL);
|
||||
|
||||
|
|
|
@ -30,10 +30,12 @@
|
|||
|
||||
#define SMSTPCR2 0xe6150138
|
||||
#define SMSTPCR3 0xe615013c
|
||||
#define SMSTPCR4 0xe6150140
|
||||
#define SMSTPCR5 0xe6150144
|
||||
|
||||
#define FRQCRA 0xE6150000
|
||||
#define FRQCRB 0xE6150004
|
||||
#define FRQCRC 0xE61500E0
|
||||
#define VCLKCR1 0xE6150008
|
||||
#define VCLKCR2 0xE615000C
|
||||
#define VCLKCR3 0xE615001C
|
||||
|
@ -52,6 +54,7 @@
|
|||
#define HSICKCR 0xE615026C
|
||||
#define M4CKCR 0xE6150098
|
||||
#define PLLECR 0xE61500D0
|
||||
#define PLL0CR 0xE61500D8
|
||||
#define PLL1CR 0xE6150028
|
||||
#define PLL2CR 0xE615002C
|
||||
#define PLL2SCR 0xE61501F4
|
||||
|
@ -177,6 +180,7 @@ static struct sh_clk_ops pll_clk_ops = {
|
|||
.mapping = &cpg_mapping, \
|
||||
}
|
||||
|
||||
PLL_CLOCK(pll0_clk, &main_clk, pll_parent_main, 1, 20, PLL0CR, 0);
|
||||
PLL_CLOCK(pll1_clk, &main_clk, pll_parent_main, 1, 7, PLL1CR, 1);
|
||||
PLL_CLOCK(pll2_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2CR, 2);
|
||||
PLL_CLOCK(pll2s_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2SCR, 4);
|
||||
|
@ -184,6 +188,157 @@ PLL_CLOCK(pll2h_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2HCR, 5);
|
|||
|
||||
SH_FIXED_RATIO_CLK(pll1_div2_clk, pll1_clk, div2);
|
||||
|
||||
static atomic_t frqcr_lock;
|
||||
|
||||
/* Several clocks need to access FRQCRB, have to lock */
|
||||
static bool frqcr_kick_check(struct clk *clk)
|
||||
{
|
||||
return !(ioread32(CPG_MAP(FRQCRB)) & BIT(31));
|
||||
}
|
||||
|
||||
static int frqcr_kick_do(struct clk *clk)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* set KICK bit in FRQCRB to update hardware setting, check success */
|
||||
iowrite32(ioread32(CPG_MAP(FRQCRB)) | BIT(31), CPG_MAP(FRQCRB));
|
||||
for (i = 1000; i; i--)
|
||||
if (ioread32(CPG_MAP(FRQCRB)) & BIT(31))
|
||||
cpu_relax();
|
||||
else
|
||||
return 0;
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int zclk_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
void __iomem *frqcrc;
|
||||
int ret;
|
||||
unsigned long step, p_rate;
|
||||
u32 val;
|
||||
|
||||
if (!clk->parent || !__clk_get(clk->parent))
|
||||
return -ENODEV;
|
||||
|
||||
if (!atomic_inc_and_test(&frqcr_lock) || !frqcr_kick_check(clk)) {
|
||||
ret = -EBUSY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Users are supposed to first call clk_set_rate() only with
|
||||
* clk_round_rate() results. So, we don't fix wrong rates here, but
|
||||
* guard against them anyway
|
||||
*/
|
||||
|
||||
p_rate = clk_get_rate(clk->parent);
|
||||
if (rate == p_rate) {
|
||||
val = 0;
|
||||
} else {
|
||||
step = DIV_ROUND_CLOSEST(p_rate, 32);
|
||||
|
||||
if (rate > p_rate || rate < step) {
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
val = 32 - rate / step;
|
||||
}
|
||||
|
||||
frqcrc = clk->mapped_reg + (FRQCRC - (u32)clk->enable_reg);
|
||||
|
||||
iowrite32((ioread32(frqcrc) & ~(clk->div_mask << clk->enable_bit)) |
|
||||
(val << clk->enable_bit), frqcrc);
|
||||
|
||||
ret = frqcr_kick_do(clk);
|
||||
|
||||
done:
|
||||
atomic_dec(&frqcr_lock);
|
||||
__clk_put(clk->parent);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long zclk_round_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
/*
|
||||
* theoretical rate = parent rate * multiplier / 32,
|
||||
* where 1 <= multiplier <= 32. Therefore we should do
|
||||
* multiplier = rate * 32 / parent rate
|
||||
* rounded rate = parent rate * multiplier / 32.
|
||||
* However, multiplication before division won't fit in 32 bits, so
|
||||
* we sacrifice some precision by first dividing and then multiplying.
|
||||
* To find the nearest divisor we calculate both and pick up the best
|
||||
* one. This avoids 64-bit arithmetics.
|
||||
*/
|
||||
unsigned long step, mul_min, mul_max, rate_min, rate_max;
|
||||
|
||||
rate_max = clk_get_rate(clk->parent);
|
||||
|
||||
/* output freq <= parent */
|
||||
if (rate >= rate_max)
|
||||
return rate_max;
|
||||
|
||||
step = DIV_ROUND_CLOSEST(rate_max, 32);
|
||||
/* output freq >= parent / 32 */
|
||||
if (step >= rate)
|
||||
return step;
|
||||
|
||||
mul_min = rate / step;
|
||||
mul_max = DIV_ROUND_UP(rate, step);
|
||||
rate_min = step * mul_min;
|
||||
if (mul_max == mul_min)
|
||||
return rate_min;
|
||||
|
||||
rate_max = step * mul_max;
|
||||
|
||||
if (rate_max - rate < rate - rate_min)
|
||||
return rate_max;
|
||||
|
||||
return rate_min;
|
||||
}
|
||||
|
||||
static unsigned long zclk_recalc(struct clk *clk)
|
||||
{
|
||||
void __iomem *frqcrc = FRQCRC - (u32)clk->enable_reg + clk->mapped_reg;
|
||||
unsigned int max = clk->div_mask + 1;
|
||||
unsigned long val = ((ioread32(frqcrc) >> clk->enable_bit) &
|
||||
clk->div_mask);
|
||||
|
||||
return DIV_ROUND_CLOSEST(clk_get_rate(clk->parent), max) *
|
||||
(max - val);
|
||||
}
|
||||
|
||||
static struct sh_clk_ops zclk_ops = {
|
||||
.recalc = zclk_recalc,
|
||||
.set_rate = zclk_set_rate,
|
||||
.round_rate = zclk_round_rate,
|
||||
};
|
||||
|
||||
static struct clk z_clk = {
|
||||
.parent = &pll0_clk,
|
||||
.div_mask = 0x1f,
|
||||
.enable_bit = 8,
|
||||
/* We'll need to access FRQCRB and FRQCRC */
|
||||
.enable_reg = (void __iomem *)FRQCRB,
|
||||
.ops = &zclk_ops,
|
||||
};
|
||||
|
||||
/*
|
||||
* It seems only 1/2 divider is usable in manual mode. 1/2 / 2/3
|
||||
* switching is only available in auto-DVFS mode
|
||||
*/
|
||||
SH_FIXED_RATIO_CLK(pll0_div2_clk, pll0_clk, div2);
|
||||
|
||||
static struct clk z2_clk = {
|
||||
.parent = &pll0_div2_clk,
|
||||
.div_mask = 0x1f,
|
||||
.enable_bit = 0,
|
||||
/* We'll need to access FRQCRB and FRQCRC */
|
||||
.enable_reg = (void __iomem *)FRQCRB,
|
||||
.ops = &zclk_ops,
|
||||
};
|
||||
|
||||
static struct clk *main_clks[] = {
|
||||
&extalr_clk,
|
||||
&extal1_clk,
|
||||
|
@ -195,22 +350,23 @@ static struct clk *main_clks[] = {
|
|||
&main_div2_clk,
|
||||
&fsiack_clk,
|
||||
&fsibck_clk,
|
||||
&pll0_clk,
|
||||
&pll1_clk,
|
||||
&pll1_div2_clk,
|
||||
&pll2_clk,
|
||||
&pll2s_clk,
|
||||
&pll2h_clk,
|
||||
&z_clk,
|
||||
&pll0_div2_clk,
|
||||
&z2_clk,
|
||||
};
|
||||
|
||||
/* DIV4 */
|
||||
static void div4_kick(struct clk *clk)
|
||||
{
|
||||
unsigned long value;
|
||||
|
||||
/* set KICK bit in FRQCRB to update hardware setting */
|
||||
value = ioread32(CPG_MAP(FRQCRB));
|
||||
value |= (1 << 31);
|
||||
iowrite32(value, CPG_MAP(FRQCRB));
|
||||
if (!WARN(!atomic_inc_and_test(&frqcr_lock), "FRQCR* lock broken!\n"))
|
||||
frqcr_kick_do(clk);
|
||||
atomic_dec(&frqcr_lock);
|
||||
}
|
||||
|
||||
static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10};
|
||||
|
@ -349,8 +505,10 @@ static struct clk div6_clks[DIV6_NR] = {
|
|||
/* MSTP */
|
||||
enum {
|
||||
MSTP217, MSTP216, MSTP207, MSTP206, MSTP204, MSTP203,
|
||||
MSTP315, MSTP314, MSTP313, MSTP312, MSTP305,
|
||||
MSTP522,
|
||||
MSTP329, MSTP323, MSTP318, MSTP317, MSTP316,
|
||||
MSTP315, MSTP314, MSTP313, MSTP312, MSTP305, MSTP300,
|
||||
MSTP411, MSTP410, MSTP409,
|
||||
MSTP522, MSTP515,
|
||||
MSTP_NR
|
||||
};
|
||||
|
||||
|
@ -361,12 +519,22 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 7, 0), /* SCIFB1 */
|
||||
[MSTP216] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 16, 0), /* SCIFB2 */
|
||||
[MSTP217] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 17, 0), /* SCIFB3 */
|
||||
[MSTP300] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 0, 0), /* IIC2 */
|
||||
[MSTP305] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC1],SMSTPCR3, 5, 0), /* MMCIF1 */
|
||||
[MSTP312] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI2],SMSTPCR3, 12, 0), /* SDHI2 */
|
||||
[MSTP313] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI1],SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
[MSTP314] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI0],SMSTPCR3, 14, 0), /* SDHI0 */
|
||||
[MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0],SMSTPCR3, 15, 0), /* MMCIF0 */
|
||||
[MSTP316] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 16, 0), /* IIC6 */
|
||||
[MSTP317] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 17, 0), /* IIC7 */
|
||||
[MSTP318] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 18, 0), /* IIC0 */
|
||||
[MSTP323] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 23, 0), /* IIC1 */
|
||||
[MSTP329] = SH_CLK_MSTP32(&extalr_clk, SMSTPCR3, 29, 0), /* CMT10 */
|
||||
[MSTP409] = SH_CLK_MSTP32(&main_div2_clk, SMSTPCR4, 9, 0), /* IIC5 */
|
||||
[MSTP410] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */
|
||||
[MSTP411] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */
|
||||
[MSTP522] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR5, 22, 0), /* Thermal */
|
||||
[MSTP515] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR5, 15, 0), /* IIC8 */
|
||||
};
|
||||
|
||||
static struct clk_lookup lookups[] = {
|
||||
|
@ -386,6 +554,9 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_CON_ID("pll2s", &pll2s_clk),
|
||||
CLKDEV_CON_ID("pll2h", &pll2h_clk),
|
||||
|
||||
/* CPU clock */
|
||||
CLKDEV_DEV_ID("cpufreq-cpu0", &z_clk),
|
||||
|
||||
/* DIV6 */
|
||||
CLKDEV_CON_ID("zb", &div6_clks[DIV6_ZB]),
|
||||
CLKDEV_CON_ID("vck1", &div6_clks[DIV6_VCK1]),
|
||||
|
@ -408,6 +579,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
|
||||
CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP217]),
|
||||
CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
|
||||
CLKDEV_DEV_ID("e6520000.i2c", &mstp_clks[MSTP300]),
|
||||
CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
|
||||
CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]),
|
||||
|
@ -418,6 +590,15 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
|
||||
CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
|
||||
CLKDEV_DEV_ID("e6550000.i2c", &mstp_clks[MSTP316]),
|
||||
CLKDEV_DEV_ID("e6560000.i2c", &mstp_clks[MSTP317]),
|
||||
CLKDEV_DEV_ID("e6500000.i2c", &mstp_clks[MSTP318]),
|
||||
CLKDEV_DEV_ID("e6510000.i2c", &mstp_clks[MSTP323]),
|
||||
CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]),
|
||||
CLKDEV_DEV_ID("e60b0000.i2c", &mstp_clks[MSTP409]),
|
||||
CLKDEV_DEV_ID("e6540000.i2c", &mstp_clks[MSTP410]),
|
||||
CLKDEV_DEV_ID("e6530000.i2c", &mstp_clks[MSTP411]),
|
||||
CLKDEV_DEV_ID("e6570000.i2c", &mstp_clks[MSTP515]),
|
||||
|
||||
/* for DT */
|
||||
CLKDEV_DEV_ID("e61f0000.thermal", &mstp_clks[MSTP522]),
|
||||
|
@ -429,6 +610,8 @@ void __init r8a73a4_clock_init(void)
|
|||
int k, ret = 0;
|
||||
u32 ckscr;
|
||||
|
||||
atomic_set(&frqcr_lock, -1);
|
||||
|
||||
reg = ioremap_nocache(CKSCR, PAGE_SIZE);
|
||||
BUG_ON(!reg);
|
||||
ckscr = ioread32(reg);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/clkdev.h>
|
||||
#include <mach/clock.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/r8a7790.h>
|
||||
|
||||
/*
|
||||
* MD EXTAL PLL0 PLL1 PLL3
|
||||
|
@ -42,16 +43,15 @@
|
|||
* see "p1 / 2" on R8A7790_CLOCK_ROOT() below
|
||||
*/
|
||||
|
||||
#define MD(nr) (1 << nr)
|
||||
|
||||
#define CPG_BASE 0xe6150000
|
||||
#define CPG_LEN 0x1000
|
||||
|
||||
#define SMSTPCR1 0xe6150134
|
||||
#define SMSTPCR2 0xe6150138
|
||||
#define SMSTPCR3 0xe615013c
|
||||
#define SMSTPCR5 0xe6150144
|
||||
#define SMSTPCR7 0xe615014c
|
||||
|
||||
#define MODEMR 0xE6160060
|
||||
#define SDCKCR 0xE6150074
|
||||
#define SD2CKCR 0xE6150078
|
||||
#define SD3CKCR 0xE615007C
|
||||
|
@ -182,14 +182,19 @@ static struct clk div6_clks[DIV6_NR] = {
|
|||
enum {
|
||||
MSTP721, MSTP720,
|
||||
MSTP717, MSTP716,
|
||||
MSTP522,
|
||||
MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304,
|
||||
MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202,
|
||||
MSTP124,
|
||||
MSTP_NR
|
||||
};
|
||||
|
||||
static struct clk mstp_clks[MSTP_NR] = {
|
||||
[MSTP721] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 21, 0), /* SCIF0 */
|
||||
[MSTP720] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 20, 0), /* SCIF1 */
|
||||
[MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */
|
||||
[MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
|
||||
[MSTP522] = SH_CLK_MSTP32(&extal_clk, SMSTPCR5, 22, 0), /* Thermal */
|
||||
[MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, 0), /* MMC0 */
|
||||
[MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_SD0], SMSTPCR3, 14, 0), /* SDHI0 */
|
||||
[MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_SD1], SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
|
@ -203,8 +208,7 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP204] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 4, 0), /* SCIFA0 */
|
||||
[MSTP203] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 3, 0), /* SCIFA1 */
|
||||
[MSTP202] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 2, 0), /* SCIFA2 */
|
||||
[MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */
|
||||
[MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
|
||||
[MSTP124] = SH_CLK_MSTP32(&rclk_clk, SMSTPCR1, 24, 0), /* CMT0 */
|
||||
};
|
||||
|
||||
static struct clk_lookup lookups[] = {
|
||||
|
@ -254,6 +258,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]),
|
||||
CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP717]),
|
||||
CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP716]),
|
||||
CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
|
||||
CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
|
||||
CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
|
||||
|
@ -266,6 +271,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP311]),
|
||||
CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
|
||||
CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
|
||||
CLKDEV_DEV_ID("sh_cmt.0", &mstp_clks[MSTP124]),
|
||||
};
|
||||
|
||||
#define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31) \
|
||||
|
@ -280,14 +286,9 @@ static struct clk_lookup lookups[] = {
|
|||
|
||||
void __init r8a7790_clock_init(void)
|
||||
{
|
||||
void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
|
||||
u32 mode;
|
||||
u32 mode = r8a7790_read_mode_pins();
|
||||
int k, ret = 0;
|
||||
|
||||
BUG_ON(!modemr);
|
||||
mode = ioread32(modemr);
|
||||
iounmap(modemr);
|
||||
|
||||
switch (mode & (MD(14) | MD(13))) {
|
||||
case 0:
|
||||
R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
|
||||
|
|
|
@ -555,7 +555,7 @@ enum { MSTP001,
|
|||
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
||||
MSTP331, MSTP329, MSTP328, MSTP325, MSTP323, MSTP322,
|
||||
MSTP314, MSTP313, MSTP312, MSTP311,
|
||||
MSTP303, MSTP302, MSTP301, MSTP300,
|
||||
MSTP304, MSTP303, MSTP302, MSTP301, MSTP300,
|
||||
MSTP411, MSTP410, MSTP403,
|
||||
MSTP_NR };
|
||||
|
||||
|
@ -593,6 +593,7 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */
|
||||
[MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */
|
||||
[MSTP304] = MSTP(&main_div2_clk, SMSTPCR3, 4, 0), /* TPU0 */
|
||||
[MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */
|
||||
[MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */
|
||||
[MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */
|
||||
|
@ -669,10 +670,11 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP311]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm.0", &mstp_clks[MSTP304]), /* TPU0 */
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm.1", &mstp_clks[MSTP303]), /* TPU1 */
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm.2", &mstp_clks[MSTP302]), /* TPU2 */
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm.3", &mstp_clks[MSTP301]), /* TPU3 */
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm.4", &mstp_clks[MSTP300]), /* TPU4 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
/* empty */
|
|
@ -2,11 +2,9 @@
|
|||
#define __ASM_EMEV2_H__
|
||||
|
||||
extern void emev2_map_io(void);
|
||||
extern void emev2_init_irq(void);
|
||||
extern void emev2_add_early_devices(void);
|
||||
extern void emev2_init_delay(void);
|
||||
extern void emev2_add_standard_devices(void);
|
||||
extern void emev2_clock_init(void);
|
||||
extern void emev2_set_boot_vector(unsigned long value);
|
||||
|
||||
#define EMEV2_GPIO_BASE 200
|
||||
#define EMEV2_GPIO_IRQ(n) (EMEV2_GPIO_BASE + (n))
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
#ifndef __ASM_MACH_HARDWARE_H
|
||||
#define __ASM_MACH_HARDWARE_H
|
||||
|
||||
#endif /* __ASM_MACH_HARDWARE_H */
|
|
@ -4,5 +4,6 @@
|
|||
void r8a73a4_add_standard_devices(void);
|
||||
void r8a73a4_clock_init(void);
|
||||
void r8a73a4_pinmux_init(void);
|
||||
void r8a73a4_init_delay(void);
|
||||
|
||||
#endif /* __ASM_R8A73A4_H__ */
|
||||
|
|
|
@ -42,6 +42,8 @@ enum {
|
|||
SHDMA_SLAVE_FSIB_TX,
|
||||
SHDMA_SLAVE_USBHS_TX,
|
||||
SHDMA_SLAVE_USBHS_RX,
|
||||
SHDMA_SLAVE_MMCIF_TX,
|
||||
SHDMA_SLAVE_MMCIF_RX,
|
||||
};
|
||||
|
||||
extern void r8a7740_meram_workaround(void);
|
||||
|
|
|
@ -33,7 +33,6 @@ extern void r8a7778_add_mmc_device(struct sh_mmcif_plat_data *info);
|
|||
|
||||
extern void r8a7778_init_late(void);
|
||||
extern void r8a7778_init_delay(void);
|
||||
extern void r8a7778_init_irq(void);
|
||||
extern void r8a7778_init_irq_dt(void);
|
||||
extern void r8a7778_clock_init(void);
|
||||
extern void r8a7778_init_irq_extpin(int irlm);
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
#include <linux/sh_clk.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/sh_eth.h>
|
||||
#include <linux/platform_data/usb-rcar-phy.h>
|
||||
|
||||
struct platform_device;
|
||||
|
||||
|
@ -34,7 +33,6 @@ extern void r8a7779_add_early_devices(void);
|
|||
extern void r8a7779_add_standard_devices(void);
|
||||
extern void r8a7779_add_standard_devices_dt(void);
|
||||
extern void r8a7779_add_ether_device(struct sh_eth_plat_data *pdata);
|
||||
extern void r8a7779_add_usb_phy_device(struct rcar_phy_platform_data *pdata);
|
||||
extern void r8a7779_init_late(void);
|
||||
extern void r8a7779_clock_init(void);
|
||||
extern void r8a7779_pinmux_init(void);
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
void r8a7790_add_standard_devices(void);
|
||||
void r8a7790_clock_init(void);
|
||||
void r8a7790_pinmux_init(void);
|
||||
void r8a7790_init_delay(void);
|
||||
void r8a7790_timer_init(void);
|
||||
|
||||
#define MD(nr) BIT(nr)
|
||||
u32 r8a7790_read_mode_pins(void);
|
||||
|
||||
#endif /* __ASM_R8A7790_H__ */
|
||||
|
|
|
@ -1,378 +1,7 @@
|
|||
#ifndef __ASM_SH73A0_H__
|
||||
#define __ASM_SH73A0_H__
|
||||
|
||||
/* Pin Function Controller:
|
||||
* GPIO_FN_xx - GPIO used to select pin function and MSEL switch
|
||||
* GPIO_PORTxx - GPIO mapped to real I/O pin on CPU
|
||||
*/
|
||||
enum {
|
||||
/* Hardware manual Table 25-1 (GPIO) */
|
||||
GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4,
|
||||
GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9,
|
||||
|
||||
GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14,
|
||||
GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19,
|
||||
|
||||
GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24,
|
||||
GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29,
|
||||
|
||||
GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34,
|
||||
GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39,
|
||||
|
||||
GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44,
|
||||
GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49,
|
||||
|
||||
GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54,
|
||||
GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59,
|
||||
|
||||
GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64,
|
||||
GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69,
|
||||
|
||||
GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74,
|
||||
GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79,
|
||||
|
||||
GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84,
|
||||
GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89,
|
||||
|
||||
GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94,
|
||||
GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99,
|
||||
|
||||
GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104,
|
||||
GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109,
|
||||
|
||||
GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114,
|
||||
GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118,
|
||||
|
||||
GPIO_PORT128, GPIO_PORT129,
|
||||
|
||||
GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134,
|
||||
GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139,
|
||||
|
||||
GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144,
|
||||
GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149,
|
||||
|
||||
GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154,
|
||||
GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159,
|
||||
|
||||
GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164,
|
||||
|
||||
GPIO_PORT192, GPIO_PORT193, GPIO_PORT194,
|
||||
GPIO_PORT195, GPIO_PORT196, GPIO_PORT197, GPIO_PORT198, GPIO_PORT199,
|
||||
|
||||
GPIO_PORT200, GPIO_PORT201, GPIO_PORT202, GPIO_PORT203, GPIO_PORT204,
|
||||
GPIO_PORT205, GPIO_PORT206, GPIO_PORT207, GPIO_PORT208, GPIO_PORT209,
|
||||
|
||||
GPIO_PORT210, GPIO_PORT211, GPIO_PORT212, GPIO_PORT213, GPIO_PORT214,
|
||||
GPIO_PORT215, GPIO_PORT216, GPIO_PORT217, GPIO_PORT218, GPIO_PORT219,
|
||||
|
||||
GPIO_PORT220, GPIO_PORT221, GPIO_PORT222, GPIO_PORT223, GPIO_PORT224,
|
||||
GPIO_PORT225, GPIO_PORT226, GPIO_PORT227, GPIO_PORT228, GPIO_PORT229,
|
||||
|
||||
GPIO_PORT230, GPIO_PORT231, GPIO_PORT232, GPIO_PORT233, GPIO_PORT234,
|
||||
GPIO_PORT235, GPIO_PORT236, GPIO_PORT237, GPIO_PORT238, GPIO_PORT239,
|
||||
|
||||
GPIO_PORT240, GPIO_PORT241, GPIO_PORT242, GPIO_PORT243, GPIO_PORT244,
|
||||
GPIO_PORT245, GPIO_PORT246, GPIO_PORT247, GPIO_PORT248, GPIO_PORT249,
|
||||
|
||||
GPIO_PORT250, GPIO_PORT251, GPIO_PORT252, GPIO_PORT253, GPIO_PORT254,
|
||||
GPIO_PORT255, GPIO_PORT256, GPIO_PORT257, GPIO_PORT258, GPIO_PORT259,
|
||||
|
||||
GPIO_PORT260, GPIO_PORT261, GPIO_PORT262, GPIO_PORT263, GPIO_PORT264,
|
||||
GPIO_PORT265, GPIO_PORT266, GPIO_PORT267, GPIO_PORT268, GPIO_PORT269,
|
||||
|
||||
GPIO_PORT270, GPIO_PORT271, GPIO_PORT272, GPIO_PORT273, GPIO_PORT274,
|
||||
GPIO_PORT275, GPIO_PORT276, GPIO_PORT277, GPIO_PORT278, GPIO_PORT279,
|
||||
|
||||
GPIO_PORT280, GPIO_PORT281, GPIO_PORT282,
|
||||
|
||||
GPIO_PORT288, GPIO_PORT289,
|
||||
|
||||
GPIO_PORT290, GPIO_PORT291, GPIO_PORT292, GPIO_PORT293, GPIO_PORT294,
|
||||
GPIO_PORT295, GPIO_PORT296, GPIO_PORT297, GPIO_PORT298, GPIO_PORT299,
|
||||
|
||||
GPIO_PORT300, GPIO_PORT301, GPIO_PORT302, GPIO_PORT303, GPIO_PORT304,
|
||||
GPIO_PORT305, GPIO_PORT306, GPIO_PORT307, GPIO_PORT308, GPIO_PORT309,
|
||||
|
||||
/* Table 25-1 (Function 0-7) */
|
||||
GPIO_FN_GPI0 = 310,
|
||||
GPIO_FN_GPI1,
|
||||
GPIO_FN_GPI2,
|
||||
GPIO_FN_GPI3,
|
||||
GPIO_FN_GPI4,
|
||||
GPIO_FN_GPI5,
|
||||
GPIO_FN_GPI6,
|
||||
GPIO_FN_GPI7,
|
||||
GPIO_FN_GPO7, GPIO_FN_MFG0_OUT2,
|
||||
GPIO_FN_GPO6, GPIO_FN_MFG1_OUT2,
|
||||
GPIO_FN_GPO5,
|
||||
GPIO_FN_PORT16_VIO_CKOR,
|
||||
GPIO_FN_PORT19_VIO_CKO2,
|
||||
GPIO_FN_GPO0,
|
||||
GPIO_FN_GPO1,
|
||||
GPIO_FN_GPO2, GPIO_FN_STATUS0,
|
||||
GPIO_FN_GPO3, GPIO_FN_STATUS1,
|
||||
GPIO_FN_GPO4, GPIO_FN_STATUS2,
|
||||
GPIO_FN_VINT,
|
||||
GPIO_FN_TCKON,
|
||||
GPIO_FN_XDVFS1,
|
||||
GPIO_FN_MFG0_OUT1, GPIO_FN_PORT27_IROUT,
|
||||
GPIO_FN_XDVFS2,
|
||||
GPIO_FN_PORT28_TPU1TO1,
|
||||
GPIO_FN_SIM_RST, GPIO_FN_PORT29_TPU1TO1,
|
||||
GPIO_FN_SIM_CLK, GPIO_FN_PORT30_VIO_CKOR,
|
||||
GPIO_FN_SIM_D, GPIO_FN_PORT31_IROUT,
|
||||
GPIO_FN_XWUP,
|
||||
GPIO_FN_VACK,
|
||||
GPIO_FN_XTAL1L,
|
||||
GPIO_FN_PORT49_IROUT,
|
||||
GPIO_FN_BBIF2_TSYNC2, GPIO_FN_TPU2TO2,
|
||||
|
||||
GPIO_FN_BBIF2_TSCK2, GPIO_FN_TPU2TO3,
|
||||
GPIO_FN_BBIF2_TXD2,
|
||||
GPIO_FN_TPU3TO3,
|
||||
GPIO_FN_TPU3TO2,
|
||||
GPIO_FN_TPU0TO0,
|
||||
GPIO_FN_A0, GPIO_FN_BS_,
|
||||
GPIO_FN_A12, GPIO_FN_TPU4TO2,
|
||||
GPIO_FN_A13, GPIO_FN_TPU0TO1,
|
||||
GPIO_FN_A14,
|
||||
GPIO_FN_A15,
|
||||
GPIO_FN_A16, GPIO_FN_MSIOF0_SS1,
|
||||
GPIO_FN_A17, GPIO_FN_MSIOF0_TSYNC,
|
||||
GPIO_FN_A18, GPIO_FN_MSIOF0_TSCK,
|
||||
GPIO_FN_A19, GPIO_FN_MSIOF0_TXD,
|
||||
GPIO_FN_A20, GPIO_FN_MSIOF0_RSCK,
|
||||
GPIO_FN_A21, GPIO_FN_MSIOF0_RSYNC,
|
||||
GPIO_FN_A22, GPIO_FN_MSIOF0_MCK0,
|
||||
GPIO_FN_A23, GPIO_FN_MSIOF0_MCK1,
|
||||
GPIO_FN_A24, GPIO_FN_MSIOF0_RXD,
|
||||
GPIO_FN_A25, GPIO_FN_MSIOF0_SS2,
|
||||
GPIO_FN_A26,
|
||||
GPIO_FN_FCE1_,
|
||||
GPIO_FN_DACK0,
|
||||
GPIO_FN_FCE0_,
|
||||
GPIO_FN_WAIT_, GPIO_FN_DREQ0,
|
||||
GPIO_FN_FRB,
|
||||
GPIO_FN_CKO,
|
||||
GPIO_FN_NBRSTOUT_,
|
||||
GPIO_FN_NBRST_,
|
||||
GPIO_FN_BBIF2_TXD,
|
||||
GPIO_FN_BBIF2_RXD,
|
||||
GPIO_FN_BBIF2_SYNC,
|
||||
GPIO_FN_BBIF2_SCK,
|
||||
GPIO_FN_MFG3_IN2,
|
||||
GPIO_FN_MFG3_IN1,
|
||||
GPIO_FN_BBIF1_SS2, GPIO_FN_MFG3_OUT1,
|
||||
GPIO_FN_HSI_RX_DATA, GPIO_FN_BBIF1_RXD,
|
||||
GPIO_FN_HSI_TX_WAKE, GPIO_FN_BBIF1_TSCK,
|
||||
GPIO_FN_HSI_TX_DATA, GPIO_FN_BBIF1_TSYNC,
|
||||
GPIO_FN_HSI_TX_READY, GPIO_FN_BBIF1_TXD,
|
||||
GPIO_FN_HSI_RX_READY, GPIO_FN_BBIF1_RSCK,
|
||||
GPIO_FN_HSI_RX_WAKE, GPIO_FN_BBIF1_RSYNC,
|
||||
GPIO_FN_HSI_RX_FLAG, GPIO_FN_BBIF1_SS1, GPIO_FN_BBIF1_FLOW,
|
||||
GPIO_FN_HSI_TX_FLAG,
|
||||
GPIO_FN_VIO_VD, GPIO_FN_VIO2_VD,
|
||||
|
||||
GPIO_FN_VIO_HD,
|
||||
GPIO_FN_VIO2_HD,
|
||||
GPIO_FN_VIO_D0, GPIO_FN_PORT130_MSIOF2_RXD,
|
||||
GPIO_FN_VIO_D1, GPIO_FN_PORT131_MSIOF2_SS1,
|
||||
GPIO_FN_VIO_D2, GPIO_FN_PORT132_MSIOF2_SS2,
|
||||
GPIO_FN_VIO_D3, GPIO_FN_MSIOF2_TSYNC,
|
||||
GPIO_FN_VIO_D4, GPIO_FN_MSIOF2_TXD,
|
||||
GPIO_FN_VIO_D5, GPIO_FN_MSIOF2_TSCK,
|
||||
GPIO_FN_VIO_D6,
|
||||
GPIO_FN_VIO_D7,
|
||||
GPIO_FN_VIO_D8, GPIO_FN_VIO2_D0,
|
||||
GPIO_FN_VIO_D9, GPIO_FN_VIO2_D1,
|
||||
GPIO_FN_VIO_D10, GPIO_FN_TPU0TO2, GPIO_FN_VIO2_D2,
|
||||
GPIO_FN_VIO_D11, GPIO_FN_TPU0TO3, GPIO_FN_VIO2_D3,
|
||||
GPIO_FN_VIO_D12, GPIO_FN_VIO2_D4,
|
||||
GPIO_FN_VIO_D13,
|
||||
GPIO_FN_VIO2_D5,
|
||||
GPIO_FN_VIO_D14, GPIO_FN_VIO2_D6,
|
||||
GPIO_FN_VIO_D15, GPIO_FN_TPU1TO3,
|
||||
GPIO_FN_VIO2_D7,
|
||||
GPIO_FN_VIO_CLK,
|
||||
GPIO_FN_VIO2_CLK,
|
||||
GPIO_FN_VIO_FIELD, GPIO_FN_VIO2_FIELD,
|
||||
GPIO_FN_VIO_CKO,
|
||||
GPIO_FN_A27, GPIO_FN_MFG0_IN1,
|
||||
GPIO_FN_MFG0_IN2,
|
||||
GPIO_FN_TS_SPSYNC3, GPIO_FN_MSIOF2_RSCK,
|
||||
GPIO_FN_TS_SDAT3, GPIO_FN_MSIOF2_RSYNC,
|
||||
GPIO_FN_TPU1TO2, GPIO_FN_TS_SDEN3, GPIO_FN_PORT153_MSIOF2_SS1,
|
||||
GPIO_FN_MSIOF2_MCK0,
|
||||
GPIO_FN_MSIOF2_MCK1,
|
||||
GPIO_FN_PORT156_MSIOF2_SS2,
|
||||
GPIO_FN_PORT157_MSIOF2_RXD,
|
||||
GPIO_FN_DINT_, GPIO_FN_TS_SCK3,
|
||||
GPIO_FN_NMI,
|
||||
GPIO_FN_TPU3TO0,
|
||||
GPIO_FN_BBIF2_TSYNC1,
|
||||
GPIO_FN_BBIF2_TSCK1,
|
||||
GPIO_FN_BBIF2_TXD1,
|
||||
GPIO_FN_MFG2_OUT2,
|
||||
GPIO_FN_TPU2TO1,
|
||||
GPIO_FN_TPU4TO1, GPIO_FN_MFG4_OUT2,
|
||||
GPIO_FN_D16,
|
||||
GPIO_FN_D17,
|
||||
GPIO_FN_D18,
|
||||
GPIO_FN_D19,
|
||||
GPIO_FN_D20,
|
||||
GPIO_FN_D21,
|
||||
GPIO_FN_D22,
|
||||
GPIO_FN_PORT207_MSIOF0L_SS1, GPIO_FN_D23,
|
||||
GPIO_FN_PORT208_MSIOF0L_SS2, GPIO_FN_D24,
|
||||
GPIO_FN_D25,
|
||||
GPIO_FN_DREQ2, GPIO_FN_PORT210_MSIOF0L_SS1, GPIO_FN_D26,
|
||||
GPIO_FN_PORT211_MSIOF0L_SS2, GPIO_FN_D27,
|
||||
GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, GPIO_FN_D28,
|
||||
GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, GPIO_FN_D29,
|
||||
GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_RSCK, GPIO_FN_D30,
|
||||
GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_RSYNC, GPIO_FN_D31,
|
||||
GPIO_FN_DACK2,
|
||||
GPIO_FN_MSIOF0L_TSYNC, GPIO_FN_VIO2_FIELD3,
|
||||
GPIO_FN_DACK3,
|
||||
GPIO_FN_PORT218_VIO_CKOR,
|
||||
GPIO_FN_DREQ3, GPIO_FN_MSIOF0L_TSCK, GPIO_FN_VIO2_CLK3, \
|
||||
GPIO_FN_DREQ1,
|
||||
GPIO_FN_PWEN, GPIO_FN_MSIOF0L_RXD, GPIO_FN_VIO2_HD3, \
|
||||
GPIO_FN_DACK1, GPIO_FN_OVCN,
|
||||
GPIO_FN_MSIOF0L_TXD, GPIO_FN_VIO2_VD3,
|
||||
|
||||
GPIO_FN_OVCN2,
|
||||
GPIO_FN_EXTLP, GPIO_FN_PORT226_VIO_CKO2,
|
||||
GPIO_FN_IDIN,
|
||||
GPIO_FN_MFG1_IN1,
|
||||
GPIO_FN_MSIOF1_TXD,
|
||||
GPIO_FN_MSIOF1_TSYNC,
|
||||
GPIO_FN_MSIOF1_TSCK,
|
||||
GPIO_FN_MSIOF1_RXD,
|
||||
GPIO_FN_MSIOF1_RSCK, GPIO_FN_VIO2_CLK2,
|
||||
GPIO_FN_MSIOF1_RSYNC, GPIO_FN_MFG1_IN2, GPIO_FN_VIO2_VD2, \
|
||||
GPIO_FN_MSIOF1_MCK0,
|
||||
GPIO_FN_MSIOF1_MCK1,
|
||||
GPIO_FN_MSIOF1_SS1, GPIO_FN_VIO2_FIELD2,
|
||||
GPIO_FN_MSIOF1_SS2, GPIO_FN_VIO2_HD2,
|
||||
GPIO_FN_PORT241_IROUT, GPIO_FN_MFG4_OUT1, \
|
||||
GPIO_FN_TPU4TO0,
|
||||
GPIO_FN_MFG4_IN2,
|
||||
GPIO_FN_PORT243_VIO_CKO2,
|
||||
GPIO_FN_MFG2_IN1,
|
||||
GPIO_FN_MSIOF2R_RXD,
|
||||
GPIO_FN_MFG2_IN2,
|
||||
GPIO_FN_MSIOF2R_TXD,
|
||||
GPIO_FN_MFG1_OUT1,
|
||||
GPIO_FN_TPU1TO0,
|
||||
GPIO_FN_MFG3_OUT2,
|
||||
GPIO_FN_TPU3TO1,
|
||||
GPIO_FN_MFG2_OUT1,
|
||||
GPIO_FN_TPU2TO0,
|
||||
GPIO_FN_MSIOF2R_TSCK,
|
||||
GPIO_FN_PORT249_IROUT, GPIO_FN_MFG4_IN1, \
|
||||
GPIO_FN_MSIOF2R_TSYNC,
|
||||
GPIO_FN_SDHICLK0,
|
||||
GPIO_FN_SDHICD0,
|
||||
GPIO_FN_SDHID0_0,
|
||||
GPIO_FN_SDHID0_1,
|
||||
GPIO_FN_SDHID0_2,
|
||||
GPIO_FN_SDHID0_3,
|
||||
GPIO_FN_SDHICMD0,
|
||||
GPIO_FN_SDHIWP0,
|
||||
GPIO_FN_SDHICLK1,
|
||||
GPIO_FN_SDHID1_0, GPIO_FN_TS_SPSYNC2,
|
||||
GPIO_FN_SDHID1_1, GPIO_FN_TS_SDAT2,
|
||||
GPIO_FN_SDHID1_2, GPIO_FN_TS_SDEN2,
|
||||
GPIO_FN_SDHID1_3, GPIO_FN_TS_SCK2,
|
||||
GPIO_FN_SDHICMD1,
|
||||
GPIO_FN_SDHICLK2,
|
||||
GPIO_FN_SDHID2_0, GPIO_FN_TS_SPSYNC4,
|
||||
GPIO_FN_SDHID2_1, GPIO_FN_TS_SDAT4,
|
||||
GPIO_FN_SDHID2_2, GPIO_FN_TS_SDEN4,
|
||||
GPIO_FN_SDHID2_3, GPIO_FN_TS_SCK4,
|
||||
GPIO_FN_SDHICMD2,
|
||||
GPIO_FN_MMCCLK0,
|
||||
GPIO_FN_MMCD0_0,
|
||||
GPIO_FN_MMCD0_1,
|
||||
GPIO_FN_MMCD0_2,
|
||||
GPIO_FN_MMCD0_3,
|
||||
GPIO_FN_MMCD0_4, GPIO_FN_TS_SPSYNC5,
|
||||
GPIO_FN_MMCD0_5, GPIO_FN_TS_SDAT5,
|
||||
GPIO_FN_MMCD0_6, GPIO_FN_TS_SDEN5,
|
||||
GPIO_FN_MMCD0_7, GPIO_FN_TS_SCK5,
|
||||
GPIO_FN_MMCCMD0,
|
||||
GPIO_FN_RESETOUTS_, GPIO_FN_EXTAL2OUT,
|
||||
GPIO_FN_MCP_WAIT__MCP_FRB,
|
||||
GPIO_FN_MCP_CKO, GPIO_FN_MMCCLK1,
|
||||
GPIO_FN_MCP_D15_MCP_NAF15,
|
||||
GPIO_FN_MCP_D14_MCP_NAF14,
|
||||
GPIO_FN_MCP_D13_MCP_NAF13,
|
||||
GPIO_FN_MCP_D12_MCP_NAF12,
|
||||
GPIO_FN_MCP_D11_MCP_NAF11,
|
||||
GPIO_FN_MCP_D10_MCP_NAF10,
|
||||
GPIO_FN_MCP_D9_MCP_NAF9,
|
||||
GPIO_FN_MCP_D8_MCP_NAF8, GPIO_FN_MMCCMD1,
|
||||
GPIO_FN_MCP_D7_MCP_NAF7, GPIO_FN_MMCD1_7,
|
||||
|
||||
GPIO_FN_MCP_D6_MCP_NAF6, GPIO_FN_MMCD1_6,
|
||||
GPIO_FN_MCP_D5_MCP_NAF5, GPIO_FN_MMCD1_5,
|
||||
GPIO_FN_MCP_D4_MCP_NAF4, GPIO_FN_MMCD1_4,
|
||||
GPIO_FN_MCP_D3_MCP_NAF3, GPIO_FN_MMCD1_3,
|
||||
GPIO_FN_MCP_D2_MCP_NAF2, GPIO_FN_MMCD1_2,
|
||||
GPIO_FN_MCP_D1_MCP_NAF1, GPIO_FN_MMCD1_1,
|
||||
GPIO_FN_MCP_D0_MCP_NAF0, GPIO_FN_MMCD1_0,
|
||||
GPIO_FN_MCP_NBRSTOUT_,
|
||||
GPIO_FN_MCP_WE0__MCP_FWE, GPIO_FN_MCP_RDWR_MCP_FWE,
|
||||
|
||||
/* MSEL2 special case */
|
||||
GPIO_FN_TSIF2_TS_XX1,
|
||||
GPIO_FN_TSIF2_TS_XX2,
|
||||
GPIO_FN_TSIF2_TS_XX3,
|
||||
GPIO_FN_TSIF2_TS_XX4,
|
||||
GPIO_FN_TSIF2_TS_XX5,
|
||||
GPIO_FN_TSIF1_TS_XX1,
|
||||
GPIO_FN_TSIF1_TS_XX2,
|
||||
GPIO_FN_TSIF1_TS_XX3,
|
||||
GPIO_FN_TSIF1_TS_XX4,
|
||||
GPIO_FN_TSIF1_TS_XX5,
|
||||
GPIO_FN_TSIF0_TS_XX1,
|
||||
GPIO_FN_TSIF0_TS_XX2,
|
||||
GPIO_FN_TSIF0_TS_XX3,
|
||||
GPIO_FN_TSIF0_TS_XX4,
|
||||
GPIO_FN_TSIF0_TS_XX5,
|
||||
GPIO_FN_MST1_TS_XX1,
|
||||
GPIO_FN_MST1_TS_XX2,
|
||||
GPIO_FN_MST1_TS_XX3,
|
||||
GPIO_FN_MST1_TS_XX4,
|
||||
GPIO_FN_MST1_TS_XX5,
|
||||
GPIO_FN_MST0_TS_XX1,
|
||||
GPIO_FN_MST0_TS_XX2,
|
||||
GPIO_FN_MST0_TS_XX3,
|
||||
GPIO_FN_MST0_TS_XX4,
|
||||
GPIO_FN_MST0_TS_XX5,
|
||||
|
||||
/* MSEL3 special cases */
|
||||
GPIO_FN_SDHI0_VCCQ_MC0_ON,
|
||||
GPIO_FN_SDHI0_VCCQ_MC0_OFF,
|
||||
GPIO_FN_DEBUG_MON_VIO,
|
||||
GPIO_FN_DEBUG_MON_LCDD,
|
||||
GPIO_FN_LCDC_LCDC0,
|
||||
GPIO_FN_LCDC_LCDC1,
|
||||
|
||||
/* MSEL4 special cases */
|
||||
GPIO_FN_IRQ9_MEM_INT,
|
||||
GPIO_FN_IRQ9_MCP_INT,
|
||||
GPIO_FN_A11,
|
||||
GPIO_FN_TPU4TO3,
|
||||
GPIO_FN_RESETA_N_PU_ON,
|
||||
GPIO_FN_RESETA_N_PU_OFF,
|
||||
GPIO_FN_EDBGREQ_PD,
|
||||
GPIO_FN_EDBGREQ_PU,
|
||||
|
||||
/* end of GPIO */
|
||||
GPIO_NR,
|
||||
};
|
||||
#define GPIO_NR 310
|
||||
|
||||
/* DMA slave IDs */
|
||||
enum {
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <linux/platform_data/irq-renesas-intc-irqpin.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/intc.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/r8a7779.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/platform_data/gpio-em.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
@ -28,7 +27,6 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/emev2.h>
|
||||
#include <mach/irqs.h>
|
||||
|
@ -39,13 +37,6 @@
|
|||
|
||||
static struct map_desc emev2_io_desc[] __initdata = {
|
||||
#ifdef CONFIG_SMP
|
||||
/* 128K entity map for 0xe0100000 (SMU) */
|
||||
{
|
||||
.virtual = 0xe0100000,
|
||||
.pfn = __phys_to_pfn(0xe0100000),
|
||||
.length = SZ_128K,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
/* 2M mapping for SCU + L2 controller */
|
||||
{
|
||||
.virtual = 0xf0000000,
|
||||
|
@ -63,102 +54,40 @@ void __init emev2_map_io(void)
|
|||
|
||||
/* UART */
|
||||
static struct resource uart0_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe1020000,
|
||||
.end = 0xe1020037,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 40,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device uart0_device = {
|
||||
.name = "serial8250-em",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
.resource = uart0_resources,
|
||||
DEFINE_RES_MEM(0xe1020000, 0x38),
|
||||
DEFINE_RES_IRQ(40),
|
||||
};
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe1030000,
|
||||
.end = 0xe1030037,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 41,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device uart1_device = {
|
||||
.name = "serial8250-em",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
.resource = uart1_resources,
|
||||
DEFINE_RES_MEM(0xe1030000, 0x38),
|
||||
DEFINE_RES_IRQ(41),
|
||||
};
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe1040000,
|
||||
.end = 0xe1040037,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 42,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device uart2_device = {
|
||||
.name = "serial8250-em",
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
.resource = uart2_resources,
|
||||
DEFINE_RES_MEM(0xe1040000, 0x38),
|
||||
DEFINE_RES_IRQ(42),
|
||||
};
|
||||
|
||||
static struct resource uart3_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe1050000,
|
||||
.end = 0xe1050037,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 43,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
DEFINE_RES_MEM(0xe1050000, 0x38),
|
||||
DEFINE_RES_IRQ(43),
|
||||
};
|
||||
|
||||
static struct platform_device uart3_device = {
|
||||
.name = "serial8250-em",
|
||||
.id = 3,
|
||||
.num_resources = ARRAY_SIZE(uart3_resources),
|
||||
.resource = uart3_resources,
|
||||
};
|
||||
#define emev2_register_uart(idx) \
|
||||
platform_device_register_simple("serial8250-em", idx, \
|
||||
uart##idx##_resources, \
|
||||
ARRAY_SIZE(uart##idx##_resources))
|
||||
|
||||
/* STI */
|
||||
static struct resource sti_resources[] = {
|
||||
[0] = {
|
||||
.name = "STI",
|
||||
.start = 0xe0180000,
|
||||
.end = 0xe0180053,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 157,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sti_device = {
|
||||
.name = "em_sti",
|
||||
.id = 0,
|
||||
.resource = sti_resources,
|
||||
.num_resources = ARRAY_SIZE(sti_resources),
|
||||
DEFINE_RES_MEM(0xe0180000, 0x54),
|
||||
DEFINE_RES_IRQ(157),
|
||||
};
|
||||
|
||||
#define emev2_register_sti() \
|
||||
platform_device_register_simple("em_sti", 0, \
|
||||
sti_resources, \
|
||||
ARRAY_SIZE(sti_resources))
|
||||
|
||||
/* GIO */
|
||||
static struct gpio_em_config gio0_config = {
|
||||
|
@ -168,36 +97,10 @@ static struct gpio_em_config gio0_config = {
|
|||
};
|
||||
|
||||
static struct resource gio0_resources[] = {
|
||||
[0] = {
|
||||
.name = "GIO_000",
|
||||
.start = 0xe0050000,
|
||||
.end = 0xe005002b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "GIO_000",
|
||||
.start = 0xe0050040,
|
||||
.end = 0xe005005f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = 99,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 100,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device gio0_device = {
|
||||
.name = "em_gio",
|
||||
.id = 0,
|
||||
.resource = gio0_resources,
|
||||
.num_resources = ARRAY_SIZE(gio0_resources),
|
||||
.dev = {
|
||||
.platform_data = &gio0_config,
|
||||
},
|
||||
DEFINE_RES_MEM(0xe0050000, 0x2c),
|
||||
DEFINE_RES_MEM(0xe0050040, 0x20),
|
||||
DEFINE_RES_IRQ(99),
|
||||
DEFINE_RES_IRQ(100),
|
||||
};
|
||||
|
||||
static struct gpio_em_config gio1_config = {
|
||||
|
@ -207,36 +110,10 @@ static struct gpio_em_config gio1_config = {
|
|||
};
|
||||
|
||||
static struct resource gio1_resources[] = {
|
||||
[0] = {
|
||||
.name = "GIO_032",
|
||||
.start = 0xe0050080,
|
||||
.end = 0xe00500ab,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "GIO_032",
|
||||
.start = 0xe00500c0,
|
||||
.end = 0xe00500df,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = 101,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 102,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device gio1_device = {
|
||||
.name = "em_gio",
|
||||
.id = 1,
|
||||
.resource = gio1_resources,
|
||||
.num_resources = ARRAY_SIZE(gio1_resources),
|
||||
.dev = {
|
||||
.platform_data = &gio1_config,
|
||||
},
|
||||
DEFINE_RES_MEM(0xe0050080, 0x2c),
|
||||
DEFINE_RES_MEM(0xe00500c0, 0x20),
|
||||
DEFINE_RES_IRQ(101),
|
||||
DEFINE_RES_IRQ(102),
|
||||
};
|
||||
|
||||
static struct gpio_em_config gio2_config = {
|
||||
|
@ -246,36 +123,10 @@ static struct gpio_em_config gio2_config = {
|
|||
};
|
||||
|
||||
static struct resource gio2_resources[] = {
|
||||
[0] = {
|
||||
.name = "GIO_064",
|
||||
.start = 0xe0050100,
|
||||
.end = 0xe005012b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "GIO_064",
|
||||
.start = 0xe0050140,
|
||||
.end = 0xe005015f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = 103,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 104,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device gio2_device = {
|
||||
.name = "em_gio",
|
||||
.id = 2,
|
||||
.resource = gio2_resources,
|
||||
.num_resources = ARRAY_SIZE(gio2_resources),
|
||||
.dev = {
|
||||
.platform_data = &gio2_config,
|
||||
},
|
||||
DEFINE_RES_MEM(0xe0050100, 0x2c),
|
||||
DEFINE_RES_MEM(0xe0050140, 0x20),
|
||||
DEFINE_RES_IRQ(103),
|
||||
DEFINE_RES_IRQ(104),
|
||||
};
|
||||
|
||||
static struct gpio_em_config gio3_config = {
|
||||
|
@ -285,36 +136,10 @@ static struct gpio_em_config gio3_config = {
|
|||
};
|
||||
|
||||
static struct resource gio3_resources[] = {
|
||||
[0] = {
|
||||
.name = "GIO_096",
|
||||
.start = 0xe0050180,
|
||||
.end = 0xe00501ab,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "GIO_096",
|
||||
.start = 0xe00501c0,
|
||||
.end = 0xe00501df,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = 105,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 106,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device gio3_device = {
|
||||
.name = "em_gio",
|
||||
.id = 3,
|
||||
.resource = gio3_resources,
|
||||
.num_resources = ARRAY_SIZE(gio3_resources),
|
||||
.dev = {
|
||||
.platform_data = &gio3_config,
|
||||
},
|
||||
DEFINE_RES_MEM(0xe0050180, 0x2c),
|
||||
DEFINE_RES_MEM(0xe00501c0, 0x20),
|
||||
DEFINE_RES_IRQ(105),
|
||||
DEFINE_RES_IRQ(106),
|
||||
};
|
||||
|
||||
static struct gpio_em_config gio4_config = {
|
||||
|
@ -324,126 +149,52 @@ static struct gpio_em_config gio4_config = {
|
|||
};
|
||||
|
||||
static struct resource gio4_resources[] = {
|
||||
[0] = {
|
||||
.name = "GIO_128",
|
||||
.start = 0xe0050200,
|
||||
.end = 0xe005022b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "GIO_128",
|
||||
.start = 0xe0050240,
|
||||
.end = 0xe005025f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = 107,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = 108,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_MEM(0xe0050200, 0x2c),
|
||||
DEFINE_RES_MEM(0xe0050240, 0x20),
|
||||
DEFINE_RES_IRQ(107),
|
||||
DEFINE_RES_IRQ(108),
|
||||
};
|
||||
|
||||
static struct platform_device gio4_device = {
|
||||
.name = "em_gio",
|
||||
.id = 4,
|
||||
.resource = gio4_resources,
|
||||
.num_resources = ARRAY_SIZE(gio4_resources),
|
||||
.dev = {
|
||||
.platform_data = &gio4_config,
|
||||
},
|
||||
};
|
||||
#define emev2_register_gio(idx) \
|
||||
platform_device_register_resndata(&platform_bus, "em_gio", \
|
||||
idx, gio##idx##_resources, \
|
||||
ARRAY_SIZE(gio##idx##_resources), \
|
||||
&gio##idx##_config, \
|
||||
sizeof(struct gpio_em_config))
|
||||
|
||||
static struct resource pmu_resources[] = {
|
||||
[0] = {
|
||||
.start = 152,
|
||||
.end = 152,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[1] = {
|
||||
.start = 153,
|
||||
.end = 153,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(152),
|
||||
DEFINE_RES_IRQ(153),
|
||||
};
|
||||
|
||||
static struct platform_device pmu_device = {
|
||||
.name = "arm-pmu",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pmu_resources),
|
||||
.resource = pmu_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *emev2_early_devices[] __initdata = {
|
||||
&uart0_device,
|
||||
&uart1_device,
|
||||
&uart2_device,
|
||||
&uart3_device,
|
||||
};
|
||||
|
||||
static struct platform_device *emev2_late_devices[] __initdata = {
|
||||
&sti_device,
|
||||
&gio0_device,
|
||||
&gio1_device,
|
||||
&gio2_device,
|
||||
&gio3_device,
|
||||
&gio4_device,
|
||||
&pmu_device,
|
||||
};
|
||||
#define emev2_register_pmu() \
|
||||
platform_device_register_simple("arm-pmu", -1, \
|
||||
pmu_resources, \
|
||||
ARRAY_SIZE(pmu_resources))
|
||||
|
||||
void __init emev2_add_standard_devices(void)
|
||||
{
|
||||
emev2_clock_init();
|
||||
|
||||
platform_add_devices(emev2_early_devices,
|
||||
ARRAY_SIZE(emev2_early_devices));
|
||||
|
||||
platform_add_devices(emev2_late_devices,
|
||||
ARRAY_SIZE(emev2_late_devices));
|
||||
emev2_register_uart(0);
|
||||
emev2_register_uart(1);
|
||||
emev2_register_uart(2);
|
||||
emev2_register_uart(3);
|
||||
emev2_register_sti();
|
||||
emev2_register_gio(0);
|
||||
emev2_register_gio(1);
|
||||
emev2_register_gio(2);
|
||||
emev2_register_gio(3);
|
||||
emev2_register_gio(4);
|
||||
emev2_register_pmu();
|
||||
}
|
||||
|
||||
static void __init emev2_init_delay(void)
|
||||
void __init emev2_init_delay(void)
|
||||
{
|
||||
shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
|
||||
}
|
||||
|
||||
void __init emev2_add_early_devices(void)
|
||||
{
|
||||
emev2_init_delay();
|
||||
|
||||
early_platform_add_devices(emev2_early_devices,
|
||||
ARRAY_SIZE(emev2_early_devices));
|
||||
|
||||
/* setup early console here as well */
|
||||
shmobile_setup_console();
|
||||
}
|
||||
|
||||
void __init emev2_init_irq(void)
|
||||
{
|
||||
void __iomem *gic_dist_base;
|
||||
void __iomem *gic_cpu_base;
|
||||
|
||||
/* Static mappings, never released */
|
||||
gic_dist_base = ioremap(0xe0028000, PAGE_SIZE);
|
||||
gic_cpu_base = ioremap(0xe0020000, PAGE_SIZE);
|
||||
BUG_ON(!gic_dist_base || !gic_cpu_base);
|
||||
|
||||
/* Use GIC to handle interrupts */
|
||||
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static void __init emev2_add_standard_devices_dt(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
emev2_auxdata_lookup, NULL);
|
||||
}
|
||||
|
||||
static const char *emev2_boards_compat_dt[] __initdata = {
|
||||
"renesas,emev2",
|
||||
|
@ -452,10 +203,8 @@ static const char *emev2_boards_compat_dt[] __initdata = {
|
|||
|
||||
DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")
|
||||
.smp = smp_ops(emev2_smp_ops),
|
||||
.map_io = emev2_map_io,
|
||||
.init_early = emev2_init_delay,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = irqchip_init,
|
||||
.init_machine = emev2_add_standard_devices_dt,
|
||||
.dt_compat = emev2_boards_compat_dt,
|
||||
MACHINE_END
|
||||
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_data/irq-renesas-irqc.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/r8a73a4.h>
|
||||
|
@ -169,6 +169,25 @@ static const struct resource thermal0_resources[] = {
|
|||
thermal0_resources, \
|
||||
ARRAY_SIZE(thermal0_resources))
|
||||
|
||||
static struct sh_timer_config cmt10_platform_data = {
|
||||
.name = "CMT10",
|
||||
.timer_bit = 0,
|
||||
.clockevent_rating = 80,
|
||||
};
|
||||
|
||||
static struct resource cmt10_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6130010, 0x0c),
|
||||
DEFINE_RES_MEM(0xe6130000, 0x04),
|
||||
DEFINE_RES_IRQ(gic_spi(120)), /* CMT1_0 */
|
||||
};
|
||||
|
||||
#define r8a7790_register_cmt(idx) \
|
||||
platform_device_register_resndata(&platform_bus, "sh_cmt", \
|
||||
idx, cmt##idx##_resources, \
|
||||
ARRAY_SIZE(cmt##idx##_resources), \
|
||||
&cmt##idx##_platform_data, \
|
||||
sizeof(struct sh_timer_config))
|
||||
|
||||
void __init r8a73a4_add_standard_devices(void)
|
||||
{
|
||||
r8a73a4_register_scif(SCIFA0);
|
||||
|
@ -180,13 +199,17 @@ void __init r8a73a4_add_standard_devices(void)
|
|||
r8a73a4_register_irqc(0);
|
||||
r8a73a4_register_irqc(1);
|
||||
r8a73a4_register_thermal();
|
||||
r8a7790_register_cmt(10);
|
||||
}
|
||||
|
||||
void __init r8a73a4_init_delay(void)
|
||||
{
|
||||
#ifndef CONFIG_ARM_ARCH_TIMER
|
||||
shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
void __init r8a73a4_add_standard_devices_dt(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *r8a73a4_boards_compat_dt[] __initdata = {
|
||||
"renesas,r8a73a4",
|
||||
|
@ -194,8 +217,7 @@ static const char *r8a73a4_boards_compat_dt[] __initdata = {
|
|||
};
|
||||
|
||||
DT_MACHINE_START(R8A73A4_DT, "Generic R8A73A4 (Flattened Device Tree)")
|
||||
.init_irq = irqchip_init,
|
||||
.init_machine = r8a73a4_add_standard_devices_dt,
|
||||
.init_early = r8a73a4_init_delay,
|
||||
.init_time = shmobile_timer_init,
|
||||
.dt_compat = r8a73a4_boards_compat_dt,
|
||||
MACHINE_END
|
||||
|
|
|
@ -588,6 +588,16 @@ static const struct sh_dmae_slave_config r8a7740_dmae_slaves[] = {
|
|||
.addr = 0xfe1f0064,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xb5,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_RX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd2,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -986,16 +996,22 @@ void __init r8a7740_add_early_devices(void)
|
|||
|
||||
#ifdef CONFIG_USE_OF
|
||||
|
||||
static const struct of_dev_auxdata r8a7740_auxdata_lookup[] __initconst = {
|
||||
{ }
|
||||
};
|
||||
void __init r8a7740_add_early_devices_dt(void)
|
||||
{
|
||||
shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
|
||||
|
||||
early_platform_add_devices(r8a7740_early_devices,
|
||||
ARRAY_SIZE(r8a7740_early_devices));
|
||||
|
||||
/* setup early console here as well */
|
||||
shmobile_setup_console();
|
||||
}
|
||||
|
||||
void __init r8a7740_add_standard_devices_dt(void)
|
||||
{
|
||||
platform_add_devices(r8a7740_devices_dt,
|
||||
ARRAY_SIZE(r8a7740_devices_dt));
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
r8a7740_auxdata_lookup, NULL);
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
void __init r8a7740_init_delay(void)
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
.irqs = SCIx_IRQ_MUXED(irq), \
|
||||
}
|
||||
|
||||
static struct plat_sci_port scif_platform_data[] = {
|
||||
static struct plat_sci_port scif_platform_data[] __initdata = {
|
||||
SCIF_INFO(0xffe40000, gic_iid(0x66)),
|
||||
SCIF_INFO(0xffe41000, gic_iid(0x67)),
|
||||
SCIF_INFO(0xffe42000, gic_iid(0x68)),
|
||||
|
@ -63,24 +63,24 @@ static struct plat_sci_port scif_platform_data[] = {
|
|||
};
|
||||
|
||||
/* TMU */
|
||||
static struct resource sh_tmu0_resources[] = {
|
||||
static struct resource sh_tmu0_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffd80008, 12),
|
||||
DEFINE_RES_IRQ(gic_iid(0x40)),
|
||||
};
|
||||
|
||||
static struct sh_timer_config sh_tmu0_platform_data = {
|
||||
static struct sh_timer_config sh_tmu0_platform_data __initdata = {
|
||||
.name = "TMU00",
|
||||
.channel_offset = 0x4,
|
||||
.timer_bit = 0,
|
||||
.clockevent_rating = 200,
|
||||
};
|
||||
|
||||
static struct resource sh_tmu1_resources[] = {
|
||||
static struct resource sh_tmu1_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xffd80014, 12),
|
||||
DEFINE_RES_IRQ(gic_iid(0x41)),
|
||||
};
|
||||
|
||||
static struct sh_timer_config sh_tmu1_platform_data = {
|
||||
static struct sh_timer_config sh_tmu1_platform_data __initdata = {
|
||||
.name = "TMU01",
|
||||
.channel_offset = 0x10,
|
||||
.timer_bit = 1,
|
||||
|
@ -189,7 +189,7 @@ USB_PLATFORM_INFO(ehci);
|
|||
USB_PLATFORM_INFO(ohci);
|
||||
|
||||
/* Ether */
|
||||
static struct resource ether_resources[] = {
|
||||
static struct resource ether_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfde00000, 0x400),
|
||||
DEFINE_RES_IRQ(gic_iid(0x89)),
|
||||
};
|
||||
|
@ -203,17 +203,17 @@ void __init r8a7778_add_ether_device(struct sh_eth_plat_data *pdata)
|
|||
}
|
||||
|
||||
/* PFC/GPIO */
|
||||
static struct resource pfc_resources[] = {
|
||||
static struct resource pfc_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfffc0000, 0x118),
|
||||
};
|
||||
|
||||
#define R8A7778_GPIO(idx) \
|
||||
static struct resource r8a7778_gpio##idx##_resources[] = { \
|
||||
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 = { \
|
||||
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, \
|
||||
|
@ -249,7 +249,7 @@ void __init r8a7778_pinmux_init(void)
|
|||
};
|
||||
|
||||
/* SDHI */
|
||||
static struct resource sdhi_resources[] = {
|
||||
static struct resource sdhi_resources[] __initdata = {
|
||||
/* SDHI0 */
|
||||
DEFINE_RES_MEM(0xFFE4C000, 0x100),
|
||||
DEFINE_RES_IRQ(gic_iid(0x77)),
|
||||
|
@ -365,12 +365,12 @@ void __init r8a7778_init_late(void)
|
|||
platform_device_register_full(&ohci_info);
|
||||
}
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin_platform_data = {
|
||||
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[] = {
|
||||
static struct resource irqpin_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
|
||||
DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
|
||||
DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
|
||||
|
@ -408,17 +408,25 @@ void __init r8a7778_init_irq_extpin(int irlm)
|
|||
&irqpin_platform_data, sizeof(irqpin_platform_data));
|
||||
}
|
||||
|
||||
void __init r8a7778_init_delay(void)
|
||||
{
|
||||
shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
#define INT2SMSKCR0 0x82288 /* 0xfe782288 */
|
||||
#define INT2SMSKCR1 0x8228c /* 0xfe78228c */
|
||||
|
||||
#define INT2NTSR0 0x00018 /* 0xfe700018 */
|
||||
#define INT2NTSR1 0x0002c /* 0xfe70002c */
|
||||
static void __init r8a7778_init_irq_common(void)
|
||||
void __init r8a7778_init_irq_dt(void)
|
||||
{
|
||||
void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
|
||||
|
||||
BUG_ON(!base);
|
||||
|
||||
irqchip_init();
|
||||
|
||||
/* route all interrupts to ARM */
|
||||
__raw_writel(0x73ffffff, base + INT2NTSR0);
|
||||
__raw_writel(0xffffffff, base + INT2NTSR1);
|
||||
|
@ -430,43 +438,6 @@ static void __init r8a7778_init_irq_common(void)
|
|||
iounmap(base);
|
||||
}
|
||||
|
||||
void __init r8a7778_init_irq(void)
|
||||
{
|
||||
void __iomem *gic_dist_base;
|
||||
void __iomem *gic_cpu_base;
|
||||
|
||||
gic_dist_base = ioremap_nocache(0xfe438000, PAGE_SIZE);
|
||||
gic_cpu_base = ioremap_nocache(0xfe430000, PAGE_SIZE);
|
||||
BUG_ON(!gic_dist_base || !gic_cpu_base);
|
||||
|
||||
/* use GIC to handle interrupts */
|
||||
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||
|
||||
r8a7778_init_irq_common();
|
||||
}
|
||||
|
||||
void __init r8a7778_init_delay(void)
|
||||
{
|
||||
shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
void __init r8a7778_init_irq_dt(void)
|
||||
{
|
||||
irqchip_init();
|
||||
r8a7778_init_irq_common();
|
||||
}
|
||||
|
||||
static const struct of_dev_auxdata r8a7778_auxdata_lookup[] __initconst = {
|
||||
{},
|
||||
};
|
||||
|
||||
void __init r8a7778_add_standard_devices_dt(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
r8a7778_auxdata_lookup, NULL);
|
||||
}
|
||||
|
||||
static const char *r8a7778_compat_dt[] __initdata = {
|
||||
"renesas,r8a7778",
|
||||
NULL,
|
||||
|
@ -475,7 +446,6 @@ static const char *r8a7778_compat_dt[] __initdata = {
|
|||
DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
|
||||
.init_early = r8a7778_init_delay,
|
||||
.init_irq = r8a7778_init_irq_dt,
|
||||
.init_machine = r8a7778_add_standard_devices_dt,
|
||||
.init_time = shmobile_timer_init,
|
||||
.dt_compat = r8a7778_compat_dt,
|
||||
.init_late = r8a7778_init_late,
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_intc.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/usb/otg.h>
|
||||
|
@ -37,7 +36,6 @@
|
|||
#include <linux/usb/ehci_pdriver.h>
|
||||
#include <linux/usb/ohci_pdriver.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/r8a7779.h>
|
||||
#include <mach/common.h>
|
||||
|
@ -388,15 +386,6 @@ static struct platform_device sata_device = {
|
|||
},
|
||||
};
|
||||
|
||||
/* USB PHY */
|
||||
static struct resource usb_phy_resources[] __initdata = {
|
||||
[0] = {
|
||||
.start = 0xffe70800,
|
||||
.end = 0xffe70900 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
/* USB */
|
||||
static struct usb_phy *phy;
|
||||
|
||||
|
@ -602,14 +591,6 @@ void __init r8a7779_add_ether_device(struct sh_eth_plat_data *pdata)
|
|||
pdata, sizeof(*pdata));
|
||||
}
|
||||
|
||||
void __init r8a7779_add_usb_phy_device(struct rcar_phy_platform_data *pdata)
|
||||
{
|
||||
platform_device_register_resndata(&platform_bus, "rcar_usb_phy", -1,
|
||||
usb_phy_resources,
|
||||
ARRAY_SIZE(usb_phy_resources),
|
||||
pdata, sizeof(*pdata));
|
||||
}
|
||||
|
||||
/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
|
||||
void __init __weak r8a7779_register_twd(void) { }
|
||||
|
||||
|
@ -665,10 +646,6 @@ void __init r8a7779_init_delay(void)
|
|||
shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */
|
||||
}
|
||||
|
||||
static const struct of_dev_auxdata r8a7779_auxdata_lookup[] __initconst = {
|
||||
{},
|
||||
};
|
||||
|
||||
void __init r8a7779_add_standard_devices_dt(void)
|
||||
{
|
||||
/* clocks are setup late during boot in the case of DT */
|
||||
|
@ -676,8 +653,7 @@ void __init r8a7779_add_standard_devices_dt(void)
|
|||
|
||||
platform_add_devices(r8a7779_devices_dt,
|
||||
ARRAY_SIZE(r8a7779_devices_dt));
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
r8a7779_auxdata_lookup, NULL);
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *r8a7779_compat_dt[] __initdata = {
|
||||
|
|
|
@ -19,12 +19,12 @@
|
|||
*/
|
||||
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/platform_data/gpio-rcar.h>
|
||||
#include <linux/platform_data/irq-renesas-irqc.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/r8a7790.h>
|
||||
|
@ -149,6 +149,36 @@ static struct resource irqc0_resources[] __initdata = {
|
|||
&irqc##idx##_data, \
|
||||
sizeof(struct renesas_irqc_config))
|
||||
|
||||
static struct resource thermal_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xe61f0000, 0x14),
|
||||
DEFINE_RES_MEM(0xe61f0100, 0x38),
|
||||
DEFINE_RES_IRQ(gic_spi(69)),
|
||||
};
|
||||
|
||||
#define r8a7790_register_thermal() \
|
||||
platform_device_register_simple("rcar_thermal", -1, \
|
||||
thermal_resources, \
|
||||
ARRAY_SIZE(thermal_resources))
|
||||
|
||||
static struct sh_timer_config cmt00_platform_data = {
|
||||
.name = "CMT00",
|
||||
.timer_bit = 0,
|
||||
.clockevent_rating = 80,
|
||||
};
|
||||
|
||||
static struct resource cmt00_resources[] = {
|
||||
DEFINE_RES_MEM(0xffca0510, 0x0c),
|
||||
DEFINE_RES_MEM(0xffca0500, 0x04),
|
||||
DEFINE_RES_IRQ(gic_spi(142)), /* CMT0_0 */
|
||||
};
|
||||
|
||||
#define r8a7790_register_cmt(idx) \
|
||||
platform_device_register_resndata(&platform_bus, "sh_cmt", \
|
||||
idx, cmt##idx##_resources, \
|
||||
ARRAY_SIZE(cmt##idx##_resources), \
|
||||
&cmt##idx##_platform_data, \
|
||||
sizeof(struct sh_timer_config))
|
||||
|
||||
void __init r8a7790_add_standard_devices(void)
|
||||
{
|
||||
r8a7790_register_scif(SCIFA0);
|
||||
|
@ -162,34 +192,91 @@ void __init r8a7790_add_standard_devices(void)
|
|||
r8a7790_register_scif(HSCIF0);
|
||||
r8a7790_register_scif(HSCIF1);
|
||||
r8a7790_register_irqc(0);
|
||||
r8a7790_register_thermal();
|
||||
r8a7790_register_cmt(00);
|
||||
}
|
||||
|
||||
#define MODEMR 0xe6160060
|
||||
|
||||
u32 __init r8a7790_read_mode_pins(void)
|
||||
{
|
||||
void __iomem *modemr = ioremap_nocache(MODEMR, 4);
|
||||
u32 mode;
|
||||
|
||||
BUG_ON(!modemr);
|
||||
mode = ioread32(modemr);
|
||||
iounmap(modemr);
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
#define CNTCR 0
|
||||
#define CNTFID0 0x20
|
||||
|
||||
void __init r8a7790_timer_init(void)
|
||||
{
|
||||
void __iomem *cntcr;
|
||||
#ifdef CONFIG_ARM_ARCH_TIMER
|
||||
u32 mode = r8a7790_read_mode_pins();
|
||||
void __iomem *base;
|
||||
int extal_mhz = 0;
|
||||
u32 freq;
|
||||
|
||||
/* make sure arch timer is started by setting bit 0 of CNTCT */
|
||||
cntcr = ioremap(0xe6080000, PAGE_SIZE);
|
||||
iowrite32(1, cntcr);
|
||||
iounmap(cntcr);
|
||||
/* At Linux boot time the r8a7790 arch timer comes up
|
||||
* with the counter disabled. Moreover, it may also report
|
||||
* a potentially incorrect fixed 13 MHz frequency. To be
|
||||
* correct these registers need to be updated to use the
|
||||
* frequency EXTAL / 2 which can be determined by the MD pins.
|
||||
*/
|
||||
|
||||
switch (mode & (MD(14) | MD(13))) {
|
||||
case 0:
|
||||
extal_mhz = 15;
|
||||
break;
|
||||
case MD(13):
|
||||
extal_mhz = 20;
|
||||
break;
|
||||
case MD(14):
|
||||
extal_mhz = 26;
|
||||
break;
|
||||
case MD(13) | MD(14):
|
||||
extal_mhz = 30;
|
||||
break;
|
||||
}
|
||||
|
||||
/* The arch timer frequency equals EXTAL / 2 */
|
||||
freq = extal_mhz * (1000000 / 2);
|
||||
|
||||
/* Remap "armgcnt address map" space */
|
||||
base = ioremap(0xe6080000, PAGE_SIZE);
|
||||
|
||||
/* Update registers with correct frequency */
|
||||
iowrite32(freq, base + CNTFID0);
|
||||
asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r" (freq));
|
||||
|
||||
/* make sure arch timer is started by setting bit 0 of CNTCR */
|
||||
iowrite32(1, base + CNTCR);
|
||||
iounmap(base);
|
||||
#endif /* CONFIG_ARM_ARCH_TIMER */
|
||||
|
||||
shmobile_timer_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
void __init r8a7790_add_standard_devices_dt(void)
|
||||
void __init r8a7790_init_delay(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
#ifndef CONFIG_ARM_ARCH_TIMER
|
||||
shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
|
||||
static const char *r8a7790_boards_compat_dt[] __initdata = {
|
||||
"renesas,r8a7790",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
|
||||
.init_irq = irqchip_init,
|
||||
.init_machine = r8a7790_add_standard_devices_dt,
|
||||
.init_early = r8a7790_init_delay,
|
||||
.init_time = r8a7790_timer_init,
|
||||
.dt_compat = r8a7790_boards_compat_dt,
|
||||
MACHINE_END
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_data/sh_ipmmu.h>
|
||||
#include <mach/dma-register.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sh7372.h>
|
||||
#include <mach/common.h>
|
||||
|
@ -1147,10 +1146,6 @@ void __init sh7372_add_early_devices_dt(void)
|
|||
shmobile_setup_console();
|
||||
}
|
||||
|
||||
static const struct of_dev_auxdata sh7372_auxdata_lookup[] __initconst = {
|
||||
{ }
|
||||
};
|
||||
|
||||
void __init sh7372_add_standard_devices_dt(void)
|
||||
{
|
||||
/* clocks are setup late during boot in the case of DT */
|
||||
|
@ -1159,8 +1154,7 @@ void __init sh7372_add_standard_devices_dt(void)
|
|||
platform_add_devices(sh7372_early_devices,
|
||||
ARRAY_SIZE(sh7372_early_devices));
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
sh7372_auxdata_lookup, NULL);
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *sh7372_boards_compat_dt[] __initdata = {
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -35,7 +34,6 @@
|
|||
#include <linux/platform_data/sh_ipmmu.h>
|
||||
#include <linux/platform_data/irq-renesas-intc-irqpin.h>
|
||||
#include <mach/dma-register.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sh73a0.h>
|
||||
#include <mach/common.h>
|
||||
|
@ -61,29 +59,16 @@ void __init sh73a0_map_io(void)
|
|||
iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
|
||||
}
|
||||
|
||||
static struct resource sh73a0_pfc_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xe6050000,
|
||||
.end = 0xe6057fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 0xe605801c,
|
||||
.end = 0xe6058027,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device sh73a0_pfc_device = {
|
||||
.name = "pfc-sh73a0",
|
||||
.id = -1,
|
||||
.resource = sh73a0_pfc_resources,
|
||||
.num_resources = ARRAY_SIZE(sh73a0_pfc_resources),
|
||||
/* PFC */
|
||||
static struct resource pfc_resources[] __initdata = {
|
||||
DEFINE_RES_MEM(0xe6050000, 0x8000),
|
||||
DEFINE_RES_MEM(0xe605801c, 0x000c),
|
||||
};
|
||||
|
||||
void __init sh73a0_pinmux_init(void)
|
||||
{
|
||||
platform_device_register(&sh73a0_pfc_device);
|
||||
platform_device_register_simple("pfc-sh73a0", -1, pfc_resources,
|
||||
ARRAY_SIZE(pfc_resources));
|
||||
}
|
||||
|
||||
static struct plat_sci_port scif0_platform_data = {
|
||||
|
@ -958,10 +943,6 @@ void __init sh73a0_add_early_devices(void)
|
|||
|
||||
#ifdef CONFIG_USE_OF
|
||||
|
||||
static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
|
||||
{},
|
||||
};
|
||||
|
||||
void __init sh73a0_add_standard_devices_dt(void)
|
||||
{
|
||||
struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, };
|
||||
|
@ -971,8 +952,7 @@ void __init sh73a0_add_standard_devices_dt(void)
|
|||
|
||||
platform_add_devices(sh73a0_devices_dt,
|
||||
ARRAY_SIZE(sh73a0_devices_dt));
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
sh73a0_auxdata_lookup, NULL);
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
|
||||
/* Instantiate cpufreq-cpu0 */
|
||||
platform_device_register_full(&devinfo);
|
||||
|
@ -988,7 +968,6 @@ DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
|
|||
.map_io = sh73a0_map_io,
|
||||
.init_early = sh73a0_init_delay,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = irqchip_init,
|
||||
.init_machine = sh73a0_add_standard_devices_dt,
|
||||
.dt_compat = sh73a0_boards_compat_dt,
|
||||
MACHINE_END
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include <asm/smp_scu.h>
|
||||
|
||||
#define EMEV2_SCU_BASE 0x1e000000
|
||||
#define EMEV2_SMU_BASE 0xe0110000
|
||||
#define SMU_GENERAL_REG0 0x7c0
|
||||
|
||||
static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
{
|
||||
|
@ -38,10 +40,18 @@ static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|||
|
||||
static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
void __iomem *smu;
|
||||
|
||||
/* setup EMEV2 specific SCU base, enable */
|
||||
shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
|
||||
scu_enable(shmobile_scu_base);
|
||||
|
||||
/* Tell ROM loader about our vector (in headsmp-scu.S, headsmp.S) */
|
||||
emev2_set_boot_vector(__pa(shmobile_boot_vector));
|
||||
smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
|
||||
if (smu) {
|
||||
iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0);
|
||||
iounmap(smu);
|
||||
}
|
||||
shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
|
||||
shmobile_boot_arg = (unsigned long)shmobile_scu_base;
|
||||
|
||||
|
@ -49,21 +59,7 @@ static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
|
|||
scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
|
||||
}
|
||||
|
||||
static void __init emev2_smp_init_cpus(void)
|
||||
{
|
||||
unsigned int ncores;
|
||||
|
||||
/* setup EMEV2 specific SCU base */
|
||||
shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
|
||||
emev2_clock_init(); /* need ioremapped SMU */
|
||||
|
||||
ncores = shmobile_scu_base ? scu_get_core_count(shmobile_scu_base) : 1;
|
||||
|
||||
shmobile_smp_init_cpus(ncores);
|
||||
}
|
||||
|
||||
struct smp_operations emev2_smp_ops __initdata = {
|
||||
.smp_init_cpus = emev2_smp_init_cpus,
|
||||
.smp_prepare_cpus = emev2_smp_prepare_cpus,
|
||||
.smp_boot_secondary = emev2_boot_secondary,
|
||||
};
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/spi/mmc_spi.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/platform_data/gpio_backlight.h>
|
||||
#include <linux/sh_eth.h>
|
||||
#include <linux/sh_intc.h>
|
||||
#include <linux/videodev2.h>
|
||||
|
@ -303,7 +304,7 @@ static struct platform_device usbhs_device = {
|
|||
.resource = usbhs_resources,
|
||||
};
|
||||
|
||||
/* LCDC */
|
||||
/* LCDC and backlight */
|
||||
static const struct fb_videomode ecovec_lcd_modes[] = {
|
||||
{
|
||||
.name = "Panel",
|
||||
|
@ -334,13 +335,6 @@ static const struct fb_videomode ecovec_dvi_modes[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int ecovec24_set_brightness(int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_PTR1, brightness);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sh_mobile_lcdc_info lcdc_info = {
|
||||
.ch[0] = {
|
||||
.interface_type = RGB18,
|
||||
|
@ -350,11 +344,6 @@ static struct sh_mobile_lcdc_info lcdc_info = {
|
|||
.width = 152,
|
||||
.height = 91,
|
||||
},
|
||||
.bl_info = {
|
||||
.name = "sh_mobile_lcdc_bl",
|
||||
.max_brightness = 1,
|
||||
.set_brightness = ecovec24_set_brightness,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -380,6 +369,20 @@ static struct platform_device lcdc_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct gpio_backlight_platform_data gpio_backlight_data = {
|
||||
.fbdev = &lcdc_device.dev,
|
||||
.gpio = GPIO_PTR1,
|
||||
.def_value = 1,
|
||||
.name = "backlight",
|
||||
};
|
||||
|
||||
static struct platform_device gpio_backlight_device = {
|
||||
.name = "gpio-backlight",
|
||||
.dev = {
|
||||
.platform_data = &gpio_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* CEU0 */
|
||||
static struct sh_mobile_ceu_info sh_mobile_ceu0_info = {
|
||||
.flags = SH_CEU_FLAG_USE_8BIT_BUS,
|
||||
|
@ -1049,6 +1052,7 @@ static struct platform_device *ecovec_devices[] __initdata = {
|
|||
&usb1_common_device,
|
||||
&usbhs_device,
|
||||
&lcdc_device,
|
||||
&gpio_backlight_device,
|
||||
&ceu0_device,
|
||||
&ceu1_device,
|
||||
&keysc_device,
|
||||
|
@ -1239,11 +1243,9 @@ static int __init arch_setup(void)
|
|||
|
||||
gpio_request(GPIO_PTE6, NULL);
|
||||
gpio_request(GPIO_PTU1, NULL);
|
||||
gpio_request(GPIO_PTR1, NULL);
|
||||
gpio_request(GPIO_PTA2, NULL);
|
||||
gpio_direction_input(GPIO_PTE6);
|
||||
gpio_direction_output(GPIO_PTU1, 0);
|
||||
gpio_direction_output(GPIO_PTR1, 0);
|
||||
gpio_direction_output(GPIO_PTA2, 0);
|
||||
|
||||
/* I/O buffer drive ability is high */
|
||||
|
@ -1256,6 +1258,9 @@ static int __init arch_setup(void)
|
|||
lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes;
|
||||
lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes);
|
||||
|
||||
/* No backlight */
|
||||
gpio_backlight_data.fbdev = NULL;
|
||||
|
||||
gpio_set_value(GPIO_PTA2, 1);
|
||||
gpio_set_value(GPIO_PTU1, 1);
|
||||
} else {
|
||||
|
@ -1265,8 +1270,6 @@ static int __init arch_setup(void)
|
|||
lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes;
|
||||
lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes);
|
||||
|
||||
gpio_set_value(GPIO_PTR1, 1);
|
||||
|
||||
/* FIXME
|
||||
*
|
||||
* LCDDON control is needed for Panel,
|
||||
|
|
|
@ -276,51 +276,3 @@ void kfr2r09_lcd_start(void *sohandle, struct sh_mobile_lcdc_sys_bus_ops *so)
|
|||
{
|
||||
write_memory_start(sohandle, so);
|
||||
}
|
||||
|
||||
#define CTRL_CKSW 0x10
|
||||
#define CTRL_C10 0x20
|
||||
#define CTRL_CPSW 0x80
|
||||
#define MAIN_MLED4 0x40
|
||||
#define MAIN_MSW 0x80
|
||||
|
||||
int kfr2r09_lcd_set_brightness(int brightness)
|
||||
{
|
||||
struct i2c_adapter *a;
|
||||
struct i2c_msg msg;
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
a = i2c_get_adapter(0);
|
||||
if (!a)
|
||||
return -ENODEV;
|
||||
|
||||
buf[0] = 0x00;
|
||||
if (brightness)
|
||||
buf[1] = CTRL_CPSW | CTRL_C10 | CTRL_CKSW;
|
||||
else
|
||||
buf[1] = 0;
|
||||
|
||||
msg.addr = 0x75;
|
||||
msg.buf = buf;
|
||||
msg.len = 2;
|
||||
msg.flags = 0;
|
||||
ret = i2c_transfer(a, &msg, 1);
|
||||
if (ret != 1)
|
||||
return -ENODEV;
|
||||
|
||||
buf[0] = 0x01;
|
||||
if (brightness)
|
||||
buf[1] = MAIN_MSW | MAIN_MLED4 | 0x0c;
|
||||
else
|
||||
buf[1] = 0;
|
||||
|
||||
msg.addr = 0x75;
|
||||
msg.buf = buf;
|
||||
msg.len = 2;
|
||||
msg.flags = 0;
|
||||
ret = i2c_transfer(a, &msg, 1);
|
||||
if (ret != 1)
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/lv5207lp.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/usb/r8a66597.h>
|
||||
|
@ -159,11 +160,6 @@ static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = {
|
|||
.setup_sys = kfr2r09_lcd_setup,
|
||||
.start_transfer = kfr2r09_lcd_start,
|
||||
},
|
||||
.bl_info = {
|
||||
.name = "sh_mobile_lcdc_bl",
|
||||
.max_brightness = 1,
|
||||
.set_brightness = kfr2r09_lcd_set_brightness,
|
||||
},
|
||||
.sys_bus_cfg = {
|
||||
.ldmt2r = 0x07010904,
|
||||
.ldmt3r = 0x14012914,
|
||||
|
@ -195,6 +191,17 @@ static struct platform_device kfr2r09_sh_lcdc_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct lv5207lp_platform_data kfr2r09_backlight_data = {
|
||||
.fbdev = &kfr2r09_sh_lcdc_device.dev,
|
||||
.def_value = 13,
|
||||
.max_value = 13,
|
||||
};
|
||||
|
||||
static struct i2c_board_info kfr2r09_backlight_board_info = {
|
||||
I2C_BOARD_INFO("lv5207lp", 0x75),
|
||||
.platform_data = &kfr2r09_backlight_data,
|
||||
};
|
||||
|
||||
static struct r8a66597_platdata kfr2r09_usb0_gadget_data = {
|
||||
.on_chip = 1,
|
||||
};
|
||||
|
@ -627,6 +634,8 @@ static int __init kfr2r09_devices_setup(void)
|
|||
gpio_request(GPIO_FN_SDHI0CMD, NULL);
|
||||
gpio_request(GPIO_FN_SDHI0CLK, NULL);
|
||||
|
||||
i2c_register_board_info(0, &kfr2r09_backlight_board_info, 1);
|
||||
|
||||
return platform_add_devices(kfr2r09_devices,
|
||||
ARRAY_SIZE(kfr2r09_devices));
|
||||
}
|
||||
|
|
|
@ -4,13 +4,11 @@
|
|||
#include <video/sh_mobile_lcdc.h>
|
||||
|
||||
#if defined(CONFIG_FB_SH_MOBILE_LCDC) || defined(CONFIG_FB_SH_MOBILE_LCDC_MODULE)
|
||||
int kfr2r09_lcd_set_brightness(int brightness);
|
||||
int kfr2r09_lcd_setup(void *sys_ops_handle,
|
||||
struct sh_mobile_lcdc_sys_bus_ops *sys_ops);
|
||||
void kfr2r09_lcd_start(void *sys_ops_handle,
|
||||
struct sh_mobile_lcdc_sys_bus_ops *sys_ops);
|
||||
#else
|
||||
static int kfr2r09_lcd_set_brightness(int brightness) {}
|
||||
static int kfr2r09_lcd_setup(void *sys_ops_handle,
|
||||
struct sh_mobile_lcdc_sys_bus_ops *sys_ops)
|
||||
{
|
||||
|
|
|
@ -429,18 +429,6 @@ config LEDS_ASIC3
|
|||
cannot be used. This driver supports hardware blinking with an on+off
|
||||
period from 62ms to 125s. Say Y to enable LEDs on the HP iPAQ hx4700.
|
||||
|
||||
config LEDS_RENESAS_TPU
|
||||
bool "LED support for Renesas TPU"
|
||||
depends on LEDS_CLASS=y && HAVE_CLK && GPIOLIB
|
||||
help
|
||||
This option enables build of the LED TPU platform driver,
|
||||
suitable to drive any TPU channel on newer Renesas SoCs.
|
||||
The driver controls the GPIO pin connected to the LED via
|
||||
the GPIO framework and expects the LED to be connected to
|
||||
a pin that can be driven in both GPIO mode and using TPU
|
||||
pin function. The latter to support brightness control.
|
||||
Brightness control is supported but hardware blinking is not.
|
||||
|
||||
config LEDS_TCA6507
|
||||
tristate "LED Support for TCA6507 I2C chip"
|
||||
depends on LEDS_CLASS && I2C
|
||||
|
|
|
@ -49,7 +49,6 @@ obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
|
|||
obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
|
||||
obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
|
||||
obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
|
||||
obj-$(CONFIG_LEDS_RENESAS_TPU) += leds-renesas-tpu.o
|
||||
obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
|
||||
obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
|
||||
obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o
|
||||
|
|
|
@ -1,337 +0,0 @@
|
|||
/*
|
||||
* LED control using Renesas TPU
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/platform_data/leds-renesas-tpu.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
enum r_tpu_pin { R_TPU_PIN_UNUSED, R_TPU_PIN_GPIO, R_TPU_PIN_GPIO_FN };
|
||||
enum r_tpu_timer { R_TPU_TIMER_UNUSED, R_TPU_TIMER_ON };
|
||||
|
||||
struct r_tpu_priv {
|
||||
struct led_classdev ldev;
|
||||
void __iomem *mapbase;
|
||||
struct clk *clk;
|
||||
struct platform_device *pdev;
|
||||
enum r_tpu_pin pin_state;
|
||||
enum r_tpu_timer timer_state;
|
||||
unsigned long min_rate;
|
||||
unsigned int refresh_rate;
|
||||
struct work_struct work;
|
||||
enum led_brightness new_brightness;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(r_tpu_lock);
|
||||
|
||||
#define TSTR -1 /* Timer start register (shared register) */
|
||||
#define TCR 0 /* Timer control register (+0x00) */
|
||||
#define TMDR 1 /* Timer mode register (+0x04) */
|
||||
#define TIOR 2 /* Timer I/O control register (+0x08) */
|
||||
#define TIER 3 /* Timer interrupt enable register (+0x0c) */
|
||||
#define TSR 4 /* Timer status register (+0x10) */
|
||||
#define TCNT 5 /* Timer counter (+0x14) */
|
||||
#define TGRA 6 /* Timer general register A (+0x18) */
|
||||
#define TGRB 7 /* Timer general register B (+0x1c) */
|
||||
#define TGRC 8 /* Timer general register C (+0x20) */
|
||||
#define TGRD 9 /* Timer general register D (+0x24) */
|
||||
|
||||
static inline u16 r_tpu_read(struct r_tpu_priv *p, int reg_nr)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data;
|
||||
void __iomem *base = p->mapbase;
|
||||
unsigned long offs = reg_nr << 2;
|
||||
|
||||
if (reg_nr == TSTR)
|
||||
return ioread16(base - cfg->channel_offset);
|
||||
|
||||
return ioread16(base + offs);
|
||||
}
|
||||
|
||||
static inline void r_tpu_write(struct r_tpu_priv *p, int reg_nr, u16 value)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data;
|
||||
void __iomem *base = p->mapbase;
|
||||
unsigned long offs = reg_nr << 2;
|
||||
|
||||
if (reg_nr == TSTR) {
|
||||
iowrite16(value, base - cfg->channel_offset);
|
||||
return;
|
||||
}
|
||||
|
||||
iowrite16(value, base + offs);
|
||||
}
|
||||
|
||||
static void r_tpu_start_stop_ch(struct r_tpu_priv *p, int start)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data;
|
||||
unsigned long flags;
|
||||
u16 value;
|
||||
|
||||
/* start stop register shared by multiple timer channels */
|
||||
spin_lock_irqsave(&r_tpu_lock, flags);
|
||||
value = r_tpu_read(p, TSTR);
|
||||
|
||||
if (start)
|
||||
value |= 1 << cfg->timer_bit;
|
||||
else
|
||||
value &= ~(1 << cfg->timer_bit);
|
||||
|
||||
r_tpu_write(p, TSTR, value);
|
||||
spin_unlock_irqrestore(&r_tpu_lock, flags);
|
||||
}
|
||||
|
||||
static int r_tpu_enable(struct r_tpu_priv *p, enum led_brightness brightness)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data;
|
||||
int prescaler[] = { 1, 4, 16, 64 };
|
||||
int k, ret;
|
||||
unsigned long rate, tmp;
|
||||
|
||||
if (p->timer_state == R_TPU_TIMER_ON)
|
||||
return 0;
|
||||
|
||||
/* wake up device and enable clock */
|
||||
pm_runtime_get_sync(&p->pdev->dev);
|
||||
ret = clk_enable(p->clk);
|
||||
if (ret) {
|
||||
dev_err(&p->pdev->dev, "cannot enable clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* make sure channel is disabled */
|
||||
r_tpu_start_stop_ch(p, 0);
|
||||
|
||||
/* get clock rate after enabling it */
|
||||
rate = clk_get_rate(p->clk);
|
||||
|
||||
/* pick the lowest acceptable rate */
|
||||
for (k = ARRAY_SIZE(prescaler) - 1; k >= 0; k--)
|
||||
if ((rate / prescaler[k]) >= p->min_rate)
|
||||
break;
|
||||
|
||||
if (k < 0) {
|
||||
dev_err(&p->pdev->dev, "clock rate mismatch\n");
|
||||
goto err0;
|
||||
}
|
||||
dev_dbg(&p->pdev->dev, "rate = %lu, prescaler %u\n",
|
||||
rate, prescaler[k]);
|
||||
|
||||
/* clear TCNT on TGRB match, count on rising edge, set prescaler */
|
||||
r_tpu_write(p, TCR, 0x0040 | k);
|
||||
|
||||
/* output 0 until TGRA, output 1 until TGRB */
|
||||
r_tpu_write(p, TIOR, 0x0002);
|
||||
|
||||
rate /= prescaler[k] * p->refresh_rate;
|
||||
r_tpu_write(p, TGRB, rate);
|
||||
dev_dbg(&p->pdev->dev, "TRGB = 0x%04lx\n", rate);
|
||||
|
||||
tmp = (cfg->max_brightness - brightness) * rate;
|
||||
r_tpu_write(p, TGRA, tmp / cfg->max_brightness);
|
||||
dev_dbg(&p->pdev->dev, "TRGA = 0x%04lx\n", tmp / cfg->max_brightness);
|
||||
|
||||
/* PWM mode */
|
||||
r_tpu_write(p, TMDR, 0x0002);
|
||||
|
||||
/* enable channel */
|
||||
r_tpu_start_stop_ch(p, 1);
|
||||
|
||||
p->timer_state = R_TPU_TIMER_ON;
|
||||
return 0;
|
||||
err0:
|
||||
clk_disable(p->clk);
|
||||
pm_runtime_put_sync(&p->pdev->dev);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static void r_tpu_disable(struct r_tpu_priv *p)
|
||||
{
|
||||
if (p->timer_state == R_TPU_TIMER_UNUSED)
|
||||
return;
|
||||
|
||||
/* disable channel */
|
||||
r_tpu_start_stop_ch(p, 0);
|
||||
|
||||
/* stop clock and mark device as idle */
|
||||
clk_disable(p->clk);
|
||||
pm_runtime_put_sync(&p->pdev->dev);
|
||||
|
||||
p->timer_state = R_TPU_TIMER_UNUSED;
|
||||
}
|
||||
|
||||
static void r_tpu_set_pin(struct r_tpu_priv *p, enum r_tpu_pin new_state,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data;
|
||||
|
||||
if (p->pin_state == new_state) {
|
||||
if (p->pin_state == R_TPU_PIN_GPIO)
|
||||
gpio_set_value(cfg->pin_gpio, brightness);
|
||||
return;
|
||||
}
|
||||
|
||||
if (p->pin_state == R_TPU_PIN_GPIO)
|
||||
gpio_free(cfg->pin_gpio);
|
||||
|
||||
if (p->pin_state == R_TPU_PIN_GPIO_FN)
|
||||
gpio_free(cfg->pin_gpio_fn);
|
||||
|
||||
if (new_state == R_TPU_PIN_GPIO)
|
||||
gpio_request_one(cfg->pin_gpio, !!brightness ?
|
||||
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
|
||||
cfg->name);
|
||||
|
||||
if (new_state == R_TPU_PIN_GPIO_FN)
|
||||
gpio_request(cfg->pin_gpio_fn, cfg->name);
|
||||
|
||||
p->pin_state = new_state;
|
||||
}
|
||||
|
||||
static void r_tpu_work(struct work_struct *work)
|
||||
{
|
||||
struct r_tpu_priv *p = container_of(work, struct r_tpu_priv, work);
|
||||
enum led_brightness brightness = p->new_brightness;
|
||||
|
||||
r_tpu_disable(p);
|
||||
|
||||
/* off and maximum are handled as GPIO pins, in between PWM */
|
||||
if ((brightness == 0) || (brightness == p->ldev.max_brightness))
|
||||
r_tpu_set_pin(p, R_TPU_PIN_GPIO, brightness);
|
||||
else {
|
||||
r_tpu_set_pin(p, R_TPU_PIN_GPIO_FN, 0);
|
||||
r_tpu_enable(p, brightness);
|
||||
}
|
||||
}
|
||||
|
||||
static void r_tpu_set_brightness(struct led_classdev *ldev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
struct r_tpu_priv *p = container_of(ldev, struct r_tpu_priv, ldev);
|
||||
p->new_brightness = brightness;
|
||||
schedule_work(&p->work);
|
||||
}
|
||||
|
||||
static int r_tpu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct led_renesas_tpu_config *cfg = pdev->dev.platform_data;
|
||||
struct r_tpu_priv *p;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
if (!cfg) {
|
||||
dev_err(&pdev->dev, "missing platform data\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
|
||||
if (p == NULL) {
|
||||
dev_err(&pdev->dev, "failed to allocate driver data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "failed to get I/O memory\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/* map memory, let mapbase point to our channel */
|
||||
p->mapbase = devm_ioremap_nocache(&pdev->dev, res->start,
|
||||
resource_size(res));
|
||||
if (p->mapbase == NULL) {
|
||||
dev_err(&pdev->dev, "failed to remap I/O memory\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/* get hold of clock */
|
||||
p->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(p->clk)) {
|
||||
dev_err(&pdev->dev, "cannot get clock\n");
|
||||
return PTR_ERR(p->clk);
|
||||
}
|
||||
|
||||
p->pdev = pdev;
|
||||
p->pin_state = R_TPU_PIN_UNUSED;
|
||||
p->timer_state = R_TPU_TIMER_UNUSED;
|
||||
p->refresh_rate = cfg->refresh_rate ? cfg->refresh_rate : 100;
|
||||
r_tpu_set_pin(p, R_TPU_PIN_GPIO, LED_OFF);
|
||||
platform_set_drvdata(pdev, p);
|
||||
|
||||
INIT_WORK(&p->work, r_tpu_work);
|
||||
|
||||
p->ldev.name = cfg->name;
|
||||
p->ldev.brightness = LED_OFF;
|
||||
p->ldev.max_brightness = cfg->max_brightness;
|
||||
p->ldev.brightness_set = r_tpu_set_brightness;
|
||||
p->ldev.flags |= LED_CORE_SUSPENDRESUME;
|
||||
ret = led_classdev_register(&pdev->dev, &p->ldev);
|
||||
if (ret < 0)
|
||||
goto err0;
|
||||
|
||||
/* max_brightness may be updated by the LED core code */
|
||||
p->min_rate = p->ldev.max_brightness * p->refresh_rate;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
return 0;
|
||||
|
||||
err0:
|
||||
r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int r_tpu_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct r_tpu_priv *p = platform_get_drvdata(pdev);
|
||||
|
||||
r_tpu_set_brightness(&p->ldev, LED_OFF);
|
||||
led_classdev_unregister(&p->ldev);
|
||||
cancel_work_sync(&p->work);
|
||||
r_tpu_disable(p);
|
||||
r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver r_tpu_device_driver = {
|
||||
.probe = r_tpu_probe,
|
||||
.remove = r_tpu_remove,
|
||||
.driver = {
|
||||
.name = "leds-renesas-tpu",
|
||||
}
|
||||
};
|
||||
|
||||
module_platform_driver(r_tpu_device_driver);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("Renesas TPU LED Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
|
@ -425,6 +425,25 @@ config BACKLIGHT_AS3711
|
|||
If you have an Austrian Microsystems AS3711 say Y to enable the
|
||||
backlight driver.
|
||||
|
||||
config BACKLIGHT_GPIO
|
||||
tristate "Generic GPIO based Backlight Driver"
|
||||
depends on GPIOLIB
|
||||
help
|
||||
If you have a LCD backlight adjustable by GPIO, say Y to enable
|
||||
this driver.
|
||||
|
||||
config BACKLIGHT_LV5207LP
|
||||
tristate "Sanyo LV5207LP Backlight"
|
||||
depends on I2C
|
||||
help
|
||||
If you have a Sanyo LV5207LP say Y to enable the backlight driver.
|
||||
|
||||
config BACKLIGHT_BD6107
|
||||
tristate "Rohm BD6107 Backlight"
|
||||
depends on I2C
|
||||
help
|
||||
If you have a Rohm BD6107 say Y to enable the backlight driver.
|
||||
|
||||
endif # BACKLIGHT_CLASS_DEVICE
|
||||
|
||||
endif # BACKLIGHT_LCD_SUPPORT
|
||||
|
|
|
@ -26,12 +26,14 @@ obj-$(CONFIG_BACKLIGHT_ADP8870) += adp8870_bl.o
|
|||
obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_AS3711) += as3711_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_ATMEL_PWM) += atmel-pwm-bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_BD6107) += bd6107.o
|
||||
obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
|
||||
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
|
||||
obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_DA9052) += da9052_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_EP93XX) += ep93xx_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_GENERIC) += generic_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_GPIO) += gpio_backlight.o
|
||||
obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
|
||||
|
@ -40,6 +42,7 @@ obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o
|
|||
obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
|
||||
obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.o
|
||||
obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o
|
||||
|
|
|
@ -0,0 +1,213 @@
|
|||
/*
|
||||
* ROHM Semiconductor BD6107 LED Driver
|
||||
*
|
||||
* Copyright (C) 2013 Ideas on board SPRL
|
||||
*
|
||||
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/bd6107.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define BD6107_PSCNT1 0x00
|
||||
#define BD6107_PSCNT1_PSCNTREG2 (1 << 2)
|
||||
#define BD6107_PSCNT1_PSCNTREG1 (1 << 0)
|
||||
#define BD6107_REGVSET 0x02
|
||||
#define BD6107_REGVSET_REG1VSET_2_85V (1 << 2)
|
||||
#define BD6107_REGVSET_REG1VSET_2_80V (0 << 2)
|
||||
#define BD6107_LEDCNT1 0x03
|
||||
#define BD6107_LEDCNT1_LEDONOFF2 (1 << 1)
|
||||
#define BD6107_LEDCNT1_LEDONOFF1 (1 << 0)
|
||||
#define BD6107_PORTSEL 0x04
|
||||
#define BD6107_PORTSEL_LEDM(n) (1 << (n))
|
||||
#define BD6107_RGB1CNT1 0x05
|
||||
#define BD6107_RGB1CNT2 0x06
|
||||
#define BD6107_RGB1CNT3 0x07
|
||||
#define BD6107_RGB1CNT4 0x08
|
||||
#define BD6107_RGB1CNT5 0x09
|
||||
#define BD6107_RGB1FLM 0x0a
|
||||
#define BD6107_RGB2CNT1 0x0b
|
||||
#define BD6107_RGB2CNT2 0x0c
|
||||
#define BD6107_RGB2CNT3 0x0d
|
||||
#define BD6107_RGB2CNT4 0x0e
|
||||
#define BD6107_RGB2CNT5 0x0f
|
||||
#define BD6107_RGB2FLM 0x10
|
||||
#define BD6107_PSCONT3 0x11
|
||||
#define BD6107_SMMONCNT 0x12
|
||||
#define BD6107_DCDCCNT 0x13
|
||||
#define BD6107_IOSEL 0x14
|
||||
#define BD6107_OUT1 0x15
|
||||
#define BD6107_OUT2 0x16
|
||||
#define BD6107_MASK1 0x17
|
||||
#define BD6107_MASK2 0x18
|
||||
#define BD6107_FACTOR1 0x19
|
||||
#define BD6107_FACTOR2 0x1a
|
||||
#define BD6107_CLRFACT1 0x1b
|
||||
#define BD6107_CLRFACT2 0x1c
|
||||
#define BD6107_STATE1 0x1d
|
||||
#define BD6107_LSIVER 0x1e
|
||||
#define BD6107_GRPSEL 0x1f
|
||||
#define BD6107_LEDCNT2 0x20
|
||||
#define BD6107_LEDCNT3 0x21
|
||||
#define BD6107_MCURRENT 0x22
|
||||
#define BD6107_MAINCNT1 0x23
|
||||
#define BD6107_MAINCNT2 0x24
|
||||
#define BD6107_SLOPECNT 0x25
|
||||
#define BD6107_MSLOPE 0x26
|
||||
#define BD6107_RGBSLOPE 0x27
|
||||
#define BD6107_TEST 0x29
|
||||
#define BD6107_SFTRST 0x2a
|
||||
#define BD6107_SFTRSTGD 0x2b
|
||||
|
||||
struct bd6107 {
|
||||
struct i2c_client *client;
|
||||
struct backlight_device *backlight;
|
||||
struct bd6107_platform_data *pdata;
|
||||
};
|
||||
|
||||
static int bd6107_write(struct bd6107 *bd, u8 reg, u8 data)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(bd->client, reg, data);
|
||||
}
|
||||
|
||||
static int bd6107_backlight_update_status(struct backlight_device *backlight)
|
||||
{
|
||||
struct bd6107 *bd = bl_get_data(backlight);
|
||||
int brightness = backlight->props.brightness;
|
||||
|
||||
if (backlight->props.power != FB_BLANK_UNBLANK ||
|
||||
backlight->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
backlight->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
if (brightness) {
|
||||
bd6107_write(bd, BD6107_PORTSEL, BD6107_PORTSEL_LEDM(2) |
|
||||
BD6107_PORTSEL_LEDM(1) | BD6107_PORTSEL_LEDM(0));
|
||||
bd6107_write(bd, BD6107_MAINCNT1, brightness);
|
||||
bd6107_write(bd, BD6107_LEDCNT1, BD6107_LEDCNT1_LEDONOFF1);
|
||||
} else {
|
||||
gpio_set_value(bd->pdata->reset, 0);
|
||||
msleep(24);
|
||||
gpio_set_value(bd->pdata->reset, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bd6107_backlight_get_brightness(struct backlight_device *backlight)
|
||||
{
|
||||
return backlight->props.brightness;
|
||||
}
|
||||
|
||||
static int bd6107_backlight_check_fb(struct backlight_device *backlight,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct bd6107 *bd = bl_get_data(backlight);
|
||||
|
||||
return bd->pdata->fbdev == NULL || bd->pdata->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops bd6107_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = bd6107_backlight_update_status,
|
||||
.get_brightness = bd6107_backlight_get_brightness,
|
||||
.check_fb = bd6107_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int bd6107_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct bd6107_platform_data *pdata = client->dev.platform_data;
|
||||
struct backlight_device *backlight;
|
||||
struct backlight_properties props;
|
||||
struct bd6107 *bd;
|
||||
int ret;
|
||||
|
||||
if (pdata == NULL || !pdata->reset) {
|
||||
dev_err(&client->dev, "No reset GPIO in platform data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_warn(&client->dev,
|
||||
"I2C adapter doesn't support I2C_FUNC_SMBUS_BYTE\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
bd = devm_kzalloc(&client->dev, sizeof(*bd), GFP_KERNEL);
|
||||
if (!bd)
|
||||
return -ENOMEM;
|
||||
|
||||
bd->client = client;
|
||||
bd->pdata = pdata;
|
||||
|
||||
ret = devm_gpio_request_one(&client->dev, pdata->reset,
|
||||
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "reset");
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "unable to request reset GPIO\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 128;
|
||||
props.brightness = clamp_t(unsigned int, pdata->def_value, 0,
|
||||
props.max_brightness);
|
||||
|
||||
backlight = backlight_device_register(dev_name(&client->dev),
|
||||
&bd->client->dev, bd,
|
||||
&bd6107_backlight_ops, &props);
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&client->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(backlight);
|
||||
}
|
||||
|
||||
backlight_update_status(backlight);
|
||||
i2c_set_clientdata(client, backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bd6107_remove(struct i2c_client *client)
|
||||
{
|
||||
struct backlight_device *backlight = i2c_get_clientdata(client);
|
||||
|
||||
backlight->props.brightness = 0;
|
||||
backlight_update_status(backlight);
|
||||
backlight_device_unregister(backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id bd6107_ids[] = {
|
||||
{ "bd6107", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, bd6107_ids);
|
||||
|
||||
static struct i2c_driver bd6107_driver = {
|
||||
.driver = {
|
||||
.name = "bd6107",
|
||||
},
|
||||
.probe = bd6107_probe,
|
||||
.remove = bd6107_remove,
|
||||
.id_table = bd6107_ids,
|
||||
};
|
||||
|
||||
module_i2c_driver(bd6107_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Rohm BD6107 Backlight Driver");
|
||||
MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* gpio_backlight.c - Simple GPIO-controlled backlight
|
||||
*
|
||||
* 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/backlight.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/gpio_backlight.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct gpio_backlight {
|
||||
struct device *dev;
|
||||
struct device *fbdev;
|
||||
|
||||
int gpio;
|
||||
int active;
|
||||
};
|
||||
|
||||
static int gpio_backlight_update_status(struct backlight_device *bl)
|
||||
{
|
||||
struct gpio_backlight *gbl = bl_get_data(bl);
|
||||
int brightness = bl->props.brightness;
|
||||
|
||||
if (bl->props.power != FB_BLANK_UNBLANK ||
|
||||
bl->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
gpio_set_value(gbl->gpio, brightness ? gbl->active : !gbl->active);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_backlight_get_brightness(struct backlight_device *bl)
|
||||
{
|
||||
return bl->props.brightness;
|
||||
}
|
||||
|
||||
static int gpio_backlight_check_fb(struct backlight_device *bl,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct gpio_backlight *gbl = bl_get_data(bl);
|
||||
|
||||
return gbl->fbdev == NULL || gbl->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops gpio_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = gpio_backlight_update_status,
|
||||
.get_brightness = gpio_backlight_get_brightness,
|
||||
.check_fb = gpio_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int gpio_backlight_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_backlight_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct backlight_properties props;
|
||||
struct backlight_device *bl;
|
||||
struct gpio_backlight *gbl;
|
||||
int ret;
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "failed to find platform data\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
gbl = devm_kzalloc(&pdev->dev, sizeof(*gbl), GFP_KERNEL);
|
||||
if (gbl == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
gbl->dev = &pdev->dev;
|
||||
gbl->fbdev = pdata->fbdev;
|
||||
gbl->gpio = pdata->gpio;
|
||||
gbl->active = pdata->active_low ? 0 : 1;
|
||||
|
||||
ret = devm_gpio_request_one(gbl->dev, gbl->gpio, GPIOF_DIR_OUT |
|
||||
(gbl->active ? GPIOF_INIT_LOW
|
||||
: GPIOF_INIT_HIGH),
|
||||
pdata->name);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "unable to request GPIO\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 1;
|
||||
bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, gbl,
|
||||
&gpio_backlight_ops, &props);
|
||||
if (IS_ERR(bl)) {
|
||||
dev_err(&pdev->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(bl);
|
||||
}
|
||||
|
||||
bl->props.brightness = pdata->def_value;
|
||||
backlight_update_status(bl);
|
||||
|
||||
platform_set_drvdata(pdev, bl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_backlight_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
|
||||
backlight_device_unregister(bl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver gpio_backlight_driver = {
|
||||
.driver = {
|
||||
.name = "gpio-backlight",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = gpio_backlight_probe,
|
||||
.remove = gpio_backlight_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(gpio_backlight_driver);
|
||||
|
||||
MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
|
||||
MODULE_DESCRIPTION("GPIO-based Backlight Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:gpio-backlight");
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* Sanyo LV5207LP LED Driver
|
||||
*
|
||||
* Copyright (C) 2013 Ideas on board SPRL
|
||||
*
|
||||
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/lv5207lp.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define LV5207LP_CTRL1 0x00
|
||||
#define LV5207LP_CPSW (1 << 7)
|
||||
#define LV5207LP_SCTEN (1 << 6)
|
||||
#define LV5207LP_C10 (1 << 5)
|
||||
#define LV5207LP_CKSW (1 << 4)
|
||||
#define LV5207LP_RSW (1 << 3)
|
||||
#define LV5207LP_GSW (1 << 2)
|
||||
#define LV5207LP_BSW (1 << 1)
|
||||
#define LV5207LP_CTRL2 0x01
|
||||
#define LV5207LP_MSW (1 << 7)
|
||||
#define LV5207LP_MLED4 (1 << 6)
|
||||
#define LV5207LP_RED 0x02
|
||||
#define LV5207LP_GREEN 0x03
|
||||
#define LV5207LP_BLUE 0x04
|
||||
|
||||
#define LV5207LP_MAX_BRIGHTNESS 32
|
||||
|
||||
struct lv5207lp {
|
||||
struct i2c_client *client;
|
||||
struct backlight_device *backlight;
|
||||
struct lv5207lp_platform_data *pdata;
|
||||
};
|
||||
|
||||
static int lv5207lp_write(struct lv5207lp *lv, u8 reg, u8 data)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(lv->client, reg, data);
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_update_status(struct backlight_device *backlight)
|
||||
{
|
||||
struct lv5207lp *lv = bl_get_data(backlight);
|
||||
int brightness = backlight->props.brightness;
|
||||
|
||||
if (backlight->props.power != FB_BLANK_UNBLANK ||
|
||||
backlight->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
backlight->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
if (brightness) {
|
||||
lv5207lp_write(lv, LV5207LP_CTRL1,
|
||||
LV5207LP_CPSW | LV5207LP_C10 | LV5207LP_CKSW);
|
||||
lv5207lp_write(lv, LV5207LP_CTRL2,
|
||||
LV5207LP_MSW | LV5207LP_MLED4 |
|
||||
(brightness - 1));
|
||||
} else {
|
||||
lv5207lp_write(lv, LV5207LP_CTRL1, 0);
|
||||
lv5207lp_write(lv, LV5207LP_CTRL2, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_get_brightness(struct backlight_device *backlight)
|
||||
{
|
||||
return backlight->props.brightness;
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_check_fb(struct backlight_device *backlight,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct lv5207lp *lv = bl_get_data(backlight);
|
||||
|
||||
return lv->pdata->fbdev == NULL || lv->pdata->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops lv5207lp_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = lv5207lp_backlight_update_status,
|
||||
.get_brightness = lv5207lp_backlight_get_brightness,
|
||||
.check_fb = lv5207lp_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int lv5207lp_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct lv5207lp_platform_data *pdata = client->dev.platform_data;
|
||||
struct backlight_device *backlight;
|
||||
struct backlight_properties props;
|
||||
struct lv5207lp *lv;
|
||||
|
||||
if (pdata == NULL) {
|
||||
dev_err(&client->dev, "No platform data supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_warn(&client->dev,
|
||||
"I2C adapter doesn't support I2C_FUNC_SMBUS_BYTE\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
lv = devm_kzalloc(&client->dev, sizeof(*lv), GFP_KERNEL);
|
||||
if (!lv)
|
||||
return -ENOMEM;
|
||||
|
||||
lv->client = client;
|
||||
lv->pdata = pdata;
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = min_t(unsigned int, pdata->max_value,
|
||||
LV5207LP_MAX_BRIGHTNESS);
|
||||
props.brightness = clamp_t(unsigned int, pdata->def_value, 0,
|
||||
props.max_brightness);
|
||||
|
||||
backlight = backlight_device_register(dev_name(&client->dev),
|
||||
&lv->client->dev, lv,
|
||||
&lv5207lp_backlight_ops, &props);
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&client->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(backlight);
|
||||
}
|
||||
|
||||
backlight_update_status(backlight);
|
||||
i2c_set_clientdata(client, backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lv5207lp_remove(struct i2c_client *client)
|
||||
{
|
||||
struct backlight_device *backlight = i2c_get_clientdata(client);
|
||||
|
||||
backlight->props.brightness = 0;
|
||||
backlight_update_status(backlight);
|
||||
backlight_device_unregister(backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id lv5207lp_ids[] = {
|
||||
{ "lv5207lp", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, lv5207lp_ids);
|
||||
|
||||
static struct i2c_driver lv5207lp_driver = {
|
||||
.driver = {
|
||||
.name = "lv5207lp",
|
||||
},
|
||||
.probe = lv5207lp_probe,
|
||||
.remove = lv5207lp_remove,
|
||||
.id_table = lv5207lp_ids,
|
||||
};
|
||||
|
||||
module_i2c_driver(lv5207lp_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Sanyo LV5207LP Backlight Driver");
|
||||
MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* bd6107.h - Rohm BD6107 LEDs Driver
|
||||
*
|
||||
* 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 __BD6107_H__
|
||||
#define __BD6107_H__
|
||||
|
||||
struct device;
|
||||
|
||||
struct bd6107_platform_data {
|
||||
struct device *fbdev;
|
||||
int reset; /* Reset GPIO */
|
||||
unsigned int def_value;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* gpio_backlight.h - Simple GPIO-controlled backlight
|
||||
*
|
||||
* 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 __GPIO_BACKLIGHT_H__
|
||||
#define __GPIO_BACKLIGHT_H__
|
||||
|
||||
struct device;
|
||||
|
||||
struct gpio_backlight_platform_data {
|
||||
struct device *fbdev;
|
||||
int gpio;
|
||||
int def_value;
|
||||
bool active_low;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef __LEDS_RENESAS_TPU_H__
|
||||
#define __LEDS_RENESAS_TPU_H__
|
||||
|
||||
struct led_renesas_tpu_config {
|
||||
char *name;
|
||||
unsigned pin_gpio_fn;
|
||||
unsigned pin_gpio;
|
||||
unsigned int channel_offset;
|
||||
unsigned int timer_bit;
|
||||
unsigned int max_brightness;
|
||||
unsigned int refresh_rate;
|
||||
};
|
||||
|
||||
#endif /* __LEDS_RENESAS_TPU_H__ */
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* lv5207lp.h - Sanyo LV5207LP LEDs Driver
|
||||
*
|
||||
* 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 __LV5207LP_H__
|
||||
#define __LV5207LP_H__
|
||||
|
||||
struct device;
|
||||
|
||||
struct lv5207lp_platform_data {
|
||||
struct device *fbdev;
|
||||
unsigned int max_value;
|
||||
unsigned int def_value;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue