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
|
||||
# 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
|
||||
#
|
||||
.*
|
||||
@ -18,19 +22,21 @@
|
||||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
#
|
||||
tags
|
||||
TAGS
|
||||
vmlinux*
|
||||
!vmlinux.lds.S
|
||||
!vmlinux.lds.h
|
||||
vmlinux
|
||||
System.map
|
||||
Module.markers
|
||||
Module.symvers
|
||||
!.gitignore
|
||||
!.mailmap
|
||||
|
||||
#
|
||||
# Generated include files
|
||||
|
5
CREDITS
5
CREDITS
@ -2611,8 +2611,9 @@ S: Perth, Western Australia
|
||||
S: Australia
|
||||
|
||||
N: Miguel Ojeda Sandonis
|
||||
E: maxextreme@gmail.com
|
||||
W: http://maxextreme.googlepages.com/
|
||||
E: miguel.ojeda.sandonis@gmail.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: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
||||
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
|
||||
|
||||
5) Time accounting for SMT machines
|
||||
|
||||
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.
|
||||
|
||||
@ -164,4 +166,8 @@ struct taskstats {
|
||||
__u64 nvcsw; /* Context voluntary 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
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ Date: 2006-10-27
|
||||
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
|
||||
* License: GPLv2
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -3,7 +3,7 @@
|
||||
==========================================
|
||||
|
||||
License: GPLv2
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ Date: 2006-10-27
|
||||
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
|
||||
|
||||
You can attach the current shell task by echoing 0:
|
||||
|
||||
# echo 0 > tasks
|
||||
|
||||
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
|
||||
cgroup gets a copy of the parent. Administrators can then remove
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
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)
|
||||
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_list: 0-127
|
||||
Mems_allowed: ffffffff,ffffffff
|
||||
Mems_allowed_list: 0-63
|
||||
|
||||
Each cpuset is represented by a directory in the cgroup file system
|
||||
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] )
|
||||
( 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
|
||||
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
||||
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
|
||||
linux/semaphore.h instead.
|
||||
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
|
||||
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 = {
|
||||
.driver = {
|
||||
.name = "foo",
|
||||
},
|
||||
|
||||
/* iff driver uses driver model ("new style") binding model: */
|
||||
.id_table = foo_ids,
|
||||
.probe = foo_probe,
|
||||
.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
|
||||
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 same; this approach is used in several other busses that don't have
|
||||
device typing support in the hardware. The driver and module name should
|
||||
match, so hotplug/coldplug mechanisms will modprobe the driver.
|
||||
The probe function is called when an entry in the id_table name field
|
||||
matches the device's name. It is passed the entry that was matched so
|
||||
the driver knows which one in the table matched.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
Format: <io>,<irq>,<nodeID>
|
||||
@ -638,7 +638,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
elanfreq= [X86-32]
|
||||
See comment before function elanfreq_setup() in
|
||||
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
||||
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
||||
|
||||
elevator= [IOSCHED]
|
||||
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>[,...]]
|
||||
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
|
||||
|
||||
reservetop= [X86-32]
|
||||
|
@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER
|
||||
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
|
||||
guaranteed if the pool size is less than inet_peer_threshold.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_maxttl - INTEGER
|
||||
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.
|
||||
when the number of entries in the pool is very small).
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_mintime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under high memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_maxtime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under low (or absent) memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
TCP variables:
|
||||
|
||||
@ -794,10 +794,6 @@ tag - INTEGER
|
||||
Allows you to write a number, which can be used as required.
|
||||
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.
|
||||
kuznet@ms2.inr.ac.ru
|
||||
|
||||
|
@ -83,9 +83,9 @@ Valid range: Limited by memory on system
|
||||
Default: 30
|
||||
|
||||
e. intr_type
|
||||
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
||||
Valid range: 1-3
|
||||
Default: 1
|
||||
Specifies interrupt type. Possible values 0(INTA), 2(MSI-X)
|
||||
Valid values: 0, 2
|
||||
Default: 2
|
||||
|
||||
5. Performance suggestions
|
||||
General:
|
||||
|
@ -1,4 +1,4 @@
|
||||
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]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Slabinfo: Tool to get reports about slabs
|
||||
*
|
||||
* (C) 2007 sgi, Christoph Lameter <clameter@sgi.com>
|
||||
* (C) 2007 sgi, Christoph Lameter
|
||||
*
|
||||
* Compile by:
|
||||
*
|
||||
@ -99,7 +99,7 @@ void fatal(const char *x, ...)
|
||||
|
||||
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"
|
||||
"-a|--aliases Show aliases\n"
|
||||
"-A|--activity Most active slabs first\n"
|
||||
|
@ -266,4 +266,4 @@ of other objects.
|
||||
|
||||
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
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
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
|
||||
|
||||
AVR32 ARCHITECTURE
|
||||
@ -1055,16 +1056,18 @@ S: Supported
|
||||
|
||||
CFAG12864B LCD DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
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
|
||||
|
||||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
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
|
||||
|
||||
CFG80211 and NL80211
|
||||
@ -1420,6 +1423,14 @@ M: kristen.c.accardi@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
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
|
||||
P: James R. Van Zandt
|
||||
M: jrv@vanzandt.mv.com
|
||||
@ -1626,13 +1637,13 @@ S: Maintained
|
||||
|
||||
EXT3 FILE SYSTEM
|
||||
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
|
||||
S: Maintained
|
||||
|
||||
EXT4 FILE SYSTEM
|
||||
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
|
||||
S: Maintained
|
||||
|
||||
@ -2428,9 +2439,10 @@ S: Maintained
|
||||
|
||||
KS0108 LCD CONTROLLER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
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
|
||||
|
||||
LAPB module
|
||||
@ -2474,9 +2486,11 @@ M: James.Bottomley@HansenPartnership.com
|
||||
W: http://www.hansenpartnership.com/voyager
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC
|
||||
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||
P: Paul Mackerras
|
||||
M: paulus@samba.org
|
||||
P: Benjamin Herrenschmidt
|
||||
M: benh@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
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
|
||||
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
|
||||
P: Vitaly Bordug
|
||||
M: vitb@kernel.crashing.org
|
||||
@ -2551,17 +2558,6 @@ P: Arnaldo Carvalho de Melo
|
||||
M: acme@ghostprotocols.net
|
||||
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
|
||||
P: Chris Wright
|
||||
M: chrisw@sous-sol.org
|
||||
@ -2680,8 +2676,8 @@ S: Supported
|
||||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||
P: Michael Kerrisk
|
||||
M: mtk.manpages@gmail.com
|
||||
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
|
||||
S: Maintained
|
||||
W: http://www.kernel.org/doc/man-pages
|
||||
S: Supported
|
||||
|
||||
MARVELL LIBERTAS WIRELESS DRIVER
|
||||
P: Dan Williams
|
||||
@ -2814,6 +2810,12 @@ W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
||||
W: http://0pointer.de/lennart/tchibo.html
|
||||
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
|
||||
P: Pierre Ossman
|
||||
M: drzeus-mmc@drzeus.cx
|
||||
@ -3195,8 +3197,8 @@ L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
PER-TASK DELAY ACCOUNTING
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -3688,7 +3690,7 @@ S: Maintained
|
||||
|
||||
SLAB ALLOCATOR
|
||||
P: Christoph Lameter
|
||||
M: clameter@sgi.com
|
||||
M: cl@linux-foundation.org
|
||||
P: Pekka Enberg
|
||||
M: penberg@cs.helsinki.fi
|
||||
P: Matt Mackall
|
||||
@ -3898,8 +3900,8 @@ M: hch@infradead.org
|
||||
S: Maintained
|
||||
|
||||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -3995,7 +3997,8 @@ W: http://www.buzzard.org.uk/toshiba/
|
||||
S: Maintained
|
||||
|
||||
TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
P: Debora Velarde
|
||||
P: Rajiv Andrade
|
||||
M: tpmdd-devel@lists.sourceforge.net
|
||||
W: http://tpmdd.sourceforge.net
|
||||
P: Marcel Selhorst
|
||||
@ -4314,6 +4317,14 @@ L: netdev@vger.kernel.org
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
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
|
||||
P: Luca Risolia
|
||||
M: luca.risolia@studio.unibo.it
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION = -rc8
|
||||
EXTRAVERSION = -rc9
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -25,6 +25,13 @@ SECTIONS
|
||||
} :kernel
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Exception table */
|
||||
. = ALIGN(16);
|
||||
__ex_table : {
|
||||
@ -33,13 +40,6 @@ SECTIONS
|
||||
__stop___ex_table = .;
|
||||
}
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
/* Init code and data */
|
||||
|
@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg);
|
||||
EXPORT_SYMBOL(dma_unmap_sg);
|
||||
EXPORT_SYMBOL(dma_sync_single_for_cpu);
|
||||
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_unregister_dev);
|
||||
|
||||
|
@ -42,7 +42,7 @@
|
||||
#define GPMC_STATUS 0x54
|
||||
#define GPMC_PREFETCH_CONFIG1 0x1e0
|
||||
#define GPMC_PREFETCH_CONFIG2 0x1e4
|
||||
#define GPMC_PREFETCH_CONTROL 0x1e8
|
||||
#define GPMC_PREFETCH_CONTROL 0x1ec
|
||||
#define GPMC_PREFETCH_STATUS 0x1f0
|
||||
#define GPMC_ECC_CONFIG 0x1f4
|
||||
#define GPMC_ECC_CONTROL 0x1f8
|
||||
|
@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(boot_lock);
|
||||
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
{
|
||||
trace_hardirqs_off();
|
||||
|
||||
/*
|
||||
* the primary core may have used a "cross call" soft interrupt
|
||||
* 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. */
|
||||
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)
|
||||
|
@ -254,7 +254,8 @@ close_cplbtab(struct cplb_tab *table)
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
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) {
|
||||
fill_cplbtab(t,
|
||||
|
@ -60,9 +60,14 @@ static struct irq_chip bad_chip = {
|
||||
};
|
||||
|
||||
static struct irq_desc bad_irq_desc = {
|
||||
.status = IRQ_DISABLED,
|
||||
.chip = &bad_chip,
|
||||
.handle_irq = handle_bad_irq,
|
||||
.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)
|
||||
|
@ -547,7 +547,8 @@ setup_arch (char **cmdline_p)
|
||||
# ifdef CONFIG_ACPI_NUMA
|
||||
acpi_numa_init();
|
||||
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
|
||||
#else
|
||||
# ifdef CONFIG_SMP
|
||||
|
@ -117,6 +117,7 @@ void account_system_vtime(struct task_struct *tsk)
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(account_system_vtime);
|
||||
|
||||
/*
|
||||
* Called from the timer interrupt handler to charge accumulated user time
|
||||
|
@ -1006,7 +1006,7 @@ config BOOT_ELF32
|
||||
config MIPS_L1_CACHE_SHIFT
|
||||
int
|
||||
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 "5"
|
||||
|
||||
|
@ -161,6 +161,9 @@ void __init txx9_tmr_init(unsigned long baseaddr)
|
||||
struct txx9_tmr_reg __iomem *tmrptr;
|
||||
|
||||
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(0, &tmrptr->tisr);
|
||||
__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);
|
||||
|
||||
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);
|
||||
|
||||
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
||||
|
@ -10,8 +10,11 @@
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
|
||||
EXPORT_SYMBOL(change_bit);
|
||||
EXPORT_SYMBOL(test_and_change_bit);
|
||||
|
||||
@ -31,7 +34,9 @@ extern u64 __ashrdi3(u64, unsigned);
|
||||
extern u64 __ashldi3(u64, unsigned);
|
||||
extern u64 __lshrdi3(u64, unsigned);
|
||||
extern s64 __negdi2(s64);
|
||||
extern int __ucmpdi2(u64, u64);
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
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,
|
||||
NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
|
||||
/*
|
||||
* 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 += 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-y := $(patsubst zImage%, zImage.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))
|
||||
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)
|
||||
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 (of_get_property(np, "used-by-rtas", NULL) != NULL)
|
||||
return -1;
|
||||
|
@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes;
|
||||
static struct mpc52xx_xlb __iomem *xlb;
|
||||
static struct mpc52xx_gpio __iomem *gps;
|
||||
static struct mpc52xx_gpio_wkup __iomem *gpw;
|
||||
static void __iomem *pci;
|
||||
static void __iomem *sram;
|
||||
static const int sram_size = 0x4000; /* 16 kBytes */
|
||||
static void __iomem *mbar;
|
||||
@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void)
|
||||
{ .type = "builtin", .compatible = "mpc5200", }, /* efika */
|
||||
{}
|
||||
};
|
||||
u64 regaddr64 = 0;
|
||||
const u32 *regaddr_p;
|
||||
|
||||
/* deep sleep? let mpc52xx code handle that */
|
||||
if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
|
||||
@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void)
|
||||
|
||||
/* map registers */
|
||||
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);
|
||||
|
||||
mbar = ioremap((u32) regaddr64, 0xC000);
|
||||
if (!mbar) {
|
||||
printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
|
||||
return -ENOSYS;
|
||||
@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void)
|
||||
pic = mbar + 0x500;
|
||||
gps = mbar + 0xb00;
|
||||
gpw = mbar + 0xc00;
|
||||
pci = mbar + 0xd00;
|
||||
bes = mbar + 0x1200;
|
||||
xlb = mbar + 0x1f00;
|
||||
sram = mbar + 0x8000;
|
||||
@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes;
|
||||
static struct mpc52xx_xlb sxlb;
|
||||
static struct mpc52xx_gpio sgps;
|
||||
static struct mpc52xx_gpio_wkup sgpw;
|
||||
static char spci[0x200];
|
||||
|
||||
static void lite5200_save_regs(void)
|
||||
{
|
||||
@ -94,6 +103,7 @@ static void lite5200_save_regs(void)
|
||||
_memcpy_fromio(&sxlb, xlb, sizeof(*xlb));
|
||||
_memcpy_fromio(&sgps, gps, sizeof(*gps));
|
||||
_memcpy_fromio(&sgpw, gpw, sizeof(*gpw));
|
||||
_memcpy_fromio(spci, pci, 0x200);
|
||||
|
||||
_memcpy_fromio(saved_sram, sram, sram_size);
|
||||
}
|
||||
@ -103,6 +113,8 @@ static void lite5200_restore_regs(void)
|
||||
int i;
|
||||
_memcpy_toio(sram, saved_sram, sram_size);
|
||||
|
||||
/* PCI Configuration */
|
||||
_memcpy_toio(pci, spci, 0x200);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
|
||||
config NODES_SHIFT
|
||||
int "Max num nodes shift(1-15)"
|
||||
range 1 15 if X86_64
|
||||
int "Max num nodes shift(1-9)"
|
||||
range 1 9 if X86_64
|
||||
default "6" if X86_64
|
||||
default "4" if X86_NUMAQ
|
||||
default "3"
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <asm/msr-index.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/processor-flags.h>
|
||||
|
||||
.code16
|
||||
.section ".header", "a"
|
||||
@ -24,6 +25,11 @@ pmode_gdt: .quad 0
|
||||
realmode_flags: .long 0
|
||||
real_magic: .long 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
|
||||
|
||||
.text
|
||||
@ -34,11 +40,34 @@ _start:
|
||||
cli
|
||||
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 */
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
lidtl wakeup_idt
|
||||
|
||||
movl $wakeup_stack_end, %esp
|
||||
|
||||
@ -98,7 +127,14 @@ bogus_real_magic:
|
||||
jmp 1b
|
||||
|
||||
.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
|
||||
HEAP:
|
||||
.long wakeup_heap
|
||||
|
@ -24,6 +24,11 @@ struct wakeup_header {
|
||||
u32 realmode_flags;
|
||||
u32 real_magic;
|
||||
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 */
|
||||
} __attribute__((__packed__));
|
||||
|
||||
|
@ -50,6 +50,20 @@ int acpi_save_state_mem(void)
|
||||
|
||||
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
|
||||
store_gdt((struct desc_ptr *)&header->pmode_gdt);
|
||||
|
||||
@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void)
|
||||
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);
|
||||
|
||||
/*
|
||||
* If I don't have PSE, I should just duplicate two entries in page
|
||||
* directory. If I have PSE, I just need to duplicate one entry in
|
||||
* If I don't have PAE, I should just duplicate two entries in page
|
||||
* directory. If I have PAE, I just need to duplicate one entry in
|
||||
* page directory.
|
||||
*/
|
||||
cr4 = read_cr4();
|
||||
|
||||
if (cr4 & X86_CR4_PSE) {
|
||||
if (cr4 & X86_CR4_PAE) {
|
||||
efi_bak_pg_dir_pointer[0].pgd =
|
||||
swapper_pg_dir[pgd_index(0)].pgd;
|
||||
swapper_pg_dir[0].pgd =
|
||||
@ -93,7 +93,7 @@ void efi_call_phys_epilog(void)
|
||||
|
||||
cr4 = read_cr4();
|
||||
|
||||
if (cr4 & X86_CR4_PSE) {
|
||||
if (cr4 & X86_CR4_PAE) {
|
||||
swapper_pg_dir[pgd_index(0)].pgd =
|
||||
efi_bak_pg_dir_pointer[0].pgd;
|
||||
} else {
|
||||
|
@ -128,7 +128,7 @@ ident_complete:
|
||||
/* Fixup phys_base */
|
||||
addq %rbp, phys_base(%rip)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#ifdef CONFIG_X86_TRAMPOLINE
|
||||
addq %rbp, trampoline_level4_pgt + 0(%rip)
|
||||
addq %rbp, trampoline_level4_pgt + (511*8)(%rip)
|
||||
#endif
|
||||
|
@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
|
||||
int ret;
|
||||
|
||||
if (!cpu_has_fxsr)
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
|
||||
ret = init_fpu(target);
|
||||
if (ret)
|
||||
@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
|
||||
int ret;
|
||||
|
||||
if (!cpu_has_fxsr)
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
|
||||
ret = init_fpu(target);
|
||||
if (ret)
|
||||
|
@ -996,7 +996,6 @@ do_rest:
|
||||
#endif
|
||||
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_possible_map);
|
||||
cpu_clear(cpu, cpu_present_map);
|
||||
per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ static __init void *spp_getpage(void)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void
|
||||
static __init void
|
||||
set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
@ -214,7 +214,7 @@ void __init cleanup_highmap(void)
|
||||
}
|
||||
|
||||
/* 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);
|
||||
|
||||
@ -526,7 +526,8 @@ static void __init early_memtest(unsigned long start, unsigned long end)
|
||||
t_size = end - t_start;
|
||||
|
||||
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);
|
||||
|
||||
|
@ -185,7 +185,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
|
||||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||
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;
|
||||
@ -196,7 +196,7 @@ static pteval_t pte_pfn_to_mfn(pteval_t val)
|
||||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||
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;
|
||||
|
@ -831,6 +831,8 @@ static void as_completed_request(struct request_queue *q, struct request *rq)
|
||||
}
|
||||
|
||||
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);
|
||||
ad->changed_batch = 0;
|
||||
|
||||
|
@ -377,6 +377,9 @@ static int __init bay_init(void)
|
||||
|
||||
INIT_LIST_HEAD(&drive_bays);
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
/* look for dockable drive bays */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_bay, &bays, NULL);
|
||||
|
@ -917,6 +917,9 @@ static int __init dock_init(void)
|
||||
|
||||
dock_station = NULL;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
/* look for a dock station */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_dock, &num, NULL);
|
||||
|
@ -333,6 +333,9 @@ static int __init acpi_rtc_init(void)
|
||||
{
|
||||
struct device *dev = get_rtc_dev();
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
if (dev) {
|
||||
rtc_wake_setup();
|
||||
rtc_info.wake_on = rtc_wake_on;
|
||||
|
@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
||||
if (!acpi_wakeup_address) {
|
||||
return -EFAULT;
|
||||
}
|
||||
acpi_set_firmware_waking_vector((acpi_physical_address)
|
||||
virt_to_phys((void *)
|
||||
acpi_wakeup_address));
|
||||
acpi_set_firmware_waking_vector(
|
||||
(acpi_physical_address)acpi_wakeup_address);
|
||||
|
||||
}
|
||||
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);
|
||||
if (acpi_gbl_FADT.month_alarm)
|
||||
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);
|
||||
}
|
||||
/* enable the rtc alarm interrupt */
|
||||
rtc_control |= RTC_AIE;
|
||||
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;
|
||||
unsigned int i, handled = 0;
|
||||
void __iomem *mmio;
|
||||
u32 irq_stat, irq_ack = 0;
|
||||
u32 irq_stat, irq_masked;
|
||||
|
||||
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 */
|
||||
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
||||
irq_stat &= hpriv->port_map;
|
||||
if (!irq_stat)
|
||||
return IRQ_NONE;
|
||||
|
||||
irq_masked = irq_stat & hpriv->port_map;
|
||||
|
||||
spin_lock(&host->lock);
|
||||
|
||||
for (i = 0; i < host->n_ports; i++) {
|
||||
struct ata_port *ap;
|
||||
|
||||
if (!(irq_stat & (1 << i)))
|
||||
if (!(irq_masked & (1 << i)))
|
||||
continue;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
irq_ack |= (1 << i);
|
||||
}
|
||||
|
||||
if (irq_ack) {
|
||||
writel(irq_ack, mmio + HOST_IRQ_STAT);
|
||||
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);
|
||||
|
||||
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,
|
||||
u8 status, int in_wq)
|
||||
{
|
||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||
unsigned long flags = 0;
|
||||
int poll_next;
|
||||
|
||||
@ -1125,9 +1126,12 @@ fsm_start:
|
||||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this */
|
||||
ata_ehi_push_desc(ehi,
|
||||
"ST_FIRST: !(DRQ|ERR|DF)");
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
@ -1146,9 +1150,9 @@ fsm_start:
|
||||
* the CDB.
|
||||
*/
|
||||
if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
|
||||
ata_port_printk(ap, KERN_WARNING,
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X\n", status);
|
||||
ata_ehi_push_desc(ehi, "ST_FIRST: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
@ -1205,9 +1209,9 @@ fsm_start:
|
||||
* let the EH abort the command or reset the device.
|
||||
*/
|
||||
if (unlikely(status & (ATA_ERR | ATA_DF))) {
|
||||
ata_port_printk(ap, KERN_WARNING, "DRQ=1 with "
|
||||
"device error, dev_stat 0x%X\n",
|
||||
status);
|
||||
ata_ehi_push_desc(ehi, "ST-ATAPI: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
@ -1226,13 +1230,17 @@ fsm_start:
|
||||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this.
|
||||
* Phantom devices also trigger this
|
||||
* 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 |
|
||||
AC_ERR_NODEV_HINT;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
@ -1257,8 +1265,12 @@ fsm_start:
|
||||
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;
|
||||
}
|
||||
|
||||
/* ata_pio_sectors() might change the
|
||||
* 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.
|
||||
* 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;
|
||||
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
||||
": 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(CMD, 0x3132), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
|
||||
{ PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
|
||||
|
||||
|
@ -83,6 +83,7 @@ static struct ata_port_operations uli_ops = {
|
||||
.inherits = &ata_bmdma_port_ops,
|
||||
.scr_read = uli_scr_read,
|
||||
.scr_write = uli_scr_write,
|
||||
.hardreset = ATA_OP_NULL,
|
||||
};
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* License: GPLv2
|
||||
* Depends: ks0108
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* 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_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");
|
||||
|
@ -5,7 +5,7 @@
|
||||
* License: GPLv2
|
||||
* Depends: cfag12864b
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* 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_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");
|
||||
|
@ -5,7 +5,7 @@
|
||||
* License: GPLv2
|
||||
* Depends: parport
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* 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_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");
|
||||
|
||||
|
@ -84,8 +84,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
|
||||
nid, K(i.totalram),
|
||||
nid, K(i.freeram),
|
||||
nid, K(i.totalram - i.freeram),
|
||||
nid, node_page_state(nid, NR_ACTIVE),
|
||||
nid, node_page_state(nid, NR_INACTIVE),
|
||||
nid, K(node_page_state(nid, NR_ACTIVE)),
|
||||
nid, K(node_page_state(nid, NR_INACTIVE)),
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
nid, K(i.totalhigh),
|
||||
nid, K(i.freehigh),
|
||||
|
@ -106,35 +106,34 @@ MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
|
||||
/* board_id = Subsystem Device ID & Vendor ID
|
||||
* product = Marketing Name for the board
|
||||
* access = Address of the struct of function pointers
|
||||
* nr_cmds = Number of commands supported by controller
|
||||
*/
|
||||
static struct board_type products[] = {
|
||||
{0x40700E11, "Smart Array 5300", &SA5_access, 512},
|
||||
{0x40800E11, "Smart Array 5i", &SA5B_access, 512},
|
||||
{0x40820E11, "Smart Array 532", &SA5B_access, 512},
|
||||
{0x40830E11, "Smart Array 5312", &SA5B_access, 512},
|
||||
{0x409A0E11, "Smart Array 641", &SA5_access, 512},
|
||||
{0x409B0E11, "Smart Array 642", &SA5_access, 512},
|
||||
{0x409C0E11, "Smart Array 6400", &SA5_access, 512},
|
||||
{0x409D0E11, "Smart Array 6400 EM", &SA5_access, 512},
|
||||
{0x40910E11, "Smart Array 6i", &SA5_access, 512},
|
||||
{0x3225103C, "Smart Array P600", &SA5_access, 512},
|
||||
{0x3223103C, "Smart Array P800", &SA5_access, 512},
|
||||
{0x3234103C, "Smart Array P400", &SA5_access, 512},
|
||||
{0x3235103C, "Smart Array P400i", &SA5_access, 512},
|
||||
{0x3211103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3212103C, "Smart Array E200", &SA5_access, 120},
|
||||
{0x3213103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3214103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3215103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3237103C, "Smart Array E500", &SA5_access, 512},
|
||||
{0x323D103C, "Smart Array P700m", &SA5_access, 512},
|
||||
{0x3241103C, "Smart Array P212", &SA5_access, 384},
|
||||
{0x3243103C, "Smart Array P410", &SA5_access, 384},
|
||||
{0x3245103C, "Smart Array P410i", &SA5_access, 384},
|
||||
{0x3247103C, "Smart Array P411", &SA5_access, 384},
|
||||
{0x3249103C, "Smart Array P812", &SA5_access, 384},
|
||||
{0xFFFF103C, "Unknown Smart Array", &SA5_access, 120},
|
||||
{0x40700E11, "Smart Array 5300", &SA5_access},
|
||||
{0x40800E11, "Smart Array 5i", &SA5B_access},
|
||||
{0x40820E11, "Smart Array 532", &SA5B_access},
|
||||
{0x40830E11, "Smart Array 5312", &SA5B_access},
|
||||
{0x409A0E11, "Smart Array 641", &SA5_access},
|
||||
{0x409B0E11, "Smart Array 642", &SA5_access},
|
||||
{0x409C0E11, "Smart Array 6400", &SA5_access},
|
||||
{0x409D0E11, "Smart Array 6400 EM", &SA5_access},
|
||||
{0x40910E11, "Smart Array 6i", &SA5_access},
|
||||
{0x3225103C, "Smart Array P600", &SA5_access},
|
||||
{0x3223103C, "Smart Array P800", &SA5_access},
|
||||
{0x3234103C, "Smart Array P400", &SA5_access},
|
||||
{0x3235103C, "Smart Array P400i", &SA5_access},
|
||||
{0x3211103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3212103C, "Smart Array E200", &SA5_access},
|
||||
{0x3213103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3214103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3215103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3237103C, "Smart Array E500", &SA5_access},
|
||||
{0x323D103C, "Smart Array P700m", &SA5_access},
|
||||
{0x3241103C, "Smart Array P212", &SA5_access},
|
||||
{0x3243103C, "Smart Array P410", &SA5_access},
|
||||
{0x3245103C, "Smart Array P410i", &SA5_access},
|
||||
{0x3247103C, "Smart Array P411", &SA5_access},
|
||||
{0x3249103C, "Smart Array P812", &SA5_access},
|
||||
{0xFFFF103C, "Unknown Smart Array", &SA5_access},
|
||||
};
|
||||
|
||||
/* 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);
|
||||
#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++) {
|
||||
if (board_id == products[i].board_id) {
|
||||
c->product_name = products[i].product_name;
|
||||
c->access = *(products[i].access);
|
||||
c->nr_cmds = products[i].nr_cmds;
|
||||
c->nr_cmds = c->max_commands - 4;
|
||||
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) {
|
||||
c->product_name = products[i-1].product_name;
|
||||
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 "
|
||||
"Smart Array controller.\n"
|
||||
"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++)
|
||||
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;
|
||||
|
||||
clean4:
|
||||
|
@ -62,11 +62,11 @@ static void i915_vblank_tasklet(struct drm_device *dev)
|
||||
u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
|
||||
RING_LOCALS;
|
||||
|
||||
if (sarea_priv->front_tiled) {
|
||||
if (IS_I965G(dev) && sarea_priv->front_tiled) {
|
||||
cmd |= XY_SRC_COPY_BLT_DST_TILED;
|
||||
dst_pitch >>= 2;
|
||||
}
|
||||
if (sarea_priv->back_tiled) {
|
||||
if (IS_I965G(dev) && sarea_priv->back_tiled) {
|
||||
cmd |= XY_SRC_COPY_BLT_SRC_TILED;
|
||||
src_pitch >>= 2;
|
||||
}
|
||||
|
@ -3322,7 +3322,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
|
||||
msleep_interruptible(duration);
|
||||
tty->ops->break_ctl(tty, 0);
|
||||
tty_write_unlock(tty);
|
||||
if (!signal_pending(current))
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return 0;
|
||||
}
|
||||
|
@ -27,6 +27,8 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/connector.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <net/sock.h>
|
||||
|
||||
@ -403,6 +405,40 @@ static void cn_callback(void *data)
|
||||
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)
|
||||
{
|
||||
struct cn_dev *dev = &cdev;
|
||||
@ -434,6 +470,8 @@ static int __devinit cn_init(void)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -443,6 +481,8 @@ static void __devexit cn_fini(void)
|
||||
|
||||
cn_already_initialized = 0;
|
||||
|
||||
proc_net_remove(&init_net, "connector");
|
||||
|
||||
cn_del_callback(&dev->id);
|
||||
cn_queue_free_dev(dev->cbdev);
|
||||
netlink_kernel_release(dev->nls);
|
||||
|
@ -1051,7 +1051,8 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory,
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
@ -28,12 +28,18 @@ config DEBUG_GPIO
|
||||
comment "I2C GPIO expanders:"
|
||||
|
||||
config GPIO_PCA953X
|
||||
tristate "PCA953x I/O ports"
|
||||
tristate "PCA953x, PCA955x, and MAX7310 I/O ports"
|
||||
depends on I2C
|
||||
help
|
||||
Say yes here to support the PCA9534 (8-bit), PCA9535 (16-bit),
|
||||
PCA9536 (4-bit), PCA9537 (4-bit), PCA9538 (8-bit), and PCA9539
|
||||
(16-bit) I/O ports. These parts are made by NXP and TI.
|
||||
Say yes here to provide access to several register-oriented
|
||||
SMBus I/O expanders, made mostly by NXP or TI. Compatible
|
||||
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
|
||||
will be called pca953x.
|
||||
|
@ -33,7 +33,7 @@ static const struct i2c_device_id pca953x_id[] = {
|
||||
{ "pca9554", 8, },
|
||||
{ "pca9555", 16, },
|
||||
{ "pca9557", 8, },
|
||||
/* REVISIT several pca955x parts should work here too */
|
||||
{ "max7310", 8, },
|
||||
{ }
|
||||
};
|
||||
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 R52"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61"),
|
||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"),
|
||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"),
|
||||
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_INVERT("LENOVO", "ThinkPad Z61m"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p"),
|
||||
{ .ident = NULL }
|
||||
};
|
||||
|
||||
|
@ -290,12 +290,12 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
||||
* bus, or started a new i2c message
|
||||
*/
|
||||
|
||||
if (iicstat & S3C2410_IICSTAT_LASTBIT &&
|
||||
if (iicstat & S3C2410_IICSTAT_LASTBIT &&
|
||||
!(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
|
||||
/* ack was not received... */
|
||||
|
||||
dev_dbg(i2c->dev, "ack was not received\n");
|
||||
s3c24xx_i2c_stop(i2c, -EREMOTEIO);
|
||||
s3c24xx_i2c_stop(i2c, -ENXIO);
|
||||
goto out_ack;
|
||||
}
|
||||
|
||||
@ -305,7 +305,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
||||
i2c->state = STATE_WRITE;
|
||||
|
||||
/* 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) {
|
||||
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
|
||||
*/
|
||||
|
||||
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:
|
||||
|
||||
if (!is_msgend(i2c)) {
|
||||
byte = i2c->msg->buf[i2c->msg_ptr++];
|
||||
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
|
||||
*/
|
||||
|
||||
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);
|
||||
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_LICENSE("GPL");
|
||||
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
|
||||
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
|
||||
tristate "H8300 IDE support"
|
||||
depends on H8300
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.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
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
get_device(&hwif->gendev);
|
||||
|
||||
hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
|
||||
MKDEV(0, 0), hwif, hwif->name);
|
||||
if (IS_ERR(hwif->portdev)) {
|
||||
|
@ -76,7 +76,7 @@ static int proc_ide_read_mate
|
||||
ide_hwif_t *hwif = (ide_hwif_t *) data;
|
||||
int len;
|
||||
|
||||
if (hwif && hwif->mate && hwif->mate->present)
|
||||
if (hwif && hwif->mate)
|
||||
len = sprintf(page, "%s\n", hwif->mate->name);
|
||||
else
|
||||
len = sprintf(page, "(none)\n");
|
||||
|
@ -315,13 +315,14 @@ void ide_unregister(ide_hwif_t *hwif)
|
||||
|
||||
BUG_ON(in_interrupt());
|
||||
BUG_ON(irqs_disabled());
|
||||
mutex_lock(&ide_cfg_mtx);
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (!hwif->present)
|
||||
goto abort;
|
||||
__ide_port_unregister_devices(hwif);
|
||||
hwif->present = 0;
|
||||
|
||||
mutex_lock(&ide_cfg_mtx);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (hwif->present) {
|
||||
__ide_port_unregister_devices(hwif);
|
||||
hwif->present = 0;
|
||||
}
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
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);
|
||||
kfree(hwif->sg_table);
|
||||
unregister_blkdev(hwif->major, hwif->name);
|
||||
spin_lock_irq(&ide_lock);
|
||||
|
||||
if (hwif->dma_base)
|
||||
ide_release_dma_engine(hwif);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
/* restore hwif data to pristine status */
|
||||
ide_init_port_data(hwif, hwif->index);
|
||||
|
||||
abort:
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
mutex_unlock(&ide_cfg_mtx);
|
||||
}
|
||||
|
||||
@ -1094,13 +1094,6 @@ struct bus_type 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;
|
||||
EXPORT_SYMBOL_GPL(ide_vlb_clk);
|
||||
|
||||
@ -1305,7 +1298,6 @@ static int __init ide_init(void)
|
||||
ret = PTR_ERR(ide_port_class);
|
||||
goto out_port_class;
|
||||
}
|
||||
ide_port_class->dev_release = ide_port_class_release;
|
||||
|
||||
init_ide_data();
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/*
|
||||
* 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)
|
||||
goto out;
|
||||
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->effects[id] = *effect;
|
||||
ff->effect_owners[id] = file;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ff->mutex);
|
||||
@ -189,15 +192,21 @@ static int erase_effect(struct input_dev *dev, int effect_id,
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->playback(dev, effect_id, 0);
|
||||
ff->effect_owners[effect_id] = NULL;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
if (ff->erase) {
|
||||
error = ff->erase(dev, effect_id);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
if (error) {
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->effect_owners[effect_id] = file;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
ff->effect_owners[effect_id] = NULL;
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -263,8 +272,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
|
||||
if (type != EV_FF)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&ff->mutex);
|
||||
|
||||
switch (code) {
|
||||
case FF_GAIN:
|
||||
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;
|
||||
}
|
||||
|
||||
mutex_unlock(&ff->mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(input_ff_event);
|
||||
|
@ -432,6 +432,7 @@ static int crypt_convert(struct crypt_config *cc,
|
||||
case 0:
|
||||
atomic_dec(&ctx->pending);
|
||||
ctx->sector++;
|
||||
cond_resched();
|
||||
continue;
|
||||
|
||||
/* error */
|
||||
|
@ -2201,3 +2201,41 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
|
||||
[0x25] = KEY_POWER, /* power */
|
||||
};
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int 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,
|
||||
struct tda18271_std_map_item *map,
|
||||
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] |= (map->agc_mode << 3) | map->std;
|
||||
|
||||
/* set rfagc to high speed mode */
|
||||
regs[R_EP3] &= ~0x04;
|
||||
if (priv->id == TDA18271HDC2) {
|
||||
/* set rfagc to high speed mode */
|
||||
regs[R_EP3] &= ~0x04;
|
||||
}
|
||||
|
||||
/* set cal mode to normal */
|
||||
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] |= (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 */
|
||||
regs[R_EP4] &= ~0x80;
|
||||
regs[R_EP4] |= map->fm_rfn << 7;
|
||||
@ -95,6 +103,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||
/* disable Power Level Indicator */
|
||||
regs[R_EP1] |= 0x40;
|
||||
|
||||
/* make sure thermometer is off */
|
||||
regs[R_TM] &= ~0x10;
|
||||
|
||||
/* frequency dependent parameters */
|
||||
|
||||
tda18271_calc_ir_measure(fe, &freq);
|
||||
@ -135,6 +146,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||
switch (priv->role) {
|
||||
case TDA18271_MASTER:
|
||||
tda18271_calc_main_pll(fe, N);
|
||||
tda18271_set_if_notch(fe);
|
||||
tda18271_write_regs(fe, R_MPD, 4);
|
||||
break;
|
||||
case TDA18271_SLAVE:
|
||||
@ -142,6 +154,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||
tda18271_write_regs(fe, R_CPD, 4);
|
||||
|
||||
regs[R_MPD] = regs[R_CPD] & 0x7f;
|
||||
tda18271_set_if_notch(fe);
|
||||
tda18271_write_regs(fe, R_MPD, 1);
|
||||
break;
|
||||
}
|
||||
@ -160,12 +173,14 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||
|
||||
msleep(20);
|
||||
|
||||
/* set rfagc to normal speed mode */
|
||||
if (map->fm_rfn)
|
||||
regs[R_EP3] &= ~0x04;
|
||||
else
|
||||
regs[R_EP3] |= 0x04;
|
||||
ret = tda18271_write_regs(fe, R_EP3, 1);
|
||||
if (priv->id == TDA18271HDC2) {
|
||||
/* set rfagc to normal speed mode */
|
||||
if (map->fm_rfn)
|
||||
regs[R_EP3] &= ~0x04;
|
||||
else
|
||||
regs[R_EP3] |= 0x04;
|
||||
ret = tda18271_write_regs(fe, R_EP3, 1);
|
||||
}
|
||||
fail:
|
||||
return ret;
|
||||
}
|
||||
@ -507,7 +522,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe)
|
||||
/* set cal mode to normal */
|
||||
regs[R_EP4] &= ~0x03;
|
||||
|
||||
/* update IF output level & IF notch frequency */
|
||||
/* update IF output level */
|
||||
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
||||
|
||||
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}
|
||||
};
|
||||
|
||||
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_readregs(struct xc5000_priv *priv, u8 *buf, u8 len);
|
||||
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)
|
||||
{
|
||||
return 0;
|
||||
return XC_RESULT_SUCCESS;
|
||||
/* Fixme: cannot bring tuner back alive once shutdown
|
||||
* without reloading the driver modules.
|
||||
* return xc_write_reg(priv, XREG_POWER_DOWN, 0);
|
||||
@ -685,6 +686,25 @@ static int xc5000_set_params(struct dvb_frontend *fe,
|
||||
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 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;
|
||||
int ret;
|
||||
|
||||
if(priv->fwloaded == 0)
|
||||
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
|
||||
xc_load_fw_and_init_tuner(fe);
|
||||
|
||||
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;
|
||||
int ret = 0;
|
||||
|
||||
if (priv->fwloaded == 0) {
|
||||
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
|
||||
ret = xc5000_fwupload(fe);
|
||||
if (ret != XC_RESULT_SUCCESS)
|
||||
return ret;
|
||||
priv->fwloaded = 1;
|
||||
}
|
||||
|
||||
/* Start the tuner self-calibration process */
|
||||
@ -852,7 +871,6 @@ static int xc5000_sleep(struct dvb_frontend *fe)
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
else {
|
||||
/* priv->fwloaded = 0; */
|
||||
return XC_RESULT_SUCCESS;
|
||||
}
|
||||
}
|
||||
@ -933,7 +951,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
|
||||
cfg->i2c_address);
|
||||
printk(KERN_INFO
|
||||
"xc5000: Firmware has been loaded previously\n");
|
||||
priv->fwloaded = 1;
|
||||
break;
|
||||
case XC_PRODUCT_ID_FW_NOT_LOADED:
|
||||
printk(KERN_INFO
|
||||
@ -941,7 +958,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
|
||||
cfg->i2c_address);
|
||||
printk(KERN_INFO
|
||||
"xc5000: Firmware has not been loaded previously\n");
|
||||
priv->fwloaded = 0;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
|
@ -30,7 +30,6 @@ struct xc5000_priv {
|
||||
u32 bandwidth;
|
||||
u8 video_standard;
|
||||
u8 rf_mode;
|
||||
u8 fwloaded;
|
||||
|
||||
void *devptr;
|
||||
};
|
||||
|
@ -47,6 +47,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
msleep(1); /* avoid I2C errors */
|
||||
|
||||
return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
|
||||
value, index, rbuf, rlen, 2000);
|
||||
}
|
||||
@ -92,16 +94,6 @@ static struct i2c_algorithm gl861_i2c_algo = {
|
||||
};
|
||||
|
||||
/* 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 = {
|
||||
.demod_address = 0x0f,
|
||||
.no_tuner = 1,
|
||||
@ -172,7 +164,6 @@ static struct dvb_usb_device_properties gl861_properties = {
|
||||
|
||||
.size_of_priv = 0,
|
||||
|
||||
.identify_state = gl861_identify_state,
|
||||
.num_adapters = 1,
|
||||
.adapter = {{
|
||||
|
||||
@ -194,13 +185,15 @@ static struct dvb_usb_device_properties gl861_properties = {
|
||||
|
||||
.num_device_descs = 2,
|
||||
.devices = {
|
||||
{ "MSI Mega Sky 55801 DVB-T USB2.0",
|
||||
{ &gl861_table[0], NULL },
|
||||
{ NULL },
|
||||
{
|
||||
.name = "MSI Mega Sky 55801 DVB-T USB2.0",
|
||||
.cold_ids = { NULL },
|
||||
.warm_ids = { &gl861_table[0], NULL },
|
||||
},
|
||||
{ "A-LINK DTU DVB-T USB2.0",
|
||||
{ &gl861_table[1], NULL },
|
||||
{ NULL },
|
||||
{
|
||||
.name = "A-LINK DTU DVB-T USB2.0",
|
||||
.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 */
|
||||
.stream = {
|
||||
.type = USB_BULK,
|
||||
.count = 20,
|
||||
.count = MAX_NO_URBS_FOR_DATA_STREAM,
|
||||
.endpoint = 0x06,
|
||||
.u = {
|
||||
.bulk = {
|
||||
|
@ -463,10 +463,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *p)
|
||||
{
|
||||
struct au8522_state *state = fe->demodulator_priv;
|
||||
int ret = -EINVAL;
|
||||
|
||||
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);
|
||||
|
||||
@ -476,11 +479,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
|
||||
if (fe->ops.tuner_ops.set_params) {
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
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)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
state->current_frequency = p->frequency;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -498,6 +506,16 @@ static int au8522_init(struct dvb_frontend *fe)
|
||||
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)
|
||||
{
|
||||
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) {
|
||||
dprintk("%s() Checking VSB_8\n", __func__);
|
||||
reg = au8522_readreg(state, 0x4088);
|
||||
if (reg & 0x01)
|
||||
*status |= FE_HAS_VITERBI;
|
||||
if (reg & 0x02)
|
||||
*status |= FE_HAS_LOCK | FE_HAS_SYNC;
|
||||
if ((reg & 0x03) == 0x03)
|
||||
*status |= FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI;
|
||||
} else {
|
||||
dprintk("%s() Checking QAM\n", __func__);
|
||||
reg = au8522_readreg(state, 0x4541);
|
||||
@ -672,6 +688,7 @@ static struct dvb_frontend_ops au8522_ops = {
|
||||
},
|
||||
|
||||
.init = au8522_init,
|
||||
.sleep = au8522_sleep,
|
||||
.i2c_gate_ctrl = au8522_i2c_gate_ctrl,
|
||||
.set_frontend = au8522_set_frontend,
|
||||
.get_frontend = au8522_get_frontend,
|
||||
|
@ -63,6 +63,7 @@ struct stv0299_state {
|
||||
u32 symbol_rate;
|
||||
fe_code_rate_t fec_inner;
|
||||
int errmode;
|
||||
u32 ucblocks;
|
||||
};
|
||||
|
||||
#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;
|
||||
|
||||
if (state->errmode != STATUS_BER) return 0;
|
||||
*ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
|
||||
if (state->errmode != STATUS_BER)
|
||||
return -ENOSYS;
|
||||
|
||||
*ber = stv0299_readreg(state, 0x1e) | (stv0299_readreg(state, 0x1d) << 8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -540,8 +543,12 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
||||
{
|
||||
struct stv0299_state* state = fe->demodulator_priv;
|
||||
|
||||
if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0;
|
||||
else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
|
||||
if (state->errmode != STATUS_UCBLOCKS)
|
||||
return -ENOSYS;
|
||||
|
||||
state->ucblocks += stv0299_readreg(state, 0x1e);
|
||||
state->ucblocks += (stv0299_readreg(state, 0x1d) << 8);
|
||||
*ucblocks = state->ucblocks;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -116,9 +116,12 @@ static u8 tda10023_readreg (struct tda10023_state* state, u8 reg)
|
||||
int ret;
|
||||
|
||||
ret = i2c_transfer (state->i2c, msg, 2);
|
||||
if (ret != 2)
|
||||
printk("DVB: TDA10023: %s: readreg error (ret == %i)\n",
|
||||
__func__, ret);
|
||||
if (ret != 2) {
|
||||
int num = state->frontend.dvb ? state->frontend.dvb->num : -1;
|
||||
printk(KERN_ERR "DVB: TDA10023(%d): %s: readreg error "
|
||||
"(reg == 0x%02x, ret == %i)\n",
|
||||
num, __func__, reg, ret);
|
||||
}
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
@ -129,11 +132,12 @@ static int tda10023_writereg (struct tda10023_state* state, u8 reg, u8 data)
|
||||
int ret;
|
||||
|
||||
ret = i2c_transfer (state->i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
printk("DVB: TDA10023(%d): %s, writereg error "
|
||||
if (ret != 1) {
|
||||
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",
|
||||
state->frontend.dvb->num, __func__, reg, data, ret);
|
||||
|
||||
num, __func__, reg, data, ret);
|
||||
}
|
||||
return (ret != 1) ? -EREMOTEIO : 0;
|
||||
}
|
||||
|
||||
@ -464,7 +468,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config,
|
||||
int i;
|
||||
|
||||
/* 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;
|
||||
|
||||
/* setup the state */
|
||||
|
@ -1248,11 +1248,14 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
||||
struct i2c_adapter* i2c)
|
||||
{
|
||||
struct tda1004x_state *state;
|
||||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
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;
|
||||
}
|
||||
|
||||
/* setup the state */
|
||||
state->config = config;
|
||||
@ -1260,7 +1263,15 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
||||
state->demod_type = TDA1004X_DEMOD_TDA10045;
|
||||
|
||||
/* 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);
|
||||
return NULL;
|
||||
}
|
||||
@ -1307,11 +1318,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
||||
struct i2c_adapter* i2c)
|
||||
{
|
||||
struct tda1004x_state *state;
|
||||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
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;
|
||||
}
|
||||
|
||||
/* setup the state */
|
||||
state->config = config;
|
||||
@ -1319,7 +1333,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
||||
state->demod_type = TDA1004X_DEMOD_TDA10046;
|
||||
|
||||
/* 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);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -101,6 +101,7 @@ config DVB_BUDGET
|
||||
config DVB_BUDGET_CI
|
||||
tristate "Budget cards with onboard CI connector"
|
||||
depends on DVB_BUDGET_CORE && I2C
|
||||
depends on INPUT # due to IR
|
||||
select DVB_STV0297 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0299 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) {
|
||||
printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
|
||||
__func__, type);
|
||||
av7110->arm_errors++;
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(1);
|
||||
@ -853,10 +854,8 @@ static osd_raw_window_t bpp2bit[8] = {
|
||||
|
||||
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);
|
||||
if (ret == -ERESTARTSYS)
|
||||
return ret;
|
||||
if (ret == 0) {
|
||||
printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n",
|
||||
ret, av7110->bmp_state);
|
||||
|
@ -793,6 +793,14 @@ menuconfig V4L_USB_DRIVERS
|
||||
|
||||
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/em28xx/Kconfig"
|
||||
|
@ -136,6 +136,8 @@ obj-$(CONFIG_SOC_CAMERA_MT9V022) += mt9v022.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_AU0828) += au0828/
|
||||
|
||||
obj-$(CONFIG_USB_VIDEO_CLASS) += uvc/
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
|
||||
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 */
|
||||
switch (tv.model) {
|
||||
case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */
|
||||
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 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "%s: warning: "
|
||||
@ -175,6 +181,18 @@ struct usb_device_id au0828_usb_id_table [] = {
|
||||
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 },
|
||||
{ USB_DEVICE(0x0fe9, 0xd620),
|
||||
.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_CX2341X
|
||||
select VIDEO_CS5345
|
||||
select DVB_S5H1409
|
||||
select MEDIA_TUNER_MXL5005S
|
||||
select DVB_S5H1409 if !DVB_FE_CUSTOMISE
|
||||
select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
|
||||
---help---
|
||||
This is a video4linux driver for Conexant cx23418 based
|
||||
PCI combo video recorder devices.
|
||||
|
@ -69,6 +69,58 @@ int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 and_mask,
|
||||
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,
|
||||
@ -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 */
|
||||
if (std & V4L2_STD_SECAM)
|
||||
cx18_av_write(cx, 0x402, 0);
|
||||
cx18_av_write_no_acfg(cx, 0x402, 0, CXADEC_NO_ACFG_ALL);
|
||||
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_and_or(cx, 0x401, ~0x60, 0);
|
||||
cx18_av_and_or(cx, 0x401, ~0x60, 0x60);
|
||||
cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0,
|
||||
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_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) ||
|
||||
luma < CX18_AV_SVIDEO_LUMA1 ||
|
||||
luma > CX18_AV_SVIDEO_LUMA4 ||
|
||||
luma > CX18_AV_SVIDEO_LUMA8 ||
|
||||
chroma < CX18_AV_SVIDEO_CHROMA4 ||
|
||||
chroma > CX18_AV_SVIDEO_CHROMA8) {
|
||||
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);
|
||||
/* 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 */
|
||||
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 */
|
||||
@ -318,12 +373,12 @@ static int set_v4lstd(struct cx18 *cx)
|
||||
This happens for example with the Yuan MPC622. */
|
||||
if (fmt >= 4 && fmt < 8) {
|
||||
/* 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 */
|
||||
cx18_av_and_or(cx, 0x47b, ~6, 0);
|
||||
}
|
||||
cx18_av_and_or(cx, 0x400, ~0xf, fmt);
|
||||
cx18_av_and_or(cx, 0x403, ~0x3, pal_m);
|
||||
cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, fmt, CXADEC_NO_ACFG_AFE);
|
||||
cx18_av_and_or_no_acfg(cx, 0x403, ~0x3, pal_m, CXADEC_NO_ACFG_ALL);
|
||||
cx18_av_vbi_setup(cx);
|
||||
input_change(cx);
|
||||
return 0;
|
||||
|
@ -37,12 +37,16 @@ enum cx18_av_video_input {
|
||||
CX18_AV_COMPOSITE7,
|
||||
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) */
|
||||
CX18_AV_SVIDEO_LUMA1 = 0x10,
|
||||
CX18_AV_SVIDEO_LUMA2 = 0x20,
|
||||
CX18_AV_SVIDEO_LUMA3 = 0x30,
|
||||
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_CHROMA5 = 0x500,
|
||||
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_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 */
|
||||
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_write_no_acfg(struct cx18 *cx, u16 addr, u8 value,
|
||||
int no_acfg_mask);
|
||||
u8 cx18_av_read(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_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);
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user