Merge ../linux-2.6

This commit is contained in:
Paul Mackerras 2005-11-10 11:06:04 +11:00
commit 31e7f1ff3c
737 changed files with 40128 additions and 17996 deletions

View File

@ -25,7 +25,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/timer.h> #include <linux/timer.h>
#include "connector.h" #include <linux/connector.h>
static struct cb_id cn_test_id = { 0x123, 0x456 }; static struct cb_id cn_test_id = { 0x123, 0x456 };
static char cn_test_name[] = "cn_test"; static char cn_test_name[] = "cn_test";
@ -104,7 +104,7 @@ static int cn_test_want_notify(void)
req->first = cn_test_id.val + 20; req->first = cn_test_id.val + 20;
req->range = 10; req->range = 10;
NETLINK_CB(skb).dst_groups = ctl->group; NETLINK_CB(skb).dst_group = ctl->group;
//netlink_broadcast(nls, skb, 0, ctl->group, GFP_ATOMIC); //netlink_broadcast(nls, skb, 0, ctl->group, GFP_ATOMIC);
netlink_unicast(nls, skb, 0, 0); netlink_unicast(nls, skb, 0, 0);

View File

@ -1,5 +1,5 @@
How to get the Nebula, PCTV and Twinhan DST cards working How to get the Nebula, PCTV, FusionHDTV Lite and Twinhan DST cards working
========================================================= ==========================================================================
This class of cards has a bt878a as the PCI interface, and This class of cards has a bt878a as the PCI interface, and
require the bttv driver. require the bttv driver.
@ -26,27 +26,31 @@ Furthermore you need to enable
In general you need to load the bttv driver, which will handle the gpio and In general you need to load the bttv driver, which will handle the gpio and
i2c communication for us, plus the common dvb-bt8xx device driver. i2c communication for us, plus the common dvb-bt8xx device driver.
The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110) and The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110), TwinHan (dst),
TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver. FusionHDTV DVB-T Lite (mt352) and FusionHDTV5 Lite (lgdt330x) are loaded
automatically by the dvb-bt8xx device driver.
3a) Nebula / Pinnacle PCTV 3a) Nebula / Pinnacle PCTV / FusionHDTV Lite
-------------------------- ---------------------------------------------
$ modprobe bttv (normally bttv is being loaded automatically by kmod) $ modprobe bttv (normally bttv is being loaded automatically by kmod)
$ modprobe dvb-bt8xx (or just place dvb-bt8xx in /etc/modules for automatic loading) $ modprobe dvb-bt8xx
(or just place dvb-bt8xx in /etc/modules for automatic loading)
3b) TwinHan and Clones 3b) TwinHan and Clones
-------------------------- --------------------------
$ modprobe bttv i2c_hw=1 card=0x71 $ modprobe bttv card=0x71
$ modprobe dvb-bt8xx $ modprobe dvb-bt8xx
$ modprobe dst $ modprobe dst
The value 0x71 will override the PCI type detection for dvb-bt8xx, The value 0x71 will override the PCI type detection for dvb-bt8xx,
which is necessary for TwinHan cards. which is necessary for TwinHan cards. Omission of this parameter might result
in a system lockup.
If you're having an older card (blue color circuit) and card=0x71 locks If you're having an older card (blue color PCB) and card=0x71 locks up
your machine, try using 0x68, too. If that does not work, ask on the your machine, try using 0x68, too. If that does not work, ask on the
mailing list. mailing list.
@ -64,11 +68,47 @@ verbose=0 means complete disabling of messages
dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card. dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card.
0x20 means it has a Conditional Access slot. 0x20 means it has a Conditional Access slot.
The autodected values are determined bythe cards 'response The autodetected values are determined by the cards 'response string'
string' which you can see in your logs e.g. which you can see in your logs e.g.
dst_get_device_id: Recognise [DSTMCI] dst_get_device_id: Recognise [DSTMCI]
If you need to sent in bug reports on the dst, please do send in a complete
log with the verbose=4 module parameter. For general usage, the default setting
of verbose=1 is ideal.
4) Multiple cards
--------------------------
If you happen to be running multiple cards, it would be advisable to load
the bttv module with the card id. This would help to solve any module loading
problems that you might face.
For example, if you have a Twinhan and Clones card along with a FusionHDTV5 Lite
$ modprobe bttv card=0x71 card=0x87
Here the order of the card id is important and should be the same as that of the
physical order of the cards. Here card=0x71 represents the Twinhan and clones
and card=0x87 represents Fusion HDTV5 Lite. These arguments can also be
specified in decimal, rather than hex:
$ modprobe bttv card=113 card=135
Some examples of card-id's
Pinnacle Sat 0x5e (94)
Nebula Digi TV 0x68 (104)
PC HDTV 0x70 (112)
Twinhan 0x71 (113)
FusionHDTV DVB-T Lite 0x80 (128)
FusionHDTV5 Lite 0x87 (135)
For a full list of card-id's, see the V4L Documentation within the kernel
source: linux/Documentation/video4linux/CARDLIST.bttv
If you have problems with this please do ask on the mailing list.
-- --
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham

View File

@ -41,6 +41,12 @@ o Frontends drivers:
- dib3000mb : DiBcom 3000-MB demodulator - dib3000mb : DiBcom 3000-MB demodulator
DVB-S/C/T: DVB-S/C/T:
- dst : TwinHan DST Frontend - dst : TwinHan DST Frontend
ATSC:
- nxt200x : Nxtwave NXT2002 & NXT2004
- or51211 : or51211 based (pcHDTV HD2000 card)
- or51132 : or51132 based (pcHDTV HD3000 card)
- bcm3510 : Broadcom BCM3510
- lgdt330x : LG Electronics DT3302 & DT3303
o Cards based on the Phillips saa7146 multimedia PCI bridge chip: o Cards based on the Phillips saa7146 multimedia PCI bridge chip:
@ -62,6 +68,10 @@ o Cards based on the Conexant Bt8xx PCI bridge:
- Nebula Electronics DigiTV - Nebula Electronics DigiTV
- TwinHan DST - TwinHan DST
- Avermedia DVB-T - Avermedia DVB-T
- ChainTech digitop DST-1000 DVB-S
- pcHDTV HD-2000 TV
- DViCO FusionHDTV DVB-T Lite
- DViCO FusionHDTV5 Lite
o Technotrend / Hauppauge DVB USB devices: o Technotrend / Hauppauge DVB USB devices:
- Nova USB - Nova USB
@ -83,3 +93,30 @@ o DiBcom DVB-T USB based devices:
- DiBcom USB2.0 DVB-T reference device (non-public) - DiBcom USB2.0 DVB-T reference device (non-public)
o Experimental support for the analog module of the Siemens DVB-C PCI card o Experimental support for the analog module of the Siemens DVB-C PCI card
o Cards based on the Conexant cx2388x PCI bridge:
- ADS Tech Instant TV DVB-T PCI
- ATI HDTV Wonder
- digitalnow DNTV Live! DVB-T
- DViCO FusionHDTV DVB-T1
- DViCO FusionHDTV DVB-T Plus
- DViCO FusionHDTV3 Gold-Q
- DViCO FusionHDTV3 Gold-T
- DViCO FusionHDTV5 Gold
- Hauppauge Nova-T DVB-T
- KWorld/VStream XPert DVB-T
- pcHDTV HD3000 HDTV
- TerraTec Cinergy 1400 DVB-T
- WinFast DTV1000-T
o Cards based on the Phillips saa7134 PCI bridge:
- Medion 7134
- Pinnacle PCTV 300i DVB-T + PAL
- LifeView FlyDVB-T DUO
- Typhoon DVB-T Duo Digital/Analog Cardbus
- Philips TOUGH DVB-T reference design
- Philips EUROPA V3 reference design
- Compro Videomate DVB-T300
- Compro Videomate DVB-T200
- AVerMedia AVerTVHD MCE A180

View File

@ -75,5 +75,22 @@ Ernst Peinlich <e.peinlich@inode.at>
Peter Beutner <p.beutner@gmx.net> Peter Beutner <p.beutner@gmx.net>
for the IR code for the ttusb-dec driver for the IR code for the ttusb-dec driver
Wilson Michaels <wilsonmichaels@earthlink.net>
for the lgdt330x frontend driver, and various bugfixes
Michael Krufky <mkrufky@m1k.net>
for maintaining v4l/dvb inter-tree dependencies
Taylor Jacob <rtjacob@earthlink.net>
for the nxt2002 frontend driver
Jean-Francois Thibert <jeanfrancois@sagetv.com>
for the nxt2004 frontend driver
Kirk Lapray <kirk.lapray@gmail.com>
for the or51211 and or51132 frontend drivers, and
for merging the nxt2002 and nxt2004 modules into a
single nxt200x frontend driver.
(If you think you should be in this list, but you are not, drop a (If you think you should be in this list, but you are not, drop a
line to the DVB mailing list) line to the DVB mailing list)

View File

@ -22,7 +22,7 @@ use File::Temp qw/ tempdir /;
use IO::Handle; use IO::Handle;
@components = ( "sp8870", "sp887x", "tda10045", "tda10046", "av7110", "dec2000t", @components = ( "sp8870", "sp887x", "tda10045", "tda10046", "av7110", "dec2000t",
"dec2540t", "dec3000s", "vp7041", "dibusb", "nxt2002", "dec2540t", "dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
"or51211", "or51132_qam", "or51132_vsb"); "or51211", "or51132_qam", "or51132_vsb");
# Check args # Check args
@ -252,6 +252,23 @@ sub nxt2002 {
$outfile; $outfile;
} }
sub nxt2004 {
my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip";
my $url = "http://www.aver.com/support/Drivers/$sourcefile";
my $hash = "111cb885b1e009188346d72acfed024c";
my $outfile = "dvb-fe-nxt2004.fw";
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
checkstandard();
wgetfile($sourcefile, $url);
unzip($sourcefile, $tmpdir);
verify("$tmpdir/3xHybrid.sys", $hash);
extract("$tmpdir/3xHybrid.sys", 465304, 9584, $outfile);
$outfile;
}
sub or51211 { sub or51211 {
my $fwfile = "dvb-fe-or51211.fw"; my $fwfile = "dvb-fe-or51211.fw";
my $url = "http://linuxtv.org/downloads/firmware/$fwfile"; my $url = "http://linuxtv.org/downloads/firmware/$fwfile";

152
Documentation/fb/fbcon.txt Normal file
View File

@ -0,0 +1,152 @@
The Framebuffer Console
=======================
The framebuffer console (fbcon), as its name implies, is a text
console running on top of the framebuffer device. It has the functionality of
any standard text console driver, such as the VGA console, with the added
features that can be attributed to the graphical nature of the framebuffer.
In the x86 architecture, the framebuffer console is optional, and
some even treat it as a toy. For other architectures, it is the only available
display device, text or graphical.
What are the features of fbcon? The framebuffer console supports
high resolutions, varying font types, display rotation, primitive multihead,
etc. Theoretically, multi-colored fonts, blending, aliasing, and any feature
made available by the underlying graphics card are also possible.
A. Configuration
The framebuffer console can be enabled by using your favorite kernel
configuration tool. It is under Device Drivers->Graphics Support->Support for
framebuffer devices->Framebuffer Console Support. Select 'y' to compile
support statically, or 'm' for module support. The module will be fbcon.
In order for fbcon to activate, at least one framebuffer driver is
required, so choose from any of the numerous drivers available. For x86
systems, they almost universally have VGA cards, so vga16fb and vesafb will
always be available. However, using a chipset-specific driver will give you
more speed and features, such as the ability to change the video mode
dynamically.
To display the penguin logo, choose any logo available in Logo
Configuration->Boot up logo.
Also, you will need to select at least one compiled-in fonts, but if
you don't do anything, the kernel configuration tool will select one for you,
usually an 8x16 font.
GOTCHA: A common bug report is enabling the framebuffer without enabling the
framebuffer console. Depending on the driver, you may get a blanked or
garbled display, but the system still boots to completion. If you are
fortunate to have a driver that does not alter the graphics chip, then you
will still get a VGA console.
B. Loading
Possible scenarios:
1. Driver and fbcon are compiled statically
Usually, fbcon will automatically take over your console. The notable
exception is vesafb. It needs to be explicitly activated with the
vga= boot option parameter.
2. Driver is compiled statically, fbcon is compiled as a module
Depending on the driver, you either get a standard console, or a
garbled display, as mentioned above. To get a framebuffer console,
do a 'modprobe fbcon'.
3. Driver is compiled as a module, fbcon is compiled statically
You get your standard console. Once the driver is loaded with
'modprobe xxxfb', fbcon automatically takes over the console with
the possible exception of using the fbcon=map:n option. See below.
4. Driver and fbcon are compiled as a module.
You can load them in any order. Once both are loaded, fbcon will take
over the console.
C. Boot options
The framebuffer console has several, largely unknown, boot options
that can change its behavior.
1. fbcon=font:<name>
Select the initial font to use. The value 'name' can be any of the
compiled-in fonts: VGA8x16, 7x14, 10x18, VGA8x8, MINI4x6, RomanLarge,
SUN8x16, SUN12x22, ProFont6x11, Acorn8x8, PEARL8x8.
Note, not all drivers can handle font with widths not divisible by 8,
such as vga16fb.
2. fbcon=scrollback:<value>[k]
The scrollback buffer is memory that is used to preserve display
contents that has already scrolled past your view. This is accessed
by using the Shift-PageUp key combination. The value 'value' is any
integer. It defaults to 32KB. The 'k' suffix is optional, and will
multiply the 'value' by 1024.
3. fbcon=map:<0123>
This is an interesting option. It tells which driver gets mapped to
which console. The value '0123' is a sequence that gets repeated until
the total length is 64 which is the number of consoles available. In
the above example, it is expanded to 012301230123... and the mapping
will be:
tty | 1 2 3 4 5 6 7 8 9 ...
fb | 0 1 2 3 0 1 2 3 0 ...
('cat /proc/fb' should tell you what the fb numbers are)
One side effect that may be useful is using a map value that exceeds
the number of loaded fb drivers. For example, if only one driver is
available, fb0, adding fbcon=map:1 tells fbcon not to take over the
console.
Later on, when you want to map the console the to the framebuffer
device, you can use the con2fbmap utility.
4. fbcon=vc:<n1>-<n2>
This option tells fbcon to take over only a range of consoles as
specified by the values 'n1' and 'n2'. The rest of the consoles
outside the given range will still be controlled by the standard
console driver.
NOTE: For x86 machines, the standard console is the VGA console which
is typically located on the same video card. Thus, the consoles that
are controlled by the VGA console will be garbled.
4. fbcon=rotate:<n>
This option changes the orientation angle of the console display. The
value 'n' accepts the following:
0 - normal orientation (0 degree)
1 - clockwise orientation (90 degrees)
2 - upside down orientation (180 degrees)
3 - counterclockwise orientation (270 degrees)
The angle can be changed anytime afterwards by 'echoing' the same
numbers to any one of the 2 attributes found in
/sys/class/graphics/fb{x}
con_rotate - rotate the display of the active console
con_rotate_all - rotate the display of all consoles
Console rotation will only become available if Console Rotation
Support is compiled in your kernel.
NOTE: This is purely console rotation. Any other applications that
use the framebuffer will remain at their 'normal'orientation.
Actually, the underlying fb driver is totally ignorant of console
rotation.
---
Antonino Daplas <adaplas@pol.net>

View File

@ -25,6 +25,13 @@ Who: Adrian Bunk <bunk@stusta.de>
--------------------------- ---------------------------
What: drivers depending on OBSOLETE_OSS_DRIVER
When: January 2006
Why: OSS drivers with ALSA replacements
Who: Adrian Bunk <bunk@stusta.de>
---------------------------
What: RCU API moves to EXPORT_SYMBOL_GPL What: RCU API moves to EXPORT_SYMBOL_GPL
When: April 2006 When: April 2006
Files: include/linux/rcupdate.h, kernel/rcupdate.c Files: include/linux/rcupdate.h, kernel/rcupdate.c
@ -60,6 +67,21 @@ Who: Jody McIntyre <scjody@steamballoon.com>
--------------------------- ---------------------------
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
When: July 2006
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
series. The old API have lots of drawbacks and don't provide enough
means to work with all video and audio standards. The newer API is
already available on the main drivers and should be used instead.
Newer drivers should use v4l_compat_translate_ioctl function to handle
old calls, replacing to newer ones.
Decoder iocts are using internally to allow video drivers to
communicate with video decoders. This should also be improved to allow
V4L2 calls being translated into compatible internal ioctls.
Who: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
---------------------------
What: i2c sysfs name change: in1_ref, vid deprecated in favour of cpu0_vid What: i2c sysfs name change: in1_ref, vid deprecated in favour of cpu0_vid
When: November 2005 When: November 2005
Files: drivers/i2c/chips/adm1025.c, drivers/i2c/chips/adm1026.c Files: drivers/i2c/chips/adm1025.c, drivers/i2c/chips/adm1026.c
@ -111,3 +133,10 @@ Why: This interface has been obsoleted by the new layer3-independent
to link against API-compatible library on top of libnfnetlink_queue to link against API-compatible library on top of libnfnetlink_queue
instead of the current 'libipq'. instead of the current 'libipq'.
Who: Harald Welte <laforge@netfilter.org> Who: Harald Welte <laforge@netfilter.org>
---------------------------
What: EXPORT_SYMBOL(lookup_hash)
When: January 2006
Why: Too low-level interface. Use lookup_one_len or lookup_create instead.
Who: Christoph Hellwig <hch@lst.de>

View File

@ -17,8 +17,6 @@ set using tune2fs(8). Kernel-determined defaults are indicated by (*).
bsddf (*) Makes `df' act like BSD. bsddf (*) Makes `df' act like BSD.
minixdf Makes `df' act like Minix. minixdf Makes `df' act like Minix.
check Check block and inode bitmaps at mount time
(requires CONFIG_EXT2_CHECK).
check=none, nocheck (*) Don't do extra checking of bitmaps on mount check=none, nocheck (*) Don't do extra checking of bitmaps on mount
(check=normal and check=strict options removed) (check=normal and check=strict options removed)

View File

@ -7,12 +7,10 @@ Supported adapters:
* VIA Technologies, Inc. VT82C686A/B * VIA Technologies, Inc. VT82C686A/B
Datasheet: Sometimes available at the VIA website Datasheet: Sometimes available at the VIA website
* VIA Technologies, Inc. VT8231, VT8233, VT8233A, VT8235, VT8237 * VIA Technologies, Inc. VT8231, VT8233, VT8233A, VT8235, VT8237R
Datasheet: available on request from Via Datasheet: available on request from VIA
Authors: Authors:
Frodo Looijaard <frodol@dds.nl>,
Philip Edelbrock <phil@netroedge.com>,
Kyösti Mälkki <kmalkki@cc.hut.fi>, Kyösti Mälkki <kmalkki@cc.hut.fi>,
Mark D. Studebaker <mdsxyz123@yahoo.com>, Mark D. Studebaker <mdsxyz123@yahoo.com>,
Jean Delvare <khali@linux-fr.org> Jean Delvare <khali@linux-fr.org>

View File

@ -412,7 +412,7 @@ For now, you can ignore the `flags' parameter. It is there for future use.
release_region(address,FOO_EXTENT); release_region(address,FOO_EXTENT);
/* SENSORS ONLY END */ /* SENSORS ONLY END */
ERROR1: ERROR1:
kfree(new_client); kfree(data);
ERROR0: ERROR0:
return err; return err;
} }
@ -443,7 +443,7 @@ much simpler than the attachment code, fortunately!
release_region(client->addr,LM78_EXTENT); release_region(client->addr,LM78_EXTENT);
/* HYBRID SENSORS CHIP ONLY END */ /* HYBRID SENSORS CHIP ONLY END */
kfree(data); kfree(i2c_get_clientdata(client));
return 0; return 0;
} }

View File

@ -130,8 +130,6 @@ Code Seq# Include File Comments
<mailto:zapman@interlan.net> <mailto:zapman@interlan.net>
'i' 00-3F linux/i2o.h 'i' 00-3F linux/i2o.h
'j' 00-3F linux/joystick.h 'j' 00-3F linux/joystick.h
'k' all asm-sparc/kbio.h
asm-sparc64/kbio.h
'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system 'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system
<http://mikonos.dia.unisa.it/tcfs> <http://mikonos.dia.unisa.it/tcfs>
'l' 40-7F linux/udf_fs_i.h in development: 'l' 40-7F linux/udf_fs_i.h in development:

View File

@ -116,3 +116,122 @@ and it's role in the array.
Once started with RUN_ARRAY, uninitialized spares can be added with Once started with RUN_ARRAY, uninitialized spares can be added with
HOT_ADD_DISK. HOT_ADD_DISK.
MD devices in sysfs
-------------------
md devices appear in sysfs (/sys) as regular block devices,
e.g.
/sys/block/md0
Each 'md' device will contain a subdirectory called 'md' which
contains further md-specific information about the device.
All md devices contain:
level
a text file indicating the 'raid level'. This may be a standard
numerical level prefixed by "RAID-" - e.g. "RAID-5", or some
other name such as "linear" or "multipath".
If no raid level has been set yet (array is still being
assembled), this file will be empty.
raid_disks
a text file with a simple number indicating the number of devices
in a fully functional array. If this is not yet known, the file
will be empty. If an array is being resized (not currently
possible) this will contain the larger of the old and new sizes.
As component devices are added to an md array, they appear in the 'md'
directory as new directories named
dev-XXX
where XXX is a name that the kernel knows for the device, e.g. hdb1.
Each directory contains:
block
a symlink to the block device in /sys/block, e.g.
/sys/block/md0/md/dev-hdb1/block -> ../../../../block/hdb/hdb1
super
A file containing an image of the superblock read from, or
written to, that device.
state
A file recording the current state of the device in the array
which can be a comma separated list of
faulty - device has been kicked from active use due to
a detected fault
in_sync - device is a fully in-sync member of the array
spare - device is working, but not a full member.
This includes spares that are in the process
of being recoverred to
This list make grow in future.
An active md device will also contain and entry for each active device
in the array. These are named
rdNN
where 'NN' is the possition in the array, starting from 0.
So for a 3 drive array there will be rd0, rd1, rd2.
These are symbolic links to the appropriate 'dev-XXX' entry.
Thus, for example,
cat /sys/block/md*/md/rd*/state
will show 'in_sync' on every line.
Active md devices for levels that support data redundancy (1,4,5,6)
also have
sync_action
a text file that can be used to monitor and control the rebuild
process. It contains one word which can be one of:
resync - redundancy is being recalculated after unclean
shutdown or creation
recover - a hot spare is being built to replace a
failed/missing device
idle - nothing is happening
check - A full check of redundancy was requested and is
happening. This reads all block and checks
them. A repair may also happen for some raid
levels.
repair - A full check and repair is happening. This is
similar to 'resync', but was requested by the
user, and the write-intent bitmap is NOT used to
optimise the process.
This file is writable, and each of the strings that could be
read are meaningful for writing.
'idle' will stop an active resync/recovery etc. There is no
guarantee that another resync/recovery may not be automatically
started again, though some event will be needed to trigger
this.
'resync' or 'recovery' can be used to restart the
corresponding operation if it was stopped with 'idle'.
'check' and 'repair' will start the appropriate process
providing the current state is 'idle'.
mismatch_count
When performing 'check' and 'repair', and possibly when
performing 'resync', md will count the number of errors that are
found. The count in 'mismatch_cnt' is the number of sectors
that were re-written, or (for 'check') would have been
re-written. As most raid levels work in units of pages rather
than sectors, this my be larger than the number of actual errors
by a factor of the number of sectors in a page.
Each active md device may also have attributes specific to the
personality module that manages it.
These are specific to the implementation of the module and could
change substantially if the implementation changes.
These currently include
stripe_cache_size (currently raid5 only)
number of entries in the stripe cache. This is writable, but
there are upper and lower limits (32768, 16). Default is 128.
strip_cache_active (currently raid5 only)
number of active entries in the stripe cache

View File

@ -1,27 +1,82 @@
=========================== Intel(R) PRO/Wireless 2100 Driver for Linux in support of:
Intel(R) PRO/Wireless 2100 Network Connection Driver for Linux
Intel(R) PRO/Wireless 2100 Network Connection
Copyright (C) 2003-2005, Intel Corporation
README.ipw2100 README.ipw2100
March 14, 2005 Version: 1.1.3
Date : October 17, 2005
===========================
Index Index
--------------------------- -----------------------------------------------
0. Introduction 0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
1. Release 1.1.0 Current Features 1. Introduction
2. Command Line Parameters 2. Release 1.1.3 Current Features
3. Sysfs Helper Files 3. Command Line Parameters
4. Radio Kill Switch 4. Sysfs Helper Files
5. Dynamic Firmware 5. Radio Kill Switch
6. Power Management 6. Dynamic Firmware
7. Support 7. Power Management
8. License 8. Support
9. License
=========================== 0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
0. Introduction -----------------------------------------------
------------ ----- ----- ---- --- -- -
Important Notice FOR ALL USERS OR DISTRIBUTORS!!!!
Intel wireless LAN adapters are engineered, manufactured, tested, and
quality checked to ensure that they meet all necessary local and
governmental regulatory agency requirements for the regions that they
are designated and/or marked to ship into. Since wireless LANs are
generally unlicensed devices that share spectrum with radars,
satellites, and other licensed and unlicensed devices, it is sometimes
necessary to dynamically detect, avoid, and limit usage to avoid
interference with these devices. In many instances Intel is required to
provide test data to prove regional and local compliance to regional and
governmental regulations before certification or approval to use the
product is granted. Intel's wireless LAN's EEPROM, firmware, and
software driver are designed to carefully control parameters that affect
radio operation and to ensure electromagnetic compliance (EMC). These
parameters include, without limitation, RF power, spectrum usage,
channel scanning, and human exposure.
For these reasons Intel cannot permit any manipulation by third parties
of the software provided in binary format with the wireless WLAN
adapters (e.g., the EEPROM and firmware). Furthermore, if you use any
patches, utilities, or code with the Intel wireless LAN adapters that
have been manipulated by an unauthorized party (i.e., patches,
utilities, or code (including open source code modifications) which have
not been validated by Intel), (i) you will be solely responsible for
ensuring the regulatory compliance of the products, (ii) Intel will bear
no liability, under any theory of liability for any issues associated
with the modified products, including without limitation, claims under
the warranty and/or issues arising from regulatory non-compliance, and
(iii) Intel will not provide or be required to assist in providing
support to any third parties for such modified products.
Note: Many regulatory agencies consider Wireless LAN adapters to be
modules, and accordingly, condition system-level regulatory approval
upon receipt and review of test data documenting that the antennas and
system configuration do not cause the EMC and radio operation to be
non-compliant.
The drivers available for download from SourceForge are provided as a
part of a development project. Conformance to local regulatory
requirements is the responsibility of the individual developer. As
such, if you are interested in deploying or shipping a driver as part of
solution intended to be used for purposes other than development, please
obtain a tested driver from Intel Customer Support at:
http://support.intel.com/support/notebook/sb/CS-006408.htm
1. Introduction
-----------------------------------------------
This document provides a brief overview of the features supported by the This document provides a brief overview of the features supported by the
IPW2100 driver project. The main project website, where the latest IPW2100 driver project. The main project website, where the latest
@ -34,9 +89,8 @@ potential fixes and patches, as well as links to the development mailing list
for the driver project. for the driver project.
=========================== 2. Release 1.1.3 Current Supported Features
1. Release 1.1.0 Current Supported Features -----------------------------------------------
---------------------------
- Managed (BSS) and Ad-Hoc (IBSS) - Managed (BSS) and Ad-Hoc (IBSS)
- WEP (shared key and open) - WEP (shared key and open)
- Wireless Tools support - Wireless Tools support
@ -51,9 +105,8 @@ on the amount of validation and interoperability testing that has been
performed on a given feature. performed on a given feature.
=========================== 3. Command Line Parameters
2. Command Line Parameters -----------------------------------------------
---------------------------
If the driver is built as a module, the following optional parameters are used If the driver is built as a module, the following optional parameters are used
by entering them on the command line with the modprobe command using this by entering them on the command line with the modprobe command using this
@ -75,9 +128,9 @@ associate boolean associate=0 /* Do NOT auto associate */
disable boolean disable=1 /* Do not power the HW */ disable boolean disable=1 /* Do not power the HW */
=========================== 4. Sysfs Helper Files
3. Sysfs Helper Files
--------------------------- ---------------------------
-----------------------------------------------
There are several ways to control the behavior of the driver. Many of the There are several ways to control the behavior of the driver. Many of the
general capabilities are exposed through the Wireless Tools (iwconfig). There general capabilities are exposed through the Wireless Tools (iwconfig). There
@ -120,9 +173,8 @@ For the device level files, see /sys/bus/pci/drivers/ipw2100:
based RF kill from ON -> OFF -> ON, the radio will NOT come back on based RF kill from ON -> OFF -> ON, the radio will NOT come back on
=========================== 5. Radio Kill Switch
4. Radio Kill Switch -----------------------------------------------
---------------------------
Most laptops provide the ability for the user to physically disable the radio. Most laptops provide the ability for the user to physically disable the radio.
Some vendors have implemented this as a physical switch that requires no Some vendors have implemented this as a physical switch that requires no
software to turn the radio off and on. On other laptops, however, the switch software to turn the radio off and on. On other laptops, however, the switch
@ -134,9 +186,8 @@ See the Sysfs helper file 'rf_kill' for determining the state of the RF switch
on your system. on your system.
=========================== 6. Dynamic Firmware
5. Dynamic Firmware -----------------------------------------------
---------------------------
As the firmware is licensed under a restricted use license, it can not be As the firmware is licensed under a restricted use license, it can not be
included within the kernel sources. To enable the IPW2100 you will need a included within the kernel sources. To enable the IPW2100 you will need a
firmware image to load into the wireless NIC's processors. firmware image to load into the wireless NIC's processors.
@ -146,9 +197,8 @@ You can obtain these images from <http://ipw2100.sf.net/firmware.php>.
See INSTALL for instructions on installing the firmware. See INSTALL for instructions on installing the firmware.
=========================== 7. Power Management
6. Power Management -----------------------------------------------
---------------------------
The IPW2100 supports the configuration of the Power Save Protocol The IPW2100 supports the configuration of the Power Save Protocol
through a private wireless extension interface. The IPW2100 supports through a private wireless extension interface. The IPW2100 supports
the following different modes: the following different modes:
@ -200,9 +250,8 @@ xxxx/yyyy will be replaced with 'off' -- the level reported will be the active
level if `iwconfig eth1 power on` is invoked. level if `iwconfig eth1 power on` is invoked.
=========================== 8. Support
7. Support -----------------------------------------------
---------------------------
For general development information and support, For general development information and support,
go to: go to:
@ -218,9 +267,8 @@ For installation support on the ipw2100 1.1.0 driver on Linux kernels
http://supportmail.intel.com http://supportmail.intel.com
=========================== 9. License
8. License -----------------------------------------------
---------------------------
Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.

View File

@ -1,33 +1,89 @@
Intel(R) PRO/Wireless 2915ABG Driver for Linux in support of: Intel(R) PRO/Wireless 2915ABG Driver for Linux in support of:
Intel(R) PRO/Wireless 2200BG Network Connection Intel(R) PRO/Wireless 2200BG Network Connection
Intel(R) PRO/Wireless 2915ABG Network Connection Intel(R) PRO/Wireless 2915ABG Network Connection
Note: The Intel(R) PRO/Wireless 2915ABG Driver for Linux and Intel(R) Note: The Intel(R) PRO/Wireless 2915ABG Driver for Linux and Intel(R)
PRO/Wireless 2200BG Driver for Linux is a unified driver that works on PRO/Wireless 2200BG Driver for Linux is a unified driver that works on
both hardware adapters listed above. In this document the Intel(R) both hardware adapters listed above. In this document the Intel(R)
PRO/Wireless 2915ABG Driver for Linux will be used to reference the PRO/Wireless 2915ABG Driver for Linux will be used to reference the
unified driver. unified driver.
Copyright (C) 2004-2005, Intel Corporation Copyright (C) 2004-2005, Intel Corporation
README.ipw2200 README.ipw2200
Version: 1.0.0 Version: 1.0.8
Date : January 31, 2005 Date : October 20, 2005
Index Index
----------------------------------------------- -----------------------------------------------
0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
1. Introduction 1. Introduction
1.1. Overview of features 1.1. Overview of features
1.2. Module parameters 1.2. Module parameters
1.3. Wireless Extension Private Methods 1.3. Wireless Extension Private Methods
1.4. Sysfs Helper Files 1.4. Sysfs Helper Files
2. About the Version Numbers 2. Ad-Hoc Networking
3. Support 3. Interacting with Wireless Tools
4. License 3.1. iwconfig mode
4. About the Version Numbers
5. Firmware installation
6. Support
7. License
0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
-----------------------------------------------
Important Notice FOR ALL USERS OR DISTRIBUTORS!!!!
Intel wireless LAN adapters are engineered, manufactured, tested, and
quality checked to ensure that they meet all necessary local and
governmental regulatory agency requirements for the regions that they
are designated and/or marked to ship into. Since wireless LANs are
generally unlicensed devices that share spectrum with radars,
satellites, and other licensed and unlicensed devices, it is sometimes
necessary to dynamically detect, avoid, and limit usage to avoid
interference with these devices. In many instances Intel is required to
provide test data to prove regional and local compliance to regional and
governmental regulations before certification or approval to use the
product is granted. Intel's wireless LAN's EEPROM, firmware, and
software driver are designed to carefully control parameters that affect
radio operation and to ensure electromagnetic compliance (EMC). These
parameters include, without limitation, RF power, spectrum usage,
channel scanning, and human exposure.
For these reasons Intel cannot permit any manipulation by third parties
of the software provided in binary format with the wireless WLAN
adapters (e.g., the EEPROM and firmware). Furthermore, if you use any
patches, utilities, or code with the Intel wireless LAN adapters that
have been manipulated by an unauthorized party (i.e., patches,
utilities, or code (including open source code modifications) which have
not been validated by Intel), (i) you will be solely responsible for
ensuring the regulatory compliance of the products, (ii) Intel will bear
no liability, under any theory of liability for any issues associated
with the modified products, including without limitation, claims under
the warranty and/or issues arising from regulatory non-compliance, and
(iii) Intel will not provide or be required to assist in providing
support to any third parties for such modified products.
Note: Many regulatory agencies consider Wireless LAN adapters to be
modules, and accordingly, condition system-level regulatory approval
upon receipt and review of test data documenting that the antennas and
system configuration do not cause the EMC and radio operation to be
non-compliant.
The drivers available for download from SourceForge are provided as a
part of a development project. Conformance to local regulatory
requirements is the responsibility of the individual developer. As
such, if you are interested in deploying or shipping a driver as part of
solution intended to be used for purposes other than development, please
obtain a tested driver from Intel Customer Support at:
http://support.intel.com/support/notebook/sb/CS-006408.htm
1. Introduction 1. Introduction
@ -45,7 +101,7 @@ file.
1.1. Overview of Features 1.1. Overview of Features
----------------------------------------------- -----------------------------------------------
The current release (1.0.0) supports the following features: The current release (1.0.8) supports the following features:
+ BSS mode (Infrastructure, Managed) + BSS mode (Infrastructure, Managed)
+ IBSS mode (Ad-Hoc) + IBSS mode (Ad-Hoc)
@ -56,17 +112,27 @@ The current release (1.0.0) supports the following features:
+ Full A rate support (2915 only) + Full A rate support (2915 only)
+ Transmit power control + Transmit power control
+ S state support (ACPI suspend/resume) + S state support (ACPI suspend/resume)
The following features are currently enabled, but not officially
supported:
+ WPA
+ long/short preamble support + long/short preamble support
+ Monitor mode (aka RFMon)
The distinction between officially supported and enabled is a reflection
on the amount of validation and interoperability testing that has been
performed on a given feature.
1.2. Command Line Parameters 1.2. Command Line Parameters
----------------------------------------------- -----------------------------------------------
Like many modules used in the Linux kernel, the Intel(R) PRO/Wireless Like many modules used in the Linux kernel, the Intel(R) PRO/Wireless
2915ABG Driver for Linux allows certain configuration options to be 2915ABG Driver for Linux allows configuration options to be provided
provided as module parameters. The most common way to specify a module as module parameters. The most common way to specify a module parameter
parameter is via the command line. is via the command line.
The general form is: The general form is:
@ -96,14 +162,18 @@ Where the supported parameter are:
debug debug
If using a debug build, this is used to control the amount of debug If using a debug build, this is used to control the amount of debug
info is logged. See the 'dval' and 'load' script for more info on info is logged. See the 'dvals' and 'load' script for more info on
how to use this (the dval and load scripts are provided as part how to use this (the dvals and load scripts are provided as part
of the ipw2200 development snapshot releases available from the of the ipw2200 development snapshot releases available from the
SourceForge project at http://ipw2200.sf.net) SourceForge project at http://ipw2200.sf.net)
led
Can be used to turn on experimental LED code.
0 = Off, 1 = On. Default is 0.
mode mode
Can be used to set the default mode of the adapter. Can be used to set the default mode of the adapter.
0 = Managed, 1 = Ad-Hoc 0 = Managed, 1 = Ad-Hoc, 2 = Monitor
1.3. Wireless Extension Private Methods 1.3. Wireless Extension Private Methods
@ -164,8 +234,8 @@ The supported private methods are:
----------------------------------------------- -----------------------------------------------
The Linux kernel provides a pseudo file system that can be used to The Linux kernel provides a pseudo file system that can be used to
access various components of the operating system. The Intel(R) access various components of the operating system. The Intel(R)
PRO/Wireless 2915ABG Driver for Linux exposes several configuration PRO/Wireless 2915ABG Driver for Linux exposes several configuration
parameters through this mechanism. parameters through this mechanism.
An entry in the sysfs can support reading and/or writing. You can An entry in the sysfs can support reading and/or writing. You can
@ -184,13 +254,13 @@ You can set the debug level via:
Where $VALUE would be a number in the case of this sysfs entry. The Where $VALUE would be a number in the case of this sysfs entry. The
input to sysfs files does not have to be a number. For example, the input to sysfs files does not have to be a number. For example, the
firmware loader used by hotplug utilizes sysfs entries for transferring firmware loader used by hotplug utilizes sysfs entries for transfering
the firmware image from user space into the driver. the firmware image from user space into the driver.
The Intel(R) PRO/Wireless 2915ABG Driver for Linux exposes sysfs entries The Intel(R) PRO/Wireless 2915ABG Driver for Linux exposes sysfs entries
at two levels -- driver level, which apply to all instances of the at two levels -- driver level, which apply to all instances of the driver
driver (in the event that there are more than one device installed) and (in the event that there are more than one device installed) and device
device level, which applies only to the single specific instance. level, which applies only to the single specific instance.
1.4.1 Driver Level Sysfs Helper Files 1.4.1 Driver Level Sysfs Helper Files
@ -203,6 +273,7 @@ For the driver level files, look in /sys/bus/pci/drivers/ipw2200/
This controls the same global as the 'debug' module parameter This controls the same global as the 'debug' module parameter
1.4.2 Device Level Sysfs Helper Files 1.4.2 Device Level Sysfs Helper Files
----------------------------------------------- -----------------------------------------------
@ -213,7 +284,7 @@ For the device level files, look in
For example: For example:
/sys/bus/pci/drivers/ipw2200/0000:02:01.0 /sys/bus/pci/drivers/ipw2200/0000:02:01.0
For the device level files, see /sys/bus/pci/[drivers/ipw2200: For the device level files, see /sys/bus/pci/drivers/ipw2200:
rf_kill rf_kill
read - read -
@ -231,8 +302,59 @@ For the device level files, see /sys/bus/pci/[drivers/ipw2200:
ucode ucode
read-only access to the ucode version number read-only access to the ucode version number
led
read -
0 = LED code disabled
1 = LED code enabled
write -
0 = Disable LED code
1 = Enable LED code
2. About the Version Numbers NOTE: The LED code has been reported to hang some systems when
running ifconfig and is therefore disabled by default.
2. Ad-Hoc Networking
-----------------------------------------------
When using a device in an Ad-Hoc network, it is useful to understand the
sequence and requirements for the driver to be able to create, join, or
merge networks.
The following attempts to provide enough information so that you can
have a consistent experience while using the driver as a member of an
Ad-Hoc network.
2.1. Joining an Ad-Hoc Network
-----------------------------------------------
The easiest way to get onto an Ad-Hoc network is to join one that
already exists.
2.2. Creating an Ad-Hoc Network
-----------------------------------------------
An Ad-Hoc networks is created using the syntax of the Wireless tool.
For Example:
iwconfig eth1 mode ad-hoc essid testing channel 2
2.3. Merging Ad-Hoc Networks
-----------------------------------------------
3. Interaction with Wireless Tools
-----------------------------------------------
3.1 iwconfig mode
-----------------------------------------------
When configuring the mode of the adapter, all run-time configured parameters
are reset to the value used when the module was loaded. This includes
channels, rates, ESSID, etc.
4. About the Version Numbers
----------------------------------------------- -----------------------------------------------
Due to the nature of open source development projects, there are Due to the nature of open source development projects, there are
@ -259,12 +381,23 @@ available as quickly as possible, unknown anomalies should be expected.
The major version number will be incremented when significant changes The major version number will be incremented when significant changes
are made to the driver. Currently, there are no major changes planned. are made to the driver. Currently, there are no major changes planned.
5. Firmware installation
----------------------------------------------
3. Support The driver requires a firmware image, download it and extract the
files under /lib/firmware (or wherever your hotplug's firmware.agent
will look for firmware files)
The firmware can be downloaded from the following URL:
http://ipw2200.sf.net/
6. Support
----------------------------------------------- -----------------------------------------------
For installation support of the 1.0.0 version, you can contact For direct support of the 1.0.0 version, you can contact
http://supportmail.intel.com, or you can use the open source project http://supportmail.intel.com, or you can use the open source project
support. support.
For general information and support, go to: For general information and support, go to:
@ -272,7 +405,7 @@ For general information and support, go to:
http://ipw2200.sf.net/ http://ipw2200.sf.net/
4. License 7. License
----------------------------------------------- -----------------------------------------------
Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
@ -297,4 +430,3 @@ For general information and support, go to:
James P. Ketrenos <ipw2100-admin@linux.intel.com> James P. Ketrenos <ipw2100-admin@linux.intel.com>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497

View File

@ -871,7 +871,7 @@ by playing with the --adjust-vma parameter to objdump.
extern inline void spin_lock(spinlock_t *lp) static inline void spin_lock(spinlock_t *lp)
{ {
a0: 18 34 lr %r3,%r4 a0: 18 34 lr %r3,%r4
a2: a7 3a 03 bc ahi %r3,956 a2: a7 3a 03 bc ahi %r3,956

View File

@ -0,0 +1,89 @@
CPU Scheduler implementation hints for architecture specific code
Nick Piggin, 2005
Context switch
==============
1. Runqueue locking
By default, the switch_to arch function is called with the runqueue
locked. This is usually not a problem unless switch_to may need to
take the runqueue lock. This is usually due to a wake up operation in
the context switch. See include/asm-ia64/system.h for an example.
To request the scheduler call switch_to with the runqueue unlocked,
you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file
(typically the one where switch_to is defined).
Unlocked context switches introduce only a very minor performance
penalty to the core scheduler implementation in the CONFIG_SMP case.
2. Interrupt status
By default, the switch_to arch function is called with interrupts
disabled. Interrupts may be enabled over the call if it is likely to
introduce a significant interrupt latency by adding the line
`#define __ARCH_WANT_INTERRUPTS_ON_CTXSW` in the same place as for
unlocked context switches. This define also implies
`__ARCH_WANT_UNLOCKED_CTXSW`. See include/asm-arm/system.h for an
example.
CPU idle
========
Your cpu_idle routines need to obey the following rules:
1. Preempt should now disabled over idle routines. Should only
be enabled to call schedule() then disabled again.
2. need_resched/TIF_NEED_RESCHED is only ever set, and will never
be cleared until the running task has called schedule(). Idle
threads need only ever query need_resched, and may never set or
clear it.
3. When cpu_idle finds (need_resched() == 'true'), it should call
schedule(). It should not call schedule() otherwise.
4. The only time interrupts need to be disabled when checking
need_resched is if we are about to sleep the processor until
the next interrupt (this doesn't provide any protection of
need_resched, it prevents losing an interrupt).
4a. Common problem with this type of sleep appears to be:
local_irq_disable();
if (!need_resched()) {
local_irq_enable();
*** resched interrupt arrives here ***
__asm__("sleep until next interrupt");
}
5. TIF_POLLING_NRFLAG can be set by idle routines that do not
need an interrupt to wake them up when need_resched goes high.
In other words, they must be periodically polling need_resched,
although it may be reasonable to do some background work or enter
a low CPU priority.
5a. If TIF_POLLING_NRFLAG is set, and we do decide to enter
an interrupt sleep, it needs to be cleared then a memory
barrier issued (followed by a test of need_resched with
interrupts disabled, as explained in 3).
arch/i386/kernel/process.c has examples of both polling and
sleeping idle functions.
Possible arch/ problems
=======================
Possible arch problems I found (and either tried to fix or didn't):
h8300 - Is such sleeping racy vs interrupts? (See #4a).
The H8/300 manual I found indicates yes, however disabling IRQs
over the sleep mean only NMIs can wake it up, so can't fix easily
without doing spin waiting.
ia64 - is safe_halt call racy vs interrupts? (does it sleep?) (See #4a)
sh64 - Is sleeping racy vs interrupts? (See #4a)
sparc - IRQs on at this point(?), change local_irq_save to _disable.
- TODO: needs secondary CPUs to disable preempt (See #1)

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ V4L original API</a>
</td><td> </td><td>
Obsoleted by V4L2 API Obsoleted by V4L2 API
</td></tr><tr><td> </td></tr><tr><td>
<A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L2_API.html> <A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L2_API>
V4L2 API</a> V4L2 API</a>
</td><td> </td><td>
Should be used for new projects Should be used for new projects

View File

@ -1,137 +1,142 @@
card=0 - *** UNKNOWN/GENERIC *** 0 -> *** UNKNOWN/GENERIC ***
card=1 - MIRO PCTV 1 -> MIRO PCTV
card=2 - Hauppauge (bt848) 2 -> Hauppauge (bt848)
card=3 - STB, Gateway P/N 6000699 (bt848) 3 -> STB, Gateway P/N 6000699 (bt848)
card=4 - Intel Create and Share PCI/ Smart Video Recorder III 4 -> Intel Create and Share PCI/ Smart Video Recorder III
card=5 - Diamond DTV2000 5 -> Diamond DTV2000
card=6 - AVerMedia TVPhone 6 -> AVerMedia TVPhone
card=7 - MATRIX-Vision MV-Delta 7 -> MATRIX-Vision MV-Delta
card=8 - Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26 8 -> Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26
card=9 - IMS/IXmicro TurboTV 9 -> IMS/IXmicro TurboTV
card=10 - Hauppauge (bt878) 10 -> Hauppauge (bt878) [0070:13eb,0070:3900,2636:10b4]
card=11 - MIRO PCTV pro 11 -> MIRO PCTV pro
card=12 - ADS Technologies Channel Surfer TV (bt848) 12 -> ADS Technologies Channel Surfer TV (bt848)
card=13 - AVerMedia TVCapture 98 13 -> AVerMedia TVCapture 98 [1461:0002,1461:0004,1461:0300]
card=14 - Aimslab Video Highway Xtreme (VHX) 14 -> Aimslab Video Highway Xtreme (VHX)
card=15 - Zoltrix TV-Max 15 -> Zoltrix TV-Max [a1a0:a0fc]
card=16 - Prolink Pixelview PlayTV (bt878) 16 -> Prolink Pixelview PlayTV (bt878)
card=17 - Leadtek WinView 601 17 -> Leadtek WinView 601
card=18 - AVEC Intercapture 18 -> AVEC Intercapture
card=19 - Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only) 19 -> Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)
card=20 - CEI Raffles Card 20 -> CEI Raffles Card
card=21 - Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50 21 -> Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50
card=22 - Askey CPH050/ Phoebe Tv Master + FM 22 -> Askey CPH050/ Phoebe Tv Master + FM [14ff:3002]
card=23 - Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878 23 -> Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878 [14c7:0101]
card=24 - Askey CPH05X/06X (bt878) [many vendors] 24 -> Askey CPH05X/06X (bt878) [many vendors] [144f:3002,144f:3005,144f:5000,14ff:3000]
card=25 - Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar 25 -> Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar
card=26 - Hauppauge WinCam newer (bt878) 26 -> Hauppauge WinCam newer (bt878)
card=27 - Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50 27 -> Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50
card=28 - Terratec TerraTV+ Version 1.1 (bt878) 28 -> Terratec TerraTV+ Version 1.1 (bt878) [153b:1127,1852:1852]
card=29 - Imagenation PXC200 29 -> Imagenation PXC200 [1295:200a]
card=30 - Lifeview FlyVideo 98 LR50 30 -> Lifeview FlyVideo 98 LR50 [1f7f:1850]
card=31 - Formac iProTV, Formac ProTV I (bt848) 31 -> Formac iProTV, Formac ProTV I (bt848)
card=32 - Intel Create and Share PCI/ Smart Video Recorder III 32 -> Intel Create and Share PCI/ Smart Video Recorder III
card=33 - Terratec TerraTValue Version Bt878 33 -> Terratec TerraTValue Version Bt878 [153b:1117,153b:1118,153b:1119,153b:111a,153b:1134,153b:5018]
card=34 - Leadtek WinFast 2000/ WinFast 2000 XP 34 -> Leadtek WinFast 2000/ WinFast 2000 XP [107d:6606,107d:6609,6606:217d,f6ff:fff6]
card=35 - Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II 35 -> Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II [1851:1850,1851:a050]
card=36 - Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner 36 -> Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner [1852:1852]
card=37 - Prolink PixelView PlayTV pro 37 -> Prolink PixelView PlayTV pro
card=38 - Askey CPH06X TView99 38 -> Askey CPH06X TView99 [144f:3000,144f:a005,a04f:a0fc]
card=39 - Pinnacle PCTV Studio/Rave 39 -> Pinnacle PCTV Studio/Rave [11bd:0012,bd11:1200,bd11:ff00,11bd:ff12]
card=40 - STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100 40 -> STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100 [10b4:2636,10b4:2645,121a:3060]
card=41 - AVerMedia TVPhone 98 41 -> AVerMedia TVPhone 98 [1461:0001,1461:0003]
card=42 - ProVideo PV951 42 -> ProVideo PV951 [aa0c:146c]
card=43 - Little OnAir TV 43 -> Little OnAir TV
card=44 - Sigma TVII-FM 44 -> Sigma TVII-FM
card=45 - MATRIX-Vision MV-Delta 2 45 -> MATRIX-Vision MV-Delta 2
card=46 - Zoltrix Genie TV/FM 46 -> Zoltrix Genie TV/FM [15b0:4000,15b0:400a,15b0:400d,15b0:4010,15b0:4016]
card=47 - Terratec TV/Radio+ 47 -> Terratec TV/Radio+ [153b:1123]
card=48 - Askey CPH03x/ Dynalink Magic TView 48 -> Askey CPH03x/ Dynalink Magic TView
card=49 - IODATA GV-BCTV3/PCI 49 -> IODATA GV-BCTV3/PCI [10fc:4020]
card=50 - Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP 50 -> Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP
card=51 - Eagle Wireless Capricorn2 (bt878A) 51 -> Eagle Wireless Capricorn2 (bt878A)
card=52 - Pinnacle PCTV Studio Pro 52 -> Pinnacle PCTV Studio Pro
card=53 - Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS 53 -> Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS
card=54 - Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90] 54 -> Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]
card=55 - Askey CPH031/ BESTBUY Easy TV 55 -> Askey CPH031/ BESTBUY Easy TV
card=56 - Lifeview FlyVideo 98FM LR50 56 -> Lifeview FlyVideo 98FM LR50 [a051:41a0]
card=57 - GrandTec 'Grand Video Capture' (Bt848) 57 -> GrandTec 'Grand Video Capture' (Bt848) [4344:4142]
card=58 - Askey CPH060/ Phoebe TV Master Only (No FM) 58 -> Askey CPH060/ Phoebe TV Master Only (No FM)
card=59 - Askey CPH03x TV Capturer 59 -> Askey CPH03x TV Capturer
card=60 - Modular Technology MM100PCTV 60 -> Modular Technology MM100PCTV
card=61 - AG Electronics GMV1 61 -> AG Electronics GMV1 [15cb:0101]
card=62 - Askey CPH061/ BESTBUY Easy TV (bt878) 62 -> Askey CPH061/ BESTBUY Easy TV (bt878)
card=63 - ATI TV-Wonder 63 -> ATI TV-Wonder [1002:0001]
card=64 - ATI TV-Wonder VE 64 -> ATI TV-Wonder VE [1002:0003]
card=65 - Lifeview FlyVideo 2000S LR90 65 -> Lifeview FlyVideo 2000S LR90
card=66 - Terratec TValueRadio 66 -> Terratec TValueRadio [153b:1135,153b:ff3b]
card=67 - IODATA GV-BCTV4/PCI 67 -> IODATA GV-BCTV4/PCI [10fc:4050]
card=68 - 3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA) 68 -> 3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA) [121a:3000,10b4:2637]
card=69 - Active Imaging AIMMS 69 -> Active Imaging AIMMS
card=70 - Prolink Pixelview PV-BT878P+ (Rev.4C,8E) 70 -> Prolink Pixelview PV-BT878P+ (Rev.4C,8E)
card=71 - Lifeview FlyVideo 98EZ (capture only) LR51 71 -> Lifeview FlyVideo 98EZ (capture only) LR51 [1851:1851]
card=72 - Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM) 72 -> Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM) [1554:4011]
card=73 - Sensoray 311 73 -> Sensoray 311 [6000:0311]
card=74 - RemoteVision MX (RV605) 74 -> RemoteVision MX (RV605)
card=75 - Powercolor MTV878/ MTV878R/ MTV878F 75 -> Powercolor MTV878/ MTV878R/ MTV878F
card=76 - Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP) 76 -> Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP) [0e11:0079]
card=77 - GrandTec Multi Capture Card (Bt878) 77 -> GrandTec Multi Capture Card (Bt878)
card=78 - Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF 78 -> Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF [0a01:17de]
card=79 - DSP Design TCVIDEO 79 -> DSP Design TCVIDEO
card=80 - Hauppauge WinTV PVR 80 -> Hauppauge WinTV PVR [0070:4500]
card=81 - IODATA GV-BCTV5/PCI 81 -> IODATA GV-BCTV5/PCI [10fc:4070,10fc:d018]
card=82 - Osprey 100/150 (878) 82 -> Osprey 100/150 (878) [0070:ff00]
card=83 - Osprey 100/150 (848) 83 -> Osprey 100/150 (848)
card=84 - Osprey 101 (848) 84 -> Osprey 101 (848)
card=85 - Osprey 101/151 85 -> Osprey 101/151
card=86 - Osprey 101/151 w/ svid 86 -> Osprey 101/151 w/ svid
card=87 - Osprey 200/201/250/251 87 -> Osprey 200/201/250/251
card=88 - Osprey 200/250 88 -> Osprey 200/250 [0070:ff01]
card=89 - Osprey 210/220 89 -> Osprey 210/220
card=90 - Osprey 500 90 -> Osprey 500 [0070:ff02]
card=91 - Osprey 540 91 -> Osprey 540 [0070:ff04]
card=92 - Osprey 2000 92 -> Osprey 2000 [0070:ff03]
card=93 - IDS Eagle 93 -> IDS Eagle
card=94 - Pinnacle PCTV Sat 94 -> Pinnacle PCTV Sat [11bd:001c]
card=95 - Formac ProTV II (bt878) 95 -> Formac ProTV II (bt878)
card=96 - MachTV 96 -> MachTV
card=97 - Euresys Picolo 97 -> Euresys Picolo
card=98 - ProVideo PV150 98 -> ProVideo PV150 [aa00:1460,aa01:1461,aa02:1462,aa03:1463,aa04:1464,aa05:1465,aa06:1466,aa07:1467]
card=99 - AD-TVK503 99 -> AD-TVK503
card=100 - Hercules Smart TV Stereo 100 -> Hercules Smart TV Stereo
card=101 - Pace TV & Radio Card 101 -> Pace TV & Radio Card
card=102 - IVC-200 102 -> IVC-200 [0000:a155,0001:a155,0002:a155,0003:a155,0100:a155,0101:a155,0102:a155,0103:a155]
card=103 - Grand X-Guard / Trust 814PCI 103 -> Grand X-Guard / Trust 814PCI [0304:0102]
card=104 - Nebula Electronics DigiTV 104 -> Nebula Electronics DigiTV [0071:0101]
card=105 - ProVideo PV143 105 -> ProVideo PV143 [aa00:1430,aa00:1431,aa00:1432,aa00:1433,aa03:1433]
card=106 - PHYTEC VD-009-X1 MiniDIN (bt878) 106 -> PHYTEC VD-009-X1 MiniDIN (bt878)
card=107 - PHYTEC VD-009-X1 Combi (bt878) 107 -> PHYTEC VD-009-X1 Combi (bt878)
card=108 - PHYTEC VD-009 MiniDIN (bt878) 108 -> PHYTEC VD-009 MiniDIN (bt878)
card=109 - PHYTEC VD-009 Combi (bt878) 109 -> PHYTEC VD-009 Combi (bt878)
card=110 - IVC-100 110 -> IVC-100 [ff00:a132]
card=111 - IVC-120G 111 -> IVC-120G [ff00:a182,ff01:a182,ff02:a182,ff03:a182,ff04:a182,ff05:a182,ff06:a182,ff07:a182,ff08:a182,ff09:a182,ff0a:a182,ff0b:a182,ff0c:a182,ff0d:a182,ff0e:a182,ff0f:a182]
card=112 - pcHDTV HD-2000 TV 112 -> pcHDTV HD-2000 TV [7063:2000]
card=113 - Twinhan DST + clones 113 -> Twinhan DST + clones [11bd:0026,1822:0001,270f:fc00]
card=114 - Winfast VC100 114 -> Winfast VC100 [107d:6607]
card=115 - Teppro TEV-560/InterVision IV-560 115 -> Teppro TEV-560/InterVision IV-560
card=116 - SIMUS GVC1100 116 -> SIMUS GVC1100 [aa6a:82b2]
card=117 - NGS NGSTV+ 117 -> NGS NGSTV+
card=118 - LMLBT4 118 -> LMLBT4
card=119 - Tekram M205 PRO 119 -> Tekram M205 PRO
card=120 - Conceptronic CONTVFMi 120 -> Conceptronic CONTVFMi
card=121 - Euresys Picolo Tetra 121 -> Euresys Picolo Tetra [1805:0105,1805:0106,1805:0107,1805:0108]
card=122 - Spirit TV Tuner 122 -> Spirit TV Tuner
card=123 - AVerMedia AVerTV DVB-T 771 123 -> AVerMedia AVerTV DVB-T 771 [1461:0771]
card=124 - AverMedia AverTV DVB-T 761 124 -> AverMedia AverTV DVB-T 761 [1461:0761]
card=125 - MATRIX Vision Sigma-SQ 125 -> MATRIX Vision Sigma-SQ
card=126 - MATRIX Vision Sigma-SLC 126 -> MATRIX Vision Sigma-SLC
card=127 - APAC Viewcomp 878(AMAX) 127 -> APAC Viewcomp 878(AMAX)
card=128 - DViCO FusionHDTV DVB-T Lite 128 -> DViCO FusionHDTV DVB-T Lite [18ac:db10]
card=129 - V-Gear MyVCD 129 -> V-Gear MyVCD
card=130 - Super TV Tuner 130 -> Super TV Tuner
card=131 - Tibet Systems 'Progress DVR' CS16 131 -> Tibet Systems 'Progress DVR' CS16
card=132 - Kodicom 4400R (master) 132 -> Kodicom 4400R (master)
card=133 - Kodicom 4400R (slave) 133 -> Kodicom 4400R (slave)
card=134 - Adlink RTV24 134 -> Adlink RTV24
card=135 - DViCO FusionHDTV 5 Lite 135 -> DViCO FusionHDTV 5 Lite [18ac:d500]
card=136 - Acorp Y878F 136 -> Acorp Y878F [9511:1540]
137 -> Conceptronic CTVFMi v2
138 -> Prolink Pixelview PV-BT878P+ (Rev.2E)
139 -> Prolink PixelView PlayTV MPEG2 PV-M4900
140 -> Osprey 440 [0070:ff07]
141 -> Asound Skyeye PCTV

View File

@ -1,32 +1,37 @@
card=0 - UNKNOWN/GENERIC 0 -> UNKNOWN/GENERIC
card=1 - Hauppauge WinTV 34xxx models 1 -> Hauppauge WinTV 34xxx models [0070:3400,0070:3401]
card=2 - GDI Black Gold 2 -> GDI Black Gold [14c7:0106,14c7:0107]
card=3 - PixelView 3 -> PixelView [1554:4811]
card=4 - ATI TV Wonder Pro 4 -> ATI TV Wonder Pro [1002:00f8]
card=5 - Leadtek Winfast 2000XP Expert 5 -> Leadtek Winfast 2000XP Expert [107d:6611,107d:6613]
card=6 - AverTV Studio 303 (M126) 6 -> AverTV Studio 303 (M126) [1461:000b]
card=7 - MSI TV-@nywhere Master 7 -> MSI TV-@nywhere Master [1462:8606]
card=8 - Leadtek Winfast DV2000 8 -> Leadtek Winfast DV2000 [107d:6620]
card=9 - Leadtek PVR 2000 9 -> Leadtek PVR 2000 [107d:663b,107d:663C]
card=10 - IODATA GV-VCP3/PCI 10 -> IODATA GV-VCP3/PCI [10fc:d003]
card=11 - Prolink PlayTV PVR 11 -> Prolink PlayTV PVR
card=12 - ASUS PVR-416 12 -> ASUS PVR-416 [1043:4823]
card=13 - MSI TV-@nywhere 13 -> MSI TV-@nywhere
card=14 - KWorld/VStream XPert DVB-T 14 -> KWorld/VStream XPert DVB-T [17de:08a6]
card=15 - DViCO FusionHDTV DVB-T1 15 -> DViCO FusionHDTV DVB-T1 [18ac:db00]
card=16 - KWorld LTV883RF 16 -> KWorld LTV883RF
card=17 - DViCO FusionHDTV 3 Gold-Q 17 -> DViCO FusionHDTV 3 Gold-Q [18ac:d810]
card=18 - Hauppauge Nova-T DVB-T 18 -> Hauppauge Nova-T DVB-T [0070:9002]
card=19 - Conexant DVB-T reference design 19 -> Conexant DVB-T reference design [14f1:0187]
card=20 - Provideo PV259 20 -> Provideo PV259 [1540:2580]
card=21 - DViCO FusionHDTV DVB-T Plus 21 -> DViCO FusionHDTV DVB-T Plus [18ac:db10]
card=22 - digitalnow DNTV Live! DVB-T 22 -> pcHDTV HD3000 HDTV [7063:3000]
card=23 - pcHDTV HD3000 HDTV 23 -> digitalnow DNTV Live! DVB-T [17de:a8a6]
card=24 - Hauppauge WinTV 28xxx (Roslyn) models 24 -> Hauppauge WinTV 28xxx (Roslyn) models [0070:2801]
card=25 - Digital-Logic MICROSPACE Entertainment Center (MEC) 25 -> Digital-Logic MICROSPACE Entertainment Center (MEC) [14f1:0342]
card=26 - IODATA GV/BCTV7E 26 -> IODATA GV/BCTV7E [10fc:d035]
card=27 - PixelView PlayTV Ultra Pro (Stereo) 27 -> PixelView PlayTV Ultra Pro (Stereo)
card=28 - DViCO FusionHDTV 3 Gold-T 28 -> DViCO FusionHDTV 3 Gold-T [18ac:d820]
card=29 - ADS Tech Instant TV DVB-T PCI 29 -> ADS Tech Instant TV DVB-T PCI [1421:0334]
card=30 - TerraTec Cinergy 1400 DVB-T 30 -> TerraTec Cinergy 1400 DVB-T [153b:1166]
card=31 - DViCO FusionHDTV 5 Gold 31 -> DViCO FusionHDTV 5 Gold [18ac:d500]
32 -> AverMedia UltraTV Media Center PCI 550 [1461:8011]
33 -> Kworld V-Stream Xpert DVD
34 -> ATI HDTV Wonder [1002:a101]
35 -> WinFast DTV1000-T [107d:665f]
36 -> AVerTV 303 (M126) [1461:000a]

View File

@ -0,0 +1,10 @@
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
1 -> Unknown EM2820/2840 video grabber (em2820/em2840)
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200]
5 -> MSI VOX USB 2.0 (em2820/em2840) [eb1a:2820]
6 -> Terratec Cinergy 200 USB (em2800)
7 -> Leadtek Winfast USB II (em2800)
8 -> Kworld USB2800 (em2800)
9 -> Pinnacle Dazzle DVC 90 (em2820/em2840) [2304:0207]

View File

@ -6,10 +6,10 @@
5 -> SKNet Monster TV [1131:4e85] 5 -> SKNet Monster TV [1131:4e85]
6 -> Tevion MD 9717 6 -> Tevion MD 9717
7 -> KNC One TV-Station RDS / Typhoon TV Tuner RDS [1131:fe01,1894:fe01] 7 -> KNC One TV-Station RDS / Typhoon TV Tuner RDS [1131:fe01,1894:fe01]
8 -> Terratec Cinergy 400 TV [153B:1142] 8 -> Terratec Cinergy 400 TV [153b:1142]
9 -> Medion 5044 9 -> Medion 5044
10 -> Kworld/KuroutoShikou SAA7130-TVPCI 10 -> Kworld/KuroutoShikou SAA7130-TVPCI
11 -> Terratec Cinergy 600 TV [153B:1143] 11 -> Terratec Cinergy 600 TV [153b:1143]
12 -> Medion 7134 [16be:0003] 12 -> Medion 7134 [16be:0003]
13 -> Typhoon TV+Radio 90031 13 -> Typhoon TV+Radio 90031
14 -> ELSA EX-VISION 300TV [1048:226b] 14 -> ELSA EX-VISION 300TV [1048:226b]
@ -36,8 +36,8 @@
35 -> AverMedia AverTV Studio 305 [1461:2115] 35 -> AverMedia AverTV Studio 305 [1461:2115]
36 -> UPMOST PURPLE TV [12ab:0800] 36 -> UPMOST PURPLE TV [12ab:0800]
37 -> Items MuchTV Plus / IT-005 37 -> Items MuchTV Plus / IT-005
38 -> Terratec Cinergy 200 TV [153B:1152] 38 -> Terratec Cinergy 200 TV [153b:1152]
39 -> LifeView FlyTV Platinum Mini [5168:0212] 39 -> LifeView FlyTV Platinum Mini [5168:0212,4e42:0212]
40 -> Compro VideoMate TV PVR/FM [185b:c100] 40 -> Compro VideoMate TV PVR/FM [185b:c100]
41 -> Compro VideoMate TV Gold+ [185b:c100] 41 -> Compro VideoMate TV Gold+ [185b:c100]
42 -> Sabrent SBT-TVFM (saa7130) 42 -> Sabrent SBT-TVFM (saa7130)
@ -46,7 +46,7 @@
45 -> Avermedia AVerTV Studio 307 [1461:9715] 45 -> Avermedia AVerTV Studio 307 [1461:9715]
46 -> AVerMedia Cardbus TV/Radio (E500) [1461:d6ee] 46 -> AVerMedia Cardbus TV/Radio (E500) [1461:d6ee]
47 -> Terratec Cinergy 400 mobile [153b:1162] 47 -> Terratec Cinergy 400 mobile [153b:1162]
48 -> Terratec Cinergy 600 TV MK3 [153B:1158] 48 -> Terratec Cinergy 600 TV MK3 [153b:1158]
49 -> Compro VideoMate Gold+ Pal [185b:c200] 49 -> Compro VideoMate Gold+ Pal [185b:c200]
50 -> Pinnacle PCTV 300i DVB-T + PAL [11bd:002d] 50 -> Pinnacle PCTV 300i DVB-T + PAL [11bd:002d]
51 -> ProVideo PV952 [1540:9524] 51 -> ProVideo PV952 [1540:9524]
@ -56,12 +56,27 @@
55 -> LifeView FlyDVB-T DUO [5168:0502,5168:0306] 55 -> LifeView FlyDVB-T DUO [5168:0502,5168:0306]
56 -> Avermedia AVerTV 307 [1461:a70a] 56 -> Avermedia AVerTV 307 [1461:a70a]
57 -> Avermedia AVerTV GO 007 FM [1461:f31f] 57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0370] 58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0370,1421:1370]
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134 59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus [4e42:0502] 60 -> Typhoon DVB-T Duo Digital/Analog Cardbus [4e42:0502]
61 -> Philips TOUGH DVB-T reference design [1131:2004] 61 -> Philips TOUGH DVB-T reference design [1131:2004]
62 -> Compro VideoMate TV Gold+II 62 -> Compro VideoMate TV Gold+II
63 -> Kworld Xpert TV PVR7134 63 -> Kworld Xpert TV PVR7134
64 -> FlyTV mini Asus Digimatrix [1043:0210,1043:0210] 64 -> FlyTV mini Asus Digimatrix [1043:0210]
65 -> V-Stream Studio TV Terminator 65 -> V-Stream Studio TV Terminator
66 -> Yuan TUN-900 (saa7135) 66 -> Yuan TUN-900 (saa7135)
67 -> Beholder BeholdTV 409 FM [0000:4091]
68 -> GoTView 7135 PCI [5456:7135]
69 -> Philips EUROPA V3 reference design [1131:2004]
70 -> Compro Videomate DVB-T300 [185b:c900]
71 -> Compro Videomate DVB-T200 [185b:c901]
72 -> RTD Embedded Technologies VFG7350 [1435:7350]
73 -> RTD Embedded Technologies VFG7330 [1435:7330]
74 -> LifeView FlyTV Platinum Mini2 [14c0:1212]
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
76 -> SKNet MonsterTV Mobile [1131:4ee9]
77 -> Pinnacle PCTV 110i (saa7133) [11bd:002e]
78 -> ASUSTeK P7131 Dual [1043:4862]
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
80 -> ASUS Digimatrix TV [1043:0210]
81 -> Philips Tiger reference design [1131:2018]

View File

@ -53,7 +53,7 @@ tuner=51 - Philips PAL/SECAM_D (FM 1256 I-H3)
tuner=52 - Thomson DDT 7610 (ATSC/NTSC) tuner=52 - Thomson DDT 7610 (ATSC/NTSC)
tuner=53 - Philips FQ1286 tuner=53 - Philips FQ1286
tuner=54 - tda8290+75 tuner=54 - tda8290+75
tuner=55 - LG PAL (TAPE series) tuner=55 - TCL 2002MB
tuner=56 - Philips PAL/SECAM multi (FQ1216AME MK4) tuner=56 - Philips PAL/SECAM multi (FQ1216AME MK4)
tuner=57 - Philips FQ1236A MK4 tuner=57 - Philips FQ1236A MK4
tuner=58 - Ymec TVision TVF-8531MF/8831MF/8731MF tuner=58 - Ymec TVision TVF-8531MF/8831MF/8731MF
@ -65,3 +65,5 @@ tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner
tuner=64 - LG TDVS-H062F/TUA6034 tuner=64 - LG TDVS-H062F/TUA6034
tuner=65 - Ymec TVF66T5-B/DFF tuner=65 - Ymec TVF66T5-B/DFF
tuner=66 - LG NTSC (TALN mini series) tuner=66 - LG NTSC (TALN mini series)
tuner=67 - Philips TD1316 Hybrid Tuner
tuner=68 - Philips TUV1236D ATSC/NTSC dual in

View File

@ -17,9 +17,9 @@ audio
- The chip specs for the on-chip TV sound decoder are next - The chip specs for the on-chip TV sound decoder are next
to useless :-/ to useless :-/
- Neverless the builtin TV sound decoder starts working now, - Neverless the builtin TV sound decoder starts working now,
at least for PAL-BG. Other TV norms need other code ... at least for PAL-BG. Other TV norms need other code ...
FOR ANY REPORTS ON THIS PLEASE MENTION THE TV NORM YOU ARE FOR ANY REPORTS ON THIS PLEASE MENTION THE TV NORM YOU ARE
USING. USING.
- Most tuner chips do provide mono sound, which may or may not - Most tuner chips do provide mono sound, which may or may not
be useable depending on the board design. With the Hauppauge be useable depending on the board design. With the Hauppauge
cards it works, so there is mono sound available as fallback. cards it works, so there is mono sound available as fallback.
@ -65,5 +65,5 @@ Have fun,
Gerd Gerd
-- --
Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]

View File

@ -78,5 +78,5 @@ Have fun,
Gerd Gerd
-- --
Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]

View File

@ -149,11 +149,11 @@ Lifeview Flyvideo Series:
2) There is a print on the PCB: 2) There is a print on the PCB:
LR25 = Flyvideo (Zoran ZR36120, SAA7110A) LR25 = Flyvideo (Zoran ZR36120, SAA7110A)
LR26 Rev.N = Flyvideo II (Bt848) LR26 Rev.N = Flyvideo II (Bt848)
Rev.O = Flyvideo II (Bt878) Rev.O = Flyvideo II (Bt878)
LR37 Rev.C = Flyvideo EZ (Capture only, ZR36120 + SAA7110) LR37 Rev.C = Flyvideo EZ (Capture only, ZR36120 + SAA7110)
LR38 Rev.A1= Flyvideo II EZ (Bt848 capture only) LR38 Rev.A1= Flyvideo II EZ (Bt848 capture only)
LR50 Rev.Q = Flyvideo 98 (w/eeprom and PCI subsystem ID) LR50 Rev.Q = Flyvideo 98 (w/eeprom and PCI subsystem ID)
Rev.W = Flyvideo 98 (no eeprom) Rev.W = Flyvideo 98 (no eeprom)
LR51 Rev.E = Flyvideo 98 EZ (capture only) LR51 Rev.E = Flyvideo 98 EZ (capture only)
LR90 = Flyvideo 2000 (Bt878) LR90 = Flyvideo 2000 (Bt878)
Flyvideo 2000S (Bt878) w/Stereo TV (Package incl. LR91 daughterboard) Flyvideo 2000S (Bt878) w/Stereo TV (Package incl. LR91 daughterboard)
@ -163,7 +163,7 @@ Lifeview Flyvideo Series:
LR136 = Flyvideo 2100/3100 (Low profile, SAA7130/SAA7134) LR136 = Flyvideo 2100/3100 (Low profile, SAA7130/SAA7134)
LR137 = Flyvideo DV2000/DV3000 (SAA7130/SAA7134 + IEEE1394) LR137 = Flyvideo DV2000/DV3000 (SAA7130/SAA7134 + IEEE1394)
LR138 Rev.C= Flyvideo 2000 (SAA7130) LR138 Rev.C= Flyvideo 2000 (SAA7130)
or Flyvideo 3000 (SAA7134) w/Stereo TV or Flyvideo 3000 (SAA7134) w/Stereo TV
These exist in variations w/FM and w/Remote sometimes denoted These exist in variations w/FM and w/Remote sometimes denoted
by suffixes "FM" and "R". by suffixes "FM" and "R".
3) You have a laptop (miniPCI card): 3) You have a laptop (miniPCI card):
@ -197,7 +197,7 @@ Typhoon TV card series:
50680 "TV Tuner Pal BG" (blue package)= Pixelview PV-BT878P+ (Rev 9B) 50680 "TV Tuner Pal BG" (blue package)= Pixelview PV-BT878P+ (Rev 9B)
50681 "TV Tuner PCI Pal I" (variant of 50680) 50681 "TV Tuner PCI Pal I" (variant of 50680)
50682 "TView TV/FM Tuner Pal BG" = Flyvideo 98FM (LR50 Rev.Q) 50682 "TView TV/FM Tuner Pal BG" = Flyvideo 98FM (LR50 Rev.Q)
Note: The package has a picture of CPH05x (which would be a real TView) Note: The package has a picture of CPH05x (which would be a real TView)
50683 "TV Tuner PCI SECAM" (variant of 50680) 50683 "TV Tuner PCI SECAM" (variant of 50680)
50684 "TV Tuner Pal BG" = Pixelview 878TV(Rev.3D) 50684 "TV Tuner Pal BG" = Pixelview 878TV(Rev.3D)
50686 "TV Tuner" = KNC1 TV Station 50686 "TV Tuner" = KNC1 TV Station
@ -418,9 +418,9 @@ Lifetec/Medion/Tevion/Aldi
-------------------------- --------------------------
LT9306/MD9306 = CPH061 LT9306/MD9306 = CPH061
LT9415/MD9415 = LR90 Rev.F or Rev.G LT9415/MD9415 = LR90 Rev.F or Rev.G
MD9592 = Avermedia TVphone98 (PCI_ID=1461:0003), PCB-Rev=M168II-B (w/TDA9873H) MD9592 = Avermedia TVphone98 (PCI_ID=1461:0003), PCB-Rev=M168II-B (w/TDA9873H)
MD9717 = KNC One (Rev D4, saa7134, FM1216 MK2 tuner) MD9717 = KNC One (Rev D4, saa7134, FM1216 MK2 tuner)
MD5044 = KNC One (Rev D4, saa7134, FM1216ME MK3 tuner) MD5044 = KNC One (Rev D4, saa7134, FM1216ME MK3 tuner)
Modular Technologies (www.modulartech.com) UK Modular Technologies (www.modulartech.com) UK
--------------------------------------------- ---------------------------------------------
@ -453,10 +453,10 @@ Technisat
Discos ADR PC-Karte ISA (no TV!) Discos ADR PC-Karte ISA (no TV!)
Discos ADR PC-Karte PCI (probably no TV?) Discos ADR PC-Karte PCI (probably no TV?)
Techni-PC-Sat (Sat. analog) Techni-PC-Sat (Sat. analog)
Rev 1.2 (zr36120, vpx3220, stv0030, saa5246, BSJE3-494A) Rev 1.2 (zr36120, vpx3220, stv0030, saa5246, BSJE3-494A)
Mediafocus I (zr36120/zr36125, drp3510, Sat. analog + ADR Radio) Mediafocus I (zr36120/zr36125, drp3510, Sat. analog + ADR Radio)
Mediafocus II (saa7146, Sat. analog) Mediafocus II (saa7146, Sat. analog)
SatADR Rev 2.1 (saa7146a, saa7113h, stv0056a, msp3400c, drp3510a, BSKE3-307A) SatADR Rev 2.1 (saa7146a, saa7113h, stv0056a, msp3400c, drp3510a, BSKE3-307A)
SkyStar 1 DVB (AV7110) = Technotrend Premium SkyStar 1 DVB (AV7110) = Technotrend Premium
SkyStar 2 DVB (B2C2) (=Sky2PC) SkyStar 2 DVB (B2C2) (=Sky2PC)

View File

@ -42,9 +42,9 @@ bttv uses the PCI Subsystem ID to autodetect the card type. lspci lists
the Subsystem ID in the second line, looks like this: the Subsystem ID in the second line, looks like this:
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02) 00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02)
Subsystem: Hauppauge computer works Inc. WinTV/GO Subsystem: Hauppauge computer works Inc. WinTV/GO
Flags: bus master, medium devsel, latency 32, IRQ 5 Flags: bus master, medium devsel, latency 32, IRQ 5
Memory at e2000000 (32-bit, prefetchable) [size=4K] Memory at e2000000 (32-bit, prefetchable) [size=4K]
only bt878-based cards can have a subsystem ID (which does not mean only bt878-based cards can have a subsystem ID (which does not mean
that every card really has one). bt848 cards can't have a Subsystem that every card really has one). bt848 cards can't have a Subsystem

View File

@ -61,8 +61,8 @@ line for your board. The important fields are these two:
struct tvcard struct tvcard
{ {
[ ... ] [ ... ]
u32 gpiomask; u32 gpiomask;
u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */
}; };
gpiomask specifies which pins are used to control the audio mux chip. gpiomask specifies which pins are used to control the audio mux chip.
@ -126,11 +126,11 @@ muxsel - video mux, input->registervalue mapping
pll - same as pll= insmod option pll - same as pll= insmod option
tuner_type - same as tuner= insmod option tuner_type - same as tuner= insmod option
*_modulename - hint whenever some card needs this or that audio *_modulename - hint whenever some card needs this or that audio
module loaded to work properly. module loaded to work properly.
has_radio - whenever this TV card has a radio tuner. has_radio - whenever this TV card has a radio tuner.
no_msp34xx - "1" disables loading of msp3400.o module no_msp34xx - "1" disables loading of msp3400.o module
no_tda9875 - "1" disables loading of tda9875.o module no_tda9875 - "1" disables loading of tda9875.o module
needs_tvaudio - set to "1" to load tvaudio.o module needs_tvaudio - set to "1" to load tvaudio.o module
If some config item is specified both from the tvcards array and as If some config item is specified both from the tvcards array and as
insmod option, the insmod option takes precedence. insmod option, the insmod option takes precedence.
@ -144,5 +144,5 @@ Good luck,
PS: If you have a new working entry, mail it to me. PS: If you have a new working entry, mail it to me.
-- --
Gerd Knorr <kraxel@bytesex.org> Gerd Knorr <kraxel@bytesex.org>

View File

@ -21,7 +21,7 @@ SAMSUNG Tuner identification: (e.g. TCPM9091PD27)
J= NTSC-Japan J= NTSC-Japan
L= Secam LL L= Secam LL
M= BG+I+DK M= BG+I+DK
N= NTSC N= NTSC
Q= BG+I+DK+LL Q= BG+I+DK+LL
[89]: ? [89]: ?
[125]: [125]:
@ -96,7 +96,7 @@ LG Innotek Tuner:
TADC-H002F: NTSC (L,175/410?; 2-B, C-W+11, W+12-69) TADC-H002F: NTSC (L,175/410?; 2-B, C-W+11, W+12-69)
TADC-M201D: PAL D/K+B/G+I (L,143/425) (sound control at I2C address 0xc8) TADC-M201D: PAL D/K+B/G+I (L,143/425) (sound control at I2C address 0xc8)
TADC-T003F: NTSC Taiwan (L,175/410?; 2-B, C-W+11, W+12-69) TADC-T003F: NTSC Taiwan (L,175/410?; 2-B, C-W+11, W+12-69)
Suffix: Suffix:
P= Standard phono female socket P= Standard phono female socket
D= IEC female socket D= IEC female socket
F= F-connector F= F-connector

View File

@ -10,33 +10,33 @@ bt878:
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
saa7134: saa7134:
/* LifeView FlyTV Platinum FM (LR214WF) */ /* LifeView FlyTV Platinum FM (LR214WF) */
/* "Peter Missel <peter.missel@onlinehome.de> */ /* "Peter Missel <peter.missel@onlinehome.de> */
.name = "LifeView FlyTV Platinum FM", .name = "LifeView FlyTV Platinum FM",
/* GP27 MDT2005 PB4 pin 10 */ /* GP27 MDT2005 PB4 pin 10 */
/* GP26 MDT2005 PB3 pin 9 */ /* GP26 MDT2005 PB3 pin 9 */
/* GP25 MDT2005 PB2 pin 8 */ /* GP25 MDT2005 PB2 pin 8 */
/* GP23 MDT2005 PB1 pin 7 */ /* GP23 MDT2005 PB1 pin 7 */
/* GP22 MDT2005 PB0 pin 6 */ /* GP22 MDT2005 PB0 pin 6 */
/* GP21 MDT2005 PB5 pin 11 */ /* GP21 MDT2005 PB5 pin 11 */
/* GP20 MDT2005 PB6 pin 12 */ /* GP20 MDT2005 PB6 pin 12 */
/* GP19 MDT2005 PB7 pin 13 */ /* GP19 MDT2005 PB7 pin 13 */
/* nc MDT2005 PA3 pin 2 */ /* nc MDT2005 PA3 pin 2 */
/* Remote MDT2005 PA2 pin 1 */ /* Remote MDT2005 PA2 pin 1 */
/* GP18 MDT2005 PA1 pin 18 */ /* GP18 MDT2005 PA1 pin 18 */
/* nc MDT2005 PA0 pin 17 strap low */ /* nc MDT2005 PA0 pin 17 strap low */
/* GP17 Strap "GP7"=High */ /* GP17 Strap "GP7"=High */
/* GP16 Strap "GP6"=High /* GP16 Strap "GP6"=High
0=Radio 1=TV 0=Radio 1=TV
Drives SA630D ENCH1 and HEF4052 A1 pins Drives SA630D ENCH1 and HEF4052 A1 pins
to do FM radio through SIF input */ to do FM radio through SIF input */
/* GP15 nc */ /* GP15 nc */
/* GP14 nc */ /* GP14 nc */
/* GP13 nc */ /* GP13 nc */
/* GP12 Strap "GP5" = High */ /* GP12 Strap "GP5" = High */
/* GP11 Strap "GP4" = High */ /* GP11 Strap "GP4" = High */
/* GP10 Strap "GP3" = High */ /* GP10 Strap "GP3" = High */
/* GP09 Strap "GP2" = Low */ /* GP09 Strap "GP2" = Low */
/* GP08 Strap "GP1" = Low */ /* GP08 Strap "GP1" = Low */
/* GP07.00 nc */ /* GP07.00 nc */

View File

@ -1330,6 +1330,24 @@ M: john.ronciak@intel.com
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
P: Yi Zhu
M: yi.zhu@intel.com
P: James Ketrenos
M: jketreno@linux.intel.com
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
W: http://ipw2100.sourceforge.net
S: Supported
INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT
P: Yi Zhu
M: yi.zhu@intel.com
P: James Ketrenos
M: jketreno@linux.intel.com
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
W: http://ipw2200.sourceforge.net
S: Supported
IOC3 DRIVER IOC3 DRIVER
P: Ralf Baechle P: Ralf Baechle
M: ralf@linux-mips.org M: ralf@linux-mips.org

View File

@ -43,21 +43,17 @@
#include "proto.h" #include "proto.h"
#include "pci_impl.h" #include "pci_impl.h"
void default_idle(void)
{
barrier();
}
void void
cpu_idle(void) cpu_idle(void)
{ {
set_thread_flag(TIF_POLLING_NRFLAG);
while (1) { while (1) {
void (*idle)(void) = default_idle;
/* FIXME -- EV6 and LCA45 know how to power down /* FIXME -- EV6 and LCA45 know how to power down
the CPU. */ the CPU. */
while (!need_resched()) while (!need_resched())
idle(); cpu_relax();
schedule(); schedule();
} }
} }

View File

@ -324,7 +324,7 @@ menu "Kernel Features"
config SMP config SMP
bool "Symmetric Multi-Processing (EXPERIMENTAL)" bool "Symmetric Multi-Processing (EXPERIMENTAL)"
depends on EXPERIMENTAL && BROKEN #&& n depends on EXPERIMENTAL && REALVIEW_MPCORE
help help
This enables support for systems with more than one CPU. If you have This enables support for systems with more than one CPU. If you have
a system with only one CPU, like most personal computers, say N. If a system with only one CPU, like most personal computers, say N. If
@ -356,6 +356,16 @@ config HOTPLUG_CPU
Say Y here to experiment with turning CPUs off and on. CPUs Say Y here to experiment with turning CPUs off and on. CPUs
can be controlled through /sys/devices/system/cpu. can be controlled through /sys/devices/system/cpu.
config LOCAL_TIMERS
bool "Use local timer interrupts"
depends on SMP && REALVIEW_MPCORE
default y
help
Enable support for local timers on SMP platforms, rather then the
legacy IPI broadcast method. Local timers allows the system
accounting to be spread across the timer interval, preventing a
"thundering herd" at every timer tick.
config PREEMPT config PREEMPT
bool "Preemptible Kernel (EXPERIMENTAL)" bool "Preemptible Kernel (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
@ -585,7 +595,7 @@ config FPE_NWFPE
config FPE_NWFPE_XP config FPE_NWFPE_XP
bool "Support extended precision" bool "Support extended precision"
depends on FPE_NWFPE && !CPU_BIG_ENDIAN depends on FPE_NWFPE
help help
Say Y to include 80-bit support in the kernel floating-point Say Y to include 80-bit support in the kernel floating-point
emulator. Otherwise, only 32 and 64-bit support is compiled in. emulator. Otherwise, only 32 and 64-bit support is compiled in.

View File

@ -283,8 +283,14 @@ void flush_window(void)
putstr("."); putstr(".");
} }
#ifndef arch_error
#define arch_error(x)
#endif
static void error(char *x) static void error(char *x)
{ {
arch_error(x);
putstr("\n\n"); putstr("\n\n");
putstr(x); putstr(x);
putstr("\n\n -- System halted"); putstr("\n\n -- System halted");

View File

@ -19,12 +19,6 @@
#define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) #define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr)))
/* PCMCIA to Scoop linkage structures for pxa2xx_sharpsl.c
There is no easy way to link multiple scoop devices into one
single entity for the pxa2xx_pcmcia device */
int scoop_num;
struct scoop_pcmcia_dev *scoop_devs;
struct scoop_dev { struct scoop_dev {
void *base; void *base;
spinlock_t scoop_lock; spinlock_t scoop_lock;

View File

@ -9,6 +9,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/cryptohash.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/in6.h> #include <linux/in6.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
@ -126,6 +127,9 @@ EXPORT_SYMBOL(__put_user_2);
EXPORT_SYMBOL(__put_user_4); EXPORT_SYMBOL(__put_user_4);
EXPORT_SYMBOL(__put_user_8); EXPORT_SYMBOL(__put_user_8);
/* crypto hash */
EXPORT_SYMBOL(sha_transform);
/* gcc lib functions */ /* gcc lib functions */
EXPORT_SYMBOL(__ashldi3); EXPORT_SYMBOL(__ashldi3);
EXPORT_SYMBOL(__ashrdi3); EXPORT_SYMBOL(__ashrdi3);

View File

@ -47,6 +47,13 @@
movne r0, sp movne r0, sp
adrne lr, 1b adrne lr, 1b
bne do_IPI bne do_IPI
#ifdef CONFIG_LOCAL_TIMERS
test_for_ltirq r0, r6, r5, lr
movne r0, sp
adrne lr, 1b
bne do_local_timer
#endif
#endif #endif
.endm .endm

View File

@ -264,6 +264,7 @@ unlock:
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
show_ipi_list(p); show_ipi_list(p);
show_local_irqs(p);
#endif #endif
seq_printf(p, "Err: %10lu\n", irq_err_count); seq_printf(p, "Err: %10lu\n", irq_err_count);
} }
@ -995,7 +996,7 @@ void __init init_irq_proc(void)
struct proc_dir_entry *dir; struct proc_dir_entry *dir;
int irq; int irq;
dir = proc_mkdir("irq", 0); dir = proc_mkdir("irq", NULL);
if (!dir) if (!dir)
return; return;

View File

@ -86,12 +86,16 @@ EXPORT_SYMBOL(pm_power_off);
*/ */
void default_idle(void) void default_idle(void)
{ {
local_irq_disable(); if (hlt_counter)
if (!need_resched() && !hlt_counter) { cpu_relax();
timer_dyn_reprogram(); else {
arch_idle(); local_irq_disable();
if (!need_resched()) {
timer_dyn_reprogram();
arch_idle();
}
local_irq_enable();
} }
local_irq_enable();
} }
/* /*
@ -116,13 +120,13 @@ void cpu_idle(void)
if (!idle) if (!idle)
idle = default_idle; idle = default_idle;
preempt_disable();
leds_event(led_idle_start); leds_event(led_idle_start);
while (!need_resched()) while (!need_resched())
idle(); idle();
leds_event(led_idle_end); leds_event(led_idle_end);
preempt_enable(); preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }
@ -355,7 +359,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long stack_start,
struct thread_info *thread = p->thread_info; struct thread_info *thread = p->thread_info;
struct pt_regs *childregs; struct pt_regs *childregs;
childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_START_SP)) - 1; childregs = (void *)thread + THREAD_START_SP - sizeof(*regs);
*childregs = *regs; *childregs = *regs;
childregs->ARM_r0 = 0; childregs->ARM_r0 = 0;
childregs->ARM_sp = stack_start; childregs->ARM_sp = stack_start;

View File

@ -142,7 +142,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
ret = -EIO; ret = -EIO;
} }
secondary_data.stack = 0; secondary_data.stack = NULL;
secondary_data.pgdir = 0; secondary_data.pgdir = 0;
*pmd_offset(pgd, PHYS_OFFSET) = __pmd(0); *pmd_offset(pgd, PHYS_OFFSET) = __pmd(0);
@ -184,6 +184,11 @@ int __cpuexit __cpu_disable(void)
*/ */
migrate_irqs(); migrate_irqs();
/*
* Stop the local timer for this CPU.
*/
local_timer_stop(cpu);
/* /*
* Flush user cache and TLB mappings, and then remove this CPU * Flush user cache and TLB mappings, and then remove this CPU
* from the vm mask set of all processes. * from the vm mask set of all processes.
@ -251,7 +256,9 @@ void __cpuexit cpu_die(void)
asmlinkage void __cpuinit secondary_start_kernel(void) asmlinkage void __cpuinit secondary_start_kernel(void)
{ {
struct mm_struct *mm = &init_mm; struct mm_struct *mm = &init_mm;
unsigned int cpu = smp_processor_id(); unsigned int cpu;
cpu = smp_processor_id();
printk("CPU%u: Booted secondary processor\n", cpu); printk("CPU%u: Booted secondary processor\n", cpu);
@ -268,6 +275,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
local_flush_tlb_all(); local_flush_tlb_all();
cpu_init(); cpu_init();
preempt_disable();
/* /*
* Give the platform a chance to do its own initialisation. * Give the platform a chance to do its own initialisation.
@ -289,6 +297,11 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
*/ */
cpu_set(cpu, cpu_online_map); cpu_set(cpu, cpu_online_map);
/*
* Setup local timer for this CPU.
*/
local_timer_setup(cpu);
/* /*
* OK, it's off to the idle thread for us * OK, it's off to the idle thread for us
*/ */
@ -359,8 +372,8 @@ static void send_ipi_message(cpumask_t callmap, enum ipi_msg_type msg)
* You must not call this function with disabled interrupts, from a * You must not call this function with disabled interrupts, from a
* hardware interrupt handler, nor from a bottom half handler. * hardware interrupt handler, nor from a bottom half handler.
*/ */
int smp_call_function_on_cpu(void (*func)(void *info), void *info, int retry, static int smp_call_function_on_cpu(void (*func)(void *info), void *info,
int wait, cpumask_t callmap) int retry, int wait, cpumask_t callmap)
{ {
struct smp_call_struct data; struct smp_call_struct data;
unsigned long timeout; unsigned long timeout;
@ -454,6 +467,18 @@ void show_ipi_list(struct seq_file *p)
seq_putc(p, '\n'); seq_putc(p, '\n');
} }
void show_local_irqs(struct seq_file *p)
{
unsigned int cpu;
seq_printf(p, "LOC: ");
for_each_present_cpu(cpu)
seq_printf(p, "%10u ", irq_stat[cpu].local_timer_irqs);
seq_putc(p, '\n');
}
static void ipi_timer(struct pt_regs *regs) static void ipi_timer(struct pt_regs *regs)
{ {
int user = user_mode(regs); int user = user_mode(regs);
@ -464,6 +489,18 @@ static void ipi_timer(struct pt_regs *regs)
irq_exit(); irq_exit();
} }
#ifdef CONFIG_LOCAL_TIMERS
asmlinkage void do_local_timer(struct pt_regs *regs)
{
int cpu = smp_processor_id();
if (local_timer_ack()) {
irq_stat[cpu].local_timer_irqs++;
ipi_timer(regs);
}
}
#endif
/* /*
* ipi_call_function - handle IPI from smp_call_function() * ipi_call_function - handle IPI from smp_call_function()
* *
@ -515,7 +552,7 @@ static void ipi_cpu_stop(unsigned int cpu)
* *
* Bit 0 - Inter-processor function call * Bit 0 - Inter-processor function call
*/ */
void do_IPI(struct pt_regs *regs) asmlinkage void do_IPI(struct pt_regs *regs)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
struct ipi_data *ipi = &per_cpu(ipi_data, cpu); struct ipi_data *ipi = &per_cpu(ipi_data, cpu);

View File

@ -34,7 +34,7 @@
and r2, r0, #7 and r2, r0, #7
mov r3, #1 mov r3, #1
mov r3, r3, lsl r2 mov r3, r3, lsl r2
save_and_disable_irqs ip, r2 save_and_disable_irqs ip
ldrb r2, [r1, r0, lsr #3] ldrb r2, [r1, r0, lsr #3]
\instr r2, r2, r3 \instr r2, r2, r3
strb r2, [r1, r0, lsr #3] strb r2, [r1, r0, lsr #3]
@ -54,7 +54,7 @@
add r1, r1, r0, lsr #3 add r1, r1, r0, lsr #3
and r3, r0, #7 and r3, r0, #7
mov r0, #1 mov r0, #1
save_and_disable_irqs ip, r2 save_and_disable_irqs ip
ldrb r2, [r1] ldrb r2, [r1]
tst r2, r0, lsl r3 tst r2, r0, lsl r3
\instr r2, r2, r0, lsl r3 \instr r2, r2, r0, lsl r3

View File

@ -84,63 +84,54 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
.virtual = IXP2000_CAP_VIRT_BASE, .virtual = IXP2000_CAP_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_CAP_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_CAP_PHYS_BASE),
.length = IXP2000_CAP_SIZE, .length = IXP2000_CAP_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_INTCTL_VIRT_BASE, .virtual = IXP2000_INTCTL_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_INTCTL_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_INTCTL_PHYS_BASE),
.length = IXP2000_INTCTL_SIZE, .length = IXP2000_INTCTL_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_PCI_CREG_VIRT_BASE, .virtual = IXP2000_PCI_CREG_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_PCI_CREG_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_PCI_CREG_PHYS_BASE),
.length = IXP2000_PCI_CREG_SIZE, .length = IXP2000_PCI_CREG_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_PCI_CSR_VIRT_BASE, .virtual = IXP2000_PCI_CSR_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_PCI_CSR_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_PCI_CSR_PHYS_BASE),
.length = IXP2000_PCI_CSR_SIZE, .length = IXP2000_PCI_CSR_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_MSF_VIRT_BASE, .virtual = IXP2000_MSF_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_MSF_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_MSF_PHYS_BASE),
.length = IXP2000_MSF_SIZE, .length = IXP2000_MSF_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_PCI_IO_VIRT_BASE, .virtual = IXP2000_PCI_IO_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_PCI_IO_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_PCI_IO_PHYS_BASE),
.length = IXP2000_PCI_IO_SIZE, .length = IXP2000_PCI_IO_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_PCI_CFG0_VIRT_BASE, .virtual = IXP2000_PCI_CFG0_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_PCI_CFG0_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_PCI_CFG0_PHYS_BASE),
.length = IXP2000_PCI_CFG0_SIZE, .length = IXP2000_PCI_CFG0_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
}, { }, {
.virtual = IXP2000_PCI_CFG1_VIRT_BASE, .virtual = IXP2000_PCI_CFG1_VIRT_BASE,
.pfn = __phys_to_pfn(IXP2000_PCI_CFG1_PHYS_BASE), .pfn = __phys_to_pfn(IXP2000_PCI_CFG1_PHYS_BASE),
.length = IXP2000_PCI_CFG1_SIZE, .length = IXP2000_PCI_CFG1_SIZE,
.type = MT_DEVICE .type = MT_IXP2000_DEVICE,
} }
}; };
void __init ixp2000_map_io(void) void __init ixp2000_map_io(void)
{ {
extern unsigned int processor_id;
/* /*
* On IXP2400 CPUs we need to use MT_IXP2000_DEVICE for * On IXP2400 CPUs we need to use MT_IXP2000_DEVICE so that
* tweaking the PMDs so XCB=101. On IXP2800s we use the normal * XCB=101 (to avoid triggering erratum #66), and given that
* PMD flags. * this mode speeds up I/O accesses and we have write buffer
* flushes in the right places anyway, it doesn't hurt to use
* XCB=101 for all IXP2000s.
*/ */
if ((processor_id & 0xfffffff0) == 0x69054190) {
int i;
printk(KERN_INFO "Enabling IXP2400 erratum #66 workaround\n");
for(i=0;i<ARRAY_SIZE(ixp2000_io_desc);i++)
ixp2000_io_desc[i].type = MT_IXP2000_DEVICE;
}
iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc)); iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
/* Set slowport to 8-bit mode. */ /* Set slowport to 8-bit mode. */

View File

@ -13,7 +13,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/version.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/hardware.h> #include <asm/hardware.h>

View File

@ -62,15 +62,6 @@ static struct scoop_config corgi_scoop_setup = {
.io_out = CORGI_SCOOP_IO_OUT, .io_out = CORGI_SCOOP_IO_OUT,
}; };
static struct scoop_pcmcia_dev corgi_pcmcia_scoop[] = {
{
.dev = &corgiscoop_device.dev,
.irq = CORGI_IRQ_GPIO_CF_IRQ,
.cd_irq = CORGI_IRQ_GPIO_CF_CD,
.cd_irq_str = "PCMCIA0 CD",
},
};
struct platform_device corgiscoop_device = { struct platform_device corgiscoop_device = {
.name = "sharp-scoop", .name = "sharp-scoop",
.id = -1, .id = -1,
@ -81,6 +72,44 @@ struct platform_device corgiscoop_device = {
.resource = corgi_scoop_resources, .resource = corgi_scoop_resources,
}; };
static void corgi_pcmcia_init(void)
{
/* Setup default state of GPIO outputs
before we enable them as outputs. */
GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) |
GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) |
GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO52_nPCE_1) |
GPIO_bit(GPIO53_nPCE_2);
pxa_gpio_mode(GPIO48_nPOE_MD);
pxa_gpio_mode(GPIO49_nPWE_MD);
pxa_gpio_mode(GPIO50_nPIOR_MD);
pxa_gpio_mode(GPIO51_nPIOW_MD);
pxa_gpio_mode(GPIO55_nPREG_MD);
pxa_gpio_mode(GPIO56_nPWAIT_MD);
pxa_gpio_mode(GPIO57_nIOIS16_MD);
pxa_gpio_mode(GPIO52_nPCE_1_MD);
pxa_gpio_mode(GPIO53_nPCE_2_MD);
pxa_gpio_mode(GPIO54_pSKTSEL_MD);
}
static struct scoop_pcmcia_dev corgi_pcmcia_scoop[] = {
{
.dev = &corgiscoop_device.dev,
.irq = CORGI_IRQ_GPIO_CF_IRQ,
.cd_irq = CORGI_IRQ_GPIO_CF_CD,
.cd_irq_str = "PCMCIA0 CD",
},
};
static struct scoop_pcmcia_config corgi_pcmcia_config = {
.devs = &corgi_pcmcia_scoop[0],
.num_devs = 1,
.pcmcia_init = corgi_pcmcia_init,
};
EXPORT_SYMBOL(corgiscoop_device);
/* /*
* Corgi SSP Device * Corgi SSP Device
@ -294,8 +323,7 @@ static void __init corgi_init(void)
pxa_set_mci_info(&corgi_mci_platform_data); pxa_set_mci_info(&corgi_mci_platform_data);
pxa_set_ficp_info(&corgi_ficp_platform_data); pxa_set_ficp_info(&corgi_ficp_platform_data);
scoop_num = 1; platform_scoop_config = &corgi_pcmcia_config;
scoop_devs = &corgi_pcmcia_scoop[0];
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
} }

View File

@ -65,6 +65,27 @@ struct platform_device poodle_scoop_device = {
.resource = poodle_scoop_resources, .resource = poodle_scoop_resources,
}; };
static void poodle_pcmcia_init(void)
{
/* Setup default state of GPIO outputs
before we enable them as outputs. */
GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) |
GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) |
GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO52_nPCE_1) |
GPIO_bit(GPIO53_nPCE_2);
pxa_gpio_mode(GPIO48_nPOE_MD);
pxa_gpio_mode(GPIO49_nPWE_MD);
pxa_gpio_mode(GPIO50_nPIOR_MD);
pxa_gpio_mode(GPIO51_nPIOW_MD);
pxa_gpio_mode(GPIO55_nPREG_MD);
pxa_gpio_mode(GPIO56_nPWAIT_MD);
pxa_gpio_mode(GPIO57_nIOIS16_MD);
pxa_gpio_mode(GPIO52_nPCE_1_MD);
pxa_gpio_mode(GPIO53_nPCE_2_MD);
pxa_gpio_mode(GPIO54_pSKTSEL_MD);
}
static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = { static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = {
{ {
.dev = &poodle_scoop_device.dev, .dev = &poodle_scoop_device.dev,
@ -74,6 +95,14 @@ static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = {
}, },
}; };
static struct scoop_pcmcia_config poodle_pcmcia_config = {
.devs = &poodle_pcmcia_scoop[0],
.num_devs = 1,
.pcmcia_init = poodle_pcmcia_init,
};
EXPORT_SYMBOL(poodle_scoop_device);
/* LoCoMo device */ /* LoCoMo device */
static struct resource locomo_resources[] = { static struct resource locomo_resources[] = {
@ -268,8 +297,7 @@ static void __init poodle_init(void)
pxa_set_mci_info(&poodle_mci_platform_data); pxa_set_mci_info(&poodle_mci_platform_data);
pxa_set_ficp_info(&poodle_ficp_platform_data); pxa_set_ficp_info(&poodle_ficp_platform_data);
scoop_num = 1; platform_scoop_config = &poodle_pcmcia_config;
scoop_devs = &poodle_pcmcia_scoop[0];
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
if (ret) { if (ret) {

View File

@ -104,6 +104,66 @@ struct platform_device spitzscoop2_device = {
.resource = spitz_scoop2_resources, .resource = spitz_scoop2_resources,
}; };
#define SPITZ_PWR_SD 0x01
#define SPITZ_PWR_CF 0x02
/* Power control is shared with between one of the CF slots and SD */
static void spitz_card_pwr_ctrl(int device, unsigned short new_cpr)
{
unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR);
if (new_cpr & 0x0007) {
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER);
if (!(cpr & 0x0002) && !(cpr & 0x0004))
mdelay(5);
if (device == SPITZ_PWR_CF)
cpr |= 0x0002;
if (device == SPITZ_PWR_SD)
cpr |= 0x0004;
write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
} else {
if (device == SPITZ_PWR_CF)
cpr &= ~0x0002;
if (device == SPITZ_PWR_SD)
cpr &= ~0x0004;
write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
if (!(cpr & 0x0002) && !(cpr & 0x0004)) {
mdelay(1);
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER);
}
}
}
static void spitz_pcmcia_init(void)
{
/* Setup default state of GPIO outputs
before we enable them as outputs. */
GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) |
GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) |
GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO54_nPCE_2);
GPSR(GPIO85_nPCE_1) = GPIO_bit(GPIO85_nPCE_1);
pxa_gpio_mode(GPIO48_nPOE_MD);
pxa_gpio_mode(GPIO49_nPWE_MD);
pxa_gpio_mode(GPIO50_nPIOR_MD);
pxa_gpio_mode(GPIO51_nPIOW_MD);
pxa_gpio_mode(GPIO55_nPREG_MD);
pxa_gpio_mode(GPIO56_nPWAIT_MD);
pxa_gpio_mode(GPIO57_nIOIS16_MD);
pxa_gpio_mode(GPIO85_nPCE_1_MD);
pxa_gpio_mode(GPIO54_nPCE_2_MD);
pxa_gpio_mode(GPIO104_pSKTSEL_MD);
}
static void spitz_pcmcia_pwr(struct device *scoop, unsigned short cpr, int nr)
{
/* Only need to override behaviour for slot 0 */
if (nr == 0)
spitz_card_pwr_ctrl(SPITZ_PWR_CF, cpr);
else
write_scoop_reg(scoop, SCOOP_CPR, cpr);
}
static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
{ {
.dev = &spitzscoop_device.dev, .dev = &spitzscoop_device.dev,
@ -117,6 +177,16 @@ static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
}, },
}; };
static struct scoop_pcmcia_config spitz_pcmcia_config = {
.devs = &spitz_pcmcia_scoop[0],
.num_devs = 2,
.pcmcia_init = spitz_pcmcia_init,
.power_ctrl = spitz_pcmcia_pwr,
};
EXPORT_SYMBOL(spitzscoop_device);
EXPORT_SYMBOL(spitzscoop2_device);
/* /*
* Spitz SSP Device * Spitz SSP Device
@ -235,27 +305,14 @@ static int spitz_mci_init(struct device *dev, irqreturn_t (*spitz_detect_int)(in
return 0; return 0;
} }
/* Power control is shared with one of the CF slots so we have a mess */
static void spitz_mci_setpower(struct device *dev, unsigned int vdd) static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
{ {
struct pxamci_platform_data* p_d = dev->platform_data; struct pxamci_platform_data* p_d = dev->platform_data;
unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR); if (( 1 << vdd) & p_d->ocr_mask)
spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0004);
if (( 1 << vdd) & p_d->ocr_mask) { else
/* printk(KERN_DEBUG "%s: on\n", __FUNCTION__); */ spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000);
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER);
mdelay(2);
write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | 0x04);
} else {
/* printk(KERN_DEBUG "%s: off\n", __FUNCTION__); */
write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr & ~0x04);
if (!(cpr | 0x02)) {
mdelay(1);
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER);
}
}
} }
static int spitz_mci_get_ro(struct device *dev) static int spitz_mci_get_ro(struct device *dev)
@ -351,8 +408,8 @@ static void __init common_init(void)
static void __init spitz_init(void) static void __init spitz_init(void)
{ {
scoop_num = 2; platform_scoop_config = &spitz_pcmcia_config;
scoop_devs = &spitz_pcmcia_scoop[0];
spitz_bl_machinfo.set_bl_intensity = spitz_bl_set_intensity; spitz_bl_machinfo.set_bl_intensity = spitz_bl_set_intensity;
common_init(); common_init();

View File

@ -132,11 +132,13 @@ static void __init pxa_timer_init(void)
tv.tv_sec = pxa_get_rtc_time(); tv.tv_sec = pxa_get_rtc_time();
do_settimeofday(&tv); do_settimeofday(&tv);
OSMR0 = 0; /* set initial match at 0 */ OIER = 0; /* disable any timer interrupts */
OSCR = LATCH*2; /* push OSCR out of the way */
OSMR0 = LATCH; /* set initial match */
OSSR = 0xf; /* clear status on all timers */ OSSR = 0xf; /* clear status on all timers */
setup_irq(IRQ_OST0, &pxa_timer_irq); setup_irq(IRQ_OST0, &pxa_timer_irq);
OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */ OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */
OSCR = 0; /* initialize free-running timer, force first match */ OSCR = 0; /* initialize free-running timer */
} }
#ifdef CONFIG_NO_IDLE_HZ #ifdef CONFIG_NO_IDLE_HZ

View File

@ -98,6 +98,9 @@ struct platform_device tosascoop_jc_device = {
.resource = tosa_scoop_jc_resources, .resource = tosa_scoop_jc_resources,
}; };
/*
* PCMCIA
*/
static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = { static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = {
{ {
.dev = &tosascoop_device.dev, .dev = &tosascoop_device.dev,
@ -111,16 +114,155 @@ static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = {
}, },
}; };
static void tosa_pcmcia_init(void)
{
/* Setup default state of GPIO outputs
before we enable them as outputs. */
GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) |
GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) |
GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO52_nPCE_1) |
GPIO_bit(GPIO53_nPCE_2);
pxa_gpio_mode(GPIO48_nPOE_MD);
pxa_gpio_mode(GPIO49_nPWE_MD);
pxa_gpio_mode(GPIO50_nPIOR_MD);
pxa_gpio_mode(GPIO51_nPIOW_MD);
pxa_gpio_mode(GPIO55_nPREG_MD);
pxa_gpio_mode(GPIO56_nPWAIT_MD);
pxa_gpio_mode(GPIO57_nIOIS16_MD);
pxa_gpio_mode(GPIO52_nPCE_1_MD);
pxa_gpio_mode(GPIO53_nPCE_2_MD);
pxa_gpio_mode(GPIO54_pSKTSEL_MD);
}
static struct scoop_pcmcia_config tosa_pcmcia_config = {
.devs = &tosa_pcmcia_scoop[0],
.num_devs = 2,
.pcmcia_init = tosa_pcmcia_init,
};
/*
* USB Device Controller
*/
static void tosa_udc_command(int cmd)
{
switch(cmd) {
case PXA2XX_UDC_CMD_CONNECT:
set_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_USB_PULLUP);
break;
case PXA2XX_UDC_CMD_DISCONNECT:
reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_USB_PULLUP);
break;
}
}
static int tosa_udc_is_connected(void)
{
return ((GPLR(TOSA_GPIO_USB_IN) & GPIO_bit(TOSA_GPIO_USB_IN)) == 0);
}
static struct pxa2xx_udc_mach_info udc_info __initdata = {
.udc_command = tosa_udc_command,
.udc_is_connected = tosa_udc_is_connected,
};
/*
* MMC/SD Device
*/
static struct pxamci_platform_data tosa_mci_platform_data;
static int tosa_mci_init(struct device *dev, irqreturn_t (*tosa_detect_int)(int, void *, struct pt_regs *), void *data)
{
int err;
/* setup GPIO for PXA25x MMC controller */
pxa_gpio_mode(GPIO6_MMCCLK_MD);
pxa_gpio_mode(GPIO8_MMCCS0_MD);
pxa_gpio_mode(TOSA_GPIO_nSD_DETECT | GPIO_IN);
tosa_mci_platform_data.detect_delay = msecs_to_jiffies(250);
err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int, SA_INTERRUPT,
"MMC/SD card detect", data);
if (err) {
printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
return -1;
}
set_irq_type(TOSA_IRQ_GPIO_nSD_DETECT, IRQT_BOTHEDGE);
return 0;
}
static void tosa_mci_setpower(struct device *dev, unsigned int vdd)
{
struct pxamci_platform_data* p_d = dev->platform_data;
if (( 1 << vdd) & p_d->ocr_mask) {
set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_PWR_ON);
} else {
reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_PWR_ON);
}
}
static int tosa_mci_get_ro(struct device *dev)
{
return (read_scoop_reg(&tosascoop_device.dev, SCOOP_GPWR)&TOSA_SCOOP_SD_WP);
}
static void tosa_mci_exit(struct device *dev, void *data)
{
free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data);
}
static struct pxamci_platform_data tosa_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
.init = tosa_mci_init,
.get_ro = tosa_mci_get_ro,
.setpower = tosa_mci_setpower,
.exit = tosa_mci_exit,
};
/*
* Irda
*/
static void tosa_irda_transceiver_mode(struct device *dev, int mode)
{
if (mode & IR_OFF) {
reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_IR_POWERDWN);
pxa_gpio_mode(GPIO47_STTXD|GPIO_DFLT_LOW);
pxa_gpio_mode(GPIO47_STTXD|GPIO_OUT);
} else {
pxa_gpio_mode(GPIO47_STTXD_MD);
set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_IR_POWERDWN);
}
}
static struct pxaficp_platform_data tosa_ficp_platform_data = {
.transceiver_cap = IR_SIRMODE | IR_OFF,
.transceiver_mode = tosa_irda_transceiver_mode,
};
/*
* Tosa Keyboard
*/
static struct platform_device tosakbd_device = {
.name = "tosa-keyboard",
.id = -1,
};
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&tosascoop_device, &tosascoop_device,
&tosascoop_jc_device, &tosascoop_jc_device,
&tosakbd_device,
}; };
static void __init tosa_init(void) static void __init tosa_init(void)
{ {
pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN); pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN);
pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN); pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN);
pxa_gpio_mode(TOSA_GPIO_USB_IN | GPIO_IN);
/* setup sleep mode values */ /* setup sleep mode values */
PWER = 0x00000002; PWER = 0x00000002;
@ -131,13 +273,15 @@ static void __init tosa_init(void)
PGSR2 = 0x00014000; PGSR2 = 0x00014000;
PCFR |= PCFR_OPDE; PCFR |= PCFR_OPDE;
// enable batt_fault /* enable batt_fault */
PMCR = 0x01; PMCR = 0x01;
platform_add_devices(devices, ARRAY_SIZE(devices)); pxa_set_mci_info(&tosa_mci_platform_data);
pxa_set_udc_info(&udc_info);
pxa_set_ficp_info(&tosa_ficp_platform_data);
platform_scoop_config = &tosa_pcmcia_config;
scoop_num = 2; platform_add_devices(devices, ARRAY_SIZE(devices));
scoop_devs = &tosa_pcmcia_scoop[0];
} }
static void __init fixup_tosa(struct machine_desc *desc, static void __init fixup_tosa(struct machine_desc *desc,

View File

@ -8,4 +8,13 @@ config MACH_REALVIEW_EB
help help
Include support for the ARM(R) RealView Emulation Baseboard platform. Include support for the ARM(R) RealView Emulation Baseboard platform.
config REALVIEW_MPCORE
bool "Support MPcore tile"
depends on MACH_REALVIEW_EB
help
Enable support for the MPCore tile on the Realview platform.
Since there are device address and interrupt differences, a
kernel built with this option enabled is not compatible with
other tiles.
endmenu endmenu

View File

@ -4,3 +4,6 @@
obj-y := core.o clock.o obj-y := core.o clock.o
obj-$(CONFIG_MACH_REALVIEW_EB) += realview_eb.o obj-$(CONFIG_MACH_REALVIEW_EB) += realview_eb.o
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o

View File

@ -550,6 +550,11 @@ static irqreturn_t realview_timer_interrupt(int irq, void *dev_id, struct pt_reg
timer_tick(regs); timer_tick(regs);
#if defined(CONFIG_SMP) && !defined(CONFIG_LOCAL_TIMERS)
smp_send_timer();
update_process_times(user_mode(regs));
#endif
write_sequnlock(&xtime_lock); write_sequnlock(&xtime_lock);
return IRQ_HANDLED; return IRQ_HANDLED;

View File

@ -23,6 +23,7 @@
#define __ASM_ARCH_REALVIEW_H #define __ASM_ARCH_REALVIEW_H
#include <asm/hardware/amba.h> #include <asm/hardware/amba.h>
#include <asm/leds.h>
#include <asm/io.h> #include <asm/io.h>
#define __io_address(n) __io(IO_ADDRESS(n)) #define __io_address(n) __io(IO_ADDRESS(n))

View File

@ -0,0 +1,39 @@
/*
* linux/arch/arm/mach-realview/headsmp.S
*
* Copyright (c) 2003 ARM Limited
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/linkage.h>
#include <linux/init.h>
__INIT
/*
* Realview specific entry point for secondary CPUs. This provides
* a "holding pen" into which all secondary cores are held until we're
* ready for them to initialise.
*/
ENTRY(realview_secondary_startup)
mrc p15, 0, r0, c0, c0, 5
and r0, r0, #15
adr r4, 1f
ldmia r4, {r5, r6}
sub r4, r4, r5
add r6, r6, r4
pen: ldr r7, [r6]
cmp r7, r0
bne pen
/*
* we've been released from the holding pen: secondary_stack
* should now contain the SVC stack for this core
*/
b secondary_startup
1: .long .
.long pen_release

View File

@ -0,0 +1,138 @@
/*
* linux/arch/arm/mach-realview/hotplug.c
*
* Copyright (C) 2002 ARM Ltd.
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
#include <linux/completion.h>
extern volatile int pen_release;
static DECLARE_COMPLETION(cpu_killed);
static inline void cpu_enter_lowpower(void)
{
unsigned int v;
asm volatile( "mcr p15, 0, %1, c7, c14, 0\n"
" mcr p15, 0, %1, c7, c5, 0\n"
" mcr p15, 0, %1, c7, c10, 4\n"
/*
* Turn off coherency
*/
" mrc p15, 0, %0, c1, c0, 1\n"
" bic %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
" mrc p15, 0, %0, c1, c0, 0\n"
" bic %0, %0, #0x04\n"
" mcr p15, 0, %0, c1, c0, 0\n"
: "=&r" (v)
: "r" (0)
: "cc");
}
static inline void cpu_leave_lowpower(void)
{
unsigned int v;
asm volatile( "mrc p15, 0, %0, c1, c0, 0\n"
" orr %0, %0, #0x04\n"
" mcr p15, 0, %0, c1, c0, 0\n"
" mrc p15, 0, %0, c1, c0, 1\n"
" orr %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
: "=&r" (v)
:
: "cc");
}
static inline void platform_do_lowpower(unsigned int cpu)
{
/*
* there is no power-control hardware on this platform, so all
* we can do is put the core into WFI; this is safe as the calling
* code will have already disabled interrupts
*/
for (;;) {
/*
* here's the WFI
*/
asm(".word 0xe320f003\n"
:
:
: "memory", "cc");
if (pen_release == cpu) {
/*
* OK, proper wakeup, we're done
*/
break;
}
/*
* getting here, means that we have come out of WFI without
* having been woken up - this shouldn't happen
*
* The trouble is, letting people know about this is not really
* possible, since we are currently running incoherently, and
* therefore cannot safely call printk() or anything else
*/
#ifdef DEBUG
printk("CPU%u: spurious wakeup call\n", cpu);
#endif
}
}
int platform_cpu_kill(unsigned int cpu)
{
return wait_for_completion_timeout(&cpu_killed, 5000);
}
/*
* platform-specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
void platform_cpu_die(unsigned int cpu)
{
#ifdef DEBUG
unsigned int this_cpu = hard_smp_processor_id();
if (cpu != this_cpu) {
printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
this_cpu, cpu);
BUG();
}
#endif
printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
complete(&cpu_killed);
/*
* we're ready for shutdown now, so do it
*/
cpu_enter_lowpower();
platform_do_lowpower(cpu);
/*
* bring this CPU back into the world of cache
* coherency, and then restore interrupts
*/
cpu_leave_lowpower();
}
int mach_cpu_disable(unsigned int cpu)
{
/*
* we don't allow CPU 0 to be shutdown (it is still too special
* e.g. clock tick interrupts)
*/
return cpu == 0 ? -EPERM : 0;
}

View File

@ -0,0 +1,130 @@
/*
* linux/arch/arm/mach-realview/localtimer.c
*
* Copyright (C) 2002 ARM Ltd.
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/smp.h>
#include <asm/mach/time.h>
#include <asm/hardware/arm_twd.h>
#include <asm/hardware/gic.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/irq.h>
#include "core.h"
#define TWD_BASE(cpu) (__io_address(REALVIEW_TWD_BASE) + \
((cpu) * REALVIEW_TWD_SIZE))
static unsigned long mpcore_timer_rate;
/*
* local_timer_ack: checks for a local timer interrupt.
*
* If a local timer interrupt has occured, acknowledge and return 1.
* Otherwise, return 0.
*/
int local_timer_ack(void)
{
void __iomem *base = TWD_BASE(smp_processor_id());
if (__raw_readl(base + TWD_TIMER_INTSTAT)) {
__raw_writel(1, base + TWD_TIMER_INTSTAT);
return 1;
}
return 0;
}
void __cpuinit local_timer_setup(unsigned int cpu)
{
void __iomem *base = TWD_BASE(cpu);
unsigned int load, offset;
u64 waitjiffies;
unsigned int count;
/*
* If this is the first time round, we need to work out how fast
* the timer ticks
*/
if (mpcore_timer_rate == 0) {
printk("Calibrating local timer... ");
/* Wait for a tick to start */
waitjiffies = get_jiffies_64() + 1;
while (get_jiffies_64() < waitjiffies)
udelay(10);
/* OK, now the tick has started, let's get the timer going */
waitjiffies += 5;
/* enable, no interrupt or reload */
__raw_writel(0x1, base + TWD_TIMER_CONTROL);
/* maximum value */
__raw_writel(0xFFFFFFFFU, base + TWD_TIMER_COUNTER);
while (get_jiffies_64() < waitjiffies)
udelay(10);
count = __raw_readl(base + TWD_TIMER_COUNTER);
mpcore_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
printk("%lu.%02luMHz.\n", mpcore_timer_rate / 1000000,
(mpcore_timer_rate / 100000) % 100);
}
load = mpcore_timer_rate / HZ;
__raw_writel(load, base + TWD_TIMER_LOAD);
__raw_writel(0x7, base + TWD_TIMER_CONTROL);
/*
* Now maneuver our local tick into the right part of the jiffy.
* Start by working out where within the tick our local timer
* interrupt should go.
*/
offset = ((mpcore_timer_rate / HZ) / (NR_CPUS + 1)) * (cpu + 1);
/*
* gettimeoffset() will return a number of us since the last tick.
* Convert this number of us to a local timer tick count.
* Be careful of integer overflow whilst keeping maximum precision.
*
* with HZ=100 and 1MHz (fpga) ~ 1GHz processor:
* load = 1 ~ 10,000
* mpcore_timer_rate/10000 = 100 ~ 100,000
*
* so the multiply value will be less than 10^9 always.
*/
load = (system_timer->offset() * (mpcore_timer_rate / 10000)) / 100;
/* Add on our offset to get the load value */
load = (load + offset) % (mpcore_timer_rate / HZ);
__raw_writel(load, base + TWD_TIMER_COUNTER);
/* Make sure our local interrupt controller has this enabled */
__raw_writel(1 << IRQ_LOCALTIMER,
__io_address(REALVIEW_GIC_DIST_BASE) + GIC_DIST_ENABLE_SET);
}
/*
* take a local timer down
*/
void __cpuexit local_timer_stop(unsigned int cpu)
{
__raw_writel(0, TWD_BASE(cpu) + TWD_TIMER_CONTROL);
}

View File

@ -0,0 +1,200 @@
/*
* linux/arch/arm/mach-realview/platsmp.c
*
* Copyright (C) 2002 ARM Ltd.
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/smp.h>
#include <asm/cacheflush.h>
#include <asm/hardware/arm_scu.h>
#include <asm/hardware.h>
#include "core.h"
extern void realview_secondary_startup(void);
/*
* control for which core is the next to come out of the secondary
* boot "holding pen"
*/
volatile int __cpuinitdata pen_release = -1;
static unsigned int __init get_core_count(void)
{
unsigned int ncores;
ncores = __raw_readl(__io_address(REALVIEW_MPCORE_SCU_BASE) + SCU_CONFIG);
return (ncores & 0x03) + 1;
}
static DEFINE_SPINLOCK(boot_lock);
void __cpuinit platform_secondary_init(unsigned int cpu)
{
/*
* the primary core may have used a "cross call" soft interrupt
* to get this processor out of WFI in the BootMonitor - make
* sure that we are no longer being sent this soft interrupt
*/
smp_cross_call_done(cpumask_of_cpu(cpu));
/*
* if any interrupts are already enabled for the primary
* core (e.g. timer irq), then they will not have been enabled
* for us: do so
*/
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
/*
* let the primary processor know we're out of the
* pen, then head off into the C entry point
*/
pen_release = -1;
/*
* Synchronise with the boot thread.
*/
spin_lock(&boot_lock);
spin_unlock(&boot_lock);
}
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
{
unsigned long timeout;
/*
* set synchronisation state between this boot processor
* and the secondary one
*/
spin_lock(&boot_lock);
/*
* The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release.
*
* Note that "pen_release" is the hardware CPU ID, whereas
* "cpu" is Linux's internal ID.
*/
pen_release = cpu;
flush_cache_all();
/*
* XXX
*
* This is a later addition to the booting protocol: the
* bootMonitor now puts secondary cores into WFI, so
* poke_milo() no longer gets the cores moving; we need
* to send a soft interrupt to wake the secondary core.
* Use smp_cross_call() for this, since there's little
* point duplicating the code here
*/
smp_cross_call(cpumask_of_cpu(cpu));
timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) {
if (pen_release == -1)
break;
udelay(10);
}
/*
* now the secondary core is starting up let it run its
* calibrations, then wait for it to finish
*/
spin_unlock(&boot_lock);
return pen_release != -1 ? -ENOSYS : 0;
}
static void __init poke_milo(void)
{
extern void secondary_startup(void);
/* nobody is to be released from the pen yet */
pen_release = -1;
/*
* write the address of secondary startup into the system-wide
* flags register, then clear the bottom two bits, which is what
* BootMonitor is waiting for
*/
#if 1
#define REALVIEW_SYS_FLAGSS_OFFSET 0x30
__raw_writel(virt_to_phys(realview_secondary_startup),
__io_address(REALVIEW_SYS_BASE) +
REALVIEW_SYS_FLAGSS_OFFSET);
#define REALVIEW_SYS_FLAGSC_OFFSET 0x34
__raw_writel(3,
__io_address(REALVIEW_SYS_BASE) +
REALVIEW_SYS_FLAGSC_OFFSET);
#endif
mb();
}
void __init smp_prepare_cpus(unsigned int max_cpus)
{
unsigned int ncores = get_core_count();
unsigned int cpu = smp_processor_id();
int i;
/* sanity check */
if (ncores == 0) {
printk(KERN_ERR
"Realview: strange CM count of 0? Default to 1\n");
ncores = 1;
}
if (ncores > NR_CPUS) {
printk(KERN_WARNING
"Realview: no. of cores (%d) greater than configured "
"maximum of %d - clipping\n",
ncores, NR_CPUS);
ncores = NR_CPUS;
}
smp_store_cpu_info(cpu);
/*
* are we trying to boot more cores than exist?
*/
if (max_cpus > ncores)
max_cpus = ncores;
/*
* Enable the local timer for primary CPU
*/
local_timer_setup(cpu);
/*
* Initialise the possible/present maps.
* cpu_possible_map describes the set of CPUs which may be present
* cpu_present_map describes the set of CPUs populated
*/
for (i = 0; i < max_cpus; i++) {
cpu_set(i, cpu_possible_map);
cpu_set(i, cpu_present_map);
}
/*
* Do we need any more CPUs? If so, then let them know where
* to start. Note that, on modern versions of MILO, the "poke"
* doesn't actually do anything until each individual core is
* sent a soft interrupt to get it out of WFI
*/
if (max_cpus > 1)
poke_milo();
}

View File

@ -136,6 +136,11 @@ static struct amba_device *amba_devs[] __initdata = {
static void __init gic_init_irq(void) static void __init gic_init_irq(void)
{ {
#ifdef CONFIG_REALVIEW_MPCORE
writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK));
writel(0x008003c0, __io_address(REALVIEW_SYS_BASE) + 0xd8);
writel(0x00000000, __io_address(REALVIEW_SYS_LOCK));
#endif
gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE)); gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE));
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE)); gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
} }

View File

@ -121,6 +121,14 @@ config S3C2410_BOOT_WATCHDOG
system resets depends on the value of PCLK. The timeout on an system resets depends on the value of PCLK. The timeout on an
200MHz s3c2410 should be about 30 seconds. 200MHz s3c2410 should be about 30 seconds.
config S3C2410_BOOT_ERROR_RESET
bool "S3C2410 Reboot on decompression error"
depends on ARCH_S3C2410
help
Say y here to use the watchdog to reset the system if the
kernel decompressor detects an error during decompression.
comment "S3C2410 Setup" comment "S3C2410 Setup"
config S3C2410_DMA config S3C2410_DMA

View File

@ -56,8 +56,16 @@
static struct map_desc anubis_iodesc[] __initdata = { static struct map_desc anubis_iodesc[] __initdata = {
/* ISA IO areas */ /* ISA IO areas */
{ (u32)S3C24XX_VA_ISA_BYTE, 0x0, SZ_16M, MT_DEVICE }, {
{ (u32)S3C24XX_VA_ISA_WORD, 0x0, SZ_16M, MT_DEVICE }, .virtual = (u32)S3C24XX_VA_ISA_BYTE,
.pfn = __phys_to_pfn(0x0),
.length = SZ_4M,
.type = MT_DEVICE
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(0x0),
.length = SZ_4M, MT_DEVICE
},
/* we could possibly compress the next set down into a set of smaller tables /* we could possibly compress the next set down into a set of smaller tables
* pagetables, but that would mean using an L2 section, and it still means * pagetables, but that would mean using an L2 section, and it still means
@ -66,16 +74,41 @@ static struct map_desc anubis_iodesc[] __initdata = {
/* CPLD control registers */ /* CPLD control registers */
{ (u32)ANUBIS_VA_CTRL1, ANUBIS_PA_CTRL1, SZ_4K, MT_DEVICE }, {
{ (u32)ANUBIS_VA_CTRL2, ANUBIS_PA_CTRL2, SZ_4K, MT_DEVICE }, .virtual = (u32)ANUBIS_VA_CTRL1,
.pfn = __phys_to_pfn(ANUBIS_PA_CTRL1),
.length = SZ_4K,
.type = MT_DEVICE
}, {
.virtual = (u32)ANUBIS_VA_CTRL2,
.pfn = __phys_to_pfn(ANUBIS_PA_CTRL2),
.length = SZ_4K,
.type =MT_DEVICE
},
/* IDE drives */ /* IDE drives */
{ (u32)ANUBIS_IDEPRI, S3C2410_CS3, SZ_1M, MT_DEVICE }, {
{ (u32)ANUBIS_IDEPRIAUX, S3C2410_CS3+(1<<26), SZ_1M, MT_DEVICE }, .virtual = (u32)ANUBIS_IDEPRI,
.pfn = __phys_to_pfn(S3C2410_CS3),
{ (u32)ANUBIS_IDESEC, S3C2410_CS4, SZ_1M, MT_DEVICE }, .length = SZ_1M,
{ (u32)ANUBIS_IDESECAUX, S3C2410_CS4+(1<<26), SZ_1M, MT_DEVICE }, .type = MT_DEVICE
}, {
.virtual = (u32)ANUBIS_IDEPRIAUX,
.pfn = __phys_to_pfn(S3C2410_CS3+(1<<26)),
.length = SZ_1M,
.type = MT_DEVICE
}, {
.virtual = (u32)ANUBIS_IDESEC,
.pfn = __phys_to_pfn(S3C2410_CS4),
.length = SZ_1M,
.type = MT_DEVICE
}, {
.virtual = (u32)ANUBIS_IDESECAUX,
.pfn = __phys_to_pfn(S3C2410_CS4+(1<<26)),
.length = SZ_1M,
.type = MT_DEVICE
},
}; };
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK

View File

@ -89,32 +89,63 @@
/* macros to modify the physical addresses for io space */ /* macros to modify the physical addresses for io space */
#define PA_CS2(item) ((item) + S3C2410_CS2) #define PA_CS2(item) (__phys_to_pfn((item) + S3C2410_CS2))
#define PA_CS3(item) ((item) + S3C2410_CS3) #define PA_CS3(item) (__phys_to_pfn((item) + S3C2410_CS3))
#define PA_CS4(item) ((item) + S3C2410_CS4) #define PA_CS4(item) (__phys_to_pfn((item) + S3C2410_CS4))
#define PA_CS5(item) ((item) + S3C2410_CS5) #define PA_CS5(item) (__phys_to_pfn((item) + S3C2410_CS5))
static struct map_desc bast_iodesc[] __initdata = { static struct map_desc bast_iodesc[] __initdata = {
/* ISA IO areas */ /* ISA IO areas */
{
{ (u32)S3C24XX_VA_ISA_BYTE, PA_CS2(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, .virtual = (u32)S3C24XX_VA_ISA_BYTE,
{ (u32)S3C24XX_VA_ISA_WORD, PA_CS3(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, .pfn = PA_CS2(BAST_PA_ISAIO),
.length = SZ_16M,
/* we could possibly compress the next set down into a set of smaller tables .type = MT_DEVICE,
* pagetables, but that would mean using an L2 section, and it still means }, {
* we cannot actually feed the same register to an LDR due to 16K spacing .virtual = (u32)S3C24XX_VA_ISA_WORD,
*/ .pfn = PA_CS3(BAST_PA_ISAIO),
.length = SZ_16M,
.type = MT_DEVICE,
},
/* bast CPLD control registers, and external interrupt controls */ /* bast CPLD control registers, and external interrupt controls */
{ (u32)BAST_VA_CTRL1, BAST_PA_CTRL1, SZ_1M, MT_DEVICE }, {
{ (u32)BAST_VA_CTRL2, BAST_PA_CTRL2, SZ_1M, MT_DEVICE }, .virtual = (u32)BAST_VA_CTRL1,
{ (u32)BAST_VA_CTRL3, BAST_PA_CTRL3, SZ_1M, MT_DEVICE }, .pfn = __phys_to_pfn(BAST_PA_CTRL1),
{ (u32)BAST_VA_CTRL4, BAST_PA_CTRL4, SZ_1M, MT_DEVICE }, .length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)BAST_VA_CTRL2,
.pfn = __phys_to_pfn(BAST_PA_CTRL2),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)BAST_VA_CTRL3,
.pfn = __phys_to_pfn(BAST_PA_CTRL3),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)BAST_VA_CTRL4,
.pfn = __phys_to_pfn(BAST_PA_CTRL4),
.length = SZ_1M,
.type = MT_DEVICE,
},
/* PC104 IRQ mux */ /* PC104 IRQ mux */
{ (u32)BAST_VA_PC104_IRQREQ, BAST_PA_PC104_IRQREQ, SZ_1M, MT_DEVICE }, {
{ (u32)BAST_VA_PC104_IRQRAW, BAST_PA_PC104_IRQRAW, SZ_1M, MT_DEVICE }, .virtual = (u32)BAST_VA_PC104_IRQREQ,
{ (u32)BAST_VA_PC104_IRQMASK, BAST_PA_PC104_IRQMASK, SZ_1M, MT_DEVICE }, .pfn = __phys_to_pfn(BAST_PA_PC104_IRQREQ),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)BAST_VA_PC104_IRQRAW,
.pfn = __phys_to_pfn(BAST_PA_PC104_IRQRAW),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)BAST_VA_PC104_IRQMASK,
.pfn = __phys_to_pfn(BAST_PA_PC104_IRQMASK),
.length = SZ_1M,
.type = MT_DEVICE,
},
/* peripheral space... one for each of fast/slow/byte/16bit */ /* peripheral space... one for each of fast/slow/byte/16bit */
/* note, ide is only decoded in word space, even though some registers /* note, ide is only decoded in word space, even though some registers

View File

@ -56,8 +56,17 @@
static struct map_desc rx3715_iodesc[] __initdata = { static struct map_desc rx3715_iodesc[] __initdata = {
/* dump ISA space somewhere unused */ /* dump ISA space somewhere unused */
{ (u32)S3C24XX_VA_ISA_WORD, S3C2410_CS3, SZ_16M, MT_DEVICE }, {
{ (u32)S3C24XX_VA_ISA_BYTE, S3C2410_CS3, SZ_16M, MT_DEVICE }, .virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(S3C2410_CS3),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
.pfn = __phys_to_pfn(S3C2410_CS3),
.length = SZ_1M,
.type = MT_DEVICE,
},
}; };

View File

@ -58,8 +58,27 @@
static struct map_desc smdk2440_iodesc[] __initdata = { static struct map_desc smdk2440_iodesc[] __initdata = {
/* ISA IO Space map (memory space selected by A24) */ /* ISA IO Space map (memory space selected by A24) */
{ (u32)S3C24XX_VA_ISA_WORD, S3C2410_CS2, SZ_16M, MT_DEVICE }, {
{ (u32)S3C24XX_VA_ISA_BYTE, S3C2410_CS2, SZ_16M, MT_DEVICE }, .virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
.length = SZ_4M,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
.length = SZ_4M,
.type = MT_DEVICE,
}
}; };
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK

View File

@ -74,27 +74,47 @@
/* macros to modify the physical addresses for io space */ /* macros to modify the physical addresses for io space */
#define PA_CS2(item) ((item) + S3C2410_CS2) #define PA_CS2(item) (__phys_to_pfn((item) + S3C2410_CS2))
#define PA_CS3(item) ((item) + S3C2410_CS3) #define PA_CS3(item) (__phys_to_pfn((item) + S3C2410_CS3))
#define PA_CS4(item) ((item) + S3C2410_CS4) #define PA_CS4(item) (__phys_to_pfn((item) + S3C2410_CS4))
#define PA_CS5(item) ((item) + S3C2410_CS5) #define PA_CS5(item) (__phys_to_pfn((item) + S3C2410_CS5))
static struct map_desc vr1000_iodesc[] __initdata = { static struct map_desc vr1000_iodesc[] __initdata = {
/* ISA IO areas */ /* ISA IO areas */
{
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
.pfn = PA_CS2(BAST_PA_ISAIO),
.length = SZ_16M,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = PA_CS3(BAST_PA_ISAIO),
.length = SZ_16M,
.type = MT_DEVICE,
},
{ (u32)S3C24XX_VA_ISA_BYTE, PA_CS2(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, /* CPLD control registers, and external interrupt controls */
{ (u32)S3C24XX_VA_ISA_WORD, PA_CS3(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, {
.virtual = (u32)VR1000_VA_CTRL1,
/* we could possibly compress the next set down into a set of smaller tables .pfn = __phys_to_pfn(VR1000_PA_CTRL1),
* pagetables, but that would mean using an L2 section, and it still means .length = SZ_1M,
* we cannot actually feed the same register to an LDR due to 16K spacing .type = MT_DEVICE,
*/ }, {
.virtual = (u32)VR1000_VA_CTRL2,
/* bast CPLD control registers, and external interrupt controls */ .pfn = __phys_to_pfn(VR1000_PA_CTRL2),
{ (u32)VR1000_VA_CTRL1, VR1000_PA_CTRL1, SZ_1M, MT_DEVICE }, .length = SZ_1M,
{ (u32)VR1000_VA_CTRL2, VR1000_PA_CTRL2, SZ_1M, MT_DEVICE }, .type = MT_DEVICE,
{ (u32)VR1000_VA_CTRL3, VR1000_PA_CTRL3, SZ_1M, MT_DEVICE }, }, {
{ (u32)VR1000_VA_CTRL4, VR1000_PA_CTRL4, SZ_1M, MT_DEVICE }, .virtual = (u32)VR1000_VA_CTRL3,
.pfn = __phys_to_pfn(VR1000_PA_CTRL3),
.length = SZ_1M,
.type = MT_DEVICE,
}, {
.virtual = (u32)VR1000_VA_CTRL4,
.pfn = __phys_to_pfn(VR1000_PA_CTRL4),
.length = SZ_1M,
.type = MT_DEVICE,
},
/* peripheral space... one for each of fast/slow/byte/16bit */ /* peripheral space... one for each of fast/slow/byte/16bit */
/* note, ide is only decoded in word space, even though some registers /* note, ide is only decoded in word space, even though some registers

View File

@ -124,11 +124,13 @@ static void __init sa1100_timer_init(void)
tv.tv_sec = sa1100_get_rtc_time(); tv.tv_sec = sa1100_get_rtc_time();
do_settimeofday(&tv); do_settimeofday(&tv);
OSMR0 = 0; /* set initial match at 0 */ OIER = 0; /* disable any timer interrupts */
OSCR = LATCH*2; /* push OSCR out of the way */
OSMR0 = LATCH; /* set initial match */
OSSR = 0xf; /* clear status on all timers */ OSSR = 0xf; /* clear status on all timers */
setup_irq(IRQ_OST0, &sa1100_timer_irq); setup_irq(IRQ_OST0, &sa1100_timer_irq);
OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */ OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */
OSCR = 0; /* initialize free-running timer, force first match */ OSCR = 0; /* initialize free-running timer */
} }
#ifdef CONFIG_NO_IDLE_HZ #ifdef CONFIG_NO_IDLE_HZ

View File

@ -354,7 +354,7 @@ void __init build_mem_type_table(void)
{ {
struct cachepolicy *cp; struct cachepolicy *cp;
unsigned int cr = get_cr(); unsigned int cr = get_cr();
unsigned int user_pgprot; unsigned int user_pgprot, kern_pgprot;
int cpu_arch = cpu_architecture(); int cpu_arch = cpu_architecture();
int i; int i;
@ -381,7 +381,7 @@ void __init build_mem_type_table(void)
} }
cp = &cache_policies[cachepolicy]; cp = &cache_policies[cachepolicy];
user_pgprot = cp->pte; kern_pgprot = user_pgprot = cp->pte;
/* /*
* ARMv6 and above have extended page tables. * ARMv6 and above have extended page tables.
@ -393,6 +393,7 @@ void __init build_mem_type_table(void)
*/ */
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4; mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4; mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
/* /*
* Mark cache clean areas and XIP ROM read only * Mark cache clean areas and XIP ROM read only
* from SVC mode and no access from userspace. * from SVC mode and no access from userspace.
@ -412,32 +413,47 @@ void __init build_mem_type_table(void)
* (iow, non-global) * (iow, non-global)
*/ */
user_pgprot |= L_PTE_ASID; user_pgprot |= L_PTE_ASID;
#ifdef CONFIG_SMP
/*
* Mark memory with the "shared" attribute for SMP systems
*/
user_pgprot |= L_PTE_SHARED;
kern_pgprot |= L_PTE_SHARED;
mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S;
#endif
} }
for (i = 0; i < 16; i++) {
unsigned long v = pgprot_val(protection_map[i]);
v = (v & ~(L_PTE_BUFFERABLE|L_PTE_CACHEABLE)) | user_pgprot;
protection_map[i] = __pgprot(v);
}
mem_types[MT_LOW_VECTORS].prot_pte |= kern_pgprot;
mem_types[MT_HIGH_VECTORS].prot_pte |= kern_pgprot;
if (cpu_arch >= CPU_ARCH_ARMv5) { if (cpu_arch >= CPU_ARCH_ARMv5) {
mem_types[MT_LOW_VECTORS].prot_pte |= cp->pte & PTE_CACHEABLE; #ifndef CONFIG_SMP
mem_types[MT_HIGH_VECTORS].prot_pte |= cp->pte & PTE_CACHEABLE; /*
* Only use write-through for non-SMP systems
*/
mem_types[MT_LOW_VECTORS].prot_pte &= ~L_PTE_BUFFERABLE;
mem_types[MT_HIGH_VECTORS].prot_pte &= ~L_PTE_BUFFERABLE;
#endif
} else { } else {
mem_types[MT_LOW_VECTORS].prot_pte |= cp->pte;
mem_types[MT_HIGH_VECTORS].prot_pte |= cp->pte;
mem_types[MT_MINICLEAN].prot_sect &= ~PMD_SECT_TEX(1); mem_types[MT_MINICLEAN].prot_sect &= ~PMD_SECT_TEX(1);
} }
pgprot_kernel = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG |
L_PTE_DIRTY | L_PTE_WRITE |
L_PTE_EXEC | kern_pgprot);
mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask; mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask;
mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask;
mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd; mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd;
mem_types[MT_ROM].prot_sect |= cp->pmd; mem_types[MT_ROM].prot_sect |= cp->pmd;
for (i = 0; i < 16; i++) {
unsigned long v = pgprot_val(protection_map[i]);
v = (v & ~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot;
protection_map[i] = __pgprot(v);
}
pgprot_kernel = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG |
L_PTE_DIRTY | L_PTE_WRITE |
L_PTE_EXEC | cp->pte);
switch (cp->pmd) { switch (cp->pmd) {
case PMD_SECT_WT: case PMD_SECT_WT:
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WT; mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WT;

View File

@ -12,6 +12,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/assembler.h> #include <asm/assembler.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/hardware/arm_scu.h>
#include <asm/procinfo.h> #include <asm/procinfo.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
@ -112,6 +113,9 @@ ENTRY(cpu_v6_dcache_clean_area)
ENTRY(cpu_v6_switch_mm) ENTRY(cpu_v6_switch_mm)
mov r2, #0 mov r2, #0
ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id
#ifdef CONFIG_SMP
orr r0, r0, #2 @ set shared pgtable
#endif
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
mcr p15, 0, r2, c7, c10, 4 @ drain write buffer mcr p15, 0, r2, c7, c10, 4 @ drain write buffer
mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
@ -140,7 +144,7 @@ ENTRY(cpu_v6_switch_mm)
ENTRY(cpu_v6_set_pte) ENTRY(cpu_v6_set_pte)
str r1, [r0], #-2048 @ linux version str r1, [r0], #-2048 @ linux version
bic r2, r1, #0x000007f0 bic r2, r1, #0x000003f0
bic r2, r2, #0x00000003 bic r2, r2, #0x00000003
orr r2, r2, #PTE_EXT_AP0 | 2 orr r2, r2, #PTE_EXT_AP0 | 2
@ -191,6 +195,23 @@ cpu_v6_name:
* - cache type register is implemented * - cache type register is implemented
*/ */
__v6_setup: __v6_setup:
#ifdef CONFIG_SMP
/* Set up the SCU on core 0 only */
mrc p15, 0, r0, c0, c0, 5 @ CPU core number
ands r0, r0, #15
moveq r0, #0x10000000 @ SCU_BASE
orreq r0, r0, #0x00100000
ldreq r5, [r0, #SCU_CTRL]
orreq r5, r5, #1
streq r5, [r0, #SCU_CTRL]
#ifndef CONFIG_CPU_DCACHE_DISABLE
mrc p15, 0, r0, c1, c0, 1 @ Enable SMP/nAMP mode
orr r0, r0, #0x20
mcr p15, 0, r0, c1, c0, 1
#endif
#endif
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache
mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
@ -198,6 +219,9 @@ __v6_setup:
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs
mcr p15, 0, r0, c2, c0, 2 @ TTB control register mcr p15, 0, r0, c2, c0, 2 @ TTB control register
#ifdef CONFIG_SMP
orr r4, r4, #2 @ set shared pgtable
#endif
mcr p15, 0, r4, c2, c0, 1 @ load TTB1 mcr p15, 0, r4, c2, c0, 1 @ load TTB1
#ifdef CONFIG_VFP #ifdef CONFIG_VFP
mrc p15, 0, r0, c1, c0, 2 mrc p15, 0, r0, c1, c0, 2

View File

@ -60,7 +60,7 @@ typedef union tagFPREG {
#ifdef CONFIG_FPE_NWFPE_XP #ifdef CONFIG_FPE_NWFPE_XP
floatx80 fExtended; floatx80 fExtended;
#else #else
int padding[3]; u32 padding[3];
#endif #endif
} FPREG; } FPREG;

View File

@ -59,8 +59,13 @@ static inline void loadExtended(const unsigned int Fn, const unsigned int __user
p = (unsigned int *) &fpa11->fpreg[Fn].fExtended; p = (unsigned int *) &fpa11->fpreg[Fn].fExtended;
fpa11->fType[Fn] = typeExtended; fpa11->fType[Fn] = typeExtended;
get_user(p[0], &pMem[0]); /* sign & exponent */ get_user(p[0], &pMem[0]); /* sign & exponent */
#ifdef __ARMEB__
get_user(p[1], &pMem[1]); /* ms bits */
get_user(p[2], &pMem[2]); /* ls bits */
#else
get_user(p[1], &pMem[2]); /* ls bits */ get_user(p[1], &pMem[2]); /* ls bits */
get_user(p[2], &pMem[1]); /* ms bits */ get_user(p[2], &pMem[1]); /* ms bits */
#endif
} }
#endif #endif
@ -177,8 +182,13 @@ static inline void storeExtended(const unsigned int Fn, unsigned int __user *pMe
} }
put_user(val.i[0], &pMem[0]); /* sign & exp */ put_user(val.i[0], &pMem[0]); /* sign & exp */
#ifdef __ARMEB__
put_user(val.i[1], &pMem[1]); /* msw */
put_user(val.i[2], &pMem[2]);
#else
put_user(val.i[1], &pMem[2]); put_user(val.i[1], &pMem[2]);
put_user(val.i[2], &pMem[1]); /* msw */ put_user(val.i[2], &pMem[1]); /* msw */
#endif
} }
#endif #endif

View File

@ -29,14 +29,14 @@
#ifdef CONFIG_FPE_NWFPE_XP #ifdef CONFIG_FPE_NWFPE_XP
const floatx80 floatx80Constant[] = { const floatx80 floatx80Constant[] = {
{0x0000, 0x0000000000000000ULL}, /* extended 0.0 */ { .high = 0x0000, .low = 0x0000000000000000ULL},/* extended 0.0 */
{0x3fff, 0x8000000000000000ULL}, /* extended 1.0 */ { .high = 0x3fff, .low = 0x8000000000000000ULL},/* extended 1.0 */
{0x4000, 0x8000000000000000ULL}, /* extended 2.0 */ { .high = 0x4000, .low = 0x8000000000000000ULL},/* extended 2.0 */
{0x4000, 0xc000000000000000ULL}, /* extended 3.0 */ { .high = 0x4000, .low = 0xc000000000000000ULL},/* extended 3.0 */
{0x4001, 0x8000000000000000ULL}, /* extended 4.0 */ { .high = 0x4001, .low = 0x8000000000000000ULL},/* extended 4.0 */
{0x4001, 0xa000000000000000ULL}, /* extended 5.0 */ { .high = 0x4001, .low = 0xa000000000000000ULL},/* extended 5.0 */
{0x3ffe, 0x8000000000000000ULL}, /* extended 0.5 */ { .high = 0x3ffe, .low = 0x8000000000000000ULL},/* extended 0.5 */
{0x4002, 0xa000000000000000ULL} /* extended 10.0 */ { .high = 0x4002, .low = 0xa000000000000000ULL},/* extended 10.0 */
}; };
#endif #endif

View File

@ -332,6 +332,7 @@ static floatx80 commonNaNToFloatx80( commonNaNT a )
z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 ); z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 );
z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF; z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF;
z.__padding = 0;
return z; return z;
} }

View File

@ -531,6 +531,7 @@ INLINE floatx80 packFloatx80( flag zSign, int32 zExp, bits64 zSig )
z.low = zSig; z.low = zSig;
z.high = ( ( (bits16) zSign )<<15 ) + zExp; z.high = ( ( (bits16) zSign )<<15 ) + zExp;
z.__padding = 0;
return z; return z;
} }
@ -2831,6 +2832,7 @@ static floatx80 subFloatx80Sigs( struct roundingData *roundData, floatx80 a, flo
roundData->exception |= float_flag_invalid; roundData->exception |= float_flag_invalid;
z.low = floatx80_default_nan_low; z.low = floatx80_default_nan_low;
z.high = floatx80_default_nan_high; z.high = floatx80_default_nan_high;
z.__padding = 0;
return z; return z;
} }
if ( aExp == 0 ) { if ( aExp == 0 ) {
@ -2950,6 +2952,7 @@ floatx80 floatx80_mul( struct roundingData *roundData, floatx80 a, floatx80 b )
roundData->exception |= float_flag_invalid; roundData->exception |= float_flag_invalid;
z.low = floatx80_default_nan_low; z.low = floatx80_default_nan_low;
z.high = floatx80_default_nan_high; z.high = floatx80_default_nan_high;
z.__padding = 0;
return z; return z;
} }
return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
@ -3015,6 +3018,7 @@ floatx80 floatx80_div( struct roundingData *roundData, floatx80 a, floatx80 b )
roundData->exception |= float_flag_invalid; roundData->exception |= float_flag_invalid;
z.low = floatx80_default_nan_low; z.low = floatx80_default_nan_low;
z.high = floatx80_default_nan_high; z.high = floatx80_default_nan_high;
z.__padding = 0;
return z; return z;
} }
roundData->exception |= float_flag_divbyzero; roundData->exception |= float_flag_divbyzero;
@ -3093,6 +3097,7 @@ floatx80 floatx80_rem( struct roundingData *roundData, floatx80 a, floatx80 b )
roundData->exception |= float_flag_invalid; roundData->exception |= float_flag_invalid;
z.low = floatx80_default_nan_low; z.low = floatx80_default_nan_low;
z.high = floatx80_default_nan_high; z.high = floatx80_default_nan_high;
z.__padding = 0;
return z; return z;
} }
normalizeFloatx80Subnormal( bSig, &bExp, &bSig ); normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
@ -3184,6 +3189,7 @@ floatx80 floatx80_sqrt( struct roundingData *roundData, floatx80 a )
roundData->exception |= float_flag_invalid; roundData->exception |= float_flag_invalid;
z.low = floatx80_default_nan_low; z.low = floatx80_default_nan_low;
z.high = floatx80_default_nan_high; z.high = floatx80_default_nan_high;
z.__padding = 0;
return z; return z;
} }
if ( aExp == 0 ) { if ( aExp == 0 ) {

View File

@ -51,11 +51,17 @@ input or output the `floatx80' type will be defined.
Software IEC/IEEE floating-point types. Software IEC/IEEE floating-point types.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
*/ */
typedef unsigned long int float32; typedef u32 float32;
typedef unsigned long long float64; typedef u64 float64;
typedef struct { typedef struct {
unsigned short high; #ifdef __ARMEB__
unsigned long long low; u16 __padding;
u16 high;
#else
u16 high;
u16 __padding;
#endif
u64 low;
} floatx80; } floatx80;
/* /*

View File

@ -25,7 +25,6 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>

View File

@ -74,15 +74,13 @@ __setup("hlt", hlt_setup);
void cpu_idle(void) void cpu_idle(void)
{ {
/* endless idle loop with no priority at all */ /* endless idle loop with no priority at all */
preempt_disable();
while (1) { while (1) {
while (!need_resched()) { while (!need_resched())
local_irq_disable(); cpu_relax();
if (!need_resched() && !hlt_counter) preempt_enable_no_resched();
local_irq_enable(); schedule();
} preempt_disable();
} }
schedule();
} }
static char reboot_mode = 'h'; static char reboot_mode = 'h';

View File

@ -19,7 +19,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>

View File

@ -112,7 +112,6 @@
#include <asm/rtc.h> #include <asm/rtc.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/version.h>
#include <asm/arch/svinto.h> #include <asm/arch/svinto.h>
#include <asm/fasttimer.h> #include <asm/fasttimer.h>

View File

@ -14,7 +14,6 @@
* *
*/ */
#include <linux/version.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>

View File

@ -18,7 +18,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>

View File

@ -161,6 +161,7 @@ void __init smp_callin(void)
REG_WR(intr_vect, irq_regs[cpu], rw_mask, vect_mask); REG_WR(intr_vect, irq_regs[cpu], rw_mask, vect_mask);
unmask_irq(IPI_INTR_VECT); unmask_irq(IPI_INTR_VECT);
unmask_irq(TIMER_INTR_VECT); unmask_irq(TIMER_INTR_VECT);
preempt_disable();
local_irq_enable(); local_irq_enable();
cpu_set(cpu, cpu_online_map); cpu_set(cpu, cpu_online_map);

View File

@ -218,7 +218,9 @@ void cpu_idle (void)
idle = default_idle; idle = default_idle;
idle(); idle();
} }
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }

View File

@ -77,16 +77,20 @@ void (*idle)(void) = core_sleep_idle;
*/ */
void cpu_idle(void) void cpu_idle(void)
{ {
int cpu = smp_processor_id();
/* endless idle loop with no priority at all */ /* endless idle loop with no priority at all */
while (1) { while (1) {
while (!need_resched()) { while (!need_resched()) {
irq_stat[smp_processor_id()].idle_timestamp = jiffies; irq_stat[cpu].idle_timestamp = jiffies;
if (!frv_dma_inprogress && idle) if (!frv_dma_inprogress && idle)
idle(); idle();
} }
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }

View File

@ -53,22 +53,18 @@ asmlinkage void ret_from_fork(void);
#if !defined(CONFIG_H8300H_SIM) && !defined(CONFIG_H8S_SIM) #if !defined(CONFIG_H8300H_SIM) && !defined(CONFIG_H8S_SIM)
void default_idle(void) void default_idle(void)
{ {
while(1) { local_irq_disable();
if (!need_resched()) { if (!need_resched()) {
local_irq_enable(); local_irq_enable();
__asm__("sleep"); /* XXX: race here! What if need_resched() gets set now? */
local_irq_disable(); __asm__("sleep");
} } else
schedule(); local_irq_enable();
}
} }
#else #else
void default_idle(void) void default_idle(void)
{ {
while(1) { cpu_relax();
if (need_resched())
schedule();
}
} }
#endif #endif
void (*idle)(void) = default_idle; void (*idle)(void) = default_idle;
@ -81,7 +77,13 @@ void (*idle)(void) = default_idle;
*/ */
void cpu_idle(void) void cpu_idle(void)
{ {
idle(); while (1) {
while (!need_resched())
idle();
preempt_enable_no_resched();
schedule();
preempt_disable();
}
} }
void machine_restart(char * __unused) void machine_restart(char * __unused)

View File

@ -769,8 +769,26 @@ static int set_system_power_state(u_short state)
static int apm_do_idle(void) static int apm_do_idle(void)
{ {
u32 eax; u32 eax;
u8 ret = 0;
int idled = 0;
int polling;
if (apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax)) { polling = test_thread_flag(TIF_POLLING_NRFLAG);
if (polling) {
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb__after_clear_bit();
}
if (!need_resched()) {
idled = 1;
ret = apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax);
}
if (polling)
set_thread_flag(TIF_POLLING_NRFLAG);
if (!idled)
return 0;
if (ret) {
static unsigned long t; static unsigned long t;
/* This always fails on some SMP boards running UP kernels. /* This always fails on some SMP boards running UP kernels.

View File

@ -377,10 +377,9 @@ acpi_cpufreq_cpu_init (
arg0.buffer.length = 12; arg0.buffer.length = 12;
arg0.buffer.pointer = (u8 *) arg0_buf; arg0.buffer.pointer = (u8 *) arg0_buf;
data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
if (!data) if (!data)
return (-ENOMEM); return (-ENOMEM);
memset(data, 0, sizeof(struct cpufreq_acpi_io));
acpi_io_data[cpu] = data; acpi_io_data[cpu] = data;

View File

@ -171,10 +171,9 @@ static int get_ranges (unsigned char *pst)
unsigned int speed; unsigned int speed;
u8 fid, vid; u8 fid, vid;
powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) * (number_scales + 1)), GFP_KERNEL); powernow_table = kzalloc((sizeof(struct cpufreq_frequency_table) * (number_scales + 1)), GFP_KERNEL);
if (!powernow_table) if (!powernow_table)
return -ENOMEM; return -ENOMEM;
memset(powernow_table, 0, (sizeof(struct cpufreq_frequency_table) * (number_scales + 1)));
for (j=0 ; j < number_scales; j++) { for (j=0 ; j < number_scales; j++) {
fid = *pst++; fid = *pst++;
@ -305,16 +304,13 @@ static int powernow_acpi_init(void)
goto err0; goto err0;
} }
acpi_processor_perf = kmalloc(sizeof(struct acpi_processor_performance), acpi_processor_perf = kzalloc(sizeof(struct acpi_processor_performance),
GFP_KERNEL); GFP_KERNEL);
if (!acpi_processor_perf) { if (!acpi_processor_perf) {
retval = -ENOMEM; retval = -ENOMEM;
goto err0; goto err0;
} }
memset(acpi_processor_perf, 0, sizeof(struct acpi_processor_performance));
if (acpi_processor_register_performance(acpi_processor_perf, 0)) { if (acpi_processor_register_performance(acpi_processor_perf, 0)) {
retval = -EIO; retval = -EIO;
goto err1; goto err1;
@ -337,14 +333,12 @@ static int powernow_acpi_init(void)
goto err2; goto err2;
} }
powernow_table = kmalloc((number_scales + 1) * (sizeof(struct cpufreq_frequency_table)), GFP_KERNEL); powernow_table = kzalloc((number_scales + 1) * (sizeof(struct cpufreq_frequency_table)), GFP_KERNEL);
if (!powernow_table) { if (!powernow_table) {
retval = -ENOMEM; retval = -ENOMEM;
goto err2; goto err2;
} }
memset(powernow_table, 0, ((number_scales + 1) * sizeof(struct cpufreq_frequency_table)));
pc.val = (unsigned long) acpi_processor_perf->states[0].control; pc.val = (unsigned long) acpi_processor_perf->states[0].control;
for (i = 0; i < number_scales; i++) { for (i = 0; i < number_scales; i++) {
u8 fid, vid; u8 fid, vid;

View File

@ -462,7 +462,6 @@ static int check_supported_cpu(unsigned int cpu)
oldmask = current->cpus_allowed; oldmask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu)); set_cpus_allowed(current, cpumask_of_cpu(cpu));
schedule();
if (smp_processor_id() != cpu) { if (smp_processor_id() != cpu) {
printk(KERN_ERR "limiting to cpu %u failed\n", cpu); printk(KERN_ERR "limiting to cpu %u failed\n", cpu);
@ -497,9 +496,7 @@ static int check_supported_cpu(unsigned int cpu)
out: out:
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
schedule();
return rc; return rc;
} }
static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid) static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid)
@ -913,7 +910,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
/* only run on specific CPU from here on */ /* only run on specific CPU from here on */
oldmask = current->cpus_allowed; oldmask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(pol->cpu)); set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
schedule();
if (smp_processor_id() != pol->cpu) { if (smp_processor_id() != pol->cpu) {
printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu); printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
@ -968,8 +964,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
err_out: err_out:
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
schedule();
return ret; return ret;
} }
@ -991,12 +985,11 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
if (!check_supported_cpu(pol->cpu)) if (!check_supported_cpu(pol->cpu))
return -ENODEV; return -ENODEV;
data = kmalloc(sizeof(struct powernow_k8_data), GFP_KERNEL); data = kzalloc(sizeof(struct powernow_k8_data), GFP_KERNEL);
if (!data) { if (!data) {
printk(KERN_ERR PFX "unable to alloc powernow_k8_data"); printk(KERN_ERR PFX "unable to alloc powernow_k8_data");
return -ENOMEM; return -ENOMEM;
} }
memset(data,0,sizeof(struct powernow_k8_data));
data->cpu = pol->cpu; data->cpu = pol->cpu;
@ -1026,7 +1019,6 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
/* only run on specific CPU from here on */ /* only run on specific CPU from here on */
oldmask = current->cpus_allowed; oldmask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(pol->cpu)); set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
schedule();
if (smp_processor_id() != pol->cpu) { if (smp_processor_id() != pol->cpu) {
printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu); printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
@ -1045,7 +1037,6 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
/* run on any CPU again */ /* run on any CPU again */
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
schedule();
pol->governor = CPUFREQ_DEFAULT_GOVERNOR; pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
pol->cpus = cpu_core_map[pol->cpu]; pol->cpus = cpu_core_map[pol->cpu];
@ -1080,7 +1071,6 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
err_out: err_out:
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
schedule();
powernow_k8_cpu_exit_acpi(data); powernow_k8_cpu_exit_acpi(data);
kfree(data); kfree(data);
@ -1116,17 +1106,14 @@ static unsigned int powernowk8_get (unsigned int cpu)
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
return 0; return 0;
} }
preempt_disable();
if (query_current_values_with_pending_wait(data)) if (query_current_values_with_pending_wait(data))
goto out; goto out;
khz = find_khz_freq_from_fid(data->currfid); khz = find_khz_freq_from_fid(data->currfid);
out: out:
preempt_enable_no_resched();
set_cpus_allowed(current, oldmask); set_cpus_allowed(current, oldmask);
return khz; return khz;
} }

View File

@ -423,12 +423,11 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
} }
} }
centrino_model[cpu] = kmalloc(sizeof(struct cpu_model), GFP_KERNEL); centrino_model[cpu] = kzalloc(sizeof(struct cpu_model), GFP_KERNEL);
if (!centrino_model[cpu]) { if (!centrino_model[cpu]) {
result = -ENOMEM; result = -ENOMEM;
goto err_unreg; goto err_unreg;
} }
memset(centrino_model[cpu], 0, sizeof(struct cpu_model));
centrino_model[cpu]->model_name=NULL; centrino_model[cpu]->model_name=NULL;
centrino_model[cpu]->max_freq = p.states[0].core_frequency * 1000; centrino_model[cpu]->max_freq = p.states[0].core_frequency * 1000;

View File

@ -99,14 +99,22 @@ EXPORT_SYMBOL(enable_hlt);
*/ */
void default_idle(void) void default_idle(void)
{ {
local_irq_enable();
if (!hlt_counter && boot_cpu_data.hlt_works_ok) { if (!hlt_counter && boot_cpu_data.hlt_works_ok) {
local_irq_disable(); clear_thread_flag(TIF_POLLING_NRFLAG);
if (!need_resched()) smp_mb__after_clear_bit();
safe_halt(); while (!need_resched()) {
else local_irq_disable();
local_irq_enable(); if (!need_resched())
safe_halt();
else
local_irq_enable();
}
set_thread_flag(TIF_POLLING_NRFLAG);
} else { } else {
cpu_relax(); while (!need_resched())
cpu_relax();
} }
} }
#ifdef CONFIG_APM_MODULE #ifdef CONFIG_APM_MODULE
@ -120,29 +128,14 @@ EXPORT_SYMBOL(default_idle);
*/ */
static void poll_idle (void) static void poll_idle (void)
{ {
int oldval;
local_irq_enable(); local_irq_enable();
/* asm volatile(
* Deal with another CPU just having chosen a thread to "2:"
* run here: "testl %0, %1;"
*/ "rep; nop;"
oldval = test_and_clear_thread_flag(TIF_NEED_RESCHED); "je 2b;"
: : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
if (!oldval) {
set_thread_flag(TIF_POLLING_NRFLAG);
asm volatile(
"2:"
"testl %0, %1;"
"rep; nop;"
"je 2b;"
: : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
clear_thread_flag(TIF_POLLING_NRFLAG);
} else {
set_need_resched();
}
} }
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
@ -179,7 +172,9 @@ static inline void play_dead(void)
*/ */
void cpu_idle(void) void cpu_idle(void)
{ {
int cpu = raw_smp_processor_id(); int cpu = smp_processor_id();
set_thread_flag(TIF_POLLING_NRFLAG);
/* endless idle loop with no priority at all */ /* endless idle loop with no priority at all */
while (1) { while (1) {
@ -201,7 +196,9 @@ void cpu_idle(void)
__get_cpu_var(irq_stat).idle_timestamp = jiffies; __get_cpu_var(irq_stat).idle_timestamp = jiffies;
idle(); idle();
} }
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }
@ -244,15 +241,12 @@ static void mwait_idle(void)
{ {
local_irq_enable(); local_irq_enable();
if (!need_resched()) { while (!need_resched()) {
set_thread_flag(TIF_POLLING_NRFLAG); __monitor((void *)&current_thread_info()->flags, 0, 0);
do { smp_mb();
__monitor((void *)&current_thread_info()->flags, 0, 0); if (need_resched())
if (need_resched()) break;
break; __mwait(0, 0);
__mwait(0, 0);
} while (!need_resched());
clear_thread_flag(TIF_POLLING_NRFLAG);
} }
} }

View File

@ -129,9 +129,7 @@ struct drive_info_struct { char dummy[32]; } drive_info;
EXPORT_SYMBOL(drive_info); EXPORT_SYMBOL(drive_info);
#endif #endif
struct screen_info screen_info; struct screen_info screen_info;
#ifdef CONFIG_VT
EXPORT_SYMBOL(screen_info); EXPORT_SYMBOL(screen_info);
#endif
struct apm_info apm_info; struct apm_info apm_info;
EXPORT_SYMBOL(apm_info); EXPORT_SYMBOL(apm_info);
struct sys_desc_table_struct { struct sys_desc_table_struct {

View File

@ -485,6 +485,7 @@ static void __devinit start_secondary(void *unused)
* things done here to the most necessary things. * things done here to the most necessary things.
*/ */
cpu_init(); cpu_init();
preempt_disable();
smp_callin(); smp_callin();
while (!cpu_isset(smp_processor_id(), smp_commenced_mask)) while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
rep_nop(); rep_nop();

View File

@ -191,6 +191,7 @@ config IOSAPIC
config IA64_SGI_SN_XP config IA64_SGI_SN_XP
tristate "Support communication between SGI SSIs" tristate "Support communication between SGI SSIs"
depends on IA64_GENERIC || IA64_SGI_SN2
select IA64_UNCACHED_ALLOCATOR select IA64_UNCACHED_ALLOCATOR
help help
An SGI machine can be divided into multiple Single System An SGI machine can be divided into multiple Single System

View File

@ -29,10 +29,8 @@
#define CODE #define CODE
#include "compat_ioctl.c" #include "compat_ioctl.c"
typedef int (* ioctl32_handler_t)(unsigned int, unsigned int, unsigned long, struct file *);
#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl) #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl)
#define HANDLE_IOCTL(cmd,handler) { (cmd), (ioctl32_handler_t)(handler), NULL }, #define HANDLE_IOCTL(cmd,handler) { (cmd), (ioctl_trans_handler_t)(handler), NULL },
#define IOCTL_TABLE_START \ #define IOCTL_TABLE_START \
struct ioctl_trans ioctl_start[] = { struct ioctl_trans ioctl_start[] = {
#define IOCTL_TABLE_END \ #define IOCTL_TABLE_END \

View File

@ -88,7 +88,7 @@ mca_page_isolate(unsigned long paddr)
if (!ia64_phys_addr_valid(paddr)) if (!ia64_phys_addr_valid(paddr))
return ISOLATE_NONE; return ISOLATE_NONE;
if (!pfn_valid(paddr)) if (!pfn_valid(paddr >> PAGE_SHIFT))
return ISOLATE_NONE; return ISOLATE_NONE;
/* convert physical address to physical page number */ /* convert physical address to physical page number */
@ -108,6 +108,7 @@ mca_page_isolate(unsigned long paddr)
return ISOLATE_NG; return ISOLATE_NG;
/* add attribute 'Reserved' and register the page */ /* add attribute 'Reserved' and register the page */
get_page(p);
SetPageReserved(p); SetPageReserved(p);
page_isolate[num_page_isolate++] = p; page_isolate[num_page_isolate++] = p;

View File

@ -197,11 +197,15 @@ void
default_idle (void) default_idle (void)
{ {
local_irq_enable(); local_irq_enable();
while (!need_resched()) while (!need_resched()) {
if (can_do_pal_halt) if (can_do_pal_halt) {
safe_halt(); local_irq_disable();
else if (!need_resched())
safe_halt();
local_irq_enable();
} else
cpu_relax(); cpu_relax();
}
} }
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
@ -263,16 +267,16 @@ void __attribute__((noreturn))
cpu_idle (void) cpu_idle (void)
{ {
void (*mark_idle)(int) = ia64_mark_idle; void (*mark_idle)(int) = ia64_mark_idle;
int cpu = smp_processor_id();
set_thread_flag(TIF_POLLING_NRFLAG);
/* endless idle loop with no priority at all */ /* endless idle loop with no priority at all */
while (1) { while (1) {
if (!need_resched()) {
void (*idle)(void);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (!need_resched())
min_xtp(); min_xtp();
#endif #endif
while (!need_resched()) {
void (*idle)(void);
if (__get_cpu_var(cpu_idle_state)) if (__get_cpu_var(cpu_idle_state))
__get_cpu_var(cpu_idle_state) = 0; __get_cpu_var(cpu_idle_state) = 0;
@ -284,17 +288,17 @@ cpu_idle (void)
if (!idle) if (!idle)
idle = default_idle; idle = default_idle;
(*idle)(); (*idle)();
} if (mark_idle)
(*mark_idle)(0);
if (mark_idle)
(*mark_idle)(0);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
normal_xtp(); normal_xtp();
#endif #endif
}
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
check_pgt_cache(); check_pgt_cache();
if (cpu_is_offline(smp_processor_id())) if (cpu_is_offline(cpu))
play_dead(); play_dead();
} }
} }

View File

@ -399,6 +399,7 @@ start_secondary (void *unused)
Dprintk("start_secondary: starting CPU 0x%x\n", hard_smp_processor_id()); Dprintk("start_secondary: starting CPU 0x%x\n", hard_smp_processor_id());
efi_map_pal_code(); efi_map_pal_code();
cpu_init(); cpu_init();
preempt_disable();
smp_callin(); smp_callin();
cpu_idle(); cpu_idle();

View File

@ -212,13 +212,13 @@ void pcibr_target_interrupt(struct sn_irq_info *sn_irq_info)
pdi_pcibus_info; pdi_pcibus_info;
/* Disable the device's IRQ */ /* Disable the device's IRQ */
pcireg_intr_enable_bit_clr(pcibus_info, bit); pcireg_intr_enable_bit_clr(pcibus_info, (1 << bit));
/* Change the device's IRQ */ /* Change the device's IRQ */
pcireg_intr_addr_addr_set(pcibus_info, bit, xtalk_addr); pcireg_intr_addr_addr_set(pcibus_info, bit, xtalk_addr);
/* Re-enable the device's IRQ */ /* Re-enable the device's IRQ */
pcireg_intr_enable_bit_set(pcibus_info, bit); pcireg_intr_enable_bit_set(pcibus_info, (1 << bit));
pcibr_force_interrupt(sn_irq_info); pcibr_force_interrupt(sn_irq_info);
} }

View File

@ -131,7 +131,7 @@ void pcireg_intr_enable_bit_clr(struct pcibus_info *pcibus_info, uint64_t bits)
__sn_clrq_relaxed(&ptr->tio.cp_int_enable, bits); __sn_clrq_relaxed(&ptr->tio.cp_int_enable, bits);
break; break;
case PCIBR_BRIDGETYPE_PIC: case PCIBR_BRIDGETYPE_PIC:
__sn_clrq_relaxed(&ptr->pic.p_int_enable, ~bits); __sn_clrq_relaxed(&ptr->pic.p_int_enable, bits);
break; break;
default: default:
panic panic

View File

@ -104,7 +104,9 @@ void cpu_idle (void)
idle(); idle();
} }
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }

View File

@ -426,6 +426,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
int __init start_secondary(void *unused) int __init start_secondary(void *unused)
{ {
cpu_init(); cpu_init();
preempt_disable();
smp_callin(); smp_callin();
while (!cpu_isset(smp_processor_id(), smp_commenced_mask)) while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
cpu_relax(); cpu_relax();

View File

@ -102,7 +102,9 @@ void cpu_idle(void)
while (1) { while (1) {
while (!need_resched()) while (!need_resched())
idle(); idle();
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
} }
} }

Some files were not shown because too many files have changed in this diff Show More