Commit ad8dcf57 authored by Linus Torvalds's avatar Linus Torvalds

v2.4.12 -> v2.4.12.1

  - Trond Myklebust: deadlock checking in lockd server
  - Tim Waugh: fix up parport wrong #define
  - Christoph Hellwig: i2c update, ext2 cleanup
  - Al Viro: fix partition handling sanity check.
  - Trond Myklebust: make NFS use SLAB_NOFS, and not play games with PF_MEMALLOC
  - Ben Fennema: UDF update
  - Alan Cox: continued merging
  - Chris Mason: get /proc buffer memory sizes right after buf-in-page-cache
parent 4c7ed186
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
for Linux. for Linux.
2. My Linux environment 2. My Linux environment
Linux kernel: 2.4.0 / 2.2.18 Linux kernel: 2.4.7 / 2.2.19
pcmcia-cs: 3.1.24 pcmcia-cs: 3.1.27
gcc: gcc-2.95.2 gcc: gcc-2.95.4
PC card: I-O data PCSC-F (NinjaSCSI-3) PC card: I-O data PCSC-F (NinjaSCSI-3)
I-O data CBSC-II in 16 bit mode (NinjaSCSI-32Bi) I-O data CBSC-II in 16 bit mode (NinjaSCSI-32Bi)
SCSI device: I-O data CDPS-PX24 (CD-ROM drive) SCSI device: I-O data CDPS-PX24 (CD-ROM drive)
...@@ -55,6 +55,8 @@ $ tar zxvf cs-pcmcia-cs-3.x.x.tar.gz ...@@ -55,6 +55,8 @@ $ tar zxvf cs-pcmcia-cs-3.x.x.tar.gz
[4] Extract this driver's archive somewhere, and edit Makefile, then do make. [4] Extract this driver's archive somewhere, and edit Makefile, then do make.
$ tar -zxvf nsp_cs-x.x.tar.gz $ tar -zxvf nsp_cs-x.x.tar.gz
$ cd nsp_cs-x.x $ cd nsp_cs-x.x
$ emacs Makefile
...
$ make $ make
[5] Copy nsp_cs.o to suitable plase, like /lib/modules/<Kernel version>/pcmcia/ . [5] Copy nsp_cs.o to suitable plase, like /lib/modules/<Kernel version>/pcmcia/ .
...@@ -95,7 +97,7 @@ card "WorkBit NinjaSCSI-32Bi (16bit) / KME-4" ...@@ -95,7 +97,7 @@ card "WorkBit NinjaSCSI-32Bi (16bit) / KME-4"
bind "nsp_cs" bind "nsp_cs"
------------------------------------- -------------------------------------
[7] Boot (or reboot) pcmcia-cs. [7] Start (or restart) pcmcia-cs.
# /etc/rc.d/rc.pcmcia start (BSD style) # /etc/rc.d/rc.pcmcia start (BSD style)
or or
# /etc/init.d/pcmcia start (SYSV style) # /etc/init.d/pcmcia start (SYSV style)
...@@ -111,7 +113,8 @@ your computer, you encount some *BAD* error like disk crash. ...@@ -111,7 +113,8 @@ your computer, you encount some *BAD* error like disk crash.
your data. Please backup your data when you use this driver. your data. Please backup your data when you use this driver.
6. Known Bugs 6. Known Bugs
Some write error occurs when you use slow device. In 2.4 kernel, you can't use 640MB Optical disk. This error comes from
high level SCSI driver.
7. Testing 7. Testing
Please send me some reports(bug reports etc..) of this software. Please send me some reports(bug reports etc..) of this software.
...@@ -124,4 +127,4 @@ When you send report, please tell me these or more. ...@@ -124,4 +127,4 @@ When you send report, please tell me these or more.
See GPL. See GPL.
2001/02/01 yokota@netlab.is.tsukuba.ac.jp <YOKOTA Hiroshi> 2001/08/08 yokota@netlab.is.tsukuba.ac.jp <YOKOTA Hiroshi>
...@@ -162,7 +162,7 @@ Kernel entry (head-armv.S) ...@@ -162,7 +162,7 @@ Kernel entry (head-armv.S)
<description of your architecture> <description of your architecture>
Please follow this format - it is an automated system. You should Please follow this format - it is an automated system. You should
receive a reply within one day. receive a reply in short order.
--- ---
Russell King (26/01/2001) Russell King (26/01/2001)
ADS Bitsy Single Board Computer
(It is different from Bitsy(iPAQ) of Compaq)
For more details, contact Applied Data Systems or see
http://www.applieddata.net/products.html
The Linux support for this product has been provided by
Woojung Huh <whuh@applieddata.net>
Use 'make adsbitsy_config' before any 'make config'.
This will set up defaults for ADS Bitsy support.
The kernel zImage is linked to be loaded and executed at 0xc0400000.
Linux can be used with the ADS BootLoader that ships with the
newer rev boards. See their documentation on how to load Linux.
Supported peripherals:
- SA1100 LCD frame buffer (8/16bpp...sort of)
- SA1111 USB Master
- SA1100 serial port
- pcmcia, compact flash
- touchscreen(ucb1200)
- console on LCD screen
- serial ports (ttyS[0-2])
- ttyS0 is default for serial console
To do:
- everything else! :-)
Notes:
- The flash on board is divided into 3 partitions.
You should be careful to use flash on board.
It's partition is different from GraphicsClient Plus and GraphicsMaster
- 16bpp mode requires a different cable than what ships with the board.
Contact ADS or look through the manual to wire your own. Currently,
if you compile with 16bit mode support and switch into a lower bpp
mode, the timing is off so the image is corrupted. This will be
fixed soon.
Any contribution can be sent to nico@cam.org and will be greatly welcome!
ADS GraphicsMaster Single Board Computer
For more details, contact Applied Data Systems or see
http://www.applieddata.net/products.html
The original Linux support for this product has been provided by
Nicolas Pitre <nico@cam.org>. Continued development work by
Woojung Huh <whuh@applieddata.net>
Use 'make graphicsmaster_config' before any 'make config'.
This will set up defaults for GraphicsMaster support.
The kernel zImage is linked to be loaded and executed at 0xc0400000.
Linux can be used with the ADS BootLoader that ships with the
newer rev boards. See their documentation on how to load Linux.
Supported peripherals:
- SA1100 LCD frame buffer (8/16bpp...sort of)
- SA1111 USB Master
- on-board SMC 92C96 ethernet NIC
- SA1100 serial port
- flash memory access (MTD/JFFS)
- pcmcia, compact flash
- touchscreen(ucb1200)
- ps/2 keyboard
- console on LCD screen
- serial ports (ttyS[0-2])
- ttyS0 is default for serial console
- Smart I/O (ADC, keypad, digital inputs, etc)
See http://www.applieddata.com/developers/linux for IOCTL documentation
and example user space code. ps/2 keybd is multiplexed through this driver
To do:
- everything else! :-)
Notes:
- The flash on board is divided into 3 partitions. mtd0 is where
the zImage is stored. It's been marked as read-only to keep you
from blasting over the bootloader. :) mtd1 is
for the ramdisk.gz image. mtd2 is user flash space and can be
utilized for either JFFS or if you're feeling crazy, running ext2
on top of it. If you're not using the ADS bootloader, you're
welcome to blast over the mtd1 partition also.
- 16bpp mode requires a different cable than what ships with the board.
Contact ADS or look through the manual to wire your own. Currently,
if you compile with 16bit mode support and switch into a lower bpp
mode, the timing is off so the image is corrupted. This will be
fixed soon.
Any contribution can be sent to nico@cam.org and will be greatly welcome!
...@@ -2,7 +2,7 @@ Pangolin is a StrongARM 1110-based evaluation platform produced ...@@ -2,7 +2,7 @@ Pangolin is a StrongARM 1110-based evaluation platform produced
by Dialogue Technology (http://www.dialogue.com.tw/). by Dialogue Technology (http://www.dialogue.com.tw/).
It has EISA slots for ease of configuration with SDRAM/Flash It has EISA slots for ease of configuration with SDRAM/Flash
memory card, USB/Serial/Audio card, Compact Flash card, memory card, USB/Serial/Audio card, Compact Flash card,
and TFT-LCD card. PCMCIA/IDE card and TFT-LCD card.
To compile for Pangolin, you must issue the following commands: To compile for Pangolin, you must issue the following commands:
...@@ -18,3 +18,7 @@ Supported peripherals: ...@@ -18,3 +18,7 @@ Supported peripherals:
- UDA1341 sound driver - UDA1341 sound driver
- SA1100 LCD controller for 800x600 16bpp TFT-LCD - SA1100 LCD controller for 800x600 16bpp TFT-LCD
- MQ-200 driver for 800x600 16bpp TFT-LCD - MQ-200 driver for 800x600 16bpp TFT-LCD
- Penmount(touch panel) driver
- PCMCIA driver
- SMC91C94 LAN driver
- IDE driver (experimental)
...@@ -8,8 +8,9 @@ This driver is known to work with the following cards: ...@@ -8,8 +8,9 @@ This driver is known to work with the following cards:
* SA 5300 * SA 5300
* SA 5i * SA 5i
* SA 532 * SA 532
* SA 5312
If notes are not already created in the /dev/cciss directory If nodes are not already created in the /dev/cciss directory
# mkdev.cciss [ctlrs] # mkdev.cciss [ctlrs]
...@@ -47,3 +48,78 @@ The suggested device naming scheme is: ...@@ -47,3 +48,78 @@ The suggested device naming scheme is:
/dev/cciss/c1d1p1 Controller 1, disk 1, partition 1 /dev/cciss/c1d1p1 Controller 1, disk 1, partition 1
/dev/cciss/c1d1p2 Controller 1, disk 1, partition 2 /dev/cciss/c1d1p2 Controller 1, disk 1, partition 2
/dev/cciss/c1d1p3 Controller 1, disk 1, partition 3 /dev/cciss/c1d1p3 Controller 1, disk 1, partition 3
SCSI tape drive and medium changer support
------------------------------------------
SCSI sequential access devices and medium changer devices are supported and
appropriate device nodes are automatically created. (e.g.
/dev/st0, /dev/st1, etc. See the "st" man page for more details.)
You must enable "SCSI tape drive support for Smart Array 5xxx" and
"SCSI support" in your kernel configuration to be able to use SCSI
tape drives with your Smart Array 5xxx controller.
Additionally, note that the driver will not engage the SCSI core at init
time. The driver must be directed to dynamically engage the SCSI core via
the /proc filesystem entry which the "block" side of the driver creates as
/proc/driver/cciss/cciss* at runtime. This is because at driver init time,
the SCSI core may not yet be initialized (because the driver is a block
driver) and attempting to register it with the SCSI core in such a case
would cause a hang. This is best done via an initialization script
(typically in /etc/init.d, but could vary depending on distibution).
For example:
for x in /proc/driver/cciss/cciss[0-9]*
do
echo "engage scsi" > $x
done
Once the SCSI core is engaged by the driver, it cannot be disengaged
(except by unloading the driver, if it happens to be linked as a module.)
Note also that if no sequential access devices or medium changers are
detected, the SCSI core will not be engaged by the action of the above
script.
Hot plug support for SCSI tape drives
-------------------------------------
Hot plugging of SCSI tape drives is supported, with some caveats.
The cciss driver must be informed that changes to the SCSI bus
have been made, in addition to and prior to informing the the SCSI
mid layer. This may be done via the /proc filesystem. For example:
echo "rescan" > /proc/scsi/cciss0/1
This causes the adapter to query the adapter about changes to the
physical SCSI buses and/or fibre channel arbitrated loop and the
driver to make note of any new or removed sequential access devices
or medium changers. The driver will output messages indicating what
devices have been added or removed and the controller, bus, target and
lun used to address the device. Once this is done, the SCSI mid layer
can be informed of changes to the virtual SCSI bus which the driver
presents to it in the usual way. For example:
echo add-single-device 3 2 1 0 > /proc/scsi/scsi
to add a device on controller 3, bus 2, target 1, lun 0. Note that
the driver makes an effort to preserve the devices positions
in the virtual SCSI bus, so if you are only moving tape drives
around on the same adapter and not adding or removing tape drives
from the adapter, informing the SCSI mid layer may not be necessary.
Note that the naming convention of the /proc filesystem entries
contains a number in addition to the driver name. (E.g. "cciss0"
instead of just "cciss" which you might expect.) This is because
of changes to the 2.4 kernel PCI interface related to PCI hot plug
that imply the driver must register with the SCSI mid layer once per
adapter instance rather than once per driver.
Note: ONLY sequential access devices and medium changers are presented
as SCSI devices to the SCSI mid layer by the cciss driver. Specifically,
physical SCSI disk drives are NOT presented to the SCSI mid layer. The
physical SCSI disk drives are controlled directly by the array controller
hardware and it is important to prevent the OS from attempting to directly
access these devices too, as if the array controller were merely a SCSI
controller in the same way that we are allowing it to access SCSI tape drives.
...@@ -70,6 +70,9 @@ the device supports them. Both are illustrated below. ...@@ -70,6 +70,9 @@ the device supports them. Both are illustrated below.
/* buf[0] contains the read byte */ /* buf[0] contains the read byte */
} }
IMPORTANT: because of the use of inline functions, you *have* to use
'-O' or some variation when you compile your program!
Full interface description Full interface description
========================== ==========================
......
This is an explanation of what i2c is, and what is supported. This is an explanation of what i2c is, and what is supported in this package.
I2C and SMBus I2C and SMBus
============= =============
I2C (pronounce: I square C) is a protocol developed by Philips. It is a I2C (pronounce: I squared C) is a protocol developed by Philips. It is a
slow two-wire protocol (10-100 kHz), but it suffices for many types of slow two-wire protocol (10-100 kHz), but it suffices for many types of
devices. devices.
...@@ -25,6 +25,7 @@ When we talk about I2C, we use the following terms: ...@@ -25,6 +25,7 @@ When we talk about I2C, we use the following terms:
Adapter Adapter
Device -> Driver Device -> Driver
Client Client
An Algorithm driver contains general code that can be used for a whole class An Algorithm driver contains general code that can be used for a whole class
of I2C adapters. Each specific adapter driver depends on one algorithm of I2C adapters. Each specific adapter driver depends on one algorithm
driver. driver.
...@@ -35,29 +36,40 @@ integrated than Algorithm and Adapter. ...@@ -35,29 +36,40 @@ integrated than Algorithm and Adapter.
For a given configuration, you will need a driver for your I2C bus (usually For a given configuration, you will need a driver for your I2C bus (usually
a separate Adapter and Algorithm driver), and drivers for your I2C devices a separate Adapter and Algorithm driver), and drivers for your I2C devices
(usually one driver for each device). (usually one driver for each device). There are no I2C device drivers
in this package. See the lm_sensors project http://www.lm-sensors.nu
for device drivers.
Included Bus Drivers
====================
Note that not only stable drivers are patched into the kernel by 'mkpatch'.
Included Drivers
================
Base modules Base modules
------------ ------------
i2c-core: The basic I2C code, including the /proc interface i2c-core: The basic I2C code, including the /proc interface
i2c-dev: The /dev interface i2c-dev: The /dev interface
i2c-proc: The /proc interface for device (client) drivers
Algorithm drivers Algorithm drivers
----------------- -----------------
i2c-algo-8xx: An algorithm for CPM's I2C device in Motorola 8xx processors (NOT BUILT BY DEFAULT)
i2c-algo-bit: A bit-banging algorithm i2c-algo-bit: A bit-banging algorithm
i2c-algo-pcf: A PCF 8584 style algorithm i2c-algo-pcf: A PCF 8584 style algorithm
i2c-algo-ppc405: An algorithm for the I2C device in IBM 405xx processors (NOT BUILT BY DEFAULT)
Adapter drivers Adapter drivers
--------------- ---------------
i2c-elektor: Elektor ISA card (uses i2c-algo-pcf) i2c-elektor: Elektor ISA card (uses i2c-algo-pcf)
i2c-elv: ELV parallel port adapter (uses i2c-algo-bit) i2c-elv: ELV parallel port adapter (uses i2c-algo-bit)
i2c-pcf-epp: PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (BROKEN - missing i2c-pcf-epp.h)
i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit) i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit)
i2c-ppc405: IBM 405xx processor I2C device (uses i2c-algo-ppc405) (NOT BUILT BY DEFAULT)
i2c-pport: Primitive parallel port adapter (uses i2c-algo-bit)
i2c-rpx: RPX board Motorola 8xx I2C device (uses i2c-algo-8xx) (NOT BUILT BY DEFAULT)
i2c-velleman: Velleman K9000 parallel port adapter (uses i2c-algo-bit) i2c-velleman: Velleman K9000 parallel port adapter (uses i2c-algo-bit)
...@@ -33,7 +33,7 @@ address. ...@@ -33,7 +33,7 @@ address.
/* detach_client */ &foo_detach_client, /* detach_client */ &foo_detach_client,
/* command */ &foo_command, /* May be NULL */ /* command */ &foo_command, /* May be NULL */
/* inc_use */ &foo_inc_use, /* May be NULL */ /* inc_use */ &foo_inc_use, /* May be NULL */
/* dec_use */ &foo_dev_use /* May be NULL */ /* dec_use */ &foo_dec_use /* May be NULL */
} }
The name can be chosen freely, and may be upto 40 characters long. Please The name can be chosen freely, and may be upto 40 characters long. Please
...@@ -190,7 +190,7 @@ are defined in i2c.h to help you support them, as well as a generic ...@@ -190,7 +190,7 @@ are defined in i2c.h to help you support them, as well as a generic
detection algorithm. detection algorithm.
You do not have to use this parameter interface; but don't try to use You do not have to use this parameter interface; but don't try to use
function i2c_probe() (or sensors_detect()) if you don't. function i2c_probe() (or i2c_detect()) if you don't.
NOTE: If you want to write a `sensors' driver, the interface is slightly NOTE: If you want to write a `sensors' driver, the interface is slightly
different! See below. different! See below.
...@@ -344,17 +344,17 @@ detected at a specific address, another callback is called. ...@@ -344,17 +344,17 @@ detected at a specific address, another callback is called.
return i2c_probe(adapter,&addr_data,&foo_detect_client); return i2c_probe(adapter,&addr_data,&foo_detect_client);
} }
For `sensors' drivers, use the sensors_detect function instead: For `sensors' drivers, use the i2c_detect function instead:
int foo_attach_adapter(struct i2c_adapter *adapter) int foo_attach_adapter(struct i2c_adapter *adapter)
{ {
return sensors_detect(adapter,&addr_data,&foo_detect_client); return i2c_detect(adapter,&addr_data,&foo_detect_client);
} }
Remember, structure `addr_data' is defined by the macros explained above, Remember, structure `addr_data' is defined by the macros explained above,
so you do not have to define it yourself. so you do not have to define it yourself.
The i2c_probe or sensors_detect function will call the foo_detect_client The i2c_probe or i2c_detect function will call the foo_detect_client
function only for those i2c addresses that actually have a device on function only for those i2c addresses that actually have a device on
them (unless a `force' parameter was used). In addition, addresses that them (unless a `force' parameter was used). In addition, addresses that
are already in use (by some other registered client) are skipped. are already in use (by some other registered client) are skipped.
...@@ -363,9 +363,9 @@ are already in use (by some other registered client) are skipped. ...@@ -363,9 +363,9 @@ are already in use (by some other registered client) are skipped.
The detect client function The detect client function
-------------------------- --------------------------
The detect client function is called by i2c_probe or sensors_detect. The detect client function is called by i2c_probe or i2c_detect.
The `kind' parameter contains 0 if this call is due to a `force' The `kind' parameter contains 0 if this call is due to a `force'
parameter, and 0 otherwise (for sensors_detect, it contains 0 if parameter, and 0 otherwise (for i2c_detect, it contains 0 if
this call is due to the generic `force' parameter, and the chip type this call is due to the generic `force' parameter, and the chip type
number if it is due to a specific `force' parameter). number if it is due to a specific `force' parameter).
...@@ -530,7 +530,7 @@ For now, you can ignore the `flags' parameter. It is there for future use. ...@@ -530,7 +530,7 @@ For now, you can ignore the `flags' parameter. It is there for future use.
/* SENSORS ONLY BEGIN */ /* SENSORS ONLY BEGIN */
/* Register a new directory entry with module sensors. See below for /* Register a new directory entry with module sensors. See below for
the `template' structure. */ the `template' structure. */
if ((i = sensors_register_entry(new_client, type_name, if ((i = i2c_register_entry(new_client, type_name,
foo_dir_table_template,THIS_MODULE)) < 0) { foo_dir_table_template,THIS_MODULE)) < 0) {
err = i; err = i;
goto ERROR4; goto ERROR4;
...@@ -574,8 +574,8 @@ much simpler than the attachment code, fortunately! ...@@ -574,8 +574,8 @@ much simpler than the attachment code, fortunately!
int err,i; int err,i;
/* SENSORS ONLY START */ /* SENSORS ONLY START */
/* Deregister with the `sensors' module. */ /* Deregister with the `i2c-proc' module. */
sensors_deregister_entry(((struct lm78_data *)(client->data))->sysctl_id); i2c_deregister_entry(((struct lm78_data *)(client->data))->sysctl_id);
/* SENSORS ONLY END */ /* SENSORS ONLY END */
/* Try to detach the client from i2c space */ /* Try to detach the client from i2c space */
...@@ -772,12 +772,12 @@ you call sensors_register_entry. ...@@ -772,12 +772,12 @@ you call sensors_register_entry.
First, I will give an example definition. First, I will give an example definition.
static ctl_table foo_dir_table_template[] = { static ctl_table foo_dir_table_template[] = {
{ FOO_SYSCTL_FUNC1, "func1", NULL, 0, 0644, NULL, &sensors_proc_real, { FOO_SYSCTL_FUNC1, "func1", NULL, 0, 0644, NULL, &i2c_proc_real,
&sensors_sysctl_real,NULL,&foo_func }, &i2c_sysctl_real,NULL,&foo_func },
{ FOO_SYSCTL_FUNC2, "func2", NULL, 0, 0644, NULL, &sensors_proc_real, { FOO_SYSCTL_FUNC2, "func2", NULL, 0, 0644, NULL, &i2c_proc_real,
&sensors_sysctl_real,NULL,&foo_func }, &i2c_sysctl_real,NULL,&foo_func },
{ FOO_SYSCTL_DATA, "data", NULL, 0, 0644, NULL, &sensors_proc_real, { FOO_SYSCTL_DATA, "data", NULL, 0, 0644, NULL, &i2c_proc_real,
&sensors_sysctl_real,NULL,&foo_data }, &i2c_sysctl_real,NULL,&foo_data },
{ 0 } { 0 }
}; };
...@@ -791,8 +791,8 @@ The third, sixth and ninth parameters should always be NULL, and the ...@@ -791,8 +791,8 @@ The third, sixth and ninth parameters should always be NULL, and the
fourth should always be 0. The fifth is the mode of the /proc file; fourth should always be 0. The fifth is the mode of the /proc file;
0644 is safe, as the file will be owned by root:root. 0644 is safe, as the file will be owned by root:root.
The seventh and eighth parameters should be &sensors_proc_real and The seventh and eighth parameters should be &i2c_proc_real and
&sensors_sysctl_real if you want to export lists of reals (scaled &i2c_sysctl_real if you want to export lists of reals (scaled
integers). You can also use your own function for them, as usual. integers). You can also use your own function for them, as usual.
Finally, the last parameter is the call-back to gather the data Finally, the last parameter is the call-back to gather the data
(see below) if you use the *_proc_real functions. (see below) if you use the *_proc_real functions.
......
...@@ -101,6 +101,17 @@ Command line parameters ...@@ -101,6 +101,17 @@ Command line parameters
the device driver will be notified if possible, so the device will become the device driver will be notified if possible, so the device will become
available to the system. available to the system.
You can also add ranges of devices to be ignored by piping to
/proc/cio_ignore; "add <devnorange>, <devnorange>, ..." will ignore the
specified devices.
Note: Already known devices cannot be ignored; this also applies to devices
which are gone after a machine check.
For example, if device abcd is already known and all other devices a000-afff
are not known, "echo add 0xa000-0xaccc, 0xaf00-0xafff > /proc/cio_ignore"
will add af00-afff to the list of ignored devices and skip a000-accc.
* /proc/s390dbf/cio_*/ (S/390 debug feature) * /proc/s390dbf/cio_*/ (S/390 debug feature)
...@@ -122,3 +133,7 @@ Command line parameters ...@@ -122,3 +133,7 @@ Command line parameters
/proc/s390dbf/cio_*/level a number between 0 and 6; see the documentation on /proc/s390dbf/cio_*/level a number between 0 and 6; see the documentation on
the S/390 debug feature (Documentation/s390/s390dbf.txt) for details. the S/390 debug feature (Documentation/s390/s390dbf.txt) for details.
* /proc/irq_count
This entry counts how many times s390_process_IRQ has been called for each
CPU. This info is in /proc/interrupts on other architectures.
...@@ -124,17 +124,16 @@ force list: is a term specific to channel device layer describing a range of dev ...@@ -124,17 +124,16 @@ force list: is a term specific to channel device layer describing a range of dev
.B (ctc|escon|lcs|osad|qeth)<devif_num>, .B (ctc|escon|lcs|osad|qeth)<devif_num>,
read_devno,write_devno,<data_devno,memory_usage_in_k,port_no/protocol_no,checksum_received_ip_pkts,use_hw_stats> read_devno,write_devno,<data_devno,memory_usage_in_k,port_no/protocol_no,checksum_received_ip_pkts,use_hw_stats>
.It .It
devif_num of -1 indicates you don't care what device interface number is chosen, omitting it indicates this is a range of devices for which you want to force to be detected as a particular type. devif_num of -1 indicates you don't care what device interface number is chosen, omitting it indicates this is a range of devices for which you want to force to be detected as a particular type, qeth devices can't be forced as a range as it makes no sense for them.
The data_devno field is only valid for qeth devices when not forcing a range of devices. The data_devno field is only valid for qeth devices, all parameters including & after memory_usage_in_k can be set optionally, if not set they
all parameters after & including memory_usage_in_k can be set optionally if not set they
go to default values. memory_usage_in_k ( 0 the default ) means let the driver choose,checksum_received_ip_pkts & use_hw_stats are set to false go to default values. memory_usage_in_k ( 0 the default ) means let the driver choose,checksum_received_ip_pkts & use_hw_stats are set to false
.It .It
e.g. ctc0,0x7c00,0x7c01 e.g. ctc0,0x7c00,0x7c01
.It .It
Tells the channel layer to force ctc0 if detected to use cuu's 7c00 & 7c01 port,port_no is the relative adapter no on lcs, on ctc/escon this field is the ctc/escon protocol number ( default 0 ), don't do checksumming on received ip packets & as ctc doesn't have hardware stats so it ignores this parameter. This can be used for instance to force a device if it presents bad sense data to the IO layer & thus autodetection fails. Tells the channel layer to force ctc0 if detected to use cuu's 7c00 & 7c01 port,port_no is the relative adapter no on lcs, on ctc/escon this field is the ctc/escon protocol number ( default 0 ), don't do checksumming on received ip packets & as ctc doesn't have hardware stats so it ignores this parameter. This can be used for instance to force a device if it presents bad sense data to the IO layer & thus autodetection fails.
.It .It
qeth,0x7c00,0x7d00,-1,4096 lcs,0x7c00,0x7d00,-1,4096
All devices between 0x7c00 & 7d00 should be detected as gigabit ethernet, let the driver use 4096k for each instance, don't care what port relative adapter number is chosen, don't checksum received ip packets & use hw stats . All devices between 0x7c00 & 7d00 should be detected as lcs, let the driver use 4096k for each instance, don't care what port relative adapter number is chosen, don't checksum received ip packets & use hw stats .
.It .It
qeth1,0x7c00,0x7c01,0x7c02 qeth1,0x7c00,0x7c01,0x7c02
.It .It
...@@ -368,6 +367,12 @@ Don't automatically read /etc/chandev.conf on boot. ...@@ -368,6 +367,12 @@ Don't automatically read /etc/chandev.conf on boot.
Force drivers modules to stay loaded even if no device is found, Force drivers modules to stay loaded even if no device is found,
this is useful for debugging & one wishes to examine debug entries in this is useful for debugging & one wishes to examine debug entries in
/proc/s390dbf/ to find out why a module failed to load. /proc/s390dbf/ to find out why a module failed to load.
.It
e.g.
.It
persist,-1 forces all devices to persist.
.It
persist,0 forces all channel devices to be non persistent.
.El .El
.It .It
......
...@@ -336,7 +336,7 @@ proc-files: ...@@ -336,7 +336,7 @@ proc-files:
Example: Example:
> ls /proc/s390dbf/dasd > ls /proc/s390dbf/dasd
hex_ascii level raw flush hex_ascii level raw
> cat /proc/s390dbf/dasd/hex_ascii | sort +1 > cat /proc/s390dbf/dasd/hex_ascii | sort +1
00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | .... 00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | ....
00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE 00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE
...@@ -363,6 +363,20 @@ Example: ...@@ -363,6 +363,20 @@ Example:
> cat /proc/s390dbf/dasd/level > cat /proc/s390dbf/dasd/level
5 5
Flushing debug areas
--------------------
Debug areas can be flushed with piping the number of the desired
area (0...n) to the proc file "flush". When using "-" all debug areas
are flushed.
Examples:
1. Flush debug area 0:
> echo "0" > /proc/s390dbf/dasd/flush
2. Flush all debug areas:
> echo "-" > /proc/s390dbf/dasd/flush
lcrash Interface lcrash Interface
---------------- ----------------
It is planned that the dump analysis tool lcrash gets an additional command It is planned that the dump analysis tool lcrash gets an additional command
......
...@@ -15,6 +15,8 @@ generate, like: ...@@ -15,6 +15,8 @@ generate, like:
- capture button events (only on Vaio Picturebook series) - capture button events (only on Vaio Picturebook series)
- Fn keys - Fn keys
- bluetooth button (only on C1VR model) - bluetooth button (only on C1VR model)
- back button (PCG-GR7/K model)
- lid open/close events (Z600NE model)
Those events (see linux/sonypi.h) can be polled using the character device node Those events (see linux/sonypi.h) can be polled using the character device node
/dev/sonypi (major 10, minor auto allocated or specified as a option). /dev/sonypi (major 10, minor auto allocated or specified as a option).
...@@ -36,6 +38,14 @@ specs for its laptops. If someone convinces them to do so, drop me a note. ...@@ -36,6 +38,14 @@ specs for its laptops. If someone convinces them to do so, drop me a note.
Module options: Module options:
--------------- ---------------
Several options can be passed to the sonypi driver, either by adding them
to /etc/modules.conf file, when the driver is compiled as a module or by
adding the following to the kernel command line (in your bootloader):
sonypi=minor[[[[,camera],fnkeyinit],verbose],compat]
where:
minor: minor number of the misc device /dev/sonypi, minor: minor number of the misc device /dev/sonypi,
default is -1 (automatic allocation, see /proc/misc default is -1 (automatic allocation, see /proc/misc
or kernel logs) or kernel logs)
...@@ -49,6 +59,11 @@ Module options: ...@@ -49,6 +59,11 @@ Module options:
verbose: print unknown events from the sonypi device verbose: print unknown events from the sonypi device
compat: uses some compatibility code for enabling the sonypi
events. If the driver worked for you in the past
(prior to version 1.5) and does not work anymore,
add this option and report to the author.
Module use: Module use:
----------- -----------
......
Iomega Buz Driver for Linux
===========================
by Rainer Johanni <Rainer@Johanni.de>
Compiling and Loading the Driver
================================
You must run a 2.2.x kernel in order to use this driver.
To compile the driver, just type make.
Besides the files in this directory, the driver needs the
'videodev' and the 'i2c' module from the Linux kernel.
In order to get these modules available, enable module support
for VIDEODEV and BTTV (which implies i2c) in your kernel
configuration. You find these devices in the menu
"Character Devices" in your Kernel Configuration.
Before you load the driver you must have a video device
at major device node 81. If you don't have it yet, do the
following (as root!):
cd /dev
mknod video0 c 81 0
ln -s video0 video
Edit the 'update' script if you want to give the driver
special options and then type (as root)
./update
to insert all the necessary modules into the kernel.
If you want to make full use of the Video for Linux uncompressed
grabbing facilities, you must either
- obtain and install the "big_physarea patch" for your kernel and
set aside the necessary memory during boot time.
There seem to be several versions of this patch against
various kernel versions floating around in the net,
you may obtain one e.g. from:
http://www.polyware.nl/~middelin/patch/bigphysarea-2.2.1.tar.gz
You also have to compile your driver AFTER installing that patch
in order to get it working
or
- start your kernel with the mem=xxx option, where xxx is your
real memory minus the memory needed for the buffers.
For doing this add an entry in lilo.conf (if you use lilo):
append "mem=xxxM"
or add a line in your linux.par file (if you use loadlin):
mem=xxxM
The second method is by far easier, however it is dangerous
if more than one driver at a time has the idea to use the memory
leftover by setting the mem=xxx parameter below the actual
memory size.
Read also below how to use this memory!
Driver Options
==============
You are able to customize the behavior of the driver by giving
it some options at start time.
default_input, default_norm
---------------------------
As soon as the driver is loaded, the Buz samples video signals
from one of its input ports and displays it on its output.
The driver uses the Composite Input and the video norm PAL for this.
If you want to change this default behavior, set default_input=1
(for S-VHS input) or default_norm=1 for NTSC.
v4l_nbufs, v4l_bufsize
----------------------
In order to make to make full use of the Video for Linux picture
grabbing facilities of the driver (which are needed by many
Video for Linux applications), the driver needs a set of
physically contiguous buffers for grabbing. These parameters
determine how many buffers of which size the driver will
allocate at open (the open will fail if it is unable to do so!).
These values do not affect the MJPEG grabbing facilities of the driver,
they are needed for uncompressed image grabbing only!!!
v4l_nbufs is the number of buffers to allocate, a value of 2 (the default)
should be sufficient in almost all cases. Only special applications
(streaming captures) will need more buffers and then mostly the
MJPEG capturing features of the Buz will be more appropriate.
So leave this parameter at it's default unless you know what you do.
The things for v4l_bufsize are more complicated:
v4l_bufsize is set by default to 128 [KB] which is the maximum
amount of physically contiguous memory Linux is able to allocate
without kernel changes. This is sufficient for grabbing 24 bit color images
up to sizes of approx. 240x180 pixels (240*180*3 = 129600, 128 KB = 131072).
In order to be able to capture bigger images you have either to
- obtain and install the "big_physarea patch" and set aside
the necessary memory during boot time or
- start your kernel with the mem=xxx option, where xxx is your
real memory minus the memory needed for the buffers.
In that case, useful settings for v4l_bufsize are
- 1296 [Kb] for grabbing 24 bit images of max size 768*576
- 1728 [Kb] for 32bit images of same size (4*768*576 = 1728 Kb!)
You may reduce these numbers accordingly if you know you are only
grabbing 720 pixels wide images or NTSC images (max height 480).
In some cases it may happen that Linux isn't even able to obtain
the default 128 KB buffers. If you don't need uncompressed image
grabbing at all, set v4l_bufsize to an arbitrary small value (e.g. 4)
in order to be able to open the video device.
vidmem
------
The video mem address of the video card.
The driver has a little database for some videocards
to determine it from there. If your video card is not in there
you have either to give it to the driver as a parameter
or set in in a VIDIOCSFBUF ioctl
The videocard database is contained in the file "videocards.h"
Gernot Ziegler wants to keep an actual version of that file.
If your card is not contained in that file, look at
http://www.lysator.liu.se/~gz/buz/ for an actual version of
"videocards.h".
triton, natoma
--------------
The driver tries to detect if you have a triton or natome chipset
in order to take special measures for these chipsets.
If this detection fails but you are sure you have such a chipset,
set the corresponding variable to 1.
This is a very special option and may go away in the future.
Programming interface
=====================
This driver should be fully compliant to Video for Linux, so all
tools working with Video for Linux should work with (hopefully)
no problems.
A description of the Video for Linux programming interface can be found at:
http://roadrunner.swansea.linux.org.uk/v4lapi.shtml
Besides the Video for Linux interface, the driver has a "proprietary"
interface for accessing the Buz's MJPEG capture and playback facilities.
The ioctls for that interface are as follows:
BUZIOC_G_PARAMS
BUZIOC_S_PARAMS
Get and set the parameters of the buz. The user should always
do a BUZIOC_G_PARAMS (with a struct buz_params) to obtain the default
settings, change what he likes and then make a BUZIOC_S_PARAMS call.
A typical application should at least set the members
input, norm and decimation of the struct buz_params.
For a full description of all members see "buz.h"
BUZIOC_REQBUFS
Before being able to capture/playback, the user has to request
the buffers he is wanting to use. Fill the structure
buz_requestbuffers with the size (recommended: 256*1024) and
the number (recommended 32 up to 256). There are no such restrictions
as for the Video for Linux buffers, you should LEAVE SUFFICIENT
MEMORY for your system however, else strange things will happen ....
On return, the buz_requestbuffers structure contains number and
size of the actually allocated buffers.
You should use these numbers for doing a mmap of the buffers
into the user space.
The BUZIOC_REQBUFS ioctl also makes it happen, that the next mmap
maps the MJPEG buffer instead of the V4L buffers.
BUZIOC_QBUF_CAPT
BUZIOC_QBUF_PLAY
Queue a buffer for capture or playback. The first call also starts
streaming capture. When streaming capture is going on, you may
only queue further buffers or issue syncs until streaming
capture is switched off again with a argument of -1 to
a BUZIOC_QBUF_CAPT/BUZIOC_QBUF_PLAY ioctl.
BUZIOC_SYNC
Issue this ioctl when all buffers are queued. This ioctl will
block until the first buffer becomes free for saving its
data to disk (after BUZIOC_QBUF_CAPT) or for reuse (after BUZIOC_QBUF_PLAY).
BUZIOC_G_STATUS
Get the status of the input lines (video source connected/norm).
This ioctl may be subject to change.
See the examples directory delivered with this driver
for actual coding examples!
...@@ -4,7 +4,10 @@ Vaio Picturebook Motion Eye Camera Driver Readme ...@@ -4,7 +4,10 @@ Vaio Picturebook Motion Eye Camera Driver Readme
Copyright (C) 2000 Andrew Tridgell <tridge@samba.org> Copyright (C) 2000 Andrew Tridgell <tridge@samba.org>
This driver enable the use of video4linux compatible applications with the This driver enable the use of video4linux compatible applications with the
Motion Eye camera. Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O
Control Device" driver (which can be found in the "Character drivers"
section of the kernel configuration utility) to be compiled and installed
(using its "camera=1" parameter).
It can do at maximum 30 fps @ 320x240 or 15 fps @ 640x480. It can do at maximum 30 fps @ 320x240 or 15 fps @ 640x480.
......
...@@ -1053,6 +1053,12 @@ M: Andreas Mohr <100.30936@germany.net> ...@@ -1053,6 +1053,12 @@ M: Andreas Mohr <100.30936@germany.net>
L: linux-net@vger.kernel.org L: linux-net@vger.kernel.org
S: Maintained S: Maintained
NINJA SCSI-3 / NINJA SCSI-32Bi PCMCIA SCSI HOST ADAPTER DRIVER
P: YOKOTA Hiroshi
M: yokota@netlab.is.tsukuba.ac.jp
W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/
S: Maintained
NON-IDE/NON-SCSI CDROM DRIVERS [GENERAL] (come on, crew - mark your responsibility) NON-IDE/NON-SCSI CDROM DRIVERS [GENERAL] (come on, crew - mark your responsibility)
P: Eberhard Moenkeberg P: Eberhard Moenkeberg
M: emoenke@gwdg.de M: emoenke@gwdg.de
...@@ -1399,6 +1405,13 @@ L: linux-tr@linuxtr.net ...@@ -1399,6 +1405,13 @@ L: linux-tr@linuxtr.net
W: http://www.linuxtr.net W: http://www.linuxtr.net
S: Maintained S: Maintained
TOSHIBA SMM DRIVER
P: Jonathan Buzzard
M: jonathan@buzzard.org.uk
L: tlinux-users@tce.toshiba-dme.co.jp
W: http://www.buzzard.org.uk/toshiba/
S: Maintained
TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE
P: Ollie Lho P: Ollie Lho
M: ollie@sis.com.tw M: ollie@sis.com.tw
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 12 SUBLEVEL = 13
EXTRAVERSION = EXTRAVERSION =-pre1
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
......
...@@ -45,8 +45,6 @@ tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100 ...@@ -45,8 +45,6 @@ tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100
CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu
LIBGCC := $(shell $(CC) $(CFLAGS) --print-libgcc-file-name)
ifeq ($(CONFIG_CPU_26),y) ifeq ($(CONFIG_CPU_26),y)
PROCESSOR = armo PROCESSOR = armo
ifeq ($(CONFIG_ROM_KERNEL),y) ifeq ($(CONFIG_ROM_KERNEL),y)
...@@ -123,7 +121,7 @@ MACHINE = integrator ...@@ -123,7 +121,7 @@ MACHINE = integrator
endif endif
ifeq ($(CONFIG_ARCH_CLPS711X),y) ifeq ($(CONFIG_ARCH_CLPS711X),y)
TEXTADDR = 0xc0018000 TEXTADDR = 0xc0028000
MACHINE = clps711x MACHINE = clps711x
endif endif
...@@ -131,7 +129,7 @@ ifeq ($(CONFIG_ARCH_ANAKIN),y) ...@@ -131,7 +129,7 @@ ifeq ($(CONFIG_ARCH_ANAKIN),y)
MACHINE = anakin MACHINE = anakin
endif endif
export LIBGCC MACHINE PROCESSOR TEXTADDR GZFLAGS export MACHINE PROCESSOR TEXTADDR GZFLAGS
# Only set INCDIR if its not already defined above # Only set INCDIR if its not already defined above
# Grr, ?= doesn't work as all the other assignment operators do. Make bug? # Grr, ?= doesn't work as all the other assignment operators do. Make bug?
...@@ -155,7 +153,7 @@ HEAD := arch/arm/kernel/head-$(PROCESSOR).o \ ...@@ -155,7 +153,7 @@ HEAD := arch/arm/kernel/head-$(PROCESSOR).o \
SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe \ SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe \
arch/arm/fastfpe arch/arm/fastfpe
CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES) CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)
LIBS := arch/arm/lib/lib.a $(LIBS) $(LIBGCC) LIBS := arch/arm/lib/lib.a $(LIBS)
ifeq ($(CONFIG_FPE_NWFPE),y) ifeq ($(CONFIG_FPE_NWFPE),y)
LIBS := arch/arm/nwfpe/math-emu.o $(LIBS) LIBS := arch/arm/nwfpe/math-emu.o $(LIBS)
......
...@@ -69,12 +69,21 @@ ZRELADDR = 0xf0008000 ...@@ -69,12 +69,21 @@ ZRELADDR = 0xf0008000
ZBSSADDR = 0xf03e0000 ZBSSADDR = 0xf03e0000
endif endif
ifeq ($(CONFIG_ARCH_P720T),y) # The standard locations for stuff on CLPS711x type processors
ZTEXTADDR = 0xc0018000 ifeq ($(CONFIG_ARCH_CLPS711X),y)
ZTEXTADDR = 0xc0028000
PARAMS_PHYS = 0xc0000100 PARAMS_PHYS = 0xc0000100
endif
# Should probably have some agreement on these...
ifeq ($(CONFIG_ARCH_P720T),y)
INITRD_PHYS = 0xc0400000 INITRD_PHYS = 0xc0400000
INITRD_VIRT = 0xc0400000 INITRD_VIRT = 0xc0400000
endif endif
ifeq ($(CONFIG_ARCH_CDB89712),y)
INITRD_PHYS = 0x00700000
INITRD_VIRT = 0xc0300000
endif
ifeq ($(CONFIG_ARCH_SA1100),y) ifeq ($(CONFIG_ARCH_SA1100),y)
ZTEXTADDR = 0xc0008000 ZTEXTADDR = 0xc0008000
...@@ -90,6 +99,12 @@ endif ...@@ -90,6 +99,12 @@ endif
ifeq ($(CONFIG_SA1100_GRAPHICSCLIENT),y) ifeq ($(CONFIG_SA1100_GRAPHICSCLIENT),y)
ZTEXTADDR = 0xC0200000 ZTEXTADDR = 0xC0200000
endif endif
ifeq ($(CONFIG_SA1100_GRAPHICSMASTER),y)
ZTEXTADDR = 0xC0400000
endif
ifeq ($(CONFIG_SA1100_ADSBITSY),y)
ZTEXTADDR = 0xC0400000
endif
ifeq ($(CONFIG_SA1100_YOPY),y) ifeq ($(CONFIG_SA1100_YOPY),y)
ZTEXTADDR = 0x00080000 ZTEXTADDR = 0x00080000
ZBSSADDR = 0xc0200000 ZBSSADDR = 0xc0200000
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
# #
ZSYSTEM =$(TOPDIR)/arch/arm/boot/zImage ZSYSTEM =$(TOPDIR)/arch/arm/boot/zImage
INITRD =$(ZSYSTEM)
ZLDFLAGS =-p -X -T bootp.lds \ ZLDFLAGS =-p -X -T bootp.lds \
--defsym initrd_addr=$(INITRD_PHYS) \ --defsym initrd_addr=$(INITRD_PHYS) \
--defsym initrd_virt=$(INITRD_VIRT) \ --defsym initrd_virt=$(INITRD_VIRT) \
......
...@@ -39,7 +39,7 @@ splitify: adr r13, data ...@@ -39,7 +39,7 @@ splitify: adr r13, data
* method by looking at the first word; this should either indicate a page * method by looking at the first word; this should either indicate a page
* size of 4K, 16K or 32K. * size of 4K, 16K or 32K.
*/ */
ldmia r13, {r5-r8} @ get size and addr of initrd ldmia r13, {r4-r8} @ get size and addr of initrd
@ r5 = ATAG_INITRD @ r5 = ATAG_INITRD
@ r6 = initrd start @ r6 = initrd start
@ r7 = initrd end @ r7 = initrd end
...@@ -48,10 +48,25 @@ splitify: adr r13, data ...@@ -48,10 +48,25 @@ splitify: adr r13, data
teq r9, #0x1000 @ 4K? teq r9, #0x1000 @ 4K?
teqne r9, #0x4000 @ 16K? teqne r9, #0x4000 @ 16K?
teqne r9, #0x8000 @ 32K? teqne r9, #0x8000 @ 32K?
beq no_taglist beq param_struct
ldr r9, [r8, #4] @ get first tag
teq r9, r4
bne taglist @ ok, we have a tag list
/*
* We didn't find a valid tag list - create one.
*/
str r4, [r8, #4]
mov r4, #8
str r4, [r8, #0]
mov r4, #0
str r4, [r8, #8]
/* /*
* find the end of the tag list, and then add an INITRD tag on the end. * find the end of the tag list, and then add an INITRD tag on the end.
* If there is already an INITRD tag, then we ignore it; the last INITRD
* tag takes precidence.
*/ */
taglist: ldr r9, [r8, #0] @ tag length taglist: ldr r9, [r8, #0] @ tag length
teq r9, #0 @ last tag? teq r9, #0 @ last tag?
...@@ -63,7 +78,10 @@ taglist: ldr r9, [r8, #0] @ tag length ...@@ -63,7 +78,10 @@ taglist: ldr r9, [r8, #0] @ tag length
stmia r8, {r4, r5, r6, r7, r9} stmia r8, {r4, r5, r6, r7, r9}
mov pc, r12 @ call kernel mov pc, r12 @ call kernel
no_taglist: add r8, r8, #16*4 /*
* We found a param struct. Modify the param struct for the initrd
*/
param_struct: add r8, r8, #16*4
stmia r8, {r6,r7} @ save in param_struct stmia r8, {r6,r7} @ save in param_struct
mov pc, r12 @ call kernel mov pc, r12 @ call kernel
...@@ -83,6 +101,7 @@ data: .word initrd_start ...@@ -83,6 +101,7 @@ data: .word initrd_start
.word kernel_addr .word kernel_addr
.word kernel_len .word kernel_len
.word 0x54410001 @ r4 = ATAG_CORE
.word 0x54410005 @ r5 = ATAG_INITRD .word 0x54410005 @ r5 = ATAG_INITRD
.word initrd_virt @ r6 .word initrd_virt @ r6
.word initrd_len @ r7 .word initrd_len @ r7
......
...@@ -51,7 +51,7 @@ OBJS += head-sa1100.o ...@@ -51,7 +51,7 @@ OBJS += head-sa1100.o
endif endif
ifeq ($(CONFIG_ARCH_SA1100),y) ifeq ($(CONFIG_ARCH_SA1100),y)
OBJS += head-sa1100.o setup-sa1100.o OBJS += head-sa1100.o
ifeq ($(CONFIG_SA1100_NANOENGINE),y) ifeq ($(CONFIG_SA1100_NANOENGINE),y)
OBJS += hw-bse.o OBJS += hw-bse.o
endif endif
...@@ -65,6 +65,8 @@ else ...@@ -65,6 +65,8 @@ else
SEDFLAGS += s/BSS_START/ALIGN(4)/ SEDFLAGS += s/BSS_START/ALIGN(4)/
endif endif
LIBGCC := $(shell $(CC) $(CFLAGS) --print-libgcc-file-name)
all: vmlinux all: vmlinux
vmlinux: $(HEAD) $(OBJS) piggy.o vmlinux.lds vmlinux: $(HEAD) $(OBJS) piggy.o vmlinux.lds
......
...@@ -17,6 +17,24 @@ __SA1100_start: ...@@ -17,6 +17,24 @@ __SA1100_start:
@ Preserve r8/r7 i.e. kernel entry values @ Preserve r8/r7 i.e. kernel entry values
#if defined(CONFIG_SA1100_GRAPHICSCLIENT) && !defined(CONFIG_ANGELBOOT)
mov r7, #MACH_TYPE_GRAPHICSCLIENT
mov r8, #0
#endif
#if defined(CONFIG_SA1100_GRAPHICSMASTER) && !defined(CONFIG_ANGELBOOT)
mov r7, #MACH_TYPE_GRAPHICSMASTER
mov r8, #0
#endif
#if defined(CONFIG_SA1100_ADSBITSY) && !defined(CONFIG_ANGELBOOT)
mov r7, #MACH_TYPE_ADSBITSY
mov r8, #0
#endif
#ifdef CONFIG_SA1100_PFS168
@ REVISIT_PFS168: Temporary until firmware updated to use assigned machine number
mov r7, #MACH_TYPE_PFS168
#endif
#ifdef CONFIG_SA1100_VICTOR #ifdef CONFIG_SA1100_VICTOR
teq r7, #MACH_TYPE_VICTOR teq r7, #MACH_TYPE_VICTOR
bne 10f bne 10f
...@@ -51,7 +69,6 @@ __SA1100_start: ...@@ -51,7 +69,6 @@ __SA1100_start:
bic r0, r0, #0x1000 @ clear Icache bic r0, r0, #0x1000 @ clear Icache
mcr p15, 0, r0, c1, c0, 0 mcr p15, 0, r0, c1, c0, 0
#ifdef CONFIG_ANGELBOOT
/* /*
* Pause for a short time so that we give enough time * Pause for a short time so that we give enough time
* for the host to start a terminal up. * for the host to start a terminal up.
...@@ -59,5 +76,4 @@ __SA1100_start: ...@@ -59,5 +76,4 @@ __SA1100_start:
mov r0, #0x00200000 mov r0, #0x00200000
1: subs r0, r0, #1 1: subs r0, r0, #1
bne 1b bne 1b
#endif
/*
* linux/arch/arm/boot/compressed/setup-sa1100.S
*
* Copyright (C) 2000 Nicolas Pitre <nico@cam.org>
*
* SA1100 setup routines, to be used after BSS has been cleared.
*
* John G Dorsey <john+@cs.cmu.edu> 2000/05/25 :
* Runtime test for Neponset added.
*/
#include <linux/linkage.h>
#include <linux/config.h>
#include <asm/mach-types.h>
.text
GPIO_BASE: .long 0x90040000
#define GPLR 0x00
#define GPDR 0x04
#define GPSR 0x08
#define GAFR 0x1c
PPC_BASE: .long 0x90060000
#define PPAR 0x08
IC_BASE: .long 0x90050000
#define ICMR 0x04
UART1_BASE: .long 0x80010000
UART3_BASE: .long 0x80050000
#define UTCR0 0x00
#define UTCR1 0x04
#define UTCR2 0x08
#define UTCR3 0x0c
#define UTSR0 0x1c
#define UTSR1 0x20
#ifndef CONFIG_SA1100_DEFAULT_BAUDRATE
#define CONFIG_SA1100_DEFAULT_BAUDRATE 9600
#endif
#define BAUD_DIV ((230400/CONFIG_SA1100_DEFAULT_BAUDRATE)-1)
SCR_loc: .long SYMBOL_NAME(SCR_value)
#define GPIO_2_9 0x3fc
/*
* void sa1100_setup( int arch_id );
*
* This is called from decompress_kernel() with the arch_decomp_setup() macro.
*/
ENTRY(sa1100_setup)
mov r3, r0 @ keep machine type in r3
@ Clear all interrupt sources
ldr r0, IC_BASE
mov r1, #0
str r1, [r0, #ICMR]
@ Read System Configuration "Register" for Assabet.
@ (taken from "Intel StrongARM SA-1110 Microprocessor Development Board
@ User's Guide," p.4-9)
teq r3, #MACH_TYPE_ASSABET
bne skip_SCR
ldr r0, GPIO_BASE
ldr r1, [r0, #GPDR]
and r1, r1, #GPIO_2_9
str r1, [r0, #GPDR]
mov r1, #GPIO_2_9
str r1, [r0, #GPSR]
ldr r1, [r0, #GPDR]
bic r1, r1, #GPIO_2_9
str r1, [r0, #GPDR]
mov r2, #100
1: ldr r1, [r0, #GPLR]
subs r2, r2, #1
bne 1b
and r2, r1, #GPIO_2_9
ldr r1, SCR_loc
str r2, [r1]
ldr r1, [r0, #GPDR]
and r1, r1, #GPIO_2_9
str r1, [r0, #GPDR]
skip_SCR:
@ Initialize UART (if bootloader has not done it yet)...
teq r3, #MACH_TYPE_BRUTUS
teqne r3, #MACH_TYPE_ASSABET
teqne r3, #MACH_TYPE_ITSY
teqne r3, #MACH_TYPE_OMNIMETER
teqne r3, #MACH_TYPE_JORNADA720
teqne r3, #MACH_TYPE_GRAPHICSCLIENT
teqne r3, #MACH_TYPE_FLEXANET
bne skip_uart
@ UART3 if Assabet is used with Neponset
teq r3, #MACH_TYPE_ASSABET @ if Assabet
tsteq r2, #(1 << 9) @ ... and Neponset present
ldreq r0, UART3_BASE
beq uart_init
@ UART3 on GraphicsClient
teq r3, #MACH_TYPE_GRAPHICSCLIENT
ldreq r0, UART3_BASE
beq uart_init
@ At least for Brutus, the UART1 is used through
@ the alternate GPIO function...
teq r3, #MACH_TYPE_BRUTUS
bne uart1
alt_GPIO_uart: ldr r0, GPIO_BASE
ldr r1, [r0, #GPDR]
bic r1, r1, #1<<15
orr r1, r1, #1<<14
str r1, [r0, #GPDR]
ldr r1, [r0, #GAFR]
orr r1, r1, #(1<<15)|(1<<14)
str r1, [r0, #GAFR]
ldr r0, PPC_BASE
ldr r1, [r0, #PPAR]
orr r1, r1, #1<<12
str r1, [r0, #PPAR]
uart1: ldr r0, UART1_BASE
uart_init:
1: ldr r1, [r0, #UTSR1]
tst r1, #1<<0 @ TBY
bne 1b
mov r1, #0
str r1, [r0, #UTCR3]
mov r1, #0x08 @ 8N1
str r1, [r0, #UTCR0]
mov r1, #BAUD_DIV
str r1, [r0, #UTCR2]
mov r1, r1, lsr #8
str r1, [r0, #UTCR1]
mov r1, #0x03 @ RXE + TXE
str r1, [r0, #UTCR3]
mov r1, #0xff @ flush status reg
str r1, [r0, #UTSR0]
skip_uart:
@ Extra specific setup calls
@ The machine type is passed in r0
mov r0, r3
#ifdef CONFIG_SA1100_NANOENGINE
teq r0, #MACH_TYPE_NANOENGINE
beq SYMBOL_NAME(bse_setup)
#endif
out: mov pc, lr
...@@ -11,6 +11,7 @@ define_bool CONFIG_MCA n ...@@ -11,6 +11,7 @@ define_bool CONFIG_MCA n
define_bool CONFIG_UID16 y define_bool CONFIG_UID16 y
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n
define_bool CONFIG_GENERIC_BUST_SPINLOCK n
mainmenu_option next_comment mainmenu_option next_comment
...@@ -68,12 +69,13 @@ mainmenu_option next_comment ...@@ -68,12 +69,13 @@ mainmenu_option next_comment
comment 'SA11x0 Implementations' comment 'SA11x0 Implementations'
dep_bool ' Assabet' CONFIG_SA1100_ASSABET $CONFIG_ARCH_SA1100 dep_bool ' Assabet' CONFIG_SA1100_ASSABET $CONFIG_ARCH_SA1100
dep_bool ' Include support for Neponset' CONFIG_ASSABET_NEPONSET $CONFIG_SA1100_ASSABET dep_bool ' Include support for Neponset' CONFIG_ASSABET_NEPONSET $CONFIG_SA1100_ASSABET
dep_bool ' ADS Bitsy' CONFIG_SA1100_ADSBITSY $CONFIG_ARCH_SA1100
dep_bool ' Brutus' CONFIG_SA1100_BRUTUS $CONFIG_ARCH_SA1100 dep_bool ' Brutus' CONFIG_SA1100_BRUTUS $CONFIG_ARCH_SA1100
dep_bool ' CerfBoard' CONFIG_SA1100_CERF $CONFIG_ARCH_SA1100 dep_bool ' CerfBoard' CONFIG_SA1100_CERF $CONFIG_ARCH_SA1100
if [ "$CONFIG_SA1100_CERF" = "y" ]; then if [ "$CONFIG_SA1100_CERF" = "y" ]; then
bool ' 32MB Cerf support' CONFIG_SA1100_CERF_32MB bool ' 32MB Cerf support' CONFIG_SA1100_CERF_32MB
fi fi
dep_bool ' Compaq iPAQ H3600 (Bitsy)' CONFIG_SA1100_BITSY $CONFIG_ARCH_SA1100 dep_bool ' Compaq iPAQ H3600' CONFIG_SA1100_H3600 $CONFIG_ARCH_SA1100
#dep_bool ' Empeg' CONFIG_SA1100_EMPEG $CONFIG_ARCH_SA1100 #dep_bool ' Empeg' CONFIG_SA1100_EMPEG $CONFIG_ARCH_SA1100
dep_bool ' Extenex HandHeld Theater (Squashtail)' CONFIG_SA1100_EXTENEX1 $CONFIG_ARCH_SA1100 dep_bool ' Extenex HandHeld Theater (Squashtail)' CONFIG_SA1100_EXTENEX1 $CONFIG_ARCH_SA1100
if [ "$CONFIG_SA1100_EXTENEX1" = "y" ]; then if [ "$CONFIG_SA1100_EXTENEX1" = "y" ]; then
...@@ -82,6 +84,7 @@ fi ...@@ -82,6 +84,7 @@ fi
dep_bool ' FlexaNet' CONFIG_SA1100_FLEXANET $CONFIG_ARCH_SA1100 dep_bool ' FlexaNet' CONFIG_SA1100_FLEXANET $CONFIG_ARCH_SA1100
dep_bool ' FreeBird-v1.1' CONFIG_SA1100_FREEBIRD $CONFIG_ARCH_SA1100 dep_bool ' FreeBird-v1.1' CONFIG_SA1100_FREEBIRD $CONFIG_ARCH_SA1100
dep_bool ' GraphicsClient Plus' CONFIG_SA1100_GRAPHICSCLIENT $CONFIG_ARCH_SA1100 dep_bool ' GraphicsClient Plus' CONFIG_SA1100_GRAPHICSCLIENT $CONFIG_ARCH_SA1100
dep_bool ' GraphicsMaster' CONFIG_SA1100_GRAPHICSMASTER $CONFIG_ARCH_SA1100
dep_bool ' HP Jornada 720' CONFIG_SA1100_JORNADA720 $CONFIG_ARCH_SA1100 dep_bool ' HP Jornada 720' CONFIG_SA1100_JORNADA720 $CONFIG_ARCH_SA1100
dep_bool ' HuW WebPanel' CONFIG_SA1100_HUW_WEBPANEL $CONFIG_ARCH_SA1100 dep_bool ' HuW WebPanel' CONFIG_SA1100_HUW_WEBPANEL $CONFIG_ARCH_SA1100
dep_bool ' Itsy' CONFIG_SA1100_ITSY $CONFIG_ARCH_SA1100 dep_bool ' Itsy' CONFIG_SA1100_ITSY $CONFIG_ARCH_SA1100
...@@ -101,14 +104,38 @@ dep_bool ' Yopy' CONFIG_SA1100_YOPY $CONFIG_ARCH_SA1100 ...@@ -101,14 +104,38 @@ dep_bool ' Yopy' CONFIG_SA1100_YOPY $CONFIG_ARCH_SA1100
if [ "$CONFIG_ASSABET_NEPONSET" = "y" -o \ if [ "$CONFIG_ASSABET_NEPONSET" = "y" -o \
"$CONFIG_SA1100_JORNADA720" = "y" -o \ "$CONFIG_SA1100_JORNADA720" = "y" -o \
"$CONFIG_SA1100_PFS168" = "y" -o \ "$CONFIG_SA1100_PFS168" = "y" -o \
"$CONFIG_SA1100_XP860" = "y" ]; then "$CONFIG_SA1100_XP860" = "y" -o \
"$CONFIG_SA1100_GRAPHICSMASTER" = "y" -o \
"$CONFIG_SA1100_ADSBITSY" = "y" ]; then
define_bool CONFIG_SA1111 y define_bool CONFIG_SA1111 y
define_int CONFIG_FORCE_MAX_ZONEORDER 9
fi fi
endmenu endmenu
mainmenu_option next_comment mainmenu_option next_comment
comment 'CLPS711X/EP721X Implementations' comment 'CLPS711X/EP721X Implementations'
dep_bool ' CDB89712' CONFIG_ARCH_CDB89712 $CONFIG_ARCH_CLPS711X
dep_bool ' CLEP7312' CONFIG_ARCH_CLEP7312 $CONFIG_ARCH_CLPS711X
dep_bool ' EDB7211' CONFIG_ARCH_EDB7211 $CONFIG_ARCH_CLPS711X
dep_bool ' P720T' CONFIG_ARCH_P720T $CONFIG_ARCH_CLPS711X dep_bool ' P720T' CONFIG_ARCH_P720T $CONFIG_ARCH_CLPS711X
# XXX Maybe these should indicate register compatibility
# instead of being mutually exclusive.
if [ "$CONFIG_ARCH_EDB7211" = "y" ]; then
define_bool CONFIG_ARCH_EP7211 y
else
define_bool CONFIG_ARCH_EP7211 n
fi
if [ "$CONFIG_ARCH_P720T" = "y" ]; then
define_bool CONFIG_ARCH_EP7212 y
else
define_bool CONFIG_ARCH_EP7212 n
fi
if [ "$CONFIG_ARCH_EP7211" = "y" -o \
"$CONFIG_ARCH_EP7212" = "y" ]; then
bool ' EP72xx ROM boot' CONFIG_EP72XX_ROM_BOOT
fi
endmenu endmenu
# Definitions to make life easier # Definitions to make life easier
...@@ -196,7 +223,9 @@ else ...@@ -196,7 +223,9 @@ else
fi fi
# ARM720T # ARM720T
if [ "$CONFIG_ARCH_CLPS711X" = "y" -o "$CONFIG_ARCH_L7200" = "y" ]; then if [ "$CONFIG_ARCH_CLPS711X" = "y" -o \
"$CONFIG_ARCH_L7200" = "y" -o \
"$CONFIG_ARCH_CDB89712" = "y" ]; then
define_bool CONFIG_CPU_ARM720T y define_bool CONFIG_CPU_ARM720T y
else else
if [ "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then if [ "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then
...@@ -255,12 +284,13 @@ else ...@@ -255,12 +284,13 @@ else
define_bool CONFIG_CPU_SA1100 n define_bool CONFIG_CPU_SA1100 n
fi fi
#if [ "$CONFIG_CPU_32" = "y" ]; then if [ "$CONFIG_CPU_32" = "y" ]; then
# bool 'Support Thumb instructions' CONFIG_ARM_THUMB dep_bool 'Support Thumb instructions (experimental)' CONFIG_ARM_THUMB $CONFIG_EXPERIMENTAL
#fi fi
# Select various configuration options depending on the machine type # Select various configuration options depending on the machine type
if [ "$CONFIG_ARCH_SA1100" = "y" ]; then if [ "$CONFIG_ARCH_EDB7211" = "y" -o \
"$CONFIG_ARCH_SA1100" = "y" ]; then
define_bool CONFIG_DISCONTIGMEM y define_bool CONFIG_DISCONTIGMEM y
else else
define_bool CONFIG_DISCONTIGMEM n define_bool CONFIG_DISCONTIGMEM n
...@@ -289,6 +319,8 @@ if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o \ ...@@ -289,6 +319,8 @@ if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o \
"$CONFIG_ARCH_SHARK" = "y" -o \ "$CONFIG_ARCH_SHARK" = "y" -o \
"$CONFIG_ARCH_CLPS7500" = "y" -o \ "$CONFIG_ARCH_CLPS7500" = "y" -o \
"$CONFIG_ARCH_EBSA110" = "y" -o \ "$CONFIG_ARCH_EBSA110" = "y" -o \
"$CONFIG_ARCH_CDB89712" = "y" -o \
"$CONFIG_ARCH_EDB7211" = "y" -o \
"$CONFIG_ARCH_SA1100" = "y" ]; then "$CONFIG_ARCH_SA1100" = "y" ]; then
define_bool CONFIG_ISA y define_bool CONFIG_ISA y
else else
...@@ -318,6 +350,7 @@ bool 'Networking support' CONFIG_NET ...@@ -318,6 +350,7 @@ bool 'Networking support' CONFIG_NET
bool 'System V IPC' CONFIG_SYSVIPC bool 'System V IPC' CONFIG_SYSVIPC
bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
bool 'Sysctl support' CONFIG_SYSCTL bool 'Sysctl support' CONFIG_SYSCTL
comment 'At least one math emulation must be selected'
tristate 'NWFPE math emulation' CONFIG_FPE_NWFPE tristate 'NWFPE math emulation' CONFIG_FPE_NWFPE
dep_tristate 'FastFPE math emulation (experimental)' CONFIG_FPE_FASTFPE $CONFIG_EXPERIMENTAL dep_tristate 'FastFPE math emulation (experimental)' CONFIG_FPE_FASTFPE $CONFIG_EXPERIMENTAL
choice 'Kernel core (/proc/kcore) format' \ choice 'Kernel core (/proc/kcore) format' \
...@@ -335,6 +368,7 @@ if [ "$CONFIG_ARCH_EBSA110" = "y" -o \ ...@@ -335,6 +368,7 @@ if [ "$CONFIG_ARCH_EBSA110" = "y" -o \
"$CONFIG_ARCH_PERSONAL_SERVER" = "y" -o \ "$CONFIG_ARCH_PERSONAL_SERVER" = "y" -o \
"$CONFIG_ARCH_CATS" = "y" -o \ "$CONFIG_ARCH_CATS" = "y" -o \
"$CONFIG_ARCH_P720T" = "y" -o \ "$CONFIG_ARCH_P720T" = "y" -o \
"$CONFIG_ARCH_CDB89712" = "y" -o \
"$CONFIG_ARCH_ANAKIN" = "y" ]; then "$CONFIG_ARCH_ANAKIN" = "y" ]; then
string 'Default kernel command string' CONFIG_CMDLINE "" string 'Default kernel command string' CONFIG_CMDLINE ""
fi fi
...@@ -346,6 +380,7 @@ if [ "$CONFIG_ARCH_NETWINDER" = "y" -o \ ...@@ -346,6 +380,7 @@ if [ "$CONFIG_ARCH_NETWINDER" = "y" -o \
"$CONFIG_ARCH_CO285" = "y" -o \ "$CONFIG_ARCH_CO285" = "y" -o \
"$CONFIG_ARCH_SA1100" = "y" -o \ "$CONFIG_ARCH_SA1100" = "y" -o \
"$CONFIG_ARCH_INTEGRATOR" = "y" -o \ "$CONFIG_ARCH_INTEGRATOR" = "y" -o \
"$CONFIG_ARCH_CDB89712" = "y" -o \
"$CONFIG_ARCH_P720T" = "y" ]; then "$CONFIG_ARCH_P720T" = "y" ]; then
bool 'Timer and CPU usage LEDs' CONFIG_LEDS bool 'Timer and CPU usage LEDs' CONFIG_LEDS
if [ "$CONFIG_LEDS" = "y" ]; then if [ "$CONFIG_LEDS" = "y" ]; then
...@@ -429,7 +464,7 @@ fi ...@@ -429,7 +464,7 @@ fi
source drivers/ieee1394/Config.in source drivers/ieee1394/Config.in
source drivers/i2o/Config.in source drivers/message/i2o/Config.in
mainmenu_option next_comment mainmenu_option next_comment
comment 'ISDN subsystem' comment 'ISDN subsystem'
...@@ -510,6 +545,8 @@ if [ "$CONFIG_ARCH_ACORN" = "y" -o \ ...@@ -510,6 +545,8 @@ if [ "$CONFIG_ARCH_ACORN" = "y" -o \
endmenu endmenu
fi fi
source drivers/misc/Config.in
source drivers/usb/Config.in source drivers/usb/Config.in
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
......
...@@ -41,7 +41,7 @@ obj- := ...@@ -41,7 +41,7 @@ obj- :=
export-objs := armksyms.o dma.o ecard.o fiq.o io.o oldlatches.o time.o export-objs := armksyms.o dma.o ecard.o fiq.o io.o oldlatches.o time.o
no-irq-arch := $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) \ no-irq-arch := $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) \
$(CONFIG_ARCH_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \ $(CONFIG_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \
$(CONFIG_ARCH_SA1100) $(CONFIG_ARCH_SA1100)
ifneq ($(findstring y,$(no-irq-arch)),y) ifneq ($(findstring y,$(no-irq-arch)),y)
......
...@@ -54,22 +54,16 @@ extern int sys_exit(int); ...@@ -54,22 +54,16 @@ extern int sys_exit(int);
* compiler... (prototypes are not correct though, but that * compiler... (prototypes are not correct though, but that
* doesn't really matter since they're not versioned). * doesn't really matter since they're not versioned).
*/ */
extern void __gcc_bcmp(void);
extern void __ashldi3(void); extern void __ashldi3(void);
extern void __ashrdi3(void); extern void __ashrdi3(void);
extern void __cmpdi2(void);
extern void __divdi3(void);
extern void __divsi3(void); extern void __divsi3(void);
extern void __lshrdi3(void); extern void __lshrdi3(void);
extern void __moddi3(void);
extern void __modsi3(void); extern void __modsi3(void);
extern void __muldi3(void); extern void __muldi3(void);
extern void __negdi2(void);
extern void __ucmpdi2(void); extern void __ucmpdi2(void);
extern void __udivdi3(void); extern void __udivdi3(void);
extern void __udivmoddi4(void); extern void __udivmoddi4(void);
extern void __udivsi3(void); extern void __udivsi3(void);
extern void __umoddi3(void);
extern void __umodsi3(void); extern void __umodsi3(void);
extern void ret_from_exception(void); extern void ret_from_exception(void);
...@@ -213,23 +207,27 @@ EXPORT_SYMBOL(uaccess_kernel); ...@@ -213,23 +207,27 @@ EXPORT_SYMBOL(uaccess_kernel);
EXPORT_SYMBOL(uaccess_user); EXPORT_SYMBOL(uaccess_user);
#endif #endif
EXPORT_SYMBOL_NOVERS(__get_user_1);
EXPORT_SYMBOL_NOVERS(__get_user_2);
EXPORT_SYMBOL_NOVERS(__get_user_4);
EXPORT_SYMBOL_NOVERS(__get_user_8);
EXPORT_SYMBOL_NOVERS(__put_user_1);
EXPORT_SYMBOL_NOVERS(__put_user_2);
EXPORT_SYMBOL_NOVERS(__put_user_4);
EXPORT_SYMBOL_NOVERS(__put_user_8);
/* gcc lib functions */ /* gcc lib functions */
EXPORT_SYMBOL_NOVERS(__gcc_bcmp);
EXPORT_SYMBOL_NOVERS(__ashldi3); EXPORT_SYMBOL_NOVERS(__ashldi3);
EXPORT_SYMBOL_NOVERS(__ashrdi3); EXPORT_SYMBOL_NOVERS(__ashrdi3);
EXPORT_SYMBOL_NOVERS(__cmpdi2);
EXPORT_SYMBOL_NOVERS(__divdi3);
EXPORT_SYMBOL_NOVERS(__divsi3); EXPORT_SYMBOL_NOVERS(__divsi3);
EXPORT_SYMBOL_NOVERS(__lshrdi3); EXPORT_SYMBOL_NOVERS(__lshrdi3);
EXPORT_SYMBOL_NOVERS(__moddi3);
EXPORT_SYMBOL_NOVERS(__modsi3); EXPORT_SYMBOL_NOVERS(__modsi3);
EXPORT_SYMBOL_NOVERS(__muldi3); EXPORT_SYMBOL_NOVERS(__muldi3);
EXPORT_SYMBOL_NOVERS(__negdi2);
EXPORT_SYMBOL_NOVERS(__ucmpdi2); EXPORT_SYMBOL_NOVERS(__ucmpdi2);
EXPORT_SYMBOL_NOVERS(__udivdi3); EXPORT_SYMBOL_NOVERS(__udivdi3);
EXPORT_SYMBOL_NOVERS(__udivmoddi4); EXPORT_SYMBOL_NOVERS(__udivmoddi4);
EXPORT_SYMBOL_NOVERS(__udivsi3); EXPORT_SYMBOL_NOVERS(__udivsi3);
EXPORT_SYMBOL_NOVERS(__umoddi3);
EXPORT_SYMBOL_NOVERS(__umodsi3); EXPORT_SYMBOL_NOVERS(__umodsi3);
/* bitops */ /* bitops */
......
...@@ -288,9 +288,12 @@ pbus_assign_bus_resources(struct pci_bus *bus, struct pci_sys_data *root) ...@@ -288,9 +288,12 @@ pbus_assign_bus_resources(struct pci_bus *bus, struct pci_sys_data *root)
if (dev) { if (dev) {
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if(root->resource[i]) {
bus->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i]; bus->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
bus->resource[i]->end = root->resource[i]->end;
bus->resource[i]->name = bus->name; bus->resource[i]->name = bus->name;
} }
}
bus->resource[0]->flags |= pci_bridge_check_io(dev); bus->resource[0]->flags |= pci_bridge_check_io(dev);
bus->resource[1]->flags |= IORESOURCE_MEM; bus->resource[1]->flags |= IORESOURCE_MEM;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* We keep the old params compatibility cruft in one place (here) * We keep the old params compatibility cruft in one place (here)
* so we don't end up with lots of * so we don't end up with lots of mess around other places.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/types.h> #include <linux/types.h>
......
...@@ -148,17 +148,22 @@ static struct resource dma_resources[] = { ...@@ -148,17 +148,22 @@ static struct resource dma_resources[] = {
void __init isa_init_dma(dma_t *dma) void __init isa_init_dma(dma_t *dma)
{ {
int dmac_found; /*
* Try to autodetect presence of an ISA DMA controller.
* We do some minimal initialisation, and check that
* channel 0's DMA address registers are writeable.
*/
outb(0xff, 0x0d); outb(0xff, 0x0d);
outb(0xff, 0xda); outb(0xff, 0xda);
/*
* Write high and low address, and then read them back
* in the same order.
*/
outb(0x55, 0x00); outb(0x55, 0x00);
outb(0xaa, 0x00); outb(0xaa, 0x00);
dmac_found = inb(0x00) == 0x55 && inb(0x00) == 0xaa; if (inb(0) == 0x55 && inb(0) == 0xaa) {
if (dmac_found) {
int channel, i; int channel, i;
for (channel = 0; channel < 8; channel++) { for (channel = 0; channel < 8; channel++) {
......
...@@ -404,6 +404,7 @@ ENTRY(soft_irq_mask) ...@@ -404,6 +404,7 @@ ENTRY(soft_irq_mask)
.endm .endm
#elif defined(CONFIG_ARCH_L7200) #elif defined(CONFIG_ARCH_L7200)
#include <asm/hardware.h>
.equ irq_base_addr, IO_BASE_2 .equ irq_base_addr, IO_BASE_2
...@@ -625,8 +626,8 @@ __dabt_svc: sub sp, sp, #S_FRAME_SIZE ...@@ -625,8 +626,8 @@ __dabt_svc: sub sp, sp, #S_FRAME_SIZE
* This routine must not corrupt r9 * This routine must not corrupt r9
*/ */
#ifdef MULTI_CPU #ifdef MULTI_CPU
ldr r2, .LCprocfns ldr r2, .LCprocfns @ pass r0, r3 to
mov lr, pc mov lr, pc @ processor code
ldr pc, [r2] @ call processor specific code ldr pc, [r2] @ call processor specific code
#else #else
bl cpu_data_abort bl cpu_data_abort
...@@ -722,16 +723,16 @@ __pabt_svc: sub sp, sp, #S_FRAME_SIZE ...@@ -722,16 +723,16 @@ __pabt_svc: sub sp, sp, #S_FRAME_SIZE
.align 5 .align 5
__dabt_usr: sub sp, sp, #S_FRAME_SIZE @ Allocate frame size in one go __dabt_usr: sub sp, sp, #S_FRAME_SIZE @ Allocate frame size in one go
stmia sp, {r0 - r12} @ save r0 - r12 stmia sp, {r0 - r12} @ save r0 - r12
ldr r4, .LCabt ldr r7, .LCabt
add r3, sp, #S_PC add r5, sp, #S_PC
ldmia r4, {r0 - r2} @ Get USR pc, cpsr ldmia r7, {r0, r3, r4} @ Get USR pc, cpsr
stmia r3, {r0 - r2} @ Save USR pc, cpsr, old_r0 stmia r5, {r0, r3, r4} @ Save USR pc, cpsr, old_r0
stmdb r3, {sp, lr}^ stmdb r5, {sp, lr}^
alignment_trap r4, r7, __temp_abt alignment_trap r7, r7, __temp_abt
zero_fp zero_fp
#ifdef MULTI_CPU #ifdef MULTI_CPU
ldr r2, .LCprocfns ldr r2, .LCprocfns @ pass r0, r3 to
mov lr, pc mov lr, pc @ processor code
ldr pc, [r2] @ call processor specific code ldr pc, [r2] @ call processor specific code
#else #else
bl cpu_data_abort bl cpu_data_abort
......
...@@ -123,9 +123,8 @@ ENTRY(ret_from_fork) ...@@ -123,9 +123,8 @@ ENTRY(ret_from_fork)
.align 5 .align 5
ENTRY(vector_swi) ENTRY(vector_swi)
save_user_regs save_user_regs
mask_pc lr, lr
zero_fp zero_fp
ldr scno, [lr, #-4] @ get SWI instruction get_scno
arm710_bug_check scno, ip arm710_bug_check scno, ip
#ifdef CONFIG_ALIGNMENT_TRAP #ifdef CONFIG_ALIGNMENT_TRAP
......
...@@ -75,9 +75,9 @@ ...@@ -75,9 +75,9 @@
stmia sp, {r0 - r12} @ Calling r0 - r12 stmia sp, {r0 - r12} @ Calling r0 - r12
add r8, sp, #S_PC add r8, sp, #S_PC
stmdb r8, {sp, lr}^ @ Calling sp, lr stmdb r8, {sp, lr}^ @ Calling sp, lr
mrs r7, spsr mrs r8, spsr @ called from non-FIQ mode, so ok.
str lr, [sp, #S_PC] @ Save calling PC str lr, [sp, #S_PC] @ Save calling PC
str r7, [sp, #S_PSR] @ Save CPSR str r8, [sp, #S_PSR] @ Save CPSR
str r0, [sp, #S_OLD_R0] @ Save OLD_R0 str r0, [sp, #S_OLD_R0] @ Save OLD_R0
.endm .endm
...@@ -186,16 +186,34 @@ ...@@ -186,16 +186,34 @@
#endif #endif
/* /*
* These are the registers used in the syscall handler, and allow us to * These are the registers used in the syscall handler, and allow us to
* have in theory up to 7 arguments to a function. Note that tbl == why * have in theory up to 7 arguments to a function - r0 to r6.
* is intentional. *
* r7 is reserved for the system call number for thumb mode.
*
* Note that tbl == why is intentional.
* *
* We must set at least "tsk" and "why" when calling ret_with_reschedule. * We must set at least "tsk" and "why" when calling ret_with_reschedule.
*/ */
scno .req r9 @ syscall number scno .req r7 @ syscall number
tbl .req r8 @ syscall table pointer tbl .req r8 @ syscall table pointer
why .req r8 @ Linux syscall (!= 0) why .req r8 @ Linux syscall (!= 0)
tsk .req r7 @ current task tsk .req r9 @ current task
/*
* Get the system call number.
*/
.macro get_scno
#ifdef CONFIG_ARM_THUMB
tst r8, #T_BIT @ this is SPSR from save_user_regs
addne scno, r7, #OS_NUMBER << 20 @ put OS number in
ldreq scno, [lr, #-4]
#else
mask_pc lr, lr
ldr scno, [lr, #-4] @ get SWI instruction
#endif
.endm
...@@ -418,5 +418,4 @@ __lookup_architecture_type: ...@@ -418,5 +418,4 @@ __lookup_architecture_type:
mov r7, #0 @ unknown architecture mov r7, #0 @ unknown architecture
mov pc, lr mov pc, lr
2: ldmib r4, {r5, r6, r7} @ found, get results 2: ldmib r4, {r5, r6, r7} @ found, get results
mov r7, r7, lsr #18 @ pagetable byte offset
mov pc, lr mov pc, lr
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
static struct vm_area_struct init_mmap = INIT_MMAP;
static struct fs_struct init_fs = INIT_FS; static struct fs_struct init_fs = INIT_FS;
static struct files_struct init_files = INIT_FILES; static struct files_struct init_files = INIT_FILES;
static struct signal_struct init_signals = INIT_SIGNALS; static struct signal_struct init_signals = INIT_SIGNALS;
......
...@@ -260,10 +260,10 @@ request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc) ...@@ -260,10 +260,10 @@ request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc)
struct resource *res; struct resource *res;
int i; int i;
kernel_code.start = __virt_to_bus(init_mm.start_code); kernel_code.start = __virt_to_phys(init_mm.start_code);
kernel_code.end = __virt_to_bus(init_mm.end_code - 1); kernel_code.end = __virt_to_phys(init_mm.end_code - 1);
kernel_data.start = __virt_to_bus(init_mm.end_code); kernel_data.start = __virt_to_phys(init_mm.end_code);
kernel_data.end = __virt_to_bus(init_mm.brk - 1); kernel_data.end = __virt_to_phys(init_mm.brk - 1);
for (i = 0; i < mi->nr_banks; i++) { for (i = 0; i < mi->nr_banks; i++) {
unsigned long virt_start, virt_end; unsigned long virt_start, virt_end;
...@@ -520,9 +520,44 @@ void __init setup_arch(char **cmdline_p) ...@@ -520,9 +520,44 @@ void __init setup_arch(char **cmdline_p)
#endif #endif
} }
int get_cpuinfo(char * buffer) static const char *hwcap_str[] = {
"swp",
"half",
"thumb",
"26bit",
"fastmult",
"fpa",
"vfp",
"edsp",
NULL
};
/*
* get_cpuinfo - Get information on one CPU for use by the procfs.
*
* Prints info on the next CPU into buffer. Beware, doesn't check for
* buffer overflow. Current implementation of procfs assumes that the
* resulting data is <= 1K.
*
* Args:
* buffer -- you guessed it, the data buffer
* cpu_np -- Input: next cpu to get (start at 0). Output: Updated.
*
* Returns number of bytes written to buffer.
*/
int get_cpuinfo(char *buffer, unsigned *cpu_np)
{ {
char *p = buffer; char *p = buffer;
unsigned n;
int i;
/* No SMP at the moment, so just toggle 0/1 */
n = *cpu_np;
*cpu_np = 1;
if (n != 0) {
return (0);
}
p += sprintf(p, "Processor\t: %s %s rev %d (%s)\n", p += sprintf(p, "Processor\t: %s %s rev %d (%s)\n",
proc_info.manufacturer, proc_info.cpu_name, proc_info.manufacturer, proc_info.cpu_name,
...@@ -532,6 +567,15 @@ int get_cpuinfo(char * buffer) ...@@ -532,6 +567,15 @@ int get_cpuinfo(char * buffer)
loops_per_jiffy / (500000/HZ), loops_per_jiffy / (500000/HZ),
(loops_per_jiffy / (5000/HZ)) % 100); (loops_per_jiffy / (5000/HZ)) % 100);
/* dump out the processor features */
p += sprintf(p, "Features\t: ");
for (i = 0; hwcap_str[i]; i++)
if (elf_hwcap & (1 << i))
p += sprintf(p, "%s ", hwcap_str[i]);
p += sprintf(p, "\n\n");
p += sprintf(p, "Hardware\t: %s\n", machine_name); p += sprintf(p, "Hardware\t: %s\n", machine_name);
p += sprintf(p, "Revision\t: %04x\n", p += sprintf(p, "Revision\t: %04x\n",
......
/* /*
* linux/arch/arm/kernel/signal.c * linux/arch/arm/kernel/signal.c
* *
* Copyright (C) 1995, 1996 Russell King * Copyright (C) 1995-2001 Russell King
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -19,7 +19,9 @@ ...@@ -19,7 +19,9 @@
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/personality.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/elf.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/ucontext.h> #include <asm/ucontext.h>
...@@ -29,9 +31,24 @@ ...@@ -29,9 +31,24 @@
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
/*
* For ARM syscalls, we encode the syscall number into the instruction.
*/
#define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)) #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn))
#define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)) #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn))
/*
* For Thumb syscalls, we pass the syscall number via r7. We therefore
* need two 16-bit instructions.
*/
#define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
#define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
static const unsigned long retcodes[4] = {
SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN,
SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN
};
asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall); asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall);
int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
...@@ -208,11 +225,11 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs) ...@@ -208,11 +225,11 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs)
sigset_t set; sigset_t set;
/* /*
* Since we stacked the signal on a word boundary, * Since we stacked the signal on a 64-bit boundary,
* then 'sp' should be word aligned here. If it's * then 'sp' should be word aligned here. If it's
* not, then the user is trying to mess with us. * not, then the user is trying to mess with us.
*/ */
if (regs->ARM_sp & 3) if (regs->ARM_sp & 7)
goto badframe; goto badframe;
frame = (struct sigframe *)regs->ARM_sp; frame = (struct sigframe *)regs->ARM_sp;
...@@ -251,11 +268,11 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) ...@@ -251,11 +268,11 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
sigset_t set; sigset_t set;
/* /*
* Since we stacked the signal on a word boundary, * Since we stacked the signal on a 64-bit boundary,
* then 'sp' should be word aligned here. If it's * then 'sp' should be word aligned here. If it's
* not, then the user is trying to mess with us. * not, then the user is trying to mess with us.
*/ */
if (regs->ARM_sp & 3) if (regs->ARM_sp & 7)
goto badframe; goto badframe;
frame = (struct rt_sigframe *)regs->ARM_sp; frame = (struct rt_sigframe *)regs->ARM_sp;
...@@ -319,8 +336,8 @@ setup_sigcontext(struct sigcontext *sc, /*struct _fpstate *fpstate,*/ ...@@ -319,8 +336,8 @@ setup_sigcontext(struct sigcontext *sc, /*struct _fpstate *fpstate,*/
return err; return err;
} }
static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, static inline void *
unsigned long framesize) get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
{ {
unsigned long sp = regs->ARM_sp; unsigned long sp = regs->ARM_sp;
...@@ -331,77 +348,103 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, ...@@ -331,77 +348,103 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
sp = current->sas_ss_sp + current->sas_ss_size; sp = current->sas_ss_sp + current->sas_ss_size;
/* /*
* No matter what happens, 'sp' must be word * ATPCS B01 mandates 8-byte alignment
* aligned otherwise nasty things could happen
*/ */
/* ATPCS B01 mandates 8-byte alignment */
return (void *)((sp - framesize) & ~7); return (void *)((sp - framesize) & ~7);
} }
static void setup_frame(int sig, struct k_sigaction *ka, static int
sigset_t *set, struct pt_regs *regs) setup_return(struct pt_regs *regs, struct k_sigaction *ka,
unsigned long *rc, void *frame, int usig)
{ {
struct sigframe *frame; unsigned long handler = (unsigned long)ka->sa.sa_handler;
unsigned long retcode; unsigned long retcode;
int err = 0; int thumb = 0;
#ifdef CONFIG_CPU_32
frame = get_sigframe(ka, regs, sizeof(*frame)); unsigned long cpsr = regs->ARM_cpsr;
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) /*
goto segv_and_exit; * Maybe we need to deliver a 32-bit signal to a 26-bit task.
*/
if (ka->sa.sa_flags & SA_THIRTYTWO)
cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]); #ifdef CONFIG_ARM_THUMB
if (elf_hwcap & HWCAP_THUMB) {
/*
* The LSB of the handler determines if we're going to
* be using THUMB or ARM mode for this signal handler.
*/
thumb = handler & 1;
if (_NSIG_WORDS > 1) { if (thumb)
err |= __copy_to_user(frame->extramask, &set->sig[1], cpsr |= T_BIT;
sizeof(frame->extramask)); else
cpsr &= ~T_BIT;
} }
#endif
#endif
/* Set up to return from userspace. If provided, use a stub
already in userspace. */
if (ka->sa.sa_flags & SA_RESTORER) { if (ka->sa.sa_flags & SA_RESTORER) {
retcode = (unsigned long)ka->sa.sa_restorer; retcode = (unsigned long)ka->sa.sa_restorer;
} else { } else {
retcode = (unsigned long)&frame->retcode; unsigned int idx = thumb;
__put_user_error(SWI_SYS_SIGRETURN, &frame->retcode, err);
flush_icache_range(retcode, retcode + 4);
}
if (err) if (ka->sa.sa_flags & SA_SIGINFO)
goto segv_and_exit; idx += 2;
if (current->exec_domain && current->exec_domain->signal_invmap && sig < 32) if (__put_user(retcodes[idx], rc))
regs->ARM_r0 = current->exec_domain->signal_invmap[sig]; return 1;
else
regs->ARM_r0 = sig; flush_icache_range((unsigned long)rc,
(unsigned long)(rc + 1));
retcode = ((unsigned long)rc) + thumb;
}
regs->ARM_r0 = usig;
regs->ARM_sp = (unsigned long)frame; regs->ARM_sp = (unsigned long)frame;
regs->ARM_lr = retcode; regs->ARM_lr = retcode;
regs->ARM_pc = (unsigned long)ka->sa.sa_handler; regs->ARM_pc = handler & (thumb ? ~1 : ~3);
#if defined(CONFIG_CPU_32)
/* Maybe we need to deliver a 32-bit signal to a 26-bit task. */ #ifdef CONFIG_CPU_32
if (ka->sa.sa_flags & SA_THIRTYTWO) regs->ARM_cpsr = cpsr;
regs->ARM_cpsr = USR_MODE;
#endif #endif
if (valid_user_regs(regs))
return;
segv_and_exit: return 0;
if (sig == SIGSEGV)
ka->sa.sa_handler = SIG_DFL;
force_sig(SIGSEGV, current);
} }
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, static int
sigset_t *set, struct pt_regs *regs) setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe *frame; struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
unsigned long retcode;
int err = 0; int err = 0;
frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe)); if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
return 1;
err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]);
if (_NSIG_WORDS > 1) {
err |= __copy_to_user(frame->extramask, &set->sig[1],
sizeof(frame->extramask));
}
if (err == 0)
err = setup_return(regs, ka, &frame->retcode, frame, usig);
return err;
}
static int
setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs *regs)
{
struct rt_sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
int err = 0;
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
goto segv_and_exit; return 1;
__put_user_error(&frame->info, &frame->pinfo, err); __put_user_error(&frame->info, &frame->pinfo, err);
__put_user_error(&frame->uc, &frame->puc, err); __put_user_error(&frame->uc, &frame->puc, err);
...@@ -414,24 +457,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -414,24 +457,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
regs, set->sig[0]); regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
/* Set up to return from userspace. If provided, use a stub if (err == 0)
already in userspace. */ err = setup_return(regs, ka, &frame->retcode, frame, usig);
if (ka->sa.sa_flags & SA_RESTORER) {
retcode = (unsigned long)ka->sa.sa_restorer;
} else {
retcode = (unsigned long)&frame->retcode;
__put_user_error(SWI_SYS_RT_SIGRETURN, &frame->retcode, err);
flush_icache_range(retcode, retcode + 4);
}
if (err)
goto segv_and_exit;
if (current->exec_domain && current->exec_domain->signal_invmap && sig < 32)
regs->ARM_r0 = current->exec_domain->signal_invmap[sig];
else
regs->ARM_r0 = sig;
if (err == 0) {
/* /*
* For realtime signals we must also set the second and third * For realtime signals we must also set the second and third
* arguments for the signal handler. * arguments for the signal handler.
...@@ -439,22 +468,9 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -439,22 +468,9 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
*/ */
regs->ARM_r1 = (unsigned long)frame->pinfo; regs->ARM_r1 = (unsigned long)frame->pinfo;
regs->ARM_r2 = (unsigned long)frame->puc; regs->ARM_r2 = (unsigned long)frame->puc;
}
regs->ARM_sp = (unsigned long)frame; return err;
regs->ARM_lr = retcode;
regs->ARM_pc = (unsigned long)ka->sa.sa_handler;
#if defined(CONFIG_CPU_32)
/* Maybe we need to deliver a 32-bit signal to a 26-bit task. */
if (ka->sa.sa_flags & SA_THIRTYTWO)
regs->ARM_cpsr = USR_MODE;
#endif
if (valid_user_regs(regs))
return;
segv_and_exit:
if (sig == SIGSEGV)
ka->sa.sa_handler = SIG_DFL;
force_sig(SIGSEGV, current);
} }
/* /*
...@@ -464,22 +480,47 @@ static void ...@@ -464,22 +480,47 @@ static void
handle_signal(unsigned long sig, struct k_sigaction *ka, handle_signal(unsigned long sig, struct k_sigaction *ka,
siginfo_t *info, sigset_t *oldset, struct pt_regs * regs) siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
{ {
/* Set up the stack frame */ struct task_struct *tsk = current;
int usig = sig;
int ret;
/*
* translate the signal
*/
if (usig < 32 && tsk->exec_domain && tsk->exec_domain->signal_invmap)
usig = tsk->exec_domain->signal_invmap[usig];
/*
* Set up the stack frame
*/
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
setup_rt_frame(sig, ka, info, oldset, regs); ret = setup_rt_frame(usig, ka, info, oldset, regs);
else else
setup_frame(sig, ka, oldset, regs); ret = setup_frame(usig, ka, oldset, regs);
/*
* Check that the resulting registers are actually sane.
*/
ret |= !valid_user_regs(regs);
if (ret == 0) {
if (ka->sa.sa_flags & SA_ONESHOT) if (ka->sa.sa_flags & SA_ONESHOT)
ka->sa.sa_handler = SIG_DFL; ka->sa.sa_handler = SIG_DFL;
if (!(ka->sa.sa_flags & SA_NODEFER)) { if (!(ka->sa.sa_flags & SA_NODEFER)) {
spin_lock_irq(&current->sigmask_lock); spin_lock_irq(&tsk->sigmask_lock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); sigorsets(&tsk->blocked, &tsk->blocked,
sigaddset(&current->blocked,sig); &ka->sa.sa_mask);
recalc_sigpending(current); sigaddset(&tsk->blocked, sig);
spin_unlock_irq(&current->sigmask_lock); recalc_sigpending(tsk);
spin_unlock_irq(&tsk->sigmask_lock);
}
return;
} }
if (sig == SIGSEGV)
ka->sa.sa_handler = SIG_DFL;
force_sig(SIGSEGV, tsk);
} }
/* /*
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <asm/hardware.h> #include <asm/hardware.h>
extern int setup_arm_irq(int, struct irqaction *); extern int setup_arm_irq(int, struct irqaction *);
extern void setup_timer(void);
extern rwlock_t xtime_lock; extern rwlock_t xtime_lock;
extern unsigned long wall_jiffies; extern unsigned long wall_jiffies;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/atomic.h> #include <asm/atomic.h>
...@@ -176,7 +177,7 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) ...@@ -176,7 +177,7 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
printk("Process %s (pid: %d, stackpage=%08lx)\n", printk("Process %s (pid: %d, stackpage=%08lx)\n",
current->comm, current->pid, 4096+(unsigned long)tsk); current->comm, current->pid, 4096+(unsigned long)tsk);
if (!user_mode(regs)) { if (!user_mode(regs) || in_interrupt()) {
mm_segment_t fs; mm_segment_t fs;
/* /*
...@@ -209,7 +210,7 @@ void die_if_kernel(const char *str, struct pt_regs *regs, int err) ...@@ -209,7 +210,7 @@ void die_if_kernel(const char *str, struct pt_regs *regs, int err)
asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode) asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode)
{ {
unsigned long addr; unsigned long *pc;
siginfo_t info; siginfo_t info;
/* /*
...@@ -217,11 +218,11 @@ asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode) ...@@ -217,11 +218,11 @@ asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode)
* whether we're in Thumb mode or not. * whether we're in Thumb mode or not.
*/ */
regs->ARM_pc -= thumb_mode(regs) ? 2 : 4; regs->ARM_pc -= thumb_mode(regs) ? 2 : 4;
addr = instruction_pointer(regs); pc = (unsigned long *)instruction_pointer(regs);
#ifdef CONFIG_DEBUG_USER #ifdef CONFIG_DEBUG_USER
printk(KERN_INFO "%s (%d): undefined instruction: pc=%08lx\n", printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n",
current->comm, current->pid, addr); current->comm, current->pid, pc);
dump_instr(regs); dump_instr(regs);
#endif #endif
...@@ -231,7 +232,7 @@ asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode) ...@@ -231,7 +232,7 @@ asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode)
info.si_signo = SIGILL; info.si_signo = SIGILL;
info.si_errno = 0; info.si_errno = 0;
info.si_code = ILL_ILLOPC; info.si_code = ILL_ILLOPC;
info.si_addr = (void *)addr; info.si_addr = pc;
force_sig_info(SIGILL, &info, current); force_sig_info(SIGILL, &info, current);
......
...@@ -13,15 +13,20 @@ obj-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ ...@@ -13,15 +13,20 @@ obj-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
copy_page.o delay.o findbit.o memchr.o memcpy.o \ copy_page.o delay.o findbit.o memchr.o memcpy.o \
memset.o memzero.o setbit.o strncpy_from_user.o \ memset.o memzero.o setbit.o strncpy_from_user.o \
strnlen_user.o strchr.o strrchr.o testchangebit.o \ strnlen_user.o strchr.o strrchr.o testchangebit.o \
testclearbit.o testsetbit.o uaccess.o testclearbit.o testsetbit.o uaccess.o getuser.o \
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
ucmpdi2.o udivdi3.o lib1funcs.o
obj-m := obj-m :=
obj-n := obj-n :=
obj-$(CONFIG_VT)+= kbd.o
obj-arc := ecard.o io-acorn.o floppydma.o obj-arc := ecard.o io-acorn.o floppydma.o
obj-rpc := ecard.o io-acorn.o floppydma.o obj-rpc := ecard.o io-acorn.o floppydma.o
obj-clps7500 := io-acorn.o obj-clps7500 := io-acorn.o
obj-l7200 := io-acorn.o obj-l7200 := io-acorn.o
obj-shark := io-shark.o obj-shark := io-shark.o
obj-edb7211 := io-acorn.o
obj-y += $(obj-$(MACHINE)) obj-y += $(obj-$(MACHINE))
......
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
DItype
__ashldi3 (DItype u, word_type b)
{
DIunion w;
word_type bm;
DIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.low = 0;
w.s.high = (USItype)uu.s.low << -bm;
}
else
{
USItype carries = (USItype)uu.s.low >> bm;
w.s.low = (USItype)uu.s.low << b;
w.s.high = ((USItype)uu.s.high << b) | carries;
}
return w.ll;
}
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
DItype
__ashrdi3 (DItype u, word_type b)
{
DIunion w;
word_type bm;
DIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
/* w.s.high = 1..1 or 0..0 */
w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
w.s.low = uu.s.high >> -bm;
}
else
{
USItype carries = (USItype)uu.s.high << bm;
w.s.high = uu.s.high >> b;
w.s.low = ((USItype)uu.s.low >> b) | carries;
}
return w.ll;
}
/* gcclib.h -- definitions for various functions 'borrowed' from gcc-2.95.3 */
/* I Molton 29/07/01 */
#define BITS_PER_UNIT 8
#define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
typedef unsigned int UQItype __attribute__ ((mode (QI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
typedef int DItype __attribute__ ((mode (DI)));
typedef int word_type __attribute__ ((mode (__word__)));
typedef unsigned int UDItype __attribute__ ((mode (DI)));
#if 0 /* FIXME: endian test here!!! */
struct DIstruct {SItype high, low;};
#else
struct DIstruct {SItype low, high;};
#endif
typedef union
{
struct DIstruct s;
DItype ll;
} DIunion;
/*
* linux/arch/arm/lib/getuser.S
*
* Copyright (C) 2001 Russell King
*
* 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.
*
* Idea from x86 version, (C) Copyright 1998 Linus Torvalds
*
* These functions have a non-standard call interface to make them more
* efficient, especially as they return an error value in addition to
* the "real" return value.
*
* __get_user_X
*
* Inputs: r0 contains the address
* Outputs: r0 is the error code
* r1, r2 contains the zero-extended value
* lr corrupted
*
* No other registers must be altered. (see include/asm-arm/uaccess.h
* for specific ASM register usage).
*
* Note that ADDR_LIMIT is either 0 or 0xc0000000.
* Note also that it is intended that __get_user_bad is not global.
*/
#include <asm/constants.h>
.global __get_user_1
__get_user_1:
bic r1, sp, #0x1f00
bic r1, r1, #0x00ff
ldr r1, [r1, #TSK_ADDR_LIMIT]
sub r1, r1, #1
cmp r0, r1
1: ldrlsbt r1, [r0]
movls r0, #0
movls pc, lr
b __get_user_bad
.global __get_user_2
__get_user_2:
bic r2, sp, #0x1f00
bic r2, r2, #0x00ff
ldr r2, [r2, #TSK_ADDR_LIMIT]
sub r2, r2, #2
cmp r0, r2
2: ldrlsbt r1, [r0], #1
3: ldrlsbt r2, [r0]
orrls r1, r1, r2, lsl #8
movls r0, #0
movls pc, lr
b __get_user_bad
.global __get_user_4
__get_user_4:
bic r1, sp, #0x1f00
bic r1, r1, #0x00ff
ldr r1, [r1, #TSK_ADDR_LIMIT]
sub r1, r1, #4
cmp r0, r1
4: ldrlst r1, [r0]
movls r0, #0
movls pc, lr
b __get_user_bad
.global __get_user_8
__get_user_8:
bic r2, sp, #0x1f00
bic r2, r2, #0x00ff
ldr r2, [r2, #TSK_ADDR_LIMIT]
sub r2, r2, #8
cmp r0, r2
5: ldrlst r1, [r0], #4
6: ldrlst r2, [r0]
movls r0, #0
movls pc, lr
/* fall through */
__get_user_bad:
mov r2, #0
mov r1, #0
mov r0, #-14
mov pc, lr
.section __ex_table, "a"
.long 1b, __get_user_bad
.long 2b, __get_user_bad
.long 3b, __get_user_bad
.long 4b, __get_user_bad
.long 5b, __get_user_bad
.long 6b, __get_user_bad
.previous
#include <linux/config.h>
#include <linux/kd.h>
int (*k_setkeycode)(unsigned int, unsigned int);
int (*k_getkeycode)(unsigned int);
int (*k_translate)(unsigned char, unsigned char *, char);
char (*k_unexpected_up)(unsigned char);
void (*k_leds)(unsigned char);
#ifdef CONFIG_MAGIC_SYSRQ
int k_sysrq_key;
unsigned char *k_sysrq_xlate;
#endif
This diff is collapsed.
/* longlong.h -- based on code from gcc-2.95.3
definitions for mixed size 32/64 bit arithmetic.
Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
This definition file is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2, or (at your option) any later version.
This definition file is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Borrowed from GCC 2.95.3, I Molton 29/07/01 */
#ifndef SI_TYPE_SIZE
#define SI_TYPE_SIZE 32
#endif
#define __BITS4 (SI_TYPE_SIZE / 4)
#define __ll_B (1L << (SI_TYPE_SIZE / 2))
#define __ll_lowpart(t) ((USItype) (t) % __ll_B)
#define __ll_highpart(t) ((USItype) (t) / __ll_B)
/* Define auxiliary asm macros.
1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
multiplies two USItype integers MULTIPLER and MULTIPLICAND,
and generates a two-part USItype product in HIGH_PROD and
LOW_PROD.
2) __umulsidi3(a,b) multiplies two USItype integers A and B,
and returns a UDItype product. This is just a variant of umul_ppmm.
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
denominator) divides a two-word unsigned integer, composed by the
integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
places the quotient in QUOTIENT and the remainder in REMAINDER.
HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
If, in addition, the most significant bit of DENOMINATOR must be 1,
then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
denominator). Like udiv_qrnnd but the numbers are signed. The
quotient is rounded towards 0.
5) count_leading_zeros(count, x) counts the number of zero-bits from
the msb to the first non-zero bit. This is the number of steps X
needs to be shifted left to set the msb. Undefined for X == 0.
6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
high_addend_2, low_addend_2) adds two two-word unsigned integers,
composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and
LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is
lost.
7) sub_ddmmss(high_difference, low_difference, high_minuend,
low_minuend, high_subtrahend, low_subtrahend) subtracts two
two-word unsigned integers, composed by HIGH_MINUEND_1 and
LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
respectively. The result is placed in HIGH_DIFFERENCE and
LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
and is lost.
If any of these macros are left undefined for a particular CPU,
C macros are used. */
#if defined (__arm__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("adds %1, %4, %5
adc %0, %2, %3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \
"rI" ((USItype) (bh)), \
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subs %1, %4, %5
sbc %0, %2, %3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \
"rI" ((USItype) (bh)), \
"r" ((USItype) (al)), \
"rI" ((USItype) (bl)))
#define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm
mov %2, %5, lsr #16
mov %0, %6, lsr #16
bic %3, %5, %2, lsl #16
bic %4, %6, %0, lsl #16
mul %1, %3, %4
mul %4, %2, %4
mul %3, %0, %3
mul %0, %2, %0
adds %3, %4, %3
addcs %0, %0, #65536
adds %1, %1, %3, lsl #16
adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
: "r" ((USItype) (a)), \
"r" ((USItype) (b)));}
#define UMUL_TIME 20
#define UDIV_TIME 100
#endif /* __arm__ */
#define __umulsidi3(u, v) \
({DIunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; })
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
do { \
USItype __d1, __d0, __q1, __q0; \
USItype __r1, __r0, __m; \
__d1 = __ll_highpart (d); \
__d0 = __ll_lowpart (d); \
\
__r1 = (n1) % __d1; \
__q1 = (n1) / __d1; \
__m = (USItype) __q1 * __d0; \
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
if (__r1 < __m) \
{ \
__q1--, __r1 += (d); \
if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
if (__r1 < __m) \
__q1--, __r1 += (d); \
} \
__r1 -= __m; \
\
__r0 = __r1 % __d1; \
__q0 = __r1 / __d1; \
__m = (USItype) __q0 * __d0; \
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
if (__r0 < __m) \
{ \
__q0--, __r0 += (d); \
if (__r0 >= (d)) \
if (__r0 < __m) \
__q0--, __r0 += (d); \
} \
__r0 -= __m; \
\
(q) = (USItype) __q1 * __ll_B | __q0; \
(r) = __r0; \
} while (0)
#define UDIV_NEEDS_NORMALIZATION 1
#define udiv_qrnnd __udiv_qrnnd_c
extern const UQItype __clz_tab[];
#define count_leading_zeros(count, x) \
do { \
USItype __xr = (x); \
USItype __a; \
\
if (SI_TYPE_SIZE <= 32) \
{ \
__a = __xr < ((USItype)1<<2*__BITS4) \
? (__xr < ((USItype)1<<__BITS4) ? 0 : __BITS4) \
: (__xr < ((USItype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
} \
else \
{ \
for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8) \
if (((__xr >> __a) & 0xff) != 0) \
break; \
} \
\
(count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
} while (0)
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
DItype
__lshrdi3 (DItype u, word_type b)
{
DIunion w;
word_type bm;
DIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.high = 0;
w.s.low = (USItype)uu.s.high >> -bm;
}
else
{
USItype carries = (USItype)uu.s.high << bm;
w.s.high = (USItype)uu.s.high >> b;
w.s.low = ((USItype)uu.s.low >> b) | carries;
}
return w.ll;
}
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
#define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm
mov %2, %5, lsr #16
mov %0, %6, lsr #16
bic %3, %5, %2, lsl #16
bic %4, %6, %0, lsl #16
mul %1, %3, %4
mul %4, %2, %4
mul %3, %0, %3
mul %0, %2, %0
adds %3, %4, %3
addcs %0, %0, #65536
adds %1, %1, %3, lsl #16
adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
: "r" ((USItype) (a)), \
"r" ((USItype) (b)));}
#define __umulsidi3(u, v) \
({DIunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; })
DItype
__muldi3 (DItype u, DItype v)
{
DIunion w;
DIunion uu, vv;
uu.ll = u,
vv.ll = v;
w.ll = __umulsidi3 (uu.s.low, vv.s.low);
w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
+ (USItype) uu.s.high * (USItype) vv.s.low);
return w.ll;
}
/*
* linux/arch/arm/lib/putuser.S
*
* Copyright (C) 2001 Russell King
*
* 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.
*
* Idea from x86 version, (C) Copyright 1998 Linus Torvalds
*
* These functions have a non-standard call interface to make
* them more efficient, especially as they return an error
* value in addition to the "real" return value.
*
* __put_user_X
*
* Inputs: r0 contains the address
* r1, r2 contains the value
* Outputs: r0 is the error code
* lr corrupted
*
* No other registers must be altered. (see include/asm-arm/uaccess.h
* for specific ASM register usage).
*
* Note that ADDR_LIMIT is either 0 or 0xc0000000
* Note also that it is intended that __put_user_bad is not global.
*/
#include <asm/constants.h>
.global __put_user_1
__put_user_1:
bic r2, sp, #0x1f00
bic r2, r2, #0x00ff
ldr r2, [r2, #TSK_ADDR_LIMIT]
sub r2, r2, #1
cmp r0, r2
1: strlsbt r1, [r0]
movls r0, #0
movls pc, lr
b __put_user_bad
.global __put_user_2
__put_user_2:
bic r2, sp, #0x1f00
bic r2, r2, #0x00ff
ldr r2, [r2, #TSK_ADDR_LIMIT]
sub r2, r2, #2
cmp r0, r2
2: strlsbt r1, [r0], #1
movls r1, r1, lsr #8
3: strlsbt r1, [r0]
movls r0, #0
movls pc, lr
b __put_user_bad
.global __put_user_4
__put_user_4:
bic r2, sp, #0x1f00
bic r2, r2, #0x00ff
ldr r2, [r2, #TSK_ADDR_LIMIT]
sub r2, r2, #4
cmp r0, r2
4: strlst r1, [r0]
movls r0, #0
movls pc, lr
b __put_user_bad
.global __put_user_8
__put_user_8:
bic ip, sp, #0x1f00
bic ip, ip, #0x00ff
ldr ip, [ip, #TSK_ADDR_LIMIT]
sub ip, ip, #8
cmp r0, ip
5: strlst r1, [r0], #4
6: strlst r2, [r0]
movls r0, #0
movls pc, lr
/* fall through */
__put_user_bad:
mov r0, #-14
mov pc, lr
.section __ex_table, "a"
.long 1b, __put_user_bad
.long 2b, __put_user_bad
.long 3b, __put_user_bad
.long 4b, __put_user_bad
.long 5b, __put_user_bad
.long 6b, __put_user_bad
.previous
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
word_type
__ucmpdi2 (DItype a, DItype b)
{
DIunion au, bu;
au.ll = a, bu.ll = b;
if ((USItype) au.s.high < (USItype) bu.s.high)
return 0;
else if ((USItype) au.s.high > (USItype) bu.s.high)
return 2;
if ((USItype) au.s.low < (USItype) bu.s.low)
return 0;
else if ((USItype) au.s.low > (USItype) bu.s.low)
return 2;
return 1;
}
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
#include "longlong.h"
static const UQItype __clz_tab[] =
{
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
};
UDItype
__udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
{
DIunion ww;
DIunion nn, dd;
DIunion rr;
USItype d0, d1, n0, n1, n2;
USItype q0, q1;
USItype b, bm;
nn.ll = n;
dd.ll = d;
d0 = dd.s.low;
d1 = dd.s.high;
n0 = nn.s.low;
n1 = nn.s.high;
if (d1 == 0)
{
if (d0 > n1)
{
/* 0q = nn / 0D */
count_leading_zeros (bm, d0);
if (bm != 0)
{
/* Normalize, i.e. make the most significant bit of the
denominator set. */
d0 = d0 << bm;
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
n0 = n0 << bm;
}
udiv_qrnnd (q0, n0, n1, n0, d0);
q1 = 0;
/* Remainder in n0 >> bm. */
}
else
{
/* qq = NN / 0d */
if (d0 == 0)
d0 = 1 / d0; /* Divide intentionally by zero. */
count_leading_zeros (bm, d0);
if (bm == 0)
{
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the
leading quotient digit q1 = 1).
This special case is necessary, not an optimization.
(Shifts counts of SI_TYPE_SIZE are undefined.) */
n1 -= d0;
q1 = 1;
}
else
{
/* Normalize. */
b = SI_TYPE_SIZE - bm;
d0 = d0 << bm;
n2 = n1 >> b;
n1 = (n1 << bm) | (n0 >> b);
n0 = n0 << bm;
udiv_qrnnd (q1, n1, n2, n1, d0);
}
/* n1 != d0... */
udiv_qrnnd (q0, n0, n1, n0, d0);
/* Remainder in n0 >> bm. */
}
if (rp != 0)
{
rr.s.low = n0 >> bm;
rr.s.high = 0;
*rp = rr.ll;
}
}
else
{
if (d1 > n1)
{
/* 00 = nn / DD */
q0 = 0;
q1 = 0;
/* Remainder in n1n0. */
if (rp != 0)
{
rr.s.low = n0;
rr.s.high = n1;
*rp = rr.ll;
}
}
else
{
/* 0q = NN / dd */
count_leading_zeros (bm, d1);
if (bm == 0)
{
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
conclude (the most significant bit of n1 is set) /\ (the
quotient digit q0 = 0 or 1).
This special case is necessary, not an optimization. */
/* The condition on the next line takes advantage of that
n1 >= d1 (true due to program flow). */
if (n1 > d1 || n0 >= d0)
{
q0 = 1;
sub_ddmmss (n1, n0, n1, n0, d1, d0);
}
else
q0 = 0;
q1 = 0;
if (rp != 0)
{
rr.s.low = n0;
rr.s.high = n1;
*rp = rr.ll;
}
}
else
{
USItype m1, m0;
/* Normalize. */
b = SI_TYPE_SIZE - bm;
d1 = (d1 << bm) | (d0 >> b);
d0 = d0 << bm;
n2 = n1 >> b;
n1 = (n1 << bm) | (n0 >> b);
n0 = n0 << bm;
udiv_qrnnd (q0, n1, n2, n1, d1);
umul_ppmm (m1, m0, q0, d0);
if (m1 > n1 || (m1 == n1 && m0 > n0))
{
q0--;
sub_ddmmss (m1, m0, m1, m0, d1, d0);
}
q1 = 0;
/* Remainder in (n1n0 - m1m0) >> bm. */
if (rp != 0)
{
sub_ddmmss (n1, n0, n1, n0, m1, m0);
rr.s.low = (n1 << b) | (n0 >> bm);
rr.s.high = n1 >> bm;
*rp = rr.ll;
}
}
}
}
ww.s.low = q0;
ww.s.high = q1;
return ww.ll;
}
UDItype
__udivdi3 (UDItype n, UDItype d)
{
return __udivmoddi4 (n, d, (UDItype *) 0);
}
...@@ -279,6 +279,9 @@ void insb(unsigned int port, void *from, int len) ...@@ -279,6 +279,9 @@ void insb(unsigned int port, void *from, int len)
__raw_readsb(ISAIO_BASE + off, from, len); __raw_readsb(ISAIO_BASE + off, from, len);
} }
EXPORT_SYMBOL(outsb);
EXPORT_SYMBOL(insb);
void outsw(unsigned int port, const void *from, int len) void outsw(unsigned int port, const void *from, int len)
{ {
u32 off; u32 off;
...@@ -309,6 +312,9 @@ void insw(unsigned int port, void *from, int len) ...@@ -309,6 +312,9 @@ void insw(unsigned int port, void *from, int len)
__raw_readsw(ISAIO_BASE + off, from, len); __raw_readsw(ISAIO_BASE + off, from, len);
} }
EXPORT_SYMBOL(outsw);
EXPORT_SYMBOL(insw);
void outsl(unsigned int port, const void *from, int len) void outsl(unsigned int port, const void *from, int len)
{ {
panic("outsl not supported on this architecture"); panic("outsl not supported on this architecture");
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (C) 2001 Deep Blue Solutions Ltd. * Copyright (C) 2001 Deep Blue Solutions Ltd.
* *
* $Id: cpu.c,v 1.1 2001/06/17 10:12:37 rmk Exp $ * $Id: cpu.c,v 1.2 2001/09/22 12:11:17 rmk Exp $
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -70,7 +70,7 @@ static struct vco freq_to_vco(unsigned int freq_khz, int factor) ...@@ -70,7 +70,7 @@ static struct vco freq_to_vco(unsigned int freq_khz, int factor)
* Validate the speed in khz. If it is outside our * Validate the speed in khz. If it is outside our
* range, then return the lowest. * range, then return the lowest.
*/ */
unsigned int cpufreq_validatespeed(unsigned int freq_khz) unsigned int integrator_validatespeed(unsigned int freq_khz)
{ {
struct vco vco; struct vco vco;
...@@ -87,7 +87,7 @@ unsigned int cpufreq_validatespeed(unsigned int freq_khz) ...@@ -87,7 +87,7 @@ unsigned int cpufreq_validatespeed(unsigned int freq_khz)
return vco_to_freq(vco, 1); return vco_to_freq(vco, 1);
} }
void cpufreq_setspeed(unsigned int freq_khz) void integrator_setspeed(unsigned int freq_khz)
{ {
struct vco vco = freq_to_vco(freq_khz, 1); struct vco vco = freq_to_vco(freq_khz, 1);
u_int cm_osc; u_int cm_osc;
...@@ -122,6 +122,7 @@ static int __init cpu_init(void) ...@@ -122,6 +122,7 @@ static int __init cpu_init(void)
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
cpufreq_init(cpu_freq_khz); cpufreq_init(cpu_freq_khz);
cpufreq_setfunctions(integrator_validatespeed, integrator_setspeed);
#endif #endif
cm_stat = __raw_readl(CM_STAT); cm_stat = __raw_readl(CM_STAT);
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/malloc.h> #include <linux/slab.h>
#include <linux/mman.h> #include <linux/mman.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/malloc.h> #include <linux/slab.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
......
...@@ -14,31 +14,38 @@ obj-m := ...@@ -14,31 +14,38 @@ obj-m :=
obj-n := obj-n :=
obj- := obj- :=
export-objs := assabet.o bitsy.o freebird.o huw_webpanel.o yopy.o \ export-objs := assabet.o h3600.o freebird.o huw_webpanel.o yopy.o \
generic.o hwtimer.o irq.o usb_ctl.o usb_recv.o usb_send.o \ generic.o hwtimer.o irq.o usb_ctl.o usb_recv.o usb_send.o \
dma-sa1100.o dma-sa1111.o pcipool.o dma-sa1100.o dma-sa1111.o pcipool.o sa1111-pcibuf.o
# Common support (must be linked before board specific support) # Common support (must be linked before board specific support)
obj-y += generic.o irq.o dma-sa1100.o obj-y += generic.o irq.o dma-sa1100.o
obj-$(CONFIG_SA1111) += sa1111.o dma-sa1111.o sa1111-pcibuf.o pcipool.o
# This needs to be cleaned up. We probably need to have SA1100 # This needs to be cleaned up. We probably need to have SA1100
# and SA1110 config symbols. # and SA1110 config symbols.
#
# We link the CPU support next, so that RAM timings can be tuned.
ifeq ($(CONFIG_CPU_FREQ),y) ifeq ($(CONFIG_CPU_FREQ),y)
obj-$(CONFIG_SA1100_ASSABET) += cpu-sa1110.o obj-$(CONFIG_SA1100_ASSABET) += cpu-sa1110.o
obj-$(CONFIG_SA1100_LART) += cpu-sa1100.o obj-$(CONFIG_SA1100_LART) += cpu-sa1100.o
endif endif
# Next, the SA1111 stuff.
obj-$(CONFIG_SA1111) += sa1111.o dma-sa1111.o
obj-$(CONFIG_USB_OHCI_SA1111) += sa1111-pcibuf.o pcipool.o
# Specific board support # Specific board support
obj-$(CONFIG_SA1100_ADSBITSY) += adsbitsy.o
obj-$(CONFIG_SA1100_ASSABET) += assabet.o obj-$(CONFIG_SA1100_ASSABET) += assabet.o
obj-$(CONFIG_ASSABET_NEPONSET) += neponset.o obj-$(CONFIG_ASSABET_NEPONSET) += neponset.o
obj-$(CONFIG_SA1100_BITSY) += bitsy.o
obj-$(CONFIG_SA1100_BRUTUS) += brutus.o obj-$(CONFIG_SA1100_BRUTUS) += brutus.o
obj-$(CONFIG_SA1100_CERF) += cerf.o obj-$(CONFIG_SA1100_CERF) += cerf.o
obj-$(CONFIG_SA1100_EMPEG) += empeg.o obj-$(CONFIG_SA1100_EMPEG) += empeg.o
obj-$(CONFIG_SA1100_FLEXANET) += flexanet.o obj-$(CONFIG_SA1100_FLEXANET) += flexanet.o
obj-$(CONFIG_SA1100_FREEBIRD) += freebird.o obj-$(CONFIG_SA1100_FREEBIRD) += freebird.o
obj-$(CONFIG_SA1100_GRAPHICSCLIENT) += graphicsclient.o obj-$(CONFIG_SA1100_GRAPHICSCLIENT) += graphicsclient.o
obj-$(CONFIG_SA1100_GRAPHICSMASTER) += graphicsmaster.o
obj-$(CONFIG_SA1100_H3600) += h3600.o
obj-$(CONFIG_SA1100_HUW_WEBPANEL) += huw_webpanel.o obj-$(CONFIG_SA1100_HUW_WEBPANEL) += huw_webpanel.o
obj-$(CONFIG_SA1100_ITSY) += itsy.o obj-$(CONFIG_SA1100_ITSY) += itsy.o
obj-$(CONFIG_SA1100_JORNADA720) += jornada720.o obj-$(CONFIG_SA1100_JORNADA720) += jornada720.o
...@@ -63,6 +70,7 @@ leds-$(CONFIG_SA1100_FLEXANET) += leds-flexanet.o ...@@ -63,6 +70,7 @@ leds-$(CONFIG_SA1100_FLEXANET) += leds-flexanet.o
leds-$(CONFIG_SA1100_GRAPHICSCLIENT) += leds-graphicsclient.o leds-$(CONFIG_SA1100_GRAPHICSCLIENT) += leds-graphicsclient.o
leds-$(CONFIG_SA1100_LART) += leds-lart.o leds-$(CONFIG_SA1100_LART) += leds-lart.o
leds-$(CONFIG_SA1100_PFS168) += leds-pfs168.o leds-$(CONFIG_SA1100_PFS168) += leds-pfs168.o
leds-$(CONFIG_SA1100_GRAPHICSMASTER) += leds-graphicsmaster.o
obj-$(CONFIG_LEDS) += $(leds-y) obj-$(CONFIG_LEDS) += $(leds-y)
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
/*
* linux/arch/arm/mach-sa1100/adsbitsy.c
*
* Author: Woojung Huh
*
* Pieces specific to the ADS Bitsy
*
* 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/sched.h>
#include <linux/interrupt.h>
#include <linux/ptrace.h>
#include <linux/serial_core.h>
#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h>
#include <asm/arch/irq.h>
#include "generic.h"
#include "sa1111.h"
static int __init adsbitsy_init(void)
{
int ret;
if (!machine_is_adsbitsy())
return -ENODEV;
/*
* Ensure that the memory bus request/grant signals are setup,
* and the grant is held in its inactive state
*/
sa1110_mb_disable();
/*
* Reset SA1111
*/
GPCR |= GPIO_GPIO26;
udelay(1000);
GPSR |= GPIO_GPIO26;
/*
* Probe for SA1111.
*/
ret = sa1111_probe();
if (ret < 0)
return ret;
/*
* We found it. Wake the chip up.
*/
sa1111_wake();
/*
* The SDRAM configuration of the SA1110 and the SA1111 must
* match. This is very important to ensure that SA1111 accesses
* don't corrupt the SDRAM. Note that this ungates the SA1111's
* MBGNT signal, so we must have called sa1110_mb_disable()
* beforehand.
*/
sa1111_configure_smc(1,
FExtr(MDCNFG, MDCNFG_SA1110_DRAC0),
FExtr(MDCNFG, MDCNFG_SA1110_TDL0));
/*
* Enable PWM control for LCD
*/
SKPCR |= SKPCR_PWMCLKEN;
SKPWM0 = 0x7F; // VEE
SKPEN0 = 1;
SKPWM1 = 0x01; // Backlight
SKPEN1 = 1;
/*
* We only need to turn on DCLK whenever we want to use the
* DMA. It can otherwise be held firmly in the off position.
*/
SKPCR |= SKPCR_DCLKEN;
/*
* Enable the SA1110 memory bus request and grant signals.
*/
sa1110_mb_enable();
set_GPIO_IRQ_edge(GPIO_GPIO0, GPIO_RISING_EDGE);
sa1111_init_irq(SA1100_GPIO_TO_IRQ(0));
return 0;
}
__initcall(adsbitsy_init);
static void __init adsbitsy_init_irq(void)
{
/* First the standard SA1100 IRQs */
sa1100_init_irq();
}
/*
* Initialization fixup
*/
static void __init
fixup_adsbitsy(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi)
{
SET_BANK( 0, 0xc0000000, 32*1024*1024 );
mi->nr_banks = 1;
ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
setup_ramdisk( 1, 0, 0, 8192 );
setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
}
static struct map_desc adsbitsy_io_desc[] __initdata = {
/* virtual physical length domain r w c b */
{ 0xe8000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */
{ 0xf4000000, 0x18000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA1111 */
LAST_DESC
};
static int adsbitsy_uart_open(struct uart_port *port, struct uart_info *info)
{
if (port->mapbase == _Ser1UTCR0) {
Ser1SDCR0 |= SDCR0_UART;
// Set RTS Output and High (should be done in the set_mctrl fn)
GPDR |= GPIO_GPIO15;
GPCR |= GPIO_GPIO15;
// Set CTS Input
GPDR &= ~GPIO_GPIO14;
} else if (port->mapbase == _Ser2UTCR0) {
Ser2UTCR4 = Ser2HSCR0 = 0;
// Set RTS Output and High (should be done in the set_mctrl fn)
GPDR |= GPIO_GPIO17;
GPCR |= GPIO_GPIO17;
// Set CTS Input
GPDR &= ~GPIO_GPIO16;
} else if (port->mapbase == _Ser2UTCR0) {
// Set RTS Output and High (should be done in the set_mctrl fn)
GPDR |= GPIO_GPIO19;
GPCR |= GPIO_GPIO19;
// Set CTS Input
GPDR &= ~GPIO_GPIO18;
}
return 0;
}
static struct sa1100_port_fns adsbitsy_port_fns __initdata = {
open: adsbitsy_uart_open,
};
static void __init adsbitsy_map_io(void)
{
sa1100_map_io();
iotable_init(adsbitsy_io_desc);
sa1110_register_uart_fns(&adsbitsy_port_fns);
sa1100_register_uart(0, 3);
sa1100_register_uart(1, 1);
sa1100_register_uart(2, 2);
}
MACHINE_START(ADSBITSY, "ADS Bitsy")
BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
FIXUP(fixup_adsbitsy)
MAPIO(adsbitsy_map_io)
INITIRQ(adsbitsy_init_irq)
MACHINE_END
...@@ -47,6 +47,7 @@ static int __init assabet_init(void) ...@@ -47,6 +47,7 @@ static int __init assabet_init(void)
* or BCR_clear(). * or BCR_clear().
*/ */
BCR = BCR_value = BCR_DB1111; BCR = BCR_value = BCR_DB1111;
NCR_0 = 0;
#ifndef CONFIG_ASSABET_NEPONSET #ifndef CONFIG_ASSABET_NEPONSET
printk( "Warning: Neponset detected but full support " printk( "Warning: Neponset detected but full support "
...@@ -101,6 +102,8 @@ static void __init get_assabet_scr(void) ...@@ -101,6 +102,8 @@ static void __init get_assabet_scr(void)
SCR_value = scr; SCR_value = scr;
} }
extern void convert_to_tag_list(struct param_struct *params, int mem_init);
static void __init static void __init
fixup_assabet(struct machine_desc *desc, struct param_struct *params, fixup_assabet(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi) char **cmdline, struct meminfo *mi)
...@@ -114,6 +117,12 @@ fixup_assabet(struct machine_desc *desc, struct param_struct *params, ...@@ -114,6 +117,12 @@ fixup_assabet(struct machine_desc *desc, struct param_struct *params,
if (machine_has_neponset()) if (machine_has_neponset())
printk("Neponset expansion board detected\n"); printk("Neponset expansion board detected\n");
/*
* Apparantly bootldr uses a param_struct. Groan.
*/
if (t->hdr.tag != ATAG_CORE)
convert_to_tag_list(params, 1);
if (t->hdr.tag != ATAG_CORE) { if (t->hdr.tag != ATAG_CORE) {
t->hdr.tag = ATAG_CORE; t->hdr.tag = ATAG_CORE;
t->hdr.size = tag_size(tag_core); t->hdr.size = tag_size(tag_core);
...@@ -265,7 +274,6 @@ static void __init assabet_map_io(void) ...@@ -265,7 +274,6 @@ static void __init assabet_map_io(void)
neponset_map_io(); neponset_map_io();
#endif #endif
sa1100_register_uart(1, 2);
if (machine_has_neponset()) { if (machine_has_neponset()) {
/* /*
* When Neponset is attached, the first UART should be * When Neponset is attached, the first UART should be
...@@ -295,7 +303,7 @@ static void __init assabet_map_io(void) ...@@ -295,7 +303,7 @@ static void __init assabet_map_io(void)
* excessive power drain. --rmk * excessive power drain. --rmk
*/ */
GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM;
GPCR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; GPCR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM;
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (C) 2001 Russell King * Copyright (C) 2001 Russell King
* *
* $Id: cpu-sa1110.c,v 1.3 2001/08/12 15:41:53 rmk Exp $ * $Id: cpu-sa1110.c,v 1.5 2001/09/10 13:25:58 rmk Exp $
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -258,14 +258,13 @@ static int __init sa1110_sdram_init(void) ...@@ -258,14 +258,13 @@ static int __init sa1110_sdram_init(void)
{ {
struct sdram_params *sdram = NULL; struct sdram_params *sdram = NULL;
unsigned int cur_freq = cpufreq_get(smp_processor_id()); unsigned int cur_freq = cpufreq_get(smp_processor_id());
int ret = -ENODEV;
if (machine_is_assabet()) if (machine_is_assabet())
sdram = &tc59sm716_cl3_params; sdram = &tc59sm716_cl3_params;
if (sdram) { if (sdram) {
printk(KERN_DEBUG "SDRAM: tck: %d trcd: %d trp: %d" printk(KERN_DEBUG "SDRAM: tck: %d trcd: %d trp: %d"
" twr: %d refresh: %d cas_latency: %d", " twr: %d refresh: %d cas_latency: %d\n",
sdram->tck, sdram->trcd, sdram->trp, sdram->tck, sdram->trcd, sdram->trp,
sdram->twr, sdram->refresh, sdram->cas_latency); sdram->twr, sdram->refresh, sdram->cas_latency);
......
...@@ -68,26 +68,30 @@ static inline int start_sa1100_dma(sa1100_dma_t * dma, dma_addr_t dma_ptr, int s ...@@ -68,26 +68,30 @@ static inline int start_sa1100_dma(sa1100_dma_t * dma, dma_addr_t dma_ptr, int s
{ {
dma_regs_t *regs = dma->regs; dma_regs_t *regs = dma->regs;
int status; int status;
int use_bufa;
status = regs->RdDCSR; status = regs->RdDCSR;
/* If both DMA buffers are started, there's nothing else we can do. */ /* If both DMA buffers are started, there's nothing else we can do. */
if ((status & DCSR_STRTA) && (status & DCSR_STRTB)) { if ((status & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB)) {
DPRINTK("start: st %#x busy\n", status); DPRINTK("start: st %#x busy\n", status);
return -EBUSY; return -EBUSY;
} }
use_bufa = (((status & DCSR_BIU) && (status & DCSR_STRTB)) || if (((status & DCSR_BIU) && (status & DCSR_STRTB)) ||
(!(status & DCSR_BIU) && !(status & DCSR_STRTA))); (!(status & DCSR_BIU) && !(status & DCSR_STRTA))) {
if (use_bufa) { if (status & DCSR_DONEA) {
regs->ClrDCSR = DCSR_DONEA | DCSR_STRTA; /* give a chance for the interrupt to be processed */
goto irq_pending;
}
regs->DBSA = dma_ptr; regs->DBSA = dma_ptr;
regs->DBTA = size; regs->DBTA = size;
regs->SetDCSR = DCSR_STRTA | DCSR_IE | DCSR_RUN; regs->SetDCSR = DCSR_STRTA | DCSR_IE | DCSR_RUN;
DPRINTK("start a=%#x s=%d on A\n", dma_ptr, size); DPRINTK("start a=%#x s=%d on A\n", dma_ptr, size);
} else { } else {
regs->ClrDCSR = DCSR_DONEB | DCSR_STRTB; if (status & DCSR_DONEB) {
/* give a chance for the interrupt to be processed */
goto irq_pending;
}
regs->DBSB = dma_ptr; regs->DBSB = dma_ptr;
regs->DBTB = size; regs->DBTB = size;
regs->SetDCSR = DCSR_STRTB | DCSR_IE | DCSR_RUN; regs->SetDCSR = DCSR_STRTB | DCSR_IE | DCSR_RUN;
...@@ -95,6 +99,9 @@ static inline int start_sa1100_dma(sa1100_dma_t * dma, dma_addr_t dma_ptr, int s ...@@ -95,6 +99,9 @@ static inline int start_sa1100_dma(sa1100_dma_t * dma, dma_addr_t dma_ptr, int s
} }
return 0; return 0;
irq_pending:
return -EAGAIN;
} }
...@@ -204,10 +211,15 @@ static void dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) ...@@ -204,10 +211,15 @@ static void dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
DPRINTK("IRQ: b=%#x st=%#x\n", (int) dma->curr->id, status); DPRINTK("IRQ: b=%#x st=%#x\n", (int) dma->curr->id, status);
dma->regs->ClrDCSR = DCSR_ERROR | DCSR_DONEA | DCSR_DONEB; if (status & (DCSR_ERROR)) {
if (!(status & (DCSR_DONEA | DCSR_DONEB))) printk(KERN_ERR "DMA on \"%s\" caused an error\n", dma->device_id);
return; dma->regs->ClrDCSR = DCSR_ERROR;
}
dma->regs->ClrDCSR = status & (DCSR_DONEA | DCSR_DONEB);
if (status & DCSR_DONEA)
sa1100_dma_done (dma);
if (status & DCSR_DONEB)
sa1100_dma_done (dma); sa1100_dma_done (dma);
} }
...@@ -435,7 +447,7 @@ int sa1100_dma_stop(dmach_t channel) ...@@ -435,7 +447,7 @@ int sa1100_dma_stop(dmach_t channel)
dma->curr = NULL; dma->curr = NULL;
} }
dma->spin_ref = 0; dma->spin_ref = 0;
dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB; dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_DONEA|DCSR_DONEB;
process_dma(dma); process_dma(dma);
local_irq_restore(flags); local_irq_restore(flags);
return 0; return 0;
...@@ -455,7 +467,6 @@ int sa1100_dma_resume(dmach_t channel) ...@@ -455,7 +467,6 @@ int sa1100_dma_resume(dmach_t channel)
if (dma->stopped) { if (dma->stopped) {
int flags; int flags;
save_flags_cli(flags); save_flags_cli(flags);
dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_RUN|DCSR_IE;
dma->stopped = 0; dma->stopped = 0;
dma->spin_ref = 0; dma->spin_ref = 0;
process_dma(dma); process_dma(dma);
...@@ -478,7 +489,7 @@ int sa1100_dma_flush_all(dmach_t channel) ...@@ -478,7 +489,7 @@ int sa1100_dma_flush_all(dmach_t channel)
if (channel_is_sa1111_sac(channel)) if (channel_is_sa1111_sac(channel))
sa1111_reset_sac_dma(channel); sa1111_reset_sac_dma(channel);
else else
dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_RUN|DCSR_IE; dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_DONEA|DCSR_DONEB|DCSR_RUN|DCSR_IE;
buf = dma->curr; buf = dma->curr;
if (!buf) if (!buf)
buf = dma->tail; buf = dma->tail;
......
...@@ -314,7 +314,7 @@ int sa1111_check_dma_bug(dma_addr_t addr){ ...@@ -314,7 +314,7 @@ int sa1111_check_dma_bug(dma_addr_t addr){
if(physaddr<(1<<20)) if(physaddr<(1<<20))
return 0; return 0;
switch(FExtr(SMCR, SMCR_DRAC)){ switch(FExtr(SBI_SMCR, SMCR_DRAC)){
case 01: /* 10 row + bank address bits, A<20> must not be set */ case 01: /* 10 row + bank address bits, A<20> must not be set */
if(physaddr & (1<<20)) if(physaddr & (1<<20))
return -1; return -1;
...@@ -341,7 +341,7 @@ int sa1111_check_dma_bug(dma_addr_t addr){ ...@@ -341,7 +341,7 @@ int sa1111_check_dma_bug(dma_addr_t addr){
break; break;
default: default:
printk(KERN_ERR "%s(): invalid SMCR DRAC value 0%o\n", printk(KERN_ERR "%s(): invalid SMCR DRAC value 0%o\n",
__FUNCTION__, FExtr(SMCR, SMCR_DRAC)); __FUNCTION__, FExtr(SBI_SMCR, SMCR_DRAC));
return -1; return -1;
} }
......
...@@ -69,7 +69,7 @@ EXPORT_SYMBOL(get_cclk_frequency); ...@@ -69,7 +69,7 @@ EXPORT_SYMBOL(get_cclk_frequency);
* Validate the speed in khz. If we can't generate the precise * Validate the speed in khz. If we can't generate the precise
* frequency requested, round it down (to be on the safe side). * frequency requested, round it down (to be on the safe side).
*/ */
unsigned int cpufreq_validatespeed(unsigned int khz) unsigned int sa1100_validatespeed(unsigned int khz)
{ {
int i; int i;
...@@ -87,7 +87,7 @@ unsigned int cpufreq_validatespeed(unsigned int khz) ...@@ -87,7 +87,7 @@ unsigned int cpufreq_validatespeed(unsigned int khz)
* above, we can match for an exact frequency. If we don't find * above, we can match for an exact frequency. If we don't find
* an exact match, we will to set the lowest frequency to be safe. * an exact match, we will to set the lowest frequency to be safe.
*/ */
void cpufreq_setspeed(unsigned int khz) void sa1100_setspeed(unsigned int khz)
{ {
int i; int i;
...@@ -103,6 +103,7 @@ void cpufreq_setspeed(unsigned int khz) ...@@ -103,6 +103,7 @@ void cpufreq_setspeed(unsigned int khz)
static int __init sa1100_init_clock(void) static int __init sa1100_init_clock(void)
{ {
cpufreq_init(get_cclk_frequency() * 100); cpufreq_init(get_cclk_frequency() * 100);
cpufreq_setfunctions(sa1100_validatespeed, sa1100_setspeed);
return 0; return 0;
} }
......
...@@ -131,14 +131,15 @@ fixup_graphicsclient(struct machine_desc *desc, struct param_struct *params, ...@@ -131,14 +131,15 @@ fixup_graphicsclient(struct machine_desc *desc, struct param_struct *params,
mi->nr_banks = 2; mi->nr_banks = 2;
ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
setup_ramdisk( 1, 0, 0, 4096 ); setup_ramdisk( 1, 0, 0, 8192 );
setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 ); setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
} }
static struct map_desc graphicsclient_io_desc[] __initdata = { static struct map_desc graphicsclient_io_desc[] __initdata = {
/* virtual physical length domain r w c b */ /* virtual physical length domain r w c b */
{ 0xe8000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */ { 0xe8000000, 0x08000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */
{ 0xf0000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */ { 0xf0000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */
{ 0xf1000000, 0x18000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CAN */
LAST_DESC LAST_DESC
}; };
......
/*
* linux/arch/arm/mach-sa1100/graphicsmaster.c
*
* Pieces specific to the GraphicsMaster board
*
* 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/sched.h>
#include <linux/interrupt.h>
#include <linux/ptrace.h>
#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h>
#include <asm/arch/irq.h>
#include "generic.h"
#include "sa1111.h"
static int __init graphicsmaster_init(void)
{
int ret;
if (!machine_is_graphicsmaster())
return -ENODEV;
/*
* Ensure that the memory bus request/grant signals are setup,
* and the grant is held in its inactive state
*/
sa1110_mb_disable();
/*
* Probe for SA1111.
*/
ret = sa1111_probe();
if (ret < 0)
return ret;
/*
* We found it. Wake the chip up.
*/
sa1111_wake();
/*
* The SDRAM configuration of the SA1110 and the SA1111 must
* match. This is very important to ensure that SA1111 accesses
* don't corrupt the SDRAM. Note that this ungates the SA1111's
* MBGNT signal, so we must have called sa1110_mb_disable()
* beforehand.
*/
sa1111_configure_smc(1,
FExtr(MDCNFG, MDCNFG_SA1110_DRAC0),
FExtr(MDCNFG, MDCNFG_SA1110_TDL0));
/*
* Enable PWM control for LCD
*/
SKPCR |= SKPCR_PWMCLKEN;
SKPWM0 = 0x7F; // VEE
SKPEN0 = 1;
SKPWM1 = 0x01; // Backlight
SKPEN1 = 1;
/*
* We only need to turn on DCLK whenever we want to use the
* DMA. It can otherwise be held firmly in the off position.
*/
SKPCR |= SKPCR_DCLKEN;
/*
* Enable the SA1110 memory bus request and grant signals.
*/
sa1110_mb_enable();
sa1111_init_irq(ADS_EXT_IRQ(0));
return 0;
}
__initcall(graphicsmaster_init);
/*
* Handlers for GraphicsMaster's external IRQ logic
*/
static void ADS_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
{
int i;
while( (irq = ADS_INT_ST1 | (ADS_INT_ST2 << 8)) ){
for( i = 0; i < 16; i++ )
if( irq & (1<<i) ) {
do_IRQ( ADS_EXT_IRQ(i), regs );
}
}
}
static struct irqaction ADS_ext_irq = {
name: "ADS_ext_IRQ",
handler: ADS_IRQ_demux,
flags: SA_INTERRUPT
};
static void ADS_mask_and_ack_irq0(unsigned int irq)
{
int mask = (1 << (irq - ADS_EXT_IRQ(0)));
ADS_INT_EN1 &= ~mask;
ADS_INT_ST1 = mask;
}
static void ADS_mask_irq0(unsigned int irq)
{
ADS_INT_ST1 = (1 << (irq - ADS_EXT_IRQ(0)));
}
static void ADS_unmask_irq0(unsigned int irq)
{
ADS_INT_EN1 |= (1 << (irq - ADS_EXT_IRQ(0)));
}
static void ADS_mask_and_ack_irq1(unsigned int irq)
{
int mask = (1 << (irq - ADS_EXT_IRQ(8)));
ADS_INT_EN2 &= ~mask;
ADS_INT_ST2 = mask;
}
static void ADS_mask_irq1(unsigned int irq)
{
ADS_INT_ST2 = (1 << (irq - ADS_EXT_IRQ(8)));
}
static void ADS_unmask_irq1(unsigned int irq)
{
ADS_INT_EN2 |= (1 << (irq - ADS_EXT_IRQ(8)));
}
static void __init graphicsmaster_init_irq(void)
{
int irq;
/* First the standard SA1100 IRQs */
sa1100_init_irq();
/* disable all IRQs */
ADS_INT_EN1 = 0;
ADS_INT_EN2 = 0;
/* clear all IRQs */
ADS_INT_ST1 = 0xff;
ADS_INT_ST2 = 0xff;
for (irq = ADS_EXT_IRQ(0); irq <= ADS_EXT_IRQ(7); irq++) {
irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1;
irq_desc[irq].mask_ack = ADS_mask_and_ack_irq0;
irq_desc[irq].mask = ADS_mask_irq0;
irq_desc[irq].unmask = ADS_unmask_irq0;
}
for (irq = ADS_EXT_IRQ(8); irq <= ADS_EXT_IRQ(15); irq++) {
irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1;
irq_desc[irq].mask_ack = ADS_mask_and_ack_irq1;
irq_desc[irq].mask = ADS_mask_irq1;
irq_desc[irq].unmask = ADS_unmask_irq1;
}
GPDR &= ~GPIO_GPIO0;
set_GPIO_IRQ_edge(GPIO_GPIO0, GPIO_FALLING_EDGE);
setup_arm_irq( IRQ_GPIO0, &ADS_ext_irq );
}
/*
* Initialization fixup
*/
static void __init
fixup_graphicsmaster(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi)
{
SET_BANK( 0, 0xc0000000, 16*1024*1024 );
mi->nr_banks = 1;
SET_BANK( 1, 0xc8000000, 16*1024*1024 );
mi->nr_banks = 2;
ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
setup_ramdisk( 1, 0, 0, 8192 );
setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
}
static struct map_desc graphicsmaster_io_desc[] __initdata = {
/* virtual physical length domain r w c b */
{ 0xe8000000, 0x08000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */
{ 0xf0000000, 0x10000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* CPLD */
{ 0xf1000000, 0x40000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* CAN */
{ 0xf4000000, 0x18000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
LAST_DESC
};
static void __init graphicsmaster_map_io(void)
{
sa1100_map_io();
iotable_init(graphicsmaster_io_desc);
sa1100_register_uart(0, 3);
sa1100_register_uart(1, 1);
sa1100_register_uart(2, 2);
}
MACHINE_START(GRAPHICSMASTER, "ADS GraphicsMaster")
BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
FIXUP(fixup_graphicsmaster)
MAPIO(graphicsmaster_map_io)
INITIRQ(graphicsmaster_init_irq)
MACHINE_END
/* /*
* linux/arch/arm/mach-sa1100/bitsy.c * linux/arch/arm/mach-sa1100/h3600.c
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -25,85 +25,87 @@ ...@@ -25,85 +25,87 @@
* Bitsy has extended, write-only memory-mapped GPIO's * Bitsy has extended, write-only memory-mapped GPIO's
*/ */
static int bitsy_egpio = EGPIO_BITSY_RS232_ON; static int h3600_egpio = EGPIO_H3600_RS232_ON;
void clr_bitsy_egpio(unsigned long x) void clr_h3600_egpio(unsigned long x)
{ {
bitsy_egpio &= ~x; h3600_egpio &= ~x;
BITSY_EGPIO = bitsy_egpio; H3600_EGPIO = h3600_egpio;
} }
void set_bitsy_egpio(unsigned long x) void set_h3600_egpio(unsigned long x)
{ {
bitsy_egpio |= x; h3600_egpio |= x;
BITSY_EGPIO = bitsy_egpio; H3600_EGPIO = h3600_egpio;
} }
EXPORT_SYMBOL(clr_bitsy_egpio); EXPORT_SYMBOL(clr_h3600_egpio);
EXPORT_SYMBOL(set_bitsy_egpio); EXPORT_SYMBOL(set_h3600_egpio);
/* /*
* low-level UART features * Low-level UART features.
*
* Note that RTS, CTS and DCD are all active low.
*/ */
static void bitsy_uart_set_mctrl(struct uart_port *port, u_int mctrl) static void h3600_uart_set_mctrl(struct uart_port *port, u_int mctrl)
{ {
if (port->mapbase == _Ser3UTCR0) { if (port->mapbase == _Ser3UTCR0) {
if (mctrl & TIOCM_RTS) if (mctrl & TIOCM_RTS)
GPCR = GPIO_BITSY_COM_RTS; GPCR = GPIO_H3600_COM_RTS;
else else
GPSR = GPIO_BITSY_COM_RTS; GPSR = GPIO_H3600_COM_RTS;
} }
} }
static int bitsy_uart_get_mctrl(struct uart_port *port) static int h3600_uart_get_mctrl(struct uart_port *port)
{ {
int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR; int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
if (port->mapbase == _Ser3UTCR0) { if (port->mapbase == _Ser3UTCR0) {
int gplr = GPLR; int gplr = GPLR;
if (gplr & GPIO_BITSY_COM_DCD) if (gplr & GPIO_H3600_COM_DCD)
ret &= ~TIOCM_CD; ret &= ~TIOCM_CD;
if (gplr & GPIO_BITSY_COM_CTS) if (gplr & GPIO_H3600_COM_CTS)
ret &= ~TIOCM_CTS; ret &= ~TIOCM_CTS;
} }
return ret; return ret;
} }
static void bitsy_dcd_intr(int irq, void *dev_id, struct pt_regs *regs) static void h3600_dcd_intr(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct uart_info *info = dev_id; struct uart_info *info = dev_id;
/* Note: should only call this if something has changed */ /* Note: should only call this if something has changed */
uart_handle_dcd_change(info, GPLR & GPIO_BITSY_COM_DCD); uart_handle_dcd_change(info, !(GPLR & GPIO_H3600_COM_DCD));
} }
static void bitsy_cts_intr(int irq, void *dev_id, struct pt_regs *regs) static void h3600_cts_intr(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct uart_info *info = dev_id; struct uart_info *info = dev_id;
/* Note: should only call this if something has changed */ /* Note: should only call this if something has changed */
uart_handle_cts_change(info, GPLR & GPIO_BITSY_COM_CTS); uart_handle_cts_change(info, !(GPLR & GPIO_H3600_COM_CTS));
} }
static void bitsy_uart_pm(struct uart_port *port, u_int state, u_int oldstate) static void h3600_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
{ {
if (port->mapbase == _Ser2UTCR0) { if (port->mapbase == _Ser2UTCR0) {
if (state == 0) { if (state == 0) {
set_bitsy_egpio(EGPIO_BITSY_IR_ON); set_h3600_egpio(EGPIO_H3600_IR_ON);
} else { } else {
clr_bitsy_egpio(EGPIO_BITSY_IR_ON); clr_h3600_egpio(EGPIO_H3600_IR_ON);
} }
} else if (port->mapbase == _Ser3UTCR0) { } else if (port->mapbase == _Ser3UTCR0) {
if (state == 0) { if (state == 0) {
set_bitsy_egpio(EGPIO_BITSY_RS232_ON); set_h3600_egpio(EGPIO_H3600_RS232_ON);
} else { } else {
clr_bitsy_egpio(EGPIO_BITSY_RS232_ON); clr_h3600_egpio(EGPIO_H3600_RS232_ON);
} }
} }
} }
static int bitsy_uart_open(struct uart_port *port, struct uart_info *info) static int h3600_uart_open(struct uart_port *port, struct uart_info *info)
{ {
int ret = 0; int ret = 0;
...@@ -113,41 +115,41 @@ static int bitsy_uart_open(struct uart_port *port, struct uart_info *info) ...@@ -113,41 +115,41 @@ static int bitsy_uart_open(struct uart_port *port, struct uart_info *info)
Ser2HSSR0 = HSSR0_EIF | HSSR0_TUR | Ser2HSSR0 = HSSR0_EIF | HSSR0_TUR |
HSSR0_RAB | HSSR0_FRE; HSSR0_RAB | HSSR0_FRE;
} else if (port->mapbase == _Ser3UTCR0) { } else if (port->mapbase == _Ser3UTCR0) {
GPDR &= ~(GPIO_BITSY_COM_DCD|GPIO_BITSY_COM_CTS); GPDR &= ~(GPIO_H3600_COM_DCD|GPIO_H3600_COM_CTS);
GPDR |= GPIO_BITSY_COM_RTS; GPDR |= GPIO_H3600_COM_RTS;
set_GPIO_IRQ_edge(GPIO_BITSY_COM_DCD|GPIO_BITSY_COM_CTS, set_GPIO_IRQ_edge(GPIO_H3600_COM_DCD|GPIO_H3600_COM_CTS,
GPIO_BOTH_EDGES); GPIO_BOTH_EDGES);
ret = request_irq(IRQ_GPIO_BITSY_COM_DCD, bitsy_dcd_intr, ret = request_irq(IRQ_GPIO_H3600_COM_DCD, h3600_dcd_intr,
0, "RS232 DCD", info); 0, "RS232 DCD", info);
if (ret) if (ret)
return ret; return ret;
ret = request_irq(IRQ_GPIO_BITSY_COM_CTS, bitsy_cts_intr, ret = request_irq(IRQ_GPIO_H3600_COM_CTS, h3600_cts_intr,
0, "RS232 CTS", info); 0, "RS232 CTS", info);
if (ret) if (ret)
free_irq(IRQ_GPIO_BITSY_COM_DCD, info); free_irq(IRQ_GPIO_H3600_COM_DCD, info);
} }
return ret; return ret;
} }
static void bitsy_uart_close(struct uart_port *port, struct uart_info *info) static void h3600_uart_close(struct uart_port *port, struct uart_info *info)
{ {
if (port->mapbase == _Ser3UTCR0) { if (port->mapbase == _Ser3UTCR0) {
free_irq(IRQ_GPIO_BITSY_COM_DCD, info); free_irq(IRQ_GPIO_H3600_COM_DCD, info);
free_irq(IRQ_GPIO_BITSY_COM_CTS, info); free_irq(IRQ_GPIO_H3600_COM_CTS, info);
} }
} }
static struct sa1100_port_fns bitsy_port_fns __initdata = { static struct sa1100_port_fns h3600_port_fns __initdata = {
set_mctrl: bitsy_uart_set_mctrl, set_mctrl: h3600_uart_set_mctrl,
get_mctrl: bitsy_uart_get_mctrl, get_mctrl: h3600_uart_get_mctrl,
pm: bitsy_uart_pm, pm: h3600_uart_pm,
open: bitsy_uart_open, open: h3600_uart_open,
close: bitsy_uart_close, close: h3600_uart_close,
}; };
static struct map_desc bitsy_io_desc[] __initdata = { static struct map_desc h3600_io_desc[] __initdata = {
/* virtual physical length domain r w c b */ /* virtual physical length domain r w c b */
{ 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
{ 0xf0000000, 0x49000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* EGPIO 0 */ { 0xf0000000, 0x49000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* EGPIO 0 */
...@@ -156,20 +158,32 @@ static struct map_desc bitsy_io_desc[] __initdata = { ...@@ -156,20 +158,32 @@ static struct map_desc bitsy_io_desc[] __initdata = {
LAST_DESC LAST_DESC
}; };
static void __init bitsy_map_io(void) static void __init h3600_map_io(void)
{ {
sa1100_map_io(); sa1100_map_io();
iotable_init(bitsy_io_desc); iotable_init(h3600_io_desc);
sa1100_register_uart_fns(&bitsy_port_fns); sa1100_register_uart_fns(&h3600_port_fns);
sa1100_register_uart(0, 3); sa1100_register_uart(0, 3);
sa1100_register_uart(1, 1); /* isn't this one driven elsewhere? */ sa1100_register_uart(1, 1); /* isn't this one driven elsewhere? */
sa1100_register_uart(2, 2); sa1100_register_uart(2, 2);
/*
* Default GPIO settings.
*/
GPCR = 0x0fffffff;
GPDR = 0x0401f3fc;
/*
* Ensure those pins are outputs and driving low.
*/
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
} }
MACHINE_START(BITSY, "Compaq iPAQ") MACHINE_START(H3600, "Compaq iPAQ")
BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
BOOT_PARAMS(0xc0000100) BOOT_PARAMS(0xc0000100)
MAPIO(bitsy_map_io) MAPIO(h3600_map_io)
INITIRQ(sa1100_init_irq) INITIRQ(sa1100_init_irq)
MACHINE_END MACHINE_END
...@@ -46,7 +46,8 @@ static int __init jornada720_init(void) ...@@ -46,7 +46,8 @@ static int __init jornada720_init(void)
PPDR |= PPC_LDD3 | PPC_LDD4; PPDR |= PPC_LDD3 | PPC_LDD4;
/* initialize extra IRQs */ /* initialize extra IRQs */
sa1111_init_irq(1); /* chained on GPIO 1 */ set_GPIO_IRQ_edge(GPIO_GPIO(1), GPIO_RISING_EDGE);
sa1111_init_irq(SA1100_GPIO_TO_IRQ(1)); /* chained on GPIO 1 */
sa1100_register_uart(0, 3); sa1100_register_uart(0, 3);
sa1100_register_uart(1, 1); sa1100_register_uart(1, 1);
......
/*
* linux/arch/arm/mach-sa1100/leds-graphicsmaster.c
*
* GraphicsClient Plus LEDs support
* Woojung Huh, Feb 13, 2001
*/
#include <linux/config.h>
#include <linux/init.h>
#include <asm/hardware.h>
#include <asm/leds.h>
#include <asm/system.h>
#include "leds.h"
#define LED_STATE_ENABLED 1
#define LED_STATE_CLAIMED 2
static unsigned int led_state;
static unsigned int hw_led_state;
#define LED_TIMER ADS_LED0 /* green heartbeat */
#define LED_USER ADS_LED1 /* amber, boots to on */
#define LED_IDLE ADS_LED2 /* red has the idle led, if any */
#define LED_MASK (ADS_LED0|ADS_LED1|ADS_LED2)
void graphicsmaster_leds_event(led_event_t evt)
{
unsigned long flags;
save_flags_cli(flags);
switch (evt) {
case led_start:
hw_led_state = 0; /* gc leds are positive logic */
led_state = LED_STATE_ENABLED;
break;
case led_stop:
led_state &= ~LED_STATE_ENABLED;
break;
case led_claim:
led_state |= LED_STATE_CLAIMED;
hw_led_state = LED_MASK;
break;
case led_release:
led_state &= ~LED_STATE_CLAIMED;
hw_led_state = LED_MASK;
break;
#ifdef CONFIG_LEDS_TIMER
case led_timer:
if (!(led_state & LED_STATE_CLAIMED))
hw_led_state ^= LED_TIMER;
break;
#endif
#ifdef CONFIG_LEDS_CPU
case led_idle_start:
if (!(led_state & LED_STATE_CLAIMED))
hw_led_state &= ~LED_IDLE;
break;
case led_idle_end:
if (!(led_state & LED_STATE_CLAIMED))
hw_led_state |= LED_IDLE;
break;
#endif
case led_green_on:
break;
case led_green_off:
break;
case led_amber_on:
hw_led_state |= LED_USER;
break;
case led_amber_off:
hw_led_state &= ~LED_USER;
break;
case led_red_on:
break;
case led_red_off:
break;
default:
break;
}
if (led_state & LED_STATE_ENABLED) {
GPSR = hw_led_state;
GPCR = hw_led_state ^ LED_MASK;
}
restore_flags(flags);
}
...@@ -30,6 +30,8 @@ sa1100_leds_init(void) ...@@ -30,6 +30,8 @@ sa1100_leds_init(void)
leds_event = lart_leds_event; leds_event = lart_leds_event;
if (machine_is_pfs168()) if (machine_is_pfs168())
leds_event = pfs168_leds_event; leds_event = pfs168_leds_event;
if (machine_is_graphicsmaster())
leds_event = graphicsmaster_leds_event;
leds_event(led_start); leds_event(led_start);
return 0; return 0;
......
...@@ -5,4 +5,4 @@ extern void flexanet_leds_event(led_event_t evt); ...@@ -5,4 +5,4 @@ extern void flexanet_leds_event(led_event_t evt);
extern void graphicsclient_leds_event(led_event_t evt); extern void graphicsclient_leds_event(led_event_t evt);
extern void lart_leds_event(led_event_t evt); extern void lart_leds_event(led_event_t evt);
extern void pfs168_leds_event(led_event_t evt); extern void pfs168_leds_event(led_event_t evt);
extern void graphicsmaster_leds_event(led_event_t evt);
...@@ -74,36 +74,73 @@ static void __init neponset_init_irq(void) ...@@ -74,36 +74,73 @@ static void __init neponset_init_irq(void)
static int __init neponset_init(void) static int __init neponset_init(void)
{ {
/* only on assabet */ int ret;
/*
* The Neponset is only present on the Assabet machine type.
*/
if (!machine_is_assabet()) if (!machine_is_assabet())
return 0; return -ENODEV;
/*
* Ensure that the memory bus request/grant signals are setup,
* and the grant is held in its inactive state, whether or not
* we actually have a Neponset attached.
*/
sa1110_mb_disable();
if (!machine_has_neponset()) {
printk(KERN_DEBUG "Neponset expansion board not present\n");
return -ENODEV;
}
if (WHOAMI != 0x11) {
printk(KERN_WARNING "Neponset board detected, but "
"wrong ID: %02x\n", WHOAMI);
return -ENODEV;
}
/*
* Neponset has SA1111 connected to CS4. We know that after
* reset the chip will be configured for variable latency IO.
*/
/* FIXME: setup MSC2 */
if (machine_has_neponset()) { /*
LEDS = WHOAMI; * Probe for a SA1111.
*/
ret = sa1111_probe();
if (ret < 0)
return ret;
/*
* We found it. Wake the chip up.
*/
sa1111_wake();
if (sa1111_init() < 0)
return -EINVAL;
/* /*
* Assabet is populated by default with two Samsung * The SDRAM configuration of the SA1110 and the SA1111 must
* KM416S8030T-G8 * match. This is very important to ensure that SA1111 accesses
* 128Mb SDRAMs, which are organized as 12-bit (row addr) x * don't corrupt the SDRAM. Note that this ungates the SA1111's
* 9-bit * MBGNT signal, so we must have called sa1110_mb_disable()
* (column addr), according to the data sheet. Apparently, the * beforehand.
* bank selects factor into the row address, as Angel sets up */
* the sa1111_configure_smc(1,
* SA-1110 to use 14x9 addresses. The SDRAM datasheet specifies FExtr(MDCNFG, MDCNFG_SA1110_DRAC0),
* that when running at 100-125MHz, the CAS latency for -8 FExtr(MDCNFG, MDCNFG_SA1110_TDL0));
* parts
* is 3 cycles, which is consistent with Angel. /*
* We only need to turn on DCLK whenever we want to use the
* DMA. It can otherwise be held firmly in the off position.
*/ */
SMCR = (SMCR_DTIM | SMCR_MBGE |
FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) |
((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));
SKPCR |= SKPCR_DCLKEN; SKPCR |= SKPCR_DCLKEN;
/*
* Enable the SA1110 memory bus request and grant signals.
*/
sa1110_mb_enable();
neponset_init_irq(); neponset_init_irq();
} else
printk("Neponset expansion board not present\n");
return 0; return 0;
} }
......
...@@ -20,7 +20,7 @@ static void __init ...@@ -20,7 +20,7 @@ static void __init
fixup_pangolin(struct machine_desc *desc, struct param_struct *params, fixup_pangolin(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi) char **cmdline, struct meminfo *mi)
{ {
SET_BANK( 0, 0xc0000000, 64*1024*1024 ); SET_BANK( 0, 0xc0000000, 128*1024*1024 );
mi->nr_banks = 1; mi->nr_banks = 1;
ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
......
...@@ -20,14 +20,53 @@ ...@@ -20,14 +20,53 @@
static int __init pfs168_init(void) static int __init pfs168_init(void)
{ {
if (sa1111_init() < 0) int ret;
return -EINVAL;
SMCR = (SMCR_DTIM | SMCR_MBGE | if (!machine_is_pfs168())
FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) | return -ENODEV;
((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));
/*
* Ensure that the memory bus request/grant signals are setup,
* and the grant is held in its inactive state
*/
sa1110_mb_disable();
/*
* Probe for SA1111.
*/
ret = sa1111_probe();
if (ret < 0)
return ret;
/*
* We found it. Wake the chip up.
*/
sa1111_wake();
/*
* The SDRAM configuration of the SA1110 and the SA1111 must
* match. This is very important to ensure that SA1111 accesses
* don't corrupt the SDRAM. Note that this ungates the SA1111's
* MBGNT signal, so we must have called sa1110_mb_disable()
* beforehand.
*/
sa1111_configure_smc(1,
FExtr(MDCNFG, MDCNFG_SA1110_DRAC0),
FExtr(MDCNFG, MDCNFG_SA1110_TDL0));
/*
* We only need to turn on DCLK whenever we want to use the
* DMA. It can otherwise be held firmly in the off position.
*/
SKPCR |= SKPCR_DCLKEN; SKPCR |= SKPCR_DCLKEN;
sa1111_init_irq(25); /* SA1111 IRQ on GPIO 25 */ /*
* Enable the SA1110 memory bus request and grant signals.
*/
sa1110_mb_enable();
set_GPIO_IRQ_edge(GPIO_GPIO(25), GPIO_RISING_EDGE);
sa1111_init_irq(SA1100_GPIO_TO_IRQ(25)); /* SA1111 IRQ on GPIO 25 */
return 0; return 0;
} }
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
* *
* 06/13/2001 - created. * 06/13/2001 - created.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -64,13 +63,6 @@ init_safe_buffers(struct pci_dev *dev) ...@@ -64,13 +63,6 @@ init_safe_buffers(struct pci_dev *dev)
return 0; return 0;
} }
static void
free_safe_buffers(void)
{
pci_pool_destroy(small_buffer_cache);
pci_pool_destroy(large_buffer_cache);
}
/* allocate a 'safe' buffer and keep track of it */ /* allocate a 'safe' buffer and keep track of it */
static char * static char *
alloc_safe_buffer(char *unsafe, int size, dma_addr_t *pbus) alloc_safe_buffer(char *unsafe, int size, dma_addr_t *pbus)
...@@ -183,17 +175,11 @@ free_safe_buffer(char *buf) ...@@ -183,17 +175,11 @@ free_safe_buffer(char *buf)
* we assume calls to map_single are symmetric with calls to unmap_single... * we assume calls to map_single are symmetric with calls to unmap_single...
*/ */
dma_addr_t dma_addr_t
pci_map_single(struct pci_dev *hwdev, void *virtptr, sa1111_map_single(struct pci_dev *hwdev, void *virtptr,
size_t size, int direction) size_t size, int direction)
{ {
dma_addr_t busptr; dma_addr_t busptr;
/* hack; usb-ohci.c never sends hwdev==NULL, all others do */
if (hwdev == NULL) {
consistent_sync(virtptr, size, direction);
return virt_to_bus(virtptr);
}
mapped_alloc_size += size; mapped_alloc_size += size;
if (0) printk("pci_map_single(hwdev=%p,ptr=%p,size=%d,dir=%x) " if (0) printk("pci_map_single(hwdev=%p,ptr=%p,size=%d,dir=%x) "
...@@ -235,7 +221,7 @@ pci_map_single(struct pci_dev *hwdev, void *virtptr, ...@@ -235,7 +221,7 @@ pci_map_single(struct pci_dev *hwdev, void *virtptr,
* (basically return things back to the way they should be) * (basically return things back to the way they should be)
*/ */
void void
pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, sa1111_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
size_t size, int direction) size_t size, int direction)
{ {
char *safe, *unsafe; char *safe, *unsafe;
...@@ -267,13 +253,21 @@ pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, ...@@ -267,13 +253,21 @@ pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
} }
} }
EXPORT_SYMBOL(pci_map_single); EXPORT_SYMBOL(sa1111_map_single);
EXPORT_SYMBOL(pci_unmap_single); EXPORT_SYMBOL(sa1111_unmap_single);
static void __init sa1111_init_safe_buffers(void) static int __init sa1111_init_safe_buffers(void)
{ {
printk("Initializing SA1111 buffer pool for DMA workaround\n"); printk("Initializing SA1111 buffer pool for DMA workaround\n");
init_safe_buffers(NULL); init_safe_buffers(NULL);
return 0;
}
static void free_safe_buffers(void)
{
pci_pool_destroy(small_buffer_cache);
pci_pool_destroy(large_buffer_cache);
} }
__initcall(sa1111_init_safe_buffers); module_init(sa1111_init_safe_buffers);
module_exit(free_safe_buffers);
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
* All initialization functions provided here are intended to be called * All initialization functions provided here are intended to be called
* from machine specific code with proper arguments when required. * from machine specific code with proper arguments when required.
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -23,8 +22,6 @@ ...@@ -23,8 +22,6 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/pci.h>
#include <linux/mm.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -33,64 +30,6 @@ ...@@ -33,64 +30,6 @@
#include "sa1111.h" #include "sa1111.h"
static int sa1111_ohci_hcd_init(void);
/*
* SA1111 initialization
*/
int __init sa1111_init(void)
{
unsigned long id = SKID;
if((id & SKID_ID_MASK) == SKID_SA1111_ID)
printk( KERN_INFO "SA-1111 Microprocessor Companion Chip: "
"silicon revision %lx, metal revision %lx\n",
(id & SKID_SIREV_MASK)>>4, (id & SKID_MTREV_MASK));
else {
printk(KERN_ERR "Could not detect SA-1111!\n");
return -EINVAL;
}
/*
* First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
* (SA-1110 Developer's Manual, section 9.1.2.1)
*/
GAFR |= GPIO_32_768kHz;
GPDR |= GPIO_32_768kHz;
TUCR = TUCR_3_6864MHz;
/* Now, set up the PLL and RCLK in the SA-1111: */
SKCR = SKCR_PLL_BYPASS | SKCR_RDYEN | SKCR_OE_EN;
udelay(100);
SKCR = SKCR_PLL_BYPASS | SKCR_RCLKEN | SKCR_RDYEN | SKCR_OE_EN;
/*
* SA-1111 Register Access Bus should now be available. Clocks for
* any other SA-1111 functional blocks must be enabled separately
* using the SKPCR.
*/
/*
* If the system is going to use the SA-1111 DMA engines, set up
* the memory bus request/grant pins. Also configure the shared
* memory controller on the SA-1111 (SA-1111 Developer's Manual,
* section 3.2.3) and power up the DMA bus clock:
*/
GAFR |= (GPIO_MBGNT | GPIO_MBREQ);
GPDR |= GPIO_MBGNT;
GPDR &= ~GPIO_MBREQ;
TUCR |= TUCR_MR;
#ifdef CONFIG_USB_OHCI
/* setup up sa1111 usb host controller h/w */
sa1111_ohci_hcd_init();
#endif
return 0;
}
/* /*
* SA1111 Interrupt support * SA1111 Interrupt support
*/ */
...@@ -159,7 +98,7 @@ static void sa1111_unmask_highirq(unsigned int irq) ...@@ -159,7 +98,7 @@ static void sa1111_unmask_highirq(unsigned int irq)
INTEN1 |= 1 << ((irq - SA1111_IRQ(32))); INTEN1 |= 1 << ((irq - SA1111_IRQ(32)));
} }
void __init sa1111_init_irq(int gpio_nr) void __init sa1111_init_irq(int irq_nr)
{ {
int irq; int irq;
...@@ -181,144 +120,146 @@ void __init sa1111_init_irq(int gpio_nr) ...@@ -181,144 +120,146 @@ void __init sa1111_init_irq(int gpio_nr)
for (irq = SA1111_IRQ(0); irq <= SA1111_IRQ(26); irq++) { for (irq = SA1111_IRQ(0); irq <= SA1111_IRQ(26); irq++) {
irq_desc[irq].valid = 1; irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1; irq_desc[irq].probe_ok = 0;
irq_desc[irq].mask_ack = sa1111_mask_and_ack_lowirq; irq_desc[irq].mask_ack = sa1111_mask_and_ack_lowirq;
irq_desc[irq].mask = sa1111_mask_lowirq; irq_desc[irq].mask = sa1111_mask_lowirq;
irq_desc[irq].unmask = sa1111_unmask_lowirq; irq_desc[irq].unmask = sa1111_unmask_lowirq;
} }
for (irq = SA1111_IRQ(32); irq <= SA1111_IRQ(54); irq++) { for (irq = SA1111_IRQ(32); irq <= SA1111_IRQ(54); irq++) {
irq_desc[irq].valid = 1; irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1; irq_desc[irq].probe_ok = 0;
irq_desc[irq].mask_ack = sa1111_mask_and_ack_highirq; irq_desc[irq].mask_ack = sa1111_mask_and_ack_highirq;
irq_desc[irq].mask = sa1111_mask_highirq; irq_desc[irq].mask = sa1111_mask_highirq;
irq_desc[irq].unmask = sa1111_unmask_highirq; irq_desc[irq].unmask = sa1111_unmask_highirq;
} }
/* Not every machines has the SA1111 interrupt routed to a GPIO */ /* Register SA1111 interrupt */
if (gpio_nr >= 0) { if (irq_nr >= 0)
set_GPIO_IRQ_edge (GPIO_GPIO(gpio_nr), GPIO_RISING_EDGE); setup_arm_irq(irq_nr, &sa1111_irq);
setup_arm_irq (SA1100_GPIO_TO_IRQ(gpio_nr), &sa1111_irq);
}
} }
/* ----------------- */
#ifdef CONFIG_USB_OHCI
#if defined(CONFIG_SA1100_XP860) || defined(CONFIG_ASSABET_NEPONSET) || defined(CONFIG_SA1100_PFS168)
#define PwrSensePolLow 1
#define PwrCtrlPolLow 1
#else
#define PwrSensePolLow 0
#define PwrCtrlPolLow 0
#endif
/* /*
* The SA-1111 errata says that the DMA hardware needs to be exercised * Probe for a SA1111 chip.
* before the clocks are turned on to work properly. This code does
* a tiny dma transfer to prime to hardware.
*/ */
static void __init sa1111_dma_setup(void)
{
dma_addr_t vbuf;
void * pbuf;
/* DMA init & setup */
/* WARNING: The SA-1111 L3 function is used as part of this int __init sa1111_probe(void)
* SA-1111 DMA errata workaround. {
* unsigned long id = SBI_SKID;
* N.B., When the L3 function is enabled, it uses GPIO_B<4:5> int ret = -ENODEV;
* and takes precedence over the PS/2 mouse and GPIO_B
* functions. Refer to "Intel StrongARM SA-1111 Microprocessor
* Companion Chip, Sect 10.2" for details. So this "fix" may
* "break" support of either PS/2 mouse or GPIO_B if
* precautions are not taken to avoid collisions in
* configuration and use of these pins. AFAIK, no precautions
* are taken at this time. So it is likely that the action
* taken here may cause problems in PS/2 mouse and/or GPIO_B
* pin use elsewhere.
*
* But wait, there's more... What we're doing here is
* obviously altogether a bad idea. We're indiscrimanately bit
* flipping config for a few different functions here which
* are "owned" by other drivers. This needs to be handled
* better than it is being done here at this time. */
/* prime the dma engine with a tiny dma */
SKPCR |= SKPCR_I2SCLKEN;
SKAUD |= SKPCR_L3CLKEN | SKPCR_SCLKEN;
SACR0 |= 0x00003305; if ((id & SKID_ID_MASK) == SKID_SA1111_ID) {
SACR1 = 0x00000000; printk(KERN_INFO "SA-1111 Microprocessor Companion Chip: "
"silicon revision %lx, metal revision %lx\n",
(id & SKID_SIREV_MASK)>>4, (id & SKID_MTREV_MASK));
ret = 0;
} else {
printk(KERN_DEBUG "SA-1111 not detected: ID = %08lx\n", id);
}
/* we need memory below 1mb */ return ret;
pbuf = consistent_alloc(GFP_KERNEL | GFP_DMA, 4, &vbuf); }
SADTSA = (unsigned long)pbuf; /*
SADTCA = 4; * Bring the SA1111 out of reset. This requires a set procedure:
* 1. nRESET asserted (by hardware)
* 2. CLK turned on from SA1110
* 3. nRESET deasserted
* 4. VCO turned on, PLL_BYPASS turned off
* 5. Wait lock time, then assert RCLKEn
* 7. PCR set to allow clocking of individual functions
*
* Until we've done this, the only registers we can access are:
* SBI_SKCR
* SBI_SMCR
* SBI_SKID
*/
void sa1111_wake(void)
{
/*
* First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
* (SA-1110 Developer's Manual, section 9.1.2.1)
*/
GAFR |= GPIO_32_768kHz;
GPDR |= GPIO_32_768kHz;
TUCR = TUCR_3_6864MHz;
SADTCS |= 0x00000011; /*
SKPCR |= SKPCR_DCLKEN; * Turn VCO on, and disable PLL Bypass.
*/
SBI_SKCR &= ~SKCR_VCO_OFF;
SBI_SKCR |= SKCR_PLL_BYPASS | SKCR_OE_EN;
/* wait */ /*
* Wait lock time. SA1111 manual _doesn't_
* specify a figure for this! We choose 100us.
*/
udelay(100); udelay(100);
SACR0 &= ~(0x00000002); /*
SACR0 &= ~(0x00000001); * Enable RCLK. We also ensure that RDYEN is set.
*/
/* */ SBI_SKCR |= SKCR_RCLKEN | SKCR_RDYEN;
SACR0 |= 0x00000004;
SACR0 &= ~(0x00000004);
SKAUD &= ~(SKPCR_L3CLKEN | SKPCR_SCLKEN); /*
* Wait 14 RCLK cycles for the chip to finish coming out
* of reset. (RCLK=24MHz). This is 590ns.
*/
udelay(1);
SKPCR &= ~SKPCR_I2SCLKEN; /*
* Ensure all clocks are initially off.
*/
SKPCR = 0;
}
consistent_free(pbuf, 4, vbuf); void sa1111_doze(void)
{
if (SKPCR & SKPCR_UCLKEN) {
printk("SA1111 doze mode refused\n");
return;
}
SBI_SKCR &= ~SKCR_RCLKEN;
} }
#ifdef CONFIG_USB_OHCI
/* /*
* reset the SA-1111 usb controller and turn on it's clocks * Configure the SA1111 shared memory controller.
*/ */
static int __init sa1111_ohci_hcd_init(void) void sa1111_configure_smc(int sdram, unsigned int drac, unsigned int cas_latency)
{ {
volatile unsigned long *Reset = (void *)SA1111_p2v(_SA1111(0x051c)); unsigned int smcr = SMCR_DTIM | SMCR_MBGE | FInsrt(drac, SMCR_DRAC);
volatile unsigned long *Status = (void *)SA1111_p2v(_SA1111(0x0518));
/* turn on clocks */ if (cas_latency == 3)
SKPCR |= SKPCR_UCLKEN; smcr |= SMCR_CLAT;
udelay(100);
/* force a reset */ SBI_SMCR = smcr;
*Reset = 0x01; }
*Reset |= 0x02;
udelay(100);
*Reset = 0;
/* take out of reset */
/* set power sense and control lines (this from the diags code) */
*Reset = ( PwrSensePolLow << 6 )
| ( PwrCtrlPolLow << 7 );
*Status = 0;
udelay(10); /*
* Disable the memory bus request/grant signals on the SA1110 to
* ensure that we don't receive spurious memory requests. We set
* the MBGNT signal false to ensure the SA1111 doesn't own the
* SDRAM bus.
*/
void __init sa1110_mb_disable(void)
{
PGSR &= ~GPIO_MBGNT;
GPCR = GPIO_MBGNT;
GPDR = (GPDR & ~GPIO_MBREQ) | GPIO_MBGNT;
/* compensate for dma bug */ GAFR &= ~(GPIO_MBGNT | GPIO_MBREQ);
sa1111_dma_setup();
return 0;
} }
void sa1111_ohci_hcd_cleanup(void) /*
* If the system is going to use the SA-1111 DMA engines, set up
* the memory bus request/grant pins.
*/
void __init sa1110_mb_enable(void)
{ {
/* turn the USB clock off */ PGSR &= ~GPIO_MBGNT;
SKPCR &= ~SKPCR_UCLKEN; GPCR = GPIO_MBGNT;
} GPDR = (GPDR & ~GPIO_MBREQ) | GPIO_MBGNT;
#endif
#endif /* CONFIG_USB_OHCI */ GAFR |= (GPIO_MBGNT | GPIO_MBREQ);
TUCR |= TUCR_MR;
}
...@@ -2,7 +2,33 @@ ...@@ -2,7 +2,33 @@
* linux/arch/arm/mach-sa1100/sa1111.h * linux/arch/arm/mach-sa1100/sa1111.h
*/ */
extern int __init sa1111_init(void); /*
extern void __init sa1111_init_irq(int gpio_nr); * These two don't really belong in here.
*/
extern void sa1110_mb_enable(void);
extern void sa1110_mb_disable(void);
/*
* Probe for a SA1111 chip.
*/
extern int sa1111_probe(void);
/*
* Wake up a SA1111 chip.
*/
extern void sa1111_wake(void);
/*
* Doze the SA1111 chip.
*/
extern void sa1111_doze(void);
/*
* Configure the SA1111 shared memory controller.
*/
extern void sa1111_configure_smc(int sdram, unsigned int drac, unsigned int cas_latency);
extern void sa1111_init_irq(int irq_nr);
extern void sa1111_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs ); extern void sa1111_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs );
...@@ -28,10 +28,27 @@ static void xp860_power_off(void) ...@@ -28,10 +28,27 @@ static void xp860_power_off(void)
while(1); while(1);
} }
/*
* Note: I replaced the sa1111_init() without the full SA1111 initialisation
* because this machine doesn't appear to use the DMA features. If this is
* wrong, please look at neponset.c to fix it properly.
*/
static int __init xp860_init(void) static int __init xp860_init(void)
{ {
pm_power_off = xp860_power_off; pm_power_off = xp860_power_off;
sa1111_init();
/*
* Probe for SA1111.
*/
ret = sa1111_probe();
if (ret < 0)
return ret;
/*
* We found it. Wake the chip up.
*/
sa1111_wake();
return 0; return 0;
} }
......
...@@ -30,6 +30,8 @@ search_one_table(const struct exception_table_entry *first, ...@@ -30,6 +30,8 @@ search_one_table(const struct exception_table_entry *first,
return 0; return 0;
} }
extern spinlock_t modlist_lock;
unsigned long unsigned long
search_exception_table(unsigned long addr) search_exception_table(unsigned long addr)
{ {
...@@ -38,18 +40,24 @@ search_exception_table(unsigned long addr) ...@@ -38,18 +40,24 @@ search_exception_table(unsigned long addr)
#ifndef CONFIG_MODULES #ifndef CONFIG_MODULES
/* There is only the kernel to search. */ /* There is only the kernel to search. */
ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr); ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
if (ret) return ret;
#else #else
/* The kernel is the last "module" -- no need to treat it special. */ /* The kernel is the last "module" -- no need to treat it special. */
unsigned long flags;
struct module *mp; struct module *mp;
ret = 0;
spin_lock_irqsave(&modlist_lock, flags);
for (mp = module_list; mp != NULL; mp = mp->next) { for (mp = module_list; mp != NULL; mp = mp->next) {
if (mp->ex_table_start == NULL) if (mp->ex_table_start == NULL ||
!(mp->flags & (MOD_RUNNING | MOD_INITIALIZING)))
continue; continue;
ret = search_one_table(mp->ex_table_start, ret = search_one_table(mp->ex_table_start,
mp->ex_table_end - 1, addr); mp->ex_table_end - 1, addr);
if (ret) return ret; if (ret)
break;
} }
spin_unlock_irqrestore(&modlist_lock, flags);
#endif #endif
return 0; return ret;
} }
...@@ -599,10 +599,10 @@ do_DataAbort(unsigned long addr, int error_code, struct pt_regs *regs, int fsr) ...@@ -599,10 +599,10 @@ do_DataAbort(unsigned long addr, int error_code, struct pt_regs *regs, int fsr)
if (!inf->fn(addr, error_code, regs)) if (!inf->fn(addr, error_code, regs))
return; return;
bad: bad:
force_sig(inf->sig, current);
printk(KERN_ALERT "Unhandled fault: %s (%X) at 0x%08lx\n", printk(KERN_ALERT "Unhandled fault: %s (%X) at 0x%08lx\n",
inf->name, fsr, addr); inf->name, fsr, addr);
show_pte(current->mm, addr); show_pte(current->mm, addr);
force_sig(inf->sig, current);
die_if_kernel("Oops", regs, 0); die_if_kernel("Oops", regs, 0);
return; return;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -14,8 +14,14 @@ ...@@ -14,8 +14,14 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#ifndef __APCS_32__ /*
#error APCS-32 required * Make sure that the compiler and target are compatible.
*/
#if defined(__APCS_32__) && defined(CONFIG_CPU_26)
#error Your compiler targets APCS-32 but this kernel requires APCS-26
#endif
#if defined(__APCS_26__) && defined(CONFIG_CPU_32)
#error Your compiler targets APCS-26 but this kernel requires APCS-32
#endif #endif
#define OFF_TSK(n) (unsigned long)&(((struct task_struct *)0)->n) #define OFF_TSK(n) (unsigned long)&(((struct task_struct *)0)->n)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment