]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'next-samsung-devel' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorArnd Bergmann <arnd@arndb.de>
Thu, 21 Jul 2011 14:34:00 +0000 (16:34 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 21 Jul 2011 14:34:00 +0000 (16:34 +0200)
231 files changed:
arch/arm/Kconfig
arch/arm/configs/mx51_defconfig
arch/arm/configs/mxs_defconfig
arch/arm/configs/u8500_defconfig
arch/arm/include/asm/irq.h
arch/arm/kernel/irq.c
arch/arm/mach-cns3xxx/cns3420vb.c
arch/arm/mach-cns3xxx/core.c
arch/arm/mach-cns3xxx/core.h
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/clock.c
arch/arm/mach-davinci/clock.h
arch/arm/mach-davinci/da850.c
arch/arm/mach-davinci/devices-da8xx.c
arch/arm/mach-davinci/include/mach/da8xx.h
arch/arm/mach-davinci/include/mach/psc.h
arch/arm/mach-davinci/psc.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/dma-v1.c
arch/arm/mach-imx/eukrea_mbimx27-baseboard.c
arch/arm/mach-imx/eukrea_mbimxsd25-baseboard.c
arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.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-imx/mm-imx1.c
arch/arm/mach-imx/mm-imx21.c
arch/arm/mach-imx/mm-imx25.c
arch/arm/mach-imx/mm-imx27.c
arch/arm/mach-imx/mm-imx31.c
arch/arm/mach-imx/mm-imx35.c
arch/arm/mach-imx/mx31lite-db.c
arch/arm/mach-lpc32xx/clock.c
arch/arm/mach-lpc32xx/common.c
arch/arm/mach-lpc32xx/common.h
arch/arm/mach-mmp/Kconfig
arch/arm/mach-mmp/Makefile
arch/arm/mach-mmp/clock.c
arch/arm/mach-mmp/clock.h
arch/arm/mach-mmp/gplugd.c [new file with mode: 0644]
arch/arm/mach-mmp/include/mach/mfp-gplugd.h [new file with mode: 0644]
arch/arm/mach-mmp/include/mach/mfp-pxa168.h
arch/arm/mach-mmp/include/mach/pxa168.h
arch/arm/mach-mmp/include/mach/regs-apmu.h
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mmp/ttc_dkb.c
arch/arm/mach-mx5/Kconfig
arch/arm/mach-mx5/Makefile
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 [new file with mode: 0644]
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/crm_regs.h
arch/arm/mach-mx5/devices-imx53.h
arch/arm/mach-mx5/devices.c
arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c
arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c
arch/arm/mach-mx5/mm-mx50.c
arch/arm/mach-mx5/mm.c
arch/arm/mach-mx5/pm-imx5.c [new file with mode: 0644]
arch/arm/mach-mxs/Kconfig
arch/arm/mach-mxs/Makefile
arch/arm/mach-mxs/devices.c
arch/arm/mach-mxs/devices/Makefile
arch/arm/mach-mxs/devices/platform-gpio-mxs.c [new file with mode: 0644]
arch/arm/mach-mxs/devices/platform-mxsfb.c
arch/arm/mach-mxs/gpio.h [deleted file]
arch/arm/mach-mxs/include/mach/devices-common.h
arch/arm/mach-mxs/mach-mx28evk.c
arch/arm/mach-mxs/mach-tx28.c
arch/arm/mach-mxs/mm-mx23.c
arch/arm/mach-mxs/mm-mx28.c
arch/arm/mach-pxa/balloon3.c
arch/arm/mach-pxa/capc7117.c
arch/arm/mach-pxa/clock.c
arch/arm/mach-pxa/clock.h
arch/arm/mach-pxa/cm-x2xx.c
arch/arm/mach-pxa/cm-x300.c
arch/arm/mach-pxa/colibri-pxa270.c
arch/arm/mach-pxa/colibri-pxa300.c
arch/arm/mach-pxa/colibri-pxa320.c
arch/arm/mach-pxa/corgi.c
arch/arm/mach-pxa/csb726.c
arch/arm/mach-pxa/em-x270.c
arch/arm/mach-pxa/eseries.c
arch/arm/mach-pxa/ezx.c
arch/arm/mach-pxa/generic.h
arch/arm/mach-pxa/gumstix.c
arch/arm/mach-pxa/h5000.c
arch/arm/mach-pxa/himalaya.c
arch/arm/mach-pxa/hx4700.c
arch/arm/mach-pxa/icontrol.c
arch/arm/mach-pxa/idp.c
arch/arm/mach-pxa/include/mach/irqs.h
arch/arm/mach-pxa/include/mach/pxa25x.h
arch/arm/mach-pxa/include/mach/pxa27x.h
arch/arm/mach-pxa/include/mach/pxa300.h
arch/arm/mach-pxa/include/mach/pxa320.h
arch/arm/mach-pxa/include/mach/pxa3xx.h [new file with mode: 0644]
arch/arm/mach-pxa/include/mach/pxa930.h
arch/arm/mach-pxa/include/mach/regs-intc.h [deleted file]
arch/arm/mach-pxa/irq.c
arch/arm/mach-pxa/littleton.c
arch/arm/mach-pxa/lpd270.c
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/magician.c
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/mioa701.c
arch/arm/mach-pxa/mp900.c
arch/arm/mach-pxa/palmld.c
arch/arm/mach-pxa/palmt5.c
arch/arm/mach-pxa/palmtc.c
arch/arm/mach-pxa/palmte2.c
arch/arm/mach-pxa/palmtreo.c
arch/arm/mach-pxa/palmtx.c
arch/arm/mach-pxa/palmz72.c
arch/arm/mach-pxa/pcm027.c
arch/arm/mach-pxa/poodle.c
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-pxa/pxa95x.c
arch/arm/mach-pxa/raumfeld.c
arch/arm/mach-pxa/saar.c
arch/arm/mach-pxa/saarb.c
arch/arm/mach-pxa/spitz.c
arch/arm/mach-pxa/stargate2.c
arch/arm/mach-pxa/tavorevb.c
arch/arm/mach-pxa/tavorevb3.c
arch/arm/mach-pxa/tosa.c
arch/arm/mach-pxa/trizeps4.c
arch/arm/mach-pxa/viper.c
arch/arm/mach-pxa/vpac270.c
arch/arm/mach-pxa/xcep.c
arch/arm/mach-pxa/z2.c
arch/arm/mach-pxa/zeus.c
arch/arm/mach-pxa/zylonite.c
arch/arm/mach-tegra/board-harmony.c
arch/arm/mach-tegra/board-paz00-pinmux.c
arch/arm/mach-tegra/board-paz00.c
arch/arm/mach-tegra/board-paz00.h
arch/arm/mach-tegra/board-seaboard.c
arch/arm/mach-tegra/board-trimslice-pinmux.c
arch/arm/mach-tegra/board-trimslice.c
arch/arm/mach-tegra/board-trimslice.h
arch/arm/mach-tegra/devices.c
arch/arm/mach-tegra/include/mach/barriers.h [deleted file]
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-tegra/tegra2_clocks.c
arch/arm/mach-u300/spi.c
arch/arm/mach-u300/timer.c
arch/arm/mach-ux500/Kconfig
arch/arm/mach-ux500/board-mop500-pins.c
arch/arm/mach-ux500/board-mop500-regulators.c
arch/arm/mach-ux500/board-mop500-sdi.c
arch/arm/mach-ux500/board-mop500-uib.c
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/board-mop500.h
arch/arm/mach-ux500/clock.c
arch/arm/mach-ux500/cpu-db5500.c
arch/arm/mach-ux500/include/mach/uncompress.h
arch/arm/mach-ux500/usb.c
arch/arm/mm/Kconfig
arch/arm/plat-mxc/Makefile
arch/arm/plat-mxc/avic.c
arch/arm/plat-mxc/devices.c
arch/arm/plat-mxc/devices/Makefile
arch/arm/plat-mxc/devices/platform-gpio-mxc.c [new file with mode: 0644]
arch/arm/plat-mxc/devices/platform-imx-dma.c
arch/arm/plat-mxc/devices/platform-imx-i2c.c
arch/arm/plat-mxc/devices/platform-imx-keypad.c
arch/arm/plat-mxc/devices/platform-imx-ssi.c
arch/arm/plat-mxc/devices/platform-imx-uart.c
arch/arm/plat-mxc/include/mach/common.h
arch/arm/plat-mxc/include/mach/debug-macro.S
arch/arm/plat-mxc/include/mach/devices-common.h
arch/arm/plat-mxc/include/mach/gpio.h
arch/arm/plat-mxc/include/mach/hardware.h
arch/arm/plat-mxc/include/mach/iomux-mx53.h
arch/arm/plat-mxc/include/mach/iomux-v1.h
arch/arm/plat-mxc/include/mach/iomux-v3.h
arch/arm/plat-mxc/include/mach/iomux.h [deleted file]
arch/arm/plat-mxc/include/mach/mx53.h
arch/arm/plat-mxc/include/mach/mxc.h
arch/arm/plat-mxc/include/mach/sdma.h
arch/arm/plat-mxc/include/mach/timex.h
arch/arm/plat-mxc/include/mach/uncompress.h
arch/arm/plat-mxc/iomux-v1.c
arch/arm/plat-mxc/irq-common.c
arch/arm/plat-mxc/pwm.c
arch/arm/plat-mxc/tzic.c
drivers/dma/imx-dma.c
drivers/dma/imx-sdma.c
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/gpio-mxc.c [moved from arch/arm/plat-mxc/gpio.c with 60% similarity]
drivers/gpio/gpio-mxs.c [moved from arch/arm/mach-mxs/gpio.c with 58% similarity]
drivers/mmc/host/mxcmmc.c
sound/soc/imx/imx-pcm-dma-mx2.c

index b0f9ddbffd5c720d32eba48bd139d900a356cc24..54d63f1e9a913fe1ba96d895ccb5a31ea3da6041 100644 (file)
@@ -321,7 +321,7 @@ config ARCH_CLPS711X
 
 config ARCH_CNS3XXX
        bool "Cavium Networks CNS3XXX family"
-       select CPU_V6
+       select CPU_V6K
        select GENERIC_CLOCKEVENTS
        select ARM_GIC
        select MIGHT_HAVE_PCI
@@ -376,6 +376,7 @@ config ARCH_MXC
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
+       select GENERIC_IRQ_CHIP
        select HAVE_SCHED_CLOCK
        help
          Support for Freescale MXC/iMX-based family of processors
@@ -591,7 +592,6 @@ config ARCH_TEGRA
        select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_SCHED_CLOCK
-       select ARCH_HAS_BARRIERS if CACHE_L2X0
        select ARCH_HAS_CPUFREQ
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
@@ -618,6 +618,8 @@ config ARCH_PXA
        select TICK_ONESHOT
        select PLAT_PXA
        select SPARSE_IRQ
+       select AUTO_ZRELADDR
+       select MULTI_IRQ_HANDLER
        help
          Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
 
index 0ace16cba9b5cc3ad3464d15757a4bc89795eaca..88c5802a23514b06d0c2c6b4e07cdc35a502c32d 100644 (file)
@@ -106,6 +106,7 @@ CONFIG_GPIO_SYSFS=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
@@ -145,7 +146,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_NLS_DEFAULT="cp437"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_UTF8=y
 CONFIG_MAGIC_SYSRQ=y
index 2bf224310fb4d96df2a6a72c2828ce6caee13d7c..db2cb7d180dc0283602744964f27798e778314eb 100644 (file)
@@ -22,6 +22,8 @@ CONFIG_BLK_DEV_INTEGRITY=y
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
 CONFIG_ARCH_MXS=y
+CONFIG_MACH_MX23EVK=y
+CONFIG_MACH_MX28EVK=y
 CONFIG_MACH_STMP378X_DEVB=y
 CONFIG_MACH_TX28=y
 # CONFIG_ARM_THUMB is not set
@@ -89,7 +91,7 @@ CONFIG_DISPLAY_SUPPORT=m
 # CONFIG_USB_SUPPORT is not set
 CONFIG_MMC=y
 CONFIG_MMC_MXS=y
-CONFIG_RTC_CLASS=m
+CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=m
 CONFIG_DMADEVICES=y
 CONFIG_MXS_DMA=y
index a5cce242a77555d7476a02e05c71ca67e0c99c43..97d31a4663daf0c6186cd948a05abf35687686d3 100644 (file)
@@ -11,12 +11,12 @@ CONFIG_ARCH_U8500=y
 CONFIG_UX500_SOC_DB5500=y
 CONFIG_UX500_SOC_DB8500=y
 CONFIG_MACH_U8500=y
+CONFIG_MACH_SNOWBALL=y
 CONFIG_MACH_U5500=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
-CONFIG_HOTPLUG_CPU=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8"
@@ -25,8 +25,13 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
 CONFIG_VFP=y
 CONFIG_NEON=y
 CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_NETFILTER=y
 CONFIG_PHONET=y
-CONFIG_PHONET_PIPECTRLR=y
 # CONFIG_WIRELESS is not set
 CONFIG_CAIF=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
@@ -35,6 +40,13 @@ CONFIG_BLK_DEV_RAM_SIZE=65536
 CONFIG_MISC_DEVICES=y
 CONFIG_AB8500_PWM=y
 CONFIG_SENSORS_BH1780=y
+CONFIG_NETDEVICES=y
+CONFIG_SMSC_PHY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_SMSC911X=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_WLAN is not set
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_EVDEV=y
 # CONFIG_KEYBOARD_ATKBD is not set
@@ -49,9 +61,9 @@ CONFIG_INPUT_MISC=y
 CONFIG_INPUT_AB8500_PONKEY=y
 # CONFIG_SERIO is not set
 CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_LEGACY_PTYS is not set
 CONFIG_SERIAL_AMBA_PL011=y
 CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_NOMADIK=y
 CONFIG_I2C=y
@@ -64,14 +76,19 @@ CONFIG_GPIO_TC3589X=y
 CONFIG_MFD_STMPE=y
 CONFIG_MFD_TC3589X=y
 CONFIG_AB8500_CORE=y
-CONFIG_REGULATOR=y
 CONFIG_REGULATOR_AB8500=y
 # CONFIG_HID_SUPPORT is not set
-# CONFIG_USB_SUPPORT is not set
+CONFIG_USB_MUSB_HDRC=y
+CONFIG_USB_GADGET_MUSB_HDRC=y
+CONFIG_MUSB_PIO_ONLY=y
+CONFIG_USB_GADGET=y
+CONFIG_AB8500_USB=y
 CONFIG_MMC=y
+CONFIG_MMC_CLKGATE=y
 CONFIG_MMC_ARMMMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_LM3530=y
 CONFIG_LEDS_LP5521=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AB8500=y
@@ -79,7 +96,6 @@ CONFIG_RTC_DRV_PL031=y
 CONFIG_DMADEVICES=y
 CONFIG_STE_DMA40=y
 CONFIG_STAGING=y
-# CONFIG_STAGING_EXCLUDE_BUILD is not set
 CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
@@ -91,6 +107,8 @@ CONFIG_TMPFS=y
 CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_CONFIGFS_FS=m
 # CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_MAGIC_SYSRQ=y
@@ -99,7 +117,5 @@ CONFIG_DEBUG_KERNEL=y
 # CONFIG_SCHED_DEBUG is not set
 # CONFIG_DEBUG_PREEMPT is not set
 CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 # CONFIG_FTRACE is not set
 CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_ERRORS=y
index 2721a5814cb93b56e0583722df184440c9497532..5a526afb5f1858615ec02928f2e2010b3a25982d 100644 (file)
@@ -23,6 +23,7 @@ struct pt_regs;
 extern void migrate_irqs(void);
 
 extern void asm_do_IRQ(unsigned int, struct pt_regs *);
+void handle_IRQ(unsigned int, struct pt_regs *);
 void init_IRQ(void);
 
 #endif
index 83bbad03fcc6642f7ab5dc0bc1f8bce5a790eac9..dbc1f41575b2c1d87db293290dbbf18b04ecfe42 100644 (file)
@@ -67,12 +67,12 @@ int arch_show_interrupts(struct seq_file *p, int prec)
 }
 
 /*
- * do_IRQ handles all hardware IRQ's.  Decoded IRQs should not
- * come via this function.  Instead, they should provide their
- * own 'handler'
+ * handle_IRQ handles all hardware IRQ's.  Decoded IRQs should
+ * not come via this function.  Instead, they should provide their
+ * own 'handler'.  Used by platform code implementing C-based 1st
+ * level decoding.
  */
-asmlinkage void __exception_irq_entry
-asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
+void handle_IRQ(unsigned int irq, struct pt_regs *regs)
 {
        struct pt_regs *old_regs = set_irq_regs(regs);
 
@@ -97,6 +97,15 @@ asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
        set_irq_regs(old_regs);
 }
 
+/*
+ * asm_do_IRQ is the interface to be used from assembly code.
+ */
+asmlinkage void __exception_irq_entry
+asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
+{
+       handle_IRQ(irq, regs);
+}
+
 void set_irq_flags(unsigned int irq, unsigned int iflags)
 {
        unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
index 08e5c8759502ba14cf3a83495ccd1df6d00dbf9b..4b804baa5f80f8ecf8131ee0a596be92831b16bc 100644 (file)
@@ -170,6 +170,8 @@ static struct platform_device *cns3420_pdevs[] __initdata = {
 
 static void __init cns3420_init(void)
 {
+       cns3xxx_l2x0_init();
+
        platform_add_devices(cns3420_pdevs, ARRAY_SIZE(cns3420_pdevs));
 
        cns3xxx_ahci_init();
index da30078a80c16078192373b67ac0ed59de30a7a7..941a308e12533e859b0eddeb17998931921591f1 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
 #include <asm/hardware/gic.h>
+#include <asm/hardware/cache-l2x0.h>
 #include <mach/cns3xxx.h>
 #include "core.h"
 
@@ -244,3 +245,45 @@ static void __init cns3xxx_timer_init(void)
 struct sys_timer cns3xxx_timer = {
        .init = cns3xxx_timer_init,
 };
+
+#ifdef CONFIG_CACHE_L2X0
+
+void __init cns3xxx_l2x0_init(void)
+{
+       void __iomem *base = ioremap(CNS3XXX_L2C_BASE, SZ_4K);
+       u32 val;
+
+       if (WARN_ON(!base))
+               return;
+
+       /*
+        * Tag RAM Control register
+        *
+        * bit[10:8]    - 1 cycle of write accesses latency
+        * bit[6:4]     - 1 cycle of read accesses latency
+        * bit[3:0]     - 1 cycle of setup latency
+        *
+        * 1 cycle of latency for setup, read and write accesses
+        */
+       val = readl(base + L2X0_TAG_LATENCY_CTRL);
+       val &= 0xfffff888;
+       writel(val, base + L2X0_TAG_LATENCY_CTRL);
+
+       /*
+        * Data RAM Control register
+        *
+        * bit[10:8]    - 1 cycles of write accesses latency
+        * bit[6:4]     - 1 cycles of read accesses latency
+        * bit[3:0]     - 1 cycle of setup latency
+        *
+        * 1 cycle of latency for setup, read and write accesses
+        */
+       val = readl(base + L2X0_DATA_LATENCY_CTRL);
+       val &= 0xfffff888;
+       writel(val, base + L2X0_DATA_LATENCY_CTRL);
+
+       /* 32 KiB, 8-way, parity disable */
+       l2x0_init(base, 0x00540000, 0xfe000fff);
+}
+
+#endif /* CONFIG_CACHE_L2X0 */
index ffeb3a8b73bacfb1498d6cfa52ae3e1dd8d11439..fcd225343c61c6b18535edcd2ce0230db8e65348 100644 (file)
 
 extern struct sys_timer cns3xxx_timer;
 
+#ifdef CONFIG_CACHE_L2X0
+void __init cns3xxx_l2x0_init(void);
+#else
+static inline void cns3xxx_l2x0_init(void) {}
+#endif /* CONFIG_CACHE_L2X0 */
+
 void __init cns3xxx_map_io(void);
 void __init cns3xxx_init_irq(void);
 void cns3xxx_power_off(void);
index a7b41bf505f14dd8e232a92c0b7606ac8125145b..3d2c0d7d129fb4c2c3e6cbd67301e8a74d9ed573 100644 (file)
@@ -1117,6 +1117,8 @@ static __init int da850_evm_init_cpufreq(void)
 static __init int da850_evm_init_cpufreq(void) { return 0; }
 #endif
 
+#define DA850EVM_SATA_REFCLKPN_RATE    (100 * 1000 * 1000)
+
 static __init void da850_evm_init(void)
 {
        int ret;
@@ -1237,6 +1239,11 @@ static __init void da850_evm_init(void)
        if (ret)
                pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
                                ret);
+
+       ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
+       if (ret)
+               pr_warning("da850_evm_init: sata registration failed: %d\n",
+                               ret);
 }
 
 #ifdef CONFIG_SERIAL_8250_CONSOLE
index e4e3af179f0270e0c60698b66ed27eb321023b82..d0450ac2c00eafb8ca24f42a36dac4ba5408a15e 100644 (file)
@@ -44,7 +44,7 @@ static void __clk_enable(struct clk *clk)
                __clk_enable(clk->parent);
        if (clk->usecount++ == 0 && (clk->flags & CLK_PSC))
                davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
-                               PSC_STATE_ENABLE);
+                               true, clk->flags);
 }
 
 static void __clk_disable(struct clk *clk)
@@ -54,8 +54,7 @@ static void __clk_disable(struct clk *clk)
        if (--clk->usecount == 0 && !(clk->flags & CLK_PLL) &&
            (clk->flags & CLK_PSC))
                davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
-                               (clk->flags & PSC_SWRSTDISABLE) ?
-                               PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
+                               false, clk->flags);
        if (clk->parent)
                __clk_disable(clk->parent);
 }
@@ -239,8 +238,7 @@ static int __init clk_disable_unused(void)
                pr_debug("Clocks: disable unused %s\n", ck->name);
 
                davinci_psc_config(psc_domain(ck), ck->gpsc, ck->lpsc,
-                               (ck->flags & PSC_SWRSTDISABLE) ?
-                               PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
+                               false, ck->flags);
        }
        spin_unlock_irq(&clockfw_lock);
 
index 0dd22031ec6222467a4a3a5ccb0eb27405e1d510..48ee4627e18814a44aa93d4ee7764cecd9632b55 100644 (file)
@@ -111,6 +111,7 @@ struct clk {
 #define CLK_PLL                        BIT(4) /* PLL-derived clock */
 #define PRE_PLL                        BIT(5) /* source is before PLL mult/div */
 #define PSC_SWRSTDISABLE       BIT(6) /* Disable state is SwRstDisable */
+#define PSC_FORCE              BIT(7) /* Force module state transtition */
 
 #define CLK(dev, con, ck)      \
        {                       \
index 133aac40585374299ef9d55f651dd8f85fcf4e71..935dbed5c541ccea2e1d4bbe5e059dfd6295ac03 100644 (file)
@@ -58,6 +58,7 @@ static struct pll_data pll0_data = {
 static struct clk ref_clk = {
        .name           = "ref_clk",
        .rate           = DA850_REF_FREQ,
+       .set_rate       = davinci_simple_set_rate,
 };
 
 static struct clk pll0_clk = {
@@ -373,6 +374,14 @@ static struct clk spi1_clk = {
        .flags          = DA850_CLK_ASYNC3,
 };
 
+static struct clk sata_clk = {
+       .name           = "sata",
+       .parent         = &pll0_sysclk2,
+       .lpsc           = DA850_LPSC1_SATA,
+       .gpsc           = 1,
+       .flags          = PSC_FORCE,
+};
+
 static struct clk_lookup da850_clks[] = {
        CLK(NULL,               "ref",          &ref_clk),
        CLK(NULL,               "pll0",         &pll0_clk),
@@ -419,6 +428,7 @@ static struct clk_lookup da850_clks[] = {
        CLK(NULL,               "usb20",        &usb20_clk),
        CLK("spi_davinci.0",    NULL,           &spi0_clk),
        CLK("spi_davinci.1",    NULL,           &spi1_clk),
+       CLK("ahci",             NULL,           &sata_clk),
        CLK(NULL,               NULL,           NULL),
 };
 
index fc4e98ea7543a397e4ece003b3ff9f9d498fd42f..2f7e719636f1333ce7ef3120a8393e6cd896d0dd 100644 (file)
@@ -14,6 +14,8 @@
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/serial_8250.h>
+#include <linux/ahci_platform.h>
+#include <linux/clk.h>
 
 #include <mach/cputype.h>
 #include <mach/common.h>
@@ -33,6 +35,7 @@
 #define DA8XX_SPI0_BASE                        0x01c41000
 #define DA830_SPI1_BASE                        0x01e12000
 #define DA8XX_LCD_CNTRL_BASE           0x01e13000
+#define DA850_SATA_BASE                        0x01e18000
 #define DA850_MMCSD1_BASE              0x01e1b000
 #define DA8XX_EMAC_CPPI_PORT_BASE      0x01e20000
 #define DA8XX_EMAC_CPGMACSS_BASE       0x01e22000
@@ -842,3 +845,126 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info,
 
        return platform_device_register(&da8xx_spi_device[instance]);
 }
+
+#ifdef CONFIG_ARCH_DAVINCI_DA850
+
+static struct resource da850_sata_resources[] = {
+       {
+               .start  = DA850_SATA_BASE,
+               .end    = DA850_SATA_BASE + 0x1fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = IRQ_DA850_SATAINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+/* SATA PHY Control Register offset from AHCI base */
+#define SATA_P0PHYCR_REG       0x178
+
+#define SATA_PHY_MPY(x)                ((x) << 0)
+#define SATA_PHY_LOS(x)                ((x) << 6)
+#define SATA_PHY_RXCDR(x)      ((x) << 10)
+#define SATA_PHY_RXEQ(x)       ((x) << 13)
+#define SATA_PHY_TXSWING(x)    ((x) << 19)
+#define SATA_PHY_ENPLL(x)      ((x) << 31)
+
+static struct clk *da850_sata_clk;
+static unsigned long da850_sata_refclkpn;
+
+/* Supported DA850 SATA crystal frequencies */
+#define KHZ_TO_HZ(freq) ((freq) * 1000)
+static unsigned long da850_sata_xtal[] = {
+       KHZ_TO_HZ(300000),
+       KHZ_TO_HZ(250000),
+       0,                      /* Reserved */
+       KHZ_TO_HZ(187500),
+       KHZ_TO_HZ(150000),
+       KHZ_TO_HZ(125000),
+       KHZ_TO_HZ(120000),
+       KHZ_TO_HZ(100000),
+       KHZ_TO_HZ(75000),
+       KHZ_TO_HZ(60000),
+};
+
+static int da850_sata_init(struct device *dev, void __iomem *addr)
+{
+       int i, ret;
+       unsigned int val;
+
+       da850_sata_clk = clk_get(dev, NULL);
+       if (IS_ERR(da850_sata_clk))
+               return PTR_ERR(da850_sata_clk);
+
+       ret = clk_enable(da850_sata_clk);
+       if (ret)
+               goto err0;
+
+       /* Enable SATA clock receiver */
+       val = __raw_readl(DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
+       val &= ~BIT(0);
+       __raw_writel(val, DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
+
+       /* Get the multiplier needed for 1.5GHz PLL output */
+       for (i = 0; i < ARRAY_SIZE(da850_sata_xtal); i++)
+               if (da850_sata_xtal[i] == da850_sata_refclkpn)
+                       break;
+
+       if (i == ARRAY_SIZE(da850_sata_xtal)) {
+               ret = -EINVAL;
+               goto err1;
+       }
+
+       val = SATA_PHY_MPY(i + 1) |
+               SATA_PHY_LOS(1) |
+               SATA_PHY_RXCDR(4) |
+               SATA_PHY_RXEQ(1) |
+               SATA_PHY_TXSWING(3) |
+               SATA_PHY_ENPLL(1);
+
+       __raw_writel(val, addr + SATA_P0PHYCR_REG);
+
+       return 0;
+
+err1:
+       clk_disable(da850_sata_clk);
+err0:
+       clk_put(da850_sata_clk);
+       return ret;
+}
+
+static void da850_sata_exit(struct device *dev)
+{
+       clk_disable(da850_sata_clk);
+       clk_put(da850_sata_clk);
+}
+
+static struct ahci_platform_data da850_sata_pdata = {
+       .init   = da850_sata_init,
+       .exit   = da850_sata_exit,
+};
+
+static u64 da850_sata_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device da850_sata_device = {
+       .name   = "ahci",
+       .id     = -1,
+       .dev    = {
+               .platform_data          = &da850_sata_pdata,
+               .dma_mask               = &da850_sata_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .num_resources  = ARRAY_SIZE(da850_sata_resources),
+       .resource       = da850_sata_resources,
+};
+
+int __init da850_register_sata(unsigned long refclkpn)
+{
+       da850_sata_refclkpn = refclkpn;
+       if (!da850_sata_refclkpn)
+               return -EINVAL;
+
+       return platform_device_register(&da850_sata_device);
+}
+#endif
index ad64da713fc83fdec2006a9aa78cb56c0561409a..eaca7d8b9d68fb61c75f5da8dd7d6e787da8ef8c 100644 (file)
@@ -57,6 +57,7 @@ extern unsigned int da850_max_speed;
 #define DA8XX_SYSCFG1_BASE     (IO_PHYS + 0x22C000)
 #define DA8XX_SYSCFG1_VIRT(x)  (da8xx_syscfg1_base + (x))
 #define DA8XX_DEEPSLEEP_REG    0x8
+#define DA8XX_PWRDN_REG                0x18
 
 #define DA8XX_PSC0_BASE                0x01c10000
 #define DA8XX_PLL0_BASE                0x01c11000
@@ -89,6 +90,7 @@ int da850_register_cpufreq(char *async_clk);
 int da8xx_register_cpuidle(void);
 void __iomem * __init da8xx_get_mem_ctlr(void);
 int da850_register_pm(struct platform_device *pdev);
+int __init da850_register_sata(unsigned long refclkpn);
 
 extern struct platform_device da8xx_serial_device;
 extern struct emac_platform_data da8xx_emac_pdata;
index a47e6f29206e2551688d91d442a187015358885d..6213f0d4211d91055516882d66e6e237dfa1d7da 100644 (file)
 #define PSC_STATE_ENABLE       3
 
 #define MDSTAT_STATE_MASK 0x1f
+#define MDCTL_FORCE            BIT(31)
 
 #ifndef __ASSEMBLER__
 
 extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id);
 extern void davinci_psc_config(unsigned int domain, unsigned int ctlr,
-               unsigned int id, u32 next_state);
+               unsigned int id, bool enable, u32 flags);
 
 #endif
 
index a415804007017171d8c01b64f22d58b8fe17bc33..1fb6bdff38c1f5e9ff796e72c4c57be824919209 100644 (file)
@@ -25,6 +25,8 @@
 #include <mach/cputype.h>
 #include <mach/psc.h>
 
+#include "clock.h"
+
 /* Return nonzero iff the domain's clock is active */
 int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
 {
@@ -48,11 +50,12 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
 
 /* Enable or disable a PSC domain */
 void davinci_psc_config(unsigned int domain, unsigned int ctlr,
-               unsigned int id, u32 next_state)
+               unsigned int id, bool enable, u32 flags)
 {
        u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl;
        void __iomem *psc_base;
        struct davinci_soc_info *soc_info = &davinci_soc_info;
+       u32 next_state = PSC_STATE_ENABLE;
 
        if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
                pr_warning("PSC: Bad psc data: 0x%x[%d]\n",
@@ -62,9 +65,18 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
 
        psc_base = ioremap(soc_info->psc_bases[ctlr], SZ_4K);
 
+       if (!enable) {
+               if (flags & PSC_SWRSTDISABLE)
+                       next_state = PSC_STATE_SWRSTDISABLE;
+               else
+                       next_state = PSC_STATE_DISABLE;
+       }
+
        mdctl = __raw_readl(psc_base + MDCTL + 4 * id);
        mdctl &= ~MDSTAT_STATE_MASK;
        mdctl |= next_state;
+       if (flags & PSC_FORCE)
+               mdctl |= MDCTL_FORCE;
        __raw_writel(mdctl, psc_base + MDCTL + 4 * id);
 
        pdstat = __raw_readl(psc_base + PDSTAT);
index 59c97a3311368cb9b2dddd8171fe7efdb73c79a8..0519dd7f034bc07446d2cb7384f9d434821ca551 100644 (file)
@@ -167,6 +167,7 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD
        bool "Eukrea MBIMXSD development board"
        select IMX_HAVE_PLATFORM_GPIO_KEYS
        select IMX_HAVE_PLATFORM_IMX_SSI
+       select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
          MBIMXSD evaluation board.
@@ -265,6 +266,7 @@ config MACH_EUKREA_MBIMX27_BASEBOARD
        select IMX_HAVE_PLATFORM_IMX_UART
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_SPI_IMX
+       select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
          MBIMX27 evaluation board.
@@ -276,6 +278,7 @@ config MACH_MX27_3DS
        select SOC_IMX27
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
        select IMX_HAVE_PLATFORM_IMX2_WDT
+       select IMX_HAVE_PLATFORM_IMX_FB
        select IMX_HAVE_PLATFORM_IMX_I2C
        select IMX_HAVE_PLATFORM_IMX_KEYPAD
        select IMX_HAVE_PLATFORM_IMX_UART
@@ -403,6 +406,7 @@ config MACH_MX31LITE
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_MXC_RTC
        select IMX_HAVE_PLATFORM_SPI_IMX
+       select LEDS_GPIO_REGISTER
        help
          Include support for MX31 LITEKIT platform. This includes specific
          configurations for the board and its peripherals.
@@ -471,6 +475,7 @@ config MACH_MX31MOBOARD
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_SPI_IMX
+       select LEDS_GPIO_REGISTER
        select MXC_ULPI if USB_ULPI
        help
          Include support for mx31moboard platform. This includes specific
@@ -577,6 +582,7 @@ config MACH_EUKREA_MBIMXSD35_BASEBOARD
        select IMX_HAVE_PLATFORM_GPIO_KEYS
        select IMX_HAVE_PLATFORM_IMX_SSI
        select IMX_HAVE_PLATFORM_IPU_CORE
+       select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
          MBIMXSD evaluation board.
index 236f1495efad092039a391089b34a6100f77e5f3..4d76f67f270fa4ac6e57a86ba5f3fa529ba97d75 100644 (file)
@@ -475,7 +475,6 @@ void imx_dma_enable(int channel)
        imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) | CCR_CEN |
                CCR_ACRPT, DMA_CCR(channel));
 
-#ifdef CONFIG_ARCH_MX2
        if ((cpu_is_mx21() || cpu_is_mx27()) &&
                        imxdma->sg && imx_dma_hw_chain(imxdma)) {
                imxdma->sg = sg_next(imxdma->sg);
@@ -487,7 +486,6 @@ void imx_dma_enable(int channel)
                                DMA_CCR(channel));
                }
        }
-#endif
        imxdma->in_use = 1;
 
        local_irq_restore(flags);
@@ -518,7 +516,6 @@ void imx_dma_disable(int channel)
 }
 EXPORT_SYMBOL(imx_dma_disable);
 
-#ifdef CONFIG_ARCH_MX2
 static void imx_dma_watchdog(unsigned long chno)
 {
        struct imx_dma_channel *imxdma = &imx_dma_channels[chno];
@@ -530,7 +527,6 @@ static void imx_dma_watchdog(unsigned long chno)
        if (imxdma->err_handler)
                imxdma->err_handler(chno, imxdma->data, IMX_DMA_ERR_TIMEOUT);
 }
-#endif
 
 static irqreturn_t dma_err_handler(int irq, void *dev_id)
 {
@@ -654,10 +650,8 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
 {
        int i, disr;
 
-#ifdef CONFIG_ARCH_MX2
        if (cpu_is_mx21() || cpu_is_mx27())
                dma_err_handler(irq, dev_id);
-#endif
 
        disr = imx_dmav1_readl(DMA_DISR);
 
@@ -703,7 +697,6 @@ int imx_dma_request(int channel, const char *name)
        imxdma->name = name;
        local_irq_restore(flags); /* request_irq() can block */
 
-#ifdef CONFIG_ARCH_MX2
        if (cpu_is_mx21() || cpu_is_mx27()) {
                ret = request_irq(MX2x_INT_DMACH0 + channel,
                                dma_irq_handler, 0, "DMA", NULL);
@@ -717,7 +710,6 @@ int imx_dma_request(int channel, const char *name)
                imxdma->watchdog.function = &imx_dma_watchdog;
                imxdma->watchdog.data = channel;
        }
-#endif
 
        return ret;
 }
@@ -744,10 +736,8 @@ void imx_dma_free(int channel)
        imx_dma_disable(channel);
        imxdma->name = NULL;
 
-#ifdef CONFIG_ARCH_MX2
        if (cpu_is_mx21() || cpu_is_mx27())
                free_irq(MX2x_INT_DMACH0 + channel, NULL);
-#endif
 
        local_irq_restore(flags);
 }
@@ -803,21 +793,13 @@ static int __init imx_dma_init(void)
        int ret = 0;
        int i;
 
-#ifdef CONFIG_ARCH_MX1
        if (cpu_is_mx1())
                imx_dmav1_baseaddr = MX1_IO_ADDRESS(MX1_DMA_BASE_ADDR);
-       else
-#endif
-#ifdef CONFIG_MACH_MX21
-       if (cpu_is_mx21())
+       else if (cpu_is_mx21())
                imx_dmav1_baseaddr = MX21_IO_ADDRESS(MX21_DMA_BASE_ADDR);
-       else
-#endif
-#ifdef CONFIG_MACH_MX27
-       if (cpu_is_mx27())
+       else if (cpu_is_mx27())
                imx_dmav1_baseaddr = MX27_IO_ADDRESS(MX27_DMA_BASE_ADDR);
        else
-#endif
                return 0;
 
        dma_clk = clk_get(NULL, "dma");
@@ -828,7 +810,6 @@ static int __init imx_dma_init(void)
        /* reset DMA module */
        imx_dmav1_writel(DCR_DRST, DMA_DCR);
 
-#ifdef CONFIG_ARCH_MX1
        if (cpu_is_mx1()) {
                ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", NULL);
                if (ret) {
@@ -843,7 +824,7 @@ static int __init imx_dma_init(void)
                        return ret;
                }
        }
-#endif
+
        /* enable DMA module */
        imx_dmav1_writel(DCR_DEN, DMA_DCR);
 
index 5911281da5f59cef0aed95f3e82e3da30750bdeb..5db3e1463af7714bff06e8b17f526804148e89b0 100644 (file)
@@ -112,7 +112,7 @@ eukrea_mbimx27_keymap_data __initconst = {
        .keymap_size    = ARRAY_SIZE(eukrea_mbimx27_keymap),
 };
 
-static struct gpio_led gpio_leds[] = {
+static const struct gpio_led eukrea_mbimx27_gpio_leds[] __initconst = {
        {
                .name                   = "led1",
                .default_trigger        = "heartbeat",
@@ -127,17 +127,10 @@ static struct gpio_led gpio_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data gpio_led_info = {
-       .leds           = gpio_leds,
-       .num_leds       = ARRAY_SIZE(gpio_leds),
-};
-
-static struct platform_device leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &gpio_led_info,
-       },
+static const struct gpio_led_platform_data
+               eukrea_mbimx27_gpio_led_info __initconst = {
+       .leds           = eukrea_mbimx27_gpio_leds,
+       .num_leds       = ARRAY_SIZE(eukrea_mbimx27_gpio_leds),
 };
 
 static struct imx_fb_videomode eukrea_mbimx27_modes[] = {
@@ -293,10 +286,6 @@ static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = {
        },
 };
 
-static struct platform_device *platform_devices[] __initdata = {
-       &leds_gpio,
-};
-
 static const struct imxmmc_platform_data sdhc_pdata __initconst = {
        .dat3_card_detect = 1,
 };
@@ -377,5 +366,5 @@ void __init eukrea_mbimx27_baseboard_init(void)
 
        imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data);
 
-       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+       gpio_led_register_device(-1, &eukrea_mbimx27_gpio_led_info);
 }
index f9ef04acdab1f6a37e767657d73ab5201644e40a..01ebcb31e4820fa976cd54e2263c597688c55c87 100644 (file)
@@ -173,7 +173,7 @@ static struct platform_device eukrea_mbimxsd_lcd_powerdev = {
        .dev.platform_data      = &eukrea_mbimxsd_lcd_power_data,
 };
 
-static struct gpio_led eukrea_mbimxsd_leds[] = {
+static const struct gpio_led eukrea_mbimxsd_leds[] __initconst = {
        {
                .name                   = "led1",
                .default_trigger        = "heartbeat",
@@ -182,19 +182,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data eukrea_mbimxsd_led_info = {
+static const struct gpio_led_platform_data
+               eukrea_mbimxsd_led_info __initconst = {
        .leds           = eukrea_mbimxsd_leds,
        .num_leds       = ARRAY_SIZE(eukrea_mbimxsd_leds),
 };
 
-static struct platform_device eukrea_mbimxsd_leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &eukrea_mbimxsd_led_info,
-       },
-};
-
 static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
        {
                .gpio           = GPIO_SWITCH1,
@@ -212,7 +205,6 @@ static const struct gpio_keys_platform_data
 };
 
 static struct platform_device *platform_devices[] __initdata = {
-       &eukrea_mbimxsd_leds_gpio,
        &eukrea_mbimxsd_lcd_powerdev,
 };
 
@@ -287,5 +279,6 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
                                ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
 
        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+       gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
        imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
 }
index 4909ea05855a13a83806e4760189a3c1100628b1..558eb526ba56fdb0a738587681c913373a63cd61 100644 (file)
@@ -193,19 +193,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data eukrea_mbimxsd_led_info = {
+static const struct gpio_led_platform_data
+               eukrea_mbimxsd_led_info __initconst = {
        .leds           = eukrea_mbimxsd_leds,
        .num_leds       = ARRAY_SIZE(eukrea_mbimxsd_leds),
 };
 
-static struct platform_device eukrea_mbimxsd_leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &eukrea_mbimxsd_led_info,
-       },
-};
-
 static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
        {
                .gpio           = GPIO_SWITCH1,
@@ -223,7 +216,6 @@ static const struct gpio_keys_platform_data
 };
 
 static struct platform_device *platform_devices[] __initdata = {
-       &eukrea_mbimxsd_leds_gpio,
        &eukrea_mbimxsd_lcd_powerdev,
 };
 
@@ -299,5 +291,6 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
                                ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
 
        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+       gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
        imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
 }
index 15e45c84e37189b2f12e440b637b9a1cc6a64025..a404c89485ca376541403d2b74aca709f152b323 100644 (file)
@@ -99,11 +99,6 @@ static struct platform_device dm9000x_device = {
        }
 };
 
-/* --- SERIAL RESSOURCE --- */
-static const struct imxuart_platform_data uart0_pdata __initconst = {
-       .flags = 0,
-};
-
 static const struct imxuart_platform_data uart1_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
@@ -115,11 +110,13 @@ static struct platform_device *devices[] __initdata = {
 
 static void __init apf9328_init(void)
 {
+       imx1_soc_init();
+
        mxc_gpio_setup_multiple_pins(apf9328_pins,
                        ARRAY_SIZE(apf9328_pins),
                        "APF9328");
 
-       imx1_add_imx_uart0(&uart0_pdata);
+       imx1_add_imx_uart0(NULL);
        imx1_add_imx_uart1(&uart1_pdata);
 
        platform_add_devices(devices, ARRAY_SIZE(devices));
index ffb40ff619b1013c8716b798fd5352387869f575..ede2710f8b764396ee04860154b90cf45b99bec5 100644 (file)
@@ -490,6 +490,8 @@ static struct platform_device *devices[] __initdata = {
  */
 static void __init armadillo5x0_init(void)
 {
+       imx31_soc_init();
+
        mxc_iomux_setup_multiple_pins(armadillo5x0_pins,
                        ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0");
 
index 42e4f078a19c2025c3639ca68f368d33fcab2afe..f49470553bdfb24fd49ff07440cccde06ca42354 100644 (file)
@@ -42,6 +42,8 @@ static const unsigned int bug_pins[] __initconst = {
 
 static void __init bug_board_init(void)
 {
+       imx31_soc_init();
+
        mxc_iomux_setup_multiple_pins(bug_pins,
                                      ARRAY_SIZE(bug_pins), "uart-4");
        imx31_add_imx_uart4(&uart_pdata);
index 46a2e41d43d2c21bac6cb2e54e9472aad6d9393d..87887ac5806b43612c8bba200e3f57df83be0c24 100644 (file)
@@ -250,6 +250,8 @@ __setup("otg_mode=", eukrea_cpuimx27_otg_mode);
 
 static void __init eukrea_cpuimx27_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins,
                ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27");
 
index 3f8ef825fa6f132207c9100c04c39a7c013d0ec8..f39a478ba1a63540a26783a4713033b37121d4f3 100644 (file)
@@ -156,6 +156,8 @@ __setup("otg_mode=", eukrea_cpuimx35_otg_mode);
  */
 static void __init eukrea_cpuimx35_init(void)
 {
+       imx35_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads,
                        ARRAY_SIZE(eukrea_cpuimx35_pads));
 
index 148cff2819b95246c9c8946c62f41600fb546402..da36da52969db2bc82e5da006e7085df21a3482a 100644 (file)
@@ -125,6 +125,8 @@ __setup("otg_mode=", eukrea_cpuimx25_otg_mode);
 
 static void __init eukrea_cpuimx25_init(void)
 {
+       imx25_soc_init();
+
        if (mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx25_pads,
                        ARRAY_SIZE(eukrea_cpuimx25_pads)))
                printk(KERN_ERR "error setting cpuimx25 pads !\n");
index 7ae43b1ec51715ece828b11a72937c99ccb920a7..6707de0ab71671ca07098f279aec78e8522305dc 100644 (file)
@@ -34,7 +34,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 #include <mach/common.h>
-#include <mach/iomux.h>
+#include <mach/iomux-mx27.h>
 
 #include "devices-imx27.h"
 
@@ -231,6 +231,8 @@ static void __init visstrim_m10_board_init(void)
 {
        int ret;
 
+       imx27_soc_init();
+
        ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins,
                        ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10");
        if (ret)
index 9be6cd6fbf8c0563d456eb79db4afd03bc8db121..272f793e9247128fc49300f0afe40dabdf8b19d4 100644 (file)
@@ -50,6 +50,8 @@ static const int mx27ipcam_pins[] __initconst = {
 
 static void __init mx27ipcam_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins),
                "mx27ipcam");
 
index 841140516ede2e89e5d197053f18ef39762a033b..d81a769fe895f69951ec4e8aa2bef4a56c26bd48 100644 (file)
@@ -59,6 +59,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
 
 static void __init mx27lite_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins),
                "imx27lite");
        imx27_add_imx_uart0(&uart_pdata);
index 1ecae20cf4e3cae1a240bd34aee6861b29a9aaab..e472a1d88058706549523fefe8a0ec7fd44c8858 100644 (file)
@@ -223,6 +223,8 @@ static int kzm_pins[] __initdata = {
  */
 static void __init kzm_board_init(void)
 {
+       imx31_soc_init();
+
        mxc_iomux_setup_multiple_pins(kzm_pins,
                                      ARRAY_SIZE(kzm_pins), "kzm");
        kzm_init_ext_uart();
index 38ec5cbbda9bd9f96a1bd82e17534fab1f50cecf..5cd8bee4696025525112bd585e90790e813eb221 100644 (file)
@@ -115,6 +115,8 @@ static struct i2c_board_info mx1ads_i2c_devices[] = {
  */
 static void __init mx1ads_init(void)
 {
+       imx1_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx1ads_pins,
                ARRAY_SIZE(mx1ads_pins), "mx1ads");
 
index 74ac88978ddd6ec22cf25d86f78b8d4f176e01ec..d389ecf9b5a86bfa0a68ccbd69df246d8acbcd82 100644 (file)
@@ -279,6 +279,8 @@ static struct platform_device *platform_devices[] __initdata = {
 
 static void __init mx21ads_board_init(void)
 {
+       imx21_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins),
                        "mx21ads");
 
index 58ea3fdf09119bdfa239f44b4a51a74f6bd9de16..01534bb613051432e4ae26d97b4642d5b658aa40 100644 (file)
@@ -219,6 +219,8 @@ static const struct esdhc_platform_data mx25pdk_esdhc_pdata __initconst = {
 
 static void __init mx25pdk_init(void)
 {
+       imx25_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads,
                        ARRAY_SIZE(mx25pdk_pads));
 
index 6e1accf93f811d57b7ab97c463b562a39bd43b82..6fa6934ab1509b87642bd41158b01841e9b49d26 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/mfd/mc13783.h>
 #include <linux/spi/spi.h>
 #include <linux/regulator/machine.h>
+#include <linux/spi/l4f00242t03.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
 #include "devices-imx27.h"
 
-#define SD1_EN_GPIO (GPIO_PORTB + 25)
-#define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23)
-#define SPI2_SS0 (GPIO_PORTD + 21)
-#define EXPIO_PARENT_INT       (MXC_INTERNAL_IRQS + GPIO_PORTC + 28)
+#define SD1_EN_GPIO            IMX_GPIO_NR(2, 25)
+#define OTG_PHY_RESET_GPIO     IMX_GPIO_NR(2, 23)
+#define SPI2_SS0               IMX_GPIO_NR(4, 21)
+#define EXPIO_PARENT_INT       gpio_to_irq(IMX_GPIO_NR(3, 28))
+#define PMIC_INT               IMX_GPIO_NR(3, 14)
+#define SPI1_SS0               IMX_GPIO_NR(4, 28)
+#define SD1_CD                 IMX_GPIO_NR(2, 26)
+#define LCD_RESET              IMX_GPIO_NR(1, 3)
+#define LCD_ENABLE             IMX_GPIO_NR(1, 31)
 
 static const int mx27pdk_pins[] __initconst = {
        /* UART1 */
@@ -94,13 +100,47 @@ static const int mx27pdk_pins[] __initconst = {
        PE2_PF_USBOTG_DIR,
        PE24_PF_USBOTG_CLK,
        PE25_PF_USBOTG_DATA7,
+       /* CSPI1 */
+       PD31_PF_CSPI1_MOSI,
+       PD30_PF_CSPI1_MISO,
+       PD29_PF_CSPI1_SCLK,
+       PD25_PF_CSPI1_RDY,
+       SPI1_SS0 | GPIO_GPIO | GPIO_OUT,
        /* CSPI2 */
        PD22_PF_CSPI2_SCLK,
        PD23_PF_CSPI2_MISO,
        PD24_PF_CSPI2_MOSI,
+       SPI2_SS0 | GPIO_GPIO | GPIO_OUT,
        /* I2C1 */
        PD17_PF_I2C_DATA,
        PD18_PF_I2C_CLK,
+       /* PMIC INT */
+       PMIC_INT | GPIO_GPIO | GPIO_IN,
+       /* LCD */
+       PA5_PF_LSCLK,
+       PA6_PF_LD0,
+       PA7_PF_LD1,
+       PA8_PF_LD2,
+       PA9_PF_LD3,
+       PA10_PF_LD4,
+       PA11_PF_LD5,
+       PA12_PF_LD6,
+       PA13_PF_LD7,
+       PA14_PF_LD8,
+       PA15_PF_LD9,
+       PA16_PF_LD10,
+       PA17_PF_LD11,
+       PA18_PF_LD12,
+       PA19_PF_LD13,
+       PA20_PF_LD14,
+       PA21_PF_LD15,
+       PA22_PF_LD16,
+       PA23_PF_LD17,
+       PA28_PF_HSYNC,
+       PA29_PF_VSYNC,
+       PA30_PF_CONTRAST,
+       LCD_ENABLE | GPIO_GPIO | GPIO_OUT,
+       LCD_RESET | GPIO_GPIO | GPIO_OUT,
 };
 
 static const struct imxuart_platform_data uart_pdata __initconst = {
@@ -131,13 +171,13 @@ static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = {
 static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
                                void *data)
 {
-       return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING |
-                       IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
+       return request_irq(gpio_to_irq(SD1_CD), detect_irq,
+       IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
 }
 
 static void mx27_3ds_sdhc1_exit(struct device *dev, void *data)
 {
-       free_irq(IRQ_GPIOB(26), data);
+       free_irq(gpio_to_irq(SD1_CD), data);
 }
 
 static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
@@ -193,6 +233,13 @@ static int __init mx27_3ds_otg_mode(char *options)
 __setup("otg_mode=", mx27_3ds_otg_mode);
 
 /* Regulators */
+static struct regulator_init_data gpo_init = {
+       .constraints = {
+               .boot_on = 1,
+               .always_on = 1,
+       }
+};
+
 static struct regulator_consumer_supply vmmc1_consumers[] = {
        REGULATOR_SUPPLY("lcd_2v8", NULL),
 };
@@ -201,7 +248,9 @@ static struct regulator_init_data vmmc1_init = {
        .constraints = {
                .min_uV = 2800000,
                .max_uV = 2800000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .apply_uV = 1,
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                                 REGULATOR_CHANGE_STATUS,
        },
        .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),
        .consumer_supplies = vmmc1_consumers,
@@ -228,6 +277,12 @@ static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = {
        }, {
                .id = MC13783_REG_VGEN,
                .init_data = &vgen_init,
+       }, {
+               .id = MC13783_REG_GPO1, /* Turn on 1.8V */
+               .init_data = &gpo_init,
+       }, {
+               .id = MC13783_REG_GPO3, /* Turn on 3.3V */
+               .init_data = &gpo_init,
        },
 };
 
@@ -238,15 +293,63 @@ static struct mc13xxx_platform_data mc13783_pdata = {
                .num_regulators = ARRAY_SIZE(mx27_3ds_regulators),
 
        },
-       .flags  = MC13783_USE_REGULATOR,
+       .flags  = MC13783_USE_REGULATOR | MC13783_USE_TOUCHSCREEN |
+       MC13783_USE_RTC,
 };
 
 /* SPI */
-static int spi2_internal_chipselect[] = {SPI2_SS0};
+static int spi1_chipselect[] = {SPI1_SS0};
+
+static const struct spi_imx_master spi1_pdata __initconst = {
+       .chipselect     = spi1_chipselect,
+       .num_chipselect = ARRAY_SIZE(spi1_chipselect),
+};
+
+static int spi2_chipselect[] = {SPI2_SS0};
 
 static const struct spi_imx_master spi2_pdata __initconst = {
-       .chipselect     = spi2_internal_chipselect,
-       .num_chipselect = ARRAY_SIZE(spi2_internal_chipselect),
+       .chipselect     = spi2_chipselect,
+       .num_chipselect = ARRAY_SIZE(spi2_chipselect),
+};
+
+static struct imx_fb_videomode mx27_3ds_modes[] = {
+       {       /* 480x640 @ 60 Hz */
+               .mode = {
+                       .name           = "Epson-VGA",
+                       .refresh        = 60,
+                       .xres           = 480,
+                       .yres           = 640,
+                       .pixclock       = 41701,
+                       .left_margin    = 20,
+                       .right_margin   = 41,
+                       .upper_margin   = 10,
+                       .lower_margin   = 5,
+                       .hsync_len      = 20,
+                       .vsync_len      = 10,
+                       .sync           = FB_SYNC_OE_ACT_HIGH |
+                                               FB_SYNC_CLK_INVERT,
+                       .vmode          = FB_VMODE_NONINTERLACED,
+                       .flag           = 0,
+               },
+               .bpp            = 16,
+               .pcr            = 0xFAC08B82,
+       },
+};
+
+static const struct imx_fb_platform_data mx27_3ds_fb_data __initconst = {
+       .mode = mx27_3ds_modes,
+       .num_modes = ARRAY_SIZE(mx27_3ds_modes),
+       .pwmr           = 0x00A903FF,
+       .lscr1          = 0x00120300,
+       .dmacr          = 0x00020010,
+};
+
+/* LCD */
+static struct l4f00242t03_pdata mx27_3ds_lcd_pdata = {
+       .reset_gpio             = LCD_RESET,
+       .data_enable_gpio       = LCD_ENABLE,
+       .core_supply            = "lcd_2v8",
+       .io_supply              = "vdd_lcdio",
 };
 
 static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
@@ -256,8 +359,14 @@ static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
                .bus_num        = 1,
                .chip_select    = 0, /* SS0 */
                .platform_data  = &mc13783_pdata,
-               .irq = IRQ_GPIOC(14),
+               .irq = gpio_to_irq(PMIC_INT),
                .mode = SPI_CS_HIGH,
+       }, {
+               .modalias       = "l4f00242t03",
+               .max_speed_hz   = 5000000,
+               .bus_num        = 0,
+               .chip_select    = 0, /* SS0 */
+               .platform_data  = &mx27_3ds_lcd_pdata,
        },
 };
 
@@ -267,6 +376,8 @@ static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = {
 
 static void __init mx27pdk_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
                "mx27pdk");
        mx27_3ds_sdhc1_enable_level_translator();
@@ -289,12 +400,14 @@ static void __init mx27pdk_init(void)
                imx27_add_fsl_usb2_udc(&otg_device_pdata);
 
        imx27_add_spi_imx1(&spi2_pdata);
+       imx27_add_spi_imx0(&spi1_pdata);
        spi_register_board_info(mx27_3ds_spi_devs,
                                                ARRAY_SIZE(mx27_3ds_spi_devs));
 
        if (mxc_expio_init(MX27_CS5_BASE_ADDR, EXPIO_PARENT_INT))
                pr_warn("Init of the debugboard failed, all devices on the debugboard are unusable.\n");
        imx27_add_imx_i2c(0, &mx27_3ds_i2c0_data);
+       imx27_add_imx_fb(&mx27_3ds_fb_data);
 }
 
 static void __init mx27pdk_timer_init(void)
index 1db79506f5e42e724b939f8b39c27b542c819d53..fc26ed71b9edf56cafa4426668b3a52d523b9fb1 100644 (file)
@@ -288,6 +288,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
 
 static void __init mx27ads_board_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
                        "mx27ads");
 
index 9b982449cb520723a0ae68491cb8db86abe90ee6..1446b353af056c1824fc3a19a86514875631d5cd 100644 (file)
@@ -53,11 +53,8 @@ static int mx31_3ds_pins[] = {
        MX31_PIN_RXD1__RXD1,
        IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
        /*SPI0*/
-       MX31_PIN_CSPI1_SCLK__SCLK,
-       MX31_PIN_CSPI1_MOSI__MOSI,
-       MX31_PIN_CSPI1_MISO__MISO,
-       MX31_PIN_CSPI1_SPI_RDY__SPI_RDY,
-       MX31_PIN_CSPI1_SS2__SS2, /* CS for LCD */
+       IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_ALT1),
+       IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_ALT1),
        /* SPI 1 */
        MX31_PIN_CSPI2_SCLK__SCLK,
        MX31_PIN_CSPI2_MOSI__MOSI,
@@ -689,6 +686,11 @@ static void __init mx31_3ds_init(void)
 {
        int ret;
 
+       imx31_soc_init();
+
+       /* Configure SPI1 IOMUX */
+       mxc_iomux_set_gpr(MUX_PGP_CSPI_BB, true);
+
        mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins),
                                      "mx31_3ds");
 
index f4dee025463433430fc490ab6a276b0ef271766d..0ce49478a479783947ee6547b3eab34e86fd04be 100644 (file)
@@ -516,6 +516,8 @@ static void __init mx31ads_init_irq(void)
 
 static void __init mx31ads_init(void)
 {
+       imx31_soc_init();
+
        mxc_init_extuart();
        mxc_init_imx_uart();
        mxc_init_i2c();
index 410e676ae087ff16520333b70f085acba14ccbe9..750368ddf0f977479ee301933d31832ff5434e65 100644 (file)
@@ -243,6 +243,8 @@ core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444);
 
 static void __init mx31lilly_board_init(void)
 {
+       imx31_soc_init();
+
        switch (mx31lilly_baseboard) {
        case MX31LILLY_NOBOARD:
                break;
index ac9b4cad320edeb2a3c6c79690f53224b8c80cc3..4b47fd9fdd899f6d13c25f9f816e43b58de7c510 100644 (file)
@@ -230,6 +230,8 @@ static void __init mx31lite_init(void)
 {
        int ret;
 
+       imx31_soc_init();
+
        switch (mx31lite_baseboard) {
        case MX31LITE_NOBOARD:
                break;
index eaa51e49ca9517466793fb667248f9cfabe9f700..b358383120e7c3cb41b793b6c1e4aa71d6582b5a 100644 (file)
@@ -425,7 +425,7 @@ static int __init moboard_usbh2_init(void)
        return 0;
 }
 
-static struct gpio_led mx31moboard_leds[] = {
+static const struct gpio_led mx31moboard_leds[] __initconst = {
        {
                .name   = "coreboard-led-0:red:running",
                .default_trigger = "heartbeat",
@@ -442,26 +442,17 @@ static struct gpio_led mx31moboard_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data mx31moboard_led_pdata = {
+static const struct gpio_led_platform_data mx31moboard_led_pdata __initconst = {
        .num_leds       = ARRAY_SIZE(mx31moboard_leds),
        .leds           = mx31moboard_leds,
 };
 
-static struct platform_device mx31moboard_leds_device = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data = &mx31moboard_led_pdata,
-       },
-};
-
 static const struct ipu_platform_data mx3_ipu_data __initconst = {
        .irq_base = MXC_IPU_IRQ_START,
 };
 
 static struct platform_device *devices[] __initdata = {
        &mx31moboard_flash,
-       &mx31moboard_leds_device,
 };
 
 static struct mx3_camera_pdata camera_pdata __initdata = {
@@ -507,10 +498,13 @@ core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444);
  */
 static void __init mx31moboard_init(void)
 {
+       imx31_soc_init();
+
        mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins),
                "moboard");
 
        platform_add_devices(devices, ARRAY_SIZE(devices));
+       gpio_led_register_device(-1, &mx31moboard_led_pdata);
 
        imx31_add_imx_uart0(&uart0_pdata);
        imx31_add_imx_uart4(&uart4_pdata);
index 882880ac1bbc9bf1b57a9b6e2c17ec31cd5415db..b3b9bd8ac2a33f3bf5d993cd9ca9d9e189edd1c1 100644 (file)
@@ -43,7 +43,7 @@
 
 #include "devices-imx35.h"
 
-#define EXPIO_PARENT_INT       (MXC_INTERNAL_IRQS + GPIO_PORTA + 1)
+#define EXPIO_PARENT_INT       gpio_to_irq(IMX_GPIO_NR(1, 1))
 
 static const struct imxuart_platform_data uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
@@ -179,6 +179,8 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = {
  */
 static void __init mx35_3ds_init(void)
 {
+       imx35_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));
 
        imx35_add_fec(NULL);
index 2774541511e7bc2da0935663a933eb3917cfab62..c85876fed663d072a78e0122f71cef2c2a6f145f 100644 (file)
@@ -233,6 +233,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
 
 static void __init mxt_td60_board_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(mxt_td60_pins, ARRAY_SIZE(mxt_td60_pins),
                        "MXT_TD60");
 
index bbddc5a11c43b52dec562f719b0fe3fce044edc6..71083aa160381be2a3b4392cf87a1880ba1d6326 100644 (file)
@@ -357,6 +357,8 @@ static void __init pca100_init(void)
 {
        int ret;
 
+       imx27_soc_init();
+
        /* SSI unit */
        mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0,
                                  MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
index 89c213b81295cc7dc999c112916c2fbfcef17cff..f45b7cd72c8a9df52d12ddc4a2e97708bc275a53 100644 (file)
@@ -576,6 +576,8 @@ static void __init pcm037_init(void)
 {
        int ret;
 
+       imx31_soc_init();
+
        mxc_iomux_set_gpr(MUX_PGP_UH2, 1);
 
        mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins),
index 853bb871c7ed0d34b3e124ae20e3584b600736f0..2d6a64bbac44eb18b83ea1694da8fc5c4332bb65 100644 (file)
@@ -295,6 +295,8 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
 
 static void __init pcm038_init(void)
 {
+       imx27_soc_init();
+
        mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
                        "PCM038");
 
index 026441628dfaae962c9dfb88e02788c4e72a8e89..163cc318cafb5ac2019b47b508b91742ed52063a 100644 (file)
@@ -356,6 +356,8 @@ static struct esdhc_platform_data sd1_pdata = {
  */
 static void __init pcm043_init(void)
 {
+       imx35_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads));
 
        mxc_audmux_v2_configure_port(3,
index c1632871593993dc0d98b961d8fd85bd24424d99..3626f486498aee40196f28ebb35c7fd4815f0e11 100644 (file)
@@ -244,6 +244,8 @@ static void __init qong_init_fpga(void)
  */
 static void __init qong_init(void)
 {
+       imx31_soc_init();
+
        mxc_init_imx_uart();
        qong_init_nor_mtd();
        qong_init_fpga();
index dcaee043628ee449590edebba994e32636a8ab98..db2d60470e1583a68b6d98a40b2cc35364b9edce 100644 (file)
@@ -101,21 +101,7 @@ static const int mxc_uart1_pins[] = {
        PC12_PF_UART1_RXD,
 };
 
-static int uart1_mxc_init(struct platform_device *pdev)
-{
-       return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
-                       ARRAY_SIZE(mxc_uart1_pins), "UART1");
-}
-
-static void uart1_mxc_exit(struct platform_device *pdev)
-{
-       mxc_gpio_release_multiple_pins(mxc_uart1_pins,
-                       ARRAY_SIZE(mxc_uart1_pins));
-}
-
 static const struct imxuart_platform_data uart_pdata __initconst = {
-       .init = uart1_mxc_init,
-       .exit = uart1_mxc_exit,
        .flags = IMXUART_HAVE_RTSCTS,
 };
 
@@ -129,6 +115,11 @@ static struct platform_device *devices[] __initdata = {
  */
 static void __init scb9328_init(void)
 {
+       imx1_soc_init();
+
+       mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
+                       ARRAY_SIZE(mxc_uart1_pins), "UART1");
+
        imx1_add_imx_uart0(&uart_pdata);
 
        printk(KERN_INFO"Scb9328: Adding devices\n");
index d74e3473d2369163adac10c2aba99d7403598115..7d8e012a6335957ae91485230d96d7eb45adf020 100644 (file)
@@ -267,6 +267,8 @@ static struct platform_device *devices[] __initdata = {
  */
 static void __init vpr200_board_init(void)
 {
+       imx35_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));
 
        imx35_add_fec(NULL);
index 2e482ba5a0e71fa8b21268059e44ee76158bcf05..f2a6566e22e721334433092d7c6bef2331bff3af 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <mach/common.h>
 #include <mach/hardware.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 #include <mach/iomux-v1.h>
 
@@ -44,15 +43,19 @@ void __init imx1_init_early(void)
                        MX1_NUM_GPIO_PORT);
 }
 
-static struct mxc_gpio_port imx1_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX1, 0, 1, MX1_GPIO_INT_PORTA),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX1, 1, 2, MX1_GPIO_INT_PORTB),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX1, 2, 3, MX1_GPIO_INT_PORTC),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX1, 3, 4, MX1_GPIO_INT_PORTD),
-};
-
 void __init mx1_init_irq(void)
 {
        mxc_init_irq(MX1_IO_ADDRESS(MX1_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx1_gpio_ports,  ARRAY_SIZE(imx1_gpio_ports));
+}
+
+void __init imx1_soc_init(void)
+{
+       mxc_register_gpio(0, MX1_GPIO1_BASE_ADDR, SZ_256,
+                                               MX1_GPIO_INT_PORTA, 0);
+       mxc_register_gpio(1, MX1_GPIO2_BASE_ADDR, SZ_256,
+                                               MX1_GPIO_INT_PORTB, 0);
+       mxc_register_gpio(2, MX1_GPIO3_BASE_ADDR, SZ_256,
+                                               MX1_GPIO_INT_PORTC, 0);
+       mxc_register_gpio(3, MX1_GPIO4_BASE_ADDR, SZ_256,
+                                               MX1_GPIO_INT_PORTD, 0);
 }
index 7a0c500ac2c865462726bd33098df67438cb67ab..4f32a8a9aeed2780a27a320d7e8c84411063beae 100644 (file)
@@ -22,9 +22,9 @@
 #include <linux/init.h>
 #include <mach/hardware.h>
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <asm/pgtable.h>
 #include <asm/mach/map.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 #include <mach/iomux-v1.h>
 
@@ -70,17 +70,19 @@ void __init imx21_init_early(void)
                        MX21_NUM_GPIO_PORT);
 }
 
-static struct mxc_gpio_port imx21_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX21, 0, 1, MX21_INT_GPIO),
-       DEFINE_IMX_GPIO_PORT(MX21, 1, 2),
-       DEFINE_IMX_GPIO_PORT(MX21, 2, 3),
-       DEFINE_IMX_GPIO_PORT(MX21, 3, 4),
-       DEFINE_IMX_GPIO_PORT(MX21, 4, 5),
-       DEFINE_IMX_GPIO_PORT(MX21, 5, 6),
-};
-
 void __init mx21_init_irq(void)
 {
        mxc_init_irq(MX21_IO_ADDRESS(MX21_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx21_gpio_ports, ARRAY_SIZE(imx21_gpio_ports));
+}
+
+void __init imx21_soc_init(void)
+{
+       mxc_register_gpio(0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       mxc_register_gpio(1, MX21_GPIO2_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       mxc_register_gpio(2, MX21_GPIO3_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       mxc_register_gpio(3, MX21_GPIO4_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       mxc_register_gpio(4, MX21_GPIO5_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       mxc_register_gpio(5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+
+       imx_add_imx_dma();
 }
index 02f7b5c7fa8e840d526302fade50adb11c026bdb..1e0c95651c2315a5c7a113e27f5b71572cd80c6b 100644 (file)
 #include <asm/mach/map.h>
 
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <mach/hardware.h>
 #include <mach/mx25.h>
 #include <mach/iomux-v3.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 
 /*
@@ -57,16 +57,39 @@ void __init imx25_init_early(void)
        mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR));
 }
 
-static struct mxc_gpio_port imx25_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX25, 0, 1, MX25_INT_GPIO1),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX25, 1, 2, MX25_INT_GPIO2),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX25, 2, 3, MX25_INT_GPIO3),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX25, 3, 4, MX25_INT_GPIO4),
-};
-
 void __init mx25_init_irq(void)
 {
        mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx25_gpio_ports, ARRAY_SIZE(imx25_gpio_ports));
 }
 
+static struct sdma_script_start_addrs imx25_sdma_script __initdata = {
+       .ap_2_ap_addr = 729,
+       .uart_2_mcu_addr = 904,
+       .per_2_app_addr = 1255,
+       .mcu_2_app_addr = 834,
+       .uartsh_2_mcu_addr = 1120,
+       .per_2_shp_addr = 1329,
+       .mcu_2_shp_addr = 1048,
+       .ata_2_mcu_addr = 1560,
+       .mcu_2_ata_addr = 1479,
+       .app_2_per_addr = 1189,
+       .app_2_mcu_addr = 770,
+       .shp_2_per_addr = 1407,
+       .shp_2_mcu_addr = 979,
+};
+
+static struct sdma_platform_data imx25_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx25.bin",
+       .script_addrs = &imx25_sdma_script,
+};
+
+void __init imx25_soc_init(void)
+{
+       mxc_register_gpio(0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0);
+       mxc_register_gpio(1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0);
+       mxc_register_gpio(2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0);
+       mxc_register_gpio(3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0);
+
+       imx_add_imx_sdma(MX25_SDMA_BASE_ADDR, MX25_INT_SDMA, &imx25_sdma_pdata);
+}
index a6761a39f08ccb54bb6f7fce93cf191c41a44681..944e02d3ccc23776c1bf7d00ceef712fe9d06374 100644 (file)
@@ -22,9 +22,9 @@
 #include <linux/init.h>
 #include <mach/hardware.h>
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <asm/pgtable.h>
 #include <asm/mach/map.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 #include <mach/iomux-v1.h>
 
@@ -70,17 +70,19 @@ void __init imx27_init_early(void)
                        MX27_NUM_GPIO_PORT);
 }
 
-static struct mxc_gpio_port imx27_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX27, 0, 1, MX27_INT_GPIO),
-       DEFINE_IMX_GPIO_PORT(MX27, 1, 2),
-       DEFINE_IMX_GPIO_PORT(MX27, 2, 3),
-       DEFINE_IMX_GPIO_PORT(MX27, 3, 4),
-       DEFINE_IMX_GPIO_PORT(MX27, 4, 5),
-       DEFINE_IMX_GPIO_PORT(MX27, 5, 6),
-};
-
 void __init mx27_init_irq(void)
 {
        mxc_init_irq(MX27_IO_ADDRESS(MX27_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx27_gpio_ports, ARRAY_SIZE(imx27_gpio_ports));
+}
+
+void __init imx27_soc_init(void)
+{
+       mxc_register_gpio(0, MX27_GPIO1_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       mxc_register_gpio(1, MX27_GPIO2_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       mxc_register_gpio(2, MX27_GPIO3_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       mxc_register_gpio(3, MX27_GPIO4_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       mxc_register_gpio(4, MX27_GPIO5_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       mxc_register_gpio(5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+
+       imx_add_imx_dma();
 }
index 86b9b45864d2f482b55c58c09362967564eb2785..a1ff96f249d1b90f2689909a47d06d0cc259c402 100644 (file)
@@ -24,9 +24,9 @@
 #include <asm/mach/map.h>
 
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <mach/hardware.h>
 #include <mach/iomux-v3.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 
 static struct map_desc mx31_io_desc[] __initdata = {
@@ -53,14 +53,40 @@ void __init imx31_init_early(void)
        mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
 }
 
-static struct mxc_gpio_port imx31_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX31, 0, 1, MX31_INT_GPIO1),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX31, 1, 2, MX31_INT_GPIO2),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX31, 2, 3, MX31_INT_GPIO3),
-};
-
 void __init mx31_init_irq(void)
 {
        mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx31_gpio_ports, ARRAY_SIZE(imx31_gpio_ports));
+}
+
+static struct sdma_script_start_addrs imx31_to1_sdma_script __initdata = {
+       .per_2_per_addr = 1677,
+};
+
+static struct sdma_script_start_addrs imx31_to2_sdma_script __initdata = {
+       .ap_2_ap_addr = 423,
+       .ap_2_bp_addr = 829,
+       .bp_2_ap_addr = 1029,
+};
+
+static struct sdma_platform_data imx31_sdma_pdata __initdata = {
+       .sdma_version = 1,
+       .fw_name = "sdma-imx31-to2.bin",
+       .script_addrs = &imx31_to2_sdma_script,
+};
+
+void __init imx31_soc_init(void)
+{
+       int to_version = mx31_revision() >> 4;
+
+       mxc_register_gpio(0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0);
+       mxc_register_gpio(1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0);
+       mxc_register_gpio(2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0);
+
+       if (to_version == 1) {
+               strncpy(imx31_sdma_pdata.fw_name, "sdma-imx31-to1.bin",
+                       strlen(imx31_sdma_pdata.fw_name));
+               imx31_sdma_pdata.script_addrs = &imx31_to1_sdma_script;
+       }
+
+       imx_add_imx_sdma(MX31_SDMA_BASE_ADDR, MX31_INT_SDMA, &imx31_sdma_pdata);
 }
index c880e6d1ae550312d1136a8f37890144ea442bc3..da530ca48aeadd6c757af71973b22f4e037cad0a 100644 (file)
@@ -25,9 +25,9 @@
 #include <asm/hardware/cache-l2x0.h>
 
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <mach/hardware.h>
 #include <mach/iomux-v3.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 
 static struct map_desc mx35_io_desc[] __initdata = {
@@ -50,14 +50,60 @@ void __init imx35_init_early(void)
        mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
 }
 
-static struct mxc_gpio_port imx35_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ(MX35, 0, 1, MX35_INT_GPIO1),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX35, 1, 2, MX35_INT_GPIO2),
-       DEFINE_IMX_GPIO_PORT_IRQ(MX35, 2, 3, MX35_INT_GPIO3),
-};
-
 void __init mx35_init_irq(void)
 {
        mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
-       mxc_gpio_init(imx35_gpio_ports, ARRAY_SIZE(imx35_gpio_ports));
+}
+
+static struct sdma_script_start_addrs imx35_to1_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .uart_2_mcu_addr = 817,
+       .mcu_2_app_addr = 747,
+       .uartsh_2_mcu_addr = 1183,
+       .per_2_shp_addr = 1033,
+       .mcu_2_shp_addr = 961,
+       .ata_2_mcu_addr = 1333,
+       .mcu_2_ata_addr = 1252,
+       .app_2_mcu_addr = 683,
+       .shp_2_per_addr = 1111,
+       .shp_2_mcu_addr = 892,
+};
+
+static struct sdma_script_start_addrs imx35_to2_sdma_script __initdata = {
+       .ap_2_ap_addr = 729,
+       .uart_2_mcu_addr = 904,
+       .per_2_app_addr = 1597,
+       .mcu_2_app_addr = 834,
+       .uartsh_2_mcu_addr = 1270,
+       .per_2_shp_addr = 1120,
+       .mcu_2_shp_addr = 1048,
+       .ata_2_mcu_addr = 1429,
+       .mcu_2_ata_addr = 1339,
+       .app_2_per_addr = 1531,
+       .app_2_mcu_addr = 770,
+       .shp_2_per_addr = 1198,
+       .shp_2_mcu_addr = 979,
+};
+
+static struct sdma_platform_data imx35_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx35-to2.bin",
+       .script_addrs = &imx35_to2_sdma_script,
+};
+
+void __init imx35_soc_init(void)
+{
+       int to_version = mx35_revision() >> 4;
+
+       mxc_register_gpio(0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
+       mxc_register_gpio(1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0);
+       mxc_register_gpio(2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0);
+
+       if (to_version == 1) {
+               strncpy(imx35_sdma_pdata.fw_name, "sdma-imx35-to1.bin",
+                       strlen(imx35_sdma_pdata.fw_name));
+               imx35_sdma_pdata.script_addrs = &imx35_to1_sdma_script;
+       }
+
+       imx_add_imx_sdma(MX35_SDMA_BASE_ADDR, MX35_INT_SDMA, &imx35_sdma_pdata);
 }
index 5aa053edc17cc1b5799676a50ab1a630e0629aaa..bf0fb87946ba40fbd1a0ee5222572034177ccc68 100644 (file)
@@ -161,7 +161,7 @@ static const struct spi_imx_master spi0_pdata __initconst = {
 
 /* GPIO LEDs */
 
-static struct gpio_led litekit_leds[] = {
+static const struct gpio_led litekit_leds[] __initconst = {
        {
                .name           = "GPIO0",
                .gpio           = IOMUX_TO_GPIO(MX31_PIN_COMPARE),
@@ -176,19 +176,12 @@ static struct gpio_led litekit_leds[] = {
        }
 };
 
-static struct gpio_led_platform_data litekit_led_platform_data = {
+static const struct gpio_led_platform_data
+               litekit_led_platform_data __initconst = {
        .leds           = litekit_leds,
        .num_leds       = ARRAY_SIZE(litekit_leds),
 };
 
-static struct platform_device litekit_led_device = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data = &litekit_led_platform_data,
-       },
-};
-
 void __init mx31lite_db_init(void)
 {
        mxc_iomux_setup_multiple_pins(litekit_db_board_pins,
@@ -197,7 +190,7 @@ void __init mx31lite_db_init(void)
        imx31_add_imx_uart0(&uart_pdata);
        imx31_add_mxc_mmc(0, &mmc_pdata);
        imx31_add_spi_imx0(&spi0_pdata);
-       platform_device_register(&litekit_led_device);
+       gpio_led_register_device(-1, &litekit_led_platform_data);
        imx31_add_imx2_wdt(NULL);
        imx31_add_mxc_rtc(NULL);
 }
index da0e6498110a4f6400274b74015e964ab81566f5..1e027514096d0d9e15f87152a0e92761f1e959e8 100644 (file)
@@ -1077,7 +1077,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand)
        _REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0)
        _REGISTER_CLOCK("tbd", "i2s1_ck", clk_i2s1)
-       _REGISTER_CLOCK("lpc32xx-ts", NULL, clk_tsc)
+       _REGISTER_CLOCK("ts-lpc32xx", NULL, clk_tsc)
        _REGISTER_CLOCK("dev:mmc0", "MCLK", clk_mmc)
        _REGISTER_CLOCK("lpc-net.0", NULL, clk_net)
        _REGISTER_CLOCK("dev:clcd", NULL, clk_lcd)
index ee24dc28e93ec7d4741825487ab8ddf37ba197cf..205b2dbb565bb91c00593b848c1aec2adfda74cf 100644 (file)
@@ -95,6 +95,48 @@ struct platform_device lpc32xx_i2c2_device = {
        },
 };
 
+/* TSC (Touch Screen Controller) */
+
+static struct resource lpc32xx_tsc_resources[] = {
+       {
+               .start = LPC32XX_ADC_BASE,
+               .end = LPC32XX_ADC_BASE + SZ_4K - 1,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_LPC32XX_TS_IRQ,
+               .end = IRQ_LPC32XX_TS_IRQ,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device lpc32xx_tsc_device = {
+       .name =  "ts-lpc32xx",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(lpc32xx_tsc_resources),
+       .resource = lpc32xx_tsc_resources,
+};
+
+/* RTC */
+
+static struct resource lpc32xx_rtc_resources[] = {
+       {
+               .start = LPC32XX_RTC_BASE,
+               .end = LPC32XX_RTC_BASE + SZ_4K - 1,
+               .flags = IORESOURCE_MEM,
+       },{
+               .start = IRQ_LPC32XX_RTC,
+               .end = IRQ_LPC32XX_RTC,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device lpc32xx_rtc_device = {
+       .name =  "rtc-lpc32xx",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(lpc32xx_rtc_resources),
+       .resource = lpc32xx_rtc_resources,
+};
+
 /*
  * Returns the unique ID for the device
  */
index f82211fd80c1fab17d37c74d9ce1cc01353082ee..5583f52662bda8164dec061b60d57476b9c761e4 100644 (file)
@@ -28,6 +28,8 @@ extern struct platform_device lpc32xx_watchdog_device;
 extern struct platform_device lpc32xx_i2c0_device;
 extern struct platform_device lpc32xx_i2c1_device;
 extern struct platform_device lpc32xx_i2c2_device;
+extern struct platform_device lpc32xx_tsc_device;
+extern struct platform_device lpc32xx_rtc_device;
 
 /*
  * Other arch specific structures and functions
index 67793a6902727eeb67fb53b5d688e2a738efc185..56ef5f6c811636a5d0a2b40cd82c0ab0aabc53a5 100644 (file)
@@ -77,6 +77,13 @@ config MACH_TETON_BGA
          Say 'Y' here if you want to support the Marvell PXA168-based
          Teton BGA Development Board.
 
+config MACH_SHEEVAD
+       bool "Marvell's PXA168 GuruPlug Display (gplugD) Board"
+       select CPU_PXA168
+       help
+         Say 'Y' here if you want to support the Marvell PXA168-based
+         GuruPlug Display (gplugD) Board
+
 endmenu
 
 config CPU_PXA168
index 5c68382141af09d902ae911694a08117861bc0cd..b0ac942327aa72bf5ffa36acc9e9434cd0884fb1 100644 (file)
@@ -19,3 +19,4 @@ obj-$(CONFIG_MACH_BROWNSTONE) += brownstone.o
 obj-$(CONFIG_MACH_FLINT)       += flint.o
 obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o
 obj-$(CONFIG_MACH_TETON_BGA)   += teton_bga.o
+obj-$(CONFIG_MACH_SHEEVAD)     += gplugd.o
index 886e05648f08a5a4975bc0257b2b0929e9fffc1f..7c6f95f291425c5fd3fc3d5c8969d4e9f739201f 100644 (file)
@@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk)
        return rate;
 }
 EXPORT_SYMBOL(clk_get_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       int ret = -EINVAL;
+
+       if (clk->ops->setrate) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               ret = clk->ops->setrate(clk, rate);
+               spin_unlock_irqrestore(&clocks_lock, flags);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(clk_set_rate);
index 9b027d7491f5e9ba854e496568eaa2fafdc9be5e..3143e994e672326acb26a7648a4cac7376e1f078 100644 (file)
@@ -12,6 +12,7 @@ struct clkops {
        void                    (*enable)(struct clk *);
        void                    (*disable)(struct clk *);
        unsigned long           (*getrate)(struct clk *);
+       int                     (*setrate)(struct clk *, unsigned long);
 };
 
 struct clk {
diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c
new file mode 100644 (file)
index 0000000..c070c24
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ *  linux/arch/arm/mach-mmp/gplugd.c
+ *
+ *  Support for the Marvell PXA168-based GuruPlug Display (gplugD) Platform.
+ *
+ *  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
+ *  publishhed by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+
+#include <mach/gpio.h>
+#include <mach/pxa168.h>
+#include <mach/mfp-pxa168.h>
+#include <mach/mfp-gplugd.h>
+
+#include "common.h"
+
+static unsigned long gplugd_pin_config[] __initdata = {
+       /* UART3 */
+       GPIO8_UART3_SOUT,
+       GPIO9_UART3_SIN,
+       GPI1O_UART3_CTS,
+       GPI11_UART3_RTS,
+
+       /* MMC2 */
+       GPIO28_MMC2_CMD,
+       GPIO29_MMC2_CLK,
+       GPIO30_MMC2_DAT0,
+       GPIO31_MMC2_DAT1,
+       GPIO32_MMC2_DAT2,
+       GPIO33_MMC2_DAT3,
+
+       /* LCD & HDMI clock selection GPIO: 0: 74.176MHz, 1: 74.25 MHz */
+       GPIO35_GPIO,
+       GPIO36_GPIO, /* CEC Interrupt */
+
+       /* MMC1 */
+       GPIO43_MMC1_CLK,
+       GPIO49_MMC1_CMD,
+       GPIO41_MMC1_DAT0,
+       GPIO40_MMC1_DAT1,
+       GPIO52_MMC1_DAT2,
+       GPIO51_MMC1_DAT3,
+       GPIO53_MMC1_CD,
+
+       /* LCD */
+       GPIO56_LCD_FCLK_RD,
+       GPIO57_LCD_LCLK_A0,
+       GPIO58_LCD_PCLK_WR,
+       GPIO59_LCD_DENA_BIAS,
+       GPIO60_LCD_DD0,
+       GPIO61_LCD_DD1,
+       GPIO62_LCD_DD2,
+       GPIO63_LCD_DD3,
+       GPIO64_LCD_DD4,
+       GPIO65_LCD_DD5,
+       GPIO66_LCD_DD6,
+       GPIO67_LCD_DD7,
+       GPIO68_LCD_DD8,
+       GPIO69_LCD_DD9,
+       GPIO70_LCD_DD10,
+       GPIO71_LCD_DD11,
+       GPIO72_LCD_DD12,
+       GPIO73_LCD_DD13,
+       GPIO74_LCD_DD14,
+       GPIO75_LCD_DD15,
+       GPIO76_LCD_DD16,
+       GPIO77_LCD_DD17,
+       GPIO78_LCD_DD18,
+       GPIO79_LCD_DD19,
+       GPIO80_LCD_DD20,
+       GPIO81_LCD_DD21,
+       GPIO82_LCD_DD22,
+       GPIO83_LCD_DD23,
+
+       /* GPIO */
+       GPIO84_GPIO,
+       GPIO85_GPIO,
+
+       /* Fast-Ethernet*/
+       GPIO86_TX_CLK,
+       GPIO87_TX_EN,
+       GPIO88_TX_DQ3,
+       GPIO89_TX_DQ2,
+       GPIO90_TX_DQ1,
+       GPIO91_TX_DQ0,
+       GPIO92_MII_CRS,
+       GPIO93_MII_COL,
+       GPIO94_RX_CLK,
+       GPIO95_RX_ER,
+       GPIO96_RX_DQ3,
+       GPIO97_RX_DQ2,
+       GPIO98_RX_DQ1,
+       GPIO99_RX_DQ0,
+       GPIO100_MII_MDC,
+       GPIO101_MII_MDIO,
+       GPIO103_RX_DV,
+       GPIO104_GPIO,     /* Reset PHY */
+
+       /* RTC interrupt */
+       GPIO102_GPIO,
+
+       /* I2C */
+       GPIO105_CI2C_SDA,
+       GPIO106_CI2C_SCL,
+
+       /* Select JTAG */
+       GPIO109_GPIO,
+
+       /* I2S */
+       GPIO114_I2S_FRM,
+       GPIO115_I2S_BCLK,
+       GPIO116_I2S_TXD
+};
+
+static struct i2c_board_info gplugd_i2c_board_info[] = {
+       {
+               .type = "isl1208",
+               .addr = 0x6F,
+       }
+};
+
+/* Bring PHY out of reset by setting GPIO 104 */
+static int gplugd_eth_init(void)
+{
+       if (unlikely(gpio_request(104, "ETH_RESET_N"))) {
+               printk(KERN_ERR "Can't get hold of GPIO 104 to bring Ethernet "
+                               "PHY out of reset\n");
+               return -EIO;
+       }
+
+       gpio_direction_output(104, 1);
+       gpio_free(104);
+       return 0;
+}
+
+struct pxa168_eth_platform_data gplugd_eth_platform_data = {
+       .port_number = 0,
+       .phy_addr    = 0,
+       .speed       = 0, /* Autonagotiation */
+       .init        = gplugd_eth_init,
+};
+
+static void __init select_disp_freq(void)
+{
+       /* set GPIO 35 & clear GPIO 85 to set LCD External Clock to 74.25 MHz */
+       if (unlikely(gpio_request(35, "DISP_FREQ_SEL"))) {
+               printk(KERN_ERR "Can't get hold of GPIO 35 to select display "
+                               "frequency\n");
+       } else {
+               gpio_direction_output(35, 1);
+               gpio_free(104);
+       }
+
+       if (unlikely(gpio_request(85, "DISP_FREQ_SEL_2"))) {
+               printk(KERN_ERR "Can't get hold of GPIO 85 to select display "
+                               "frequency\n");
+       } else {
+               gpio_direction_output(85, 0);
+               gpio_free(104);
+       }
+}
+
+static void __init gplugd_init(void)
+{
+       mfp_config(ARRAY_AND_SIZE(gplugd_pin_config));
+
+       select_disp_freq();
+
+       /* on-chip devices */
+       pxa168_add_uart(3);
+       pxa168_add_ssp(0);
+       pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(gplugd_i2c_board_info));
+
+       pxa168_add_eth(&gplugd_eth_platform_data);
+}
+
+MACHINE_START(SHEEVAD, "PXA168-based GuruPlug Display (gplugD) Platform")
+       .map_io         = mmp_map_io,
+       .nr_irqs        = IRQ_BOARD_START,
+       .init_irq       = pxa168_init_irq,
+       .timer          = &pxa168_timer,
+       .init_machine   = gplugd_init,
+MACHINE_END
diff --git a/arch/arm/mach-mmp/include/mach/mfp-gplugd.h b/arch/arm/mach-mmp/include/mach/mfp-gplugd.h
new file mode 100644 (file)
index 0000000..b8cf38d
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * linux/arch/arm/mach-mmp/include/mach/mfp-gplugd.h
+ *
+ *   MFP definitions used in gplugD
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __MACH_MFP_GPLUGD_H
+#define __MACH_MFP_GPLUGD_H
+
+#include <plat/mfp.h>
+#include <mach/mfp.h>
+
+/* UART3 */
+#define GPIO8_UART3_SOUT       MFP_CFG(GPIO8, AF2)
+#define GPIO9_UART3_SIN        MFP_CFG(GPIO9, AF2)
+#define GPI1O_UART3_CTS        MFP_CFG(GPIO10, AF2)
+#define GPI11_UART3_RTS        MFP_CFG(GPIO11, AF2)
+
+/* MMC2 */
+#define        GPIO28_MMC2_CMD         MFP_CFG_DRV(GPIO28, AF6, FAST)
+#define        GPIO29_MMC2_CLK         MFP_CFG_DRV(GPIO29, AF6, FAST)
+#define        GPIO30_MMC2_DAT0        MFP_CFG_DRV(GPIO30, AF6, FAST)
+#define        GPIO31_MMC2_DAT1        MFP_CFG_DRV(GPIO31, AF6, FAST)
+#define        GPIO32_MMC2_DAT2        MFP_CFG_DRV(GPIO32, AF6, FAST)
+#define        GPIO33_MMC2_DAT3        MFP_CFG_DRV(GPIO33, AF6, FAST)
+
+/* I2S */
+#undef GPIO114_I2S_FRM
+#undef GPIO115_I2S_BCLK
+
+#define GPIO114_I2S_FRM                MFP_CFG_DRV(GPIO114, AF1, FAST)
+#define GPIO115_I2S_BCLK        MFP_CFG_DRV(GPIO115, AF1, FAST)
+#define GPIO116_I2S_TXD         MFP_CFG_DRV(GPIO116, AF1, FAST)
+
+/* MMC4 */
+#define GPIO125_MMC4_DAT3       MFP_CFG_DRV(GPIO125, AF7, FAST)
+#define GPIO126_MMC4_DAT2       MFP_CFG_DRV(GPIO126, AF7, FAST)
+#define GPIO127_MMC4_DAT1       MFP_CFG_DRV(GPIO127, AF7, FAST)
+#define GPIO0_2_MMC4_DAT0       MFP_CFG_DRV(GPIO0_2, AF7, FAST)
+#define GPIO1_2_MMC4_CMD        MFP_CFG_DRV(GPIO1_2, AF7, FAST)
+#define GPIO2_2_MMC4_CLK        MFP_CFG_DRV(GPIO2_2, AF7, FAST)
+
+/* OTG GPIO */
+#define GPIO_USB_OTG_PEN        18
+#define GPIO_USB_OIDIR          20
+
+/* Other GPIOs are 35, 84, 85 */
+#endif /* __MACH_MFP_GPLUGD_H */
index 713be155a44d716df91aeb74c2d043630f543564..8c782328b21cf4e6a92460b436a5241a5e573fae 100644 (file)
 #define GPIO112_KP_MKOUT6       MFP_CFG(GPIO112, AF7)
 #define GPIO121_KP_MKIN4        MFP_CFG(GPIO121, AF7)
 
+/* Fast Ethernet */
+#define GPIO86_TX_CLK          MFP_CFG(GPIO86, AF5)
+#define GPIO87_TX_EN           MFP_CFG(GPIO87, AF5)
+#define GPIO88_TX_DQ3          MFP_CFG(GPIO88, AF5)
+#define GPIO89_TX_DQ2          MFP_CFG(GPIO89, AF5)
+#define GPIO90_TX_DQ1          MFP_CFG(GPIO90, AF5)
+#define GPIO91_TX_DQ0          MFP_CFG(GPIO91, AF5)
+#define GPIO92_MII_CRS         MFP_CFG(GPIO92, AF5)
+#define GPIO93_MII_COL         MFP_CFG(GPIO93, AF5)
+#define GPIO94_RX_CLK          MFP_CFG(GPIO94, AF5)
+#define GPIO95_RX_ER           MFP_CFG(GPIO95, AF5)
+#define GPIO96_RX_DQ3          MFP_CFG(GPIO96, AF5)
+#define GPIO97_RX_DQ2          MFP_CFG(GPIO97, AF5)
+#define GPIO98_RX_DQ1          MFP_CFG(GPIO98, AF5)
+#define GPIO99_RX_DQ0          MFP_CFG(GPIO99, AF5)
+#define GPIO100_MII_MDC                MFP_CFG(GPIO100, AF5)
+#define GPIO101_MII_MDIO       MFP_CFG(GPIO101, AF5)
+#define GPIO103_RX_DV          MFP_CFG(GPIO103, AF5)
+
 #endif /* __ASM_MACH_MFP_PXA168_H */
index a52b3d2f325ce7a3e6654b3fde2d87ad1af4dce4..7f005843a7075d1ae1ec334fa694dd309acf3c92 100644 (file)
@@ -14,9 +14,11 @@ extern void pxa168_clear_keypad_wakeup(void);
 #include <video/pxa168fb.h>
 #include <plat/pxa27x_keypad.h>
 #include <mach/cputype.h>
+#include <linux/pxa168_eth.h>
 
 extern struct pxa_device_desc pxa168_device_uart1;
 extern struct pxa_device_desc pxa168_device_uart2;
+extern struct pxa_device_desc pxa168_device_uart3;
 extern struct pxa_device_desc pxa168_device_twsi0;
 extern struct pxa_device_desc pxa168_device_twsi1;
 extern struct pxa_device_desc pxa168_device_pwm1;
@@ -31,6 +33,7 @@ extern struct pxa_device_desc pxa168_device_ssp5;
 extern struct pxa_device_desc pxa168_device_nand;
 extern struct pxa_device_desc pxa168_device_fb;
 extern struct pxa_device_desc pxa168_device_keypad;
+extern struct pxa_device_desc pxa168_device_eth;
 
 static inline int pxa168_add_uart(int id)
 {
@@ -39,6 +42,7 @@ static inline int pxa168_add_uart(int id)
        switch (id) {
        case 1: d = &pxa168_device_uart1; break;
        case 2: d = &pxa168_device_uart2; break;
+       case 3: d = &pxa168_device_uart3; break;
        }
 
        if (d == NULL)
@@ -117,4 +121,8 @@ static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
        return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
 }
 
+static inline int pxa168_add_eth(struct pxa168_eth_platform_data *data)
+{
+       return pxa_register_device(&pxa168_device_eth, data, sizeof(*data));
+}
 #endif /* __ASM_MACH_PXA168_H */
index f7011ef70bf5e2565bd0fc508ffd66fa681cff7b..8447ac63e28f343ce6a883ebb407d08b22cc6371 100644 (file)
@@ -29,6 +29,7 @@
 #define APMU_BUS       APMU_REG(0x06c)
 #define APMU_SDH2      APMU_REG(0x0e8)
 #define APMU_SDH3      APMU_REG(0x0ec)
+#define APMU_ETH       APMU_REG(0x0fc)
 
 #define APMU_FNCLK_EN  (1 << 4)
 #define APMU_AXICLK_EN (1 << 3)
index 72b4e76315830e91b9dad19dfdedcdf829021559..96d451dc305c5daf7ba8e6288507a9bee39885b7 100644 (file)
@@ -66,6 +66,7 @@ void __init pxa168_init_irq(void)
 /* APB peripheral clocks */
 static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);
 static APBC_CLK(uart2, PXA168_UART2, 1, 14745600);
+static APBC_CLK(uart3, PXA168_UART3, 1, 14745600);
 static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);
 static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
 static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);
@@ -81,11 +82,13 @@ static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
 
 static APMU_CLK(nand, NAND, 0x01db, 208000000);
 static APMU_CLK(lcd, LCD, 0x7f, 312000000);
+static APMU_CLK(eth, ETH, 0x09, 0);
 
 /* device and clock bindings */
 static struct clk_lookup pxa168_clkregs[] = {
        INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
        INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
+       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
        INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
        INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
        INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
@@ -100,6 +103,7 @@ static struct clk_lookup pxa168_clkregs[] = {
        INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
        INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
        INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
+       INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
 };
 
 static int __init pxa168_init(void)
@@ -149,6 +153,7 @@ void pxa168_clear_keypad_wakeup(void)
 /* on-chip devices */
 PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
 PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24);
+PXA168_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4026000, 0x30, 23, 24);
 PXA168_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
 PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
 PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10);
@@ -163,3 +168,4 @@ PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
 PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
 PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
 PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
+PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff);
index e411039ea59e3f2911513ca4353c8b9ce87312ac..6bd37a27e5fca67ccfd876582fed715441f409a4 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/onenand.h>
 #include <linux/interrupt.h>
+#include <linux/i2c/pca953x.h>
+#include <linux/gpio.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
 #include "common.h"
 
-#define TTCDKB_NR_IRQS         (IRQ_BOARD_START + 24)
+#define TTCDKB_GPIO_EXT0(x)    (NR_BUILTIN_GPIO + ((x < 0) ? 0 :       \
+                               ((x < 16) ? x : 15)))
+#define TTCDKB_GPIO_EXT1(x)    (NR_BUILTIN_GPIO + 16 + ((x < 0) ? 0 :  \
+                               ((x < 16) ? x : 15)))
+
+/*
+ * 16 board interrupts -- MAX7312 GPIO expander
+ * 16 board interrupts -- PCA9575 GPIO expander
+ * 24 board interrupts -- 88PM860x PMIC
+ */
+#define TTCDKB_NR_IRQS         (IRQ_BOARD_START + 16 + 16 + 24)
 
 static unsigned long ttc_dkb_pin_config[] __initdata = {
        /* UART2 */
@@ -113,6 +125,22 @@ static struct platform_device *ttc_dkb_devices[] = {
        &ttc_dkb_device_onenand,
 };
 
+static struct pca953x_platform_data max7312_data[] = {
+       {
+               .gpio_base      = TTCDKB_GPIO_EXT0(0),
+               .irq_base       = IRQ_BOARD_START,
+       },
+};
+
+static struct i2c_board_info ttc_dkb_i2c_info[] = {
+       {
+               .type           = "max7312",
+               .addr           = 0x23,
+               .irq            = IRQ_GPIO(80),
+               .platform_data  = &max7312_data,
+       },
+};
+
 static void __init ttc_dkb_init(void)
 {
        mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
@@ -121,6 +149,7 @@ static void __init ttc_dkb_init(void)
        pxa910_add_uart(1);
 
        /* off-chip devices */
+       pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
        platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
 }
 
index 799fbc40e53c22437420d9767cb6a18f10f7bb57..b4e7c58bbb3844d76edb890a5a352b033160f760 100644 (file)
@@ -109,6 +109,7 @@ config MACH_EUKREA_MBIMX51_BASEBOARD
        bool
        select IMX_HAVE_PLATFORM_IMX_KEYPAD
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
+       select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
          MBIMX51 evaluation board.
@@ -135,6 +136,7 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD
        prompt "Eukrea MBIMXSD development board"
        bool
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
+       select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
          MBIMXSD evaluation board.
@@ -151,6 +153,7 @@ config MX51_EFIKA_COMMON
 
 config MACH_MX51_EFIKAMX
        bool "Support MX51 Genesi Efika MX nettop"
+       select LEDS_GPIO_REGISTER
        select MX51_EFIKA_COMMON
        help
          Include support for Genesi Efika MX nettop. This includes specific
@@ -158,6 +161,7 @@ config MACH_MX51_EFIKAMX
 
 config MACH_MX51_EFIKASB
        bool "Support MX51 Genesi Efika Smartbook"
+       select LEDS_GPIO_REGISTER
        select MX51_EFIKA_COMMON
        help
          Include support for Genesi Efika Smartbook. This includes specific
@@ -176,6 +180,7 @@ config MACH_MX53_EVK
        select IMX_HAVE_PLATFORM_IMX_I2C
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
        select IMX_HAVE_PLATFORM_SPI_IMX
+       select LEDS_GPIO_REGISTER
        help
          Include support for MX53 EVK platform. This includes specific
          configurations for the board and its peripherals.
@@ -199,10 +204,23 @@ config MACH_MX53_LOCO
        select IMX_HAVE_PLATFORM_IMX_UART
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
        select IMX_HAVE_PLATFORM_GPIO_KEYS
+       select LEDS_GPIO_REGISTER
        help
          Include support for MX53 LOCO platform. This includes specific
          configurations for the board and its peripherals.
 
+config MACH_MX53_ARD
+       bool "Support MX53 ARD platforms"
+       select SOC_IMX53
+       select IMX_HAVE_PLATFORM_IMX2_WDT
+       select IMX_HAVE_PLATFORM_IMX_I2C
+       select IMX_HAVE_PLATFORM_IMX_UART
+       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
+       select IMX_HAVE_PLATFORM_GPIO_KEYS
+       help
+         Include support for MX53 ARD platform. This includes specific
+         configurations for the board and its peripherals.
+
 endif # ARCH_MX53_SUPPORTED
 
 endif
index 0b9338cec516bf9061ba65da27851a965509d6ad..383e7cd3fbcb5b711783706ceeea2e605e0777b2 100644 (file)
@@ -6,12 +6,14 @@
 obj-y   := cpu.o mm.o clock-mx51-mx53.o devices.o ehci.o system.o
 obj-$(CONFIG_SOC_IMX50) += mm-mx50.o
 
+obj-$(CONFIG_PM) += pm-imx5.o
 obj-$(CONFIG_CPU_FREQ_IMX)    += cpu_op-mx51.o
 obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o
 obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o
 obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o
 obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o
 obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.o
+obj-$(CONFIG_MACH_MX53_ARD) += board-mx53_ard.o
 obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += board-cpuimx51.o
 obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o
 obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o
index 4efa02ee163991aa4c788bc042f8d1d8dff2111b..7c893fa70266928418aebff1f3140221d4355b30 100644 (file)
 #define CPUIMX51_QUARTB_GPIO   IMX_GPIO_NR(3, 25)
 #define CPUIMX51_QUARTC_GPIO   IMX_GPIO_NR(3, 26)
 #define CPUIMX51_QUARTD_GPIO   IMX_GPIO_NR(3, 27)
-#define CPUIMX51_QUARTA_IRQ    (MXC_INTERNAL_IRQS + CPUIMX51_QUARTA_GPIO)
-#define CPUIMX51_QUARTB_IRQ    (MXC_INTERNAL_IRQS + CPUIMX51_QUARTB_GPIO)
-#define CPUIMX51_QUARTC_IRQ    (MXC_INTERNAL_IRQS + CPUIMX51_QUARTC_GPIO)
-#define CPUIMX51_QUARTD_IRQ    (MXC_INTERNAL_IRQS + CPUIMX51_QUARTD_GPIO)
 #define CPUIMX51_QUART_XTAL    14745600
 #define CPUIMX51_QUART_REGSHIFT        17
 
@@ -61,7 +57,7 @@
 static struct plat_serial8250_port serial_platform_data[] = {
        {
                .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x400000),
-               .irq = CPUIMX51_QUARTA_IRQ,
+               .irq = gpio_to_irq(CPUIMX51_QUARTA_GPIO),
                .irqflags = IRQF_TRIGGER_HIGH,
                .uartclk = CPUIMX51_QUART_XTAL,
                .regshift = CPUIMX51_QUART_REGSHIFT,
@@ -69,7 +65,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
                .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
        }, {
                .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x800000),
-               .irq = CPUIMX51_QUARTB_IRQ,
+               .irq = gpio_to_irq(CPUIMX51_QUARTB_GPIO),
                .irqflags = IRQF_TRIGGER_HIGH,
                .uartclk = CPUIMX51_QUART_XTAL,
                .regshift = CPUIMX51_QUART_REGSHIFT,
@@ -77,7 +73,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
                .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
        }, {
                .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x1000000),
-               .irq = CPUIMX51_QUARTC_IRQ,
+               .irq = gpio_to_irq(CPUIMX51_QUARTC_GPIO),
                .irqflags = IRQF_TRIGGER_HIGH,
                .uartclk = CPUIMX51_QUART_XTAL,
                .regshift = CPUIMX51_QUART_REGSHIFT,
@@ -85,7 +81,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
                .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
        }, {
                .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x2000000),
-               .irq = CPUIMX51_QUARTD_IRQ,
+               .irq = irq_to_gpio(CPUIMX51_QUARTD_GPIO),
                .irqflags = IRQF_TRIGGER_HIGH,
                .uartclk = CPUIMX51_QUART_XTAL,
                .regshift = CPUIMX51_QUART_REGSHIFT,
@@ -245,6 +241,8 @@ __setup("otg_mode=", eukrea_cpuimx51_otg_mode);
  */
 static void __init eukrea_cpuimx51_init(void)
 {
+       imx51_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads,
                                        ARRAY_SIZE(eukrea_cpuimx51_pads));
 
index 5ef25a596143bf52a9c1bc3034e95c903d31325e..ff096d587299063248e3408c3ffa811b1756f50d 100644 (file)
@@ -264,6 +264,8 @@ static struct platform_device *platform_devices[] __initdata = {
 
 static void __init eukrea_cpuimx51sd_init(void)
 {
+       imx51_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads,
                                        ARRAY_SIZE(eukrea_cpuimx51sd_pads));
 
index 11210e1ae42a3a61155d67163a5ce74cfeda4473..7de25c6712eb50f2df13a5cd8562e3aec61da431 100644 (file)
@@ -192,6 +192,8 @@ static const struct imxi2c_platform_data i2c_data __initconst = {
  */
 static void __init mx50_rdp_board_init(void)
 {
+       imx50_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads,
                                        ARRAY_SIZE(mx50_rdp_pads));
 
index 63dfbeafbc1e4e51a20b0326bb34cd6e8000c6c7..07a38154da215b76cdc5409d64ccef405ead46f0 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/irq.h>
 #include <linux/platform_device.h>
 #include <linux/spi/spi.h>
+#include <linux/gpio.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -26,7 +27,7 @@
 #include "devices-imx51.h"
 #include "devices.h"
 
-#define EXPIO_PARENT_INT       (MXC_INTERNAL_IRQS + GPIO_PORTA + 6)
+#define EXPIO_PARENT_INT       gpio_to_irq(IMX_GPIO_NR(1, 6))
 #define MX51_3DS_ECSPI2_CS     (GPIO_PORTC + 28)
 
 static iomux_v3_cfg_t mx51_3ds_pads[] = {
@@ -135,6 +136,8 @@ static struct spi_board_info mx51_3ds_spi_nor_device[] = {
  */
 static void __init mx51_3ds_init(void)
 {
+       imx51_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads,
                                        ARRAY_SIZE(mx51_3ds_pads));
 
index c7b3fabf50f99a550bb5242f0b3fad37c65ee650..15c600026aeeb683b6d30836fec658db1a12f39d 100644 (file)
 
 #define BABBAGE_USB_HUB_RESET  IMX_GPIO_NR(1, 7)
 #define BABBAGE_USBH1_STP      IMX_GPIO_NR(1, 27)
-#define BABBAGE_PHY_RESET      IMX_GPIO_NR(2, 5)
+#define BABBAGE_USB_PHY_RESET  IMX_GPIO_NR(2, 5)
 #define BABBAGE_FEC_PHY_RESET  IMX_GPIO_NR(2, 14)
 #define BABBAGE_POWER_KEY      IMX_GPIO_NR(2, 21)
 #define BABBAGE_ECSPI1_CS0     IMX_GPIO_NR(4, 24)
 #define BABBAGE_ECSPI1_CS1     IMX_GPIO_NR(4, 25)
+#define BABBAGE_SD1_CD         IMX_GPIO_NR(1, 0)
+#define BABBAGE_SD1_WP         IMX_GPIO_NR(1, 1)
+#define BABBAGE_SD2_CD         IMX_GPIO_NR(1, 6)
+#define BABBAGE_SD2_WP         IMX_GPIO_NR(1, 5)
 
 /* USB_CTRL_1 */
 #define MX51_USB_CTRL_1_OFFSET                 0x10
@@ -110,6 +114,9 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
        /* USB HUB reset line*/
        MX51_PAD_GPIO1_7__GPIO1_7,
 
+       /* USB PHY reset line */
+       MX51_PAD_EIM_D21__GPIO2_5,
+
        /* FEC */
        MX51_PAD_EIM_EB2__FEC_MDIO,
        MX51_PAD_EIM_EB3__FEC_RDATA1,
@@ -139,6 +146,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
        MX51_PAD_SD1_DATA1__SD1_DATA1,
        MX51_PAD_SD1_DATA2__SD1_DATA2,
        MX51_PAD_SD1_DATA3__SD1_DATA3,
+       MX51_PAD_GPIO1_0__GPIO1_0,
+       MX51_PAD_GPIO1_1__GPIO1_1,
 
        /* SD 2 */
        MX51_PAD_SD2_CMD__SD2_CMD,
@@ -147,6 +156,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
        MX51_PAD_SD2_DATA1__SD2_DATA1,
        MX51_PAD_SD2_DATA2__SD2_DATA2,
        MX51_PAD_SD2_DATA3__SD2_DATA3,
+       MX51_PAD_GPIO1_6__GPIO1_6,
+       MX51_PAD_GPIO1_5__GPIO1_5,
 
        /* eCSPI1 */
        MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
@@ -169,34 +180,31 @@ static struct imxi2c_platform_data babbage_hsi2c_data = {
        .bitrate = 400000,
 };
 
+static struct gpio mx51_babbage_usbh1_gpios[] = {
+       { BABBAGE_USBH1_STP, GPIOF_OUT_INIT_LOW, "usbh1_stp" },
+       { BABBAGE_USB_PHY_RESET, GPIOF_OUT_INIT_LOW, "usbh1_phy_reset" },
+};
+
 static int gpio_usbh1_active(void)
 {
        iomux_v3_cfg_t usbh1stp_gpio = MX51_PAD_USBH1_STP__GPIO1_27;
-       iomux_v3_cfg_t phyreset_gpio = MX51_PAD_EIM_D21__GPIO2_5;
        int ret;
 
        /* Set USBH1_STP to GPIO and toggle it */
        mxc_iomux_v3_setup_pad(usbh1stp_gpio);
-       ret = gpio_request(BABBAGE_USBH1_STP, "usbh1_stp");
+       ret = gpio_request_array(mx51_babbage_usbh1_gpios,
+                                       ARRAY_SIZE(mx51_babbage_usbh1_gpios));
 
        if (ret) {
-               pr_debug("failed to get MX51_PAD_USBH1_STP__GPIO_1_27: %d\n", ret);
+               pr_debug("failed to get USBH1 pins: %d\n", ret);
                return ret;
        }
-       gpio_direction_output(BABBAGE_USBH1_STP, 0);
-       gpio_set_value(BABBAGE_USBH1_STP, 1);
-       msleep(100);
-       gpio_free(BABBAGE_USBH1_STP);
-
-       /* De-assert USB PHY RESETB */
-       mxc_iomux_v3_setup_pad(phyreset_gpio);
-       ret = gpio_request(BABBAGE_PHY_RESET, "phy_reset");
 
-       if (ret) {
-               pr_debug("failed to get MX51_PAD_EIM_D21__GPIO_2_5: %d\n", ret);
-               return ret;
-       }
-       gpio_direction_output(BABBAGE_PHY_RESET, 1);
+       msleep(100);
+       gpio_set_value(BABBAGE_USBH1_STP, 1);
+       gpio_set_value(BABBAGE_USB_PHY_RESET, 1);
+       gpio_free_array(mx51_babbage_usbh1_gpios,
+                                       ARRAY_SIZE(mx51_babbage_usbh1_gpios));
        return 0;
 }
 
@@ -331,6 +339,16 @@ static const struct spi_imx_master mx51_babbage_spi_pdata __initconst = {
        .num_chipselect = ARRAY_SIZE(mx51_babbage_spi_cs),
 };
 
+static const struct esdhc_platform_data mx51_babbage_sd1_data __initconst = {
+       .cd_gpio = BABBAGE_SD1_CD,
+       .wp_gpio = BABBAGE_SD1_WP,
+};
+
+static const struct esdhc_platform_data mx51_babbage_sd2_data __initconst = {
+       .cd_gpio = BABBAGE_SD2_CD,
+       .wp_gpio = BABBAGE_SD2_WP,
+};
+
 /*
  * Board specific initialization.
  */
@@ -340,6 +358,8 @@ static void __init mx51_babbage_init(void)
        iomux_v3_cfg_t power_key = _MX51_PAD_EIM_A27__GPIO2_21 |
                MUX_PAD_CTRL(PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP);
 
+       imx51_soc_init();
+
 #if defined(CONFIG_CPU_FREQ_IMX)
        get_cpu_op = mx51_get_cpu_op;
 #endif
@@ -374,8 +394,8 @@ static void __init mx51_babbage_init(void)
        mxc_iomux_v3_setup_pad(usbh1stp);
        babbage_usbhub_reset();
 
-       imx51_add_sdhci_esdhc_imx(0, NULL);
-       imx51_add_sdhci_esdhc_imx(1, NULL);
+       imx51_add_sdhci_esdhc_imx(0, &mx51_babbage_sd1_data);
+       imx51_add_sdhci_esdhc_imx(1, &mx51_babbage_sd2_data);
 
        spi_register_board_info(mx51_babbage_spi_board_info,
                ARRAY_SIZE(mx51_babbage_spi_board_info));
index 6e362315291b4f03a9dd71d6085b67edfd2078a6..f70700dc0ec1d7bf3b4120c5645c96dbbb05db26 100644 (file)
@@ -139,7 +139,7 @@ static void __init mx51_efikamx_board_id(void)
        }
 }
 
-static struct gpio_led mx51_efikamx_leds[] = {
+static struct gpio_led mx51_efikamx_leds[] __initdata = {
        {
                .name = "efikamx:green",
                .default_trigger = "default-on",
@@ -157,19 +157,12 @@ static struct gpio_led mx51_efikamx_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data mx51_efikamx_leds_data = {
+static const struct gpio_led_platform_data
+               mx51_efikamx_leds_data __initconst = {
        .leds = mx51_efikamx_leds,
        .num_leds = ARRAY_SIZE(mx51_efikamx_leds),
 };
 
-static struct platform_device mx51_efikamx_leds_device = {
-       .name = "leds-gpio",
-       .id = -1,
-       .dev = {
-               .platform_data = &mx51_efikamx_leds_data,
-       },
-};
-
 static struct gpio_keys_button mx51_efikamx_powerkey[] = {
        {
                .code = KEY_POWER,
@@ -236,6 +229,8 @@ late_initcall(mx51_efikamx_power_init);
 
 static void __init mx51_efikamx_init(void)
 {
+       imx51_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
                                        ARRAY_SIZE(mx51efikamx_pads));
        efika_board_common_init();
@@ -248,7 +243,7 @@ static void __init mx51_efikamx_init(void)
                mx51_efikamx_leds[2].default_trigger = "mmc1";
        }
 
-       platform_device_register(&mx51_efikamx_leds_device);
+       gpio_led_register_device(-1, &mx51_efikamx_leds_data);
        imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
 
        if (system_rev == 0x11) {
index 474fc6e4c6df5593ecd0df7a80b3f3c8c5569a1c..2e4d9d32a87c688061181939c318790ea3f52d37 100644 (file)
@@ -132,7 +132,7 @@ static void __init mx51_efikasb_usb(void)
                mxc_register_device(&mxc_usbh2_device, &usbh2_config);
 }
 
-static struct gpio_led mx51_efikasb_leds[] = {
+static const struct gpio_led mx51_efikasb_leds[] __initconst = {
        {
                .name = "efikasb:green",
                .default_trigger = "default-on",
@@ -146,19 +146,12 @@ static struct gpio_led mx51_efikasb_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data mx51_efikasb_leds_data = {
+static const struct gpio_led_platform_data
+               mx51_efikasb_leds_data __initconst = {
        .leds = mx51_efikasb_leds,
        .num_leds = ARRAY_SIZE(mx51_efikasb_leds),
 };
 
-static struct platform_device mx51_efikasb_leds_device = {
-       .name = "leds-gpio",
-       .id = -1,
-       .dev = {
-               .platform_data = &mx51_efikasb_leds_data,
-       },
-};
-
 static struct gpio_keys_button mx51_efikasb_keys[] = {
        {
                .code = KEY_POWER,
@@ -248,6 +241,8 @@ static void __init mx51_efikasb_board_id(void)
 
 static void __init efikasb_board_init(void)
 {
+       imx51_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
                                        ARRAY_SIZE(mx51efikasb_pads));
        efika_board_common_init();
@@ -256,9 +251,8 @@ static void __init efikasb_board_init(void)
        mx51_efikasb_usb();
        imx51_add_sdhci_esdhc_imx(1, NULL);
 
-       platform_device_register(&mx51_efikasb_leds_device);
+       gpio_led_register_device(-1, &mx51_efikasb_leds_data);
        imx_add_gpio_keys(&mx51_efikasb_keys_data);
-
 }
 
 static void __init mx51_efikasb_timer_init(void)
diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-mx5/board-mx53_ard.c
new file mode 100644 (file)
index 0000000..76a67c4
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * 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.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/init.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
+#include <linux/smsc911x.h>
+
+#include <mach/common.h>
+#include <mach/hardware.h>
+#include <mach/iomux-mx53.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+
+#include "crm_regs.h"
+#include "devices-imx53.h"
+
+#define ARD_ETHERNET_INT_B     IMX_GPIO_NR(2, 31)
+#define ARD_SD1_CD             IMX_GPIO_NR(1, 1)
+#define ARD_SD1_WP             IMX_GPIO_NR(1, 9)
+#define ARD_I2CPORTEXP_B       IMX_GPIO_NR(2, 3)
+#define ARD_VOLUMEDOWN         IMX_GPIO_NR(4, 0)
+#define ARD_HOME                       IMX_GPIO_NR(5, 10)
+#define ARD_BACK                       IMX_GPIO_NR(5, 11)
+#define ARD_PROG                       IMX_GPIO_NR(5, 12)
+#define ARD_VOLUMEUP           IMX_GPIO_NR(5, 13)
+
+static iomux_v3_cfg_t mx53_ard_pads[] = {
+       /* UART1 */
+       MX53_PAD_PATA_DIOW__UART1_TXD_MUX,
+       MX53_PAD_PATA_DMACK__UART1_RXD_MUX,
+       /* WEIM for CS1 */
+       MX53_PAD_EIM_EB3__GPIO2_31, /* ETHERNET_INT_B */
+       MX53_PAD_EIM_D16__EMI_WEIM_D_16,
+       MX53_PAD_EIM_D17__EMI_WEIM_D_17,
+       MX53_PAD_EIM_D18__EMI_WEIM_D_18,
+       MX53_PAD_EIM_D19__EMI_WEIM_D_19,
+       MX53_PAD_EIM_D20__EMI_WEIM_D_20,
+       MX53_PAD_EIM_D21__EMI_WEIM_D_21,
+       MX53_PAD_EIM_D22__EMI_WEIM_D_22,
+       MX53_PAD_EIM_D23__EMI_WEIM_D_23,
+       MX53_PAD_EIM_D24__EMI_WEIM_D_24,
+       MX53_PAD_EIM_D25__EMI_WEIM_D_25,
+       MX53_PAD_EIM_D26__EMI_WEIM_D_26,
+       MX53_PAD_EIM_D27__EMI_WEIM_D_27,
+       MX53_PAD_EIM_D28__EMI_WEIM_D_28,
+       MX53_PAD_EIM_D29__EMI_WEIM_D_29,
+       MX53_PAD_EIM_D30__EMI_WEIM_D_30,
+       MX53_PAD_EIM_D31__EMI_WEIM_D_31,
+       MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
+       MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
+       MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
+       MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
+       MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
+       MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
+       MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
+       MX53_PAD_EIM_OE__EMI_WEIM_OE,
+       MX53_PAD_EIM_RW__EMI_WEIM_RW,
+       MX53_PAD_EIM_CS1__EMI_WEIM_CS_1,
+       /* SDHC1 */
+       MX53_PAD_SD1_CMD__ESDHC1_CMD,
+       MX53_PAD_SD1_CLK__ESDHC1_CLK,
+       MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
+       MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
+       MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
+       MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
+       MX53_PAD_PATA_DATA8__ESDHC1_DAT4,
+       MX53_PAD_PATA_DATA9__ESDHC1_DAT5,
+       MX53_PAD_PATA_DATA10__ESDHC1_DAT6,
+       MX53_PAD_PATA_DATA11__ESDHC1_DAT7,
+       MX53_PAD_GPIO_1__GPIO1_1,
+       MX53_PAD_GPIO_9__GPIO1_9,
+       /* I2C2 */
+       MX53_PAD_EIM_EB2__I2C2_SCL,
+       MX53_PAD_KEY_ROW3__I2C2_SDA,
+       /* I2C3 */
+       MX53_PAD_GPIO_3__I2C3_SCL,
+       MX53_PAD_GPIO_16__I2C3_SDA,
+       /* GPIO */
+       MX53_PAD_DISP0_DAT16__GPIO5_10, /* home */
+       MX53_PAD_DISP0_DAT17__GPIO5_11, /* back */
+       MX53_PAD_DISP0_DAT18__GPIO5_12, /* prog */
+       MX53_PAD_DISP0_DAT19__GPIO5_13, /* vol up */
+       MX53_PAD_GPIO_10__GPIO4_0,              /* vol down */
+};
+
+#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake)   \
+{                                                      \
+       .gpio           = gpio_num,                             \
+       .type           = EV_KEY,                               \
+       .code           = ev_code,                              \
+       .active_low     = act_low,                              \
+       .desc           = "btn " descr,                 \
+       .wakeup         = wake,                                 \
+}
+
+static struct gpio_keys_button ard_buttons[] = {
+       GPIO_BUTTON(ARD_HOME, KEY_HOME, 1, "home", 0),
+       GPIO_BUTTON(ARD_BACK, KEY_BACK, 1, "back", 0),
+       GPIO_BUTTON(ARD_PROG, KEY_PROGRAM, 1, "program", 0),
+       GPIO_BUTTON(ARD_VOLUMEUP, KEY_VOLUMEUP, 1, "volume-up", 0),
+       GPIO_BUTTON(ARD_VOLUMEDOWN, KEY_VOLUMEDOWN, 1, "volume-down", 0),
+};
+
+static const struct gpio_keys_platform_data ard_button_data __initconst = {
+       .buttons        = ard_buttons,
+       .nbuttons       = ARRAY_SIZE(ard_buttons),
+};
+
+static struct resource ard_smsc911x_resources[] = {
+       {
+               .start = MX53_CS1_64MB_BASE_ADDR,
+               .end = MX53_CS1_64MB_BASE_ADDR + SZ_32M - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start =  gpio_to_irq(ARD_ETHERNET_INT_B),
+               .end =  gpio_to_irq(ARD_ETHERNET_INT_B),
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct smsc911x_platform_config ard_smsc911x_config = {
+       .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
+       .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
+       .flags = SMSC911X_USE_32BIT,
+};
+
+static struct platform_device ard_smsc_lan9220_device = {
+       .name = "smsc911x",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(ard_smsc911x_resources),
+       .resource = ard_smsc911x_resources,
+       .dev = {
+               .platform_data = &ard_smsc911x_config,
+       },
+};
+
+static const struct esdhc_platform_data mx53_ard_sd1_data __initconst = {
+       .cd_gpio = ARD_SD1_CD,
+       .wp_gpio = ARD_SD1_WP,
+};
+
+static struct imxi2c_platform_data mx53_ard_i2c2_data = {
+       .bitrate = 50000,
+};
+
+static struct imxi2c_platform_data mx53_ard_i2c3_data = {
+       .bitrate = 400000,
+};
+
+static void __init mx53_ard_io_init(void)
+{
+       mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads,
+                               ARRAY_SIZE(mx53_ard_pads));
+
+       gpio_request(ARD_ETHERNET_INT_B, "eth-int-b");
+       gpio_direction_input(ARD_ETHERNET_INT_B);
+
+       gpio_request(ARD_I2CPORTEXP_B, "i2cptexp-rst");
+       gpio_direction_output(ARD_I2CPORTEXP_B, 1);
+}
+
+/* Config CS1 settings for ethernet controller */
+static int weim_cs_config(void)
+{
+       u32 reg;
+       void __iomem *weim_base, *iomuxc_base;
+
+       weim_base = ioremap(MX53_WEIM_BASE_ADDR, SZ_4K);
+       if (!weim_base)
+               return -ENOMEM;
+
+       iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K);
+       if (!iomuxc_base)
+               return -ENOMEM;
+
+       /* CS1 timings for LAN9220 */
+       writel(0x20001, (weim_base + 0x18));
+       writel(0x0, (weim_base + 0x1C));
+       writel(0x16000202, (weim_base + 0x20));
+       writel(0x00000002, (weim_base + 0x24));
+       writel(0x16002082, (weim_base + 0x28));
+       writel(0x00000000, (weim_base + 0x2C));
+       writel(0x00000000, (weim_base + 0x90));
+
+       /* specify 64 MB on CS1 and CS0 on GPR1 */
+       reg = readl(iomuxc_base + 0x4);
+       reg &= ~0x3F;
+       reg |= 0x1B;
+       writel(reg, (iomuxc_base + 0x4));
+
+       iounmap(iomuxc_base);
+       iounmap(weim_base);
+
+       return 0;
+}
+
+static struct platform_device *devices[] __initdata = {
+       &ard_smsc_lan9220_device,
+};
+
+static void __init mx53_ard_board_init(void)
+{
+       imx53_soc_init();
+       imx53_add_imx_uart(0, NULL);
+
+       mx53_ard_io_init();
+       weim_cs_config();
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+
+       imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data);
+       imx53_add_imx2_wdt(0, NULL);
+       imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);
+       imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);
+       imx_add_gpio_keys(&ard_button_data);
+}
+
+static void __init mx53_ard_timer_init(void)
+{
+       mx53_clocks_init(32768, 24000000, 22579200, 0);
+}
+
+static struct sys_timer mx53_ard_timer = {
+       .init   = mx53_ard_timer_init,
+};
+
+MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
+       .map_io = mx53_map_io,
+       .init_early = imx53_init_early,
+       .init_irq = mx53_init_irq,
+       .timer = &mx53_ard_timer,
+       .init_machine = mx53_ard_board_init,
+MACHINE_END
index f87d571882c64df8419e7cd3ce6bff9099bab428..1b417b06b7360b526d87915654e569ae91111efd 100644 (file)
@@ -35,6 +35,7 @@
 #define MX53_EVK_FEC_PHY_RST   IMX_GPIO_NR(7, 6)
 #define EVK_ECSPI1_CS0         IMX_GPIO_NR(2, 30)
 #define EVK_ECSPI1_CS1         IMX_GPIO_NR(3, 19)
+#define MX53EVK_LED            IMX_GPIO_NR(7, 7)
 
 #include "crm_regs.h"
 #include "devices-imx53.h"
@@ -58,12 +59,27 @@ static iomux_v3_cfg_t mx53_evk_pads[] = {
        /* ecspi chip select lines */
        MX53_PAD_EIM_EB2__GPIO2_30,
        MX53_PAD_EIM_D19__GPIO3_19,
+       /* LED */
+       MX53_PAD_PATA_DA_1__GPIO7_7,
 };
 
 static const struct imxuart_platform_data mx53_evk_uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
 
+static const struct gpio_led mx53evk_leds[] __initconst = {
+       {
+               .name                   = "green",
+               .default_trigger        = "heartbeat",
+               .gpio                   = MX53EVK_LED,
+       },
+};
+
+static const struct gpio_led_platform_data mx53evk_leds_data __initconst = {
+       .leds           = mx53evk_leds,
+       .num_leds       = ARRAY_SIZE(mx53evk_leds),
+};
+
 static inline void mx53_evk_init_uart(void)
 {
        imx53_add_imx_uart(0, NULL);
@@ -117,6 +133,8 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = {
 
 static void __init mx53_evk_board_init(void)
 {
+       imx53_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
                                        ARRAY_SIZE(mx53_evk_pads));
        mx53_evk_init_uart();
@@ -133,6 +151,7 @@ static void __init mx53_evk_board_init(void)
                ARRAY_SIZE(mx53_evk_spi_board_info));
        imx53_add_ecspi(0, &mx53_evk_spi_data);
        imx53_add_imx2_wdt(0, NULL);
+       gpio_led_register_device(-1, &mx53evk_leds_data);
 }
 
 static void __init mx53_evk_timer_init(void)
index 1b947e8c9c0c69f45c6bfef5abf048b1f33d5cdf..54be525e2bd75bb6eed97eefbd5e9bd9f181784f 100644 (file)
 #define MX53_LOCO_UI1                  IMX_GPIO_NR(2, 14)
 #define MX53_LOCO_UI2                  IMX_GPIO_NR(2, 15)
 #define LOCO_FEC_PHY_RST               IMX_GPIO_NR(7, 6)
+#define LOCO_LED                       IMX_GPIO_NR(7, 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)
 
 static iomux_v3_cfg_t mx53_loco_pads[] = {
        /* FEC */
@@ -70,6 +74,8 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
        MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
        MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
        MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
+       /* SD1_CD */
+       MX53_PAD_EIM_DA13__GPIO3_13,
        /* SD3 */
        MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
        MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
@@ -163,7 +169,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
        MX53_PAD_GPIO_7__SPDIF_PLOCK,
        MX53_PAD_GPIO_17__SPDIF_OUT1,
        /* GPIO */
-       MX53_PAD_PATA_DA_1__GPIO7_7,
+       MX53_PAD_PATA_DA_1__GPIO7_7,            /* LED */
        MX53_PAD_PATA_DA_2__GPIO7_8,
        MX53_PAD_PATA_DATA5__GPIO2_5,
        MX53_PAD_PATA_DATA6__GPIO2_6,
@@ -202,6 +208,15 @@ static const struct gpio_keys_platform_data loco_button_data __initconst = {
        .nbuttons       = ARRAY_SIZE(loco_buttons),
 };
 
+static const struct esdhc_platform_data mx53_loco_sd1_data __initconst = {
+       .cd_gpio = LOCO_SD1_CD,
+};
+
+static const struct esdhc_platform_data mx53_loco_sd3_data __initconst = {
+       .cd_gpio = LOCO_SD3_CD,
+       .wp_gpio = LOCO_SD3_WP,
+};
+
 static inline void mx53_loco_fec_reset(void)
 {
        int ret;
@@ -225,8 +240,23 @@ static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
        .bitrate = 100000,
 };
 
+static const struct gpio_led mx53loco_leds[] __initconst = {
+       {
+               .name                   = "green",
+               .default_trigger        = "heartbeat",
+               .gpio                   = LOCO_LED,
+       },
+};
+
+static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {
+       .leds           = mx53loco_leds,
+       .num_leds       = ARRAY_SIZE(mx53loco_leds),
+};
+
 static void __init mx53_loco_board_init(void)
 {
+       imx53_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
                                        ARRAY_SIZE(mx53_loco_pads));
        imx53_add_imx_uart(0, NULL);
@@ -235,9 +265,10 @@ static void __init mx53_loco_board_init(void)
        imx53_add_imx2_wdt(0, NULL);
        imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
        imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
-       imx53_add_sdhci_esdhc_imx(0, NULL);
-       imx53_add_sdhci_esdhc_imx(2, NULL);
+       imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
+       imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
        imx_add_gpio_keys(&loco_button_data);
+       gpio_led_register_device(-1, &mx53loco_leds_data);
 }
 
 static void __init mx53_loco_timer_init(void)
index 817c08938f552e0194a8c409c48132252766ba51..bc02894eafefab9126347857ff709293e1bffeb5 100644 (file)
@@ -113,6 +113,8 @@ static const struct imxi2c_platform_data mx53_smd_i2c_data __initconst = {
 
 static void __init mx53_smd_board_init(void)
 {
+       imx53_soc_init();
+
        mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads,
                                        ARRAY_SIZE(mx53_smd_pads));
        mx53_smd_init_uart();
index 6b89c1bf4eb2f7a774b18c7b68871b173b5f4da1..ff16d86ff59744aaa39a7010b9a174058c1852d9 100644 (file)
@@ -1254,12 +1254,20 @@ DEFINE_CLOCK(uart2_ipg_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG5_OFFSET,
        NULL,  NULL, &ipg_clk, &aips_tz1_clk);
 DEFINE_CLOCK(uart3_ipg_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG7_OFFSET,
        NULL,  NULL, &ipg_clk, &spba_clk);
+DEFINE_CLOCK(uart4_ipg_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG4_OFFSET,
+       NULL,  NULL, &ipg_clk, &spba_clk);
+DEFINE_CLOCK(uart5_ipg_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG6_OFFSET,
+       NULL,  NULL, &ipg_clk, &spba_clk);
 DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG4_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart1_ipg_clk);
 DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG6_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart2_ipg_clk);
 DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG8_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart3_ipg_clk);
+DEFINE_CLOCK(uart4_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG5_OFFSET,
+       NULL,  NULL, &uart_root_clk, &uart4_ipg_clk);
+DEFINE_CLOCK(uart5_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG7_OFFSET,
+       NULL,  NULL, &uart_root_clk, &uart5_ipg_clk);
 
 /* GPT */
 DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET,
@@ -1274,11 +1282,13 @@ DEFINE_CLOCK(pwm2_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG8_OFFSET,
 
 /* I2C */
 DEFINE_CLOCK(i2c1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG9_OFFSET,
-       NULL, NULL, &ipg_clk, NULL);
+       NULL, NULL, &ipg_perclk, NULL);
 DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG10_OFFSET,
-       NULL, NULL, &ipg_clk, NULL);
+       NULL, NULL, &ipg_perclk, NULL);
 DEFINE_CLOCK(hsi2c_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
        NULL, NULL, &ipg_clk, NULL);
+DEFINE_CLOCK(i2c3_mx53_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
+       NULL, NULL, &ipg_perclk, NULL);
 
 /* FEC */
 DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET,
@@ -1462,11 +1472,14 @@ static struct clk_lookup mx53_lookups[] = {
        _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
        _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
        _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
+       _REGISTER_CLOCK("imx-uart.3", NULL, uart4_clk)
+       _REGISTER_CLOCK("imx-uart.4", NULL, uart5_clk)
        _REGISTER_CLOCK(NULL, "gpt", gpt_clk)
        _REGISTER_CLOCK("fec.0", NULL, fec_clk)
        _REGISTER_CLOCK(NULL, "iim_clk", iim_clk)
        _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
        _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
+       _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_mx53_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, esdhc1_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_mx53_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, esdhc3_mx53_clk)
@@ -1476,6 +1489,11 @@ static struct clk_lookup mx53_lookups[] = {
        _REGISTER_CLOCK("imx53-cspi.0", NULL, cspi_clk)
        _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
        _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
+       _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk)
+       _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
+       _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
+       _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk)
+       _REGISTER_CLOCK("imx-keypad", NULL, dummy_clk)
 };
 
 static void clk_tree_init(void)
index 87c0c58f27a75c24a65658838e1dc366f97e7bd0..5e11ba7daee2e34ce64d3ad903cebfe6adb151b7 100644 (file)
 #define MXC_CCM_CCGR4          (MX51_CCM_BASE + 0x78)
 #define MXC_CCM_CCGR5          (MX51_CCM_BASE + 0x7C)
 #define MXC_CCM_CCGR6          (MX51_CCM_BASE + 0x80)
+#define MXC_CCM_CCGR7          (MX51_CCM_BASE + 0x84)
+
 #define MXC_CCM_CMEOR          (MX51_CCM_BASE + 0x84)
 
 /* Define the bits in register CCR */
index 48f4c8cc42f54e95e72c70fe2c58a900a86185b4..c27fe8bb4762ecce77a9caf5e5699d0b93d1eb14 100644 (file)
@@ -32,3 +32,11 @@ extern const struct imx_spi_imx_data imx53_ecspi_data[];
 extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[];
 #define imx53_add_imx2_wdt(id, pdata)  \
        imx_add_imx2_wdt(&imx53_imx2_wdt_data[id])
+
+extern const struct imx_imx_ssi_data imx53_imx_ssi_data[];
+#define imx53_add_imx_ssi(id, pdata)   \
+       imx_add_imx_ssi(&imx53_imx_ssi_data[id], pdata)
+
+extern const struct imx_imx_keypad_data imx53_imx_keypad_data;
+#define imx53_add_imx_keypad(pdata)    \
+       imx_add_imx_keypad(&imx53_imx_keypad_data, pdata)
index 153ada53e575aaf37acef19c53776c519beb2916..371ca8c8414c23dd3f696f530830fa9af3c70bbe 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
-#include <linux/gpio.h>
 #include <mach/hardware.h>
 #include <mach/imx-uart.h>
 #include <mach/irqs.h>
@@ -119,66 +118,3 @@ struct platform_device mxc_usbh2_device = {
                .coherent_dma_mask = DMA_BIT_MASK(32),
        },
 };
-
-static struct mxc_gpio_port mxc_gpio_ports[] = {
-       {
-               .chip.label = "gpio-0",
-               .base = MX51_IO_ADDRESS(MX51_GPIO1_BASE_ADDR),
-               .irq = MX51_MXC_INT_GPIO1_LOW,
-               .irq_high = MX51_MXC_INT_GPIO1_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START
-       },
-       {
-               .chip.label = "gpio-1",
-               .base = MX51_IO_ADDRESS(MX51_GPIO2_BASE_ADDR),
-               .irq = MX51_MXC_INT_GPIO2_LOW,
-               .irq_high = MX51_MXC_INT_GPIO2_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 1
-       },
-       {
-               .chip.label = "gpio-2",
-               .base = MX51_IO_ADDRESS(MX51_GPIO3_BASE_ADDR),
-               .irq = MX51_MXC_INT_GPIO3_LOW,
-               .irq_high = MX51_MXC_INT_GPIO3_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 2
-       },
-       {
-               .chip.label = "gpio-3",
-               .base = MX51_IO_ADDRESS(MX51_GPIO4_BASE_ADDR),
-               .irq = MX51_MXC_INT_GPIO4_LOW,
-               .irq_high = MX51_MXC_INT_GPIO4_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 3
-       },
-       {
-               .chip.label = "gpio-4",
-               .base = MX53_IO_ADDRESS(MX53_GPIO5_BASE_ADDR),
-               .irq = MX53_INT_GPIO5_LOW,
-               .irq_high = MX53_INT_GPIO5_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 4
-       },
-       {
-               .chip.label = "gpio-5",
-               .base = MX53_IO_ADDRESS(MX53_GPIO6_BASE_ADDR),
-               .irq = MX53_INT_GPIO6_LOW,
-               .irq_high = MX53_INT_GPIO6_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 5
-       },
-       {
-               .chip.label = "gpio-6",
-               .base = MX53_IO_ADDRESS(MX53_GPIO7_BASE_ADDR),
-               .irq = MX53_INT_GPIO7_LOW,
-               .irq_high = MX53_INT_GPIO7_HIGH,
-               .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 6
-       },
-};
-
-int __init imx51_register_gpios(void)
-{
-       return mxc_gpio_init(mxc_gpio_ports, 4);
-}
-
-int __init imx53_register_gpios(void)
-{
-       return mxc_gpio_init(mxc_gpio_ports, ARRAY_SIZE(mxc_gpio_ports));
-}
-
index 97292d20f1f39353fe63bdda41088ac9ff5fce94..bbf4564bd05076d7ead9dc6211fc2ccf90b72ca0 100644 (file)
 #include "devices.h"
 
 #define MBIMX51_TSC2007_GPIO   IMX_GPIO_NR(3, 30)
-#define MBIMX51_TSC2007_IRQ    (MXC_INTERNAL_IRQS + MBIMX51_TSC2007_GPIO)
 #define MBIMX51_LED0           IMX_GPIO_NR(3, 5)
 #define MBIMX51_LED1           IMX_GPIO_NR(3, 6)
 #define MBIMX51_LED2           IMX_GPIO_NR(3, 7)
 #define MBIMX51_LED3           IMX_GPIO_NR(3, 8)
 
-static struct gpio_led mbimx51_leds[] = {
+static const struct gpio_led mbimx51_leds[] __initconst = {
        {
                .name                   = "led0",
                .default_trigger        = "heartbeat",
@@ -64,23 +63,11 @@ static struct gpio_led mbimx51_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data mbimx51_leds_info = {
+static const struct gpio_led_platform_data mbimx51_leds_info __initconst = {
        .leds           = mbimx51_leds,
        .num_leds       = ARRAY_SIZE(mbimx51_leds),
 };
 
-static struct platform_device mbimx51_leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &mbimx51_leds_info,
-       },
-};
-
-static struct platform_device *devices[] __initdata = {
-       &mbimx51_leds_gpio,
-};
-
 static iomux_v3_cfg_t mbimx51_pads[] = {
        /* UART2 */
        MX51_PAD_UART2_RXD__UART2_RXD,
@@ -173,7 +160,7 @@ struct tsc2007_platform_data tsc2007_data = {
 static struct i2c_board_info mbimx51_i2c_devices[] = {
        {
                I2C_BOARD_INFO("tsc2007", 0x49),
-               .irq  = MBIMX51_TSC2007_IRQ,
+               .irq  = gpio_to_irq(MBIMX51_TSC2007_GPIO),
                .platform_data = &tsc2007_data,
        }, {
                I2C_BOARD_INFO("tlv320aic23", 0x1a),
@@ -204,13 +191,14 @@ void __init eukrea_mbimx51_baseboard_init(void)
        gpio_direction_output(MBIMX51_LED3, 1);
        gpio_free(MBIMX51_LED3);
 
-       platform_add_devices(devices, ARRAY_SIZE(devices));
+       gpio_led_register_device(-1, &mbimx51_leds_info);
 
        imx51_add_imx_keypad(&mbimx51_map_data);
 
        gpio_request(MBIMX51_TSC2007_GPIO, "tsc2007_irq");
        gpio_direction_input(MBIMX51_TSC2007_GPIO);
-       irq_set_irq_type(MBIMX51_TSC2007_IRQ, IRQF_TRIGGER_FALLING);
+       irq_set_irq_type(gpio_to_irq(MBIMX51_TSC2007_GPIO),
+                                       IRQF_TRIGGER_FALLING);
        i2c_register_board_info(1, mbimx51_i2c_devices,
                                ARRAY_SIZE(mbimx51_i2c_devices));
 
index 31c871ec46a6f9cc060d8a24c72df591f0277dbd..261923997643b0c17091840593ab9d8d6e0599dd 100644 (file)
@@ -74,7 +74,7 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
 #define GPIO_LED1      IMX_GPIO_NR(3, 30)
 #define GPIO_SWITCH1   IMX_GPIO_NR(3, 31)
 
-static struct gpio_led eukrea_mbimxsd_leds[] = {
+static const struct gpio_led eukrea_mbimxsd_leds[] __initconst = {
        {
                .name                   = "led1",
                .default_trigger        = "heartbeat",
@@ -83,19 +83,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = {
        },
 };
 
-static struct gpio_led_platform_data eukrea_mbimxsd_led_info = {
+static const struct gpio_led_platform_data
+               eukrea_mbimxsd_led_info __initconst = {
        .leds           = eukrea_mbimxsd_leds,
        .num_leds       = ARRAY_SIZE(eukrea_mbimxsd_leds),
 };
 
-static struct platform_device eukrea_mbimxsd_leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &eukrea_mbimxsd_led_info,
-       },
-};
-
 static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
        {
                .gpio           = GPIO_SWITCH1,
@@ -112,10 +105,6 @@ static const struct gpio_keys_platform_data
        .nbuttons       = ARRAY_SIZE(eukrea_mbimxsd_gpio_buttons),
 };
 
-static struct platform_device *platform_devices[] __initdata = {
-       &eukrea_mbimxsd_leds_gpio,
-};
-
 static const struct imxuart_platform_data uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
@@ -154,6 +143,6 @@ void __init eukrea_mbimxsd51_baseboard_init(void)
        i2c_register_board_info(0, eukrea_mbimxsd_i2c_devices,
                                ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
 
-       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+       gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
        imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
 }
index b9c363b514a9d4c9f767ec1dd5f0775417ccef4b..28c3f60f734f0c89cea026393bfae03020ee3602 100644 (file)
@@ -26,7 +26,6 @@
 #include <mach/hardware.h>
 #include <mach/common.h>
 #include <mach/iomux-v3.h>
-#include <mach/gpio.h>
 #include <mach/irqs.h>
 
 /*
@@ -56,17 +55,17 @@ void __init imx50_init_early(void)
        mxc_arch_reset_init(MX50_IO_ADDRESS(MX50_WDOG_BASE_ADDR));
 }
 
-static struct mxc_gpio_port imx50_gpio_ports[] = {
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 0, 1, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH),
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 1, 2, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH),
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 2, 3, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH),
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 3, 4, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH),
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 4, 5, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH),
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 5, 6, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH),
-};
-
 void __init mx50_init_irq(void)
 {
        tzic_init_irq(MX50_IO_ADDRESS(MX50_TZIC_BASE_ADDR));
-       mxc_gpio_init(imx50_gpio_ports, ARRAY_SIZE(imx50_gpio_ports));
+}
+
+void __init imx50_soc_init(void)
+{
+       mxc_register_gpio(0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH);
+       mxc_register_gpio(1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH);
+       mxc_register_gpio(2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH);
+       mxc_register_gpio(3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH);
+       mxc_register_gpio(4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH);
+       mxc_register_gpio(5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH);
 }
index ff557301b42bc90ecdf49a0a15e5c17949e449f9..1b7059f1ac7645c42eb305ffd30270ee0986cf9b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <mach/hardware.h>
 #include <mach/common.h>
+#include <mach/devices-common.h>
 #include <mach/iomux-v3.h>
 
 /*
@@ -69,8 +70,6 @@ void __init imx53_init_early(void)
        mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR));
 }
 
-int imx51_register_gpios(void);
-
 void __init mx51_init_irq(void)
 {
        unsigned long tzic_addr;
@@ -86,11 +85,8 @@ void __init mx51_init_irq(void)
                panic("unable to map TZIC interrupt controller\n");
 
        tzic_init_irq(tzic_virt);
-       imx51_register_gpios();
 }
 
-int imx53_register_gpios(void);
-
 void __init mx53_init_irq(void)
 {
        unsigned long tzic_addr;
@@ -103,5 +99,66 @@ void __init mx53_init_irq(void)
                panic("unable to map TZIC interrupt controller\n");
 
        tzic_init_irq(tzic_virt);
-       imx53_register_gpios();
+}
+
+static struct sdma_script_start_addrs imx51_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .uart_2_mcu_addr = 817,
+       .mcu_2_app_addr = 747,
+       .mcu_2_shp_addr = 961,
+       .ata_2_mcu_addr = 1473,
+       .mcu_2_ata_addr = 1392,
+       .app_2_per_addr = 1033,
+       .app_2_mcu_addr = 683,
+       .shp_2_per_addr = 1251,
+       .shp_2_mcu_addr = 892,
+};
+
+static struct sdma_platform_data imx51_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx51.bin",
+       .script_addrs = &imx51_sdma_script,
+};
+
+static struct sdma_script_start_addrs imx53_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .app_2_mcu_addr = 683,
+       .mcu_2_app_addr = 747,
+       .uart_2_mcu_addr = 817,
+       .shp_2_mcu_addr = 891,
+       .mcu_2_shp_addr = 960,
+       .uartsh_2_mcu_addr = 1032,
+       .spdif_2_mcu_addr = 1100,
+       .mcu_2_spdif_addr = 1134,
+       .firi_2_mcu_addr = 1193,
+       .mcu_2_firi_addr = 1290,
+};
+
+static struct sdma_platform_data imx53_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx53.bin",
+       .script_addrs = &imx53_sdma_script,
+};
+
+void __init imx51_soc_init(void)
+{
+       mxc_register_gpio(0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO1_LOW, MX51_MXC_INT_GPIO1_HIGH);
+       mxc_register_gpio(1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO2_LOW, MX51_MXC_INT_GPIO2_HIGH);
+       mxc_register_gpio(2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO3_LOW, MX51_MXC_INT_GPIO3_HIGH);
+       mxc_register_gpio(3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO4_LOW, MX51_MXC_INT_GPIO4_HIGH);
+
+       imx_add_imx_sdma(MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata);
+}
+
+void __init imx53_soc_init(void)
+{
+       mxc_register_gpio(0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH);
+       mxc_register_gpio(1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH);
+       mxc_register_gpio(2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH);
+       mxc_register_gpio(3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH);
+       mxc_register_gpio(4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH);
+       mxc_register_gpio(5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH);
+       mxc_register_gpio(6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);
+
+       imx_add_imx_sdma(MX53_SDMA_BASE_ADDR, MX53_INT_SDMA, &imx53_sdma_pdata);
 }
diff --git a/arch/arm/mach-mx5/pm-imx5.c b/arch/arm/mach-mx5/pm-imx5.c
new file mode 100644 (file)
index 0000000..e4529af
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/suspend.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <asm/cacheflush.h>
+#include <asm/tlbflush.h>
+#include <mach/system.h>
+#include "crm_regs.h"
+
+static struct clk *gpc_dvfs_clk;
+
+static int mx5_suspend_enter(suspend_state_t state)
+{
+       clk_enable(gpc_dvfs_clk);
+       switch (state) {
+       case PM_SUSPEND_MEM:
+               mx5_cpu_lp_set(STOP_POWER_OFF);
+               break;
+       case PM_SUSPEND_STANDBY:
+               mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (state == PM_SUSPEND_MEM) {
+               local_flush_tlb_all();
+               flush_cache_all();
+
+               /*clear the EMPGC0/1 bits */
+               __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR);
+               __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
+       }
+       cpu_do_idle();
+       clk_disable(gpc_dvfs_clk);
+
+       return 0;
+}
+
+static int mx5_pm_valid(suspend_state_t state)
+{
+       return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX);
+}
+
+static const struct platform_suspend_ops mx5_suspend_ops = {
+       .valid = mx5_pm_valid,
+       .enter = mx5_suspend_enter,
+};
+
+static int __init mx5_pm_init(void)
+{
+       if (gpc_dvfs_clk == NULL)
+               gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs");
+
+       if (!IS_ERR(gpc_dvfs_clk)) {
+               if (cpu_is_mx51())
+                       suspend_set_ops(&mx5_suspend_ops);
+       } else
+               return -EPERM;
+
+       return 0;
+}
+device_initcall(mx5_pm_init);
index f114960622e05079a1b2f9ddaaffbbd7b6c30fc5..4cd0231ee539ead25f0728fa8572fc1070fa5e60 100644 (file)
@@ -41,6 +41,7 @@ config MACH_MX23EVK
 config MACH_MX28EVK
        bool "Support MX28EVK Platform"
        select SOC_IMX28
+       select LEDS_GPIO_REGISTER
        select MXS_HAVE_AMBA_DUART
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_FEC
@@ -55,10 +56,12 @@ config MACH_MX28EVK
 config MODULE_TX28
        bool
        select SOC_IMX28
+       select LEDS_GPIO_REGISTER
        select MXS_HAVE_AMBA_DUART
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_FEC
        select MXS_HAVE_PLATFORM_MXS_I2C
+       select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXS_PWM
 
 config MACH_TX28
index 58e892376bf2b10cd2e00fa3ba885987549ffce7..6c38262a3aaa35fb1313c9b29a528e99e08de6a6 100644 (file)
@@ -1,5 +1,5 @@
 # Common support
-obj-y := clock.o devices.o gpio.o icoll.o iomux.o system.o timer.o
+obj-y := clock.o devices.o icoll.o iomux.o system.o timer.o
 
 obj-$(CONFIG_MXS_OCOTP) += ocotp.o
 obj-$(CONFIG_PM) += pm.o
index cfdb6b284702d75fb38cbf79fd97b4331ee46600..fe3e847930c9ff514fb3ca735e6c9a6530986246 100644 (file)
@@ -88,3 +88,14 @@ int __init mxs_add_amba_device(const struct amba_device *dev)
 
        return amba_device_register(adev, &iomem_resource);
 }
+
+struct device mxs_apbh_bus = {
+       .init_name      = "mxs_apbh",
+       .parent         = &platform_bus,
+};
+
+static int __init mxs_device_init(void)
+{
+       return device_register(&mxs_apbh_bus);
+}
+core_initcall(mxs_device_init);
index 324f2824d38d8e2d931a9769de4a8cc312d4744a..351915c683ffa0d749053012a68240541120abc6 100644 (file)
@@ -6,4 +6,5 @@ obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o
 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
diff --git a/arch/arm/mach-mxs/devices/platform-gpio-mxs.c b/arch/arm/mach-mxs/devices/platform-gpio-mxs.c
new file mode 100644 (file)
index 0000000..ed0885e
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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>
+
+struct platform_device *__init mxs_add_gpio(
+       int id, resource_size_t iobase, int irq)
+{
+       struct resource res[] = {
+               {
+                       .start = iobase,
+                       .end = iobase + SZ_8K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = irq,
+                       .end = irq,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return platform_device_register_resndata(&mxs_apbh_bus,
+                       "gpio-mxs", id, res, ARRAY_SIZE(res), NULL, 0);
+}
+
+static int __init mxs_add_mxs_gpio(void)
+{
+       if (cpu_is_mx23()) {
+               mxs_add_gpio(0, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO0);
+               mxs_add_gpio(1, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO1);
+               mxs_add_gpio(2, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO2);
+       }
+
+       if (cpu_is_mx28()) {
+               mxs_add_gpio(0, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO0);
+               mxs_add_gpio(1, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO1);
+               mxs_add_gpio(2, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO2);
+               mxs_add_gpio(3, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO3);
+               mxs_add_gpio(4, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO4);
+       }
+
+       return 0;
+}
+postcore_initcall(mxs_add_mxs_gpio);
index bf72c9b8dbdd19736b1f9090eafc479b0052bfdb..5a75b7180f74b616939b30c0aeeaa7c3f987f847 100644 (file)
@@ -5,6 +5,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <asm/sizes.h>
 #include <mach/mx23.h>
 #include <mach/mx28.h>
diff --git a/arch/arm/mach-mxs/gpio.h b/arch/arm/mach-mxs/gpio.h
deleted file mode 100644 (file)
index 005bb06..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA  02110-1301, USA.
- */
-
-#ifndef __MXS_GPIO_H__
-#define __MXS_GPIO_H__
-
-struct mxs_gpio_port {
-       void __iomem *base;
-       int id;
-       int irq;
-       int irq_high;
-       int virtual_irq_start;
-       struct gpio_chip chip;
-};
-
-int mxs_gpio_init(struct mxs_gpio_port*, int);
-
-#endif /* __MXS_GPIO_H__ */
index 7a37469ed5bf37baa3bd4908f99be3a6dd79ef34..812d7a813a780d8a0f75ea8170290a666b89ff41 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/init.h>
 #include <linux/amba/bus.h>
 
+extern struct device mxs_apbh_bus;
+
 struct platform_device *mxs_add_platform_device_dmamask(
                const char *name, int id,
                const struct resource *res, unsigned int num_resources,
index eacdc6b0e70abeb497e542d1084031b0a3d5da07..eaaf6ff289905501fffb048fb1aa0e3a4850b48d 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/delay.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
+#include <linux/leds.h>
 #include <linux/irq.h>
 #include <linux/clk.h>
 
 #include <mach/iomux-mx28.h>
 
 #include "devices-mx28.h"
-#include "gpio.h"
 
 #define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13)
 #define MX28EVK_FEC_PHY_POWER  MXS_GPIO_NR(2, 15)
+#define MX28EVK_GPIO_LED       MXS_GPIO_NR(3, 5)
 #define MX28EVK_BL_ENABLE      MXS_GPIO_NR(3, 18)
 #define MX28EVK_LCD_ENABLE     MXS_GPIO_NR(3, 30)
 #define MX28EVK_FEC_PHY_RESET  MXS_GPIO_NR(4, 13)
@@ -179,6 +180,23 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
        /* slot power enable */
        MX28_PAD_PWM4__GPIO_3_29 |
                (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
+
+       /* led */
+       MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
+};
+
+/* led */
+static const struct gpio_led mx28evk_leds[] __initconst = {
+       {
+               .name = "GPIO-LED",
+               .default_trigger = "heartbeat",
+               .gpio = MX28EVK_GPIO_LED,
+       },
+};
+
+static const struct gpio_led_platform_data mx28evk_led_data __initconst = {
+       .leds = mx28evk_leds,
+       .num_leds = ARRAY_SIZE(mx28evk_leds),
 };
 
 /* fec */
@@ -386,6 +404,8 @@ static void __init mx28evk_init(void)
        if (ret)
                pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
        mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
+
+       gpio_led_register_device(0, &mx28evk_led_data);
 }
 
 static void __init mx28evk_timer_init(void)
index b65e3719cbc4ae1cf43fe40ba253b581eb121d85..515a423f82cd22fc26e3d0a3ae4c176b3fbcdb7e 100644 (file)
@@ -101,14 +101,6 @@ static const iomux_cfg_t tx28_stk5v3_pads[] __initconst = {
                (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
        MX28_PAD_SSP0_DATA3__SSP0_D3 |
                (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA4__SSP0_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA5__SSP0_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA6__SSP0_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA7__SSP0_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
        MX28_PAD_SSP0_CMD__SSP0_CMD |
                (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
        MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
@@ -117,7 +109,7 @@ static const iomux_cfg_t tx28_stk5v3_pads[] __initconst = {
                (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
 };
 
-static struct gpio_led tx28_stk5v3_leds[] = {
+static const struct gpio_led tx28_stk5v3_leds[] __initconst = {
        {
                .name = "GPIO-LED",
                .default_trigger = "heartbeat",
@@ -147,6 +139,11 @@ static struct i2c_board_info tx28_stk5v3_i2c_boardinfo[] __initdata = {
        },
 };
 
+static struct mxs_mmc_platform_data tx28_mmc0_pdata __initdata = {
+       .wp_gpio = -EINVAL,
+       .flags = SLOTF_4_BIT_CAPABLE,
+};
+
 static void __init tx28_stk5v3_init(void)
 {
        mxs_iomux_setup_multiple_pads(tx28_stk5v3_pads,
@@ -159,11 +156,11 @@ static void __init tx28_stk5v3_init(void)
        /* spi via ssp will be added when available */
        spi_register_board_info(tx28_spi_board_info,
                        ARRAY_SIZE(tx28_spi_board_info));
-       mxs_add_platform_device("leds-gpio", 0, NULL, 0,
-                       &tx28_stk5v3_led_data, sizeof(tx28_stk5v3_led_data));
+       gpio_led_register_device(0, &tx28_stk5v3_led_data);
        mx28_add_mxs_i2c(0);
        i2c_register_board_info(0, tx28_stk5v3_i2c_boardinfo,
                        ARRAY_SIZE(tx28_stk5v3_i2c_boardinfo));
+       mx28_add_mxs_mmc(0, &tx28_mmc0_pdata);
 }
 
 static void __init tx28_timer_init(void)
index 5148cd64a6b7b0ea0779c8ab76d3295570b6882c..1b2345ac1a878f47ca195556acd3e14de56ca03f 100644 (file)
@@ -41,5 +41,4 @@ void __init mx23_map_io(void)
 void __init mx23_init_irq(void)
 {
        icoll_init_irq();
-       mx23_register_gpios();
 }
index 7e4cea32ebc64ee46e07e53125b00e6c9d1ea017..b6e18ddb92c02dc92806f07501056ad221bfb303 100644 (file)
@@ -41,5 +41,4 @@ void __init mx28_map_io(void)
 void __init mx28_init_irq(void)
 {
        icoll_init_irq();
-       mx28_register_gpios();
 }
index 810a982a66f8246291ffd8f776c5debb08714bc7..ef3e8b1e06c1400b05328725459af90f2256f1d0 100644 (file)
@@ -825,6 +825,7 @@ MACHINE_START(BALLOON3, "Balloon3")
        .map_io         = balloon3_map_io,
        .nr_irqs        = BALLOON3_NR_IRQS,
        .init_irq       = balloon3_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = balloon3_init,
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
index 4284513f396a041f7e94556f62a98319a833fc77..648b0ab2bf771a3c3dd4c894866a43659f880966 100644 (file)
@@ -151,6 +151,7 @@ MACHINE_START(CAPC7117,
        .boot_params = 0xa0000100,
        .map_io = pxa3xx_map_io,
        .init_irq = pxa3xx_init_irq,
+       .handle_irq = pxa3xx_handle_irq,
        .timer = &pxa_timer,
        .init_machine = capc7117_init
 MACHINE_END
index d5152220ce947607f072b47ae01d21419170c3b3..4d466102a0272edc5812ec7645d480541c92be37 100644 (file)
@@ -53,6 +53,21 @@ unsigned long clk_get_rate(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_get_rate);
 
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       int ret = -EINVAL;
+
+       if (clk->ops->setrate) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               ret = clk->ops->setrate(clk, rate);
+               spin_unlock_irqrestore(&clocks_lock, flags);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
 void clk_dummy_enable(struct clk *clk)
 {
 }
index 1f2fb9c43f062301ab5dc9595203a94ab4bfada4..3a258b1bf1aa46f39d255cb81a2643b667394192 100644 (file)
@@ -5,6 +5,7 @@ struct clkops {
        void                    (*enable)(struct clk *);
        void                    (*disable)(struct clk *);
        unsigned long           (*getrate)(struct clk *);
+       int                     (*setrate)(struct clk *, unsigned long);
 };
 
 struct clk {
index a1099678247630524da6ab789d4719e87d75ce47..1719927c24d63b575a50beed30746f922004ea24 100644 (file)
@@ -21,7 +21,8 @@
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 
-#include <mach/pxa2xx-regs.h>
+#include <mach/pxa25x.h>
+#include <mach/pxa27x.h>
 #include <mach/audio.h>
 #include <mach/pxafb.h>
 #include <mach/smemc.h>
@@ -516,6 +517,8 @@ MACHINE_START(ARMCORE, "Compulab CM-X2XX")
        .map_io         = cmx2xx_map_io,
        .nr_irqs        = CMX2XX_NR_IRQS,
        .init_irq       = cmx2xx_init_irq,
+       /* NOTE: pxa25x_handle_irq() works on PXA27x w/o camera support */
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = cmx2xx_init,
 MACHINE_END
index b2248e76ec8b713b9bf1f8a01ca84aca2e845d9c..de577c7e3acec015a747e70d85eed45276b47546 100644 (file)
@@ -859,6 +859,7 @@ MACHINE_START(CM_X300, "CM-X300 module")
        .boot_params    = 0xa0000100,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = cm_x300_init,
        .fixup          = cm_x300_fixup,
index 7545a48ed88bf5e66c28ca8c859dfedddda9e7a4..870920934ecfa037d7933776f89ff979c63bd0e8 100644 (file)
@@ -310,6 +310,7 @@ MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
        .init_machine   = colibri_pxa270_init,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
@@ -318,6 +319,7 @@ MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")
        .init_machine   = colibri_pxa270_income_init,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
index 66dd81cbc8a046bb7b0c94146836e449525b0414..60a6781e7a8ee3422b20207464e39dcf0bd5c4bc 100644 (file)
@@ -187,6 +187,7 @@ MACHINE_START(COLIBRI300, "Toradex Colibri PXA300")
        .init_machine   = colibri_pxa300_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
index ff9ff5f4fc47e599f409c10935151e65621023e1..d2c6631915d43cd7b66ea923c527f66159d513c5 100644 (file)
@@ -23,8 +23,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 
-#include <mach/pxa3xx-regs.h>
-#include <mach/mfp-pxa320.h>
+#include <mach/pxa320.h>
 #include <mach/colibri.h>
 #include <mach/pxafb.h>
 #include <mach/ohci.h>
@@ -258,6 +257,7 @@ MACHINE_START(COLIBRI320, "Toradex Colibri PXA320")
        .init_machine   = colibri_pxa320_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
index 3a5507e319197e493b34fb99d62c5f066ce682af..185a37cad25404ac9ad4382f9f53badd597f5a41 100644 (file)
@@ -722,6 +722,7 @@ MACHINE_START(CORGI, "SHARP Corgi")
        .fixup          = fixup_corgi,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .init_machine   = corgi_init,
        .timer          = &pxa_timer,
 MACHINE_END
@@ -732,6 +733,7 @@ MACHINE_START(SHEPHERD, "SHARP Shepherd")
        .fixup          = fixup_corgi,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .init_machine   = corgi_init,
        .timer          = &pxa_timer,
 MACHINE_END
@@ -742,6 +744,7 @@ MACHINE_START(HUSKY, "SHARP Husky")
        .fixup          = fixup_corgi,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .init_machine   = corgi_init,
        .timer          = &pxa_timer,
 MACHINE_END
index 0481c29a70e8b9540f3419a120c4e0ca43724856..fe812eafb1f178a1e33e82d26c3bca23869c38a6 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/csb726.h>
-#include <mach/mfp-pxa27x.h>
+#include <mach/pxa27x.h>
 #include <mach/mmc.h>
 #include <mach/ohci.h>
-#include <mach/pxa2xx-regs.h>
 #include <mach/audio.h>
 #include <mach/smemc.h>
 
@@ -276,6 +275,7 @@ MACHINE_START(CSB726, "Cogent CSB726")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .init_machine   = csb726_init,
        .timer          = &pxa_timer,
 MACHINE_END
index f8a6e9d79a3a5362c34ae8fa3c9bd8711a6e9db6..2e37ea52b372139e6abe469cc6727c39f695c049 100644 (file)
@@ -1302,6 +1302,7 @@ MACHINE_START(EM_X270, "Compulab EM-X270")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = em_x270_init,
 MACHINE_END
@@ -1310,6 +1311,7 @@ MACHINE_START(EXEDA, "Compulab eXeda")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = em_x270_init,
 MACHINE_END
index 2e3970fdde0bf4679bfedc7890d2fdb7f5a62e55..b4599ec9d6195e70eb74e40671290d9e826e3a88 100644 (file)
@@ -193,6 +193,7 @@ MACHINE_START(E330, "Toshiba e330")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e330_init,
        .timer          = &pxa_timer,
@@ -242,6 +243,7 @@ MACHINE_START(E350, "Toshiba e350")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e350_init,
        .timer          = &pxa_timer,
@@ -364,6 +366,7 @@ MACHINE_START(E400, "Toshiba e400")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e400_init,
        .timer          = &pxa_timer,
@@ -552,6 +555,7 @@ MACHINE_START(E740, "Toshiba e740")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e740_init,
        .timer          = &pxa_timer,
@@ -743,6 +747,7 @@ MACHINE_START(E750, "Toshiba e750")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e750_init,
        .timer          = &pxa_timer,
@@ -947,6 +952,7 @@ MACHINE_START(E800, "Toshiba e800")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = ESERIES_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .fixup          = eseries_fixup,
        .init_machine   = e800_init,
        .timer          = &pxa_timer,
index d88aed8fbe15c1f96c7156c09cea1781189cf5e3..b73eadb9f5dc0f07638c3ad873157299aef8408d 100644 (file)
@@ -801,6 +801,7 @@ MACHINE_START(EZX_A780, "Motorola EZX A780")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = a780_init,
 MACHINE_END
@@ -866,6 +867,7 @@ MACHINE_START(EZX_E680, "Motorola EZX E680")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = e680_init,
 MACHINE_END
@@ -931,6 +933,7 @@ MACHINE_START(EZX_A1200, "Motorola EZX A1200")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = a1200_init,
 MACHINE_END
@@ -1121,6 +1124,7 @@ MACHINE_START(EZX_A910, "Motorola EZX A910")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = a910_init,
 MACHINE_END
@@ -1186,6 +1190,7 @@ MACHINE_START(EZX_E6, "Motorola EZX E6")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = e6_init,
 MACHINE_END
@@ -1225,6 +1230,7 @@ MACHINE_START(EZX_E2, "Motorola EZX E2")
        .map_io         = pxa27x_map_io,
        .nr_irqs        = EZX_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = e2_init,
 MACHINE_END
index e6c9344a95ae1cb9062fab82415f096f6d96b651..92a2e85ab02cff7d91c182ec47628ff3087e5d65 100644 (file)
@@ -13,21 +13,8 @@ struct irq_data;
 struct sys_timer;
 
 extern struct sys_timer pxa_timer;
-extern void __init pxa_init_irq(int irq_nr,
-                               int (*set_wake)(struct irq_data *,
-                                               unsigned int));
-extern void __init pxa25x_init_irq(void);
-#ifdef CONFIG_CPU_PXA26x
-extern void __init pxa26x_init_irq(void);
-#endif
-extern void __init pxa27x_init_irq(void);
-extern void __init pxa3xx_init_irq(void);
-extern void __init pxa95x_init_irq(void);
 
 extern void __init pxa_map_io(void);
-extern void __init pxa25x_map_io(void);
-extern void __init pxa27x_map_io(void);
-extern void __init pxa3xx_map_io(void);
 
 extern unsigned int get_clk_frequency_khz(int info);
 
index d65e4bde9b917401d8a109642a2faf2ddd737ead..deaa111c91f9dd380a4ca60efb05da38f6ae79c6 100644 (file)
@@ -236,6 +236,7 @@ MACHINE_START(GUMSTIX, "Gumstix")
        .boot_params    = 0xa0000100, /* match u-boot bi_boot_params */
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = gumstix_init,
 MACHINE_END
index 657db469de1ff996469ca7e360d548abb4c46666..0a235128914d24f3157df0344d9361c6ec34e50b 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include <asm/irq.h>
 
 #include <mach/pxa25x.h>
 #include <mach/h5000.h>
@@ -205,6 +206,7 @@ MACHINE_START(H5400, "HP iPAQ H5000")
        .boot_params = 0xa0000100,
        .map_io = pxa25x_map_io,
        .init_irq = pxa25x_init_irq,
+       .handle_irq = pxa25x_handle_irq,
        .timer = &pxa_timer,
        .init_machine = h5000_init,
 MACHINE_END
index e8603eba54bd508e520ee4f60df00edd3187ed8a..a997d0ab2872b21aa02989c392591b15cc5ae41f 100644 (file)
@@ -24,8 +24,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <mach/mfp-pxa25x.h>
-#include <mach/hardware.h>
+#include <mach/pxa25x.h>
 
 #include "generic.h"
 
@@ -162,6 +161,7 @@ MACHINE_START(HIMALAYA, "HTC Himalaya")
        .boot_params = 0xa0000100,
        .map_io = pxa25x_map_io,
        .init_irq = pxa25x_init_irq,
+       .handle_irq = pxa25x_handle_irq,
        .init_machine = himalaya_init,
        .timer = &pxa_timer,
 MACHINE_END
index f941a495a4a8ed1806a38233ac4236899fee4f34..9a734cb7236e412b5acf27aa30fcdf35dbebcee0 100644 (file)
@@ -874,6 +874,7 @@ MACHINE_START(H4700, "HP iPAQ HX4700")
        .map_io       = pxa27x_map_io,
        .nr_irqs      = HX4700_NR_IRQS,
        .init_irq     = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .init_machine = hx4700_init,
        .timer        = &pxa_timer,
 MACHINE_END
index 6cedc81da3bc1b806dd2cec3356d37de0a3c581c..d427429f1f34bdb4d6e1a9be2a72b56a685ee16e 100644 (file)
@@ -194,6 +194,7 @@ MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM")
        .boot_params    = 0xa0000100,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = icontrol_init
 MACHINE_END
index f7fb64f11a7d2ffba1cef682460f1a143945498a..ddf20e5c376ed292a11b7945d5c35dc8ed3ca167 100644 (file)
@@ -196,6 +196,7 @@ MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
        /* Maintainer: Vibren Technologies */
        .map_io         = idp_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = idp_init,
 MACHINE_END
index 038402404e3932e78c702181c6d62cd4e4d145a7..7cc5a781e99e4dc6683b16d3ed132645c420126d 100644 (file)
 
 #define NR_IRQS                        (IRQ_BOARD_START)
 
+#ifndef __ASSEMBLY__
+struct irq_data;
+struct pt_regs;
+
+void pxa_mask_irq(struct irq_data *);
+void pxa_unmask_irq(struct irq_data *);
+void icip_handle_irq(struct pt_regs *);
+void ichp_handle_irq(struct pt_regs *);
+
+void pxa_init_irq(int irq_nr, int (*set_wake)(struct irq_data *, unsigned int));
+#endif
+
 #endif /* __ASM_MACH_IRQS_H */
index 508c3ba1f4d011d24ec48103d2d65a15f06d387d..3ac0baac73508bc418fd4493255b51004adff25f 100644 (file)
@@ -4,5 +4,14 @@
 #include <mach/hardware.h>
 #include <mach/pxa2xx-regs.h>
 #include <mach/mfp-pxa25x.h>
+#include <mach/irqs.h>
+
+extern void __init pxa25x_map_io(void);
+extern void __init pxa25x_init_irq(void);
+#ifdef CONFIG_CPU_PXA26x
+extern void __init pxa26x_init_irq(void);
+#endif
+
+#define pxa25x_handle_irq      icip_handle_irq
 
 #endif /* __MACH_PXA25x_H */
index 0b702693f4583eef6088febcc96d50f986f6873e..b9b1bdc4baccdcc4da734089f135106df3750a13 100644 (file)
@@ -4,6 +4,7 @@
 #include <mach/hardware.h>
 #include <mach/pxa2xx-regs.h>
 #include <mach/mfp-pxa27x.h>
+#include <mach/irqs.h>
 
 #define ARB_CNTRL      __REG(0x48000048)  /* Arbiter Control Register */
 
 #define ARB_CORE_PARK          (1<<24)    /* Be parked with core when idle */
 #define ARB_LOCK_FLAG          (1<<23)    /* Only Locking masters gain access to the bus */
 
+extern void __init pxa27x_map_io(void);
+extern void __init pxa27x_init_irq(void);
 extern int __init pxa27x_set_pwrmode(unsigned int mode);
 
+#define pxa27x_handle_irq      ichp_handle_irq
+
 #endif /* __MACH_PXA27x_H */
index 2f33076c9e4813e5e27009007b7b7f1e3f7a24dc..733b6412c3df7ba52e09b9f12683aaa940c6ddf5 100644 (file)
@@ -1,8 +1,7 @@
 #ifndef __MACH_PXA300_H
 #define __MACH_PXA300_H
 
-#include <mach/hardware.h>
-#include <mach/pxa3xx-regs.h>
+#include <mach/pxa3xx.h>
 #include <mach/mfp-pxa300.h>
 
 #endif /* __MACH_PXA300_H */
index cab78e903273e71b95836ec778881a9629b22208..b6204e470d89288d0bde5a2064f9db0e056d3ba9 100644 (file)
@@ -1,8 +1,7 @@
 #ifndef __MACH_PXA320_H
 #define __MACH_PXA320_H
 
-#include <mach/hardware.h>
-#include <mach/pxa3xx-regs.h>
+#include <mach/pxa3xx.h>
 #include <mach/mfp-pxa320.h>
 
 #endif /* __MACH_PXA320_H */
diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx.h b/arch/arm/mach-pxa/include/mach/pxa3xx.h
new file mode 100644 (file)
index 0000000..cd3e57f
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __MACH_PXA3XX_H        
+#define __MACH_PXA3XX_H
+
+#include <mach/hardware.h>
+#include <mach/pxa3xx-regs.h>
+#include <mach/irqs.h>
+
+extern void __init pxa3xx_map_io(void);
+extern void __init pxa3xx_init_irq(void);
+extern void __init pxa95x_init_irq(void);
+
+#define pxa3xx_handle_irq      ichp_handle_irq
+
+#endif /* __MACH_PXA3XX_H */
index d45f76a9b54ddcd5838fb97f27b63d07611d8ab6..190363b98d01275c0c93cc7daa756e78b2dbb0e3 100644 (file)
@@ -1,8 +1,7 @@
 #ifndef __MACH_PXA930_H
 #define __MACH_PXA930_H
 
-#include <mach/hardware.h>
-#include <mach/pxa3xx-regs.h>
+#include <mach/pxa3xx.h>
 #include <mach/mfp-pxa930.h>
 
 #endif /* __MACH_PXA930_H */
diff --git a/arch/arm/mach-pxa/include/mach/regs-intc.h b/arch/arm/mach-pxa/include/mach/regs-intc.h
deleted file mode 100644 (file)
index 662288e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef __ASM_MACH_REGS_INTC_H
-#define __ASM_MACH_REGS_INTC_H
-
-#include <mach/hardware.h>
-
-/*
- * Interrupt Controller
- */
-
-#define ICIP           __REG(0x40D00000)  /* Interrupt Controller IRQ Pending Register */
-#define ICMR           __REG(0x40D00004)  /* Interrupt Controller Mask Register */
-#define ICLR           __REG(0x40D00008)  /* Interrupt Controller Level Register */
-#define ICFP           __REG(0x40D0000C)  /* Interrupt Controller FIQ Pending Register */
-#define ICPR           __REG(0x40D00010)  /* Interrupt Controller Pending Register */
-#define ICCR           __REG(0x40D00014)  /* Interrupt Controller Control Register */
-#define ICHP           __REG(0x40D00018)  /* Interrupt Controller Highest Priority Register */
-
-#define ICIP2          __REG(0x40D0009C)  /* Interrupt Controller IRQ Pending Register 2 */
-#define ICMR2          __REG(0x40D000A0)  /* Interrupt Controller Mask Register 2 */
-#define ICLR2          __REG(0x40D000A4)  /* Interrupt Controller Level Register 2 */
-#define ICFP2          __REG(0x40D000A8)  /* Interrupt Controller FIQ Pending Register 2 */
-#define ICPR2          __REG(0x40D000AC)  /* Interrupt Controller Pending Register 2 */
-
-#define ICIP3          __REG(0x40D00130)  /* Interrupt Controller IRQ Pending Register 3 */
-#define ICMR3          __REG(0x40D00134)  /* Interrupt Controller Mask Register 3 */
-#define ICLR3          __REG(0x40D00138)  /* Interrupt Controller Level Register 3 */
-#define ICFP3          __REG(0x40D0013C)  /* Interrupt Controller FIQ Pending Register 3 */
-#define ICPR3          __REG(0x40D00140)  /* Interrupt Controller Pending Register 3 */
-
-#endif /* __ASM_MACH_REGS_INTC_H */
index 32ed551bf9c5d363f8181a590e79157ed002f0c1..b09e848eb6c6f0ae27356dc3feedb8ab790c4835 100644 (file)
@@ -37,6 +37,8 @@
 #define IPR(i)                 (((i) < 32) ? (0x01c + ((i) << 2)) :            \
                                ((i) < 64) ? (0x0b0 + (((i) - 32) << 2)) :      \
                                      (0x144 + (((i) - 64) << 2)))
+#define ICHP_VAL_IRQ           (1 << 31)
+#define ICHP_IRQ(i)            (((i) >> 16) & 0x7fff)
 #define IPR_VALID              (1 << 31)
 #define IRQ_BIT(n)             (((n) - PXA_IRQ(0)) & 0x1f)
 
@@ -64,7 +66,7 @@ static inline void __iomem *irq_base(int i)
        return (void __iomem *)io_p2v(phys_base[i]);
 }
 
-static void pxa_mask_irq(struct irq_data *d)
+void pxa_mask_irq(struct irq_data *d)
 {
        void __iomem *base = irq_data_get_irq_chip_data(d);
        uint32_t icmr = __raw_readl(base + ICMR);
@@ -73,7 +75,7 @@ static void pxa_mask_irq(struct irq_data *d)
        __raw_writel(icmr, base + ICMR);
 }
 
-static void pxa_unmask_irq(struct irq_data *d)
+void pxa_unmask_irq(struct irq_data *d)
 {
        void __iomem *base = irq_data_get_irq_chip_data(d);
        uint32_t icmr = __raw_readl(base + ICMR);
@@ -127,6 +129,36 @@ static struct irq_chip pxa_low_gpio_chip = {
        .irq_set_type   = pxa_set_low_gpio_type,
 };
 
+asmlinkage void __exception_irq_entry icip_handle_irq(struct pt_regs *regs)
+{
+       uint32_t icip, icmr, mask;
+
+       do {
+               icip = __raw_readl(IRQ_BASE + ICIP);
+               icmr = __raw_readl(IRQ_BASE + ICMR);
+               mask = icip & icmr;
+
+               if (mask == 0)
+                       break;
+
+               handle_IRQ(PXA_IRQ(fls(mask) - 1), regs);
+       } while (1);
+}
+
+asmlinkage void __exception_irq_entry ichp_handle_irq(struct pt_regs *regs)
+{
+       uint32_t ichp;
+
+       do {
+               __asm__ __volatile__("mrc p6, 0, %0, c5, c0, 0\n": "=r"(ichp));
+
+               if ((ichp & ICHP_VAL_IRQ) == 0)
+                       break;
+
+               handle_IRQ(PXA_IRQ(ICHP_IRQ(ichp)), regs);
+       } while (1);
+}
+
 static void __init pxa_init_low_gpio_irq(set_wake_t fn)
 {
        int irq;
index e5e326d2cdc981ebf7e08fec2c4aa8fcf62134b3..8f97e15e86e56e1834b3e4ac72254ed87368a0ae 100644 (file)
@@ -441,6 +441,7 @@ MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleto
        .map_io         = pxa3xx_map_io,
        .nr_irqs        = LITTLETON_NR_IRQS,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = littleton_init,
 MACHINE_END
index 6cf8180bf5bdd2de3941009ccf1231fa9fa0d8ac..c171d6ebee49805e1e529e6af8a4d664125cd68d 100644 (file)
@@ -503,6 +503,7 @@ MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine")
        .map_io         = lpd270_map_io,
        .nr_irqs        = LPD270_NR_IRQS,
        .init_irq       = lpd270_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = lpd270_init,
 MACHINE_END
index e10ddb827147940b14d7793942c301e3fe9ea806..a8c696bfc132929bb6256851b6790ec7e11a4afa 100644 (file)
@@ -553,6 +553,7 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
        .map_io         = lubbock_map_io,
        .nr_irqs        = LUBBOCK_NR_IRQS,
        .init_irq       = lubbock_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = lubbock_init,
 MACHINE_END
index e1920572948a9b1dcdc0d96a5be03a763f6f2e43..cb3509ee1fe2309b8ece28c3d44241531fd6c83f 100644 (file)
@@ -768,6 +768,7 @@ MACHINE_START(MAGICIAN, "HTC Magician")
        .map_io = pxa27x_map_io,
        .nr_irqs = MAGICIAN_NR_IRQS,
        .init_irq = pxa27x_init_irq,
+       .handle_irq = pxa27x_handle_irq,
        .init_machine = magician_init,
        .timer = &pxa_timer,
 MACHINE_END
index 3479e2b3b51195ee51c40962604aecfc68a35a35..4622eb78ef25172be578f29671476c2840012e50 100644 (file)
@@ -620,6 +620,7 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
        .map_io         = mainstone_map_io,
        .nr_irqs        = MAINSTONE_NR_IRQS,
        .init_irq       = mainstone_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = mainstone_init,
 MACHINE_END
index e3470137c93473a3929d5fb53a7eebb0932b1090..ff92efd65a53221aeac32a1170f85960ea3715cc 100644 (file)
@@ -794,6 +794,7 @@ MACHINE_START(MIOA701, "MIO A701")
        .boot_params    = 0xa0000100,
        .map_io         = &pxa27x_map_io,
        .init_irq       = &pxa27x_init_irq,
+       .handle_irq     = &pxa27x_handle_irq,
        .init_machine   = mioa701_machine_init,
        .timer          = &pxa_timer,
 MACHINE_END
index 59cce78aebd19c1850dcaee97ef610fa3c3331a6..fb408861dbcfeac057bcb26e872318e4cc81c01c 100644 (file)
@@ -96,6 +96,7 @@ MACHINE_START(NEC_MP900, "MobilePro900/C")
        .timer          = &pxa_timer,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .init_machine   = mp900c_init,
 MACHINE_END
 
index 4061ecddee70fa02524bede634c451ede4f2d702..6b77365ed93858466f984b6ec57cc095083fc07f 100644 (file)
@@ -345,6 +345,7 @@ MACHINE_START(PALMLD, "Palm LifeDrive")
        .boot_params    = 0xa0000100,
        .map_io         = palmld_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmld_init
 MACHINE_END
index df4d7d009fbbe72bd59e8650e59f8813c8886d2f..9bd3e47486fbe5e6e456d6296f68b522939ff60e 100644 (file)
@@ -206,6 +206,7 @@ MACHINE_START(PALMT5, "Palm Tungsten|T5")
        .map_io         = pxa27x_map_io,
        .reserve        = palmt5_reserve,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmt5_init
 MACHINE_END
index fb06bd04727257345f60ed1047b354c65c89e69c..6ad4a6c7bc96bd7591d101f5152cee71ac212839 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
+#include <mach/pxa25x.h>
 #include <mach/audio.h>
 #include <mach/palmtc.h>
 #include <mach/mmc.h>
 #include <mach/pxafb.h>
-#include <mach/mfp-pxa25x.h>
 #include <mach/irda.h>
 #include <mach/udc.h>
-#include <mach/pxa2xx-regs.h>
 
 #include "generic.h"
 #include "devices.h"
@@ -541,6 +540,7 @@ MACHINE_START(PALMTC, "Palm Tungsten|C")
        .boot_params    = 0xa0000100,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmtc_init
 MACHINE_END
index 726f5b98dcd3599f8115f78b5b5d27053862d7c6..664232f3e62c7d24d20cdcb5aca699fba3326729 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
+#include <mach/pxa25x.h>
 #include <mach/audio.h>
 #include <mach/palmte2.h>
 #include <mach/mmc.h>
 #include <mach/pxafb.h>
-#include <mach/mfp-pxa25x.h>
 #include <mach/irda.h>
 #include <mach/udc.h>
 #include <mach/palmasoc.h>
@@ -359,6 +359,7 @@ MACHINE_START(PALMTE2, "Palm Tungsten|E2")
        .boot_params    = 0xa0000100,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmte2_init
 MACHINE_END
index 20d1b18b1733ff5ab37b994264ba01b4bdcf9554..bb27d4b688d876b7ecfb032e1e99e27d0b7f7205 100644 (file)
@@ -444,6 +444,7 @@ MACHINE_START(TREO680, "Palm Treo 680")
        .map_io         = pxa27x_map_io,
        .reserve        = treo_reserve,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = treo680_init,
 MACHINE_END
@@ -453,6 +454,7 @@ MACHINE_START(CENTRO, "Palm Centro 685")
        .map_io         = pxa27x_map_io,
        .reserve        = treo_reserve,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq       = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = centro_init,
 MACHINE_END
index 595f002066cc0434e734c15831e469acddd9f675..fc4285589c1f1e15922c8c9ed148aba4697fc609 100644 (file)
@@ -367,6 +367,7 @@ MACHINE_START(PALMTX, "Palm T|X")
        .boot_params    = 0xa0000100,
        .map_io         = palmtx_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmtx_init
 MACHINE_END
index 65f24f0b77e85673d7908aec8683debc6110249e..95d71c3a5bae88c3e096fd2fad533eb938336ac3 100644 (file)
@@ -401,6 +401,7 @@ MACHINE_START(PALMZ72, "Palm Zire72")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmz72_init
 MACHINE_END
index 1fc8a66407ae1fef0ba0fe5ce1bcae925e854eda..ffa65dfb8c6f895f56b1bb1a79ed0546c7f23053 100644 (file)
@@ -262,6 +262,7 @@ MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270")
        .map_io         = pcm027_map_io,
        .nr_irqs        = PCM027_NR_IRQS,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = pcm027_init,
 MACHINE_END
index 16d14fd79b4b26506801246df4476f617afed810..a113ea9ab4abd180f6923b1af45070e6d0a6c927 100644 (file)
@@ -468,6 +468,7 @@ MACHINE_START(POODLE, "SHARP Poodle")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = POODLE_NR_IRQS,       /* 4 for LoCoMo */
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = poodle_init,
 MACHINE_END
index 8521d7d6f1dab39402ef5c36ed3abece4cf17f89..e66dc1562cdadafbd9c5bfd5773cc2ff3d3c88d9 100644 (file)
@@ -31,7 +31,6 @@
 #include <mach/ohci.h>
 #include <mach/pm.h>
 #include <mach/dma.h>
-#include <mach/regs-intc.h>
 #include <mach/smemc.h>
 
 #include "generic.h"
@@ -328,13 +327,13 @@ static void pxa_ack_ext_wakeup(struct irq_data *d)
 
 static void pxa_mask_ext_wakeup(struct irq_data *d)
 {
-       ICMR2 &= ~(1 << ((d->irq - PXA_IRQ(0)) & 0x1f));
+       pxa_mask_irq(d);
        PECR &= ~PECR_IE(d->irq - IRQ_WAKEUP0);
 }
 
 static void pxa_unmask_ext_wakeup(struct irq_data *d)
 {
-       ICMR2 |= 1 << ((d->irq - PXA_IRQ(0)) & 0x1f);
+       pxa_unmask_irq(d);
        PECR |= PECR_IE(d->irq - IRQ_WAKEUP0);
 }
 
index ecc82a330fad09a6747beca85c9007598ded30f5..0ee166b61f81399448d48c119f101829b1a85158 100644 (file)
@@ -27,7 +27,6 @@
 #include <mach/reset.h>
 #include <mach/pm.h>
 #include <mach/dma.h>
-#include <mach/regs-intc.h>
 
 #include "generic.h"
 #include "devices.h"
index d130f77b6d11c8dfd6317cf793dcdcabd1b354af..8b8cff6a962073adb0fd79f21b841c9a586a73db 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <mach/hardware.h>
-#include <mach/pxa3xx-regs.h>
-#include <mach/mfp-pxa3xx.h>
-#include <mach/mfp-pxa300.h>
+#include <mach/pxa300.h>
 #include <mach/ohci.h>
 #include <mach/pxafb.h>
 #include <mach/mmc.h>
@@ -1091,6 +1088,7 @@ MACHINE_START(RAUMFELD_RC, "Raumfeld Controller")
        .init_machine   = raumfeld_controller_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 #endif
@@ -1101,6 +1099,7 @@ MACHINE_START(RAUMFELD_CONNECTOR, "Raumfeld Connector")
        .init_machine   = raumfeld_connector_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 #endif
@@ -1111,6 +1110,7 @@ MACHINE_START(RAUMFELD_SPEAKER, "Raumfeld Speaker")
        .init_machine   = raumfeld_speaker_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 #endif
index fee97a935122392005988f3461fbff85dc3c8288..df4356e8acae38996b56a746f5aff2cb63c6551e 100644 (file)
@@ -599,6 +599,7 @@ MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")
        .boot_params    = 0xa0000100,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq       = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = saar_init,
 MACHINE_END
index 9322fe527c7f9cb017eb537ee0db9957c06bce9e..3b582d691cc6d4ea54858997ee7932476bccd75b 100644 (file)
@@ -107,6 +107,7 @@ MACHINE_START(SAARB, "PXA955 Handheld Platform (aka SAARB)")
        .map_io         = pxa_map_io,
        .nr_irqs        = SAARB_NR_IRQS,
        .init_irq       = pxa95x_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = saarb_init,
 MACHINE_END
index 01c576963e94504f9a56390ffa2e4b8339d8fb55..438c7b5e451f0a58db257abd339067da99ba1d65 100644 (file)
@@ -984,6 +984,7 @@ MACHINE_START(SPITZ, "SHARP Spitz")
        .fixup          = spitz_fixup,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .init_machine   = spitz_init,
        .timer          = &pxa_timer,
 MACHINE_END
@@ -994,6 +995,7 @@ MACHINE_START(BORZOI, "SHARP Borzoi")
        .fixup          = spitz_fixup,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .init_machine   = spitz_init,
        .timer          = &pxa_timer,
 MACHINE_END
@@ -1004,6 +1006,7 @@ MACHINE_START(AKITA, "SHARP Akita")
        .fixup          = spitz_fixup,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .init_machine   = spitz_init,
        .timer          = &pxa_timer,
 MACHINE_END
index cb5611daf5fe21ddc193ab3f910ab69a878fe861..3f8d0af9e2f7b48753e4818488c3982839615a32 100644 (file)
@@ -1001,6 +1001,7 @@ static void __init stargate2_init(void)
 MACHINE_START(INTELMOTE2, "IMOTE 2")
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = imote2_init,
        .boot_params    = 0xA0000100,
@@ -1012,6 +1013,7 @@ MACHINE_START(STARGATE2, "Stargate 2")
        .map_io = pxa27x_map_io,
        .nr_irqs = STARGATE_NR_IRQS,
        .init_irq = pxa27x_init_irq,
+       .handle_irq = pxa27x_handle_irq,
        .timer = &pxa_timer,
        .init_machine = stargate2_init,
        .boot_params = 0xA0000100,
index 53d4a472b6992419ef4e0e12c7e0e1c81879359d..32fb58e01b1014ec4901387fe4d440d9169567bf 100644 (file)
@@ -492,6 +492,7 @@ MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")
        .boot_params    = 0xa0000100,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq       = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = tavorevb_init,
 MACHINE_END
index 79f4422f12f4d13b2ae051bbb5c9828138ae1e7a..fd5a8eae0a876ed217e1b48c0f97b960c1756dca 100644 (file)
@@ -129,6 +129,7 @@ MACHINE_START(TAVOREVB3, "PXA950 Evaluation Board (aka TavorEVB3)")
        .map_io         = pxa3xx_map_io,
        .nr_irqs        = TAVOREVB3_NR_IRQS,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq       = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = evb3_init,
 MACHINE_END
index 5fa145778e7d4b1a9e7a737b7292edc5c6715eb6..9f69a26826933b5a5469339ebb66cd27df2b0b5f 100644 (file)
@@ -974,6 +974,7 @@ MACHINE_START(TOSA, "SHARP Tosa")
        .map_io         = pxa25x_map_io,
        .nr_irqs        = TOSA_NR_IRQS,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq       = pxa25x_handle_irq,
        .init_machine   = tosa_init,
        .timer          = &pxa_timer,
 MACHINE_END
index 687417a936988014da451cfaf8676fad1e08aa55..c0417508f39dc17c149c53a94294fe0496975bf0 100644 (file)
@@ -558,6 +558,7 @@ MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module")
        .init_machine   = trizeps4_init,
        .map_io         = trizeps4_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
@@ -567,5 +568,6 @@ MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module")
        .init_machine   = trizeps4_init,
        .map_io         = trizeps4_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
index 903218eab56db6031ecf54ea2b3244edb165eb6e..d4a3dc74e84a06091953fc2ee63a542335f0f29a 100644 (file)
@@ -995,6 +995,7 @@ MACHINE_START(VIPER, "Arcom/Eurotech VIPER SBC")
        .boot_params    = 0xa0000100,
        .map_io         = viper_map_io,
        .init_irq       = viper_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = viper_init,
 MACHINE_END
index 67bd41488bf81f05f0d853e708c243a747e8cd03..5f8490ab07cb2bdda9b5303d06866fdc388935e4 100644 (file)
@@ -719,6 +719,7 @@ MACHINE_START(VPAC270, "Voipac PXA270")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = vpac270_init
 MACHINE_END
index f55f8f2e0db3219720e7fc5ed30b22108b8fb6ae..acc600f5e72f4a8897ecf01175020dadbd1702df 100644 (file)
@@ -28,8 +28,7 @@
 #include <asm/mach/map.h>
 
 #include <mach/hardware.h>
-#include <mach/pxa2xx-regs.h>
-#include <mach/mfp-pxa25x.h>
+#include <mach/pxa25x.h>
 #include <mach/smemc.h>
 
 #include "generic.h"
@@ -185,6 +184,7 @@ MACHINE_START(XCEP, "Iskratel XCEP")
        .init_machine   = xcep_init,
        .map_io         = pxa25x_map_io,
        .init_irq       = pxa25x_init_irq,
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
 MACHINE_END
 
index fbe9e02e2f9f8f9c7ebc56c5eed51c5dbcde9509..6c9275a20c91d6735e1ee656b332816e3aaf3a86 100644 (file)
@@ -40,6 +40,7 @@
 #include <mach/pxafb.h>
 #include <mach/mmc.h>
 #include <plat/pxa27x_keypad.h>
+#include <mach/pm.h>
 
 #include "generic.h"
 #include "devices.h"
@@ -677,6 +678,20 @@ static void __init z2_pmic_init(void)
 static inline void z2_pmic_init(void) {}
 #endif
 
+#ifdef CONFIG_PM
+static void z2_power_off(void)
+{
+       /* We're using deep sleep as poweroff, so clear PSPR to ensure that
+        * bootloader will jump to its entry point in resume handler
+        */
+       PSPR = 0x0;
+       local_irq_disable();
+       pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP, PLAT_PHYS_OFFSET - PAGE_OFFSET);
+}
+#else
+#define z2_power_off   NULL
+#endif
+
 /******************************************************************************
  * Machine init
  ******************************************************************************/
@@ -698,12 +713,15 @@ static void __init z2_init(void)
        z2_leds_init();
        z2_keys_init();
        z2_pmic_init();
+
+       pm_power_off = z2_power_off;
 }
 
 MACHINE_START(ZIPIT2, "Zipit Z2")
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = z2_init,
 MACHINE_END
index 00363c7ac1828c58e45035f7d37a5ea0bcbcfcf5..667e0956a5677883ef12db463ab0e035615c3281 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <mach/pxa2xx-regs.h>
+#include <mach/pxa27x.h>
 #include <mach/regs-uart.h>
 #include <mach/ohci.h>
 #include <mach/mmc.h>
 #include <mach/pxa27x-udc.h>
 #include <mach/udc.h>
 #include <mach/pxafb.h>
-#include <mach/mfp-pxa27x.h>
 #include <mach/pm.h>
 #include <mach/audio.h>
 #include <mach/arcom-pcmcia.h>
@@ -908,6 +907,7 @@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS")
        .map_io         = zeus_map_io,
        .nr_irqs        = ZEUS_NR_IRQS,
        .init_irq       = zeus_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = zeus_init,
 MACHINE_END
index 5821185f77ab16b14de591d9db2ba7482694ea41..15ec66b3471a80644da24083ceb8da43f9002ea2 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
-#include <mach/hardware.h>
+#include <mach/pxa3xx.h>
 #include <mach/audio.h>
 #include <mach/pxafb.h>
 #include <mach/zylonite.h>
@@ -426,6 +426,7 @@ MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)")
        .map_io         = pxa3xx_map_io,
        .nr_irqs        = ZYLONITE_NR_IRQS,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = zylonite_init,
 MACHINE_END
index 30e18bc60647b35e78bc914703de41af0ecc8e44..846cd7d69e3ed0e4ae73608e418b5ebe02bccd75 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/i2c.h>
-#include <linux/i2c-tegra.h>
 
 #include <sound/wm8903.h>
 
@@ -83,22 +82,6 @@ static struct platform_device harmony_audio_device = {
        },
 };
 
-static struct tegra_i2c_platform_data harmony_i2c1_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
-static struct tegra_i2c_platform_data harmony_i2c2_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
-static struct tegra_i2c_platform_data harmony_i2c3_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
-static struct tegra_i2c_platform_data harmony_dvc_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
 static struct wm8903_platform_data harmony_wm8903_pdata = {
        .irq_active_low = 0,
        .micdet_cfg = 0,
@@ -121,11 +104,6 @@ static struct i2c_board_info __initdata wm8903_board_info = {
 
 static void __init harmony_i2c_init(void)
 {
-       tegra_i2c_device1.dev.platform_data = &harmony_i2c1_platform_data;
-       tegra_i2c_device2.dev.platform_data = &harmony_i2c2_platform_data;
-       tegra_i2c_device3.dev.platform_data = &harmony_i2c3_platform_data;
-       tegra_i2c_device4.dev.platform_data = &harmony_dvc_platform_data;
-
        platform_device_register(&tegra_i2c_device1);
        platform_device_register(&tegra_i2c_device2);
        platform_device_register(&tegra_i2c_device3);
index 2643d1bd568b50102231d93432178c297dc79b05..bdd2627dd87ba0acdde5eb29b254274808f09499 100644 (file)
@@ -141,12 +141,10 @@ static struct tegra_pingroup_config paz00_pinmux[] = {
 };
 
 static struct tegra_gpio_table gpio_table[] = {
-       { .gpio = TEGRA_GPIO_SD1_CD,    .enable = true  },
-       { .gpio = TEGRA_GPIO_SD1_WP,    .enable = true  },
-       { .gpio = TEGRA_GPIO_SD1_POWER, .enable = true  },
-       { .gpio = TEGRA_GPIO_SD4_CD,    .enable = true  },
-       { .gpio = TEGRA_GPIO_SD4_WP,    .enable = true  },
-       { .gpio = TEGRA_GPIO_SD4_POWER, .enable = true  },
+       { .gpio = TEGRA_GPIO_SD1_CD,    .enable = true },
+       { .gpio = TEGRA_GPIO_SD1_WP,    .enable = true },
+       { .gpio = TEGRA_GPIO_SD1_POWER, .enable = true },
+       { .gpio = TEGRA_ULPI_RST,       .enable = true },
 };
 
 void paz00_pinmux_init(void)
index 57e50a823eeca7160749dcc7c468560377fdbb2d..ea2f79c9879bbbbba6c1f868f531d880fae1262d 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/pda_power.h>
 #include <linux/io.h>
+#include <linux/i2c.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -34,6 +35,7 @@
 #include <mach/iomap.h>
 #include <mach/irqs.h>
 #include <mach/sdhci.h>
+#include <mach/gpio.h>
 
 #include "board.h"
 #include "board-paz00.h"
@@ -66,10 +68,22 @@ static struct platform_device debug_uart = {
 static struct platform_device *paz00_devices[] __initdata = {
        &debug_uart,
        &tegra_sdhci_device1,
-       &tegra_sdhci_device2,
        &tegra_sdhci_device4,
 };
 
+static void paz00_i2c_init(void)
+{
+       platform_device_register(&tegra_i2c_device1);
+       platform_device_register(&tegra_i2c_device2);
+       platform_device_register(&tegra_i2c_device4);
+}
+
+static void paz00_usb_init(void)
+{
+       platform_device_register(&tegra_ehci2_device);
+       platform_device_register(&tegra_ehci3_device);
+}
+
 static void __init tegra_paz00_fixup(struct machine_desc *desc,
        struct tag *tags, char **cmdline, struct meminfo *mi)
 {
@@ -84,23 +98,16 @@ static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {
        { NULL,         NULL,           0,              0},
 };
 
-
 static struct tegra_sdhci_platform_data sdhci_pdata1 = {
        .cd_gpio        = TEGRA_GPIO_SD1_CD,
        .wp_gpio        = TEGRA_GPIO_SD1_WP,
        .power_gpio     = TEGRA_GPIO_SD1_POWER,
 };
 
-static struct tegra_sdhci_platform_data sdhci_pdata2 = {
+static struct tegra_sdhci_platform_data sdhci_pdata4 = {
        .cd_gpio        = -1,
        .wp_gpio        = -1,
        .power_gpio     = -1,
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata4 = {
-       .cd_gpio        = TEGRA_GPIO_SD4_CD,
-       .wp_gpio        = TEGRA_GPIO_SD4_WP,
-       .power_gpio     = TEGRA_GPIO_SD4_POWER,
        .is_8bit        = 1,
 };
 
@@ -111,13 +118,15 @@ static void __init tegra_paz00_init(void)
        paz00_pinmux_init();
 
        tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
-       tegra_sdhci_device2.dev.platform_data = &sdhci_pdata2;
        tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
 
        platform_add_devices(paz00_devices, ARRAY_SIZE(paz00_devices));
+
+       paz00_i2c_init();
+       paz00_usb_init();
 }
 
-MACHINE_START(PAZ00, "paz00")
+MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ")
        .boot_params    = 0x00000100,
        .fixup          = tegra_paz00_fixup,
        .map_io         = tegra_map_common_io,
index da193ca76d3b168105ed29f0eb03f0fe68128a5e..d4ff39ddaeb3e4fffbbdf62e2183e68a2013f9de 100644 (file)
 #ifndef _MACH_TEGRA_BOARD_PAZ00_H
 #define _MACH_TEGRA_BOARD_PAZ00_H
 
-#define TEGRA_GPIO_SD1_CD               TEGRA_GPIO_PV5
-#define TEGRA_GPIO_SD1_WP               TEGRA_GPIO_PH1
-#define TEGRA_GPIO_SD1_POWER            TEGRA_GPIO_PT3
-#define TEGRA_GPIO_SD4_CD               TEGRA_GPIO_PH2
-#define TEGRA_GPIO_SD4_WP               TEGRA_GPIO_PH3
-#define TEGRA_GPIO_SD4_POWER            TEGRA_GPIO_PI6
+#define TEGRA_GPIO_SD1_CD              TEGRA_GPIO_PV5
+#define TEGRA_GPIO_SD1_WP              TEGRA_GPIO_PH1
+#define TEGRA_GPIO_SD1_POWER           TEGRA_GPIO_PT3
+#define TEGRA_ULPI_RST                 TEGRA_GPIO_PV0
 
 void paz00_pinmux_init(void);
 
index a8d7ace9f958ef2fd4c6db3e5802e2a8d8a861e5..46d5df90c79ece38fd57c9171b11d5713f2c88fb 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
 #include <linux/i2c.h>
-#include <linux/i2c-tegra.h>
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/io.h>
@@ -66,22 +65,6 @@ static __initdata struct tegra_clk_init_table seaboard_clk_init_table[] = {
        { NULL,         NULL,           0,              0},
 };
 
-static struct tegra_i2c_platform_data seaboard_i2c1_platform_data = {
-       .bus_clk_rate   = 400000.
-};
-
-static struct tegra_i2c_platform_data seaboard_i2c2_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
-static struct tegra_i2c_platform_data seaboard_i2c3_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
-static struct tegra_i2c_platform_data seaboard_dvc_platform_data = {
-       .bus_clk_rate   = 400000,
-};
-
 static struct gpio_keys_button seaboard_gpio_keys_buttons[] = {
        {
                .code           = SW_LID,
@@ -137,9 +120,9 @@ static struct tegra_sdhci_platform_data sdhci_pdata4 = {
 static struct platform_device *seaboard_devices[] __initdata = {
        &debug_uart,
        &tegra_pmu_device,
-       &tegra_sdhci_device1,
-       &tegra_sdhci_device3,
        &tegra_sdhci_device4,
+       &tegra_sdhci_device3,
+       &tegra_sdhci_device1,
        &seaboard_gpio_keys_device,
 };
 
@@ -161,11 +144,6 @@ static void __init seaboard_i2c_init(void)
 
        i2c_register_board_info(4, &adt7461_device, 1);
 
-       tegra_i2c_device1.dev.platform_data = &seaboard_i2c1_platform_data;
-       tegra_i2c_device2.dev.platform_data = &seaboard_i2c2_platform_data;
-       tegra_i2c_device3.dev.platform_data = &seaboard_i2c3_platform_data;
-       tegra_i2c_device4.dev.platform_data = &seaboard_dvc_platform_data;
-
        platform_device_register(&tegra_i2c_device1);
        platform_device_register(&tegra_i2c_device2);
        platform_device_register(&tegra_i2c_device3);
index 13534fa08abfd4b2586b0e983d776d51bfe5289f..82646a411ecdea7f6921d61433f12bce48c06766 100644 (file)
@@ -29,7 +29,7 @@ static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
        {TEGRA_PINGROUP_ATC,   TEGRA_MUX_NAND,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_ATD,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_ATE,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
-       {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_OSC,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT,      TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4,     TEGRA_PUPD_PULL_DOWN,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_CRTP,  TEGRA_MUX_CRT,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_CSUS,  TEGRA_MUX_VI_SENSOR_CLK, TEGRA_PUPD_PULL_DOWN,   TEGRA_TRI_TRISTATE},
@@ -126,7 +126,7 @@ static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
        {TEGRA_PINGROUP_SPIH,  TEGRA_MUX_SPI2_ALT,      TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UAA,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UAB,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
-       {TEGRA_PINGROUP_UAC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_UAC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_UAD,   TEGRA_MUX_IRDA,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UCA,   TEGRA_MUX_UARTC,         TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UCB,   TEGRA_MUX_UARTC,         TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
@@ -145,6 +145,9 @@ static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
 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 */
+
+       { .gpio = TRIMSLICE_GPIO_USB1_MODE, .enable = true }, /* USB1 mode */
+       { .gpio = TRIMSLICE_GPIO_USB2_RST,  .enable = true }, /* USB2 PHY rst */
 };
 
 void __init trimslice_pinmux_init(void)
index cda4cfd78e8417f6f8af5fe0a30e2015f074efa9..89a6d2adc1dedb61d329f54d5beb10a4d5eadc54 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
 #include <linux/io.h>
+#include <linux/i2c.h>
+#include <linux/gpio.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -30,6 +32,7 @@
 
 #include <mach/iomap.h>
 #include <mach/sdhci.h>
+#include <mach/gpio.h>
 
 #include "board.h"
 #include "clock.h"
@@ -71,12 +74,58 @@ static struct tegra_sdhci_platform_data sdhci_pdata4 = {
        .power_gpio     = -1,
 };
 
+static struct platform_device trimslice_audio_device = {
+       .name   = "tegra-snd-trimslice",
+       .id     = 0,
+};
+
 static struct platform_device *trimslice_devices[] __initdata = {
        &debug_uart,
        &tegra_sdhci_device1,
        &tegra_sdhci_device4,
+       &tegra_i2s_device1,
+       &tegra_das_device,
+       &tegra_pcm_device,
+       &trimslice_audio_device,
 };
 
+static struct i2c_board_info trimslice_i2c3_board_info[] = {
+       {
+               I2C_BOARD_INFO("tlv320aic23", 0x1a),
+       },
+       {
+               I2C_BOARD_INFO("em3027", 0x56),
+       },
+};
+
+static void trimslice_i2c_init(void)
+{
+       platform_device_register(&tegra_i2c_device1);
+       platform_device_register(&tegra_i2c_device2);
+       platform_device_register(&tegra_i2c_device3);
+
+       i2c_register_board_info(2, trimslice_i2c3_board_info,
+                               ARRAY_SIZE(trimslice_i2c3_board_info));
+}
+
+static void trimslice_usb_init(void)
+{
+       int err;
+
+       platform_device_register(&tegra_ehci3_device);
+
+       platform_device_register(&tegra_ehci2_device);
+
+       err = gpio_request_one(TRIMSLICE_GPIO_USB1_MODE, GPIOF_OUT_INIT_HIGH,
+                              "usb1mode");
+       if (err) {
+               pr_err("TrimSlice: failed to obtain USB1 mode gpio: %d\n", err);
+               return;
+       }
+
+       platform_device_register(&tegra_ehci1_device);
+}
+
 static void __init tegra_trimslice_fixup(struct machine_desc *desc,
        struct tag *tags, char **cmdline, struct meminfo *mi)
 {
@@ -90,6 +139,10 @@ static void __init tegra_trimslice_fixup(struct machine_desc *desc,
 static __initdata struct tegra_clk_init_table trimslice_clk_init_table[] = {
        /* name         parent          rate            enabled */
        { "uarta",      "pll_p",        216000000,      true },
+       { "pll_a",      "pll_p_out1",   56448000,       true },
+       { "pll_a_out0", "pll_a",        11289600,       true },
+       { "cdev1",      NULL,           0,              true },
+       { "i2s1",       "pll_a_out0",   11289600,       false},
        { NULL,         NULL,           0,              0},
 };
 
@@ -112,6 +165,9 @@ static void __init tegra_trimslice_init(void)
        tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
 
        platform_add_devices(trimslice_devices, ARRAY_SIZE(trimslice_devices));
+
+       trimslice_i2c_init();
+       trimslice_usb_init();
 }
 
 MACHINE_START(TRIMSLICE, "trimslice")
index e8ef6291c6f1945e7f7c8e8f51ef36749b8e0c7e..7a7dee86b4da717a3ac00982f31674754c50c924 100644 (file)
@@ -20,6 +20,9 @@
 #define TRIMSLICE_GPIO_SD4_CD  TEGRA_GPIO_PP1  /* mmc4 cd */
 #define TRIMSLICE_GPIO_SD4_WP  TEGRA_GPIO_PP2  /* mmc4 wp */
 
+#define TRIMSLICE_GPIO_USB1_MODE       TEGRA_GPIO_PV2 /* USB1 mode */
+#define TRIMSLICE_GPIO_USB2_RST                TEGRA_GPIO_PV0 /* USB2 PHY reset */
+
 void trimslice_pinmux_init(void);
 
 #endif
index 1528f9daef1f2087cc7383b39dd0a3ed3fa8ce07..57e35d20c24cf495e1e1e3863d691b28b4d37c46 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/fsl_devices.h>
 #include <linux/serial_8250.h>
+#include <linux/i2c-tegra.h>
+#include <linux/platform_data/tegra_usb.h>
 #include <asm/pmu.h>
 #include <mach/irqs.h>
 #include <mach/iomap.h>
 #include <mach/dma.h>
+#include <mach/usb_phy.h>
+#include "gpio-names.h"
 
 static struct resource i2c_resource1[] = {
        [0] = {
@@ -79,13 +83,29 @@ static struct resource i2c_resource4[] = {
        },
 };
 
+static struct tegra_i2c_platform_data tegra_i2c1_platform_data = {
+       .bus_clk_rate   = 400000,
+};
+
+static struct tegra_i2c_platform_data tegra_i2c2_platform_data = {
+       .bus_clk_rate   = 400000,
+};
+
+static struct tegra_i2c_platform_data tegra_i2c3_platform_data = {
+       .bus_clk_rate   = 400000,
+};
+
+static struct tegra_i2c_platform_data tegra_dvc_platform_data = {
+       .bus_clk_rate   = 400000,
+};
+
 struct platform_device tegra_i2c_device1 = {
        .name           = "tegra-i2c",
        .id             = 0,
        .resource       = i2c_resource1,
        .num_resources  = ARRAY_SIZE(i2c_resource1),
        .dev = {
-               .platform_data = 0,
+               .platform_data = &tegra_i2c1_platform_data,
        },
 };
 
@@ -95,7 +115,7 @@ struct platform_device tegra_i2c_device2 = {
        .resource       = i2c_resource2,
        .num_resources  = ARRAY_SIZE(i2c_resource2),
        .dev = {
-               .platform_data = 0,
+               .platform_data = &tegra_i2c2_platform_data,
        },
 };
 
@@ -105,7 +125,7 @@ struct platform_device tegra_i2c_device3 = {
        .resource       = i2c_resource3,
        .num_resources  = ARRAY_SIZE(i2c_resource3),
        .dev = {
-               .platform_data = 0,
+               .platform_data = &tegra_i2c3_platform_data,
        },
 };
 
@@ -115,7 +135,7 @@ struct platform_device tegra_i2c_device4 = {
        .resource       = i2c_resource4,
        .num_resources  = ARRAY_SIZE(i2c_resource4),
        .dev = {
-               .platform_data = 0,
+               .platform_data = &tegra_dvc_platform_data,
        },
 };
 
@@ -334,6 +354,28 @@ static struct resource tegra_usb3_resources[] = {
        },
 };
 
+static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
+       /* All existing boards use GPIO PV0 for phy reset */
+       .reset_gpio = TEGRA_GPIO_PV0,
+       .clk = "cdev2",
+};
+
+static struct tegra_ehci_platform_data tegra_ehci1_pdata = {
+       .operating_mode = TEGRA_USB_OTG,
+       .power_down_on_bus_suspend = 1,
+};
+
+static struct tegra_ehci_platform_data tegra_ehci2_pdata = {
+       .phy_config = &tegra_ehci2_ulpi_phy_config,
+       .operating_mode = TEGRA_USB_HOST,
+       .power_down_on_bus_suspend = 1,
+};
+
+static struct tegra_ehci_platform_data tegra_ehci3_pdata = {
+       .operating_mode = TEGRA_USB_HOST,
+       .power_down_on_bus_suspend = 1,
+};
+
 static u64 tegra_ehci_dmamask = DMA_BIT_MASK(32);
 
 struct platform_device tegra_ehci1_device = {
@@ -342,6 +384,7 @@ struct platform_device tegra_ehci1_device = {
        .dev    = {
                .dma_mask       = &tegra_ehci_dmamask,
                .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = &tegra_ehci1_pdata,
        },
        .resource = tegra_usb1_resources,
        .num_resources = ARRAY_SIZE(tegra_usb1_resources),
@@ -353,6 +396,7 @@ struct platform_device tegra_ehci2_device = {
        .dev    = {
                .dma_mask       = &tegra_ehci_dmamask,
                .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = &tegra_ehci2_pdata,
        },
        .resource = tegra_usb2_resources,
        .num_resources = ARRAY_SIZE(tegra_usb2_resources),
@@ -364,6 +408,7 @@ struct platform_device tegra_ehci3_device = {
        .dev    = {
                .dma_mask       = &tegra_ehci_dmamask,
                .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = &tegra_ehci3_pdata,
        },
        .resource = tegra_usb3_resources,
        .num_resources = ARRAY_SIZE(tegra_usb3_resources),
diff --git a/arch/arm/mach-tegra/include/mach/barriers.h b/arch/arm/mach-tegra/include/mach/barriers.h
deleted file mode 100644 (file)
index 425b42e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * arch/arm/mach-realview/include/mach/barriers.h
- *
- * Copyright (C) 2010 ARM Ltd.
- * Written by Catalin Marinas <catalin.marinas@arm.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __MACH_BARRIERS_H
-#define __MACH_BARRIERS_H
-
-#include <asm/outercache.h>
-
-#define rmb()          dsb()
-#define wmb()          do { dsb(); outer_sync(); } while (0)
-#define mb()           wmb()
-
-#endif /* __MACH_BARRIERS_H */
index b8ae3c978dee30a26ce8ca4df3828714c3551f87..468523c72b431523ef6cc87c8aa3135a89289d06 100644 (file)
@@ -122,7 +122,7 @@ void __init smp_init_cpus(void)
        }
 
        for (i = 0; i < ncores; i++)
-               cpu_set(i, cpu_possible_map);
+               set_cpu_possible(i, true);
 
        set_smp_cross_call(gic_raise_softirq);
 }
index bb618075fab67911b97bf757147cc85b425bc40d..0fe9b3ee294768b7c44efc90c6a012e18f5c15d9 100644 (file)
@@ -2182,8 +2182,8 @@ struct clk tegra_list_clks[] = {
        PERIPH_CLK("tvo",       "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
        PERIPH_CLK("hdmi",      "hdmi",                 NULL,   51,     0x18c,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
        PERIPH_CLK("tvdac",     "tvdac",                NULL,   53,     0x194,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("disp1",     "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("disp2",     "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* scales with voltage and process_id */
+       PERIPH_CLK("disp1",     "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_plld_pllc_clkm,     MUX), /* scales with voltage and process_id */
+       PERIPH_CLK("disp2",     "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_plld_pllc_clkm,     MUX), /* scales with voltage and process_id */
        PERIPH_CLK("usbd",      "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
        PERIPH_CLK("usb2",      "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
        PERIPH_CLK("usb3",      "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
index 5767208f1c1dc5ac99bce10b73b5a4c799b8edb8..7b597e2b19e2aa724d238f04a8b6b503e0ea67aa 100644 (file)
@@ -40,8 +40,8 @@ struct pl022_config_chip dummy_chip_info = {
        .hierarchy = SSP_MASTER,
        /* 0 = drive TX even as slave, 1 = do not drive TX as slave */
        .slave_tx_disable = 0,
-       .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM,
-       .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC,
+       .rx_lev_trig = SSP_RX_4_OR_MORE_ELEM,
+       .tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC,
        .ctrl_len = SSP_BITS_12,
        .wait_state = SSP_MWIRE_WAIT_ZERO,
        .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX,
index 18d7fa0603c230259ff96d3f9dc910b4a53a3b04..5f51bdeef0ef1dd0a8cdb824dc35ad5f924a7d24 100644 (file)
@@ -27,9 +27,6 @@
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
 
-/* Be able to sleep for atleast 4 seconds (usually more) */
-#define APPTIMER_MIN_RANGE 4
-
 /*
  * APP side special timer registers
  * This timer contains four timers which can fire an interrupt each.
@@ -309,11 +306,11 @@ static int u300_set_next_event(unsigned long cycles,
 
 /* Use general purpose timer 1 as clock event */
 static struct clock_event_device clockevent_u300_1mhz = {
-       .name           = "GPT1",
-       .rating         = 300, /* Reasonably fast and accurate clock event */
-       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-       .set_next_event = u300_set_next_event,
-       .set_mode       = u300_set_mode,
+       .name           = "GPT1",
+       .rating         = 300, /* Reasonably fast and accurate clock event */
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_next_event = u300_set_next_event,
+       .set_mode       = u300_set_mode,
 };
 
 /* Clock event timer interrupt handler */
@@ -328,9 +325,9 @@ static irqreturn_t u300_timer_interrupt(int irq, void *dev_id)
 }
 
 static struct irqaction u300_timer_irq = {
-       .name           = "U300 Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler        = u300_timer_interrupt,
+       .name           = "U300 Timer Tick",
+       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+       .handler        = u300_timer_interrupt,
 };
 
 /*
@@ -413,16 +410,10 @@ static void __init u300_timer_init(void)
                        "GPT2", rate, 300, 32, clocksource_mmio_readl_up))
                pr_err("timer: failed to initialize U300 clock source\n");
 
-       clockevents_calc_mult_shift(&clockevent_u300_1mhz,
-                                   rate, APPTIMER_MIN_RANGE);
-       /* 32bit counter, so 32bits delta is max */
-       clockevent_u300_1mhz.max_delta_ns =
-               clockevent_delta2ns(0xffffffff, &clockevent_u300_1mhz);
-       /* This timer is slow enough to set for 1 cycle == 1 MHz */
-       clockevent_u300_1mhz.min_delta_ns =
-               clockevent_delta2ns(1, &clockevent_u300_1mhz);
-       clockevent_u300_1mhz.cpumask = cpumask_of(0);
-       clockevents_register_device(&clockevent_u300_1mhz);
+       /* Configure and register the clockevent */
+       clockevents_config_and_register(&clockevent_u300_1mhz, rate,
+                                       1, 0xffffffff);
+
        /*
         * TODO: init and register the rest of the timers too, they can be
         * used by hrtimers!
index f8b9392ee3471b7628a7f8fcfd7ce50d7d52f269..4210cb434dbc6be30badd18e0caf10144f9bfbbb 100644 (file)
@@ -20,7 +20,7 @@ config UX500_SOC_DB8500
 
 endmenu
 
-menu "Ux500 target platform"
+menu "Ux500 target platform (boards)"
 
 config MACH_U8500
        bool "U8500 Development platform"
@@ -29,6 +29,19 @@ config MACH_U8500
        help
          Include support for the mop500 development platform.
 
+config MACH_HREFV60
+       bool "U85000 Development platform, HREFv60 version"
+       depends on UX500_SOC_DB8500
+       help
+         Include support for the HREFv60 new development platform.
+
+config MACH_SNOWBALL
+       bool "U8500 Snowball platform"
+       depends on UX500_SOC_DB8500
+       select MACH_U8500
+       help
+         Include support for the snowball development platform.
+
 config MACH_U5500
        bool "U5500 Development platform"
        depends on UX500_SOC_DB5500
index 70cdbd60596a906d3c6264a4610c3151f4aaa14d..f26fd76f72b4f26301b2af1226664c4767ae6b86 100644 (file)
@@ -236,6 +236,46 @@ static pin_cfg_t mop500_pins_hrefv60[] = {
 
 };
 
+static pin_cfg_t snowball_pins[] = {
+       /* SSP0, to AB8500 */
+       GPIO143_SSP0_CLK,
+       GPIO144_SSP0_FRM,
+       GPIO145_SSP0_RXD        | PIN_PULL_DOWN,
+       GPIO146_SSP0_TXD,
+
+       /* MMC0: MicroSD card */
+       GPIO21_MC0_DAT31DIR     | PIN_OUTPUT_HIGH,
+
+       /* MMC2: LAN */
+       GPIO86_SM_ADQ0,
+       GPIO87_SM_ADQ1,
+       GPIO88_SM_ADQ2,
+       GPIO89_SM_ADQ3,
+       GPIO90_SM_ADQ4,
+       GPIO91_SM_ADQ5,
+       GPIO92_SM_ADQ6,
+       GPIO93_SM_ADQ7,
+
+       GPIO94_SM_ADVn,
+       GPIO95_SM_CS0n,
+       GPIO96_SM_OEn,
+       GPIO97_SM_WEn,
+
+       GPIO128_SM_CKO,
+       GPIO130_SM_FBCLK,
+       GPIO131_SM_ADQ8,
+       GPIO132_SM_ADQ9,
+       GPIO133_SM_ADQ10,
+       GPIO134_SM_ADQ11,
+       GPIO135_SM_ADQ12,
+       GPIO136_SM_ADQ13,
+       GPIO137_SM_ADQ14,
+       GPIO138_SM_ADQ15,
+
+       /* RSTn_LAN */
+       GPIO141_GPIO            | PIN_OUTPUT_HIGH,
+};
+
 void __init mop500_pins_init(void)
 {
        nmk_config_pins(mop500_pins_common,
@@ -243,6 +283,9 @@ void __init mop500_pins_init(void)
        if (machine_is_hrefv60())
                nmk_config_pins(mop500_pins_hrefv60,
                                ARRAY_SIZE(mop500_pins_hrefv60));
+       else if (machine_is_snowball())
+               nmk_config_pins(snowball_pins,
+                               ARRAY_SIZE(snowball_pins));
        else
                nmk_config_pins(mop500_pins_default,
                                ARRAY_SIZE(mop500_pins_default));
index 9ed0f90cfe2368d33dc89f1b2a8679c69a8ddd8d..c0bc833df9032c60efdada89bfa4c64d0685ff7c 100644 (file)
@@ -272,7 +272,14 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
                        .max_uV = 2900000,
                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
                                          REGULATOR_CHANGE_STATUS,
-                       .boot_on = 1, /* must be on for display */
+                       .boot_on = 1, /* display is on at boot */
+                       /*
+                        * This voltage cannot be disabled right now because
+                        * it is somehow affecting the external MMC
+                        * functionality, though that typically will use
+                        * AUX3.
+                        */
+                       .always_on = 1,
                },
                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
                .consumer_supplies = ab8500_vaux1_consumers,
index 7c6cb4fa47a937211b16917cd63d5ac008bd574c..d0cb9e5eb87c344deac47cad41d782f1b82abd45 100644 (file)
 #define MCI_DATA31DIREN                (1 << 5)
 #define MCI_FBCLKEN            (1 << 7)
 
+/* GPIO pins used by the sdi0 level shifter */
+static int sdi0_en = -1;
+static int sdi0_vsel = -1;
+
 static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd,
                                   unsigned char power_mode)
 {
-       if (power_mode == MMC_POWER_UP)
-               gpio_set_value_cansleep(GPIO_SDMMC_EN, 1);
-       else if (power_mode == MMC_POWER_OFF)
-               gpio_set_value_cansleep(GPIO_SDMMC_EN, 0);
+       switch (power_mode) {
+       case MMC_POWER_UP:
+       case MMC_POWER_ON:
+               /*
+                * Level shifter voltage should depend on vdd to when deciding
+                * on either 1.8V or 2.9V. Once the decision has been made the
+                * level shifter must be disabled and re-enabled with a changed
+                * select signal in order to switch the voltage. Since there is
+                * no framework support yet for indicating 1.8V in vdd, use the
+                * default 2.9V.
+                */
+               gpio_direction_output(sdi0_vsel, 0);
+               gpio_direction_output(sdi0_en, 1);
+               break;
+       case MMC_POWER_OFF:
+               gpio_direction_output(sdi0_vsel, 0);
+               gpio_direction_output(sdi0_en, 0);
+               break;
+       }
 
        return MCI_FBCLKEN | MCI_CMDDIREN | MCI_DATA0DIREN |
               MCI_DATA2DIREN | MCI_DATA31DIREN;
@@ -67,8 +86,10 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
 static struct mmci_platform_data mop500_sdi0_data = {
        .vdd_handler    = mop500_sdi0_vdd_handler,
        .ocr_mask       = MMC_VDD_29_30,
-       .f_max          = 100000000,
-       .capabilities   = MMC_CAP_4_BIT_DATA,
+       .f_max          = 50000000,
+       .capabilities   = MMC_CAP_4_BIT_DATA |
+                               MMC_CAP_SD_HIGHSPEED |
+                               MMC_CAP_MMC_HIGHSPEED,
        .gpio_wp        = -1,
 #ifdef CONFIG_STE_DMA40
        .dma_filter     = stedma40_filter,
@@ -77,10 +98,6 @@ static struct mmci_platform_data mop500_sdi0_data = {
 #endif
 };
 
-/* GPIO pins used by the sdi0 level shifter */
-static int sdi0_en = -1;
-static int sdi0_vsel = -1;
-
 static void sdi0_configure(void)
 {
        int ret;
@@ -140,7 +157,7 @@ static struct stedma40_chan_cfg mop500_sdi2_dma_cfg_tx = {
 
 static struct mmci_platform_data mop500_sdi2_data = {
        .ocr_mask       = MMC_VDD_165_195,
-       .f_max          = 100000000,
+       .f_max          = 50000000,
        .capabilities   = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
        .gpio_cd        = -1,
        .gpio_wp        = -1,
@@ -177,7 +194,7 @@ static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = {
 
 static struct mmci_platform_data mop500_sdi4_data = {
        .ocr_mask       = MMC_VDD_29_30,
-       .f_max          = 100000000,
+       .f_max          = 50000000,
        .capabilities   = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA |
                          MMC_CAP_MMC_HIGHSPEED,
        .gpio_cd        = -1,
@@ -199,17 +216,27 @@ void __init mop500_sdi_init(void)
        /* PoP:ed eMMC on top of DB8500 v1.0 has problems with high speed */
        if (!cpu_is_u8500v10())
                mop500_sdi2_data.capabilities |= MMC_CAP_MMC_HIGHSPEED;
-       db8500_add_sdi2(&mop500_sdi2_data, periphid);
+       /* sdi2 on snowball is in ATL_B mode for FSMC (LAN) */
+       if (!machine_is_snowball())
+               db8500_add_sdi2(&mop500_sdi2_data, periphid);
 
        /* On-board eMMC */
        db8500_add_sdi4(&mop500_sdi4_data, periphid);
 
-       if (machine_is_hrefv60()) {
-               mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO;
-               sdi0_en = HREFV60_SDMMC_EN_GPIO;
-               sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO;
+       if (machine_is_hrefv60() || machine_is_snowball()) {
+               if (machine_is_hrefv60()) {
+                       mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO;
+                       sdi0_en = HREFV60_SDMMC_EN_GPIO;
+                       sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO;
+               } else if (machine_is_snowball()) {
+                       mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO;
+                       mop500_sdi0_data.cd_invert = true;
+                       sdi0_en = SNOWBALL_SDMMC_EN_GPIO;
+                       sdi0_vsel = SNOWBALL_SDMMC_1V8_3V_GPIO;
+               }
                sdi0_configure();
        }
+
        /*
         * On boards with the TC35892 GPIO expander, sdi0 will finally
         * be added when the TC35892 initializes and calls
index 69cce41f602a2243c131dc51b3b6bfb8b5f516a3..5af36aa56c08c140f899c702537ca0867d6f135c 100644 (file)
@@ -25,7 +25,7 @@ struct uib {
        void (*init)(void);
 };
 
-static struct __initdata uib mop500_uibs[] = {
+static struct uib __initdata mop500_uibs[] = {
        [STUIB] = {
                .name   = "ST-UIB",
                .option = "stuib",
index 2a08c07dec6dfd3c9d44cb837f4f43e01ea75e77..cd54abaccd96460e1a821d574223887dedb82f86 100644 (file)
 #include <linux/mfd/ab8500/gpio.h>
 #include <linux/leds-lp5521.h>
 #include <linux/input.h>
+#include <linux/smsc911x.h>
 #include <linux/gpio_keys.h>
 #include <linux/delay.h>
 
+#include <linux/leds.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
 #include "board-mop500.h"
 #include "board-mop500-regulators.h"
 
+static struct gpio_led snowball_led_array[] = {
+       {
+               .name = "user_led",
+               .default_trigger = "none",
+               .gpio = 142,
+       },
+};
+
+static struct gpio_led_platform_data snowball_led_data = {
+       .leds = snowball_led_array,
+       .num_leds = ARRAY_SIZE(snowball_led_array),
+};
+
+static struct platform_device snowball_led_dev = {
+       .name = "leds-gpio",
+       .dev = {
+               .platform_data = &snowball_led_data,
+       },
+};
+
 static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
        .gpio_base              = MOP500_AB8500_GPIO(0),
        .irq_base               = MOP500_AB8500_VIR_GPIO_IRQ_BASE,
@@ -69,6 +91,97 @@ static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
                                        0x7A, 0x00, 0x00},
 };
 
+static struct gpio_keys_button snowball_key_array[] = {
+       {
+               .gpio           = 32,
+               .type           = EV_KEY,
+               .code           = KEY_1,
+               .desc           = "userpb",
+               .active_low     = 1,
+               .debounce_interval = 50,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = 151,
+               .type           = EV_KEY,
+               .code           = KEY_2,
+               .desc           = "extkb1",
+               .active_low     = 1,
+               .debounce_interval = 50,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = 152,
+               .type           = EV_KEY,
+               .code           = KEY_3,
+               .desc           = "extkb2",
+               .active_low     = 1,
+               .debounce_interval = 50,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = 161,
+               .type           = EV_KEY,
+               .code           = KEY_4,
+               .desc           = "extkb3",
+               .active_low     = 1,
+               .debounce_interval = 50,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = 162,
+               .type           = EV_KEY,
+               .code           = KEY_5,
+               .desc           = "extkb4",
+               .active_low     = 1,
+               .debounce_interval = 50,
+               .wakeup         = 1,
+       },
+};
+
+static struct gpio_keys_platform_data snowball_key_data = {
+       .buttons        = snowball_key_array,
+       .nbuttons       = ARRAY_SIZE(snowball_key_array),
+};
+
+static struct platform_device snowball_key_dev = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &snowball_key_data,
+       }
+};
+
+static struct smsc911x_platform_config snowball_sbnet_cfg = {
+       .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
+       .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
+       .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
+       .shift = 1,
+};
+
+static struct resource sbnet_res[] = {
+       {
+               .name = "smsc911x-memory",
+               .start = (0x5000 << 16),
+               .end  =  (0x5000 << 16) + 0xffff,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = NOMADIK_GPIO_TO_IRQ(140),
+               .end = NOMADIK_GPIO_TO_IRQ(140),
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       },
+};
+
+static struct platform_device snowball_sbnet_dev = {
+       .name           = "smsc911x",
+       .num_resources  = ARRAY_SIZE(sbnet_res),
+       .resource       = sbnet_res,
+       .dev            = {
+               .platform_data = &snowball_sbnet_cfg,
+       },
+};
+
 static struct ab8500_platform_data ab8500_platdata = {
        .irq_base       = MOP500_AB8500_IRQ_BASE,
        .regulator_reg_init = ab8500_regulator_reg_init,
@@ -295,8 +408,9 @@ static void mop500_prox_deactivate(struct device *dev)
 }
 
 /* add any platform devices here - TODO */
-static struct platform_device *platform_devs[] __initdata = {
+static struct platform_device *mop500_platform_devs[] __initdata = {
        &mop500_gpio_keys_device,
+       &ab8500_device,
 };
 
 #ifdef CONFIG_STE_DMA40
@@ -478,6 +592,13 @@ static void __init mop500_uart_init(void)
        db8500_add_uart2(&uart2_plat);
 }
 
+static struct platform_device *snowball_platform_devs[] __initdata = {
+       &snowball_led_dev,
+       &snowball_key_dev,
+       &snowball_sbnet_dev,
+       &ab8500_device,
+};
+
 static void __init mop500_init_machine(void)
 {
        int i2c0_devs;
@@ -487,24 +608,29 @@ static void __init mop500_init_machine(void)
         * all these GPIO pins to the internal GPIO controller
         * instead.
         */
-       if (machine_is_hrefv60())
-               mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
-       else
-               mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
+       if (!machine_is_snowball()) {
+               if (machine_is_hrefv60())
+                       mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
+               else
+                       mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
+       }
 
        u8500_init_devices();
 
        mop500_pins_init();
 
-       platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
+       if (machine_is_snowball())
+               platform_add_devices(snowball_platform_devs,
+                                       ARRAY_SIZE(snowball_platform_devs));
+       else
+               platform_add_devices(mop500_platform_devs,
+                                       ARRAY_SIZE(mop500_platform_devs));
 
        mop500_i2c_init();
        mop500_sdi_init();
        mop500_spi_init();
        mop500_uart_init();
 
-       platform_device_register(&ab8500_device);
-
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
        if (machine_is_hrefv60())
                i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
@@ -512,6 +638,9 @@ static void __init mop500_init_machine(void)
        i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
        i2c_register_board_info(2, mop500_i2c2_devices,
                                ARRAY_SIZE(mop500_i2c2_devices));
+
+       /* This board has full regulator constraints */
+       regulator_has_full_constraints();
 }
 
 MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
@@ -531,3 +660,12 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
        .timer          = &ux500_timer,
        .init_machine   = mop500_init_machine,
 MACHINE_END
+
+MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
+       .boot_params    = 0x100,
+       .map_io         = u8500_map_io,
+       .init_irq       = ux500_init_irq,
+       /* we re-use nomadik timer here */
+       .timer          = &ux500_timer,
+       .init_machine   = mop500_init_machine,
+MACHINE_END
index 03a31cc9b0841243c48fd57cbe555b1507a68efe..ee77a8970c33b0d47e8300e7d4043e04eebbbe77 100644 (file)
@@ -7,6 +7,11 @@
 #ifndef __BOARD_MOP500_H
 #define __BOARD_MOP500_H
 
+/* snowball GPIO for MMC card */
+#define SNOWBALL_SDMMC_EN_GPIO 217
+#define SNOWBALL_SDMMC_1V8_3V_GPIO 228
+#define SNOWBALL_SDMMC_CD_GPIO 218
+
 /* HREFv60-specific GPIO assignments, this board has no GPIO expander */
 #define HREFV60_TOUCH_RST_GPIO         143
 #define HREFV60_PROX_SENSE_GPIO                217
index 32ce90840ee1509dbc877a037298b956ea18b4ba..b4e786a0fa4f9db597a8b20e0e7f6bfd7b4779c1 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/clkdev.h>
+#include <linux/cpufreq.h>
 
 #include <plat/mtu.h>
 #include <mach/hardware.h>
@@ -759,6 +760,51 @@ err_out:
 late_initcall(clk_debugfs_init);
 #endif /* defined(CONFIG_DEBUG_FS) */
 
+unsigned long clk_smp_twd_rate = 400000000;
+
+unsigned long clk_smp_twd_get_rate(struct clk *clk)
+{
+       return clk_smp_twd_rate;
+}
+
+static struct clk clk_smp_twd = {
+       .get_rate = clk_smp_twd_get_rate,
+       .name =  "smp_twd",
+};
+
+static struct clk_lookup clk_smp_twd_lookup = {
+       .dev_id = "smp_twd",
+       .clk = &clk_smp_twd,
+};
+
+#ifdef CONFIG_CPU_FREQ
+
+static int clk_twd_cpufreq_transition(struct notifier_block *nb,
+                                     unsigned long state, void *data)
+{
+       struct cpufreq_freqs *f = data;
+
+       if (state == CPUFREQ_PRECHANGE) {
+               /* Save frequency in simple Hz */
+               clk_smp_twd_rate = f->new * 1000;
+       }
+
+       return NOTIFY_OK;
+}
+
+static struct notifier_block clk_twd_cpufreq_nb = {
+       .notifier_call = clk_twd_cpufreq_transition,
+};
+
+static int clk_init_smp_twd_cpufreq(void)
+{
+       return cpufreq_register_notifier(&clk_twd_cpufreq_nb,
+                                 CPUFREQ_TRANSITION_NOTIFIER);
+}
+late_initcall(clk_init_smp_twd_cpufreq);
+
+#endif
+
 int __init clk_init(void)
 {
        if (cpu_is_u8500ed()) {
@@ -779,6 +825,8 @@ int __init clk_init(void)
        else
                clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks));
 
+       clkdev_add(&clk_smp_twd_lookup);
+
 #ifdef CONFIG_DEBUG_FS
        clk_debugfs_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks));
        if (cpu_is_u8500ed())
index c01bc19e3c5eac6c51d3adf1cffb13333a29047b..22705d246fc7ee8262858f46e521a1bd86276f27 100644 (file)
@@ -44,6 +44,7 @@ static struct map_desc u5500_io_desc[] __initdata = {
        __IO_DEV_DESC(U5500_GPIO3_BASE, SZ_4K),
        __IO_DEV_DESC(U5500_GPIO4_BASE, SZ_4K),
        __IO_DEV_DESC(U5500_PRCMU_BASE, SZ_4K),
+       __IO_DEV_DESC(U5500_PRCMU_TCDM_BASE, SZ_4K),
 };
 
 static struct resource db5500_pmu_resources[] = {
index 088b550c40df5f12b6e01baee83cd88a67deca9c..7dd08074c37b6adfce0437aa80f017ea923ac8e9 100644 (file)
@@ -54,7 +54,8 @@ static inline void arch_decomp_setup(void)
        if (machine_is_u8500() ||
            machine_is_svp8500v1() ||
            machine_is_svp8500v2() ||
-           machine_is_hrefv60())
+           machine_is_hrefv60()   ||
+           machine_is_snowball())
                ux500_uart_base = U8500_UART2_BASE;
        else if (machine_is_u5500())
                ux500_uart_base = U5500_UART0_BASE;
index 82e535953fd978cd786336661af6c398b4d5c47f..0a01cbdfe06339492c8aa21632d3223af3bf4ef1 100644 (file)
@@ -6,6 +6,7 @@
  */
 #include <linux/platform_device.h>
 #include <linux/usb/musb.h>
+#include <linux/dma-mapping.h>
 #include <plat/ste_dma40.h>
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 0074b8dba793d6b9c54cd0869ab7f40535f7e07d..cb26d49a8cd671266ec585b8bf2a6672470cbde7 100644 (file)
@@ -821,7 +821,7 @@ config CACHE_L2X0
        depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \
                   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \
                   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \
-                  ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE
+                  ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || ARCH_CNS3XXX
        default y
        select OUTER_CACHE
        select OUTER_CACHE_SYNC
index a1387875a491942949416789816f9f308c259280..d53c35fe2ea71cfb67f8684446b017457862e07b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 # Common support
-obj-y := clock.o gpio.o time.o devices.o cpu.o system.o irq-common.o
+obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o
 
 # MX51 uses the TZIC interrupt controller, older platforms use AVIC
 obj-$(CONFIG_MXC_TZIC) += tzic.o
index 09e2bd0fcdca742a41b004d3c846fa16b298a309..55d2534ec727e0d47a13235cb4eec9ab534e5657 100644 (file)
@@ -46,6 +46,8 @@
 #define AVIC_FIPNDH            0x60    /* fast int pending high */
 #define AVIC_FIPNDL            0x64    /* fast int pending low */
 
+#define AVIC_NUM_IRQS 64
+
 void __iomem *avic_base;
 
 #ifdef CONFIG_MXC_IRQ_PRIOR
@@ -54,7 +56,7 @@ static int avic_irq_set_priority(unsigned char irq, unsigned char prio)
        unsigned int temp;
        unsigned int mask = 0x0F << irq % 8 * 4;
 
-       if (irq >= MXC_INTERNAL_IRQS)
+       if (irq >= AVIC_NUM_IRQS)
                return -EINVAL;;
 
        temp = __raw_readl(avic_base + AVIC_NIPRIORITY(irq / 8));
@@ -72,14 +74,14 @@ static int avic_set_irq_fiq(unsigned int irq, unsigned int type)
 {
        unsigned int irqt;
 
-       if (irq >= MXC_INTERNAL_IRQS)
+       if (irq >= AVIC_NUM_IRQS)
                return -EINVAL;
 
-       if (irq < MXC_INTERNAL_IRQS / 2) {
+       if (irq < AVIC_NUM_IRQS / 2) {
                irqt = __raw_readl(avic_base + AVIC_INTTYPEL) & ~(1 << irq);
                __raw_writel(irqt | (!!type << irq), avic_base + AVIC_INTTYPEL);
        } else {
-               irq -= MXC_INTERNAL_IRQS / 2;
+               irq -= AVIC_NUM_IRQS / 2;
                irqt = __raw_readl(avic_base + AVIC_INTTYPEH) & ~(1 << irq);
                __raw_writel(irqt | (!!type << irq), avic_base + AVIC_INTTYPEH);
        }
@@ -138,7 +140,7 @@ 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 < MXC_INTERNAL_IRQS; i++) {
+       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);
index eee1b6096a0898ce869238cd5b421bca50a6e411..0d6ed31bdbf27c63a8af85949317fd2d2783a1f6 100644 (file)
@@ -89,3 +89,28 @@ err:
 
        return pdev;
 }
+
+struct device mxc_aips_bus = {
+       .init_name      = "mxc_aips",
+       .parent         = &platform_bus,
+};
+
+struct device mxc_ahb_bus = {
+       .init_name      = "mxc_ahb",
+       .parent         = &platform_bus,
+};
+
+static int __init mxc_device_init(void)
+{
+       int ret;
+
+       ret = device_register(&mxc_aips_bus);
+       if (IS_ERR_VALUE(ret))
+               goto done;
+
+       ret = device_register(&mxc_ahb_bus);
+
+done:
+       return ret;
+}
+core_initcall(mxc_device_init);
index ad2922acf480428976cecb8e01a1c4a54089ca78..b41bf972b54b6f837f1be2f53ab5f72fb47649b5 100644 (file)
@@ -2,6 +2,7 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_FEC) += platform-fec.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_FSL_USB2_UDC) += platform-fsl-usb2-udc.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_GPIO_KEYS) += platform-gpio_keys.o
+obj-y += platform-gpio-mxc.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX21_HCD) += platform-imx21-hcd.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX2_WDT) += platform-imx2-wdt.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IMXDI_RTC) += platform-imxdi_rtc.o
diff --git a/arch/arm/plat-mxc/devices/platform-gpio-mxc.c b/arch/arm/plat-mxc/devices/platform-gpio-mxc.c
new file mode 100644 (file)
index 0000000..cf1b7fd
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2011 Linaro Limited
+ *
+ * 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 <mach/devices-common.h>
+
+struct platform_device *__init mxc_register_gpio(int id,
+       resource_size_t iobase, resource_size_t iosize, int irq, int irq_high)
+{
+       struct resource res[] = {
+               {
+                       .start = iobase,
+                       .end = iobase + iosize - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = irq,
+                       .end = irq,
+                       .flags = IORESOURCE_IRQ,
+               }, {
+                       .start = irq_high,
+                       .end = irq_high,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return platform_device_register_resndata(&mxc_aips_bus,
+                       "gpio-mxc", id, res, ARRAY_SIZE(res), NULL, 0);
+}
index b130f60ca6b73e9b7b8435dcc52633bb1761078c..2b0fdb23beb873221531086c8fd14ef22e9631a9 100644 (file)
  * 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/hardware.h>
 #include <mach/devices-common.h>
-#include <mach/sdma.h>
-
-struct imx_imx_sdma_data {
-       resource_size_t iobase;
-       resource_size_t irq;
-       struct sdma_platform_data pdata;
-};
-
-#define imx_imx_sdma_data_entry_single(soc, _sdma_version, _cpu_name, _to_version)\
-       {                                                               \
-               .iobase = soc ## _SDMA ## _BASE_ADDR,                   \
-               .irq = soc ## _INT_SDMA,                                \
-               .pdata = {                                              \
-                       .sdma_version = _sdma_version,                  \
-                       .cpu_name = _cpu_name,                          \
-                       .to_version = _to_version,                      \
-               },                                                      \
-       }
-
-#ifdef CONFIG_SOC_IMX25
-struct imx_imx_sdma_data imx25_imx_sdma_data __initconst =
-       imx_imx_sdma_data_entry_single(MX25, 1, "imx25", 0);
-#endif /* ifdef CONFIG_SOC_IMX25 */
 
-#ifdef CONFIG_SOC_IMX31
-struct imx_imx_sdma_data imx31_imx_sdma_data __initdata =
-       imx_imx_sdma_data_entry_single(MX31, 1, "imx31", 0);
-#endif /* ifdef CONFIG_SOC_IMX31 */
-
-#ifdef CONFIG_SOC_IMX35
-struct imx_imx_sdma_data imx35_imx_sdma_data __initdata =
-       imx_imx_sdma_data_entry_single(MX35, 2, "imx35", 0);
-#endif /* ifdef CONFIG_SOC_IMX35 */
-
-#ifdef CONFIG_SOC_IMX51
-struct imx_imx_sdma_data imx51_imx_sdma_data __initconst =
-       imx_imx_sdma_data_entry_single(MX51, 2, "imx51", 0);
-#endif /* ifdef CONFIG_SOC_IMX51 */
+struct platform_device __init __maybe_unused *imx_add_imx_dma(void)
+{
+       return platform_device_register_resndata(&mxc_ahb_bus,
+                       "imx-dma", -1, NULL, 0, NULL, 0);
+}
 
-static struct platform_device __init __maybe_unused *imx_add_imx_sdma(
-               const struct imx_imx_sdma_data *data)
+struct platform_device __init __maybe_unused *imx_add_imx_sdma(
+       resource_size_t iobase, int irq, struct sdma_platform_data *pdata)
 {
        struct resource res[] = {
                {
-                       .start = data->iobase,
-                       .end = data->iobase + SZ_4K - 1,
+                       .start = iobase,
+                       .end = iobase + SZ_16K - 1,
                        .flags = IORESOURCE_MEM,
                }, {
-                       .start = data->irq,
-                       .end = data->irq,
+                       .start = irq,
+                       .end = irq,
                        .flags = IORESOURCE_IRQ,
                },
        };
 
-       return imx_add_platform_device("imx-sdma", -1,
-                       res, ARRAY_SIZE(res),
-                       &data->pdata, sizeof(data->pdata));
-}
-
-static struct platform_device __init __maybe_unused *imx_add_imx_dma(void)
-{
-       return imx_add_platform_device("imx-dma", -1, NULL, 0, NULL, 0);
-}
-
-#ifdef CONFIG_ARCH_MX25
-static struct sdma_script_start_addrs addr_imx25_to1 = {
-       .ap_2_ap_addr = 729,
-       .uart_2_mcu_addr = 904,
-       .per_2_app_addr = 1255,
-       .mcu_2_app_addr = 834,
-       .uartsh_2_mcu_addr = 1120,
-       .per_2_shp_addr = 1329,
-       .mcu_2_shp_addr = 1048,
-       .ata_2_mcu_addr = 1560,
-       .mcu_2_ata_addr = 1479,
-       .app_2_per_addr = 1189,
-       .app_2_mcu_addr = 770,
-       .shp_2_per_addr = 1407,
-       .shp_2_mcu_addr = 979,
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX31
-static struct sdma_script_start_addrs addr_imx31_to1 = {
-       .per_2_per_addr = 1677,
-};
-
-static struct sdma_script_start_addrs addr_imx31_to2 = {
-       .ap_2_ap_addr = 423,
-       .ap_2_bp_addr = 829,
-       .bp_2_ap_addr = 1029,
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX35
-static struct sdma_script_start_addrs addr_imx35_to1 = {
-       .ap_2_ap_addr = 642,
-       .uart_2_mcu_addr = 817,
-       .mcu_2_app_addr = 747,
-       .uartsh_2_mcu_addr = 1183,
-       .per_2_shp_addr = 1033,
-       .mcu_2_shp_addr = 961,
-       .ata_2_mcu_addr = 1333,
-       .mcu_2_ata_addr = 1252,
-       .app_2_mcu_addr = 683,
-       .shp_2_per_addr = 1111,
-       .shp_2_mcu_addr = 892,
-};
-
-static struct sdma_script_start_addrs addr_imx35_to2 = {
-       .ap_2_ap_addr = 729,
-       .uart_2_mcu_addr = 904,
-       .per_2_app_addr = 1597,
-       .mcu_2_app_addr = 834,
-       .uartsh_2_mcu_addr = 1270,
-       .per_2_shp_addr = 1120,
-       .mcu_2_shp_addr = 1048,
-       .ata_2_mcu_addr = 1429,
-       .mcu_2_ata_addr = 1339,
-       .app_2_per_addr = 1531,
-       .app_2_mcu_addr = 770,
-       .shp_2_per_addr = 1198,
-       .shp_2_mcu_addr = 979,
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX51
-static struct sdma_script_start_addrs addr_imx51 = {
-       .ap_2_ap_addr = 642,
-       .uart_2_mcu_addr = 817,
-       .mcu_2_app_addr = 747,
-       .mcu_2_shp_addr = 961,
-       .ata_2_mcu_addr = 1473,
-       .mcu_2_ata_addr = 1392,
-       .app_2_per_addr = 1033,
-       .app_2_mcu_addr = 683,
-       .shp_2_per_addr = 1251,
-       .shp_2_mcu_addr = 892,
-};
-#endif
-
-static int __init imxXX_add_imx_dma(void)
-{
-       struct platform_device *ret;
-
-#if defined(CONFIG_SOC_IMX21) || defined(CONFIG_SOC_IMX27)
-       if (cpu_is_mx21() || cpu_is_mx27())
-               ret = imx_add_imx_dma();
-       else
-#endif
-
-#if defined(CONFIG_SOC_IMX25)
-       if (cpu_is_mx25()) {
-               imx25_imx_sdma_data.pdata.script_addrs = &addr_imx25_to1;
-               ret = imx_add_imx_sdma(&imx25_imx_sdma_data);
-       } else
-#endif
-
-#if defined(CONFIG_SOC_IMX31)
-       if (cpu_is_mx31()) {
-               int to_version = mx31_revision() >> 4;
-               imx31_imx_sdma_data.pdata.to_version = to_version;
-               if (to_version == 1)
-                       imx31_imx_sdma_data.pdata.script_addrs = &addr_imx31_to1;
-               else
-                       imx31_imx_sdma_data.pdata.script_addrs = &addr_imx31_to2;
-               ret = imx_add_imx_sdma(&imx31_imx_sdma_data);
-       } else
-#endif
-
-#if defined(CONFIG_SOC_IMX35)
-       if (cpu_is_mx35()) {
-               int to_version = mx35_revision() >> 4;
-               imx35_imx_sdma_data.pdata.to_version = to_version;
-               if (to_version == 1)
-                       imx35_imx_sdma_data.pdata.script_addrs = &addr_imx35_to1;
-               else
-                       imx35_imx_sdma_data.pdata.script_addrs = &addr_imx35_to2;
-               ret = imx_add_imx_sdma(&imx35_imx_sdma_data);
-       } else
-#endif
-
-#if defined(CONFIG_SOC_IMX51)
-       if (cpu_is_mx51()) {
-               int to_version = mx51_revision() >> 4;
-               imx51_imx_sdma_data.pdata.to_version = to_version;
-               imx51_imx_sdma_data.pdata.script_addrs = &addr_imx51;
-               ret = imx_add_imx_sdma(&imx51_imx_sdma_data);
-       } else
-#endif
-               ret = ERR_PTR(-ENODEV);
-
-       if (IS_ERR(ret))
-               return PTR_ERR(ret);
-
-       return 0;
+       return platform_device_register_resndata(&mxc_ahb_bus, "imx-sdma",
+                       -1, res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
 }
-arch_initcall(imxXX_add_imx_dma);
index 2ab74f0da9a6eba27df1a6fea91fa2b288c6917d..afe60f7244a875765c02506acec4615c6c5e8123 100644 (file)
@@ -94,8 +94,9 @@ const struct imx_imx_i2c_data imx53_imx_i2c_data[] __initconst = {
        imx_imx_i2c_data_entry(MX53, _id, _hwid, SZ_4K)
        imx53_imx_i2c_data_entry(0, 1),
        imx53_imx_i2c_data_entry(1, 2),
+       imx53_imx_i2c_data_entry(2, 3),
 };
-#endif /* ifdef CONFIG_SOC_IMX51 */
+#endif /* ifdef CONFIG_SOC_IMX53 */
 
 struct platform_device *__init imx_add_imx_i2c(
                const struct imx_imx_i2c_data *data,
index 26366114b021aadc9cb49173de6c70c0d4e6227c..479c3e9f771f04be7105551e0286cda2a8dd21c3 100644 (file)
@@ -46,6 +46,11 @@ const struct imx_imx_keypad_data imx51_imx_keypad_data __initconst =
        imx_imx_keypad_data_entry_single(MX51, SZ_16);
 #endif /* ifdef CONFIG_SOC_IMX51 */
 
+#ifdef CONFIG_SOC_IMX53
+const struct imx_imx_keypad_data imx53_imx_keypad_data __initconst =
+       imx_imx_keypad_data_entry_single(MX53, SZ_16);
+#endif /* ifdef CONFIG_SOC_IMX53 */
+
 struct platform_device *__init imx_add_imx_keypad(
                const struct imx_imx_keypad_data *data,
                const struct matrix_keymap_data *pdata)
index 2569c8d8a2ef53e7ff4c1bd1894d8a11f15738c2..21c6f30e1017403c386f2694aed6aeb81fd33339 100644 (file)
@@ -69,13 +69,23 @@ const struct imx_imx_ssi_data imx35_imx_ssi_data[] __initconst = {
 #ifdef CONFIG_SOC_IMX51
 const struct imx_imx_ssi_data imx51_imx_ssi_data[] __initconst = {
 #define imx51_imx_ssi_data_entry(_id, _hwid)                           \
-       imx_imx_ssi_data_entry(MX51, _id, _hwid, SZ_4K)
+       imx_imx_ssi_data_entry(MX51, _id, _hwid, SZ_16K)
        imx51_imx_ssi_data_entry(0, 1),
        imx51_imx_ssi_data_entry(1, 2),
        imx51_imx_ssi_data_entry(2, 3),
 };
 #endif /* ifdef CONFIG_SOC_IMX51 */
 
+#ifdef CONFIG_SOC_IMX53
+const struct imx_imx_ssi_data imx53_imx_ssi_data[] __initconst = {
+#define imx53_imx_ssi_data_entry(_id, _hwid)                           \
+       imx_imx_ssi_data_entry(MX53, _id, _hwid, SZ_16K)
+       imx53_imx_ssi_data_entry(0, 1),
+       imx53_imx_ssi_data_entry(1, 2),
+       imx53_imx_ssi_data_entry(2, 3),
+};
+#endif /* ifdef CONFIG_SOC_IMX53 */
+
 struct platform_device *__init imx_add_imx_ssi(
                const struct imx_imx_ssi_data *data,
                const struct imx_ssi_platform_data *pdata)
index 3c854c2cc6ddc8be9c3ca4b28847937f684f1fc1..cfce8c918b73521e4261b3018cf55f11462113c8 100644 (file)
@@ -123,6 +123,8 @@ const struct imx_imx_uart_1irq_data imx53_imx_uart_data[] __initconst = {
        imx53_imx_uart_data_entry(0, 1),
        imx53_imx_uart_data_entry(1, 2),
        imx53_imx_uart_data_entry(2, 3),
+       imx53_imx_uart_data_entry(3, 4),
+       imx53_imx_uart_data_entry(4, 5),
 };
 #endif /* ifdef CONFIG_SOC_IMX53 */
 
index da7991832af671f022d4fed02f84168f82dbb0ce..91fa2632aa5e97175de043fc3e7647f1d082d488 100644 (file)
@@ -43,6 +43,15 @@ extern void mx35_init_irq(void);
 extern void mx50_init_irq(void);
 extern void mx51_init_irq(void);
 extern void mx53_init_irq(void);
+extern void imx1_soc_init(void);
+extern void imx21_soc_init(void);
+extern void imx25_soc_init(void);
+extern void imx27_soc_init(void);
+extern void imx31_soc_init(void);
+extern void imx35_soc_init(void);
+extern void imx50_soc_init(void);
+extern void imx51_soc_init(void);
+extern void imx53_soc_init(void);
 extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq);
 extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int);
 extern int mx1_clocks_init(unsigned long fref);
@@ -55,7 +64,8 @@ extern int mx51_clocks_init(unsigned long ckil, unsigned long osc,
                        unsigned long ckih1, unsigned long ckih2);
 extern int mx53_clocks_init(unsigned long ckil, unsigned long osc,
                        unsigned long ckih1, unsigned long ckih2);
-extern int mxc_register_gpios(void);
+extern struct platform_device *mxc_register_gpio(int id,
+       resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);
 extern int mxc_register_device(struct platform_device *pdev, void *data);
 extern void mxc_set_cpu_type(unsigned int type);
 extern void mxc_arch_reset_init(void __iomem *);
index 8e8d175e5077d991dda9c46313ccc6c6a7eb5b53..91fc7cdb5dc97309b143aae6f70c72a106977208 100644 (file)
  */
 #include <mach/hardware.h>
 
-#ifdef CONFIG_ARCH_MX1
+#ifdef CONFIG_SOC_IMX1
 #define UART_PADDR     MX1_UART1_BASE_ADDR
 #endif
 
-#ifdef CONFIG_ARCH_MX25
+#ifdef CONFIG_SOC_IMX25
 #ifdef UART_PADDR
 #error "CONFIG_DEBUG_LL is incompatible with multiple archs"
 #endif
 #define UART_PADDR     MX25_UART1_BASE_ADDR
 #endif
 
-#ifdef CONFIG_ARCH_MX2
+#if defined(CONFIG_SOC_IMX21) || defined (CONFIG_SOC_IMX27)
 #ifdef UART_PADDR
 #error "CONFIG_DEBUG_LL is incompatible with multiple archs"
 #endif
 #define UART_PADDR     MX2x_UART1_BASE_ADDR
 #endif
 
-#ifdef CONFIG_ARCH_MX3
+#if defined(CONFIG_SOC_IMX31) || defined(CONFIG_SOC_IMX35)
 #ifdef UART_PADDR
 #error "CONFIG_DEBUG_LL is incompatible with multiple archs"
 #endif
 #define UART_PADDR     MX3x_UART1_BASE_ADDR
 #endif
 
-#ifdef CONFIG_ARCH_MX5
+#ifdef CONFIG_SOC_IMX51
 #ifdef UART_PADDR
 #error "CONFIG_DEBUG_LL is incompatible with multiple archs"
 #endif
index fa8477337f9150f67641507da451416436989920..bf93820ab61cd03ac5f4c1d57fef094e388aa8cd 100644 (file)
@@ -9,6 +9,10 @@
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
+#include <mach/sdma.h>
+
+extern struct device mxc_aips_bus;
+extern struct device mxc_ahb_bus;
 
 struct platform_device *imx_add_platform_device_dmamask(
                const char *name, int id,
@@ -291,3 +295,7 @@ struct imx_spi_imx_data {
 struct platform_device *__init imx_add_spi_imx(
                const struct imx_spi_imx_data *data,
                const struct spi_imx_master *pdata);
+
+struct platform_device *imx_add_imx_dma(void);
+struct platform_device *imx_add_imx_sdma(
+       resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
index a2747f12813eb5fe6e9e9b743bad5f7522406315..31c820c1b7960eb3e0d64aa9dfc782f9c7e4ff00 100644 (file)
 #define gpio_to_irq(gpio)      (MXC_GPIO_IRQ_START + (gpio))
 #define irq_to_gpio(irq)       ((irq) - MXC_GPIO_IRQ_START)
 
-struct mxc_gpio_port {
-       void __iomem *base;
-       int irq;
-       int irq_high;
-       int virtual_irq_start;
-       struct gpio_chip chip;
-       u32 both_edges;
-       spinlock_t lock;
-};
-
-#define DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, _irq_high)        \
-       {                                                               \
-               .chip.label = "gpio-" #_id,                             \
-               .irq = _irq,                                            \
-               .irq_high = _irq_high,                                  \
-               .base = soc ## _IO_ADDRESS(                             \
-                               soc ## _GPIO ## _hwid ## _BASE_ADDR),   \
-               .virtual_irq_start = MXC_GPIO_IRQ_START + (_id) * 32,   \
-       }
-
-#define DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, _irq)                        \
-       DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, 0)
-#define DEFINE_IMX_GPIO_PORT(soc, _id, _hwid)                          \
-       DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, 0)
-
-int mxc_gpio_init(struct mxc_gpio_port*, int);
-
 #endif
index 67d3e2bed0656dfb6f94ac26e8c0cc998d5f2bdd..a8bfd565dcad2ba73f60695ac01bf97c9e90ba81 100644 (file)
 
 #include <mach/mxc.h>
 
-#ifdef CONFIG_ARCH_MX5
 #include <mach/mx50.h>
 #include <mach/mx51.h>
 #include <mach/mx53.h>
-#endif
-
-#ifdef CONFIG_ARCH_MX3
 #include <mach/mx3x.h>
 #include <mach/mx31.h>
 #include <mach/mx35.h>
-#endif
-
-#ifdef CONFIG_ARCH_MX2
-# include <mach/mx2x.h>
-# ifdef CONFIG_MACH_MX21
-#  include <mach/mx21.h>
-# endif
-# ifdef CONFIG_MACH_MX27
-#  include <mach/mx27.h>
-# endif
-#endif
-
-#ifdef CONFIG_ARCH_MX1
-# include <mach/mx1.h>
-#endif
-
-#ifdef CONFIG_ARCH_MX25
-# include <mach/mx25.h>
-#endif
+#include <mach/mx2x.h>
+#include <mach/mx21.h>
+#include <mach/mx27.h>
+#include <mach/mx1.h>
+#include <mach/mx25.h>
 
 #define imx_map_entry(soc, name, _type)        {                               \
        .virtual = soc ## _IO_P2V(soc ## _ ## name ## _BASE_ADDR),      \
index e95d9cb8aeb7fd02a210d96bd84dfef98540c87d..e11dd5f09c34457606c19f209dd9674d54b885fa 100644 (file)
@@ -39,7 +39,7 @@
 #define _MX53_PAD_GPIO_19__ECSPI1_RDY  IOMUX_PAD(0x348, 0x20, 5, 0x0, 0, 0)
 #define _MX53_PAD_GPIO_19__FEC_TDATA_3 IOMUX_PAD(0x348, 0x20, 6, 0x0, 0, 0)
 #define _MX53_PAD_GPIO_19__SRC_INT_BOOT        IOMUX_PAD(0x348, 0x20,7, 0x0, 0, 0)
-#define _MX53_PAD_KEY_COL0__KPP_COL_0  IOMUX_PAD(0x34C, 0x24, o, 0x0, 0, 0)
+#define _MX53_PAD_KEY_COL0__KPP_COL_0  IOMUX_PAD(0x34C, 0x24, 0, 0x0, 0, 0)
 #define _MX53_PAD_KEY_COL0__GPIO4_6            IOMUX_PAD(0x34C, 0x24, 1, 0x0, 0, 0)
 #define _MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC    IOMUX_PAD(0x34C, 0x24, 2, 0x758, 0, 0)
 #define _MX53_PAD_KEY_COL0__UART4_TXD_MUX      IOMUX_PAD(0x34C, 0x24, 4, 0x890, 0, 0)
 #define _MX53_PAD_EIM_DA5__GPIO3_5                     IOMUX_PAD(0x500, 0x1B0, 1, 0x0, 0, 0)
 #define _MX53_PAD_EIM_DA5__IPU_DISP1_DAT_4             IOMUX_PAD(0x500, 0x1B0, 3, 0x0, 0, 0)
 #define _MX53_PAD_EIM_DA5__IPU_CSI1_D_4                IOMUX_PAD(0x500, 0x1B0, 4, 0x0, 0, 0)
-#define _MX53_PAD_EIM_DA5__SRC_BT_CFG3_6               IOMUX_PAD(0x500, 0x1B0, 17, 0x0, 0, 0)
+#define _MX53_PAD_EIM_DA5__SRC_BT_CFG3_6               IOMUX_PAD(0x500, 0x1B0, 7 | IOMUX_CONFIG_SION, 0x0, 0, 0)
 #define _MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6  IOMUX_PAD(0x504, 0x1B4, 0, 0x0, 0, 0)
 #define _MX53_PAD_EIM_DA6__GPIO3_6                     IOMUX_PAD(0x504, 0x1B4, 1, 0x0, 0, 0)
 #define _MX53_PAD_EIM_DA6__IPU_DISP1_DAT_3             IOMUX_PAD(0x504, 0x1B4, 3, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA5__ESDHC4_DAT5              IOMUX_PAD(0x63C, 0x2B8, 4, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA5__GPU3d_GPU_DEBUG_OUT_5    IOMUX_PAD(0x63C, 0x2B8, 5, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA5__IPU_DIAG_BUS_5   IOMUX_PAD(0x63C, 0x2B8, 6, 0x0, 0, 0)
-#define _MX53_PAD_PATA_DATA6__PATA_DATA_6      IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
+#define _MX53_PAD_PATA_DATA6__PATA_DATA_6      IOMUX_PAD(0x640, 0x2BC, 0, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA6__GPIO2_6          IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
-#define _MX53_PAD_PATA_DATA6__EMI_NANDF_D_6    IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
-#define _MX53_PAD_PATA_DATA6__ESDHC4_DAT6              IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
-#define _MX53_PAD_PATA_DATA6__GPU3d_GPU_DEBUG_OUT_6    IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
-#define _MX53_PAD_PATA_DATA6__IPU_DIAG_BUS_6   IOMUX_PAD(0x640, 0x2BC, 1, 0x0, 0, 0)
+#define _MX53_PAD_PATA_DATA6__EMI_NANDF_D_6    IOMUX_PAD(0x640, 0x2BC, 3, 0x0, 0, 0)
+#define _MX53_PAD_PATA_DATA6__ESDHC4_DAT6              IOMUX_PAD(0x640, 0x2BC, 4, 0x0, 0, 0)
+#define _MX53_PAD_PATA_DATA6__GPU3d_GPU_DEBUG_OUT_6    IOMUX_PAD(0x640, 0x2BC, 5, 0x0, 0, 0)
+#define _MX53_PAD_PATA_DATA6__IPU_DIAG_BUS_6   IOMUX_PAD(0x640, 0x2BC, 6, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA7__PATA_DATA_7              IOMUX_PAD(0x644, 0x2C0, 0, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA7__GPIO2_7          IOMUX_PAD(0x644, 0x2C0, 1, 0x0, 0, 0)
 #define _MX53_PAD_PATA_DATA7__EMI_NANDF_D_7    IOMUX_PAD(0x644, 0x2C0, 3, 0x0, 0, 0)
index c07d30210c576c222c711d8d6c974f1c53c9f4fc..6fa8a707b9a0347778a0513f05c953f16defd70f 100644 (file)
@@ -85,9 +85,6 @@
 #define GPIO_BOUT_0    (2 << GPIO_BOUT_SHIFT)
 #define GPIO_BOUT_1    (3 << GPIO_BOUT_SHIFT)
 
-/* decode irq number to use with IMR(x), ISR(x) and friends */
-#define IRQ_TO_REG(irq) ((irq - MXC_INTERNAL_IRQS) >> 5)
-
 #define IRQ_GPIOA(x)  (MXC_GPIO_IRQ_START + x)
 #define IRQ_GPIOB(x)  (IRQ_GPIOA(32) + x)
 #define IRQ_GPIOC(x)  (IRQ_GPIOB(32) + x)
@@ -98,7 +95,6 @@
 extern int mxc_gpio_mode(int gpio_mode);
 extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
                const char *label);
-extern void mxc_gpio_release_multiple_pins(const int *pin_list, int count);
 
 extern int __init imx_iomuxv1_init(void __iomem *base, int numports);
 
index 82620af1922f981b749bfcd59b872638e3dd81e2..ebbce33097a76f81cae8696758ac713091279f88 100644 (file)
@@ -66,7 +66,6 @@ typedef u64 iomux_v3_cfg_t;
 #define MUX_MODE_MASK          ((iomux_v3_cfg_t)0x1f << MUX_MODE_SHIFT)
 #define MUX_PAD_CTRL_SHIFT     41
 #define MUX_PAD_CTRL_MASK      ((iomux_v3_cfg_t)0x1ffff << MUX_PAD_CTRL_SHIFT)
-#define NO_PAD_CTRL            ((iomux_v3_cfg_t)1 << (MUX_PAD_CTRL_SHIFT + 16))
 #define MUX_SEL_INPUT_SHIFT    58
 #define MUX_SEL_INPUT_MASK     ((iomux_v3_cfg_t)0xf << MUX_SEL_INPUT_SHIFT)
 
@@ -85,6 +84,7 @@ typedef u64 iomux_v3_cfg_t;
  * Use to set PAD control
  */
 
+#define NO_PAD_CTRL                    (1 << 16)
 #define PAD_CTL_DVS                    (1 << 13)
 #define PAD_CTL_HYS                    (1 << 8)
 
diff --git a/arch/arm/plat-mxc/include/mach/iomux.h b/arch/arm/plat-mxc/include/mach/iomux.h
deleted file mode 100644 (file)
index 3d226d7..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2010 Uwe Kleine-Koenig, Pengutronix
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- */
-#ifndef __MACH_IOMUX_H__
-#define __MACH_IOMUX_H__
-
-/* This file will go away, please include mach/iomux-mx... directly */
-
-#ifdef CONFIG_ARCH_MX1
-#include <mach/iomux-mx1.h>
-#endif
-#ifdef CONFIG_ARCH_MX2
-#include <mach/iomux-mx2x.h>
-#ifdef CONFIG_MACH_MX21
-#include <mach/iomux-mx21.h>
-#endif
-#ifdef CONFIG_MACH_MX27
-#include <mach/iomux-mx27.h>
-#endif
-#endif
-
-#endif /* __MACH_IOMUX_H__ */
index 9d2a1ef84de2104c873120dff2bf15be2a200b29..5e3c3236ebf3e804f2e68e717669a3da665943fc 100644 (file)
 /*
  * Memory regions and CS
  */
-#define MX53_CSD0_BASE_ADDR            0x90000000
-#define MX53_CSD1_BASE_ADDR            0xA0000000
-#define MX53_CS0_BASE_ADDR             0xB0000000
-#define MX53_CS1_BASE_ADDR             0xB8000000
-#define MX53_CS2_BASE_ADDR             0xC0000000
-#define MX53_CS3_BASE_ADDR             0xC8000000
-#define MX53_CS4_BASE_ADDR             0xCC000000
-#define MX53_CS5_BASE_ADDR             0xCE000000
+#define MX53_CSD0_BASE_ADDR            0x70000000
+#define MX53_CSD1_BASE_ADDR            0xB0000000
+#define MX53_CS0_BASE_ADDR             0xF0000000
+#define MX53_CS1_32MB_BASE_ADDR        0xF2000000
+#define MX53_CS1_64MB_BASE_ADDR                0xF4000000
+#define MX53_CS2_64MB_BASE_ADDR                0xF4000000
+#define MX53_CS2_96MB_BASE_ADDR                0xF6000000
+#define MX53_CS3_BASE_ADDR             0xF6000000
 
 #define MX53_IO_P2V(x)                 IMX_IO_P2V(x)
 #define MX53_IO_ADDRESS(x)             IOMEM(MX53_IO_P2V(x))
 /*
  * DMA request assignments
  */
-#define MX53_DMA_REQ_SSI3_TX1          47
-#define MX53_DMA_REQ_SSI3_RX1          46
-#define MX53_DMA_REQ_SSI3_TX2          45
-#define MX53_DMA_REQ_SSI3_RX2          44
+#define MX53_DMA_REQ_SSI3_TX0          47
+#define MX53_DMA_REQ_SSI3_RX0          46
+#define MX53_DMA_REQ_SSI3_TX1          45
+#define MX53_DMA_REQ_SSI3_RX1          44
 #define MX53_DMA_REQ_UART3_TX  43
 #define MX53_DMA_REQ_UART3_RX  42
 #define MX53_DMA_REQ_ESAI_TX           41
 #define MX53_DMA_REQ_ASRC_DMA1 32
 #define MX53_DMA_REQ_EMI_WR            31
 #define MX53_DMA_REQ_EMI_RD            30
-#define MX53_DMA_REQ_SSI1_TX1          29
-#define MX53_DMA_REQ_SSI1_RX1          28
-#define MX53_DMA_REQ_SSI1_TX2          27
-#define MX53_DMA_REQ_SSI1_RX2          26
-#define MX53_DMA_REQ_SSI2_TX1          25
-#define MX53_DMA_REQ_SSI2_RX1          24
-#define MX53_DMA_REQ_SSI2_TX2          23
-#define MX53_DMA_REQ_SSI2_RX2          22
+#define MX53_DMA_REQ_SSI1_TX0          29
+#define MX53_DMA_REQ_SSI1_RX0          28
+#define MX53_DMA_REQ_SSI1_TX1          27
+#define MX53_DMA_REQ_SSI1_RX1          26
+#define MX53_DMA_REQ_SSI2_TX0          25
+#define MX53_DMA_REQ_SSI2_RX0          24
+#define MX53_DMA_REQ_SSI2_TX1          23
+#define MX53_DMA_REQ_SSI2_RX1          22
 #define MX53_DMA_REQ_I2C2_SDHC2        21
 #define MX53_DMA_REQ_I2C1_SDHC1        20
 #define MX53_DMA_REQ_UART1_TX  19
 #define MX53_INT_ESDHC2        2
 #define MX53_INT_ESDHC3        3
 #define MX53_INT_ESDHC4        4
-#define MX53_INT_RESV5 5
+#define MX53_INT_DAP   5
 #define MX53_INT_SDMA  6
 #define MX53_INT_IOMUX 7
 #define MX53_INT_NFC   8
 #define MX53_INT_IPU_ERR       10
 #define MX53_INT_IPU_SYN       11
 #define MX53_INT_GPU   12
-#define MX53_INT_RESV13        13
+#define MX53_INT_UART4 13
 #define MX53_INT_USB_H1        14
 #define MX53_INT_EMI   15
 #define MX53_INT_USB_H2        16
 #define MX53_INT_UART1 31
 #define MX53_INT_UART2 32
 #define MX53_INT_UART3 33
-#define MX53_INT_RESV34        34
-#define MX53_INT_RESV35        35
+#define MX53_INT_RTC   34
+#define MX53_INT_PTP   35
 #define MX53_INT_ECSPI1        36
 #define MX53_INT_ECSPI2        37
 #define MX53_INT_CSPI  38
 #define MX53_INT_I2C1  62
 #define MX53_INT_I2C2  63
 #define MX53_INT_I2C3  64
-#define MX53_INT_RESV65        65
-#define MX53_INT_RESV66        66
+#define MX53_INT_MLB   65
+#define MX53_INT_ASRC  66
 #define MX53_INT_SPDIF 67
 #define MX53_INT_SIM_DAT       68
 #define MX53_INT_IIM   69
 #define MX53_INT_CAN2  83
 #define MX53_INT_GPU2_IRQ      84
 #define MX53_INT_GPU2_BUSY     85
-#define MX53_INT_RESV86        86
+#define MX53_INT_UART5 86
 #define MX53_INT_FEC   87
 #define MX53_INT_OWIRE 88
 #define MX53_INT_CTI1_TG2      89
index 4ac53ce97c24f3526abcdd21df11a5998289b528..09879235a9f57430a034da6d12e111501a7118ae 100644 (file)
@@ -68,7 +68,7 @@
 extern unsigned int __mxc_cpu_type;
 #endif
 
-#ifdef CONFIG_ARCH_MX1
+#ifdef CONFIG_SOC_IMX1
 # ifdef mxc_cpu_type
 #  undef mxc_cpu_type
 #  define mxc_cpu_type __mxc_cpu_type
@@ -80,7 +80,7 @@ extern unsigned int __mxc_cpu_type;
 # define cpu_is_mx1()          (0)
 #endif
 
-#ifdef CONFIG_MACH_MX21
+#ifdef CONFIG_SOC_IMX21
 # ifdef mxc_cpu_type
 #  undef mxc_cpu_type
 #  define mxc_cpu_type __mxc_cpu_type
@@ -92,7 +92,7 @@ extern unsigned int __mxc_cpu_type;
 # define cpu_is_mx21()         (0)
 #endif
 
-#ifdef CONFIG_ARCH_MX25
+#ifdef CONFIG_SOC_IMX25
 # ifdef mxc_cpu_type
 #  undef mxc_cpu_type
 #  define mxc_cpu_type __mxc_cpu_type
@@ -104,7 +104,7 @@ extern unsigned int __mxc_cpu_type;
 # define cpu_is_mx25()         (0)
 #endif
 
-#ifdef CONFIG_MACH_MX27
+#ifdef CONFIG_SOC_IMX27
 # ifdef mxc_cpu_type
 #  undef mxc_cpu_type
 #  define mxc_cpu_type __mxc_cpu_type
index 913e0432e40e99d17d2456ad26b8f3a02e1a72c3..f495c87c113fc269020d0ec49397c2bfc24d3ff0 100644 (file)
@@ -49,14 +49,12 @@ struct sdma_script_start_addrs {
  * struct sdma_platform_data - platform specific data for SDMA engine
  *
  * @sdma_version       The version of this SDMA engine
- * @cpu_name           used to generate the firmware name
- * @to_version         CPU Tape out version
+ * @fw_name            The firmware name
  * @script_addrs       SDMA scripts addresses in SDMA ROM
  */
 struct sdma_platform_data {
        int sdma_version;
-       char *cpu_name;
-       int to_version;
+       char *fw_name;
        struct sdma_script_start_addrs *script_addrs;
 };
 
index d61d5c74817cb3cce231db111eee134682750d28..10343d1f87e144542b1414f0b23e28519c5a2617 100644 (file)
 #ifndef __ASM_ARCH_MXC_TIMEX_H__
 #define __ASM_ARCH_MXC_TIMEX_H__
 
-#if defined CONFIG_ARCH_MX1
-#define CLOCK_TICK_RATE                16000000
-#elif defined CONFIG_ARCH_MX2
-#define CLOCK_TICK_RATE                13300000
-#elif defined CONFIG_ARCH_MX3
-#define CLOCK_TICK_RATE                16625000
-#elif defined CONFIG_ARCH_MX25
-#define CLOCK_TICK_RATE                16000000
-#elif defined CONFIG_ARCH_MX5
-#define CLOCK_TICK_RATE                8000000
-#endif
+/* Bogus value */
+#define CLOCK_TICK_RATE        12345678
 
 #endif                         /* __ASM_ARCH_MXC_TIMEX_H__ */
index d85e2d1c0324449ca1209a1b572e216255e350ed..88fd40452567a30aeb6f2b55ba1e3f4684959a78 100644 (file)
@@ -117,6 +117,7 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)
        case MACH_TYPE_MX53_EVK:
        case MACH_TYPE_MX53_LOCO:
        case MACH_TYPE_MX53_SMD:
+       case MACH_TYPE_MX53_ARD:
                uart_base = MX53_UART1_BASE_ADDR;
                break;
        default:
index 3238c10d4e022073de8fd340336378bcfb9186fc..1f73963bc13e916e895433ffd5e5d7687e9e333d 100644 (file)
@@ -157,7 +157,7 @@ EXPORT_SYMBOL(mxc_gpio_mode);
 static int imx_iomuxv1_setup_multiple(const int *list, unsigned count)
 {
        size_t i;
-       int ret;
+       int ret = 0;
 
        for (i = 0; i < count; ++i) {
                ret = mxc_gpio_mode(list[i]);
@@ -172,45 +172,13 @@ static int imx_iomuxv1_setup_multiple(const int *list, unsigned count)
 int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
                const char *label)
 {
-       size_t i;
        int ret;
 
-       for (i = 0; i < count; ++i) {
-               unsigned gpio = pin_list[i] & (GPIO_PIN_MASK | GPIO_PORT_MASK);
-
-               ret = gpio_request(gpio, label);
-               if (ret)
-                       goto err_gpio_request;
-       }
-
        ret = imx_iomuxv1_setup_multiple(pin_list, count);
-       if (ret)
-               goto err_setup;
-
-       return 0;
-
-err_setup:
-       BUG_ON(i != count);
-
-err_gpio_request:
-       mxc_gpio_release_multiple_pins(pin_list, i);
-
        return ret;
 }
 EXPORT_SYMBOL(mxc_gpio_setup_multiple_pins);
 
-void mxc_gpio_release_multiple_pins(const int *pin_list, int count)
-{
-       size_t i;
-
-       for (i = 0; i < count; ++i) {
-               unsigned gpio = pin_list[i] & (GPIO_PIN_MASK | GPIO_PORT_MASK);
-
-               gpio_free(gpio);
-       }
-}
-EXPORT_SYMBOL(mxc_gpio_release_multiple_pins);
-
 int __init imx_iomuxv1_init(void __iomem *base, int numports)
 {
        imx_iomuxv1_baseaddr = base;
index e1c6eff7258ae4728bb4d09e19fbbd1153c5e3f1..96953e2e4f11dbc55e67218a4617674bb166656f 100644 (file)
@@ -42,17 +42,16 @@ EXPORT_SYMBOL(imx_irq_set_priority);
 
 int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
 {
-       struct mxc_irq_chip *chip;
-       struct irq_chip *base;
+       struct irq_chip_generic *gc;
+       int (*set_irq_fiq)(unsigned int, unsigned int);
        int ret;
 
        ret = -ENOSYS;
 
-       base = irq_get_chip(irq);
-       if (base) {
-               chip = container_of(base, struct mxc_irq_chip, base);
-               if (chip->set_irq_fiq)
-                       ret = chip->set_irq_fiq(irq, type);
+       gc = irq_get_chip_data(irq);
+       if (gc && gc->private) {
+               set_irq_fiq = gc->private;
+               ret = set_irq_fiq(irq, type);
        }
 
        return ret;
index 7a61ef8f471a49fd3ac0b67540f949cf13eaaa43..761c3c940a68cf84aa65e0bbaebd64e999b9ff9c 100644 (file)
@@ -214,14 +214,14 @@ static int __devinit mxc_pwm_probe(struct platform_device *pdev)
                goto err_free_clk;
        }
 
-       r = request_mem_region(r->start, r->end - r->start + 1, pdev->name);
+       r = request_mem_region(r->start, resource_size(r), pdev->name);
        if (r == NULL) {
                dev_err(&pdev->dev, "failed to request memory resource\n");
                ret = -EBUSY;
                goto err_free_clk;
        }
 
-       pwm->mmio_base = ioremap(r->start, r->end - r->start + 1);
+       pwm->mmio_base = ioremap(r->start, resource_size(r));
        if (pwm->mmio_base == NULL) {
                dev_err(&pdev->dev, "failed to ioremap() registers\n");
                ret = -ENODEV;
@@ -236,7 +236,7 @@ static int __devinit mxc_pwm_probe(struct platform_device *pdev)
        return 0;
 
 err_free_mem:
-       release_mem_region(r->start, r->end - r->start + 1);
+       release_mem_region(r->start, resource_size(r));
 err_free_clk:
        clk_put(pwm->clk);
 err_free:
@@ -260,7 +260,7 @@ static int __devexit mxc_pwm_remove(struct platform_device *pdev)
        iounmap(pwm->mmio_base);
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(r->start, r->end - r->start + 1);
+       release_mem_region(r->start, resource_size(r));
 
        clk_put(pwm->clk);
 
index 57f9395f87ceaddb2cbd522e6b27a4555af6140d..f257fccdc39405e40029c2b16a8590dd62a2b2a0 100644 (file)
@@ -49,6 +49,8 @@
 
 void __iomem *tzic_base; /* Used as irq controller base in entry-macro.S */
 
+#define TZIC_NUM_IRQS 128
+
 #ifdef CONFIG_FIQ
 static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)
 {
@@ -66,78 +68,34 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)
 
        return 0;
 }
+#else
+#define tzic_set_irq_fiq NULL
 #endif
 
-/**
- * tzic_mask_irq() - Disable interrupt source "d" in the TZIC
- *
- * @param  d            interrupt source
- */
-static void tzic_mask_irq(struct irq_data *d)
-{
-       int index, off;
-
-       index = d->irq >> 5;
-       off = d->irq & 0x1F;
-       __raw_writel(1 << off, tzic_base + TZIC_ENCLEAR0(index));
-}
+static unsigned int *wakeup_intr[4];
 
-/**
- * tzic_unmask_irq() - Enable interrupt source "d" in the TZIC
- *
- * @param  d            interrupt source
- */
-static void tzic_unmask_irq(struct irq_data *d)
+static __init void tzic_init_gc(unsigned int irq_start)
 {
-       int index, off;
-
-       index = d->irq >> 5;
-       off = d->irq & 0x1F;
-       __raw_writel(1 << off, tzic_base + TZIC_ENSET0(index));
+       struct irq_chip_generic *gc;
+       struct irq_chip_type *ct;
+       int idx = irq_start >> 5;
+
+       gc = irq_alloc_generic_chip("tzic", 1, irq_start, tzic_base,
+                                   handle_level_irq);
+       gc->private = tzic_set_irq_fiq;
+       gc->wake_enabled = IRQ_MSK(32);
+       wakeup_intr[idx] = &gc->wake_active;
+
+       ct = gc->chip_types;
+       ct->chip.irq_mask = irq_gc_mask_disable_reg;
+       ct->chip.irq_unmask = irq_gc_unmask_enable_reg;
+       ct->chip.irq_set_wake = irq_gc_set_wake;
+       ct->regs.disable = TZIC_ENCLEAR0(idx);
+       ct->regs.enable = TZIC_ENSET0(idx);
+
+       irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
 }
 
-static unsigned int wakeup_intr[4];
-
-/**
- * tzic_set_wake_irq() - Set interrupt source "d" in the TZIC as a wake-up source.
- *
- * @param  d            interrupt source
- * @param  enable       enable as wake-up if equal to non-zero
- *                     disble as wake-up if equal to zero
- *
- * @return       This function returns 0 on success.
- */
-static int tzic_set_wake_irq(struct irq_data *d, unsigned int enable)
-{
-       unsigned int index, off;
-
-       index = d->irq >> 5;
-       off = d->irq & 0x1F;
-
-       if (index > 3)
-               return -EINVAL;
-
-       if (enable)
-               wakeup_intr[index] |= (1 << off);
-       else
-               wakeup_intr[index] &= ~(1 << off);
-
-       return 0;
-}
-
-static struct mxc_irq_chip mxc_tzic_chip = {
-       .base = {
-               .name = "MXC_TZIC",
-               .irq_ack = tzic_mask_irq,
-               .irq_mask = tzic_mask_irq,
-               .irq_unmask = tzic_unmask_irq,
-               .irq_set_wake = tzic_set_wake_irq,
-       },
-#ifdef CONFIG_FIQ
-       .set_irq_fiq = tzic_set_irq_fiq,
-#endif
-};
-
 /*
  * This function initializes the TZIC hardware and disables all the
  * interrupts. It registers the interrupt enable and disable functions
@@ -166,11 +124,8 @@ void __init tzic_init_irq(void __iomem *irqbase)
 
        /* all IRQ no FIQ Warning :: No selection */
 
-       for (i = 0; i < MXC_INTERNAL_IRQS; i++) {
-               irq_set_chip_and_handler(i, &mxc_tzic_chip.base,
-                                        handle_level_irq);
-               set_irq_flags(i, IRQF_VALID);
-       }
+       for (i = 0; i < TZIC_NUM_IRQS; i += 32)
+               tzic_init_gc(i);
 
 #ifdef CONFIG_FIQ
        /* Initialize FIQ */
@@ -197,7 +152,7 @@ int tzic_enable_wake(int is_idle)
 
        for (i = 0; i < 4; i++) {
                v = is_idle ? __raw_readl(tzic_base + TZIC_ENSET0(i)) :
-                       wakeup_intr[i];
+                       *wakeup_intr[i];
                __raw_writel(v, tzic_base + TZIC_WAKEUP0(i));
        }
 
index e18eaabe92b97bea100b6baa5528078696abb1ec..d99f71c356b51cb5387423b22c49290ea26a1869 100644 (file)
@@ -135,7 +135,8 @@ static int imxdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
                if (ret)
                        return ret;
 
-               imx_dma_config_burstlen(imxdmac->imxdma_channel, imxdmac->watermark_level);
+               imx_dma_config_burstlen(imxdmac->imxdma_channel,
+                               imxdmac->watermark_level * imxdmac->word_size);
 
                return 0;
        default:
index b6d1455fa9362ecba3dbfe088df72bc77b2ef21e..1ea47db2ff0630e6cb90f429f7008398597902e3 100644 (file)
@@ -1105,7 +1105,7 @@ static void sdma_add_scripts(struct sdma_engine *sdma,
 }
 
 static int __init sdma_get_firmware(struct sdma_engine *sdma,
-               const char *cpu_name, int to_version)
+               const char *fw_name)
 {
        const struct firmware *fw;
        char *fwname;
@@ -1114,7 +1114,7 @@ static int __init sdma_get_firmware(struct sdma_engine *sdma,
        const struct sdma_script_start_addrs *addr;
        unsigned short *ram_code;
 
-       fwname = kasprintf(GFP_KERNEL, "sdma-%s-to%d.bin", cpu_name, to_version);
+       fwname = kasprintf(GFP_KERNEL, "%s", fw_name);
        if (!fwname)
                return -ENOMEM;
 
@@ -1317,7 +1317,7 @@ static int __init sdma_probe(struct platform_device *pdev)
        if (pdata->script_addrs)
                sdma_add_scripts(sdma, pdata->script_addrs);
 
-       sdma_get_firmware(sdma, pdata->cpu_name, pdata->to_version);
+       sdma_get_firmware(sdma, pdata->fw_name);
 
        sdma->dma_device.dev = &pdev->dev;
 
index 2967002a9f820b2894dd1f8f1110a47a9694e250..5e6fc222bb2320d7126dea54d03525b319340f34 100644 (file)
@@ -90,6 +90,15 @@ config GPIO_EXYNOS4
        def_bool y
        depends on CPU_EXYNOS4210
 
+config GPIO_MXS
+       def_bool y
+       depends on ARCH_MXS
+
+config GPIO_MXC
+       def_bool y
+       depends on ARCH_MXC
+       select GPIO_BASIC_MMIO_CORE
+
 config GPIO_PLAT_SAMSUNG
        def_bool y
        depends on SAMSUNG_GPIOLIB_4BIT
index b605f8ec6fbe0afc01e6c4604de67e6a85f98add..9c37339a57a792e442aa4c03732e10933ec085de 100644 (file)
@@ -9,6 +9,8 @@ obj-$(CONFIG_GPIO_ADP5588)      += adp5588-gpio.o
 obj-$(CONFIG_GPIO_BASIC_MMIO_CORE)     += basic_mmio_gpio.o
 obj-$(CONFIG_GPIO_BASIC_MMIO)  += basic_mmio_gpio.o
 obj-$(CONFIG_GPIO_EXYNOS4)     += gpio-exynos4.o
+obj-$(CONFIG_GPIO_MXC)         += gpio-mxc.o
+obj-$(CONFIG_GPIO_MXS)         += gpio-mxs.o
 obj-$(CONFIG_GPIO_PLAT_SAMSUNG)        += gpio-plat-samsung.o
 obj-$(CONFIG_GPIO_S5PC100)     += gpio-s5pc100.o
 obj-$(CONFIG_GPIO_S5PV210)     += gpio-s5pv210.o
similarity index 60%
rename from arch/arm/plat-mxc/gpio.c
rename to drivers/gpio/gpio-mxc.c
index 6cd6d7f686f639623da2c10b0bcc6e9213d4b4a1..b351952893bb6654cf4b9d360241b0d43d634076 100644 (file)
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/gpio.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/basic_mmio_gpio.h>
 #include <mach/hardware.h>
 #include <asm-generic/bug.h>
 
-static struct mxc_gpio_port *mxc_gpio_ports;
-static int gpio_table_size;
+struct mxc_gpio_port {
+       struct list_head node;
+       void __iomem *base;
+       int irq;
+       int irq_high;
+       int virtual_irq_start;
+       struct bgpio_chip bgc;
+       u32 both_edges;
+};
+
+/*
+ * MX2 has one interrupt *for all* gpio ports. The list is used
+ * to save the references to all ports, so that mx2_gpio_irq_handler
+ * can walk through all interrupt status registers.
+ */
+static LIST_HEAD(mxc_gpio_ports);
 
 #define cpu_is_mx1_mx2()       (cpu_is_mx1() || cpu_is_mx2())
 
@@ -50,7 +67,7 @@ static int gpio_table_size;
 
 static void _clear_gpio_irqstatus(struct mxc_gpio_port *port, u32 index)
 {
-       __raw_writel(1 << index, port->base + GPIO_ISR);
+       writel(1 << index, port->base + GPIO_ISR);
 }
 
 static void _set_gpio_irqenable(struct mxc_gpio_port *port, u32 index,
@@ -58,35 +75,36 @@ static void _set_gpio_irqenable(struct mxc_gpio_port *port, u32 index,
 {
        u32 l;
 
-       l = __raw_readl(port->base + GPIO_IMR);
+       l = readl(port->base + GPIO_IMR);
        l = (l & (~(1 << index))) | (!!enable << index);
-       __raw_writel(l, port->base + GPIO_IMR);
+       writel(l, port->base + GPIO_IMR);
 }
 
 static void gpio_ack_irq(struct irq_data *d)
 {
+       struct mxc_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       _clear_gpio_irqstatus(&mxc_gpio_ports[gpio / 32], gpio & 0x1f);
+       _clear_gpio_irqstatus(port, gpio & 0x1f);
 }
 
 static void gpio_mask_irq(struct irq_data *d)
 {
+       struct mxc_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       _set_gpio_irqenable(&mxc_gpio_ports[gpio / 32], gpio & 0x1f, 0);
+       _set_gpio_irqenable(port, gpio & 0x1f, 0);
 }
 
 static void gpio_unmask_irq(struct irq_data *d)
 {
+       struct mxc_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       _set_gpio_irqenable(&mxc_gpio_ports[gpio / 32], gpio & 0x1f, 1);
+       _set_gpio_irqenable(port, gpio & 0x1f, 1);
 }
 
-static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset);
-
 static int gpio_set_irq_type(struct irq_data *d, u32 type)
 {
        u32 gpio = irq_to_gpio(d->irq);
-       struct mxc_gpio_port *port = &mxc_gpio_ports[gpio / 32];
+       struct mxc_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 bit, val;
        int edge;
        void __iomem *reg = port->base;
@@ -100,7 +118,7 @@ static int gpio_set_irq_type(struct irq_data *d, u32 type)
                edge = GPIO_INT_FALL_EDGE;
                break;
        case IRQ_TYPE_EDGE_BOTH:
-               val = mxc_gpio_get(&port->chip, gpio & 31);
+               val = gpio_get_value(gpio & 31);
                if (val) {
                        edge = GPIO_INT_LOW_LEV;
                        pr_debug("mxc: set GPIO %d to low trigger\n", gpio);
@@ -122,8 +140,8 @@ static int gpio_set_irq_type(struct irq_data *d, u32 type)
 
        reg += GPIO_ICR1 + ((gpio & 0x10) >> 2); /* lower or upper register */
        bit = gpio & 0xf;
-       val = __raw_readl(reg) & ~(0x3 << (bit << 1));
-       __raw_writel(val | (edge << (bit << 1)), reg);
+       val = readl(reg) & ~(0x3 << (bit << 1));
+       writel(val | (edge << (bit << 1)), reg);
        _clear_gpio_irqstatus(port, gpio & 0x1f);
 
        return 0;
@@ -137,7 +155,7 @@ static void mxc_flip_edge(struct mxc_gpio_port *port, u32 gpio)
 
        reg += GPIO_ICR1 + ((gpio & 0x10) >> 2); /* lower or upper register */
        bit = gpio & 0xf;
-       val = __raw_readl(reg);
+       val = readl(reg);
        edge = (val >> (bit << 1)) & 3;
        val &= ~(0x3 << (bit << 1));
        if (edge == GPIO_INT_HIGH_LEV) {
@@ -151,7 +169,7 @@ static void mxc_flip_edge(struct mxc_gpio_port *port, u32 gpio)
                       gpio, edge);
                return;
        }
-       __raw_writel(val | (edge << (bit << 1)), reg);
+       writel(val | (edge << (bit << 1)), reg);
 }
 
 /* handle 32 interrupts in one status register */
@@ -177,8 +195,7 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc)
        u32 irq_stat;
        struct mxc_gpio_port *port = irq_get_handler_data(irq);
 
-       irq_stat = __raw_readl(port->base + GPIO_ISR) &
-                       __raw_readl(port->base + GPIO_IMR);
+       irq_stat = readl(port->base + GPIO_ISR) & readl(port->base + GPIO_IMR);
 
        mxc_gpio_irq_handler(port, irq_stat);
 }
@@ -186,19 +203,18 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc)
 /* MX2 has one interrupt *for all* gpio ports */
 static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc)
 {
-       int i;
        u32 irq_msk, irq_stat;
-       struct mxc_gpio_port *port = irq_get_handler_data(irq);
+       struct mxc_gpio_port *port;
 
        /* walk through all interrupt status registers */
-       for (i = 0; i < gpio_table_size; i++) {
-               irq_msk = __raw_readl(port[i].base + GPIO_IMR);
+       list_for_each_entry(port, &mxc_gpio_ports, node) {
+               irq_msk = readl(port->base + GPIO_IMR);
                if (!irq_msk)
                        continue;
 
-               irq_stat = __raw_readl(port[i].base + GPIO_ISR) & irq_msk;
+               irq_stat = readl(port->base + GPIO_ISR) & irq_msk;
                if (irq_stat)
-                       mxc_gpio_irq_handler(&port[i], irq_stat);
+                       mxc_gpio_irq_handler(port, irq_stat);
        }
 }
 
@@ -215,7 +231,7 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable)
 {
        u32 gpio = irq_to_gpio(d->irq);
        u32 gpio_idx = gpio & 0x1F;
-       struct mxc_gpio_port *port = &mxc_gpio_ports[gpio / 32];
+       struct mxc_gpio_port *port = irq_data_get_irq_chip_data(d);
 
        if (enable) {
                if (port->irq_high && (gpio_idx >= 16))
@@ -241,121 +257,123 @@ static struct irq_chip gpio_irq_chip = {
        .irq_set_wake = gpio_set_wake_irq,
 };
 
-static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset,
-                               int dir)
-{
-       struct mxc_gpio_port *port =
-               container_of(chip, struct mxc_gpio_port, chip);
-       u32 l;
-       unsigned long flags;
-
-       spin_lock_irqsave(&port->lock, flags);
-       l = __raw_readl(port->base + GPIO_GDIR);
-       if (dir)
-               l |= 1 << offset;
-       else
-               l &= ~(1 << offset);
-       __raw_writel(l, port->base + GPIO_GDIR);
-       spin_unlock_irqrestore(&port->lock, flags);
-}
-
-static void mxc_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
-{
-       struct mxc_gpio_port *port =
-               container_of(chip, struct mxc_gpio_port, chip);
-       void __iomem *reg = port->base + GPIO_DR;
-       u32 l;
-       unsigned long flags;
-
-       spin_lock_irqsave(&port->lock, flags);
-       l = (__raw_readl(reg) & (~(1 << offset))) | (!!value << offset);
-       __raw_writel(l, reg);
-       spin_unlock_irqrestore(&port->lock, flags);
-}
-
-static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset)
-{
-       struct mxc_gpio_port *port =
-               container_of(chip, struct mxc_gpio_port, chip);
-
-       return (__raw_readl(port->base + GPIO_PSR) >> offset) & 1;
-}
-
-static int mxc_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
-{
-       _set_gpio_direction(chip, offset, 0);
-       return 0;
-}
-
-static int mxc_gpio_direction_output(struct gpio_chip *chip,
-                                    unsigned offset, int value)
-{
-       mxc_gpio_set(chip, offset, value);
-       _set_gpio_direction(chip, offset, 1);
-       return 0;
-}
-
 /*
  * This lock class tells lockdep that GPIO irqs are in a different
  * category than their parents, so it won't report false recursion.
  */
 static struct lock_class_key gpio_lock_class;
 
-int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
+static int __devinit mxc_gpio_probe(struct platform_device *pdev)
 {
-       int i, j;
-
-       /* save for local usage */
-       mxc_gpio_ports = port;
-       gpio_table_size = cnt;
-
-       printk(KERN_INFO "MXC GPIO hardware\n");
-
-       for (i = 0; i < cnt; i++) {
-               /* disable the interrupt and clear the status */
-               __raw_writel(0, port[i].base + GPIO_IMR);
-               __raw_writel(~0, port[i].base + GPIO_ISR);
-               for (j = port[i].virtual_irq_start;
-                       j < port[i].virtual_irq_start + 32; j++) {
-                       irq_set_lockdep_class(j, &gpio_lock_class);
-                       irq_set_chip_and_handler(j, &gpio_irq_chip,
-                                                handle_level_irq);
-                       set_irq_flags(j, IRQF_VALID);
-               }
+       struct mxc_gpio_port *port;
+       struct resource *iores;
+       int err, i;
 
-               /* register gpio chip */
-               port[i].chip.direction_input = mxc_gpio_direction_input;
-               port[i].chip.direction_output = mxc_gpio_direction_output;
-               port[i].chip.get = mxc_gpio_get;
-               port[i].chip.set = mxc_gpio_set;
-               port[i].chip.base = i * 32;
-               port[i].chip.ngpio = 32;
+       port = kzalloc(sizeof(struct mxc_gpio_port), GFP_KERNEL);
+       if (!port)
+               return -ENOMEM;
 
-               spin_lock_init(&port[i].lock);
+       port->virtual_irq_start = MXC_GPIO_IRQ_START + pdev->id * 32;
 
-               /* its a serious configuration bug when it fails */
-               BUG_ON( gpiochip_add(&port[i].chip) < 0 );
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
+               err = -ENODEV;
+               goto out_kfree;
+       }
 
-               if (cpu_is_mx1() || cpu_is_mx3() || cpu_is_mx25() || cpu_is_mx51()) {
-                       /* setup one handler for each entry */
-                       irq_set_chained_handler(port[i].irq,
-                                               mx3_gpio_irq_handler);
-                       irq_set_handler_data(port[i].irq, &port[i]);
-                       if (port[i].irq_high) {
-                               /* setup handler for GPIO 16 to 31 */
-                               irq_set_chained_handler(port[i].irq_high,
-                                                       mx3_gpio_irq_handler);
-                               irq_set_handler_data(port[i].irq_high,
-                                                    &port[i]);
-                       }
-               }
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               pdev->name)) {
+               err = -EBUSY;
+               goto out_kfree;
+       }
+
+       port->base = ioremap(iores->start, resource_size(iores));
+       if (!port->base) {
+               err = -ENOMEM;
+               goto out_release_mem;
+       }
+
+       port->irq_high = platform_get_irq(pdev, 1);
+       port->irq = platform_get_irq(pdev, 0);
+       if (port->irq < 0) {
+               err = -EINVAL;
+               goto out_iounmap;
+       }
+
+       /* disable the interrupt and clear the status */
+       writel(0, port->base + GPIO_IMR);
+       writel(~0, port->base + GPIO_ISR);
+
+       for (i = port->virtual_irq_start;
+               i < port->virtual_irq_start + 32; i++) {
+               irq_set_lockdep_class(i, &gpio_lock_class);
+               irq_set_chip_and_handler(i, &gpio_irq_chip, handle_level_irq);
+               set_irq_flags(i, IRQF_VALID);
+               irq_set_chip_data(i, port);
        }
 
        if (cpu_is_mx2()) {
                /* setup one handler for all GPIO interrupts */
-               irq_set_chained_handler(port[0].irq, mx2_gpio_irq_handler);
-               irq_set_handler_data(port[0].irq, port);
+               if (pdev->id == 0)
+                       irq_set_chained_handler(port->irq,
+                                               mx2_gpio_irq_handler);
+       } else {
+               /* setup one handler for each entry */
+               irq_set_chained_handler(port->irq, mx3_gpio_irq_handler);
+               irq_set_handler_data(port->irq, port);
+               if (port->irq_high > 0) {
+                       /* setup handler for GPIO 16 to 31 */
+                       irq_set_chained_handler(port->irq_high,
+                                               mx3_gpio_irq_handler);
+                       irq_set_handler_data(port->irq_high, port);
+               }
        }
 
+       err = bgpio_init(&port->bgc, &pdev->dev, 4,
+                        port->base + GPIO_PSR,
+                        port->base + GPIO_DR, NULL,
+                        port->base + GPIO_GDIR, NULL, false);
+       if (err)
+               goto out_iounmap;
+
+       port->bgc.gc.base = pdev->id * 32;
+
+       err = gpiochip_add(&port->bgc.gc);
+       if (err)
+               goto out_bgpio_remove;
+
+       list_add_tail(&port->node, &mxc_gpio_ports);
+
        return 0;
+
+out_bgpio_remove:
+       bgpio_remove(&port->bgc);
+out_iounmap:
+       iounmap(port->base);
+out_release_mem:
+       release_mem_region(iores->start, resource_size(iores));
+out_kfree:
+       kfree(port);
+       dev_info(&pdev->dev, "%s failed with errno %d\n", __func__, err);
+       return err;
 }
+
+static struct platform_driver mxc_gpio_driver = {
+       .driver         = {
+               .name   = "gpio-mxc",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = mxc_gpio_probe,
+};
+
+static int __init gpio_mxc_init(void)
+{
+       return platform_driver_register(&mxc_gpio_driver);
+}
+postcore_initcall(gpio_mxc_init);
+
+MODULE_AUTHOR("Freescale Semiconductor, "
+             "Daniel Mack <danielncaiaq.de>, "
+             "Juergen Beisert <kernel@pengutronix.de>");
+MODULE_DESCRIPTION("Freescale MXC GPIO");
+MODULE_LICENSE("GPL");
similarity index 58%
rename from arch/arm/mach-mxs/gpio.c
rename to drivers/gpio/gpio-mxs.c
index 2c950fef71a87ef9d39f7f79ec2831cf94ba1e7f..a28761428bb0e555f1e6b0e2e78d99ab043f7e54 100644 (file)
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/gpio.h>
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <asm-generic/bug.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <mach/mxs.h>
 
-#include "gpio.h"
-
-static struct mxs_gpio_port *mxs_gpio_ports;
-static int gpio_table_size;
+#define MXS_SET                0x4
+#define MXS_CLR                0x8
 
 #define PINCTRL_DOUT(n)                ((cpu_is_mx23() ? 0x0500 : 0x0700) + (n) * 0x10)
 #define PINCTRL_DIN(n)         ((cpu_is_mx23() ? 0x0600 : 0x0900) + (n) * 0x10)
@@ -50,40 +48,55 @@ static int gpio_table_size;
 #define GPIO_INT_LEV_MASK      (1 << 0)
 #define GPIO_INT_POL_MASK      (1 << 1)
 
+struct mxs_gpio_port {
+       void __iomem *base;
+       int id;
+       int irq;
+       int irq_high;
+       int virtual_irq_start;
+       struct gpio_chip chip;
+};
+
 /* Note: This driver assumes 32 GPIOs are handled in one register */
 
 static void clear_gpio_irqstatus(struct mxs_gpio_port *port, u32 index)
 {
-       __mxs_clrl(1 << index, port->base + PINCTRL_IRQSTAT(port->id));
+       writel(1 << index, port->base + PINCTRL_IRQSTAT(port->id) + MXS_CLR);
 }
 
 static void set_gpio_irqenable(struct mxs_gpio_port *port, u32 index,
                                int enable)
 {
        if (enable) {
-               __mxs_setl(1 << index, port->base + PINCTRL_IRQEN(port->id));
-               __mxs_setl(1 << index, port->base + PINCTRL_PIN2IRQ(port->id));
+               writel(1 << index,
+                       port->base + PINCTRL_IRQEN(port->id) + MXS_SET);
+               writel(1 << index,
+                       port->base + PINCTRL_PIN2IRQ(port->id) + MXS_SET);
        } else {
-               __mxs_clrl(1 << index, port->base + PINCTRL_IRQEN(port->id));
+               writel(1 << index,
+                       port->base + PINCTRL_IRQEN(port->id) + MXS_CLR);
        }
 }
 
 static void mxs_gpio_ack_irq(struct irq_data *d)
 {
+       struct mxs_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       clear_gpio_irqstatus(&mxs_gpio_ports[gpio / 32], gpio & 0x1f);
+       clear_gpio_irqstatus(port, gpio & 0x1f);
 }
 
 static void mxs_gpio_mask_irq(struct irq_data *d)
 {
+       struct mxs_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 0);
+       set_gpio_irqenable(port, gpio & 0x1f, 0);
 }
 
 static void mxs_gpio_unmask_irq(struct irq_data *d)
 {
+       struct mxs_gpio_port *port = irq_data_get_irq_chip_data(d);
        u32 gpio = irq_to_gpio(d->irq);
-       set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 1);
+       set_gpio_irqenable(port, gpio & 0x1f, 1);
 }
 
 static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset);
@@ -92,7 +105,7 @@ static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type)
 {
        u32 gpio = irq_to_gpio(d->irq);
        u32 pin_mask = 1 << (gpio & 31);
-       struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32];
+       struct mxs_gpio_port *port = irq_data_get_irq_chip_data(d);
        void __iomem *pin_addr;
        int edge;
 
@@ -116,16 +129,16 @@ static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type)
        /* set level or edge */
        pin_addr = port->base + PINCTRL_IRQLEV(port->id);
        if (edge & GPIO_INT_LEV_MASK)
-               __mxs_setl(pin_mask, pin_addr);
+               writel(pin_mask, pin_addr + MXS_SET);
        else
-               __mxs_clrl(pin_mask, pin_addr);
+               writel(pin_mask, pin_addr + MXS_CLR);
 
        /* set polarity */
        pin_addr = port->base + PINCTRL_IRQPOL(port->id);
        if (edge & GPIO_INT_POL_MASK)
-               __mxs_setl(pin_mask, pin_addr);
+               writel(pin_mask, pin_addr + MXS_SET);
        else
-               __mxs_clrl(pin_mask, pin_addr);
+               writel(pin_mask, pin_addr + MXS_CLR);
 
        clear_gpio_irqstatus(port, gpio & 0x1f);
 
@@ -136,13 +149,13 @@ static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type)
 static void mxs_gpio_irq_handler(u32 irq, struct irq_desc *desc)
 {
        u32 irq_stat;
-       struct mxs_gpio_port *port = (struct mxs_gpio_port *)irq_get_handler_data(irq);
+       struct mxs_gpio_port *port = irq_get_handler_data(irq);
        u32 gpio_irq_no_base = port->virtual_irq_start;
 
        desc->irq_data.chip->irq_ack(&desc->irq_data);
 
-       irq_stat = __raw_readl(port->base + PINCTRL_IRQSTAT(port->id)) &
-                       __raw_readl(port->base + PINCTRL_IRQEN(port->id));
+       irq_stat = readl(port->base + PINCTRL_IRQSTAT(port->id)) &
+                       readl(port->base + PINCTRL_IRQEN(port->id));
 
        while (irq_stat != 0) {
                int irqoffset = fls(irq_stat) - 1;
@@ -164,7 +177,7 @@ static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable)
 {
        u32 gpio = irq_to_gpio(d->irq);
        u32 gpio_idx = gpio & 0x1f;
-       struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32];
+       struct mxs_gpio_port *port = irq_data_get_irq_chip_data(d);
 
        if (enable) {
                if (port->irq_high && (gpio_idx >= 16))
@@ -198,9 +211,9 @@ static void mxs_set_gpio_direction(struct gpio_chip *chip, unsigned offset,
        void __iomem *pin_addr = port->base + PINCTRL_DOE(port->id);
 
        if (dir)
-               __mxs_setl(1 << offset, pin_addr);
+               writel(1 << offset, pin_addr + MXS_SET);
        else
-               __mxs_clrl(1 << offset, pin_addr);
+               writel(1 << offset, pin_addr + MXS_CLR);
 }
 
 static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset)
@@ -208,7 +221,7 @@ static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset)
        struct mxs_gpio_port *port =
                container_of(chip, struct mxs_gpio_port, chip);
 
-       return (__raw_readl(port->base + PINCTRL_DIN(port->id)) >> offset) & 1;
+       return (readl(port->base + PINCTRL_DIN(port->id)) >> offset) & 1;
 }
 
 static void mxs_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
@@ -218,9 +231,9 @@ static void mxs_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
        void __iomem *pin_addr = port->base + PINCTRL_DOUT(port->id);
 
        if (value)
-               __mxs_setl(1 << offset, pin_addr);
+               writel(1 << offset, pin_addr + MXS_SET);
        else
-               __mxs_clrl(1 << offset, pin_addr);
+               writel(1 << offset, pin_addr + MXS_CLR);
 }
 
 static int mxs_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
@@ -245,87 +258,113 @@ static int mxs_gpio_direction_output(struct gpio_chip *chip,
        return 0;
 }
 
-int __init mxs_gpio_init(struct mxs_gpio_port *port, int cnt)
+static int __devinit mxs_gpio_probe(struct platform_device *pdev)
 {
-       int i, j;
+       static void __iomem *base;
+       struct mxs_gpio_port *port;
+       struct resource *iores = NULL;
+       int err, i;
+
+       port = kzalloc(sizeof(struct mxs_gpio_port), GFP_KERNEL);
+       if (!port)
+               return -ENOMEM;
+
+       port->id = pdev->id;
+       port->virtual_irq_start = MXS_GPIO_IRQ_START + port->id * 32;
+
+       /*
+        * map memory region only once, as all the gpio ports
+        * share the same one
+        */
+       if (!base) {
+               iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+               if (!iores) {
+                       err = -ENODEV;
+                       goto out_kfree;
+               }
 
-       /* save for local usage */
-       mxs_gpio_ports = port;
-       gpio_table_size = cnt;
+               if (!request_mem_region(iores->start, resource_size(iores),
+                                       pdev->name)) {
+                       err = -EBUSY;
+                       goto out_kfree;
+               }
 
-       pr_info("MXS GPIO hardware\n");
+               base = ioremap(iores->start, resource_size(iores));
+               if (!base) {
+                       err = -ENOMEM;
+                       goto out_release_mem;
+               }
+       }
+       port->base = base;
 
-       for (i = 0; i < cnt; i++) {
-               /* disable the interrupt and clear the status */
-               __raw_writel(0, port[i].base + PINCTRL_PIN2IRQ(i));
-               __raw_writel(0, port[i].base + PINCTRL_IRQEN(i));
+       port->irq = platform_get_irq(pdev, 0);
+       if (port->irq < 0) {
+               err = -EINVAL;
+               goto out_iounmap;
+       }
 
-               /* clear address has to be used to clear IRQSTAT bits */
-               __mxs_clrl(~0U, port[i].base + PINCTRL_IRQSTAT(i));
+       /* disable the interrupt and clear the status */
+       writel(0, port->base + PINCTRL_PIN2IRQ(port->id));
+       writel(0, port->base + PINCTRL_IRQEN(port->id));
 
-               for (j = port[i].virtual_irq_start;
-                       j < port[i].virtual_irq_start + 32; j++) {
-                       irq_set_chip_and_handler(j, &gpio_irq_chip,
-                                                handle_level_irq);
-                       set_irq_flags(j, IRQF_VALID);
-               }
+       /* clear address has to be used to clear IRQSTAT bits */
+       writel(~0U, port->base + PINCTRL_IRQSTAT(port->id) + MXS_CLR);
 
-               /* setup one handler for each entry */
-               irq_set_chained_handler(port[i].irq, mxs_gpio_irq_handler);
-               irq_set_handler_data(port[i].irq, &port[i]);
-
-               /* register gpio chip */
-               port[i].chip.direction_input = mxs_gpio_direction_input;
-               port[i].chip.direction_output = mxs_gpio_direction_output;
-               port[i].chip.get = mxs_gpio_get;
-               port[i].chip.set = mxs_gpio_set;
-               port[i].chip.to_irq = mxs_gpio_to_irq;
-               port[i].chip.base = i * 32;
-               port[i].chip.ngpio = 32;
-
-               /* its a serious configuration bug when it fails */
-               BUG_ON(gpiochip_add(&port[i].chip) < 0);
+       for (i = port->virtual_irq_start;
+               i < port->virtual_irq_start + 32; i++) {
+               irq_set_chip_and_handler(i, &gpio_irq_chip,
+                                        handle_level_irq);
+               set_irq_flags(i, IRQF_VALID);
+               irq_set_chip_data(i, port);
        }
 
-       return 0;
-}
+       /* setup one handler for each entry */
+       irq_set_chained_handler(port->irq, mxs_gpio_irq_handler);
+       irq_set_handler_data(port->irq, port);
 
-#define MX23_GPIO_BASE MX23_IO_ADDRESS(MX23_PINCTRL_BASE_ADDR)
-#define MX28_GPIO_BASE MX28_IO_ADDRESS(MX28_PINCTRL_BASE_ADDR)
+       /* register gpio chip */
+       port->chip.direction_input = mxs_gpio_direction_input;
+       port->chip.direction_output = mxs_gpio_direction_output;
+       port->chip.get = mxs_gpio_get;
+       port->chip.set = mxs_gpio_set;
+       port->chip.to_irq = mxs_gpio_to_irq;
+       port->chip.base = port->id * 32;
+       port->chip.ngpio = 32;
 
-#define DEFINE_MXS_GPIO_PORT(_base, _irq, _id)                         \
-       {                                                               \
-               .chip.label = "gpio-" #_id,                             \
-               .id = _id,                                              \
-               .irq = _irq,                                            \
-               .base = _base,                                          \
-               .virtual_irq_start = MXS_GPIO_IRQ_START + (_id) * 32,   \
-       }
+       err = gpiochip_add(&port->chip);
+       if (err)
+               goto out_iounmap;
 
-#ifdef CONFIG_SOC_IMX23
-static struct mxs_gpio_port mx23_gpio_ports[] = {
-       DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO0, 0),
-       DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO1, 1),
-       DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO2, 2),
-};
+       return 0;
 
-int __init mx23_register_gpios(void)
-{
-       return mxs_gpio_init(mx23_gpio_ports, ARRAY_SIZE(mx23_gpio_ports));
+out_iounmap:
+       if (iores)
+               iounmap(port->base);
+out_release_mem:
+       if (iores)
+               release_mem_region(iores->start, resource_size(iores));
+out_kfree:
+       kfree(port);
+       dev_info(&pdev->dev, "%s failed with errno %d\n", __func__, err);
+       return err;
 }
-#endif
-
-#ifdef CONFIG_SOC_IMX28
-static struct mxs_gpio_port mx28_gpio_ports[] = {
-       DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO0, 0),
-       DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO1, 1),
-       DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO2, 2),
-       DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO3, 3),
-       DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO4, 4),
+
+static struct platform_driver mxs_gpio_driver = {
+       .driver         = {
+               .name   = "gpio-mxs",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = mxs_gpio_probe,
 };
 
-int __init mx28_register_gpios(void)
+static int __init mxs_gpio_init(void)
 {
-       return mxs_gpio_init(mx28_gpio_ports, ARRAY_SIZE(mx28_gpio_ports));
+       return platform_driver_register(&mxs_gpio_driver);
 }
-#endif
+postcore_initcall(mxs_gpio_init);
+
+MODULE_AUTHOR("Freescale Semiconductor, "
+             "Daniel Mack <danielncaiaq.de>, "
+             "Juergen Beisert <kernel@pengutronix.de>");
+MODULE_DESCRIPTION("Freescale MXS GPIO");
+MODULE_LICENSE("GPL");
index cc20e025932593db93deb84d3e27f05bf9ed89c0..14aa213b00da3a3b2a8d5e332528bb2d952e44a9 100644 (file)
@@ -715,13 +715,13 @@ static void mxcmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        int burstlen, ret;
 
        /*
-        * use burstlen of 64 in 4 bit mode (--> reg value  0)
-        * use burstlen of 16 in 1 bit mode (--> reg value 16)
+        * use burstlen of 64 (16 words) in 4 bit mode (--> reg value  0)
+        * use burstlen of 16 (4 words) in 1 bit mode (--> reg value 16)
         */
        if (ios->bus_width == MMC_BUS_WIDTH_4)
-               burstlen = 64;
-       else
                burstlen = 16;
+       else
+               burstlen = 4;
 
        if (mxcmci_use_dma(host) && burstlen != host->burstlen) {
                host->burstlen = burstlen;
index 4173b3d87f979d2757f1498bd503f15b07195542..43fdc24f7e8d6fdf323f096fee6c01682c433a24 100644 (file)
@@ -110,12 +110,12 @@ static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream,
                slave_config.direction = DMA_TO_DEVICE;
                slave_config.dst_addr = dma_params->dma_addr;
                slave_config.dst_addr_width = buswidth;
-               slave_config.dst_maxburst = dma_params->burstsize * buswidth;
+               slave_config.dst_maxburst = dma_params->burstsize;
        } else {
                slave_config.direction = DMA_FROM_DEVICE;
                slave_config.src_addr = dma_params->dma_addr;
                slave_config.src_addr_width = buswidth;
-               slave_config.src_maxburst = dma_params->burstsize * buswidth;
+               slave_config.src_maxburst = dma_params->burstsize;
        }
 
        ret = dmaengine_slave_config(iprtd->dma_chan, &slave_config);