Merge branch 'next/devel' of git://git.linaro.org/people/arnd/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 2 Nov 2011 03:31:25 +0000 (20:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 2 Nov 2011 03:31:25 +0000 (20:31 -0700)
* 'next/devel' of git://git.linaro.org/people/arnd/arm-soc: (50 commits)
  ARM: tegra: update defconfig
  arm/tegra: Harmony: Configure PMC for low-level interrupts
  arm/tegra: device tree support for ventana board
  arm/tegra: add support for ventana pinmuxing
  arm/tegra: prepare Seaboard pinmux code for derived boards
  arm/tegra: pinmux: ioremap registers
  gpio/tegra: Convert to a platform device
  arm/tegra: Convert pinmux driver to a platform device
  arm/dt: Tegra: Add pinmux node to tegra20.dtsi
  arm/tegra: Prep boards for gpio/pinmux conversion to pdevs
  ARM: mx5: fix clock usage for suspend
  ARM i.MX entry-macro.S: remove now unused code
  ARM i.MX boards: use CONFIG_MULTI_IRQ_HANDLER
  ARM i.MX tzic: add handle_irq function
  ARM i.MX avic: add handle_irq function
  ARM: mx25: Add the missing IIM base definition
  ARM i.MX avic: convert to use generic irq chip
  mx31moboard: Add poweroff support
  ARM: mach-qong: Add watchdog support
  ARM: davinci: AM18x: Add wl1271/wlan support
  ...

Fix up conflicts in:
arch/arm/mach-at91/at91sam9g45.c
arch/arm/mach-mx5/devices-imx53.h
arch/arm/plat-mxc/include/mach/memory.h

125 files changed:
Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt [new file with mode: 0644]
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/boot/dts/tegra-ventana.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra20.dtsi
arch/arm/configs/imx_v4_v5_defconfig [moved from arch/arm/configs/mx27_defconfig with 69% similarity]
arch/arm/configs/mx1_defconfig [deleted file]
arch/arm/configs/mx21_defconfig [deleted file]
arch/arm/configs/mx5_defconfig [moved from arch/arm/configs/mx51_defconfig with 82% similarity]
arch/arm/configs/tegra_defconfig
arch/arm/mach-at91/at91cap9.c
arch/arm/mach-at91/at91cap9_devices.c
arch/arm/mach-at91/at91rm9200.c
arch/arm/mach-at91/at91rm9200_devices.c
arch/arm/mach-at91/at91sam9260.c
arch/arm/mach-at91/at91sam9260_devices.c
arch/arm/mach-at91/at91sam9261.c
arch/arm/mach-at91/at91sam9261_devices.c
arch/arm/mach-at91/at91sam9263.c
arch/arm/mach-at91/at91sam9263_devices.c
arch/arm/mach-at91/at91sam9g45.c
arch/arm/mach-at91/at91sam9g45_devices.c
arch/arm/mach-at91/include/mach/board.h
arch/arm/mach-davinci/Kconfig
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/da850.c
arch/arm/mach-davinci/include/mach/mmc.h
arch/arm/mach-davinci/include/mach/mux.h
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/clock-imx25.c
arch/arm/mach-imx/clock-imx27.c
arch/arm/mach-imx/clock-imx31.c
arch/arm/mach-imx/clock-imx35.c
arch/arm/mach-imx/cpu-imx25.c [new file with mode: 0644]
arch/arm/mach-imx/cpu-imx27.c
arch/arm/mach-imx/cpu-imx31.c
arch/arm/mach-imx/cpu-imx35.c
arch/arm/mach-imx/mach-apf9328.c
arch/arm/mach-imx/mach-armadillo5x0.c
arch/arm/mach-imx/mach-bug.c
arch/arm/mach-imx/mach-cpuimx27.c
arch/arm/mach-imx/mach-cpuimx35.c
arch/arm/mach-imx/mach-eukrea_cpuimx25.c
arch/arm/mach-imx/mach-imx27_visstrim_m10.c
arch/arm/mach-imx/mach-imx27ipcam.c
arch/arm/mach-imx/mach-imx27lite.c
arch/arm/mach-imx/mach-kzm_arm11_01.c
arch/arm/mach-imx/mach-mx1ads.c
arch/arm/mach-imx/mach-mx21ads.c
arch/arm/mach-imx/mach-mx25_3ds.c
arch/arm/mach-imx/mach-mx27_3ds.c
arch/arm/mach-imx/mach-mx27ads.c
arch/arm/mach-imx/mach-mx31_3ds.c
arch/arm/mach-imx/mach-mx31ads.c
arch/arm/mach-imx/mach-mx31lilly.c
arch/arm/mach-imx/mach-mx31lite.c
arch/arm/mach-imx/mach-mx31moboard.c
arch/arm/mach-imx/mach-mx35_3ds.c
arch/arm/mach-imx/mach-mxt_td60.c
arch/arm/mach-imx/mach-pca100.c
arch/arm/mach-imx/mach-pcm037.c
arch/arm/mach-imx/mach-pcm038.c
arch/arm/mach-imx/mach-pcm043.c
arch/arm/mach-imx/mach-qong.c
arch/arm/mach-imx/mach-scb9328.c
arch/arm/mach-imx/mach-vpr200.c
arch/arm/mach-mx5/Kconfig
arch/arm/mach-mx5/board-cpuimx51.c
arch/arm/mach-mx5/board-cpuimx51sd.c
arch/arm/mach-mx5/board-mx50_rdp.c
arch/arm/mach-mx5/board-mx51_3ds.c
arch/arm/mach-mx5/board-mx51_babbage.c
arch/arm/mach-mx5/board-mx51_efikamx.c
arch/arm/mach-mx5/board-mx51_efikasb.c
arch/arm/mach-mx5/board-mx53_ard.c
arch/arm/mach-mx5/board-mx53_evk.c
arch/arm/mach-mx5/board-mx53_loco.c
arch/arm/mach-mx5/board-mx53_smd.c
arch/arm/mach-mx5/clock-mx51-mx53.c
arch/arm/mach-mx5/cpu.c
arch/arm/mach-mx5/devices-imx53.h
arch/arm/mach-mx5/mx51_efika.c
arch/arm/mach-mxs/Kconfig
arch/arm/mach-mxs/clock-mx28.c
arch/arm/mach-mxs/devices-mx23.h
arch/arm/mach-mxs/devices-mx28.h
arch/arm/mach-mxs/devices/Kconfig
arch/arm/mach-mxs/devices/Makefile
arch/arm/mach-mxs/devices/platform-mxs-saif.c [new file with mode: 0644]
arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c [new file with mode: 0644]
arch/arm/mach-mxs/include/mach/devices-common.h
arch/arm/mach-mxs/mach-mx23evk.c
arch/arm/mach-mxs/mach-mx28evk.c
arch/arm/mach-mxs/mach-stmp378x_devb.c
arch/arm/mach-mxs/mach-tx28.c
arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/Makefile.boot
arch/arm/mach-tegra/board-dt.c
arch/arm/mach-tegra/board-harmony-pinmux.c
arch/arm/mach-tegra/board-harmony-power.c
arch/arm/mach-tegra/board-paz00-pinmux.c
arch/arm/mach-tegra/board-seaboard-pinmux.c
arch/arm/mach-tegra/board-trimslice-pinmux.c
arch/arm/mach-tegra/devices.c
arch/arm/mach-tegra/devices.h
arch/arm/mach-tegra/include/mach/pinmux.h
arch/arm/mach-tegra/pinmux-t2-tables.c
arch/arm/mach-tegra/pinmux.c
arch/arm/plat-mxc/Kconfig
arch/arm/plat-mxc/avic.c
arch/arm/plat-mxc/cpu.c
arch/arm/plat-mxc/include/mach/common.h
arch/arm/plat-mxc/include/mach/entry-macro.S
arch/arm/plat-mxc/include/mach/iomux-mx3.h
arch/arm/plat-mxc/include/mach/mx25.h
arch/arm/plat-mxc/include/mach/mx3x.h
arch/arm/plat-mxc/irq-common.c
arch/arm/plat-mxc/irq-common.h
arch/arm/plat-mxc/pwm.c
arch/arm/plat-mxc/tzic.c
drivers/gpio/gpio-tegra.c
drivers/mmc/host/davinci_mmc.c
drivers/usb/host/ohci-at91.c

diff --git a/Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt b/Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt
new file mode 100644 (file)
index 0000000..36f82db
--- /dev/null
@@ -0,0 +1,5 @@
+NVIDIA Tegra 2 pinmux controller
+
+Required properties:
+- compatible : "nvidia,tegra20-pinmux"
+
index 611c98d..bcc0670 100644 (file)
@@ -417,6 +417,7 @@ config ARCH_MXC
        select CLKSRC_MMIO
        select GENERIC_IRQ_CHIP
        select HAVE_SCHED_CLOCK
+       select MULTI_IRQ_HANDLER
        help
          Support for Freescale MXC/iMX-based family of processors
 
index a5aac16..30b9201 100644 (file)
@@ -157,9 +157,7 @@ machine-$(CONFIG_ARCH_LPC32XX)              := lpc32xx
 machine-$(CONFIG_ARCH_MMP)             := mmp
 machine-$(CONFIG_ARCH_MSM)             := msm
 machine-$(CONFIG_ARCH_MV78XX0)         := mv78xx0
-machine-$(CONFIG_ARCH_MX1)             := imx
-machine-$(CONFIG_ARCH_MX2)             := imx
-machine-$(CONFIG_ARCH_MX25)            := imx
+machine-$(CONFIG_ARCH_IMX_V4_V5)       := imx
 machine-$(CONFIG_ARCH_MX3)             := imx
 machine-$(CONFIG_ARCH_MX5)             := mx5
 machine-$(CONFIG_ARCH_MXS)             := mxs
diff --git a/arch/arm/boot/dts/tegra-ventana.dts b/arch/arm/boot/dts/tegra-ventana.dts
new file mode 100644 (file)
index 0000000..9b29a62
--- /dev/null
@@ -0,0 +1,32 @@
+/dts-v1/;
+
+/memreserve/ 0x1c000000 0x04000000;
+/include/ "tegra20.dtsi"
+
+/ {
+       model = "NVIDIA Tegra2 Ventana evaluation board";
+       compatible = "nvidia,ventana", "nvidia,tegra20";
+
+       chosen {
+               bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/ram rdinit=/sbin/init";
+       };
+
+       memory {
+               reg = < 0x00000000 0x40000000 >;
+       };
+
+       serial@70006300 {
+               clock-frequency = < 216000000 >;
+       };
+
+       sdhci@c8000400 {
+               cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+               wp-gpios = <&gpio 57 0>; /* gpio PH1 */
+               power-gpios = <&gpio 155 0>; /* gpio PT3 */
+       };
+
+       sdhci@c8000600 {
+               power-gpios = <&gpio 70 0>; /* gpio PI6 */
+               support-8bit;
+       };
+};
index 5727595..65d7e6a 100644 (file)
                gpio-controller;
        };
 
+       pinmux: pinmux@70000000 {
+               compatible = "nvidia,tegra20-pinmux";
+               reg = < 0x70000014 0x10    /* Tri-state registers */
+                       0x70000080 0x20    /* Mux registers */
+                       0x700000a0 0x14    /* Pull-up/down registers */
+                       0x70000868 0xa8 >; /* Pad control registers */
+       };
+
        serial@70006000 {
                compatible = "nvidia,tegra20-uart";
                reg = <0x70006000 0x40>;
similarity index 69%
rename from arch/arm/configs/mx27_defconfig
rename to arch/arm/configs/imx_v4_v5_defconfig
index 9ad4c65..11a4192 100644 (file)
@@ -3,9 +3,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_EXPERT=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
 # CONFIG_COMPAT_BRK is not set
 CONFIG_SLAB=y
 CONFIG_PROFILING=y
@@ -17,8 +15,12 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
 CONFIG_ARCH_MXC=y
-CONFIG_ARCH_MX2=y
-CONFIG_MACH_MX27=y
+CONFIG_ARCH_IMX_V4_V5=y
+CONFIG_ARCH_MX1ADS=y
+CONFIG_MACH_SCB9328=y
+CONFIG_MACH_MX21ADS=y
+CONFIG_MACH_MX25_3DS=y
+CONFIG_MACH_EUKREA_CPUIMX25=y
 CONFIG_MACH_MX27ADS=y
 CONFIG_MACH_PCM038=y
 CONFIG_MACH_CPUIMX27=y
@@ -29,6 +31,7 @@ CONFIG_MACH_IMX27_VISSTRIM_M10=y
 CONFIG_MACH_IMX27LITE=y
 CONFIG_MACH_PCA100=y
 CONFIG_MACH_MXT_TD60=y
+CONFIG_MACH_IMX27IPCAM=y
 CONFIG_MXC_IRQ_PRIOR=y
 CONFIG_MXC_PWM=y
 CONFIG_NO_HZ=y
@@ -39,7 +42,6 @@ CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_FPE_NWFPE=y
 CONFIG_FPE_NWFPE_XP=y
-CONFIG_PM=y
 CONFIG_PM_DEBUG=y
 CONFIG_NET=y
 CONFIG_PACKET=y
@@ -55,8 +57,9 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
@@ -69,12 +72,15 @@ CONFIG_MTD_CFI_GEOMETRY=y
 CONFIG_MTD_CFI_INTELEXT=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_MXC=y
 CONFIG_MTD_UBI=y
+CONFIG_MISC_DEVICES=y
 CONFIG_EEPROM_AT24=y
+CONFIG_EEPROM_AT25=y
 CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
-CONFIG_FEC=y
+CONFIG_SMC91X=y
+CONFIG_DM9000=y
+CONFIG_SMC911X=y
 # CONFIG_NETDEV_1000 is not set
 # CONFIG_NETDEV_10000 is not set
 # CONFIG_INPUT_MOUSEDEV is not set
@@ -84,10 +90,10 @@ CONFIG_INPUT_EVDEV=y
 CONFIG_INPUT_TOUCHSCREEN=y
 CONFIG_TOUCHSCREEN_ADS7846=m
 # CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
 CONFIG_SERIAL_8250=m
 CONFIG_SERIAL_IMX=y
 CONFIG_SERIAL_IMX_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
 # CONFIG_HW_RANDOM is not set
 CONFIG_I2C=y
 CONFIG_I2C_CHARDEV=y
@@ -98,19 +104,56 @@ CONFIG_W1=y
 CONFIG_W1_MASTER_MXC=y
 CONFIG_W1_SLAVE_THERM=y
 # CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_IMX2_WDT=y
+CONFIG_MFD_MC13XXX=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_MC13783=y
+CONFIG_REGULATOR_MC13892=y
 CONFIG_FB=y
 CONFIG_FB_IMX=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_PWM=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FONTS=y
 CONFIG_FONT_8x8=y
-# CONFIG_HID_SUPPORT is not set
-CONFIG_USB=m
+CONFIG_LOGO=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
+CONFIG_SND_SOC=y
+CONFIG_SND_IMX_SOC=y
+CONFIG_SND_SOC_MX27VIS_AIC32X4=y
+CONFIG_SND_SOC_PHYCORE_AC97=y
+CONFIG_SND_SOC_EUKREA_TLV320=y
+CONFIG_USB_HID=m
+CONFIG_USB=y
 # CONFIG_USB_DEVICE_CLASS is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_MXC=y
 CONFIG_USB_ULPI=y
 CONFIG_MMC=y
 CONFIG_MMC_MXC=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_MC13783=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_PCF8563=y
+CONFIG_RTC_DRV_IMXDI=y
+CONFIG_RTC_MXC=y
+CONFIG_DMADEVICES=y
+CONFIG_IMX_SDMA=y
+CONFIG_IMX_DMA=y
+# CONFIG_IOMMU_SUPPORT is not set
 # CONFIG_DNOTIFY is not set
 # CONFIG_PROC_PAGE_MONITOR is not set
 CONFIG_TMPFS=y
@@ -119,12 +162,9 @@ CONFIG_UBIFS_FS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 CONFIG_ROOT_NFS=y
-CONFIG_NLS=y
 CONFIG_NLS_CODEPAGE_437=m
 CONFIG_NLS_CODEPAGE_850=m
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_ISO8859_15=m
-CONFIG_DEBUG_FS=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_SYSCTL_SYSCALL_CHECK=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
diff --git a/arch/arm/configs/mx1_defconfig b/arch/arm/configs/mx1_defconfig
deleted file mode 100644 (file)
index c9436d0..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-CONFIG_EXPERIMENTAL=y
-CONFIG_SYSVIPC=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_SYSFS_DEPRECATED_V2=y
-CONFIG_EXPERT=y
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODVERSIONS=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_ARCH_MXC=y
-CONFIG_ARCH_MX1=y
-CONFIG_ARCH_MX1ADS=y
-CONFIG_MACH_SCB9328=y
-CONFIG_MACH_APF9328=y
-CONFIG_MXC_IRQ_PRIOR=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_PREEMPT=y
-CONFIG_AEABI=y
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw ip=off"
-CONFIG_PM=y
-CONFIG_PM_DEBUG=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_FW_LOADER=m
-CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_PHYSMAP=y
-# CONFIG_BLK_DEV is not set
-# CONFIG_MISC_DEVICES is not set
-CONFIG_NETDEVICES=y
-CONFIG_PHYLIB=y
-CONFIG_SMSC_PHY=y
-CONFIG_NET_ETHERNET=y
-CONFIG_DM9000=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_INPUT is not set
-# CONFIG_SERIO is not set
-# CONFIG_VT is not set
-CONFIG_SERIAL_IMX=y
-CONFIG_SERIAL_IMX_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_IMX=y
-CONFIG_W1=y
-CONFIG_W1_MASTER_MXC=y
-CONFIG_W1_SLAVE_THERM=y
-# CONFIG_HWMON is not set
-CONFIG_FB=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_IMX=y
-CONFIG_USB_ETH=m
-CONFIG_MMC=y
-CONFIG_MMC_MXC=y
-# CONFIG_DNOTIFY is not set
-CONFIG_INOTIFY=y
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V4=y
-CONFIG_ROOT_NFS=y
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
diff --git a/arch/arm/configs/mx21_defconfig b/arch/arm/configs/mx21_defconfig
deleted file mode 100644 (file)
index 411f88d..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-CONFIG_EXPERIMENTAL=y
-# CONFIG_SWAP is not set
-CONFIG_SYSVIPC=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_SYSFS_DEPRECATED_V2=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EXPERT=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARCH_MXC=y
-CONFIG_ARCH_MX2=y
-CONFIG_MACH_MX21ADS=y
-CONFIG_MXC_PWM=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_PREEMPT=y
-CONFIG_AEABI=y
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_NET=y
-CONFIG_INET=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_FW_LOADER is not set
-CONFIG_MTD=y
-CONFIG_MTD_DEBUG=y
-CONFIG_MTD_DEBUG_VERBOSE=3
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_GEOMETRY=y
-# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_MXC=y
-CONFIG_NETDEVICES=y
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_SERIO is not set
-# CONFIG_CONSOLE_TRANSLATIONS is not set
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=1
-CONFIG_SERIAL_IMX=y
-CONFIG_SERIAL_IMX_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_IMX=y
-CONFIG_SPI=y
-# CONFIG_HWMON is not set
-CONFIG_FB=y
-CONFIG_FB_IMX=y
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x8=y
-CONFIG_LOGO=y
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_USB_SUPPORT is not set
-CONFIG_MMC=y
-CONFIG_MMC_MXC=y
-# CONFIG_DNOTIFY is not set
-CONFIG_MSDOS_FS=y
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_ROOT_NFS=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
similarity index 82%
rename from arch/arm/configs/mx51_defconfig
rename to arch/arm/configs/mx5_defconfig
index 88c5802..d0d8dfe 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_EXPERIMENTAL=y
 # CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_KERNEL_LZO=y
 CONFIG_SYSVIPC=y
 CONFIG_LOG_BUF_SHIFT=18
 CONFIG_RELAY=y
@@ -13,21 +14,29 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 # CONFIG_LBDAF is not set
 # CONFIG_BLK_DEV_BSG is not set
 CONFIG_ARCH_MXC=y
-CONFIG_ARCH_MX51=y
+CONFIG_ARCH_MX5=y
 CONFIG_MACH_MX51_BABBAGE=y
 CONFIG_MACH_MX51_3DS=y
 CONFIG_MACH_EUKREA_CPUIMX51=y
+CONFIG_MACH_EUKREA_CPUIMX51SD=y
+CONFIG_MACH_MX51_EFIKAMX=y
+CONFIG_MACH_MX51_EFIKASB=y
+CONFIG_MACH_MX53_EVK=y
+CONFIG_MACH_MX53_SMD=y
+CONFIG_MACH_MX53_LOCO=y
+CONFIG_MACH_MX53_ARD=y
+CONFIG_MXC_PWM=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_VMSPLIT_2G=y
 CONFIG_PREEMPT_VOLUNTARY=y
 CONFIG_AEABI=y
 # CONFIG_OABI_COMPAT is not set
 CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
-CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.101:/shared/nfs ip=dhcp"
+CONFIG_CMDLINE="noinitrd console=ttymxc0,115200"
 CONFIG_VFP=y
 CONFIG_NEON=y
 CONFIG_BINFMT_MISC=m
-CONFIG_PM=y
 CONFIG_PM_DEBUG=y
 CONFIG_PM_TEST_SUSPEND=y
 CONFIG_NET=y
@@ -42,13 +51,13 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_LRO is not set
 # CONFIG_IPV6 is not set
 # CONFIG_WIRELESS is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_STANDALONE is not set
 CONFIG_CONNECTOR=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=65536
-# CONFIG_MISC_DEVICES is not set
-CONFIG_SCSI=y
 # CONFIG_SCSI_PROC_FS is not set
 CONFIG_BLK_DEV_SD=y
 CONFIG_SCSI_MULTI_LUN=y
@@ -56,8 +65,10 @@ CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
 CONFIG_SCSI_SCAN_ASYNC=y
 # CONFIG_SCSI_LOWLEVEL is not set
-CONFIG_ATA=m
+CONFIG_ATA=y
+CONFIG_PATA_IMX=y
 CONFIG_NETDEVICES=y
+CONFIG_MII=m
 CONFIG_MARVELL_PHY=y
 CONFIG_DAVICOM_PHY=y
 CONFIG_QSEMI_PHY=y
@@ -71,49 +82,57 @@ CONFIG_REALTEK_PHY=y
 CONFIG_NATIONAL_PHY=y
 CONFIG_STE10XP=y
 CONFIG_LSI_ET1011C_PHY=y
-CONFIG_MDIO_BITBANG=y
-CONFIG_MDIO_GPIO=y
+CONFIG_MICREL_PHY=y
 CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-CONFIG_FEC=y
 # CONFIG_NETDEV_1000 is not set
 # CONFIG_NETDEV_10000 is not set
 # CONFIG_WLAN is not set
-CONFIG_INPUT_FF_MEMLESS=m
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_EVDEV=y
-CONFIG_KEYBOARD_GPIO=y
 CONFIG_INPUT_EVBUG=m
+CONFIG_KEYBOARD_GPIO=y
 CONFIG_MOUSE_PS2=m
 CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_MMA8450=y
 CONFIG_SERIO_SERPORT=m
 CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_LEGACY_PTYS is not set
 # CONFIG_DEVKMEM is not set
 CONFIG_SERIAL_IMX=y
 CONFIG_SERIAL_IMX_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
 CONFIG_HW_RANDOM=y
 CONFIG_I2C=y
 # CONFIG_I2C_COMPAT is not set
-CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_CHARDEV=y
 # CONFIG_I2C_HELPER_AUTO is not set
 CONFIG_I2C_ALGOBIT=m
 CONFIG_I2C_ALGOPCF=m
 CONFIG_I2C_ALGOPCA=m
+CONFIG_I2C_IMX=y
+CONFIG_SPI=y
+CONFIG_SPI_IMX=y
 CONFIG_GPIO_SYSFS=y
 # CONFIG_HWMON is not set
-# CONFIG_HID_SUPPORT is not set
+CONFIG_WATCHDOG=y
+CONFIG_IMX2_WDT=y
+CONFIG_MFD_MC13XXX=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_MC13892=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_MXC=y
 CONFIG_USB_STORAGE=y
 CONFIG_MMC=y
 CONFIG_MMC_BLOCK=m
-CONFIG_MMC_SDHCI=m
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_ESDHC_IMX=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+CONFIG_RTC_MXC=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
@@ -127,7 +146,6 @@ CONFIG_EXT4_FS_SECURITY=y
 CONFIG_QUOTA=y
 CONFIG_QUOTA_NETLINK_INTERFACE=y
 # CONFIG_PRINT_QUOTA_WARNING is not set
-CONFIG_AUTOFS_FS=y
 CONFIG_AUTOFS4_FS=y
 CONFIG_FUSE_FS=y
 CONFIG_ISO9660_FS=m
@@ -151,17 +169,13 @@ CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_UTF8=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_KERNEL=y
 # CONFIG_SCHED_DEBUG is not set
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 # CONFIG_FTRACE is not set
 # CONFIG_ARM_UNWIND is not set
-CONFIG_DEBUG_LL=y
-CONFIG_EARLY_PRINTK=y
 CONFIG_SECURITYFS=y
-CONFIG_CRYPTO_DEFLATE=y
-CONFIG_CRYPTO_LZO=y
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_LZO=m
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
 # CONFIG_CRYPTO_HW is not set
 CONFIG_CRC_CCITT=m
index 8845f1c..1957297 100644 (file)
@@ -25,6 +25,7 @@ CONFIG_MACH_KAEN=y
 CONFIG_MACH_PAZ00=y
 CONFIG_MACH_TRIMSLICE=y
 CONFIG_MACH_WARIO=y
+CONFIG_MACH_VENTANA=y
 CONFIG_TEGRA_DEBUG_UARTD=y
 CONFIG_ARM_ERRATA_742230=y
 CONFIG_NO_HZ=y
@@ -38,7 +39,6 @@ CONFIG_HIGHMEM=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_VFP=y
-CONFIG_PM=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -65,6 +65,7 @@ CONFIG_IPV6_TUNNEL=y
 CONFIG_IPV6_MULTIPLE_TABLES=y
 # CONFIG_WIRELESS is not set
 # CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_MISC_DEVICES=y
 CONFIG_AD525X_DPOT=y
@@ -72,34 +73,61 @@ CONFIG_AD525X_DPOT_I2C=y
 CONFIG_ICS932S401=y
 CONFIG_APDS9802ALS=y
 CONFIG_ISL29003=y
+CONFIG_SCSI=y
+CONFIG_BLK_DEV_SD=y
+# CONFIG_SCSI_LOWLEVEL is not set
 CONFIG_NETDEVICES=y
 CONFIG_DUMMY=y
+CONFIG_NET_ETHERNET=y
 CONFIG_R8169=y
 # CONFIG_NETDEV_10000 is not set
 # CONFIG_WLAN is not set
+CONFIG_USB_PEGASUS=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_SMSC75XX=y
+CONFIG_USB_NET_SMSC95XX=y
 # CONFIG_INPUT is not set
 # CONFIG_SERIO is not set
 # CONFIG_VT is not set
+# CONFIG_LEGACY_PTYS is not set
 # CONFIG_DEVKMEM is not set
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_OF_PLATFORM=y
 # CONFIG_HW_RANDOM is not set
 CONFIG_I2C=y
 # CONFIG_I2C_COMPAT is not set
 # CONFIG_I2C_HELPER_AUTO is not set
 CONFIG_I2C_TEGRA=y
+CONFIG_SPI=y
+CONFIG_SPI_TEGRA=y
 CONFIG_SENSORS_LM90=y
 CONFIG_MFD_TPS6586X=y
 CONFIG_REGULATOR=y
 CONFIG_REGULATOR_TPS6586X=y
-# CONFIG_USB_SUPPORT is not set
+CONFIG_SOUND=y
+CONFIG_SND=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_DRIVERS is not set
+# CONFIG_SND_PCI is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
+# CONFIG_SND_USB is not set
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_TEGRA=y
+CONFIG_SND_SOC_TEGRA_WM8903=y
+CONFIG_SND_SOC_TEGRA_TRIMSLICE=y
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_TEGRA=y
+CONFIG_USB_STORAGE=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_PLTFM=y
 CONFIG_MMC_SDHCI_TEGRA=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_TEGRA=y
 CONFIG_STAGING=y
-# CONFIG_STAGING_EXCLUDE_BUILD is not set
 CONFIG_IIO=y
 CONFIG_SENSORS_ISL29018=y
 CONFIG_SENSORS_AK8975=y
@@ -123,18 +151,15 @@ CONFIG_NLS_ISO8859_1=y
 CONFIG_PRINTK_TIME=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_SCHEDSTATS=y
 CONFIG_TIMER_STATS=y
 CONFIG_DEBUG_SLAB=y
 # CONFIG_DEBUG_PREEMPT is not set
 CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK_SLEEP=y
 CONFIG_DEBUG_INFO=y
 CONFIG_DEBUG_VM=y
 CONFIG_DEBUG_SG=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_DEBUG_LL=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_CRYPTO_ECB=y
index bfc6844..ecdd54d 100644 (file)
@@ -219,6 +219,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
+       /* fake hclk clock */
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
index f87f504..a4401d6 100644 (file)
@@ -80,6 +80,12 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
                        at91_set_gpio_output(data->vbus_pin[i], 0);
        }
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_data = *data;
        platform_device_register(&at91_usbh_device);
 }
index f73302d..713d3bd 100644 (file)
@@ -193,6 +193,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),
+       /* fake hclk clock */
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
index 978be95..01d8bbd 100644 (file)
@@ -60,9 +60,17 @@ static struct platform_device at91rm9200_usbh_device = {
 
 void __init at91_add_device_usbh(struct at91_usbh_data *data)
 {
+       int i;
+
        if (!data)
                return;
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_data = *data;
        platform_device_register(&at91rm9200_usbh_device);
 }
index cb397be..a9be758 100644 (file)
@@ -199,6 +199,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk),
        CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk),
+       /* fake hclk clock */
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
index 3c2b580..24b6f8c 100644 (file)
@@ -61,9 +61,17 @@ static struct platform_device at91_usbh_device = {
 
 void __init at91_add_device_usbh(struct at91_usbh_data *data)
 {
+       int i;
+
        if (!data)
                return;
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_data = *data;
        platform_device_register(&at91_usbh_device);
 }
index 6c8e3b5..658a518 100644 (file)
@@ -129,6 +129,20 @@ static struct clk lcdc_clk = {
        .type           = CLK_TYPE_PERIPHERAL,
 };
 
+/* HClocks */
+static struct clk hck0 = {
+       .name           = "hck0",
+       .pmc_mask       = AT91_PMC_HCK0,
+       .type           = CLK_TYPE_SYSTEM,
+       .id             = 0,
+};
+static struct clk hck1 = {
+       .name           = "hck1",
+       .pmc_mask       = AT91_PMC_HCK1,
+       .type           = CLK_TYPE_SYSTEM,
+       .id             = 1,
+};
+
 static struct clk *periph_clocks[] __initdata = {
        &pioA_clk,
        &pioB_clk,
@@ -161,6 +175,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &hck0),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
@@ -199,20 +214,6 @@ static struct clk pck3 = {
        .id             = 3,
 };
 
-/* HClocks */
-static struct clk hck0 = {
-       .name           = "hck0",
-       .pmc_mask       = AT91_PMC_HCK0,
-       .type           = CLK_TYPE_SYSTEM,
-       .id             = 0,
-};
-static struct clk hck1 = {
-       .name           = "hck1",
-       .pmc_mask       = AT91_PMC_HCK1,
-       .type           = CLK_TYPE_SYSTEM,
-       .id             = 1,
-};
-
 static void __init at91sam9261_register_clocks(void)
 {
        int i;
index 4e647b6..3b70b38 100644 (file)
@@ -64,9 +64,17 @@ static struct platform_device at91sam9261_usbh_device = {
 
 void __init at91_add_device_usbh(struct at91_usbh_data *data)
 {
+       int i;
+
        if (!data)
                return;
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_data = *data;
        platform_device_register(&at91sam9261_usbh_device);
 }
index 044f3c9..f83fbb0 100644 (file)
@@ -189,6 +189,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
        CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
        CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
+       /* fake hclk clock */
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
index dd7662b..3faa1fd 100644 (file)
@@ -74,6 +74,12 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
                        at91_set_gpio_output(data->vbus_pin[i], 0);
        }
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_data = *data;
        platform_device_register(&at91_usbh_device);
 }
index 00c0a78..29def90 100644 (file)
@@ -223,6 +223,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
        CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
        CLKDEV_CON_DEV_ID(NULL, "atmel-trng", &trng_clk),
+       /* fake hclk clock */
+       CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
index 2d6d57f..000b5e1 100644 (file)
@@ -124,6 +124,12 @@ void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data)
                        at91_set_gpio_output(data->vbus_pin[i], 0);
        }
 
+       /* Enable overcurrent notification */
+       for (i = 0; i < data->ports; i++) {
+               if (data->overcurrent_pin[i])
+                       at91_set_gpio_input(data->overcurrent_pin[i], 1);
+       }
+
        usbh_ohci_data = *data;
        platform_device_register(&at91_usbh_ohci_device);
 }
index ed544a0..d07767f 100644 (file)
@@ -98,6 +98,11 @@ extern void __init at91_add_device_eth(struct at91_eth_data *data);
 struct at91_usbh_data {
        u8              ports;          /* number of ports on root hub */
        u8              vbus_pin[2];    /* port power-control pin */
+       u8              vbus_pin_inverted;
+       u8              overcurrent_supported;
+       u8              overcurrent_pin[2];
+       u8              overcurrent_status[2];
+       u8              overcurrent_changed[2];
 };
 extern void __init at91_add_device_usbh(struct at91_usbh_data *data);
 extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
index c0deaca..32d837d 100644 (file)
@@ -192,6 +192,16 @@ config DA850_UI_RMII
 
 endchoice
 
+config DA850_WL12XX
+       bool "AM18x wl1271 daughter board"
+       depends on MACH_DAVINCI_DA850_EVM
+       help
+         The wl1271 daughter card for AM18x EVMs is a combo wireless
+         connectivity add-on card, based on the LS Research TiWi module with
+         Texas Instruments' wl1271 solution.
+         Say Y if you want to use a wl1271 expansion card connected to the
+         AM18x EVM.
+
 config GPIO_PCA953X
        default MACH_DAVINCI_DA850_EVM
 
index 6e41cb5..ec21663 100644 (file)
@@ -31,6 +31,8 @@
 #include <linux/input/tps6507x-ts.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/flash.h>
+#include <linux/delay.h>
+#include <linux/wl12xx.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -49,6 +51,9 @@
 #define DA850_MMCSD_CD_PIN             GPIO_TO_PIN(4, 0)
 #define DA850_MMCSD_WP_PIN             GPIO_TO_PIN(4, 1)
 
+#define DA850_WLAN_EN                  GPIO_TO_PIN(6, 9)
+#define DA850_WLAN_IRQ                 GPIO_TO_PIN(6, 10)
+
 #define DA850_MII_MDIO_CLKEN_PIN       GPIO_TO_PIN(2, 6)
 
 static struct mtd_partition da850evm_spiflash_part[] = {
@@ -1143,6 +1148,110 @@ static __init int da850_evm_init_cpufreq(void)
 static __init int da850_evm_init_cpufreq(void) { return 0; }
 #endif
 
+#ifdef CONFIG_DA850_WL12XX
+
+static void wl12xx_set_power(int index, bool power_on)
+{
+       static bool power_state;
+
+       pr_debug("Powering %s wl12xx", power_on ? "on" : "off");
+
+       if (power_on == power_state)
+               return;
+       power_state = power_on;
+
+       if (power_on) {
+               /* Power up sequence required for wl127x devices */
+               gpio_set_value(DA850_WLAN_EN, 1);
+               usleep_range(15000, 15000);
+               gpio_set_value(DA850_WLAN_EN, 0);
+               usleep_range(1000, 1000);
+               gpio_set_value(DA850_WLAN_EN, 1);
+               msleep(70);
+       } else {
+               gpio_set_value(DA850_WLAN_EN, 0);
+       }
+}
+
+static struct davinci_mmc_config da850_wl12xx_mmc_config = {
+       .set_power      = wl12xx_set_power,
+       .wires          = 4,
+       .max_freq       = 25000000,
+       .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_NONREMOVABLE |
+                         MMC_CAP_POWER_OFF_CARD,
+       .version        = MMC_CTLR_VERSION_2,
+};
+
+static const short da850_wl12xx_pins[] __initconst = {
+       DA850_MMCSD1_DAT_0, DA850_MMCSD1_DAT_1, DA850_MMCSD1_DAT_2,
+       DA850_MMCSD1_DAT_3, DA850_MMCSD1_CLK, DA850_MMCSD1_CMD,
+       DA850_GPIO6_9, DA850_GPIO6_10,
+       -1
+};
+
+static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
+       .irq                    = -1,
+       .board_ref_clock        = WL12XX_REFCLOCK_38,
+       .platform_quirks        = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
+};
+
+static __init int da850_wl12xx_init(void)
+{
+       int ret;
+
+       ret = davinci_cfg_reg_list(da850_wl12xx_pins);
+       if (ret) {
+               pr_err("wl12xx/mmc mux setup failed: %d\n", ret);
+               goto exit;
+       }
+
+       ret = da850_register_mmcsd1(&da850_wl12xx_mmc_config);
+       if (ret) {
+               pr_err("wl12xx/mmc registration failed: %d\n", ret);
+               goto exit;
+       }
+
+       ret = gpio_request_one(DA850_WLAN_EN, GPIOF_OUT_INIT_LOW, "wl12xx_en");
+       if (ret) {
+               pr_err("Could not request wl12xx enable gpio: %d\n", ret);
+               goto exit;
+       }
+
+       ret = gpio_request_one(DA850_WLAN_IRQ, GPIOF_IN, "wl12xx_irq");
+       if (ret) {
+               pr_err("Could not request wl12xx irq gpio: %d\n", ret);
+               goto free_wlan_en;
+       }
+
+       da850_wl12xx_wlan_data.irq = gpio_to_irq(DA850_WLAN_IRQ);
+
+       ret = wl12xx_set_platform_data(&da850_wl12xx_wlan_data);
+       if (ret) {
+               pr_err("Could not set wl12xx data: %d\n", ret);
+               goto free_wlan_irq;
+       }
+
+       return 0;
+
+free_wlan_irq:
+       gpio_free(DA850_WLAN_IRQ);
+
+free_wlan_en:
+       gpio_free(DA850_WLAN_EN);
+
+exit:
+       return ret;
+}
+
+#else /* CONFIG_DA850_WL12XX */
+
+static __init int da850_wl12xx_init(void)
+{
+       return 0;
+}
+
+#endif /* CONFIG_DA850_WL12XX */
+
 #define DA850EVM_SATA_REFCLKPN_RATE    (100 * 1000 * 1000)
 
 static __init void da850_evm_init(void)
@@ -1197,6 +1306,11 @@ static __init void da850_evm_init(void)
                if (ret)
                        pr_warning("da850_evm_init: mmcsd0 registration failed:"
                                        " %d\n", ret);
+
+               ret = da850_wl12xx_init();
+               if (ret)
+                       pr_warning("da850_evm_init: wl12xx initialization"
+                                  " failed: %d\n", ret);
        }
 
        davinci_serial_init(&da850_evm_uart_config);
index 4aae015..b047f87 100644 (file)
@@ -536,6 +536,13 @@ static const struct mux_config da850_pins[] = {
        MUX_CFG(DA850, MMCSD0_DAT_3,    10,     20,     15,     2,      false)
        MUX_CFG(DA850, MMCSD0_CLK,      10,     0,      15,     2,      false)
        MUX_CFG(DA850, MMCSD0_CMD,      10,     4,      15,     2,      false)
+       /* MMC/SD1 function */
+       MUX_CFG(DA850, MMCSD1_DAT_0,    18,     8,      15,     2,      false)
+       MUX_CFG(DA850, MMCSD1_DAT_1,    19,     16,     15,     2,      false)
+       MUX_CFG(DA850, MMCSD1_DAT_2,    19,     12,     15,     2,      false)
+       MUX_CFG(DA850, MMCSD1_DAT_3,    19,     8,      15,     2,      false)
+       MUX_CFG(DA850, MMCSD1_CLK,      18,     12,     15,     2,      false)
+       MUX_CFG(DA850, MMCSD1_CMD,      18,     16,     15,     2,      false)
        /* EMIF2.5/EMIFA function */
        MUX_CFG(DA850, EMA_D_7,         9,      0,      15,     1,      false)
        MUX_CFG(DA850, EMA_D_6,         9,      4,      15,     1,      false)
@@ -594,6 +601,8 @@ static const struct mux_config da850_pins[] = {
        MUX_CFG(DA850, GPIO3_13,        7,      8,      15,     8,      false)
        MUX_CFG(DA850, GPIO4_0,         10,     28,     15,     8,      false)
        MUX_CFG(DA850, GPIO4_1,         10,     24,     15,     8,      false)
+       MUX_CFG(DA850, GPIO6_9,         13,     24,     15,     8,      false)
+       MUX_CFG(DA850, GPIO6_10,        13,     20,     15,     8,      false)
        MUX_CFG(DA850, GPIO6_13,        13,     8,      15,     8,      false)
        MUX_CFG(DA850, RTC_ALARM,       0,      28,     15,     2,      false)
 #endif
index d4f1e96..5ba6b22 100644 (file)
@@ -12,6 +12,9 @@ struct davinci_mmc_config {
        /* get_cd()/get_wp() may sleep */
        int     (*get_cd)(int module);
        int     (*get_ro)(int module);
+
+       void    (*set_power)(int module, bool on);
+
        /* wires == 0 is equivalent to wires == 4 (4-bit parallel) */
        u8      wires;
 
index 5d4e0fe..a7e92fc 100644 (file)
@@ -857,6 +857,14 @@ enum davinci_da850_index {
        DA850_MMCSD0_CLK,
        DA850_MMCSD0_CMD,
 
+       /* MMC/SD1 function */
+       DA850_MMCSD1_DAT_0,
+       DA850_MMCSD1_DAT_1,
+       DA850_MMCSD1_DAT_2,
+       DA850_MMCSD1_DAT_3,
+       DA850_MMCSD1_CLK,
+       DA850_MMCSD1_CMD,
+
        /* EMIF2.5/EMIFA function */
        DA850_EMA_D_7,
        DA850_EMA_D_6,
@@ -916,6 +924,8 @@ enum davinci_da850_index {
        DA850_GPIO3_13,
        DA850_GPIO4_0,
        DA850_GPIO4_1,
+       DA850_GPIO6_9,
+       DA850_GPIO6_10,
        DA850_GPIO6_13,
        DA850_RTC_ALARM,
 };
index e9c2968..e605900 100644 (file)
@@ -5,6 +5,18 @@ config IMX_HAVE_DMA_V1
 # Some usages assume that having one of them implies not having (e.g.) ARCH_MX2.
 # To easily distinguish good and reviewed from unreviewed usages new (and IMHO
 # more sensible) names are used: SOC_IMX31 and SOC_IMX35
+config ARCH_MX1
+       bool
+
+config MACH_MX21
+       bool
+
+config ARCH_MX25
+       bool
+
+config MACH_MX27
+       bool
+
 config ARCH_MX31
        bool
 
@@ -13,6 +25,7 @@ config ARCH_MX35
 
 config SOC_IMX1
        bool
+       select ARCH_MX1
        select CPU_ARM920T
        select IMX_HAVE_DMA_V1
        select IMX_HAVE_IOMUX_V1
@@ -20,6 +33,7 @@ config SOC_IMX1
 
 config SOC_IMX21
        bool
+       select MACH_MX21
        select CPU_ARM926T
        select ARCH_MXC_AUDMUX_V1
        select IMX_HAVE_DMA_V1
@@ -28,6 +42,7 @@ config SOC_IMX21
 
 config SOC_IMX25
        bool
+       select ARCH_MX25
        select CPU_ARM926T
        select ARCH_MXC_AUDMUX_V2
        select ARCH_MXC_IOMUX_V3
@@ -35,6 +50,7 @@ config SOC_IMX25
 
 config SOC_IMX27
        bool
+       select MACH_MX27
        select CPU_ARM926T
        select ARCH_MXC_AUDMUX_V1
        select IMX_HAVE_DMA_V1
@@ -59,7 +75,7 @@ config SOC_IMX35
        select MXC_AVIC
 
 
-if ARCH_MX1
+if ARCH_IMX_V4_V5
 
 comment "MX1 platforms:"
 config MACH_MXLADS
@@ -87,30 +103,6 @@ config MACH_APF9328
        help
          Say Yes here if you are using the Armadeus APF9328 development board
 
-endif
-
-if ARCH_MX2
-
-choice
-       prompt "CPUs:"
-       default MACH_MX21
-
-config MACH_MX21
-       bool "i.MX21 support"
-       help
-         This enables support for Freescale's MX2 based i.MX21 processor.
-
-config MACH_MX27
-       bool "i.MX27 support"
-       help
-         This enables support for Freescale's MX2 based i.MX27 processor.
-
-endchoice
-
-endif
-
-if MACH_MX21
-
 comment "MX21 platforms:"
 
 config MACH_MX21ADS
@@ -124,15 +116,12 @@ config MACH_MX21ADS
          Include support for MX21ADS platform. This includes specific
          configurations for the board and its peripherals.
 
-endif
-
-if ARCH_MX25
-
 comment "MX25 platforms:"
 
 config MACH_MX25_3DS
        bool "Support MX25PDK (3DS) Platform"
        select SOC_IMX25
+       select IMX_HAVE_PLATFORM_FLEXCAN
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
        select IMX_HAVE_PLATFORM_IMX2_WDT
        select IMX_HAVE_PLATFORM_IMXDI_RTC
@@ -174,10 +163,6 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD
 
 endchoice
 
-endif
-
-if MACH_MX27
-
 comment "MX27 platforms:"
 
 config MACH_MX27ADS
@@ -486,6 +471,7 @@ config MACH_QONG
        bool "Support Dave/DENX QongEVB-LITE platform"
        select SOC_IMX31
        select IMX_HAVE_PLATFORM_IMX_UART
+       select IMX_HAVE_PLATFORM_IMX2_WDT
        help
          Include support for Dave/DENX QongEVB-LITE platform. This includes
          specific configurations for the board and its peripherals.
index 6cc8213..116d4b2 100644 (file)
@@ -3,7 +3,7 @@ obj-$(CONFIG_IMX_HAVE_DMA_V1) += dma-v1.o
 obj-$(CONFIG_SOC_IMX1) += clock-imx1.o mm-imx1.o
 obj-$(CONFIG_SOC_IMX21) += clock-imx21.o mm-imx21.o
 
-obj-$(CONFIG_SOC_IMX25) += clock-imx25.o mm-imx25.o ehci-imx25.o
+obj-$(CONFIG_SOC_IMX25) += clock-imx25.o mm-imx25.o ehci-imx25.o cpu-imx25.o
 
 obj-$(CONFIG_SOC_IMX27) += cpu-imx27.o pm-imx27.o
 obj-$(CONFIG_SOC_IMX27) += clock-imx27.o mm-imx27.o ehci-imx27.o
index e63e235..b0fec74 100644 (file)
@@ -263,6 +263,7 @@ DEFINE_CLOCK(audmux_clk, 0, CCM_CGCR1, 0, NULL, NULL, NULL);
 DEFINE_CLOCK(csi_clk,    0, CCM_CGCR1,  4, get_rate_csi, NULL,  &csi_per_clk);
 DEFINE_CLOCK(can1_clk,  0, CCM_CGCR1,  2, get_rate_ipg, NULL, NULL);
 DEFINE_CLOCK(can2_clk,  1, CCM_CGCR1,  3, get_rate_ipg, NULL, NULL);
+DEFINE_CLOCK(iim_clk,    0, CCM_CGCR1, 26, NULL, NULL, NULL);
 
 #define _REGISTER_CLOCK(d, n, c)       \
        {                               \
@@ -310,6 +311,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK("flexcan.1", NULL, can2_clk)
        /* i.mx25 has the i.mx35 type sdma */
        _REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk)
+       _REGISTER_CLOCK(NULL, "iim", iim_clk)
 };
 
 int __init mx25_clocks_init(void)
@@ -334,6 +336,10 @@ int __init mx25_clocks_init(void)
        /* Clock source for gpt is ahb_div */
        __raw_writel(__raw_readl(CRM_BASE+0x64) & ~(1 << 5), CRM_BASE + 0x64);
 
+       clk_enable(&iim_clk);
+       imx_print_silicon_rev("i.MX25", mx25_revision());
+       clk_disable(&iim_clk);
+
        mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54);
 
        return 0;
index becc92e..88fe00a 100644 (file)
@@ -751,6 +751,8 @@ int __init mx27_clocks_init(unsigned long fref)
        clk_enable(&gpio_clk);
        clk_enable(&emi_clk);
        clk_enable(&iim_clk);
+       imx_print_silicon_rev("i.MX27", mx27_revision());
+       clk_disable(&iim_clk);
 
 #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC)
        clk_enable(&uart1_clk);
index 58ea0a8..988a281 100644 (file)
@@ -611,11 +611,11 @@ int __init mx31_clocks_init(unsigned long fref)
        clk_enable(&gpt_clk);
        clk_enable(&emi_clk);
        clk_enable(&iim_clk);
+       mx31_revision();
+       clk_disable(&iim_clk);
 
        clk_enable(&serial_pll_clk);
 
-       mx31_read_cpu_rev();
-
        if (mx31_revision() >= IMX_CHIP_REVISION_2_0) {
                reg = __raw_readl(MXC_CCM_PMCR1);
                /* No PLL restart on DVFS switch; enable auto EMI handshake */
index c39f5c3..8116f11 100644 (file)
@@ -537,7 +537,8 @@ int __init mx35_clocks_init()
        __raw_writel(cgr3, CCM_BASE + CCM_CGR3);
 
        clk_enable(&iim_clk);
-       mx35_read_cpu_rev();
+       imx_print_silicon_rev("i.MX35", mx35_revision());
+       clk_disable(&iim_clk);
 
 #ifdef CONFIG_MXC_USE_EPIT
        epit_timer_init(&epit1_clk,
diff --git a/arch/arm/mach-imx/cpu-imx25.c b/arch/arm/mach-imx/cpu-imx25.c
new file mode 100644 (file)
index 0000000..6914bcb
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * MX25 CPU type detection
+ *
+ * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#include <linux/module.h>
+#include <linux/io.h>
+#include <mach/hardware.h>
+#include <mach/iim.h>
+
+static int mx25_cpu_rev = -1;
+
+static int mx25_read_cpu_rev(void)
+{
+       u32 rev;
+
+       rev = __raw_readl(MX25_IO_ADDRESS(MX25_IIM_BASE_ADDR + MXC_IIMSREV));
+       switch (rev) {
+       case 0x00:
+               return IMX_CHIP_REVISION_1_0;
+       case 0x01:
+               return IMX_CHIP_REVISION_1_1;
+       default:
+               return IMX_CHIP_REVISION_UNKNOWN;
+       }
+}
+
+int mx25_revision(void)
+{
+       if (mx25_cpu_rev == -1)
+               mx25_cpu_rev = mx25_read_cpu_rev();
+
+       return mx25_cpu_rev;
+}
+EXPORT_SYMBOL(mx25_revision);
index 3b117be..ff38e15 100644 (file)
 
 #include <mach/hardware.h>
 
-static int cpu_silicon_rev = -1;
-static int cpu_partnumber;
+static int mx27_cpu_rev = -1;
+static int mx27_cpu_partnumber;
 
 #define SYS_CHIP_ID             0x00    /* The offset of CHIP ID register */
 
-static void query_silicon_parameter(void)
+static int mx27_read_cpu_rev(void)
 {
        u32 val;
        /*
@@ -42,20 +42,18 @@ static void query_silicon_parameter(void)
        val = __raw_readl(MX27_IO_ADDRESS(MX27_SYSCTRL_BASE_ADDR
                                + SYS_CHIP_ID));
 
+       mx27_cpu_partnumber = (int)((val >> 12) & 0xFFFF);
+
        switch (val >> 28) {
        case 0:
-               cpu_silicon_rev = IMX_CHIP_REVISION_1_0;
-               break;
+               return IMX_CHIP_REVISION_1_0;
        case 1:
-               cpu_silicon_rev = IMX_CHIP_REVISION_2_0;
-               break;
+               return IMX_CHIP_REVISION_2_0;
        case 2:
-               cpu_silicon_rev = IMX_CHIP_REVISION_2_1;
-               break;
+               return IMX_CHIP_REVISION_2_1;
        default:
-               cpu_silicon_rev = IMX_CHIP_REVISION_UNKNOWN;
+               return IMX_CHIP_REVISION_UNKNOWN;
        }
-       cpu_partnumber = (int)((val >> 12) & 0xFFFF);
 }
 
 /*
@@ -65,12 +63,12 @@ static void query_silicon_parameter(void)
  */
 int mx27_revision(void)
 {
-       if (cpu_silicon_rev == -1)
-               query_silicon_parameter();
+       if (mx27_cpu_rev == -1)
+               mx27_cpu_rev = mx27_read_cpu_rev();
 
-       if (cpu_partnumber != 0x8821)
+       if (mx27_cpu_partnumber != 0x8821)
                return -EINVAL;
 
-       return cpu_silicon_rev;
+       return mx27_cpu_rev;
 }
 EXPORT_SYMBOL(mx27_revision);
index a378070..3f2345f 100644 (file)
 #include <linux/io.h>
 #include <mach/hardware.h>
 #include <mach/iim.h>
+#include <mach/common.h>
 
-unsigned int mx31_cpu_rev;
-EXPORT_SYMBOL(mx31_cpu_rev);
+static int mx31_cpu_rev = -1;
 
 static struct {
        u8 srev;
        const char *name;
-       const char *v;
        unsigned int rev;
-} mx31_cpu_type[] __initdata = {
-       { .srev = 0x00, .name = "i.MX31(L)", .v = "1.0",  .rev = IMX_CHIP_REVISION_1_0  },
-       { .srev = 0x10, .name = "i.MX31",    .v = "1.1",  .rev = IMX_CHIP_REVISION_1_1  },
-       { .srev = 0x11, .name = "i.MX31L",   .v = "1.1",  .rev = IMX_CHIP_REVISION_1_1  },
-       { .srev = 0x12, .name = "i.MX31",    .v = "1.15", .rev = IMX_CHIP_REVISION_1_1  },
-       { .srev = 0x13, .name = "i.MX31L",   .v = "1.15", .rev = IMX_CHIP_REVISION_1_1  },
-       { .srev = 0x14, .name = "i.MX31",    .v = "1.2",  .rev = IMX_CHIP_REVISION_1_2  },
-       { .srev = 0x15, .name = "i.MX31L",   .v = "1.2",  .rev = IMX_CHIP_REVISION_1_2  },
-       { .srev = 0x28, .name = "i.MX31",    .v = "2.0",  .rev = IMX_CHIP_REVISION_2_0  },
-       { .srev = 0x29, .name = "i.MX31L",   .v = "2.0",  .rev = IMX_CHIP_REVISION_2_0  },
+} mx31_cpu_type[] = {
+       { .srev = 0x00, .name = "i.MX31(L)", .rev = IMX_CHIP_REVISION_1_0 },
+       { .srev = 0x10, .name = "i.MX31",    .rev = IMX_CHIP_REVISION_1_1 },
+       { .srev = 0x11, .name = "i.MX31L",   .rev = IMX_CHIP_REVISION_1_1 },
+       { .srev = 0x12, .name = "i.MX31",    .rev = IMX_CHIP_REVISION_1_1 },
+       { .srev = 0x13, .name = "i.MX31L",   .rev = IMX_CHIP_REVISION_1_1 },
+       { .srev = 0x14, .name = "i.MX31",    .rev = IMX_CHIP_REVISION_1_2 },
+       { .srev = 0x15, .name = "i.MX31L",   .rev = IMX_CHIP_REVISION_1_2 },
+       { .srev = 0x28, .name = "i.MX31",    .rev = IMX_CHIP_REVISION_2_0 },
+       { .srev = 0x29, .name = "i.MX31L",   .rev = IMX_CHIP_REVISION_2_0 },
 };
 
-void __init mx31_read_cpu_rev(void)
+static int mx31_read_cpu_rev(void)
 {
        u32 i, srev;
 
        /* read SREV register from IIM module */
        srev = __raw_readl(MX31_IO_ADDRESS(MX31_IIM_BASE_ADDR + MXC_IIMSREV));
+       srev &= 0xff;
 
        for (i = 0; i < ARRAY_SIZE(mx31_cpu_type); i++)
                if (srev == mx31_cpu_type[i].srev) {
-                       printk(KERN_INFO
-                               "CPU identified as %s, silicon rev %s\n",
-                               mx31_cpu_type[i].name, mx31_cpu_type[i].v);
-
-                       mx31_cpu_rev = mx31_cpu_type[i].rev;
-                       return;
+                       imx_print_silicon_rev(mx31_cpu_type[i].name,
+                                               mx31_cpu_type[i].rev);
+                       return mx31_cpu_type[i].rev;
                }
 
-       mx31_cpu_rev = IMX_CHIP_REVISION_UNKNOWN;
+       imx_print_silicon_rev("i.MX31", IMX_CHIP_REVISION_UNKNOWN);
+       return IMX_CHIP_REVISION_UNKNOWN;
+}
+
+int mx31_revision(void)
+{
+       if (mx31_cpu_rev == -1)
+               mx31_cpu_rev = mx31_read_cpu_rev();
 
-       printk(KERN_WARNING "Unknown CPU identifier. srev = %02x\n", srev);
+       return mx31_cpu_rev;
 }
+EXPORT_SYMBOL(mx31_revision);
index 6637cd8..846e46e 100644 (file)
 #include <mach/hardware.h>
 #include <mach/iim.h>
 
-unsigned int mx35_cpu_rev;
-EXPORT_SYMBOL(mx35_cpu_rev);
+static int mx35_cpu_rev = -1;
 
-void __init mx35_read_cpu_rev(void)
+static int mx35_read_cpu_rev(void)
 {
        u32 rev;
-       char *srev;
 
        rev = __raw_readl(MX35_IO_ADDRESS(MX35_IIM_BASE_ADDR + MXC_IIMSREV));
        switch (rev) {
        case 0x00:
-               mx35_cpu_rev = IMX_CHIP_REVISION_1_0;
-               srev = "1.0";
-               break;
+               return IMX_CHIP_REVISION_1_0;
        case 0x10:
-               mx35_cpu_rev = IMX_CHIP_REVISION_2_0;
-               srev = "2.0";
-               break;
+               return IMX_CHIP_REVISION_2_0;
        case 0x11:
-               mx35_cpu_rev = IMX_CHIP_REVISION_2_1;
-               srev = "2.1";
-               break;
+               return IMX_CHIP_REVISION_2_1;
        default:
-               mx35_cpu_rev = IMX_CHIP_REVISION_UNKNOWN;
-               srev = "unknown";
+               return IMX_CHIP_REVISION_UNKNOWN;
        }
+}
+
+int mx35_revision(void)
+{
+       if (mx35_cpu_rev == -1)
+               mx35_cpu_rev = mx35_read_cpu_rev();
 
-       printk(KERN_INFO "CPU identified as i.MX35, silicon rev %s\n", srev);
+       return mx35_cpu_rev;
 }
+EXPORT_SYMBOL(mx35_revision);
index a404c89..1e486e6 100644 (file)
@@ -136,6 +136,7 @@ MACHINE_START(APF9328, "Armadeus APF9328")
        .map_io       = mx1_map_io,
        .init_early   = imx1_init_early,
        .init_irq     = mx1_init_irq,
+       .handle_irq   = imx1_handle_irq,
        .timer        = &apf9328_timer,
        .init_machine = apf9328_init,
 MACHINE_END
index fa2b97d..c9a9cf6 100644 (file)
@@ -558,6 +558,7 @@ MACHINE_START(ARMADILLO5X0, "Armadillo-500")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &armadillo5x0_timer,
        .init_machine = armadillo5x0_init,
 MACHINE_END
index f494705..313f62d 100644 (file)
@@ -62,6 +62,7 @@ MACHINE_START(BUG, "BugLabs BUGBase")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &bug_timer,
        .init_machine = bug_board_init,
 MACHINE_END
index b1ec2cf..edb3730 100644 (file)
@@ -315,6 +315,7 @@ MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &eukrea_cpuimx27_timer,
        .init_machine = eukrea_cpuimx27_init,
 MACHINE_END
index ea6c9c3..66af2e8 100644 (file)
@@ -198,6 +198,7 @@ MACHINE_START(EUKREA_CPUIMX35SD, "Eukrea CPUIMX35")
        .map_io = mx35_map_io,
        .init_early = imx35_init_early,
        .init_irq = mx35_init_irq,
+       .handle_irq = imx35_handle_irq,
        .timer = &eukrea_cpuimx35_timer,
        .init_machine = eukrea_cpuimx35_init,
 MACHINE_END
index 9163318..ab8fbcc 100644 (file)
@@ -167,6 +167,7 @@ MACHINE_START(EUKREA_CPUIMX25SD, "Eukrea CPUIMX25")
        .map_io = mx25_map_io,
        .init_early = imx25_init_early,
        .init_irq = mx25_init_irq,
+       .handle_irq = imx25_handle_irq,
        .timer = &eukrea_cpuimx25_timer,
        .init_machine = eukrea_cpuimx25_init,
 MACHINE_END
index 22306ce..38eb9e4 100644 (file)
@@ -279,6 +279,7 @@ MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &visstrim_m10_timer,
        .init_machine = visstrim_m10_board_init,
 MACHINE_END
index 8da48b3..7052155 100644 (file)
@@ -75,6 +75,7 @@ MACHINE_START(IMX27IPCAM, "Freescale IMX27IPCAM")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &mx27ipcam_timer,
        .init_machine = mx27ipcam_init,
 MACHINE_END
index 21a14a2..8d6a635 100644 (file)
@@ -81,6 +81,7 @@ MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &mx27lite_timer,
        .init_machine = mx27lite_init,
 MACHINE_END
index 4e030ac..5f37f89 100644 (file)
@@ -276,6 +276,7 @@ MACHINE_START(KZM_ARM11_01, "Kyoto Microcomputer Co., Ltd. KZM-ARM11-01")
        .map_io = kzm_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &kzm_timer,
        .init_machine = kzm_board_init,
 MACHINE_END
index b4a5e03..fc49785 100644 (file)
@@ -144,6 +144,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS")
        .map_io = mx1_map_io,
        .init_early = imx1_init_early,
        .init_irq = mx1_init_irq,
+       .handle_irq = imx1_handle_irq,
        .timer = &mx1ads_timer,
        .init_machine = mx1ads_init,
 MACHINE_END
@@ -153,6 +154,7 @@ MACHINE_START(MXLADS, "Freescale MXLADS")
        .map_io = mx1_map_io,
        .init_early = imx1_init_early,
        .init_irq = mx1_init_irq,
+       .handle_irq = imx1_handle_irq,
        .timer = &mx1ads_timer,
        .init_machine = mx1ads_init,
 MACHINE_END
index e56828d..25f8402 100644 (file)
@@ -309,6 +309,7 @@ MACHINE_START(MX21ADS, "Freescale i.MX21ADS")
        .map_io = mx21ads_map_io,
        .init_early = imx21_init_early,
        .init_irq = mx21_init_irq,
+       .handle_irq = imx21_handle_irq,
        .timer = &mx21ads_timer,
        .init_machine = mx21ads_board_init,
 MACHINE_END
index dd25ee8..88dccf1 100644 (file)
@@ -43,6 +43,8 @@
 
 #include "devices-imx25.h"
 
+#define MX25PDK_CAN_PWDN       IMX_GPIO_NR(4, 6)
+
 static const struct imxuart_platform_data uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
@@ -108,6 +110,11 @@ static iomux_v3_cfg_t mx25pdk_pads[] = {
        /* I2C1 */
        MX25_PAD_I2C1_CLK__I2C1_CLK,
        MX25_PAD_I2C1_DAT__I2C1_DAT,
+
+       /* CAN1 */
+       MX25_PAD_GPIO_A__CAN1_TX,
+       MX25_PAD_GPIO_B__CAN1_RX,
+       MX25_PAD_D14__GPIO_4_6, /* CAN_PWDN */
 };
 
 static const struct fec_platform_data mx25_fec_pdata __initconst = {
@@ -240,6 +247,9 @@ static void __init mx25pdk_init(void)
 
        imx25_add_sdhci_esdhc_imx(0, &mx25pdk_esdhc_pdata);
        imx25_add_imx_i2c0(&mx25_3ds_i2c0_data);
+
+       gpio_request_one(MX25PDK_CAN_PWDN, GPIOF_OUT_INIT_LOW, "can-pwdn");
+       imx25_add_flexcan0(NULL);
 }
 
 static void __init mx25pdk_timer_init(void)
@@ -257,6 +267,7 @@ MACHINE_START(MX25_3DS, "Freescale MX25PDK (3DS)")
        .map_io = mx25_map_io,
        .init_early = imx25_init_early,
        .init_irq = mx25_init_irq,
+       .handle_irq = imx25_handle_irq,
        .timer = &mx25pdk_timer,
        .init_machine = mx25pdk_init,
 MACHINE_END
index 04bc86d..cfa8417 100644 (file)
@@ -423,6 +423,7 @@ MACHINE_START(MX27_3DS, "Freescale MX27PDK")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &mx27pdk_timer,
        .init_machine = mx27pdk_init,
 MACHINE_END
index 635b050..74dd573 100644 (file)
@@ -348,6 +348,7 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS")
        .map_io = mx27ads_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &mx27ads_timer,
        .init_machine = mx27ads_board_init,
 MACHINE_END
index 0de4d18..60f1fda 100644 (file)
@@ -766,6 +766,7 @@ MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &mx31_3ds_timer,
        .init_machine = mx31_3ds_init,
        .reserve = mx31_3ds_reserve,
index 910c456..9cc1a49 100644 (file)
@@ -539,6 +539,7 @@ MACHINE_START(MX31ADS, "Freescale MX31ADS")
        .map_io = mx31ads_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31ads_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &mx31ads_timer,
        .init_machine = mx31ads_init,
 MACHINE_END
index e92eaf9..5defd8e 100644 (file)
@@ -299,6 +299,7 @@ MACHINE_START(LILLY1131, "INCO startec LILLY-1131")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &mx31lilly_timer,
        .init_machine = mx31lilly_board_init,
 MACHINE_END
index 5242cb7..c97c26d 100644 (file)
@@ -284,6 +284,7 @@ MACHINE_START(MX31LITE, "LogicPD i.MX31 SOM")
        .map_io = mx31lite_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &mx31lite_timer,
        .init_machine = mx31lite_init,
 MACHINE_END
index 1d01ef2..fff7791 100644 (file)
@@ -28,6 +28,9 @@
 #include <linux/spi/spi.h>
 #include <linux/types.h>
 #include <linux/memblock.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/err.h>
 
 #include <linux/usb/otg.h>
 #include <linux/usb/ulpi.h>
@@ -490,6 +493,18 @@ err:
 
 }
 
+static void mx31moboard_poweroff(void)
+{
+       struct clk *clk = clk_get_sys("imx2-wdt.0", NULL);
+
+       if (!IS_ERR(clk))
+               clk_enable(clk);
+
+       mxc_iomux_mode(MX31_PIN_WATCHDOG_RST__WATCHDOG_RST);
+
+       __raw_writew(1 << 6 | 1 << 2, MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
+}
+
 static int mx31moboard_baseboard;
 core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444);
 
@@ -528,6 +543,8 @@ static void __init mx31moboard_init(void)
 
        moboard_usbh2_init();
 
+       pm_power_off = mx31moboard_poweroff;
+
        switch (mx31moboard_baseboard) {
        case MX31NOBOARD:
                break;
@@ -572,6 +589,7 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &mx31moboard_timer,
        .init_machine = mx31moboard_init,
 MACHINE_END
index f2a873d..7a46202 100644 (file)
@@ -221,6 +221,7 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK")
        .map_io = mx35_map_io,
        .init_early = imx35_init_early,
        .init_irq = mx35_init_irq,
+       .handle_irq = imx35_handle_irq,
        .timer = &mx35pdk_timer,
        .init_machine = mx35_3ds_init,
 MACHINE_END
index 5ec3989..125c196 100644 (file)
@@ -271,6 +271,7 @@ MACHINE_START(MXT_TD60, "Maxtrack i-MXT TD60")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &mxt_td60_timer,
        .init_machine = mxt_td60_board_init,
 MACHINE_END
index 0f6bd11..26072f4 100644 (file)
@@ -439,6 +439,7 @@ MACHINE_START(PCA100, "phyCARD-i.MX27")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .init_machine = pca100_init,
        .timer = &pca100_timer,
 MACHINE_END
index 186d4eb..efd6b53 100644 (file)
@@ -693,6 +693,7 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &pcm037_timer,
        .init_machine = pcm037_init,
 MACHINE_END
index a497a29..100bc73 100644 (file)
@@ -355,6 +355,7 @@ MACHINE_START(PCM038, "phyCORE-i.MX27")
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
+       .handle_irq = imx27_handle_irq,
        .timer = &pcm038_timer,
        .init_machine = pcm038_init,
 MACHINE_END
index 0a4d31d..7366c2a 100644 (file)
@@ -422,6 +422,7 @@ MACHINE_START(PCM043, "Phytec Phycore pcm043")
        .map_io = mx35_map_io,
        .init_early = imx35_init_early,
        .init_irq = mx35_init_irq,
+       .handle_irq = imx35_handle_irq,
        .timer = &pcm043_timer,
        .init_machine = pcm043_init,
 MACHINE_END
index c33ab00..4ff5faf 100644 (file)
@@ -252,6 +252,7 @@ static void __init qong_init(void)
        mxc_init_imx_uart();
        qong_init_nor_mtd();
        qong_init_fpga();
+       imx31_add_imx2_wdt(NULL);
 }
 
 static void __init qong_timer_init(void)
@@ -269,6 +270,7 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-LITE")
        .map_io = mx31_map_io,
        .init_early = imx31_init_early,
        .init_irq = mx31_init_irq,
+       .handle_irq = imx31_handle_irq,
        .timer = &qong_timer,
        .init_machine = qong_init,
 MACHINE_END
index 85d3284..bb6e5b2 100644 (file)
@@ -141,6 +141,7 @@ MACHINE_START(SCB9328, "Synertronixx scb9328")
        .map_io = mx1_map_io,
        .init_early = imx1_init_early,
        .init_irq = mx1_init_irq,
+       .handle_irq = imx1_handle_irq,
        .timer = &scb9328_timer,
        .init_machine = scb9328_init,
 MACHINE_END
index 5250283..6909245 100644 (file)
@@ -319,6 +319,7 @@ MACHINE_START(VPR200, "VPR200")
        .map_io = mx35_map_io,
        .init_early = imx35_init_early,
        .init_irq = mx35_init_irq,
+       .handle_irq = imx35_handle_irq,
        .timer = &vpr200_timer,
        .init_machine = vpr200_board_init,
 MACHINE_END
index 5e42c73..3d4c313 100644 (file)
@@ -1,8 +1,9 @@
-if ARCH_MX503 || ARCH_MX51
+if ARCH_MX5
+
 # ARCH_MX5/50/53 are left to mark places where prevent multi-soc in single
 # image. So for most time, SOC_IMX50/51/53 should be used.
 
-config ARCH_MX5
+config ARCH_MX51
        bool
 
 config ARCH_MX50
@@ -19,7 +20,6 @@ config SOC_IMX50
        select ARCH_MXC_IOMUX_V3
        select ARCH_MXC_AUDMUX_V2
        select ARCH_HAS_CPUFREQ
-       select ARCH_MX5
        select ARCH_MX50
 
 config SOC_IMX51
@@ -30,7 +30,7 @@ config        SOC_IMX51
        select ARCH_MXC_IOMUX_V3
        select ARCH_MXC_AUDMUX_V2
        select ARCH_HAS_CPUFREQ
-       select ARCH_MX5
+       select ARCH_MX51
 
 config SOC_IMX53
        bool
@@ -38,10 +38,8 @@ config       SOC_IMX53
        select ARM_L1_CACHE_SHIFT_6
        select MXC_TZIC
        select ARCH_MXC_IOMUX_V3
-       select ARCH_MX5
        select ARCH_MX53
 
-if ARCH_MX50_SUPPORTED
 #comment "i.MX50 machines:"
 
 config MACH_MX50_RDP
@@ -56,9 +54,6 @@ config MACH_MX50_RDP
          Include support for MX50 reference design platform (RDP) board. This
          includes specific configurations for the board and its peripherals.
 
-endif # ARCH_MX50_SUPPORTED
-
-if ARCH_MX51
 comment "i.MX51 machines:"
 
 config MACH_MX51_BABBAGE
@@ -174,9 +169,6 @@ config MACH_MX51_EFIKASB
          Include support for Genesi Efika Smartbook. This includes specific
          configurations for the board and its peripherals.
 
-endif # ARCH_MX51
-
-if ARCH_MX53_SUPPORTED
 comment "i.MX53 machines:"
 
 config MACH_MX53_EVK
@@ -228,6 +220,4 @@ config MACH_MX53_ARD
          Include support for MX53 ARD platform. This includes specific
          configurations for the board and its peripherals.
 
-endif # ARCH_MX53_SUPPORTED
-
 endif
index 190a6e7..1fc1103 100644 (file)
@@ -294,6 +294,7 @@ MACHINE_START(EUKREA_CPUIMX51, "Eukrea CPUIMX51 Module")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .timer = &mxc_timer,
        .init_machine = eukrea_cpuimx51_init,
 MACHINE_END
index 72410d2..52a11c1 100644 (file)
@@ -332,6 +332,7 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .timer = &mxc_timer,
        .init_machine = eukrea_cpuimx51sd_init,
 MACHINE_END
index 7de25c6..fc3621d 100644 (file)
@@ -219,6 +219,7 @@ MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform")
        .map_io = mx50_map_io,
        .init_early = imx50_init_early,
        .init_irq = mx50_init_irq,
+       .handle_irq = imx50_handle_irq,
        .timer = &mx50_rdp_timer,
        .init_machine = mx50_rdp_board_init,
 MACHINE_END
index f988be7..0578390 100644 (file)
@@ -172,6 +172,7 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .timer = &mx51_3ds_timer,
        .init_machine = mx51_3ds_init,
 MACHINE_END
index 622b2de..5993208 100644 (file)
@@ -418,6 +418,7 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .timer = &mx51_babbage_timer,
        .init_machine = mx51_babbage_init,
 MACHINE_END
index d231b3e..a9e4866 100644 (file)
@@ -161,6 +161,11 @@ static const struct gpio_led_platform_data
        .num_leds = ARRAY_SIZE(mx51_efikamx_leds),
 };
 
+static struct esdhc_platform_data sd_pdata = {
+       .cd_type = ESDHC_CD_CONTROLLER,
+       .wp_type = ESDHC_WP_CONTROLLER,
+};
+
 static struct gpio_keys_button mx51_efikamx_powerkey[] = {
        {
                .code = KEY_POWER,
@@ -237,9 +242,11 @@ static void __init mx51_efikamx_init(void)
 
        /* on < 1.2 boards both SD controllers are used */
        if (system_rev < 0x12) {
-               imx51_add_sdhci_esdhc_imx(1, NULL);
+               imx51_add_sdhci_esdhc_imx(0, NULL);
+               imx51_add_sdhci_esdhc_imx(1, &sd_pdata);
                mx51_efikamx_leds[2].default_trigger = "mmc1";
-       }
+       } else
+               imx51_add_sdhci_esdhc_imx(0, &sd_pdata);
 
        gpio_led_register_device(-1, &mx51_efikamx_leds_data);
        imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
@@ -282,6 +289,7 @@ MACHINE_START(MX51_EFIKAMX, "Genesi EfikaMX nettop")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .timer = &mx51_efikamx_timer,
        .init_machine = mx51_efikamx_init,
 MACHINE_END
index d4e98f0..38c4a3e 100644 (file)
@@ -54,6 +54,7 @@
 #define EFIKASB_RFKILL         IMX_GPIO_NR(3, 1)
 
 #define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0,   0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
+#define MX51_PAD_SD1_CD        IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_ESDHC_PAD_CTRL)
 
 static iomux_v3_cfg_t mx51efikasb_pads[] = {
        /* USB HOST2 */
@@ -95,6 +96,8 @@ static iomux_v3_cfg_t mx51efikasb_pads[] = {
 
        /* BT */
        MX51_PAD_EIM_A17__GPIO2_11,
+
+       MX51_PAD_SD1_CD,
 };
 
 static int initialize_usbh2_port(struct platform_device *pdev)
@@ -180,6 +183,18 @@ static const struct gpio_keys_platform_data mx51_efikasb_keys_data __initconst =
        .nbuttons = ARRAY_SIZE(mx51_efikasb_keys),
 };
 
+static struct esdhc_platform_data sd0_pdata = {
+#define EFIKASB_SD1_CD IMX_GPIO_NR(2, 27)
+       .cd_gpio = EFIKASB_SD1_CD,
+       .cd_type = ESDHC_CD_GPIO,
+       .wp_type = ESDHC_WP_CONTROLLER,
+};
+
+static struct esdhc_platform_data sd1_pdata = {
+       .cd_type = ESDHC_CD_CONTROLLER,
+       .wp_type = ESDHC_WP_CONTROLLER,
+};
+
 static struct regulator *pwgt1, *pwgt2;
 
 static void mx51_efikasb_power_off(void)
@@ -248,7 +263,8 @@ static void __init efikasb_board_init(void)
 
        mx51_efikasb_board_id();
        mx51_efikasb_usb();
-       imx51_add_sdhci_esdhc_imx(1, NULL);
+       imx51_add_sdhci_esdhc_imx(0, &sd0_pdata);
+       imx51_add_sdhci_esdhc_imx(1, &sd1_pdata);
 
        gpio_led_register_device(-1, &mx51_efikasb_leds_data);
        imx_add_gpio_keys(&mx51_efikasb_keys_data);
@@ -268,6 +284,7 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika Smartbook")
        .map_io = mx51_map_io,
        .init_early = imx51_init_early,
        .init_irq = mx51_init_irq,
+       .handle_irq = imx51_handle_irq,
        .init_machine =  efikasb_board_init,
        .timer = &mx51_efikasb_timer,
 MACHINE_END
index 9d844f1..614edcb 100644 (file)
@@ -250,6 +250,7 @@ MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
+       .handle_irq = imx53_handle_irq,
        .timer = &mx53_ard_timer,
        .init_machine = mx53_ard_board_init,
 MACHINE_END
index 1b417b0..6a3e616 100644 (file)
@@ -167,6 +167,7 @@ MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
+       .handle_irq = imx53_handle_irq,
        .timer = &mx53_evk_timer,
        .init_machine = mx53_evk_board_init,
 MACHINE_END
index 940aac9..0af2766 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
+#include <linux/i2c.h>
 
 #include <mach/common.h>
 #include <mach/hardware.h>
@@ -42,6 +43,7 @@
 #define LOCO_SD3_CD                    IMX_GPIO_NR(3, 11)
 #define LOCO_SD3_WP                    IMX_GPIO_NR(3, 12)
 #define LOCO_SD1_CD                    IMX_GPIO_NR(3, 13)
+#define LOCO_ACCEL_EN                  IMX_GPIO_NR(6, 14)
 
 static iomux_v3_cfg_t mx53_loco_pads[] = {
        /* FEC */
@@ -64,6 +66,10 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
        MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD,
        MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS,
        MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD,
+       /* I2C1 */
+       MX53_PAD_CSI0_DAT8__I2C1_SDA,
+       MX53_PAD_CSI0_DAT9__I2C1_SCL,
+       MX53_PAD_NANDF_CS1__GPIO6_14,   /* Accelerometer Enable */
        /* I2C2 */
        MX53_PAD_KEY_COL3__I2C2_SCL,
        MX53_PAD_KEY_ROW3__I2C2_SDA,
@@ -257,8 +263,15 @@ static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {
        .num_leds       = ARRAY_SIZE(mx53loco_leds),
 };
 
+static struct i2c_board_info mx53loco_i2c_devices[] = {
+       {
+               I2C_BOARD_INFO("mma8450", 0x1C),
+       },
+};
+
 static void __init mx53_loco_board_init(void)
 {
+       int ret;
        imx53_soc_init();
 
        mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
@@ -267,6 +280,13 @@ static void __init mx53_loco_board_init(void)
        mx53_loco_fec_reset();
        imx53_add_fec(&mx53_loco_fec_data);
        imx53_add_imx2_wdt(0, NULL);
+
+       ret = gpio_request_one(LOCO_ACCEL_EN, GPIOF_OUT_INIT_HIGH, "accel_en");
+       if (ret)
+               pr_err("Cannot request ACCEL_EN pin: %d\n", ret);
+
+       i2c_register_board_info(0, mx53loco_i2c_devices,
+                               ARRAY_SIZE(mx53loco_i2c_devices));
        imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
        imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
        imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
@@ -289,6 +309,7 @@ MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
+       .handle_irq = imx53_handle_irq,
        .timer = &mx53_loco_timer,
        .init_machine = mx53_loco_board_init,
 MACHINE_END
index efcab68..d12fd30 100644 (file)
@@ -156,6 +156,7 @@ MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
+       .handle_irq = imx53_handle_irq,
        .timer = &mx53_smd_timer,
        .init_machine = mx53_smd_board_init,
 MACHINE_END
index c2dafe4..b94879e 100644 (file)
@@ -1573,9 +1573,8 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc,
        clk_enable(&main_bus_clk);
 
        clk_enable(&iim_clk);
-       mx51_revision();
+       imx_print_silicon_rev("i.MX51", mx51_revision());
        clk_disable(&iim_clk);
-       mx51_display_revision();
 
        /* move usb_phy_clk to 24MHz */
        clk_set_parent(&usb_phy1_clk, &osc_clk);
@@ -1617,9 +1616,8 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
        clk_enable(&main_bus_clk);
 
        clk_enable(&iim_clk);
-       mx53_revision();
+       imx_print_silicon_rev("i.MX53", mx53_revision());
        clk_disable(&iim_clk);
-       mx53_display_revision();
 
        /* Set SDHC parents to be PLL2 */
        clk_set_parent(&esdhc1_clk, &pll2_sw_clk);
index 86f87da..5c53282 100644 (file)
@@ -18,7 +18,7 @@
 #include <mach/hardware.h>
 #include <asm/io.h>
 
-static int cpu_silicon_rev = -1;
+static int mx5_cpu_rev = -1;
 
 #define IIM_SREV 0x24
 #define MX50_HW_ADADIG_DIGPROG 0xB0
@@ -28,11 +28,14 @@ static int get_mx51_srev(void)
        void __iomem *iim_base = MX51_IO_ADDRESS(MX51_IIM_BASE_ADDR);
        u32 rev = readl(iim_base + IIM_SREV) & 0xff;
 
-       if (rev == 0x0)
+       switch (rev) {
+       case 0x0:
                return IMX_CHIP_REVISION_2_0;
-       else if (rev == 0x10)
+       case 0x10:
                return IMX_CHIP_REVISION_3_0;
-       return 0;
+       default:
+               return IMX_CHIP_REVISION_UNKNOWN;
+       }
 }
 
 /*
@@ -45,33 +48,13 @@ int mx51_revision(void)
        if (!cpu_is_mx51())
                return -EINVAL;
 
-       if (cpu_silicon_rev == -1)
-               cpu_silicon_rev = get_mx51_srev();
+       if (mx5_cpu_rev == -1)
+               mx5_cpu_rev = get_mx51_srev();
 
-       return cpu_silicon_rev;
+       return mx5_cpu_rev;
 }
 EXPORT_SYMBOL(mx51_revision);
 
-void mx51_display_revision(void)
-{
-       int rev;
-       char *srev;
-       rev = mx51_revision();
-
-       switch (rev) {
-       case IMX_CHIP_REVISION_2_0:
-               srev = IMX_CHIP_REVISION_2_0_STRING;
-               break;
-       case IMX_CHIP_REVISION_3_0:
-               srev = IMX_CHIP_REVISION_3_0_STRING;
-               break;
-       default:
-               srev = IMX_CHIP_REVISION_UNKNOWN_STRING;
-       }
-       printk(KERN_INFO "CPU identified as i.MX51, silicon rev %s\n", srev);
-}
-EXPORT_SYMBOL(mx51_display_revision);
-
 #ifdef CONFIG_NEON
 
 /*
@@ -121,10 +104,10 @@ int mx53_revision(void)
        if (!cpu_is_mx53())
                return -EINVAL;
 
-       if (cpu_silicon_rev == -1)
-               cpu_silicon_rev = get_mx53_srev();
+       if (mx5_cpu_rev == -1)
+               mx5_cpu_rev = get_mx53_srev();
 
-       return cpu_silicon_rev;
+       return mx5_cpu_rev;
 }
 EXPORT_SYMBOL(mx53_revision);
 
@@ -134,7 +117,7 @@ static int get_mx50_srev(void)
        u32 rev;
 
        if (!anatop) {
-               cpu_silicon_rev = -EINVAL;
+               mx5_cpu_rev = -EINVAL;
                return 0;
        }
 
@@ -159,36 +142,13 @@ int mx50_revision(void)
        if (!cpu_is_mx50())
                return -EINVAL;
 
-       if (cpu_silicon_rev == -1)
-               cpu_silicon_rev = get_mx50_srev();
+       if (mx5_cpu_rev == -1)
+               mx5_cpu_rev = get_mx50_srev();
 
-       return cpu_silicon_rev;
+       return mx5_cpu_rev;
 }
 EXPORT_SYMBOL(mx50_revision);
 
-void mx53_display_revision(void)
-{
-       int rev;
-       char *srev;
-       rev = mx53_revision();
-
-       switch (rev) {
-       case IMX_CHIP_REVISION_1_0:
-               srev = IMX_CHIP_REVISION_1_0_STRING;
-               break;
-       case IMX_CHIP_REVISION_2_0:
-               srev = IMX_CHIP_REVISION_2_0_STRING;
-               break;
-       case IMX_CHIP_REVISION_2_1:
-               srev = IMX_CHIP_REVISION_2_1_STRING;
-               break;
-       default:
-               srev = IMX_CHIP_REVISION_UNKNOWN_STRING;
-       }
-       printk(KERN_INFO "CPU identified as i.MX53, silicon rev %s\n", srev);
-}
-EXPORT_SYMBOL(mx53_display_revision);
-
 static int __init post_cpu_init(void)
 {
        unsigned int reg;
index 7fe5e46..6e1e5d1 100644 (file)
@@ -44,4 +44,5 @@ extern const struct imx_imx_keypad_data imx53_imx_keypad_data;
 extern const struct imx_pata_imx_data imx53_pata_imx_data;
 #define imx53_add_pata_imx() \
        imx_add_pata_imx(&imx53_pata_imx_data)
+
 extern struct platform_device *__init imx53_add_ahci_imx(void);
index 83c5702..b004e17 100644 (file)
@@ -607,7 +607,6 @@ void __init efika_board_common_init(void)
                                        ARRAY_SIZE(mx51efika_pads));
        imx51_add_imx_uart(0, &uart_pdata);
        mx51_efika_usb();
-       imx51_add_sdhci_esdhc_imx(0, NULL);
 
        /* FIXME: comes from original code. check this. */
        if (mx51_revision() < IMX_CHIP_REVISION_2_0)
index ea5ec0f..cf00b3e 100644 (file)
@@ -23,6 +23,7 @@ config MACH_STMP378X_DEVB
        select MXS_HAVE_AMBA_DUART
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_MXS_MMC
+       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        help
          Include support for STMP378x-devb platform. This includes specific
          configurations for the board and its peripherals.
@@ -34,6 +35,7 @@ config MACH_MX23EVK
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXSFB
+       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        help
          Include support for MX23EVK platform. This includes specific
          configurations for the board and its peripherals.
@@ -48,6 +50,9 @@ config MACH_MX28EVK
        select MXS_HAVE_PLATFORM_FLEXCAN
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXSFB
+       select MXS_HAVE_PLATFORM_MXS_SAIF
+       select MXS_HAVE_PLATFORM_MXS_I2C
+       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        select MXS_OCOTP
        help
          Include support for MX28EVK platform. This includes specific
@@ -63,6 +68,7 @@ config MODULE_TX28
        select MXS_HAVE_PLATFORM_MXS_I2C
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXS_PWM
+       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
 
 config MODULE_M28
        bool
index 7fa1ac4..229ae34 100644 (file)
@@ -640,6 +640,8 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK(NULL, "lradc", lradc_clk)
        _REGISTER_CLOCK(NULL, "spdif", spdif_clk)
        _REGISTER_CLOCK("imx28-fb", NULL, lcdif_clk)
+       _REGISTER_CLOCK("mxs-saif.0", NULL, saif0_clk)
+       _REGISTER_CLOCK("mxs-saif.1", NULL, saif1_clk)
 };
 
 static int clk_misc_init(void)
@@ -708,11 +710,11 @@ static int clk_misc_init(void)
 
        /* SAIF has to use frac div for functional operation */
        reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0);
-       reg &= ~BM_CLKCTRL_SAIF0_DIV_FRAC_EN;
+       reg |= BM_CLKCTRL_SAIF0_DIV_FRAC_EN;
        __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0);
 
        reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1);
-       reg &= ~BM_CLKCTRL_SAIF1_DIV_FRAC_EN;
+       reg |= BM_CLKCTRL_SAIF1_DIV_FRAC_EN;
        __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1);
 
        /*
@@ -780,6 +782,8 @@ int __init mx28_clocks_init(void)
        clk_enable(&uart_clk);
 
        clk_set_parent(&lcdif_clk, &ref_pix_clk);
+       clk_set_parent(&saif0_clk, &pll0_clk);
+       clk_set_parent(&saif1_clk, &pll0_clk);
 
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
 
index c6f345f..3fa651d 100644 (file)
@@ -29,3 +29,5 @@ extern const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst;
 
 struct platform_device *__init mx23_add_mxsfb(
                const struct mxsfb_platform_data *pdata);
+
+struct platform_device *__init mx23_add_rtc_stmp3xxx(void);
index 79b9452..c888710 100644 (file)
@@ -45,3 +45,8 @@ extern const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst;
 
 struct platform_device *__init mx28_add_mxsfb(
                const struct mxsfb_platform_data *pdata);
+
+extern const struct mxs_saif_data mx28_saif_data[] __initconst;
+#define mx28_add_saif(id)              mxs_add_saif(&mx28_saif_data[id])
+
+struct platform_device *__init mx28_add_rtc_stmp3xxx(void);
index acf9eea..18b6bf5 100644 (file)
@@ -23,3 +23,9 @@ config MXS_HAVE_PLATFORM_MXS_PWM
 
 config MXS_HAVE_PLATFORM_MXSFB
        bool
+
+config MXS_HAVE_PLATFORM_MXS_SAIF
+       bool
+
+config MXS_HAVE_PLATFORM_RTC_STMP3XXX
+       bool
index 351915c..f52e3e5 100644 (file)
@@ -8,3 +8,5 @@ obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o
 obj-y += platform-gpio-mxs.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o
+obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_SAIF) += platform-mxs-saif.o
+obj-$(CONFIG_MXS_HAVE_PLATFORM_RTC_STMP3XXX) += platform-rtc-stmp3xxx.o
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-saif.c b/arch/arm/mach-mxs/devices/platform-mxs-saif.c
new file mode 100644 (file)
index 0000000..1ec965e
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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/compiler.h>
+#include <linux/err.h>
+#include <linux/init.h>
+
+#include <mach/mx23.h>
+#include <mach/mx28.h>
+#include <mach/devices-common.h>
+
+#define mxs_saif_data_entry_single(soc, _id)                           \
+       {                                                               \
+               .id = _id,                                              \
+               .iobase = soc ## _SAIF ## _id ## _BASE_ADDR,            \
+               .irq = soc ## _INT_SAIF ## _id,                         \
+               .dma = soc ## _DMA_SAIF ## _id,                         \
+               .dmairq = soc ## _INT_SAIF ## _id ##_DMA,               \
+       }
+
+#define mxs_saif_data_entry(soc, _id)                                  \
+       [_id] = mxs_saif_data_entry_single(soc, _id)
+
+#ifdef CONFIG_SOC_IMX28
+const struct mxs_saif_data mx28_saif_data[] __initconst = {
+       mxs_saif_data_entry(MX28, 0),
+       mxs_saif_data_entry(MX28, 1),
+};
+#endif
+
+struct platform_device *__init mxs_add_saif(const struct mxs_saif_data *data)
+{
+       struct resource res[] = {
+               {
+                       .start = data->iobase,
+                       .end = data->iobase + SZ_4K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = data->irq,
+                       .end = data->irq,
+                       .flags = IORESOURCE_IRQ,
+               }, {
+                       .start = data->dma,
+                       .end = data->dma,
+                       .flags = IORESOURCE_DMA,
+               }, {
+                       .start = data->dmairq,
+                       .end = data->dmairq,
+                       .flags = IORESOURCE_IRQ,
+               },
+
+       };
+
+       return mxs_add_platform_device("mxs-saif", data->id, res,
+                                       ARRAY_SIZE(res), NULL, 0);
+}
diff --git a/arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c b/arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c
new file mode 100644 (file)
index 0000000..639eaee
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Pengutronix, Wolfram Sang <w.sang@pengutronix.de>
+ *
+ * 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 <asm/sizes.h>
+#include <mach/mx23.h>
+#include <mach/mx28.h>
+#include <mach/devices-common.h>
+
+#ifdef CONFIG_SOC_IMX23
+struct platform_device *__init mx23_add_rtc_stmp3xxx(void)
+{
+       struct resource res[] = {
+               {
+                       .start = MX23_RTC_BASE_ADDR,
+                       .end = MX23_RTC_BASE_ADDR + SZ_8K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = MX23_INT_RTC_ALARM,
+                       .end = MX23_INT_RTC_ALARM,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return mxs_add_platform_device("stmp3xxx-rtc", 0, res, ARRAY_SIZE(res),
+                                       NULL, 0);
+}
+#endif /* CONFIG_SOC_IMX23 */
+
+#ifdef CONFIG_SOC_IMX28
+struct platform_device *__init mx28_add_rtc_stmp3xxx(void)
+{
+       struct resource res[] = {
+               {
+                       .start = MX28_RTC_BASE_ADDR,
+                       .end = MX28_RTC_BASE_ADDR + SZ_8K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = MX28_INT_RTC_ALARM,
+                       .end = MX28_INT_RTC_ALARM,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return mxs_add_platform_device("stmp3xxx-rtc", 0, res, ARRAY_SIZE(res),
+                                       NULL, 0);
+}
+#endif /* CONFIG_SOC_IMX28 */
index 812d7a8..a8080f4 100644 (file)
@@ -92,3 +92,15 @@ struct platform_device *__init mxs_add_mxs_mmc(
 /* pwm */
 struct platform_device *__init mxs_add_mxs_pwm(
                resource_size_t iobase, int id);
+
+/* saif */
+struct mxs_saif_data {
+       int id;
+       resource_size_t iobase;
+       resource_size_t irq;
+       resource_size_t dma;
+       resource_size_t dmairq;
+};
+
+struct platform_device *__init mxs_add_saif(
+               const struct mxs_saif_data *data);
index 69e218d..c325fbe 100644 (file)
@@ -166,6 +166,7 @@ static void __init mx23evk_init(void)
                gpio_set_value(MX23EVK_BL_ENABLE, 1);
 
        mx23_add_mxsfb(&mx23evk_mxsfb_pdata);
+       mx23_add_rtc_stmp3xxx();
 }
 
 static void __init mx23evk_timer_init(void)
index 0173c3b..ac2316d 100644 (file)
@@ -17,6 +17,9 @@
 #include <linux/gpio.h>
 #include <linux/leds.h>
 #include <linux/clk.h>
+#include <linux/i2c.h>
+#include <linux/regulator/machine.h>
+#include <linux/regulator/fixed.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -182,6 +185,24 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
 
        /* led */
        MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
+
+       /* I2C */
+       MX28_PAD_I2C0_SCL__I2C0_SCL |
+               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+       MX28_PAD_I2C0_SDA__I2C0_SDA |
+               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+
+       /* saif0 & saif1 */
+       MX28_PAD_SAIF0_MCLK__SAIF0_MCLK |
+               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+       MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK |
+               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+       MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK |
+               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+       MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 |
+               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
+       MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 |
+               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
 };
 
 /* led */
@@ -351,6 +372,50 @@ static struct mxs_mmc_platform_data mx28evk_mmc_pdata[] __initdata = {
        },
 };
 
+static struct i2c_board_info mxs_i2c0_board_info[] __initdata = {
+       {
+               I2C_BOARD_INFO("sgtl5000", 0x0a),
+       },
+};
+
+#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)
+static struct regulator_consumer_supply mx28evk_audio_consumer_supplies[] = {
+       REGULATOR_SUPPLY("VDDA", "0-000a"),
+       REGULATOR_SUPPLY("VDDIO", "0-000a"),
+};
+
+static struct regulator_init_data mx28evk_vdd_reg_init_data = {
+       .constraints    = {
+               .name   = "3V3",
+               .always_on = 1,
+       },
+       .consumer_supplies = mx28evk_audio_consumer_supplies,
+       .num_consumer_supplies = ARRAY_SIZE(mx28evk_audio_consumer_supplies),
+};
+
+static struct fixed_voltage_config mx28evk_vdd_pdata = {
+       .supply_name    = "board-3V3",
+       .microvolts     = 3300000,
+       .gpio           = -EINVAL,
+       .enabled_at_boot = 1,
+       .init_data      = &mx28evk_vdd_reg_init_data,
+};
+static struct platform_device mx28evk_voltage_regulator = {
+       .name           = "reg-fixed-voltage",
+       .id             = -1,
+       .num_resources  = 0,
+       .dev            = {
+               .platform_data  = &mx28evk_vdd_pdata,
+       },
+};
+static void __init mx28evk_add_regulators(void)
+{
+       platform_device_register(&mx28evk_voltage_regulator);
+}
+#else
+static void __init mx28evk_add_regulators(void) {}
+#endif
+
 static struct gpio mx28evk_lcd_gpios[] = {
        { MX28EVK_LCD_ENABLE, GPIOF_OUT_INIT_HIGH, "lcd-enable" },
        { MX28EVK_BL_ENABLE, GPIOF_OUT_INIT_HIGH, "bl-enable" },
@@ -389,6 +454,18 @@ static void __init mx28evk_init(void)
        else
                mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
 
+       mx28_add_saif(0);
+       mx28_add_saif(1);
+
+       mx28_add_mxs_i2c(0);
+       i2c_register_board_info(0, mxs_i2c0_board_info,
+                               ARRAY_SIZE(mxs_i2c0_board_info));
+
+       mx28evk_add_regulators();
+
+       mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0,
+                       NULL, 0);
+
        /* power on mmc slot by writing 0 to the gpio */
        ret = gpio_request_one(MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW,
                               "mmc0-slot-power");
@@ -403,6 +480,9 @@ static void __init mx28evk_init(void)
        else
                mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
 
+       mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
+       mx28_add_rtc_stmp3xxx();
+
        gpio_led_register_device(0, &mx28evk_led_data);
 }
 
index 3fe5dd5..177e531 100644 (file)
@@ -90,6 +90,7 @@ static void __init stmp378x_dvb_init(void)
 
        mx23_add_duart();
        mx23_add_auart0();
+       mx23_add_rtc_stmp3xxx();
 
        /* power on mmc slot */
        ret = gpio_request_one(STMP378X_DEVB_MMC0_SLOT_POWER,
index 9555938..9a1f0e7 100644 (file)
@@ -161,6 +161,7 @@ static void __init tx28_stk5v3_init(void)
        i2c_register_board_info(0, tx28_stk5v3_i2c_boardinfo,
                        ARRAY_SIZE(tx28_stk5v3_i2c_boardinfo));
        mx28_add_mxs_mmc(0, &tx28_mmc0_pdata);
+       mx28_add_rtc_stmp3xxx();
 }
 
 static void __init tx28_timer_init(void)
index d82ebab..91aff7c 100644 (file)
@@ -69,6 +69,12 @@ config MACH_WARIO
        help
          Support for the Wario version of Seaboard
 
+config MACH_VENTANA
+       bool "Ventana board"
+       select MACH_TEGRA_DT
+       help
+         Support for the nVidia Ventana development platform
+
 choice
         prompt "Low-level debug console UART"
         default TEGRA_DEBUG_UART_NONE
index f11b910..91a07e1 100644 (file)
@@ -31,6 +31,7 @@ obj-${CONFIG_MACH_SEABOARD}             += board-seaboard-pinmux.o
 
 obj-${CONFIG_MACH_TEGRA_DT}             += board-dt.o
 obj-${CONFIG_MACH_TEGRA_DT}             += board-harmony-pinmux.o
+obj-${CONFIG_MACH_TEGRA_DT}             += board-seaboard-pinmux.o
 
 obj-${CONFIG_MACH_TRIMSLICE}            += board-trimslice.o
 obj-${CONFIG_MACH_TRIMSLICE}            += board-trimslice-pinmux.o
index 5e870d2..bd12c9f 100644 (file)
@@ -4,3 +4,4 @@ initrd_phys-$(CONFIG_ARCH_TEGRA_2x_SOC) := 0x00800000
 
 dtb-$(CONFIG_MACH_HARMONY) += tegra-harmony.dtb
 dtb-$(CONFIG_MACH_SEABOARD) += tegra-seaboard.dtb
+dtb-$(CONFIG_MACH_VENTANA) += tegra-ventana.dtb
index 9f47e04..d368f8d 100644 (file)
@@ -47,7 +47,7 @@
 
 void harmony_pinmux_init(void);
 void seaboard_pinmux_init(void);
-
+void ventana_pinmux_init(void);
 
 struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
        OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL),
@@ -80,9 +80,19 @@ static struct of_device_id tegra_dt_gic_match[] __initdata = {
        {}
 };
 
+static struct {
+       char *machine;
+       void (*init)(void);
+} pinmux_configs[] = {
+       { "nvidia,harmony", harmony_pinmux_init },
+       { "nvidia,seaboard", seaboard_pinmux_init },
+       { "nvidia,ventana", ventana_pinmux_init },
+};
+
 static void __init tegra_dt_init(void)
 {
        struct device_node *node;
+       int i;
 
        node = of_find_matching_node_by_address(NULL, tegra_dt_gic_match,
                                                TEGRA_ARM_INT_DIST_BASE);
@@ -91,10 +101,15 @@ static void __init tegra_dt_init(void)
 
        tegra_clk_init_from_table(tegra_dt_clk_init_table);
 
-       if (of_machine_is_compatible("nvidia,harmony"))
-               harmony_pinmux_init();
-       else if (of_machine_is_compatible("nvidia,seaboard"))
-               seaboard_pinmux_init();
+       for (i = 0; i < ARRAY_SIZE(pinmux_configs); i++) {
+               if (of_machine_is_compatible(pinmux_configs[i].machine)) {
+                       pinmux_configs[i].init();
+                       break;
+               }
+       }
+
+       WARN(i == ARRAY_SIZE(pinmux_configs),
+               "Unknown platform! Pinmuxing not initialized\n");
 
        /*
         * Finished with the static registrations now; fill in the missing
@@ -106,6 +121,7 @@ static void __init tegra_dt_init(void)
 static const char * tegra_dt_board_compat[] = {
        "nvidia,harmony",
        "nvidia,seaboard",
+       "nvidia,ventana",
        NULL
 };
 
index 4d63e2e..e99b456 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "gpio-names.h"
 #include "board-harmony.h"
+#include "devices.h"
 
 static struct tegra_pingroup_config harmony_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_IDE,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
@@ -140,6 +141,11 @@ static struct tegra_pingroup_config harmony_pinmux[] = {
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 };
 
+static struct platform_device *pinmux_devices[] = {
+       &tegra_gpio_device,
+       &tegra_pinmux_device,
+};
+
 static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD2_CD,            .enable = true  },
        { .gpio = TEGRA_GPIO_SD2_WP,            .enable = true  },
@@ -155,6 +161,8 @@ static struct tegra_gpio_table gpio_table[] = {
 
 void harmony_pinmux_init(void)
 {
+       platform_add_devices(pinmux_devices, ARRAY_SIZE(pinmux_devices));
+
        tegra_pinmux_config_table(harmony_pinmux, ARRAY_SIZE(harmony_pinmux));
 
        tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
index 5ad8b2f..21d1285 100644 (file)
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
-
+#include <linux/io.h>
 #include <linux/regulator/machine.h>
 #include <linux/mfd/tps6586x.h>
 
+#include <mach/iomap.h>
 #include <mach/irqs.h>
 
 #include "board-harmony.h"
@@ -113,6 +114,16 @@ static struct i2c_board_info __initdata harmony_regulators[] = {
 
 int __init harmony_regulator_init(void)
 {
+       void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
+       u32 pmc_ctrl;
+
+       /*
+        * Configure the power management controller to trigger PMU
+        * interrupts when low
+        */
+       pmc_ctrl = readl(pmc + PMC_CTRL);
+       writel(pmc_ctrl | PMC_CTRL_INTR_LOW, pmc + PMC_CTRL);
+
        i2c_register_board_info(3, harmony_regulators, 1);
 
        return 0;
index 2225769..fb20894 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "gpio-names.h"
 #include "board-paz00.h"
+#include "devices.h"
 
 static struct tegra_pingroup_config paz00_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
@@ -140,6 +141,11 @@ static struct tegra_pingroup_config paz00_pinmux[] = {
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 };
 
+static struct platform_device *pinmux_devices[] = {
+       &tegra_gpio_device,
+       &tegra_pinmux_device,
+};
+
 static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD1_CD,    .enable = true },
        { .gpio = TEGRA_GPIO_SD1_WP,    .enable = true },
@@ -152,6 +158,8 @@ static struct tegra_gpio_table gpio_table[] = {
 
 void paz00_pinmux_init(void)
 {
+       platform_add_devices(pinmux_devices, ARRAY_SIZE(pinmux_devices));
+
        tegra_pinmux_config_table(paz00_pinmux, ARRAY_SIZE(paz00_pinmux));
 
        tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
index 74f78b7..fbce31d 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2010 NVIDIA Corporation
+ * Copyright (C) 2010,2011 NVIDIA Corporation
+ * Copyright (C) 2011 Google, Inc.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -21,6 +22,7 @@
 
 #include "gpio-names.h"
 #include "board-seaboard.h"
+#include "devices.h"
 
 #define DEFAULT_DRIVE(_name)                                   \
        {                                                       \
@@ -157,10 +159,33 @@ static __initdata struct tegra_pingroup_config seaboard_pinmux[] = {
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 };
 
+static __initdata struct tegra_pingroup_config ventana_pinmux[] = {
+       {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3,     TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_DDC,  TEGRA_MUX_RSVD2,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_DTA,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_DTB,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_DTC,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_DTD,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_GMD,  TEGRA_MUX_SFLASH,   TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_LPW0, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_LPW2, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_LSC1, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_LSCK, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_LSDA, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_PTA,  TEGRA_MUX_RSVD2,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SDIO3,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_SLXK, TEGRA_MUX_SDIO3,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_SPIA, TEGRA_MUX_GMI,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_SPIC, TEGRA_MUX_GMI,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
+};
 
+static struct platform_device *pinmux_devices[] = {
+       &tegra_gpio_device,
+       &tegra_pinmux_device,
+};
 
-
-static struct tegra_gpio_table gpio_table[] = {
+static struct tegra_gpio_table common_gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD2_CD,            .enable = true },
        { .gpio = TEGRA_GPIO_SD2_WP,            .enable = true },
        { .gpio = TEGRA_GPIO_SD2_POWER,         .enable = true },
@@ -171,12 +196,46 @@ static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_USB1,              .enable = true },
 };
 
-void __init seaboard_pinmux_init(void)
+static void __init update_pinmux(struct tegra_pingroup_config *newtbl, int size)
+{
+       int i, j;
+       struct tegra_pingroup_config *new_pingroup, *base_pingroup;
+
+       /* Update base seaboard pinmux table with secondary board
+        * specific pinmux table table.
+        */
+       for (i = 0; i < size; i++) {
+               new_pingroup = &newtbl[i];
+               for (j = 0; j < ARRAY_SIZE(seaboard_pinmux); j++) {
+                       base_pingroup = &seaboard_pinmux[j];
+                       if (new_pingroup->pingroup == base_pingroup->pingroup) {
+                               *base_pingroup = *new_pingroup;
+                               break;
+                       }
+               }
+       }
+}
+
+void __init seaboard_common_pinmux_init(void)
 {
+       platform_add_devices(pinmux_devices, ARRAY_SIZE(pinmux_devices));
+
        tegra_pinmux_config_table(seaboard_pinmux, ARRAY_SIZE(seaboard_pinmux));
 
        tegra_drive_pinmux_config_table(seaboard_drive_pinmux,
                                        ARRAY_SIZE(seaboard_drive_pinmux));
 
-       tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
+       tegra_gpio_config(common_gpio_table, ARRAY_SIZE(common_gpio_table));
+}
+
+void __init seaboard_pinmux_init(void)
+{
+       seaboard_common_pinmux_init();
 }
+
+void __init ventana_pinmux_init(void)
+{
+       update_pinmux(ventana_pinmux, ARRAY_SIZE(ventana_pinmux));
+       seaboard_common_pinmux_init();
+}
+
index bcb1916..4969dd2 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "gpio-names.h"
 #include "board-trimslice.h"
+#include "devices.h"
 
 static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_IDE,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
@@ -141,6 +142,11 @@ static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
 };
 
+static struct platform_device *pinmux_devices[] = {
+       &tegra_gpio_device,
+       &tegra_pinmux_device,
+};
+
 static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TRIMSLICE_GPIO_SD4_CD, .enable = true }, /* mmc4 cd */
        { .gpio = TRIMSLICE_GPIO_SD4_WP, .enable = true }, /* mmc4 wp */
@@ -151,6 +157,7 @@ static struct tegra_gpio_table gpio_table[] = {
 
 void __init trimslice_pinmux_init(void)
 {
+       platform_add_devices(pinmux_devices, ARRAY_SIZE(pinmux_devices));
        tegra_pinmux_config_table(trimslice_pinmux, ARRAY_SIZE(trimslice_pinmux));
        tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
 }
index 489e82b..7a2a02d 100644 (file)
 #include "gpio-names.h"
 #include "devices.h"
 
+static struct resource gpio_resource[] = {
+       [0] = {
+               .start  = TEGRA_GPIO_BASE,
+               .end    = TEGRA_GPIO_BASE + TEGRA_GPIO_SIZE-1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = INT_GPIO1,
+               .end    = INT_GPIO1,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = INT_GPIO2,
+               .end    = INT_GPIO2,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = INT_GPIO3,
+               .end    = INT_GPIO3,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [4] = {
+               .start  = INT_GPIO4,
+               .end    = INT_GPIO4,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [5] = {
+               .start  = INT_GPIO5,
+               .end    = INT_GPIO5,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [6] = {
+               .start  = INT_GPIO6,
+               .end    = INT_GPIO6,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [7] = {
+               .start  = INT_GPIO7,
+               .end    = INT_GPIO7,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device tegra_gpio_device = {
+       .name           = "tegra-gpio",
+       .id             = -1,
+       .resource       = gpio_resource,
+       .num_resources  = ARRAY_SIZE(gpio_resource),
+};
+
+static struct resource pinmux_resource[] = {
+       [0] = {
+               /* Tri-state registers */
+               .start  = TEGRA_APB_MISC_BASE + 0x14,
+               .end    = TEGRA_APB_MISC_BASE + 0x20 + 3,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* Mux registers */
+               .start  = TEGRA_APB_MISC_BASE + 0x80,
+               .end    = TEGRA_APB_MISC_BASE + 0x9c + 3,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               /* Pull-up/down registers */
+               .start  = TEGRA_APB_MISC_BASE + 0xa0,
+               .end    = TEGRA_APB_MISC_BASE + 0xb0 + 3,
+               .flags  = IORESOURCE_MEM,
+       },
+       [3] = {
+               /* Pad control registers */
+               .start  = TEGRA_APB_MISC_BASE + 0x868,
+               .end    = TEGRA_APB_MISC_BASE + 0x90c + 3,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+struct platform_device tegra_pinmux_device = {
+       .name           = "tegra-pinmux",
+       .id             = -1,
+       .resource       = pinmux_resource,
+       .num_resources  = ARRAY_SIZE(pinmux_resource),
+};
+
 static struct resource i2c_resource1[] = {
        [0] = {
                .start  = INT_I2C,
index 4a7dc0a..873ecb2 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <linux/platform_device.h>
 
+extern struct platform_device tegra_gpio_device;
+extern struct platform_device tegra_pinmux_device;
 extern struct platform_device tegra_sdhci_device1;
 extern struct platform_device tegra_sdhci_device2;
 extern struct platform_device tegra_sdhci_device3;
index defd877..bb7dfdb 100644 (file)
@@ -199,6 +199,7 @@ struct tegra_drive_pingroup_config {
 
 struct tegra_drive_pingroup_desc {
        const char *name;
+       s16 reg_bank;
        s16 reg;
 };
 
@@ -207,6 +208,9 @@ struct tegra_pingroup_desc {
        int funcs[4];
        int func_safe;
        int vddio;
+       s16 tri_bank;   /* Register bank the tri_reg exists within */
+       s16 mux_bank;   /* Register bank the mux_reg exists within */
+       s16 pupd_bank;  /* Register bank the pupd_reg exists within */
        s16 tri_reg;    /* offset into the TRISTATE_REG_* register bank */
        s16 mux_reg;    /* offset into the PIN_MUX_CTL_* register bank */
        s16 pupd_reg;   /* offset into the PULL_UPDOWN_REG_* register bank */
index a475367..a0dc2bc 100644 (file)
 #include <mach/pinmux.h>
 #include <mach/suspend.h>
 
+#define TRISTATE_REG_A         0x14
+#define PIN_MUX_CTL_REG_A      0x80
+#define PULLUPDOWN_REG_A       0xa0
+#define PINGROUP_REG_A         0x868
+
 #define DRIVE_PINGROUP(pg_name, r)                             \
        [TEGRA_DRIVE_PINGROUP_ ## pg_name] = {                  \
                .name = #pg_name,                               \
-               .reg = r                                        \
+               .reg_bank = 3,                                  \
+               .reg = ((r) - PINGROUP_REG_A)                   \
        }
 
 const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = {
@@ -90,11 +96,14 @@ const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE
                        TEGRA_MUX_ ## f3,                       \
                },                                              \
                .func_safe = TEGRA_MUX_ ## f_safe,              \
-               .tri_reg = tri_r,                               \
+               .tri_bank = 0,                                  \
+               .tri_reg = ((tri_r) - TRISTATE_REG_A),          \
                .tri_bit = tri_b,                               \
-               .mux_reg = mux_r,                               \
+               .mux_bank = 1,                                  \
+               .mux_reg = ((mux_r) - PIN_MUX_CTL_REG_A),       \
                .mux_bit = mux_b,                               \
-               .pupd_reg = pupd_r,                             \
+               .pupd_bank = 2,                         \
+               .pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A),      \
                .pupd_bit = pupd_b,                             \
        }
 
@@ -217,62 +226,3 @@ const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = {
        PINGROUP(XM2C,  DDR,   RSVD,      RSVD,      RSVD,      RSVD,          RSVD,      -1,   -1, -1,   -1, 0xA8, 30),
        PINGROUP(XM2D,  DDR,   RSVD,      RSVD,      RSVD,      RSVD,          RSVD,      -1,   -1, -1,   -1, 0xA8, 28),
 };
-
-#ifdef CONFIG_PM
-#define TRISTATE_REG_A         0x14
-#define TRISTATE_REG_NUM       4
-#define PIN_MUX_CTL_REG_A      0x80
-#define PIN_MUX_CTL_REG_NUM    8
-#define PULLUPDOWN_REG_A       0xa0
-#define PULLUPDOWN_REG_NUM     5
-
-static u32 pinmux_reg[TRISTATE_REG_NUM + PIN_MUX_CTL_REG_NUM +
-                     PULLUPDOWN_REG_NUM +
-                     ARRAY_SIZE(tegra_soc_drive_pingroups)];
-
-static inline unsigned long pg_readl(unsigned long offset)
-{
-       return readl(IO_TO_VIRT(TEGRA_APB_MISC_BASE + offset));
-}
-
-static inline void pg_writel(unsigned long value, unsigned long offset)
-{
-       writel(value, IO_TO_VIRT(TEGRA_APB_MISC_BASE + offset));
-}
-
-void tegra_pinmux_suspend(void)
-{
-       unsigned int i;
-       u32 *ctx = pinmux_reg;
-
-       for (i = 0; i < PIN_MUX_CTL_REG_NUM; i++)
-               *ctx++ = pg_readl(PIN_MUX_CTL_REG_A + i*4);
-
-       for (i = 0; i < PULLUPDOWN_REG_NUM; i++)
-               *ctx++ = pg_readl(PULLUPDOWN_REG_A + i*4);
-
-       for (i = 0; i < TRISTATE_REG_NUM; i++)
-               *ctx++ = pg_readl(TRISTATE_REG_A + i*4);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_soc_drive_pingroups); i++)
-               *ctx++ = pg_readl(tegra_soc_drive_pingroups[i].reg);
-}
-
-void tegra_pinmux_resume(void)
-{
-       unsigned int i;
-       u32 *ctx = pinmux_reg;
-
-       for (i = 0; i < PIN_MUX_CTL_REG_NUM; i++)
-               pg_writel(*ctx++, PIN_MUX_CTL_REG_A + i*4);
-
-       for (i = 0; i < PULLUPDOWN_REG_NUM; i++)
-               pg_writel(*ctx++, PULLUPDOWN_REG_A + i*4);
-
-       for (i = 0; i < TRISTATE_REG_NUM; i++)
-               pg_writel(*ctx++, TRISTATE_REG_A + i*4);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_soc_drive_pingroups); i++)
-               pg_writel(*ctx++, tegra_soc_drive_pingroups[i].reg);
-}
-#endif
index f80d507..1d20165 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/errno.h>
 #include <linux/spinlock.h>
 #include <linux/io.h>
+#include <linux/platform_device.h>
 
 #include <mach/iomap.h>
 #include <mach/pinmux.h>
@@ -169,15 +170,17 @@ static const char *pupd_name(unsigned long val)
        }
 }
 
+static int nbanks;
+static void __iomem **regs;
 
-static inline unsigned long pg_readl(unsigned long offset)
+static inline u32 pg_readl(u32 bank, u32 reg)
 {
-       return readl(IO_TO_VIRT(TEGRA_APB_MISC_BASE + offset));
+       return readl(regs[bank] + reg);
 }
 
-static inline void pg_writel(unsigned long value, unsigned long offset)
+static inline void pg_writel(u32 val, u32 bank, u32 reg)
 {
-       writel(value, IO_TO_VIRT(TEGRA_APB_MISC_BASE + offset));
+       writel(val, regs[bank] + reg);
 }
 
 static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config)
@@ -217,10 +220,10 @@ static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config)
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(pingroups[pg].mux_reg);
+       reg = pg_readl(pingroups[pg].mux_bank, pingroups[pg].mux_reg);
        reg &= ~(0x3 << pingroups[pg].mux_bit);
        reg |= mux << pingroups[pg].mux_bit;
-       pg_writel(reg, pingroups[pg].mux_reg);
+       pg_writel(reg, pingroups[pg].mux_bank, pingroups[pg].mux_reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -241,11 +244,11 @@ int tegra_pinmux_set_tristate(enum tegra_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(pingroups[pg].tri_reg);
+       reg = pg_readl(pingroups[pg].tri_bank, pingroups[pg].tri_reg);
        reg &= ~(0x1 << pingroups[pg].tri_bit);
        if (tristate)
                reg |= 1 << pingroups[pg].tri_bit;
-       pg_writel(reg, pingroups[pg].tri_reg);
+       pg_writel(reg, pingroups[pg].tri_bank, pingroups[pg].tri_reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -272,10 +275,10 @@ int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(pingroups[pg].pupd_reg);
+       reg = pg_readl(pingroups[pg].pupd_bank, pingroups[pg].pupd_reg);
        reg &= ~(0x3 << pingroups[pg].pupd_bit);
        reg |= pupd << pingroups[pg].pupd_bit;
-       pg_writel(reg, pingroups[pg].pupd_reg);
+       pg_writel(reg, pingroups[pg].pupd_bank, pingroups[pg].pupd_reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -362,12 +365,12 @@ static int tegra_drive_pinmux_set_hsm(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        if (hsm == TEGRA_HSM_ENABLE)
                reg |= (1 << 2);
        else
                reg &= ~(1 << 2);
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -387,12 +390,12 @@ static int tegra_drive_pinmux_set_schmitt(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        if (schmitt == TEGRA_SCHMITT_ENABLE)
                reg |= (1 << 3);
        else
                reg &= ~(1 << 3);
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -412,10 +415,10 @@ static int tegra_drive_pinmux_set_drive(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        reg &= ~(0x3 << 4);
        reg |= drive << 4;
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -435,10 +438,10 @@ static int tegra_drive_pinmux_set_pull_down(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        reg &= ~(0x1f << 12);
        reg |= pull_down << 12;
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -458,10 +461,10 @@ static int tegra_drive_pinmux_set_pull_up(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        reg &= ~(0x1f << 12);
        reg |= pull_up << 12;
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -481,10 +484,10 @@ static int tegra_drive_pinmux_set_slew_rising(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        reg &= ~(0x3 << 28);
        reg |= slew_rising << 28;
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -504,10 +507,10 @@ static int tegra_drive_pinmux_set_slew_falling(enum tegra_drive_pingroup pg,
 
        spin_lock_irqsave(&mux_lock, flags);
 
-       reg = pg_readl(drive_pingroups[pg].reg);
+       reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
        reg &= ~(0x3 << 30);
        reg |= slew_falling << 30;
-       pg_writel(reg, drive_pingroups[pg].reg);
+       pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
 
        spin_unlock_irqrestore(&mux_lock, flags);
 
@@ -665,6 +668,99 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *co
        }
 }
 
+static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       int i;
+       int config_bad = 0;
+
+       for (i = 0; ; i++) {
+               res = platform_get_resource(pdev, IORESOURCE_MEM, i);
+               if (!res)
+                       break;
+       }
+       nbanks = i;
+
+       for (i = 0; i < TEGRA_MAX_PINGROUP; i++) {
+               if (pingroups[i].tri_bank >= nbanks) {
+                       dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i);
+                       config_bad = 1;
+               }
+
+               if (pingroups[i].mux_bank >= nbanks) {
+                       dev_err(&pdev->dev, "pingroup %d: bad mux_bank\n", i);
+                       config_bad = 1;
+               }
+
+               if (pingroups[i].pupd_bank >= nbanks) {
+                       dev_err(&pdev->dev, "pingroup %d: bad pupd_bank\n", i);
+                       config_bad = 1;
+               }
+       }
+
+       for (i = 0; i < TEGRA_MAX_DRIVE_PINGROUP; i++) {
+               if (drive_pingroups[i].reg_bank >= nbanks) {
+                       dev_err(&pdev->dev,
+                               "drive pingroup %d: bad reg_bank\n", i);
+                       config_bad = 1;
+               }
+       }
+
+       if (config_bad)
+               return -ENODEV;
+
+       regs = devm_kzalloc(&pdev->dev, nbanks * sizeof(*regs), GFP_KERNEL);
+       if (!regs) {
+               dev_err(&pdev->dev, "Can't alloc regs pointer\n");
+               return -ENODEV;
+       }
+
+       for (i = 0; i < nbanks; i++) {
+               res = platform_get_resource(pdev, IORESOURCE_MEM, i);
+               if (!res) {
+                       dev_err(&pdev->dev, "Missing MEM resource\n");
+                       return -ENODEV;
+               }
+
+               if (!devm_request_mem_region(&pdev->dev, res->start,
+                                           resource_size(res),
+                                           dev_name(&pdev->dev))) {
+                       dev_err(&pdev->dev,
+                               "Couldn't request MEM resource %d\n", i);
+                       return -ENODEV;
+               }
+
+               regs[i] = devm_ioremap(&pdev->dev, res->start,
+                                       resource_size(res));
+               if (!regs) {
+                       dev_err(&pdev->dev, "Couldn't ioremap regs %d\n", i);
+                       return -ENODEV;
+               }
+       }
+
+       return 0;
+}
+
+static struct of_device_id tegra_pinmux_of_match[] __devinitdata = {
+       { .compatible = "nvidia,tegra20-pinmux", },
+       { },
+};
+
+static struct platform_driver tegra_pinmux_driver = {
+       .driver         = {
+               .name   = "tegra-pinmux",
+               .owner  = THIS_MODULE,
+               .of_match_table = tegra_pinmux_of_match,
+       },
+       .probe          = tegra_pinmux_probe,
+};
+
+static int __init tegra_pinmux_init(void)
+{
+       return platform_driver_register(&tegra_pinmux_driver);
+}
+postcore_initcall(tegra_pinmux_init);
+
 #ifdef CONFIG_DEBUG_FS
 
 #include <linux/debugfs.h>
@@ -684,6 +780,7 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused)
        int len;
 
        for (i = 0; i < TEGRA_MAX_PINGROUP; i++) {
+               unsigned long reg;
                unsigned long tri;
                unsigned long mux;
                unsigned long pupd;
@@ -696,8 +793,9 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused)
                        seq_printf(s, "TEGRA_MUX_NONE");
                        len = strlen("NONE");
                } else {
-                       mux = (pg_readl(pingroups[i].mux_reg) >>
-                              pingroups[i].mux_bit) & 0x3;
+                       reg = pg_readl(pingroups[i].mux_bank,
+                                       pingroups[i].mux_reg);
+                       mux = (reg >> pingroups[i].mux_bit) & 0x3;
                        if (pingroups[i].funcs[mux] == TEGRA_MUX_RSVD) {
                                seq_printf(s, "TEGRA_MUX_RSVD%1lu", mux+1);
                                len = 5;
@@ -713,8 +811,9 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused)
                        seq_printf(s, "TEGRA_PUPD_NORMAL");
                        len = strlen("NORMAL");
                } else {
-                       pupd = (pg_readl(pingroups[i].pupd_reg) >>
-                               pingroups[i].pupd_bit) & 0x3;
+                       reg = pg_readl(pingroups[i].pupd_bank,
+                                       pingroups[i].pupd_reg);
+                       pupd = (reg >> pingroups[i].pupd_bit) & 0x3;
                        seq_printf(s, "TEGRA_PUPD_%s", pupd_name(pupd));
                        len = strlen(pupd_name(pupd));
                }
@@ -723,8 +822,9 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused)
                if (pingroups[i].tri_reg < 0) {
                        seq_printf(s, "TEGRA_TRI_NORMAL");
                } else {
-                       tri = (pg_readl(pingroups[i].tri_reg) >>
-                              pingroups[i].tri_bit) & 0x1;
+                       reg = pg_readl(pingroups[i].tri_bank,
+                                       pingroups[i].tri_reg);
+                       tri = (reg >> pingroups[i].tri_bit) & 0x1;
 
                        seq_printf(s, "TEGRA_TRI_%s", tri_name(tri));
                }
@@ -759,7 +859,8 @@ static int dbg_drive_pinmux_show(struct seq_file *s, void *unused)
                dbg_pad_field(s, 7 - len);
 
 
-               reg = pg_readl(drive_pingroups[i].reg);
+               reg = pg_readl(drive_pingroups[i].reg_bank,
+                               drive_pingroups[i].reg);
                if (HSM_EN(reg)) {
                        seq_printf(s, "TEGRA_HSM_ENABLE");
                        len = 16;
index 4c8fdbc..4bdc975 100644 (file)
@@ -4,50 +4,31 @@ source "arch/arm/plat-mxc/devices/Kconfig"
 
 menu "Freescale MXC Implementations"
 
-config ARCH_MX50_SUPPORTED
-       bool
-
-config ARCH_MX53_SUPPORTED
-       bool
-
 choice
        prompt "Freescale CPU family:"
        default ARCH_MX3
 
-config ARCH_MX1
-       bool "MX1-based"
-       help
-         This enables support for systems based on the Freescale i.MX1 family
-
-config ARCH_MX2
-       bool "MX2-based"
-       help
-         This enables support for systems based on the Freescale i.MX2 family
-
-config ARCH_MX25
-       bool "MX25-based"
+config ARCH_IMX_V4_V5
+       bool "i.MX1, i.MX21, i.MX25, i.MX27"
+       select AUTO_ZRELADDR
+       select ARM_PATCH_PHYS_VIRT
        help
-         This enables support for systems based on the Freescale i.MX25 family
+         This enables support for systems based on the Freescale i.MX ARMv4
+         and ARMv5 SoCs
 
 config ARCH_MX3
        bool "MX3-based"
        help
          This enables support for systems based on the Freescale i.MX3 family
 
-config ARCH_MX503
-       bool "i.MX50 + i.MX53"
-       select ARCH_MX50_SUPPORTED
-       select ARCH_MX53_SUPPORTED
+config ARCH_MX5
+       bool "i.MX50, i.MX51, i.MX53"
+       select AUTO_ZRELADDR
+       select ARM_PATCH_PHYS_VIRT
        help
          This enables support for machines using Freescale's i.MX50 and i.MX53
          processors.
 
-config ARCH_MX51
-       bool "i.MX51"
-       select ARCH_MX51_SUPPORTED
-       help
-         This enables support for systems based on the Freescale i.MX51 family
-
 endchoice
 
 source "arch/arm/mach-imx/Kconfig"
index 55d2534..8875fb4 100644 (file)
@@ -50,6 +50,8 @@
 
 void __iomem *avic_base;
 
+static u32 avic_saved_mask_reg[2];
+
 #ifdef CONFIG_MXC_IRQ_PRIOR
 static int avic_irq_set_priority(unsigned char irq, unsigned char prio)
 {
@@ -90,24 +92,8 @@ static int avic_set_irq_fiq(unsigned int irq, unsigned int type)
 }
 #endif /* CONFIG_FIQ */
 
-/* Disable interrupt number "irq" in the AVIC */
-static void mxc_mask_irq(struct irq_data *d)
-{
-       __raw_writel(d->irq, avic_base + AVIC_INTDISNUM);
-}
 
-/* Enable interrupt number "irq" in the AVIC */
-static void mxc_unmask_irq(struct irq_data *d)
-{
-       __raw_writel(d->irq, avic_base + AVIC_INTENNUM);
-}
-
-static struct mxc_irq_chip mxc_avic_chip = {
-       .base = {
-               .irq_ack = mxc_mask_irq,
-               .irq_mask = mxc_mask_irq,
-               .irq_unmask = mxc_unmask_irq,
-       },
+static struct mxc_extra_irq avic_extra_irq = {
 #ifdef CONFIG_MXC_IRQ_PRIOR
        .set_priority = avic_irq_set_priority,
 #endif
@@ -116,6 +102,68 @@ static struct mxc_irq_chip mxc_avic_chip = {
 #endif
 };
 
+#ifdef CONFIG_PM
+static void avic_irq_suspend(struct irq_data *d)
+{
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct irq_chip_type *ct = gc->chip_types;
+       int idx = gc->irq_base >> 5;
+
+       avic_saved_mask_reg[idx] = __raw_readl(avic_base + ct->regs.mask);
+       __raw_writel(gc->wake_active, avic_base + ct->regs.mask);
+}
+
+static void avic_irq_resume(struct irq_data *d)
+{
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct irq_chip_type *ct = gc->chip_types;
+       int idx = gc->irq_base >> 5;
+
+       __raw_writel(avic_saved_mask_reg[idx], avic_base + ct->regs.mask);
+}
+
+#else
+#define avic_irq_suspend NULL
+#define avic_irq_resume NULL
+#endif
+
+static __init void avic_init_gc(unsigned int irq_start)
+{
+       struct irq_chip_generic *gc;
+       struct irq_chip_type *ct;
+       int idx = irq_start >> 5;
+
+       gc = irq_alloc_generic_chip("mxc-avic", 1, irq_start, avic_base,
+                                   handle_level_irq);
+       gc->private = &avic_extra_irq;
+       gc->wake_enabled = IRQ_MSK(32);
+
+       ct = gc->chip_types;
+       ct->chip.irq_mask = irq_gc_mask_clr_bit;
+       ct->chip.irq_unmask = irq_gc_mask_set_bit;
+       ct->chip.irq_ack = irq_gc_mask_clr_bit;
+       ct->chip.irq_set_wake = irq_gc_set_wake;
+       ct->chip.irq_suspend = avic_irq_suspend;
+       ct->chip.irq_resume = avic_irq_resume;
+       ct->regs.mask = !idx ? AVIC_INTENABLEL : AVIC_INTENABLEH;
+       ct->regs.ack = ct->regs.mask;
+
+       irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
+}
+
+asmlinkage void __exception_irq_entry avic_handle_irq(struct pt_regs *regs)
+{
+       u32 nivector;
+
+       do {
+               nivector = __raw_readl(avic_base + AVIC_NIVECSR) >> 16;
+               if (nivector == 0xffff)
+                       break;
+
+               handle_IRQ(nivector, regs);
+       } while (1);
+}
+
 /*
  * This function initializes the AVIC hardware and disables all the
  * interrupts. It registers the interrupt enable and disable functions
@@ -140,11 +188,9 @@ void __init mxc_init_irq(void __iomem *irqbase)
        /* all IRQ no FIQ */
        __raw_writel(0, avic_base + AVIC_INTTYPEH);
        __raw_writel(0, avic_base + AVIC_INTTYPEL);
-       for (i = 0; i < AVIC_NUM_IRQS; i++) {
-               irq_set_chip_and_handler(i, &mxc_avic_chip.base,
-                                        handle_level_irq);
-               set_irq_flags(i, IRQF_VALID);
-       }
+
+       for (i = 0; i < AVIC_NUM_IRQS; i += 32)
+               avic_init_gc(i);
 
        /* Set default priority value (0) for all IRQ's */
        for (i = 0; i < 8; i++)
@@ -157,4 +203,3 @@ void __init mxc_init_irq(void __iomem *irqbase)
 
        printk(KERN_INFO "MXC IRQ initialized\n");
 }
-
index 386e0d5..f5b7e0f 100644 (file)
@@ -1,5 +1,6 @@
 
 #include <linux/module.h>
+#include <mach/hardware.h>
 
 unsigned int __mxc_cpu_type;
 EXPORT_SYMBOL(__mxc_cpu_type);
@@ -9,3 +10,11 @@ void mxc_set_cpu_type(unsigned int type)
        __mxc_cpu_type = type;
 }
 
+void imx_print_silicon_rev(const char *cpu, int srev)
+{
+       if (srev == IMX_CHIP_REVISION_UNKNOWN)
+               pr_info("CPU identified as %s, unknown revision\n", cpu);
+       else
+               pr_info("CPU identified as %s, silicon rev %d.%d\n",
+                               cpu, (srev >> 4) & 0xf, srev & 0xf);
+}
index d7149d1..ace4bb5 100644 (file)
@@ -82,4 +82,19 @@ enum mxc_cpu_pwr_mode {
 
 extern void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode);
 extern void (*imx_idle)(void);
+extern void imx_print_silicon_rev(const char *cpu, int srev);
+
+void avic_handle_irq(struct pt_regs *);
+void tzic_handle_irq(struct pt_regs *);
+
+#define imx1_handle_irq avic_handle_irq
+#define imx21_handle_irq avic_handle_irq
+#define imx25_handle_irq avic_handle_irq
+#define imx27_handle_irq avic_handle_irq
+#define imx31_handle_irq avic_handle_irq
+#define imx35_handle_irq avic_handle_irq
+#define imx50_handle_irq tzic_handle_irq
+#define imx51_handle_irq tzic_handle_irq
+#define imx53_handle_irq tzic_handle_irq
+
 #endif
index 066d464..842fbcb 100644 (file)
@@ -9,72 +9,16 @@
  * published by the Free Software Foundation.
  */
 
-#include <mach/hardware.h>
+/* Unused, we use CONFIG_MULTI_IRQ_HANDLER */
 
-#define AVIC_NIMASK    0x04
-
-       @ this macro disables fast irq (not implemented)
        .macro  disable_fiq
        .endm
 
        .macro  get_irqnr_preamble, base, tmp
-#ifndef CONFIG_MXC_TZIC
-       ldr     \base, =avic_base
-       ldr     \base, [\base]
-#ifdef CONFIG_MXC_IRQ_PRIOR
-       ldr     r4, [\base, #AVIC_NIMASK]
-#endif
-#elif defined CONFIG_MXC_TZIC
-       ldr     \base, =tzic_base
-       ldr     \base, [\base]
-#endif /* CONFIG_MXC_TZIC */
        .endm
 
        .macro  arch_ret_to_user, tmp1, tmp2
        .endm
 
-       @ this macro checks which interrupt occurred
-       @ and returns its number in irqnr
-       @ and returns if an interrupt occurred in irqstat
        .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-#ifndef CONFIG_MXC_TZIC
-       @ Load offset & priority of the highest priority
-       @ interrupt pending from AVIC_NIVECSR
-       ldr     \irqstat, [\base, #0x40]
-       @ Shift to get the decoded IRQ number, using ASR so
-       @ 'no interrupt pending' becomes 0xffffffff
-       mov     \irqnr, \irqstat, asr #16
-       @ set zero flag if IRQ + 1 == 0
-       adds    \tmp, \irqnr, #1
-#ifdef CONFIG_MXC_IRQ_PRIOR
-       bicne   \tmp, \irqstat, #0xFFFFFFE0
-       strne   \tmp, [\base, #AVIC_NIMASK]
-       streq   r4, [\base, #AVIC_NIMASK]
-#endif
-#elif defined CONFIG_MXC_TZIC
-       @ Load offset & priority of the highest priority
-       @ interrupt pending.
-       @ 0x080 is INTSEC0 register
-       @ 0xD80 is HIPND0 register
-       mov     \irqnr, #0
-1000:  add     \irqstat, \base, \irqnr, lsr #3
-       ldr     \tmp, [\irqstat, #0xd80]
-       ldr     \irqstat, [\irqstat, #0x080]
-       ands    \tmp, \tmp, \irqstat
-       bne     1001f
-       add     \irqnr, \irqnr, #32
-       cmp     \irqnr, #128
-       blo     1000b
-       b       2001f
-1001:  mov     \irqstat, #1
-1002:  tst     \tmp, \irqstat
-       bne     2002f
-       movs    \tmp, \tmp, lsr #1
-       addne   \irqnr, \irqnr, #1
-       bne     1002b
-2001:
-       mov  \irqnr, #0
-2002:
-       movs \irqnr, \irqnr
-#endif
        .endm
index c92f0b1..63f22a0 100644 (file)
@@ -735,6 +735,7 @@ enum iomux_pins {
 #define MX31_PIN_KEY_COL5_KEY_COL5     IOMUX_MODE(MX31_PIN_KEY_COL5, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_COL6_KEY_COL6     IOMUX_MODE(MX31_PIN_KEY_COL6, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_COL7_KEY_COL7     IOMUX_MODE(MX31_PIN_KEY_COL7, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_WATCHDOG_RST__WATCHDOG_RST    IOMUX_MODE(MX31_PIN_WATCHDOG_RST, IOMUX_CONFIG_FUNC)
 
 
 /*
index 087cd7a..ccebf5b 100644 (file)
@@ -41,6 +41,7 @@
 #define MX25_SSI2_BASE_ADDR            0x50014000
 #define MX25_SSI1_BASE_ADDR            0x50034000
 #define MX25_NFC_BASE_ADDR             0xbb000000
+#define MX25_IIM_BASE_ADDR             0x53ff0000
 #define MX25_DRYICE_BASE_ADDR          0x53ffc000
 #define MX25_ESDHC1_BASE_ADDR          0x53fb4000
 #define MX25_ESDHC2_BASE_ADDR          0x53fb8000
 #define MX25_DMA_REQ_SSI1_RX0  28
 #define MX25_DMA_REQ_SSI1_TX0  29
 
+#ifndef __ASSEMBLY__
+extern int mx25_revision(void);
+#endif
+
 #endif /* ifndef __MACH_MX25_H__ */
index 388a407..30dbf42 100644 (file)
 /* Mandatory defines used globally */
 
 #if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)
-
-extern unsigned int mx31_cpu_rev;
-extern void mx31_read_cpu_rev(void);
-
-static inline int mx31_revision(void)
-{
-       return mx31_cpu_rev;
-}
-
-extern unsigned int mx35_cpu_rev;
-extern void mx35_read_cpu_rev(void);
-
-static inline int mx35_revision(void)
-{
-       return mx35_cpu_rev;
-}
+extern int mx35_revision(void);
+extern int mx31_revision(void);
 #endif
 
 #endif /* ifndef __MACH_MX3x_H__ */
index 96953e2..b6e1145 100644 (file)
 
 int imx_irq_set_priority(unsigned char irq, unsigned char prio)
 {
-       struct mxc_irq_chip *chip;
-       struct irq_chip *base;
+       struct irq_chip_generic *gc;
+       struct mxc_extra_irq *exirq;
        int ret;
 
        ret = -ENOSYS;
 
-       base = irq_get_chip(irq);
-       if (base) {
-               chip = container_of(base, struct mxc_irq_chip, base);
-               if (chip->set_priority)
-                       ret = chip->set_priority(irq, prio);
+       gc = irq_get_chip_data(irq);
+       if (gc && gc->private) {
+               exirq = gc->private;
+               if (exirq->set_priority)
+                       ret = exirq->set_priority(irq, prio);
        }
 
        return ret;
@@ -43,15 +43,16 @@ EXPORT_SYMBOL(imx_irq_set_priority);
 int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
 {
        struct irq_chip_generic *gc;
-       int (*set_irq_fiq)(unsigned int, unsigned int);
+       struct mxc_extra_irq *exirq;
        int ret;
 
        ret = -ENOSYS;
 
        gc = irq_get_chip_data(irq);
        if (gc && gc->private) {
-               set_irq_fiq = gc->private;
-               ret = set_irq_fiq(irq, type);
+               exirq = gc->private;
+               if (exirq->set_irq_fiq)
+                       ret = exirq->set_irq_fiq(irq, type);
        }
 
        return ret;
index 7203543..6ccb3a1 100644 (file)
@@ -19,9 +19,8 @@
 #ifndef __PLAT_MXC_IRQ_COMMON_H__
 #define __PLAT_MXC_IRQ_COMMON_H__
 
-struct mxc_irq_chip
+struct mxc_extra_irq
 {
-       struct irq_chip base;
        int (*set_priority)(unsigned char irq, unsigned char prio);
        int (*set_irq_fiq)(unsigned int irq, unsigned int type);
 };
index 761c3c9..42d74ea 100644 (file)
@@ -57,7 +57,7 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
        if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
                return -EINVAL;
 
-       if (cpu_is_mx27() || cpu_is_mx3() || cpu_is_mx25() || cpu_is_mx51()) {
+       if (!(cpu_is_mx1() || cpu_is_mx21())) {
                unsigned long long c;
                unsigned long period_cycles, duty_cycles, prescale;
                u32 cr;
index f257fcc..e993a18 100644 (file)
@@ -42,7 +42,7 @@
 #define TZIC_SRCCLAR0  0x0280  /* Source Clear Register 0 */
 #define TZIC_PRIORITY0 0x0400  /* Priority Register 0 */
 #define TZIC_PND0      0x0D00  /* Pending Register 0 */
-#define TZIC_HIPND0    0x0D80  /* High Priority Pending Register */
+#define TZIC_HIPND(i)  (0x0D80+ ((i) << 2))    /* High Priority Pending Register */
 #define TZIC_WAKEUP0(i)        (0x0E00 + ((i) << 2))   /* Wakeup Config Register */
 #define TZIC_SWINT     0x0F00  /* Software Interrupt Rigger Register */
 #define TZIC_ID0       0x0FD0  /* Indentification Register 0 */
@@ -74,6 +74,12 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)
 
 static unsigned int *wakeup_intr[4];
 
+static struct mxc_extra_irq tzic_extra_irq = {
+#ifdef CONFIG_FIQ
+       .set_irq_fiq = tzic_set_irq_fiq,
+#endif
+};
+
 static __init void tzic_init_gc(unsigned int irq_start)
 {
        struct irq_chip_generic *gc;
@@ -82,7 +88,7 @@ static __init void tzic_init_gc(unsigned int irq_start)
 
        gc = irq_alloc_generic_chip("tzic", 1, irq_start, tzic_base,
                                    handle_level_irq);
-       gc->private = tzic_set_irq_fiq;
+       gc->private = &tzic_extra_irq;
        gc->wake_enabled = IRQ_MSK(32);
        wakeup_intr[idx] = &gc->wake_active;
 
@@ -96,6 +102,28 @@ static __init void tzic_init_gc(unsigned int irq_start)
        irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
 }
 
+asmlinkage void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)
+{
+       u32 stat;
+       int i, irqofs, handled;
+
+       do {
+               handled = 0;
+
+               for (i = 0; i < 4; i++) {
+                       stat = __raw_readl(tzic_base + TZIC_HIPND(i)) &
+                               __raw_readl(tzic_base + TZIC_INTSEC0(i));
+
+                       while (stat) {
+                               handled = 1;
+                               irqofs = fls(stat) - 1;
+                               handle_IRQ(irqofs + i * 32, regs);
+                               stat &= ~(1 << irqofs);
+                       }
+               }
+       } while (handled);
+}
+
 /*
  * This function initializes the TZIC hardware and disables all the
  * interrupts. It registers the interrupt enable and disable functions
index 6b65207..61044c8 100644 (file)
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
-
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
 
 #include <asm/mach/irq.h>
 
@@ -35,9 +36,7 @@
 #define GPIO_PORT(x)           (((x) >> 3) & 0x3)
 #define GPIO_BIT(x)            ((x) & 0x7)
 
-#define GPIO_REG(x)            (IO_TO_VIRT(TEGRA_GPIO_BASE) +  \
-                                GPIO_BANK(x) * 0x80 +          \
-                                GPIO_PORT(x) * 4)
+#define GPIO_REG(x)            (GPIO_BANK(x) * 0x80 + GPIO_PORT(x) * 4)
 
 #define GPIO_CNF(x)            (GPIO_REG(x) + 0x00)
 #define GPIO_OE(x)             (GPIO_REG(x) + 0x10)
@@ -76,15 +75,18 @@ struct tegra_gpio_bank {
 };
 
 
-static struct tegra_gpio_bank tegra_gpio_banks[] = {
-       {.bank = 0, .irq = INT_GPIO1},
-       {.bank = 1, .irq = INT_GPIO2},
-       {.bank = 2, .irq = INT_GPIO3},
-       {.bank = 3, .irq = INT_GPIO4},
-       {.bank = 4, .irq = INT_GPIO5},
-       {.bank = 5, .irq = INT_GPIO6},
-       {.bank = 6, .irq = INT_GPIO7},
-};
+static void __iomem *regs;
+static struct tegra_gpio_bank tegra_gpio_banks[7];
+
+static inline void tegra_gpio_writel(u32 val, u32 reg)
+{
+       __raw_writel(val, regs + reg);
+}
+
+static inline u32 tegra_gpio_readl(u32 reg)
+{
+       return __raw_readl(regs + reg);
+}
 
 static int tegra_gpio_compose(int bank, int port, int bit)
 {
@@ -98,7 +100,7 @@ static void tegra_gpio_mask_write(u32 reg, int gpio, int value)
        val = 0x100 << GPIO_BIT(gpio);
        if (value)
                val |= 1 << GPIO_BIT(gpio);
-       __raw_writel(val, reg);
+       tegra_gpio_writel(val, reg);
 }
 
 void tegra_gpio_enable(int gpio)
@@ -118,7 +120,7 @@ static void tegra_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 
 static int tegra_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
-       return (__raw_readl(GPIO_IN(offset)) >> GPIO_BIT(offset)) & 0x1;
+       return (tegra_gpio_readl(GPIO_IN(offset)) >> GPIO_BIT(offset)) & 0x1;
 }
 
 static int tegra_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
@@ -155,7 +157,7 @@ static void tegra_gpio_irq_ack(struct irq_data *d)
 {
        int gpio = d->irq - INT_GPIO_BASE;
 
-       __raw_writel(1 << GPIO_BIT(gpio), GPIO_INT_CLR(gpio));
+       tegra_gpio_writel(1 << GPIO_BIT(gpio), GPIO_INT_CLR(gpio));
 }
 
 static void tegra_gpio_irq_mask(struct irq_data *d)
@@ -208,10 +210,10 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 
        spin_lock_irqsave(&bank->lvl_lock[port], flags);
 
-       val = __raw_readl(GPIO_INT_LVL(gpio));
+       val = tegra_gpio_readl(GPIO_INT_LVL(gpio));
        val &= ~(GPIO_INT_LVL_MASK << GPIO_BIT(gpio));
        val |= lvl_type << GPIO_BIT(gpio);
-       __raw_writel(val, GPIO_INT_LVL(gpio));
+       tegra_gpio_writel(val, GPIO_INT_LVL(gpio));
 
        spin_unlock_irqrestore(&bank->lvl_lock[port], flags);
 
@@ -237,12 +239,12 @@ static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 
        for (port = 0; port < 4; port++) {
                int gpio = tegra_gpio_compose(bank->bank, port, 0);
-               unsigned long sta = __raw_readl(GPIO_INT_STA(gpio)) &
-                       __raw_readl(GPIO_INT_ENB(gpio));
-               u32 lvl = __raw_readl(GPIO_INT_LVL(gpio));
+               unsigned long sta = tegra_gpio_readl(GPIO_INT_STA(gpio)) &
+                       tegra_gpio_readl(GPIO_INT_ENB(gpio));
+               u32 lvl = tegra_gpio_readl(GPIO_INT_LVL(gpio));
 
                for_each_set_bit(pin, &sta, 8) {
-                       __raw_writel(1 << pin, GPIO_INT_CLR(gpio));
+                       tegra_gpio_writel(1 << pin, GPIO_INT_CLR(gpio));
 
                        /* if gpio is edge triggered, clear condition
                         * before executing the hander so that we don't
@@ -276,11 +278,11 @@ void tegra_gpio_resume(void)
 
                for (p = 0; p < ARRAY_SIZE(bank->oe); p++) {
                        unsigned int gpio = (b<<5) | (p<<3);
-                       __raw_writel(bank->cnf[p], GPIO_CNF(gpio));
-                       __raw_writel(bank->out[p], GPIO_OUT(gpio));
-                       __raw_writel(bank->oe[p], GPIO_OE(gpio));
-                       __raw_writel(bank->int_lvl[p], GPIO_INT_LVL(gpio));
-                       __raw_writel(bank->int_enb[p], GPIO_INT_ENB(gpio));
+                       tegra_gpio_writel(bank->cnf[p], GPIO_CNF(gpio));
+                       tegra_gpio_writel(bank->out[p], GPIO_OUT(gpio));
+                       tegra_gpio_writel(bank->oe[p], GPIO_OE(gpio));
+                       tegra_gpio_writel(bank->int_lvl[p], GPIO_INT_LVL(gpio));
+                       tegra_gpio_writel(bank->int_enb[p], GPIO_INT_ENB(gpio));
                }
        }
 
@@ -299,11 +301,11 @@ void tegra_gpio_suspend(void)
 
                for (p = 0; p < ARRAY_SIZE(bank->oe); p++) {
                        unsigned int gpio = (b<<5) | (p<<3);
-                       bank->cnf[p] = __raw_readl(GPIO_CNF(gpio));
-                       bank->out[p] = __raw_readl(GPIO_OUT(gpio));
-                       bank->oe[p] = __raw_readl(GPIO_OE(gpio));
-                       bank->int_enb[p] = __raw_readl(GPIO_INT_ENB(gpio));
-                       bank->int_lvl[p] = __raw_readl(GPIO_INT_LVL(gpio));
+                       bank->cnf[p] = tegra_gpio_readl(GPIO_CNF(gpio));
+                       bank->out[p] = tegra_gpio_readl(GPIO_OUT(gpio));
+                       bank->oe[p] = tegra_gpio_readl(GPIO_OE(gpio));
+                       bank->int_enb[p] = tegra_gpio_readl(GPIO_INT_ENB(gpio));
+                       bank->int_lvl[p] = tegra_gpio_readl(GPIO_INT_LVL(gpio));
                }
        }
        local_irq_restore(flags);
@@ -333,28 +335,55 @@ static struct irq_chip tegra_gpio_irq_chip = {
  */
 static struct lock_class_key gpio_lock_class;
 
-static int __init tegra_gpio_init(void)
+static int __devinit tegra_gpio_probe(struct platform_device *pdev)
 {
+       struct resource *res;
        struct tegra_gpio_bank *bank;
        int gpio;
        int i;
        int j;
 
+       for (i = 0; i < ARRAY_SIZE(tegra_gpio_banks); i++) {
+               res = platform_get_resource(pdev, IORESOURCE_IRQ, i);
+               if (!res) {
+                       dev_err(&pdev->dev, "Missing IRQ resource\n");
+                       return -ENODEV;
+               }
+
+               bank = &tegra_gpio_banks[i];
+               bank->bank = i;
+               bank->irq = res->start;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "Missing MEM resource\n");
+               return -ENODEV;
+       }
+
+       if (!devm_request_mem_region(&pdev->dev, res->start,
+                                    resource_size(res),
+                                    dev_name(&pdev->dev))) {
+               dev_err(&pdev->dev, "Couldn't request MEM resource\n");
+               return -ENODEV;
+       }
+
+       regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+       if (!regs) {
+               dev_err(&pdev->dev, "Couldn't ioremap regs\n");
+               return -ENODEV;
+       }
+
        for (i = 0; i < 7; i++) {
                for (j = 0; j < 4; j++) {
                        int gpio = tegra_gpio_compose(i, j, 0);
-                       __raw_writel(0x00, GPIO_INT_ENB(gpio));
+                       tegra_gpio_writel(0x00, GPIO_INT_ENB(gpio));
                }
        }
 
 #ifdef CONFIG_OF_GPIO
-       /*
-        * This isn't ideal, but it gets things hooked up until this
-        * driver is converted into a platform_device
-        */
-       tegra_gpio_chip.of_node = of_find_compatible_node(NULL, NULL,
-                                               "nvidia,tegra20-gpio");
-#endif /* CONFIG_OF_GPIO */
+       tegra_gpio_chip.of_node = pdev->dev.of_node;
+#endif
 
        gpiochip_add(&tegra_gpio_chip);
 
@@ -384,6 +413,24 @@ static int __init tegra_gpio_init(void)
        return 0;
 }
 
+static struct of_device_id tegra_gpio_of_match[] __devinitdata = {
+       { .compatible = "nvidia,tegra20-gpio", },
+       { },
+};
+
+static struct platform_driver tegra_gpio_driver = {
+       .driver         = {
+               .name   = "tegra-gpio",
+               .owner  = THIS_MODULE,
+               .of_match_table = tegra_gpio_of_match,
+       },
+       .probe          = tegra_gpio_probe,
+};
+
+static int __init tegra_gpio_init(void)
+{
+       return platform_driver_register(&tegra_gpio_driver);
+}
 postcore_initcall(tegra_gpio_init);
 
 void __init tegra_gpio_config(struct tegra_gpio_table *table, int num)
@@ -416,13 +463,13 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
                        seq_printf(s,
                                "%d:%d %02x %02x %02x %02x %02x %02x %06x\n",
                                i, j,
-                               __raw_readl(GPIO_CNF(gpio)),
-                               __raw_readl(GPIO_OE(gpio)),
-                               __raw_readl(GPIO_OUT(gpio)),
-                               __raw_readl(GPIO_IN(gpio)),
-                               __raw_readl(GPIO_INT_STA(gpio)),
-                               __raw_readl(GPIO_INT_ENB(gpio)),
-                               __raw_readl(GPIO_INT_LVL(gpio)));
+                               tegra_gpio_readl(GPIO_CNF(gpio)),
+                               tegra_gpio_readl(GPIO_OE(gpio)),
+                               tegra_gpio_readl(GPIO_OUT(gpio)),
+                               tegra_gpio_readl(GPIO_IN(gpio)),
+                               tegra_gpio_readl(GPIO_INT_STA(gpio)),
+                               tegra_gpio_readl(GPIO_INT_ENB(gpio)),
+                               tegra_gpio_readl(GPIO_INT_LVL(gpio)));
                }
        }
        return 0;
index 0076c74..64a8325 100644 (file)
@@ -807,12 +807,25 @@ static void calculate_clk_divider(struct mmc_host *mmc, struct mmc_ios *ios)
 static void mmc_davinci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
        struct mmc_davinci_host *host = mmc_priv(mmc);
+       struct platform_device *pdev = to_platform_device(mmc->parent);
+       struct davinci_mmc_config *config = pdev->dev.platform_data;
 
        dev_dbg(mmc_dev(host->mmc),
                "clock %dHz busmode %d powermode %d Vdd %04x\n",
                ios->clock, ios->bus_mode, ios->power_mode,
                ios->vdd);
 
+       switch (ios->power_mode) {
+       case MMC_POWER_OFF:
+               if (config && config->set_power)
+                       config->set_power(pdev->id, false);
+               break;
+       case MMC_POWER_UP:
+               if (config && config->set_power)
+                       config->set_power(pdev->id, true);
+               break;
+       }
+
        switch (ios->bus_width) {
        case MMC_BUS_WIDTH_8:
                dev_dbg(mmc_dev(host->mmc), "Enabling 8 bit mode\n");
index 944291e..ba3a46b 100644 (file)
@@ -35,8 +35,7 @@ extern int usb_disabled(void);
 
 static void at91_start_clock(void)
 {
-       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10())
-               clk_enable(hclk);
+       clk_enable(hclk);
        clk_enable(iclk);
        clk_enable(fclk);
        clocked = 1;
@@ -46,8 +45,7 @@ static void at91_stop_clock(void)
 {
        clk_disable(fclk);
        clk_disable(iclk);
-       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10())
-               clk_disable(hclk);
+       clk_disable(hclk);
        clocked = 0;
 }
 
@@ -142,8 +140,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
 
        iclk = clk_get(&pdev->dev, "ohci_clk");
        fclk = clk_get(&pdev->dev, "uhpck");
-       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10())
-               hclk = clk_get(&pdev->dev, "hck0");
+       hclk = clk_get(&pdev->dev, "hclk");
 
        at91_start_hc(pdev);
        ohci_hcd_init(hcd_to_ohci(hcd));
@@ -155,8 +152,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
        /* Error handling */
        at91_stop_hc(pdev);
 
-       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10())
-               clk_put(hclk);
+       clk_put(hclk);
        clk_put(fclk);
        clk_put(iclk);
 
@@ -192,8 +188,7 @@ static void usb_hcd_at91_remove(struct usb_hcd *hcd,
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
 
-       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10())
-               clk_put(hclk);
+       clk_put(hclk);
        clk_put(fclk);
        clk_put(iclk);
        fclk = iclk = hclk = NULL;
@@ -223,6 +218,156 @@ ohci_at91_start (struct usb_hcd *hcd)
        return 0;
 }
 
+static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int enable)
+{
+       if (port < 0 || port >= 2)
+               return;
+
+       gpio_set_value(pdata->vbus_pin[port], !pdata->vbus_pin_inverted ^ enable);
+}
+
+static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port)
+{
+       if (port < 0 || port >= 2)
+               return -EINVAL;
+
+       return gpio_get_value(pdata->vbus_pin[port]) ^ !pdata->vbus_pin_inverted;
+}
+
+/*
+ * Update the status data from the hub with the over-current indicator change.
+ */
+static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf)
+{
+       struct at91_usbh_data *pdata = hcd->self.controller->platform_data;
+       int length = ohci_hub_status_data(hcd, buf);
+       int port;
+
+       for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) {
+               if (pdata->overcurrent_changed[port]) {
+                       if (! length)
+                               length = 1;
+                       buf[0] |= 1 << (port + 1);
+               }
+       }
+
+       return length;
+}
+
+/*
+ * Look at the control requests to the root hub and see if we need to override.
+ */
+static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
+                                u16 wIndex, char *buf, u16 wLength)
+{
+       struct at91_usbh_data *pdata = hcd->self.controller->platform_data;
+       struct usb_hub_descriptor *desc;
+       int ret = -EINVAL;
+       u32 *data = (u32 *)buf;
+
+       dev_dbg(hcd->self.controller,
+               "ohci_at91_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n",
+               hcd, typeReq, wValue, wIndex, buf, wLength);
+
+       switch (typeReq) {
+       case SetPortFeature:
+               if (wValue == USB_PORT_FEAT_POWER) {
+                       dev_dbg(hcd->self.controller, "SetPortFeat: POWER\n");
+                       ohci_at91_usb_set_power(pdata, wIndex - 1, 1);
+                       goto out;
+               }
+               break;
+
+       case ClearPortFeature:
+               switch (wValue) {
+               case USB_PORT_FEAT_C_OVER_CURRENT:
+                       dev_dbg(hcd->self.controller,
+                               "ClearPortFeature: C_OVER_CURRENT\n");
+
+                       if (wIndex == 1 || wIndex == 2) {
+                               pdata->overcurrent_changed[wIndex-1] = 0;
+                               pdata->overcurrent_status[wIndex-1] = 0;
+                       }
+
+                       goto out;
+
+               case USB_PORT_FEAT_OVER_CURRENT:
+                       dev_dbg(hcd->self.controller,
+                               "ClearPortFeature: OVER_CURRENT\n");
+
+                       if (wIndex == 1 || wIndex == 2) {
+                               pdata->overcurrent_status[wIndex-1] = 0;
+                       }
+
+                       goto out;
+
+               case USB_PORT_FEAT_POWER:
+                       dev_dbg(hcd->self.controller,
+                               "ClearPortFeature: POWER\n");
+
+                       if (wIndex == 1 || wIndex == 2) {
+                               ohci_at91_usb_set_power(pdata, wIndex - 1, 0);
+                               return 0;
+                       }
+               }
+               break;
+       }
+
+       ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
+       if (ret)
+               goto out;
+
+       switch (typeReq) {
+       case GetHubDescriptor:
+
+               /* update the hub's descriptor */
+
+               desc = (struct usb_hub_descriptor *)buf;
+
+               dev_dbg(hcd->self.controller, "wHubCharacteristics 0x%04x\n",
+                       desc->wHubCharacteristics);
+
+               /* remove the old configurations for power-switching, and
+                * over-current protection, and insert our new configuration
+                */
+
+               desc->wHubCharacteristics &= ~cpu_to_le16(HUB_CHAR_LPSM);
+               desc->wHubCharacteristics |= cpu_to_le16(0x0001);
+
+               if (pdata->overcurrent_supported) {
+                       desc->wHubCharacteristics &= ~cpu_to_le16(HUB_CHAR_OCPM);
+                       desc->wHubCharacteristics |=  cpu_to_le16(0x0008|0x0001);
+               }
+
+               dev_dbg(hcd->self.controller, "wHubCharacteristics after 0x%04x\n",
+                       desc->wHubCharacteristics);
+
+               return ret;
+
+       case GetPortStatus:
+               /* check port status */
+
+               dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex);
+
+               if (wIndex == 1 || wIndex == 2) {
+                       if (! ohci_at91_usb_get_power(pdata, wIndex-1)) {
+                               *data &= ~cpu_to_le32(RH_PS_PPS);
+                       }
+
+                       if (pdata->overcurrent_changed[wIndex-1]) {
+                               *data |= cpu_to_le32(RH_PS_OCIC);
+                       }
+
+                       if (pdata->overcurrent_status[wIndex-1]) {
+                               *data |= cpu_to_le32(RH_PS_POCI);
+                       }
+               }
+       }
+
+ out:
+       return ret;
+}
+
 /*-------------------------------------------------------------------------*/
 
 static const struct hc_driver ohci_at91_hc_driver = {
@@ -258,8 +403,8 @@ static const struct hc_driver ohci_at91_hc_driver = {
        /*
         * root hub support
         */
-       .hub_status_data =      ohci_hub_status_data,
-       .hub_control =          ohci_hub_control,
+       .hub_status_data =      ohci_at91_hub_status_data,
+       .hub_control =          ohci_at91_hub_control,
 #ifdef CONFIG_PM
        .bus_suspend =          ohci_bus_suspend,
        .bus_resume =           ohci_bus_resume,
@@ -269,22 +414,71 @@ static const struct hc_driver ohci_at91_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
+static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data)
+{
+       struct platform_device *pdev = data;
+       struct at91_usbh_data *pdata = pdev->dev.platform_data;
+       int val, gpio, port;
+
+       /* From the GPIO notifying the over-current situation, find
+        * out the corresponding port */
+       gpio = irq_to_gpio(irq);
+       for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) {
+               if (pdata->overcurrent_pin[port] == gpio)
+                       break;
+       }
+
+       if (port == ARRAY_SIZE(pdata->overcurrent_pin)) {
+               dev_err(& pdev->dev, "overcurrent interrupt from unknown GPIO\n");
+               return IRQ_HANDLED;
+       }
+
+       val = gpio_get_value(gpio);
+
+       /* When notified of an over-current situation, disable power
+          on the corresponding port, and mark this port in
+          over-current. */
+       if (! val) {
+               ohci_at91_usb_set_power(pdata, port, 0);
+               pdata->overcurrent_status[port]  = 1;
+               pdata->overcurrent_changed[port] = 1;
+       }
+
+       dev_dbg(& pdev->dev, "overcurrent situation %s\n",
+               val ? "exited" : "notified");
+
+       return IRQ_HANDLED;
+}
+
+/*-------------------------------------------------------------------------*/
+
 static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
 {
        struct at91_usbh_data   *pdata = pdev->dev.platform_data;
        int                     i;
 
        if (pdata) {
-               /* REVISIT make the driver support per-port power switching,
-                * and also overcurrent detection.  Here we assume the ports
-                * are always powered while this driver is active, and use
-                * active-low power switches.
-                */
                for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) {
                        if (pdata->vbus_pin[i] <= 0)
                                continue;
                        gpio_request(pdata->vbus_pin[i], "ohci_vbus");
-                       gpio_direction_output(pdata->vbus_pin[i], 0);
+                       ohci_at91_usb_set_power(pdata, i, 1);
+               }
+
+               for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) {
+                       int ret;
+
+                       if (pdata->overcurrent_pin[i] <= 0)
+                               continue;
+                       gpio_request(pdata->overcurrent_pin[i], "ohci_overcurrent");
+
+                       ret = request_irq(gpio_to_irq(pdata->overcurrent_pin[i]),
+                                         ohci_hcd_at91_overcurrent_irq,
+                                         IRQF_SHARED, "ohci_overcurrent", pdev);
+                       if (ret) {
+                               gpio_free(pdata->overcurrent_pin[i]);
+                               dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n");
+                       }
                }
        }
 
@@ -301,9 +495,16 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev)
                for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) {
                        if (pdata->vbus_pin[i] <= 0)
                                continue;
-                       gpio_direction_output(pdata->vbus_pin[i], 1);
+                       ohci_at91_usb_set_power(pdata, i, 0);
                        gpio_free(pdata->vbus_pin[i]);
                }
+
+               for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) {
+                       if (pdata->overcurrent_pin[i] <= 0)
+                               continue;
+                       free_irq(gpio_to_irq(pdata->overcurrent_pin[i]), pdev);
+                       gpio_free(pdata->overcurrent_pin[i]);
+               }
        }
 
        device_init_wakeup(&pdev->dev, 0);