Merge branch 'master' into for-next
This commit is contained in:
commit
5b1a4bf220
12
.gitignore
vendored
12
.gitignore
vendored
@ -3,6 +3,10 @@
|
|||||||
# subdirectories here. Add them in the ".gitignore" file
|
# subdirectories here. Add them in the ".gitignore" file
|
||||||
# in that subdirectory instead.
|
# in that subdirectory instead.
|
||||||
#
|
#
|
||||||
|
# NOTE! Please use 'git-ls-files -i --exclude-standard'
|
||||||
|
# command after changing this file, to see if there are
|
||||||
|
# any tracked files which get ignored after the change.
|
||||||
|
#
|
||||||
# Normal rules
|
# Normal rules
|
||||||
#
|
#
|
||||||
.*
|
.*
|
||||||
@ -18,19 +22,21 @@
|
|||||||
*.lst
|
*.lst
|
||||||
*.symtypes
|
*.symtypes
|
||||||
*.order
|
*.order
|
||||||
|
*.elf
|
||||||
|
*.bin
|
||||||
|
*.gz
|
||||||
|
|
||||||
#
|
#
|
||||||
# Top-level generic files
|
# Top-level generic files
|
||||||
#
|
#
|
||||||
tags
|
tags
|
||||||
TAGS
|
TAGS
|
||||||
vmlinux*
|
vmlinux
|
||||||
!vmlinux.lds.S
|
|
||||||
!vmlinux.lds.h
|
|
||||||
System.map
|
System.map
|
||||||
Module.markers
|
Module.markers
|
||||||
Module.symvers
|
Module.symvers
|
||||||
!.gitignore
|
!.gitignore
|
||||||
|
!.mailmap
|
||||||
|
|
||||||
#
|
#
|
||||||
# Generated include files
|
# Generated include files
|
||||||
|
5
CREDITS
5
CREDITS
@ -2611,8 +2611,9 @@ S: Perth, Western Australia
|
|||||||
S: Australia
|
S: Australia
|
||||||
|
|
||||||
N: Miguel Ojeda Sandonis
|
N: Miguel Ojeda Sandonis
|
||||||
E: maxextreme@gmail.com
|
E: miguel.ojeda.sandonis@gmail.com
|
||||||
W: http://maxextreme.googlepages.com/
|
W: http://miguelojeda.es
|
||||||
|
W: http://jair.lab.fi.uva.es/~migojed/
|
||||||
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
||||||
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
||||||
S: C/ Mieses 20, 9-B
|
S: C/ Mieses 20, 9-B
|
||||||
|
@ -24,6 +24,8 @@ There are three different groups of fields in the struct taskstats:
|
|||||||
|
|
||||||
4) Per-task and per-thread context switch count statistics
|
4) Per-task and per-thread context switch count statistics
|
||||||
|
|
||||||
|
5) Time accounting for SMT machines
|
||||||
|
|
||||||
Future extension should add fields to the end of the taskstats struct, and
|
Future extension should add fields to the end of the taskstats struct, and
|
||||||
should not change the relative position of each field within the struct.
|
should not change the relative position of each field within the struct.
|
||||||
|
|
||||||
@ -164,4 +166,8 @@ struct taskstats {
|
|||||||
__u64 nvcsw; /* Context voluntary switch counter */
|
__u64 nvcsw; /* Context voluntary switch counter */
|
||||||
__u64 nivcsw; /* Context involuntary switch counter */
|
__u64 nivcsw; /* Context involuntary switch counter */
|
||||||
|
|
||||||
|
5) Time accounting for SMT machines
|
||||||
|
__u64 ac_utimescaled; /* utime scaled on frequency etc */
|
||||||
|
__u64 ac_stimescaled; /* stime scaled on frequency etc */
|
||||||
|
__u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
===================================
|
===================================
|
||||||
|
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
Author & Maintainer: Miguel Ojeda Sandonis
|
||||||
Date: 2006-10-27
|
Date: 2006-10-27
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ Date: 2006-10-27
|
|||||||
1. DRIVER INFORMATION
|
1. DRIVER INFORMATION
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
This driver support one cfag12864b display at time.
|
This driver supports a cfag12864b LCD.
|
||||||
|
|
||||||
|
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* Description: cfag12864b LCD userspace example program
|
* Description: cfag12864b LCD userspace example program
|
||||||
* License: GPLv2
|
* License: GPLv2
|
||||||
*
|
*
|
||||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||||
* Date: 2006-10-31
|
* Date: 2006-10-31
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
Author & Maintainer: Miguel Ojeda Sandonis
|
||||||
Date: 2006-10-27
|
Date: 2006-10-27
|
||||||
|
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ Date: 2006-10-27
|
|||||||
1. DRIVER INFORMATION
|
1. DRIVER INFORMATION
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
This driver support the ks0108 LCD controller.
|
This driver supports the ks0108 LCD controller.
|
||||||
|
|
||||||
|
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -390,6 +390,10 @@ If you have several tasks to attach, you have to do it one after another:
|
|||||||
...
|
...
|
||||||
# /bin/echo PIDn > tasks
|
# /bin/echo PIDn > tasks
|
||||||
|
|
||||||
|
You can attach the current shell task by echoing 0:
|
||||||
|
|
||||||
|
# echo 0 > tasks
|
||||||
|
|
||||||
3. Kernel API
|
3. Kernel API
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ either an integer or * for all. Access is a composition of r
|
|||||||
The root device cgroup starts with rwm to 'all'. A child device
|
The root device cgroup starts with rwm to 'all'. A child device
|
||||||
cgroup gets a copy of the parent. Administrators can then remove
|
cgroup gets a copy of the parent. Administrators can then remove
|
||||||
devices from the whitelist or add new entries. A child cgroup can
|
devices from the whitelist or add new entries. A child cgroup can
|
||||||
never receive a device access which is denied its parent. However
|
never receive a device access which is denied by its parent. However
|
||||||
when a device access is removed from a parent it will not also be
|
when a device access is removed from a parent it will not also be
|
||||||
removed from the child(ren).
|
removed from the child(ren).
|
||||||
|
|
||||||
@ -29,7 +29,11 @@ allows cgroup 1 to read and mknod the device usually known as
|
|||||||
|
|
||||||
echo a > /cgroups/1/devices.deny
|
echo a > /cgroups/1/devices.deny
|
||||||
|
|
||||||
will remove the default 'a *:* mrw' entry.
|
will remove the default 'a *:* rwm' entry. Doing
|
||||||
|
|
||||||
|
echo a > /cgroups/1/devices.allow
|
||||||
|
|
||||||
|
will add the 'a *:* rwm' entry to the whitelist.
|
||||||
|
|
||||||
3. Security
|
3. Security
|
||||||
|
|
||||||
|
@ -154,13 +154,15 @@ browsing and modifying the cpusets presently known to the kernel. No
|
|||||||
new system calls are added for cpusets - all support for querying and
|
new system calls are added for cpusets - all support for querying and
|
||||||
modifying cpusets is via this cpuset file system.
|
modifying cpusets is via this cpuset file system.
|
||||||
|
|
||||||
The /proc/<pid>/status file for each task has two added lines,
|
The /proc/<pid>/status file for each task has four added lines,
|
||||||
displaying the tasks cpus_allowed (on which CPUs it may be scheduled)
|
displaying the tasks cpus_allowed (on which CPUs it may be scheduled)
|
||||||
and mems_allowed (on which Memory Nodes it may obtain memory),
|
and mems_allowed (on which Memory Nodes it may obtain memory),
|
||||||
in the format seen in the following example:
|
in the two formats seen in the following example:
|
||||||
|
|
||||||
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
|
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
|
||||||
|
Cpus_allowed_list: 0-127
|
||||||
Mems_allowed: ffffffff,ffffffff
|
Mems_allowed: ffffffff,ffffffff
|
||||||
|
Mems_allowed_list: 0-63
|
||||||
|
|
||||||
Each cpuset is represented by a directory in the cgroup file system
|
Each cpuset is represented by a directory in the cgroup file system
|
||||||
containing (on top of the standard cgroup files) the following
|
containing (on top of the standard cgroup files) the following
|
||||||
@ -544,6 +546,9 @@ otherwise initial value -1 that indicates the cpuset has no request.
|
|||||||
( 4 : search nodes in a chunk of node [on NUMA system] )
|
( 4 : search nodes in a chunk of node [on NUMA system] )
|
||||||
( 5 : search system wide [on NUMA system] )
|
( 5 : search system wide [on NUMA system] )
|
||||||
|
|
||||||
|
The system default is architecture dependent. The system default
|
||||||
|
can be changed using the relax_domain_level= boot parameter.
|
||||||
|
|
||||||
This file is per-cpuset and affect the sched domain where the cpuset
|
This file is per-cpuset and affect the sched domain where the cpuset
|
||||||
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
||||||
is disabled, then 'sched_relax_domain_level' have no effect since
|
is disabled, then 'sched_relax_domain_level' have no effect since
|
||||||
|
@ -312,3 +312,12 @@ When: 2.6.26
|
|||||||
Why: Implementation became generic; users should now include
|
Why: Implementation became generic; users should now include
|
||||||
linux/semaphore.h instead.
|
linux/semaphore.h instead.
|
||||||
Who: Matthew Wilcox <willy@linux.intel.com>
|
Who: Matthew Wilcox <willy@linux.intel.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: CONFIG_THERMAL_HWMON
|
||||||
|
When: January 2009
|
||||||
|
Why: This option was introduced just to allow older lm-sensors userspace
|
||||||
|
to keep working over the upgrade to 2.6.26. At the scheduled time of
|
||||||
|
removal fixed lm-sensors (2.x or 3.x) should be readily available.
|
||||||
|
Who: Rene Herman <rene.herman@gmail.com>
|
||||||
|
@ -25,12 +25,23 @@ routines, and should be zero-initialized except for fields with data you
|
|||||||
provide. A client structure holds device-specific information like the
|
provide. A client structure holds device-specific information like the
|
||||||
driver model device node, and its I2C address.
|
driver model device node, and its I2C address.
|
||||||
|
|
||||||
|
/* iff driver uses driver model ("new style") binding model: */
|
||||||
|
|
||||||
|
static struct i2c_device_id foo_idtable[] = {
|
||||||
|
{ "foo", my_id_for_foo },
|
||||||
|
{ "bar", my_id_for_bar },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_DEVICE_TABLE(i2c, foo_idtable);
|
||||||
|
|
||||||
static struct i2c_driver foo_driver = {
|
static struct i2c_driver foo_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "foo",
|
.name = "foo",
|
||||||
},
|
},
|
||||||
|
|
||||||
/* iff driver uses driver model ("new style") binding model: */
|
/* iff driver uses driver model ("new style") binding model: */
|
||||||
|
.id_table = foo_ids,
|
||||||
.probe = foo_probe,
|
.probe = foo_probe,
|
||||||
.remove = foo_remove,
|
.remove = foo_remove,
|
||||||
|
|
||||||
@ -173,10 +184,9 @@ handle may be used during foo_probe(). If foo_probe() reports success
|
|||||||
(zero not a negative status code) it may save the handle and use it until
|
(zero not a negative status code) it may save the handle and use it until
|
||||||
foo_remove() returns. That binding model is used by most Linux drivers.
|
foo_remove() returns. That binding model is used by most Linux drivers.
|
||||||
|
|
||||||
Drivers match devices when i2c_client.driver_name and the driver name are
|
The probe function is called when an entry in the id_table name field
|
||||||
the same; this approach is used in several other busses that don't have
|
matches the device's name. It is passed the entry that was matched so
|
||||||
device typing support in the hardware. The driver and module name should
|
the driver knows which one in the table matched.
|
||||||
match, so hotplug/coldplug mechanisms will modprobe the driver.
|
|
||||||
|
|
||||||
|
|
||||||
Device Creation (Standard driver model)
|
Device Creation (Standard driver model)
|
||||||
|
@ -295,7 +295,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
when initialising the APIC and IO-APIC components.
|
when initialising the APIC and IO-APIC components.
|
||||||
|
|
||||||
apm= [APM] Advanced Power Management
|
apm= [APM] Advanced Power Management
|
||||||
See header of arch/i386/kernel/apm.c.
|
See header of arch/x86/kernel/apm_32.c.
|
||||||
|
|
||||||
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
||||||
Format: <io>,<irq>,<nodeID>
|
Format: <io>,<irq>,<nodeID>
|
||||||
@ -638,7 +638,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
|
|
||||||
elanfreq= [X86-32]
|
elanfreq= [X86-32]
|
||||||
See comment before function elanfreq_setup() in
|
See comment before function elanfreq_setup() in
|
||||||
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
||||||
|
|
||||||
elevator= [IOSCHED]
|
elevator= [IOSCHED]
|
||||||
Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
|
Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
|
||||||
@ -1679,6 +1679,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
Format: <reboot_mode>[,<reboot_mode2>[,...]]
|
Format: <reboot_mode>[,<reboot_mode2>[,...]]
|
||||||
See arch/*/kernel/reboot.c or arch/*/kernel/process.c
|
See arch/*/kernel/reboot.c or arch/*/kernel/process.c
|
||||||
|
|
||||||
|
relax_domain_level=
|
||||||
|
[KNL, SMP] Set scheduler's default relax_domain_level.
|
||||||
|
See Documentation/cpusets.txt.
|
||||||
|
|
||||||
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
||||||
|
|
||||||
reservetop= [X86-32]
|
reservetop= [X86-32]
|
||||||
|
@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER
|
|||||||
Minimum time-to-live of entries. Should be enough to cover fragment
|
Minimum time-to-live of entries. Should be enough to cover fragment
|
||||||
time-to-live on the reassembling side. This minimum time-to-live is
|
time-to-live on the reassembling side. This minimum time-to-live is
|
||||||
guaranteed if the pool size is less than inet_peer_threshold.
|
guaranteed if the pool size is less than inet_peer_threshold.
|
||||||
Measured in jiffies(1).
|
Measured in seconds.
|
||||||
|
|
||||||
inet_peer_maxttl - INTEGER
|
inet_peer_maxttl - INTEGER
|
||||||
Maximum time-to-live of entries. Unused entries will expire after
|
Maximum time-to-live of entries. Unused entries will expire after
|
||||||
this period of time if there is no memory pressure on the pool (i.e.
|
this period of time if there is no memory pressure on the pool (i.e.
|
||||||
when the number of entries in the pool is very small).
|
when the number of entries in the pool is very small).
|
||||||
Measured in jiffies(1).
|
Measured in seconds.
|
||||||
|
|
||||||
inet_peer_gc_mintime - INTEGER
|
inet_peer_gc_mintime - INTEGER
|
||||||
Minimum interval between garbage collection passes. This interval is
|
Minimum interval between garbage collection passes. This interval is
|
||||||
in effect under high memory pressure on the pool.
|
in effect under high memory pressure on the pool.
|
||||||
Measured in jiffies(1).
|
Measured in seconds.
|
||||||
|
|
||||||
inet_peer_gc_maxtime - INTEGER
|
inet_peer_gc_maxtime - INTEGER
|
||||||
Minimum interval between garbage collection passes. This interval is
|
Minimum interval between garbage collection passes. This interval is
|
||||||
in effect under low (or absent) memory pressure on the pool.
|
in effect under low (or absent) memory pressure on the pool.
|
||||||
Measured in jiffies(1).
|
Measured in seconds.
|
||||||
|
|
||||||
TCP variables:
|
TCP variables:
|
||||||
|
|
||||||
@ -794,10 +794,6 @@ tag - INTEGER
|
|||||||
Allows you to write a number, which can be used as required.
|
Allows you to write a number, which can be used as required.
|
||||||
Default value is 0.
|
Default value is 0.
|
||||||
|
|
||||||
(1) Jiffie: internal timeunit for the kernel. On the i386 1/100s, on the
|
|
||||||
Alpha 1/1024s. See the HZ define in /usr/include/asm/param.h for the exact
|
|
||||||
value on your system.
|
|
||||||
|
|
||||||
Alexey Kuznetsov.
|
Alexey Kuznetsov.
|
||||||
kuznet@ms2.inr.ac.ru
|
kuznet@ms2.inr.ac.ru
|
||||||
|
|
||||||
|
@ -83,9 +83,9 @@ Valid range: Limited by memory on system
|
|||||||
Default: 30
|
Default: 30
|
||||||
|
|
||||||
e. intr_type
|
e. intr_type
|
||||||
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
Specifies interrupt type. Possible values 0(INTA), 2(MSI-X)
|
||||||
Valid range: 1-3
|
Valid values: 0, 2
|
||||||
Default: 1
|
Default: 2
|
||||||
|
|
||||||
5. Performance suggestions
|
5. Performance suggestions
|
||||||
General:
|
General:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
0 -> Unknown board (au0828)
|
0 -> Unknown board (au0828)
|
||||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200]
|
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
|
||||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Slabinfo: Tool to get reports about slabs
|
* Slabinfo: Tool to get reports about slabs
|
||||||
*
|
*
|
||||||
* (C) 2007 sgi, Christoph Lameter <clameter@sgi.com>
|
* (C) 2007 sgi, Christoph Lameter
|
||||||
*
|
*
|
||||||
* Compile by:
|
* Compile by:
|
||||||
*
|
*
|
||||||
@ -99,7 +99,7 @@ void fatal(const char *x, ...)
|
|||||||
|
|
||||||
void usage(void)
|
void usage(void)
|
||||||
{
|
{
|
||||||
printf("slabinfo 5/7/2007. (c) 2007 sgi. clameter@sgi.com\n\n"
|
printf("slabinfo 5/7/2007. (c) 2007 sgi.\n\n"
|
||||||
"slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n"
|
"slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n"
|
||||||
"-a|--aliases Show aliases\n"
|
"-a|--aliases Show aliases\n"
|
||||||
"-A|--activity Most active slabs first\n"
|
"-A|--activity Most active slabs first\n"
|
||||||
|
@ -266,4 +266,4 @@ of other objects.
|
|||||||
|
|
||||||
slub_debug=FZ,dentry
|
slub_debug=FZ,dentry
|
||||||
|
|
||||||
Christoph Lameter, <clameter@sgi.com>, May 30, 2007
|
Christoph Lameter, May 30, 2007
|
||||||
|
85
MAINTAINERS
85
MAINTAINERS
@ -763,9 +763,10 @@ S: Maintained
|
|||||||
|
|
||||||
AUXILIARY DISPLAY DRIVERS
|
AUXILIARY DISPLAY DRIVERS
|
||||||
P: Miguel Ojeda Sandonis
|
P: Miguel Ojeda Sandonis
|
||||||
M: maxextreme@gmail.com
|
M: miguel.ojeda.sandonis@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://auxdisplay.googlepages.com/
|
W: http://miguelojeda.es/auxdisplay.htm
|
||||||
|
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
AVR32 ARCHITECTURE
|
AVR32 ARCHITECTURE
|
||||||
@ -1055,16 +1056,18 @@ S: Supported
|
|||||||
|
|
||||||
CFAG12864B LCD DRIVER
|
CFAG12864B LCD DRIVER
|
||||||
P: Miguel Ojeda Sandonis
|
P: Miguel Ojeda Sandonis
|
||||||
M: maxextreme@gmail.com
|
M: miguel.ojeda.sandonis@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://auxdisplay.googlepages.com/
|
W: http://miguelojeda.es/auxdisplay.htm
|
||||||
|
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||||
P: Miguel Ojeda Sandonis
|
P: Miguel Ojeda Sandonis
|
||||||
M: maxextreme@gmail.com
|
M: miguel.ojeda.sandonis@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://auxdisplay.googlepages.com/
|
W: http://miguelojeda.es/auxdisplay.htm
|
||||||
|
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
CFG80211 and NL80211
|
CFG80211 and NL80211
|
||||||
@ -1420,6 +1423,14 @@ M: kristen.c.accardi@intel.com
|
|||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
DOCUMENTATION (/Documentation directory)
|
||||||
|
P: Michael Kerrisk
|
||||||
|
M: mtk.manpages@gmail.com
|
||||||
|
P: Randy Dunlap
|
||||||
|
M: rdunlap@xenotime.net
|
||||||
|
L: linux-doc@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
DOUBLETALK DRIVER
|
DOUBLETALK DRIVER
|
||||||
P: James R. Van Zandt
|
P: James R. Van Zandt
|
||||||
M: jrv@vanzandt.mv.com
|
M: jrv@vanzandt.mv.com
|
||||||
@ -1626,13 +1637,13 @@ S: Maintained
|
|||||||
|
|
||||||
EXT3 FILE SYSTEM
|
EXT3 FILE SYSTEM
|
||||||
P: Stephen Tweedie, Andrew Morton
|
P: Stephen Tweedie, Andrew Morton
|
||||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||||
L: linux-ext4@vger.kernel.org
|
L: linux-ext4@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
EXT4 FILE SYSTEM
|
EXT4 FILE SYSTEM
|
||||||
P: Stephen Tweedie, Andrew Morton
|
P: Stephen Tweedie, Andrew Morton
|
||||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||||
L: linux-ext4@vger.kernel.org
|
L: linux-ext4@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -2428,9 +2439,10 @@ S: Maintained
|
|||||||
|
|
||||||
KS0108 LCD CONTROLLER DRIVER
|
KS0108 LCD CONTROLLER DRIVER
|
||||||
P: Miguel Ojeda Sandonis
|
P: Miguel Ojeda Sandonis
|
||||||
M: maxextreme@gmail.com
|
M: miguel.ojeda.sandonis@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://auxdisplay.googlepages.com/
|
W: http://miguelojeda.es/auxdisplay.htm
|
||||||
|
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
LAPB module
|
LAPB module
|
||||||
@ -2474,9 +2486,11 @@ M: James.Bottomley@HansenPartnership.com
|
|||||||
W: http://www.hansenpartnership.com/voyager
|
W: http://www.hansenpartnership.com/voyager
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
LINUX FOR POWERPC
|
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||||
P: Paul Mackerras
|
P: Paul Mackerras
|
||||||
M: paulus@samba.org
|
M: paulus@samba.org
|
||||||
|
P: Benjamin Herrenschmidt
|
||||||
|
M: benh@kernel.crashing.org
|
||||||
W: http://www.penguinppc.org/
|
W: http://www.penguinppc.org/
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
|
||||||
@ -2516,13 +2530,6 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
|
|||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
LINUX FOR POWERPC BOOT CODE
|
|
||||||
P: Tom Rini
|
|
||||||
M: trini@kernel.crashing.org
|
|
||||||
W: http://www.penguinppc.org/
|
|
||||||
L: linuxppc-dev@ozlabs.org
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||||
P: Vitaly Bordug
|
P: Vitaly Bordug
|
||||||
M: vitb@kernel.crashing.org
|
M: vitb@kernel.crashing.org
|
||||||
@ -2551,17 +2558,6 @@ P: Arnaldo Carvalho de Melo
|
|||||||
M: acme@ghostprotocols.net
|
M: acme@ghostprotocols.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
LINUX FOR 64BIT POWERPC
|
|
||||||
P: Paul Mackerras
|
|
||||||
M: paulus@samba.org
|
|
||||||
M: paulus@au.ibm.com
|
|
||||||
P: Anton Blanchard
|
|
||||||
M: anton@samba.org
|
|
||||||
M: anton@au.ibm.com
|
|
||||||
W: http://www.penguinppc.org/ppc64/
|
|
||||||
L: linuxppc-dev@ozlabs.org
|
|
||||||
S: Supported
|
|
||||||
|
|
||||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||||
P: Chris Wright
|
P: Chris Wright
|
||||||
M: chrisw@sous-sol.org
|
M: chrisw@sous-sol.org
|
||||||
@ -2680,8 +2676,8 @@ S: Supported
|
|||||||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||||
P: Michael Kerrisk
|
P: Michael Kerrisk
|
||||||
M: mtk.manpages@gmail.com
|
M: mtk.manpages@gmail.com
|
||||||
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
|
W: http://www.kernel.org/doc/man-pages
|
||||||
S: Maintained
|
S: Supported
|
||||||
|
|
||||||
MARVELL LIBERTAS WIRELESS DRIVER
|
MARVELL LIBERTAS WIRELESS DRIVER
|
||||||
P: Dan Williams
|
P: Dan Williams
|
||||||
@ -2814,6 +2810,12 @@ W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
|||||||
W: http://0pointer.de/lennart/tchibo.html
|
W: http://0pointer.de/lennart/tchibo.html
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
MULTIFUNCTION DEVICES (MFD)
|
||||||
|
P: Samuel Ortiz
|
||||||
|
M: sameo@openedhand.com
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
||||||
P: Pierre Ossman
|
P: Pierre Ossman
|
||||||
M: drzeus-mmc@drzeus.cx
|
M: drzeus-mmc@drzeus.cx
|
||||||
@ -3195,8 +3197,8 @@ L: netdev@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PER-TASK DELAY ACCOUNTING
|
PER-TASK DELAY ACCOUNTING
|
||||||
P: Shailabh Nagar
|
P: Balbir Singh
|
||||||
M: nagar@watson.ibm.com
|
M: balbir@linux.vnet.ibm.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -3688,7 +3690,7 @@ S: Maintained
|
|||||||
|
|
||||||
SLAB ALLOCATOR
|
SLAB ALLOCATOR
|
||||||
P: Christoph Lameter
|
P: Christoph Lameter
|
||||||
M: clameter@sgi.com
|
M: cl@linux-foundation.org
|
||||||
P: Pekka Enberg
|
P: Pekka Enberg
|
||||||
M: penberg@cs.helsinki.fi
|
M: penberg@cs.helsinki.fi
|
||||||
P: Matt Mackall
|
P: Matt Mackall
|
||||||
@ -3898,8 +3900,8 @@ M: hch@infradead.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TASKSTATS STATISTICS INTERFACE
|
TASKSTATS STATISTICS INTERFACE
|
||||||
P: Shailabh Nagar
|
P: Balbir Singh
|
||||||
M: nagar@watson.ibm.com
|
M: balbir@linux.vnet.ibm.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -3995,7 +3997,8 @@ W: http://www.buzzard.org.uk/toshiba/
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TPM DEVICE DRIVER
|
TPM DEVICE DRIVER
|
||||||
P: Kylene Hall
|
P: Debora Velarde
|
||||||
|
P: Rajiv Andrade
|
||||||
M: tpmdd-devel@lists.sourceforge.net
|
M: tpmdd-devel@lists.sourceforge.net
|
||||||
W: http://tpmdd.sourceforge.net
|
W: http://tpmdd.sourceforge.net
|
||||||
P: Marcel Selhorst
|
P: Marcel Selhorst
|
||||||
@ -4314,6 +4317,14 @@ L: netdev@vger.kernel.org
|
|||||||
W: http://www.linux-usb.org/usbnet
|
W: http://www.linux-usb.org/usbnet
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
USB VIDEO CLASS
|
||||||
|
P: Laurent Pinchart
|
||||||
|
M: laurent.pinchart@skynet.be
|
||||||
|
L: linx-uvc-devel@berlios.de
|
||||||
|
L: video4linux-list@redhat.com
|
||||||
|
W: http://linux-uvc.berlios.de
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
USB W996[87]CF DRIVER
|
USB W996[87]CF DRIVER
|
||||||
P: Luca Risolia
|
P: Luca Risolia
|
||||||
M: luca.risolia@studio.unibo.it
|
M: luca.risolia@studio.unibo.it
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 26
|
SUBLEVEL = 26
|
||||||
EXTRAVERSION = -rc8
|
EXTRAVERSION = -rc9
|
||||||
NAME = Rotary Wombat
|
NAME = Rotary Wombat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -25,6 +25,13 @@ SECTIONS
|
|||||||
} :kernel
|
} :kernel
|
||||||
_etext = .; /* End of text section */
|
_etext = .; /* End of text section */
|
||||||
|
|
||||||
|
NOTES :kernel :note
|
||||||
|
.dummy : {
|
||||||
|
*(.dummy)
|
||||||
|
} :kernel
|
||||||
|
|
||||||
|
RODATA
|
||||||
|
|
||||||
/* Exception table */
|
/* Exception table */
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
__ex_table : {
|
__ex_table : {
|
||||||
@ -33,13 +40,6 @@ SECTIONS
|
|||||||
__stop___ex_table = .;
|
__stop___ex_table = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTES :kernel :note
|
|
||||||
.dummy : {
|
|
||||||
*(.dummy)
|
|
||||||
} :kernel
|
|
||||||
|
|
||||||
RODATA
|
|
||||||
|
|
||||||
/* Will be freed after init */
|
/* Will be freed after init */
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
/* Init code and data */
|
/* Init code and data */
|
||||||
|
@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg);
|
|||||||
EXPORT_SYMBOL(dma_unmap_sg);
|
EXPORT_SYMBOL(dma_unmap_sg);
|
||||||
EXPORT_SYMBOL(dma_sync_single_for_cpu);
|
EXPORT_SYMBOL(dma_sync_single_for_cpu);
|
||||||
EXPORT_SYMBOL(dma_sync_single_for_device);
|
EXPORT_SYMBOL(dma_sync_single_for_device);
|
||||||
EXPORT_SYMBOL(dma_sync_sg);
|
EXPORT_SYMBOL(dma_sync_sg_for_cpu);
|
||||||
|
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
||||||
EXPORT_SYMBOL(dmabounce_register_dev);
|
EXPORT_SYMBOL(dmabounce_register_dev);
|
||||||
EXPORT_SYMBOL(dmabounce_unregister_dev);
|
EXPORT_SYMBOL(dmabounce_unregister_dev);
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
#define GPMC_STATUS 0x54
|
#define GPMC_STATUS 0x54
|
||||||
#define GPMC_PREFETCH_CONFIG1 0x1e0
|
#define GPMC_PREFETCH_CONFIG1 0x1e0
|
||||||
#define GPMC_PREFETCH_CONFIG2 0x1e4
|
#define GPMC_PREFETCH_CONFIG2 0x1e4
|
||||||
#define GPMC_PREFETCH_CONTROL 0x1e8
|
#define GPMC_PREFETCH_CONTROL 0x1ec
|
||||||
#define GPMC_PREFETCH_STATUS 0x1f0
|
#define GPMC_PREFETCH_STATUS 0x1f0
|
||||||
#define GPMC_ECC_CONFIG 0x1f4
|
#define GPMC_ECC_CONFIG 0x1f4
|
||||||
#define GPMC_ECC_CONTROL 0x1f8
|
#define GPMC_ECC_CONTROL 0x1f8
|
||||||
|
@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(boot_lock);
|
|||||||
|
|
||||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
trace_hardirqs_off();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the primary core may have used a "cross call" soft interrupt
|
* the primary core may have used a "cross call" soft interrupt
|
||||||
* to get this processor out of WFI in the BootMonitor - make
|
* to get this processor out of WFI in the BootMonitor - make
|
||||||
|
@ -501,8 +501,6 @@ static inline void omap_enable_channel_irq(int lch)
|
|||||||
|
|
||||||
/* Enable some nice interrupts. */
|
/* Enable some nice interrupts. */
|
||||||
OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs;
|
OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs;
|
||||||
|
|
||||||
dma_chan[lch].flags |= OMAP_DMA_ACTIVE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void omap_disable_channel_irq(int lch)
|
static void omap_disable_channel_irq(int lch)
|
||||||
|
@ -254,7 +254,8 @@ close_cplbtab(struct cplb_tab *table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* helper function */
|
/* helper function */
|
||||||
static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
static void __init
|
||||||
|
__fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||||
{
|
{
|
||||||
if (cplb_data[i].psize) {
|
if (cplb_data[i].psize) {
|
||||||
fill_cplbtab(t,
|
fill_cplbtab(t,
|
||||||
@ -291,7 +292,8 @@ static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_en
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
static void __init
|
||||||
|
__fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||||
{
|
{
|
||||||
if (cplb_data[i].psize) {
|
if (cplb_data[i].psize) {
|
||||||
fill_cplbtab(t,
|
fill_cplbtab(t,
|
||||||
|
@ -60,9 +60,14 @@ static struct irq_chip bad_chip = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct irq_desc bad_irq_desc = {
|
static struct irq_desc bad_irq_desc = {
|
||||||
|
.status = IRQ_DISABLED,
|
||||||
.chip = &bad_chip,
|
.chip = &bad_chip,
|
||||||
.handle_irq = handle_bad_irq,
|
.handle_irq = handle_bad_irq,
|
||||||
.depth = 1,
|
.depth = 1,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock),
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
.affinity = CPU_MASK_ALL
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int show_interrupts(struct seq_file *p, void *v)
|
int show_interrupts(struct seq_file *p, void *v)
|
||||||
|
@ -547,7 +547,8 @@ setup_arch (char **cmdline_p)
|
|||||||
# ifdef CONFIG_ACPI_NUMA
|
# ifdef CONFIG_ACPI_NUMA
|
||||||
acpi_numa_init();
|
acpi_numa_init();
|
||||||
per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ?
|
per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ?
|
||||||
32 : cpus_weight(early_cpu_possible_map)), additional_cpus);
|
32 : cpus_weight(early_cpu_possible_map)),
|
||||||
|
additional_cpus > 0 ? additional_cpus : 0);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# ifdef CONFIG_SMP
|
# ifdef CONFIG_SMP
|
||||||
|
@ -117,6 +117,7 @@ void account_system_vtime(struct task_struct *tsk)
|
|||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(account_system_vtime);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called from the timer interrupt handler to charge accumulated user time
|
* Called from the timer interrupt handler to charge accumulated user time
|
||||||
|
@ -1006,7 +1006,7 @@ config BOOT_ELF32
|
|||||||
config MIPS_L1_CACHE_SHIFT
|
config MIPS_L1_CACHE_SHIFT
|
||||||
int
|
int
|
||||||
default "4" if MACH_DECSTATION
|
default "4" if MACH_DECSTATION
|
||||||
default "7" if SGI_IP27 || SGI_IP28 || SNI_RM
|
default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM
|
||||||
default "4" if PMC_MSP4200_EVAL
|
default "4" if PMC_MSP4200_EVAL
|
||||||
default "5"
|
default "5"
|
||||||
|
|
||||||
|
@ -161,6 +161,9 @@ void __init txx9_tmr_init(unsigned long baseaddr)
|
|||||||
struct txx9_tmr_reg __iomem *tmrptr;
|
struct txx9_tmr_reg __iomem *tmrptr;
|
||||||
|
|
||||||
tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg));
|
tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg));
|
||||||
|
/* Start once to make CounterResetEnable effective */
|
||||||
|
__raw_writel(TXx9_TMTCR_CRE | TXx9_TMTCR_TCE, &tmrptr->tcr);
|
||||||
|
/* Stop and reset the counter */
|
||||||
__raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr);
|
__raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr);
|
||||||
__raw_writel(0, &tmrptr->tisr);
|
__raw_writel(0, &tmrptr->tisr);
|
||||||
__raw_writel(0xffffffff, &tmrptr->cpra);
|
__raw_writel(0xffffffff, &tmrptr->cpra);
|
||||||
|
@ -425,6 +425,11 @@ static void ip32_irq0(void)
|
|||||||
BUILD_BUG_ON(MACEISA_SERIAL2_RDMAOR_IRQ - MACEISA_AUDIO_SW_IRQ != 31);
|
BUILD_BUG_ON(MACEISA_SERIAL2_RDMAOR_IRQ - MACEISA_AUDIO_SW_IRQ != 31);
|
||||||
|
|
||||||
crime_int = crime->istat & crime_mask;
|
crime_int = crime->istat & crime_mask;
|
||||||
|
|
||||||
|
/* crime sometime delivers spurious interrupts, ignore them */
|
||||||
|
if (unlikely(crime_int == 0))
|
||||||
|
return;
|
||||||
|
|
||||||
irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
|
irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
|
||||||
|
|
||||||
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
||||||
|
@ -10,8 +10,11 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(empty_zero_page);
|
||||||
|
|
||||||
EXPORT_SYMBOL(change_bit);
|
EXPORT_SYMBOL(change_bit);
|
||||||
EXPORT_SYMBOL(test_and_change_bit);
|
EXPORT_SYMBOL(test_and_change_bit);
|
||||||
|
|
||||||
@ -31,7 +34,9 @@ extern u64 __ashrdi3(u64, unsigned);
|
|||||||
extern u64 __ashldi3(u64, unsigned);
|
extern u64 __ashldi3(u64, unsigned);
|
||||||
extern u64 __lshrdi3(u64, unsigned);
|
extern u64 __lshrdi3(u64, unsigned);
|
||||||
extern s64 __negdi2(s64);
|
extern s64 __negdi2(s64);
|
||||||
|
extern int __ucmpdi2(u64, u64);
|
||||||
EXPORT_SYMBOL(__ashrdi3);
|
EXPORT_SYMBOL(__ashrdi3);
|
||||||
EXPORT_SYMBOL(__ashldi3);
|
EXPORT_SYMBOL(__ashldi3);
|
||||||
EXPORT_SYMBOL(__lshrdi3);
|
EXPORT_SYMBOL(__lshrdi3);
|
||||||
EXPORT_SYMBOL(__negdi2);
|
EXPORT_SYMBOL(__negdi2);
|
||||||
|
EXPORT_SYMBOL(__ucmpdi2);
|
||||||
|
@ -153,6 +153,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
|
|||||||
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0,
|
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(kernel_thread);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* free current thread data structures etc..
|
* free current thread data structures etc..
|
||||||
|
@ -4,4 +4,4 @@
|
|||||||
|
|
||||||
lib-y = delay.o usercopy.o checksum.o bitops.o memcpy.o memmove.o memset.o
|
lib-y = delay.o usercopy.o checksum.o bitops.o memcpy.o memmove.o memset.o
|
||||||
lib-y += do_csum.o
|
lib-y += do_csum.o
|
||||||
lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o
|
lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o __ucmpdi2.o
|
||||||
|
43
arch/mn10300/lib/__ucmpdi2.S
Normal file
43
arch/mn10300/lib/__ucmpdi2.S
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* __ucmpdi2.S: 64-bit unsigned compare
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the License, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
.p2align 4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# int __ucmpdi2(unsigned long long a [D0:D1],
|
||||||
|
# unsigned long long b [(SP,12),(SP,16)])
|
||||||
|
#
|
||||||
|
# - returns 0, 1, or 2 as a <, =, > b respectively.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl __ucmpdi2
|
||||||
|
.type __ucmpdi2,@function
|
||||||
|
__ucmpdi2:
|
||||||
|
mov (12,sp),a0 # b.lsw
|
||||||
|
mov (16,sp),a1 # b.msw
|
||||||
|
|
||||||
|
sub a0,d0
|
||||||
|
subc a1,d1 # may clear Z, never sets it
|
||||||
|
bne __ucmpdi2_differ # a.msw != b.msw
|
||||||
|
mov +1,d0
|
||||||
|
rets
|
||||||
|
|
||||||
|
__ucmpdi2_differ:
|
||||||
|
# C flag is set if LE, clear if GE
|
||||||
|
subc d0,d0 # -1 if LE, 0 if GE
|
||||||
|
add +1,d0 # 0 if LE, 1 if GE
|
||||||
|
add d0,d0 # 0 if LE, 2 if GE
|
||||||
|
rets
|
||||||
|
|
||||||
|
.size __ucmpdi2, .-__ucmpdi2
|
@ -273,7 +273,8 @@ endif
|
|||||||
initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
|
initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
|
||||||
initrd-y := $(patsubst zImage%, zImage.initrd%, \
|
initrd-y := $(patsubst zImage%, zImage.initrd%, \
|
||||||
$(patsubst dtbImage%, dtbImage.initrd%, \
|
$(patsubst dtbImage%, dtbImage.initrd%, \
|
||||||
$(patsubst treeImage%, treeImage.initrd%, $(image-y))))
|
$(patsubst simpleImage%, simpleImage.initrd%, \
|
||||||
|
$(patsubst treeImage%, treeImage.initrd%, $(image-y)))))
|
||||||
initrd-y := $(filter-out $(image-y), $(initrd-y))
|
initrd-y := $(filter-out $(image-y), $(initrd-y))
|
||||||
targets += $(image-y) $(initrd-y)
|
targets += $(image-y) $(initrd-y)
|
||||||
|
|
||||||
|
@ -136,6 +136,11 @@ static int __init add_legacy_soc_port(struct device_node *np,
|
|||||||
if (of_get_property(np, "clock-frequency", NULL) == NULL)
|
if (of_get_property(np, "clock-frequency", NULL) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* if reg-shift or offset, don't try to use it */
|
||||||
|
if ((of_get_property(np, "reg-shift", NULL) != NULL) ||
|
||||||
|
(of_get_property(np, "reg-offset", NULL) != NULL))
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* if rtas uses this device, don't try to use it as well */
|
/* if rtas uses this device, don't try to use it as well */
|
||||||
if (of_get_property(np, "used-by-rtas", NULL) != NULL)
|
if (of_get_property(np, "used-by-rtas", NULL) != NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes;
|
|||||||
static struct mpc52xx_xlb __iomem *xlb;
|
static struct mpc52xx_xlb __iomem *xlb;
|
||||||
static struct mpc52xx_gpio __iomem *gps;
|
static struct mpc52xx_gpio __iomem *gps;
|
||||||
static struct mpc52xx_gpio_wkup __iomem *gpw;
|
static struct mpc52xx_gpio_wkup __iomem *gpw;
|
||||||
|
static void __iomem *pci;
|
||||||
static void __iomem *sram;
|
static void __iomem *sram;
|
||||||
static const int sram_size = 0x4000; /* 16 kBytes */
|
static const int sram_size = 0x4000; /* 16 kBytes */
|
||||||
static void __iomem *mbar;
|
static void __iomem *mbar;
|
||||||
@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void)
|
|||||||
{ .type = "builtin", .compatible = "mpc5200", }, /* efika */
|
{ .type = "builtin", .compatible = "mpc5200", }, /* efika */
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
u64 regaddr64 = 0;
|
||||||
|
const u32 *regaddr_p;
|
||||||
|
|
||||||
/* deep sleep? let mpc52xx code handle that */
|
/* deep sleep? let mpc52xx code handle that */
|
||||||
if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
|
if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
|
||||||
@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void)
|
|||||||
|
|
||||||
/* map registers */
|
/* map registers */
|
||||||
np = of_find_matching_node(NULL, immr_ids);
|
np = of_find_matching_node(NULL, immr_ids);
|
||||||
mbar = of_iomap(np, 0);
|
regaddr_p = of_get_address(np, 0, NULL, NULL);
|
||||||
|
if (regaddr_p)
|
||||||
|
regaddr64 = of_translate_address(np, regaddr_p);
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
|
|
||||||
|
mbar = ioremap((u32) regaddr64, 0xC000);
|
||||||
if (!mbar) {
|
if (!mbar) {
|
||||||
printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
|
printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void)
|
|||||||
pic = mbar + 0x500;
|
pic = mbar + 0x500;
|
||||||
gps = mbar + 0xb00;
|
gps = mbar + 0xb00;
|
||||||
gpw = mbar + 0xc00;
|
gpw = mbar + 0xc00;
|
||||||
|
pci = mbar + 0xd00;
|
||||||
bes = mbar + 0x1200;
|
bes = mbar + 0x1200;
|
||||||
xlb = mbar + 0x1f00;
|
xlb = mbar + 0x1f00;
|
||||||
sram = mbar + 0x8000;
|
sram = mbar + 0x8000;
|
||||||
@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes;
|
|||||||
static struct mpc52xx_xlb sxlb;
|
static struct mpc52xx_xlb sxlb;
|
||||||
static struct mpc52xx_gpio sgps;
|
static struct mpc52xx_gpio sgps;
|
||||||
static struct mpc52xx_gpio_wkup sgpw;
|
static struct mpc52xx_gpio_wkup sgpw;
|
||||||
|
static char spci[0x200];
|
||||||
|
|
||||||
static void lite5200_save_regs(void)
|
static void lite5200_save_regs(void)
|
||||||
{
|
{
|
||||||
@ -94,6 +103,7 @@ static void lite5200_save_regs(void)
|
|||||||
_memcpy_fromio(&sxlb, xlb, sizeof(*xlb));
|
_memcpy_fromio(&sxlb, xlb, sizeof(*xlb));
|
||||||
_memcpy_fromio(&sgps, gps, sizeof(*gps));
|
_memcpy_fromio(&sgps, gps, sizeof(*gps));
|
||||||
_memcpy_fromio(&sgpw, gpw, sizeof(*gpw));
|
_memcpy_fromio(&sgpw, gpw, sizeof(*gpw));
|
||||||
|
_memcpy_fromio(spci, pci, 0x200);
|
||||||
|
|
||||||
_memcpy_fromio(saved_sram, sram, sram_size);
|
_memcpy_fromio(saved_sram, sram, sram_size);
|
||||||
}
|
}
|
||||||
@ -103,6 +113,8 @@ static void lite5200_restore_regs(void)
|
|||||||
int i;
|
int i;
|
||||||
_memcpy_toio(sram, saved_sram, sram_size);
|
_memcpy_toio(sram, saved_sram, sram_size);
|
||||||
|
|
||||||
|
/* PCI Configuration */
|
||||||
|
_memcpy_toio(pci, spci, 0x200);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOs. Interrupt Master Enable has higher address then other
|
* GPIOs. Interrupt Master Enable has higher address then other
|
||||||
|
@ -966,8 +966,8 @@ config NUMA_EMU
|
|||||||
number of nodes. This is only useful for debugging.
|
number of nodes. This is only useful for debugging.
|
||||||
|
|
||||||
config NODES_SHIFT
|
config NODES_SHIFT
|
||||||
int "Max num nodes shift(1-15)"
|
int "Max num nodes shift(1-9)"
|
||||||
range 1 15 if X86_64
|
range 1 9 if X86_64
|
||||||
default "6" if X86_64
|
default "6" if X86_64
|
||||||
default "4" if X86_NUMAQ
|
default "4" if X86_NUMAQ
|
||||||
default "3"
|
default "3"
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <asm/msr-index.h>
|
#include <asm/msr-index.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/processor-flags.h>
|
||||||
|
|
||||||
.code16
|
.code16
|
||||||
.section ".header", "a"
|
.section ".header", "a"
|
||||||
@ -24,6 +25,11 @@ pmode_gdt: .quad 0
|
|||||||
realmode_flags: .long 0
|
realmode_flags: .long 0
|
||||||
real_magic: .long 0
|
real_magic: .long 0
|
||||||
trampoline_segment: .word 0
|
trampoline_segment: .word 0
|
||||||
|
_pad1: .byte 0
|
||||||
|
wakeup_jmp: .byte 0xea /* ljmpw */
|
||||||
|
wakeup_jmp_off: .word 3f
|
||||||
|
wakeup_jmp_seg: .word 0
|
||||||
|
wakeup_gdt: .quad 0, 0, 0
|
||||||
signature: .long 0x51ee1111
|
signature: .long 0x51ee1111
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@ -34,11 +40,34 @@ _start:
|
|||||||
cli
|
cli
|
||||||
cld
|
cld
|
||||||
|
|
||||||
|
/* Apparently some dimwit BIOS programmers don't know how to
|
||||||
|
program a PM to RM transition, and we might end up here with
|
||||||
|
junk in the data segment descriptor registers. The only way
|
||||||
|
to repair that is to go into PM and fix it ourselves... */
|
||||||
|
movw $16, %cx
|
||||||
|
lgdtl %cs:wakeup_gdt
|
||||||
|
movl %cr0, %eax
|
||||||
|
orb $X86_CR0_PE, %al
|
||||||
|
movl %eax, %cr0
|
||||||
|
jmp 1f
|
||||||
|
1: ljmpw $8, $2f
|
||||||
|
2:
|
||||||
|
movw %cx, %ds
|
||||||
|
movw %cx, %es
|
||||||
|
movw %cx, %ss
|
||||||
|
movw %cx, %fs
|
||||||
|
movw %cx, %gs
|
||||||
|
|
||||||
|
andb $~X86_CR0_PE, %al
|
||||||
|
movl %eax, %cr0
|
||||||
|
jmp wakeup_jmp
|
||||||
|
3:
|
||||||
/* Set up segments */
|
/* Set up segments */
|
||||||
movw %cs, %ax
|
movw %cs, %ax
|
||||||
movw %ax, %ds
|
movw %ax, %ds
|
||||||
movw %ax, %es
|
movw %ax, %es
|
||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
|
lidtl wakeup_idt
|
||||||
|
|
||||||
movl $wakeup_stack_end, %esp
|
movl $wakeup_stack_end, %esp
|
||||||
|
|
||||||
@ -98,7 +127,14 @@ bogus_real_magic:
|
|||||||
jmp 1b
|
jmp 1b
|
||||||
|
|
||||||
.data
|
.data
|
||||||
.balign 4
|
.balign 8
|
||||||
|
|
||||||
|
/* This is the standard real-mode IDT */
|
||||||
|
wakeup_idt:
|
||||||
|
.word 0xffff /* limit */
|
||||||
|
.long 0 /* address */
|
||||||
|
.word 0
|
||||||
|
|
||||||
.globl HEAP, heap_end
|
.globl HEAP, heap_end
|
||||||
HEAP:
|
HEAP:
|
||||||
.long wakeup_heap
|
.long wakeup_heap
|
||||||
|
@ -24,6 +24,11 @@ struct wakeup_header {
|
|||||||
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 */
|
||||||
|
u8 _pad1;
|
||||||
|
u8 wakeup_jmp;
|
||||||
|
u16 wakeup_jmp_off;
|
||||||
|
u16 wakeup_jmp_seg;
|
||||||
|
u64 wakeup_gdt[3];
|
||||||
u32 signature; /* To check we have correct structure */
|
u32 signature; /* To check we have correct structure */
|
||||||
} __attribute__((__packed__));
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
@ -50,6 +50,20 @@ int acpi_save_state_mem(void)
|
|||||||
|
|
||||||
header->video_mode = saved_video_mode;
|
header->video_mode = saved_video_mode;
|
||||||
|
|
||||||
|
header->wakeup_jmp_seg = acpi_wakeup_address >> 4;
|
||||||
|
/* GDT[0]: GDT self-pointer */
|
||||||
|
header->wakeup_gdt[0] =
|
||||||
|
(u64)(sizeof(header->wakeup_gdt) - 1) +
|
||||||
|
((u64)(acpi_wakeup_address +
|
||||||
|
((char *)&header->wakeup_gdt - (char *)acpi_realmode))
|
||||||
|
<< 16);
|
||||||
|
/* GDT[1]: real-mode-like code segment */
|
||||||
|
header->wakeup_gdt[1] = (0x009bULL << 40) +
|
||||||
|
((u64)acpi_wakeup_address << 16) + 0xffff;
|
||||||
|
/* GDT[2]: real-mode-like data segment */
|
||||||
|
header->wakeup_gdt[2] = (0x0093ULL << 40) +
|
||||||
|
((u64)acpi_wakeup_address << 16) + 0xffff;
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
store_gdt((struct desc_ptr *)&header->pmode_gdt);
|
store_gdt((struct desc_ptr *)&header->pmode_gdt);
|
||||||
|
|
||||||
@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
acpi_wakeup_address = acpi_realmode;
|
acpi_wakeup_address = virt_to_phys((void *)acpi_realmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,13 +49,13 @@ void efi_call_phys_prelog(void)
|
|||||||
local_irq_save(efi_rt_eflags);
|
local_irq_save(efi_rt_eflags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If I don't have PSE, I should just duplicate two entries in page
|
* If I don't have PAE, I should just duplicate two entries in page
|
||||||
* directory. If I have PSE, I just need to duplicate one entry in
|
* directory. If I have PAE, I just need to duplicate one entry in
|
||||||
* page directory.
|
* page directory.
|
||||||
*/
|
*/
|
||||||
cr4 = read_cr4();
|
cr4 = read_cr4();
|
||||||
|
|
||||||
if (cr4 & X86_CR4_PSE) {
|
if (cr4 & X86_CR4_PAE) {
|
||||||
efi_bak_pg_dir_pointer[0].pgd =
|
efi_bak_pg_dir_pointer[0].pgd =
|
||||||
swapper_pg_dir[pgd_index(0)].pgd;
|
swapper_pg_dir[pgd_index(0)].pgd;
|
||||||
swapper_pg_dir[0].pgd =
|
swapper_pg_dir[0].pgd =
|
||||||
@ -93,7 +93,7 @@ void efi_call_phys_epilog(void)
|
|||||||
|
|
||||||
cr4 = read_cr4();
|
cr4 = read_cr4();
|
||||||
|
|
||||||
if (cr4 & X86_CR4_PSE) {
|
if (cr4 & X86_CR4_PAE) {
|
||||||
swapper_pg_dir[pgd_index(0)].pgd =
|
swapper_pg_dir[pgd_index(0)].pgd =
|
||||||
efi_bak_pg_dir_pointer[0].pgd;
|
efi_bak_pg_dir_pointer[0].pgd;
|
||||||
} else {
|
} else {
|
||||||
|
@ -128,7 +128,7 @@ ident_complete:
|
|||||||
/* Fixup phys_base */
|
/* Fixup phys_base */
|
||||||
addq %rbp, phys_base(%rip)
|
addq %rbp, phys_base(%rip)
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_X86_TRAMPOLINE
|
||||||
addq %rbp, trampoline_level4_pgt + 0(%rip)
|
addq %rbp, trampoline_level4_pgt + 0(%rip)
|
||||||
addq %rbp, trampoline_level4_pgt + (511*8)(%rip)
|
addq %rbp, trampoline_level4_pgt + (511*8)(%rip)
|
||||||
#endif
|
#endif
|
||||||
|
@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!cpu_has_fxsr)
|
if (!cpu_has_fxsr)
|
||||||
return -ENODEV;
|
return -EIO;
|
||||||
|
|
||||||
ret = init_fpu(target);
|
ret = init_fpu(target);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!cpu_has_fxsr)
|
if (!cpu_has_fxsr)
|
||||||
return -ENODEV;
|
return -EIO;
|
||||||
|
|
||||||
ret = init_fpu(target);
|
ret = init_fpu(target);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -996,7 +996,6 @@ do_rest:
|
|||||||
#endif
|
#endif
|
||||||
cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */
|
cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */
|
||||||
cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
|
cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
|
||||||
cpu_clear(cpu, cpu_possible_map);
|
|
||||||
cpu_clear(cpu, cpu_present_map);
|
cpu_clear(cpu, cpu_present_map);
|
||||||
per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
|
per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +135,7 @@ static __init void *spp_getpage(void)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static __init void
|
||||||
set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
|
set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
|
||||||
{
|
{
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
@ -214,7 +214,7 @@ void __init cleanup_highmap(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: this is meant to be run only at boot */
|
/* NOTE: this is meant to be run only at boot */
|
||||||
void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
|
void __init __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
|
||||||
{
|
{
|
||||||
unsigned long address = __fix_to_virt(idx);
|
unsigned long address = __fix_to_virt(idx);
|
||||||
|
|
||||||
@ -526,7 +526,8 @@ static void __init early_memtest(unsigned long start, unsigned long end)
|
|||||||
t_size = end - t_start;
|
t_size = end - t_start;
|
||||||
|
|
||||||
printk(KERN_CONT "\n %016llx - %016llx pattern %d",
|
printk(KERN_CONT "\n %016llx - %016llx pattern %d",
|
||||||
t_start, t_start + t_size, pattern);
|
(unsigned long long)t_start,
|
||||||
|
(unsigned long long)t_start + t_size, pattern);
|
||||||
|
|
||||||
memtest(t_start, t_size, pattern);
|
memtest(t_start, t_size, pattern);
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
|
|||||||
if (val & _PAGE_PRESENT) {
|
if (val & _PAGE_PRESENT) {
|
||||||
unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||||
pteval_t flags = val & ~PTE_MASK;
|
pteval_t flags = val & ~PTE_MASK;
|
||||||
val = (mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
@ -196,7 +196,7 @@ static pteval_t pte_pfn_to_mfn(pteval_t val)
|
|||||||
if (val & _PAGE_PRESENT) {
|
if (val & _PAGE_PRESENT) {
|
||||||
unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||||
pteval_t flags = val & ~PTE_MASK;
|
pteval_t flags = val & ~PTE_MASK;
|
||||||
val = (pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
|
val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
@ -831,6 +831,8 @@ static void as_completed_request(struct request_queue *q, struct request *rq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ad->changed_batch && ad->nr_dispatched == 1) {
|
if (ad->changed_batch && ad->nr_dispatched == 1) {
|
||||||
|
ad->current_batch_expires = jiffies +
|
||||||
|
ad->batch_expire[ad->batch_data_dir];
|
||||||
kblockd_schedule_work(&ad->antic_work);
|
kblockd_schedule_work(&ad->antic_work);
|
||||||
ad->changed_batch = 0;
|
ad->changed_batch = 0;
|
||||||
|
|
||||||
|
@ -377,6 +377,9 @@ static int __init bay_init(void)
|
|||||||
|
|
||||||
INIT_LIST_HEAD(&drive_bays);
|
INIT_LIST_HEAD(&drive_bays);
|
||||||
|
|
||||||
|
if (acpi_disabled)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/* look for dockable drive bays */
|
/* look for dockable drive bays */
|
||||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||||
ACPI_UINT32_MAX, find_bay, &bays, NULL);
|
ACPI_UINT32_MAX, find_bay, &bays, NULL);
|
||||||
|
@ -917,6 +917,9 @@ static int __init dock_init(void)
|
|||||||
|
|
||||||
dock_station = NULL;
|
dock_station = NULL;
|
||||||
|
|
||||||
|
if (acpi_disabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* look for a dock station */
|
/* look for a dock station */
|
||||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||||
ACPI_UINT32_MAX, find_dock, &num, NULL);
|
ACPI_UINT32_MAX, find_dock, &num, NULL);
|
||||||
|
@ -333,6 +333,9 @@ static int __init acpi_rtc_init(void)
|
|||||||
{
|
{
|
||||||
struct device *dev = get_rtc_dev();
|
struct device *dev = get_rtc_dev();
|
||||||
|
|
||||||
|
if (acpi_disabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (dev) {
|
if (dev) {
|
||||||
rtc_wake_setup();
|
rtc_wake_setup();
|
||||||
rtc_info.wake_on = rtc_wake_on;
|
rtc_info.wake_on = rtc_wake_on;
|
||||||
|
@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|||||||
if (!acpi_wakeup_address) {
|
if (!acpi_wakeup_address) {
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
acpi_set_firmware_waking_vector((acpi_physical_address)
|
acpi_set_firmware_waking_vector(
|
||||||
virt_to_phys((void *)
|
(acpi_physical_address)acpi_wakeup_address);
|
||||||
acpi_wakeup_address));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
ACPI_FLUSH_CPU_CACHE();
|
ACPI_FLUSH_CPU_CACHE();
|
||||||
|
@ -315,8 +315,11 @@ acpi_system_write_alarm(struct file *file,
|
|||||||
cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control);
|
cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control);
|
||||||
if (acpi_gbl_FADT.month_alarm)
|
if (acpi_gbl_FADT.month_alarm)
|
||||||
cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control);
|
cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control);
|
||||||
if (acpi_gbl_FADT.century)
|
if (acpi_gbl_FADT.century) {
|
||||||
|
if (adjust)
|
||||||
|
yr += cmos_bcd_read(acpi_gbl_FADT.century, rtc_control) * 100;
|
||||||
cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control);
|
cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control);
|
||||||
|
}
|
||||||
/* enable the rtc alarm interrupt */
|
/* enable the rtc alarm interrupt */
|
||||||
rtc_control |= RTC_AIE;
|
rtc_control |= RTC_AIE;
|
||||||
CMOS_WRITE(rtc_control, RTC_CONTROL);
|
CMOS_WRITE(rtc_control, RTC_CONTROL);
|
||||||
|
@ -1777,7 +1777,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||||||
struct ahci_host_priv *hpriv;
|
struct ahci_host_priv *hpriv;
|
||||||
unsigned int i, handled = 0;
|
unsigned int i, handled = 0;
|
||||||
void __iomem *mmio;
|
void __iomem *mmio;
|
||||||
u32 irq_stat, irq_ack = 0;
|
u32 irq_stat, irq_masked;
|
||||||
|
|
||||||
VPRINTK("ENTER\n");
|
VPRINTK("ENTER\n");
|
||||||
|
|
||||||
@ -1786,16 +1786,17 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||||||
|
|
||||||
/* sigh. 0xffffffff is a valid return from h/w */
|
/* sigh. 0xffffffff is a valid return from h/w */
|
||||||
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
||||||
irq_stat &= hpriv->port_map;
|
|
||||||
if (!irq_stat)
|
if (!irq_stat)
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
irq_masked = irq_stat & hpriv->port_map;
|
||||||
|
|
||||||
spin_lock(&host->lock);
|
spin_lock(&host->lock);
|
||||||
|
|
||||||
for (i = 0; i < host->n_ports; i++) {
|
for (i = 0; i < host->n_ports; i++) {
|
||||||
struct ata_port *ap;
|
struct ata_port *ap;
|
||||||
|
|
||||||
if (!(irq_stat & (1 << i)))
|
if (!(irq_masked & (1 << i)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ap = host->ports[i];
|
ap = host->ports[i];
|
||||||
@ -1809,14 +1810,20 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||||||
"interrupt on disabled port %u\n", i);
|
"interrupt on disabled port %u\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
irq_ack |= (1 << i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (irq_ack) {
|
|
||||||
writel(irq_ack, mmio + HOST_IRQ_STAT);
|
|
||||||
handled = 1;
|
handled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HOST_IRQ_STAT behaves as level triggered latch meaning that
|
||||||
|
* it should be cleared after all the port events are cleared;
|
||||||
|
* otherwise, it will raise a spurious interrupt after each
|
||||||
|
* valid one. Please read section 10.6.2 of ahci 1.1 for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* Also, use the unmasked value to clear interrupt as spurious
|
||||||
|
* pending event on a dummy port might cause screaming IRQ.
|
||||||
|
*/
|
||||||
|
writel(irq_stat, mmio + HOST_IRQ_STAT);
|
||||||
|
|
||||||
spin_unlock(&host->lock);
|
spin_unlock(&host->lock);
|
||||||
|
|
||||||
VPRINTK("EXIT\n");
|
VPRINTK("EXIT\n");
|
||||||
|
@ -1094,6 +1094,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
|
|||||||
int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||||
u8 status, int in_wq)
|
u8 status, int in_wq)
|
||||||
{
|
{
|
||||||
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||||
unsigned long flags = 0;
|
unsigned long flags = 0;
|
||||||
int poll_next;
|
int poll_next;
|
||||||
|
|
||||||
@ -1125,9 +1126,12 @@ fsm_start:
|
|||||||
if (likely(status & (ATA_ERR | ATA_DF)))
|
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||||
/* device stops HSM for abort/error */
|
/* device stops HSM for abort/error */
|
||||||
qc->err_mask |= AC_ERR_DEV;
|
qc->err_mask |= AC_ERR_DEV;
|
||||||
else
|
else {
|
||||||
/* HSM violation. Let EH handle this */
|
/* HSM violation. Let EH handle this */
|
||||||
|
ata_ehi_push_desc(ehi,
|
||||||
|
"ST_FIRST: !(DRQ|ERR|DF)");
|
||||||
qc->err_mask |= AC_ERR_HSM;
|
qc->err_mask |= AC_ERR_HSM;
|
||||||
|
}
|
||||||
|
|
||||||
ap->hsm_task_state = HSM_ST_ERR;
|
ap->hsm_task_state = HSM_ST_ERR;
|
||||||
goto fsm_start;
|
goto fsm_start;
|
||||||
@ -1146,9 +1150,9 @@ fsm_start:
|
|||||||
* the CDB.
|
* the CDB.
|
||||||
*/
|
*/
|
||||||
if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
|
if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
|
||||||
ata_port_printk(ap, KERN_WARNING,
|
ata_ehi_push_desc(ehi, "ST_FIRST: "
|
||||||
"DRQ=1 with device error, "
|
"DRQ=1 with device error, "
|
||||||
"dev_stat 0x%X\n", status);
|
"dev_stat 0x%X", status);
|
||||||
qc->err_mask |= AC_ERR_HSM;
|
qc->err_mask |= AC_ERR_HSM;
|
||||||
ap->hsm_task_state = HSM_ST_ERR;
|
ap->hsm_task_state = HSM_ST_ERR;
|
||||||
goto fsm_start;
|
goto fsm_start;
|
||||||
@ -1205,9 +1209,9 @@ fsm_start:
|
|||||||
* let the EH abort the command or reset the device.
|
* let the EH abort the command or reset the device.
|
||||||
*/
|
*/
|
||||||
if (unlikely(status & (ATA_ERR | ATA_DF))) {
|
if (unlikely(status & (ATA_ERR | ATA_DF))) {
|
||||||
ata_port_printk(ap, KERN_WARNING, "DRQ=1 with "
|
ata_ehi_push_desc(ehi, "ST-ATAPI: "
|
||||||
"device error, dev_stat 0x%X\n",
|
"DRQ=1 with device error, "
|
||||||
status);
|
"dev_stat 0x%X", status);
|
||||||
qc->err_mask |= AC_ERR_HSM;
|
qc->err_mask |= AC_ERR_HSM;
|
||||||
ap->hsm_task_state = HSM_ST_ERR;
|
ap->hsm_task_state = HSM_ST_ERR;
|
||||||
goto fsm_start;
|
goto fsm_start;
|
||||||
@ -1226,13 +1230,17 @@ fsm_start:
|
|||||||
if (likely(status & (ATA_ERR | ATA_DF)))
|
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||||
/* device stops HSM for abort/error */
|
/* device stops HSM for abort/error */
|
||||||
qc->err_mask |= AC_ERR_DEV;
|
qc->err_mask |= AC_ERR_DEV;
|
||||||
else
|
else {
|
||||||
/* HSM violation. Let EH handle this.
|
/* HSM violation. Let EH handle this.
|
||||||
* Phantom devices also trigger this
|
* Phantom devices also trigger this
|
||||||
* condition. Mark hint.
|
* condition. Mark hint.
|
||||||
*/
|
*/
|
||||||
|
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||||
|
"DRQ=1 with device error, "
|
||||||
|
"dev_stat 0x%X", status);
|
||||||
qc->err_mask |= AC_ERR_HSM |
|
qc->err_mask |= AC_ERR_HSM |
|
||||||
AC_ERR_NODEV_HINT;
|
AC_ERR_NODEV_HINT;
|
||||||
|
}
|
||||||
|
|
||||||
ap->hsm_task_state = HSM_ST_ERR;
|
ap->hsm_task_state = HSM_ST_ERR;
|
||||||
goto fsm_start;
|
goto fsm_start;
|
||||||
@ -1257,8 +1265,12 @@ fsm_start:
|
|||||||
status = ata_wait_idle(ap);
|
status = ata_wait_idle(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & (ATA_BUSY | ATA_DRQ))
|
if (status & (ATA_BUSY | ATA_DRQ)) {
|
||||||
|
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||||
|
"BUSY|DRQ persists on ERR|DF, "
|
||||||
|
"dev_stat 0x%X", status);
|
||||||
qc->err_mask |= AC_ERR_HSM;
|
qc->err_mask |= AC_ERR_HSM;
|
||||||
|
}
|
||||||
|
|
||||||
/* ata_pio_sectors() might change the
|
/* ata_pio_sectors() might change the
|
||||||
* state to HSM_ST_LAST. so, the state
|
* state to HSM_ST_LAST. so, the state
|
||||||
|
@ -1607,7 +1607,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
|||||||
* Much of the time, this could just work regardless.
|
* Much of the time, this could just work regardless.
|
||||||
* So for now, just log the incident, and allow the attempt.
|
* So for now, just log the incident, and allow the attempt.
|
||||||
*/
|
*/
|
||||||
if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) {
|
if (limit_warnings > 0 && (qc->nbytes / qc->sect_size) > 1) {
|
||||||
--limit_warnings;
|
--limit_warnings;
|
||||||
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
||||||
": attempting PIO w/multiple DRQ: "
|
": attempting PIO w/multiple DRQ: "
|
||||||
|
@ -370,6 +370,7 @@ static const struct pci_device_id sil24_pci_tbl[] = {
|
|||||||
{ PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
|
{ PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
|
||||||
{ PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
|
{ PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
|
||||||
{ PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
|
{ PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
|
||||||
|
{ PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 },
|
||||||
{ PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
|
{ PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
|
||||||
{ PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
|
{ PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ static struct ata_port_operations uli_ops = {
|
|||||||
.inherits = &ata_bmdma_port_ops,
|
.inherits = &ata_bmdma_port_ops,
|
||||||
.scr_read = uli_scr_read,
|
.scr_read = uli_scr_read,
|
||||||
.scr_write = uli_scr_write,
|
.scr_write = uli_scr_write,
|
||||||
|
.hardreset = ATA_OP_NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ata_port_info uli_port_info = {
|
static const struct ata_port_info uli_port_info = {
|
||||||
|
@ -64,7 +64,7 @@ config KS0108_DELAY
|
|||||||
Amount of time the ks0108 should wait between each control write
|
Amount of time the ks0108 should wait between each control write
|
||||||
to the parallel port.
|
to the parallel port.
|
||||||
|
|
||||||
If your driver seems to miss random writings, increment this.
|
If your LCD seems to miss random writings, increment this.
|
||||||
|
|
||||||
If you don't know what I'm talking about, ignore it.
|
If you don't know what I'm talking about, ignore it.
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* License: GPLv2
|
* License: GPLv2
|
||||||
* Depends: ks0108
|
* Depends: ks0108
|
||||||
*
|
*
|
||||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||||
* Date: 2006-10-31
|
* Date: 2006-10-31
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -398,5 +398,5 @@ module_init(cfag12864b_init);
|
|||||||
module_exit(cfag12864b_exit);
|
module_exit(cfag12864b_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||||
MODULE_DESCRIPTION("cfag12864b LCD driver");
|
MODULE_DESCRIPTION("cfag12864b LCD driver");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* License: GPLv2
|
* License: GPLv2
|
||||||
* Depends: cfag12864b
|
* Depends: cfag12864b
|
||||||
*
|
*
|
||||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||||
* Date: 2006-10-31
|
* Date: 2006-10-31
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -186,5 +186,5 @@ module_init(cfag12864bfb_init);
|
|||||||
module_exit(cfag12864bfb_exit);
|
module_exit(cfag12864bfb_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||||
MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver");
|
MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* License: GPLv2
|
* License: GPLv2
|
||||||
* Depends: parport
|
* Depends: parport
|
||||||
*
|
*
|
||||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||||
* Date: 2006-10-31
|
* Date: 2006-10-31
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -173,6 +173,6 @@ module_init(ks0108_init);
|
|||||||
module_exit(ks0108_exit);
|
module_exit(ks0108_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||||
MODULE_DESCRIPTION("ks0108 LCD Controller driver");
|
MODULE_DESCRIPTION("ks0108 LCD Controller driver");
|
||||||
|
|
||||||
|
@ -84,8 +84,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
|
|||||||
nid, K(i.totalram),
|
nid, K(i.totalram),
|
||||||
nid, K(i.freeram),
|
nid, K(i.freeram),
|
||||||
nid, K(i.totalram - i.freeram),
|
nid, K(i.totalram - i.freeram),
|
||||||
nid, node_page_state(nid, NR_ACTIVE),
|
nid, K(node_page_state(nid, NR_ACTIVE)),
|
||||||
nid, node_page_state(nid, NR_INACTIVE),
|
nid, K(node_page_state(nid, NR_INACTIVE)),
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
nid, K(i.totalhigh),
|
nid, K(i.totalhigh),
|
||||||
nid, K(i.freehigh),
|
nid, K(i.freehigh),
|
||||||
|
@ -106,35 +106,34 @@ MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
|
|||||||
/* board_id = Subsystem Device ID & Vendor ID
|
/* board_id = Subsystem Device ID & Vendor ID
|
||||||
* product = Marketing Name for the board
|
* product = Marketing Name for the board
|
||||||
* access = Address of the struct of function pointers
|
* access = Address of the struct of function pointers
|
||||||
* nr_cmds = Number of commands supported by controller
|
|
||||||
*/
|
*/
|
||||||
static struct board_type products[] = {
|
static struct board_type products[] = {
|
||||||
{0x40700E11, "Smart Array 5300", &SA5_access, 512},
|
{0x40700E11, "Smart Array 5300", &SA5_access},
|
||||||
{0x40800E11, "Smart Array 5i", &SA5B_access, 512},
|
{0x40800E11, "Smart Array 5i", &SA5B_access},
|
||||||
{0x40820E11, "Smart Array 532", &SA5B_access, 512},
|
{0x40820E11, "Smart Array 532", &SA5B_access},
|
||||||
{0x40830E11, "Smart Array 5312", &SA5B_access, 512},
|
{0x40830E11, "Smart Array 5312", &SA5B_access},
|
||||||
{0x409A0E11, "Smart Array 641", &SA5_access, 512},
|
{0x409A0E11, "Smart Array 641", &SA5_access},
|
||||||
{0x409B0E11, "Smart Array 642", &SA5_access, 512},
|
{0x409B0E11, "Smart Array 642", &SA5_access},
|
||||||
{0x409C0E11, "Smart Array 6400", &SA5_access, 512},
|
{0x409C0E11, "Smart Array 6400", &SA5_access},
|
||||||
{0x409D0E11, "Smart Array 6400 EM", &SA5_access, 512},
|
{0x409D0E11, "Smart Array 6400 EM", &SA5_access},
|
||||||
{0x40910E11, "Smart Array 6i", &SA5_access, 512},
|
{0x40910E11, "Smart Array 6i", &SA5_access},
|
||||||
{0x3225103C, "Smart Array P600", &SA5_access, 512},
|
{0x3225103C, "Smart Array P600", &SA5_access},
|
||||||
{0x3223103C, "Smart Array P800", &SA5_access, 512},
|
{0x3223103C, "Smart Array P800", &SA5_access},
|
||||||
{0x3234103C, "Smart Array P400", &SA5_access, 512},
|
{0x3234103C, "Smart Array P400", &SA5_access},
|
||||||
{0x3235103C, "Smart Array P400i", &SA5_access, 512},
|
{0x3235103C, "Smart Array P400i", &SA5_access},
|
||||||
{0x3211103C, "Smart Array E200i", &SA5_access, 120},
|
{0x3211103C, "Smart Array E200i", &SA5_access},
|
||||||
{0x3212103C, "Smart Array E200", &SA5_access, 120},
|
{0x3212103C, "Smart Array E200", &SA5_access},
|
||||||
{0x3213103C, "Smart Array E200i", &SA5_access, 120},
|
{0x3213103C, "Smart Array E200i", &SA5_access},
|
||||||
{0x3214103C, "Smart Array E200i", &SA5_access, 120},
|
{0x3214103C, "Smart Array E200i", &SA5_access},
|
||||||
{0x3215103C, "Smart Array E200i", &SA5_access, 120},
|
{0x3215103C, "Smart Array E200i", &SA5_access},
|
||||||
{0x3237103C, "Smart Array E500", &SA5_access, 512},
|
{0x3237103C, "Smart Array E500", &SA5_access},
|
||||||
{0x323D103C, "Smart Array P700m", &SA5_access, 512},
|
{0x323D103C, "Smart Array P700m", &SA5_access},
|
||||||
{0x3241103C, "Smart Array P212", &SA5_access, 384},
|
{0x3241103C, "Smart Array P212", &SA5_access},
|
||||||
{0x3243103C, "Smart Array P410", &SA5_access, 384},
|
{0x3243103C, "Smart Array P410", &SA5_access},
|
||||||
{0x3245103C, "Smart Array P410i", &SA5_access, 384},
|
{0x3245103C, "Smart Array P410i", &SA5_access},
|
||||||
{0x3247103C, "Smart Array P411", &SA5_access, 384},
|
{0x3247103C, "Smart Array P411", &SA5_access},
|
||||||
{0x3249103C, "Smart Array P812", &SA5_access, 384},
|
{0x3249103C, "Smart Array P812", &SA5_access},
|
||||||
{0xFFFF103C, "Unknown Smart Array", &SA5_access, 120},
|
{0xFFFF103C, "Unknown Smart Array", &SA5_access},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* How long to wait (in milliseconds) for board to go into simple mode */
|
/* How long to wait (in milliseconds) for board to go into simple mode */
|
||||||
@ -3086,11 +3085,20 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||||||
print_cfg_table(c->cfgtable);
|
print_cfg_table(c->cfgtable);
|
||||||
#endif /* CCISS_DEBUG */
|
#endif /* CCISS_DEBUG */
|
||||||
|
|
||||||
|
/* Some controllers support Zero Memory Raid (ZMR).
|
||||||
|
* When configured in ZMR mode the number of supported
|
||||||
|
* commands drops to 64. So instead of just setting an
|
||||||
|
* arbitrary value we make the driver a little smarter.
|
||||||
|
* We read the config table to tell us how many commands
|
||||||
|
* are supported on the controller then subtract 4 to
|
||||||
|
* leave a little room for ioctl calls.
|
||||||
|
*/
|
||||||
|
c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
|
||||||
for (i = 0; i < ARRAY_SIZE(products); i++) {
|
for (i = 0; i < ARRAY_SIZE(products); i++) {
|
||||||
if (board_id == products[i].board_id) {
|
if (board_id == products[i].board_id) {
|
||||||
c->product_name = products[i].product_name;
|
c->product_name = products[i].product_name;
|
||||||
c->access = *(products[i].access);
|
c->access = *(products[i].access);
|
||||||
c->nr_cmds = products[i].nr_cmds;
|
c->nr_cmds = c->max_commands - 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3110,7 +3118,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||||||
if (subsystem_vendor_id == PCI_VENDOR_ID_HP) {
|
if (subsystem_vendor_id == PCI_VENDOR_ID_HP) {
|
||||||
c->product_name = products[i-1].product_name;
|
c->product_name = products[i-1].product_name;
|
||||||
c->access = *(products[i-1].access);
|
c->access = *(products[i-1].access);
|
||||||
c->nr_cmds = products[i-1].nr_cmds;
|
c->nr_cmds = c->max_commands - 4;
|
||||||
printk(KERN_WARNING "cciss: This is an unknown "
|
printk(KERN_WARNING "cciss: This is an unknown "
|
||||||
"Smart Array controller.\n"
|
"Smart Array controller.\n"
|
||||||
"cciss: Please update to the latest driver "
|
"cciss: Please update to the latest driver "
|
||||||
@ -3546,6 +3554,10 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
for (j = 0; j <= hba[i]->highest_lun; j++)
|
for (j = 0; j <= hba[i]->highest_lun; j++)
|
||||||
add_disk(hba[i]->gendisk[j]);
|
add_disk(hba[i]->gendisk[j]);
|
||||||
|
|
||||||
|
/* we must register the controller even if no disks exist */
|
||||||
|
if (hba[i]->highest_lun == -1)
|
||||||
|
add_disk(hba[i]->gendisk[0]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
clean4:
|
clean4:
|
||||||
|
@ -62,11 +62,11 @@ static void i915_vblank_tasklet(struct drm_device *dev)
|
|||||||
u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
|
u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
|
||||||
RING_LOCALS;
|
RING_LOCALS;
|
||||||
|
|
||||||
if (sarea_priv->front_tiled) {
|
if (IS_I965G(dev) && sarea_priv->front_tiled) {
|
||||||
cmd |= XY_SRC_COPY_BLT_DST_TILED;
|
cmd |= XY_SRC_COPY_BLT_DST_TILED;
|
||||||
dst_pitch >>= 2;
|
dst_pitch >>= 2;
|
||||||
}
|
}
|
||||||
if (sarea_priv->back_tiled) {
|
if (IS_I965G(dev) && sarea_priv->back_tiled) {
|
||||||
cmd |= XY_SRC_COPY_BLT_SRC_TILED;
|
cmd |= XY_SRC_COPY_BLT_SRC_TILED;
|
||||||
src_pitch >>= 2;
|
src_pitch >>= 2;
|
||||||
}
|
}
|
||||||
|
@ -3322,7 +3322,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
|
|||||||
msleep_interruptible(duration);
|
msleep_interruptible(duration);
|
||||||
tty->ops->break_ctl(tty, 0);
|
tty->ops->break_ctl(tty, 0);
|
||||||
tty_write_unlock(tty);
|
tty_write_unlock(tty);
|
||||||
if (!signal_pending(current))
|
if (signal_pending(current))
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/connector.h>
|
#include <linux/connector.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/proc_fs.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
|
|
||||||
@ -403,6 +405,40 @@ static void cn_callback(void *data)
|
|||||||
mutex_unlock(¬ify_lock);
|
mutex_unlock(¬ify_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cn_proc_show(struct seq_file *m, void *v)
|
||||||
|
{
|
||||||
|
struct cn_queue_dev *dev = cdev.cbdev;
|
||||||
|
struct cn_callback_entry *cbq;
|
||||||
|
|
||||||
|
seq_printf(m, "Name ID\n");
|
||||||
|
|
||||||
|
spin_lock_bh(&dev->queue_lock);
|
||||||
|
|
||||||
|
list_for_each_entry(cbq, &dev->queue_list, callback_entry) {
|
||||||
|
seq_printf(m, "%-15s %u:%u\n",
|
||||||
|
cbq->id.name,
|
||||||
|
cbq->id.id.idx,
|
||||||
|
cbq->id.id.val);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock_bh(&dev->queue_lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cn_proc_open(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
return single_open(file, cn_proc_show, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct file_operations cn_file_ops = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.open = cn_proc_open,
|
||||||
|
.read = seq_read,
|
||||||
|
.llseek = seq_lseek,
|
||||||
|
.release = single_release
|
||||||
|
};
|
||||||
|
|
||||||
static int __devinit cn_init(void)
|
static int __devinit cn_init(void)
|
||||||
{
|
{
|
||||||
struct cn_dev *dev = &cdev;
|
struct cn_dev *dev = &cdev;
|
||||||
@ -434,6 +470,8 @@ static int __devinit cn_init(void)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,6 +481,8 @@ static void __devexit cn_fini(void)
|
|||||||
|
|
||||||
cn_already_initialized = 0;
|
cn_already_initialized = 0;
|
||||||
|
|
||||||
|
proc_net_remove(&init_net, "connector");
|
||||||
|
|
||||||
cn_del_callback(&dev->id);
|
cn_del_callback(&dev->id);
|
||||||
cn_queue_free_dev(dev->cbdev);
|
cn_queue_free_dev(dev->cbdev);
|
||||||
netlink_kernel_release(dev->nls);
|
netlink_kernel_release(dev->nls);
|
||||||
|
@ -1051,7 +1051,8 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SBP2_CSR_LOGICAL_UNIT_DIRECTORY:
|
case SBP2_CSR_LOGICAL_UNIT_DIRECTORY:
|
||||||
if (sbp2_scan_logical_unit_dir(tgt, ci.p + value) < 0)
|
/* Adjust for the increment in the iterator */
|
||||||
|
if (sbp2_scan_logical_unit_dir(tgt, ci.p - 1 + value) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,18 @@ config DEBUG_GPIO
|
|||||||
comment "I2C GPIO expanders:"
|
comment "I2C GPIO expanders:"
|
||||||
|
|
||||||
config GPIO_PCA953X
|
config GPIO_PCA953X
|
||||||
tristate "PCA953x I/O ports"
|
tristate "PCA953x, PCA955x, and MAX7310 I/O ports"
|
||||||
depends on I2C
|
depends on I2C
|
||||||
help
|
help
|
||||||
Say yes here to support the PCA9534 (8-bit), PCA9535 (16-bit),
|
Say yes here to provide access to several register-oriented
|
||||||
PCA9536 (4-bit), PCA9537 (4-bit), PCA9538 (8-bit), and PCA9539
|
SMBus I/O expanders, made mostly by NXP or TI. Compatible
|
||||||
(16-bit) I/O ports. These parts are made by NXP and TI.
|
models include:
|
||||||
|
|
||||||
|
4 bits: pca9536, pca9537
|
||||||
|
|
||||||
|
8 bits: max7310, pca9534, pca9538, pca9554, pca9557
|
||||||
|
|
||||||
|
16 bits: pca9535, pca9539, pca9555
|
||||||
|
|
||||||
This driver can also be built as a module. If so, the module
|
This driver can also be built as a module. If so, the module
|
||||||
will be called pca953x.
|
will be called pca953x.
|
||||||
|
@ -33,7 +33,7 @@ static const struct i2c_device_id pca953x_id[] = {
|
|||||||
{ "pca9554", 8, },
|
{ "pca9554", 8, },
|
||||||
{ "pca9555", 16, },
|
{ "pca9555", 16, },
|
||||||
{ "pca9557", 8, },
|
{ "pca9557", 8, },
|
||||||
/* REVISIT several pca955x parts should work here too */
|
{ "max7310", 8, },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, pca953x_id);
|
MODULE_DEVICE_TABLE(i2c, pca953x_id);
|
||||||
|
@ -516,17 +516,23 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = {
|
|||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"),
|
||||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"),
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61"),
|
||||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"),
|
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"),
|
||||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"),
|
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"),
|
||||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"),
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p"),
|
||||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"),
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"),
|
||||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"),
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61s"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61"),
|
||||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"),
|
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61m"),
|
||||||
|
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p"),
|
||||||
{ .ident = NULL }
|
{ .ident = NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||||||
/* ack was not received... */
|
/* ack was not received... */
|
||||||
|
|
||||||
dev_dbg(i2c->dev, "ack was not received\n");
|
dev_dbg(i2c->dev, "ack was not received\n");
|
||||||
s3c24xx_i2c_stop(i2c, -EREMOTEIO);
|
s3c24xx_i2c_stop(i2c, -ENXIO);
|
||||||
goto out_ack;
|
goto out_ack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +305,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||||||
i2c->state = STATE_WRITE;
|
i2c->state = STATE_WRITE;
|
||||||
|
|
||||||
/* terminate the transfer if there is nothing to do
|
/* terminate the transfer if there is nothing to do
|
||||||
* (used by the i2c probe to find devices */
|
* as this is used by the i2c probe to find devices. */
|
||||||
|
|
||||||
if (is_lastmsg(i2c) && i2c->msg->len == 0) {
|
if (is_lastmsg(i2c) && i2c->msg->len == 0) {
|
||||||
s3c24xx_i2c_stop(i2c, 0);
|
s3c24xx_i2c_stop(i2c, 0);
|
||||||
@ -323,7 +323,17 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||||||
* end of the message, and if so, work out what to do
|
* end of the message, and if so, work out what to do
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
|
||||||
|
if (iicstat & S3C2410_IICSTAT_LASTBIT) {
|
||||||
|
dev_dbg(i2c->dev, "WRITE: No Ack\n");
|
||||||
|
|
||||||
|
s3c24xx_i2c_stop(i2c, -ECONNREFUSED);
|
||||||
|
goto out_ack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
retry_write:
|
retry_write:
|
||||||
|
|
||||||
if (!is_msgend(i2c)) {
|
if (!is_msgend(i2c)) {
|
||||||
byte = i2c->msg->buf[i2c->msg_ptr++];
|
byte = i2c->msg->buf[i2c->msg_ptr++];
|
||||||
writeb(byte, i2c->regs + S3C2410_IICDS);
|
writeb(byte, i2c->regs + S3C2410_IICDS);
|
||||||
@ -377,17 +387,6 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||||||
* going to do any more read/write
|
* going to do any more read/write
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!(i2c->msg->flags & I2C_M_IGNORE_NAK) &&
|
|
||||||
!(is_msglast(i2c) && is_lastmsg(i2c))) {
|
|
||||||
|
|
||||||
if (iicstat & S3C2410_IICSTAT_LASTBIT) {
|
|
||||||
dev_dbg(i2c->dev, "READ: No Ack\n");
|
|
||||||
|
|
||||||
s3c24xx_i2c_stop(i2c, -ECONNREFUSED);
|
|
||||||
goto out_ack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
byte = readb(i2c->regs + S3C2410_IICDS);
|
byte = readb(i2c->regs + S3C2410_IICDS);
|
||||||
i2c->msg->buf[i2c->msg_ptr++] = byte;
|
i2c->msg->buf[i2c->msg_ptr++] = byte;
|
||||||
|
|
||||||
@ -949,3 +948,4 @@ MODULE_DESCRIPTION("S3C24XX I2C Bus driver");
|
|||||||
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
|
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_ALIAS("platform:s3c2410-i2c");
|
MODULE_ALIAS("platform:s3c2410-i2c");
|
||||||
|
MODULE_ALIAS("platform:s3c2440-i2c");
|
||||||
|
@ -823,6 +823,13 @@ config BLK_DEV_IDE_RAPIDE
|
|||||||
Say Y here if you want to support the Yellowstone RapIDE controller
|
Say Y here if you want to support the Yellowstone RapIDE controller
|
||||||
manufactured for use with Acorn computers.
|
manufactured for use with Acorn computers.
|
||||||
|
|
||||||
|
config BLK_DEV_IDE_BAST
|
||||||
|
tristate "Simtec BAST / Thorcom VR1000 IDE support"
|
||||||
|
depends on ARM && (ARCH_BAST || MACH_VR1000)
|
||||||
|
help
|
||||||
|
Say Y here if you want to support the onboard IDE channels on the
|
||||||
|
Simtec BAST or the Thorcom VR1000
|
||||||
|
|
||||||
config IDE_H8300
|
config IDE_H8300
|
||||||
tristate "H8300 IDE support"
|
tristate "H8300 IDE support"
|
||||||
depends on H8300
|
depends on H8300
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
|
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
|
||||||
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
|
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
|
||||||
|
obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
|
||||||
obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o
|
obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_IDE_ARM), m)
|
ifeq ($(CONFIG_IDE_ARM), m)
|
||||||
|
90
drivers/ide/arm/bast-ide.c
Normal file
90
drivers/ide/arm/bast-ide.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003-2004 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/module.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/ide.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/irq.h>
|
||||||
|
#include <asm/arch/map.h>
|
||||||
|
#include <asm/arch/bast-map.h>
|
||||||
|
#include <asm/arch/bast-irq.h>
|
||||||
|
|
||||||
|
#define DRV_NAME "bast-ide"
|
||||||
|
|
||||||
|
static int __init bastide_register(unsigned int base, unsigned int aux, int irq)
|
||||||
|
{
|
||||||
|
ide_hwif_t *hwif;
|
||||||
|
hw_regs_t hw;
|
||||||
|
int i;
|
||||||
|
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||||
|
|
||||||
|
memset(&hw, 0, sizeof(hw));
|
||||||
|
|
||||||
|
base += BAST_IDE_CS;
|
||||||
|
aux += BAST_IDE_CS;
|
||||||
|
|
||||||
|
for (i = 0; i <= 7; i++) {
|
||||||
|
hw.io_ports_array[i] = (unsigned long)base;
|
||||||
|
base += 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
hw.io_ports.ctl_addr = aux + (6 * 0x20);
|
||||||
|
hw.irq = irq;
|
||||||
|
hw.chipset = ide_generic;
|
||||||
|
|
||||||
|
hwif = ide_find_port();
|
||||||
|
if (hwif == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
i = hwif->index;
|
||||||
|
|
||||||
|
ide_init_port_data(hwif, i);
|
||||||
|
ide_init_port_hw(hwif, &hw);
|
||||||
|
hwif->port_ops = NULL;
|
||||||
|
|
||||||
|
idx[0] = i;
|
||||||
|
|
||||||
|
ide_device_add(idx, NULL);
|
||||||
|
out:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init bastide_init(void)
|
||||||
|
{
|
||||||
|
unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS;
|
||||||
|
|
||||||
|
/* we can treat the VR1000 and the BAST the same */
|
||||||
|
|
||||||
|
if (!(machine_is_bast() || machine_is_vr1000()))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n");
|
||||||
|
|
||||||
|
if (!request_mem_region(base, 0x400000, DRV_NAME)) {
|
||||||
|
printk(KERN_ERR "%s: resources busy\n", DRV_NAME);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0);
|
||||||
|
bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(bastide_init);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver");
|
@ -646,8 +646,6 @@ static int ide_register_port(ide_hwif_t *hwif)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
get_device(&hwif->gendev);
|
|
||||||
|
|
||||||
hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
|
hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
|
||||||
MKDEV(0, 0), hwif, hwif->name);
|
MKDEV(0, 0), hwif, hwif->name);
|
||||||
if (IS_ERR(hwif->portdev)) {
|
if (IS_ERR(hwif->portdev)) {
|
||||||
|
@ -76,7 +76,7 @@ static int proc_ide_read_mate
|
|||||||
ide_hwif_t *hwif = (ide_hwif_t *) data;
|
ide_hwif_t *hwif = (ide_hwif_t *) data;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (hwif && hwif->mate && hwif->mate->present)
|
if (hwif && hwif->mate)
|
||||||
len = sprintf(page, "%s\n", hwif->mate->name);
|
len = sprintf(page, "%s\n", hwif->mate->name);
|
||||||
else
|
else
|
||||||
len = sprintf(page, "(none)\n");
|
len = sprintf(page, "(none)\n");
|
||||||
|
@ -315,13 +315,14 @@ void ide_unregister(ide_hwif_t *hwif)
|
|||||||
|
|
||||||
BUG_ON(in_interrupt());
|
BUG_ON(in_interrupt());
|
||||||
BUG_ON(irqs_disabled());
|
BUG_ON(irqs_disabled());
|
||||||
|
|
||||||
mutex_lock(&ide_cfg_mtx);
|
mutex_lock(&ide_cfg_mtx);
|
||||||
|
|
||||||
spin_lock_irq(&ide_lock);
|
spin_lock_irq(&ide_lock);
|
||||||
if (!hwif->present)
|
if (hwif->present) {
|
||||||
goto abort;
|
|
||||||
__ide_port_unregister_devices(hwif);
|
__ide_port_unregister_devices(hwif);
|
||||||
hwif->present = 0;
|
hwif->present = 0;
|
||||||
|
}
|
||||||
spin_unlock_irq(&ide_lock);
|
spin_unlock_irq(&ide_lock);
|
||||||
|
|
||||||
ide_proc_unregister_port(hwif);
|
ide_proc_unregister_port(hwif);
|
||||||
@ -351,16 +352,15 @@ void ide_unregister(ide_hwif_t *hwif)
|
|||||||
blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS);
|
blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS);
|
||||||
kfree(hwif->sg_table);
|
kfree(hwif->sg_table);
|
||||||
unregister_blkdev(hwif->major, hwif->name);
|
unregister_blkdev(hwif->major, hwif->name);
|
||||||
spin_lock_irq(&ide_lock);
|
|
||||||
|
|
||||||
if (hwif->dma_base)
|
if (hwif->dma_base)
|
||||||
ide_release_dma_engine(hwif);
|
ide_release_dma_engine(hwif);
|
||||||
|
|
||||||
|
spin_lock_irq(&ide_lock);
|
||||||
/* restore hwif data to pristine status */
|
/* restore hwif data to pristine status */
|
||||||
ide_init_port_data(hwif, hwif->index);
|
ide_init_port_data(hwif, hwif->index);
|
||||||
|
|
||||||
abort:
|
|
||||||
spin_unlock_irq(&ide_lock);
|
spin_unlock_irq(&ide_lock);
|
||||||
|
|
||||||
mutex_unlock(&ide_cfg_mtx);
|
mutex_unlock(&ide_cfg_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1094,13 +1094,6 @@ struct bus_type ide_bus_type = {
|
|||||||
|
|
||||||
EXPORT_SYMBOL_GPL(ide_bus_type);
|
EXPORT_SYMBOL_GPL(ide_bus_type);
|
||||||
|
|
||||||
static void ide_port_class_release(struct device *portdev)
|
|
||||||
{
|
|
||||||
ide_hwif_t *hwif = dev_get_drvdata(portdev);
|
|
||||||
|
|
||||||
put_device(&hwif->gendev);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ide_vlb_clk;
|
int ide_vlb_clk;
|
||||||
EXPORT_SYMBOL_GPL(ide_vlb_clk);
|
EXPORT_SYMBOL_GPL(ide_vlb_clk);
|
||||||
|
|
||||||
@ -1305,7 +1298,6 @@ static int __init ide_init(void)
|
|||||||
ret = PTR_ERR(ide_port_class);
|
ret = PTR_ERR(ide_port_class);
|
||||||
goto out_port_class;
|
goto out_port_class;
|
||||||
}
|
}
|
||||||
ide_port_class->dev_release = ide_port_class_release;
|
|
||||||
|
|
||||||
init_ide_data();
|
init_ide_data();
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that the effect_id is a valid effect and whether the user
|
* Check that the effect_id is a valid effect and whether the user
|
||||||
@ -166,8 +167,10 @@ int input_ff_upload(struct input_dev *dev, struct ff_effect *effect,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
spin_lock_irq(&dev->event_lock);
|
||||||
ff->effects[id] = *effect;
|
ff->effects[id] = *effect;
|
||||||
ff->effect_owners[id] = file;
|
ff->effect_owners[id] = file;
|
||||||
|
spin_unlock_irq(&dev->event_lock);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ff->mutex);
|
mutex_unlock(&ff->mutex);
|
||||||
@ -189,15 +192,21 @@ static int erase_effect(struct input_dev *dev, int effect_id,
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
spin_lock_irq(&dev->event_lock);
|
||||||
ff->playback(dev, effect_id, 0);
|
ff->playback(dev, effect_id, 0);
|
||||||
|
ff->effect_owners[effect_id] = NULL;
|
||||||
|
spin_unlock_irq(&dev->event_lock);
|
||||||
|
|
||||||
if (ff->erase) {
|
if (ff->erase) {
|
||||||
error = ff->erase(dev, effect_id);
|
error = ff->erase(dev, effect_id);
|
||||||
if (error)
|
if (error) {
|
||||||
|
spin_lock_irq(&dev->event_lock);
|
||||||
|
ff->effect_owners[effect_id] = file;
|
||||||
|
spin_unlock_irq(&dev->event_lock);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ff->effect_owners[effect_id] = NULL;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -263,8 +272,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
|
|||||||
if (type != EV_FF)
|
if (type != EV_FF)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mutex_lock(&ff->mutex);
|
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case FF_GAIN:
|
case FF_GAIN:
|
||||||
if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff)
|
if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff)
|
||||||
@ -286,7 +293,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&ff->mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(input_ff_event);
|
EXPORT_SYMBOL_GPL(input_ff_event);
|
||||||
|
@ -432,6 +432,7 @@ static int crypt_convert(struct crypt_config *cc,
|
|||||||
case 0:
|
case 0:
|
||||||
atomic_dec(&ctx->pending);
|
atomic_dec(&ctx->pending);
|
||||||
ctx->sector++;
|
ctx->sector++;
|
||||||
|
cond_resched();
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* error */
|
/* error */
|
||||||
|
@ -2201,3 +2201,41 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
|
|||||||
[0x25] = KEY_POWER, /* power */
|
[0x25] = KEY_POWER, /* power */
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
|
EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
|
||||||
|
|
||||||
|
IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = {
|
||||||
|
[0x20] = KEY_LIST,
|
||||||
|
[0x00] = KEY_POWER,
|
||||||
|
[0x28] = KEY_1,
|
||||||
|
[0x18] = KEY_2,
|
||||||
|
[0x38] = KEY_3,
|
||||||
|
[0x24] = KEY_4,
|
||||||
|
[0x14] = KEY_5,
|
||||||
|
[0x34] = KEY_6,
|
||||||
|
[0x2c] = KEY_7,
|
||||||
|
[0x1c] = KEY_8,
|
||||||
|
[0x3c] = KEY_9,
|
||||||
|
[0x12] = KEY_SUBTITLE,
|
||||||
|
[0x22] = KEY_0,
|
||||||
|
[0x32] = KEY_REWIND,
|
||||||
|
[0x3a] = KEY_SHUFFLE,
|
||||||
|
[0x02] = KEY_PRINT,
|
||||||
|
[0x11] = KEY_CHANNELDOWN,
|
||||||
|
[0x31] = KEY_CHANNELUP,
|
||||||
|
[0x0c] = KEY_ZOOM,
|
||||||
|
[0x1e] = KEY_VOLUMEDOWN,
|
||||||
|
[0x3e] = KEY_VOLUMEUP,
|
||||||
|
[0x0a] = KEY_MUTE,
|
||||||
|
[0x04] = KEY_AUDIO,
|
||||||
|
[0x26] = KEY_RECORD,
|
||||||
|
[0x06] = KEY_PLAY,
|
||||||
|
[0x36] = KEY_STOP,
|
||||||
|
[0x16] = KEY_PAUSE,
|
||||||
|
[0x2e] = KEY_REWIND,
|
||||||
|
[0x0e] = KEY_FASTFORWARD,
|
||||||
|
[0x30] = KEY_TEXT,
|
||||||
|
[0x21] = KEY_GREEN,
|
||||||
|
[0x01] = KEY_BLUE,
|
||||||
|
[0x08] = KEY_EPG,
|
||||||
|
[0x2a] = KEY_MENU,
|
||||||
|
};
|
||||||
|
EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d);
|
||||||
|
@ -649,9 +649,17 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq)
|
|||||||
u8 val;
|
u8 val;
|
||||||
|
|
||||||
int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);
|
int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);
|
||||||
|
/* The TDA18271HD/C1 rf_cal map lookup is expected to go out of range
|
||||||
|
* for frequencies above 61.1 MHz. In these cases, the internal RF
|
||||||
|
* tracking filters calibration mechanism is used.
|
||||||
|
*
|
||||||
|
* There is no need to warn the user about this.
|
||||||
|
*/
|
||||||
|
if (ret < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
regs[R_EB14] = val;
|
regs[R_EB14] = val;
|
||||||
|
fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force)
|
|||||||
TDA18271_MAIN_PLL, force);
|
TDA18271_MAIN_PLL, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void tda18271_set_if_notch(struct dvb_frontend *fe)
|
||||||
|
{
|
||||||
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
|
unsigned char *regs = priv->tda18271_regs;
|
||||||
|
|
||||||
|
switch (priv->mode) {
|
||||||
|
case TDA18271_ANALOG:
|
||||||
|
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
|
||||||
|
break;
|
||||||
|
case TDA18271_DIGITAL:
|
||||||
|
regs[R_MPD] |= 0x80; /* IF notch = 1 */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
struct tda18271_std_map_item *map,
|
struct tda18271_std_map_item *map,
|
||||||
u32 freq, u32 bw)
|
u32 freq, u32 bw)
|
||||||
@ -60,25 +75,18 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
regs[R_EP3] &= ~0x1f; /* clear std bits */
|
regs[R_EP3] &= ~0x1f; /* clear std bits */
|
||||||
regs[R_EP3] |= (map->agc_mode << 3) | map->std;
|
regs[R_EP3] |= (map->agc_mode << 3) | map->std;
|
||||||
|
|
||||||
|
if (priv->id == TDA18271HDC2) {
|
||||||
/* set rfagc to high speed mode */
|
/* set rfagc to high speed mode */
|
||||||
regs[R_EP3] &= ~0x04;
|
regs[R_EP3] &= ~0x04;
|
||||||
|
}
|
||||||
|
|
||||||
/* set cal mode to normal */
|
/* set cal mode to normal */
|
||||||
regs[R_EP4] &= ~0x03;
|
regs[R_EP4] &= ~0x03;
|
||||||
|
|
||||||
/* update IF output level & IF notch frequency */
|
/* update IF output level */
|
||||||
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
||||||
regs[R_EP4] |= (map->if_lvl << 2);
|
regs[R_EP4] |= (map->if_lvl << 2);
|
||||||
|
|
||||||
switch (priv->mode) {
|
|
||||||
case TDA18271_ANALOG:
|
|
||||||
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
|
|
||||||
break;
|
|
||||||
case TDA18271_DIGITAL:
|
|
||||||
regs[R_MPD] |= 0x80; /* IF notch = 1 */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update FM_RFn */
|
/* update FM_RFn */
|
||||||
regs[R_EP4] &= ~0x80;
|
regs[R_EP4] &= ~0x80;
|
||||||
regs[R_EP4] |= map->fm_rfn << 7;
|
regs[R_EP4] |= map->fm_rfn << 7;
|
||||||
@ -95,6 +103,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
/* disable Power Level Indicator */
|
/* disable Power Level Indicator */
|
||||||
regs[R_EP1] |= 0x40;
|
regs[R_EP1] |= 0x40;
|
||||||
|
|
||||||
|
/* make sure thermometer is off */
|
||||||
|
regs[R_TM] &= ~0x10;
|
||||||
|
|
||||||
/* frequency dependent parameters */
|
/* frequency dependent parameters */
|
||||||
|
|
||||||
tda18271_calc_ir_measure(fe, &freq);
|
tda18271_calc_ir_measure(fe, &freq);
|
||||||
@ -135,6 +146,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
switch (priv->role) {
|
switch (priv->role) {
|
||||||
case TDA18271_MASTER:
|
case TDA18271_MASTER:
|
||||||
tda18271_calc_main_pll(fe, N);
|
tda18271_calc_main_pll(fe, N);
|
||||||
|
tda18271_set_if_notch(fe);
|
||||||
tda18271_write_regs(fe, R_MPD, 4);
|
tda18271_write_regs(fe, R_MPD, 4);
|
||||||
break;
|
break;
|
||||||
case TDA18271_SLAVE:
|
case TDA18271_SLAVE:
|
||||||
@ -142,6 +154,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
tda18271_write_regs(fe, R_CPD, 4);
|
tda18271_write_regs(fe, R_CPD, 4);
|
||||||
|
|
||||||
regs[R_MPD] = regs[R_CPD] & 0x7f;
|
regs[R_MPD] = regs[R_CPD] & 0x7f;
|
||||||
|
tda18271_set_if_notch(fe);
|
||||||
tda18271_write_regs(fe, R_MPD, 1);
|
tda18271_write_regs(fe, R_MPD, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -160,12 +173,14 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
|
|
||||||
msleep(20);
|
msleep(20);
|
||||||
|
|
||||||
|
if (priv->id == TDA18271HDC2) {
|
||||||
/* set rfagc to normal speed mode */
|
/* set rfagc to normal speed mode */
|
||||||
if (map->fm_rfn)
|
if (map->fm_rfn)
|
||||||
regs[R_EP3] &= ~0x04;
|
regs[R_EP3] &= ~0x04;
|
||||||
else
|
else
|
||||||
regs[R_EP3] |= 0x04;
|
regs[R_EP3] |= 0x04;
|
||||||
ret = tda18271_write_regs(fe, R_EP3, 1);
|
ret = tda18271_write_regs(fe, R_EP3, 1);
|
||||||
|
}
|
||||||
fail:
|
fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -507,7 +522,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe)
|
|||||||
/* set cal mode to normal */
|
/* set cal mode to normal */
|
||||||
regs[R_EP4] &= ~0x03;
|
regs[R_EP4] &= ~0x03;
|
||||||
|
|
||||||
/* update IF output level & IF notch frequency */
|
/* update IF output level */
|
||||||
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
||||||
|
|
||||||
ret = tda18271_write_regs(fe, R_EP3, 2);
|
ret = tda18271_write_regs(fe, R_EP3, 2);
|
||||||
|
@ -177,6 +177,7 @@ static XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
|
|||||||
{"FM Radio-INPUT1", 0x0208, 0x9002}
|
{"FM Radio-INPUT1", 0x0208, 0x9002}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int xc5000_is_firmware_loaded(struct dvb_frontend *fe);
|
||||||
static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len);
|
static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len);
|
||||||
static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len);
|
static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len);
|
||||||
static void xc5000_TunerReset(struct dvb_frontend *fe);
|
static void xc5000_TunerReset(struct dvb_frontend *fe);
|
||||||
@ -352,7 +353,7 @@ static int xc_SetTVStandard(struct xc5000_priv *priv,
|
|||||||
|
|
||||||
static int xc_shutdown(struct xc5000_priv *priv)
|
static int xc_shutdown(struct xc5000_priv *priv)
|
||||||
{
|
{
|
||||||
return 0;
|
return XC_RESULT_SUCCESS;
|
||||||
/* Fixme: cannot bring tuner back alive once shutdown
|
/* Fixme: cannot bring tuner back alive once shutdown
|
||||||
* without reloading the driver modules.
|
* without reloading the driver modules.
|
||||||
* return xc_write_reg(priv, XREG_POWER_DOWN, 0);
|
* return xc_write_reg(priv, XREG_POWER_DOWN, 0);
|
||||||
@ -685,6 +686,25 @@ static int xc5000_set_params(struct dvb_frontend *fe,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
|
||||||
|
{
|
||||||
|
struct xc5000_priv *priv = fe->tuner_priv;
|
||||||
|
int ret;
|
||||||
|
u16 id;
|
||||||
|
|
||||||
|
ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id);
|
||||||
|
if (ret == XC_RESULT_SUCCESS) {
|
||||||
|
if (id == XC_PRODUCT_ID_FW_NOT_LOADED)
|
||||||
|
ret = XC_RESULT_RESET_FAILURE;
|
||||||
|
else
|
||||||
|
ret = XC_RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintk(1, "%s() returns %s id = 0x%x\n", __func__,
|
||||||
|
ret == XC_RESULT_SUCCESS ? "True" : "False", id);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
|
static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
|
||||||
|
|
||||||
static int xc5000_set_analog_params(struct dvb_frontend *fe,
|
static int xc5000_set_analog_params(struct dvb_frontend *fe,
|
||||||
@ -693,7 +713,7 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe,
|
|||||||
struct xc5000_priv *priv = fe->tuner_priv;
|
struct xc5000_priv *priv = fe->tuner_priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if(priv->fwloaded == 0)
|
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
|
||||||
xc_load_fw_and_init_tuner(fe);
|
xc_load_fw_and_init_tuner(fe);
|
||||||
|
|
||||||
dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
|
dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
|
||||||
@ -808,11 +828,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe)
|
|||||||
struct xc5000_priv *priv = fe->tuner_priv;
|
struct xc5000_priv *priv = fe->tuner_priv;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (priv->fwloaded == 0) {
|
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
|
||||||
ret = xc5000_fwupload(fe);
|
ret = xc5000_fwupload(fe);
|
||||||
if (ret != XC_RESULT_SUCCESS)
|
if (ret != XC_RESULT_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
priv->fwloaded = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start the tuner self-calibration process */
|
/* Start the tuner self-calibration process */
|
||||||
@ -852,7 +871,6 @@ static int xc5000_sleep(struct dvb_frontend *fe)
|
|||||||
return -EREMOTEIO;
|
return -EREMOTEIO;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* priv->fwloaded = 0; */
|
|
||||||
return XC_RESULT_SUCCESS;
|
return XC_RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -933,7 +951,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
|
|||||||
cfg->i2c_address);
|
cfg->i2c_address);
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"xc5000: Firmware has been loaded previously\n");
|
"xc5000: Firmware has been loaded previously\n");
|
||||||
priv->fwloaded = 1;
|
|
||||||
break;
|
break;
|
||||||
case XC_PRODUCT_ID_FW_NOT_LOADED:
|
case XC_PRODUCT_ID_FW_NOT_LOADED:
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
@ -941,7 +958,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
|
|||||||
cfg->i2c_address);
|
cfg->i2c_address);
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"xc5000: Firmware has not been loaded previously\n");
|
"xc5000: Firmware has not been loaded previously\n");
|
||||||
priv->fwloaded = 0;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
|
@ -30,7 +30,6 @@ struct xc5000_priv {
|
|||||||
u32 bandwidth;
|
u32 bandwidth;
|
||||||
u8 video_standard;
|
u8 video_standard;
|
||||||
u8 rf_mode;
|
u8 rf_mode;
|
||||||
u8 fwloaded;
|
|
||||||
|
|
||||||
void *devptr;
|
void *devptr;
|
||||||
};
|
};
|
||||||
|
@ -47,6 +47,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msleep(1); /* avoid I2C errors */
|
||||||
|
|
||||||
return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
|
return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
|
||||||
value, index, rbuf, rlen, 2000);
|
value, index, rbuf, rlen, 2000);
|
||||||
}
|
}
|
||||||
@ -92,16 +94,6 @@ static struct i2c_algorithm gl861_i2c_algo = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Callbacks for DVB USB */
|
/* Callbacks for DVB USB */
|
||||||
static int gl861_identify_state(struct usb_device *udev,
|
|
||||||
struct dvb_usb_device_properties *props,
|
|
||||||
struct dvb_usb_device_description **desc,
|
|
||||||
int *cold)
|
|
||||||
{
|
|
||||||
*cold = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct zl10353_config gl861_zl10353_config = {
|
static struct zl10353_config gl861_zl10353_config = {
|
||||||
.demod_address = 0x0f,
|
.demod_address = 0x0f,
|
||||||
.no_tuner = 1,
|
.no_tuner = 1,
|
||||||
@ -172,7 +164,6 @@ static struct dvb_usb_device_properties gl861_properties = {
|
|||||||
|
|
||||||
.size_of_priv = 0,
|
.size_of_priv = 0,
|
||||||
|
|
||||||
.identify_state = gl861_identify_state,
|
|
||||||
.num_adapters = 1,
|
.num_adapters = 1,
|
||||||
.adapter = {{
|
.adapter = {{
|
||||||
|
|
||||||
@ -194,13 +185,15 @@ static struct dvb_usb_device_properties gl861_properties = {
|
|||||||
|
|
||||||
.num_device_descs = 2,
|
.num_device_descs = 2,
|
||||||
.devices = {
|
.devices = {
|
||||||
{ "MSI Mega Sky 55801 DVB-T USB2.0",
|
{
|
||||||
{ &gl861_table[0], NULL },
|
.name = "MSI Mega Sky 55801 DVB-T USB2.0",
|
||||||
{ NULL },
|
.cold_ids = { NULL },
|
||||||
|
.warm_ids = { &gl861_table[0], NULL },
|
||||||
},
|
},
|
||||||
{ "A-LINK DTU DVB-T USB2.0",
|
{
|
||||||
{ &gl861_table[1], NULL },
|
.name = "A-LINK DTU DVB-T USB2.0",
|
||||||
{ NULL },
|
.cold_ids = { NULL },
|
||||||
|
.warm_ids = { &gl861_table[1], NULL },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -107,7 +107,7 @@ static struct dvb_usb_device_properties umt_properties = {
|
|||||||
/* parameter for the MPEG2-data transfer */
|
/* parameter for the MPEG2-data transfer */
|
||||||
.stream = {
|
.stream = {
|
||||||
.type = USB_BULK,
|
.type = USB_BULK,
|
||||||
.count = 20,
|
.count = MAX_NO_URBS_FOR_DATA_STREAM,
|
||||||
.endpoint = 0x06,
|
.endpoint = 0x06,
|
||||||
.u = {
|
.u = {
|
||||||
.bulk = {
|
.bulk = {
|
||||||
|
@ -463,10 +463,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
|
|||||||
struct dvb_frontend_parameters *p)
|
struct dvb_frontend_parameters *p)
|
||||||
{
|
{
|
||||||
struct au8522_state *state = fe->demodulator_priv;
|
struct au8522_state *state = fe->demodulator_priv;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
dprintk("%s(frequency=%d)\n", __func__, p->frequency);
|
dprintk("%s(frequency=%d)\n", __func__, p->frequency);
|
||||||
|
|
||||||
state->current_frequency = p->frequency;
|
if ((state->current_frequency == p->frequency) &&
|
||||||
|
(state->current_modulation == p->u.vsb.modulation))
|
||||||
|
return 0;
|
||||||
|
|
||||||
au8522_enable_modulation(fe, p->u.vsb.modulation);
|
au8522_enable_modulation(fe, p->u.vsb.modulation);
|
||||||
|
|
||||||
@ -476,11 +479,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
|
|||||||
if (fe->ops.tuner_ops.set_params) {
|
if (fe->ops.tuner_ops.set_params) {
|
||||||
if (fe->ops.i2c_gate_ctrl)
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||||
fe->ops.tuner_ops.set_params(fe, p);
|
ret = fe->ops.tuner_ops.set_params(fe, p);
|
||||||
if (fe->ops.i2c_gate_ctrl)
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
state->current_frequency = p->frequency;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,6 +506,16 @@ static int au8522_init(struct dvb_frontend *fe)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int au8522_sleep(struct dvb_frontend *fe)
|
||||||
|
{
|
||||||
|
struct au8522_state *state = fe->demodulator_priv;
|
||||||
|
dprintk("%s()\n", __func__);
|
||||||
|
|
||||||
|
state->current_frequency = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||||
{
|
{
|
||||||
struct au8522_state *state = fe->demodulator_priv;
|
struct au8522_state *state = fe->demodulator_priv;
|
||||||
@ -509,10 +527,8 @@ static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
|||||||
if (state->current_modulation == VSB_8) {
|
if (state->current_modulation == VSB_8) {
|
||||||
dprintk("%s() Checking VSB_8\n", __func__);
|
dprintk("%s() Checking VSB_8\n", __func__);
|
||||||
reg = au8522_readreg(state, 0x4088);
|
reg = au8522_readreg(state, 0x4088);
|
||||||
if (reg & 0x01)
|
if ((reg & 0x03) == 0x03)
|
||||||
*status |= FE_HAS_VITERBI;
|
*status |= FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI;
|
||||||
if (reg & 0x02)
|
|
||||||
*status |= FE_HAS_LOCK | FE_HAS_SYNC;
|
|
||||||
} else {
|
} else {
|
||||||
dprintk("%s() Checking QAM\n", __func__);
|
dprintk("%s() Checking QAM\n", __func__);
|
||||||
reg = au8522_readreg(state, 0x4541);
|
reg = au8522_readreg(state, 0x4541);
|
||||||
@ -672,6 +688,7 @@ static struct dvb_frontend_ops au8522_ops = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
.init = au8522_init,
|
.init = au8522_init,
|
||||||
|
.sleep = au8522_sleep,
|
||||||
.i2c_gate_ctrl = au8522_i2c_gate_ctrl,
|
.i2c_gate_ctrl = au8522_i2c_gate_ctrl,
|
||||||
.set_frontend = au8522_set_frontend,
|
.set_frontend = au8522_set_frontend,
|
||||||
.get_frontend = au8522_get_frontend,
|
.get_frontend = au8522_get_frontend,
|
||||||
|
@ -63,6 +63,7 @@ struct stv0299_state {
|
|||||||
u32 symbol_rate;
|
u32 symbol_rate;
|
||||||
fe_code_rate_t fec_inner;
|
fe_code_rate_t fec_inner;
|
||||||
int errmode;
|
int errmode;
|
||||||
|
u32 ucblocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STATUS_BER 0
|
#define STATUS_BER 0
|
||||||
@ -501,8 +502,10 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
|
|||||||
{
|
{
|
||||||
struct stv0299_state* state = fe->demodulator_priv;
|
struct stv0299_state* state = fe->demodulator_priv;
|
||||||
|
|
||||||
if (state->errmode != STATUS_BER) return 0;
|
if (state->errmode != STATUS_BER)
|
||||||
*ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
|
return -ENOSYS;
|
||||||
|
|
||||||
|
*ber = stv0299_readreg(state, 0x1e) | (stv0299_readreg(state, 0x1d) << 8);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -540,8 +543,12 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
|||||||
{
|
{
|
||||||
struct stv0299_state* state = fe->demodulator_priv;
|
struct stv0299_state* state = fe->demodulator_priv;
|
||||||
|
|
||||||
if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0;
|
if (state->errmode != STATUS_UCBLOCKS)
|
||||||
else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
|
return -ENOSYS;
|
||||||
|
|
||||||
|
state->ucblocks += stv0299_readreg(state, 0x1e);
|
||||||
|
state->ucblocks += (stv0299_readreg(state, 0x1d) << 8);
|
||||||
|
*ucblocks = state->ucblocks;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -116,9 +116,12 @@ static u8 tda10023_readreg (struct tda10023_state* state, u8 reg)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = i2c_transfer (state->i2c, msg, 2);
|
ret = i2c_transfer (state->i2c, msg, 2);
|
||||||
if (ret != 2)
|
if (ret != 2) {
|
||||||
printk("DVB: TDA10023: %s: readreg error (ret == %i)\n",
|
int num = state->frontend.dvb ? state->frontend.dvb->num : -1;
|
||||||
__func__, ret);
|
printk(KERN_ERR "DVB: TDA10023(%d): %s: readreg error "
|
||||||
|
"(reg == 0x%02x, ret == %i)\n",
|
||||||
|
num, __func__, reg, ret);
|
||||||
|
}
|
||||||
return b1[0];
|
return b1[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,11 +132,12 @@ static int tda10023_writereg (struct tda10023_state* state, u8 reg, u8 data)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = i2c_transfer (state->i2c, &msg, 1);
|
ret = i2c_transfer (state->i2c, &msg, 1);
|
||||||
if (ret != 1)
|
if (ret != 1) {
|
||||||
printk("DVB: TDA10023(%d): %s, writereg error "
|
int num = state->frontend.dvb ? state->frontend.dvb->num : -1;
|
||||||
|
printk(KERN_ERR "DVB: TDA10023(%d): %s, writereg error "
|
||||||
"(reg == 0x%02x, val == 0x%02x, ret == %i)\n",
|
"(reg == 0x%02x, val == 0x%02x, ret == %i)\n",
|
||||||
state->frontend.dvb->num, __func__, reg, data, ret);
|
num, __func__, reg, data, ret);
|
||||||
|
}
|
||||||
return (ret != 1) ? -EREMOTEIO : 0;
|
return (ret != 1) ? -EREMOTEIO : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,7 +468,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* allocate memory for the internal state */
|
/* allocate memory for the internal state */
|
||||||
state = kmalloc(sizeof(struct tda10023_state), GFP_KERNEL);
|
state = kzalloc(sizeof(struct tda10023_state), GFP_KERNEL);
|
||||||
if (state == NULL) goto error;
|
if (state == NULL) goto error;
|
||||||
|
|
||||||
/* setup the state */
|
/* setup the state */
|
||||||
|
@ -1248,11 +1248,14 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
|||||||
struct i2c_adapter* i2c)
|
struct i2c_adapter* i2c)
|
||||||
{
|
{
|
||||||
struct tda1004x_state *state;
|
struct tda1004x_state *state;
|
||||||
|
int id;
|
||||||
|
|
||||||
/* allocate memory for the internal state */
|
/* allocate memory for the internal state */
|
||||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||||
if (!state)
|
if (!state) {
|
||||||
|
printk(KERN_ERR "Can't alocate memory for tda10045 state\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup the state */
|
/* setup the state */
|
||||||
state->config = config;
|
state->config = config;
|
||||||
@ -1260,7 +1263,15 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
|||||||
state->demod_type = TDA1004X_DEMOD_TDA10045;
|
state->demod_type = TDA1004X_DEMOD_TDA10045;
|
||||||
|
|
||||||
/* check if the demod is there */
|
/* check if the demod is there */
|
||||||
if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) {
|
id = tda1004x_read_byte(state, TDA1004X_CHIPID);
|
||||||
|
if (id < 0) {
|
||||||
|
printk(KERN_ERR "tda10045: chip is not answering. Giving up.\n");
|
||||||
|
kfree(state);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != 0x25) {
|
||||||
|
printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id);
|
||||||
kfree(state);
|
kfree(state);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1307,11 +1318,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
|||||||
struct i2c_adapter* i2c)
|
struct i2c_adapter* i2c)
|
||||||
{
|
{
|
||||||
struct tda1004x_state *state;
|
struct tda1004x_state *state;
|
||||||
|
int id;
|
||||||
|
|
||||||
/* allocate memory for the internal state */
|
/* allocate memory for the internal state */
|
||||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||||
if (!state)
|
if (!state) {
|
||||||
|
printk(KERN_ERR "Can't alocate memory for tda10046 state\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup the state */
|
/* setup the state */
|
||||||
state->config = config;
|
state->config = config;
|
||||||
@ -1319,7 +1333,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
|||||||
state->demod_type = TDA1004X_DEMOD_TDA10046;
|
state->demod_type = TDA1004X_DEMOD_TDA10046;
|
||||||
|
|
||||||
/* check if the demod is there */
|
/* check if the demod is there */
|
||||||
if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) {
|
id = tda1004x_read_byte(state, TDA1004X_CHIPID);
|
||||||
|
if (id < 0) {
|
||||||
|
printk(KERN_ERR "tda10046: chip is not answering. Giving up.\n");
|
||||||
|
kfree(state);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (id != 0x46) {
|
||||||
|
printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id);
|
||||||
kfree(state);
|
kfree(state);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,7 @@ config DVB_BUDGET
|
|||||||
config DVB_BUDGET_CI
|
config DVB_BUDGET_CI
|
||||||
tristate "Budget cards with onboard CI connector"
|
tristate "Budget cards with onboard CI connector"
|
||||||
depends on DVB_BUDGET_CORE && I2C
|
depends on DVB_BUDGET_CORE && I2C
|
||||||
|
depends on INPUT # due to IR
|
||||||
select DVB_STV0297 if !DVB_FE_CUSTOMISE
|
select DVB_STV0297 if !DVB_FE_CUSTOMISE
|
||||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||||
select DVB_TDA1004X if !DVB_FE_CUSTOMISE
|
select DVB_TDA1004X if !DVB_FE_CUSTOMISE
|
||||||
|
@ -427,6 +427,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
|
|||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
|
printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
|
||||||
__func__, type);
|
__func__, type);
|
||||||
|
av7110->arm_errors++;
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
msleep(1);
|
msleep(1);
|
||||||
@ -853,10 +854,8 @@ static osd_raw_window_t bpp2bit[8] = {
|
|||||||
|
|
||||||
static inline int WaitUntilBmpLoaded(struct av7110 *av7110)
|
static inline int WaitUntilBmpLoaded(struct av7110 *av7110)
|
||||||
{
|
{
|
||||||
int ret = wait_event_interruptible_timeout(av7110->bmpq,
|
int ret = wait_event_timeout(av7110->bmpq,
|
||||||
av7110->bmp_state != BMP_LOADING, 10*HZ);
|
av7110->bmp_state != BMP_LOADING, 10*HZ);
|
||||||
if (ret == -ERESTARTSYS)
|
|
||||||
return ret;
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n",
|
printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n",
|
||||||
ret, av7110->bmp_state);
|
ret, av7110->bmp_state);
|
||||||
|
@ -793,6 +793,14 @@ menuconfig V4L_USB_DRIVERS
|
|||||||
|
|
||||||
if V4L_USB_DRIVERS && USB
|
if V4L_USB_DRIVERS && USB
|
||||||
|
|
||||||
|
config USB_VIDEO_CLASS
|
||||||
|
tristate "USB Video Class (UVC)"
|
||||||
|
---help---
|
||||||
|
Support for the USB Video Class (UVC). Currently only video
|
||||||
|
input devices, such as webcams, are supported.
|
||||||
|
|
||||||
|
For more information see: <http://linux-uvc.berlios.de/>
|
||||||
|
|
||||||
source "drivers/media/video/pvrusb2/Kconfig"
|
source "drivers/media/video/pvrusb2/Kconfig"
|
||||||
|
|
||||||
source "drivers/media/video/em28xx/Kconfig"
|
source "drivers/media/video/em28xx/Kconfig"
|
||||||
|
@ -136,6 +136,8 @@ obj-$(CONFIG_SOC_CAMERA_MT9V022) += mt9v022.o
|
|||||||
|
|
||||||
obj-$(CONFIG_VIDEO_AU0828) += au0828/
|
obj-$(CONFIG_VIDEO_AU0828) += au0828/
|
||||||
|
|
||||||
|
obj-$(CONFIG_USB_VIDEO_CLASS) += uvc/
|
||||||
|
|
||||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||||
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
|
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
|
||||||
EXTRA_CFLAGS += -Idrivers/media/common/tuners
|
EXTRA_CFLAGS += -Idrivers/media/common/tuners
|
||||||
|
@ -77,8 +77,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data)
|
|||||||
|
|
||||||
/* Make sure we support the board model */
|
/* Make sure we support the board model */
|
||||||
switch (tv.model) {
|
switch (tv.model) {
|
||||||
|
case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */
|
||||||
case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */
|
case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */
|
||||||
|
case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
|
||||||
|
case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
|
||||||
|
case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
|
||||||
|
case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and basic analog video */
|
||||||
case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */
|
case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */
|
||||||
|
case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_WARNING "%s: warning: "
|
printk(KERN_WARNING "%s: warning: "
|
||||||
@ -175,6 +181,18 @@ struct usb_device_id au0828_usb_id_table [] = {
|
|||||||
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 },
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 },
|
||||||
{ USB_DEVICE(0x0fe9, 0xd620),
|
{ USB_DEVICE(0x0fe9, 0xd620),
|
||||||
.driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 },
|
.driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 },
|
||||||
|
{ USB_DEVICE(0x2040, 0x7210),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
|
{ USB_DEVICE(0x2040, 0x7217),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
|
{ USB_DEVICE(0x2040, 0x721b),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
|
{ USB_DEVICE(0x2040, 0x721f),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
|
{ USB_DEVICE(0x2040, 0x7280),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
|
{ USB_DEVICE(0x0fd9, 0x0008),
|
||||||
|
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@ config VIDEO_CX18
|
|||||||
select VIDEO_TVEEPROM
|
select VIDEO_TVEEPROM
|
||||||
select VIDEO_CX2341X
|
select VIDEO_CX2341X
|
||||||
select VIDEO_CS5345
|
select VIDEO_CS5345
|
||||||
select DVB_S5H1409
|
select DVB_S5H1409 if !DVB_FE_CUSTOMISE
|
||||||
select MEDIA_TUNER_MXL5005S
|
select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
|
||||||
---help---
|
---help---
|
||||||
This is a video4linux driver for Conexant cx23418 based
|
This is a video4linux driver for Conexant cx23418 based
|
||||||
PCI combo video recorder devices.
|
PCI combo video recorder devices.
|
||||||
|
@ -69,6 +69,58 @@ int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 and_mask,
|
|||||||
or_value);
|
or_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value, int no_acfg_mask)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
u32 saved_reg[8] = {0};
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_AFE) {
|
||||||
|
saved_reg[0] = cx18_av_read4(cx, CXADEC_CHIP_CTRL);
|
||||||
|
saved_reg[1] = cx18_av_read4(cx, CXADEC_AFE_CTRL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_PLL) {
|
||||||
|
saved_reg[2] = cx18_av_read4(cx, CXADEC_PLL_CTRL1);
|
||||||
|
saved_reg[3] = cx18_av_read4(cx, CXADEC_VID_PLL_FRAC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_VID) {
|
||||||
|
saved_reg[4] = cx18_av_read4(cx, CXADEC_HORIZ_TIM_CTRL);
|
||||||
|
saved_reg[5] = cx18_av_read4(cx, CXADEC_VERT_TIM_CTRL);
|
||||||
|
saved_reg[6] = cx18_av_read4(cx, CXADEC_SRC_COMB_CFG);
|
||||||
|
saved_reg[7] = cx18_av_read4(cx, CXADEC_CHROMA_VBIOFF_CFG);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = cx18_av_write(cx, addr, value);
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_AFE) {
|
||||||
|
cx18_av_write4(cx, CXADEC_CHIP_CTRL, saved_reg[0]);
|
||||||
|
cx18_av_write4(cx, CXADEC_AFE_CTRL, saved_reg[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_PLL) {
|
||||||
|
cx18_av_write4(cx, CXADEC_PLL_CTRL1, saved_reg[2]);
|
||||||
|
cx18_av_write4(cx, CXADEC_VID_PLL_FRAC, saved_reg[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_acfg_mask & CXADEC_NO_ACFG_VID) {
|
||||||
|
cx18_av_write4(cx, CXADEC_HORIZ_TIM_CTRL, saved_reg[4]);
|
||||||
|
cx18_av_write4(cx, CXADEC_VERT_TIM_CTRL, saved_reg[5]);
|
||||||
|
cx18_av_write4(cx, CXADEC_SRC_COMB_CFG, saved_reg[6]);
|
||||||
|
cx18_av_write4(cx, CXADEC_CHROMA_VBIOFF_CFG, saved_reg[7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned and_mask,
|
||||||
|
u8 or_value, int no_acfg_mask)
|
||||||
|
{
|
||||||
|
return cx18_av_write_no_acfg(cx, addr,
|
||||||
|
(cx18_av_read(cx, addr) & and_mask) |
|
||||||
|
or_value, no_acfg_mask);
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
|
static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
|
||||||
@ -170,13 +222,15 @@ static void input_change(struct cx18 *cx)
|
|||||||
|
|
||||||
/* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */
|
/* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */
|
||||||
if (std & V4L2_STD_SECAM)
|
if (std & V4L2_STD_SECAM)
|
||||||
cx18_av_write(cx, 0x402, 0);
|
cx18_av_write_no_acfg(cx, 0x402, 0, CXADEC_NO_ACFG_ALL);
|
||||||
else {
|
else {
|
||||||
cx18_av_write(cx, 0x402, 0x04);
|
cx18_av_write_no_acfg(cx, 0x402, 0x04, CXADEC_NO_ACFG_ALL);
|
||||||
cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11);
|
cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11);
|
||||||
}
|
}
|
||||||
cx18_av_and_or(cx, 0x401, ~0x60, 0);
|
cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0,
|
||||||
cx18_av_and_or(cx, 0x401, ~0x60, 0x60);
|
CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
|
||||||
|
cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0x60,
|
||||||
|
CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
|
||||||
|
|
||||||
if (std & V4L2_STD_525_60) {
|
if (std & V4L2_STD_525_60) {
|
||||||
if (std == V4L2_STD_NTSC_M_JP) {
|
if (std == V4L2_STD_NTSC_M_JP) {
|
||||||
@ -228,7 +282,7 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
|
|||||||
|
|
||||||
if ((vid_input & ~0xff0) ||
|
if ((vid_input & ~0xff0) ||
|
||||||
luma < CX18_AV_SVIDEO_LUMA1 ||
|
luma < CX18_AV_SVIDEO_LUMA1 ||
|
||||||
luma > CX18_AV_SVIDEO_LUMA4 ||
|
luma > CX18_AV_SVIDEO_LUMA8 ||
|
||||||
chroma < CX18_AV_SVIDEO_CHROMA4 ||
|
chroma < CX18_AV_SVIDEO_CHROMA4 ||
|
||||||
chroma > CX18_AV_SVIDEO_CHROMA8) {
|
chroma > CX18_AV_SVIDEO_CHROMA8) {
|
||||||
CX18_ERR("0x%04x is not a valid video input!\n",
|
CX18_ERR("0x%04x is not a valid video input!\n",
|
||||||
@ -262,7 +316,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
|
|||||||
|
|
||||||
cx18_av_write(cx, 0x103, reg);
|
cx18_av_write(cx, 0x103, reg);
|
||||||
/* Set INPUT_MODE to Composite (0) or S-Video (1) */
|
/* Set INPUT_MODE to Composite (0) or S-Video (1) */
|
||||||
cx18_av_and_or(cx, 0x401, ~0x6, is_composite ? 0 : 0x02);
|
cx18_av_and_or_no_acfg(cx, 0x401, ~0x6, is_composite ? 0 : 0x02,
|
||||||
|
CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
|
||||||
/* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
|
/* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
|
||||||
cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
|
cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
|
||||||
/* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */
|
/* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */
|
||||||
@ -318,12 +373,12 @@ static int set_v4lstd(struct cx18 *cx)
|
|||||||
This happens for example with the Yuan MPC622. */
|
This happens for example with the Yuan MPC622. */
|
||||||
if (fmt >= 4 && fmt < 8) {
|
if (fmt >= 4 && fmt < 8) {
|
||||||
/* Set format to NTSC-M */
|
/* Set format to NTSC-M */
|
||||||
cx18_av_and_or(cx, 0x400, ~0xf, 1);
|
cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, 1, CXADEC_NO_ACFG_AFE);
|
||||||
/* Turn off LCOMB */
|
/* Turn off LCOMB */
|
||||||
cx18_av_and_or(cx, 0x47b, ~6, 0);
|
cx18_av_and_or(cx, 0x47b, ~6, 0);
|
||||||
}
|
}
|
||||||
cx18_av_and_or(cx, 0x400, ~0xf, fmt);
|
cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, fmt, CXADEC_NO_ACFG_AFE);
|
||||||
cx18_av_and_or(cx, 0x403, ~0x3, pal_m);
|
cx18_av_and_or_no_acfg(cx, 0x403, ~0x3, pal_m, CXADEC_NO_ACFG_ALL);
|
||||||
cx18_av_vbi_setup(cx);
|
cx18_av_vbi_setup(cx);
|
||||||
input_change(cx);
|
input_change(cx);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -37,12 +37,16 @@ enum cx18_av_video_input {
|
|||||||
CX18_AV_COMPOSITE7,
|
CX18_AV_COMPOSITE7,
|
||||||
CX18_AV_COMPOSITE8,
|
CX18_AV_COMPOSITE8,
|
||||||
|
|
||||||
/* S-Video inputs consist of one luma input (In1-In4) ORed with one
|
/* S-Video inputs consist of one luma input (In1-In8) ORed with one
|
||||||
chroma input (In5-In8) */
|
chroma input (In5-In8) */
|
||||||
CX18_AV_SVIDEO_LUMA1 = 0x10,
|
CX18_AV_SVIDEO_LUMA1 = 0x10,
|
||||||
CX18_AV_SVIDEO_LUMA2 = 0x20,
|
CX18_AV_SVIDEO_LUMA2 = 0x20,
|
||||||
CX18_AV_SVIDEO_LUMA3 = 0x30,
|
CX18_AV_SVIDEO_LUMA3 = 0x30,
|
||||||
CX18_AV_SVIDEO_LUMA4 = 0x40,
|
CX18_AV_SVIDEO_LUMA4 = 0x40,
|
||||||
|
CX18_AV_SVIDEO_LUMA5 = 0x50,
|
||||||
|
CX18_AV_SVIDEO_LUMA6 = 0x60,
|
||||||
|
CX18_AV_SVIDEO_LUMA7 = 0x70,
|
||||||
|
CX18_AV_SVIDEO_LUMA8 = 0x80,
|
||||||
CX18_AV_SVIDEO_CHROMA4 = 0x400,
|
CX18_AV_SVIDEO_CHROMA4 = 0x400,
|
||||||
CX18_AV_SVIDEO_CHROMA5 = 0x500,
|
CX18_AV_SVIDEO_CHROMA5 = 0x500,
|
||||||
CX18_AV_SVIDEO_CHROMA6 = 0x600,
|
CX18_AV_SVIDEO_CHROMA6 = 0x600,
|
||||||
@ -291,14 +295,24 @@ struct cx18_av_state {
|
|||||||
#define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */
|
#define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */
|
||||||
#define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */
|
#define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */
|
||||||
|
|
||||||
|
/* Flags on what to preserve on write to 0x400-0x403 with cx18_av_.*_no_acfg()*/
|
||||||
|
#define CXADEC_NO_ACFG_AFE 0x01 /* Preserve 0x100-0x107 */
|
||||||
|
#define CXADEC_NO_ACFG_PLL 0x02 /* Preserve 0x108-0x10f */
|
||||||
|
#define CXADEC_NO_ACFG_VID 0x04 /* Preserve 0x470-0x47f */
|
||||||
|
#define CXADEC_NO_ACFG_ALL 0x07
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* cx18_av-core.c */
|
/* cx18_av-core.c */
|
||||||
int cx18_av_write(struct cx18 *cx, u16 addr, u8 value);
|
int cx18_av_write(struct cx18 *cx, u16 addr, u8 value);
|
||||||
int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value);
|
int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value);
|
||||||
|
int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value,
|
||||||
|
int no_acfg_mask);
|
||||||
u8 cx18_av_read(struct cx18 *cx, u16 addr);
|
u8 cx18_av_read(struct cx18 *cx, u16 addr);
|
||||||
u32 cx18_av_read4(struct cx18 *cx, u16 addr);
|
u32 cx18_av_read4(struct cx18 *cx, u16 addr);
|
||||||
int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value);
|
int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value);
|
||||||
int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value);
|
int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value);
|
||||||
|
int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned mask, u8 value,
|
||||||
|
int no_acfg_mask);
|
||||||
int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg);
|
int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg);
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user