Merge ../linux-2.6
This commit is contained in:
commit
31e7f1ff3c
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -14,20 +14,76 @@ 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,7 +112,17 @@ 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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,9 +130,9 @@ The current release (1.0.0) supports the following features:
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
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
|
||||||
|
@ -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,11 +381,22 @@ 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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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]
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,7 +126,7 @@ 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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
18
MAINTAINERS
18
MAINTAINERS
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -218,7 +218,9 @@ void cpu_idle (void)
|
||||||
idle = default_idle;
|
idle = default_idle;
|
||||||
idle();
|
idle();
|
||||||
}
|
}
|
||||||
|
preempt_enable_no_resched();
|
||||||
schedule();
|
schedule();
|
||||||
|
preempt_disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 *)¤t_thread_info()->flags, 0, 0);
|
||||||
do {
|
smp_mb();
|
||||||
__monitor((void *)¤t_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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -104,7 +104,9 @@ void cpu_idle (void)
|
||||||
|
|
||||||
idle();
|
idle();
|
||||||
}
|
}
|
||||||
|
preempt_enable_no_resched();
|
||||||
schedule();
|
schedule();
|
||||||
|
preempt_disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,17 +111,6 @@ void __init plat_setup(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FB_E1356
|
|
||||||
if ((argptr = strstr(argptr, "video=")) == NULL) {
|
|
||||||
argptr = prom_getcmdline();
|
|
||||||
#ifdef CONFIG_MIPS_PB1000
|
|
||||||
strcat(argptr, " video=e1356fb:system:pb1000,mmunalign:1");
|
|
||||||
#else
|
|
||||||
strcat(argptr, " video=e1356fb:system:pb1500");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_FB_XPERT98
|
#ifdef CONFIG_FB_XPERT98
|
||||||
if ((argptr = strstr(argptr, "video=")) == NULL) {
|
if ((argptr = strstr(argptr, "video=")) == NULL) {
|
||||||
argptr = prom_getcmdline();
|
argptr = prom_getcmdline();
|
||||||
|
|
|
@ -658,7 +658,6 @@ CONFIG_FB=y
|
||||||
# CONFIG_FB_SMIVGX is not set
|
# CONFIG_FB_SMIVGX is not set
|
||||||
# CONFIG_FB_CYBLA is not set
|
# CONFIG_FB_CYBLA is not set
|
||||||
# CONFIG_FB_TRIDENT is not set
|
# CONFIG_FB_TRIDENT is not set
|
||||||
# CONFIG_FB_E1356 is not set
|
|
||||||
# CONFIG_FB_S1D13XXX is not set
|
# CONFIG_FB_S1D13XXX is not set
|
||||||
# CONFIG_FB_VIRTUAL is not set
|
# CONFIG_FB_VIRTUAL is not set
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue