mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 16:41:39 +00:00
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
This commit is contained in:
commit
4d09a93886
@ -2,13 +2,7 @@ Intro
|
||||
=====
|
||||
|
||||
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
|
||||
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.
|
||||
software necessary to run the 3.0 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,
|
||||
@ -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
|
||||
running, the suggested command should tell you.
|
||||
|
||||
Again, keep in mind that this list assumes you are already
|
||||
functionally running a Linux 2.4 kernel. Also, not all tools are
|
||||
necessary on all systems; obviously, if you don't have any ISDN
|
||||
hardware, for example, you probably needn't concern yourself with
|
||||
isdn4k-utils.
|
||||
Again, keep in mind that this list assumes you are already functionally
|
||||
running a Linux kernel. Also, not all tools are necessary on all
|
||||
systems; obviously, if you don't have any ISDN hardware, for example,
|
||||
you probably needn't concern yourself with isdn4k-utils.
|
||||
|
||||
o Gnu C 3.2 # gcc --version
|
||||
o Gnu make 3.80 # make --version
|
||||
@ -114,12 +107,12 @@ Ksymoops
|
||||
|
||||
If the unthinkable happens and your kernel oopses, you may need the
|
||||
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
|
||||
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
|
||||
(this also produces better output than ksymoops).
|
||||
If for some reason your kernel is not build with CONFIG_KALLSYMS and
|
||||
you have no way to rebuild and reproduce the Oops with that option, then
|
||||
you can still decode that Oops with ksymoops.
|
||||
It is generally preferred to build the kernel with CONFIG_KALLSYMS so
|
||||
that it produces readable dumps that can be used as-is (this also
|
||||
produces better output than ksymoops). If for some reason your kernel
|
||||
is not build with CONFIG_KALLSYMS and you have no way to rebuild and
|
||||
reproduce the Oops with that option, then you can still decode that Oops
|
||||
with ksymoops.
|
||||
|
||||
Module-Init-Tools
|
||||
-----------------
|
||||
@ -261,8 +254,8 @@ needs to be recompiled or (preferably) upgraded.
|
||||
NFS-utils
|
||||
---------
|
||||
|
||||
In 2.4 and earlier kernels, the nfs server needed to know about any
|
||||
client that expected to be able to access files via NFS. This
|
||||
In ancient (2.4 and earlier) kernels, the nfs server needed to know
|
||||
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
|
||||
mounted the filesystem, or by "exportfs" at system startup. exportfs
|
||||
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
|
||||
fail-over. Even when the system is working well, rmtab suffers from
|
||||
getting lots of old entries that never get removed.
|
||||
|
||||
With 2.6 we have the option of having the kernel tell mountd when it
|
||||
gets a request from an unknown host, and mountd can give appropriate
|
||||
export information to the kernel. This removes the dependency on
|
||||
rmtab and means that the kernel only needs to know about currently
|
||||
active clients.
|
||||
With modern kernels we have the option of having the kernel tell mountd
|
||||
when it gets a request from an unknown host, and mountd can give
|
||||
appropriate export information to the kernel. This removes the
|
||||
dependency on rmtab and means that the kernel only needs to know about
|
||||
currently active clients.
|
||||
|
||||
To enable this new functionality, you need to:
|
||||
|
||||
|
@ -680,8 +680,8 @@ ones already enabled by DEBUG.
|
||||
Chapter 14: Allocating memory
|
||||
|
||||
The kernel provides the following general purpose memory allocators:
|
||||
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API
|
||||
documentation for further information about them.
|
||||
kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to
|
||||
the API documentation for further information about them.
|
||||
|
||||
The preferred form for passing a size of a struct is the following:
|
||||
|
||||
|
@ -77,7 +77,7 @@ Throttling/Upper Limit policy
|
||||
- Specify a bandwidth rate on particular device for root group. The format
|
||||
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
|
||||
on device having major/minor number 8:16.
|
||||
@ -90,7 +90,7 @@ Throttling/Upper Limit policy
|
||||
1024+0 records out
|
||||
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
|
||||
====================
|
||||
@ -286,28 +286,28 @@ Throttling/Upper limit policy files
|
||||
specified in bytes per second. Rules are per deivce. Following is
|
||||
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
|
||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||
specified in bytes per second. Rules are per deivce. Following is
|
||||
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
|
||||
- Specifies upper limit on READ rate from the device. IO rate is
|
||||
specified in IO per second. Rules are per deivce. Following is
|
||||
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
|
||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||
specified in io per second. Rules are per deivce. Following is
|
||||
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
|
||||
subjectd to both the constraints.
|
||||
|
@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl.
|
||||
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 -
|
||||
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
|
||||
==========================
|
||||
|
@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
the default.
|
||||
off: Turn ECRC off
|
||||
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
|
||||
Management.
|
||||
|
@ -534,6 +534,8 @@ Events that are never propagated by the driver:
|
||||
0x2404 System is waking up from hibernation to undock
|
||||
0x2405 System is waking up from hibernation to eject bay
|
||||
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:
|
||||
|
||||
@ -545,6 +547,8 @@ Events that are propagated by the driver to userspace:
|
||||
0x3006 Bay hotplug request (hint to power up SATA link when
|
||||
the optical drive tray is ejected)
|
||||
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
|
||||
0x500C Tablet pen removed from its storage bay
|
||||
0x6011 ALARM: battery is too hot
|
||||
@ -552,6 +556,7 @@ Events that are propagated by the driver to userspace:
|
||||
0x6021 ALARM: a sensor is too hot
|
||||
0x6022 ALARM: a sensor is extremely hot
|
||||
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
|
||||
operating system to hibernate or shutdown cleanly (0x2313), or shutdown
|
||||
|
@ -13,18 +13,8 @@ static DEFINE_SPINLOCK(xxx_lock);
|
||||
The above is always safe. It will disable interrupts _locally_, but the
|
||||
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
|
||||
lock. This works well even under UP. The above sequence under UP
|
||||
essentially is just the same as doing
|
||||
|
||||
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).
|
||||
lock. This works well even under UP also, so the code does _not_ need to
|
||||
worry about UP vs SMP issues: the spinlocks work correctly under both.
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
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.
|
||||
aren't sure).
|
||||
|
||||
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
|
||||
@ -120,11 +90,10 @@ Lesson 3: spinlocks revisited.
|
||||
|
||||
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,
|
||||
but partly _because_ they are safe they are also fairly slow. They are
|
||||
much faster than a generic global cli/sti pair, but slower than they'd
|
||||
need to be, because they do have to disable interrupts (which is just a
|
||||
single instruction on a x86, but it's an expensive one - and on other
|
||||
architectures it can be worse).
|
||||
but partly _because_ they are safe they are also fairly slow. They are slower
|
||||
than they'd need to be, because they do have to disable interrupts
|
||||
(which is just a single instruction on a x86, but it's an expensive one -
|
||||
and on other architectures it can be worse).
|
||||
|
||||
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
|
||||
|
15
MAINTAINERS
15
MAINTAINERS
@ -594,6 +594,16 @@ S: Maintained
|
||||
F: arch/arm/lib/floppydma.S
|
||||
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
|
||||
M: Russell King <linux@arm.linux.org.uk>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
@ -2197,7 +2207,7 @@ F: drivers/acpi/dock.c
|
||||
DOCUMENTATION
|
||||
M: Randy Dunlap <rdunlap@xenotime.net>
|
||||
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
|
||||
F: Documentation/
|
||||
|
||||
@ -4982,7 +4992,7 @@ F: drivers/power/power_supply*
|
||||
|
||||
PNP SUPPORT
|
||||
M: Adam Belay <abelay@mit.edu>
|
||||
M: Bjorn Helgaas <bjorn.helgaas@hp.com>
|
||||
M: Bjorn Helgaas <bhelgaas@google.com>
|
||||
S: Maintained
|
||||
F: drivers/pnp/
|
||||
|
||||
@ -6733,6 +6743,7 @@ F: fs/fat/
|
||||
VIDEOBUF2 FRAMEWORK
|
||||
M: Pawel Osciak <pawel@osciak.com>
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/videobuf2-*
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Sneaky Weasel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -376,6 +376,7 @@ config ARCH_MXC
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select CLKDEV_LOOKUP
|
||||
select CLKSRC_MMIO
|
||||
select GENERIC_IRQ_CHIP
|
||||
select HAVE_SCHED_CLOCK
|
||||
help
|
||||
Support for Freescale MXC/iMX-based family of processors
|
||||
@ -591,7 +592,6 @@ config ARCH_TEGRA
|
||||
select GENERIC_GPIO
|
||||
select HAVE_CLK
|
||||
select HAVE_SCHED_CLOCK
|
||||
select ARCH_HAS_BARRIERS if CACHE_L2X0
|
||||
select ARCH_HAS_CPUFREQ
|
||||
help
|
||||
This enables support for NVIDIA Tegra based systems (Tegra APX,
|
||||
@ -618,6 +618,8 @@ config ARCH_PXA
|
||||
select TICK_ONESHOT
|
||||
select PLAT_PXA
|
||||
select SPARSE_IRQ
|
||||
select AUTO_ZRELADDR
|
||||
select MULTI_IRQ_HANDLER
|
||||
help
|
||||
Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
|
||||
|
||||
|
@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
|
||||
if (buf == 0) {
|
||||
dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
|
||||
__func__, ptr);
|
||||
return 0;
|
||||
return ~0;
|
||||
}
|
||||
|
||||
dev_dbg(dev,
|
||||
|
@ -106,6 +106,7 @@ CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_MXC=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=m
|
||||
CONFIG_MMC_SDHCI=m
|
||||
@ -145,7 +146,7 @@ CONFIG_ROOT_NFS=y
|
||||
CONFIG_NLS_DEFAULT="cp437"
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_15=m
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
|
@ -22,6 +22,8 @@ CONFIG_BLK_DEV_INTEGRITY=y
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_ARCH_MXS=y
|
||||
CONFIG_MACH_MX23EVK=y
|
||||
CONFIG_MACH_MX28EVK=y
|
||||
CONFIG_MACH_STMP378X_DEVB=y
|
||||
CONFIG_MACH_TX28=y
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
@ -89,7 +91,7 @@ CONFIG_DISPLAY_SUPPORT=m
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_MXS=y
|
||||
CONFIG_RTC_CLASS=m
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_DS1307=m
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_MXS_DMA=y
|
||||
|
@ -11,12 +11,12 @@ CONFIG_ARCH_U8500=y
|
||||
CONFIG_UX500_SOC_DB5500=y
|
||||
CONFIG_UX500_SOC_DB8500=y
|
||||
CONFIG_MACH_U8500=y
|
||||
CONFIG_MACH_SNOWBALL=y
|
||||
CONFIG_MACH_U5500=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8"
|
||||
@ -25,8 +25,13 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_PHONET=y
|
||||
CONFIG_PHONET_PIPECTRLR=y
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_CAIF=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
@ -35,6 +40,13 @@ CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_MISC_DEVICES=y
|
||||
CONFIG_AB8500_PWM=y
|
||||
CONFIG_SENSORS_BH1780=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_SMSC_PHY=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMSC911X=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
@ -49,9 +61,9 @@ CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_AB8500_PONKEY=y
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_NOMADIK=y
|
||||
CONFIG_I2C=y
|
||||
@ -64,14 +76,19 @@ CONFIG_GPIO_TC3589X=y
|
||||
CONFIG_MFD_STMPE=y
|
||||
CONFIG_MFD_TC3589X=y
|
||||
CONFIG_AB8500_CORE=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_AB8500=y
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_GADGET_MUSB_HDRC=y
|
||||
CONFIG_MUSB_PIO_ONLY=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_AB8500_USB=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_CLKGATE=y
|
||||
CONFIG_MMC_ARMMMCI=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_LM3530=y
|
||||
CONFIG_LEDS_LP5521=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AB8500=y
|
||||
@ -79,7 +96,6 @@ CONFIG_RTC_DRV_PL031=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_STE_DMA40=y
|
||||
CONFIG_STAGING=y
|
||||
# CONFIG_STAGING_EXCLUDE_BUILD is not set
|
||||
CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
@ -91,6 +107,8 @@ CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_CONFIGFS_FS=m
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
@ -99,7 +117,5 @@ CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -23,6 +23,7 @@ struct pt_regs;
|
||||
extern void migrate_irqs(void);
|
||||
|
||||
extern void asm_do_IRQ(unsigned int, struct pt_regs *);
|
||||
void handle_IRQ(unsigned int, struct pt_regs *);
|
||||
void init_IRQ(void);
|
||||
|
||||
#endif
|
||||
|
@ -67,12 +67,12 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
||||
}
|
||||
|
||||
/*
|
||||
* do_IRQ handles all hardware IRQ's. Decoded IRQs should not
|
||||
* come via this function. Instead, they should provide their
|
||||
* own 'handler'
|
||||
* handle_IRQ handles all hardware IRQ's. Decoded IRQs should
|
||||
* not come via this function. Instead, they should provide their
|
||||
* own 'handler'. Used by platform code implementing C-based 1st
|
||||
* level decoding.
|
||||
*/
|
||||
asmlinkage void __exception_irq_entry
|
||||
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||
void handle_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
@ -97,6 +97,15 @@ asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
/*
|
||||
* asm_do_IRQ is the interface to be used from assembly code.
|
||||
*/
|
||||
asmlinkage void __exception_irq_entry
|
||||
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||
{
|
||||
handle_IRQ(irq, regs);
|
||||
}
|
||||
|
||||
void set_irq_flags(unsigned int irq, unsigned int iflags)
|
||||
{
|
||||
unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
|
||||
|
@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)
|
||||
static void armpmu_enable(struct pmu *pmu)
|
||||
{
|
||||
/* 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);
|
||||
|
||||
if (!armpmu)
|
||||
@ -596,9 +596,11 @@ static void armpmu_enable(struct pmu *pmu)
|
||||
continue;
|
||||
|
||||
armpmu->enable(&event->hw, idx);
|
||||
enabled = 1;
|
||||
}
|
||||
|
||||
armpmu->start();
|
||||
if (enabled)
|
||||
armpmu->start();
|
||||
}
|
||||
|
||||
static void armpmu_disable(struct pmu *pmu)
|
||||
|
@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);
|
||||
#endif
|
||||
|
||||
extern void paging_init(struct machine_desc *desc);
|
||||
extern void sanity_check_meminfo(void);
|
||||
extern void reboot_setup(char *str);
|
||||
|
||||
unsigned int processor_id;
|
||||
@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
parse_early_param();
|
||||
|
||||
sanity_check_meminfo();
|
||||
arm_memblock_init(&meminfo, mdesc);
|
||||
|
||||
paging_init(mdesc);
|
||||
|
@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)
|
||||
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
|
||||
|
||||
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)
|
||||
static __init int da850_evm_init_cpufreq(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#define DA850EVM_SATA_REFCLKPN_RATE (100 * 1000 * 1000)
|
||||
|
||||
static __init void da850_evm_init(void)
|
||||
{
|
||||
int ret;
|
||||
@ -1237,6 +1239,11 @@ static __init void da850_evm_init(void)
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
|
||||
ret);
|
||||
|
||||
ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: sata registration failed: %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
@ -44,7 +44,7 @@ static void __clk_enable(struct clk *clk)
|
||||
__clk_enable(clk->parent);
|
||||
if (clk->usecount++ == 0 && (clk->flags & CLK_PSC))
|
||||
davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
|
||||
PSC_STATE_ENABLE);
|
||||
true, clk->flags);
|
||||
}
|
||||
|
||||
static void __clk_disable(struct clk *clk)
|
||||
@ -54,8 +54,7 @@ static void __clk_disable(struct clk *clk)
|
||||
if (--clk->usecount == 0 && !(clk->flags & CLK_PLL) &&
|
||||
(clk->flags & CLK_PSC))
|
||||
davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
|
||||
(clk->flags & PSC_SWRSTDISABLE) ?
|
||||
PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
|
||||
false, clk->flags);
|
||||
if (clk->parent)
|
||||
__clk_disable(clk->parent);
|
||||
}
|
||||
@ -239,8 +238,7 @@ static int __init clk_disable_unused(void)
|
||||
pr_debug("Clocks: disable unused %s\n", ck->name);
|
||||
|
||||
davinci_psc_config(psc_domain(ck), ck->gpsc, ck->lpsc,
|
||||
(ck->flags & PSC_SWRSTDISABLE) ?
|
||||
PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
|
||||
false, ck->flags);
|
||||
}
|
||||
spin_unlock_irq(&clockfw_lock);
|
||||
|
||||
|
@ -111,6 +111,7 @@ struct clk {
|
||||
#define CLK_PLL BIT(4) /* PLL-derived clock */
|
||||
#define PRE_PLL BIT(5) /* source is before PLL mult/div */
|
||||
#define PSC_SWRSTDISABLE BIT(6) /* Disable state is SwRstDisable */
|
||||
#define PSC_FORCE BIT(7) /* Force module state transtition */
|
||||
|
||||
#define CLK(dev, con, ck) \
|
||||
{ \
|
||||
|
@ -58,6 +58,7 @@ static struct pll_data pll0_data = {
|
||||
static struct clk ref_clk = {
|
||||
.name = "ref_clk",
|
||||
.rate = DA850_REF_FREQ,
|
||||
.set_rate = davinci_simple_set_rate,
|
||||
};
|
||||
|
||||
static struct clk pll0_clk = {
|
||||
@ -373,6 +374,14 @@ static struct clk spi1_clk = {
|
||||
.flags = DA850_CLK_ASYNC3,
|
||||
};
|
||||
|
||||
static struct clk sata_clk = {
|
||||
.name = "sata",
|
||||
.parent = &pll0_sysclk2,
|
||||
.lpsc = DA850_LPSC1_SATA,
|
||||
.gpsc = 1,
|
||||
.flags = PSC_FORCE,
|
||||
};
|
||||
|
||||
static struct clk_lookup da850_clks[] = {
|
||||
CLK(NULL, "ref", &ref_clk),
|
||||
CLK(NULL, "pll0", &pll0_clk),
|
||||
@ -419,6 +428,7 @@ static struct clk_lookup da850_clks[] = {
|
||||
CLK(NULL, "usb20", &usb20_clk),
|
||||
CLK("spi_davinci.0", NULL, &spi0_clk),
|
||||
CLK("spi_davinci.1", NULL, &spi1_clk),
|
||||
CLK("ahci", NULL, &sata_clk),
|
||||
CLK(NULL, NULL, NULL),
|
||||
};
|
||||
|
||||
|
@ -14,6 +14,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/ahci_platform.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <mach/cputype.h>
|
||||
#include <mach/common.h>
|
||||
@ -33,6 +35,7 @@
|
||||
#define DA8XX_SPI0_BASE 0x01c41000
|
||||
#define DA830_SPI1_BASE 0x01e12000
|
||||
#define DA8XX_LCD_CNTRL_BASE 0x01e13000
|
||||
#define DA850_SATA_BASE 0x01e18000
|
||||
#define DA850_MMCSD1_BASE 0x01e1b000
|
||||
#define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000
|
||||
#define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000
|
||||
@ -842,3 +845,126 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info,
|
||||
|
||||
return platform_device_register(&da8xx_spi_device[instance]);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_DAVINCI_DA850
|
||||
|
||||
static struct resource da850_sata_resources[] = {
|
||||
{
|
||||
.start = DA850_SATA_BASE,
|
||||
.end = DA850_SATA_BASE + 0x1fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = IRQ_DA850_SATAINT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
/* SATA PHY Control Register offset from AHCI base */
|
||||
#define SATA_P0PHYCR_REG 0x178
|
||||
|
||||
#define SATA_PHY_MPY(x) ((x) << 0)
|
||||
#define SATA_PHY_LOS(x) ((x) << 6)
|
||||
#define SATA_PHY_RXCDR(x) ((x) << 10)
|
||||
#define SATA_PHY_RXEQ(x) ((x) << 13)
|
||||
#define SATA_PHY_TXSWING(x) ((x) << 19)
|
||||
#define SATA_PHY_ENPLL(x) ((x) << 31)
|
||||
|
||||
static struct clk *da850_sata_clk;
|
||||
static unsigned long da850_sata_refclkpn;
|
||||
|
||||
/* Supported DA850 SATA crystal frequencies */
|
||||
#define KHZ_TO_HZ(freq) ((freq) * 1000)
|
||||
static unsigned long da850_sata_xtal[] = {
|
||||
KHZ_TO_HZ(300000),
|
||||
KHZ_TO_HZ(250000),
|
||||
0, /* Reserved */
|
||||
KHZ_TO_HZ(187500),
|
||||
KHZ_TO_HZ(150000),
|
||||
KHZ_TO_HZ(125000),
|
||||
KHZ_TO_HZ(120000),
|
||||
KHZ_TO_HZ(100000),
|
||||
KHZ_TO_HZ(75000),
|
||||
KHZ_TO_HZ(60000),
|
||||
};
|
||||
|
||||
static int da850_sata_init(struct device *dev, void __iomem *addr)
|
||||
{
|
||||
int i, ret;
|
||||
unsigned int val;
|
||||
|
||||
da850_sata_clk = clk_get(dev, NULL);
|
||||
if (IS_ERR(da850_sata_clk))
|
||||
return PTR_ERR(da850_sata_clk);
|
||||
|
||||
ret = clk_enable(da850_sata_clk);
|
||||
if (ret)
|
||||
goto err0;
|
||||
|
||||
/* Enable SATA clock receiver */
|
||||
val = __raw_readl(DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
|
||||
val &= ~BIT(0);
|
||||
__raw_writel(val, DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
|
||||
|
||||
/* Get the multiplier needed for 1.5GHz PLL output */
|
||||
for (i = 0; i < ARRAY_SIZE(da850_sata_xtal); i++)
|
||||
if (da850_sata_xtal[i] == da850_sata_refclkpn)
|
||||
break;
|
||||
|
||||
if (i == ARRAY_SIZE(da850_sata_xtal)) {
|
||||
ret = -EINVAL;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
val = SATA_PHY_MPY(i + 1) |
|
||||
SATA_PHY_LOS(1) |
|
||||
SATA_PHY_RXCDR(4) |
|
||||
SATA_PHY_RXEQ(1) |
|
||||
SATA_PHY_TXSWING(3) |
|
||||
SATA_PHY_ENPLL(1);
|
||||
|
||||
__raw_writel(val, addr + SATA_P0PHYCR_REG);
|
||||
|
||||
return 0;
|
||||
|
||||
err1:
|
||||
clk_disable(da850_sata_clk);
|
||||
err0:
|
||||
clk_put(da850_sata_clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void da850_sata_exit(struct device *dev)
|
||||
{
|
||||
clk_disable(da850_sata_clk);
|
||||
clk_put(da850_sata_clk);
|
||||
}
|
||||
|
||||
static struct ahci_platform_data da850_sata_pdata = {
|
||||
.init = da850_sata_init,
|
||||
.exit = da850_sata_exit,
|
||||
};
|
||||
|
||||
static u64 da850_sata_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device da850_sata_device = {
|
||||
.name = "ahci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &da850_sata_pdata,
|
||||
.dma_mask = &da850_sata_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(da850_sata_resources),
|
||||
.resource = da850_sata_resources,
|
||||
};
|
||||
|
||||
int __init da850_register_sata(unsigned long refclkpn)
|
||||
{
|
||||
da850_sata_refclkpn = refclkpn;
|
||||
if (!da850_sata_refclkpn)
|
||||
return -EINVAL;
|
||||
|
||||
return platform_device_register(&da850_sata_device);
|
||||
}
|
||||
#endif
|
||||
|
@ -57,6 +57,7 @@ extern unsigned int da850_max_speed;
|
||||
#define DA8XX_SYSCFG1_BASE (IO_PHYS + 0x22C000)
|
||||
#define DA8XX_SYSCFG1_VIRT(x) (da8xx_syscfg1_base + (x))
|
||||
#define DA8XX_DEEPSLEEP_REG 0x8
|
||||
#define DA8XX_PWRDN_REG 0x18
|
||||
|
||||
#define DA8XX_PSC0_BASE 0x01c10000
|
||||
#define DA8XX_PLL0_BASE 0x01c11000
|
||||
@ -89,6 +90,7 @@ int da850_register_cpufreq(char *async_clk);
|
||||
int da8xx_register_cpuidle(void);
|
||||
void __iomem * __init da8xx_get_mem_ctlr(void);
|
||||
int da850_register_pm(struct platform_device *pdev);
|
||||
int __init da850_register_sata(unsigned long refclkpn);
|
||||
|
||||
extern struct platform_device da8xx_serial_device;
|
||||
extern struct emac_platform_data da8xx_emac_pdata;
|
||||
|
@ -244,12 +244,13 @@
|
||||
#define PSC_STATE_ENABLE 3
|
||||
|
||||
#define MDSTAT_STATE_MASK 0x1f
|
||||
#define MDCTL_FORCE BIT(31)
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id);
|
||||
extern void davinci_psc_config(unsigned int domain, unsigned int ctlr,
|
||||
unsigned int id, u32 next_state);
|
||||
unsigned int id, bool enable, u32 flags);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -25,6 +25,8 @@
|
||||
#include <mach/cputype.h>
|
||||
#include <mach/psc.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
/* Return nonzero iff the domain's clock is active */
|
||||
int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
|
||||
{
|
||||
@ -48,11 +50,12 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
|
||||
|
||||
/* Enable or disable a PSC domain */
|
||||
void davinci_psc_config(unsigned int domain, unsigned int ctlr,
|
||||
unsigned int id, u32 next_state)
|
||||
unsigned int id, bool enable, u32 flags)
|
||||
{
|
||||
u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl;
|
||||
void __iomem *psc_base;
|
||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
u32 next_state = PSC_STATE_ENABLE;
|
||||
|
||||
if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
|
||||
pr_warning("PSC: Bad psc data: 0x%x[%d]\n",
|
||||
@ -62,9 +65,18 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
|
||||
|
||||
psc_base = ioremap(soc_info->psc_bases[ctlr], SZ_4K);
|
||||
|
||||
if (!enable) {
|
||||
if (flags & PSC_SWRSTDISABLE)
|
||||
next_state = PSC_STATE_SWRSTDISABLE;
|
||||
else
|
||||
next_state = PSC_STATE_DISABLE;
|
||||
}
|
||||
|
||||
mdctl = __raw_readl(psc_base + MDCTL + 4 * id);
|
||||
mdctl &= ~MDSTAT_STATE_MASK;
|
||||
mdctl |= next_state;
|
||||
if (flags & PSC_FORCE)
|
||||
mdctl |= MDCTL_FORCE;
|
||||
__raw_writel(mdctl, psc_base + MDCTL + 4 * id);
|
||||
|
||||
pdstat = __raw_readl(psc_base + PDSTAT);
|
||||
|
@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,
|
||||
unsigned int mcr;
|
||||
|
||||
mcr = 0;
|
||||
if (!(mctrl & TIOCM_RTS))
|
||||
if (mctrl & TIOCM_RTS)
|
||||
mcr |= 2;
|
||||
if (!(mctrl & TIOCM_DTR))
|
||||
if (mctrl & TIOCM_DTR)
|
||||
mcr |= 1;
|
||||
|
||||
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <plat/sdhci.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/fimc-core.h>
|
||||
#include <plat/iic-core.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
|
||||
@ -132,6 +133,11 @@ void __init exynos4_map_io(void)
|
||||
s3c_fimc_setname(1, "exynos4-fimc");
|
||||
s3c_fimc_setname(2, "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)
|
||||
|
@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
__INIT
|
||||
__CPUINIT
|
||||
|
||||
/*
|
||||
* exynos4 specific entry point for secondary CPUs. This provides
|
||||
|
@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||
.max_width = 8,
|
||||
@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
||||
.max_width = 8,
|
||||
|
@ -167,6 +167,7 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD
|
||||
bool "Eukrea MBIMXSD development board"
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
select IMX_HAVE_PLATFORM_IMX_SSI
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
This adds board specific devices that can be found on Eukrea's
|
||||
MBIMXSD evaluation board.
|
||||
@ -265,6 +266,7 @@ config MACH_EUKREA_MBIMX27_BASEBOARD
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_MXC_MMC
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
This adds board specific devices that can be found on Eukrea's
|
||||
MBIMX27 evaluation board.
|
||||
@ -276,6 +278,7 @@ config MACH_MX27_3DS
|
||||
select SOC_IMX27
|
||||
select IMX_HAVE_PLATFORM_FSL_USB2_UDC
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_FB
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_KEYPAD
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
@ -403,6 +406,7 @@ config MACH_MX31LITE
|
||||
select IMX_HAVE_PLATFORM_MXC_NAND
|
||||
select IMX_HAVE_PLATFORM_MXC_RTC
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for MX31 LITEKIT platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
@ -471,6 +475,7 @@ config MACH_MX31MOBOARD
|
||||
select IMX_HAVE_PLATFORM_MXC_EHCI
|
||||
select IMX_HAVE_PLATFORM_MXC_MMC
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MXC_ULPI if USB_ULPI
|
||||
help
|
||||
Include support for mx31moboard platform. This includes specific
|
||||
@ -577,6 +582,7 @@ config MACH_EUKREA_MBIMXSD35_BASEBOARD
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
select IMX_HAVE_PLATFORM_IMX_SSI
|
||||
select IMX_HAVE_PLATFORM_IPU_CORE
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
This adds board specific devices that can be found on Eukrea's
|
||||
MBIMXSD evaluation board.
|
||||
|
@ -475,7 +475,6 @@ void imx_dma_enable(int channel)
|
||||
imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) | CCR_CEN |
|
||||
CCR_ACRPT, DMA_CCR(channel));
|
||||
|
||||
#ifdef CONFIG_ARCH_MX2
|
||||
if ((cpu_is_mx21() || cpu_is_mx27()) &&
|
||||
imxdma->sg && imx_dma_hw_chain(imxdma)) {
|
||||
imxdma->sg = sg_next(imxdma->sg);
|
||||
@ -487,7 +486,6 @@ void imx_dma_enable(int channel)
|
||||
DMA_CCR(channel));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
imxdma->in_use = 1;
|
||||
|
||||
local_irq_restore(flags);
|
||||
@ -518,7 +516,6 @@ void imx_dma_disable(int channel)
|
||||
}
|
||||
EXPORT_SYMBOL(imx_dma_disable);
|
||||
|
||||
#ifdef CONFIG_ARCH_MX2
|
||||
static void imx_dma_watchdog(unsigned long chno)
|
||||
{
|
||||
struct imx_dma_channel *imxdma = &imx_dma_channels[chno];
|
||||
@ -530,7 +527,6 @@ static void imx_dma_watchdog(unsigned long chno)
|
||||
if (imxdma->err_handler)
|
||||
imxdma->err_handler(chno, imxdma->data, IMX_DMA_ERR_TIMEOUT);
|
||||
}
|
||||
#endif
|
||||
|
||||
static irqreturn_t dma_err_handler(int irq, void *dev_id)
|
||||
{
|
||||
@ -654,10 +650,8 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
int i, disr;
|
||||
|
||||
#ifdef CONFIG_ARCH_MX2
|
||||
if (cpu_is_mx21() || cpu_is_mx27())
|
||||
dma_err_handler(irq, dev_id);
|
||||
#endif
|
||||
|
||||
disr = imx_dmav1_readl(DMA_DISR);
|
||||
|
||||
@ -703,7 +697,6 @@ int imx_dma_request(int channel, const char *name)
|
||||
imxdma->name = name;
|
||||
local_irq_restore(flags); /* request_irq() can block */
|
||||
|
||||
#ifdef CONFIG_ARCH_MX2
|
||||
if (cpu_is_mx21() || cpu_is_mx27()) {
|
||||
ret = request_irq(MX2x_INT_DMACH0 + channel,
|
||||
dma_irq_handler, 0, "DMA", NULL);
|
||||
@ -717,7 +710,6 @@ int imx_dma_request(int channel, const char *name)
|
||||
imxdma->watchdog.function = &imx_dma_watchdog;
|
||||
imxdma->watchdog.data = channel;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -744,10 +736,8 @@ void imx_dma_free(int channel)
|
||||
imx_dma_disable(channel);
|
||||
imxdma->name = NULL;
|
||||
|
||||
#ifdef CONFIG_ARCH_MX2
|
||||
if (cpu_is_mx21() || cpu_is_mx27())
|
||||
free_irq(MX2x_INT_DMACH0 + channel, NULL);
|
||||
#endif
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
@ -803,21 +793,13 @@ static int __init imx_dma_init(void)
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_ARCH_MX1
|
||||
if (cpu_is_mx1())
|
||||
imx_dmav1_baseaddr = MX1_IO_ADDRESS(MX1_DMA_BASE_ADDR);
|
||||
else
|
||||
#endif
|
||||
#ifdef CONFIG_MACH_MX21
|
||||
if (cpu_is_mx21())
|
||||
else if (cpu_is_mx21())
|
||||
imx_dmav1_baseaddr = MX21_IO_ADDRESS(MX21_DMA_BASE_ADDR);
|
||||
else
|
||||
#endif
|
||||
#ifdef CONFIG_MACH_MX27
|
||||
if (cpu_is_mx27())
|
||||
else if (cpu_is_mx27())
|
||||
imx_dmav1_baseaddr = MX27_IO_ADDRESS(MX27_DMA_BASE_ADDR);
|
||||
else
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
dma_clk = clk_get(NULL, "dma");
|
||||
@ -828,7 +810,6 @@ static int __init imx_dma_init(void)
|
||||
/* reset DMA module */
|
||||
imx_dmav1_writel(DCR_DRST, DMA_DCR);
|
||||
|
||||
#ifdef CONFIG_ARCH_MX1
|
||||
if (cpu_is_mx1()) {
|
||||
ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", NULL);
|
||||
if (ret) {
|
||||
@ -843,7 +824,7 @@ static int __init imx_dma_init(void)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* enable DMA module */
|
||||
imx_dmav1_writel(DCR_DEN, DMA_DCR);
|
||||
|
||||
|
@ -112,7 +112,7 @@ eukrea_mbimx27_keymap_data __initconst = {
|
||||
.keymap_size = ARRAY_SIZE(eukrea_mbimx27_keymap),
|
||||
};
|
||||
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
static const struct gpio_led eukrea_mbimx27_gpio_leds[] __initconst = {
|
||||
{
|
||||
.name = "led1",
|
||||
.default_trigger = "heartbeat",
|
||||
@ -127,17 +127,10 @@ static struct gpio_led gpio_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data gpio_led_info = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device leds_gpio = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gpio_led_info,
|
||||
},
|
||||
static const struct gpio_led_platform_data
|
||||
eukrea_mbimx27_gpio_led_info __initconst = {
|
||||
.leds = eukrea_mbimx27_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(eukrea_mbimx27_gpio_leds),
|
||||
};
|
||||
|
||||
static struct imx_fb_videomode eukrea_mbimx27_modes[] = {
|
||||
@ -293,10 +286,6 @@ static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *platform_devices[] __initdata = {
|
||||
&leds_gpio,
|
||||
};
|
||||
|
||||
static const struct imxmmc_platform_data sdhc_pdata __initconst = {
|
||||
.dat3_card_detect = 1,
|
||||
};
|
||||
@ -377,5 +366,5 @@ void __init eukrea_mbimx27_baseboard_init(void)
|
||||
|
||||
imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data);
|
||||
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
gpio_led_register_device(-1, &eukrea_mbimx27_gpio_led_info);
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ static struct platform_device eukrea_mbimxsd_lcd_powerdev = {
|
||||
.dev.platform_data = &eukrea_mbimxsd_lcd_power_data,
|
||||
};
|
||||
|
||||
static struct gpio_led eukrea_mbimxsd_leds[] = {
|
||||
static const struct gpio_led eukrea_mbimxsd_leds[] __initconst = {
|
||||
{
|
||||
.name = "led1",
|
||||
.default_trigger = "heartbeat",
|
||||
@ -182,19 +182,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data eukrea_mbimxsd_led_info = {
|
||||
static const struct gpio_led_platform_data
|
||||
eukrea_mbimxsd_led_info __initconst = {
|
||||
.leds = eukrea_mbimxsd_leds,
|
||||
.num_leds = ARRAY_SIZE(eukrea_mbimxsd_leds),
|
||||
};
|
||||
|
||||
static struct platform_device eukrea_mbimxsd_leds_gpio = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &eukrea_mbimxsd_led_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
|
||||
{
|
||||
.gpio = GPIO_SWITCH1,
|
||||
@ -212,7 +205,6 @@ static const struct gpio_keys_platform_data
|
||||
};
|
||||
|
||||
static struct platform_device *platform_devices[] __initdata = {
|
||||
&eukrea_mbimxsd_leds_gpio,
|
||||
&eukrea_mbimxsd_lcd_powerdev,
|
||||
};
|
||||
|
||||
@ -287,5 +279,6 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
|
||||
ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
|
||||
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
|
||||
imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
|
||||
}
|
||||
|
@ -193,19 +193,12 @@ static struct gpio_led eukrea_mbimxsd_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data eukrea_mbimxsd_led_info = {
|
||||
static const struct gpio_led_platform_data
|
||||
eukrea_mbimxsd_led_info __initconst = {
|
||||
.leds = eukrea_mbimxsd_leds,
|
||||
.num_leds = ARRAY_SIZE(eukrea_mbimxsd_leds),
|
||||
};
|
||||
|
||||
static struct platform_device eukrea_mbimxsd_leds_gpio = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &eukrea_mbimxsd_led_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
|
||||
{
|
||||
.gpio = GPIO_SWITCH1,
|
||||
@ -223,7 +216,6 @@ static const struct gpio_keys_platform_data
|
||||
};
|
||||
|
||||
static struct platform_device *platform_devices[] __initdata = {
|
||||
&eukrea_mbimxsd_leds_gpio,
|
||||
&eukrea_mbimxsd_lcd_powerdev,
|
||||
};
|
||||
|
||||
@ -299,5 +291,6 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
|
||||
ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
|
||||
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
|
||||
imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
|
||||
}
|
||||
|
@ -99,11 +99,6 @@ static struct platform_device dm9000x_device = {
|
||||
}
|
||||
};
|
||||
|
||||
/* --- SERIAL RESSOURCE --- */
|
||||
static const struct imxuart_platform_data uart0_pdata __initconst = {
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
static const struct imxuart_platform_data uart1_pdata __initconst = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
@ -115,11 +110,13 @@ static struct platform_device *devices[] __initdata = {
|
||||
|
||||
static void __init apf9328_init(void)
|
||||
{
|
||||
imx1_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(apf9328_pins,
|
||||
ARRAY_SIZE(apf9328_pins),
|
||||
"APF9328");
|
||||
|
||||
imx1_add_imx_uart0(&uart0_pdata);
|
||||
imx1_add_imx_uart0(NULL);
|
||||
imx1_add_imx_uart1(&uart1_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
@ -490,6 +490,8 @@ static struct platform_device *devices[] __initdata = {
|
||||
*/
|
||||
static void __init armadillo5x0_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_iomux_setup_multiple_pins(armadillo5x0_pins,
|
||||
ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0");
|
||||
|
||||
|
@ -42,6 +42,8 @@ static const unsigned int bug_pins[] __initconst = {
|
||||
|
||||
static void __init bug_board_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_iomux_setup_multiple_pins(bug_pins,
|
||||
ARRAY_SIZE(bug_pins), "uart-4");
|
||||
imx31_add_imx_uart4(&uart_pdata);
|
||||
|
@ -250,6 +250,8 @@ __setup("otg_mode=", eukrea_cpuimx27_otg_mode);
|
||||
|
||||
static void __init eukrea_cpuimx27_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins,
|
||||
ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27");
|
||||
|
||||
|
@ -156,6 +156,8 @@ __setup("otg_mode=", eukrea_cpuimx35_otg_mode);
|
||||
*/
|
||||
static void __init eukrea_cpuimx35_init(void)
|
||||
{
|
||||
imx35_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads,
|
||||
ARRAY_SIZE(eukrea_cpuimx35_pads));
|
||||
|
||||
|
@ -125,6 +125,8 @@ __setup("otg_mode=", eukrea_cpuimx25_otg_mode);
|
||||
|
||||
static void __init eukrea_cpuimx25_init(void)
|
||||
{
|
||||
imx25_soc_init();
|
||||
|
||||
if (mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx25_pads,
|
||||
ARRAY_SIZE(eukrea_cpuimx25_pads)))
|
||||
printk(KERN_ERR "error setting cpuimx25 pads !\n");
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/iomux.h>
|
||||
#include <mach/iomux-mx27.h>
|
||||
|
||||
#include "devices-imx27.h"
|
||||
|
||||
@ -231,6 +231,8 @@ static void __init visstrim_m10_board_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
imx27_soc_init();
|
||||
|
||||
ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins,
|
||||
ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10");
|
||||
if (ret)
|
||||
|
@ -50,6 +50,8 @@ static const int mx27ipcam_pins[] __initconst = {
|
||||
|
||||
static void __init mx27ipcam_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins),
|
||||
"mx27ipcam");
|
||||
|
||||
|
@ -59,6 +59,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
|
||||
static void __init mx27lite_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins),
|
||||
"imx27lite");
|
||||
imx27_add_imx_uart0(&uart_pdata);
|
||||
|
@ -223,6 +223,8 @@ static int kzm_pins[] __initdata = {
|
||||
*/
|
||||
static void __init kzm_board_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_iomux_setup_multiple_pins(kzm_pins,
|
||||
ARRAY_SIZE(kzm_pins), "kzm");
|
||||
kzm_init_ext_uart();
|
||||
|
@ -115,6 +115,8 @@ static struct i2c_board_info mx1ads_i2c_devices[] = {
|
||||
*/
|
||||
static void __init mx1ads_init(void)
|
||||
{
|
||||
imx1_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx1ads_pins,
|
||||
ARRAY_SIZE(mx1ads_pins), "mx1ads");
|
||||
|
||||
|
@ -279,6 +279,8 @@ static struct platform_device *platform_devices[] __initdata = {
|
||||
|
||||
static void __init mx21ads_board_init(void)
|
||||
{
|
||||
imx21_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins),
|
||||
"mx21ads");
|
||||
|
||||
|
@ -219,6 +219,8 @@ static const struct esdhc_platform_data mx25pdk_esdhc_pdata __initconst = {
|
||||
|
||||
static void __init mx25pdk_init(void)
|
||||
{
|
||||
imx25_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads,
|
||||
ARRAY_SIZE(mx25pdk_pads));
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <linux/mfd/mc13783.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/spi/l4f00242t03.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -42,10 +43,15 @@
|
||||
|
||||
#include "devices-imx27.h"
|
||||
|
||||
#define SD1_EN_GPIO (GPIO_PORTB + 25)
|
||||
#define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23)
|
||||
#define SPI2_SS0 (GPIO_PORTD + 21)
|
||||
#define EXPIO_PARENT_INT (MXC_INTERNAL_IRQS + GPIO_PORTC + 28)
|
||||
#define SD1_EN_GPIO IMX_GPIO_NR(2, 25)
|
||||
#define OTG_PHY_RESET_GPIO IMX_GPIO_NR(2, 23)
|
||||
#define SPI2_SS0 IMX_GPIO_NR(4, 21)
|
||||
#define EXPIO_PARENT_INT gpio_to_irq(IMX_GPIO_NR(3, 28))
|
||||
#define PMIC_INT IMX_GPIO_NR(3, 14)
|
||||
#define SPI1_SS0 IMX_GPIO_NR(4, 28)
|
||||
#define SD1_CD IMX_GPIO_NR(2, 26)
|
||||
#define LCD_RESET IMX_GPIO_NR(1, 3)
|
||||
#define LCD_ENABLE IMX_GPIO_NR(1, 31)
|
||||
|
||||
static const int mx27pdk_pins[] __initconst = {
|
||||
/* UART1 */
|
||||
@ -94,13 +100,47 @@ static const int mx27pdk_pins[] __initconst = {
|
||||
PE2_PF_USBOTG_DIR,
|
||||
PE24_PF_USBOTG_CLK,
|
||||
PE25_PF_USBOTG_DATA7,
|
||||
/* CSPI1 */
|
||||
PD31_PF_CSPI1_MOSI,
|
||||
PD30_PF_CSPI1_MISO,
|
||||
PD29_PF_CSPI1_SCLK,
|
||||
PD25_PF_CSPI1_RDY,
|
||||
SPI1_SS0 | GPIO_GPIO | GPIO_OUT,
|
||||
/* CSPI2 */
|
||||
PD22_PF_CSPI2_SCLK,
|
||||
PD23_PF_CSPI2_MISO,
|
||||
PD24_PF_CSPI2_MOSI,
|
||||
SPI2_SS0 | GPIO_GPIO | GPIO_OUT,
|
||||
/* I2C1 */
|
||||
PD17_PF_I2C_DATA,
|
||||
PD18_PF_I2C_CLK,
|
||||
/* PMIC INT */
|
||||
PMIC_INT | GPIO_GPIO | GPIO_IN,
|
||||
/* LCD */
|
||||
PA5_PF_LSCLK,
|
||||
PA6_PF_LD0,
|
||||
PA7_PF_LD1,
|
||||
PA8_PF_LD2,
|
||||
PA9_PF_LD3,
|
||||
PA10_PF_LD4,
|
||||
PA11_PF_LD5,
|
||||
PA12_PF_LD6,
|
||||
PA13_PF_LD7,
|
||||
PA14_PF_LD8,
|
||||
PA15_PF_LD9,
|
||||
PA16_PF_LD10,
|
||||
PA17_PF_LD11,
|
||||
PA18_PF_LD12,
|
||||
PA19_PF_LD13,
|
||||
PA20_PF_LD14,
|
||||
PA21_PF_LD15,
|
||||
PA22_PF_LD16,
|
||||
PA23_PF_LD17,
|
||||
PA28_PF_HSYNC,
|
||||
PA29_PF_VSYNC,
|
||||
PA30_PF_CONTRAST,
|
||||
LCD_ENABLE | GPIO_GPIO | GPIO_OUT,
|
||||
LCD_RESET | GPIO_GPIO | GPIO_OUT,
|
||||
};
|
||||
|
||||
static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
@ -131,13 +171,13 @@ static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = {
|
||||
static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
|
||||
void *data)
|
||||
{
|
||||
return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING |
|
||||
IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
|
||||
return request_irq(gpio_to_irq(SD1_CD), detect_irq,
|
||||
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
|
||||
}
|
||||
|
||||
static void mx27_3ds_sdhc1_exit(struct device *dev, void *data)
|
||||
{
|
||||
free_irq(IRQ_GPIOB(26), data);
|
||||
free_irq(gpio_to_irq(SD1_CD), data);
|
||||
}
|
||||
|
||||
static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
|
||||
@ -193,6 +233,13 @@ static int __init mx27_3ds_otg_mode(char *options)
|
||||
__setup("otg_mode=", mx27_3ds_otg_mode);
|
||||
|
||||
/* Regulators */
|
||||
static struct regulator_init_data gpo_init = {
|
||||
.constraints = {
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply vmmc1_consumers[] = {
|
||||
REGULATOR_SUPPLY("lcd_2v8", NULL),
|
||||
};
|
||||
@ -201,7 +248,9 @@ static struct regulator_init_data vmmc1_init = {
|
||||
.constraints = {
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
||||
REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),
|
||||
.consumer_supplies = vmmc1_consumers,
|
||||
@ -228,6 +277,12 @@ static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = {
|
||||
}, {
|
||||
.id = MC13783_REG_VGEN,
|
||||
.init_data = &vgen_init,
|
||||
}, {
|
||||
.id = MC13783_REG_GPO1, /* Turn on 1.8V */
|
||||
.init_data = &gpo_init,
|
||||
}, {
|
||||
.id = MC13783_REG_GPO3, /* Turn on 3.3V */
|
||||
.init_data = &gpo_init,
|
||||
},
|
||||
};
|
||||
|
||||
@ -238,15 +293,63 @@ static struct mc13xxx_platform_data mc13783_pdata = {
|
||||
.num_regulators = ARRAY_SIZE(mx27_3ds_regulators),
|
||||
|
||||
},
|
||||
.flags = MC13783_USE_REGULATOR,
|
||||
.flags = MC13783_USE_REGULATOR | MC13783_USE_TOUCHSCREEN |
|
||||
MC13783_USE_RTC,
|
||||
};
|
||||
|
||||
/* SPI */
|
||||
static int spi2_internal_chipselect[] = {SPI2_SS0};
|
||||
static int spi1_chipselect[] = {SPI1_SS0};
|
||||
|
||||
static const struct spi_imx_master spi1_pdata __initconst = {
|
||||
.chipselect = spi1_chipselect,
|
||||
.num_chipselect = ARRAY_SIZE(spi1_chipselect),
|
||||
};
|
||||
|
||||
static int spi2_chipselect[] = {SPI2_SS0};
|
||||
|
||||
static const struct spi_imx_master spi2_pdata __initconst = {
|
||||
.chipselect = spi2_internal_chipselect,
|
||||
.num_chipselect = ARRAY_SIZE(spi2_internal_chipselect),
|
||||
.chipselect = spi2_chipselect,
|
||||
.num_chipselect = ARRAY_SIZE(spi2_chipselect),
|
||||
};
|
||||
|
||||
static struct imx_fb_videomode mx27_3ds_modes[] = {
|
||||
{ /* 480x640 @ 60 Hz */
|
||||
.mode = {
|
||||
.name = "Epson-VGA",
|
||||
.refresh = 60,
|
||||
.xres = 480,
|
||||
.yres = 640,
|
||||
.pixclock = 41701,
|
||||
.left_margin = 20,
|
||||
.right_margin = 41,
|
||||
.upper_margin = 10,
|
||||
.lower_margin = 5,
|
||||
.hsync_len = 20,
|
||||
.vsync_len = 10,
|
||||
.sync = FB_SYNC_OE_ACT_HIGH |
|
||||
FB_SYNC_CLK_INVERT,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
.flag = 0,
|
||||
},
|
||||
.bpp = 16,
|
||||
.pcr = 0xFAC08B82,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct imx_fb_platform_data mx27_3ds_fb_data __initconst = {
|
||||
.mode = mx27_3ds_modes,
|
||||
.num_modes = ARRAY_SIZE(mx27_3ds_modes),
|
||||
.pwmr = 0x00A903FF,
|
||||
.lscr1 = 0x00120300,
|
||||
.dmacr = 0x00020010,
|
||||
};
|
||||
|
||||
/* LCD */
|
||||
static struct l4f00242t03_pdata mx27_3ds_lcd_pdata = {
|
||||
.reset_gpio = LCD_RESET,
|
||||
.data_enable_gpio = LCD_ENABLE,
|
||||
.core_supply = "lcd_2v8",
|
||||
.io_supply = "vdd_lcdio",
|
||||
};
|
||||
|
||||
static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
|
||||
@ -256,8 +359,14 @@ static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
|
||||
.bus_num = 1,
|
||||
.chip_select = 0, /* SS0 */
|
||||
.platform_data = &mc13783_pdata,
|
||||
.irq = IRQ_GPIOC(14),
|
||||
.irq = gpio_to_irq(PMIC_INT),
|
||||
.mode = SPI_CS_HIGH,
|
||||
}, {
|
||||
.modalias = "l4f00242t03",
|
||||
.max_speed_hz = 5000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0, /* SS0 */
|
||||
.platform_data = &mx27_3ds_lcd_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
@ -267,6 +376,8 @@ static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = {
|
||||
|
||||
static void __init mx27pdk_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
|
||||
"mx27pdk");
|
||||
mx27_3ds_sdhc1_enable_level_translator();
|
||||
@ -289,12 +400,14 @@ static void __init mx27pdk_init(void)
|
||||
imx27_add_fsl_usb2_udc(&otg_device_pdata);
|
||||
|
||||
imx27_add_spi_imx1(&spi2_pdata);
|
||||
imx27_add_spi_imx0(&spi1_pdata);
|
||||
spi_register_board_info(mx27_3ds_spi_devs,
|
||||
ARRAY_SIZE(mx27_3ds_spi_devs));
|
||||
|
||||
if (mxc_expio_init(MX27_CS5_BASE_ADDR, EXPIO_PARENT_INT))
|
||||
pr_warn("Init of the debugboard failed, all devices on the debugboard are unusable.\n");
|
||||
imx27_add_imx_i2c(0, &mx27_3ds_i2c0_data);
|
||||
imx27_add_imx_fb(&mx27_3ds_fb_data);
|
||||
}
|
||||
|
||||
static void __init mx27pdk_timer_init(void)
|
||||
|
@ -288,6 +288,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
|
||||
static void __init mx27ads_board_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
|
||||
"mx27ads");
|
||||
|
||||
|
@ -53,11 +53,8 @@ static int mx31_3ds_pins[] = {
|
||||
MX31_PIN_RXD1__RXD1,
|
||||
IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
|
||||
/*SPI0*/
|
||||
MX31_PIN_CSPI1_SCLK__SCLK,
|
||||
MX31_PIN_CSPI1_MOSI__MOSI,
|
||||
MX31_PIN_CSPI1_MISO__MISO,
|
||||
MX31_PIN_CSPI1_SPI_RDY__SPI_RDY,
|
||||
MX31_PIN_CSPI1_SS2__SS2, /* CS for LCD */
|
||||
IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_ALT1),
|
||||
IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_ALT1),
|
||||
/* SPI 1 */
|
||||
MX31_PIN_CSPI2_SCLK__SCLK,
|
||||
MX31_PIN_CSPI2_MOSI__MOSI,
|
||||
@ -689,6 +686,11 @@ static void __init mx31_3ds_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
imx31_soc_init();
|
||||
|
||||
/* Configure SPI1 IOMUX */
|
||||
mxc_iomux_set_gpr(MUX_PGP_CSPI_BB, true);
|
||||
|
||||
mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins),
|
||||
"mx31_3ds");
|
||||
|
||||
|
@ -516,6 +516,8 @@ static void __init mx31ads_init_irq(void)
|
||||
|
||||
static void __init mx31ads_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_init_extuart();
|
||||
mxc_init_imx_uart();
|
||||
mxc_init_i2c();
|
||||
|
@ -243,6 +243,8 @@ core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444);
|
||||
|
||||
static void __init mx31lilly_board_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
switch (mx31lilly_baseboard) {
|
||||
case MX31LILLY_NOBOARD:
|
||||
break;
|
||||
|
@ -230,6 +230,8 @@ static void __init mx31lite_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
imx31_soc_init();
|
||||
|
||||
switch (mx31lite_baseboard) {
|
||||
case MX31LITE_NOBOARD:
|
||||
break;
|
||||
|
@ -425,7 +425,7 @@ static int __init moboard_usbh2_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct gpio_led mx31moboard_leds[] = {
|
||||
static const struct gpio_led mx31moboard_leds[] __initconst = {
|
||||
{
|
||||
.name = "coreboard-led-0:red:running",
|
||||
.default_trigger = "heartbeat",
|
||||
@ -442,26 +442,17 @@ static struct gpio_led mx31moboard_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data mx31moboard_led_pdata = {
|
||||
static const struct gpio_led_platform_data mx31moboard_led_pdata __initconst = {
|
||||
.num_leds = ARRAY_SIZE(mx31moboard_leds),
|
||||
.leds = mx31moboard_leds,
|
||||
};
|
||||
|
||||
static struct platform_device mx31moboard_leds_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &mx31moboard_led_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct ipu_platform_data mx3_ipu_data __initconst = {
|
||||
.irq_base = MXC_IPU_IRQ_START,
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&mx31moboard_flash,
|
||||
&mx31moboard_leds_device,
|
||||
};
|
||||
|
||||
static struct mx3_camera_pdata camera_pdata __initdata = {
|
||||
@ -507,10 +498,13 @@ core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444);
|
||||
*/
|
||||
static void __init mx31moboard_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins),
|
||||
"moboard");
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
gpio_led_register_device(-1, &mx31moboard_led_pdata);
|
||||
|
||||
imx31_add_imx_uart0(&uart0_pdata);
|
||||
imx31_add_imx_uart4(&uart4_pdata);
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
#include "devices-imx35.h"
|
||||
|
||||
#define EXPIO_PARENT_INT (MXC_INTERNAL_IRQS + GPIO_PORTA + 1)
|
||||
#define EXPIO_PARENT_INT gpio_to_irq(IMX_GPIO_NR(1, 1))
|
||||
|
||||
static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
@ -179,6 +179,8 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = {
|
||||
*/
|
||||
static void __init mx35_3ds_init(void)
|
||||
{
|
||||
imx35_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));
|
||||
|
||||
imx35_add_fec(NULL);
|
||||
|
@ -233,6 +233,8 @@ static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
|
||||
static void __init mxt_td60_board_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mxt_td60_pins, ARRAY_SIZE(mxt_td60_pins),
|
||||
"MXT_TD60");
|
||||
|
||||
|
@ -357,6 +357,8 @@ static void __init pca100_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
imx27_soc_init();
|
||||
|
||||
/* SSI unit */
|
||||
mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0,
|
||||
MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
|
||||
|
@ -576,6 +576,8 @@ static void __init pcm037_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_iomux_set_gpr(MUX_PGP_UH2, 1);
|
||||
|
||||
mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins),
|
||||
|
@ -295,6 +295,8 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
|
||||
|
||||
static void __init pcm038_init(void)
|
||||
{
|
||||
imx27_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
|
||||
"PCM038");
|
||||
|
||||
|
@ -356,6 +356,8 @@ static struct esdhc_platform_data sd1_pdata = {
|
||||
*/
|
||||
static void __init pcm043_init(void)
|
||||
{
|
||||
imx35_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads));
|
||||
|
||||
mxc_audmux_v2_configure_port(3,
|
||||
|
@ -244,6 +244,8 @@ static void __init qong_init_fpga(void)
|
||||
*/
|
||||
static void __init qong_init(void)
|
||||
{
|
||||
imx31_soc_init();
|
||||
|
||||
mxc_init_imx_uart();
|
||||
qong_init_nor_mtd();
|
||||
qong_init_fpga();
|
||||
|
@ -101,21 +101,7 @@ static const int mxc_uart1_pins[] = {
|
||||
PC12_PF_UART1_RXD,
|
||||
};
|
||||
|
||||
static int uart1_mxc_init(struct platform_device *pdev)
|
||||
{
|
||||
return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
|
||||
ARRAY_SIZE(mxc_uart1_pins), "UART1");
|
||||
}
|
||||
|
||||
static void uart1_mxc_exit(struct platform_device *pdev)
|
||||
{
|
||||
mxc_gpio_release_multiple_pins(mxc_uart1_pins,
|
||||
ARRAY_SIZE(mxc_uart1_pins));
|
||||
}
|
||||
|
||||
static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
.init = uart1_mxc_init,
|
||||
.exit = uart1_mxc_exit,
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
@ -129,6 +115,11 @@ static struct platform_device *devices[] __initdata = {
|
||||
*/
|
||||
static void __init scb9328_init(void)
|
||||
{
|
||||
imx1_soc_init();
|
||||
|
||||
mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
|
||||
ARRAY_SIZE(mxc_uart1_pins), "UART1");
|
||||
|
||||
imx1_add_imx_uart0(&uart_pdata);
|
||||
|
||||
printk(KERN_INFO"Scb9328: Adding devices\n");
|
||||
|
@ -267,6 +267,8 @@ static struct platform_device *devices[] __initdata = {
|
||||
*/
|
||||
static void __init vpr200_board_init(void)
|
||||
{
|
||||
imx35_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));
|
||||
|
||||
imx35_add_fec(NULL);
|
||||
|
@ -23,7 +23,6 @@
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/iomux-v1.h>
|
||||
|
||||
@ -44,15 +43,19 @@ void __init imx1_init_early(void)
|
||||
MX1_NUM_GPIO_PORT);
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx1_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX1, 0, 1, MX1_GPIO_INT_PORTA),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX1, 1, 2, MX1_GPIO_INT_PORTB),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX1, 2, 3, MX1_GPIO_INT_PORTC),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX1, 3, 4, MX1_GPIO_INT_PORTD),
|
||||
};
|
||||
|
||||
void __init mx1_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX1_IO_ADDRESS(MX1_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx1_gpio_ports, ARRAY_SIZE(imx1_gpio_ports));
|
||||
}
|
||||
|
||||
void __init imx1_soc_init(void)
|
||||
{
|
||||
mxc_register_gpio(0, MX1_GPIO1_BASE_ADDR, SZ_256,
|
||||
MX1_GPIO_INT_PORTA, 0);
|
||||
mxc_register_gpio(1, MX1_GPIO2_BASE_ADDR, SZ_256,
|
||||
MX1_GPIO_INT_PORTB, 0);
|
||||
mxc_register_gpio(2, MX1_GPIO3_BASE_ADDR, SZ_256,
|
||||
MX1_GPIO_INT_PORTC, 0);
|
||||
mxc_register_gpio(3, MX1_GPIO4_BASE_ADDR, SZ_256,
|
||||
MX1_GPIO_INT_PORTD, 0);
|
||||
}
|
||||
|
@ -22,9 +22,9 @@
|
||||
#include <linux/init.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/devices-common.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/iomux-v1.h>
|
||||
|
||||
@ -70,17 +70,19 @@ void __init imx21_init_early(void)
|
||||
MX21_NUM_GPIO_PORT);
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx21_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX21, 0, 1, MX21_INT_GPIO),
|
||||
DEFINE_IMX_GPIO_PORT(MX21, 1, 2),
|
||||
DEFINE_IMX_GPIO_PORT(MX21, 2, 3),
|
||||
DEFINE_IMX_GPIO_PORT(MX21, 3, 4),
|
||||
DEFINE_IMX_GPIO_PORT(MX21, 4, 5),
|
||||
DEFINE_IMX_GPIO_PORT(MX21, 5, 6),
|
||||
};
|
||||
|
||||
void __init mx21_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX21_IO_ADDRESS(MX21_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx21_gpio_ports, ARRAY_SIZE(imx21_gpio_ports));
|
||||
}
|
||||
|
||||
void __init imx21_soc_init(void)
|
||||
{
|
||||
mxc_register_gpio(0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
mxc_register_gpio(1, MX21_GPIO2_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
mxc_register_gpio(2, MX21_GPIO3_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
mxc_register_gpio(3, MX21_GPIO4_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
mxc_register_gpio(4, MX21_GPIO5_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
mxc_register_gpio(5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||
|
||||
imx_add_imx_dma();
|
||||
}
|
||||
|
@ -24,10 +24,10 @@
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/devices-common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/mx25.h>
|
||||
#include <mach/iomux-v3.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
/*
|
||||
@ -57,16 +57,39 @@ void __init imx25_init_early(void)
|
||||
mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR));
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx25_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX25, 0, 1, MX25_INT_GPIO1),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX25, 1, 2, MX25_INT_GPIO2),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX25, 2, 3, MX25_INT_GPIO3),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX25, 3, 4, MX25_INT_GPIO4),
|
||||
};
|
||||
|
||||
void __init mx25_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx25_gpio_ports, ARRAY_SIZE(imx25_gpio_ports));
|
||||
}
|
||||
|
||||
static struct sdma_script_start_addrs imx25_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 729,
|
||||
.uart_2_mcu_addr = 904,
|
||||
.per_2_app_addr = 1255,
|
||||
.mcu_2_app_addr = 834,
|
||||
.uartsh_2_mcu_addr = 1120,
|
||||
.per_2_shp_addr = 1329,
|
||||
.mcu_2_shp_addr = 1048,
|
||||
.ata_2_mcu_addr = 1560,
|
||||
.mcu_2_ata_addr = 1479,
|
||||
.app_2_per_addr = 1189,
|
||||
.app_2_mcu_addr = 770,
|
||||
.shp_2_per_addr = 1407,
|
||||
.shp_2_mcu_addr = 979,
|
||||
};
|
||||
|
||||
static struct sdma_platform_data imx25_sdma_pdata __initdata = {
|
||||
.sdma_version = 2,
|
||||
.fw_name = "sdma-imx25.bin",
|
||||
.script_addrs = &imx25_sdma_script,
|
||||
};
|
||||
|
||||
void __init imx25_soc_init(void)
|
||||
{
|
||||
mxc_register_gpio(0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0);
|
||||
mxc_register_gpio(1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0);
|
||||
mxc_register_gpio(2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0);
|
||||
mxc_register_gpio(3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0);
|
||||
|
||||
imx_add_imx_sdma(MX25_SDMA_BASE_ADDR, MX25_INT_SDMA, &imx25_sdma_pdata);
|
||||
}
|
||||
|
@ -22,9 +22,9 @@
|
||||
#include <linux/init.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/devices-common.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/iomux-v1.h>
|
||||
|
||||
@ -70,17 +70,19 @@ void __init imx27_init_early(void)
|
||||
MX27_NUM_GPIO_PORT);
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx27_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX27, 0, 1, MX27_INT_GPIO),
|
||||
DEFINE_IMX_GPIO_PORT(MX27, 1, 2),
|
||||
DEFINE_IMX_GPIO_PORT(MX27, 2, 3),
|
||||
DEFINE_IMX_GPIO_PORT(MX27, 3, 4),
|
||||
DEFINE_IMX_GPIO_PORT(MX27, 4, 5),
|
||||
DEFINE_IMX_GPIO_PORT(MX27, 5, 6),
|
||||
};
|
||||
|
||||
void __init mx27_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX27_IO_ADDRESS(MX27_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx27_gpio_ports, ARRAY_SIZE(imx27_gpio_ports));
|
||||
}
|
||||
|
||||
void __init imx27_soc_init(void)
|
||||
{
|
||||
mxc_register_gpio(0, MX27_GPIO1_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
mxc_register_gpio(1, MX27_GPIO2_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
mxc_register_gpio(2, MX27_GPIO3_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
mxc_register_gpio(3, MX27_GPIO4_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
mxc_register_gpio(4, MX27_GPIO5_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
mxc_register_gpio(5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||
|
||||
imx_add_imx_dma();
|
||||
}
|
||||
|
@ -24,9 +24,9 @@
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/devices-common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-v3.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
static struct map_desc mx31_io_desc[] __initdata = {
|
||||
@ -53,14 +53,40 @@ void __init imx31_init_early(void)
|
||||
mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx31_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX31, 0, 1, MX31_INT_GPIO1),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX31, 1, 2, MX31_INT_GPIO2),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX31, 2, 3, MX31_INT_GPIO3),
|
||||
};
|
||||
|
||||
void __init mx31_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx31_gpio_ports, ARRAY_SIZE(imx31_gpio_ports));
|
||||
}
|
||||
|
||||
static struct sdma_script_start_addrs imx31_to1_sdma_script __initdata = {
|
||||
.per_2_per_addr = 1677,
|
||||
};
|
||||
|
||||
static struct sdma_script_start_addrs imx31_to2_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 423,
|
||||
.ap_2_bp_addr = 829,
|
||||
.bp_2_ap_addr = 1029,
|
||||
};
|
||||
|
||||
static struct sdma_platform_data imx31_sdma_pdata __initdata = {
|
||||
.sdma_version = 1,
|
||||
.fw_name = "sdma-imx31-to2.bin",
|
||||
.script_addrs = &imx31_to2_sdma_script,
|
||||
};
|
||||
|
||||
void __init imx31_soc_init(void)
|
||||
{
|
||||
int to_version = mx31_revision() >> 4;
|
||||
|
||||
mxc_register_gpio(0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0);
|
||||
mxc_register_gpio(1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0);
|
||||
mxc_register_gpio(2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0);
|
||||
|
||||
if (to_version == 1) {
|
||||
strncpy(imx31_sdma_pdata.fw_name, "sdma-imx31-to1.bin",
|
||||
strlen(imx31_sdma_pdata.fw_name));
|
||||
imx31_sdma_pdata.script_addrs = &imx31_to1_sdma_script;
|
||||
}
|
||||
|
||||
imx_add_imx_sdma(MX31_SDMA_BASE_ADDR, MX31_INT_SDMA, &imx31_sdma_pdata);
|
||||
}
|
||||
|
@ -25,9 +25,9 @@
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/devices-common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-v3.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
static struct map_desc mx35_io_desc[] __initdata = {
|
||||
@ -50,14 +50,60 @@ void __init imx35_init_early(void)
|
||||
mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
|
||||
}
|
||||
|
||||
static struct mxc_gpio_port imx35_gpio_ports[] = {
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX35, 0, 1, MX35_INT_GPIO1),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX35, 1, 2, MX35_INT_GPIO2),
|
||||
DEFINE_IMX_GPIO_PORT_IRQ(MX35, 2, 3, MX35_INT_GPIO3),
|
||||
};
|
||||
|
||||
void __init mx35_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
|
||||
mxc_gpio_init(imx35_gpio_ports, ARRAY_SIZE(imx35_gpio_ports));
|
||||
}
|
||||
|
||||
static struct sdma_script_start_addrs imx35_to1_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 642,
|
||||
.uart_2_mcu_addr = 817,
|
||||
.mcu_2_app_addr = 747,
|
||||
.uartsh_2_mcu_addr = 1183,
|
||||
.per_2_shp_addr = 1033,
|
||||
.mcu_2_shp_addr = 961,
|
||||
.ata_2_mcu_addr = 1333,
|
||||
.mcu_2_ata_addr = 1252,
|
||||
.app_2_mcu_addr = 683,
|
||||
.shp_2_per_addr = 1111,
|
||||
.shp_2_mcu_addr = 892,
|
||||
};
|
||||
|
||||
static struct sdma_script_start_addrs imx35_to2_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 729,
|
||||
.uart_2_mcu_addr = 904,
|
||||
.per_2_app_addr = 1597,
|
||||
.mcu_2_app_addr = 834,
|
||||
.uartsh_2_mcu_addr = 1270,
|
||||
.per_2_shp_addr = 1120,
|
||||
.mcu_2_shp_addr = 1048,
|
||||
.ata_2_mcu_addr = 1429,
|
||||
.mcu_2_ata_addr = 1339,
|
||||
.app_2_per_addr = 1531,
|
||||
.app_2_mcu_addr = 770,
|
||||
.shp_2_per_addr = 1198,
|
||||
.shp_2_mcu_addr = 979,
|
||||
};
|
||||
|
||||
static struct sdma_platform_data imx35_sdma_pdata __initdata = {
|
||||
.sdma_version = 2,
|
||||
.fw_name = "sdma-imx35-to2.bin",
|
||||
.script_addrs = &imx35_to2_sdma_script,
|
||||
};
|
||||
|
||||
void __init imx35_soc_init(void)
|
||||
{
|
||||
int to_version = mx35_revision() >> 4;
|
||||
|
||||
mxc_register_gpio(0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
|
||||
mxc_register_gpio(1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0);
|
||||
mxc_register_gpio(2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0);
|
||||
|
||||
if (to_version == 1) {
|
||||
strncpy(imx35_sdma_pdata.fw_name, "sdma-imx35-to1.bin",
|
||||
strlen(imx35_sdma_pdata.fw_name));
|
||||
imx35_sdma_pdata.script_addrs = &imx35_to1_sdma_script;
|
||||
}
|
||||
|
||||
imx_add_imx_sdma(MX35_SDMA_BASE_ADDR, MX35_INT_SDMA, &imx35_sdma_pdata);
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ static const struct spi_imx_master spi0_pdata __initconst = {
|
||||
|
||||
/* GPIO LEDs */
|
||||
|
||||
static struct gpio_led litekit_leds[] = {
|
||||
static const struct gpio_led litekit_leds[] __initconst = {
|
||||
{
|
||||
.name = "GPIO0",
|
||||
.gpio = IOMUX_TO_GPIO(MX31_PIN_COMPARE),
|
||||
@ -176,19 +176,12 @@ static struct gpio_led litekit_leds[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data litekit_led_platform_data = {
|
||||
static const struct gpio_led_platform_data
|
||||
litekit_led_platform_data __initconst = {
|
||||
.leds = litekit_leds,
|
||||
.num_leds = ARRAY_SIZE(litekit_leds),
|
||||
};
|
||||
|
||||
static struct platform_device litekit_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &litekit_led_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
void __init mx31lite_db_init(void)
|
||||
{
|
||||
mxc_iomux_setup_multiple_pins(litekit_db_board_pins,
|
||||
@ -197,7 +190,7 @@ void __init mx31lite_db_init(void)
|
||||
imx31_add_imx_uart0(&uart_pdata);
|
||||
imx31_add_mxc_mmc(0, &mmc_pdata);
|
||||
imx31_add_spi_imx0(&spi0_pdata);
|
||||
platform_device_register(&litekit_led_device);
|
||||
gpio_led_register_device(-1, &litekit_led_platform_data);
|
||||
imx31_add_imx2_wdt(NULL);
|
||||
imx31_add_mxc_rtc(NULL);
|
||||
}
|
||||
|
@ -1077,7 +1077,7 @@ static struct clk_lookup lookups[] = {
|
||||
_REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand)
|
||||
_REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0)
|
||||
_REGISTER_CLOCK("tbd", "i2s1_ck", clk_i2s1)
|
||||
_REGISTER_CLOCK("lpc32xx-ts", NULL, clk_tsc)
|
||||
_REGISTER_CLOCK("ts-lpc32xx", NULL, clk_tsc)
|
||||
_REGISTER_CLOCK("dev:mmc0", "MCLK", clk_mmc)
|
||||
_REGISTER_CLOCK("lpc-net.0", NULL, clk_net)
|
||||
_REGISTER_CLOCK("dev:clcd", NULL, clk_lcd)
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -28,6 +28,8 @@ extern struct platform_device lpc32xx_watchdog_device;
|
||||
extern struct platform_device lpc32xx_i2c0_device;
|
||||
extern struct platform_device lpc32xx_i2c1_device;
|
||||
extern struct platform_device lpc32xx_i2c2_device;
|
||||
extern struct platform_device lpc32xx_tsc_device;
|
||||
extern struct platform_device lpc32xx_rtc_device;
|
||||
|
||||
/*
|
||||
* Other arch specific structures and functions
|
||||
|
@ -77,6 +77,13 @@ config MACH_TETON_BGA
|
||||
Say 'Y' here if you want to support the Marvell PXA168-based
|
||||
Teton BGA Development Board.
|
||||
|
||||
config MACH_SHEEVAD
|
||||
bool "Marvell's PXA168 GuruPlug Display (gplugD) Board"
|
||||
select CPU_PXA168
|
||||
help
|
||||
Say 'Y' here if you want to support the Marvell PXA168-based
|
||||
GuruPlug Display (gplugD) Board
|
||||
|
||||
endmenu
|
||||
|
||||
config CPU_PXA168
|
||||
|
@ -19,3 +19,4 @@ obj-$(CONFIG_MACH_BROWNSTONE) += brownstone.o
|
||||
obj-$(CONFIG_MACH_FLINT) += flint.o
|
||||
obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o
|
||||
obj-$(CONFIG_MACH_TETON_BGA) += teton_bga.o
|
||||
obj-$(CONFIG_MACH_SHEEVAD) += gplugd.o
|
||||
|
@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk)
|
||||
return rate;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_get_rate);
|
||||
|
||||
int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (clk->ops->setrate) {
|
||||
spin_lock_irqsave(&clocks_lock, flags);
|
||||
ret = clk->ops->setrate(clk, rate);
|
||||
spin_unlock_irqrestore(&clocks_lock, flags);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_set_rate);
|
||||
|
@ -12,6 +12,7 @@ struct clkops {
|
||||
void (*enable)(struct clk *);
|
||||
void (*disable)(struct clk *);
|
||||
unsigned long (*getrate)(struct clk *);
|
||||
int (*setrate)(struct clk *, unsigned long);
|
||||
};
|
||||
|
||||
struct clk {
|
||||
|
189
arch/arm/mach-mmp/gplugd.c
Normal file
189
arch/arm/mach-mmp/gplugd.c
Normal file
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-mmp/gplugd.c
|
||||
*
|
||||
* Support for the Marvell PXA168-based GuruPlug Display (gplugD) Platform.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* publishhed by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/pxa168.h>
|
||||
#include <mach/mfp-pxa168.h>
|
||||
#include <mach/mfp-gplugd.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
static unsigned long gplugd_pin_config[] __initdata = {
|
||||
/* UART3 */
|
||||
GPIO8_UART3_SOUT,
|
||||
GPIO9_UART3_SIN,
|
||||
GPI1O_UART3_CTS,
|
||||
GPI11_UART3_RTS,
|
||||
|
||||
/* MMC2 */
|
||||
GPIO28_MMC2_CMD,
|
||||
GPIO29_MMC2_CLK,
|
||||
GPIO30_MMC2_DAT0,
|
||||
GPIO31_MMC2_DAT1,
|
||||
GPIO32_MMC2_DAT2,
|
||||
GPIO33_MMC2_DAT3,
|
||||
|
||||
/* LCD & HDMI clock selection GPIO: 0: 74.176MHz, 1: 74.25 MHz */
|
||||
GPIO35_GPIO,
|
||||
GPIO36_GPIO, /* CEC Interrupt */
|
||||
|
||||
/* MMC1 */
|
||||
GPIO43_MMC1_CLK,
|
||||
GPIO49_MMC1_CMD,
|
||||
GPIO41_MMC1_DAT0,
|
||||
GPIO40_MMC1_DAT1,
|
||||
GPIO52_MMC1_DAT2,
|
||||
GPIO51_MMC1_DAT3,
|
||||
GPIO53_MMC1_CD,
|
||||
|
||||
/* LCD */
|
||||
GPIO56_LCD_FCLK_RD,
|
||||
GPIO57_LCD_LCLK_A0,
|
||||
GPIO58_LCD_PCLK_WR,
|
||||
GPIO59_LCD_DENA_BIAS,
|
||||
GPIO60_LCD_DD0,
|
||||
GPIO61_LCD_DD1,
|
||||
GPIO62_LCD_DD2,
|
||||
GPIO63_LCD_DD3,
|
||||
GPIO64_LCD_DD4,
|
||||
GPIO65_LCD_DD5,
|
||||
GPIO66_LCD_DD6,
|
||||
GPIO67_LCD_DD7,
|
||||
GPIO68_LCD_DD8,
|
||||
GPIO69_LCD_DD9,
|
||||
GPIO70_LCD_DD10,
|
||||
GPIO71_LCD_DD11,
|
||||
GPIO72_LCD_DD12,
|
||||
GPIO73_LCD_DD13,
|
||||
GPIO74_LCD_DD14,
|
||||
GPIO75_LCD_DD15,
|
||||
GPIO76_LCD_DD16,
|
||||
GPIO77_LCD_DD17,
|
||||
GPIO78_LCD_DD18,
|
||||
GPIO79_LCD_DD19,
|
||||
GPIO80_LCD_DD20,
|
||||
GPIO81_LCD_DD21,
|
||||
GPIO82_LCD_DD22,
|
||||
GPIO83_LCD_DD23,
|
||||
|
||||
/* GPIO */
|
||||
GPIO84_GPIO,
|
||||
GPIO85_GPIO,
|
||||
|
||||
/* Fast-Ethernet*/
|
||||
GPIO86_TX_CLK,
|
||||
GPIO87_TX_EN,
|
||||
GPIO88_TX_DQ3,
|
||||
GPIO89_TX_DQ2,
|
||||
GPIO90_TX_DQ1,
|
||||
GPIO91_TX_DQ0,
|
||||
GPIO92_MII_CRS,
|
||||
GPIO93_MII_COL,
|
||||
GPIO94_RX_CLK,
|
||||
GPIO95_RX_ER,
|
||||
GPIO96_RX_DQ3,
|
||||
GPIO97_RX_DQ2,
|
||||
GPIO98_RX_DQ1,
|
||||
GPIO99_RX_DQ0,
|
||||
GPIO100_MII_MDC,
|
||||
GPIO101_MII_MDIO,
|
||||
GPIO103_RX_DV,
|
||||
GPIO104_GPIO, /* Reset PHY */
|
||||
|
||||
/* RTC interrupt */
|
||||
GPIO102_GPIO,
|
||||
|
||||
/* I2C */
|
||||
GPIO105_CI2C_SDA,
|
||||
GPIO106_CI2C_SCL,
|
||||
|
||||
/* Select JTAG */
|
||||
GPIO109_GPIO,
|
||||
|
||||
/* I2S */
|
||||
GPIO114_I2S_FRM,
|
||||
GPIO115_I2S_BCLK,
|
||||
GPIO116_I2S_TXD
|
||||
};
|
||||
|
||||
static struct i2c_board_info gplugd_i2c_board_info[] = {
|
||||
{
|
||||
.type = "isl1208",
|
||||
.addr = 0x6F,
|
||||
}
|
||||
};
|
||||
|
||||
/* Bring PHY out of reset by setting GPIO 104 */
|
||||
static int gplugd_eth_init(void)
|
||||
{
|
||||
if (unlikely(gpio_request(104, "ETH_RESET_N"))) {
|
||||
printk(KERN_ERR "Can't get hold of GPIO 104 to bring Ethernet "
|
||||
"PHY out of reset\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
gpio_direction_output(104, 1);
|
||||
gpio_free(104);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct pxa168_eth_platform_data gplugd_eth_platform_data = {
|
||||
.port_number = 0,
|
||||
.phy_addr = 0,
|
||||
.speed = 0, /* Autonagotiation */
|
||||
.init = gplugd_eth_init,
|
||||
};
|
||||
|
||||
static void __init select_disp_freq(void)
|
||||
{
|
||||
/* set GPIO 35 & clear GPIO 85 to set LCD External Clock to 74.25 MHz */
|
||||
if (unlikely(gpio_request(35, "DISP_FREQ_SEL"))) {
|
||||
printk(KERN_ERR "Can't get hold of GPIO 35 to select display "
|
||||
"frequency\n");
|
||||
} else {
|
||||
gpio_direction_output(35, 1);
|
||||
gpio_free(104);
|
||||
}
|
||||
|
||||
if (unlikely(gpio_request(85, "DISP_FREQ_SEL_2"))) {
|
||||
printk(KERN_ERR "Can't get hold of GPIO 85 to select display "
|
||||
"frequency\n");
|
||||
} else {
|
||||
gpio_direction_output(85, 0);
|
||||
gpio_free(104);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init gplugd_init(void)
|
||||
{
|
||||
mfp_config(ARRAY_AND_SIZE(gplugd_pin_config));
|
||||
|
||||
select_disp_freq();
|
||||
|
||||
/* on-chip devices */
|
||||
pxa168_add_uart(3);
|
||||
pxa168_add_ssp(0);
|
||||
pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(gplugd_i2c_board_info));
|
||||
|
||||
pxa168_add_eth(&gplugd_eth_platform_data);
|
||||
}
|
||||
|
||||
MACHINE_START(SHEEVAD, "PXA168-based GuruPlug Display (gplugD) Platform")
|
||||
.map_io = mmp_map_io,
|
||||
.nr_irqs = IRQ_BOARD_START,
|
||||
.init_irq = pxa168_init_irq,
|
||||
.timer = &pxa168_timer,
|
||||
.init_machine = gplugd_init,
|
||||
MACHINE_END
|
52
arch/arm/mach-mmp/include/mach/mfp-gplugd.h
Normal file
52
arch/arm/mach-mmp/include/mach/mfp-gplugd.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-mmp/include/mach/mfp-gplugd.h
|
||||
*
|
||||
* MFP definitions used in gplugD
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_MFP_GPLUGD_H
|
||||
#define __MACH_MFP_GPLUGD_H
|
||||
|
||||
#include <plat/mfp.h>
|
||||
#include <mach/mfp.h>
|
||||
|
||||
/* UART3 */
|
||||
#define GPIO8_UART3_SOUT MFP_CFG(GPIO8, AF2)
|
||||
#define GPIO9_UART3_SIN MFP_CFG(GPIO9, AF2)
|
||||
#define GPI1O_UART3_CTS MFP_CFG(GPIO10, AF2)
|
||||
#define GPI11_UART3_RTS MFP_CFG(GPIO11, AF2)
|
||||
|
||||
/* MMC2 */
|
||||
#define GPIO28_MMC2_CMD MFP_CFG_DRV(GPIO28, AF6, FAST)
|
||||
#define GPIO29_MMC2_CLK MFP_CFG_DRV(GPIO29, AF6, FAST)
|
||||
#define GPIO30_MMC2_DAT0 MFP_CFG_DRV(GPIO30, AF6, FAST)
|
||||
#define GPIO31_MMC2_DAT1 MFP_CFG_DRV(GPIO31, AF6, FAST)
|
||||
#define GPIO32_MMC2_DAT2 MFP_CFG_DRV(GPIO32, AF6, FAST)
|
||||
#define GPIO33_MMC2_DAT3 MFP_CFG_DRV(GPIO33, AF6, FAST)
|
||||
|
||||
/* I2S */
|
||||
#undef GPIO114_I2S_FRM
|
||||
#undef GPIO115_I2S_BCLK
|
||||
|
||||
#define GPIO114_I2S_FRM MFP_CFG_DRV(GPIO114, AF1, FAST)
|
||||
#define GPIO115_I2S_BCLK MFP_CFG_DRV(GPIO115, AF1, FAST)
|
||||
#define GPIO116_I2S_TXD MFP_CFG_DRV(GPIO116, AF1, FAST)
|
||||
|
||||
/* MMC4 */
|
||||
#define GPIO125_MMC4_DAT3 MFP_CFG_DRV(GPIO125, AF7, FAST)
|
||||
#define GPIO126_MMC4_DAT2 MFP_CFG_DRV(GPIO126, AF7, FAST)
|
||||
#define GPIO127_MMC4_DAT1 MFP_CFG_DRV(GPIO127, AF7, FAST)
|
||||
#define GPIO0_2_MMC4_DAT0 MFP_CFG_DRV(GPIO0_2, AF7, FAST)
|
||||
#define GPIO1_2_MMC4_CMD MFP_CFG_DRV(GPIO1_2, AF7, FAST)
|
||||
#define GPIO2_2_MMC4_CLK MFP_CFG_DRV(GPIO2_2, AF7, FAST)
|
||||
|
||||
/* OTG GPIO */
|
||||
#define GPIO_USB_OTG_PEN 18
|
||||
#define GPIO_USB_OIDIR 20
|
||||
|
||||
/* Other GPIOs are 35, 84, 85 */
|
||||
#endif /* __MACH_MFP_GPLUGD_H */
|
@ -305,4 +305,23 @@
|
||||
#define GPIO112_KP_MKOUT6 MFP_CFG(GPIO112, AF7)
|
||||
#define GPIO121_KP_MKIN4 MFP_CFG(GPIO121, AF7)
|
||||
|
||||
/* Fast Ethernet */
|
||||
#define GPIO86_TX_CLK MFP_CFG(GPIO86, AF5)
|
||||
#define GPIO87_TX_EN MFP_CFG(GPIO87, AF5)
|
||||
#define GPIO88_TX_DQ3 MFP_CFG(GPIO88, AF5)
|
||||
#define GPIO89_TX_DQ2 MFP_CFG(GPIO89, AF5)
|
||||
#define GPIO90_TX_DQ1 MFP_CFG(GPIO90, AF5)
|
||||
#define GPIO91_TX_DQ0 MFP_CFG(GPIO91, AF5)
|
||||
#define GPIO92_MII_CRS MFP_CFG(GPIO92, AF5)
|
||||
#define GPIO93_MII_COL MFP_CFG(GPIO93, AF5)
|
||||
#define GPIO94_RX_CLK MFP_CFG(GPIO94, AF5)
|
||||
#define GPIO95_RX_ER MFP_CFG(GPIO95, AF5)
|
||||
#define GPIO96_RX_DQ3 MFP_CFG(GPIO96, AF5)
|
||||
#define GPIO97_RX_DQ2 MFP_CFG(GPIO97, AF5)
|
||||
#define GPIO98_RX_DQ1 MFP_CFG(GPIO98, AF5)
|
||||
#define GPIO99_RX_DQ0 MFP_CFG(GPIO99, AF5)
|
||||
#define GPIO100_MII_MDC MFP_CFG(GPIO100, AF5)
|
||||
#define GPIO101_MII_MDIO MFP_CFG(GPIO101, AF5)
|
||||
#define GPIO103_RX_DV MFP_CFG(GPIO103, AF5)
|
||||
|
||||
#endif /* __ASM_MACH_MFP_PXA168_H */
|
||||
|
@ -14,9 +14,11 @@ extern void pxa168_clear_keypad_wakeup(void);
|
||||
#include <video/pxa168fb.h>
|
||||
#include <plat/pxa27x_keypad.h>
|
||||
#include <mach/cputype.h>
|
||||
#include <linux/pxa168_eth.h>
|
||||
|
||||
extern struct pxa_device_desc pxa168_device_uart1;
|
||||
extern struct pxa_device_desc pxa168_device_uart2;
|
||||
extern struct pxa_device_desc pxa168_device_uart3;
|
||||
extern struct pxa_device_desc pxa168_device_twsi0;
|
||||
extern struct pxa_device_desc pxa168_device_twsi1;
|
||||
extern struct pxa_device_desc pxa168_device_pwm1;
|
||||
@ -31,6 +33,7 @@ extern struct pxa_device_desc pxa168_device_ssp5;
|
||||
extern struct pxa_device_desc pxa168_device_nand;
|
||||
extern struct pxa_device_desc pxa168_device_fb;
|
||||
extern struct pxa_device_desc pxa168_device_keypad;
|
||||
extern struct pxa_device_desc pxa168_device_eth;
|
||||
|
||||
static inline int pxa168_add_uart(int id)
|
||||
{
|
||||
@ -39,6 +42,7 @@ static inline int pxa168_add_uart(int id)
|
||||
switch (id) {
|
||||
case 1: d = &pxa168_device_uart1; break;
|
||||
case 2: d = &pxa168_device_uart2; break;
|
||||
case 3: d = &pxa168_device_uart3; break;
|
||||
}
|
||||
|
||||
if (d == NULL)
|
||||
@ -117,4 +121,8 @@ static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
|
||||
return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
|
||||
}
|
||||
|
||||
static inline int pxa168_add_eth(struct pxa168_eth_platform_data *data)
|
||||
{
|
||||
return pxa_register_device(&pxa168_device_eth, data, sizeof(*data));
|
||||
}
|
||||
#endif /* __ASM_MACH_PXA168_H */
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define APMU_BUS APMU_REG(0x06c)
|
||||
#define APMU_SDH2 APMU_REG(0x0e8)
|
||||
#define APMU_SDH3 APMU_REG(0x0ec)
|
||||
#define APMU_ETH APMU_REG(0x0fc)
|
||||
|
||||
#define APMU_FNCLK_EN (1 << 4)
|
||||
#define APMU_AXICLK_EN (1 << 3)
|
||||
|
@ -66,6 +66,7 @@ void __init pxa168_init_irq(void)
|
||||
/* APB peripheral clocks */
|
||||
static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);
|
||||
static APBC_CLK(uart2, PXA168_UART2, 1, 14745600);
|
||||
static APBC_CLK(uart3, PXA168_UART3, 1, 14745600);
|
||||
static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);
|
||||
static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
|
||||
static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);
|
||||
@ -81,11 +82,13 @@ static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
|
||||
|
||||
static APMU_CLK(nand, NAND, 0x01db, 208000000);
|
||||
static APMU_CLK(lcd, LCD, 0x7f, 312000000);
|
||||
static APMU_CLK(eth, ETH, 0x09, 0);
|
||||
|
||||
/* device and clock bindings */
|
||||
static struct clk_lookup pxa168_clkregs[] = {
|
||||
INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
|
||||
INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
|
||||
INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
|
||||
INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
|
||||
INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
|
||||
INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
|
||||
@ -100,6 +103,7 @@ static struct clk_lookup pxa168_clkregs[] = {
|
||||
INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
|
||||
INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
|
||||
INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
|
||||
INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
|
||||
};
|
||||
|
||||
static int __init pxa168_init(void)
|
||||
@ -149,6 +153,7 @@ void pxa168_clear_keypad_wakeup(void)
|
||||
/* on-chip devices */
|
||||
PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
|
||||
PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24);
|
||||
PXA168_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4026000, 0x30, 23, 24);
|
||||
PXA168_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
|
||||
PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
|
||||
PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10);
|
||||
@ -163,3 +168,4 @@ PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
|
||||
PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
|
||||
PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
|
||||
PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
|
||||
PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff);
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/onenand.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/i2c/pca953x.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -25,7 +27,17 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define TTCDKB_NR_IRQS (IRQ_BOARD_START + 24)
|
||||
#define TTCDKB_GPIO_EXT0(x) (NR_BUILTIN_GPIO + ((x < 0) ? 0 : \
|
||||
((x < 16) ? x : 15)))
|
||||
#define TTCDKB_GPIO_EXT1(x) (NR_BUILTIN_GPIO + 16 + ((x < 0) ? 0 : \
|
||||
((x < 16) ? x : 15)))
|
||||
|
||||
/*
|
||||
* 16 board interrupts -- MAX7312 GPIO expander
|
||||
* 16 board interrupts -- PCA9575 GPIO expander
|
||||
* 24 board interrupts -- 88PM860x PMIC
|
||||
*/
|
||||
#define TTCDKB_NR_IRQS (IRQ_BOARD_START + 16 + 16 + 24)
|
||||
|
||||
static unsigned long ttc_dkb_pin_config[] __initdata = {
|
||||
/* UART2 */
|
||||
@ -113,6 +125,22 @@ static struct platform_device *ttc_dkb_devices[] = {
|
||||
&ttc_dkb_device_onenand,
|
||||
};
|
||||
|
||||
static struct pca953x_platform_data max7312_data[] = {
|
||||
{
|
||||
.gpio_base = TTCDKB_GPIO_EXT0(0),
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info ttc_dkb_i2c_info[] = {
|
||||
{
|
||||
.type = "max7312",
|
||||
.addr = 0x23,
|
||||
.irq = IRQ_GPIO(80),
|
||||
.platform_data = &max7312_data,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init ttc_dkb_init(void)
|
||||
{
|
||||
mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
|
||||
@ -121,6 +149,7 @@ static void __init ttc_dkb_init(void)
|
||||
pxa910_add_uart(1);
|
||||
|
||||
/* off-chip devices */
|
||||
pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
|
||||
platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
|
||||
}
|
||||
|
||||
|
@ -109,6 +109,7 @@ config MACH_EUKREA_MBIMX51_BASEBOARD
|
||||
bool
|
||||
select IMX_HAVE_PLATFORM_IMX_KEYPAD
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
This adds board specific devices that can be found on Eukrea's
|
||||
MBIMX51 evaluation board.
|
||||
@ -135,6 +136,7 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD
|
||||
prompt "Eukrea MBIMXSD development board"
|
||||
bool
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
This adds board specific devices that can be found on Eukrea's
|
||||
MBIMXSD evaluation board.
|
||||
@ -151,6 +153,7 @@ config MX51_EFIKA_COMMON
|
||||
|
||||
config MACH_MX51_EFIKAMX
|
||||
bool "Support MX51 Genesi Efika MX nettop"
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MX51_EFIKA_COMMON
|
||||
help
|
||||
Include support for Genesi Efika MX nettop. This includes specific
|
||||
@ -158,6 +161,7 @@ config MACH_MX51_EFIKAMX
|
||||
|
||||
config MACH_MX51_EFIKASB
|
||||
bool "Support MX51 Genesi Efika Smartbook"
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MX51_EFIKA_COMMON
|
||||
help
|
||||
Include support for Genesi Efika Smartbook. This includes specific
|
||||
@ -176,6 +180,7 @@ config MACH_MX53_EVK
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for MX53 EVK platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
@ -199,10 +204,23 @@ config MACH_MX53_LOCO
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for MX53 LOCO platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_MX53_ARD
|
||||
bool "Support MX53 ARD platforms"
|
||||
select SOC_IMX53
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
help
|
||||
Include support for MX53 ARD platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
endif # ARCH_MX53_SUPPORTED
|
||||
|
||||
endif
|
||||
|
@ -6,12 +6,14 @@
|
||||
obj-y := cpu.o mm.o clock-mx51-mx53.o devices.o ehci.o system.o
|
||||
obj-$(CONFIG_SOC_IMX50) += mm-mx50.o
|
||||
|
||||
obj-$(CONFIG_PM) += pm-imx5.o
|
||||
obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o
|
||||
obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o
|
||||
obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o
|
||||
obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o
|
||||
obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o
|
||||
obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.o
|
||||
obj-$(CONFIG_MACH_MX53_ARD) += board-mx53_ard.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += board-cpuimx51.o
|
||||
obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o
|
||||
|
@ -43,10 +43,6 @@
|
||||
#define CPUIMX51_QUARTB_GPIO IMX_GPIO_NR(3, 25)
|
||||
#define CPUIMX51_QUARTC_GPIO IMX_GPIO_NR(3, 26)
|
||||
#define CPUIMX51_QUARTD_GPIO IMX_GPIO_NR(3, 27)
|
||||
#define CPUIMX51_QUARTA_IRQ (MXC_INTERNAL_IRQS + CPUIMX51_QUARTA_GPIO)
|
||||
#define CPUIMX51_QUARTB_IRQ (MXC_INTERNAL_IRQS + CPUIMX51_QUARTB_GPIO)
|
||||
#define CPUIMX51_QUARTC_IRQ (MXC_INTERNAL_IRQS + CPUIMX51_QUARTC_GPIO)
|
||||
#define CPUIMX51_QUARTD_IRQ (MXC_INTERNAL_IRQS + CPUIMX51_QUARTD_GPIO)
|
||||
#define CPUIMX51_QUART_XTAL 14745600
|
||||
#define CPUIMX51_QUART_REGSHIFT 17
|
||||
|
||||
@ -61,7 +57,7 @@
|
||||
static struct plat_serial8250_port serial_platform_data[] = {
|
||||
{
|
||||
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x400000),
|
||||
.irq = CPUIMX51_QUARTA_IRQ,
|
||||
.irq = gpio_to_irq(CPUIMX51_QUARTA_GPIO),
|
||||
.irqflags = IRQF_TRIGGER_HIGH,
|
||||
.uartclk = CPUIMX51_QUART_XTAL,
|
||||
.regshift = CPUIMX51_QUART_REGSHIFT,
|
||||
@ -69,7 +65,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
|
||||
}, {
|
||||
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x800000),
|
||||
.irq = CPUIMX51_QUARTB_IRQ,
|
||||
.irq = gpio_to_irq(CPUIMX51_QUARTB_GPIO),
|
||||
.irqflags = IRQF_TRIGGER_HIGH,
|
||||
.uartclk = CPUIMX51_QUART_XTAL,
|
||||
.regshift = CPUIMX51_QUART_REGSHIFT,
|
||||
@ -77,7 +73,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
|
||||
}, {
|
||||
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x1000000),
|
||||
.irq = CPUIMX51_QUARTC_IRQ,
|
||||
.irq = gpio_to_irq(CPUIMX51_QUARTC_GPIO),
|
||||
.irqflags = IRQF_TRIGGER_HIGH,
|
||||
.uartclk = CPUIMX51_QUART_XTAL,
|
||||
.regshift = CPUIMX51_QUART_REGSHIFT,
|
||||
@ -85,7 +81,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
|
||||
}, {
|
||||
.mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x2000000),
|
||||
.irq = CPUIMX51_QUARTD_IRQ,
|
||||
.irq = irq_to_gpio(CPUIMX51_QUARTD_GPIO),
|
||||
.irqflags = IRQF_TRIGGER_HIGH,
|
||||
.uartclk = CPUIMX51_QUART_XTAL,
|
||||
.regshift = CPUIMX51_QUART_REGSHIFT,
|
||||
@ -245,6 +241,8 @@ __setup("otg_mode=", eukrea_cpuimx51_otg_mode);
|
||||
*/
|
||||
static void __init eukrea_cpuimx51_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads,
|
||||
ARRAY_SIZE(eukrea_cpuimx51_pads));
|
||||
|
||||
|
@ -264,6 +264,8 @@ static struct platform_device *platform_devices[] __initdata = {
|
||||
|
||||
static void __init eukrea_cpuimx51sd_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads,
|
||||
ARRAY_SIZE(eukrea_cpuimx51sd_pads));
|
||||
|
||||
|
@ -192,6 +192,8 @@ static const struct imxi2c_platform_data i2c_data __initconst = {
|
||||
*/
|
||||
static void __init mx50_rdp_board_init(void)
|
||||
{
|
||||
imx50_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads,
|
||||
ARRAY_SIZE(mx50_rdp_pads));
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -26,7 +27,7 @@
|
||||
#include "devices-imx51.h"
|
||||
#include "devices.h"
|
||||
|
||||
#define EXPIO_PARENT_INT (MXC_INTERNAL_IRQS + GPIO_PORTA + 6)
|
||||
#define EXPIO_PARENT_INT gpio_to_irq(IMX_GPIO_NR(1, 6))
|
||||
#define MX51_3DS_ECSPI2_CS (GPIO_PORTC + 28)
|
||||
|
||||
static iomux_v3_cfg_t mx51_3ds_pads[] = {
|
||||
@ -135,6 +136,8 @@ static struct spi_board_info mx51_3ds_spi_nor_device[] = {
|
||||
*/
|
||||
static void __init mx51_3ds_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads,
|
||||
ARRAY_SIZE(mx51_3ds_pads));
|
||||
|
||||
|
@ -36,11 +36,15 @@
|
||||
|
||||
#define BABBAGE_USB_HUB_RESET IMX_GPIO_NR(1, 7)
|
||||
#define BABBAGE_USBH1_STP IMX_GPIO_NR(1, 27)
|
||||
#define BABBAGE_PHY_RESET IMX_GPIO_NR(2, 5)
|
||||
#define BABBAGE_USB_PHY_RESET IMX_GPIO_NR(2, 5)
|
||||
#define BABBAGE_FEC_PHY_RESET IMX_GPIO_NR(2, 14)
|
||||
#define BABBAGE_POWER_KEY IMX_GPIO_NR(2, 21)
|
||||
#define BABBAGE_ECSPI1_CS0 IMX_GPIO_NR(4, 24)
|
||||
#define BABBAGE_ECSPI1_CS1 IMX_GPIO_NR(4, 25)
|
||||
#define BABBAGE_SD1_CD IMX_GPIO_NR(1, 0)
|
||||
#define BABBAGE_SD1_WP IMX_GPIO_NR(1, 1)
|
||||
#define BABBAGE_SD2_CD IMX_GPIO_NR(1, 6)
|
||||
#define BABBAGE_SD2_WP IMX_GPIO_NR(1, 5)
|
||||
|
||||
/* USB_CTRL_1 */
|
||||
#define MX51_USB_CTRL_1_OFFSET 0x10
|
||||
@ -110,6 +114,9 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
|
||||
/* USB HUB reset line*/
|
||||
MX51_PAD_GPIO1_7__GPIO1_7,
|
||||
|
||||
/* USB PHY reset line */
|
||||
MX51_PAD_EIM_D21__GPIO2_5,
|
||||
|
||||
/* FEC */
|
||||
MX51_PAD_EIM_EB2__FEC_MDIO,
|
||||
MX51_PAD_EIM_EB3__FEC_RDATA1,
|
||||
@ -139,6 +146,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
|
||||
MX51_PAD_SD1_DATA1__SD1_DATA1,
|
||||
MX51_PAD_SD1_DATA2__SD1_DATA2,
|
||||
MX51_PAD_SD1_DATA3__SD1_DATA3,
|
||||
MX51_PAD_GPIO1_0__GPIO1_0,
|
||||
MX51_PAD_GPIO1_1__GPIO1_1,
|
||||
|
||||
/* SD 2 */
|
||||
MX51_PAD_SD2_CMD__SD2_CMD,
|
||||
@ -147,6 +156,8 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
|
||||
MX51_PAD_SD2_DATA1__SD2_DATA1,
|
||||
MX51_PAD_SD2_DATA2__SD2_DATA2,
|
||||
MX51_PAD_SD2_DATA3__SD2_DATA3,
|
||||
MX51_PAD_GPIO1_6__GPIO1_6,
|
||||
MX51_PAD_GPIO1_5__GPIO1_5,
|
||||
|
||||
/* eCSPI1 */
|
||||
MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
|
||||
@ -169,34 +180,31 @@ static struct imxi2c_platform_data babbage_hsi2c_data = {
|
||||
.bitrate = 400000,
|
||||
};
|
||||
|
||||
static struct gpio mx51_babbage_usbh1_gpios[] = {
|
||||
{ BABBAGE_USBH1_STP, GPIOF_OUT_INIT_LOW, "usbh1_stp" },
|
||||
{ BABBAGE_USB_PHY_RESET, GPIOF_OUT_INIT_LOW, "usbh1_phy_reset" },
|
||||
};
|
||||
|
||||
static int gpio_usbh1_active(void)
|
||||
{
|
||||
iomux_v3_cfg_t usbh1stp_gpio = MX51_PAD_USBH1_STP__GPIO1_27;
|
||||
iomux_v3_cfg_t phyreset_gpio = MX51_PAD_EIM_D21__GPIO2_5;
|
||||
int ret;
|
||||
|
||||
/* Set USBH1_STP to GPIO and toggle it */
|
||||
mxc_iomux_v3_setup_pad(usbh1stp_gpio);
|
||||
ret = gpio_request(BABBAGE_USBH1_STP, "usbh1_stp");
|
||||
ret = gpio_request_array(mx51_babbage_usbh1_gpios,
|
||||
ARRAY_SIZE(mx51_babbage_usbh1_gpios));
|
||||
|
||||
if (ret) {
|
||||
pr_debug("failed to get MX51_PAD_USBH1_STP__GPIO_1_27: %d\n", ret);
|
||||
pr_debug("failed to get USBH1 pins: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
gpio_direction_output(BABBAGE_USBH1_STP, 0);
|
||||
gpio_set_value(BABBAGE_USBH1_STP, 1);
|
||||
|
||||
msleep(100);
|
||||
gpio_free(BABBAGE_USBH1_STP);
|
||||
|
||||
/* De-assert USB PHY RESETB */
|
||||
mxc_iomux_v3_setup_pad(phyreset_gpio);
|
||||
ret = gpio_request(BABBAGE_PHY_RESET, "phy_reset");
|
||||
|
||||
if (ret) {
|
||||
pr_debug("failed to get MX51_PAD_EIM_D21__GPIO_2_5: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
gpio_direction_output(BABBAGE_PHY_RESET, 1);
|
||||
gpio_set_value(BABBAGE_USBH1_STP, 1);
|
||||
gpio_set_value(BABBAGE_USB_PHY_RESET, 1);
|
||||
gpio_free_array(mx51_babbage_usbh1_gpios,
|
||||
ARRAY_SIZE(mx51_babbage_usbh1_gpios));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -331,6 +339,16 @@ static const struct spi_imx_master mx51_babbage_spi_pdata __initconst = {
|
||||
.num_chipselect = ARRAY_SIZE(mx51_babbage_spi_cs),
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx51_babbage_sd1_data __initconst = {
|
||||
.cd_gpio = BABBAGE_SD1_CD,
|
||||
.wp_gpio = BABBAGE_SD1_WP,
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx51_babbage_sd2_data __initconst = {
|
||||
.cd_gpio = BABBAGE_SD2_CD,
|
||||
.wp_gpio = BABBAGE_SD2_WP,
|
||||
};
|
||||
|
||||
/*
|
||||
* Board specific initialization.
|
||||
*/
|
||||
@ -340,6 +358,8 @@ static void __init mx51_babbage_init(void)
|
||||
iomux_v3_cfg_t power_key = _MX51_PAD_EIM_A27__GPIO2_21 |
|
||||
MUX_PAD_CTRL(PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP);
|
||||
|
||||
imx51_soc_init();
|
||||
|
||||
#if defined(CONFIG_CPU_FREQ_IMX)
|
||||
get_cpu_op = mx51_get_cpu_op;
|
||||
#endif
|
||||
@ -374,8 +394,8 @@ static void __init mx51_babbage_init(void)
|
||||
mxc_iomux_v3_setup_pad(usbh1stp);
|
||||
babbage_usbhub_reset();
|
||||
|
||||
imx51_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(1, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(0, &mx51_babbage_sd1_data);
|
||||
imx51_add_sdhci_esdhc_imx(1, &mx51_babbage_sd2_data);
|
||||
|
||||
spi_register_board_info(mx51_babbage_spi_board_info,
|
||||
ARRAY_SIZE(mx51_babbage_spi_board_info));
|
||||
|
@ -139,7 +139,7 @@ static void __init mx51_efikamx_board_id(void)
|
||||
}
|
||||
}
|
||||
|
||||
static struct gpio_led mx51_efikamx_leds[] = {
|
||||
static struct gpio_led mx51_efikamx_leds[] __initdata = {
|
||||
{
|
||||
.name = "efikamx:green",
|
||||
.default_trigger = "default-on",
|
||||
@ -157,19 +157,12 @@ static struct gpio_led mx51_efikamx_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data mx51_efikamx_leds_data = {
|
||||
static const struct gpio_led_platform_data
|
||||
mx51_efikamx_leds_data __initconst = {
|
||||
.leds = mx51_efikamx_leds,
|
||||
.num_leds = ARRAY_SIZE(mx51_efikamx_leds),
|
||||
};
|
||||
|
||||
static struct platform_device mx51_efikamx_leds_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &mx51_efikamx_leds_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_button mx51_efikamx_powerkey[] = {
|
||||
{
|
||||
.code = KEY_POWER,
|
||||
@ -236,6 +229,8 @@ late_initcall(mx51_efikamx_power_init);
|
||||
|
||||
static void __init mx51_efikamx_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
|
||||
ARRAY_SIZE(mx51efikamx_pads));
|
||||
efika_board_common_init();
|
||||
@ -248,7 +243,7 @@ static void __init mx51_efikamx_init(void)
|
||||
mx51_efikamx_leds[2].default_trigger = "mmc1";
|
||||
}
|
||||
|
||||
platform_device_register(&mx51_efikamx_leds_device);
|
||||
gpio_led_register_device(-1, &mx51_efikamx_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
|
||||
|
||||
if (system_rev == 0x11) {
|
||||
|
@ -132,7 +132,7 @@ static void __init mx51_efikasb_usb(void)
|
||||
mxc_register_device(&mxc_usbh2_device, &usbh2_config);
|
||||
}
|
||||
|
||||
static struct gpio_led mx51_efikasb_leds[] = {
|
||||
static const struct gpio_led mx51_efikasb_leds[] __initconst = {
|
||||
{
|
||||
.name = "efikasb:green",
|
||||
.default_trigger = "default-on",
|
||||
@ -146,19 +146,12 @@ static struct gpio_led mx51_efikasb_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data mx51_efikasb_leds_data = {
|
||||
static const struct gpio_led_platform_data
|
||||
mx51_efikasb_leds_data __initconst = {
|
||||
.leds = mx51_efikasb_leds,
|
||||
.num_leds = ARRAY_SIZE(mx51_efikasb_leds),
|
||||
};
|
||||
|
||||
static struct platform_device mx51_efikasb_leds_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &mx51_efikasb_leds_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_button mx51_efikasb_keys[] = {
|
||||
{
|
||||
.code = KEY_POWER,
|
||||
@ -248,6 +241,8 @@ static void __init mx51_efikasb_board_id(void)
|
||||
|
||||
static void __init efikasb_board_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
|
||||
ARRAY_SIZE(mx51efikasb_pads));
|
||||
efika_board_common_init();
|
||||
@ -256,9 +251,8 @@ static void __init efikasb_board_init(void)
|
||||
mx51_efikasb_usb();
|
||||
imx51_add_sdhci_esdhc_imx(1, NULL);
|
||||
|
||||
platform_device_register(&mx51_efikasb_leds_device);
|
||||
gpio_led_register_device(-1, &mx51_efikasb_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikasb_keys_data);
|
||||
|
||||
}
|
||||
|
||||
static void __init mx51_efikasb_timer_init(void)
|
||||
|
254
arch/arm/mach-mx5/board-mx53_ard.c
Normal file
254
arch/arm/mach-mx5/board-mx53_ard.c
Normal file
@ -0,0 +1,254 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/smsc911x.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "crm_regs.h"
|
||||
#include "devices-imx53.h"
|
||||
|
||||
#define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31)
|
||||
#define ARD_SD1_CD IMX_GPIO_NR(1, 1)
|
||||
#define ARD_SD1_WP IMX_GPIO_NR(1, 9)
|
||||
#define ARD_I2CPORTEXP_B IMX_GPIO_NR(2, 3)
|
||||
#define ARD_VOLUMEDOWN IMX_GPIO_NR(4, 0)
|
||||
#define ARD_HOME IMX_GPIO_NR(5, 10)
|
||||
#define ARD_BACK IMX_GPIO_NR(5, 11)
|
||||
#define ARD_PROG IMX_GPIO_NR(5, 12)
|
||||
#define ARD_VOLUMEUP IMX_GPIO_NR(5, 13)
|
||||
|
||||
static iomux_v3_cfg_t mx53_ard_pads[] = {
|
||||
/* UART1 */
|
||||
MX53_PAD_PATA_DIOW__UART1_TXD_MUX,
|
||||
MX53_PAD_PATA_DMACK__UART1_RXD_MUX,
|
||||
/* WEIM for CS1 */
|
||||
MX53_PAD_EIM_EB3__GPIO2_31, /* ETHERNET_INT_B */
|
||||
MX53_PAD_EIM_D16__EMI_WEIM_D_16,
|
||||
MX53_PAD_EIM_D17__EMI_WEIM_D_17,
|
||||
MX53_PAD_EIM_D18__EMI_WEIM_D_18,
|
||||
MX53_PAD_EIM_D19__EMI_WEIM_D_19,
|
||||
MX53_PAD_EIM_D20__EMI_WEIM_D_20,
|
||||
MX53_PAD_EIM_D21__EMI_WEIM_D_21,
|
||||
MX53_PAD_EIM_D22__EMI_WEIM_D_22,
|
||||
MX53_PAD_EIM_D23__EMI_WEIM_D_23,
|
||||
MX53_PAD_EIM_D24__EMI_WEIM_D_24,
|
||||
MX53_PAD_EIM_D25__EMI_WEIM_D_25,
|
||||
MX53_PAD_EIM_D26__EMI_WEIM_D_26,
|
||||
MX53_PAD_EIM_D27__EMI_WEIM_D_27,
|
||||
MX53_PAD_EIM_D28__EMI_WEIM_D_28,
|
||||
MX53_PAD_EIM_D29__EMI_WEIM_D_29,
|
||||
MX53_PAD_EIM_D30__EMI_WEIM_D_30,
|
||||
MX53_PAD_EIM_D31__EMI_WEIM_D_31,
|
||||
MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
|
||||
MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
|
||||
MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
|
||||
MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
|
||||
MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
|
||||
MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
|
||||
MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
|
||||
MX53_PAD_EIM_OE__EMI_WEIM_OE,
|
||||
MX53_PAD_EIM_RW__EMI_WEIM_RW,
|
||||
MX53_PAD_EIM_CS1__EMI_WEIM_CS_1,
|
||||
/* SDHC1 */
|
||||
MX53_PAD_SD1_CMD__ESDHC1_CMD,
|
||||
MX53_PAD_SD1_CLK__ESDHC1_CLK,
|
||||
MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
|
||||
MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
MX53_PAD_PATA_DATA8__ESDHC1_DAT4,
|
||||
MX53_PAD_PATA_DATA9__ESDHC1_DAT5,
|
||||
MX53_PAD_PATA_DATA10__ESDHC1_DAT6,
|
||||
MX53_PAD_PATA_DATA11__ESDHC1_DAT7,
|
||||
MX53_PAD_GPIO_1__GPIO1_1,
|
||||
MX53_PAD_GPIO_9__GPIO1_9,
|
||||
/* I2C2 */
|
||||
MX53_PAD_EIM_EB2__I2C2_SCL,
|
||||
MX53_PAD_KEY_ROW3__I2C2_SDA,
|
||||
/* I2C3 */
|
||||
MX53_PAD_GPIO_3__I2C3_SCL,
|
||||
MX53_PAD_GPIO_16__I2C3_SDA,
|
||||
/* GPIO */
|
||||
MX53_PAD_DISP0_DAT16__GPIO5_10, /* home */
|
||||
MX53_PAD_DISP0_DAT17__GPIO5_11, /* back */
|
||||
MX53_PAD_DISP0_DAT18__GPIO5_12, /* prog */
|
||||
MX53_PAD_DISP0_DAT19__GPIO5_13, /* vol up */
|
||||
MX53_PAD_GPIO_10__GPIO4_0, /* vol down */
|
||||
};
|
||||
|
||||
#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \
|
||||
{ \
|
||||
.gpio = gpio_num, \
|
||||
.type = EV_KEY, \
|
||||
.code = ev_code, \
|
||||
.active_low = act_low, \
|
||||
.desc = "btn " descr, \
|
||||
.wakeup = wake, \
|
||||
}
|
||||
|
||||
static struct gpio_keys_button ard_buttons[] = {
|
||||
GPIO_BUTTON(ARD_HOME, KEY_HOME, 1, "home", 0),
|
||||
GPIO_BUTTON(ARD_BACK, KEY_BACK, 1, "back", 0),
|
||||
GPIO_BUTTON(ARD_PROG, KEY_PROGRAM, 1, "program", 0),
|
||||
GPIO_BUTTON(ARD_VOLUMEUP, KEY_VOLUMEUP, 1, "volume-up", 0),
|
||||
GPIO_BUTTON(ARD_VOLUMEDOWN, KEY_VOLUMEDOWN, 1, "volume-down", 0),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data ard_button_data __initconst = {
|
||||
.buttons = ard_buttons,
|
||||
.nbuttons = ARRAY_SIZE(ard_buttons),
|
||||
};
|
||||
|
||||
static struct resource ard_smsc911x_resources[] = {
|
||||
{
|
||||
.start = MX53_CS1_64MB_BASE_ADDR,
|
||||
.end = MX53_CS1_64MB_BASE_ADDR + SZ_32M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = gpio_to_irq(ARD_ETHERNET_INT_B),
|
||||
.end = gpio_to_irq(ARD_ETHERNET_INT_B),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
struct smsc911x_platform_config ard_smsc911x_config = {
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
};
|
||||
|
||||
static struct platform_device ard_smsc_lan9220_device = {
|
||||
.name = "smsc911x",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(ard_smsc911x_resources),
|
||||
.resource = ard_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &ard_smsc911x_config,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_ard_sd1_data __initconst = {
|
||||
.cd_gpio = ARD_SD1_CD,
|
||||
.wp_gpio = ARD_SD1_WP,
|
||||
};
|
||||
|
||||
static struct imxi2c_platform_data mx53_ard_i2c2_data = {
|
||||
.bitrate = 50000,
|
||||
};
|
||||
|
||||
static struct imxi2c_platform_data mx53_ard_i2c3_data = {
|
||||
.bitrate = 400000,
|
||||
};
|
||||
|
||||
static void __init mx53_ard_io_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads,
|
||||
ARRAY_SIZE(mx53_ard_pads));
|
||||
|
||||
gpio_request(ARD_ETHERNET_INT_B, "eth-int-b");
|
||||
gpio_direction_input(ARD_ETHERNET_INT_B);
|
||||
|
||||
gpio_request(ARD_I2CPORTEXP_B, "i2cptexp-rst");
|
||||
gpio_direction_output(ARD_I2CPORTEXP_B, 1);
|
||||
}
|
||||
|
||||
/* Config CS1 settings for ethernet controller */
|
||||
static int weim_cs_config(void)
|
||||
{
|
||||
u32 reg;
|
||||
void __iomem *weim_base, *iomuxc_base;
|
||||
|
||||
weim_base = ioremap(MX53_WEIM_BASE_ADDR, SZ_4K);
|
||||
if (!weim_base)
|
||||
return -ENOMEM;
|
||||
|
||||
iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K);
|
||||
if (!iomuxc_base)
|
||||
return -ENOMEM;
|
||||
|
||||
/* CS1 timings for LAN9220 */
|
||||
writel(0x20001, (weim_base + 0x18));
|
||||
writel(0x0, (weim_base + 0x1C));
|
||||
writel(0x16000202, (weim_base + 0x20));
|
||||
writel(0x00000002, (weim_base + 0x24));
|
||||
writel(0x16002082, (weim_base + 0x28));
|
||||
writel(0x00000000, (weim_base + 0x2C));
|
||||
writel(0x00000000, (weim_base + 0x90));
|
||||
|
||||
/* specify 64 MB on CS1 and CS0 on GPR1 */
|
||||
reg = readl(iomuxc_base + 0x4);
|
||||
reg &= ~0x3F;
|
||||
reg |= 0x1B;
|
||||
writel(reg, (iomuxc_base + 0x4));
|
||||
|
||||
iounmap(iomuxc_base);
|
||||
iounmap(weim_base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&ard_smsc_lan9220_device,
|
||||
};
|
||||
|
||||
static void __init mx53_ard_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
|
||||
mx53_ard_io_init();
|
||||
weim_cs_config();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
||||
imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data);
|
||||
imx53_add_imx2_wdt(0, NULL);
|
||||
imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);
|
||||
imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);
|
||||
imx_add_gpio_keys(&ard_button_data);
|
||||
}
|
||||
|
||||
static void __init mx53_ard_timer_init(void)
|
||||
{
|
||||
mx53_clocks_init(32768, 24000000, 22579200, 0);
|
||||
}
|
||||
|
||||
static struct sys_timer mx53_ard_timer = {
|
||||
.init = mx53_ard_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
|
||||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.timer = &mx53_ard_timer,
|
||||
.init_machine = mx53_ard_board_init,
|
||||
MACHINE_END
|
@ -35,6 +35,7 @@
|
||||
#define MX53_EVK_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define EVK_ECSPI1_CS0 IMX_GPIO_NR(2, 30)
|
||||
#define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
|
||||
#define MX53EVK_LED IMX_GPIO_NR(7, 7)
|
||||
|
||||
#include "crm_regs.h"
|
||||
#include "devices-imx53.h"
|
||||
@ -58,12 +59,27 @@ static iomux_v3_cfg_t mx53_evk_pads[] = {
|
||||
/* ecspi chip select lines */
|
||||
MX53_PAD_EIM_EB2__GPIO2_30,
|
||||
MX53_PAD_EIM_D19__GPIO3_19,
|
||||
/* LED */
|
||||
MX53_PAD_PATA_DA_1__GPIO7_7,
|
||||
};
|
||||
|
||||
static const struct imxuart_platform_data mx53_evk_uart_pdata __initconst = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
static const struct gpio_led mx53evk_leds[] __initconst = {
|
||||
{
|
||||
.name = "green",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = MX53EVK_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data mx53evk_leds_data __initconst = {
|
||||
.leds = mx53evk_leds,
|
||||
.num_leds = ARRAY_SIZE(mx53evk_leds),
|
||||
};
|
||||
|
||||
static inline void mx53_evk_init_uart(void)
|
||||
{
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
@ -117,6 +133,8 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = {
|
||||
|
||||
static void __init mx53_evk_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
|
||||
ARRAY_SIZE(mx53_evk_pads));
|
||||
mx53_evk_init_uart();
|
||||
@ -133,6 +151,7 @@ static void __init mx53_evk_board_init(void)
|
||||
ARRAY_SIZE(mx53_evk_spi_board_info));
|
||||
imx53_add_ecspi(0, &mx53_evk_spi_data);
|
||||
imx53_add_imx2_wdt(0, NULL);
|
||||
gpio_led_register_device(-1, &mx53evk_leds_data);
|
||||
}
|
||||
|
||||
static void __init mx53_evk_timer_init(void)
|
||||
|
@ -38,6 +38,10 @@
|
||||
#define MX53_LOCO_UI1 IMX_GPIO_NR(2, 14)
|
||||
#define MX53_LOCO_UI2 IMX_GPIO_NR(2, 15)
|
||||
#define LOCO_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define LOCO_LED IMX_GPIO_NR(7, 7)
|
||||
#define LOCO_SD3_CD IMX_GPIO_NR(3, 11)
|
||||
#define LOCO_SD3_WP IMX_GPIO_NR(3, 12)
|
||||
#define LOCO_SD1_CD IMX_GPIO_NR(3, 13)
|
||||
|
||||
static iomux_v3_cfg_t mx53_loco_pads[] = {
|
||||
/* FEC */
|
||||
@ -70,6 +74,8 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
|
||||
MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
/* SD1_CD */
|
||||
MX53_PAD_EIM_DA13__GPIO3_13,
|
||||
/* SD3 */
|
||||
MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
|
||||
MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
|
||||
@ -163,7 +169,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
|
||||
MX53_PAD_GPIO_7__SPDIF_PLOCK,
|
||||
MX53_PAD_GPIO_17__SPDIF_OUT1,
|
||||
/* GPIO */
|
||||
MX53_PAD_PATA_DA_1__GPIO7_7,
|
||||
MX53_PAD_PATA_DA_1__GPIO7_7, /* LED */
|
||||
MX53_PAD_PATA_DA_2__GPIO7_8,
|
||||
MX53_PAD_PATA_DATA5__GPIO2_5,
|
||||
MX53_PAD_PATA_DATA6__GPIO2_6,
|
||||
@ -202,6 +208,15 @@ static const struct gpio_keys_platform_data loco_button_data __initconst = {
|
||||
.nbuttons = ARRAY_SIZE(loco_buttons),
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_loco_sd1_data __initconst = {
|
||||
.cd_gpio = LOCO_SD1_CD,
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_loco_sd3_data __initconst = {
|
||||
.cd_gpio = LOCO_SD3_CD,
|
||||
.wp_gpio = LOCO_SD3_WP,
|
||||
};
|
||||
|
||||
static inline void mx53_loco_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
@ -225,8 +240,23 @@ static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
|
||||
.bitrate = 100000,
|
||||
};
|
||||
|
||||
static const struct gpio_led mx53loco_leds[] __initconst = {
|
||||
{
|
||||
.name = "green",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = LOCO_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {
|
||||
.leds = mx53loco_leds,
|
||||
.num_leds = ARRAY_SIZE(mx53loco_leds),
|
||||
};
|
||||
|
||||
static void __init mx53_loco_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
|
||||
ARRAY_SIZE(mx53_loco_pads));
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
@ -235,9 +265,10 @@ static void __init mx53_loco_board_init(void)
|
||||
imx53_add_imx2_wdt(0, NULL);
|
||||
imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
|
||||
imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
|
||||
imx53_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(2, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
|
||||
imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
|
||||
imx_add_gpio_keys(&loco_button_data);
|
||||
gpio_led_register_device(-1, &mx53loco_leds_data);
|
||||
}
|
||||
|
||||
static void __init mx53_loco_timer_init(void)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user