mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-09 15:24:32 +08:00
Merge branch 'next-samsung-board' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/board
This commit is contained in:
commit
5ddac6bc1c
@ -2,13 +2,7 @@ Intro
|
|||||||
=====
|
=====
|
||||||
|
|
||||||
This document is designed to provide a list of the minimum levels of
|
This document is designed to provide a list of the minimum levels of
|
||||||
software necessary to run the 2.6 kernels, as well as provide brief
|
software necessary to run the 3.0 kernels.
|
||||||
instructions regarding any other "Gotchas" users may encounter when
|
|
||||||
trying life on the Bleeding Edge. If upgrading from a pre-2.4.x
|
|
||||||
kernel, please consult the Changes file included with 2.4.x kernels for
|
|
||||||
additional information; most of that information will not be repeated
|
|
||||||
here. Basically, this document assumes that your system is already
|
|
||||||
functional and running at least 2.4.x kernels.
|
|
||||||
|
|
||||||
This document is originally based on my "Changes" file for 2.0.x kernels
|
This document is originally based on my "Changes" file for 2.0.x kernels
|
||||||
and therefore owes credit to the same people as that file (Jared Mauch,
|
and therefore owes credit to the same people as that file (Jared Mauch,
|
||||||
@ -22,11 +16,10 @@ Upgrade to at *least* these software revisions before thinking you've
|
|||||||
encountered a bug! If you're unsure what version you're currently
|
encountered a bug! If you're unsure what version you're currently
|
||||||
running, the suggested command should tell you.
|
running, the suggested command should tell you.
|
||||||
|
|
||||||
Again, keep in mind that this list assumes you are already
|
Again, keep in mind that this list assumes you are already functionally
|
||||||
functionally running a Linux 2.4 kernel. Also, not all tools are
|
running a Linux kernel. Also, not all tools are necessary on all
|
||||||
necessary on all systems; obviously, if you don't have any ISDN
|
systems; obviously, if you don't have any ISDN hardware, for example,
|
||||||
hardware, for example, you probably needn't concern yourself with
|
you probably needn't concern yourself with isdn4k-utils.
|
||||||
isdn4k-utils.
|
|
||||||
|
|
||||||
o Gnu C 3.2 # gcc --version
|
o Gnu C 3.2 # gcc --version
|
||||||
o Gnu make 3.80 # make --version
|
o Gnu make 3.80 # make --version
|
||||||
@ -114,12 +107,12 @@ Ksymoops
|
|||||||
|
|
||||||
If the unthinkable happens and your kernel oopses, you may need the
|
If the unthinkable happens and your kernel oopses, you may need the
|
||||||
ksymoops tool to decode it, but in most cases you don't.
|
ksymoops tool to decode it, but in most cases you don't.
|
||||||
In the 2.6 kernel it is generally preferred to build the kernel with
|
It is generally preferred to build the kernel with CONFIG_KALLSYMS so
|
||||||
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
|
that it produces readable dumps that can be used as-is (this also
|
||||||
(this also produces better output than ksymoops).
|
produces better output than ksymoops). If for some reason your kernel
|
||||||
If for some reason your kernel is not build with CONFIG_KALLSYMS and
|
is not build with CONFIG_KALLSYMS and you have no way to rebuild and
|
||||||
you have no way to rebuild and reproduce the Oops with that option, then
|
reproduce the Oops with that option, then you can still decode that Oops
|
||||||
you can still decode that Oops with ksymoops.
|
with ksymoops.
|
||||||
|
|
||||||
Module-Init-Tools
|
Module-Init-Tools
|
||||||
-----------------
|
-----------------
|
||||||
@ -261,8 +254,8 @@ needs to be recompiled or (preferably) upgraded.
|
|||||||
NFS-utils
|
NFS-utils
|
||||||
---------
|
---------
|
||||||
|
|
||||||
In 2.4 and earlier kernels, the nfs server needed to know about any
|
In ancient (2.4 and earlier) kernels, the nfs server needed to know
|
||||||
client that expected to be able to access files via NFS. This
|
about any client that expected to be able to access files via NFS. This
|
||||||
information would be given to the kernel by "mountd" when the client
|
information would be given to the kernel by "mountd" when the client
|
||||||
mounted the filesystem, or by "exportfs" at system startup. exportfs
|
mounted the filesystem, or by "exportfs" at system startup. exportfs
|
||||||
would take information about active clients from /var/lib/nfs/rmtab.
|
would take information about active clients from /var/lib/nfs/rmtab.
|
||||||
@ -272,11 +265,11 @@ which is not always easy, particularly when trying to implement
|
|||||||
fail-over. Even when the system is working well, rmtab suffers from
|
fail-over. Even when the system is working well, rmtab suffers from
|
||||||
getting lots of old entries that never get removed.
|
getting lots of old entries that never get removed.
|
||||||
|
|
||||||
With 2.6 we have the option of having the kernel tell mountd when it
|
With modern kernels we have the option of having the kernel tell mountd
|
||||||
gets a request from an unknown host, and mountd can give appropriate
|
when it gets a request from an unknown host, and mountd can give
|
||||||
export information to the kernel. This removes the dependency on
|
appropriate export information to the kernel. This removes the
|
||||||
rmtab and means that the kernel only needs to know about currently
|
dependency on rmtab and means that the kernel only needs to know about
|
||||||
active clients.
|
currently active clients.
|
||||||
|
|
||||||
To enable this new functionality, you need to:
|
To enable this new functionality, you need to:
|
||||||
|
|
||||||
|
@ -680,8 +680,8 @@ ones already enabled by DEBUG.
|
|||||||
Chapter 14: Allocating memory
|
Chapter 14: Allocating memory
|
||||||
|
|
||||||
The kernel provides the following general purpose memory allocators:
|
The kernel provides the following general purpose memory allocators:
|
||||||
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API
|
kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to
|
||||||
documentation for further information about them.
|
the API documentation for further information about them.
|
||||||
|
|
||||||
The preferred form for passing a size of a struct is the following:
|
The preferred form for passing a size of a struct is the following:
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ Throttling/Upper Limit policy
|
|||||||
- Specify a bandwidth rate on particular device for root group. The format
|
- Specify a bandwidth rate on particular device for root group. The format
|
||||||
for policy is "<major>:<minor> <byes_per_second>".
|
for policy is "<major>:<minor> <byes_per_second>".
|
||||||
|
|
||||||
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.read_bps_device
|
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
|
||||||
|
|
||||||
Above will put a limit of 1MB/second on reads happening for root group
|
Above will put a limit of 1MB/second on reads happening for root group
|
||||||
on device having major/minor number 8:16.
|
on device having major/minor number 8:16.
|
||||||
@ -90,7 +90,7 @@ Throttling/Upper Limit policy
|
|||||||
1024+0 records out
|
1024+0 records out
|
||||||
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
|
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
|
||||||
|
|
||||||
Limits for writes can be put using blkio.write_bps_device file.
|
Limits for writes can be put using blkio.throttle.write_bps_device file.
|
||||||
|
|
||||||
Hierarchical Cgroups
|
Hierarchical Cgroups
|
||||||
====================
|
====================
|
||||||
@ -286,28 +286,28 @@ Throttling/Upper limit policy files
|
|||||||
specified in bytes per second. Rules are per deivce. Following is
|
specified in bytes per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.read_bps_device
|
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
|
||||||
|
|
||||||
- blkio.throttle.write_bps_device
|
- blkio.throttle.write_bps_device
|
||||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||||
specified in bytes per second. Rules are per deivce. Following is
|
specified in bytes per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.write_bps_device
|
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
|
||||||
|
|
||||||
- blkio.throttle.read_iops_device
|
- blkio.throttle.read_iops_device
|
||||||
- Specifies upper limit on READ rate from the device. IO rate is
|
- Specifies upper limit on READ rate from the device. IO rate is
|
||||||
specified in IO per second. Rules are per deivce. Following is
|
specified in IO per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.read_iops_device
|
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
|
||||||
|
|
||||||
- blkio.throttle.write_iops_device
|
- blkio.throttle.write_iops_device
|
||||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||||
specified in io per second. Rules are per deivce. Following is
|
specified in io per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.write_iops_device
|
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
|
||||||
|
|
||||||
Note: If both BW and IOPS rules are specified for a device, then IO is
|
Note: If both BW and IOPS rules are specified for a device, then IO is
|
||||||
subjectd to both the constraints.
|
subjectd to both the constraints.
|
||||||
|
@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl.
|
|||||||
Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: For VIDIOC_S_FREQUENCY the type field must match the device node's type.
|
||||||
|
If not, return -EINVAL.
|
||||||
|
When: 3.2
|
||||||
|
Why: It makes no sense to switch the tuner to radio mode by calling
|
||||||
|
VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by
|
||||||
|
calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a
|
||||||
|
move to more consistent handling of tv and radio tuners.
|
||||||
|
Who: Hans Verkuil <hans.verkuil@cisco.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: Opening a radio device node will no longer automatically switch the
|
||||||
|
tuner mode from tv to radio.
|
||||||
|
When: 3.3
|
||||||
|
Why: Just opening a V4L device should not change the state of the hardware
|
||||||
|
like that. It's very unexpected and against the V4L spec. Instead, you
|
||||||
|
switch to radio mode by calling VIDIOC_S_FREQUENCY. This is the second
|
||||||
|
and last step of the move to consistent handling of tv and radio tuners.
|
||||||
|
Who: Hans Verkuil <hans.verkuil@cisco.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request -
|
|||||||
in which case the page will not be stored in the cache this time.
|
in which case the page will not be stored in the cache this time.
|
||||||
|
|
||||||
|
|
||||||
|
BULK INODE PAGE UNCACHE
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
A convenience routine is provided to perform an uncache on all the pages
|
||||||
|
attached to an inode. This assumes that the pages on the inode correspond on a
|
||||||
|
1:1 basis with the pages in the cache.
|
||||||
|
|
||||||
|
void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
|
||||||
|
struct inode *inode);
|
||||||
|
|
||||||
|
This takes the netfs cookie that the pages were cached with and the inode that
|
||||||
|
the pages are attached to. This function will wait for pages to finish being
|
||||||
|
written to the cache and for the cache to finish with the page generally. No
|
||||||
|
error is returned.
|
||||||
|
|
||||||
|
|
||||||
==========================
|
==========================
|
||||||
INDEX AND DATA FILE UPDATE
|
INDEX AND DATA FILE UPDATE
|
||||||
==========================
|
==========================
|
||||||
|
@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
the default.
|
the default.
|
||||||
off: Turn ECRC off
|
off: Turn ECRC off
|
||||||
on: Turn ECRC on.
|
on: Turn ECRC on.
|
||||||
|
realloc reallocate PCI resources if allocations done by BIOS
|
||||||
|
are erroneous.
|
||||||
|
|
||||||
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
||||||
Management.
|
Management.
|
||||||
|
@ -534,6 +534,8 @@ Events that are never propagated by the driver:
|
|||||||
0x2404 System is waking up from hibernation to undock
|
0x2404 System is waking up from hibernation to undock
|
||||||
0x2405 System is waking up from hibernation to eject bay
|
0x2405 System is waking up from hibernation to eject bay
|
||||||
0x5010 Brightness level changed/control event
|
0x5010 Brightness level changed/control event
|
||||||
|
0x6000 KEYBOARD: Numlock key pressed
|
||||||
|
0x6005 KEYBOARD: Fn key pressed (TO BE VERIFIED)
|
||||||
|
|
||||||
Events that are propagated by the driver to userspace:
|
Events that are propagated by the driver to userspace:
|
||||||
|
|
||||||
@ -545,6 +547,8 @@ Events that are propagated by the driver to userspace:
|
|||||||
0x3006 Bay hotplug request (hint to power up SATA link when
|
0x3006 Bay hotplug request (hint to power up SATA link when
|
||||||
the optical drive tray is ejected)
|
the optical drive tray is ejected)
|
||||||
0x4003 Undocked (see 0x2x04), can sleep again
|
0x4003 Undocked (see 0x2x04), can sleep again
|
||||||
|
0x4010 Docked into hotplug port replicator (non-ACPI dock)
|
||||||
|
0x4011 Undocked from hotplug port replicator (non-ACPI dock)
|
||||||
0x500B Tablet pen inserted into its storage bay
|
0x500B Tablet pen inserted into its storage bay
|
||||||
0x500C Tablet pen removed from its storage bay
|
0x500C Tablet pen removed from its storage bay
|
||||||
0x6011 ALARM: battery is too hot
|
0x6011 ALARM: battery is too hot
|
||||||
@ -552,6 +556,7 @@ Events that are propagated by the driver to userspace:
|
|||||||
0x6021 ALARM: a sensor is too hot
|
0x6021 ALARM: a sensor is too hot
|
||||||
0x6022 ALARM: a sensor is extremely hot
|
0x6022 ALARM: a sensor is extremely hot
|
||||||
0x6030 System thermal table changed
|
0x6030 System thermal table changed
|
||||||
|
0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED)
|
||||||
|
|
||||||
Battery nearly empty alarms are a last resort attempt to get the
|
Battery nearly empty alarms are a last resort attempt to get the
|
||||||
operating system to hibernate or shutdown cleanly (0x2313), or shutdown
|
operating system to hibernate or shutdown cleanly (0x2313), or shutdown
|
||||||
|
@ -13,18 +13,8 @@ static DEFINE_SPINLOCK(xxx_lock);
|
|||||||
The above is always safe. It will disable interrupts _locally_, but the
|
The above is always safe. It will disable interrupts _locally_, but the
|
||||||
spinlock itself will guarantee the global lock, so it will guarantee that
|
spinlock itself will guarantee the global lock, so it will guarantee that
|
||||||
there is only one thread-of-control within the region(s) protected by that
|
there is only one thread-of-control within the region(s) protected by that
|
||||||
lock. This works well even under UP. The above sequence under UP
|
lock. This works well even under UP also, so the code does _not_ need to
|
||||||
essentially is just the same as doing
|
worry about UP vs SMP issues: the spinlocks work correctly under both.
|
||||||
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
save_flags(flags); cli();
|
|
||||||
... critical section ...
|
|
||||||
restore_flags(flags);
|
|
||||||
|
|
||||||
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
|
|
||||||
work correctly under both (and spinlocks are actually more efficient on
|
|
||||||
architectures that allow doing the "save_flags + cli" in one operation).
|
|
||||||
|
|
||||||
NOTE! Implications of spin_locks for memory are further described in:
|
NOTE! Implications of spin_locks for memory are further described in:
|
||||||
|
|
||||||
@ -36,27 +26,7 @@ The above is usually pretty simple (you usually need and want only one
|
|||||||
spinlock for most things - using more than one spinlock can make things a
|
spinlock for most things - using more than one spinlock can make things a
|
||||||
lot more complex and even slower and is usually worth it only for
|
lot more complex and even slower and is usually worth it only for
|
||||||
sequences that you _know_ need to be split up: avoid it at all cost if you
|
sequences that you _know_ need to be split up: avoid it at all cost if you
|
||||||
aren't sure). HOWEVER, it _does_ mean that if you have some code that does
|
aren't sure).
|
||||||
|
|
||||||
cli();
|
|
||||||
.. critical section ..
|
|
||||||
sti();
|
|
||||||
|
|
||||||
and another sequence that does
|
|
||||||
|
|
||||||
spin_lock_irqsave(flags);
|
|
||||||
.. critical section ..
|
|
||||||
spin_unlock_irqrestore(flags);
|
|
||||||
|
|
||||||
then they are NOT mutually exclusive, and the critical regions can happen
|
|
||||||
at the same time on two different CPU's. That's fine per se, but the
|
|
||||||
critical regions had better be critical for different things (ie they
|
|
||||||
can't stomp on each other).
|
|
||||||
|
|
||||||
The above is a problem mainly if you end up mixing code - for example the
|
|
||||||
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
|
|
||||||
their actions, and if a driver uses spinlocks instead then you should
|
|
||||||
think about issues like the above.
|
|
||||||
|
|
||||||
This is really the only really hard part about spinlocks: once you start
|
This is really the only really hard part about spinlocks: once you start
|
||||||
using spinlocks they tend to expand to areas you might not have noticed
|
using spinlocks they tend to expand to areas you might not have noticed
|
||||||
@ -120,11 +90,10 @@ Lesson 3: spinlocks revisited.
|
|||||||
|
|
||||||
The single spin-lock primitives above are by no means the only ones. They
|
The single spin-lock primitives above are by no means the only ones. They
|
||||||
are the most safe ones, and the ones that work under all circumstances,
|
are the most safe ones, and the ones that work under all circumstances,
|
||||||
but partly _because_ they are safe they are also fairly slow. They are
|
but partly _because_ they are safe they are also fairly slow. They are slower
|
||||||
much faster than a generic global cli/sti pair, but slower than they'd
|
than they'd need to be, because they do have to disable interrupts
|
||||||
need to be, because they do have to disable interrupts (which is just a
|
(which is just a single instruction on a x86, but it's an expensive one -
|
||||||
single instruction on a x86, but it's an expensive one - and on other
|
and on other architectures it can be worse).
|
||||||
architectures it can be worse).
|
|
||||||
|
|
||||||
If you have a case where you have to protect a data structure across
|
If you have a case where you have to protect a data structure across
|
||||||
several CPU's and you want to use spinlocks you can potentially use
|
several CPU's and you want to use spinlocks you can potentially use
|
||||||
|
15
MAINTAINERS
15
MAINTAINERS
@ -594,6 +594,16 @@ S: Maintained
|
|||||||
F: arch/arm/lib/floppydma.S
|
F: arch/arm/lib/floppydma.S
|
||||||
F: arch/arm/include/asm/floppy.h
|
F: arch/arm/include/asm/floppy.h
|
||||||
|
|
||||||
|
ARM PMU PROFILING AND DEBUGGING
|
||||||
|
M: Will Deacon <will.deacon@arm.com>
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/kernel/perf_event*
|
||||||
|
F: arch/arm/oprofile/common.c
|
||||||
|
F: arch/arm/kernel/pmu.c
|
||||||
|
F: arch/arm/include/asm/pmu.h
|
||||||
|
F: arch/arm/kernel/hw_breakpoint.c
|
||||||
|
F: arch/arm/include/asm/hw_breakpoint.h
|
||||||
|
|
||||||
ARM PORT
|
ARM PORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@arm.linux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
@ -2197,7 +2207,7 @@ F: drivers/acpi/dock.c
|
|||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
M: Randy Dunlap <rdunlap@xenotime.net>
|
M: Randy Dunlap <rdunlap@xenotime.net>
|
||||||
L: linux-doc@vger.kernel.org
|
L: linux-doc@vger.kernel.org
|
||||||
T: quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/
|
T: quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/
|
F: Documentation/
|
||||||
|
|
||||||
@ -4982,7 +4992,7 @@ F: drivers/power/power_supply*
|
|||||||
|
|
||||||
PNP SUPPORT
|
PNP SUPPORT
|
||||||
M: Adam Belay <abelay@mit.edu>
|
M: Adam Belay <abelay@mit.edu>
|
||||||
M: Bjorn Helgaas <bjorn.helgaas@hp.com>
|
M: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/pnp/
|
F: drivers/pnp/
|
||||||
|
|
||||||
@ -6733,6 +6743,7 @@ F: fs/fat/
|
|||||||
VIDEOBUF2 FRAMEWORK
|
VIDEOBUF2 FRAMEWORK
|
||||||
M: Pawel Osciak <pawel@osciak.com>
|
M: Pawel Osciak <pawel@osciak.com>
|
||||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||||
|
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/media/video/videobuf2-*
|
F: drivers/media/video/videobuf2-*
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc7
|
||||||
NAME = Sneaky Weasel
|
NAME = Sneaky Weasel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
|
|||||||
if (buf == 0) {
|
if (buf == 0) {
|
||||||
dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
|
dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
|
||||||
__func__, ptr);
|
__func__, ptr);
|
||||||
return 0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(dev,
|
dev_dbg(dev,
|
||||||
|
@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)
|
|||||||
static void armpmu_enable(struct pmu *pmu)
|
static void armpmu_enable(struct pmu *pmu)
|
||||||
{
|
{
|
||||||
/* Enable all of the perf events on hardware. */
|
/* Enable all of the perf events on hardware. */
|
||||||
int idx;
|
int idx, enabled = 0;
|
||||||
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
||||||
|
|
||||||
if (!armpmu)
|
if (!armpmu)
|
||||||
@ -596,8 +596,10 @@ static void armpmu_enable(struct pmu *pmu)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
armpmu->enable(&event->hw, idx);
|
armpmu->enable(&event->hw, idx);
|
||||||
|
enabled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
armpmu->start();
|
armpmu->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void paging_init(struct machine_desc *desc);
|
extern void paging_init(struct machine_desc *desc);
|
||||||
|
extern void sanity_check_meminfo(void);
|
||||||
extern void reboot_setup(char *str);
|
extern void reboot_setup(char *str);
|
||||||
|
|
||||||
unsigned int processor_id;
|
unsigned int processor_id;
|
||||||
@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
|
|
||||||
parse_early_param();
|
parse_early_param();
|
||||||
|
|
||||||
|
sanity_check_meminfo();
|
||||||
arm_memblock_init(&meminfo, mdesc);
|
arm_memblock_init(&meminfo, mdesc);
|
||||||
|
|
||||||
paging_init(mdesc);
|
paging_init(mdesc);
|
||||||
|
@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)
|
|||||||
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
|
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
|
||||||
|
|
||||||
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
|
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
|
||||||
(twd_timer_rate / 1000000) % 100);
|
(twd_timer_rate / 10000) % 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,
|
|||||||
unsigned int mcr;
|
unsigned int mcr;
|
||||||
|
|
||||||
mcr = 0;
|
mcr = 0;
|
||||||
if (!(mctrl & TIOCM_RTS))
|
if (mctrl & TIOCM_RTS)
|
||||||
mcr |= 2;
|
mcr |= 2;
|
||||||
if (!(mctrl & TIOCM_DTR))
|
if (mctrl & TIOCM_DTR)
|
||||||
mcr |= 1;
|
mcr |= 1;
|
||||||
|
|
||||||
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <plat/sdhci.h>
|
#include <plat/sdhci.h>
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/fimc-core.h>
|
#include <plat/fimc-core.h>
|
||||||
|
#include <plat/iic-core.h>
|
||||||
|
|
||||||
#include <mach/regs-irq.h>
|
#include <mach/regs-irq.h>
|
||||||
|
|
||||||
@ -132,6 +133,11 @@ void __init exynos4_map_io(void)
|
|||||||
s3c_fimc_setname(1, "exynos4-fimc");
|
s3c_fimc_setname(1, "exynos4-fimc");
|
||||||
s3c_fimc_setname(2, "exynos4-fimc");
|
s3c_fimc_setname(2, "exynos4-fimc");
|
||||||
s3c_fimc_setname(3, "exynos4-fimc");
|
s3c_fimc_setname(3, "exynos4-fimc");
|
||||||
|
|
||||||
|
/* The I2C bus controllers are directly compatible with s3c2440 */
|
||||||
|
s3c_i2c0_setname("s3c2440-i2c");
|
||||||
|
s3c_i2c1_setname("s3c2440-i2c");
|
||||||
|
s3c_i2c2_setname("s3c2440-i2c");
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init exynos4_init_clocks(int xtal)
|
void __init exynos4_init_clocks(int xtal)
|
||||||
|
@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {
|
|||||||
|
|
||||||
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
|
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3));
|
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
__INIT
|
__CPUINIT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* exynos4 specific entry point for secondary CPUs. This provides
|
* exynos4 specific entry point for secondary CPUs. This provides
|
||||||
|
@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
||||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
|
||||||
.ext_cd_gpio_invert = 1,
|
|
||||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||||
.max_width = 8,
|
.max_width = 8,
|
||||||
@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
||||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
|
||||||
.ext_cd_gpio_invert = 1,
|
|
||||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
||||||
.max_width = 8,
|
.max_width = 8,
|
||||||
|
@ -215,7 +215,7 @@ static struct omap_kp_platform_data ams_delta_kp_data __initdata = {
|
|||||||
.delay = 9,
|
.delay = 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_kp_device __initdata = {
|
static struct platform_device ams_delta_kp_device = {
|
||||||
.name = "omap-keypad",
|
.name = "omap-keypad",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -225,12 +225,12 @@ static struct platform_device ams_delta_kp_device __initdata = {
|
|||||||
.resource = ams_delta_kp_resources,
|
.resource = ams_delta_kp_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_lcd_device __initdata = {
|
static struct platform_device ams_delta_lcd_device = {
|
||||||
.name = "lcd_ams_delta",
|
.name = "lcd_ams_delta",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_led_device __initdata = {
|
static struct platform_device ams_delta_led_device = {
|
||||||
.name = "ams-delta-led",
|
.name = "ams-delta-led",
|
||||||
.id = -1
|
.id = -1
|
||||||
};
|
};
|
||||||
@ -267,7 +267,7 @@ static struct soc_camera_link ams_delta_iclink = {
|
|||||||
.power = ams_delta_camera_power,
|
.power = ams_delta_camera_power,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_camera_device __initdata = {
|
static struct platform_device ams_delta_camera_device = {
|
||||||
.name = "soc-camera-pdrv",
|
.name = "soc-camera-pdrv",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -41,7 +41,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 1,
|
.bank_stride = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap15xx_mpu_gpio = {
|
static struct platform_device omap15xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -70,7 +70,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap15xx_gpio = {
|
static struct platform_device omap15xx_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -44,7 +44,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 1,
|
.bank_stride = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_mpu_gpio = {
|
static struct platform_device omap16xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -73,7 +73,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio1 = {
|
static struct platform_device omap16xx_gpio1 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -102,7 +102,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio2 = {
|
static struct platform_device omap16xx_gpio2 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -131,7 +131,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio3 = {
|
static struct platform_device omap16xx_gpio3 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 3,
|
.id = 3,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -160,7 +160,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio4 = {
|
static struct platform_device omap16xx_gpio4 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 4,
|
.id = 4,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -46,7 +46,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 2,
|
.bank_stride = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_mpu_gpio = {
|
static struct platform_device omap7xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -75,7 +75,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio1 = {
|
static struct platform_device omap7xx_gpio1 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -104,7 +104,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio2 = {
|
static struct platform_device omap7xx_gpio2 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -133,7 +133,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio3 = {
|
static struct platform_device omap7xx_gpio3 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 3,
|
.id = 3,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -162,7 +162,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio4 = {
|
static struct platform_device omap7xx_gpio4 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 4,
|
.id = 4,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -191,7 +191,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio5 = {
|
static struct platform_device omap7xx_gpio5 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 5,
|
.id = 5,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -220,7 +220,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio6 = {
|
static struct platform_device omap7xx_gpio6 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 6,
|
.id = 6,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -661,7 +661,7 @@ static struct radio_si4713_platform_data rx51_si4713_data __initdata_or_module =
|
|||||||
.subdev_board_info = &rx51_si4713_board_info,
|
.subdev_board_info = &rx51_si4713_board_info,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device rx51_si4713_dev __initdata_or_module = {
|
static struct platform_device rx51_si4713_dev = {
|
||||||
.name = "radio-si4713",
|
.name = "radio-si4713",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -552,7 +552,7 @@ struct mini2440_features_t {
|
|||||||
struct platform_device *optional[8];
|
struct platform_device *optional[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mini2440_parse_features(
|
static void __init mini2440_parse_features(
|
||||||
struct mini2440_features_t * features,
|
struct mini2440_features_t * features,
|
||||||
const char * features_str )
|
const char * features_str )
|
||||||
{
|
{
|
||||||
|
@ -266,3 +266,26 @@ config MACH_SMARTQ7
|
|||||||
select MACH_SMARTQ
|
select MACH_SMARTQ
|
||||||
help
|
help
|
||||||
Machine support for the SmartQ 7
|
Machine support for the SmartQ 7
|
||||||
|
|
||||||
|
config MACH_WLF_CRAGG_6410
|
||||||
|
bool "Wolfson Cragganmore 6410"
|
||||||
|
select CPU_S3C6410
|
||||||
|
select S3C64XX_SETUP_SDHCI
|
||||||
|
select S3C64XX_SETUP_I2C1
|
||||||
|
select S3C64XX_SETUP_IDE
|
||||||
|
select S3C64XX_SETUP_FB_24BPP
|
||||||
|
select S3C64XX_SETUP_KEYPAD
|
||||||
|
select SAMSUNG_DEV_ADC
|
||||||
|
select SAMSUNG_DEV_KEYPAD
|
||||||
|
select S3C_DEV_USB_HOST
|
||||||
|
select S3C_DEV_USB_HSOTG
|
||||||
|
select S3C_DEV_HSMMC
|
||||||
|
select S3C_DEV_HSMMC1
|
||||||
|
select S3C_DEV_HSMMC2
|
||||||
|
select S3C_DEV_I2C1
|
||||||
|
select S3C_DEV_WDT
|
||||||
|
select S3C_DEV_RTC
|
||||||
|
select S3C64XX_DEV_SPI
|
||||||
|
select S3C24XX_GPIO_EXTRA128
|
||||||
|
help
|
||||||
|
Machine support for the Wolfson Cragganmore S3C6410 variant.
|
||||||
|
@ -59,6 +59,7 @@ obj-$(CONFIG_MACH_HMT) += mach-hmt.o
|
|||||||
obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o
|
obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o
|
||||||
obj-$(CONFIG_MACH_SMARTQ5) += mach-smartq5.o
|
obj-$(CONFIG_MACH_SMARTQ5) += mach-smartq5.o
|
||||||
obj-$(CONFIG_MACH_SMARTQ7) += mach-smartq7.o
|
obj-$(CONFIG_MACH_SMARTQ7) += mach-smartq7.o
|
||||||
|
obj-$(CONFIG_MACH_WLF_CRAGG_6410) += mach-crag6410.o
|
||||||
|
|
||||||
# device support
|
# device support
|
||||||
|
|
||||||
|
@ -88,6 +88,7 @@ static struct s3c64xx_spi_info s3c64xx_spi0_pdata = {
|
|||||||
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -132,6 +133,7 @@ static struct s3c64xx_spi_info s3c64xx_spi1_pdata = {
|
|||||||
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s3c64xx_device_spi1 = {
|
struct platform_device s3c64xx_device_spi1 = {
|
||||||
|
@ -198,7 +198,9 @@
|
|||||||
* interrupt controllers). */
|
* interrupt controllers). */
|
||||||
#define IRQ_BOARD_START (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1)
|
#define IRQ_BOARD_START (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1)
|
||||||
|
|
||||||
#ifdef CONFIG_SMDK6410_WM1190_EV1
|
#ifdef CONFIG_MACH_WLF_CRAGG_6410
|
||||||
|
#define IRQ_BOARD_NR 128
|
||||||
|
#elif defined(CONFIG_SMDK6410_WM1190_EV1)
|
||||||
#define IRQ_BOARD_NR 64
|
#define IRQ_BOARD_NR 64
|
||||||
#elif defined(CONFIG_SMDK6410_WM1192_EV1)
|
#elif defined(CONFIG_SMDK6410_WM1192_EV1)
|
||||||
#define IRQ_BOARD_NR 64
|
#define IRQ_BOARD_NR 64
|
||||||
|
774
arch/arm/mach-s3c64xx/mach-crag6410.c
Normal file
774
arch/arm/mach-s3c64xx/mach-crag6410.c
Normal file
@ -0,0 +1,774 @@
|
|||||||
|
/* linux/arch/arm/mach-s3c64xx/mach-crag6410.c
|
||||||
|
*
|
||||||
|
* Copyright 2011 Wolfson Microelectronics plc
|
||||||
|
* Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||||
|
*
|
||||||
|
* Copyright 2011 Simtec Electronics
|
||||||
|
* Ben Dooks <ben@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/serial_core.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/fb.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/regulator/machine.h>
|
||||||
|
#include <linux/regulator/fixed.h>
|
||||||
|
#include <linux/pwm_backlight.h>
|
||||||
|
#include <linux/dm9000.h>
|
||||||
|
#include <linux/gpio_keys.h>
|
||||||
|
#include <linux/basic_mmio_gpio.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
|
||||||
|
#include <linux/i2c/pca953x.h>
|
||||||
|
|
||||||
|
#include <video/platform_lcd.h>
|
||||||
|
|
||||||
|
#include <linux/mfd/wm831x/core.h>
|
||||||
|
#include <linux/mfd/wm831x/pdata.h>
|
||||||
|
#include <linux/mfd/wm831x/irq.h>
|
||||||
|
#include <linux/mfd/wm831x/gpio.h>
|
||||||
|
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
|
#include <mach/map.h>
|
||||||
|
|
||||||
|
#include <mach/s3c6410.h>
|
||||||
|
#include <mach/regs-sys.h>
|
||||||
|
#include <mach/regs-gpio.h>
|
||||||
|
#include <mach/regs-modem.h>
|
||||||
|
|
||||||
|
#include <mach/regs-gpio-memport.h>
|
||||||
|
|
||||||
|
#include <plat/regs-serial.h>
|
||||||
|
#include <plat/regs-fb-v4.h>
|
||||||
|
#include <plat/fb.h>
|
||||||
|
#include <plat/sdhci.h>
|
||||||
|
#include <plat/gpio-cfg.h>
|
||||||
|
#include <plat/s3c64xx-spi.h>
|
||||||
|
|
||||||
|
#include <plat/keypad.h>
|
||||||
|
#include <plat/clock.h>
|
||||||
|
#include <plat/devs.h>
|
||||||
|
#include <plat/cpu.h>
|
||||||
|
#include <plat/adc.h>
|
||||||
|
#include <plat/iic.h>
|
||||||
|
#include <plat/pm.h>
|
||||||
|
|
||||||
|
#include <sound/wm8915.h>
|
||||||
|
#include <sound/wm8962.h>
|
||||||
|
#include <sound/wm9081.h>
|
||||||
|
|
||||||
|
#define BANFF_PMIC_IRQ_BASE IRQ_BOARD_START
|
||||||
|
#define GLENFARCLAS_PMIC_IRQ_BASE (IRQ_BOARD_START + 64)
|
||||||
|
|
||||||
|
#define PCA935X_GPIO_BASE GPIO_BOARD_START
|
||||||
|
#define CODEC_GPIO_BASE (GPIO_BOARD_START + 8)
|
||||||
|
#define GLENFARCLAS_PMIC_GPIO_BASE (GPIO_BOARD_START + 16)
|
||||||
|
|
||||||
|
/* serial port setup */
|
||||||
|
|
||||||
|
#define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK)
|
||||||
|
#define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
|
||||||
|
#define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
|
||||||
|
|
||||||
|
static struct s3c2410_uartcfg crag6410_uartcfgs[] __initdata = {
|
||||||
|
[0] = {
|
||||||
|
.hwport = 0,
|
||||||
|
.flags = 0,
|
||||||
|
.ucon = UCON,
|
||||||
|
.ulcon = ULCON,
|
||||||
|
.ufcon = UFCON,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.hwport = 1,
|
||||||
|
.flags = 0,
|
||||||
|
.ucon = UCON,
|
||||||
|
.ulcon = ULCON,
|
||||||
|
.ufcon = UFCON,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.hwport = 2,
|
||||||
|
.flags = 0,
|
||||||
|
.ucon = UCON,
|
||||||
|
.ulcon = ULCON,
|
||||||
|
.ufcon = UFCON,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.hwport = 3,
|
||||||
|
.flags = 0,
|
||||||
|
.ucon = UCON,
|
||||||
|
.ulcon = ULCON,
|
||||||
|
.ufcon = UFCON,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_pwm_backlight_data crag6410_backlight_data = {
|
||||||
|
.pwm_id = 0,
|
||||||
|
.max_brightness = 1000,
|
||||||
|
.dft_brightness = 600,
|
||||||
|
.pwm_period_ns = 100000, /* about 1kHz */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device crag6410_backlight_device = {
|
||||||
|
.name = "pwm-backlight",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.parent = &s3c_device_timer[0].dev,
|
||||||
|
.platform_data = &crag6410_backlight_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void crag6410_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
|
||||||
|
{
|
||||||
|
pr_debug("%s: setting power %d\n", __func__, power);
|
||||||
|
|
||||||
|
if (power) {
|
||||||
|
gpio_set_value(S3C64XX_GPB(0), 1);
|
||||||
|
msleep(1);
|
||||||
|
s3c_gpio_cfgpin(S3C64XX_GPF(14), S3C_GPIO_SFN(2));
|
||||||
|
} else {
|
||||||
|
gpio_direction_output(S3C64XX_GPF(14), 0);
|
||||||
|
gpio_set_value(S3C64XX_GPB(0), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_device crag6410_lcd_powerdev = {
|
||||||
|
.name = "platform-lcd",
|
||||||
|
.id = -1,
|
||||||
|
.dev.parent = &s3c_device_fb.dev,
|
||||||
|
.dev.platform_data = &(struct plat_lcd_data) {
|
||||||
|
.set_power = crag6410_lcd_power_set,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 640x480 URT */
|
||||||
|
static struct s3c_fb_pd_win crag6410_fb_win0 = {
|
||||||
|
/* this is to ensure we use win0 */
|
||||||
|
.win_mode = {
|
||||||
|
.left_margin = 150,
|
||||||
|
.right_margin = 80,
|
||||||
|
.upper_margin = 40,
|
||||||
|
.lower_margin = 5,
|
||||||
|
.hsync_len = 40,
|
||||||
|
.vsync_len = 5,
|
||||||
|
.xres = 640,
|
||||||
|
.yres = 480,
|
||||||
|
},
|
||||||
|
.max_bpp = 32,
|
||||||
|
.default_bpp = 16,
|
||||||
|
.virtual_y = 480 * 2,
|
||||||
|
.virtual_x = 640,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */
|
||||||
|
static struct s3c_fb_platdata crag6410_lcd_pdata __initdata = {
|
||||||
|
.setup_gpio = s3c64xx_fb_gpio_setup_24bpp,
|
||||||
|
.win[0] = &crag6410_fb_win0,
|
||||||
|
.vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
|
||||||
|
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 2x6 keypad */
|
||||||
|
|
||||||
|
static uint32_t crag6410_keymap[] __initdata = {
|
||||||
|
/* KEY(row, col, keycode) */
|
||||||
|
KEY(0, 0, KEY_VOLUMEUP),
|
||||||
|
KEY(0, 1, KEY_HOME),
|
||||||
|
KEY(0, 2, KEY_VOLUMEDOWN),
|
||||||
|
KEY(0, 3, KEY_HELP),
|
||||||
|
KEY(0, 4, KEY_MENU),
|
||||||
|
KEY(0, 5, KEY_MEDIA),
|
||||||
|
KEY(1, 0, 232),
|
||||||
|
KEY(1, 1, KEY_DOWN),
|
||||||
|
KEY(1, 2, KEY_LEFT),
|
||||||
|
KEY(1, 3, KEY_UP),
|
||||||
|
KEY(1, 4, KEY_RIGHT),
|
||||||
|
KEY(1, 5, KEY_CAMERA),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct matrix_keymap_data crag6410_keymap_data __initdata = {
|
||||||
|
.keymap = crag6410_keymap,
|
||||||
|
.keymap_size = ARRAY_SIZE(crag6410_keymap),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct samsung_keypad_platdata crag6410_keypad_data __initdata = {
|
||||||
|
.keymap_data = &crag6410_keymap_data,
|
||||||
|
.rows = 2,
|
||||||
|
.cols = 6,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_keys_button crag6410_gpio_keys[] = {
|
||||||
|
[0] = {
|
||||||
|
.code = KEY_SUSPEND,
|
||||||
|
.gpio = S3C64XX_GPL(10), /* EINT 18 */
|
||||||
|
.type = EV_KEY,
|
||||||
|
.wakeup = 1,
|
||||||
|
.active_low = 1,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.code = SW_FRONT_PROXIMITY,
|
||||||
|
.gpio = S3C64XX_GPN(11), /* EINT 11 */
|
||||||
|
.type = EV_SW,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_keys_platform_data crag6410_gpio_keydata = {
|
||||||
|
.buttons = crag6410_gpio_keys,
|
||||||
|
.nbuttons = ARRAY_SIZE(crag6410_gpio_keys),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device crag6410_gpio_keydev = {
|
||||||
|
.name = "gpio-keys",
|
||||||
|
.id = 0,
|
||||||
|
.dev.platform_data = &crag6410_gpio_keydata,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource crag6410_dm9k_resource[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = S3C64XX_PA_XM0CSN5,
|
||||||
|
.end = S3C64XX_PA_XM0CSN5 + 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = S3C64XX_PA_XM0CSN5 + (1 << 8),
|
||||||
|
.end = S3C64XX_PA_XM0CSN5 + (1 << 8) + 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = S3C_EINT(17),
|
||||||
|
.end = S3C_EINT(17),
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct dm9000_plat_data mini6410_dm9k_pdata = {
|
||||||
|
.flags = DM9000_PLATF_16BITONLY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device crag6410_dm9k_device = {
|
||||||
|
.name = "dm9000",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(crag6410_dm9k_resource),
|
||||||
|
.resource = crag6410_dm9k_resource,
|
||||||
|
.dev.platform_data = &mini6410_dm9k_pdata,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource crag6410_mmgpio_resource[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = S3C64XX_PA_XM0CSN4 + 1,
|
||||||
|
.end = S3C64XX_PA_XM0CSN4 + 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device crag6410_mmgpio = {
|
||||||
|
.name = "basic-mmio-gpio",
|
||||||
|
.id = -1,
|
||||||
|
.resource = crag6410_mmgpio_resource,
|
||||||
|
.num_resources = ARRAY_SIZE(crag6410_mmgpio_resource),
|
||||||
|
.dev.platform_data = &(struct bgpio_pdata) {
|
||||||
|
.base = -1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device speyside_device = {
|
||||||
|
.name = "speyside",
|
||||||
|
.id = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device speyside_wm8962_device = {
|
||||||
|
.name = "speyside-wm8962",
|
||||||
|
.id = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_consumer_supply wallvdd_consumers[] = {
|
||||||
|
REGULATOR_SUPPLY("SPKVDD1", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("SPKVDD2", "1-001a"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data wallvdd_data = {
|
||||||
|
.constraints = {
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.num_consumer_supplies = ARRAY_SIZE(wallvdd_consumers),
|
||||||
|
.consumer_supplies = wallvdd_consumers,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct fixed_voltage_config wallvdd_pdata = {
|
||||||
|
.supply_name = "WALLVDD",
|
||||||
|
.microvolts = 5000000,
|
||||||
|
.init_data = &wallvdd_data,
|
||||||
|
.gpio = -EINVAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device wallvdd_device = {
|
||||||
|
.name = "reg-fixed-voltage",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &wallvdd_pdata,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device *crag6410_devices[] __initdata = {
|
||||||
|
&s3c_device_hsmmc0,
|
||||||
|
&s3c_device_hsmmc1,
|
||||||
|
&s3c_device_hsmmc2,
|
||||||
|
&s3c_device_i2c0,
|
||||||
|
&s3c_device_i2c1,
|
||||||
|
&s3c_device_fb,
|
||||||
|
&s3c_device_ohci,
|
||||||
|
&s3c_device_usb_hsotg,
|
||||||
|
&s3c_device_adc,
|
||||||
|
&s3c_device_rtc,
|
||||||
|
&s3c_device_ts,
|
||||||
|
&s3c_device_timer[0],
|
||||||
|
&s3c64xx_device_iis0,
|
||||||
|
&s3c64xx_device_iis1,
|
||||||
|
&samsung_asoc_dma,
|
||||||
|
&samsung_device_keypad,
|
||||||
|
&crag6410_gpio_keydev,
|
||||||
|
&crag6410_dm9k_device,
|
||||||
|
&s3c64xx_device_spi0,
|
||||||
|
&crag6410_mmgpio,
|
||||||
|
&crag6410_lcd_powerdev,
|
||||||
|
&crag6410_backlight_device,
|
||||||
|
&speyside_device,
|
||||||
|
&speyside_wm8962_device,
|
||||||
|
&wallvdd_device,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pca953x_platform_data crag6410_pca_data = {
|
||||||
|
.gpio_base = PCA935X_GPIO_BASE,
|
||||||
|
.irq_base = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_consumer_supply vddarm_consumers[] __initdata = {
|
||||||
|
REGULATOR_SUPPLY("vddarm", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddarm __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDARM",
|
||||||
|
.min_uV = 1000000,
|
||||||
|
.max_uV = 1300000,
|
||||||
|
.always_on = 1,
|
||||||
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||||
|
},
|
||||||
|
.num_consumer_supplies = ARRAY_SIZE(vddarm_consumers),
|
||||||
|
.consumer_supplies = vddarm_consumers,
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddint __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDINT",
|
||||||
|
.min_uV = 1000000,
|
||||||
|
.max_uV = 1200000,
|
||||||
|
.always_on = 1,
|
||||||
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddmem __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDMEM",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddsys __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_consumer_supply vddmmc_consumers[] __initdata = {
|
||||||
|
REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
|
||||||
|
REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),
|
||||||
|
REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddmmc __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDMMC,UH",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.num_consumer_supplies = ARRAY_SIZE(vddmmc_consumers),
|
||||||
|
.consumer_supplies = vddmmc_consumers,
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddotgi __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDOTGi",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddotg __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDOTG",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddhi __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDHI",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddadc __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDADC,VDDDAC",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddmem0 __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDMEM0",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddpll __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDPLL",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddlcd __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDLCD",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data vddalive __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "VDDALIVE",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
.supply_regulator = "WALLVDD",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_backup_pdata banff_backup_pdata __initdata = {
|
||||||
|
.charger_enable = 1,
|
||||||
|
.vlim = 2500, /* mV */
|
||||||
|
.ilim = 200, /* uA */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_status_pdata banff_red_led __initdata = {
|
||||||
|
.name = "banff:red:",
|
||||||
|
.default_src = WM831X_STATUS_MANUAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_status_pdata banff_green_led __initdata = {
|
||||||
|
.name = "banff:green:",
|
||||||
|
.default_src = WM831X_STATUS_MANUAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_touch_pdata touch_pdata __initdata = {
|
||||||
|
.data_irq = S3C_EINT(26),
|
||||||
|
.pd_irq = S3C_EINT(27),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_pdata crag_pmic_pdata __initdata = {
|
||||||
|
.wm831x_num = 1,
|
||||||
|
.irq_base = BANFF_PMIC_IRQ_BASE,
|
||||||
|
.gpio_base = GPIO_BOARD_START + 8,
|
||||||
|
|
||||||
|
.backup = &banff_backup_pdata,
|
||||||
|
|
||||||
|
.gpio_defaults = {
|
||||||
|
/* GPIO11: Touchscreen data - CMOS, DBVDD, active high*/
|
||||||
|
[10] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x6,
|
||||||
|
/* GPIO12: Touchscreen pen down - CMOS, DBVDD, active high*/
|
||||||
|
[11] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x7,
|
||||||
|
},
|
||||||
|
|
||||||
|
.dcdc = {
|
||||||
|
&vddarm, /* DCDC1 */
|
||||||
|
&vddint, /* DCDC2 */
|
||||||
|
&vddmem, /* DCDC3 */
|
||||||
|
},
|
||||||
|
|
||||||
|
.ldo = {
|
||||||
|
&vddsys, /* LDO1 */
|
||||||
|
&vddmmc, /* LDO2 */
|
||||||
|
NULL, /* LDO3 */
|
||||||
|
&vddotgi, /* LDO4 */
|
||||||
|
&vddotg, /* LDO5 */
|
||||||
|
&vddhi, /* LDO6 */
|
||||||
|
&vddadc, /* LDO7 */
|
||||||
|
&vddmem0, /* LDO8 */
|
||||||
|
&vddpll, /* LDO9 */
|
||||||
|
&vddlcd, /* LDO10 */
|
||||||
|
&vddalive, /* LDO11 */
|
||||||
|
},
|
||||||
|
|
||||||
|
.status = {
|
||||||
|
&banff_green_led,
|
||||||
|
&banff_red_led,
|
||||||
|
},
|
||||||
|
|
||||||
|
.touch = &touch_pdata,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info i2c_devs0[] __initdata = {
|
||||||
|
{ I2C_BOARD_INFO("24c08", 0x50), },
|
||||||
|
{ I2C_BOARD_INFO("tca6408", 0x20),
|
||||||
|
.platform_data = &crag6410_pca_data,
|
||||||
|
},
|
||||||
|
{ I2C_BOARD_INFO("wm8312", 0x34),
|
||||||
|
.platform_data = &crag_pmic_pdata,
|
||||||
|
.irq = S3C_EINT(23),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct s3c2410_platform_i2c i2c0_pdata = {
|
||||||
|
.frequency = 400000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data pvdd_1v2 __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "PVDD_1V2",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = {
|
||||||
|
REGULATOR_SUPPLY("PLLVDD", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("DBVDD", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("CPVDD", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("AVDD2", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("DCVDD", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("AVDD", "1-001a"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data pvdd_1v8 __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "PVDD_1V8",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
|
||||||
|
.consumer_supplies = pvdd_1v8_consumers,
|
||||||
|
.num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_consumer_supply pvdd_3v3_consumers[] __initdata = {
|
||||||
|
REGULATOR_SUPPLY("MICVDD", "1-001a"),
|
||||||
|
REGULATOR_SUPPLY("AVDD1", "1-001a"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regulator_init_data pvdd_3v3 __initdata = {
|
||||||
|
.constraints = {
|
||||||
|
.name = "PVDD_3V3",
|
||||||
|
.always_on = 1,
|
||||||
|
},
|
||||||
|
|
||||||
|
.consumer_supplies = pvdd_3v3_consumers,
|
||||||
|
.num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = {
|
||||||
|
.wm831x_num = 2,
|
||||||
|
.irq_base = GLENFARCLAS_PMIC_IRQ_BASE,
|
||||||
|
.gpio_base = GLENFARCLAS_PMIC_GPIO_BASE,
|
||||||
|
|
||||||
|
.gpio_defaults = {
|
||||||
|
/* GPIO1-3: IRQ inputs, rising edge triggered, CMOS */
|
||||||
|
[0] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
|
||||||
|
[1] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
|
||||||
|
[2] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
|
||||||
|
},
|
||||||
|
|
||||||
|
.dcdc = {
|
||||||
|
&pvdd_1v2, /* DCDC1 */
|
||||||
|
&pvdd_1v8, /* DCDC2 */
|
||||||
|
&pvdd_3v3, /* DCDC3 */
|
||||||
|
},
|
||||||
|
|
||||||
|
.disable_touch = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm8915_retune_mobile_config wm8915_retune[] = {
|
||||||
|
{
|
||||||
|
.name = "Sub LPF",
|
||||||
|
.rate = 48000,
|
||||||
|
.regs = {
|
||||||
|
0x6318, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000,
|
||||||
|
0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000,
|
||||||
|
0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "Sub HPF",
|
||||||
|
.rate = 48000,
|
||||||
|
.regs = {
|
||||||
|
0x000A, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000,
|
||||||
|
0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000,
|
||||||
|
0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm8915_pdata wm8915_pdata __initdata = {
|
||||||
|
.ldo_ena = S3C64XX_GPN(7),
|
||||||
|
.gpio_base = CODEC_GPIO_BASE,
|
||||||
|
.micdet_def = 1,
|
||||||
|
.inl_mode = WM8915_DIFFERRENTIAL_1,
|
||||||
|
.inr_mode = WM8915_DIFFERRENTIAL_1,
|
||||||
|
|
||||||
|
.irq_flags = IRQF_TRIGGER_RISING,
|
||||||
|
|
||||||
|
.gpio_default = {
|
||||||
|
0x8001, /* GPIO1 == ADCLRCLK1 */
|
||||||
|
0x8001, /* GPIO2 == ADCLRCLK2, input due to CPU */
|
||||||
|
0x0141, /* GPIO3 == HP_SEL */
|
||||||
|
0x0002, /* GPIO4 == IRQ */
|
||||||
|
0x020e, /* GPIO5 == CLKOUT */
|
||||||
|
},
|
||||||
|
|
||||||
|
.retune_mobile_cfgs = wm8915_retune,
|
||||||
|
.num_retune_mobile_cfgs = ARRAY_SIZE(wm8915_retune),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm8962_pdata wm8962_pdata __initdata = {
|
||||||
|
.gpio_init = {
|
||||||
|
0,
|
||||||
|
WM8962_GPIO_FN_OPCLK,
|
||||||
|
WM8962_GPIO_FN_DMICCLK,
|
||||||
|
0,
|
||||||
|
0x8000 | WM8962_GPIO_FN_DMICDAT,
|
||||||
|
WM8962_GPIO_FN_IRQ, /* Open drain mode */
|
||||||
|
},
|
||||||
|
.irq_active_low = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct wm9081_pdata wm9081_pdata __initdata = {
|
||||||
|
.irq_high = false,
|
||||||
|
.irq_cmos = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info i2c_devs1[] __initdata = {
|
||||||
|
{ I2C_BOARD_INFO("wm8311", 0x34),
|
||||||
|
.irq = S3C_EINT(0),
|
||||||
|
.platform_data = &glenfarclas_pmic_pdata },
|
||||||
|
|
||||||
|
{ I2C_BOARD_INFO("wm1250-ev1", 0x27) },
|
||||||
|
{ I2C_BOARD_INFO("wm8915", 0x1a),
|
||||||
|
.platform_data = &wm8915_pdata,
|
||||||
|
.irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
|
||||||
|
},
|
||||||
|
{ I2C_BOARD_INFO("wm9081", 0x6c),
|
||||||
|
.platform_data = &wm9081_pdata, },
|
||||||
|
{ I2C_BOARD_INFO("wm8962", 0x1a),
|
||||||
|
.platform_data = &wm8962_pdata,
|
||||||
|
.irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init crag6410_map_io(void)
|
||||||
|
{
|
||||||
|
s3c64xx_init_io(NULL, 0);
|
||||||
|
s3c24xx_init_clocks(12000000);
|
||||||
|
s3c24xx_init_uarts(crag6410_uartcfgs, ARRAY_SIZE(crag6410_uartcfgs));
|
||||||
|
|
||||||
|
/* LCD type and Bypass set by bootloader */
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct s3c_sdhci_platdata crag6410_hsmmc2_pdata = {
|
||||||
|
.max_width = 4,
|
||||||
|
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct s3c_sdhci_platdata crag6410_hsmmc1_pdata = {
|
||||||
|
.max_width = 4,
|
||||||
|
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||||
|
.ext_cd_gpio = S3C64XX_GPF(11),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void crag6410_cfg_sdhci0(struct platform_device *dev, int width)
|
||||||
|
{
|
||||||
|
/* Set all the necessary GPG pins to special-function 2 */
|
||||||
|
s3c_gpio_cfgrange_nopull(S3C64XX_GPG(0), 2 + width, S3C_GPIO_SFN(2));
|
||||||
|
|
||||||
|
/* force card-detected for prototype 0 */
|
||||||
|
s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = {
|
||||||
|
.max_width = 4,
|
||||||
|
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||||
|
.cfg_gpio = crag6410_cfg_sdhci0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init crag6410_machine_init(void)
|
||||||
|
{
|
||||||
|
/* Open drain IRQs need pullups */
|
||||||
|
s3c_gpio_setpull(S3C64XX_GPM(0), S3C_GPIO_PULL_UP);
|
||||||
|
s3c_gpio_setpull(S3C64XX_GPN(0), S3C_GPIO_PULL_UP);
|
||||||
|
|
||||||
|
gpio_request(S3C64XX_GPB(0), "LCD power");
|
||||||
|
gpio_direction_output(S3C64XX_GPB(0), 0);
|
||||||
|
|
||||||
|
gpio_request(S3C64XX_GPF(14), "LCD PWM");
|
||||||
|
gpio_direction_output(S3C64XX_GPF(14), 0); /* turn off */
|
||||||
|
|
||||||
|
gpio_request(S3C64XX_GPB(1), "SD power");
|
||||||
|
gpio_direction_output(S3C64XX_GPB(1), 0);
|
||||||
|
|
||||||
|
gpio_request(S3C64XX_GPF(10), "nRESETSEL");
|
||||||
|
gpio_direction_output(S3C64XX_GPF(10), 1);
|
||||||
|
|
||||||
|
s3c_sdhci0_set_platdata(&crag6410_hsmmc0_pdata);
|
||||||
|
s3c_sdhci1_set_platdata(&crag6410_hsmmc1_pdata);
|
||||||
|
s3c_sdhci2_set_platdata(&crag6410_hsmmc2_pdata);
|
||||||
|
|
||||||
|
s3c_i2c0_set_platdata(&i2c0_pdata);
|
||||||
|
s3c_i2c1_set_platdata(NULL);
|
||||||
|
s3c_fb_set_platdata(&crag6410_lcd_pdata);
|
||||||
|
|
||||||
|
i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
|
||||||
|
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
|
||||||
|
|
||||||
|
samsung_keypad_set_platdata(&crag6410_keypad_data);
|
||||||
|
|
||||||
|
platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices));
|
||||||
|
|
||||||
|
regulator_has_full_constraints();
|
||||||
|
|
||||||
|
s3c_pm_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")
|
||||||
|
/* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */
|
||||||
|
.boot_params = S3C64XX_PA_SDRAM + 0x100,
|
||||||
|
.init_irq = s3c6410_init_irq,
|
||||||
|
.map_io = crag6410_map_io,
|
||||||
|
.init_machine = crag6410_machine_init,
|
||||||
|
.timer = &s3c24xx_timer,
|
||||||
|
MACHINE_END
|
@ -112,12 +112,14 @@ static struct s3c64xx_spi_info s5p6440_spi0_pdata = {
|
|||||||
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c64xx_spi_info s5p6450_spi0_pdata = {
|
static struct s3c64xx_spi_info s5p6450_spi0_pdata = {
|
||||||
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -160,12 +162,14 @@ static struct s3c64xx_spi_info s5p6440_spi1_pdata = {
|
|||||||
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c64xx_spi_info s5p6450_spi1_pdata = {
|
static struct s3c64xx_spi_info s5p6450_spi1_pdata = {
|
||||||
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5p64x0_device_spi1 = {
|
struct platform_device s5p64x0_device_spi1 = {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <mach/dma.h>
|
#include <mach/dma.h>
|
||||||
#include <mach/map.h>
|
#include <mach/map.h>
|
||||||
#include <mach/spi-clocks.h>
|
#include <mach/spi-clocks.h>
|
||||||
|
#include <mach/irqs.h>
|
||||||
|
|
||||||
#include <plat/s3c64xx-spi.h>
|
#include <plat/s3c64xx-spi.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
@ -90,6 +91,7 @@ static struct s3c64xx_spi_info s5pc100_spi0_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -134,6 +136,7 @@ static struct s3c64xx_spi_info s5pc100_spi1_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pc100_device_spi1 = {
|
struct platform_device s5pc100_device_spi1 = {
|
||||||
@ -176,6 +179,7 @@ static struct s3c64xx_spi_info s5pc100_spi2_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pc100_device_spi2 = {
|
struct platform_device s5pc100_device_spi2 = {
|
||||||
|
@ -85,6 +85,7 @@ static struct s3c64xx_spi_info s5pv210_spi0_pdata = {
|
|||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -129,6 +130,7 @@ static struct s3c64xx_spi_info s5pv210_spi1_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pv210_device_spi1 = {
|
struct platform_device s5pv210_device_spi1 = {
|
||||||
|
@ -39,9 +39,10 @@
|
|||||||
static void __iomem *ic_regbase;
|
static void __iomem *ic_regbase;
|
||||||
static void __iomem *sic_regbase;
|
static void __iomem *sic_regbase;
|
||||||
|
|
||||||
static void vt8500_irq_mask(unsigned int irq)
|
static void vt8500_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
|
unsigned irq = d->irq;
|
||||||
u8 edge;
|
u8 edge;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -64,9 +65,10 @@ static void vt8500_irq_mask(unsigned int irq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vt8500_irq_unmask(unsigned int irq)
|
static void vt8500_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
|
unsigned irq = d->irq;
|
||||||
u8 dctr;
|
u8 dctr;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -78,10 +80,11 @@ static void vt8500_irq_unmask(unsigned int irq)
|
|||||||
writeb(dctr, base + VT8500_IC_DCTR + irq);
|
writeb(dctr, base + VT8500_IC_DCTR + irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type)
|
static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
unsigned int orig_irq = irq;
|
unsigned irq = d->irq;
|
||||||
|
unsigned orig_irq = irq;
|
||||||
u8 dctr;
|
u8 dctr;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -115,10 +118,10 @@ static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type)
|
|||||||
|
|
||||||
static struct irq_chip vt8500_irq_chip = {
|
static struct irq_chip vt8500_irq_chip = {
|
||||||
.name = "vt8500",
|
.name = "vt8500",
|
||||||
.ack = vt8500_irq_mask,
|
.irq_ack = vt8500_irq_mask,
|
||||||
.mask = vt8500_irq_mask,
|
.irq_mask = vt8500_irq_mask,
|
||||||
.unmask = vt8500_irq_unmask,
|
.irq_unmask = vt8500_irq_unmask,
|
||||||
.set_type = vt8500_irq_set_type,
|
.irq_set_type = vt8500_irq_set_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init vt8500_init_irq(void)
|
void __init vt8500_init_irq(void)
|
||||||
|
@ -120,17 +120,22 @@ static void l2x0_cache_sync(void)
|
|||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __l2x0_flush_all(void)
|
||||||
|
{
|
||||||
|
debug_writel(0x03);
|
||||||
|
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY);
|
||||||
|
cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask);
|
||||||
|
cache_sync();
|
||||||
|
debug_writel(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
static void l2x0_flush_all(void)
|
static void l2x0_flush_all(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* clean all ways */
|
/* clean all ways */
|
||||||
spin_lock_irqsave(&l2x0_lock, flags);
|
spin_lock_irqsave(&l2x0_lock, flags);
|
||||||
debug_writel(0x03);
|
__l2x0_flush_all();
|
||||||
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY);
|
|
||||||
cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask);
|
|
||||||
cache_sync();
|
|
||||||
debug_writel(0x00);
|
|
||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +271,9 @@ static void l2x0_disable(void)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&l2x0_lock, flags);
|
spin_lock_irqsave(&l2x0_lock, flags);
|
||||||
writel(0, l2x0_base + L2X0_CTRL);
|
__l2x0_flush_all();
|
||||||
|
writel_relaxed(0, l2x0_base + L2X0_CTRL);
|
||||||
|
dsb();
|
||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -759,7 +759,7 @@ early_param("vmalloc", early_vmalloc);
|
|||||||
|
|
||||||
static phys_addr_t lowmem_limit __initdata = 0;
|
static phys_addr_t lowmem_limit __initdata = 0;
|
||||||
|
|
||||||
static void __init sanity_check_meminfo(void)
|
void __init sanity_check_meminfo(void)
|
||||||
{
|
{
|
||||||
int i, j, highmem = 0;
|
int i, j, highmem = 0;
|
||||||
|
|
||||||
@ -1032,8 +1032,9 @@ void __init paging_init(struct machine_desc *mdesc)
|
|||||||
{
|
{
|
||||||
void *zero_page;
|
void *zero_page;
|
||||||
|
|
||||||
|
memblock_set_current_limit(lowmem_limit);
|
||||||
|
|
||||||
build_mem_type_table();
|
build_mem_type_table();
|
||||||
sanity_check_meminfo();
|
|
||||||
prepare_page_table();
|
prepare_page_table();
|
||||||
map_lowmem();
|
map_lowmem();
|
||||||
devicemaps_init(mdesc);
|
devicemaps_init(mdesc);
|
||||||
|
@ -27,6 +27,10 @@ void __init arm_mm_memblock_reserve(void)
|
|||||||
memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
|
memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init sanity_check_meminfo(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* paging_init() sets up the page tables, initialises the zone memory
|
* paging_init() sets up the page tables, initialises the zone memory
|
||||||
* maps, and sets up the zero page, bad page and bad page tables.
|
* maps, and sets up the zero page, bad page and bad page tables.
|
||||||
|
@ -1027,17 +1027,13 @@ int s3c2410_dma_config(unsigned int channel,
|
|||||||
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
unsigned int dcon;
|
unsigned int dcon;
|
||||||
|
|
||||||
pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n",
|
pr_debug("%s: chan=%d, xfer_unit=%d\n", __func__, channel, xferunit);
|
||||||
__func__, channel, xferunit, dcon);
|
|
||||||
|
|
||||||
if (chan == NULL)
|
if (chan == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pr_debug("%s: Initial dcon is %08x\n", __func__, dcon);
|
|
||||||
|
|
||||||
dcon = chan->dcon & dma_sel.dcon_mask;
|
dcon = chan->dcon & dma_sel.dcon_mask;
|
||||||
|
pr_debug("%s: dcon is %08x\n", __func__, dcon);
|
||||||
pr_debug("%s: New dcon is %08x\n", __func__, dcon);
|
|
||||||
|
|
||||||
switch (chan->req_ch) {
|
switch (chan->req_ch) {
|
||||||
case DMACH_I2S_IN:
|
case DMACH_I2S_IN:
|
||||||
@ -1235,7 +1231,7 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
|
|||||||
/* restore channel's hardware configuration */
|
/* restore channel's hardware configuration */
|
||||||
|
|
||||||
if (!cp->in_use)
|
if (!cp->in_use)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
||||||
|
|
||||||
@ -1246,8 +1242,6 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
|
|||||||
|
|
||||||
if (cp->map != NULL)
|
if (cp->map != NULL)
|
||||||
dma_sel.select(cp, cp->map);
|
dma_sel.select(cp, cp->map);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3c2410_dma_resume(void)
|
static void s3c2410_dma_resume(void)
|
||||||
|
@ -370,11 +370,11 @@ static void __init s5p_clocksource_init(void)
|
|||||||
|
|
||||||
clock_rate = clk_get_rate(tin_source);
|
clock_rate = clk_get_rate(tin_source);
|
||||||
|
|
||||||
init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate);
|
|
||||||
|
|
||||||
s5p_time_setup(timer_source.source_id, TCNT_MAX);
|
s5p_time_setup(timer_source.source_id, TCNT_MAX);
|
||||||
s5p_time_start(timer_source.source_id, PERIODIC);
|
s5p_time_start(timer_source.source_id, PERIODIC);
|
||||||
|
|
||||||
|
init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate);
|
||||||
|
|
||||||
if (clocksource_register_hz(&time_clocksource, clock_rate))
|
if (clocksource_register_hz(&time_clocksource, clock_rate))
|
||||||
panic("%s: can't register clocksource\n", time_clocksource.name);
|
panic("%s: can't register clocksource\n", time_clocksource.name);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __PLAT_DEVS_H
|
||||||
|
#define __PLAT_DEVS_H __FILE__
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
struct s3c24xx_uart_resources {
|
struct s3c24xx_uart_resources {
|
||||||
@ -159,3 +163,5 @@ extern struct platform_device s3c_device_ac97;
|
|||||||
*/
|
*/
|
||||||
extern void *s3c_set_platdata(void *pd, size_t pdsize,
|
extern void *s3c_set_platdata(void *pd, size_t pdsize,
|
||||||
struct platform_device *pdev);
|
struct platform_device *pdev);
|
||||||
|
|
||||||
|
#endif /* __PLAT_DEVS_H */
|
||||||
|
@ -39,6 +39,7 @@ struct s3c64xx_spi_csinfo {
|
|||||||
* @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6
|
* @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6
|
||||||
* @rx_lvl_offset: Depends on tx fifo_lvl field and bus number
|
* @rx_lvl_offset: Depends on tx fifo_lvl field and bus number
|
||||||
* @high_speed: If the controller supports HIGH_SPEED_EN bit
|
* @high_speed: If the controller supports HIGH_SPEED_EN bit
|
||||||
|
* @tx_st_done: Depends on tx fifo_lvl field
|
||||||
*/
|
*/
|
||||||
struct s3c64xx_spi_info {
|
struct s3c64xx_spi_info {
|
||||||
int src_clk_nr;
|
int src_clk_nr;
|
||||||
@ -53,6 +54,7 @@ struct s3c64xx_spi_info {
|
|||||||
int fifo_lvl_mask;
|
int fifo_lvl_mask;
|
||||||
int rx_lvl_offset;
|
int rx_lvl_offset;
|
||||||
int high_speed;
|
int high_speed;
|
||||||
|
int tx_st_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,6 +57,8 @@ static inline int pfn_valid(int pfn)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define early_pfn_valid(pfn) pfn_valid((pfn))
|
||||||
|
|
||||||
#endif /* CONFIG_DISCONTIGMEM */
|
#endif /* CONFIG_DISCONTIGMEM */
|
||||||
|
|
||||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||||
|
@ -28,6 +28,8 @@ pmode_cr3: .long 0 /* Saved %cr3 */
|
|||||||
pmode_cr4: .long 0 /* Saved %cr4 */
|
pmode_cr4: .long 0 /* Saved %cr4 */
|
||||||
pmode_efer: .quad 0 /* Saved EFER */
|
pmode_efer: .quad 0 /* Saved EFER */
|
||||||
pmode_gdt: .quad 0
|
pmode_gdt: .quad 0
|
||||||
|
pmode_misc_en: .quad 0 /* Saved MISC_ENABLE MSR */
|
||||||
|
pmode_behavior: .long 0 /* Wakeup behavior flags */
|
||||||
realmode_flags: .long 0
|
realmode_flags: .long 0
|
||||||
real_magic: .long 0
|
real_magic: .long 0
|
||||||
trampoline_segment: .word 0
|
trampoline_segment: .word 0
|
||||||
@ -91,6 +93,18 @@ wakeup_code:
|
|||||||
/* Call the C code */
|
/* Call the C code */
|
||||||
calll main
|
calll main
|
||||||
|
|
||||||
|
/* Restore MISC_ENABLE before entering protected mode, in case
|
||||||
|
BIOS decided to clear XD_DISABLE during S3. */
|
||||||
|
movl pmode_behavior, %eax
|
||||||
|
btl $WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %eax
|
||||||
|
jnc 1f
|
||||||
|
|
||||||
|
movl pmode_misc_en, %eax
|
||||||
|
movl pmode_misc_en + 4, %edx
|
||||||
|
movl $MSR_IA32_MISC_ENABLE, %ecx
|
||||||
|
wrmsr
|
||||||
|
1:
|
||||||
|
|
||||||
/* Do any other stuff... */
|
/* Do any other stuff... */
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
|
@ -21,6 +21,9 @@ struct wakeup_header {
|
|||||||
u32 pmode_efer_low; /* Protected mode EFER */
|
u32 pmode_efer_low; /* Protected mode EFER */
|
||||||
u32 pmode_efer_high;
|
u32 pmode_efer_high;
|
||||||
u64 pmode_gdt;
|
u64 pmode_gdt;
|
||||||
|
u32 pmode_misc_en_low; /* Protected mode MISC_ENABLE */
|
||||||
|
u32 pmode_misc_en_high;
|
||||||
|
u32 pmode_behavior; /* Wakeup routine behavior flags */
|
||||||
u32 realmode_flags;
|
u32 realmode_flags;
|
||||||
u32 real_magic;
|
u32 real_magic;
|
||||||
u16 trampoline_segment; /* segment with trampoline code, 64-bit only */
|
u16 trampoline_segment; /* segment with trampoline code, 64-bit only */
|
||||||
@ -39,4 +42,7 @@ extern struct wakeup_header wakeup_header;
|
|||||||
#define WAKEUP_HEADER_SIGNATURE 0x51ee1111
|
#define WAKEUP_HEADER_SIGNATURE 0x51ee1111
|
||||||
#define WAKEUP_END_SIGNATURE 0x65a22c82
|
#define WAKEUP_END_SIGNATURE 0x65a22c82
|
||||||
|
|
||||||
|
/* Wakeup behavior bits */
|
||||||
|
#define WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE 0
|
||||||
|
|
||||||
#endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
|
#endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
|
||||||
|
@ -77,6 +77,12 @@ int acpi_suspend_lowlevel(void)
|
|||||||
|
|
||||||
header->pmode_cr0 = read_cr0();
|
header->pmode_cr0 = read_cr0();
|
||||||
header->pmode_cr4 = read_cr4_safe();
|
header->pmode_cr4 = read_cr4_safe();
|
||||||
|
header->pmode_behavior = 0;
|
||||||
|
if (!rdmsr_safe(MSR_IA32_MISC_ENABLE,
|
||||||
|
&header->pmode_misc_en_low,
|
||||||
|
&header->pmode_misc_en_high))
|
||||||
|
header->pmode_behavior |=
|
||||||
|
(1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE);
|
||||||
header->realmode_flags = acpi_realmode_flags;
|
header->realmode_flags = acpi_realmode_flags;
|
||||||
header->real_magic = 0x12345678;
|
header->real_magic = 0x12345678;
|
||||||
|
|
||||||
|
@ -294,6 +294,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
|
DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{ /* Handle reboot issue on Acer Aspire one */
|
||||||
|
.callback = set_bios_reboot,
|
||||||
|
.ident = "Acer Aspire One A110",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy)
|
|||||||
static int nmi_start(void)
|
static int nmi_start(void)
|
||||||
{
|
{
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
on_each_cpu(nmi_cpu_start, NULL, 1);
|
|
||||||
ctr_running = 1;
|
ctr_running = 1;
|
||||||
|
/* make ctr_running visible to the nmi handler: */
|
||||||
|
smp_mb();
|
||||||
|
on_each_cpu(nmi_cpu_start, NULL, 1);
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -504,15 +506,18 @@ static int nmi_setup(void)
|
|||||||
|
|
||||||
nmi_enabled = 0;
|
nmi_enabled = 0;
|
||||||
ctr_running = 0;
|
ctr_running = 0;
|
||||||
barrier();
|
/* make variables visible to the nmi handler: */
|
||||||
|
smp_mb();
|
||||||
err = register_die_notifier(&profile_exceptions_nb);
|
err = register_die_notifier(&profile_exceptions_nb);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
register_cpu_notifier(&oprofile_cpu_nb);
|
register_cpu_notifier(&oprofile_cpu_nb);
|
||||||
on_each_cpu(nmi_cpu_setup, NULL, 1);
|
|
||||||
nmi_enabled = 1;
|
nmi_enabled = 1;
|
||||||
|
/* make nmi_enabled visible to the nmi handler: */
|
||||||
|
smp_mb();
|
||||||
|
on_each_cpu(nmi_cpu_setup, NULL, 1);
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -531,7 +536,8 @@ static void nmi_shutdown(void)
|
|||||||
nmi_enabled = 0;
|
nmi_enabled = 0;
|
||||||
ctr_running = 0;
|
ctr_running = 0;
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
barrier();
|
/* make variables visible to the nmi handler: */
|
||||||
|
smp_mb();
|
||||||
unregister_die_notifier(&profile_exceptions_nb);
|
unregister_die_notifier(&profile_exceptions_nb);
|
||||||
msrs = &get_cpu_var(cpu_msrs);
|
msrs = &get_cpu_var(cpu_msrs);
|
||||||
model->shutdown(msrs);
|
model->shutdown(msrs);
|
||||||
|
@ -327,13 +327,12 @@ int __init pci_xen_hvm_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_XEN_DOM0
|
#ifdef CONFIG_XEN_DOM0
|
||||||
static int xen_register_pirq(u32 gsi, int triggering)
|
static int xen_register_pirq(u32 gsi, int gsi_override, int triggering)
|
||||||
{
|
{
|
||||||
int rc, pirq, irq = -1;
|
int rc, pirq, irq = -1;
|
||||||
struct physdev_map_pirq map_irq;
|
struct physdev_map_pirq map_irq;
|
||||||
int shareable = 0;
|
int shareable = 0;
|
||||||
char *name;
|
char *name;
|
||||||
bool gsi_override = false;
|
|
||||||
|
|
||||||
if (!xen_pv_domain())
|
if (!xen_pv_domain())
|
||||||
return -1;
|
return -1;
|
||||||
@ -345,31 +344,12 @@ static int xen_register_pirq(u32 gsi, int triggering)
|
|||||||
shareable = 1;
|
shareable = 1;
|
||||||
name = "ioapic-level";
|
name = "ioapic-level";
|
||||||
}
|
}
|
||||||
|
|
||||||
pirq = xen_allocate_pirq_gsi(gsi);
|
pirq = xen_allocate_pirq_gsi(gsi);
|
||||||
if (pirq < 0)
|
if (pirq < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Before we bind the GSI to a Linux IRQ, check whether
|
if (gsi_override >= 0)
|
||||||
* we need to override it with bus_irq (IRQ) value. Usually for
|
irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name);
|
||||||
* IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so:
|
|
||||||
* ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)
|
|
||||||
* but there are oddballs where the IRQ != GSI:
|
|
||||||
* ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level)
|
|
||||||
* which ends up being: gsi_to_irq[9] == 20
|
|
||||||
* (which is what acpi_gsi_to_irq ends up calling when starting the
|
|
||||||
* the ACPI interpreter and keels over since IRQ 9 has not been
|
|
||||||
* setup as we had setup IRQ 20 for it).
|
|
||||||
*/
|
|
||||||
if (gsi == acpi_sci_override_gsi) {
|
|
||||||
/* Check whether the GSI != IRQ */
|
|
||||||
acpi_gsi_to_irq(gsi, &irq);
|
|
||||||
if (irq != gsi)
|
|
||||||
/* Bugger, we MUST have that IRQ. */
|
|
||||||
gsi_override = true;
|
|
||||||
}
|
|
||||||
if (gsi_override)
|
|
||||||
irq = xen_bind_pirq_gsi_to_irq(irq, pirq, shareable, name);
|
|
||||||
else
|
else
|
||||||
irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
|
irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
@ -392,7 +372,7 @@ out:
|
|||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xen_register_gsi(u32 gsi, int triggering, int polarity)
|
static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity)
|
||||||
{
|
{
|
||||||
int rc, irq;
|
int rc, irq;
|
||||||
struct physdev_setup_gsi setup_gsi;
|
struct physdev_setup_gsi setup_gsi;
|
||||||
@ -403,7 +383,7 @@ static int xen_register_gsi(u32 gsi, int triggering, int polarity)
|
|||||||
printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n",
|
printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n",
|
||||||
gsi, triggering, polarity);
|
gsi, triggering, polarity);
|
||||||
|
|
||||||
irq = xen_register_pirq(gsi, triggering);
|
irq = xen_register_pirq(gsi, gsi_override, triggering);
|
||||||
|
|
||||||
setup_gsi.gsi = gsi;
|
setup_gsi.gsi = gsi;
|
||||||
setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1);
|
setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1);
|
||||||
@ -425,6 +405,8 @@ static __init void xen_setup_acpi_sci(void)
|
|||||||
int rc;
|
int rc;
|
||||||
int trigger, polarity;
|
int trigger, polarity;
|
||||||
int gsi = acpi_sci_override_gsi;
|
int gsi = acpi_sci_override_gsi;
|
||||||
|
int irq = -1;
|
||||||
|
int gsi_override = -1;
|
||||||
|
|
||||||
if (!gsi)
|
if (!gsi)
|
||||||
return;
|
return;
|
||||||
@ -441,7 +423,25 @@ static __init void xen_setup_acpi_sci(void)
|
|||||||
printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d "
|
printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d "
|
||||||
"polarity=%d\n", gsi, trigger, polarity);
|
"polarity=%d\n", gsi, trigger, polarity);
|
||||||
|
|
||||||
gsi = xen_register_gsi(gsi, trigger, polarity);
|
/* Before we bind the GSI to a Linux IRQ, check whether
|
||||||
|
* we need to override it with bus_irq (IRQ) value. Usually for
|
||||||
|
* IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so:
|
||||||
|
* ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)
|
||||||
|
* but there are oddballs where the IRQ != GSI:
|
||||||
|
* ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level)
|
||||||
|
* which ends up being: gsi_to_irq[9] == 20
|
||||||
|
* (which is what acpi_gsi_to_irq ends up calling when starting the
|
||||||
|
* the ACPI interpreter and keels over since IRQ 9 has not been
|
||||||
|
* setup as we had setup IRQ 20 for it).
|
||||||
|
*/
|
||||||
|
/* Check whether the GSI != IRQ */
|
||||||
|
if (acpi_gsi_to_irq(gsi, &irq) == 0) {
|
||||||
|
if (irq >= 0 && irq != gsi)
|
||||||
|
/* Bugger, we MUST have that IRQ. */
|
||||||
|
gsi_override = irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity);
|
||||||
printk(KERN_INFO "xen: acpi sci %d\n", gsi);
|
printk(KERN_INFO "xen: acpi sci %d\n", gsi);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -450,7 +450,7 @@ static __init void xen_setup_acpi_sci(void)
|
|||||||
static int acpi_register_gsi_xen(struct device *dev, u32 gsi,
|
static int acpi_register_gsi_xen(struct device *dev, u32 gsi,
|
||||||
int trigger, int polarity)
|
int trigger, int polarity)
|
||||||
{
|
{
|
||||||
return xen_register_gsi(gsi, trigger, polarity);
|
return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init pci_xen_initial_domain(void)
|
static int __init pci_xen_initial_domain(void)
|
||||||
@ -489,7 +489,7 @@ void __init xen_setup_pirqs(void)
|
|||||||
if (acpi_get_override_irq(irq, &trigger, &polarity) == -1)
|
if (acpi_get_override_irq(irq, &trigger, &polarity) == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
xen_register_pirq(irq,
|
xen_register_pirq(irq, -1 /* no GSI override */,
|
||||||
trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE);
|
trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -504,9 +504,6 @@ void __init efi_init(void)
|
|||||||
x86_platform.set_wallclock = efi_set_rtc_mmss;
|
x86_platform.set_wallclock = efi_set_rtc_mmss;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Setup for EFI runtime service */
|
|
||||||
reboot_type = BOOT_EFI;
|
|
||||||
|
|
||||||
#if EFI_DEBUG
|
#if EFI_DEBUG
|
||||||
print_efi_memmap();
|
print_efi_memmap();
|
||||||
#endif
|
#endif
|
||||||
|
@ -2773,11 +2773,14 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd,
|
|||||||
smp_wmb();
|
smp_wmb();
|
||||||
cic->key = cfqd_dead_key(cfqd);
|
cic->key = cfqd_dead_key(cfqd);
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
if (rcu_dereference(ioc->ioc_data) == cic) {
|
if (rcu_dereference(ioc->ioc_data) == cic) {
|
||||||
|
rcu_read_unlock();
|
||||||
spin_lock(&ioc->lock);
|
spin_lock(&ioc->lock);
|
||||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||||
spin_unlock(&ioc->lock);
|
spin_unlock(&ioc->lock);
|
||||||
}
|
} else
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (cic->cfqq[BLK_RW_ASYNC]) {
|
if (cic->cfqq[BLK_RW_ASYNC]) {
|
||||||
cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]);
|
cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]);
|
||||||
@ -3084,7 +3087,8 @@ cfq_drop_dead_cic(struct cfq_data *cfqd, struct io_context *ioc,
|
|||||||
|
|
||||||
spin_lock_irqsave(&ioc->lock, flags);
|
spin_lock_irqsave(&ioc->lock, flags);
|
||||||
|
|
||||||
BUG_ON(ioc->ioc_data == cic);
|
BUG_ON(rcu_dereference_check(ioc->ioc_data,
|
||||||
|
lockdep_is_held(&ioc->lock)) == cic);
|
||||||
|
|
||||||
radix_tree_delete(&ioc->radix_root, cfqd->cic_index);
|
radix_tree_delete(&ioc->radix_root, cfqd->cic_index);
|
||||||
hlist_del_rcu(&cic->cic_list);
|
hlist_del_rcu(&cic->cic_list);
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <linux/syscore_ops.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
static LIST_HEAD(syscore_ops_list);
|
static LIST_HEAD(syscore_ops_list);
|
||||||
static DEFINE_MUTEX(syscore_ops_lock);
|
static DEFINE_MUTEX(syscore_ops_lock);
|
||||||
@ -48,6 +49,13 @@ int syscore_suspend(void)
|
|||||||
struct syscore_ops *ops;
|
struct syscore_ops *ops;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
pr_debug("Checking wakeup interrupts\n");
|
||||||
|
|
||||||
|
/* Return error code if there are any wakeup interrupts pending. */
|
||||||
|
ret = check_wakeup_irqs();
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
WARN_ONCE(!irqs_disabled(),
|
WARN_ONCE(!irqs_disabled(),
|
||||||
"Interrupts enabled before system core suspend.\n");
|
"Interrupts enabled before system core suspend.\n");
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
|
|||||||
md_io.error = 0;
|
md_io.error = 0;
|
||||||
|
|
||||||
if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags))
|
if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags))
|
||||||
rw |= REQ_FUA;
|
rw |= REQ_FUA | REQ_FLUSH;
|
||||||
rw |= REQ_SYNC;
|
rw |= REQ_SYNC;
|
||||||
|
|
||||||
bio = bio_alloc(GFP_NOIO, 1);
|
bio = bio_alloc(GFP_NOIO, 1);
|
||||||
|
@ -112,9 +112,6 @@ struct drbd_bitmap {
|
|||||||
struct task_struct *bm_task;
|
struct task_struct *bm_task;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
|
||||||
unsigned long e, int val, const enum km_type km);
|
|
||||||
|
|
||||||
#define bm_print_lock_info(m) __bm_print_lock_info(m, __func__)
|
#define bm_print_lock_info(m) __bm_print_lock_info(m, __func__)
|
||||||
static void __bm_print_lock_info(struct drbd_conf *mdev, const char *func)
|
static void __bm_print_lock_info(struct drbd_conf *mdev, const char *func)
|
||||||
{
|
{
|
||||||
@ -994,6 +991,9 @@ static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must
|
|||||||
bio_endio(bio, -EIO);
|
bio_endio(bio, -EIO);
|
||||||
} else {
|
} else {
|
||||||
submit_bio(rw, bio);
|
submit_bio(rw, bio);
|
||||||
|
/* this should not count as user activity and cause the
|
||||||
|
* resync to throttle -- see drbd_rs_should_slow_down(). */
|
||||||
|
atomic_add(len >> 9, &mdev->rs_sect_ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1256,7 +1256,7 @@ unsigned long _drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_f
|
|||||||
* expected to be called for only a few bits (e - s about BITS_PER_LONG).
|
* expected to be called for only a few bits (e - s about BITS_PER_LONG).
|
||||||
* Must hold bitmap lock already. */
|
* Must hold bitmap lock already. */
|
||||||
static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
||||||
unsigned long e, int val, const enum km_type km)
|
unsigned long e, int val)
|
||||||
{
|
{
|
||||||
struct drbd_bitmap *b = mdev->bitmap;
|
struct drbd_bitmap *b = mdev->bitmap;
|
||||||
unsigned long *p_addr = NULL;
|
unsigned long *p_addr = NULL;
|
||||||
@ -1274,14 +1274,14 @@ static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
|||||||
unsigned int page_nr = bm_bit_to_page_idx(b, bitnr);
|
unsigned int page_nr = bm_bit_to_page_idx(b, bitnr);
|
||||||
if (page_nr != last_page_nr) {
|
if (page_nr != last_page_nr) {
|
||||||
if (p_addr)
|
if (p_addr)
|
||||||
__bm_unmap(p_addr, km);
|
__bm_unmap(p_addr, KM_IRQ1);
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
|
bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
|
||||||
else if (c > 0)
|
else if (c > 0)
|
||||||
bm_set_page_need_writeout(b->bm_pages[last_page_nr]);
|
bm_set_page_need_writeout(b->bm_pages[last_page_nr]);
|
||||||
changed_total += c;
|
changed_total += c;
|
||||||
c = 0;
|
c = 0;
|
||||||
p_addr = __bm_map_pidx(b, page_nr, km);
|
p_addr = __bm_map_pidx(b, page_nr, KM_IRQ1);
|
||||||
last_page_nr = page_nr;
|
last_page_nr = page_nr;
|
||||||
}
|
}
|
||||||
if (val)
|
if (val)
|
||||||
@ -1290,7 +1290,7 @@ static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
|||||||
c -= (0 != __test_and_clear_bit_le(bitnr & BITS_PER_PAGE_MASK, p_addr));
|
c -= (0 != __test_and_clear_bit_le(bitnr & BITS_PER_PAGE_MASK, p_addr));
|
||||||
}
|
}
|
||||||
if (p_addr)
|
if (p_addr)
|
||||||
__bm_unmap(p_addr, km);
|
__bm_unmap(p_addr, KM_IRQ1);
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
|
bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
|
||||||
else if (c > 0)
|
else if (c > 0)
|
||||||
@ -1318,7 +1318,7 @@ static int bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
|
|||||||
if ((val ? BM_DONT_SET : BM_DONT_CLEAR) & b->bm_flags)
|
if ((val ? BM_DONT_SET : BM_DONT_CLEAR) & b->bm_flags)
|
||||||
bm_print_lock_info(mdev);
|
bm_print_lock_info(mdev);
|
||||||
|
|
||||||
c = __bm_change_bits_to(mdev, s, e, val, KM_IRQ1);
|
c = __bm_change_bits_to(mdev, s, e, val);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&b->bm_lock, flags);
|
spin_unlock_irqrestore(&b->bm_lock, flags);
|
||||||
return c;
|
return c;
|
||||||
@ -1343,16 +1343,17 @@ static inline void bm_set_full_words_within_one_page(struct drbd_bitmap *b,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int bits;
|
int bits;
|
||||||
unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr], KM_USER0);
|
unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr], KM_IRQ1);
|
||||||
for (i = first_word; i < last_word; i++) {
|
for (i = first_word; i < last_word; i++) {
|
||||||
bits = hweight_long(paddr[i]);
|
bits = hweight_long(paddr[i]);
|
||||||
paddr[i] = ~0UL;
|
paddr[i] = ~0UL;
|
||||||
b->bm_set += BITS_PER_LONG - bits;
|
b->bm_set += BITS_PER_LONG - bits;
|
||||||
}
|
}
|
||||||
kunmap_atomic(paddr, KM_USER0);
|
kunmap_atomic(paddr, KM_IRQ1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same thing as drbd_bm_set_bits, but without taking the spin_lock_irqsave.
|
/* Same thing as drbd_bm_set_bits,
|
||||||
|
* but more efficient for a large bit range.
|
||||||
* You must first drbd_bm_lock().
|
* You must first drbd_bm_lock().
|
||||||
* Can be called to set the whole bitmap in one go.
|
* Can be called to set the whole bitmap in one go.
|
||||||
* Sets bits from s to e _inclusive_. */
|
* Sets bits from s to e _inclusive_. */
|
||||||
@ -1366,6 +1367,7 @@ void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsi
|
|||||||
* Do not use memset, because we must account for changes,
|
* Do not use memset, because we must account for changes,
|
||||||
* so we need to loop over the words with hweight() anyways.
|
* so we need to loop over the words with hweight() anyways.
|
||||||
*/
|
*/
|
||||||
|
struct drbd_bitmap *b = mdev->bitmap;
|
||||||
unsigned long sl = ALIGN(s,BITS_PER_LONG);
|
unsigned long sl = ALIGN(s,BITS_PER_LONG);
|
||||||
unsigned long el = (e+1) & ~((unsigned long)BITS_PER_LONG-1);
|
unsigned long el = (e+1) & ~((unsigned long)BITS_PER_LONG-1);
|
||||||
int first_page;
|
int first_page;
|
||||||
@ -1376,15 +1378,19 @@ void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsi
|
|||||||
|
|
||||||
if (e - s <= 3*BITS_PER_LONG) {
|
if (e - s <= 3*BITS_PER_LONG) {
|
||||||
/* don't bother; el and sl may even be wrong. */
|
/* don't bother; el and sl may even be wrong. */
|
||||||
__bm_change_bits_to(mdev, s, e, 1, KM_USER0);
|
spin_lock_irq(&b->bm_lock);
|
||||||
|
__bm_change_bits_to(mdev, s, e, 1);
|
||||||
|
spin_unlock_irq(&b->bm_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* difference is large enough that we can trust sl and el */
|
/* difference is large enough that we can trust sl and el */
|
||||||
|
|
||||||
|
spin_lock_irq(&b->bm_lock);
|
||||||
|
|
||||||
/* bits filling the current long */
|
/* bits filling the current long */
|
||||||
if (sl)
|
if (sl)
|
||||||
__bm_change_bits_to(mdev, s, sl-1, 1, KM_USER0);
|
__bm_change_bits_to(mdev, s, sl-1, 1);
|
||||||
|
|
||||||
first_page = sl >> (3 + PAGE_SHIFT);
|
first_page = sl >> (3 + PAGE_SHIFT);
|
||||||
last_page = el >> (3 + PAGE_SHIFT);
|
last_page = el >> (3 + PAGE_SHIFT);
|
||||||
@ -1397,8 +1403,10 @@ void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsi
|
|||||||
/* first and full pages, unless first page == last page */
|
/* first and full pages, unless first page == last page */
|
||||||
for (page_nr = first_page; page_nr < last_page; page_nr++) {
|
for (page_nr = first_page; page_nr < last_page; page_nr++) {
|
||||||
bm_set_full_words_within_one_page(mdev->bitmap, page_nr, first_word, last_word);
|
bm_set_full_words_within_one_page(mdev->bitmap, page_nr, first_word, last_word);
|
||||||
|
spin_unlock_irq(&b->bm_lock);
|
||||||
cond_resched();
|
cond_resched();
|
||||||
first_word = 0;
|
first_word = 0;
|
||||||
|
spin_lock_irq(&b->bm_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* last page (respectively only page, for first page == last page) */
|
/* last page (respectively only page, for first page == last page) */
|
||||||
@ -1411,7 +1419,8 @@ void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsi
|
|||||||
* it would trigger an assert in __bm_change_bits_to()
|
* it would trigger an assert in __bm_change_bits_to()
|
||||||
*/
|
*/
|
||||||
if (el <= e)
|
if (el <= e)
|
||||||
__bm_change_bits_to(mdev, el, e, 1, KM_USER0);
|
__bm_change_bits_to(mdev, el, e, 1);
|
||||||
|
spin_unlock_irq(&b->bm_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns bit state
|
/* returns bit state
|
||||||
|
@ -4602,6 +4602,11 @@ int drbd_asender(struct drbd_thread *thi)
|
|||||||
dev_err(DEV, "meta connection shut down by peer.\n");
|
dev_err(DEV, "meta connection shut down by peer.\n");
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
} else if (rv == -EAGAIN) {
|
} else if (rv == -EAGAIN) {
|
||||||
|
/* If the data socket received something meanwhile,
|
||||||
|
* that is good enough: peer is still alive. */
|
||||||
|
if (time_after(mdev->last_received,
|
||||||
|
jiffies - mdev->meta.socket->sk->sk_rcvtimeo))
|
||||||
|
continue;
|
||||||
if (ping_timeout_active) {
|
if (ping_timeout_active) {
|
||||||
dev_err(DEV, "PingAck did not arrive in time.\n");
|
dev_err(DEV, "PingAck did not arrive in time.\n");
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
@ -4637,6 +4642,7 @@ int drbd_asender(struct drbd_thread *thi)
|
|||||||
goto reconnect;
|
goto reconnect;
|
||||||
}
|
}
|
||||||
if (received == expect) {
|
if (received == expect) {
|
||||||
|
mdev->last_received = jiffies;
|
||||||
D_ASSERT(cmd != NULL);
|
D_ASSERT(cmd != NULL);
|
||||||
if (!cmd->process(mdev, h))
|
if (!cmd->process(mdev, h))
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
|
@ -536,12 +536,7 @@ static int w_make_resync_request(struct drbd_conf *mdev,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* starting with drbd 8.3.8, we can handle multi-bio EEs,
|
max_bio_size = queue_max_hw_sectors(mdev->rq_queue) << 9;
|
||||||
* if it should be necessary */
|
|
||||||
max_bio_size =
|
|
||||||
mdev->agreed_pro_version < 94 ? queue_max_hw_sectors(mdev->rq_queue) << 9 :
|
|
||||||
mdev->agreed_pro_version < 95 ? DRBD_MAX_SIZE_H80_PACKET : DRBD_MAX_BIO_SIZE;
|
|
||||||
|
|
||||||
number = drbd_rs_number_requests(mdev);
|
number = drbd_rs_number_requests(mdev);
|
||||||
if (number == 0)
|
if (number == 0)
|
||||||
goto requeue;
|
goto requeue;
|
||||||
|
@ -759,7 +759,7 @@ static void __exit acpi_cpufreq_exit(void)
|
|||||||
|
|
||||||
cpufreq_unregister_driver(&acpi_cpufreq_driver);
|
cpufreq_unregister_driver(&acpi_cpufreq_driver);
|
||||||
|
|
||||||
free_percpu(acpi_perf_data);
|
free_acpi_perf_data();
|
||||||
}
|
}
|
||||||
|
|
||||||
module_param(acpi_pstate_strict, uint, 0644);
|
module_param(acpi_pstate_strict, uint, 0644);
|
||||||
|
@ -264,6 +264,7 @@ static char ohci_driver_name[] = KBUILD_MODNAME;
|
|||||||
#define PCI_DEVICE_ID_AGERE_FW643 0x5901
|
#define PCI_DEVICE_ID_AGERE_FW643 0x5901
|
||||||
#define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380
|
#define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380
|
||||||
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
|
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
|
||||||
|
#define PCI_VENDOR_ID_PINNACLE_SYSTEMS 0x11bd
|
||||||
|
|
||||||
#define QUIRK_CYCLE_TIMER 1
|
#define QUIRK_CYCLE_TIMER 1
|
||||||
#define QUIRK_RESET_PACKET 2
|
#define QUIRK_RESET_PACKET 2
|
||||||
@ -3190,6 +3191,11 @@ static int __devinit pci_probe(struct pci_dev *dev,
|
|||||||
int i, err;
|
int i, err;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
|
if (dev->vendor == PCI_VENDOR_ID_PINNACLE_SYSTEMS) {
|
||||||
|
dev_err(&dev->dev, "Pinnacle MovieBoard is not yet supported\n");
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
ohci = kzalloc(sizeof(*ohci), GFP_KERNEL);
|
ohci = kzalloc(sizeof(*ohci), GFP_KERNEL);
|
||||||
if (ohci == NULL) {
|
if (ohci == NULL) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
@ -223,7 +223,7 @@ static void lnw_irq_handler(unsigned irq, struct irq_desc *desc)
|
|||||||
gedr = gpio_reg(&lnw->chip, base, GEDR);
|
gedr = gpio_reg(&lnw->chip, base, GEDR);
|
||||||
pending = readl(gedr);
|
pending = readl(gedr);
|
||||||
while (pending) {
|
while (pending) {
|
||||||
gpio = __ffs(pending) - 1;
|
gpio = __ffs(pending);
|
||||||
mask = BIT(gpio);
|
mask = BIT(gpio);
|
||||||
pending &= ~mask;
|
pending &= ~mask;
|
||||||
/* Clear before handling so we can't lose an edge */
|
/* Clear before handling so we can't lose an edge */
|
||||||
|
@ -81,8 +81,10 @@ void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base)
|
|||||||
switch(tps65910_chip_id(tps65910)) {
|
switch(tps65910_chip_id(tps65910)) {
|
||||||
case TPS65910:
|
case TPS65910:
|
||||||
tps65910->gpio.ngpio = 6;
|
tps65910->gpio.ngpio = 6;
|
||||||
|
break;
|
||||||
case TPS65911:
|
case TPS65911:
|
||||||
tps65910->gpio.ngpio = 9;
|
tps65910->gpio.ngpio = 9;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -886,9 +886,6 @@ int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group)
|
|||||||
total_objects += dev->mode_config.num_connector;
|
total_objects += dev->mode_config.num_connector;
|
||||||
total_objects += dev->mode_config.num_encoder;
|
total_objects += dev->mode_config.num_encoder;
|
||||||
|
|
||||||
if (total_objects == 0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL);
|
group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL);
|
||||||
if (!group->id_list)
|
if (!group->id_list)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -985,17 +985,19 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav
|
|||||||
{
|
{
|
||||||
save->vga_control[0] = RREG32(D1VGA_CONTROL);
|
save->vga_control[0] = RREG32(D1VGA_CONTROL);
|
||||||
save->vga_control[1] = RREG32(D2VGA_CONTROL);
|
save->vga_control[1] = RREG32(D2VGA_CONTROL);
|
||||||
save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
|
|
||||||
save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
|
|
||||||
save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
|
|
||||||
save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
|
|
||||||
save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
|
save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
|
||||||
save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
|
save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
|
||||||
save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
|
save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
|
||||||
save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
|
save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
|
||||||
|
save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
|
||||||
save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
|
save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
|
||||||
save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
|
save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
|
||||||
|
save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
|
||||||
save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
|
save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
|
||||||
save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
||||||
}
|
}
|
||||||
@ -1004,36 +1006,46 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav
|
|||||||
WREG32(VGA_RENDER_CONTROL, 0);
|
WREG32(VGA_RENDER_CONTROL, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
|
||||||
}
|
}
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||||
}
|
}
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WREG32(D1VGA_CONTROL, 0);
|
WREG32(D1VGA_CONTROL, 0);
|
||||||
WREG32(D2VGA_CONTROL, 0);
|
WREG32(D2VGA_CONTROL, 0);
|
||||||
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_D3VGA_CONTROL, 0);
|
WREG32(EVERGREEN_D3VGA_CONTROL, 0);
|
||||||
WREG32(EVERGREEN_D4VGA_CONTROL, 0);
|
WREG32(EVERGREEN_D4VGA_CONTROL, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_D5VGA_CONTROL, 0);
|
WREG32(EVERGREEN_D5VGA_CONTROL, 0);
|
||||||
WREG32(EVERGREEN_D6VGA_CONTROL, 0);
|
WREG32(EVERGREEN_D6VGA_CONTROL, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
|
void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
|
||||||
{
|
{
|
||||||
@ -1055,7 +1067,7 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
|
|||||||
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET,
|
||||||
(u32)rdev->mc.vram_start);
|
(u32)rdev->mc.vram_start);
|
||||||
|
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
||||||
upper_32_bits(rdev->mc.vram_start));
|
upper_32_bits(rdev->mc.vram_start));
|
||||||
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
||||||
@ -1073,7 +1085,8 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
|
|||||||
(u32)rdev->mc.vram_start);
|
(u32)rdev->mc.vram_start);
|
||||||
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET,
|
||||||
(u32)rdev->mc.vram_start);
|
(u32)rdev->mc.vram_start);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
||||||
upper_32_bits(rdev->mc.vram_start));
|
upper_32_bits(rdev->mc.vram_start));
|
||||||
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
||||||
@ -1101,31 +1114,41 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
|
|||||||
/* Restore video state */
|
/* Restore video state */
|
||||||
WREG32(D1VGA_CONTROL, save->vga_control[0]);
|
WREG32(D1VGA_CONTROL, save->vga_control[0]);
|
||||||
WREG32(D2VGA_CONTROL, save->vga_control[1]);
|
WREG32(D2VGA_CONTROL, save->vga_control[1]);
|
||||||
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]);
|
WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]);
|
||||||
WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]);
|
WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]);
|
WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]);
|
||||||
WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]);
|
WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]);
|
||||||
|
}
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
|
||||||
}
|
}
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);
|
||||||
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);
|
WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);
|
||||||
}
|
}
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||||
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||||
}
|
}
|
||||||
@ -2417,18 +2440,22 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
|||||||
WREG32(GRBM_INT_CNTL, 0);
|
WREG32(GRBM_INT_CNTL, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||||
}
|
}
|
||||||
@ -2547,19 +2574,25 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
|||||||
|
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
|
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
|
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
|
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
|
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
|
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
|
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
|
||||||
}
|
}
|
||||||
|
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
|
||||||
|
if (rdev->num_crtc >= 4) {
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
|
||||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
|
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
|
||||||
|
}
|
||||||
|
|
||||||
WREG32(DC_HPD1_INT_CONTROL, hpd1);
|
WREG32(DC_HPD1_INT_CONTROL, hpd1);
|
||||||
WREG32(DC_HPD2_INT_CONTROL, hpd2);
|
WREG32(DC_HPD2_INT_CONTROL, hpd2);
|
||||||
@ -2583,53 +2616,57 @@ static inline void evergreen_irq_ack(struct radeon_device *rdev)
|
|||||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
|
rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
|
||||||
rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
|
||||||
rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
||||||
|
if (rdev->num_crtc >= 4) {
|
||||||
rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
|
||||||
rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
||||||
|
}
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
|
||||||
rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
|
if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
|
if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
|
||||||
if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
|
||||||
if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
|
||||||
if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
||||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
|
||||||
|
if (rdev->num_crtc >= 4) {
|
||||||
|
if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
|
if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rdev->num_crtc >= 6) {
|
||||||
|
if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
|
if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||||
|
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
|
||||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
|
WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
|
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
|
||||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
|
WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
|
||||||
|
}
|
||||||
|
|
||||||
if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
|
if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
|
||||||
tmp = RREG32(DC_HPD1_INT_CONTROL);
|
tmp = RREG32(DC_HPD1_INT_CONTROL);
|
||||||
@ -3237,6 +3274,7 @@ void evergreen_fini(struct radeon_device *rdev)
|
|||||||
r700_cp_fini(rdev);
|
r700_cp_fini(rdev);
|
||||||
r600_irq_fini(rdev);
|
r600_irq_fini(rdev);
|
||||||
radeon_wb_fini(rdev);
|
radeon_wb_fini(rdev);
|
||||||
|
radeon_ib_pool_fini(rdev);
|
||||||
radeon_irq_kms_fini(rdev);
|
radeon_irq_kms_fini(rdev);
|
||||||
evergreen_pcie_gart_fini(rdev);
|
evergreen_pcie_gart_fini(rdev);
|
||||||
radeon_gem_fini(rdev);
|
radeon_gem_fini(rdev);
|
||||||
|
@ -466,7 +466,7 @@
|
|||||||
#define IH_RB_WPTR_ADDR_LO 0x3e14
|
#define IH_RB_WPTR_ADDR_LO 0x3e14
|
||||||
#define IH_CNTL 0x3e18
|
#define IH_CNTL 0x3e18
|
||||||
# define ENABLE_INTR (1 << 0)
|
# define ENABLE_INTR (1 << 0)
|
||||||
# define IH_MC_SWAP(x) ((x) << 2)
|
# define IH_MC_SWAP(x) ((x) << 1)
|
||||||
# define IH_MC_SWAP_NONE 0
|
# define IH_MC_SWAP_NONE 0
|
||||||
# define IH_MC_SWAP_16BIT 1
|
# define IH_MC_SWAP_16BIT 1
|
||||||
# define IH_MC_SWAP_32BIT 2
|
# define IH_MC_SWAP_32BIT 2
|
||||||
@ -547,7 +547,7 @@
|
|||||||
# define LB_D5_VBLANK_INTERRUPT (1 << 3)
|
# define LB_D5_VBLANK_INTERRUPT (1 << 3)
|
||||||
# define DC_HPD5_INTERRUPT (1 << 17)
|
# define DC_HPD5_INTERRUPT (1 << 17)
|
||||||
# define DC_HPD5_RX_INTERRUPT (1 << 18)
|
# define DC_HPD5_RX_INTERRUPT (1 << 18)
|
||||||
#define DISP_INTERRUPT_STATUS_CONTINUE5 0x6050
|
#define DISP_INTERRUPT_STATUS_CONTINUE5 0x6150
|
||||||
# define LB_D6_VLINE_INTERRUPT (1 << 2)
|
# define LB_D6_VLINE_INTERRUPT (1 << 2)
|
||||||
# define LB_D6_VBLANK_INTERRUPT (1 << 3)
|
# define LB_D6_VBLANK_INTERRUPT (1 << 3)
|
||||||
# define DC_HPD6_INTERRUPT (1 << 17)
|
# define DC_HPD6_INTERRUPT (1 << 17)
|
||||||
|
@ -1581,6 +1581,7 @@ void cayman_fini(struct radeon_device *rdev)
|
|||||||
cayman_cp_fini(rdev);
|
cayman_cp_fini(rdev);
|
||||||
r600_irq_fini(rdev);
|
r600_irq_fini(rdev);
|
||||||
radeon_wb_fini(rdev);
|
radeon_wb_fini(rdev);
|
||||||
|
radeon_ib_pool_fini(rdev);
|
||||||
radeon_irq_kms_fini(rdev);
|
radeon_irq_kms_fini(rdev);
|
||||||
cayman_pcie_gart_fini(rdev);
|
cayman_pcie_gart_fini(rdev);
|
||||||
radeon_gem_fini(rdev);
|
radeon_gem_fini(rdev);
|
||||||
|
@ -2628,6 +2628,7 @@ void r600_fini(struct radeon_device *rdev)
|
|||||||
r600_cp_fini(rdev);
|
r600_cp_fini(rdev);
|
||||||
r600_irq_fini(rdev);
|
r600_irq_fini(rdev);
|
||||||
radeon_wb_fini(rdev);
|
radeon_wb_fini(rdev);
|
||||||
|
radeon_ib_pool_fini(rdev);
|
||||||
radeon_irq_kms_fini(rdev);
|
radeon_irq_kms_fini(rdev);
|
||||||
r600_pcie_gart_fini(rdev);
|
r600_pcie_gart_fini(rdev);
|
||||||
radeon_agp_fini(rdev);
|
radeon_agp_fini(rdev);
|
||||||
|
@ -536,7 +536,7 @@
|
|||||||
#define IH_RB_WPTR_ADDR_LO 0x3e14
|
#define IH_RB_WPTR_ADDR_LO 0x3e14
|
||||||
#define IH_CNTL 0x3e18
|
#define IH_CNTL 0x3e18
|
||||||
# define ENABLE_INTR (1 << 0)
|
# define ENABLE_INTR (1 << 0)
|
||||||
# define IH_MC_SWAP(x) ((x) << 2)
|
# define IH_MC_SWAP(x) ((x) << 1)
|
||||||
# define IH_MC_SWAP_NONE 0
|
# define IH_MC_SWAP_NONE 0
|
||||||
# define IH_MC_SWAP_16BIT 1
|
# define IH_MC_SWAP_16BIT 1
|
||||||
# define IH_MC_SWAP_32BIT 2
|
# define IH_MC_SWAP_32BIT 2
|
||||||
|
@ -1368,6 +1368,7 @@ void rv770_fini(struct radeon_device *rdev)
|
|||||||
r700_cp_fini(rdev);
|
r700_cp_fini(rdev);
|
||||||
r600_irq_fini(rdev);
|
r600_irq_fini(rdev);
|
||||||
radeon_wb_fini(rdev);
|
radeon_wb_fini(rdev);
|
||||||
|
radeon_ib_pool_fini(rdev);
|
||||||
radeon_irq_kms_fini(rdev);
|
radeon_irq_kms_fini(rdev);
|
||||||
rv770_pcie_gart_fini(rdev);
|
rv770_pcie_gart_fini(rdev);
|
||||||
rv770_vram_scratch_fini(rdev);
|
rv770_vram_scratch_fini(rdev);
|
||||||
|
@ -98,11 +98,16 @@ struct lm95241_data {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Conversions */
|
/* Conversions */
|
||||||
static int TempFromReg(u8 val_h, u8 val_l)
|
static int temp_from_reg_signed(u8 val_h, u8 val_l)
|
||||||
{
|
{
|
||||||
if (val_h & 0x80)
|
s16 val_hl = (val_h << 8) | val_l;
|
||||||
return val_h - 0x100;
|
return val_hl * 1000 / 256;
|
||||||
return val_h * 1000 + val_l * 1000 / 256;
|
}
|
||||||
|
|
||||||
|
static int temp_from_reg_unsigned(u8 val_h, u8 val_l)
|
||||||
|
{
|
||||||
|
u16 val_hl = (val_h << 8) | val_l;
|
||||||
|
return val_hl * 1000 / 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct lm95241_data *lm95241_update_device(struct device *dev)
|
static struct lm95241_data *lm95241_update_device(struct device *dev)
|
||||||
@ -135,10 +140,13 @@ static ssize_t show_input(struct device *dev, struct device_attribute *attr,
|
|||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct lm95241_data *data = lm95241_update_device(dev);
|
struct lm95241_data *data = lm95241_update_device(dev);
|
||||||
|
int index = to_sensor_dev_attr(attr)->index;
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n",
|
return snprintf(buf, PAGE_SIZE - 1, "%d\n",
|
||||||
TempFromReg(data->temp[to_sensor_dev_attr(attr)->index],
|
index == 0 || (data->config & (1 << (index / 2))) ?
|
||||||
data->temp[to_sensor_dev_attr(attr)->index + 1]));
|
temp_from_reg_signed(data->temp[index], data->temp[index + 1]) :
|
||||||
|
temp_from_reg_unsigned(data->temp[index],
|
||||||
|
data->temp[index + 1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_type(struct device *dev, struct device_attribute *attr,
|
static ssize_t show_type(struct device *dev, struct device_attribute *attr,
|
||||||
@ -339,7 +347,7 @@ static int lm95241_detect(struct i2c_client *new_client,
|
|||||||
if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID)
|
if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID)
|
||||||
== MANUFACTURER_ID)
|
== MANUFACTURER_ID)
|
||||||
&& (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID)
|
&& (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID)
|
||||||
>= DEFAULT_REVISION)) {
|
== DEFAULT_REVISION)) {
|
||||||
name = DEVNAME;
|
name = DEVNAME;
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n",
|
dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n",
|
||||||
|
@ -59,16 +59,17 @@ static void pmbus_find_sensor_groups(struct i2c_client *client,
|
|||||||
if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34))
|
if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34))
|
||||||
info->func[0] |= PMBUS_HAVE_STATUS_FAN34;
|
info->func[0] |= PMBUS_HAVE_STATUS_FAN34;
|
||||||
}
|
}
|
||||||
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) {
|
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1))
|
||||||
info->func[0] |= PMBUS_HAVE_TEMP;
|
info->func[0] |= PMBUS_HAVE_TEMP;
|
||||||
if (pmbus_check_byte_register(client, 0,
|
|
||||||
PMBUS_STATUS_TEMPERATURE))
|
|
||||||
info->func[0] |= PMBUS_HAVE_STATUS_TEMP;
|
|
||||||
}
|
|
||||||
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2))
|
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2))
|
||||||
info->func[0] |= PMBUS_HAVE_TEMP2;
|
info->func[0] |= PMBUS_HAVE_TEMP2;
|
||||||
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3))
|
if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3))
|
||||||
info->func[0] |= PMBUS_HAVE_TEMP3;
|
info->func[0] |= PMBUS_HAVE_TEMP3;
|
||||||
|
if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2
|
||||||
|
| PMBUS_HAVE_TEMP3)
|
||||||
|
&& pmbus_check_byte_register(client, 0,
|
||||||
|
PMBUS_STATUS_TEMPERATURE))
|
||||||
|
info->func[0] |= PMBUS_HAVE_STATUS_TEMP;
|
||||||
|
|
||||||
/* Sensors detected on all pages */
|
/* Sensors detected on all pages */
|
||||||
for (page = 0; page < info->pages; page++) {
|
for (page = 0; page < info->pages; page++) {
|
||||||
|
@ -193,7 +193,13 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (twi_int_status & MCOMP) {
|
if (twi_int_status & MCOMP) {
|
||||||
if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
|
if ((read_MASTER_CTL(iface) & MEN) == 0 &&
|
||||||
|
(iface->cur_mode == TWI_I2C_MODE_REPEAT ||
|
||||||
|
iface->cur_mode == TWI_I2C_MODE_COMBINED)) {
|
||||||
|
iface->result = -1;
|
||||||
|
write_INT_MASK(iface, 0);
|
||||||
|
write_MASTER_CTL(iface, 0);
|
||||||
|
} else if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
|
||||||
if (iface->readNum == 0) {
|
if (iface->readNum == 0) {
|
||||||
/* set the read number to 1 and ask for manual
|
/* set the read number to 1 and ask for manual
|
||||||
* stop in block combine mode
|
* stop in block combine mode
|
||||||
|
@ -248,12 +248,12 @@ static inline int is_msgend(struct s3c24xx_i2c *i2c)
|
|||||||
return i2c->msg_ptr >= i2c->msg->len;
|
return i2c->msg_ptr >= i2c->msg->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* i2s_s3c_irq_nextbyte
|
/* i2c_s3c_irq_nextbyte
|
||||||
*
|
*
|
||||||
* process an interrupt and work out what to do
|
* process an interrupt and work out what to do
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
static int i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
||||||
{
|
{
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
unsigned char byte;
|
unsigned char byte;
|
||||||
@ -264,7 +264,6 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||||||
case STATE_IDLE:
|
case STATE_IDLE:
|
||||||
dev_err(i2c->dev, "%s: called in STATE_IDLE\n", __func__);
|
dev_err(i2c->dev, "%s: called in STATE_IDLE\n", __func__);
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_STOP:
|
case STATE_STOP:
|
||||||
dev_err(i2c->dev, "%s: called in STATE_STOP\n", __func__);
|
dev_err(i2c->dev, "%s: called in STATE_STOP\n", __func__);
|
||||||
@ -444,7 +443,7 @@ static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)
|
|||||||
/* pretty much this leaves us with the fact that we've
|
/* pretty much this leaves us with the fact that we've
|
||||||
* transmitted or received whatever byte we last sent */
|
* transmitted or received whatever byte we last sent */
|
||||||
|
|
||||||
i2s_s3c_irq_nextbyte(i2c, status);
|
i2c_s3c_irq_nextbyte(i2c, status);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
@ -40,8 +40,10 @@
|
|||||||
#define I2C_CNFG_NEW_MASTER_FSM (1<<11)
|
#define I2C_CNFG_NEW_MASTER_FSM (1<<11)
|
||||||
#define I2C_STATUS 0x01C
|
#define I2C_STATUS 0x01C
|
||||||
#define I2C_SL_CNFG 0x020
|
#define I2C_SL_CNFG 0x020
|
||||||
|
#define I2C_SL_CNFG_NACK (1<<1)
|
||||||
#define I2C_SL_CNFG_NEWSL (1<<2)
|
#define I2C_SL_CNFG_NEWSL (1<<2)
|
||||||
#define I2C_SL_ADDR1 0x02c
|
#define I2C_SL_ADDR1 0x02c
|
||||||
|
#define I2C_SL_ADDR2 0x030
|
||||||
#define I2C_TX_FIFO 0x050
|
#define I2C_TX_FIFO 0x050
|
||||||
#define I2C_RX_FIFO 0x054
|
#define I2C_RX_FIFO 0x054
|
||||||
#define I2C_PACKET_TRANSFER_STATUS 0x058
|
#define I2C_PACKET_TRANSFER_STATUS 0x058
|
||||||
@ -337,7 +339,11 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
|
|||||||
|
|
||||||
if (!i2c_dev->is_dvc) {
|
if (!i2c_dev->is_dvc) {
|
||||||
u32 sl_cfg = i2c_readl(i2c_dev, I2C_SL_CNFG);
|
u32 sl_cfg = i2c_readl(i2c_dev, I2C_SL_CNFG);
|
||||||
i2c_writel(i2c_dev, sl_cfg | I2C_SL_CNFG_NEWSL, I2C_SL_CNFG);
|
sl_cfg |= I2C_SL_CNFG_NACK | I2C_SL_CNFG_NEWSL;
|
||||||
|
i2c_writel(i2c_dev, sl_cfg, I2C_SL_CNFG);
|
||||||
|
i2c_writel(i2c_dev, 0xfc, I2C_SL_ADDR1);
|
||||||
|
i2c_writel(i2c_dev, 0x00, I2C_SL_ADDR2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val = 7 << I2C_FIFO_CONTROL_TX_TRIG_SHIFT |
|
val = 7 << I2C_FIFO_CONTROL_TX_TRIG_SHIFT |
|
||||||
|
@ -520,7 +520,8 @@ static void pmic8xxx_kp_close(struct input_dev *dev)
|
|||||||
*/
|
*/
|
||||||
static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev)
|
static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct pm8xxx_keypad_platform_data *pdata = mfd_get_data(pdev);
|
const struct pm8xxx_keypad_platform_data *pdata =
|
||||||
|
dev_get_platdata(&pdev->dev);
|
||||||
const struct matrix_keymap_data *keymap_data;
|
const struct matrix_keymap_data *keymap_data;
|
||||||
struct pmic8xxx_kp *kp;
|
struct pmic8xxx_kp *kp;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -90,7 +90,8 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev)
|
|||||||
unsigned int delay;
|
unsigned int delay;
|
||||||
u8 pon_cntl;
|
u8 pon_cntl;
|
||||||
struct pmic8xxx_pwrkey *pwrkey;
|
struct pmic8xxx_pwrkey *pwrkey;
|
||||||
const struct pm8xxx_pwrkey_platform_data *pdata = mfd_get_data(pdev);
|
const struct pm8xxx_pwrkey_platform_data *pdata =
|
||||||
|
dev_get_platdata(&pdev->dev);
|
||||||
|
|
||||||
if (!pdata) {
|
if (!pdata) {
|
||||||
dev_err(&pdev->dev, "power key platform data not supplied\n");
|
dev_err(&pdev->dev, "power key platform data not supplied\n");
|
||||||
|
@ -88,7 +88,7 @@ static const struct pca9532_chip_info pca9532_chip_info_tbl[] = {
|
|||||||
|
|
||||||
static struct i2c_driver pca9532_driver = {
|
static struct i2c_driver pca9532_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "pca953x",
|
.name = "leds-pca953x",
|
||||||
},
|
},
|
||||||
.probe = pca9532_probe,
|
.probe = pca9532_probe,
|
||||||
.remove = pca9532_remove,
|
.remove = pca9532_remove,
|
||||||
|
@ -597,12 +597,17 @@ static void __devexit fintek_remove(struct pnp_dev *pdev)
|
|||||||
static int fintek_suspend(struct pnp_dev *pdev, pm_message_t state)
|
static int fintek_suspend(struct pnp_dev *pdev, pm_message_t state)
|
||||||
{
|
{
|
||||||
struct fintek_dev *fintek = pnp_get_drvdata(pdev);
|
struct fintek_dev *fintek = pnp_get_drvdata(pdev);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
fit_dbg("%s called", __func__);
|
fit_dbg("%s called", __func__);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&fintek->fintek_lock, flags);
|
||||||
|
|
||||||
/* disable all CIR interrupts */
|
/* disable all CIR interrupts */
|
||||||
fintek_cir_reg_write(fintek, CIR_STATUS_IRQ_MASK, CIR_STATUS);
|
fintek_cir_reg_write(fintek, CIR_STATUS_IRQ_MASK, CIR_STATUS);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&fintek->fintek_lock, flags);
|
||||||
|
|
||||||
fintek_config_mode_enable(fintek);
|
fintek_config_mode_enable(fintek);
|
||||||
|
|
||||||
/* disable cir logical dev */
|
/* disable cir logical dev */
|
||||||
|
@ -307,6 +307,14 @@ static const struct {
|
|||||||
/* 0xffdc iMON MCE VFD */
|
/* 0xffdc iMON MCE VFD */
|
||||||
{ 0x00010000ffffffeell, KEY_VOLUMEUP },
|
{ 0x00010000ffffffeell, KEY_VOLUMEUP },
|
||||||
{ 0x01000000ffffffeell, KEY_VOLUMEDOWN },
|
{ 0x01000000ffffffeell, KEY_VOLUMEDOWN },
|
||||||
|
{ 0x00000001ffffffeell, KEY_MUTE },
|
||||||
|
{ 0x0000000fffffffeell, KEY_MEDIA },
|
||||||
|
{ 0x00000012ffffffeell, KEY_UP },
|
||||||
|
{ 0x00000013ffffffeell, KEY_DOWN },
|
||||||
|
{ 0x00000014ffffffeell, KEY_LEFT },
|
||||||
|
{ 0x00000015ffffffeell, KEY_RIGHT },
|
||||||
|
{ 0x00000016ffffffeell, KEY_ENTER },
|
||||||
|
{ 0x00000017ffffffeell, KEY_ESC },
|
||||||
/* iMON Knob values */
|
/* iMON Knob values */
|
||||||
{ 0x000100ffffffffeell, KEY_VOLUMEUP },
|
{ 0x000100ffffffffeell, KEY_VOLUMEUP },
|
||||||
{ 0x010000ffffffffeell, KEY_VOLUMEDOWN },
|
{ 0x010000ffffffffeell, KEY_VOLUMEDOWN },
|
||||||
@ -1582,16 +1590,16 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
|||||||
/* Only panel type events left to process now */
|
/* Only panel type events left to process now */
|
||||||
spin_lock_irqsave(&ictx->kc_lock, flags);
|
spin_lock_irqsave(&ictx->kc_lock, flags);
|
||||||
|
|
||||||
|
do_gettimeofday(&t);
|
||||||
/* KEY_MUTE repeats from knob need to be suppressed */
|
/* KEY_MUTE repeats from knob need to be suppressed */
|
||||||
if (ictx->kc == KEY_MUTE && ictx->kc == ictx->last_keycode) {
|
if (ictx->kc == KEY_MUTE && ictx->kc == ictx->last_keycode) {
|
||||||
do_gettimeofday(&t);
|
|
||||||
msec = tv2int(&t, &prev_time);
|
msec = tv2int(&t, &prev_time);
|
||||||
prev_time = t;
|
|
||||||
if (msec < ictx->idev->rep[REP_DELAY]) {
|
if (msec < ictx->idev->rep[REP_DELAY]) {
|
||||||
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prev_time = t;
|
||||||
kc = ictx->kc;
|
kc = ictx->kc;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||||
@ -1603,7 +1611,9 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
|||||||
input_report_key(ictx->idev, kc, 0);
|
input_report_key(ictx->idev, kc, 0);
|
||||||
input_sync(ictx->idev);
|
input_sync(ictx->idev);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ictx->kc_lock, flags);
|
||||||
ictx->last_keycode = kc;
|
ictx->last_keycode = kc;
|
||||||
|
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1740,6 +1750,8 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
|||||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||||
break;
|
break;
|
||||||
/* iMON VFD, MCE IR */
|
/* iMON VFD, MCE IR */
|
||||||
|
case 0x46:
|
||||||
|
case 0x7e:
|
||||||
case 0x9e:
|
case 0x9e:
|
||||||
dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR");
|
dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR");
|
||||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||||
@ -1755,6 +1767,9 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
|||||||
dev_info(ictx->dev, "Unknown 0xffdc device, "
|
dev_info(ictx->dev, "Unknown 0xffdc device, "
|
||||||
"defaulting to VFD and iMON IR");
|
"defaulting to VFD and iMON IR");
|
||||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||||
|
/* We don't know which one it is, allow user to set the
|
||||||
|
* RC6 one from userspace if OTHER wasn't correct. */
|
||||||
|
allowed_protos |= RC_TYPE_RC6;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,18 +114,20 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
|
|||||||
s64 delta; /* ns */
|
s64 delta; /* ns */
|
||||||
DEFINE_IR_RAW_EVENT(ev);
|
DEFINE_IR_RAW_EVENT(ev);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
int delay;
|
||||||
|
|
||||||
if (!dev->raw)
|
if (!dev->raw)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
now = ktime_get();
|
now = ktime_get();
|
||||||
delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event));
|
delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event));
|
||||||
|
delay = MS_TO_NS(dev->input_dev->rep[REP_DELAY]);
|
||||||
|
|
||||||
/* Check for a long duration since last event or if we're
|
/* Check for a long duration since last event or if we're
|
||||||
* being called for the first time, note that delta can't
|
* being called for the first time, note that delta can't
|
||||||
* possibly be negative.
|
* possibly be negative.
|
||||||
*/
|
*/
|
||||||
if (delta > IR_MAX_DURATION || !dev->raw->last_type)
|
if (delta > delay || !dev->raw->last_type)
|
||||||
type |= IR_START_EVENT;
|
type |= IR_START_EVENT;
|
||||||
else
|
else
|
||||||
ev.duration = delta;
|
ev.duration = delta;
|
||||||
|
@ -1347,6 +1347,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
|
|||||||
{ /* 0: ITE8704 */
|
{ /* 0: ITE8704 */
|
||||||
.model = "ITE8704 CIR transceiver",
|
.model = "ITE8704 CIR transceiver",
|
||||||
.io_region_size = IT87_IOREG_LENGTH,
|
.io_region_size = IT87_IOREG_LENGTH,
|
||||||
|
.io_rsrc_no = 0,
|
||||||
.hw_tx_capable = true,
|
.hw_tx_capable = true,
|
||||||
.sample_period = (u32) (1000000000ULL / 115200),
|
.sample_period = (u32) (1000000000ULL / 115200),
|
||||||
.tx_carrier_freq = 38000,
|
.tx_carrier_freq = 38000,
|
||||||
@ -1371,6 +1372,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
|
|||||||
{ /* 1: ITE8713 */
|
{ /* 1: ITE8713 */
|
||||||
.model = "ITE8713 CIR transceiver",
|
.model = "ITE8713 CIR transceiver",
|
||||||
.io_region_size = IT87_IOREG_LENGTH,
|
.io_region_size = IT87_IOREG_LENGTH,
|
||||||
|
.io_rsrc_no = 0,
|
||||||
.hw_tx_capable = true,
|
.hw_tx_capable = true,
|
||||||
.sample_period = (u32) (1000000000ULL / 115200),
|
.sample_period = (u32) (1000000000ULL / 115200),
|
||||||
.tx_carrier_freq = 38000,
|
.tx_carrier_freq = 38000,
|
||||||
@ -1395,6 +1397,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
|
|||||||
{ /* 2: ITE8708 */
|
{ /* 2: ITE8708 */
|
||||||
.model = "ITE8708 CIR transceiver",
|
.model = "ITE8708 CIR transceiver",
|
||||||
.io_region_size = IT8708_IOREG_LENGTH,
|
.io_region_size = IT8708_IOREG_LENGTH,
|
||||||
|
.io_rsrc_no = 0,
|
||||||
.hw_tx_capable = true,
|
.hw_tx_capable = true,
|
||||||
.sample_period = (u32) (1000000000ULL / 115200),
|
.sample_period = (u32) (1000000000ULL / 115200),
|
||||||
.tx_carrier_freq = 38000,
|
.tx_carrier_freq = 38000,
|
||||||
@ -1420,6 +1423,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
|
|||||||
{ /* 3: ITE8709 */
|
{ /* 3: ITE8709 */
|
||||||
.model = "ITE8709 CIR transceiver",
|
.model = "ITE8709 CIR transceiver",
|
||||||
.io_region_size = IT8709_IOREG_LENGTH,
|
.io_region_size = IT8709_IOREG_LENGTH,
|
||||||
|
.io_rsrc_no = 2,
|
||||||
.hw_tx_capable = true,
|
.hw_tx_capable = true,
|
||||||
.sample_period = (u32) (1000000000ULL / 115200),
|
.sample_period = (u32) (1000000000ULL / 115200),
|
||||||
.tx_carrier_freq = 38000,
|
.tx_carrier_freq = 38000,
|
||||||
@ -1461,6 +1465,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
|||||||
struct rc_dev *rdev = NULL;
|
struct rc_dev *rdev = NULL;
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
int model_no;
|
int model_no;
|
||||||
|
int io_rsrc_no;
|
||||||
|
|
||||||
ite_dbg("%s called", __func__);
|
ite_dbg("%s called", __func__);
|
||||||
|
|
||||||
@ -1490,10 +1495,11 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
|||||||
|
|
||||||
/* get the description for the device */
|
/* get the description for the device */
|
||||||
dev_desc = &ite_dev_descs[model_no];
|
dev_desc = &ite_dev_descs[model_no];
|
||||||
|
io_rsrc_no = dev_desc->io_rsrc_no;
|
||||||
|
|
||||||
/* validate pnp resources */
|
/* validate pnp resources */
|
||||||
if (!pnp_port_valid(pdev, 0) ||
|
if (!pnp_port_valid(pdev, io_rsrc_no) ||
|
||||||
pnp_port_len(pdev, 0) != dev_desc->io_region_size) {
|
pnp_port_len(pdev, io_rsrc_no) != dev_desc->io_region_size) {
|
||||||
dev_err(&pdev->dev, "IR PNP Port not valid!\n");
|
dev_err(&pdev->dev, "IR PNP Port not valid!\n");
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
@ -1504,7 +1510,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* store resource values */
|
/* store resource values */
|
||||||
itdev->cir_addr = pnp_port_start(pdev, 0);
|
itdev->cir_addr = pnp_port_start(pdev, io_rsrc_no);
|
||||||
itdev->cir_irq = pnp_irq(pdev, 0);
|
itdev->cir_irq = pnp_irq(pdev, 0);
|
||||||
|
|
||||||
/* initialize spinlocks */
|
/* initialize spinlocks */
|
||||||
|
@ -57,6 +57,9 @@ struct ite_dev_params {
|
|||||||
/* size of the I/O region */
|
/* size of the I/O region */
|
||||||
int io_region_size;
|
int io_region_size;
|
||||||
|
|
||||||
|
/* IR pnp I/O resource number */
|
||||||
|
int io_rsrc_no;
|
||||||
|
|
||||||
/* true if the hardware supports transmission */
|
/* true if the hardware supports transmission */
|
||||||
bool hw_tx_capable;
|
bool hw_tx_capable;
|
||||||
|
|
||||||
|
@ -15,43 +15,39 @@
|
|||||||
/* Pinnacle PCTV HD 800i mini remote */
|
/* Pinnacle PCTV HD 800i mini remote */
|
||||||
|
|
||||||
static struct rc_map_table pinnacle_pctv_hd[] = {
|
static struct rc_map_table pinnacle_pctv_hd[] = {
|
||||||
|
/* Key codes for the tiny Pinnacle remote*/
|
||||||
{ 0x0f, KEY_1 },
|
{ 0x0700, KEY_MUTE },
|
||||||
{ 0x15, KEY_2 },
|
{ 0x0701, KEY_MENU }, /* Pinnacle logo */
|
||||||
{ 0x10, KEY_3 },
|
{ 0x0739, KEY_POWER },
|
||||||
{ 0x18, KEY_4 },
|
{ 0x0703, KEY_VOLUMEUP },
|
||||||
{ 0x1b, KEY_5 },
|
{ 0x0709, KEY_VOLUMEDOWN },
|
||||||
{ 0x1e, KEY_6 },
|
{ 0x0706, KEY_CHANNELUP },
|
||||||
{ 0x11, KEY_7 },
|
{ 0x070c, KEY_CHANNELDOWN },
|
||||||
{ 0x21, KEY_8 },
|
{ 0x070f, KEY_1 },
|
||||||
{ 0x12, KEY_9 },
|
{ 0x0715, KEY_2 },
|
||||||
{ 0x27, KEY_0 },
|
{ 0x0710, KEY_3 },
|
||||||
|
{ 0x0718, KEY_4 },
|
||||||
{ 0x24, KEY_ZOOM },
|
{ 0x071b, KEY_5 },
|
||||||
{ 0x2a, KEY_SUBTITLE },
|
{ 0x071e, KEY_6 },
|
||||||
|
{ 0x0711, KEY_7 },
|
||||||
{ 0x00, KEY_MUTE },
|
{ 0x0721, KEY_8 },
|
||||||
{ 0x01, KEY_ENTER }, /* Pinnacle Logo */
|
{ 0x0712, KEY_9 },
|
||||||
{ 0x39, KEY_POWER },
|
{ 0x0727, KEY_0 },
|
||||||
|
{ 0x0724, KEY_ZOOM }, /* 'Square' key */
|
||||||
{ 0x03, KEY_VOLUMEUP },
|
{ 0x072a, KEY_SUBTITLE }, /* 'T' key */
|
||||||
{ 0x09, KEY_VOLUMEDOWN },
|
{ 0x072d, KEY_REWIND },
|
||||||
{ 0x06, KEY_CHANNELUP },
|
{ 0x0730, KEY_PLAYPAUSE },
|
||||||
{ 0x0c, KEY_CHANNELDOWN },
|
{ 0x0733, KEY_FASTFORWARD },
|
||||||
|
{ 0x0736, KEY_RECORD },
|
||||||
{ 0x2d, KEY_REWIND },
|
{ 0x073c, KEY_STOP },
|
||||||
{ 0x30, KEY_PLAYPAUSE },
|
{ 0x073f, KEY_HELP }, /* '?' key */
|
||||||
{ 0x33, KEY_FASTFORWARD },
|
|
||||||
{ 0x3c, KEY_STOP },
|
|
||||||
{ 0x36, KEY_RECORD },
|
|
||||||
{ 0x3f, KEY_EPG }, /* Labeled "?" */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct rc_map_list pinnacle_pctv_hd_map = {
|
static struct rc_map_list pinnacle_pctv_hd_map = {
|
||||||
.map = {
|
.map = {
|
||||||
.scan = pinnacle_pctv_hd,
|
.scan = pinnacle_pctv_hd,
|
||||||
.size = ARRAY_SIZE(pinnacle_pctv_hd),
|
.size = ARRAY_SIZE(pinnacle_pctv_hd),
|
||||||
.rc_type = RC_TYPE_UNKNOWN, /* Legacy IR type */
|
.rc_type = RC_TYPE_RC5,
|
||||||
.name = RC_MAP_PINNACLE_PCTV_HD,
|
.name = RC_MAP_PINNACLE_PCTV_HD,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -55,6 +55,8 @@ struct irctl {
|
|||||||
struct lirc_buffer *buf;
|
struct lirc_buffer *buf;
|
||||||
unsigned int chunk_size;
|
unsigned int chunk_size;
|
||||||
|
|
||||||
|
struct cdev *cdev;
|
||||||
|
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
long jiffies_to_wait;
|
long jiffies_to_wait;
|
||||||
};
|
};
|
||||||
@ -62,7 +64,6 @@ struct irctl {
|
|||||||
static DEFINE_MUTEX(lirc_dev_lock);
|
static DEFINE_MUTEX(lirc_dev_lock);
|
||||||
|
|
||||||
static struct irctl *irctls[MAX_IRCTL_DEVICES];
|
static struct irctl *irctls[MAX_IRCTL_DEVICES];
|
||||||
static struct cdev cdevs[MAX_IRCTL_DEVICES];
|
|
||||||
|
|
||||||
/* Only used for sysfs but defined to void otherwise */
|
/* Only used for sysfs but defined to void otherwise */
|
||||||
static struct class *lirc_class;
|
static struct class *lirc_class;
|
||||||
@ -167,9 +168,13 @@ static struct file_operations lirc_dev_fops = {
|
|||||||
|
|
||||||
static int lirc_cdev_add(struct irctl *ir)
|
static int lirc_cdev_add(struct irctl *ir)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval = -ENOMEM;
|
||||||
struct lirc_driver *d = &ir->d;
|
struct lirc_driver *d = &ir->d;
|
||||||
struct cdev *cdev = &cdevs[d->minor];
|
struct cdev *cdev;
|
||||||
|
|
||||||
|
cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
|
||||||
|
if (!cdev)
|
||||||
|
goto err_out;
|
||||||
|
|
||||||
if (d->fops) {
|
if (d->fops) {
|
||||||
cdev_init(cdev, d->fops);
|
cdev_init(cdev, d->fops);
|
||||||
@ -180,12 +185,20 @@ static int lirc_cdev_add(struct irctl *ir)
|
|||||||
}
|
}
|
||||||
retval = kobject_set_name(&cdev->kobj, "lirc%d", d->minor);
|
retval = kobject_set_name(&cdev->kobj, "lirc%d", d->minor);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
goto err_out;
|
||||||
|
|
||||||
retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1);
|
retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1);
|
||||||
if (retval)
|
if (retval) {
|
||||||
kobject_put(&cdev->kobj);
|
kobject_put(&cdev->kobj);
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ir->cdev = cdev;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
kfree(cdev);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,7 +393,7 @@ int lirc_unregister_driver(int minor)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
cdev = &cdevs[minor];
|
cdev = ir->cdev;
|
||||||
|
|
||||||
mutex_lock(&lirc_dev_lock);
|
mutex_lock(&lirc_dev_lock);
|
||||||
|
|
||||||
@ -410,6 +423,7 @@ int lirc_unregister_driver(int minor)
|
|||||||
} else {
|
} else {
|
||||||
lirc_irctl_cleanup(ir);
|
lirc_irctl_cleanup(ir);
|
||||||
cdev_del(cdev);
|
cdev_del(cdev);
|
||||||
|
kfree(cdev);
|
||||||
kfree(ir);
|
kfree(ir);
|
||||||
irctls[minor] = NULL;
|
irctls[minor] = NULL;
|
||||||
}
|
}
|
||||||
@ -453,7 +467,7 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
cdev = &cdevs[iminor(inode)];
|
cdev = ir->cdev;
|
||||||
if (try_module_get(cdev->owner)) {
|
if (try_module_get(cdev->owner)) {
|
||||||
ir->open++;
|
ir->open++;
|
||||||
retval = ir->d.set_use_inc(ir->d.data);
|
retval = ir->d.set_use_inc(ir->d.data);
|
||||||
@ -484,13 +498,15 @@ EXPORT_SYMBOL(lirc_dev_fop_open);
|
|||||||
int lirc_dev_fop_close(struct inode *inode, struct file *file)
|
int lirc_dev_fop_close(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct irctl *ir = irctls[iminor(inode)];
|
struct irctl *ir = irctls[iminor(inode)];
|
||||||
struct cdev *cdev = &cdevs[iminor(inode)];
|
struct cdev *cdev;
|
||||||
|
|
||||||
if (!ir) {
|
if (!ir) {
|
||||||
printk(KERN_ERR "%s: called with invalid irctl\n", __func__);
|
printk(KERN_ERR "%s: called with invalid irctl\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cdev = ir->cdev;
|
||||||
|
|
||||||
dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor);
|
dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor);
|
||||||
|
|
||||||
WARN_ON(mutex_lock_killable(&lirc_dev_lock));
|
WARN_ON(mutex_lock_killable(&lirc_dev_lock));
|
||||||
@ -503,6 +519,7 @@ int lirc_dev_fop_close(struct inode *inode, struct file *file)
|
|||||||
lirc_irctl_cleanup(ir);
|
lirc_irctl_cleanup(ir);
|
||||||
cdev_del(cdev);
|
cdev_del(cdev);
|
||||||
irctls[ir->d.minor] = NULL;
|
irctls[ir->d.minor] = NULL;
|
||||||
|
kfree(cdev);
|
||||||
kfree(ir);
|
kfree(ir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +108,12 @@ static int debug = 1;
|
|||||||
static int debug;
|
static int debug;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define mce_dbg(dev, fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (debug) \
|
||||||
|
dev_info(dev, fmt, ## __VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/* general constants */
|
/* general constants */
|
||||||
#define SEND_FLAG_IN_PROGRESS 1
|
#define SEND_FLAG_IN_PROGRESS 1
|
||||||
#define SEND_FLAG_COMPLETE 2
|
#define SEND_FLAG_COMPLETE 2
|
||||||
@ -246,6 +252,9 @@ static struct usb_device_id mceusb_dev_table[] = {
|
|||||||
.driver_info = MCE_GEN2_TX_INV },
|
.driver_info = MCE_GEN2_TX_INV },
|
||||||
/* SMK eHome Infrared Transceiver */
|
/* SMK eHome Infrared Transceiver */
|
||||||
{ USB_DEVICE(VENDOR_SMK, 0x0338) },
|
{ USB_DEVICE(VENDOR_SMK, 0x0338) },
|
||||||
|
/* SMK/I-O Data GV-MC7/RCKIT Receiver */
|
||||||
|
{ USB_DEVICE(VENDOR_SMK, 0x0353),
|
||||||
|
.driver_info = MCE_GEN2_NO_TX },
|
||||||
/* Tatung eHome Infrared Transceiver */
|
/* Tatung eHome Infrared Transceiver */
|
||||||
{ USB_DEVICE(VENDOR_TATUNG, 0x9150) },
|
{ USB_DEVICE(VENDOR_TATUNG, 0x9150) },
|
||||||
/* Shuttle eHome Infrared Transceiver */
|
/* Shuttle eHome Infrared Transceiver */
|
||||||
@ -606,12 +615,15 @@ static void mce_async_callback(struct urb *urb, struct pt_regs *regs)
|
|||||||
if (ir) {
|
if (ir) {
|
||||||
len = urb->actual_length;
|
len = urb->actual_length;
|
||||||
|
|
||||||
dev_dbg(ir->dev, "callback called (status=%d len=%d)\n",
|
mce_dbg(ir->dev, "callback called (status=%d len=%d)\n",
|
||||||
urb->status, len);
|
urb->status, len);
|
||||||
|
|
||||||
mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true);
|
mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* the transfer buffer and urb were allocated in mce_request_packet */
|
||||||
|
kfree(urb->transfer_buffer);
|
||||||
|
usb_free_urb(urb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* request incoming or send outgoing usb packet - used to initialize remote */
|
/* request incoming or send outgoing usb packet - used to initialize remote */
|
||||||
@ -655,17 +667,17 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(dev, "receive request called (size=%#x)\n", size);
|
mce_dbg(dev, "receive request called (size=%#x)\n", size);
|
||||||
|
|
||||||
async_urb->transfer_buffer_length = size;
|
async_urb->transfer_buffer_length = size;
|
||||||
async_urb->dev = ir->usbdev;
|
async_urb->dev = ir->usbdev;
|
||||||
|
|
||||||
res = usb_submit_urb(async_urb, GFP_ATOMIC);
|
res = usb_submit_urb(async_urb, GFP_ATOMIC);
|
||||||
if (res) {
|
if (res) {
|
||||||
dev_dbg(dev, "receive request FAILED! (res=%d)\n", res);
|
mce_dbg(dev, "receive request FAILED! (res=%d)\n", res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dev_dbg(dev, "receive request complete (res=%d)\n", res);
|
mce_dbg(dev, "receive request complete (res=%d)\n", res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
|
static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
|
||||||
@ -673,9 +685,9 @@ static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
|
|||||||
mce_request_packet(ir, data, size, MCEUSB_TX);
|
mce_request_packet(ir, data, size, MCEUSB_TX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mce_sync_in(struct mceusb_dev *ir, unsigned char *data, int size)
|
static void mce_flush_rx_buffer(struct mceusb_dev *ir, int size)
|
||||||
{
|
{
|
||||||
mce_request_packet(ir, data, size, MCEUSB_RX);
|
mce_request_packet(ir, NULL, size, MCEUSB_RX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send data out the IR blaster port(s) */
|
/* Send data out the IR blaster port(s) */
|
||||||
@ -794,7 +806,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
|
|||||||
ir->carrier = carrier;
|
ir->carrier = carrier;
|
||||||
cmdbuf[2] = MCE_CMD_SIG_END;
|
cmdbuf[2] = MCE_CMD_SIG_END;
|
||||||
cmdbuf[3] = MCE_IRDATA_TRAILER;
|
cmdbuf[3] = MCE_IRDATA_TRAILER;
|
||||||
dev_dbg(ir->dev, "%s: disabling carrier "
|
mce_dbg(ir->dev, "%s: disabling carrier "
|
||||||
"modulation\n", __func__);
|
"modulation\n", __func__);
|
||||||
mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
|
mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
|
||||||
return carrier;
|
return carrier;
|
||||||
@ -806,7 +818,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
|
|||||||
ir->carrier = carrier;
|
ir->carrier = carrier;
|
||||||
cmdbuf[2] = prescaler;
|
cmdbuf[2] = prescaler;
|
||||||
cmdbuf[3] = divisor;
|
cmdbuf[3] = divisor;
|
||||||
dev_dbg(ir->dev, "%s: requesting %u HZ "
|
mce_dbg(ir->dev, "%s: requesting %u HZ "
|
||||||
"carrier\n", __func__, carrier);
|
"carrier\n", __func__, carrier);
|
||||||
|
|
||||||
/* Transmit new carrier to mce device */
|
/* Transmit new carrier to mce device */
|
||||||
@ -879,7 +891,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
|
|||||||
rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
|
rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
|
||||||
* US_TO_NS(MCE_TIME_UNIT);
|
* US_TO_NS(MCE_TIME_UNIT);
|
||||||
|
|
||||||
dev_dbg(ir->dev, "Storing %s with duration %d\n",
|
mce_dbg(ir->dev, "Storing %s with duration %d\n",
|
||||||
rawir.pulse ? "pulse" : "space",
|
rawir.pulse ? "pulse" : "space",
|
||||||
rawir.duration);
|
rawir.duration);
|
||||||
|
|
||||||
@ -911,7 +923,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
|
|||||||
if (ir->parser_state != CMD_HEADER && !ir->rem)
|
if (ir->parser_state != CMD_HEADER && !ir->rem)
|
||||||
ir->parser_state = CMD_HEADER;
|
ir->parser_state = CMD_HEADER;
|
||||||
}
|
}
|
||||||
dev_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
|
mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
|
||||||
ir_raw_event_handle(ir->rc);
|
ir_raw_event_handle(ir->rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,7 +945,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
|
|||||||
|
|
||||||
if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
|
if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
|
||||||
ir->send_flags = SEND_FLAG_COMPLETE;
|
ir->send_flags = SEND_FLAG_COMPLETE;
|
||||||
dev_dbg(ir->dev, "setup answer received %d bytes\n",
|
mce_dbg(ir->dev, "setup answer received %d bytes\n",
|
||||||
buf_len);
|
buf_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,7 +963,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
|
|||||||
|
|
||||||
case -EPIPE:
|
case -EPIPE:
|
||||||
default:
|
default:
|
||||||
dev_dbg(ir->dev, "Error: urb status = %d\n", urb->status);
|
mce_dbg(ir->dev, "Error: urb status = %d\n", urb->status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,7 +973,6 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
|
|||||||
static void mceusb_gen1_init(struct mceusb_dev *ir)
|
static void mceusb_gen1_init(struct mceusb_dev *ir)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int maxp = ir->len_in;
|
|
||||||
struct device *dev = ir->dev;
|
struct device *dev = ir->dev;
|
||||||
char *data;
|
char *data;
|
||||||
|
|
||||||
@ -978,8 +989,8 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
|
|||||||
ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
|
ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
|
||||||
USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
|
USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
|
||||||
data, USB_CTRL_MSG_SZ, HZ * 3);
|
data, USB_CTRL_MSG_SZ, HZ * 3);
|
||||||
dev_dbg(dev, "%s - ret = %d\n", __func__, ret);
|
mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
|
||||||
dev_dbg(dev, "%s - data[0] = %d, data[1] = %d\n",
|
mce_dbg(dev, "%s - data[0] = %d, data[1] = %d\n",
|
||||||
__func__, data[0], data[1]);
|
__func__, data[0], data[1]);
|
||||||
|
|
||||||
/* set feature: bit rate 38400 bps */
|
/* set feature: bit rate 38400 bps */
|
||||||
@ -987,71 +998,56 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
|
|||||||
USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
|
USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
|
||||||
0xc04e, 0x0000, NULL, 0, HZ * 3);
|
0xc04e, 0x0000, NULL, 0, HZ * 3);
|
||||||
|
|
||||||
dev_dbg(dev, "%s - ret = %d\n", __func__, ret);
|
mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
|
||||||
|
|
||||||
/* bRequest 4: set char length to 8 bits */
|
/* bRequest 4: set char length to 8 bits */
|
||||||
ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
|
ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
|
||||||
4, USB_TYPE_VENDOR,
|
4, USB_TYPE_VENDOR,
|
||||||
0x0808, 0x0000, NULL, 0, HZ * 3);
|
0x0808, 0x0000, NULL, 0, HZ * 3);
|
||||||
dev_dbg(dev, "%s - retB = %d\n", __func__, ret);
|
mce_dbg(dev, "%s - retB = %d\n", __func__, ret);
|
||||||
|
|
||||||
/* bRequest 2: set handshaking to use DTR/DSR */
|
/* bRequest 2: set handshaking to use DTR/DSR */
|
||||||
ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
|
ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
|
||||||
2, USB_TYPE_VENDOR,
|
2, USB_TYPE_VENDOR,
|
||||||
0x0000, 0x0100, NULL, 0, HZ * 3);
|
0x0000, 0x0100, NULL, 0, HZ * 3);
|
||||||
dev_dbg(dev, "%s - retC = %d\n", __func__, ret);
|
mce_dbg(dev, "%s - retC = %d\n", __func__, ret);
|
||||||
|
|
||||||
/* device reset */
|
/* device reset */
|
||||||
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
|
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
/* get hw/sw revision? */
|
/* get hw/sw revision? */
|
||||||
mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
|
mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
kfree(data);
|
kfree(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mceusb_gen2_init(struct mceusb_dev *ir)
|
static void mceusb_gen2_init(struct mceusb_dev *ir)
|
||||||
{
|
{
|
||||||
int maxp = ir->len_in;
|
|
||||||
|
|
||||||
/* device reset */
|
/* device reset */
|
||||||
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
|
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
/* get hw/sw revision? */
|
/* get hw/sw revision? */
|
||||||
mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
|
mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
/* unknown what the next two actually return... */
|
/* unknown what the next two actually return... */
|
||||||
mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN));
|
mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
|
mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mceusb_get_parameters(struct mceusb_dev *ir)
|
static void mceusb_get_parameters(struct mceusb_dev *ir)
|
||||||
{
|
{
|
||||||
int maxp = ir->len_in;
|
|
||||||
|
|
||||||
/* get the carrier and frequency */
|
/* get the carrier and frequency */
|
||||||
mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
|
mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
if (!ir->flags.no_tx) {
|
if (!ir->flags.no_tx)
|
||||||
/* get the transmitter bitmask */
|
/* get the transmitter bitmask */
|
||||||
mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
|
mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get receiver timeout value */
|
/* get receiver timeout value */
|
||||||
mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
|
mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
/* get receiver sensor setting */
|
/* get receiver sensor setting */
|
||||||
mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
|
mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
|
static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
|
||||||
@ -1122,7 +1118,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||||||
bool tx_mask_normal;
|
bool tx_mask_normal;
|
||||||
int ir_intfnum;
|
int ir_intfnum;
|
||||||
|
|
||||||
dev_dbg(&intf->dev, "%s called\n", __func__);
|
mce_dbg(&intf->dev, "%s called\n", __func__);
|
||||||
|
|
||||||
idesc = intf->cur_altsetting;
|
idesc = intf->cur_altsetting;
|
||||||
|
|
||||||
@ -1150,7 +1146,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||||||
ep_in = ep;
|
ep_in = ep;
|
||||||
ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
|
ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
|
||||||
ep_in->bInterval = 1;
|
ep_in->bInterval = 1;
|
||||||
dev_dbg(&intf->dev, "acceptable inbound endpoint "
|
mce_dbg(&intf->dev, "acceptable inbound endpoint "
|
||||||
"found\n");
|
"found\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1165,12 +1161,12 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||||||
ep_out = ep;
|
ep_out = ep;
|
||||||
ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
|
ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
|
||||||
ep_out->bInterval = 1;
|
ep_out->bInterval = 1;
|
||||||
dev_dbg(&intf->dev, "acceptable outbound endpoint "
|
mce_dbg(&intf->dev, "acceptable outbound endpoint "
|
||||||
"found\n");
|
"found\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ep_in == NULL) {
|
if (ep_in == NULL) {
|
||||||
dev_dbg(&intf->dev, "inbound and/or endpoint not found\n");
|
mce_dbg(&intf->dev, "inbound and/or endpoint not found\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1215,16 +1211,16 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||||||
if (!ir->rc)
|
if (!ir->rc)
|
||||||
goto rc_dev_fail;
|
goto rc_dev_fail;
|
||||||
|
|
||||||
/* flush buffers on the device */
|
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
mce_sync_in(ir, NULL, maxp);
|
|
||||||
|
|
||||||
/* wire up inbound data handler */
|
/* wire up inbound data handler */
|
||||||
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
|
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
|
||||||
maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
|
maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
|
||||||
ir->urb_in->transfer_dma = ir->dma_in;
|
ir->urb_in->transfer_dma = ir->dma_in;
|
||||||
ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
|
||||||
|
/* flush buffers on the device */
|
||||||
|
mce_dbg(&intf->dev, "Flushing receive buffers\n");
|
||||||
|
mce_flush_rx_buffer(ir, maxp);
|
||||||
|
|
||||||
/* initialize device */
|
/* initialize device */
|
||||||
if (ir->flags.microsoft_gen1)
|
if (ir->flags.microsoft_gen1)
|
||||||
mceusb_gen1_init(ir);
|
mceusb_gen1_init(ir);
|
||||||
|
@ -991,7 +991,6 @@ static int nvt_open(struct rc_dev *dev)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&nvt->nvt_lock, flags);
|
spin_lock_irqsave(&nvt->nvt_lock, flags);
|
||||||
nvt->in_use = true;
|
|
||||||
nvt_enable_cir(nvt);
|
nvt_enable_cir(nvt);
|
||||||
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
|
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
|
||||||
|
|
||||||
@ -1004,7 +1003,6 @@ static void nvt_close(struct rc_dev *dev)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&nvt->nvt_lock, flags);
|
spin_lock_irqsave(&nvt->nvt_lock, flags);
|
||||||
nvt->in_use = false;
|
|
||||||
nvt_disable_cir(nvt);
|
nvt_disable_cir(nvt);
|
||||||
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
|
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,6 @@ struct nvt_dev {
|
|||||||
struct ir_raw_event rawir;
|
struct ir_raw_event rawir;
|
||||||
|
|
||||||
spinlock_t nvt_lock;
|
spinlock_t nvt_lock;
|
||||||
bool in_use;
|
|
||||||
|
|
||||||
/* for rx */
|
/* for rx */
|
||||||
u8 buf[RX_BUF_LEN];
|
u8 buf[RX_BUF_LEN];
|
||||||
|
@ -522,17 +522,19 @@ EXPORT_SYMBOL_GPL(rc_g_keycode_from_table);
|
|||||||
/**
|
/**
|
||||||
* ir_do_keyup() - internal function to signal the release of a keypress
|
* ir_do_keyup() - internal function to signal the release of a keypress
|
||||||
* @dev: the struct rc_dev descriptor of the device
|
* @dev: the struct rc_dev descriptor of the device
|
||||||
|
* @sync: whether or not to call input_sync
|
||||||
*
|
*
|
||||||
* This function is used internally to release a keypress, it must be
|
* This function is used internally to release a keypress, it must be
|
||||||
* called with keylock held.
|
* called with keylock held.
|
||||||
*/
|
*/
|
||||||
static void ir_do_keyup(struct rc_dev *dev)
|
static void ir_do_keyup(struct rc_dev *dev, bool sync)
|
||||||
{
|
{
|
||||||
if (!dev->keypressed)
|
if (!dev->keypressed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode);
|
IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode);
|
||||||
input_report_key(dev->input_dev, dev->last_keycode, 0);
|
input_report_key(dev->input_dev, dev->last_keycode, 0);
|
||||||
|
if (sync)
|
||||||
input_sync(dev->input_dev);
|
input_sync(dev->input_dev);
|
||||||
dev->keypressed = false;
|
dev->keypressed = false;
|
||||||
}
|
}
|
||||||
@ -549,7 +551,7 @@ void rc_keyup(struct rc_dev *dev)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&dev->keylock, flags);
|
spin_lock_irqsave(&dev->keylock, flags);
|
||||||
ir_do_keyup(dev);
|
ir_do_keyup(dev, true);
|
||||||
spin_unlock_irqrestore(&dev->keylock, flags);
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rc_keyup);
|
EXPORT_SYMBOL_GPL(rc_keyup);
|
||||||
@ -578,7 +580,7 @@ static void ir_timer_keyup(unsigned long cookie)
|
|||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&dev->keylock, flags);
|
spin_lock_irqsave(&dev->keylock, flags);
|
||||||
if (time_is_before_eq_jiffies(dev->keyup_jiffies))
|
if (time_is_before_eq_jiffies(dev->keyup_jiffies))
|
||||||
ir_do_keyup(dev);
|
ir_do_keyup(dev, true);
|
||||||
spin_unlock_irqrestore(&dev->keylock, flags);
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,6 +599,7 @@ void rc_repeat(struct rc_dev *dev)
|
|||||||
spin_lock_irqsave(&dev->keylock, flags);
|
spin_lock_irqsave(&dev->keylock, flags);
|
||||||
|
|
||||||
input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
|
input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
|
||||||
|
input_sync(dev->input_dev);
|
||||||
|
|
||||||
if (!dev->keypressed)
|
if (!dev->keypressed)
|
||||||
goto out;
|
goto out;
|
||||||
@ -622,29 +625,28 @@ EXPORT_SYMBOL_GPL(rc_repeat);
|
|||||||
static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
||||||
u32 keycode, u8 toggle)
|
u32 keycode, u8 toggle)
|
||||||
{
|
{
|
||||||
|
bool new_event = !dev->keypressed ||
|
||||||
|
dev->last_scancode != scancode ||
|
||||||
|
dev->last_toggle != toggle;
|
||||||
|
|
||||||
|
if (new_event && dev->keypressed)
|
||||||
|
ir_do_keyup(dev, false);
|
||||||
|
|
||||||
input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
|
input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
|
||||||
|
|
||||||
/* Repeat event? */
|
if (new_event && keycode != KEY_RESERVED) {
|
||||||
if (dev->keypressed &&
|
/* Register a keypress */
|
||||||
dev->last_scancode == scancode &&
|
dev->keypressed = true;
|
||||||
dev->last_toggle == toggle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Release old keypress */
|
|
||||||
ir_do_keyup(dev);
|
|
||||||
|
|
||||||
dev->last_scancode = scancode;
|
dev->last_scancode = scancode;
|
||||||
dev->last_toggle = toggle;
|
dev->last_toggle = toggle;
|
||||||
dev->last_keycode = keycode;
|
dev->last_keycode = keycode;
|
||||||
|
|
||||||
if (keycode == KEY_RESERVED)
|
IR_dprintk(1, "%s: key down event, "
|
||||||
return;
|
"key 0x%04x, scancode 0x%04x\n",
|
||||||
|
|
||||||
/* Register a keypress */
|
|
||||||
dev->keypressed = true;
|
|
||||||
IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n",
|
|
||||||
dev->input_name, keycode, scancode);
|
dev->input_name, keycode, scancode);
|
||||||
input_report_key(dev->input_dev, dev->last_keycode, 1);
|
input_report_key(dev->input_dev, keycode, 1);
|
||||||
|
}
|
||||||
|
|
||||||
input_sync(dev->input_dev);
|
input_sync(dev->input_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3474,7 +3474,7 @@ static int radio_s_tuner(struct file *file, void *priv,
|
|||||||
if (0 != t->index)
|
if (0 != t->index)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
bttv_call_all(btv, tuner, g_tuner, t);
|
bttv_call_all(btv, tuner, s_tuner, t);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,14 +695,10 @@ static int cx18_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
|
|||||||
|
|
||||||
cx18_call_all(cx, tuner, g_tuner, vt);
|
cx18_call_all(cx, tuner, g_tuner, vt);
|
||||||
|
|
||||||
if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) {
|
if (vt->type == V4L2_TUNER_RADIO)
|
||||||
strlcpy(vt->name, "cx18 Radio Tuner", sizeof(vt->name));
|
strlcpy(vt->name, "cx18 Radio Tuner", sizeof(vt->name));
|
||||||
vt->type = V4L2_TUNER_RADIO;
|
else
|
||||||
} else {
|
|
||||||
strlcpy(vt->name, "cx18 TV Tuner", sizeof(vt->name));
|
strlcpy(vt->name, "cx18 TV Tuner", sizeof(vt->name));
|
||||||
vt->type = V4L2_TUNER_ANALOG_TV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1184,14 +1184,10 @@ static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
|
|||||||
|
|
||||||
ivtv_call_all(itv, tuner, g_tuner, vt);
|
ivtv_call_all(itv, tuner, g_tuner, vt);
|
||||||
|
|
||||||
if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
|
if (vt->type == V4L2_TUNER_RADIO)
|
||||||
strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
|
strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
|
||||||
vt->type = V4L2_TUNER_RADIO;
|
else
|
||||||
} else {
|
|
||||||
strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
|
strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
|
||||||
vt->type = V4L2_TUNER_ANALOG_TV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
* Header for M-5MOLS 8M Pixel camera sensor with ISP
|
* Header for M-5MOLS 8M Pixel camera sensor with ISP
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||||
* Author: HeungJun Kim, riverful.kim@samsung.com
|
* Author: HeungJun Kim <riverful.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
||||||
* Author: Dongsoo Nathaniel Kim, dongsoo45.kim@samsung.com
|
* Author: Dongsoo Nathaniel Kim <dongsoo45.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -106,23 +106,23 @@ struct m5mols_capture {
|
|||||||
* The each value according to each scenemode is recommended in the documents.
|
* The each value according to each scenemode is recommended in the documents.
|
||||||
*/
|
*/
|
||||||
struct m5mols_scenemode {
|
struct m5mols_scenemode {
|
||||||
u32 metering;
|
u8 metering;
|
||||||
u32 ev_bias;
|
u8 ev_bias;
|
||||||
u32 wb_mode;
|
u8 wb_mode;
|
||||||
u32 wb_preset;
|
u8 wb_preset;
|
||||||
u32 chroma_en;
|
u8 chroma_en;
|
||||||
u32 chroma_lvl;
|
u8 chroma_lvl;
|
||||||
u32 edge_en;
|
u8 edge_en;
|
||||||
u32 edge_lvl;
|
u8 edge_lvl;
|
||||||
u32 af_range;
|
u8 af_range;
|
||||||
u32 fd_mode;
|
u8 fd_mode;
|
||||||
u32 mcc;
|
u8 mcc;
|
||||||
u32 light;
|
u8 light;
|
||||||
u32 flash;
|
u8 flash;
|
||||||
u32 tone;
|
u8 tone;
|
||||||
u32 iso;
|
u8 iso;
|
||||||
u32 capt_mode;
|
u8 capt_mode;
|
||||||
u32 wdr;
|
u8 wdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,7 +154,6 @@ struct m5mols_version {
|
|||||||
u8 str[VERSION_STRING_SIZE];
|
u8 str[VERSION_STRING_SIZE];
|
||||||
u8 af;
|
u8 af;
|
||||||
};
|
};
|
||||||
#define VERSION_SIZE sizeof(struct m5mols_version)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct m5mols_info - M-5MOLS driver data structure
|
* struct m5mols_info - M-5MOLS driver data structure
|
||||||
@ -216,9 +215,9 @@ struct m5mols_info {
|
|||||||
bool lock_ae;
|
bool lock_ae;
|
||||||
bool lock_awb;
|
bool lock_awb;
|
||||||
u8 resolution;
|
u8 resolution;
|
||||||
u32 interrupt;
|
u8 interrupt;
|
||||||
u32 mode;
|
u8 mode;
|
||||||
u32 mode_save;
|
u8 mode_save;
|
||||||
int (*set_power)(struct device *dev, int on);
|
int (*set_power)(struct device *dev, int on);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -256,9 +255,11 @@ struct m5mols_info {
|
|||||||
* +-------+---+----------+-----+------+------+------+------+
|
* +-------+---+----------+-----+------+------+------+------+
|
||||||
* - d[0..3]: according to size1
|
* - d[0..3]: according to size1
|
||||||
*/
|
*/
|
||||||
int m5mols_read(struct v4l2_subdev *sd, u32 reg_comb, u32 *val);
|
int m5mols_read_u8(struct v4l2_subdev *sd, u32 reg_comb, u8 *val);
|
||||||
|
int m5mols_read_u16(struct v4l2_subdev *sd, u32 reg_comb, u16 *val);
|
||||||
|
int m5mols_read_u32(struct v4l2_subdev *sd, u32 reg_comb, u32 *val);
|
||||||
int m5mols_write(struct v4l2_subdev *sd, u32 reg_comb, u32 val);
|
int m5mols_write(struct v4l2_subdev *sd, u32 reg_comb, u32 val);
|
||||||
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 value);
|
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u8 value);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mode operation of the M-5MOLS
|
* Mode operation of the M-5MOLS
|
||||||
@ -280,12 +281,12 @@ int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 value);
|
|||||||
* The available executing order between each modes are as follows:
|
* The available executing order between each modes are as follows:
|
||||||
* PARAMETER <---> MONITOR <---> CAPTURE
|
* PARAMETER <---> MONITOR <---> CAPTURE
|
||||||
*/
|
*/
|
||||||
int m5mols_mode(struct m5mols_info *info, u32 mode);
|
int m5mols_mode(struct m5mols_info *info, u8 mode);
|
||||||
|
|
||||||
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg);
|
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u8 reg);
|
||||||
int m5mols_sync_controls(struct m5mols_info *info);
|
int m5mols_sync_controls(struct m5mols_info *info);
|
||||||
int m5mols_start_capture(struct m5mols_info *info);
|
int m5mols_start_capture(struct m5mols_info *info);
|
||||||
int m5mols_do_scenemode(struct m5mols_info *info, u32 mode);
|
int m5mols_do_scenemode(struct m5mols_info *info, u8 mode);
|
||||||
int m5mols_lock_3a(struct m5mols_info *info, bool lock);
|
int m5mols_lock_3a(struct m5mols_info *info, bool lock);
|
||||||
int m5mols_set_ctrl(struct v4l2_ctrl *ctrl);
|
int m5mols_set_ctrl(struct v4l2_ctrl *ctrl);
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
* The Capture code for Fujitsu M-5MOLS ISP
|
* The Capture code for Fujitsu M-5MOLS ISP
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||||
* Author: HeungJun Kim, riverful.kim@samsung.com
|
* Author: HeungJun Kim <riverful.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
||||||
* Author: Dongsoo Nathaniel Kim, dongsoo45.kim@samsung.com
|
* Author: Dongsoo Nathaniel Kim <dongsoo45.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -58,9 +58,9 @@ static int m5mols_read_rational(struct v4l2_subdev *sd, u32 addr_num,
|
|||||||
{
|
{
|
||||||
u32 num, den;
|
u32 num, den;
|
||||||
|
|
||||||
int ret = m5mols_read(sd, addr_num, &num);
|
int ret = m5mols_read_u32(sd, addr_num, &num);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, addr_den, &den);
|
ret = m5mols_read_u32(sd, addr_den, &den);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
*val = den == 0 ? 0 : num / den;
|
*val = den == 0 ? 0 : num / den;
|
||||||
@ -99,20 +99,20 @@ static int m5mols_capture_info(struct m5mols_info *info)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = m5mols_read(sd, EXIF_INFO_ISO, (u32 *)&exif->iso_speed);
|
ret = m5mols_read_u16(sd, EXIF_INFO_ISO, &exif->iso_speed);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, EXIF_INFO_FLASH, (u32 *)&exif->flash);
|
ret = m5mols_read_u16(sd, EXIF_INFO_FLASH, &exif->flash);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, EXIF_INFO_SDR, (u32 *)&exif->sdr);
|
ret = m5mols_read_u16(sd, EXIF_INFO_SDR, &exif->sdr);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, EXIF_INFO_QVAL, (u32 *)&exif->qval);
|
ret = m5mols_read_u16(sd, EXIF_INFO_QVAL, &exif->qval);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, CAPC_IMAGE_SIZE, &info->cap.main);
|
ret = m5mols_read_u32(sd, CAPC_IMAGE_SIZE, &info->cap.main);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_read(sd, CAPC_THUMB_SIZE, &info->cap.thumb);
|
ret = m5mols_read_u32(sd, CAPC_THUMB_SIZE, &info->cap.thumb);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
info->cap.total = info->cap.main + info->cap.thumb;
|
info->cap.total = info->cap.main + info->cap.thumb;
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ static int m5mols_capture_info(struct m5mols_info *info)
|
|||||||
int m5mols_start_capture(struct m5mols_info *info)
|
int m5mols_start_capture(struct m5mols_info *info)
|
||||||
{
|
{
|
||||||
struct v4l2_subdev *sd = &info->sd;
|
struct v4l2_subdev *sd = &info->sd;
|
||||||
u32 resolution = info->resolution;
|
u8 resolution = info->resolution;
|
||||||
int timeout;
|
int timeout;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
* Controls for M-5MOLS 8M Pixel camera sensor with ISP
|
* Controls for M-5MOLS 8M Pixel camera sensor with ISP
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||||
* Author: HeungJun Kim, riverful.kim@samsung.com
|
* Author: HeungJun Kim <riverful.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
||||||
* Author: Dongsoo Nathaniel Kim, dongsoo45.kim@samsung.com
|
* Author: Dongsoo Nathaniel Kim <dongsoo45.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -130,7 +130,7 @@ static struct m5mols_scenemode m5mols_default_scenemode[] = {
|
|||||||
*
|
*
|
||||||
* WARNING: The execution order is important. Do not change the order.
|
* WARNING: The execution order is important. Do not change the order.
|
||||||
*/
|
*/
|
||||||
int m5mols_do_scenemode(struct m5mols_info *info, u32 mode)
|
int m5mols_do_scenemode(struct m5mols_info *info, u8 mode)
|
||||||
{
|
{
|
||||||
struct v4l2_subdev *sd = &info->sd;
|
struct v4l2_subdev *sd = &info->sd;
|
||||||
struct m5mols_scenemode scenemode = m5mols_default_scenemode[mode];
|
struct m5mols_scenemode scenemode = m5mols_default_scenemode[mode];
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
* Driver for M-5MOLS 8M Pixel camera sensor with ISP
|
* Driver for M-5MOLS 8M Pixel camera sensor with ISP
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||||
* Author: HeungJun Kim, riverful.kim@samsung.com
|
* Author: HeungJun Kim <riverful.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
||||||
* Author: Dongsoo Nathaniel Kim, dongsoo45.kim@samsung.com
|
* Author: Dongsoo Nathaniel Kim <dongsoo45.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -133,13 +133,13 @@ static u32 m5mols_swap_byte(u8 *data, u8 length)
|
|||||||
/**
|
/**
|
||||||
* m5mols_read - I2C read function
|
* m5mols_read - I2C read function
|
||||||
* @reg: combination of size, category and command for the I2C packet
|
* @reg: combination of size, category and command for the I2C packet
|
||||||
|
* @size: desired size of I2C packet
|
||||||
* @val: read value
|
* @val: read value
|
||||||
*/
|
*/
|
||||||
int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
|
static int m5mols_read(struct v4l2_subdev *sd, u32 size, u32 reg, u32 *val)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
u8 rbuf[M5MOLS_I2C_MAX_SIZE + 1];
|
u8 rbuf[M5MOLS_I2C_MAX_SIZE + 1];
|
||||||
u8 size = I2C_SIZE(reg);
|
|
||||||
u8 category = I2C_CATEGORY(reg);
|
u8 category = I2C_CATEGORY(reg);
|
||||||
u8 cmd = I2C_COMMAND(reg);
|
u8 cmd = I2C_COMMAND(reg);
|
||||||
struct i2c_msg msg[2];
|
struct i2c_msg msg[2];
|
||||||
@ -149,11 +149,6 @@ int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
|
|||||||
if (!client->adapter)
|
if (!client->adapter)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (size != 1 && size != 2 && size != 4) {
|
|
||||||
v4l2_err(sd, "Wrong data size\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg[0].addr = client->addr;
|
msg[0].addr = client->addr;
|
||||||
msg[0].flags = 0;
|
msg[0].flags = 0;
|
||||||
msg[0].len = 5;
|
msg[0].len = 5;
|
||||||
@ -184,6 +179,52 @@ int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int m5mols_read_u8(struct v4l2_subdev *sd, u32 reg, u8 *val)
|
||||||
|
{
|
||||||
|
u32 val_32;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (I2C_SIZE(reg) != 1) {
|
||||||
|
v4l2_err(sd, "Wrong data size\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = m5mols_read(sd, I2C_SIZE(reg), reg, &val_32);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
*val = (u8)val_32;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int m5mols_read_u16(struct v4l2_subdev *sd, u32 reg, u16 *val)
|
||||||
|
{
|
||||||
|
u32 val_32;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (I2C_SIZE(reg) != 2) {
|
||||||
|
v4l2_err(sd, "Wrong data size\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = m5mols_read(sd, I2C_SIZE(reg), reg, &val_32);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
*val = (u16)val_32;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int m5mols_read_u32(struct v4l2_subdev *sd, u32 reg, u32 *val)
|
||||||
|
{
|
||||||
|
if (I2C_SIZE(reg) != 4) {
|
||||||
|
v4l2_err(sd, "Wrong data size\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m5mols_read(sd, I2C_SIZE(reg), reg, val);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* m5mols_write - I2C command write function
|
* m5mols_write - I2C command write function
|
||||||
* @reg: combination of size, category and command for the I2C packet
|
* @reg: combination of size, category and command for the I2C packet
|
||||||
@ -231,13 +272,14 @@ int m5mols_write(struct v4l2_subdev *sd, u32 reg, u32 val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 mask)
|
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u8 mask)
|
||||||
{
|
{
|
||||||
u32 busy, i;
|
u8 busy;
|
||||||
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
for (i = 0; i < M5MOLS_I2C_CHECK_RETRY; i++) {
|
for (i = 0; i < M5MOLS_I2C_CHECK_RETRY; i++) {
|
||||||
ret = m5mols_read(sd, I2C_REG(category, cmd, 1), &busy);
|
ret = m5mols_read_u8(sd, I2C_REG(category, cmd, 1), &busy);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if ((busy & mask) == mask)
|
if ((busy & mask) == mask)
|
||||||
@ -252,14 +294,14 @@ int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 mask)
|
|||||||
* Before writing desired interrupt value the INT_FACTOR register should
|
* Before writing desired interrupt value the INT_FACTOR register should
|
||||||
* be read to clear pending interrupts.
|
* be read to clear pending interrupts.
|
||||||
*/
|
*/
|
||||||
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg)
|
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u8 reg)
|
||||||
{
|
{
|
||||||
struct m5mols_info *info = to_m5mols(sd);
|
struct m5mols_info *info = to_m5mols(sd);
|
||||||
u32 mask = is_available_af(info) ? REG_INT_AF : 0;
|
u8 mask = is_available_af(info) ? REG_INT_AF : 0;
|
||||||
u32 dummy;
|
u8 dummy;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = m5mols_read(sd, SYSTEM_INT_FACTOR, &dummy);
|
ret = m5mols_read_u8(sd, SYSTEM_INT_FACTOR, &dummy);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = m5mols_write(sd, SYSTEM_INT_ENABLE, reg & ~mask);
|
ret = m5mols_write(sd, SYSTEM_INT_ENABLE, reg & ~mask);
|
||||||
return ret;
|
return ret;
|
||||||
@ -271,7 +313,7 @@ int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg)
|
|||||||
* It always accompanies a little delay changing the M-5MOLS mode, so it is
|
* It always accompanies a little delay changing the M-5MOLS mode, so it is
|
||||||
* needed checking current busy status to guarantee right mode.
|
* needed checking current busy status to guarantee right mode.
|
||||||
*/
|
*/
|
||||||
static int m5mols_reg_mode(struct v4l2_subdev *sd, u32 mode)
|
static int m5mols_reg_mode(struct v4l2_subdev *sd, u8 mode)
|
||||||
{
|
{
|
||||||
int ret = m5mols_write(sd, SYSTEM_SYSMODE, mode);
|
int ret = m5mols_write(sd, SYSTEM_SYSMODE, mode);
|
||||||
|
|
||||||
@ -286,16 +328,16 @@ static int m5mols_reg_mode(struct v4l2_subdev *sd, u32 mode)
|
|||||||
* can be guaranteed only when the sensor is operating in mode which which
|
* can be guaranteed only when the sensor is operating in mode which which
|
||||||
* a command belongs to.
|
* a command belongs to.
|
||||||
*/
|
*/
|
||||||
int m5mols_mode(struct m5mols_info *info, u32 mode)
|
int m5mols_mode(struct m5mols_info *info, u8 mode)
|
||||||
{
|
{
|
||||||
struct v4l2_subdev *sd = &info->sd;
|
struct v4l2_subdev *sd = &info->sd;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
u32 reg;
|
u8 reg;
|
||||||
|
|
||||||
if (mode < REG_PARAMETER && mode > REG_CAPTURE)
|
if (mode < REG_PARAMETER && mode > REG_CAPTURE)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = m5mols_read(sd, SYSTEM_SYSMODE, ®);
|
ret = m5mols_read_u8(sd, SYSTEM_SYSMODE, ®);
|
||||||
if ((!ret && reg == mode) || ret)
|
if ((!ret && reg == mode) || ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -344,41 +386,37 @@ int m5mols_mode(struct m5mols_info *info, u32 mode)
|
|||||||
static int m5mols_get_version(struct v4l2_subdev *sd)
|
static int m5mols_get_version(struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
struct m5mols_info *info = to_m5mols(sd);
|
struct m5mols_info *info = to_m5mols(sd);
|
||||||
union {
|
struct m5mols_version *ver = &info->ver;
|
||||||
struct m5mols_version ver;
|
u8 *str = ver->str;
|
||||||
u8 bytes[VERSION_SIZE];
|
int i;
|
||||||
} version;
|
|
||||||
u32 *value;
|
|
||||||
u8 cmd = CAT0_VER_CUSTOMER;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
do {
|
ret = m5mols_read_u8(sd, SYSTEM_VER_CUSTOMER, &ver->customer);
|
||||||
value = (u32 *)&version.bytes[cmd];
|
if (!ret)
|
||||||
ret = m5mols_read(sd, SYSTEM_CMD(cmd), value);
|
ret = m5mols_read_u8(sd, SYSTEM_VER_PROJECT, &ver->project);
|
||||||
if (ret)
|
if (!ret)
|
||||||
return ret;
|
ret = m5mols_read_u16(sd, SYSTEM_VER_FIRMWARE, &ver->fw);
|
||||||
} while (cmd++ != CAT0_VER_AWB);
|
if (!ret)
|
||||||
|
ret = m5mols_read_u16(sd, SYSTEM_VER_HARDWARE, &ver->hw);
|
||||||
do {
|
if (!ret)
|
||||||
value = (u32 *)&version.bytes[cmd];
|
ret = m5mols_read_u16(sd, SYSTEM_VER_PARAMETER, &ver->param);
|
||||||
ret = m5mols_read(sd, SYSTEM_VER_STRING, value);
|
if (!ret)
|
||||||
if (ret)
|
ret = m5mols_read_u16(sd, SYSTEM_VER_AWB, &ver->awb);
|
||||||
return ret;
|
if (!ret)
|
||||||
if (cmd >= VERSION_SIZE - 1)
|
ret = m5mols_read_u8(sd, AF_VERSION, &ver->af);
|
||||||
return -EINVAL;
|
|
||||||
} while (version.bytes[cmd++]);
|
|
||||||
|
|
||||||
value = (u32 *)&version.bytes[cmd];
|
|
||||||
ret = m5mols_read(sd, AF_VERSION, value);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* store version information swapped for being readable */
|
for (i = 0; i < VERSION_STRING_SIZE; i++) {
|
||||||
info->ver = version.ver;
|
ret = m5mols_read_u8(sd, SYSTEM_VER_STRING, &str[i]);
|
||||||
info->ver.fw = be16_to_cpu(info->ver.fw);
|
if (ret)
|
||||||
info->ver.hw = be16_to_cpu(info->ver.hw);
|
return ret;
|
||||||
info->ver.param = be16_to_cpu(info->ver.param);
|
}
|
||||||
info->ver.awb = be16_to_cpu(info->ver.awb);
|
|
||||||
|
ver->fw = be16_to_cpu(ver->fw);
|
||||||
|
ver->hw = be16_to_cpu(ver->hw);
|
||||||
|
ver->param = be16_to_cpu(ver->param);
|
||||||
|
ver->awb = be16_to_cpu(ver->awb);
|
||||||
|
|
||||||
v4l2_info(sd, "Manufacturer\t[%s]\n",
|
v4l2_info(sd, "Manufacturer\t[%s]\n",
|
||||||
is_manufacturer(info, REG_SAMSUNG_ELECTRO) ?
|
is_manufacturer(info, REG_SAMSUNG_ELECTRO) ?
|
||||||
@ -722,7 +760,7 @@ static int m5mols_init_controls(struct m5mols_info *info)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Determine value's range & step of controls for various FW version */
|
/* Determine value's range & step of controls for various FW version */
|
||||||
ret = m5mols_read(sd, AE_MAX_GAIN_MON, (u32 *)&max_exposure);
|
ret = m5mols_read_u16(sd, AE_MAX_GAIN_MON, &max_exposure);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
step_zoom = is_manufacturer(info, REG_SAMSUNG_OPTICS) ? 31 : 1;
|
step_zoom = is_manufacturer(info, REG_SAMSUNG_OPTICS) ? 31 : 1;
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -842,18 +880,18 @@ static void m5mols_irq_work(struct work_struct *work)
|
|||||||
struct m5mols_info *info =
|
struct m5mols_info *info =
|
||||||
container_of(work, struct m5mols_info, work_irq);
|
container_of(work, struct m5mols_info, work_irq);
|
||||||
struct v4l2_subdev *sd = &info->sd;
|
struct v4l2_subdev *sd = &info->sd;
|
||||||
u32 reg;
|
u8 reg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!is_powered(info) ||
|
if (!is_powered(info) ||
|
||||||
m5mols_read(sd, SYSTEM_INT_FACTOR, &info->interrupt))
|
m5mols_read_u8(sd, SYSTEM_INT_FACTOR, &info->interrupt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (info->interrupt & REG_INT_MASK) {
|
switch (info->interrupt & REG_INT_MASK) {
|
||||||
case REG_INT_AF:
|
case REG_INT_AF:
|
||||||
if (!is_available_af(info))
|
if (!is_available_af(info))
|
||||||
break;
|
break;
|
||||||
ret = m5mols_read(sd, AF_STATUS, ®);
|
ret = m5mols_read_u8(sd, AF_STATUS, ®);
|
||||||
v4l2_dbg(2, m5mols_debug, sd, "AF %s\n",
|
v4l2_dbg(2, m5mols_debug, sd, "AF %s\n",
|
||||||
reg == REG_AF_FAIL ? "Failed" :
|
reg == REG_AF_FAIL ? "Failed" :
|
||||||
reg == REG_AF_SUCCESS ? "Success" :
|
reg == REG_AF_SUCCESS ? "Success" :
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
* Register map for M-5MOLS 8M Pixel camera sensor with ISP
|
* Register map for M-5MOLS 8M Pixel camera sensor with ISP
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||||
* Author: HeungJun Kim, riverful.kim@samsung.com
|
* Author: HeungJun Kim <riverful.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
* Copyright (C) 2009 Samsung Electronics Co., Ltd.
|
||||||
* Author: Dongsoo Nathaniel Kim, dongsoo45.kim@samsung.com
|
* Author: Dongsoo Nathaniel Kim <dongsoo45.kim@samsung.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -56,13 +56,24 @@
|
|||||||
* more specific contents, see definition if file m5mols.h.
|
* more specific contents, see definition if file m5mols.h.
|
||||||
*/
|
*/
|
||||||
#define CAT0_VER_CUSTOMER 0x00 /* customer version */
|
#define CAT0_VER_CUSTOMER 0x00 /* customer version */
|
||||||
#define CAT0_VER_AWB 0x09 /* Auto WB version */
|
#define CAT0_VER_PROJECT 0x01 /* project version */
|
||||||
|
#define CAT0_VER_FIRMWARE 0x02 /* Firmware version */
|
||||||
|
#define CAT0_VER_HARDWARE 0x04 /* Hardware version */
|
||||||
|
#define CAT0_VER_PARAMETER 0x06 /* Parameter version */
|
||||||
|
#define CAT0_VER_AWB 0x08 /* Auto WB version */
|
||||||
#define CAT0_VER_STRING 0x0a /* string including M-5MOLS */
|
#define CAT0_VER_STRING 0x0a /* string including M-5MOLS */
|
||||||
#define CAT0_SYSMODE 0x0b /* SYSTEM mode register */
|
#define CAT0_SYSMODE 0x0b /* SYSTEM mode register */
|
||||||
#define CAT0_STATUS 0x0c /* SYSTEM mode status register */
|
#define CAT0_STATUS 0x0c /* SYSTEM mode status register */
|
||||||
#define CAT0_INT_FACTOR 0x10 /* interrupt pending register */
|
#define CAT0_INT_FACTOR 0x10 /* interrupt pending register */
|
||||||
#define CAT0_INT_ENABLE 0x11 /* interrupt enable register */
|
#define CAT0_INT_ENABLE 0x11 /* interrupt enable register */
|
||||||
|
|
||||||
|
#define SYSTEM_VER_CUSTOMER I2C_REG(CAT_SYSTEM, CAT0_VER_CUSTOMER, 1)
|
||||||
|
#define SYSTEM_VER_PROJECT I2C_REG(CAT_SYSTEM, CAT0_VER_PROJECT, 1)
|
||||||
|
#define SYSTEM_VER_FIRMWARE I2C_REG(CAT_SYSTEM, CAT0_VER_FIRMWARE, 2)
|
||||||
|
#define SYSTEM_VER_HARDWARE I2C_REG(CAT_SYSTEM, CAT0_VER_HARDWARE, 2)
|
||||||
|
#define SYSTEM_VER_PARAMETER I2C_REG(CAT_SYSTEM, CAT0_VER_PARAMETER, 2)
|
||||||
|
#define SYSTEM_VER_AWB I2C_REG(CAT_SYSTEM, CAT0_VER_AWB, 2)
|
||||||
|
|
||||||
#define SYSTEM_SYSMODE I2C_REG(CAT_SYSTEM, CAT0_SYSMODE, 1)
|
#define SYSTEM_SYSMODE I2C_REG(CAT_SYSTEM, CAT0_SYSMODE, 1)
|
||||||
#define REG_SYSINIT 0x00 /* SYSTEM mode */
|
#define REG_SYSINIT 0x00 /* SYSTEM mode */
|
||||||
#define REG_PARAMETER 0x01 /* PARAMETER mode */
|
#define REG_PARAMETER 0x01 /* PARAMETER mode */
|
||||||
@ -382,8 +393,8 @@
|
|||||||
#define REG_CAP_START_MAIN 0x01
|
#define REG_CAP_START_MAIN 0x01
|
||||||
#define REG_CAP_START_THUMB 0x03
|
#define REG_CAP_START_THUMB 0x03
|
||||||
|
|
||||||
#define CAPC_IMAGE_SIZE I2C_REG(CAT_CAPT_CTRL, CATC_CAP_IMAGE_SIZE, 1)
|
#define CAPC_IMAGE_SIZE I2C_REG(CAT_CAPT_CTRL, CATC_CAP_IMAGE_SIZE, 4)
|
||||||
#define CAPC_THUMB_SIZE I2C_REG(CAT_CAPT_CTRL, CATC_CAP_THUMB_SIZE, 1)
|
#define CAPC_THUMB_SIZE I2C_REG(CAT_CAPT_CTRL, CATC_CAP_THUMB_SIZE, 4)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Category F - Flash
|
* Category F - Flash
|
||||||
|
@ -480,12 +480,14 @@ static int msp_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
|
|||||||
struct msp_state *state = to_state(sd);
|
struct msp_state *state = to_state(sd);
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
|
|
||||||
if (state->radio)
|
if (vt->type != V4L2_TUNER_ANALOG_TV)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!state->radio) {
|
||||||
if (state->opmode == OPMODE_AUTOSELECT)
|
if (state->opmode == OPMODE_AUTOSELECT)
|
||||||
msp_detect_stereo(client);
|
msp_detect_stereo(client);
|
||||||
vt->audmode = state->audmode;
|
|
||||||
vt->rxsubchans = state->rxsubchans;
|
vt->rxsubchans = state->rxsubchans;
|
||||||
|
}
|
||||||
|
vt->audmode = state->audmode;
|
||||||
vt->capability |= V4L2_TUNER_CAP_STEREO |
|
vt->capability |= V4L2_TUNER_CAP_STEREO |
|
||||||
V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
|
V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -444,12 +444,9 @@ static int mx1_camera_add_device(struct soc_camera_device *icd)
|
|||||||
{
|
{
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
||||||
struct mx1_camera_dev *pcdev = ici->priv;
|
struct mx1_camera_dev *pcdev = ici->priv;
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (pcdev->icd) {
|
if (pcdev->icd)
|
||||||
ret = -EBUSY;
|
return -EBUSY;
|
||||||
goto ebusy;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_info(icd->dev.parent, "MX1 Camera driver attached to camera %d\n",
|
dev_info(icd->dev.parent, "MX1 Camera driver attached to camera %d\n",
|
||||||
icd->devnum);
|
icd->devnum);
|
||||||
@ -458,8 +455,7 @@ static int mx1_camera_add_device(struct soc_camera_device *icd)
|
|||||||
|
|
||||||
pcdev->icd = icd;
|
pcdev->icd = icd;
|
||||||
|
|
||||||
ebusy:
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mx1_camera_remove_device(struct soc_camera_device *icd)
|
static void mx1_camera_remove_device(struct soc_camera_device *icd)
|
||||||
|
@ -982,6 +982,14 @@ static int omap_vout_buffer_setup(struct videobuf_queue *q, unsigned int *count,
|
|||||||
startindex = (vout->vid == OMAP_VIDEO1) ?
|
startindex = (vout->vid == OMAP_VIDEO1) ?
|
||||||
video1_numbuffers : video2_numbuffers;
|
video1_numbuffers : video2_numbuffers;
|
||||||
|
|
||||||
|
/* Check the size of the buffer */
|
||||||
|
if (*size > vout->buffer_size) {
|
||||||
|
v4l2_err(&vout->vid_dev->v4l2_dev,
|
||||||
|
"buffer allocation mismatch [%u] [%u]\n",
|
||||||
|
*size, vout->buffer_size);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = startindex; i < *count; i++) {
|
for (i = startindex; i < *count; i++) {
|
||||||
vout->buffer_size = *size;
|
vout->buffer_size = *size;
|
||||||
|
|
||||||
@ -1228,6 +1236,14 @@ static int omap_vout_mmap(struct file *file, struct vm_area_struct *vma)
|
|||||||
(vma->vm_pgoff << PAGE_SHIFT));
|
(vma->vm_pgoff << PAGE_SHIFT));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
/* Check the size of the buffer */
|
||||||
|
if (size > vout->buffer_size) {
|
||||||
|
v4l2_err(&vout->vid_dev->v4l2_dev,
|
||||||
|
"insufficient memory [%lu] [%u]\n",
|
||||||
|
size, vout->buffer_size);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
q->bufs[i]->baddr = vma->vm_start;
|
q->bufs[i]->baddr = vma->vm_start;
|
||||||
|
|
||||||
vma->vm_flags |= VM_RESERVED;
|
vma->vm_flags |= VM_RESERVED;
|
||||||
@ -2391,7 +2407,7 @@ static int __init omap_vout_create_video_devices(struct platform_device *pdev)
|
|||||||
/* Register the Video device with V4L2
|
/* Register the Video device with V4L2
|
||||||
*/
|
*/
|
||||||
vfd = vout->vfd;
|
vfd = vout->vfd;
|
||||||
if (video_register_device(vfd, VFL_TYPE_GRABBER, k + 1) < 0) {
|
if (video_register_device(vfd, VFL_TYPE_GRABBER, -1) < 0) {
|
||||||
dev_err(&pdev->dev, ": Could not register "
|
dev_err(&pdev->dev, ": Could not register "
|
||||||
"Video for Linux device\n");
|
"Video for Linux device\n");
|
||||||
vfd->minor = -1;
|
vfd->minor = -1;
|
||||||
|
@ -193,7 +193,7 @@ int omap_vout_new_crop(struct v4l2_pix_format *pix,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (cpu_is_omap24xx()) {
|
if (cpu_is_omap24xx()) {
|
||||||
if (crop->height != win->w.height) {
|
if (try_crop.height != win->w.height) {
|
||||||
/* If we're resizing vertically, we can't support a
|
/* If we're resizing vertically, we can't support a
|
||||||
* crop width wider than 768 pixels.
|
* crop width wider than 768 pixels.
|
||||||
*/
|
*/
|
||||||
@ -202,7 +202,7 @@ int omap_vout_new_crop(struct v4l2_pix_format *pix,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* vertical resizing */
|
/* vertical resizing */
|
||||||
vresize = (1024 * crop->height) / win->w.height;
|
vresize = (1024 * try_crop.height) / win->w.height;
|
||||||
if (cpu_is_omap24xx() && (vresize > 2048))
|
if (cpu_is_omap24xx() && (vresize > 2048))
|
||||||
vresize = 2048;
|
vresize = 2048;
|
||||||
else if (cpu_is_omap34xx() && (vresize > 4096))
|
else if (cpu_is_omap34xx() && (vresize > 4096))
|
||||||
@ -221,7 +221,7 @@ int omap_vout_new_crop(struct v4l2_pix_format *pix,
|
|||||||
try_crop.height = 2;
|
try_crop.height = 2;
|
||||||
}
|
}
|
||||||
/* horizontal resizing */
|
/* horizontal resizing */
|
||||||
hresize = (1024 * crop->width) / win->w.width;
|
hresize = (1024 * try_crop.width) / win->w.width;
|
||||||
if (cpu_is_omap24xx() && (hresize > 2048))
|
if (cpu_is_omap24xx() && (hresize > 2048))
|
||||||
hresize = 2048;
|
hresize = 2048;
|
||||||
else if (cpu_is_omap34xx() && (hresize > 4096))
|
else if (cpu_is_omap34xx() && (hresize > 4096))
|
||||||
|
@ -1748,7 +1748,7 @@ static int isp_register_entities(struct isp_device *isp)
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* Register external entities */
|
/* Register external entities */
|
||||||
for (subdevs = pdata->subdevs; subdevs->subdevs; ++subdevs) {
|
for (subdevs = pdata->subdevs; subdevs && subdevs->subdevs; ++subdevs) {
|
||||||
struct v4l2_subdev *sensor;
|
struct v4l2_subdev *sensor;
|
||||||
struct media_entity *input;
|
struct media_entity *input;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
@ -3046,6 +3046,8 @@ static void pvr2_subdev_update(struct pvr2_hdw *hdw)
|
|||||||
if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_tuner vt;
|
struct v4l2_tuner vt;
|
||||||
memset(&vt, 0, sizeof(vt));
|
memset(&vt, 0, sizeof(vt));
|
||||||
|
vt.type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ?
|
||||||
|
V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
|
||||||
vt.audmode = hdw->audiomode_val;
|
vt.audmode = hdw->audiomode_val;
|
||||||
v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
|
v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
|
||||||
}
|
}
|
||||||
@ -5171,6 +5173,8 @@ void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
|
|||||||
{
|
{
|
||||||
struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
|
struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
|
||||||
memset(vtp, 0, sizeof(*vtp));
|
memset(vtp, 0, sizeof(*vtp));
|
||||||
|
vtp->type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ?
|
||||||
|
V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
|
||||||
hdw->tuner_signal_stale = 0;
|
hdw->tuner_signal_stale = 0;
|
||||||
/* Note: There apparently is no replacement for VIDIOC_CROPCAP
|
/* Note: There apparently is no replacement for VIDIOC_CROPCAP
|
||||||
using v4l2-subdev - therefore we can't support that AT ALL right
|
using v4l2-subdev - therefore we can't support that AT ALL right
|
||||||
|
@ -1414,7 +1414,7 @@ long pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
|
|||||||
{
|
{
|
||||||
ARG_DEF(struct pwc_probe, probe)
|
ARG_DEF(struct pwc_probe, probe)
|
||||||
|
|
||||||
strcpy(ARGR(probe).name, pdev->vdev->name);
|
strcpy(ARGR(probe).name, pdev->vdev.name);
|
||||||
ARGR(probe).type = pdev->type;
|
ARGR(probe).type = pdev->type;
|
||||||
ARG_OUT(probe)
|
ARG_OUT(probe)
|
||||||
break;
|
break;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user