提交 4d09a938 编写于 作者: A Arnd Bergmann

Merge branches 'cns3xxx/devel', 'davinci/devel', 'imx/devel', 'lpc32xx/devel',...

Merge branches 'cns3xxx/devel', 'davinci/devel', 'imx/devel', 'lpc32xx/devel', 'pxa/devel', 'tegra/devel' and 'stericsson/master' of git+ssh://master.kernel.org/pub/scm/linux/kernel/git/arm/linux-arm-soc into next/devel
...@@ -2,13 +2,7 @@ Intro ...@@ -2,13 +2,7 @@ Intro
===== =====
This document is designed to provide a list of the minimum levels of This document is designed to provide a list of the minimum levels of
software necessary to run the 2.6 kernels, as well as provide brief software necessary to run the 3.0 kernels.
instructions regarding any other "Gotchas" users may encounter when
trying life on the Bleeding Edge. If upgrading from a pre-2.4.x
kernel, please consult the Changes file included with 2.4.x kernels for
additional information; most of that information will not be repeated
here. Basically, this document assumes that your system is already
functional and running at least 2.4.x kernels.
This document is originally based on my "Changes" file for 2.0.x kernels This document is originally based on my "Changes" file for 2.0.x kernels
and therefore owes credit to the same people as that file (Jared Mauch, and therefore owes credit to the same people as that file (Jared Mauch,
...@@ -22,11 +16,10 @@ Upgrade to at *least* these software revisions before thinking you've ...@@ -22,11 +16,10 @@ Upgrade to at *least* these software revisions before thinking you've
encountered a bug! If you're unsure what version you're currently encountered a bug! If you're unsure what version you're currently
running, the suggested command should tell you. running, the suggested command should tell you.
Again, keep in mind that this list assumes you are already Again, keep in mind that this list assumes you are already functionally
functionally running a Linux 2.4 kernel. Also, not all tools are running a Linux kernel. Also, not all tools are necessary on all
necessary on all systems; obviously, if you don't have any ISDN systems; obviously, if you don't have any ISDN hardware, for example,
hardware, for example, you probably needn't concern yourself with you probably needn't concern yourself with isdn4k-utils.
isdn4k-utils.
o Gnu C 3.2 # gcc --version o Gnu C 3.2 # gcc --version
o Gnu make 3.80 # make --version o Gnu make 3.80 # make --version
...@@ -114,12 +107,12 @@ Ksymoops ...@@ -114,12 +107,12 @@ Ksymoops
If the unthinkable happens and your kernel oopses, you may need the If the unthinkable happens and your kernel oopses, you may need the
ksymoops tool to decode it, but in most cases you don't. ksymoops tool to decode it, but in most cases you don't.
In the 2.6 kernel it is generally preferred to build the kernel with It is generally preferred to build the kernel with CONFIG_KALLSYMS so
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is that it produces readable dumps that can be used as-is (this also
(this also produces better output than ksymoops). produces better output than ksymoops). If for some reason your kernel
If for some reason your kernel is not build with CONFIG_KALLSYMS and is not build with CONFIG_KALLSYMS and you have no way to rebuild and
you have no way to rebuild and reproduce the Oops with that option, then reproduce the Oops with that option, then you can still decode that Oops
you can still decode that Oops with ksymoops. with ksymoops.
Module-Init-Tools Module-Init-Tools
----------------- -----------------
...@@ -261,8 +254,8 @@ needs to be recompiled or (preferably) upgraded. ...@@ -261,8 +254,8 @@ needs to be recompiled or (preferably) upgraded.
NFS-utils NFS-utils
--------- ---------
In 2.4 and earlier kernels, the nfs server needed to know about any In ancient (2.4 and earlier) kernels, the nfs server needed to know
client that expected to be able to access files via NFS. This about any client that expected to be able to access files via NFS. This
information would be given to the kernel by "mountd" when the client information would be given to the kernel by "mountd" when the client
mounted the filesystem, or by "exportfs" at system startup. exportfs mounted the filesystem, or by "exportfs" at system startup. exportfs
would take information about active clients from /var/lib/nfs/rmtab. would take information about active clients from /var/lib/nfs/rmtab.
...@@ -272,11 +265,11 @@ which is not always easy, particularly when trying to implement ...@@ -272,11 +265,11 @@ which is not always easy, particularly when trying to implement
fail-over. Even when the system is working well, rmtab suffers from fail-over. Even when the system is working well, rmtab suffers from
getting lots of old entries that never get removed. getting lots of old entries that never get removed.
With 2.6 we have the option of having the kernel tell mountd when it With modern kernels we have the option of having the kernel tell mountd
gets a request from an unknown host, and mountd can give appropriate when it gets a request from an unknown host, and mountd can give
export information to the kernel. This removes the dependency on appropriate export information to the kernel. This removes the
rmtab and means that the kernel only needs to know about currently dependency on rmtab and means that the kernel only needs to know about
active clients. currently active clients.
To enable this new functionality, you need to: To enable this new functionality, you need to:
......
...@@ -680,8 +680,8 @@ ones already enabled by DEBUG. ...@@ -680,8 +680,8 @@ ones already enabled by DEBUG.
Chapter 14: Allocating memory Chapter 14: Allocating memory
The kernel provides the following general purpose memory allocators: The kernel provides the following general purpose memory allocators:
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to
documentation for further information about them. the API documentation for further information about them.
The preferred form for passing a size of a struct is the following: The preferred form for passing a size of a struct is the following:
......
...@@ -77,7 +77,7 @@ Throttling/Upper Limit policy ...@@ -77,7 +77,7 @@ Throttling/Upper Limit policy
- Specify a bandwidth rate on particular device for root group. The format - Specify a bandwidth rate on particular device for root group. The format
for policy is "<major>:<minor> <byes_per_second>". for policy is "<major>:<minor> <byes_per_second>".
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.read_bps_device echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
Above will put a limit of 1MB/second on reads happening for root group Above will put a limit of 1MB/second on reads happening for root group
on device having major/minor number 8:16. on device having major/minor number 8:16.
...@@ -90,7 +90,7 @@ Throttling/Upper Limit policy ...@@ -90,7 +90,7 @@ Throttling/Upper Limit policy
1024+0 records out 1024+0 records out
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s 4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
Limits for writes can be put using blkio.write_bps_device file. Limits for writes can be put using blkio.throttle.write_bps_device file.
Hierarchical Cgroups Hierarchical Cgroups
==================== ====================
...@@ -286,28 +286,28 @@ Throttling/Upper limit policy files ...@@ -286,28 +286,28 @@ Throttling/Upper limit policy files
specified in bytes per second. Rules are per deivce. Following is specified in bytes per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.read_bps_device echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
- blkio.throttle.write_bps_device - blkio.throttle.write_bps_device
- Specifies upper limit on WRITE rate to the device. IO rate is - Specifies upper limit on WRITE rate to the device. IO rate is
specified in bytes per second. Rules are per deivce. Following is specified in bytes per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.write_bps_device echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
- blkio.throttle.read_iops_device - blkio.throttle.read_iops_device
- Specifies upper limit on READ rate from the device. IO rate is - Specifies upper limit on READ rate from the device. IO rate is
specified in IO per second. Rules are per deivce. Following is specified in IO per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.read_iops_device echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
- blkio.throttle.write_iops_device - blkio.throttle.write_iops_device
- Specifies upper limit on WRITE rate to the device. IO rate is - Specifies upper limit on WRITE rate to the device. IO rate is
specified in io per second. Rules are per deivce. Following is specified in io per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.write_iops_device echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
Note: If both BW and IOPS rules are specified for a device, then IO is Note: If both BW and IOPS rules are specified for a device, then IO is
subjectd to both the constraints. subjectd to both the constraints.
......
...@@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl. ...@@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl.
Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---------------------------- ----------------------------
What: For VIDIOC_S_FREQUENCY the type field must match the device node's type.
If not, return -EINVAL.
When: 3.2
Why: It makes no sense to switch the tuner to radio mode by calling
VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by
calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a
move to more consistent handling of tv and radio tuners.
Who: Hans Verkuil <hans.verkuil@cisco.com>
----------------------------
What: Opening a radio device node will no longer automatically switch the
tuner mode from tv to radio.
When: 3.3
Why: Just opening a V4L device should not change the state of the hardware
like that. It's very unexpected and against the V4L spec. Instead, you
switch to radio mode by calling VIDIOC_S_FREQUENCY. This is the second
and last step of the move to consistent handling of tv and radio tuners.
Who: Hans Verkuil <hans.verkuil@cisco.com>
----------------------------
...@@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request - ...@@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request -
in which case the page will not be stored in the cache this time. in which case the page will not be stored in the cache this time.
BULK INODE PAGE UNCACHE
-----------------------
A convenience routine is provided to perform an uncache on all the pages
attached to an inode. This assumes that the pages on the inode correspond on a
1:1 basis with the pages in the cache.
void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
struct inode *inode);
This takes the netfs cookie that the pages were cached with and the inode that
the pages are attached to. This function will wait for pages to finish being
written to the cache and for the cache to finish with the page generally. No
error is returned.
========================== ==========================
INDEX AND DATA FILE UPDATE INDEX AND DATA FILE UPDATE
========================== ==========================
......
...@@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
the default. the default.
off: Turn ECRC off off: Turn ECRC off
on: Turn ECRC on. on: Turn ECRC on.
realloc reallocate PCI resources if allocations done by BIOS
are erroneous.
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
Management. Management.
......
...@@ -534,6 +534,8 @@ Events that are never propagated by the driver: ...@@ -534,6 +534,8 @@ Events that are never propagated by the driver:
0x2404 System is waking up from hibernation to undock 0x2404 System is waking up from hibernation to undock
0x2405 System is waking up from hibernation to eject bay 0x2405 System is waking up from hibernation to eject bay
0x5010 Brightness level changed/control event 0x5010 Brightness level changed/control event
0x6000 KEYBOARD: Numlock key pressed
0x6005 KEYBOARD: Fn key pressed (TO BE VERIFIED)
Events that are propagated by the driver to userspace: Events that are propagated by the driver to userspace:
...@@ -545,6 +547,8 @@ Events that are propagated by the driver to userspace: ...@@ -545,6 +547,8 @@ Events that are propagated by the driver to userspace:
0x3006 Bay hotplug request (hint to power up SATA link when 0x3006 Bay hotplug request (hint to power up SATA link when
the optical drive tray is ejected) the optical drive tray is ejected)
0x4003 Undocked (see 0x2x04), can sleep again 0x4003 Undocked (see 0x2x04), can sleep again
0x4010 Docked into hotplug port replicator (non-ACPI dock)
0x4011 Undocked from hotplug port replicator (non-ACPI dock)
0x500B Tablet pen inserted into its storage bay 0x500B Tablet pen inserted into its storage bay
0x500C Tablet pen removed from its storage bay 0x500C Tablet pen removed from its storage bay
0x6011 ALARM: battery is too hot 0x6011 ALARM: battery is too hot
...@@ -552,6 +556,7 @@ Events that are propagated by the driver to userspace: ...@@ -552,6 +556,7 @@ Events that are propagated by the driver to userspace:
0x6021 ALARM: a sensor is too hot 0x6021 ALARM: a sensor is too hot
0x6022 ALARM: a sensor is extremely hot 0x6022 ALARM: a sensor is extremely hot
0x6030 System thermal table changed 0x6030 System thermal table changed
0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED)
Battery nearly empty alarms are a last resort attempt to get the Battery nearly empty alarms are a last resort attempt to get the
operating system to hibernate or shutdown cleanly (0x2313), or shutdown operating system to hibernate or shutdown cleanly (0x2313), or shutdown
......
...@@ -13,18 +13,8 @@ static DEFINE_SPINLOCK(xxx_lock); ...@@ -13,18 +13,8 @@ static DEFINE_SPINLOCK(xxx_lock);
The above is always safe. It will disable interrupts _locally_, but the The above is always safe. It will disable interrupts _locally_, but the
spinlock itself will guarantee the global lock, so it will guarantee that spinlock itself will guarantee the global lock, so it will guarantee that
there is only one thread-of-control within the region(s) protected by that there is only one thread-of-control within the region(s) protected by that
lock. This works well even under UP. The above sequence under UP lock. This works well even under UP also, so the code does _not_ need to
essentially is just the same as doing worry about UP vs SMP issues: the spinlocks work correctly under both.
unsigned long flags;
save_flags(flags); cli();
... critical section ...
restore_flags(flags);
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
work correctly under both (and spinlocks are actually more efficient on
architectures that allow doing the "save_flags + cli" in one operation).
NOTE! Implications of spin_locks for memory are further described in: NOTE! Implications of spin_locks for memory are further described in:
...@@ -36,27 +26,7 @@ The above is usually pretty simple (you usually need and want only one ...@@ -36,27 +26,7 @@ The above is usually pretty simple (you usually need and want only one
spinlock for most things - using more than one spinlock can make things a spinlock for most things - using more than one spinlock can make things a
lot more complex and even slower and is usually worth it only for lot more complex and even slower and is usually worth it only for
sequences that you _know_ need to be split up: avoid it at all cost if you sequences that you _know_ need to be split up: avoid it at all cost if you
aren't sure). HOWEVER, it _does_ mean that if you have some code that does aren't sure).
cli();
.. critical section ..
sti();
and another sequence that does
spin_lock_irqsave(flags);
.. critical section ..
spin_unlock_irqrestore(flags);
then they are NOT mutually exclusive, and the critical regions can happen
at the same time on two different CPU's. That's fine per se, but the
critical regions had better be critical for different things (ie they
can't stomp on each other).
The above is a problem mainly if you end up mixing code - for example the
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
their actions, and if a driver uses spinlocks instead then you should
think about issues like the above.
This is really the only really hard part about spinlocks: once you start This is really the only really hard part about spinlocks: once you start
using spinlocks they tend to expand to areas you might not have noticed using spinlocks they tend to expand to areas you might not have noticed
...@@ -120,11 +90,10 @@ Lesson 3: spinlocks revisited. ...@@ -120,11 +90,10 @@ Lesson 3: spinlocks revisited.
The single spin-lock primitives above are by no means the only ones. They The single spin-lock primitives above are by no means the only ones. They
are the most safe ones, and the ones that work under all circumstances, are the most safe ones, and the ones that work under all circumstances,
but partly _because_ they are safe they are also fairly slow. They are but partly _because_ they are safe they are also fairly slow. They are slower
much faster than a generic global cli/sti pair, but slower than they'd than they'd need to be, because they do have to disable interrupts
need to be, because they do have to disable interrupts (which is just a (which is just a single instruction on a x86, but it's an expensive one -
single instruction on a x86, but it's an expensive one - and on other and on other architectures it can be worse).
architectures it can be worse).
If you have a case where you have to protect a data structure across If you have a case where you have to protect a data structure across
several CPU's and you want to use spinlocks you can potentially use several CPU's and you want to use spinlocks you can potentially use
......
...@@ -594,6 +594,16 @@ S: Maintained ...@@ -594,6 +594,16 @@ S: Maintained
F: arch/arm/lib/floppydma.S F: arch/arm/lib/floppydma.S
F: arch/arm/include/asm/floppy.h F: arch/arm/include/asm/floppy.h
ARM PMU PROFILING AND DEBUGGING
M: Will Deacon <will.deacon@arm.com>
S: Maintained
F: arch/arm/kernel/perf_event*
F: arch/arm/oprofile/common.c
F: arch/arm/kernel/pmu.c
F: arch/arm/include/asm/pmu.h
F: arch/arm/kernel/hw_breakpoint.c
F: arch/arm/include/asm/hw_breakpoint.h
ARM PORT ARM PORT
M: Russell King <linux@arm.linux.org.uk> M: Russell King <linux@arm.linux.org.uk>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
...@@ -2197,7 +2207,7 @@ F: drivers/acpi/dock.c ...@@ -2197,7 +2207,7 @@ F: drivers/acpi/dock.c
DOCUMENTATION DOCUMENTATION
M: Randy Dunlap <rdunlap@xenotime.net> M: Randy Dunlap <rdunlap@xenotime.net>
L: linux-doc@vger.kernel.org L: linux-doc@vger.kernel.org
T: quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/ T: quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/
S: Maintained S: Maintained
F: Documentation/ F: Documentation/
...@@ -4982,7 +4992,7 @@ F: drivers/power/power_supply* ...@@ -4982,7 +4992,7 @@ F: drivers/power/power_supply*
PNP SUPPORT PNP SUPPORT
M: Adam Belay <abelay@mit.edu> M: Adam Belay <abelay@mit.edu>
M: Bjorn Helgaas <bjorn.helgaas@hp.com> M: Bjorn Helgaas <bhelgaas@google.com>
S: Maintained S: Maintained
F: drivers/pnp/ F: drivers/pnp/
...@@ -6733,6 +6743,7 @@ F: fs/fat/ ...@@ -6733,6 +6743,7 @@ F: fs/fat/
VIDEOBUF2 FRAMEWORK VIDEOBUF2 FRAMEWORK
M: Pawel Osciak <pawel@osciak.com> M: Pawel Osciak <pawel@osciak.com>
M: Marek Szyprowski <m.szyprowski@samsung.com> M: Marek Szyprowski <m.szyprowski@samsung.com>
M: Kyungmin Park <kyungmin.park@samsung.com>
L: linux-media@vger.kernel.org L: linux-media@vger.kernel.org
S: Maintained S: Maintained
F: drivers/media/video/videobuf2-* F: drivers/media/video/videobuf2-*
......
VERSION = 3 VERSION = 3
PATCHLEVEL = 0 PATCHLEVEL = 0
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc6 EXTRAVERSION = -rc7
NAME = Sneaky Weasel NAME = Sneaky Weasel
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -376,6 +376,7 @@ config ARCH_MXC ...@@ -376,6 +376,7 @@ config ARCH_MXC
select ARCH_REQUIRE_GPIOLIB select ARCH_REQUIRE_GPIOLIB
select CLKDEV_LOOKUP select CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
select GENERIC_IRQ_CHIP
select HAVE_SCHED_CLOCK select HAVE_SCHED_CLOCK
help help
Support for Freescale MXC/iMX-based family of processors Support for Freescale MXC/iMX-based family of processors
...@@ -591,7 +592,6 @@ config ARCH_TEGRA ...@@ -591,7 +592,6 @@ config ARCH_TEGRA
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select HAVE_SCHED_CLOCK select HAVE_SCHED_CLOCK
select ARCH_HAS_BARRIERS if CACHE_L2X0
select ARCH_HAS_CPUFREQ select ARCH_HAS_CPUFREQ
help help
This enables support for NVIDIA Tegra based systems (Tegra APX, This enables support for NVIDIA Tegra based systems (Tegra APX,
...@@ -618,6 +618,8 @@ config ARCH_PXA ...@@ -618,6 +618,8 @@ config ARCH_PXA
select TICK_ONESHOT select TICK_ONESHOT
select PLAT_PXA select PLAT_PXA
select SPARSE_IRQ select SPARSE_IRQ
select AUTO_ZRELADDR
select MULTI_IRQ_HANDLER
help help
Support for Intel/Marvell's PXA2xx/PXA3xx processor line. Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
......
...@@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size, ...@@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
if (buf == 0) { if (buf == 0) {
dev_err(dev, "%s: unable to map unsafe buffer %p!\n", dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
__func__, ptr); __func__, ptr);
return 0; return ~0;
} }
dev_dbg(dev, dev_dbg(dev,
......
...@@ -106,6 +106,7 @@ CONFIG_GPIO_SYSFS=y ...@@ -106,6 +106,7 @@ CONFIG_GPIO_SYSFS=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MXC=y CONFIG_USB_EHCI_MXC=y
CONFIG_USB_STORAGE=y
CONFIG_MMC=y CONFIG_MMC=y
CONFIG_MMC_BLOCK=m CONFIG_MMC_BLOCK=m
CONFIG_MMC_SDHCI=m CONFIG_MMC_SDHCI=m
...@@ -145,7 +146,7 @@ CONFIG_ROOT_NFS=y ...@@ -145,7 +146,7 @@ CONFIG_ROOT_NFS=y
CONFIG_NLS_DEFAULT="cp437" CONFIG_NLS_DEFAULT="cp437"
CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=m CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_UTF8=y CONFIG_NLS_UTF8=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
......
...@@ -22,6 +22,8 @@ CONFIG_BLK_DEV_INTEGRITY=y ...@@ -22,6 +22,8 @@ CONFIG_BLK_DEV_INTEGRITY=y
# CONFIG_IOSCHED_DEADLINE is not set # CONFIG_IOSCHED_DEADLINE is not set
# CONFIG_IOSCHED_CFQ is not set # CONFIG_IOSCHED_CFQ is not set
CONFIG_ARCH_MXS=y CONFIG_ARCH_MXS=y
CONFIG_MACH_MX23EVK=y
CONFIG_MACH_MX28EVK=y
CONFIG_MACH_STMP378X_DEVB=y CONFIG_MACH_STMP378X_DEVB=y
CONFIG_MACH_TX28=y CONFIG_MACH_TX28=y
# CONFIG_ARM_THUMB is not set # CONFIG_ARM_THUMB is not set
...@@ -89,7 +91,7 @@ CONFIG_DISPLAY_SUPPORT=m ...@@ -89,7 +91,7 @@ CONFIG_DISPLAY_SUPPORT=m
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
CONFIG_MMC=y CONFIG_MMC=y
CONFIG_MMC_MXS=y CONFIG_MMC_MXS=y
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_DS1307=m CONFIG_RTC_DRV_DS1307=m
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
CONFIG_MXS_DMA=y CONFIG_MXS_DMA=y
......
...@@ -11,12 +11,12 @@ CONFIG_ARCH_U8500=y ...@@ -11,12 +11,12 @@ CONFIG_ARCH_U8500=y
CONFIG_UX500_SOC_DB5500=y CONFIG_UX500_SOC_DB5500=y
CONFIG_UX500_SOC_DB8500=y CONFIG_UX500_SOC_DB8500=y
CONFIG_MACH_U8500=y CONFIG_MACH_U8500=y
CONFIG_MACH_SNOWBALL=y
CONFIG_MACH_U5500=y CONFIG_MACH_U5500=y
CONFIG_NO_HZ=y CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=2 CONFIG_NR_CPUS=2
CONFIG_HOTPLUG_CPU=y
CONFIG_PREEMPT=y CONFIG_PREEMPT=y
CONFIG_AEABI=y CONFIG_AEABI=y
CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8" CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8"
...@@ -25,8 +25,13 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y ...@@ -25,8 +25,13 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_VFP=y CONFIG_VFP=y
CONFIG_NEON=y CONFIG_NEON=y
CONFIG_NET=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=y
CONFIG_PHONET_PIPECTRLR=y
# CONFIG_WIRELESS is not set # CONFIG_WIRELESS is not set
CONFIG_CAIF=y CONFIG_CAIF=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
...@@ -35,6 +40,13 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 ...@@ -35,6 +40,13 @@ CONFIG_BLK_DEV_RAM_SIZE=65536
CONFIG_MISC_DEVICES=y CONFIG_MISC_DEVICES=y
CONFIG_AB8500_PWM=y CONFIG_AB8500_PWM=y
CONFIG_SENSORS_BH1780=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_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_EVDEV=y CONFIG_INPUT_EVDEV=y
# CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_ATKBD is not set
...@@ -49,9 +61,9 @@ CONFIG_INPUT_MISC=y ...@@ -49,9 +61,9 @@ CONFIG_INPUT_MISC=y
CONFIG_INPUT_AB8500_PONKEY=y CONFIG_INPUT_AB8500_PONKEY=y
# CONFIG_SERIO is not set # CONFIG_SERIO is not set
CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_VT_HW_CONSOLE_BINDING=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_NOMADIK=y CONFIG_HW_RANDOM_NOMADIK=y
CONFIG_I2C=y CONFIG_I2C=y
...@@ -64,14 +76,19 @@ CONFIG_GPIO_TC3589X=y ...@@ -64,14 +76,19 @@ CONFIG_GPIO_TC3589X=y
CONFIG_MFD_STMPE=y CONFIG_MFD_STMPE=y
CONFIG_MFD_TC3589X=y CONFIG_MFD_TC3589X=y
CONFIG_AB8500_CORE=y CONFIG_AB8500_CORE=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_AB8500=y CONFIG_REGULATOR_AB8500=y
# CONFIG_HID_SUPPORT is not set # 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=y
CONFIG_MMC_CLKGATE=y
CONFIG_MMC_ARMMMCI=y CONFIG_MMC_ARMMMCI=y
CONFIG_NEW_LEDS=y CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS=y
CONFIG_LEDS_LM3530=y
CONFIG_LEDS_LP5521=y CONFIG_LEDS_LP5521=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_AB8500=y CONFIG_RTC_DRV_AB8500=y
...@@ -79,7 +96,6 @@ CONFIG_RTC_DRV_PL031=y ...@@ -79,7 +96,6 @@ CONFIG_RTC_DRV_PL031=y
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
CONFIG_STE_DMA40=y CONFIG_STE_DMA40=y
CONFIG_STAGING=y CONFIG_STAGING=y
# CONFIG_STAGING_EXCLUDE_BUILD is not set
CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_XATTR=y
...@@ -91,6 +107,8 @@ CONFIG_TMPFS=y ...@@ -91,6 +107,8 @@ CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_POSIX_ACL=y
CONFIG_CONFIGFS_FS=m CONFIG_CONFIGFS_FS=m
# CONFIG_MISC_FILESYSTEMS is not set # CONFIG_MISC_FILESYSTEMS is not set
CONFIG_NFS_FS=y
CONFIG_ROOT_NFS=y
CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_1=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
...@@ -99,7 +117,5 @@ CONFIG_DEBUG_KERNEL=y ...@@ -99,7 +117,5 @@ CONFIG_DEBUG_KERNEL=y
# CONFIG_SCHED_DEBUG is not set # CONFIG_SCHED_DEBUG is not set
# CONFIG_DEBUG_PREEMPT is not set # CONFIG_DEBUG_PREEMPT is not set
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
# CONFIG_FTRACE is not set # CONFIG_FTRACE is not set
CONFIG_DEBUG_USER=y CONFIG_DEBUG_USER=y
CONFIG_DEBUG_ERRORS=y
...@@ -23,6 +23,7 @@ struct pt_regs; ...@@ -23,6 +23,7 @@ struct pt_regs;
extern void migrate_irqs(void); extern void migrate_irqs(void);
extern void asm_do_IRQ(unsigned int, struct pt_regs *); extern void asm_do_IRQ(unsigned int, struct pt_regs *);
void handle_IRQ(unsigned int, struct pt_regs *);
void init_IRQ(void); void init_IRQ(void);
#endif #endif
......
...@@ -67,12 +67,12 @@ int arch_show_interrupts(struct seq_file *p, int prec) ...@@ -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 * handle_IRQ handles all hardware IRQ's. Decoded IRQs should
* come via this function. Instead, they should provide their * not come via this function. Instead, they should provide their
* own 'handler' * own 'handler'. Used by platform code implementing C-based 1st
* level decoding.
*/ */
asmlinkage void __exception_irq_entry void handle_IRQ(unsigned int irq, struct pt_regs *regs)
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{ {
struct pt_regs *old_regs = set_irq_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) ...@@ -97,6 +97,15 @@ asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
set_irq_regs(old_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) void set_irq_flags(unsigned int irq, unsigned int iflags)
{ {
unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
......
...@@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event) ...@@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)
static void armpmu_enable(struct pmu *pmu) static void armpmu_enable(struct pmu *pmu)
{ {
/* Enable all of the perf events on hardware. */ /* Enable all of the perf events on hardware. */
int idx; int idx, enabled = 0;
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
if (!armpmu) if (!armpmu)
...@@ -596,8 +596,10 @@ static void armpmu_enable(struct pmu *pmu) ...@@ -596,8 +596,10 @@ static void armpmu_enable(struct pmu *pmu)
continue; continue;
armpmu->enable(&event->hw, idx); armpmu->enable(&event->hw, idx);
enabled = 1;
} }
if (enabled)
armpmu->start(); armpmu->start();
} }
......
...@@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup); ...@@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);
#endif #endif
extern void paging_init(struct machine_desc *desc); extern void paging_init(struct machine_desc *desc);
extern void sanity_check_meminfo(void);
extern void reboot_setup(char *str); extern void reboot_setup(char *str);
unsigned int processor_id; unsigned int processor_id;
...@@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)
parse_early_param(); parse_early_param();
sanity_check_meminfo();
arm_memblock_init(&meminfo, mdesc); arm_memblock_init(&meminfo, mdesc);
paging_init(mdesc); paging_init(mdesc);
......
...@@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void) ...@@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5); twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000, printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
(twd_timer_rate / 1000000) % 100); (twd_timer_rate / 10000) % 100);
} }
} }
......
...@@ -1117,6 +1117,8 @@ static __init int da850_evm_init_cpufreq(void) ...@@ -1117,6 +1117,8 @@ static __init int da850_evm_init_cpufreq(void)
static __init int da850_evm_init_cpufreq(void) { return 0; } static __init int da850_evm_init_cpufreq(void) { return 0; }
#endif #endif
#define DA850EVM_SATA_REFCLKPN_RATE (100 * 1000 * 1000)
static __init void da850_evm_init(void) static __init void da850_evm_init(void)
{ {
int ret; int ret;
...@@ -1237,6 +1239,11 @@ static __init void da850_evm_init(void) ...@@ -1237,6 +1239,11 @@ static __init void da850_evm_init(void)
if (ret) if (ret)
pr_warning("da850_evm_init: spi 1 registration failed: %d\n", pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
ret); 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 #ifdef CONFIG_SERIAL_8250_CONSOLE
......
...@@ -44,7 +44,7 @@ static void __clk_enable(struct clk *clk) ...@@ -44,7 +44,7 @@ static void __clk_enable(struct clk *clk)
__clk_enable(clk->parent); __clk_enable(clk->parent);
if (clk->usecount++ == 0 && (clk->flags & CLK_PSC)) if (clk->usecount++ == 0 && (clk->flags & CLK_PSC))
davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc, davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
PSC_STATE_ENABLE); true, clk->flags);
} }
static void __clk_disable(struct clk *clk) static void __clk_disable(struct clk *clk)
...@@ -54,8 +54,7 @@ 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) && if (--clk->usecount == 0 && !(clk->flags & CLK_PLL) &&
(clk->flags & CLK_PSC)) (clk->flags & CLK_PSC))
davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc, davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
(clk->flags & PSC_SWRSTDISABLE) ? false, clk->flags);
PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
if (clk->parent) if (clk->parent)
__clk_disable(clk->parent); __clk_disable(clk->parent);
} }
...@@ -239,8 +238,7 @@ static int __init clk_disable_unused(void) ...@@ -239,8 +238,7 @@ static int __init clk_disable_unused(void)
pr_debug("Clocks: disable unused %s\n", ck->name); pr_debug("Clocks: disable unused %s\n", ck->name);
davinci_psc_config(psc_domain(ck), ck->gpsc, ck->lpsc, davinci_psc_config(psc_domain(ck), ck->gpsc, ck->lpsc,
(ck->flags & PSC_SWRSTDISABLE) ? false, ck->flags);
PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
} }
spin_unlock_irq(&clockfw_lock); spin_unlock_irq(&clockfw_lock);
......
...@@ -111,6 +111,7 @@ struct clk { ...@@ -111,6 +111,7 @@ struct clk {
#define CLK_PLL BIT(4) /* PLL-derived clock */ #define CLK_PLL BIT(4) /* PLL-derived clock */
#define PRE_PLL BIT(5) /* source is before PLL mult/div */ #define PRE_PLL BIT(5) /* source is before PLL mult/div */
#define PSC_SWRSTDISABLE BIT(6) /* Disable state is SwRstDisable */ #define PSC_SWRSTDISABLE BIT(6) /* Disable state is SwRstDisable */
#define PSC_FORCE BIT(7) /* Force module state transtition */
#define CLK(dev, con, ck) \ #define CLK(dev, con, ck) \
{ \ { \
......
...@@ -58,6 +58,7 @@ static struct pll_data pll0_data = { ...@@ -58,6 +58,7 @@ static struct pll_data pll0_data = {
static struct clk ref_clk = { static struct clk ref_clk = {
.name = "ref_clk", .name = "ref_clk",
.rate = DA850_REF_FREQ, .rate = DA850_REF_FREQ,
.set_rate = davinci_simple_set_rate,
}; };
static struct clk pll0_clk = { static struct clk pll0_clk = {
...@@ -373,6 +374,14 @@ static struct clk spi1_clk = { ...@@ -373,6 +374,14 @@ static struct clk spi1_clk = {
.flags = DA850_CLK_ASYNC3, .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[] = { static struct clk_lookup da850_clks[] = {
CLK(NULL, "ref", &ref_clk), CLK(NULL, "ref", &ref_clk),
CLK(NULL, "pll0", &pll0_clk), CLK(NULL, "pll0", &pll0_clk),
...@@ -419,6 +428,7 @@ static struct clk_lookup da850_clks[] = { ...@@ -419,6 +428,7 @@ static struct clk_lookup da850_clks[] = {
CLK(NULL, "usb20", &usb20_clk), CLK(NULL, "usb20", &usb20_clk),
CLK("spi_davinci.0", NULL, &spi0_clk), CLK("spi_davinci.0", NULL, &spi0_clk),
CLK("spi_davinci.1", NULL, &spi1_clk), CLK("spi_davinci.1", NULL, &spi1_clk),
CLK("ahci", NULL, &sata_clk),
CLK(NULL, NULL, NULL), CLK(NULL, NULL, NULL),
}; };
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/serial_8250.h> #include <linux/serial_8250.h>
#include <linux/ahci_platform.h>
#include <linux/clk.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/common.h> #include <mach/common.h>
...@@ -33,6 +35,7 @@ ...@@ -33,6 +35,7 @@
#define DA8XX_SPI0_BASE 0x01c41000 #define DA8XX_SPI0_BASE 0x01c41000
#define DA830_SPI1_BASE 0x01e12000 #define DA830_SPI1_BASE 0x01e12000
#define DA8XX_LCD_CNTRL_BASE 0x01e13000 #define DA8XX_LCD_CNTRL_BASE 0x01e13000
#define DA850_SATA_BASE 0x01e18000
#define DA850_MMCSD1_BASE 0x01e1b000 #define DA850_MMCSD1_BASE 0x01e1b000
#define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000 #define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000
#define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000 #define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000
...@@ -842,3 +845,126 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info, ...@@ -842,3 +845,126 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info,
return platform_device_register(&da8xx_spi_device[instance]); 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
...@@ -57,6 +57,7 @@ extern unsigned int da850_max_speed; ...@@ -57,6 +57,7 @@ extern unsigned int da850_max_speed;
#define DA8XX_SYSCFG1_BASE (IO_PHYS + 0x22C000) #define DA8XX_SYSCFG1_BASE (IO_PHYS + 0x22C000)
#define DA8XX_SYSCFG1_VIRT(x) (da8xx_syscfg1_base + (x)) #define DA8XX_SYSCFG1_VIRT(x) (da8xx_syscfg1_base + (x))
#define DA8XX_DEEPSLEEP_REG 0x8 #define DA8XX_DEEPSLEEP_REG 0x8
#define DA8XX_PWRDN_REG 0x18
#define DA8XX_PSC0_BASE 0x01c10000 #define DA8XX_PSC0_BASE 0x01c10000
#define DA8XX_PLL0_BASE 0x01c11000 #define DA8XX_PLL0_BASE 0x01c11000
...@@ -89,6 +90,7 @@ int da850_register_cpufreq(char *async_clk); ...@@ -89,6 +90,7 @@ int da850_register_cpufreq(char *async_clk);
int da8xx_register_cpuidle(void); int da8xx_register_cpuidle(void);
void __iomem * __init da8xx_get_mem_ctlr(void); void __iomem * __init da8xx_get_mem_ctlr(void);
int da850_register_pm(struct platform_device *pdev); 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 platform_device da8xx_serial_device;
extern struct emac_platform_data da8xx_emac_pdata; extern struct emac_platform_data da8xx_emac_pdata;
......
...@@ -244,12 +244,13 @@ ...@@ -244,12 +244,13 @@
#define PSC_STATE_ENABLE 3 #define PSC_STATE_ENABLE 3
#define MDSTAT_STATE_MASK 0x1f #define MDSTAT_STATE_MASK 0x1f
#define MDCTL_FORCE BIT(31)
#ifndef __ASSEMBLER__ #ifndef __ASSEMBLER__
extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id); extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id);
extern void davinci_psc_config(unsigned int domain, unsigned int ctlr, 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 #endif
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/psc.h> #include <mach/psc.h>
#include "clock.h"
/* Return nonzero iff the domain's clock is active */ /* Return nonzero iff the domain's clock is active */
int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id) 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) ...@@ -48,11 +50,12 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
/* Enable or disable a PSC domain */ /* Enable or disable a PSC domain */
void davinci_psc_config(unsigned int domain, unsigned int ctlr, 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; u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl;
void __iomem *psc_base; void __iomem *psc_base;
struct davinci_soc_info *soc_info = &davinci_soc_info; 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)) { if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
pr_warning("PSC: Bad psc data: 0x%x[%d]\n", pr_warning("PSC: Bad psc data: 0x%x[%d]\n",
...@@ -62,9 +65,18 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr, ...@@ -62,9 +65,18 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
psc_base = ioremap(soc_info->psc_bases[ctlr], SZ_4K); 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 = __raw_readl(psc_base + MDCTL + 4 * id);
mdctl &= ~MDSTAT_STATE_MASK; mdctl &= ~MDSTAT_STATE_MASK;
mdctl |= next_state; mdctl |= next_state;
if (flags & PSC_FORCE)
mdctl |= MDCTL_FORCE;
__raw_writel(mdctl, psc_base + MDCTL + 4 * id); __raw_writel(mdctl, psc_base + MDCTL + 4 * id);
pdstat = __raw_readl(psc_base + PDSTAT); pdstat = __raw_readl(psc_base + PDSTAT);
......
...@@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev, ...@@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,
unsigned int mcr; unsigned int mcr;
mcr = 0; mcr = 0;
if (!(mctrl & TIOCM_RTS)) if (mctrl & TIOCM_RTS)
mcr |= 2; mcr |= 2;
if (!(mctrl & TIOCM_DTR)) if (mctrl & TIOCM_DTR)
mcr |= 1; mcr |= 1;
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET); __raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <plat/sdhci.h> #include <plat/sdhci.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/fimc-core.h> #include <plat/fimc-core.h>
#include <plat/iic-core.h>
#include <mach/regs-irq.h> #include <mach/regs-irq.h>
...@@ -132,6 +133,11 @@ void __init exynos4_map_io(void) ...@@ -132,6 +133,11 @@ void __init exynos4_map_io(void)
s3c_fimc_setname(1, "exynos4-fimc"); s3c_fimc_setname(1, "exynos4-fimc");
s3c_fimc_setname(2, "exynos4-fimc"); s3c_fimc_setname(2, "exynos4-fimc");
s3c_fimc_setname(3, "exynos4-fimc"); s3c_fimc_setname(3, "exynos4-fimc");
/* The I2C bus controllers are directly compatible with s3c2440 */
s3c_i2c0_setname("s3c2440-i2c");
s3c_i2c1_setname("s3c2440-i2c");
s3c_i2c2_setname("s3c2440-i2c");
} }
void __init exynos4_init_clocks(int xtal) void __init exynos4_init_clocks(int xtal)
......
...@@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = { ...@@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev) static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
{ {
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3)); s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));
return 0; return 0;
} }
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
__INIT __CPUINIT
/* /*
* exynos4 specific entry point for secondary CPUs. This provides * exynos4 specific entry point for secondary CPUs. This provides
......
...@@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = { ...@@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
}; };
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = { static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
.cd_type = S3C_SDHCI_CD_GPIO, .cd_type = S3C_SDHCI_CD_INTERNAL,
.ext_cd_gpio = EXYNOS4_GPK0(2),
.ext_cd_gpio_invert = 1,
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT #ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
.max_width = 8, .max_width = 8,
...@@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = { ...@@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
}; };
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = { static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
.cd_type = S3C_SDHCI_CD_GPIO, .cd_type = S3C_SDHCI_CD_INTERNAL,
.ext_cd_gpio = EXYNOS4_GPK2(2),
.ext_cd_gpio_invert = 1,
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT #ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
.max_width = 8, .max_width = 8,
......
...@@ -167,6 +167,7 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD ...@@ -167,6 +167,7 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD
bool "Eukrea MBIMXSD development board" bool "Eukrea MBIMXSD development board"
select IMX_HAVE_PLATFORM_GPIO_KEYS select IMX_HAVE_PLATFORM_GPIO_KEYS
select IMX_HAVE_PLATFORM_IMX_SSI select IMX_HAVE_PLATFORM_IMX_SSI
select LEDS_GPIO_REGISTER
help help
This adds board specific devices that can be found on Eukrea's This adds board specific devices that can be found on Eukrea's
MBIMXSD evaluation board. MBIMXSD evaluation board.
...@@ -265,6 +266,7 @@ config MACH_EUKREA_MBIMX27_BASEBOARD ...@@ -265,6 +266,7 @@ config MACH_EUKREA_MBIMX27_BASEBOARD
select IMX_HAVE_PLATFORM_IMX_UART select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_MMC select IMX_HAVE_PLATFORM_MXC_MMC
select IMX_HAVE_PLATFORM_SPI_IMX select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
help help
This adds board specific devices that can be found on Eukrea's This adds board specific devices that can be found on Eukrea's
MBIMX27 evaluation board. MBIMX27 evaluation board.
...@@ -276,6 +278,7 @@ config MACH_MX27_3DS ...@@ -276,6 +278,7 @@ config MACH_MX27_3DS
select SOC_IMX27 select SOC_IMX27
select IMX_HAVE_PLATFORM_FSL_USB2_UDC select IMX_HAVE_PLATFORM_FSL_USB2_UDC
select IMX_HAVE_PLATFORM_IMX2_WDT select IMX_HAVE_PLATFORM_IMX2_WDT
select IMX_HAVE_PLATFORM_IMX_FB
select IMX_HAVE_PLATFORM_IMX_I2C select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_KEYPAD select IMX_HAVE_PLATFORM_IMX_KEYPAD
select IMX_HAVE_PLATFORM_IMX_UART select IMX_HAVE_PLATFORM_IMX_UART
...@@ -403,6 +406,7 @@ config MACH_MX31LITE ...@@ -403,6 +406,7 @@ config MACH_MX31LITE
select IMX_HAVE_PLATFORM_MXC_NAND select IMX_HAVE_PLATFORM_MXC_NAND
select IMX_HAVE_PLATFORM_MXC_RTC select IMX_HAVE_PLATFORM_MXC_RTC
select IMX_HAVE_PLATFORM_SPI_IMX select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
help help
Include support for MX31 LITEKIT platform. This includes specific Include support for MX31 LITEKIT platform. This includes specific
configurations for the board and its peripherals. configurations for the board and its peripherals.
...@@ -471,6 +475,7 @@ config MACH_MX31MOBOARD ...@@ -471,6 +475,7 @@ config MACH_MX31MOBOARD
select IMX_HAVE_PLATFORM_MXC_EHCI select IMX_HAVE_PLATFORM_MXC_EHCI
select IMX_HAVE_PLATFORM_MXC_MMC select IMX_HAVE_PLATFORM_MXC_MMC
select IMX_HAVE_PLATFORM_SPI_IMX select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
select MXC_ULPI if USB_ULPI select MXC_ULPI if USB_ULPI
help help
Include support for mx31moboard platform. This includes specific Include support for mx31moboard platform. This includes specific
...@@ -577,6 +582,7 @@ config MACH_EUKREA_MBIMXSD35_BASEBOARD ...@@ -577,6 +582,7 @@ config MACH_EUKREA_MBIMXSD35_BASEBOARD
select IMX_HAVE_PLATFORM_GPIO_KEYS select IMX_HAVE_PLATFORM_GPIO_KEYS
select IMX_HAVE_PLATFORM_IMX_SSI select IMX_HAVE_PLATFORM_IMX_SSI
select IMX_HAVE_PLATFORM_IPU_CORE select IMX_HAVE_PLATFORM_IPU_CORE
select LEDS_GPIO_REGISTER
help help
This adds board specific devices that can be found on Eukrea's This adds board specific devices that can be found on Eukrea's
MBIMXSD evaluation board. MBIMXSD evaluation board.
......
...@@ -475,7 +475,6 @@ void imx_dma_enable(int channel) ...@@ -475,7 +475,6 @@ void imx_dma_enable(int channel)
imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) | CCR_CEN | imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) | CCR_CEN |
CCR_ACRPT, DMA_CCR(channel)); CCR_ACRPT, DMA_CCR(channel));
#ifdef CONFIG_ARCH_MX2
if ((cpu_is_mx21() || cpu_is_mx27()) && if ((cpu_is_mx21() || cpu_is_mx27()) &&
imxdma->sg && imx_dma_hw_chain(imxdma)) { imxdma->sg && imx_dma_hw_chain(imxdma)) {
imxdma->sg = sg_next(imxdma->sg); imxdma->sg = sg_next(imxdma->sg);
...@@ -487,7 +486,6 @@ void imx_dma_enable(int channel) ...@@ -487,7 +486,6 @@ void imx_dma_enable(int channel)
DMA_CCR(channel)); DMA_CCR(channel));
} }
} }
#endif
imxdma->in_use = 1; imxdma->in_use = 1;
local_irq_restore(flags); local_irq_restore(flags);
...@@ -518,7 +516,6 @@ void imx_dma_disable(int channel) ...@@ -518,7 +516,6 @@ void imx_dma_disable(int channel)
} }
EXPORT_SYMBOL(imx_dma_disable); EXPORT_SYMBOL(imx_dma_disable);
#ifdef CONFIG_ARCH_MX2
static void imx_dma_watchdog(unsigned long chno) static void imx_dma_watchdog(unsigned long chno)
{ {
struct imx_dma_channel *imxdma = &imx_dma_channels[chno]; struct imx_dma_channel *imxdma = &imx_dma_channels[chno];
...@@ -530,7 +527,6 @@ static void imx_dma_watchdog(unsigned long chno) ...@@ -530,7 +527,6 @@ static void imx_dma_watchdog(unsigned long chno)
if (imxdma->err_handler) if (imxdma->err_handler)
imxdma->err_handler(chno, imxdma->data, IMX_DMA_ERR_TIMEOUT); imxdma->err_handler(chno, imxdma->data, IMX_DMA_ERR_TIMEOUT);
} }
#endif
static irqreturn_t dma_err_handler(int irq, void *dev_id) 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) ...@@ -654,10 +650,8 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
{ {
int i, disr; int i, disr;
#ifdef CONFIG_ARCH_MX2
if (cpu_is_mx21() || cpu_is_mx27()) if (cpu_is_mx21() || cpu_is_mx27())
dma_err_handler(irq, dev_id); dma_err_handler(irq, dev_id);
#endif
disr = imx_dmav1_readl(DMA_DISR); disr = imx_dmav1_readl(DMA_DISR);
...@@ -703,7 +697,6 @@ int imx_dma_request(int channel, const char *name) ...@@ -703,7 +697,6 @@ int imx_dma_request(int channel, const char *name)
imxdma->name = name; imxdma->name = name;
local_irq_restore(flags); /* request_irq() can block */ local_irq_restore(flags); /* request_irq() can block */
#ifdef CONFIG_ARCH_MX2
if (cpu_is_mx21() || cpu_is_mx27()) { if (cpu_is_mx21() || cpu_is_mx27()) {
ret = request_irq(MX2x_INT_DMACH0 + channel, ret = request_irq(MX2x_INT_DMACH0 + channel,
dma_irq_handler, 0, "DMA", NULL); dma_irq_handler, 0, "DMA", NULL);
...@@ -717,7 +710,6 @@ int imx_dma_request(int channel, const char *name) ...@@ -717,7 +710,6 @@ int imx_dma_request(int channel, const char *name)
imxdma->watchdog.function = &imx_dma_watchdog; imxdma->watchdog.function = &imx_dma_watchdog;
imxdma->watchdog.data = channel; imxdma->watchdog.data = channel;
} }
#endif
return ret; return ret;
} }
...@@ -744,10 +736,8 @@ void imx_dma_free(int channel) ...@@ -744,10 +736,8 @@ void imx_dma_free(int channel)
imx_dma_disable(channel); imx_dma_disable(channel);
imxdma->name = NULL; imxdma->name = NULL;
#ifdef CONFIG_ARCH_MX2
if (cpu_is_mx21() || cpu_is_mx27()) if (cpu_is_mx21() || cpu_is_mx27())
free_irq(MX2x_INT_DMACH0 + channel, NULL); free_irq(MX2x_INT_DMACH0 + channel, NULL);
#endif
local_irq_restore(flags); local_irq_restore(flags);
} }
...@@ -803,21 +793,13 @@ static int __init imx_dma_init(void) ...@@ -803,21 +793,13 @@ static int __init imx_dma_init(void)
int ret = 0; int ret = 0;
int i; int i;
#ifdef CONFIG_ARCH_MX1
if (cpu_is_mx1()) if (cpu_is_mx1())
imx_dmav1_baseaddr = MX1_IO_ADDRESS(MX1_DMA_BASE_ADDR); imx_dmav1_baseaddr = MX1_IO_ADDRESS(MX1_DMA_BASE_ADDR);
else else if (cpu_is_mx21())
#endif
#ifdef CONFIG_MACH_MX21
if (cpu_is_mx21())
imx_dmav1_baseaddr = MX21_IO_ADDRESS(MX21_DMA_BASE_ADDR); imx_dmav1_baseaddr = MX21_IO_ADDRESS(MX21_DMA_BASE_ADDR);
else else if (cpu_is_mx27())
#endif
#ifdef CONFIG_MACH_MX27
if (cpu_is_mx27())
imx_dmav1_baseaddr = MX27_IO_ADDRESS(MX27_DMA_BASE_ADDR); imx_dmav1_baseaddr = MX27_IO_ADDRESS(MX27_DMA_BASE_ADDR);
else else
#endif
return 0; return 0;
dma_clk = clk_get(NULL, "dma"); dma_clk = clk_get(NULL, "dma");
...@@ -828,7 +810,6 @@ static int __init imx_dma_init(void) ...@@ -828,7 +810,6 @@ static int __init imx_dma_init(void)
/* reset DMA module */ /* reset DMA module */
imx_dmav1_writel(DCR_DRST, DMA_DCR); imx_dmav1_writel(DCR_DRST, DMA_DCR);
#ifdef CONFIG_ARCH_MX1
if (cpu_is_mx1()) { if (cpu_is_mx1()) {
ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", NULL); ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", NULL);
if (ret) { if (ret) {
...@@ -843,7 +824,7 @@ static int __init imx_dma_init(void) ...@@ -843,7 +824,7 @@ static int __init imx_dma_init(void)
return ret; return ret;
} }
} }
#endif
/* enable DMA module */ /* enable DMA module */
imx_dmav1_writel(DCR_DEN, DMA_DCR); imx_dmav1_writel(DCR_DEN, DMA_DCR);
......
...@@ -112,7 +112,7 @@ eukrea_mbimx27_keymap_data __initconst = { ...@@ -112,7 +112,7 @@ eukrea_mbimx27_keymap_data __initconst = {
.keymap_size = ARRAY_SIZE(eukrea_mbimx27_keymap), .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", .name = "led1",
.default_trigger = "heartbeat", .default_trigger = "heartbeat",
...@@ -127,17 +127,10 @@ static struct gpio_led gpio_leds[] = { ...@@ -127,17 +127,10 @@ static struct gpio_led gpio_leds[] = {
}, },
}; };
static struct gpio_led_platform_data gpio_led_info = { static const struct gpio_led_platform_data
.leds = gpio_leds, eukrea_mbimx27_gpio_led_info __initconst = {
.num_leds = ARRAY_SIZE(gpio_leds), .leds = eukrea_mbimx27_gpio_leds,
}; .num_leds = ARRAY_SIZE(eukrea_mbimx27_gpio_leds),
static struct platform_device leds_gpio = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &gpio_led_info,
},
}; };
static struct imx_fb_videomode eukrea_mbimx27_modes[] = { static struct imx_fb_videomode eukrea_mbimx27_modes[] = {
...@@ -293,10 +286,6 @@ static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = { ...@@ -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 = { static const struct imxmmc_platform_data sdhc_pdata __initconst = {
.dat3_card_detect = 1, .dat3_card_detect = 1,
}; };
...@@ -377,5 +366,5 @@ void __init eukrea_mbimx27_baseboard_init(void) ...@@ -377,5 +366,5 @@ void __init eukrea_mbimx27_baseboard_init(void)
imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data); 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);
} }
...@@ -173,7 +173,7 @@ static struct platform_device eukrea_mbimxsd_lcd_powerdev = { ...@@ -173,7 +173,7 @@ static struct platform_device eukrea_mbimxsd_lcd_powerdev = {
.dev.platform_data = &eukrea_mbimxsd_lcd_power_data, .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", .name = "led1",
.default_trigger = "heartbeat", .default_trigger = "heartbeat",
...@@ -182,19 +182,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = { ...@@ -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, .leds = eukrea_mbimxsd_leds,
.num_leds = ARRAY_SIZE(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[] = { static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
{ {
.gpio = GPIO_SWITCH1, .gpio = GPIO_SWITCH1,
...@@ -212,7 +205,6 @@ static const struct gpio_keys_platform_data ...@@ -212,7 +205,6 @@ static const struct gpio_keys_platform_data
}; };
static struct platform_device *platform_devices[] __initdata = { static struct platform_device *platform_devices[] __initdata = {
&eukrea_mbimxsd_leds_gpio,
&eukrea_mbimxsd_lcd_powerdev, &eukrea_mbimxsd_lcd_powerdev,
}; };
...@@ -287,5 +279,6 @@ void __init eukrea_mbimxsd25_baseboard_init(void) ...@@ -287,5 +279,6 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
ARRAY_SIZE(eukrea_mbimxsd_i2c_devices)); ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
platform_add_devices(platform_devices, ARRAY_SIZE(platform_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); imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
} }
...@@ -193,19 +193,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = { ...@@ -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, .leds = eukrea_mbimxsd_leds,
.num_leds = ARRAY_SIZE(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[] = { static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
{ {
.gpio = GPIO_SWITCH1, .gpio = GPIO_SWITCH1,
...@@ -223,7 +216,6 @@ static const struct gpio_keys_platform_data ...@@ -223,7 +216,6 @@ static const struct gpio_keys_platform_data
}; };
static struct platform_device *platform_devices[] __initdata = { static struct platform_device *platform_devices[] __initdata = {
&eukrea_mbimxsd_leds_gpio,
&eukrea_mbimxsd_lcd_powerdev, &eukrea_mbimxsd_lcd_powerdev,
}; };
...@@ -299,5 +291,6 @@ void __init eukrea_mbimxsd35_baseboard_init(void) ...@@ -299,5 +291,6 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
ARRAY_SIZE(eukrea_mbimxsd_i2c_devices)); ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
platform_add_devices(platform_devices, ARRAY_SIZE(platform_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); imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
} }
...@@ -99,11 +99,6 @@ static struct platform_device dm9000x_device = { ...@@ -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 = { static const struct imxuart_platform_data uart1_pdata __initconst = {
.flags = IMXUART_HAVE_RTSCTS, .flags = IMXUART_HAVE_RTSCTS,
}; };
...@@ -115,11 +110,13 @@ static struct platform_device *devices[] __initdata = { ...@@ -115,11 +110,13 @@ static struct platform_device *devices[] __initdata = {
static void __init apf9328_init(void) static void __init apf9328_init(void)
{ {
imx1_soc_init();
mxc_gpio_setup_multiple_pins(apf9328_pins, mxc_gpio_setup_multiple_pins(apf9328_pins,
ARRAY_SIZE(apf9328_pins), ARRAY_SIZE(apf9328_pins),
"APF9328"); "APF9328");
imx1_add_imx_uart0(&uart0_pdata); imx1_add_imx_uart0(NULL);
imx1_add_imx_uart1(&uart1_pdata); imx1_add_imx_uart1(&uart1_pdata);
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
......
...@@ -490,6 +490,8 @@ static struct platform_device *devices[] __initdata = { ...@@ -490,6 +490,8 @@ static struct platform_device *devices[] __initdata = {
*/ */
static void __init armadillo5x0_init(void) static void __init armadillo5x0_init(void)
{ {
imx31_soc_init();
mxc_iomux_setup_multiple_pins(armadillo5x0_pins, mxc_iomux_setup_multiple_pins(armadillo5x0_pins,
ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0");
......
...@@ -42,6 +42,8 @@ static const unsigned int bug_pins[] __initconst = { ...@@ -42,6 +42,8 @@ static const unsigned int bug_pins[] __initconst = {
static void __init bug_board_init(void) static void __init bug_board_init(void)
{ {
imx31_soc_init();
mxc_iomux_setup_multiple_pins(bug_pins, mxc_iomux_setup_multiple_pins(bug_pins,
ARRAY_SIZE(bug_pins), "uart-4"); ARRAY_SIZE(bug_pins), "uart-4");
imx31_add_imx_uart4(&uart_pdata); imx31_add_imx_uart4(&uart_pdata);
......
...@@ -250,6 +250,8 @@ __setup("otg_mode=", eukrea_cpuimx27_otg_mode); ...@@ -250,6 +250,8 @@ __setup("otg_mode=", eukrea_cpuimx27_otg_mode);
static void __init eukrea_cpuimx27_init(void) static void __init eukrea_cpuimx27_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins, mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins,
ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27"); ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27");
......
...@@ -156,6 +156,8 @@ __setup("otg_mode=", eukrea_cpuimx35_otg_mode); ...@@ -156,6 +156,8 @@ __setup("otg_mode=", eukrea_cpuimx35_otg_mode);
*/ */
static void __init eukrea_cpuimx35_init(void) static void __init eukrea_cpuimx35_init(void)
{ {
imx35_soc_init();
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads, mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads,
ARRAY_SIZE(eukrea_cpuimx35_pads)); ARRAY_SIZE(eukrea_cpuimx35_pads));
......
...@@ -125,6 +125,8 @@ __setup("otg_mode=", eukrea_cpuimx25_otg_mode); ...@@ -125,6 +125,8 @@ __setup("otg_mode=", eukrea_cpuimx25_otg_mode);
static void __init eukrea_cpuimx25_init(void) static void __init eukrea_cpuimx25_init(void)
{ {
imx25_soc_init();
if (mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx25_pads, if (mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx25_pads,
ARRAY_SIZE(eukrea_cpuimx25_pads))) ARRAY_SIZE(eukrea_cpuimx25_pads)))
printk(KERN_ERR "error setting cpuimx25 pads !\n"); printk(KERN_ERR "error setting cpuimx25 pads !\n");
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/iomux.h> #include <mach/iomux-mx27.h>
#include "devices-imx27.h" #include "devices-imx27.h"
...@@ -231,6 +231,8 @@ static void __init visstrim_m10_board_init(void) ...@@ -231,6 +231,8 @@ static void __init visstrim_m10_board_init(void)
{ {
int ret; int ret;
imx27_soc_init();
ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins, ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins,
ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10"); ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10");
if (ret) if (ret)
......
...@@ -50,6 +50,8 @@ static const int mx27ipcam_pins[] __initconst = { ...@@ -50,6 +50,8 @@ static const int mx27ipcam_pins[] __initconst = {
static void __init mx27ipcam_init(void) static void __init mx27ipcam_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins), mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins),
"mx27ipcam"); "mx27ipcam");
......
...@@ -59,6 +59,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = { ...@@ -59,6 +59,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
static void __init mx27lite_init(void) static void __init mx27lite_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins), mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins),
"imx27lite"); "imx27lite");
imx27_add_imx_uart0(&uart_pdata); imx27_add_imx_uart0(&uart_pdata);
......
...@@ -223,6 +223,8 @@ static int kzm_pins[] __initdata = { ...@@ -223,6 +223,8 @@ static int kzm_pins[] __initdata = {
*/ */
static void __init kzm_board_init(void) static void __init kzm_board_init(void)
{ {
imx31_soc_init();
mxc_iomux_setup_multiple_pins(kzm_pins, mxc_iomux_setup_multiple_pins(kzm_pins,
ARRAY_SIZE(kzm_pins), "kzm"); ARRAY_SIZE(kzm_pins), "kzm");
kzm_init_ext_uart(); kzm_init_ext_uart();
......
...@@ -115,6 +115,8 @@ static struct i2c_board_info mx1ads_i2c_devices[] = { ...@@ -115,6 +115,8 @@ static struct i2c_board_info mx1ads_i2c_devices[] = {
*/ */
static void __init mx1ads_init(void) static void __init mx1ads_init(void)
{ {
imx1_soc_init();
mxc_gpio_setup_multiple_pins(mx1ads_pins, mxc_gpio_setup_multiple_pins(mx1ads_pins,
ARRAY_SIZE(mx1ads_pins), "mx1ads"); ARRAY_SIZE(mx1ads_pins), "mx1ads");
......
...@@ -279,6 +279,8 @@ static struct platform_device *platform_devices[] __initdata = { ...@@ -279,6 +279,8 @@ static struct platform_device *platform_devices[] __initdata = {
static void __init mx21ads_board_init(void) static void __init mx21ads_board_init(void)
{ {
imx21_soc_init();
mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins), mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins),
"mx21ads"); "mx21ads");
......
...@@ -219,6 +219,8 @@ static const struct esdhc_platform_data mx25pdk_esdhc_pdata __initconst = { ...@@ -219,6 +219,8 @@ static const struct esdhc_platform_data mx25pdk_esdhc_pdata __initconst = {
static void __init mx25pdk_init(void) static void __init mx25pdk_init(void)
{ {
imx25_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads, mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads,
ARRAY_SIZE(mx25pdk_pads)); ARRAY_SIZE(mx25pdk_pads));
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/mfd/mc13783.h> #include <linux/mfd/mc13783.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/spi/l4f00242t03.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -42,10 +43,15 @@ ...@@ -42,10 +43,15 @@
#include "devices-imx27.h" #include "devices-imx27.h"
#define SD1_EN_GPIO (GPIO_PORTB + 25) #define SD1_EN_GPIO IMX_GPIO_NR(2, 25)
#define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23) #define OTG_PHY_RESET_GPIO IMX_GPIO_NR(2, 23)
#define SPI2_SS0 (GPIO_PORTD + 21) #define SPI2_SS0 IMX_GPIO_NR(4, 21)
#define EXPIO_PARENT_INT (MXC_INTERNAL_IRQS + GPIO_PORTC + 28) #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 = { static const int mx27pdk_pins[] __initconst = {
/* UART1 */ /* UART1 */
...@@ -94,13 +100,47 @@ static const int mx27pdk_pins[] __initconst = { ...@@ -94,13 +100,47 @@ static const int mx27pdk_pins[] __initconst = {
PE2_PF_USBOTG_DIR, PE2_PF_USBOTG_DIR,
PE24_PF_USBOTG_CLK, PE24_PF_USBOTG_CLK,
PE25_PF_USBOTG_DATA7, 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 */ /* CSPI2 */
PD22_PF_CSPI2_SCLK, PD22_PF_CSPI2_SCLK,
PD23_PF_CSPI2_MISO, PD23_PF_CSPI2_MISO,
PD24_PF_CSPI2_MOSI, PD24_PF_CSPI2_MOSI,
SPI2_SS0 | GPIO_GPIO | GPIO_OUT,
/* I2C1 */ /* I2C1 */
PD17_PF_I2C_DATA, PD17_PF_I2C_DATA,
PD18_PF_I2C_CLK, 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 = { static const struct imxuart_platform_data uart_pdata __initconst = {
...@@ -131,13 +171,13 @@ static const struct matrix_keymap_data mx27_3ds_keymap_data __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, static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
void *data) void *data)
{ {
return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING | return request_irq(gpio_to_irq(SD1_CD), detect_irq,
IRQF_TRIGGER_RISING, "sdhc1-card-detect", data); IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
} }
static void mx27_3ds_sdhc1_exit(struct device *dev, void *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 = { static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
...@@ -193,6 +233,13 @@ static int __init mx27_3ds_otg_mode(char *options) ...@@ -193,6 +233,13 @@ static int __init mx27_3ds_otg_mode(char *options)
__setup("otg_mode=", mx27_3ds_otg_mode); __setup("otg_mode=", mx27_3ds_otg_mode);
/* Regulators */ /* Regulators */
static struct regulator_init_data gpo_init = {
.constraints = {
.boot_on = 1,
.always_on = 1,
}
};
static struct regulator_consumer_supply vmmc1_consumers[] = { static struct regulator_consumer_supply vmmc1_consumers[] = {
REGULATOR_SUPPLY("lcd_2v8", NULL), REGULATOR_SUPPLY("lcd_2v8", NULL),
}; };
...@@ -201,7 +248,9 @@ static struct regulator_init_data vmmc1_init = { ...@@ -201,7 +248,9 @@ static struct regulator_init_data vmmc1_init = {
.constraints = { .constraints = {
.min_uV = 2800000, .min_uV = 2800000,
.max_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), .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),
.consumer_supplies = vmmc1_consumers, .consumer_supplies = vmmc1_consumers,
...@@ -228,6 +277,12 @@ static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = { ...@@ -228,6 +277,12 @@ static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = {
}, { }, {
.id = MC13783_REG_VGEN, .id = MC13783_REG_VGEN,
.init_data = &vgen_init, .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 = { ...@@ -238,15 +293,63 @@ static struct mc13xxx_platform_data mc13783_pdata = {
.num_regulators = ARRAY_SIZE(mx27_3ds_regulators), .num_regulators = ARRAY_SIZE(mx27_3ds_regulators),
}, },
.flags = MC13783_USE_REGULATOR, .flags = MC13783_USE_REGULATOR | MC13783_USE_TOUCHSCREEN |
MC13783_USE_RTC,
}; };
/* SPI */ /* 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 = { static const struct spi_imx_master spi2_pdata __initconst = {
.chipselect = spi2_internal_chipselect, .chipselect = spi2_chipselect,
.num_chipselect = ARRAY_SIZE(spi2_internal_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 = { static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
...@@ -256,8 +359,14 @@ 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, .bus_num = 1,
.chip_select = 0, /* SS0 */ .chip_select = 0, /* SS0 */
.platform_data = &mc13783_pdata, .platform_data = &mc13783_pdata,
.irq = IRQ_GPIOC(14), .irq = gpio_to_irq(PMIC_INT),
.mode = SPI_CS_HIGH, .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 = { ...@@ -267,6 +376,8 @@ static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = {
static void __init mx27pdk_init(void) static void __init mx27pdk_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins), mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
"mx27pdk"); "mx27pdk");
mx27_3ds_sdhc1_enable_level_translator(); mx27_3ds_sdhc1_enable_level_translator();
...@@ -289,12 +400,14 @@ static void __init mx27pdk_init(void) ...@@ -289,12 +400,14 @@ static void __init mx27pdk_init(void)
imx27_add_fsl_usb2_udc(&otg_device_pdata); imx27_add_fsl_usb2_udc(&otg_device_pdata);
imx27_add_spi_imx1(&spi2_pdata); imx27_add_spi_imx1(&spi2_pdata);
imx27_add_spi_imx0(&spi1_pdata);
spi_register_board_info(mx27_3ds_spi_devs, spi_register_board_info(mx27_3ds_spi_devs,
ARRAY_SIZE(mx27_3ds_spi_devs)); ARRAY_SIZE(mx27_3ds_spi_devs));
if (mxc_expio_init(MX27_CS5_BASE_ADDR, EXPIO_PARENT_INT)) 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"); 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_i2c(0, &mx27_3ds_i2c0_data);
imx27_add_imx_fb(&mx27_3ds_fb_data);
} }
static void __init mx27pdk_timer_init(void) static void __init mx27pdk_timer_init(void)
......
...@@ -288,6 +288,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = { ...@@ -288,6 +288,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
static void __init mx27ads_board_init(void) static void __init mx27ads_board_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins), mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
"mx27ads"); "mx27ads");
......
...@@ -53,11 +53,8 @@ static int mx31_3ds_pins[] = { ...@@ -53,11 +53,8 @@ static int mx31_3ds_pins[] = {
MX31_PIN_RXD1__RXD1, MX31_PIN_RXD1__RXD1,
IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO), IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
/*SPI0*/ /*SPI0*/
MX31_PIN_CSPI1_SCLK__SCLK, IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_ALT1),
MX31_PIN_CSPI1_MOSI__MOSI, IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_ALT1),
MX31_PIN_CSPI1_MISO__MISO,
MX31_PIN_CSPI1_SPI_RDY__SPI_RDY,
MX31_PIN_CSPI1_SS2__SS2, /* CS for LCD */
/* SPI 1 */ /* SPI 1 */
MX31_PIN_CSPI2_SCLK__SCLK, MX31_PIN_CSPI2_SCLK__SCLK,
MX31_PIN_CSPI2_MOSI__MOSI, MX31_PIN_CSPI2_MOSI__MOSI,
...@@ -689,6 +686,11 @@ static void __init mx31_3ds_init(void) ...@@ -689,6 +686,11 @@ static void __init mx31_3ds_init(void)
{ {
int ret; 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), mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins),
"mx31_3ds"); "mx31_3ds");
......
...@@ -516,6 +516,8 @@ static void __init mx31ads_init_irq(void) ...@@ -516,6 +516,8 @@ static void __init mx31ads_init_irq(void)
static void __init mx31ads_init(void) static void __init mx31ads_init(void)
{ {
imx31_soc_init();
mxc_init_extuart(); mxc_init_extuart();
mxc_init_imx_uart(); mxc_init_imx_uart();
mxc_init_i2c(); mxc_init_i2c();
......
...@@ -243,6 +243,8 @@ core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); ...@@ -243,6 +243,8 @@ core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444);
static void __init mx31lilly_board_init(void) static void __init mx31lilly_board_init(void)
{ {
imx31_soc_init();
switch (mx31lilly_baseboard) { switch (mx31lilly_baseboard) {
case MX31LILLY_NOBOARD: case MX31LILLY_NOBOARD:
break; break;
......
...@@ -230,6 +230,8 @@ static void __init mx31lite_init(void) ...@@ -230,6 +230,8 @@ static void __init mx31lite_init(void)
{ {
int ret; int ret;
imx31_soc_init();
switch (mx31lite_baseboard) { switch (mx31lite_baseboard) {
case MX31LITE_NOBOARD: case MX31LITE_NOBOARD:
break; break;
......
...@@ -425,7 +425,7 @@ static int __init moboard_usbh2_init(void) ...@@ -425,7 +425,7 @@ static int __init moboard_usbh2_init(void)
return 0; return 0;
} }
static struct gpio_led mx31moboard_leds[] = { static const struct gpio_led mx31moboard_leds[] __initconst = {
{ {
.name = "coreboard-led-0:red:running", .name = "coreboard-led-0:red:running",
.default_trigger = "heartbeat", .default_trigger = "heartbeat",
...@@ -442,26 +442,17 @@ static struct gpio_led mx31moboard_leds[] = { ...@@ -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), .num_leds = ARRAY_SIZE(mx31moboard_leds),
.leds = 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 = { static const struct ipu_platform_data mx3_ipu_data __initconst = {
.irq_base = MXC_IPU_IRQ_START, .irq_base = MXC_IPU_IRQ_START,
}; };
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&mx31moboard_flash, &mx31moboard_flash,
&mx31moboard_leds_device,
}; };
static struct mx3_camera_pdata camera_pdata __initdata = { static struct mx3_camera_pdata camera_pdata __initdata = {
...@@ -507,10 +498,13 @@ core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444); ...@@ -507,10 +498,13 @@ core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444);
*/ */
static void __init mx31moboard_init(void) static void __init mx31moboard_init(void)
{ {
imx31_soc_init();
mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins), mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins),
"moboard"); "moboard");
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
gpio_led_register_device(-1, &mx31moboard_led_pdata);
imx31_add_imx_uart0(&uart0_pdata); imx31_add_imx_uart0(&uart0_pdata);
imx31_add_imx_uart4(&uart4_pdata); imx31_add_imx_uart4(&uart4_pdata);
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include "devices-imx35.h" #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 = { static const struct imxuart_platform_data uart_pdata __initconst = {
.flags = IMXUART_HAVE_RTSCTS, .flags = IMXUART_HAVE_RTSCTS,
...@@ -179,6 +179,8 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = { ...@@ -179,6 +179,8 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = {
*/ */
static void __init mx35_3ds_init(void) static void __init mx35_3ds_init(void)
{ {
imx35_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads)); mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));
imx35_add_fec(NULL); imx35_add_fec(NULL);
......
...@@ -233,6 +233,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = { ...@@ -233,6 +233,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
static void __init mxt_td60_board_init(void) static void __init mxt_td60_board_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(mxt_td60_pins, ARRAY_SIZE(mxt_td60_pins), mxc_gpio_setup_multiple_pins(mxt_td60_pins, ARRAY_SIZE(mxt_td60_pins),
"MXT_TD60"); "MXT_TD60");
......
...@@ -357,6 +357,8 @@ static void __init pca100_init(void) ...@@ -357,6 +357,8 @@ static void __init pca100_init(void)
{ {
int ret; int ret;
imx27_soc_init();
/* SSI unit */ /* SSI unit */
mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0,
MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */ MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
......
...@@ -576,6 +576,8 @@ static void __init pcm037_init(void) ...@@ -576,6 +576,8 @@ static void __init pcm037_init(void)
{ {
int ret; int ret;
imx31_soc_init();
mxc_iomux_set_gpr(MUX_PGP_UH2, 1); mxc_iomux_set_gpr(MUX_PGP_UH2, 1);
mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins), mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins),
......
...@@ -295,6 +295,8 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = { ...@@ -295,6 +295,8 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
static void __init pcm038_init(void) static void __init pcm038_init(void)
{ {
imx27_soc_init();
mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins), mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
"PCM038"); "PCM038");
......
...@@ -356,6 +356,8 @@ static struct esdhc_platform_data sd1_pdata = { ...@@ -356,6 +356,8 @@ static struct esdhc_platform_data sd1_pdata = {
*/ */
static void __init pcm043_init(void) static void __init pcm043_init(void)
{ {
imx35_soc_init();
mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads)); mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads));
mxc_audmux_v2_configure_port(3, mxc_audmux_v2_configure_port(3,
......
...@@ -244,6 +244,8 @@ static void __init qong_init_fpga(void) ...@@ -244,6 +244,8 @@ static void __init qong_init_fpga(void)
*/ */
static void __init qong_init(void) static void __init qong_init(void)
{ {
imx31_soc_init();
mxc_init_imx_uart(); mxc_init_imx_uart();
qong_init_nor_mtd(); qong_init_nor_mtd();
qong_init_fpga(); qong_init_fpga();
......
...@@ -101,21 +101,7 @@ static const int mxc_uart1_pins[] = { ...@@ -101,21 +101,7 @@ static const int mxc_uart1_pins[] = {
PC12_PF_UART1_RXD, 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 = { static const struct imxuart_platform_data uart_pdata __initconst = {
.init = uart1_mxc_init,
.exit = uart1_mxc_exit,
.flags = IMXUART_HAVE_RTSCTS, .flags = IMXUART_HAVE_RTSCTS,
}; };
...@@ -129,6 +115,11 @@ static struct platform_device *devices[] __initdata = { ...@@ -129,6 +115,11 @@ static struct platform_device *devices[] __initdata = {
*/ */
static void __init scb9328_init(void) 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); imx1_add_imx_uart0(&uart_pdata);
printk(KERN_INFO"Scb9328: Adding devices\n"); printk(KERN_INFO"Scb9328: Adding devices\n");
......
...@@ -267,6 +267,8 @@ static struct platform_device *devices[] __initdata = { ...@@ -267,6 +267,8 @@ static struct platform_device *devices[] __initdata = {
*/ */
static void __init vpr200_board_init(void) static void __init vpr200_board_init(void)
{ {
imx35_soc_init();
mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads)); mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));
imx35_add_fec(NULL); imx35_add_fec(NULL);
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/iomux-v1.h> #include <mach/iomux-v1.h>
...@@ -44,15 +43,19 @@ void __init imx1_init_early(void) ...@@ -44,15 +43,19 @@ void __init imx1_init_early(void)
MX1_NUM_GPIO_PORT); 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) void __init mx1_init_irq(void)
{ {
mxc_init_irq(MX1_IO_ADDRESS(MX1_AVIC_BASE_ADDR)); 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);
} }
...@@ -22,9 +22,9 @@ ...@@ -22,9 +22,9 @@
#include <linux/init.h> #include <linux/init.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/devices-common.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/iomux-v1.h> #include <mach/iomux-v1.h>
...@@ -70,17 +70,19 @@ void __init imx21_init_early(void) ...@@ -70,17 +70,19 @@ void __init imx21_init_early(void)
MX21_NUM_GPIO_PORT); 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) void __init mx21_init_irq(void)
{ {
mxc_init_irq(MX21_IO_ADDRESS(MX21_AVIC_BASE_ADDR)); 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();
} }
...@@ -24,10 +24,10 @@ ...@@ -24,10 +24,10 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/devices-common.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/mx25.h> #include <mach/mx25.h>
#include <mach/iomux-v3.h> #include <mach/iomux-v3.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
/* /*
...@@ -57,16 +57,39 @@ void __init imx25_init_early(void) ...@@ -57,16 +57,39 @@ void __init imx25_init_early(void)
mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); 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) void __init mx25_init_irq(void)
{ {
mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR)); 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);
}
...@@ -22,9 +22,9 @@ ...@@ -22,9 +22,9 @@
#include <linux/init.h> #include <linux/init.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/devices-common.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/iomux-v1.h> #include <mach/iomux-v1.h>
...@@ -70,17 +70,19 @@ void __init imx27_init_early(void) ...@@ -70,17 +70,19 @@ void __init imx27_init_early(void)
MX27_NUM_GPIO_PORT); 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) void __init mx27_init_irq(void)
{ {
mxc_init_irq(MX27_IO_ADDRESS(MX27_AVIC_BASE_ADDR)); 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();
} }
...@@ -24,9 +24,9 @@ ...@@ -24,9 +24,9 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/devices-common.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/iomux-v3.h> #include <mach/iomux-v3.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
static struct map_desc mx31_io_desc[] __initdata = { static struct map_desc mx31_io_desc[] __initdata = {
...@@ -53,14 +53,40 @@ void __init imx31_init_early(void) ...@@ -53,14 +53,40 @@ void __init imx31_init_early(void)
mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); 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) void __init mx31_init_irq(void)
{ {
mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR)); 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);
} }
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
#include <asm/hardware/cache-l2x0.h> #include <asm/hardware/cache-l2x0.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/devices-common.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/iomux-v3.h> #include <mach/iomux-v3.h>
#include <mach/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
static struct map_desc mx35_io_desc[] __initdata = { static struct map_desc mx35_io_desc[] __initdata = {
...@@ -50,14 +50,60 @@ void __init imx35_init_early(void) ...@@ -50,14 +50,60 @@ void __init imx35_init_early(void)
mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); 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) void __init mx35_init_irq(void)
{ {
mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR)); 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);
} }
...@@ -161,7 +161,7 @@ static const struct spi_imx_master spi0_pdata __initconst = { ...@@ -161,7 +161,7 @@ static const struct spi_imx_master spi0_pdata __initconst = {
/* GPIO LEDs */ /* GPIO LEDs */
static struct gpio_led litekit_leds[] = { static const struct gpio_led litekit_leds[] __initconst = {
{ {
.name = "GPIO0", .name = "GPIO0",
.gpio = IOMUX_TO_GPIO(MX31_PIN_COMPARE), .gpio = IOMUX_TO_GPIO(MX31_PIN_COMPARE),
...@@ -176,19 +176,12 @@ static struct gpio_led litekit_leds[] = { ...@@ -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, .leds = litekit_leds,
.num_leds = ARRAY_SIZE(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) void __init mx31lite_db_init(void)
{ {
mxc_iomux_setup_multiple_pins(litekit_db_board_pins, mxc_iomux_setup_multiple_pins(litekit_db_board_pins,
...@@ -197,7 +190,7 @@ void __init mx31lite_db_init(void) ...@@ -197,7 +190,7 @@ void __init mx31lite_db_init(void)
imx31_add_imx_uart0(&uart_pdata); imx31_add_imx_uart0(&uart_pdata);
imx31_add_mxc_mmc(0, &mmc_pdata); imx31_add_mxc_mmc(0, &mmc_pdata);
imx31_add_spi_imx0(&spi0_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_imx2_wdt(NULL);
imx31_add_mxc_rtc(NULL); imx31_add_mxc_rtc(NULL);
} }
...@@ -1077,7 +1077,7 @@ static struct clk_lookup lookups[] = { ...@@ -1077,7 +1077,7 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand) _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand)
_REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0) _REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0)
_REGISTER_CLOCK("tbd", "i2s1_ck", clk_i2s1) _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("dev:mmc0", "MCLK", clk_mmc)
_REGISTER_CLOCK("lpc-net.0", NULL, clk_net) _REGISTER_CLOCK("lpc-net.0", NULL, clk_net)
_REGISTER_CLOCK("dev:clcd", NULL, clk_lcd) _REGISTER_CLOCK("dev:clcd", NULL, clk_lcd)
......
...@@ -95,6 +95,48 @@ struct platform_device lpc32xx_i2c2_device = { ...@@ -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 * Returns the unique ID for the device
*/ */
......
...@@ -28,6 +28,8 @@ extern struct platform_device lpc32xx_watchdog_device; ...@@ -28,6 +28,8 @@ extern struct platform_device lpc32xx_watchdog_device;
extern struct platform_device lpc32xx_i2c0_device; extern struct platform_device lpc32xx_i2c0_device;
extern struct platform_device lpc32xx_i2c1_device; extern struct platform_device lpc32xx_i2c1_device;
extern struct platform_device lpc32xx_i2c2_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 * Other arch specific structures and functions
......
...@@ -77,6 +77,13 @@ config MACH_TETON_BGA ...@@ -77,6 +77,13 @@ config MACH_TETON_BGA
Say 'Y' here if you want to support the Marvell PXA168-based Say 'Y' here if you want to support the Marvell PXA168-based
Teton BGA Development Board. 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 endmenu
config CPU_PXA168 config CPU_PXA168
......
...@@ -19,3 +19,4 @@ obj-$(CONFIG_MACH_BROWNSTONE) += brownstone.o ...@@ -19,3 +19,4 @@ obj-$(CONFIG_MACH_BROWNSTONE) += brownstone.o
obj-$(CONFIG_MACH_FLINT) += flint.o obj-$(CONFIG_MACH_FLINT) += flint.o
obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o
obj-$(CONFIG_MACH_TETON_BGA) += teton_bga.o obj-$(CONFIG_MACH_TETON_BGA) += teton_bga.o
obj-$(CONFIG_MACH_SHEEVAD) += gplugd.o
...@@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk) ...@@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk)
return rate; return rate;
} }
EXPORT_SYMBOL(clk_get_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);
...@@ -12,6 +12,7 @@ struct clkops { ...@@ -12,6 +12,7 @@ struct clkops {
void (*enable)(struct clk *); void (*enable)(struct clk *);
void (*disable)(struct clk *); void (*disable)(struct clk *);
unsigned long (*getrate)(struct clk *); unsigned long (*getrate)(struct clk *);
int (*setrate)(struct clk *, unsigned long);
}; };
struct clk { struct clk {
......
/*
* 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
/*
* 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 */
...@@ -305,4 +305,23 @@ ...@@ -305,4 +305,23 @@
#define GPIO112_KP_MKOUT6 MFP_CFG(GPIO112, AF7) #define GPIO112_KP_MKOUT6 MFP_CFG(GPIO112, AF7)
#define GPIO121_KP_MKIN4 MFP_CFG(GPIO121, 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 */ #endif /* __ASM_MACH_MFP_PXA168_H */
...@@ -14,9 +14,11 @@ extern void pxa168_clear_keypad_wakeup(void); ...@@ -14,9 +14,11 @@ extern void pxa168_clear_keypad_wakeup(void);
#include <video/pxa168fb.h> #include <video/pxa168fb.h>
#include <plat/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/cputype.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_uart1;
extern struct pxa_device_desc pxa168_device_uart2; 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_twsi0;
extern struct pxa_device_desc pxa168_device_twsi1; extern struct pxa_device_desc pxa168_device_twsi1;
extern struct pxa_device_desc pxa168_device_pwm1; extern struct pxa_device_desc pxa168_device_pwm1;
...@@ -31,6 +33,7 @@ extern struct pxa_device_desc pxa168_device_ssp5; ...@@ -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_nand;
extern struct pxa_device_desc pxa168_device_fb; extern struct pxa_device_desc pxa168_device_fb;
extern struct pxa_device_desc pxa168_device_keypad; extern struct pxa_device_desc pxa168_device_keypad;
extern struct pxa_device_desc pxa168_device_eth;
static inline int pxa168_add_uart(int id) static inline int pxa168_add_uart(int id)
{ {
...@@ -39,6 +42,7 @@ static inline int pxa168_add_uart(int id) ...@@ -39,6 +42,7 @@ static inline int pxa168_add_uart(int id)
switch (id) { switch (id) {
case 1: d = &pxa168_device_uart1; break; case 1: d = &pxa168_device_uart1; break;
case 2: d = &pxa168_device_uart2; break; case 2: d = &pxa168_device_uart2; break;
case 3: d = &pxa168_device_uart3; break;
} }
if (d == NULL) if (d == NULL)
...@@ -117,4 +121,8 @@ static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data) ...@@ -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)); 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 */ #endif /* __ASM_MACH_PXA168_H */
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#define APMU_BUS APMU_REG(0x06c) #define APMU_BUS APMU_REG(0x06c)
#define APMU_SDH2 APMU_REG(0x0e8) #define APMU_SDH2 APMU_REG(0x0e8)
#define APMU_SDH3 APMU_REG(0x0ec) #define APMU_SDH3 APMU_REG(0x0ec)
#define APMU_ETH APMU_REG(0x0fc)
#define APMU_FNCLK_EN (1 << 4) #define APMU_FNCLK_EN (1 << 4)
#define APMU_AXICLK_EN (1 << 3) #define APMU_AXICLK_EN (1 << 3)
......
...@@ -66,6 +66,7 @@ void __init pxa168_init_irq(void) ...@@ -66,6 +66,7 @@ void __init pxa168_init_irq(void)
/* APB peripheral clocks */ /* APB peripheral clocks */
static APBC_CLK(uart1, PXA168_UART1, 1, 14745600); static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);
static APBC_CLK(uart2, PXA168_UART2, 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(twsi0, PXA168_TWSI0, 1, 33000000);
static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000); static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000); static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);
...@@ -81,11 +82,13 @@ static APBC_CLK(keypad, PXA168_KPC, 0, 32000); ...@@ -81,11 +82,13 @@ static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
static APMU_CLK(nand, NAND, 0x01db, 208000000); static APMU_CLK(nand, NAND, 0x01db, 208000000);
static APMU_CLK(lcd, LCD, 0x7f, 312000000); static APMU_CLK(lcd, LCD, 0x7f, 312000000);
static APMU_CLK(eth, ETH, 0x09, 0);
/* device and clock bindings */ /* device and clock bindings */
static struct clk_lookup pxa168_clkregs[] = { static struct clk_lookup pxa168_clkregs[] = {
INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", 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_twsi0, "pxa2xx-i2c.0", NULL),
INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL), INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL), INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
...@@ -100,6 +103,7 @@ static struct clk_lookup pxa168_clkregs[] = { ...@@ -100,6 +103,7 @@ static struct clk_lookup pxa168_clkregs[] = {
INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL), INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
}; };
static int __init pxa168_init(void) static int __init pxa168_init(void)
...@@ -149,6 +153,7 @@ void pxa168_clear_keypad_wakeup(void) ...@@ -149,6 +153,7 @@ void pxa168_clear_keypad_wakeup(void)
/* on-chip devices */ /* on-chip devices */
PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22); PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24); 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(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28); PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10); PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10);
...@@ -163,3 +168,4 @@ PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59); ...@@ -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(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8); PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c); PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff);
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/onenand.h> #include <linux/mtd/onenand.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/i2c/pca953x.h>
#include <linux/gpio.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -25,7 +27,17 @@ ...@@ -25,7 +27,17 @@
#include "common.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 = { static unsigned long ttc_dkb_pin_config[] __initdata = {
/* UART2 */ /* UART2 */
...@@ -113,6 +125,22 @@ static struct platform_device *ttc_dkb_devices[] = { ...@@ -113,6 +125,22 @@ static struct platform_device *ttc_dkb_devices[] = {
&ttc_dkb_device_onenand, &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) static void __init ttc_dkb_init(void)
{ {
mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config)); mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
...@@ -121,6 +149,7 @@ static void __init ttc_dkb_init(void) ...@@ -121,6 +149,7 @@ static void __init ttc_dkb_init(void)
pxa910_add_uart(1); pxa910_add_uart(1);
/* off-chip devices */ /* off-chip devices */
pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices)); platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
} }
......
...@@ -109,6 +109,7 @@ config MACH_EUKREA_MBIMX51_BASEBOARD ...@@ -109,6 +109,7 @@ config MACH_EUKREA_MBIMX51_BASEBOARD
bool bool
select IMX_HAVE_PLATFORM_IMX_KEYPAD select IMX_HAVE_PLATFORM_IMX_KEYPAD
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
select LEDS_GPIO_REGISTER
help help
This adds board specific devices that can be found on Eukrea's This adds board specific devices that can be found on Eukrea's
MBIMX51 evaluation board. MBIMX51 evaluation board.
...@@ -135,6 +136,7 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD ...@@ -135,6 +136,7 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD
prompt "Eukrea MBIMXSD development board" prompt "Eukrea MBIMXSD development board"
bool bool
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
select LEDS_GPIO_REGISTER
help help
This adds board specific devices that can be found on Eukrea's This adds board specific devices that can be found on Eukrea's
MBIMXSD evaluation board. MBIMXSD evaluation board.
...@@ -151,6 +153,7 @@ config MX51_EFIKA_COMMON ...@@ -151,6 +153,7 @@ config MX51_EFIKA_COMMON
config MACH_MX51_EFIKAMX config MACH_MX51_EFIKAMX
bool "Support MX51 Genesi Efika MX nettop" bool "Support MX51 Genesi Efika MX nettop"
select LEDS_GPIO_REGISTER
select MX51_EFIKA_COMMON select MX51_EFIKA_COMMON
help help
Include support for Genesi Efika MX nettop. This includes specific Include support for Genesi Efika MX nettop. This includes specific
...@@ -158,6 +161,7 @@ config MACH_MX51_EFIKAMX ...@@ -158,6 +161,7 @@ config MACH_MX51_EFIKAMX
config MACH_MX51_EFIKASB config MACH_MX51_EFIKASB
bool "Support MX51 Genesi Efika Smartbook" bool "Support MX51 Genesi Efika Smartbook"
select LEDS_GPIO_REGISTER
select MX51_EFIKA_COMMON select MX51_EFIKA_COMMON
help help
Include support for Genesi Efika Smartbook. This includes specific Include support for Genesi Efika Smartbook. This includes specific
...@@ -176,6 +180,7 @@ config MACH_MX53_EVK ...@@ -176,6 +180,7 @@ config MACH_MX53_EVK
select IMX_HAVE_PLATFORM_IMX_I2C select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
select IMX_HAVE_PLATFORM_SPI_IMX select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
help help
Include support for MX53 EVK platform. This includes specific Include support for MX53 EVK platform. This includes specific
configurations for the board and its peripherals. configurations for the board and its peripherals.
...@@ -199,10 +204,23 @@ config MACH_MX53_LOCO ...@@ -199,10 +204,23 @@ config MACH_MX53_LOCO
select IMX_HAVE_PLATFORM_IMX_UART select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
select IMX_HAVE_PLATFORM_GPIO_KEYS select IMX_HAVE_PLATFORM_GPIO_KEYS
select LEDS_GPIO_REGISTER
help help
Include support for MX53 LOCO platform. This includes specific Include support for MX53 LOCO platform. This includes specific
configurations for the board and its peripherals. 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 # ARCH_MX53_SUPPORTED
endif endif
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
obj-y := cpu.o mm.o clock-mx51-mx53.o devices.o ehci.o system.o 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_SOC_IMX50) += mm-mx50.o
obj-$(CONFIG_PM) += pm-imx5.o
obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o
obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o
obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o
obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o
obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o
obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.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_CPUIMX51) += board-cpuimx51.o
obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o
obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o
......
...@@ -43,10 +43,6 @@ ...@@ -43,10 +43,6 @@
#define CPUIMX51_QUARTB_GPIO IMX_GPIO_NR(3, 25) #define CPUIMX51_QUARTB_GPIO IMX_GPIO_NR(3, 25)
#define CPUIMX51_QUARTC_GPIO IMX_GPIO_NR(3, 26) #define CPUIMX51_QUARTC_GPIO IMX_GPIO_NR(3, 26)
#define CPUIMX51_QUARTD_GPIO IMX_GPIO_NR(3, 27) #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_XTAL 14745600
#define CPUIMX51_QUART_REGSHIFT 17 #define CPUIMX51_QUART_REGSHIFT 17
...@@ -61,7 +57,7 @@ ...@@ -61,7 +57,7 @@
static struct plat_serial8250_port serial_platform_data[] = { static struct plat_serial8250_port serial_platform_data[] = {
{ {
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x400000), .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x400000),
.irq = CPUIMX51_QUARTA_IRQ, .irq = gpio_to_irq(CPUIMX51_QUARTA_GPIO),
.irqflags = IRQF_TRIGGER_HIGH, .irqflags = IRQF_TRIGGER_HIGH,
.uartclk = CPUIMX51_QUART_XTAL, .uartclk = CPUIMX51_QUART_XTAL,
.regshift = CPUIMX51_QUART_REGSHIFT, .regshift = CPUIMX51_QUART_REGSHIFT,
...@@ -69,7 +65,7 @@ static struct plat_serial8250_port serial_platform_data[] = { ...@@ -69,7 +65,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
}, { }, {
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x800000), .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x800000),
.irq = CPUIMX51_QUARTB_IRQ, .irq = gpio_to_irq(CPUIMX51_QUARTB_GPIO),
.irqflags = IRQF_TRIGGER_HIGH, .irqflags = IRQF_TRIGGER_HIGH,
.uartclk = CPUIMX51_QUART_XTAL, .uartclk = CPUIMX51_QUART_XTAL,
.regshift = CPUIMX51_QUART_REGSHIFT, .regshift = CPUIMX51_QUART_REGSHIFT,
...@@ -77,7 +73,7 @@ static struct plat_serial8250_port serial_platform_data[] = { ...@@ -77,7 +73,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
}, { }, {
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x1000000), .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x1000000),
.irq = CPUIMX51_QUARTC_IRQ, .irq = gpio_to_irq(CPUIMX51_QUARTC_GPIO),
.irqflags = IRQF_TRIGGER_HIGH, .irqflags = IRQF_TRIGGER_HIGH,
.uartclk = CPUIMX51_QUART_XTAL, .uartclk = CPUIMX51_QUART_XTAL,
.regshift = CPUIMX51_QUART_REGSHIFT, .regshift = CPUIMX51_QUART_REGSHIFT,
...@@ -85,7 +81,7 @@ static struct plat_serial8250_port serial_platform_data[] = { ...@@ -85,7 +81,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
}, { }, {
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x2000000), .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x2000000),
.irq = CPUIMX51_QUARTD_IRQ, .irq = irq_to_gpio(CPUIMX51_QUARTD_GPIO),
.irqflags = IRQF_TRIGGER_HIGH, .irqflags = IRQF_TRIGGER_HIGH,
.uartclk = CPUIMX51_QUART_XTAL, .uartclk = CPUIMX51_QUART_XTAL,
.regshift = CPUIMX51_QUART_REGSHIFT, .regshift = CPUIMX51_QUART_REGSHIFT,
...@@ -245,6 +241,8 @@ __setup("otg_mode=", eukrea_cpuimx51_otg_mode); ...@@ -245,6 +241,8 @@ __setup("otg_mode=", eukrea_cpuimx51_otg_mode);
*/ */
static void __init eukrea_cpuimx51_init(void) static void __init eukrea_cpuimx51_init(void)
{ {
imx51_soc_init();
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads, mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads,
ARRAY_SIZE(eukrea_cpuimx51_pads)); ARRAY_SIZE(eukrea_cpuimx51_pads));
......
...@@ -264,6 +264,8 @@ static struct platform_device *platform_devices[] __initdata = { ...@@ -264,6 +264,8 @@ static struct platform_device *platform_devices[] __initdata = {
static void __init eukrea_cpuimx51sd_init(void) static void __init eukrea_cpuimx51sd_init(void)
{ {
imx51_soc_init();
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads, mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads,
ARRAY_SIZE(eukrea_cpuimx51sd_pads)); ARRAY_SIZE(eukrea_cpuimx51sd_pads));
......
...@@ -192,6 +192,8 @@ static const struct imxi2c_platform_data i2c_data __initconst = { ...@@ -192,6 +192,8 @@ static const struct imxi2c_platform_data i2c_data __initconst = {
*/ */
static void __init mx50_rdp_board_init(void) static void __init mx50_rdp_board_init(void)
{ {
imx50_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads, mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads,
ARRAY_SIZE(mx50_rdp_pads)); ARRAY_SIZE(mx50_rdp_pads));
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/gpio.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -26,7 +27,7 @@ ...@@ -26,7 +27,7 @@
#include "devices-imx51.h" #include "devices-imx51.h"
#include "devices.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) #define MX51_3DS_ECSPI2_CS (GPIO_PORTC + 28)
static iomux_v3_cfg_t mx51_3ds_pads[] = { static iomux_v3_cfg_t mx51_3ds_pads[] = {
...@@ -135,6 +136,8 @@ static struct spi_board_info mx51_3ds_spi_nor_device[] = { ...@@ -135,6 +136,8 @@ static struct spi_board_info mx51_3ds_spi_nor_device[] = {
*/ */
static void __init mx51_3ds_init(void) static void __init mx51_3ds_init(void)
{ {
imx51_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads, mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads,
ARRAY_SIZE(mx51_3ds_pads)); ARRAY_SIZE(mx51_3ds_pads));
......
...@@ -36,11 +36,15 @@ ...@@ -36,11 +36,15 @@
#define BABBAGE_USB_HUB_RESET IMX_GPIO_NR(1, 7) #define BABBAGE_USB_HUB_RESET IMX_GPIO_NR(1, 7)
#define BABBAGE_USBH1_STP IMX_GPIO_NR(1, 27) #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_FEC_PHY_RESET IMX_GPIO_NR(2, 14)
#define BABBAGE_POWER_KEY IMX_GPIO_NR(2, 21) #define BABBAGE_POWER_KEY IMX_GPIO_NR(2, 21)
#define BABBAGE_ECSPI1_CS0 IMX_GPIO_NR(4, 24) #define BABBAGE_ECSPI1_CS0 IMX_GPIO_NR(4, 24)
#define BABBAGE_ECSPI1_CS1 IMX_GPIO_NR(4, 25) #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 */ /* USB_CTRL_1 */
#define MX51_USB_CTRL_1_OFFSET 0x10 #define MX51_USB_CTRL_1_OFFSET 0x10
...@@ -110,6 +114,9 @@ static iomux_v3_cfg_t mx51babbage_pads[] = { ...@@ -110,6 +114,9 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
/* USB HUB reset line*/ /* USB HUB reset line*/
MX51_PAD_GPIO1_7__GPIO1_7, MX51_PAD_GPIO1_7__GPIO1_7,
/* USB PHY reset line */
MX51_PAD_EIM_D21__GPIO2_5,
/* FEC */ /* FEC */
MX51_PAD_EIM_EB2__FEC_MDIO, MX51_PAD_EIM_EB2__FEC_MDIO,
MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_EIM_EB3__FEC_RDATA1,
...@@ -139,6 +146,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = { ...@@ -139,6 +146,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
MX51_PAD_SD1_DATA1__SD1_DATA1, MX51_PAD_SD1_DATA1__SD1_DATA1,
MX51_PAD_SD1_DATA2__SD1_DATA2, MX51_PAD_SD1_DATA2__SD1_DATA2,
MX51_PAD_SD1_DATA3__SD1_DATA3, MX51_PAD_SD1_DATA3__SD1_DATA3,
MX51_PAD_GPIO1_0__GPIO1_0,
MX51_PAD_GPIO1_1__GPIO1_1,
/* SD 2 */ /* SD 2 */
MX51_PAD_SD2_CMD__SD2_CMD, MX51_PAD_SD2_CMD__SD2_CMD,
...@@ -147,6 +156,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = { ...@@ -147,6 +156,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
MX51_PAD_SD2_DATA1__SD2_DATA1, MX51_PAD_SD2_DATA1__SD2_DATA1,
MX51_PAD_SD2_DATA2__SD2_DATA2, MX51_PAD_SD2_DATA2__SD2_DATA2,
MX51_PAD_SD2_DATA3__SD2_DATA3, MX51_PAD_SD2_DATA3__SD2_DATA3,
MX51_PAD_GPIO1_6__GPIO1_6,
MX51_PAD_GPIO1_5__GPIO1_5,
/* eCSPI1 */ /* eCSPI1 */
MX51_PAD_CSPI1_MISO__ECSPI1_MISO, MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
...@@ -169,34 +180,31 @@ static struct imxi2c_platform_data babbage_hsi2c_data = { ...@@ -169,34 +180,31 @@ static struct imxi2c_platform_data babbage_hsi2c_data = {
.bitrate = 400000, .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) static int gpio_usbh1_active(void)
{ {
iomux_v3_cfg_t usbh1stp_gpio = MX51_PAD_USBH1_STP__GPIO1_27; 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; int ret;
/* Set USBH1_STP to GPIO and toggle it */ /* Set USBH1_STP to GPIO and toggle it */
mxc_iomux_v3_setup_pad(usbh1stp_gpio); 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) { 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; 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) { msleep(100);
pr_debug("failed to get MX51_PAD_EIM_D21__GPIO_2_5: %d\n", ret); gpio_set_value(BABBAGE_USBH1_STP, 1);
return ret; gpio_set_value(BABBAGE_USB_PHY_RESET, 1);
} gpio_free_array(mx51_babbage_usbh1_gpios,
gpio_direction_output(BABBAGE_PHY_RESET, 1); ARRAY_SIZE(mx51_babbage_usbh1_gpios));
return 0; return 0;
} }
...@@ -331,6 +339,16 @@ static const struct spi_imx_master mx51_babbage_spi_pdata __initconst = { ...@@ -331,6 +339,16 @@ static const struct spi_imx_master mx51_babbage_spi_pdata __initconst = {
.num_chipselect = ARRAY_SIZE(mx51_babbage_spi_cs), .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. * Board specific initialization.
*/ */
...@@ -340,6 +358,8 @@ static void __init mx51_babbage_init(void) ...@@ -340,6 +358,8 @@ static void __init mx51_babbage_init(void)
iomux_v3_cfg_t power_key = _MX51_PAD_EIM_A27__GPIO2_21 | 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); 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) #if defined(CONFIG_CPU_FREQ_IMX)
get_cpu_op = mx51_get_cpu_op; get_cpu_op = mx51_get_cpu_op;
#endif #endif
...@@ -374,8 +394,8 @@ static void __init mx51_babbage_init(void) ...@@ -374,8 +394,8 @@ static void __init mx51_babbage_init(void)
mxc_iomux_v3_setup_pad(usbh1stp); mxc_iomux_v3_setup_pad(usbh1stp);
babbage_usbhub_reset(); babbage_usbhub_reset();
imx51_add_sdhci_esdhc_imx(0, NULL); imx51_add_sdhci_esdhc_imx(0, &mx51_babbage_sd1_data);
imx51_add_sdhci_esdhc_imx(1, NULL); imx51_add_sdhci_esdhc_imx(1, &mx51_babbage_sd2_data);
spi_register_board_info(mx51_babbage_spi_board_info, spi_register_board_info(mx51_babbage_spi_board_info,
ARRAY_SIZE(mx51_babbage_spi_board_info)); ARRAY_SIZE(mx51_babbage_spi_board_info));
......
...@@ -139,7 +139,7 @@ static void __init mx51_efikamx_board_id(void) ...@@ -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", .name = "efikamx:green",
.default_trigger = "default-on", .default_trigger = "default-on",
...@@ -157,19 +157,12 @@ static struct gpio_led mx51_efikamx_leds[] = { ...@@ -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, .leds = mx51_efikamx_leds,
.num_leds = ARRAY_SIZE(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[] = { static struct gpio_keys_button mx51_efikamx_powerkey[] = {
{ {
.code = KEY_POWER, .code = KEY_POWER,
...@@ -236,6 +229,8 @@ late_initcall(mx51_efikamx_power_init); ...@@ -236,6 +229,8 @@ late_initcall(mx51_efikamx_power_init);
static void __init mx51_efikamx_init(void) static void __init mx51_efikamx_init(void)
{ {
imx51_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads, mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
ARRAY_SIZE(mx51efikamx_pads)); ARRAY_SIZE(mx51efikamx_pads));
efika_board_common_init(); efika_board_common_init();
...@@ -248,7 +243,7 @@ static void __init mx51_efikamx_init(void) ...@@ -248,7 +243,7 @@ static void __init mx51_efikamx_init(void)
mx51_efikamx_leds[2].default_trigger = "mmc1"; 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); imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
if (system_rev == 0x11) { if (system_rev == 0x11) {
......
...@@ -132,7 +132,7 @@ static void __init mx51_efikasb_usb(void) ...@@ -132,7 +132,7 @@ static void __init mx51_efikasb_usb(void)
mxc_register_device(&mxc_usbh2_device, &usbh2_config); 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", .name = "efikasb:green",
.default_trigger = "default-on", .default_trigger = "default-on",
...@@ -146,19 +146,12 @@ static struct gpio_led mx51_efikasb_leds[] = { ...@@ -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, .leds = mx51_efikasb_leds,
.num_leds = ARRAY_SIZE(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[] = { static struct gpio_keys_button mx51_efikasb_keys[] = {
{ {
.code = KEY_POWER, .code = KEY_POWER,
...@@ -248,6 +241,8 @@ static void __init mx51_efikasb_board_id(void) ...@@ -248,6 +241,8 @@ static void __init mx51_efikasb_board_id(void)
static void __init efikasb_board_init(void) static void __init efikasb_board_init(void)
{ {
imx51_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads, mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
ARRAY_SIZE(mx51efikasb_pads)); ARRAY_SIZE(mx51efikasb_pads));
efika_board_common_init(); efika_board_common_init();
...@@ -256,9 +251,8 @@ static void __init efikasb_board_init(void) ...@@ -256,9 +251,8 @@ static void __init efikasb_board_init(void)
mx51_efikasb_usb(); mx51_efikasb_usb();
imx51_add_sdhci_esdhc_imx(1, NULL); 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); imx_add_gpio_keys(&mx51_efikasb_keys_data);
} }
static void __init mx51_efikasb_timer_init(void) static void __init mx51_efikasb_timer_init(void)
......
/*
* 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
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#define MX53_EVK_FEC_PHY_RST IMX_GPIO_NR(7, 6) #define MX53_EVK_FEC_PHY_RST IMX_GPIO_NR(7, 6)
#define EVK_ECSPI1_CS0 IMX_GPIO_NR(2, 30) #define EVK_ECSPI1_CS0 IMX_GPIO_NR(2, 30)
#define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19) #define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
#define MX53EVK_LED IMX_GPIO_NR(7, 7)
#include "crm_regs.h" #include "crm_regs.h"
#include "devices-imx53.h" #include "devices-imx53.h"
...@@ -58,12 +59,27 @@ static iomux_v3_cfg_t mx53_evk_pads[] = { ...@@ -58,12 +59,27 @@ static iomux_v3_cfg_t mx53_evk_pads[] = {
/* ecspi chip select lines */ /* ecspi chip select lines */
MX53_PAD_EIM_EB2__GPIO2_30, MX53_PAD_EIM_EB2__GPIO2_30,
MX53_PAD_EIM_D19__GPIO3_19, 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 = { static const struct imxuart_platform_data mx53_evk_uart_pdata __initconst = {
.flags = IMXUART_HAVE_RTSCTS, .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) static inline void mx53_evk_init_uart(void)
{ {
imx53_add_imx_uart(0, NULL); imx53_add_imx_uart(0, NULL);
...@@ -117,6 +133,8 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = { ...@@ -117,6 +133,8 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = {
static void __init mx53_evk_board_init(void) static void __init mx53_evk_board_init(void)
{ {
imx53_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads, mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
ARRAY_SIZE(mx53_evk_pads)); ARRAY_SIZE(mx53_evk_pads));
mx53_evk_init_uart(); mx53_evk_init_uart();
...@@ -133,6 +151,7 @@ static void __init mx53_evk_board_init(void) ...@@ -133,6 +151,7 @@ static void __init mx53_evk_board_init(void)
ARRAY_SIZE(mx53_evk_spi_board_info)); ARRAY_SIZE(mx53_evk_spi_board_info));
imx53_add_ecspi(0, &mx53_evk_spi_data); imx53_add_ecspi(0, &mx53_evk_spi_data);
imx53_add_imx2_wdt(0, NULL); imx53_add_imx2_wdt(0, NULL);
gpio_led_register_device(-1, &mx53evk_leds_data);
} }
static void __init mx53_evk_timer_init(void) static void __init mx53_evk_timer_init(void)
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
#define MX53_LOCO_UI1 IMX_GPIO_NR(2, 14) #define MX53_LOCO_UI1 IMX_GPIO_NR(2, 14)
#define MX53_LOCO_UI2 IMX_GPIO_NR(2, 15) #define MX53_LOCO_UI2 IMX_GPIO_NR(2, 15)
#define LOCO_FEC_PHY_RST IMX_GPIO_NR(7, 6) #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[] = { static iomux_v3_cfg_t mx53_loco_pads[] = {
/* FEC */ /* FEC */
...@@ -70,6 +74,8 @@ static iomux_v3_cfg_t mx53_loco_pads[] = { ...@@ -70,6 +74,8 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
MX53_PAD_SD1_DATA1__ESDHC1_DAT1, MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
MX53_PAD_SD1_DATA2__ESDHC1_DAT2, MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
MX53_PAD_SD1_DATA3__ESDHC1_DAT3, MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
/* SD1_CD */
MX53_PAD_EIM_DA13__GPIO3_13,
/* SD3 */ /* SD3 */
MX53_PAD_PATA_DATA8__ESDHC3_DAT0, MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
MX53_PAD_PATA_DATA9__ESDHC3_DAT1, MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
...@@ -163,7 +169,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = { ...@@ -163,7 +169,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
MX53_PAD_GPIO_7__SPDIF_PLOCK, MX53_PAD_GPIO_7__SPDIF_PLOCK,
MX53_PAD_GPIO_17__SPDIF_OUT1, MX53_PAD_GPIO_17__SPDIF_OUT1,
/* GPIO */ /* 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_DA_2__GPIO7_8,
MX53_PAD_PATA_DATA5__GPIO2_5, MX53_PAD_PATA_DATA5__GPIO2_5,
MX53_PAD_PATA_DATA6__GPIO2_6, MX53_PAD_PATA_DATA6__GPIO2_6,
...@@ -202,6 +208,15 @@ static const struct gpio_keys_platform_data loco_button_data __initconst = { ...@@ -202,6 +208,15 @@ static const struct gpio_keys_platform_data loco_button_data __initconst = {
.nbuttons = ARRAY_SIZE(loco_buttons), .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) static inline void mx53_loco_fec_reset(void)
{ {
int ret; int ret;
...@@ -225,8 +240,23 @@ static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = { ...@@ -225,8 +240,23 @@ static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
.bitrate = 100000, .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) static void __init mx53_loco_board_init(void)
{ {
imx53_soc_init();
mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads, mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
ARRAY_SIZE(mx53_loco_pads)); ARRAY_SIZE(mx53_loco_pads));
imx53_add_imx_uart(0, NULL); imx53_add_imx_uart(0, NULL);
...@@ -235,9 +265,10 @@ static void __init mx53_loco_board_init(void) ...@@ -235,9 +265,10 @@ static void __init mx53_loco_board_init(void)
imx53_add_imx2_wdt(0, NULL); imx53_add_imx2_wdt(0, NULL);
imx53_add_imx_i2c(0, &mx53_loco_i2c_data); imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
imx53_add_imx_i2c(1, &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(0, &mx53_loco_sd1_data);
imx53_add_sdhci_esdhc_imx(2, NULL); imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
imx_add_gpio_keys(&loco_button_data); imx_add_gpio_keys(&loco_button_data);
gpio_led_register_device(-1, &mx53loco_leds_data);
} }
static void __init mx53_loco_timer_init(void) static void __init mx53_loco_timer_init(void)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册