Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
1304a7343b
@ -5,4 +5,15 @@ Contact: "Ike Panhc <ike.pan@canonical.com>"
|
|||||||
Description:
|
Description:
|
||||||
Control the power of camera module. 1 means on, 0 means off.
|
Control the power of camera module. 1 means on, 0 means off.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/ideapad/fan_mode
|
||||||
|
Date: June 2012
|
||||||
|
KernelVersion: 3.6
|
||||||
|
Contact: "Maxim Mikityanskiy <maxtram95@gmail.com>"
|
||||||
|
Description:
|
||||||
|
Change fan mode
|
||||||
|
There are four available modes:
|
||||||
|
* 0 -> Super Silent Mode
|
||||||
|
* 1 -> Standard Mode
|
||||||
|
* 2 -> Dust Cleaning
|
||||||
|
* 4 -> Efficient Thermal Dissipation Mode
|
||||||
|
|
||||||
|
@ -224,8 +224,8 @@ all your transactions.
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Then at umount time , in your put_super() (2.4) or write_super() (2.5)
|
Then at umount time , in your put_super() you can then call journal_destroy()
|
||||||
you can then call journal_destroy() to clean up your in-core journal object.
|
to clean up your in-core journal object.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -125,7 +125,7 @@ the structure refers to a radio tuner the
|
|||||||
<constant>V4L2_TUNER_CAP_NORM</constant> flags can't be used.</para>
|
<constant>V4L2_TUNER_CAP_NORM</constant> flags can't be used.</para>
|
||||||
<para>If multiple frequency bands are supported, then
|
<para>If multiple frequency bands are supported, then
|
||||||
<structfield>capability</structfield> is the union of all
|
<structfield>capability</structfield> is the union of all
|
||||||
<structfield>capability></structfield> fields of each &v4l2-frequency-band;.
|
<structfield>capability</structfield> fields of each &v4l2-frequency-band;.
|
||||||
</para></entry>
|
</para></entry>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
|
@ -38,3 +38,23 @@ Example:
|
|||||||
reg-names = "mux status", "mux mask";
|
reg-names = "mux status", "mux mask";
|
||||||
mrvl,intc-nr-irqs = <2>;
|
mrvl,intc-nr-irqs = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
* Marvell Orion Interrupt controller
|
||||||
|
|
||||||
|
Required properties
|
||||||
|
- compatible : Should be "marvell,orion-intc".
|
||||||
|
- #interrupt-cells: Specifies the number of cells needed to encode an
|
||||||
|
interrupt source. Supported value is <1>.
|
||||||
|
- interrupt-controller : Declare this node to be an interrupt controller.
|
||||||
|
- reg : Interrupt mask address. A list of 4 byte ranges, one per controller.
|
||||||
|
One entry in the list represents 32 interrupts.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
intc: interrupt-controller {
|
||||||
|
compatible = "marvell,orion-intc", "marvell,intc";
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
reg = <0xfed20204 0x04>,
|
||||||
|
<0xfed20214 0x04>;
|
||||||
|
};
|
||||||
|
16
Documentation/devicetree/bindings/ata/marvell.txt
Normal file
16
Documentation/devicetree/bindings/ata/marvell.txt
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
* Marvell Orion SATA
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
- compatibility : "marvell,orion-sata"
|
||||||
|
- reg : Address range of controller
|
||||||
|
- interrupts : Interrupt controller is using
|
||||||
|
- nr-ports : Number of SATA ports in use.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
sata@80000 {
|
||||||
|
compatible = "marvell,orion-sata";
|
||||||
|
reg = <0x80000 0x5000>;
|
||||||
|
interrupts = <21>;
|
||||||
|
nr-ports = <2>;
|
||||||
|
}
|
@ -27,3 +27,26 @@ Example:
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
* Marvell Orion GPIO Controller
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : Should be "marvell,orion-gpio"
|
||||||
|
- reg : Address and length of the register set for controller.
|
||||||
|
- gpio-controller : So we know this is a gpio controller.
|
||||||
|
- ngpio : How many gpios this controller has.
|
||||||
|
- interrupts : Up to 4 Interrupts for the controller.
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- mask-offset : For SMP Orions, offset for Nth CPU
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
gpio0: gpio@10100 {
|
||||||
|
compatible = "marvell,orion-gpio";
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
gpio-controller;
|
||||||
|
reg = <0x10100 0x40>;
|
||||||
|
ngpio = <32>;
|
||||||
|
interrupts = <35>, <36>, <37>, <38>;
|
||||||
|
};
|
||||||
|
@ -9,9 +9,9 @@ Required properties:
|
|||||||
- regulators: list of regulators provided by this controller, must have
|
- regulators: list of regulators provided by this controller, must have
|
||||||
property "regulator-compatible" to match their hardware counterparts:
|
property "regulator-compatible" to match their hardware counterparts:
|
||||||
sm[0-2], ldo[0-9] and ldo_rtc
|
sm[0-2], ldo[0-9] and ldo_rtc
|
||||||
- sm0-supply: The input supply for the SM0.
|
- vin-sm0-supply: The input supply for the SM0.
|
||||||
- sm1-supply: The input supply for the SM1.
|
- vin-sm1-supply: The input supply for the SM1.
|
||||||
- sm2-supply: The input supply for the SM2.
|
- vin-sm2-supply: The input supply for the SM2.
|
||||||
- vinldo01-supply: The input supply for the LDO1 and LDO2
|
- vinldo01-supply: The input supply for the LDO1 and LDO2
|
||||||
- vinldo23-supply: The input supply for the LDO2 and LDO3
|
- vinldo23-supply: The input supply for the LDO2 and LDO3
|
||||||
- vinldo4-supply: The input supply for the LDO4
|
- vinldo4-supply: The input supply for the LDO4
|
||||||
@ -30,9 +30,9 @@ Example:
|
|||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
|
|
||||||
sm0-supply = <&some_reg>;
|
vin-sm0-supply = <&some_reg>;
|
||||||
sm1-supply = <&some_reg>;
|
vin-sm1-supply = <&some_reg>;
|
||||||
sm2-supply = <&some_reg>;
|
vin-sm2-supply = <&some_reg>;
|
||||||
vinldo01-supply = <...>;
|
vinldo01-supply = <...>;
|
||||||
vinldo23-supply = <...>;
|
vinldo23-supply = <...>;
|
||||||
vinldo4-supply = <...>;
|
vinldo4-supply = <...>;
|
||||||
|
14
Documentation/devicetree/bindings/watchdog/marvel.txt
Normal file
14
Documentation/devicetree/bindings/watchdog/marvel.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
* Marvell Orion Watchdog Time
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- Compatibility : "marvell,orion-wdt"
|
||||||
|
- reg : Address of the timer registers
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
wdt@20300 {
|
||||||
|
compatible = "marvell,orion-wdt";
|
||||||
|
reg = <0x20300 0x28>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
@ -114,7 +114,6 @@ prototypes:
|
|||||||
int (*drop_inode) (struct inode *);
|
int (*drop_inode) (struct inode *);
|
||||||
void (*evict_inode) (struct inode *);
|
void (*evict_inode) (struct inode *);
|
||||||
void (*put_super) (struct super_block *);
|
void (*put_super) (struct super_block *);
|
||||||
void (*write_super) (struct super_block *);
|
|
||||||
int (*sync_fs)(struct super_block *sb, int wait);
|
int (*sync_fs)(struct super_block *sb, int wait);
|
||||||
int (*freeze_fs) (struct super_block *);
|
int (*freeze_fs) (struct super_block *);
|
||||||
int (*unfreeze_fs) (struct super_block *);
|
int (*unfreeze_fs) (struct super_block *);
|
||||||
@ -136,7 +135,6 @@ write_inode:
|
|||||||
drop_inode: !!!inode->i_lock!!!
|
drop_inode: !!!inode->i_lock!!!
|
||||||
evict_inode:
|
evict_inode:
|
||||||
put_super: write
|
put_super: write
|
||||||
write_super: read
|
|
||||||
sync_fs: read
|
sync_fs: read
|
||||||
freeze_fs: write
|
freeze_fs: write
|
||||||
unfreeze_fs: write
|
unfreeze_fs: write
|
||||||
|
@ -94,9 +94,8 @@ protected.
|
|||||||
---
|
---
|
||||||
[mandatory]
|
[mandatory]
|
||||||
|
|
||||||
BKL is also moved from around sb operations. ->write_super() Is now called
|
BKL is also moved from around sb operations. BKL should have been shifted into
|
||||||
without BKL held. BKL should have been shifted into individual fs sb_op
|
individual fs sb_op functions. If you don't need it, remove it.
|
||||||
functions. If you don't need it, remove it.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
[informational]
|
[informational]
|
||||||
|
@ -137,6 +137,17 @@ errors=panic|continue|remount-ro
|
|||||||
without doing anything or remount the partition in
|
without doing anything or remount the partition in
|
||||||
read-only mode (default behavior).
|
read-only mode (default behavior).
|
||||||
|
|
||||||
|
discard -- If set, issues discard/TRIM commands to the block
|
||||||
|
device when blocks are freed. This is useful for SSD devices
|
||||||
|
and sparse/thinly-provisoned LUNs.
|
||||||
|
|
||||||
|
nfs -- This option maintains an index (cache) of directory
|
||||||
|
inodes by i_logstart which is used by the nfs-related code to
|
||||||
|
improve look-ups.
|
||||||
|
|
||||||
|
Enable this only if you want to export the FAT filesystem
|
||||||
|
over NFS
|
||||||
|
|
||||||
<bool>: 0,1,yes,no,true,false
|
<bool>: 0,1,yes,no,true,false
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
@ -216,7 +216,6 @@ struct super_operations {
|
|||||||
void (*drop_inode) (struct inode *);
|
void (*drop_inode) (struct inode *);
|
||||||
void (*delete_inode) (struct inode *);
|
void (*delete_inode) (struct inode *);
|
||||||
void (*put_super) (struct super_block *);
|
void (*put_super) (struct super_block *);
|
||||||
void (*write_super) (struct super_block *);
|
|
||||||
int (*sync_fs)(struct super_block *sb, int wait);
|
int (*sync_fs)(struct super_block *sb, int wait);
|
||||||
int (*freeze_fs) (struct super_block *);
|
int (*freeze_fs) (struct super_block *);
|
||||||
int (*unfreeze_fs) (struct super_block *);
|
int (*unfreeze_fs) (struct super_block *);
|
||||||
@ -273,9 +272,6 @@ or bottom half).
|
|||||||
put_super: called when the VFS wishes to free the superblock
|
put_super: called when the VFS wishes to free the superblock
|
||||||
(i.e. unmount). This is called with the superblock lock held
|
(i.e. unmount). This is called with the superblock lock held
|
||||||
|
|
||||||
write_super: called when the VFS superblock needs to be written to
|
|
||||||
disc. This method is optional
|
|
||||||
|
|
||||||
sync_fs: called when VFS is writing out all dirty data associated with
|
sync_fs: called when VFS is writing out all dirty data associated with
|
||||||
a superblock. The second parameter indicates whether the method
|
a superblock. The second parameter indicates whether the method
|
||||||
should wait until the write out has been completed. Optional.
|
should wait until the write out has been completed. Optional.
|
||||||
|
@ -262,9 +262,9 @@ MINIMUM_BATTERY_MINUTES=10
|
|||||||
|
|
||||||
#
|
#
|
||||||
# Allowed dirty background ratio, in percent. Once DIRTY_RATIO has been
|
# Allowed dirty background ratio, in percent. Once DIRTY_RATIO has been
|
||||||
# exceeded, the kernel will wake pdflush which will then reduce the amount
|
# exceeded, the kernel will wake flusher threads which will then reduce the
|
||||||
# of dirty memory to dirty_background_ratio. Set this nice and low, so once
|
# amount of dirty memory to dirty_background_ratio. Set this nice and low,
|
||||||
# some writeout has commenced, we do a lot of it.
|
# so once some writeout has commenced, we do a lot of it.
|
||||||
#
|
#
|
||||||
#DIRTY_BACKGROUND_RATIO=5
|
#DIRTY_BACKGROUND_RATIO=5
|
||||||
|
|
||||||
@ -384,9 +384,9 @@ CPU_MAXFREQ=${CPU_MAXFREQ:-'slowest'}
|
|||||||
|
|
||||||
#
|
#
|
||||||
# Allowed dirty background ratio, in percent. Once DIRTY_RATIO has been
|
# Allowed dirty background ratio, in percent. Once DIRTY_RATIO has been
|
||||||
# exceeded, the kernel will wake pdflush which will then reduce the amount
|
# exceeded, the kernel will wake flusher threads which will then reduce the
|
||||||
# of dirty memory to dirty_background_ratio. Set this nice and low, so once
|
# amount of dirty memory to dirty_background_ratio. Set this nice and low,
|
||||||
# some writeout has commenced, we do a lot of it.
|
# so once some writeout has commenced, we do a lot of it.
|
||||||
#
|
#
|
||||||
DIRTY_BACKGROUND_RATIO=${DIRTY_BACKGROUND_RATIO:-'5'}
|
DIRTY_BACKGROUND_RATIO=${DIRTY_BACKGROUND_RATIO:-'5'}
|
||||||
|
|
||||||
|
@ -51,8 +51,23 @@ Built-in netconsole starts immediately after the TCP stack is
|
|||||||
initialized and attempts to bring up the supplied dev at the supplied
|
initialized and attempts to bring up the supplied dev at the supplied
|
||||||
address.
|
address.
|
||||||
|
|
||||||
The remote host can run either 'netcat -u -l -p <port>',
|
The remote host has several options to receive the kernel messages,
|
||||||
'nc -l -u <port>' or syslogd.
|
for example:
|
||||||
|
|
||||||
|
1) syslogd
|
||||||
|
|
||||||
|
2) netcat
|
||||||
|
|
||||||
|
On distributions using a BSD-based netcat version (e.g. Fedora,
|
||||||
|
openSUSE and Ubuntu) the listening port must be specified without
|
||||||
|
the -p switch:
|
||||||
|
|
||||||
|
'nc -u -l -p <port>' / 'nc -u -l <port>' or
|
||||||
|
'netcat -u -l -p <port>' / 'netcat -u -l <port>'
|
||||||
|
|
||||||
|
3) socat
|
||||||
|
|
||||||
|
'socat udp-recv:<port> -'
|
||||||
|
|
||||||
Dynamic reconfiguration:
|
Dynamic reconfiguration:
|
||||||
========================
|
========================
|
||||||
|
@ -840,9 +840,9 @@ static unsigned long i2c_pin_configs[] = {
|
|||||||
|
|
||||||
static struct pinctrl_map __initdata mapping[] = {
|
static struct pinctrl_map __initdata mapping[] = {
|
||||||
PIN_MAP_MUX_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", "i2c0"),
|
PIN_MAP_MUX_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", "i2c0"),
|
||||||
PIN_MAP_MUX_CONFIGS_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", i2c_grp_configs),
|
PIN_MAP_CONFIGS_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", i2c_grp_configs),
|
||||||
PIN_MAP_MUX_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0scl", i2c_pin_configs),
|
PIN_MAP_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0scl", i2c_pin_configs),
|
||||||
PIN_MAP_MUX_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0sda", i2c_pin_configs),
|
PIN_MAP_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0sda", i2c_pin_configs),
|
||||||
};
|
};
|
||||||
|
|
||||||
Finally, some devices expect the mapping table to contain certain specific
|
Finally, some devices expect the mapping table to contain certain specific
|
||||||
|
@ -46,14 +46,13 @@ restrictions, it can call prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...)
|
|||||||
so that any otherwise allowed process (even those in external pid namespaces)
|
so that any otherwise allowed process (even those in external pid namespaces)
|
||||||
may attach.
|
may attach.
|
||||||
|
|
||||||
These restrictions do not change how ptrace via PTRACE_TRACEME operates.
|
The sysctl settings (writable only with CAP_SYS_PTRACE) are:
|
||||||
|
|
||||||
The sysctl settings are:
|
|
||||||
|
|
||||||
0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
|
0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
|
||||||
process running under the same uid, as long as it is dumpable (i.e.
|
process running under the same uid, as long as it is dumpable (i.e.
|
||||||
did not transition uids, start privileged, or have called
|
did not transition uids, start privileged, or have called
|
||||||
prctl(PR_SET_DUMPABLE...) already).
|
prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
|
||||||
|
unchanged.
|
||||||
|
|
||||||
1 - restricted ptrace: a process must have a predefined relationship
|
1 - restricted ptrace: a process must have a predefined relationship
|
||||||
with the inferior it wants to call PTRACE_ATTACH on. By default,
|
with the inferior it wants to call PTRACE_ATTACH on. By default,
|
||||||
@ -61,12 +60,13 @@ The sysctl settings are:
|
|||||||
classic criteria is also met. To change the relationship, an
|
classic criteria is also met. To change the relationship, an
|
||||||
inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
|
inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
|
||||||
an allowed debugger PID to call PTRACE_ATTACH on the inferior.
|
an allowed debugger PID to call PTRACE_ATTACH on the inferior.
|
||||||
|
Using PTRACE_TRACEME is unchanged.
|
||||||
|
|
||||||
2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
|
2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
|
||||||
with PTRACE_ATTACH.
|
with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.
|
||||||
|
|
||||||
3 - no attach: no processes may use ptrace with PTRACE_ATTACH. Once set,
|
3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
|
||||||
this sysctl cannot be changed to a lower value.
|
PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
|
||||||
|
|
||||||
The original children-only logic was based on the restrictions in grsecurity.
|
The original children-only logic was based on the restrictions in grsecurity.
|
||||||
|
|
||||||
|
@ -76,8 +76,8 @@ huge pages although processes will also directly compact memory as required.
|
|||||||
|
|
||||||
dirty_background_bytes
|
dirty_background_bytes
|
||||||
|
|
||||||
Contains the amount of dirty memory at which the pdflush background writeback
|
Contains the amount of dirty memory at which the background kernel
|
||||||
daemon will start writeback.
|
flusher threads will start writeback.
|
||||||
|
|
||||||
Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only
|
Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only
|
||||||
one of them may be specified at a time. When one sysctl is written it is
|
one of them may be specified at a time. When one sysctl is written it is
|
||||||
@ -89,7 +89,7 @@ other appears as 0 when read.
|
|||||||
dirty_background_ratio
|
dirty_background_ratio
|
||||||
|
|
||||||
Contains, as a percentage of total system memory, the number of pages at which
|
Contains, as a percentage of total system memory, the number of pages at which
|
||||||
the pdflush background writeback daemon will start writing out dirty data.
|
the background kernel flusher threads will start writing out dirty data.
|
||||||
|
|
||||||
==============================================================
|
==============================================================
|
||||||
|
|
||||||
@ -112,9 +112,9 @@ retained.
|
|||||||
dirty_expire_centisecs
|
dirty_expire_centisecs
|
||||||
|
|
||||||
This tunable is used to define when dirty data is old enough to be eligible
|
This tunable is used to define when dirty data is old enough to be eligible
|
||||||
for writeout by the pdflush daemons. It is expressed in 100'ths of a second.
|
for writeout by the kernel flusher threads. It is expressed in 100'ths
|
||||||
Data which has been dirty in-memory for longer than this interval will be
|
of a second. Data which has been dirty in-memory for longer than this
|
||||||
written out next time a pdflush daemon wakes up.
|
interval will be written out next time a flusher thread wakes up.
|
||||||
|
|
||||||
==============================================================
|
==============================================================
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ data.
|
|||||||
|
|
||||||
dirty_writeback_centisecs
|
dirty_writeback_centisecs
|
||||||
|
|
||||||
The pdflush writeback daemons will periodically wake up and write `old' data
|
The kernel flusher threads will periodically wake up and write `old' data
|
||||||
out to disk. This tunable expresses the interval between those wakeups, in
|
out to disk. This tunable expresses the interval between those wakeups, in
|
||||||
100'ths of a second.
|
100'ths of a second.
|
||||||
|
|
||||||
|
@ -299,11 +299,17 @@ map_hugetlb.c.
|
|||||||
*******************************************************************
|
*******************************************************************
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hugepage-shm: see Documentation/vm/hugepage-shm.c
|
* map_hugetlb: see tools/testing/selftests/vm/map_hugetlb.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*******************************************************************
|
*******************************************************************
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hugepage-mmap: see Documentation/vm/hugepage-mmap.c
|
* hugepage-shm: see tools/testing/selftests/vm/hugepage-shm.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hugepage-mmap: see tools/testing/selftests/vm/hugepage-mmap.c
|
||||||
*/
|
*/
|
||||||
|
@ -3,6 +3,7 @@ Kernel driver w1_therm
|
|||||||
|
|
||||||
Supported chips:
|
Supported chips:
|
||||||
* Maxim ds18*20 based temperature sensors.
|
* Maxim ds18*20 based temperature sensors.
|
||||||
|
* Maxim ds1825 based temperature sensors.
|
||||||
|
|
||||||
Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ supported family codes:
|
|||||||
W1_THERM_DS18S20 0x10
|
W1_THERM_DS18S20 0x10
|
||||||
W1_THERM_DS1822 0x22
|
W1_THERM_DS1822 0x22
|
||||||
W1_THERM_DS18B20 0x28
|
W1_THERM_DS18B20 0x28
|
||||||
|
W1_THERM_DS1825 0x3B
|
||||||
|
|
||||||
Support is provided through the sysfs w1_slave file. Each open and
|
Support is provided through the sysfs w1_slave file. Each open and
|
||||||
read sequence will initiate a temperature conversion then provide two
|
read sequence will initiate a temperature conversion then provide two
|
||||||
|
70
MAINTAINERS
70
MAINTAINERS
@ -827,24 +827,24 @@ F: arch/arm/mach-pxa/colibri-pxa270-income.c
|
|||||||
|
|
||||||
ARM/INTEL IOP32X ARM ARCHITECTURE
|
ARM/INTEL IOP32X ARM ARCHITECTURE
|
||||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/INTEL IOP33X ARM ARCHITECTURE
|
ARM/INTEL IOP33X ARM ARCHITECTURE
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/INTEL IOP13XX ARM ARCHITECTURE
|
ARM/INTEL IOP13XX ARM ARCHITECTURE
|
||||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/INTEL IQ81342EX MACHINE SUPPORT
|
ARM/INTEL IQ81342EX MACHINE SUPPORT
|
||||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -869,7 +869,7 @@ F: drivers/pcmcia/pxa2xx_stargate2.c
|
|||||||
|
|
||||||
ARM/INTEL XSC3 (MANZANO) ARM CORE
|
ARM/INTEL XSC3 (MANZANO) ARM CORE
|
||||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -925,14 +925,14 @@ S: Maintained
|
|||||||
|
|
||||||
ARM/NOMADIK ARCHITECTURE
|
ARM/NOMADIK ARCHITECTURE
|
||||||
M: Alessandro Rubini <rubini@unipv.it>
|
M: Alessandro Rubini <rubini@unipv.it>
|
||||||
M: Linus Walleij <linus.walleij@stericsson.com>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
M: STEricsson <STEricsson_nomadik_linux@list.st.com>
|
M: STEricsson <STEricsson_nomadik_linux@list.st.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-nomadik/
|
F: arch/arm/mach-nomadik/
|
||||||
F: arch/arm/plat-nomadik/
|
F: arch/arm/plat-nomadik/
|
||||||
F: drivers/i2c/busses/i2c-nomadik.c
|
F: drivers/i2c/busses/i2c-nomadik.c
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik.git
|
||||||
|
|
||||||
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
||||||
M: Nelson Castillo <arhuaco@freaks-unidos.net>
|
M: Nelson Castillo <arhuaco@freaks-unidos.net>
|
||||||
@ -1146,7 +1146,7 @@ F: drivers/usb/host/ehci-w90x900.c
|
|||||||
F: drivers/video/nuc900fb.c
|
F: drivers/video/nuc900fb.c
|
||||||
|
|
||||||
ARM/U300 MACHINE SUPPORT
|
ARM/U300 MACHINE SUPPORT
|
||||||
M: Linus Walleij <linus.walleij@stericsson.com>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arm/mach-u300/
|
F: arch/arm/mach-u300/
|
||||||
@ -1161,15 +1161,20 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
|
|||||||
|
|
||||||
ARM/Ux500 ARM ARCHITECTURE
|
ARM/Ux500 ARM ARCHITECTURE
|
||||||
M: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
|
M: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
|
||||||
M: Linus Walleij <linus.walleij@stericsson.com>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-ux500/
|
F: arch/arm/mach-ux500/
|
||||||
|
F: drivers/clocksource/clksrc-dbx500-prcmu.c
|
||||||
F: drivers/dma/ste_dma40*
|
F: drivers/dma/ste_dma40*
|
||||||
|
F: drivers/hwspinlock/u8500_hsem.c
|
||||||
F: drivers/mfd/abx500*
|
F: drivers/mfd/abx500*
|
||||||
F: drivers/mfd/ab8500*
|
F: drivers/mfd/ab8500*
|
||||||
F: drivers/mfd/stmpe*
|
F: drivers/mfd/dbx500*
|
||||||
|
F: drivers/mfd/db8500*
|
||||||
|
F: drivers/pinctrl/pinctrl-nomadik*
|
||||||
F: drivers/rtc/rtc-ab8500.c
|
F: drivers/rtc/rtc-ab8500.c
|
||||||
|
F: drivers/rtc/rtc-pl031.c
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
|
||||||
|
|
||||||
ARM/VFP SUPPORT
|
ARM/VFP SUPPORT
|
||||||
@ -1227,9 +1232,9 @@ S: Maintained
|
|||||||
F: drivers/hwmon/asb100.c
|
F: drivers/hwmon/asb100.c
|
||||||
|
|
||||||
ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
|
ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
W: http://sourceforge.net/projects/xscaleiop
|
W: http://sourceforge.net/projects/xscaleiop
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: Documentation/crypto/async-tx-api.txt
|
F: Documentation/crypto/async-tx-api.txt
|
||||||
F: crypto/async_tx/
|
F: crypto/async_tx/
|
||||||
F: drivers/dma/
|
F: drivers/dma/
|
||||||
@ -2212,7 +2217,7 @@ S: Maintained
|
|||||||
F: drivers/scsi/tmscsim.*
|
F: drivers/scsi/tmscsim.*
|
||||||
|
|
||||||
DC395x SCSI driver
|
DC395x SCSI driver
|
||||||
M: Oliver Neukum <oliver@neukum.name>
|
M: Oliver Neukum <oliver@neukum.org>
|
||||||
M: Ali Akcaagac <aliakc@web.de>
|
M: Ali Akcaagac <aliakc@web.de>
|
||||||
M: Jamie Lenehan <lenehan@twibble.org>
|
M: Jamie Lenehan <lenehan@twibble.org>
|
||||||
W: http://twibble.org/dist/dc395x/
|
W: http://twibble.org/dist/dc395x/
|
||||||
@ -2359,7 +2364,7 @@ T: git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git
|
|||||||
|
|
||||||
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
|
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
|
||||||
M: Vinod Koul <vinod.koul@intel.com>
|
M: Vinod Koul <vinod.koul@intel.com>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/dma/
|
F: drivers/dma/
|
||||||
F: include/linux/dma*
|
F: include/linux/dma*
|
||||||
@ -3094,7 +3099,7 @@ F: include/linux/gigaset_dev.h
|
|||||||
|
|
||||||
GPIO SUBSYSTEM
|
GPIO SUBSYSTEM
|
||||||
M: Grant Likely <grant.likely@secretlab.ca>
|
M: Grant Likely <grant.likely@secretlab.ca>
|
||||||
M: Linus Walleij <linus.walleij@stericsson.com>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||||
F: Documentation/gpio.txt
|
F: Documentation/gpio.txt
|
||||||
@ -3547,7 +3552,6 @@ K: \b(ABS|SYN)_MT_
|
|||||||
|
|
||||||
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
||||||
M: Intel SCU Linux support <intel-linux-scu@intel.com>
|
M: Intel SCU Linux support <intel-linux-scu@intel.com>
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
|
||||||
M: Dave Jiang <dave.jiang@intel.com>
|
M: Dave Jiang <dave.jiang@intel.com>
|
||||||
M: Ed Nadolski <edmund.nadolski@intel.com>
|
M: Ed Nadolski <edmund.nadolski@intel.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
@ -3590,8 +3594,8 @@ F: arch/x86/kernel/microcode_core.c
|
|||||||
F: arch/x86/kernel/microcode_intel.c
|
F: arch/x86/kernel/microcode_intel.c
|
||||||
|
|
||||||
INTEL I/OAT DMA DRIVER
|
INTEL I/OAT DMA DRIVER
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: drivers/dma/ioat*
|
F: drivers/dma/ioat*
|
||||||
|
|
||||||
INTEL IOMMU (VT-d)
|
INTEL IOMMU (VT-d)
|
||||||
@ -3603,8 +3607,8 @@ F: drivers/iommu/intel-iommu.c
|
|||||||
F: include/linux/intel-iommu.h
|
F: include/linux/intel-iommu.h
|
||||||
|
|
||||||
INTEL IOP-ADMA DMA DRIVER
|
INTEL IOP-ADMA DMA DRIVER
|
||||||
M: Dan Williams <dan.j.williams@intel.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
S: Maintained
|
S: Odd fixes
|
||||||
F: drivers/dma/iop-adma.c
|
F: drivers/dma/iop-adma.c
|
||||||
|
|
||||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||||
@ -4533,7 +4537,7 @@ S: Supported
|
|||||||
F: arch/microblaze/
|
F: arch/microblaze/
|
||||||
|
|
||||||
MICROTEK X6 SCANNER
|
MICROTEK X6 SCANNER
|
||||||
M: Oliver Neukum <oliver@neukum.name>
|
M: Oliver Neukum <oliver@neukum.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/usb/image/microtek.*
|
F: drivers/usb/image/microtek.*
|
||||||
|
|
||||||
@ -5329,14 +5333,15 @@ PIN CONTROL SUBSYSTEM
|
|||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/pinctrl/
|
F: drivers/pinctrl/
|
||||||
|
F: include/linux/pinctrl/
|
||||||
|
|
||||||
PIN CONTROLLER - ST SPEAR
|
PIN CONTROLLER - ST SPEAR
|
||||||
M: Viresh Kumar <viresh.linux@gmail.com>
|
M: Viresh Kumar <viresh.linux@gmail.com>
|
||||||
L: spear-devel@list.st.com
|
L: spear-devel@list.st.com
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: driver/pinctrl/spear/
|
F: drivers/pinctrl/spear/
|
||||||
|
|
||||||
PKTCDVD DRIVER
|
PKTCDVD DRIVER
|
||||||
M: Peter Osterlund <petero2@telia.com>
|
M: Peter Osterlund <petero2@telia.com>
|
||||||
@ -7071,7 +7076,7 @@ F: include/linux/mtd/ubi.h
|
|||||||
F: include/mtd/ubi-user.h
|
F: include/mtd/ubi-user.h
|
||||||
|
|
||||||
USB ACM DRIVER
|
USB ACM DRIVER
|
||||||
M: Oliver Neukum <oliver@neukum.name>
|
M: Oliver Neukum <oliver@neukum.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/usb/acm.txt
|
F: Documentation/usb/acm.txt
|
||||||
@ -7092,7 +7097,7 @@ S: Supported
|
|||||||
F: drivers/block/ub.c
|
F: drivers/block/ub.c
|
||||||
|
|
||||||
USB CDC ETHERNET DRIVER
|
USB CDC ETHERNET DRIVER
|
||||||
M: Oliver Neukum <oliver@neukum.name>
|
M: Oliver Neukum <oliver@neukum.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/usb/cdc_*.c
|
F: drivers/net/usb/cdc_*.c
|
||||||
@ -7165,7 +7170,7 @@ F: drivers/usb/host/isp116x*
|
|||||||
F: include/linux/usb/isp116x.h
|
F: include/linux/usb/isp116x.h
|
||||||
|
|
||||||
USB KAWASAKI LSI DRIVER
|
USB KAWASAKI LSI DRIVER
|
||||||
M: Oliver Neukum <oliver@neukum.name>
|
M: Oliver Neukum <oliver@neukum.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/usb/serial/kl5kusb105.*
|
F: drivers/usb/serial/kl5kusb105.*
|
||||||
@ -7283,6 +7288,12 @@ W: http://www.connecttech.com
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/usb/serial/whiteheat*
|
F: drivers/usb/serial/whiteheat*
|
||||||
|
|
||||||
|
USB SMSC75XX ETHERNET DRIVER
|
||||||
|
M: Steve Glendinning <steve.glendinning@shawell.net>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/net/usb/smsc75xx.*
|
||||||
|
|
||||||
USB SMSC95XX ETHERNET DRIVER
|
USB SMSC95XX ETHERNET DRIVER
|
||||||
M: Steve Glendinning <steve.glendinning@shawell.net>
|
M: Steve Glendinning <steve.glendinning@shawell.net>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
@ -7665,23 +7676,28 @@ S: Supported
|
|||||||
F: Documentation/hwmon/wm83??
|
F: Documentation/hwmon/wm83??
|
||||||
F: arch/arm/mach-s3c64xx/mach-crag6410*
|
F: arch/arm/mach-s3c64xx/mach-crag6410*
|
||||||
F: drivers/clk/clk-wm83*.c
|
F: drivers/clk/clk-wm83*.c
|
||||||
|
F: drivers/extcon/extcon-arizona.c
|
||||||
F: drivers/leds/leds-wm83*.c
|
F: drivers/leds/leds-wm83*.c
|
||||||
F: drivers/gpio/gpio-*wm*.c
|
F: drivers/gpio/gpio-*wm*.c
|
||||||
|
F: drivers/gpio/gpio-arizona.c
|
||||||
F: drivers/hwmon/wm83??-hwmon.c
|
F: drivers/hwmon/wm83??-hwmon.c
|
||||||
F: drivers/input/misc/wm831x-on.c
|
F: drivers/input/misc/wm831x-on.c
|
||||||
F: drivers/input/touchscreen/wm831x-ts.c
|
F: drivers/input/touchscreen/wm831x-ts.c
|
||||||
F: drivers/input/touchscreen/wm97*.c
|
F: drivers/input/touchscreen/wm97*.c
|
||||||
F: drivers/mfd/wm8*.c
|
F: drivers/mfd/arizona*
|
||||||
|
F: drivers/mfd/wm*.c
|
||||||
F: drivers/power/wm83*.c
|
F: drivers/power/wm83*.c
|
||||||
F: drivers/rtc/rtc-wm83*.c
|
F: drivers/rtc/rtc-wm83*.c
|
||||||
F: drivers/regulator/wm8*.c
|
F: drivers/regulator/wm8*.c
|
||||||
F: drivers/video/backlight/wm83*_bl.c
|
F: drivers/video/backlight/wm83*_bl.c
|
||||||
F: drivers/watchdog/wm83*_wdt.c
|
F: drivers/watchdog/wm83*_wdt.c
|
||||||
|
F: include/linux/mfd/arizona/
|
||||||
F: include/linux/mfd/wm831x/
|
F: include/linux/mfd/wm831x/
|
||||||
F: include/linux/mfd/wm8350/
|
F: include/linux/mfd/wm8350/
|
||||||
F: include/linux/mfd/wm8400*
|
F: include/linux/mfd/wm8400*
|
||||||
F: include/linux/wm97xx.h
|
F: include/linux/wm97xx.h
|
||||||
F: include/sound/wm????.h
|
F: include/sound/wm????.h
|
||||||
|
F: sound/soc/codecs/arizona.?
|
||||||
F: sound/soc/codecs/wm*
|
F: sound/soc/codecs/wm*
|
||||||
|
|
||||||
WORKQUEUE
|
WORKQUEUE
|
||||||
|
4
Makefile
4
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 5
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION =
|
EXTRAVERSION = -rc2
|
||||||
NAME = Saber-toothed Squirrel
|
NAME = Saber-toothed Squirrel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -18,6 +18,8 @@ config ALPHA
|
|||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select GENERIC_CMOS_UPDATE
|
select GENERIC_CMOS_UPDATE
|
||||||
|
select GENERIC_STRNCPY_FROM_USER
|
||||||
|
select GENERIC_STRNLEN_USER
|
||||||
help
|
help
|
||||||
The Alpha is a 64-bit general-purpose processor designed and
|
The Alpha is a 64-bit general-purpose processor designed and
|
||||||
marketed by the Digital Equipment Corporation of blessed memory,
|
marketed by the Digital Equipment Corporation of blessed memory,
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define ATOMIC_INIT(i) ( (atomic_t) { (i) } )
|
#define ATOMIC_INIT(i) { (i) }
|
||||||
#define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } )
|
#define ATOMIC64_INIT(i) { (i) }
|
||||||
|
|
||||||
#define atomic_read(v) (*(volatile int *)&(v)->counter)
|
#define atomic_read(v) (*(volatile int *)&(v)->counter)
|
||||||
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
|
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
#ifndef __ASM_ALPHA_FPU_H
|
#ifndef __ASM_ALPHA_FPU_H
|
||||||
#define __ASM_ALPHA_FPU_H
|
#define __ASM_ALPHA_FPU_H
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
#include <asm/special_insns.h>
|
#include <asm/special_insns.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alpha floating-point control register defines:
|
* Alpha floating-point control register defines:
|
||||||
|
@ -76,7 +76,10 @@ struct switch_stack {
|
|||||||
#define task_pt_regs(task) \
|
#define task_pt_regs(task) \
|
||||||
((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
|
((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
|
||||||
|
|
||||||
#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0)
|
#define current_pt_regs() \
|
||||||
|
((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
|
||||||
|
|
||||||
|
#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -76,9 +76,11 @@
|
|||||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||||
#define SO_NOFCS 43
|
#define SO_NOFCS 43
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
||||||
* have to define SOCK_NONBLOCK to a different value here.
|
* have to define SOCK_NONBLOCK to a different value here.
|
||||||
*/
|
*/
|
||||||
#define SOCK_NONBLOCK 0x40000000
|
#define SOCK_NONBLOCK 0x40000000
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
@ -433,36 +433,12 @@ clear_user(void __user *to, long len)
|
|||||||
#undef __module_address
|
#undef __module_address
|
||||||
#undef __module_call
|
#undef __module_call
|
||||||
|
|
||||||
/* Returns: -EFAULT if exception before terminator, N if the entire
|
#define user_addr_max() \
|
||||||
buffer filled, else strlen. */
|
(segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
|
||||||
|
|
||||||
extern long __strncpy_from_user(char *__to, const char __user *__from, long __to_len);
|
extern long strncpy_from_user(char *dest, const char __user *src, long count);
|
||||||
|
extern __must_check long strlen_user(const char __user *str);
|
||||||
extern inline long
|
extern __must_check long strnlen_user(const char __user *str, long n);
|
||||||
strncpy_from_user(char *to, const char __user *from, long n)
|
|
||||||
{
|
|
||||||
long ret = -EFAULT;
|
|
||||||
if (__access_ok((unsigned long)from, 0, get_fs()))
|
|
||||||
ret = __strncpy_from_user(to, from, n);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
|
|
||||||
extern long __strlen_user(const char __user *);
|
|
||||||
|
|
||||||
extern inline long strlen_user(const char __user *str)
|
|
||||||
{
|
|
||||||
return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns: 0 if exception before NUL or reaching the supplied limit (N),
|
|
||||||
* a value greater than N if the limit would be exceeded, else strlen. */
|
|
||||||
extern long __strnlen_user(const char __user *, long);
|
|
||||||
|
|
||||||
extern inline long strnlen_user(const char __user *str, long n)
|
|
||||||
{
|
|
||||||
return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* About the exception table:
|
* About the exception table:
|
||||||
|
@ -465,10 +465,12 @@
|
|||||||
#define __NR_setns 501
|
#define __NR_setns 501
|
||||||
#define __NR_accept4 502
|
#define __NR_accept4 502
|
||||||
#define __NR_sendmmsg 503
|
#define __NR_sendmmsg 503
|
||||||
|
#define __NR_process_vm_readv 504
|
||||||
|
#define __NR_process_vm_writev 505
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#define NR_SYSCALLS 504
|
#define NR_SYSCALLS 506
|
||||||
|
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
|
55
arch/alpha/include/asm/word-at-a-time.h
Normal file
55
arch/alpha/include/asm/word-at-a-time.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#ifndef _ASM_WORD_AT_A_TIME_H
|
||||||
|
#define _ASM_WORD_AT_A_TIME_H
|
||||||
|
|
||||||
|
#include <asm/compiler.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* word-at-a-time interface for Alpha.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We do not use the word_at_a_time struct on Alpha, but it needs to be
|
||||||
|
* implemented to humour the generic code.
|
||||||
|
*/
|
||||||
|
struct word_at_a_time {
|
||||||
|
const unsigned long unused;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define WORD_AT_A_TIME_CONSTANTS { 0 }
|
||||||
|
|
||||||
|
/* Return nonzero if val has a zero */
|
||||||
|
static inline unsigned long has_zero(unsigned long val, unsigned long *bits, const struct word_at_a_time *c)
|
||||||
|
{
|
||||||
|
unsigned long zero_locations = __kernel_cmpbge(0, val);
|
||||||
|
*bits = zero_locations;
|
||||||
|
return zero_locations;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long prep_zero_mask(unsigned long val, unsigned long bits, const struct word_at_a_time *c)
|
||||||
|
{
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define create_zero_mask(bits) (bits)
|
||||||
|
|
||||||
|
static inline unsigned long find_zero(unsigned long bits)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
|
||||||
|
/* Simple if have CIX instructions */
|
||||||
|
return __kernel_cttz(bits);
|
||||||
|
#else
|
||||||
|
unsigned long t1, t2, t3;
|
||||||
|
/* Retain lowest set bit only */
|
||||||
|
bits &= -bits;
|
||||||
|
/* Binary search for lowest set bit */
|
||||||
|
t1 = bits & 0xf0;
|
||||||
|
t2 = bits & 0xcc;
|
||||||
|
t3 = bits & 0xaa;
|
||||||
|
if (t1) t1 = 4;
|
||||||
|
if (t2) t2 = 2;
|
||||||
|
if (t3) t3 = 1;
|
||||||
|
return t1 + t2 + t3;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _ASM_WORD_AT_A_TIME_H */
|
@ -52,7 +52,6 @@ EXPORT_SYMBOL(alpha_write_fp_reg_s);
|
|||||||
|
|
||||||
/* entry.S */
|
/* entry.S */
|
||||||
EXPORT_SYMBOL(kernel_thread);
|
EXPORT_SYMBOL(kernel_thread);
|
||||||
EXPORT_SYMBOL(kernel_execve);
|
|
||||||
|
|
||||||
/* Networking helper routines. */
|
/* Networking helper routines. */
|
||||||
EXPORT_SYMBOL(csum_tcpudp_magic);
|
EXPORT_SYMBOL(csum_tcpudp_magic);
|
||||||
@ -74,8 +73,6 @@ EXPORT_SYMBOL(alpha_fp_emul);
|
|||||||
*/
|
*/
|
||||||
EXPORT_SYMBOL(__copy_user);
|
EXPORT_SYMBOL(__copy_user);
|
||||||
EXPORT_SYMBOL(__do_clear_user);
|
EXPORT_SYMBOL(__do_clear_user);
|
||||||
EXPORT_SYMBOL(__strncpy_from_user);
|
|
||||||
EXPORT_SYMBOL(__strnlen_user);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SMP-specific symbols.
|
* SMP-specific symbols.
|
||||||
|
@ -663,58 +663,6 @@ kernel_thread:
|
|||||||
br ret_to_kernel
|
br ret_to_kernel
|
||||||
.end kernel_thread
|
.end kernel_thread
|
||||||
|
|
||||||
/*
|
|
||||||
* kernel_execve(path, argv, envp)
|
|
||||||
*/
|
|
||||||
.align 4
|
|
||||||
.globl kernel_execve
|
|
||||||
.ent kernel_execve
|
|
||||||
kernel_execve:
|
|
||||||
/* We can be called from a module. */
|
|
||||||
ldgp $gp, 0($27)
|
|
||||||
lda $sp, -(32+SIZEOF_PT_REGS+8)($sp)
|
|
||||||
.frame $sp, 32+SIZEOF_PT_REGS+8, $26, 0
|
|
||||||
stq $26, 0($sp)
|
|
||||||
stq $16, 8($sp)
|
|
||||||
stq $17, 16($sp)
|
|
||||||
stq $18, 24($sp)
|
|
||||||
.prologue 1
|
|
||||||
|
|
||||||
lda $16, 32($sp)
|
|
||||||
lda $17, 0
|
|
||||||
lda $18, SIZEOF_PT_REGS
|
|
||||||
bsr $26, memset !samegp
|
|
||||||
|
|
||||||
/* Avoid the HAE being gratuitously wrong, which would cause us
|
|
||||||
to do the whole turn off interrupts thing and restore it. */
|
|
||||||
ldq $2, alpha_mv+HAE_CACHE
|
|
||||||
stq $2, 152+32($sp)
|
|
||||||
|
|
||||||
ldq $16, 8($sp)
|
|
||||||
ldq $17, 16($sp)
|
|
||||||
ldq $18, 24($sp)
|
|
||||||
lda $19, 32($sp)
|
|
||||||
bsr $26, do_execve !samegp
|
|
||||||
|
|
||||||
ldq $26, 0($sp)
|
|
||||||
bne $0, 1f /* error! */
|
|
||||||
|
|
||||||
/* Move the temporary pt_regs struct from its current location
|
|
||||||
to the top of the kernel stack frame. See copy_thread for
|
|
||||||
details for a normal process. */
|
|
||||||
lda $16, 0x4000 - SIZEOF_PT_REGS($8)
|
|
||||||
lda $17, 32($sp)
|
|
||||||
lda $18, SIZEOF_PT_REGS
|
|
||||||
bsr $26, memmove !samegp
|
|
||||||
|
|
||||||
/* Take that over as our new stack frame and visit userland! */
|
|
||||||
lda $sp, 0x4000 - SIZEOF_PT_REGS($8)
|
|
||||||
br $31, ret_from_sys_call
|
|
||||||
|
|
||||||
1: lda $sp, 32+SIZEOF_PT_REGS+8($sp)
|
|
||||||
ret
|
|
||||||
.end kernel_execve
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special system calls. Most of these are special in that they either
|
* Special system calls. Most of these are special in that they either
|
||||||
@ -796,115 +744,6 @@ sys_rt_sigreturn:
|
|||||||
br ret_from_sys_call
|
br ret_from_sys_call
|
||||||
.end sys_rt_sigreturn
|
.end sys_rt_sigreturn
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_sethae
|
|
||||||
.ent sys_sethae
|
|
||||||
sys_sethae:
|
|
||||||
.prologue 0
|
|
||||||
stq $16, 152($sp)
|
|
||||||
ret
|
|
||||||
.end sys_sethae
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl osf_getpriority
|
|
||||||
.ent osf_getpriority
|
|
||||||
osf_getpriority:
|
|
||||||
lda $sp, -16($sp)
|
|
||||||
stq $26, 0($sp)
|
|
||||||
.prologue 0
|
|
||||||
|
|
||||||
jsr $26, sys_getpriority
|
|
||||||
|
|
||||||
ldq $26, 0($sp)
|
|
||||||
blt $0, 1f
|
|
||||||
|
|
||||||
/* Return value is the unbiased priority, i.e. 20 - prio.
|
|
||||||
This does result in negative return values, so signal
|
|
||||||
no error by writing into the R0 slot. */
|
|
||||||
lda $1, 20
|
|
||||||
stq $31, 16($sp)
|
|
||||||
subl $1, $0, $0
|
|
||||||
unop
|
|
||||||
|
|
||||||
1: lda $sp, 16($sp)
|
|
||||||
ret
|
|
||||||
.end osf_getpriority
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_getxuid
|
|
||||||
.ent sys_getxuid
|
|
||||||
sys_getxuid:
|
|
||||||
.prologue 0
|
|
||||||
ldq $2, TI_TASK($8)
|
|
||||||
ldq $3, TASK_CRED($2)
|
|
||||||
ldl $0, CRED_UID($3)
|
|
||||||
ldl $1, CRED_EUID($3)
|
|
||||||
stq $1, 80($sp)
|
|
||||||
ret
|
|
||||||
.end sys_getxuid
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_getxgid
|
|
||||||
.ent sys_getxgid
|
|
||||||
sys_getxgid:
|
|
||||||
.prologue 0
|
|
||||||
ldq $2, TI_TASK($8)
|
|
||||||
ldq $3, TASK_CRED($2)
|
|
||||||
ldl $0, CRED_GID($3)
|
|
||||||
ldl $1, CRED_EGID($3)
|
|
||||||
stq $1, 80($sp)
|
|
||||||
ret
|
|
||||||
.end sys_getxgid
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_getxpid
|
|
||||||
.ent sys_getxpid
|
|
||||||
sys_getxpid:
|
|
||||||
.prologue 0
|
|
||||||
ldq $2, TI_TASK($8)
|
|
||||||
|
|
||||||
/* See linux/kernel/timer.c sys_getppid for discussion
|
|
||||||
about this loop. */
|
|
||||||
ldq $3, TASK_GROUP_LEADER($2)
|
|
||||||
ldq $4, TASK_REAL_PARENT($3)
|
|
||||||
ldl $0, TASK_TGID($2)
|
|
||||||
1: ldl $1, TASK_TGID($4)
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
mov $4, $5
|
|
||||||
mb
|
|
||||||
ldq $3, TASK_GROUP_LEADER($2)
|
|
||||||
ldq $4, TASK_REAL_PARENT($3)
|
|
||||||
cmpeq $4, $5, $5
|
|
||||||
beq $5, 1b
|
|
||||||
#endif
|
|
||||||
stq $1, 80($sp)
|
|
||||||
ret
|
|
||||||
.end sys_getxpid
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_alpha_pipe
|
|
||||||
.ent sys_alpha_pipe
|
|
||||||
sys_alpha_pipe:
|
|
||||||
lda $sp, -16($sp)
|
|
||||||
stq $26, 0($sp)
|
|
||||||
.prologue 0
|
|
||||||
|
|
||||||
mov $31, $17
|
|
||||||
lda $16, 8($sp)
|
|
||||||
jsr $26, do_pipe_flags
|
|
||||||
|
|
||||||
ldq $26, 0($sp)
|
|
||||||
bne $0, 1f
|
|
||||||
|
|
||||||
/* The return values are in $0 and $20. */
|
|
||||||
ldl $1, 12($sp)
|
|
||||||
ldl $0, 8($sp)
|
|
||||||
|
|
||||||
stq $1, 80+16($sp)
|
|
||||||
1: lda $sp, 16($sp)
|
|
||||||
ret
|
|
||||||
.end sys_alpha_pipe
|
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.globl sys_execve
|
.globl sys_execve
|
||||||
.ent sys_execve
|
.ent sys_execve
|
||||||
|
@ -1404,3 +1404,52 @@ SYSCALL_DEFINE3(osf_writev, unsigned long, fd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
SYSCALL_DEFINE2(osf_getpriority, int, which, int, who)
|
||||||
|
{
|
||||||
|
int prio = sys_getpriority(which, who);
|
||||||
|
if (prio >= 0) {
|
||||||
|
/* Return value is the unbiased priority, i.e. 20 - prio.
|
||||||
|
This does result in negative return values, so signal
|
||||||
|
no error */
|
||||||
|
force_successful_syscall_return();
|
||||||
|
prio = 20 - prio;
|
||||||
|
}
|
||||||
|
return prio;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE0(getxuid)
|
||||||
|
{
|
||||||
|
current_pt_regs()->r20 = sys_geteuid();
|
||||||
|
return sys_getuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE0(getxgid)
|
||||||
|
{
|
||||||
|
current_pt_regs()->r20 = sys_getegid();
|
||||||
|
return sys_getgid();
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE0(getxpid)
|
||||||
|
{
|
||||||
|
current_pt_regs()->r20 = sys_getppid();
|
||||||
|
return sys_getpid();
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE0(alpha_pipe)
|
||||||
|
{
|
||||||
|
int fd[2];
|
||||||
|
int res = do_pipe_flags(fd, 0);
|
||||||
|
if (!res) {
|
||||||
|
/* The return values are in $0 and $20. */
|
||||||
|
current_pt_regs()->r20 = fd[1];
|
||||||
|
res = fd[0];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE1(sethae, unsigned long, val)
|
||||||
|
{
|
||||||
|
current_pt_regs()->hae = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -455,3 +455,22 @@ get_wchan(struct task_struct *p)
|
|||||||
}
|
}
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kernel_execve(const char *path, const char *const argv[], const char *const envp[])
|
||||||
|
{
|
||||||
|
/* Avoid the HAE being gratuitously wrong, which would cause us
|
||||||
|
to do the whole turn off interrupts thing and restore it. */
|
||||||
|
struct pt_regs regs = {.hae = alpha_mv.hae_cache};
|
||||||
|
int err = do_execve(path, argv, envp, ®s);
|
||||||
|
if (!err) {
|
||||||
|
struct pt_regs *p = current_pt_regs();
|
||||||
|
/* copy regs to normal position and off to userland we go... */
|
||||||
|
*p = regs;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mov %0, $sp;"
|
||||||
|
"br $31, ret_from_sys_call"
|
||||||
|
: : "r"(p));
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kernel_execve);
|
||||||
|
@ -111,7 +111,7 @@ sys_call_table:
|
|||||||
.quad sys_socket
|
.quad sys_socket
|
||||||
.quad sys_connect
|
.quad sys_connect
|
||||||
.quad sys_accept
|
.quad sys_accept
|
||||||
.quad osf_getpriority /* 100 */
|
.quad sys_osf_getpriority /* 100 */
|
||||||
.quad sys_send
|
.quad sys_send
|
||||||
.quad sys_recv
|
.quad sys_recv
|
||||||
.quad sys_sigreturn
|
.quad sys_sigreturn
|
||||||
@ -522,6 +522,8 @@ sys_call_table:
|
|||||||
.quad sys_setns
|
.quad sys_setns
|
||||||
.quad sys_accept4
|
.quad sys_accept4
|
||||||
.quad sys_sendmmsg
|
.quad sys_sendmmsg
|
||||||
|
.quad sys_process_vm_readv
|
||||||
|
.quad sys_process_vm_writev /* 505 */
|
||||||
|
|
||||||
.size sys_call_table, . - sys_call_table
|
.size sys_call_table, . - sys_call_table
|
||||||
.type sys_call_table, @object
|
.type sys_call_table, @object
|
||||||
|
@ -31,8 +31,6 @@ lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
|
|||||||
$(ev6-y)memchr.o \
|
$(ev6-y)memchr.o \
|
||||||
$(ev6-y)copy_user.o \
|
$(ev6-y)copy_user.o \
|
||||||
$(ev6-y)clear_user.o \
|
$(ev6-y)clear_user.o \
|
||||||
$(ev6-y)strncpy_from_user.o \
|
|
||||||
$(ev67-y)strlen_user.o \
|
|
||||||
$(ev6-y)csum_ipv6_magic.o \
|
$(ev6-y)csum_ipv6_magic.o \
|
||||||
$(ev6-y)clear_page.o \
|
$(ev6-y)clear_page.o \
|
||||||
$(ev6-y)copy_page.o \
|
$(ev6-y)copy_page.o \
|
||||||
|
@ -1,424 +0,0 @@
|
|||||||
/*
|
|
||||||
* arch/alpha/lib/ev6-strncpy_from_user.S
|
|
||||||
* 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
|
|
||||||
*
|
|
||||||
* Just like strncpy except in the return value:
|
|
||||||
*
|
|
||||||
* -EFAULT if an exception occurs before the terminator is copied.
|
|
||||||
* N if the buffer filled.
|
|
||||||
*
|
|
||||||
* Otherwise the length of the string is returned.
|
|
||||||
*
|
|
||||||
* Much of the information about 21264 scheduling/coding comes from:
|
|
||||||
* Compiler Writer's Guide for the Alpha 21264
|
|
||||||
* abbreviated as 'CWG' in other comments here
|
|
||||||
* ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
|
|
||||||
* Scheduling notation:
|
|
||||||
* E - either cluster
|
|
||||||
* U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
|
|
||||||
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
|
|
||||||
* A bunch of instructions got moved and temp registers were changed
|
|
||||||
* to aid in scheduling. Control flow was also re-arranged to eliminate
|
|
||||||
* branches, and to provide longer code sequences to enable better scheduling.
|
|
||||||
* A total rewrite (using byte load/stores for start & tail sequences)
|
|
||||||
* is desirable, but very difficult to do without a from-scratch rewrite.
|
|
||||||
* Save that for the future.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <asm/errno.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Allow an exception for an insn; exit if we get one. */
|
|
||||||
#define EX(x,y...) \
|
|
||||||
99: x,##y; \
|
|
||||||
.section __ex_table,"a"; \
|
|
||||||
.long 99b - .; \
|
|
||||||
lda $31, $exception-99b($0); \
|
|
||||||
.previous
|
|
||||||
|
|
||||||
|
|
||||||
.set noat
|
|
||||||
.set noreorder
|
|
||||||
.text
|
|
||||||
|
|
||||||
.globl __strncpy_from_user
|
|
||||||
.ent __strncpy_from_user
|
|
||||||
.frame $30, 0, $26
|
|
||||||
.prologue 0
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
__strncpy_from_user:
|
|
||||||
and a0, 7, t3 # E : find dest misalignment
|
|
||||||
beq a2, $zerolength # U :
|
|
||||||
|
|
||||||
/* Are source and destination co-aligned? */
|
|
||||||
mov a0, v0 # E : save the string start
|
|
||||||
xor a0, a1, t4 # E :
|
|
||||||
EX( ldq_u t1, 0(a1) ) # L : Latency=3 load first quadword
|
|
||||||
ldq_u t0, 0(a0) # L : load first (partial) aligned dest quadword
|
|
||||||
|
|
||||||
addq a2, t3, a2 # E : bias count by dest misalignment
|
|
||||||
subq a2, 1, a3 # E :
|
|
||||||
addq zero, 1, t10 # E :
|
|
||||||
and t4, 7, t4 # E : misalignment between the two
|
|
||||||
|
|
||||||
and a3, 7, t6 # E : number of tail bytes
|
|
||||||
sll t10, t6, t10 # E : t10 = bitmask of last count byte
|
|
||||||
bne t4, $unaligned # U :
|
|
||||||
lda t2, -1 # E : build a mask against false zero
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We are co-aligned; take care of a partial first word.
|
|
||||||
* On entry to this basic block:
|
|
||||||
* t0 == the first destination word for masking back in
|
|
||||||
* t1 == the first source word.
|
|
||||||
*/
|
|
||||||
|
|
||||||
srl a3, 3, a2 # E : a2 = loop counter = (count - 1)/8
|
|
||||||
addq a1, 8, a1 # E :
|
|
||||||
mskqh t2, a1, t2 # U : detection in the src word
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Create the 1st output word and detect 0's in the 1st input word. */
|
|
||||||
mskqh t1, a1, t3 # U :
|
|
||||||
mskql t0, a1, t0 # U : assemble the first output word
|
|
||||||
ornot t1, t2, t2 # E :
|
|
||||||
nop
|
|
||||||
|
|
||||||
cmpbge zero, t2, t8 # E : bits set iff null found
|
|
||||||
or t0, t3, t0 # E :
|
|
||||||
beq a2, $a_eoc # U :
|
|
||||||
bne t8, $a_eos # U : 2nd branch in a quad. Bad.
|
|
||||||
|
|
||||||
/* On entry to this basic block:
|
|
||||||
* t0 == a source quad not containing a null.
|
|
||||||
* a0 - current aligned destination address
|
|
||||||
* a1 - current aligned source address
|
|
||||||
* a2 - count of quadwords to move.
|
|
||||||
* NOTE: Loop improvement - unrolling this is going to be
|
|
||||||
* a huge win, since we're going to stall otherwise.
|
|
||||||
* Fix this later. For _really_ large copies, look
|
|
||||||
* at using wh64 on a look-ahead basis. See the code
|
|
||||||
* in clear_user.S and copy_user.S.
|
|
||||||
* Presumably, since (a0) and (a1) do not overlap (by C definition)
|
|
||||||
* Lots of nops here:
|
|
||||||
* - Separate loads from stores
|
|
||||||
* - Keep it to 1 branch/quadpack so the branch predictor
|
|
||||||
* can train.
|
|
||||||
*/
|
|
||||||
$a_loop:
|
|
||||||
stq_u t0, 0(a0) # L :
|
|
||||||
addq a0, 8, a0 # E :
|
|
||||||
nop
|
|
||||||
subq a2, 1, a2 # E :
|
|
||||||
|
|
||||||
EX( ldq_u t0, 0(a1) ) # L :
|
|
||||||
addq a1, 8, a1 # E :
|
|
||||||
cmpbge zero, t0, t8 # E : Stall 2 cycles on t0
|
|
||||||
beq a2, $a_eoc # U :
|
|
||||||
|
|
||||||
beq t8, $a_loop # U :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Take care of the final (partial) word store. At this point
|
|
||||||
* the end-of-count bit is set in t8 iff it applies.
|
|
||||||
*
|
|
||||||
* On entry to this basic block we have:
|
|
||||||
* t0 == the source word containing the null
|
|
||||||
* t8 == the cmpbge mask that found it.
|
|
||||||
*/
|
|
||||||
$a_eos:
|
|
||||||
negq t8, t12 # E : find low bit set
|
|
||||||
and t8, t12, t12 # E :
|
|
||||||
|
|
||||||
/* We're doing a partial word store and so need to combine
|
|
||||||
our source and original destination words. */
|
|
||||||
ldq_u t1, 0(a0) # L :
|
|
||||||
subq t12, 1, t6 # E :
|
|
||||||
|
|
||||||
or t12, t6, t8 # E :
|
|
||||||
zapnot t0, t8, t0 # U : clear src bytes > null
|
|
||||||
zap t1, t8, t1 # U : clear dst bytes <= null
|
|
||||||
or t0, t1, t0 # E :
|
|
||||||
|
|
||||||
stq_u t0, 0(a0) # L :
|
|
||||||
br $finish_up # L0 :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Add the end-of-count bit to the eos detection bitmask. */
|
|
||||||
.align 4
|
|
||||||
$a_eoc:
|
|
||||||
or t10, t8, t8
|
|
||||||
br $a_eos
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
|
|
||||||
/* The source and destination are not co-aligned. Align the destination
|
|
||||||
and cope. We have to be very careful about not reading too much and
|
|
||||||
causing a SEGV. */
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$u_head:
|
|
||||||
/* We know just enough now to be able to assemble the first
|
|
||||||
full source word. We can still find a zero at the end of it
|
|
||||||
that prevents us from outputting the whole thing.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t0 == the first dest word, unmasked
|
|
||||||
t1 == the shifted low bits of the first source word
|
|
||||||
t6 == bytemask that is -1 in dest word bytes */
|
|
||||||
|
|
||||||
EX( ldq_u t2, 8(a1) ) # L : load second src word
|
|
||||||
addq a1, 8, a1 # E :
|
|
||||||
mskql t0, a0, t0 # U : mask trailing garbage in dst
|
|
||||||
extqh t2, a1, t4 # U :
|
|
||||||
|
|
||||||
or t1, t4, t1 # E : first aligned src word complete
|
|
||||||
mskqh t1, a0, t1 # U : mask leading garbage in src
|
|
||||||
or t0, t1, t0 # E : first output word complete
|
|
||||||
or t0, t6, t6 # E : mask original data for zero test
|
|
||||||
|
|
||||||
cmpbge zero, t6, t8 # E :
|
|
||||||
beq a2, $u_eocfin # U :
|
|
||||||
bne t8, $u_final # U : bad news - 2nd branch in a quad
|
|
||||||
lda t6, -1 # E : mask out the bits we have
|
|
||||||
|
|
||||||
mskql t6, a1, t6 # U : already seen
|
|
||||||
stq_u t0, 0(a0) # L : store first output word
|
|
||||||
or t6, t2, t2 # E :
|
|
||||||
cmpbge zero, t2, t8 # E : find nulls in second partial
|
|
||||||
|
|
||||||
addq a0, 8, a0 # E :
|
|
||||||
subq a2, 1, a2 # E :
|
|
||||||
bne t8, $u_late_head_exit # U :
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Finally, we've got all the stupid leading edge cases taken care
|
|
||||||
of and we can set up to enter the main loop. */
|
|
||||||
|
|
||||||
extql t2, a1, t1 # U : position hi-bits of lo word
|
|
||||||
EX( ldq_u t2, 8(a1) ) # L : read next high-order source word
|
|
||||||
addq a1, 8, a1 # E :
|
|
||||||
cmpbge zero, t2, t8 # E :
|
|
||||||
|
|
||||||
beq a2, $u_eoc # U :
|
|
||||||
bne t8, $u_eos # U :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Unaligned copy main loop. In order to avoid reading too much,
|
|
||||||
the loop is structured to detect zeros in aligned source words.
|
|
||||||
This has, unfortunately, effectively pulled half of a loop
|
|
||||||
iteration out into the head and half into the tail, but it does
|
|
||||||
prevent nastiness from accumulating in the very thing we want
|
|
||||||
to run as fast as possible.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t1 == the shifted high-order bits from the previous source word
|
|
||||||
t2 == the unshifted current source word
|
|
||||||
|
|
||||||
We further know that t2 does not contain a null terminator. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Extra nops here:
|
|
||||||
* separate load quads from store quads
|
|
||||||
* only one branch/quad to permit predictor training
|
|
||||||
*/
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$u_loop:
|
|
||||||
extqh t2, a1, t0 # U : extract high bits for current word
|
|
||||||
addq a1, 8, a1 # E :
|
|
||||||
extql t2, a1, t3 # U : extract low bits for next time
|
|
||||||
addq a0, 8, a0 # E :
|
|
||||||
|
|
||||||
or t0, t1, t0 # E : current dst word now complete
|
|
||||||
EX( ldq_u t2, 0(a1) ) # L : load high word for next time
|
|
||||||
subq a2, 1, a2 # E :
|
|
||||||
nop
|
|
||||||
|
|
||||||
stq_u t0, -8(a0) # L : save the current word
|
|
||||||
mov t3, t1 # E :
|
|
||||||
cmpbge zero, t2, t8 # E : test new word for eos
|
|
||||||
beq a2, $u_eoc # U :
|
|
||||||
|
|
||||||
beq t8, $u_loop # U :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* We've found a zero somewhere in the source word we just read.
|
|
||||||
If it resides in the lower half, we have one (probably partial)
|
|
||||||
word to write out, and if it resides in the upper half, we
|
|
||||||
have one full and one partial word left to write out.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t1 == the shifted high-order bits from the previous source word
|
|
||||||
t2 == the unshifted current source word. */
|
|
||||||
.align 4
|
|
||||||
$u_eos:
|
|
||||||
extqh t2, a1, t0 # U :
|
|
||||||
or t0, t1, t0 # E : first (partial) source word complete
|
|
||||||
cmpbge zero, t0, t8 # E : is the null in this first bit?
|
|
||||||
nop
|
|
||||||
|
|
||||||
bne t8, $u_final # U :
|
|
||||||
stq_u t0, 0(a0) # L : the null was in the high-order bits
|
|
||||||
addq a0, 8, a0 # E :
|
|
||||||
subq a2, 1, a2 # E :
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$u_late_head_exit:
|
|
||||||
extql t2, a1, t0 # U :
|
|
||||||
cmpbge zero, t0, t8 # E :
|
|
||||||
or t8, t10, t6 # E :
|
|
||||||
cmoveq a2, t6, t8 # E :
|
|
||||||
|
|
||||||
/* Take care of a final (probably partial) result word.
|
|
||||||
On entry to this basic block:
|
|
||||||
t0 == assembled source word
|
|
||||||
t8 == cmpbge mask that found the null. */
|
|
||||||
.align 4
|
|
||||||
$u_final:
|
|
||||||
negq t8, t6 # E : isolate low bit set
|
|
||||||
and t6, t8, t12 # E :
|
|
||||||
ldq_u t1, 0(a0) # L :
|
|
||||||
subq t12, 1, t6 # E :
|
|
||||||
|
|
||||||
or t6, t12, t8 # E :
|
|
||||||
zapnot t0, t8, t0 # U : kill source bytes > null
|
|
||||||
zap t1, t8, t1 # U : kill dest bytes <= null
|
|
||||||
or t0, t1, t0 # E :
|
|
||||||
|
|
||||||
stq_u t0, 0(a0) # E :
|
|
||||||
br $finish_up # U :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$u_eoc: # end-of-count
|
|
||||||
extqh t2, a1, t0 # U :
|
|
||||||
or t0, t1, t0 # E :
|
|
||||||
cmpbge zero, t0, t8 # E :
|
|
||||||
nop
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$u_eocfin: # end-of-count, final word
|
|
||||||
or t10, t8, t8 # E :
|
|
||||||
br $u_final # U :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Unaligned copy entry point. */
|
|
||||||
.align 4
|
|
||||||
$unaligned:
|
|
||||||
|
|
||||||
srl a3, 3, a2 # U : a2 = loop counter = (count - 1)/8
|
|
||||||
and a0, 7, t4 # E : find dest misalignment
|
|
||||||
and a1, 7, t5 # E : find src misalignment
|
|
||||||
mov zero, t0 # E :
|
|
||||||
|
|
||||||
/* Conditionally load the first destination word and a bytemask
|
|
||||||
with 0xff indicating that the destination byte is sacrosanct. */
|
|
||||||
|
|
||||||
mov zero, t6 # E :
|
|
||||||
beq t4, 1f # U :
|
|
||||||
ldq_u t0, 0(a0) # L :
|
|
||||||
lda t6, -1 # E :
|
|
||||||
|
|
||||||
mskql t6, a0, t6 # E :
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
1:
|
|
||||||
subq a1, t4, a1 # E : sub dest misalignment from src addr
|
|
||||||
/* If source misalignment is larger than dest misalignment, we need
|
|
||||||
extra startup checks to avoid SEGV. */
|
|
||||||
cmplt t4, t5, t12 # E :
|
|
||||||
extql t1, a1, t1 # U : shift src into place
|
|
||||||
lda t2, -1 # E : for creating masks later
|
|
||||||
|
|
||||||
beq t12, $u_head # U :
|
|
||||||
mskqh t2, t5, t2 # U : begin src byte validity mask
|
|
||||||
cmpbge zero, t1, t8 # E : is there a zero?
|
|
||||||
nop
|
|
||||||
|
|
||||||
extql t2, a1, t2 # U :
|
|
||||||
or t8, t10, t5 # E : test for end-of-count too
|
|
||||||
cmpbge zero, t2, t3 # E :
|
|
||||||
cmoveq a2, t5, t8 # E : Latency=2, extra map slot
|
|
||||||
|
|
||||||
nop # E : goes with cmov
|
|
||||||
andnot t8, t3, t8 # E :
|
|
||||||
beq t8, $u_head # U :
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* At this point we've found a zero in the first partial word of
|
|
||||||
the source. We need to isolate the valid source data and mask
|
|
||||||
it into the original destination data. (Incidentally, we know
|
|
||||||
that we'll need at least one byte of that original dest word.) */
|
|
||||||
|
|
||||||
ldq_u t0, 0(a0) # L :
|
|
||||||
negq t8, t6 # E : build bitmask of bytes <= zero
|
|
||||||
mskqh t1, t4, t1 # U :
|
|
||||||
and t6, t8, t12 # E :
|
|
||||||
|
|
||||||
subq t12, 1, t6 # E :
|
|
||||||
or t6, t12, t8 # E :
|
|
||||||
zapnot t2, t8, t2 # U : prepare source word; mirror changes
|
|
||||||
zapnot t1, t8, t1 # U : to source validity mask
|
|
||||||
|
|
||||||
andnot t0, t2, t0 # E : zero place for source to reside
|
|
||||||
or t0, t1, t0 # E : and put it there
|
|
||||||
stq_u t0, 0(a0) # L :
|
|
||||||
nop
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$finish_up:
|
|
||||||
zapnot t0, t12, t4 # U : was last byte written null?
|
|
||||||
and t12, 0xf0, t3 # E : binary search for the address of the
|
|
||||||
cmovne t4, 1, t4 # E : Latency=2, extra map slot
|
|
||||||
nop # E : with cmovne
|
|
||||||
|
|
||||||
and t12, 0xcc, t2 # E : last byte written
|
|
||||||
and t12, 0xaa, t1 # E :
|
|
||||||
cmovne t3, 4, t3 # E : Latency=2, extra map slot
|
|
||||||
nop # E : with cmovne
|
|
||||||
|
|
||||||
bic a0, 7, t0
|
|
||||||
cmovne t2, 2, t2 # E : Latency=2, extra map slot
|
|
||||||
nop # E : with cmovne
|
|
||||||
nop
|
|
||||||
|
|
||||||
cmovne t1, 1, t1 # E : Latency=2, extra map slot
|
|
||||||
nop # E : with cmovne
|
|
||||||
addq t0, t3, t0 # E :
|
|
||||||
addq t1, t2, t1 # E :
|
|
||||||
|
|
||||||
addq t0, t1, t0 # E :
|
|
||||||
addq t0, t4, t0 # add one if we filled the buffer
|
|
||||||
subq t0, v0, v0 # find string length
|
|
||||||
ret # L0 :
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$zerolength:
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
clr v0
|
|
||||||
|
|
||||||
$exception:
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
ret
|
|
||||||
|
|
||||||
.end __strncpy_from_user
|
|
@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* arch/alpha/lib/ev67-strlen_user.S
|
|
||||||
* 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com>
|
|
||||||
*
|
|
||||||
* Return the length of the string including the NULL terminator
|
|
||||||
* (strlen+1) or zero if an error occurred.
|
|
||||||
*
|
|
||||||
* In places where it is critical to limit the processing time,
|
|
||||||
* and the data is not trusted, strnlen_user() should be used.
|
|
||||||
* It will return a value greater than its second argument if
|
|
||||||
* that limit would be exceeded. This implementation is allowed
|
|
||||||
* to access memory beyond the limit, but will not cross a page
|
|
||||||
* boundary when doing so.
|
|
||||||
*
|
|
||||||
* Much of the information about 21264 scheduling/coding comes from:
|
|
||||||
* Compiler Writer's Guide for the Alpha 21264
|
|
||||||
* abbreviated as 'CWG' in other comments here
|
|
||||||
* ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
|
|
||||||
* Scheduling notation:
|
|
||||||
* E - either cluster
|
|
||||||
* U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
|
|
||||||
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
|
|
||||||
* Try not to change the actual algorithm if possible for consistency.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Allow an exception for an insn; exit if we get one. */
|
|
||||||
#define EX(x,y...) \
|
|
||||||
99: x,##y; \
|
|
||||||
.section __ex_table,"a"; \
|
|
||||||
.long 99b - .; \
|
|
||||||
lda v0, $exception-99b(zero); \
|
|
||||||
.previous
|
|
||||||
|
|
||||||
|
|
||||||
.set noreorder
|
|
||||||
.set noat
|
|
||||||
.text
|
|
||||||
|
|
||||||
.globl __strlen_user
|
|
||||||
.ent __strlen_user
|
|
||||||
.frame sp, 0, ra
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
__strlen_user:
|
|
||||||
ldah a1, 32767(zero) # do not use plain strlen_user() for strings
|
|
||||||
# that might be almost 2 GB long; you should
|
|
||||||
# be using strnlen_user() instead
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
|
|
||||||
.globl __strnlen_user
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
__strnlen_user:
|
|
||||||
.prologue 0
|
|
||||||
EX( ldq_u t0, 0(a0) ) # L : load first quadword (a0 may be misaligned)
|
|
||||||
lda t1, -1(zero) # E :
|
|
||||||
|
|
||||||
insqh t1, a0, t1 # U :
|
|
||||||
andnot a0, 7, v0 # E :
|
|
||||||
or t1, t0, t0 # E :
|
|
||||||
subq a0, 1, a0 # E : get our +1 for the return
|
|
||||||
|
|
||||||
cmpbge zero, t0, t1 # E : t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
|
||||||
subq a1, 7, t2 # E :
|
|
||||||
subq a0, v0, t0 # E :
|
|
||||||
bne t1, $found # U :
|
|
||||||
|
|
||||||
addq t2, t0, t2 # E :
|
|
||||||
addq a1, 1, a1 # E :
|
|
||||||
nop # E :
|
|
||||||
nop # E :
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
$loop: ble t2, $limit # U :
|
|
||||||
EX( ldq t0, 8(v0) ) # L :
|
|
||||||
nop # E :
|
|
||||||
nop # E :
|
|
||||||
|
|
||||||
cmpbge zero, t0, t1 # E :
|
|
||||||
subq t2, 8, t2 # E :
|
|
||||||
addq v0, 8, v0 # E : addr += 8
|
|
||||||
beq t1, $loop # U :
|
|
||||||
|
|
||||||
$found: cttz t1, t2 # U0 :
|
|
||||||
addq v0, t2, v0 # E :
|
|
||||||
subq v0, a0, v0 # E :
|
|
||||||
ret # L0 :
|
|
||||||
|
|
||||||
$exception:
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
ret
|
|
||||||
|
|
||||||
.align 4 # currently redundant
|
|
||||||
$limit:
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
subq a1, t2, v0
|
|
||||||
ret
|
|
||||||
|
|
||||||
.end __strlen_user
|
|
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* arch/alpha/lib/strlen_user.S
|
|
||||||
*
|
|
||||||
* Return the length of the string including the NUL terminator
|
|
||||||
* (strlen+1) or zero if an error occurred.
|
|
||||||
*
|
|
||||||
* In places where it is critical to limit the processing time,
|
|
||||||
* and the data is not trusted, strnlen_user() should be used.
|
|
||||||
* It will return a value greater than its second argument if
|
|
||||||
* that limit would be exceeded. This implementation is allowed
|
|
||||||
* to access memory beyond the limit, but will not cross a page
|
|
||||||
* boundary when doing so.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Allow an exception for an insn; exit if we get one. */
|
|
||||||
#define EX(x,y...) \
|
|
||||||
99: x,##y; \
|
|
||||||
.section __ex_table,"a"; \
|
|
||||||
.long 99b - .; \
|
|
||||||
lda v0, $exception-99b(zero); \
|
|
||||||
.previous
|
|
||||||
|
|
||||||
|
|
||||||
.set noreorder
|
|
||||||
.set noat
|
|
||||||
.text
|
|
||||||
|
|
||||||
.globl __strlen_user
|
|
||||||
.ent __strlen_user
|
|
||||||
.frame sp, 0, ra
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
__strlen_user:
|
|
||||||
ldah a1, 32767(zero) # do not use plain strlen_user() for strings
|
|
||||||
# that might be almost 2 GB long; you should
|
|
||||||
# be using strnlen_user() instead
|
|
||||||
|
|
||||||
.globl __strnlen_user
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
__strnlen_user:
|
|
||||||
.prologue 0
|
|
||||||
|
|
||||||
EX( ldq_u t0, 0(a0) ) # load first quadword (a0 may be misaligned)
|
|
||||||
lda t1, -1(zero)
|
|
||||||
insqh t1, a0, t1
|
|
||||||
andnot a0, 7, v0
|
|
||||||
or t1, t0, t0
|
|
||||||
subq a0, 1, a0 # get our +1 for the return
|
|
||||||
cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
|
||||||
subq a1, 7, t2
|
|
||||||
subq a0, v0, t0
|
|
||||||
bne t1, $found
|
|
||||||
|
|
||||||
addq t2, t0, t2
|
|
||||||
addq a1, 1, a1
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
$loop: ble t2, $limit
|
|
||||||
EX( ldq t0, 8(v0) )
|
|
||||||
subq t2, 8, t2
|
|
||||||
addq v0, 8, v0 # addr += 8
|
|
||||||
cmpbge zero, t0, t1
|
|
||||||
beq t1, $loop
|
|
||||||
|
|
||||||
$found: negq t1, t2 # clear all but least set bit
|
|
||||||
and t1, t2, t1
|
|
||||||
|
|
||||||
and t1, 0xf0, t2 # binary search for that set bit
|
|
||||||
and t1, 0xcc, t3
|
|
||||||
and t1, 0xaa, t4
|
|
||||||
cmovne t2, 4, t2
|
|
||||||
cmovne t3, 2, t3
|
|
||||||
cmovne t4, 1, t4
|
|
||||||
addq t2, t3, t2
|
|
||||||
addq v0, t4, v0
|
|
||||||
addq v0, t2, v0
|
|
||||||
nop # dual issue next two on ev4 and ev5
|
|
||||||
subq v0, a0, v0
|
|
||||||
$exception:
|
|
||||||
ret
|
|
||||||
|
|
||||||
.align 3 # currently redundant
|
|
||||||
$limit:
|
|
||||||
subq a1, t2, v0
|
|
||||||
ret
|
|
||||||
|
|
||||||
.end __strlen_user
|
|
@ -1,339 +0,0 @@
|
|||||||
/*
|
|
||||||
* arch/alpha/lib/strncpy_from_user.S
|
|
||||||
* Contributed by Richard Henderson (rth@tamu.edu)
|
|
||||||
*
|
|
||||||
* Just like strncpy except in the return value:
|
|
||||||
*
|
|
||||||
* -EFAULT if an exception occurs before the terminator is copied.
|
|
||||||
* N if the buffer filled.
|
|
||||||
*
|
|
||||||
* Otherwise the length of the string is returned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <asm/errno.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Allow an exception for an insn; exit if we get one. */
|
|
||||||
#define EX(x,y...) \
|
|
||||||
99: x,##y; \
|
|
||||||
.section __ex_table,"a"; \
|
|
||||||
.long 99b - .; \
|
|
||||||
lda $31, $exception-99b($0); \
|
|
||||||
.previous
|
|
||||||
|
|
||||||
|
|
||||||
.set noat
|
|
||||||
.set noreorder
|
|
||||||
.text
|
|
||||||
|
|
||||||
.globl __strncpy_from_user
|
|
||||||
.ent __strncpy_from_user
|
|
||||||
.frame $30, 0, $26
|
|
||||||
.prologue 0
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
$aligned:
|
|
||||||
/* On entry to this basic block:
|
|
||||||
t0 == the first destination word for masking back in
|
|
||||||
t1 == the first source word. */
|
|
||||||
|
|
||||||
/* Create the 1st output word and detect 0's in the 1st input word. */
|
|
||||||
lda t2, -1 # e1 : build a mask against false zero
|
|
||||||
mskqh t2, a1, t2 # e0 : detection in the src word
|
|
||||||
mskqh t1, a1, t3 # e0 :
|
|
||||||
ornot t1, t2, t2 # .. e1 :
|
|
||||||
mskql t0, a1, t0 # e0 : assemble the first output word
|
|
||||||
cmpbge zero, t2, t8 # .. e1 : bits set iff null found
|
|
||||||
or t0, t3, t0 # e0 :
|
|
||||||
beq a2, $a_eoc # .. e1 :
|
|
||||||
bne t8, $a_eos # .. e1 :
|
|
||||||
|
|
||||||
/* On entry to this basic block:
|
|
||||||
t0 == a source word not containing a null. */
|
|
||||||
|
|
||||||
$a_loop:
|
|
||||||
stq_u t0, 0(a0) # e0 :
|
|
||||||
addq a0, 8, a0 # .. e1 :
|
|
||||||
EX( ldq_u t0, 0(a1) ) # e0 :
|
|
||||||
addq a1, 8, a1 # .. e1 :
|
|
||||||
subq a2, 1, a2 # e0 :
|
|
||||||
cmpbge zero, t0, t8 # .. e1 (stall)
|
|
||||||
beq a2, $a_eoc # e1 :
|
|
||||||
beq t8, $a_loop # e1 :
|
|
||||||
|
|
||||||
/* Take care of the final (partial) word store. At this point
|
|
||||||
the end-of-count bit is set in t8 iff it applies.
|
|
||||||
|
|
||||||
On entry to this basic block we have:
|
|
||||||
t0 == the source word containing the null
|
|
||||||
t8 == the cmpbge mask that found it. */
|
|
||||||
|
|
||||||
$a_eos:
|
|
||||||
negq t8, t12 # e0 : find low bit set
|
|
||||||
and t8, t12, t12 # e1 (stall)
|
|
||||||
|
|
||||||
/* For the sake of the cache, don't read a destination word
|
|
||||||
if we're not going to need it. */
|
|
||||||
and t12, 0x80, t6 # e0 :
|
|
||||||
bne t6, 1f # .. e1 (zdb)
|
|
||||||
|
|
||||||
/* We're doing a partial word store and so need to combine
|
|
||||||
our source and original destination words. */
|
|
||||||
ldq_u t1, 0(a0) # e0 :
|
|
||||||
subq t12, 1, t6 # .. e1 :
|
|
||||||
or t12, t6, t8 # e0 :
|
|
||||||
unop #
|
|
||||||
zapnot t0, t8, t0 # e0 : clear src bytes > null
|
|
||||||
zap t1, t8, t1 # .. e1 : clear dst bytes <= null
|
|
||||||
or t0, t1, t0 # e1 :
|
|
||||||
|
|
||||||
1: stq_u t0, 0(a0)
|
|
||||||
br $finish_up
|
|
||||||
|
|
||||||
/* Add the end-of-count bit to the eos detection bitmask. */
|
|
||||||
$a_eoc:
|
|
||||||
or t10, t8, t8
|
|
||||||
br $a_eos
|
|
||||||
|
|
||||||
/*** The Function Entry Point ***/
|
|
||||||
.align 3
|
|
||||||
__strncpy_from_user:
|
|
||||||
mov a0, v0 # save the string start
|
|
||||||
beq a2, $zerolength
|
|
||||||
|
|
||||||
/* Are source and destination co-aligned? */
|
|
||||||
xor a0, a1, t1 # e0 :
|
|
||||||
and a0, 7, t0 # .. e1 : find dest misalignment
|
|
||||||
and t1, 7, t1 # e0 :
|
|
||||||
addq a2, t0, a2 # .. e1 : bias count by dest misalignment
|
|
||||||
subq a2, 1, a2 # e0 :
|
|
||||||
and a2, 7, t2 # e1 :
|
|
||||||
srl a2, 3, a2 # e0 : a2 = loop counter = (count - 1)/8
|
|
||||||
addq zero, 1, t10 # .. e1 :
|
|
||||||
sll t10, t2, t10 # e0 : t10 = bitmask of last count byte
|
|
||||||
bne t1, $unaligned # .. e1 :
|
|
||||||
|
|
||||||
/* We are co-aligned; take care of a partial first word. */
|
|
||||||
|
|
||||||
EX( ldq_u t1, 0(a1) ) # e0 : load first src word
|
|
||||||
addq a1, 8, a1 # .. e1 :
|
|
||||||
|
|
||||||
beq t0, $aligned # avoid loading dest word if not needed
|
|
||||||
ldq_u t0, 0(a0) # e0 :
|
|
||||||
br $aligned # .. e1 :
|
|
||||||
|
|
||||||
|
|
||||||
/* The source and destination are not co-aligned. Align the destination
|
|
||||||
and cope. We have to be very careful about not reading too much and
|
|
||||||
causing a SEGV. */
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
$u_head:
|
|
||||||
/* We know just enough now to be able to assemble the first
|
|
||||||
full source word. We can still find a zero at the end of it
|
|
||||||
that prevents us from outputting the whole thing.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t0 == the first dest word, unmasked
|
|
||||||
t1 == the shifted low bits of the first source word
|
|
||||||
t6 == bytemask that is -1 in dest word bytes */
|
|
||||||
|
|
||||||
EX( ldq_u t2, 8(a1) ) # e0 : load second src word
|
|
||||||
addq a1, 8, a1 # .. e1 :
|
|
||||||
mskql t0, a0, t0 # e0 : mask trailing garbage in dst
|
|
||||||
extqh t2, a1, t4 # e0 :
|
|
||||||
or t1, t4, t1 # e1 : first aligned src word complete
|
|
||||||
mskqh t1, a0, t1 # e0 : mask leading garbage in src
|
|
||||||
or t0, t1, t0 # e0 : first output word complete
|
|
||||||
or t0, t6, t6 # e1 : mask original data for zero test
|
|
||||||
cmpbge zero, t6, t8 # e0 :
|
|
||||||
beq a2, $u_eocfin # .. e1 :
|
|
||||||
bne t8, $u_final # e1 :
|
|
||||||
|
|
||||||
lda t6, -1 # e1 : mask out the bits we have
|
|
||||||
mskql t6, a1, t6 # e0 : already seen
|
|
||||||
stq_u t0, 0(a0) # e0 : store first output word
|
|
||||||
or t6, t2, t2 # .. e1 :
|
|
||||||
cmpbge zero, t2, t8 # e0 : find nulls in second partial
|
|
||||||
addq a0, 8, a0 # .. e1 :
|
|
||||||
subq a2, 1, a2 # e0 :
|
|
||||||
bne t8, $u_late_head_exit # .. e1 :
|
|
||||||
|
|
||||||
/* Finally, we've got all the stupid leading edge cases taken care
|
|
||||||
of and we can set up to enter the main loop. */
|
|
||||||
|
|
||||||
extql t2, a1, t1 # e0 : position hi-bits of lo word
|
|
||||||
EX( ldq_u t2, 8(a1) ) # .. e1 : read next high-order source word
|
|
||||||
addq a1, 8, a1 # e0 :
|
|
||||||
cmpbge zero, t2, t8 # e1 (stall)
|
|
||||||
beq a2, $u_eoc # e1 :
|
|
||||||
bne t8, $u_eos # e1 :
|
|
||||||
|
|
||||||
/* Unaligned copy main loop. In order to avoid reading too much,
|
|
||||||
the loop is structured to detect zeros in aligned source words.
|
|
||||||
This has, unfortunately, effectively pulled half of a loop
|
|
||||||
iteration out into the head and half into the tail, but it does
|
|
||||||
prevent nastiness from accumulating in the very thing we want
|
|
||||||
to run as fast as possible.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t1 == the shifted high-order bits from the previous source word
|
|
||||||
t2 == the unshifted current source word
|
|
||||||
|
|
||||||
We further know that t2 does not contain a null terminator. */
|
|
||||||
|
|
||||||
.align 3
|
|
||||||
$u_loop:
|
|
||||||
extqh t2, a1, t0 # e0 : extract high bits for current word
|
|
||||||
addq a1, 8, a1 # .. e1 :
|
|
||||||
extql t2, a1, t3 # e0 : extract low bits for next time
|
|
||||||
addq a0, 8, a0 # .. e1 :
|
|
||||||
or t0, t1, t0 # e0 : current dst word now complete
|
|
||||||
EX( ldq_u t2, 0(a1) ) # .. e1 : load high word for next time
|
|
||||||
stq_u t0, -8(a0) # e0 : save the current word
|
|
||||||
mov t3, t1 # .. e1 :
|
|
||||||
subq a2, 1, a2 # e0 :
|
|
||||||
cmpbge zero, t2, t8 # .. e1 : test new word for eos
|
|
||||||
beq a2, $u_eoc # e1 :
|
|
||||||
beq t8, $u_loop # e1 :
|
|
||||||
|
|
||||||
/* We've found a zero somewhere in the source word we just read.
|
|
||||||
If it resides in the lower half, we have one (probably partial)
|
|
||||||
word to write out, and if it resides in the upper half, we
|
|
||||||
have one full and one partial word left to write out.
|
|
||||||
|
|
||||||
On entry to this basic block:
|
|
||||||
t1 == the shifted high-order bits from the previous source word
|
|
||||||
t2 == the unshifted current source word. */
|
|
||||||
$u_eos:
|
|
||||||
extqh t2, a1, t0 # e0 :
|
|
||||||
or t0, t1, t0 # e1 : first (partial) source word complete
|
|
||||||
|
|
||||||
cmpbge zero, t0, t8 # e0 : is the null in this first bit?
|
|
||||||
bne t8, $u_final # .. e1 (zdb)
|
|
||||||
|
|
||||||
stq_u t0, 0(a0) # e0 : the null was in the high-order bits
|
|
||||||
addq a0, 8, a0 # .. e1 :
|
|
||||||
subq a2, 1, a2 # e1 :
|
|
||||||
|
|
||||||
$u_late_head_exit:
|
|
||||||
extql t2, a1, t0 # .. e0 :
|
|
||||||
cmpbge zero, t0, t8 # e0 :
|
|
||||||
or t8, t10, t6 # e1 :
|
|
||||||
cmoveq a2, t6, t8 # e0 :
|
|
||||||
nop # .. e1 :
|
|
||||||
|
|
||||||
/* Take care of a final (probably partial) result word.
|
|
||||||
On entry to this basic block:
|
|
||||||
t0 == assembled source word
|
|
||||||
t8 == cmpbge mask that found the null. */
|
|
||||||
$u_final:
|
|
||||||
negq t8, t6 # e0 : isolate low bit set
|
|
||||||
and t6, t8, t12 # e1 :
|
|
||||||
|
|
||||||
and t12, 0x80, t6 # e0 : avoid dest word load if we can
|
|
||||||
bne t6, 1f # .. e1 (zdb)
|
|
||||||
|
|
||||||
ldq_u t1, 0(a0) # e0 :
|
|
||||||
subq t12, 1, t6 # .. e1 :
|
|
||||||
or t6, t12, t8 # e0 :
|
|
||||||
zapnot t0, t8, t0 # .. e1 : kill source bytes > null
|
|
||||||
zap t1, t8, t1 # e0 : kill dest bytes <= null
|
|
||||||
or t0, t1, t0 # e1 :
|
|
||||||
|
|
||||||
1: stq_u t0, 0(a0) # e0 :
|
|
||||||
br $finish_up
|
|
||||||
|
|
||||||
$u_eoc: # end-of-count
|
|
||||||
extqh t2, a1, t0
|
|
||||||
or t0, t1, t0
|
|
||||||
cmpbge zero, t0, t8
|
|
||||||
|
|
||||||
$u_eocfin: # end-of-count, final word
|
|
||||||
or t10, t8, t8
|
|
||||||
br $u_final
|
|
||||||
|
|
||||||
/* Unaligned copy entry point. */
|
|
||||||
.align 3
|
|
||||||
$unaligned:
|
|
||||||
|
|
||||||
EX( ldq_u t1, 0(a1) ) # e0 : load first source word
|
|
||||||
|
|
||||||
and a0, 7, t4 # .. e1 : find dest misalignment
|
|
||||||
and a1, 7, t5 # e0 : find src misalignment
|
|
||||||
|
|
||||||
/* Conditionally load the first destination word and a bytemask
|
|
||||||
with 0xff indicating that the destination byte is sacrosanct. */
|
|
||||||
|
|
||||||
mov zero, t0 # .. e1 :
|
|
||||||
mov zero, t6 # e0 :
|
|
||||||
beq t4, 1f # .. e1 :
|
|
||||||
ldq_u t0, 0(a0) # e0 :
|
|
||||||
lda t6, -1 # .. e1 :
|
|
||||||
mskql t6, a0, t6 # e0 :
|
|
||||||
1:
|
|
||||||
subq a1, t4, a1 # .. e1 : sub dest misalignment from src addr
|
|
||||||
|
|
||||||
/* If source misalignment is larger than dest misalignment, we need
|
|
||||||
extra startup checks to avoid SEGV. */
|
|
||||||
|
|
||||||
cmplt t4, t5, t12 # e1 :
|
|
||||||
extql t1, a1, t1 # .. e0 : shift src into place
|
|
||||||
lda t2, -1 # e0 : for creating masks later
|
|
||||||
beq t12, $u_head # e1 :
|
|
||||||
|
|
||||||
mskqh t2, t5, t2 # e0 : begin src byte validity mask
|
|
||||||
cmpbge zero, t1, t8 # .. e1 : is there a zero?
|
|
||||||
extql t2, a1, t2 # e0 :
|
|
||||||
or t8, t10, t5 # .. e1 : test for end-of-count too
|
|
||||||
cmpbge zero, t2, t3 # e0 :
|
|
||||||
cmoveq a2, t5, t8 # .. e1 :
|
|
||||||
andnot t8, t3, t8 # e0 :
|
|
||||||
beq t8, $u_head # .. e1 (zdb)
|
|
||||||
|
|
||||||
/* At this point we've found a zero in the first partial word of
|
|
||||||
the source. We need to isolate the valid source data and mask
|
|
||||||
it into the original destination data. (Incidentally, we know
|
|
||||||
that we'll need at least one byte of that original dest word.) */
|
|
||||||
|
|
||||||
ldq_u t0, 0(a0) # e0 :
|
|
||||||
negq t8, t6 # .. e1 : build bitmask of bytes <= zero
|
|
||||||
mskqh t1, t4, t1 # e0 :
|
|
||||||
and t6, t8, t12 # .. e1 :
|
|
||||||
subq t12, 1, t6 # e0 :
|
|
||||||
or t6, t12, t8 # e1 :
|
|
||||||
|
|
||||||
zapnot t2, t8, t2 # e0 : prepare source word; mirror changes
|
|
||||||
zapnot t1, t8, t1 # .. e1 : to source validity mask
|
|
||||||
|
|
||||||
andnot t0, t2, t0 # e0 : zero place for source to reside
|
|
||||||
or t0, t1, t0 # e1 : and put it there
|
|
||||||
stq_u t0, 0(a0) # e0 :
|
|
||||||
|
|
||||||
$finish_up:
|
|
||||||
zapnot t0, t12, t4 # was last byte written null?
|
|
||||||
cmovne t4, 1, t4
|
|
||||||
|
|
||||||
and t12, 0xf0, t3 # binary search for the address of the
|
|
||||||
and t12, 0xcc, t2 # last byte written
|
|
||||||
and t12, 0xaa, t1
|
|
||||||
bic a0, 7, t0
|
|
||||||
cmovne t3, 4, t3
|
|
||||||
cmovne t2, 2, t2
|
|
||||||
cmovne t1, 1, t1
|
|
||||||
addq t0, t3, t0
|
|
||||||
addq t1, t2, t1
|
|
||||||
addq t0, t1, t0
|
|
||||||
addq t0, t4, t0 # add one if we filled the buffer
|
|
||||||
|
|
||||||
subq t0, v0, v0 # find string length
|
|
||||||
ret
|
|
||||||
|
|
||||||
$zerolength:
|
|
||||||
clr v0
|
|
||||||
$exception:
|
|
||||||
ret
|
|
||||||
|
|
||||||
.end __strncpy_from_user
|
|
@ -89,6 +89,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||||||
const struct exception_table_entry *fixup;
|
const struct exception_table_entry *fixup;
|
||||||
int fault, si_code = SEGV_MAPERR;
|
int fault, si_code = SEGV_MAPERR;
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
|
unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
|
||||||
|
(cause > 0 ? FAULT_FLAG_WRITE : 0));
|
||||||
|
|
||||||
/* As of EV6, a load into $31/$f31 is a prefetch, and never faults
|
/* As of EV6, a load into $31/$f31 is a prefetch, and never faults
|
||||||
(or is suppressed by the PALcode). Support that for older CPUs
|
(or is suppressed by the PALcode). Support that for older CPUs
|
||||||
@ -114,6 +116,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||||||
goto vmalloc_fault;
|
goto vmalloc_fault;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
retry:
|
||||||
down_read(&mm->mmap_sem);
|
down_read(&mm->mmap_sem);
|
||||||
vma = find_vma(mm, address);
|
vma = find_vma(mm, address);
|
||||||
if (!vma)
|
if (!vma)
|
||||||
@ -144,8 +147,11 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||||||
/* If for any reason at all we couldn't handle the fault,
|
/* If for any reason at all we couldn't handle the fault,
|
||||||
make sure we exit gracefully rather than endlessly redo
|
make sure we exit gracefully rather than endlessly redo
|
||||||
the fault. */
|
the fault. */
|
||||||
fault = handle_mm_fault(mm, vma, address, cause > 0 ? FAULT_FLAG_WRITE : 0);
|
fault = handle_mm_fault(mm, vma, address, flags);
|
||||||
up_read(&mm->mmap_sem);
|
|
||||||
|
if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
|
||||||
|
return;
|
||||||
|
|
||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
@ -153,10 +159,26 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
if (fault & VM_FAULT_MAJOR)
|
|
||||||
current->maj_flt++;
|
if (flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||||
else
|
if (fault & VM_FAULT_MAJOR)
|
||||||
current->min_flt++;
|
current->maj_flt++;
|
||||||
|
else
|
||||||
|
current->min_flt++;
|
||||||
|
if (fault & VM_FAULT_RETRY) {
|
||||||
|
flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||||
|
|
||||||
|
/* No need to up_read(&mm->mmap_sem) as we would
|
||||||
|
* have already released it in __lock_page_or_retry
|
||||||
|
* in mm/filemap.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
up_read(&mm->mmap_sem);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Something tried to access memory that isn't in our memory map.
|
/* Something tried to access memory that isn't in our memory map.
|
||||||
@ -186,12 +208,14 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||||||
/* We ran out of memory, or some other thing happened to us that
|
/* We ran out of memory, or some other thing happened to us that
|
||||||
made us unable to handle the page fault gracefully. */
|
made us unable to handle the page fault gracefully. */
|
||||||
out_of_memory:
|
out_of_memory:
|
||||||
|
up_read(&mm->mmap_sem);
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
goto no_context;
|
goto no_context;
|
||||||
pagefault_out_of_memory();
|
pagefault_out_of_memory();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
do_sigbus:
|
do_sigbus:
|
||||||
|
up_read(&mm->mmap_sem);
|
||||||
/* Send a sigbus, regardless of whether we were in kernel
|
/* Send a sigbus, regardless of whether we were in kernel
|
||||||
or user mode. */
|
or user mode. */
|
||||||
info.si_signo = SIGBUS;
|
info.si_signo = SIGBUS;
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
#include <asm/special_insns.h>
|
||||||
|
|
||||||
#include "op_impl.h"
|
#include "op_impl.h"
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@ config ARM
|
|||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select GENERIC_IRQ_PROBE
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select GENERIC_IRQ_PROBE
|
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||||
@ -126,11 +125,6 @@ config TRACE_IRQFLAGS_SUPPORT
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config GENERIC_LOCKBREAK
|
|
||||||
bool
|
|
||||||
default y
|
|
||||||
depends on SMP && PREEMPT
|
|
||||||
|
|
||||||
config RWSEM_GENERIC_SPINLOCK
|
config RWSEM_GENERIC_SPINLOCK
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
@ -1151,6 +1145,7 @@ config PLAT_ORION
|
|||||||
bool
|
bool
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select GENERIC_IRQ_CHIP
|
select GENERIC_IRQ_CHIP
|
||||||
|
select IRQ_DOMAIN
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
|
|
||||||
config PLAT_PXA
|
config PLAT_PXA
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
* License version 2. This program is licensed "as is" without any
|
* License version 2. This program is licensed "as is" without any
|
||||||
* warranty of any kind, whether express or implied.
|
* warranty of any kind, whether express or implied.
|
||||||
*
|
*
|
||||||
* Contains definitions specific to the Armada 370 SoC that are not
|
* Contains definitions specific to the Armada XP SoC that are not
|
||||||
* common to all Armada SoCs.
|
* common to all Armada SoCs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
|
|
||||||
dma-apbh@80004000 {
|
dma-apbh@80004000 {
|
||||||
compatible = "fsl,imx23-dma-apbh";
|
compatible = "fsl,imx23-dma-apbh";
|
||||||
reg = <0x80004000 2000>;
|
reg = <0x80004000 0x2000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ecc@80008000 {
|
ecc@80008000 {
|
||||||
reg = <0x80008000 2000>;
|
reg = <0x80008000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -63,7 +63,7 @@
|
|||||||
compatible = "fsl,imx23-gpmi-nand";
|
compatible = "fsl,imx23-gpmi-nand";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
reg = <0x8000c000 2000>, <0x8000a000 2000>;
|
reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>;
|
||||||
reg-names = "gpmi-nand", "bch";
|
reg-names = "gpmi-nand", "bch";
|
||||||
interrupts = <13>, <56>;
|
interrupts = <13>, <56>;
|
||||||
interrupt-names = "gpmi-dma", "bch";
|
interrupt-names = "gpmi-dma", "bch";
|
||||||
@ -72,14 +72,14 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
ssp0: ssp@80010000 {
|
ssp0: ssp@80010000 {
|
||||||
reg = <0x80010000 2000>;
|
reg = <0x80010000 0x2000>;
|
||||||
interrupts = <15 14>;
|
interrupts = <15 14>;
|
||||||
fsl,ssp-dma-channel = <1>;
|
fsl,ssp-dma-channel = <1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
etm@80014000 {
|
etm@80014000 {
|
||||||
reg = <0x80014000 2000>;
|
reg = <0x80014000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -87,7 +87,7 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx23-pinctrl", "simple-bus";
|
compatible = "fsl,imx23-pinctrl", "simple-bus";
|
||||||
reg = <0x80018000 2000>;
|
reg = <0x80018000 0x2000>;
|
||||||
|
|
||||||
gpio0: gpio@0 {
|
gpio0: gpio@0 {
|
||||||
compatible = "fsl,imx23-gpio", "fsl,mxs-gpio";
|
compatible = "fsl,imx23-gpio", "fsl,mxs-gpio";
|
||||||
@ -273,32 +273,32 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
emi@80020000 {
|
emi@80020000 {
|
||||||
reg = <0x80020000 2000>;
|
reg = <0x80020000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
dma-apbx@80024000 {
|
dma-apbx@80024000 {
|
||||||
compatible = "fsl,imx23-dma-apbx";
|
compatible = "fsl,imx23-dma-apbx";
|
||||||
reg = <0x80024000 2000>;
|
reg = <0x80024000 0x2000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
dcp@80028000 {
|
dcp@80028000 {
|
||||||
reg = <0x80028000 2000>;
|
reg = <0x80028000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
pxp@8002a000 {
|
pxp@8002a000 {
|
||||||
reg = <0x8002a000 2000>;
|
reg = <0x8002a000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
ocotp@8002c000 {
|
ocotp@8002c000 {
|
||||||
reg = <0x8002c000 2000>;
|
reg = <0x8002c000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
axi-ahb@8002e000 {
|
axi-ahb@8002e000 {
|
||||||
reg = <0x8002e000 2000>;
|
reg = <0x8002e000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -310,14 +310,14 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
ssp1: ssp@80034000 {
|
ssp1: ssp@80034000 {
|
||||||
reg = <0x80034000 2000>;
|
reg = <0x80034000 0x2000>;
|
||||||
interrupts = <2 20>;
|
interrupts = <2 20>;
|
||||||
fsl,ssp-dma-channel = <2>;
|
fsl,ssp-dma-channel = <2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
tvenc@80038000 {
|
tvenc@80038000 {
|
||||||
reg = <0x80038000 2000>;
|
reg = <0x80038000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -330,37 +330,37 @@
|
|||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
clkctl@80040000 {
|
clkctl@80040000 {
|
||||||
reg = <0x80040000 2000>;
|
reg = <0x80040000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
saif0: saif@80042000 {
|
saif0: saif@80042000 {
|
||||||
reg = <0x80042000 2000>;
|
reg = <0x80042000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
power@80044000 {
|
power@80044000 {
|
||||||
reg = <0x80044000 2000>;
|
reg = <0x80044000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
saif1: saif@80046000 {
|
saif1: saif@80046000 {
|
||||||
reg = <0x80046000 2000>;
|
reg = <0x80046000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
audio-out@80048000 {
|
audio-out@80048000 {
|
||||||
reg = <0x80048000 2000>;
|
reg = <0x80048000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
audio-in@8004c000 {
|
audio-in@8004c000 {
|
||||||
reg = <0x8004c000 2000>;
|
reg = <0x8004c000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
lradc@80050000 {
|
lradc@80050000 {
|
||||||
reg = <0x80050000 2000>;
|
reg = <0x80050000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -370,26 +370,26 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
i2c@80058000 {
|
i2c@80058000 {
|
||||||
reg = <0x80058000 2000>;
|
reg = <0x80058000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
rtc@8005c000 {
|
rtc@8005c000 {
|
||||||
compatible = "fsl,imx23-rtc", "fsl,stmp3xxx-rtc";
|
compatible = "fsl,imx23-rtc", "fsl,stmp3xxx-rtc";
|
||||||
reg = <0x8005c000 2000>;
|
reg = <0x8005c000 0x2000>;
|
||||||
interrupts = <22>;
|
interrupts = <22>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pwm: pwm@80064000 {
|
pwm: pwm@80064000 {
|
||||||
compatible = "fsl,imx23-pwm";
|
compatible = "fsl,imx23-pwm";
|
||||||
reg = <0x80064000 2000>;
|
reg = <0x80064000 0x2000>;
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
fsl,pwm-number = <5>;
|
fsl,pwm-number = <5>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
timrot@80068000 {
|
timrot@80068000 {
|
||||||
reg = <0x80068000 2000>;
|
reg = <0x80068000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -429,7 +429,7 @@
|
|||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
usbctrl@80080000 {
|
usbctrl@80080000 {
|
||||||
reg = <0x80080000 0x10000>;
|
reg = <0x80080000 0x40000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@1000a000 {
|
uart1: serial@1000a000 {
|
||||||
fsl,uart-has-rtscts;
|
fsl,uart-has-rtscts;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -19,6 +19,12 @@
|
|||||||
serial3 = &uart4;
|
serial3 = &uart4;
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
||||||
serial5 = &uart6;
|
serial5 = &uart6;
|
||||||
|
gpio0 = &gpio1;
|
||||||
|
gpio1 = &gpio2;
|
||||||
|
gpio2 = &gpio3;
|
||||||
|
gpio3 = &gpio4;
|
||||||
|
gpio4 = &gpio5;
|
||||||
|
gpio5 = &gpio6;
|
||||||
};
|
};
|
||||||
|
|
||||||
avic: avic-interrupt-controller@e0000000 {
|
avic: avic-interrupt-controller@e0000000 {
|
||||||
|
@ -57,18 +57,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
hsadc@80002000 {
|
hsadc@80002000 {
|
||||||
reg = <0x80002000 2000>;
|
reg = <0x80002000 0x2000>;
|
||||||
interrupts = <13 87>;
|
interrupts = <13 87>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
dma-apbh@80004000 {
|
dma-apbh@80004000 {
|
||||||
compatible = "fsl,imx28-dma-apbh";
|
compatible = "fsl,imx28-dma-apbh";
|
||||||
reg = <0x80004000 2000>;
|
reg = <0x80004000 0x2000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
perfmon@80006000 {
|
perfmon@80006000 {
|
||||||
reg = <0x80006000 800>;
|
reg = <0x80006000 0x800>;
|
||||||
interrupts = <27>;
|
interrupts = <27>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
@ -77,7 +77,7 @@
|
|||||||
compatible = "fsl,imx28-gpmi-nand";
|
compatible = "fsl,imx28-gpmi-nand";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
reg = <0x8000c000 2000>, <0x8000a000 2000>;
|
reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>;
|
||||||
reg-names = "gpmi-nand", "bch";
|
reg-names = "gpmi-nand", "bch";
|
||||||
interrupts = <88>, <41>;
|
interrupts = <88>, <41>;
|
||||||
interrupt-names = "gpmi-dma", "bch";
|
interrupt-names = "gpmi-dma", "bch";
|
||||||
@ -86,28 +86,28 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
ssp0: ssp@80010000 {
|
ssp0: ssp@80010000 {
|
||||||
reg = <0x80010000 2000>;
|
reg = <0x80010000 0x2000>;
|
||||||
interrupts = <96 82>;
|
interrupts = <96 82>;
|
||||||
fsl,ssp-dma-channel = <0>;
|
fsl,ssp-dma-channel = <0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
ssp1: ssp@80012000 {
|
ssp1: ssp@80012000 {
|
||||||
reg = <0x80012000 2000>;
|
reg = <0x80012000 0x2000>;
|
||||||
interrupts = <97 83>;
|
interrupts = <97 83>;
|
||||||
fsl,ssp-dma-channel = <1>;
|
fsl,ssp-dma-channel = <1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
ssp2: ssp@80014000 {
|
ssp2: ssp@80014000 {
|
||||||
reg = <0x80014000 2000>;
|
reg = <0x80014000 0x2000>;
|
||||||
interrupts = <98 84>;
|
interrupts = <98 84>;
|
||||||
fsl,ssp-dma-channel = <2>;
|
fsl,ssp-dma-channel = <2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
ssp3: ssp@80016000 {
|
ssp3: ssp@80016000 {
|
||||||
reg = <0x80016000 2000>;
|
reg = <0x80016000 0x2000>;
|
||||||
interrupts = <99 85>;
|
interrupts = <99 85>;
|
||||||
fsl,ssp-dma-channel = <3>;
|
fsl,ssp-dma-channel = <3>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -117,7 +117,7 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx28-pinctrl", "simple-bus";
|
compatible = "fsl,imx28-pinctrl", "simple-bus";
|
||||||
reg = <0x80018000 2000>;
|
reg = <0x80018000 0x2000>;
|
||||||
|
|
||||||
gpio0: gpio@0 {
|
gpio0: gpio@0 {
|
||||||
compatible = "fsl,imx28-gpio", "fsl,mxs-gpio";
|
compatible = "fsl,imx28-gpio", "fsl,mxs-gpio";
|
||||||
@ -510,96 +510,96 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
digctl@8001c000 {
|
digctl@8001c000 {
|
||||||
reg = <0x8001c000 2000>;
|
reg = <0x8001c000 0x2000>;
|
||||||
interrupts = <89>;
|
interrupts = <89>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
etm@80022000 {
|
etm@80022000 {
|
||||||
reg = <0x80022000 2000>;
|
reg = <0x80022000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
dma-apbx@80024000 {
|
dma-apbx@80024000 {
|
||||||
compatible = "fsl,imx28-dma-apbx";
|
compatible = "fsl,imx28-dma-apbx";
|
||||||
reg = <0x80024000 2000>;
|
reg = <0x80024000 0x2000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
dcp@80028000 {
|
dcp@80028000 {
|
||||||
reg = <0x80028000 2000>;
|
reg = <0x80028000 0x2000>;
|
||||||
interrupts = <52 53 54>;
|
interrupts = <52 53 54>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
pxp@8002a000 {
|
pxp@8002a000 {
|
||||||
reg = <0x8002a000 2000>;
|
reg = <0x8002a000 0x2000>;
|
||||||
interrupts = <39>;
|
interrupts = <39>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
ocotp@8002c000 {
|
ocotp@8002c000 {
|
||||||
reg = <0x8002c000 2000>;
|
reg = <0x8002c000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
axi-ahb@8002e000 {
|
axi-ahb@8002e000 {
|
||||||
reg = <0x8002e000 2000>;
|
reg = <0x8002e000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
lcdif@80030000 {
|
lcdif@80030000 {
|
||||||
compatible = "fsl,imx28-lcdif";
|
compatible = "fsl,imx28-lcdif";
|
||||||
reg = <0x80030000 2000>;
|
reg = <0x80030000 0x2000>;
|
||||||
interrupts = <38 86>;
|
interrupts = <38 86>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
can0: can@80032000 {
|
can0: can@80032000 {
|
||||||
compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
|
compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
|
||||||
reg = <0x80032000 2000>;
|
reg = <0x80032000 0x2000>;
|
||||||
interrupts = <8>;
|
interrupts = <8>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
can1: can@80034000 {
|
can1: can@80034000 {
|
||||||
compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
|
compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
|
||||||
reg = <0x80034000 2000>;
|
reg = <0x80034000 0x2000>;
|
||||||
interrupts = <9>;
|
interrupts = <9>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
simdbg@8003c000 {
|
simdbg@8003c000 {
|
||||||
reg = <0x8003c000 200>;
|
reg = <0x8003c000 0x200>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
simgpmisel@8003c200 {
|
simgpmisel@8003c200 {
|
||||||
reg = <0x8003c200 100>;
|
reg = <0x8003c200 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
simsspsel@8003c300 {
|
simsspsel@8003c300 {
|
||||||
reg = <0x8003c300 100>;
|
reg = <0x8003c300 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
simmemsel@8003c400 {
|
simmemsel@8003c400 {
|
||||||
reg = <0x8003c400 100>;
|
reg = <0x8003c400 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpiomon@8003c500 {
|
gpiomon@8003c500 {
|
||||||
reg = <0x8003c500 100>;
|
reg = <0x8003c500 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
simenet@8003c700 {
|
simenet@8003c700 {
|
||||||
reg = <0x8003c700 100>;
|
reg = <0x8003c700 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
armjtag@8003c800 {
|
armjtag@8003c800 {
|
||||||
reg = <0x8003c800 100>;
|
reg = <0x8003c800 0x100>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -612,45 +612,45 @@
|
|||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
clkctl@80040000 {
|
clkctl@80040000 {
|
||||||
reg = <0x80040000 2000>;
|
reg = <0x80040000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
saif0: saif@80042000 {
|
saif0: saif@80042000 {
|
||||||
compatible = "fsl,imx28-saif";
|
compatible = "fsl,imx28-saif";
|
||||||
reg = <0x80042000 2000>;
|
reg = <0x80042000 0x2000>;
|
||||||
interrupts = <59 80>;
|
interrupts = <59 80>;
|
||||||
fsl,saif-dma-channel = <4>;
|
fsl,saif-dma-channel = <4>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
power@80044000 {
|
power@80044000 {
|
||||||
reg = <0x80044000 2000>;
|
reg = <0x80044000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
saif1: saif@80046000 {
|
saif1: saif@80046000 {
|
||||||
compatible = "fsl,imx28-saif";
|
compatible = "fsl,imx28-saif";
|
||||||
reg = <0x80046000 2000>;
|
reg = <0x80046000 0x2000>;
|
||||||
interrupts = <58 81>;
|
interrupts = <58 81>;
|
||||||
fsl,saif-dma-channel = <5>;
|
fsl,saif-dma-channel = <5>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
lradc@80050000 {
|
lradc@80050000 {
|
||||||
reg = <0x80050000 2000>;
|
reg = <0x80050000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
spdif@80054000 {
|
spdif@80054000 {
|
||||||
reg = <0x80054000 2000>;
|
reg = <0x80054000 0x2000>;
|
||||||
interrupts = <45 66>;
|
interrupts = <45 66>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
rtc@80056000 {
|
rtc@80056000 {
|
||||||
compatible = "fsl,imx28-rtc", "fsl,stmp3xxx-rtc";
|
compatible = "fsl,imx28-rtc", "fsl,stmp3xxx-rtc";
|
||||||
reg = <0x80056000 2000>;
|
reg = <0x80056000 0x2000>;
|
||||||
interrupts = <29>;
|
interrupts = <29>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -658,7 +658,7 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx28-i2c";
|
compatible = "fsl,imx28-i2c";
|
||||||
reg = <0x80058000 2000>;
|
reg = <0x80058000 0x2000>;
|
||||||
interrupts = <111 68>;
|
interrupts = <111 68>;
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -668,7 +668,7 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx28-i2c";
|
compatible = "fsl,imx28-i2c";
|
||||||
reg = <0x8005a000 2000>;
|
reg = <0x8005a000 0x2000>;
|
||||||
interrupts = <110 69>;
|
interrupts = <110 69>;
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -676,14 +676,14 @@
|
|||||||
|
|
||||||
pwm: pwm@80064000 {
|
pwm: pwm@80064000 {
|
||||||
compatible = "fsl,imx28-pwm", "fsl,imx23-pwm";
|
compatible = "fsl,imx28-pwm", "fsl,imx23-pwm";
|
||||||
reg = <0x80064000 2000>;
|
reg = <0x80064000 0x2000>;
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
fsl,pwm-number = <8>;
|
fsl,pwm-number = <8>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
timrot@80068000 {
|
timrot@80068000 {
|
||||||
reg = <0x80068000 2000>;
|
reg = <0x80068000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
spi-max-frequency = <6000000>;
|
spi-max-frequency = <6000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <8>;
|
interrupts = <8 0x4>;
|
||||||
|
|
||||||
regulators {
|
regulators {
|
||||||
sw1_reg: sw1 {
|
sw1_reg: sw1 {
|
||||||
|
@ -17,6 +17,10 @@
|
|||||||
serial0 = &uart1;
|
serial0 = &uart1;
|
||||||
serial1 = &uart2;
|
serial1 = &uart2;
|
||||||
serial2 = &uart3;
|
serial2 = &uart3;
|
||||||
|
gpio0 = &gpio1;
|
||||||
|
gpio1 = &gpio2;
|
||||||
|
gpio2 = &gpio3;
|
||||||
|
gpio3 = &gpio4;
|
||||||
};
|
};
|
||||||
|
|
||||||
tzic: tz-interrupt-controller@e0000000 {
|
tzic: tz-interrupt-controller@e0000000 {
|
||||||
|
@ -64,12 +64,32 @@
|
|||||||
reg = <0xf4000000 0x2000000>;
|
reg = <0xf4000000 0x2000000>;
|
||||||
phy-mode = "mii";
|
phy-mode = "mii";
|
||||||
interrupt-parent = <&gpio2>;
|
interrupt-parent = <&gpio2>;
|
||||||
interrupts = <31>;
|
interrupts = <31 0x8>;
|
||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
|
/*
|
||||||
|
* VDD33A and VDDVARIO of LAN9220 are supplied by
|
||||||
|
* SW4_3V3 of LTC3589. Before the regulator driver
|
||||||
|
* for this PMIC is available, we use a fixed dummy
|
||||||
|
* 3V3 regulator to get LAN9220 driver probing work.
|
||||||
|
*/
|
||||||
|
vdd33a-supply = <®_3p3v>;
|
||||||
|
vddvario-supply = <®_3p3v>;
|
||||||
smsc,irq-push-pull;
|
smsc,irq-push-pull;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
|
||||||
|
reg_3p3v: 3p3v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "3P3V";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
gpio-keys {
|
gpio-keys {
|
||||||
compatible = "gpio-keys";
|
compatible = "gpio-keys";
|
||||||
|
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
serial2 = &uart3;
|
serial2 = &uart3;
|
||||||
serial3 = &uart4;
|
serial3 = &uart4;
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
||||||
|
gpio0 = &gpio1;
|
||||||
|
gpio1 = &gpio2;
|
||||||
|
gpio2 = &gpio3;
|
||||||
|
gpio3 = &gpio4;
|
||||||
|
gpio4 = &gpio5;
|
||||||
|
gpio5 = &gpio6;
|
||||||
|
gpio6 = &gpio7;
|
||||||
};
|
};
|
||||||
|
|
||||||
tzic: tz-interrupt-controller@0fffc000 {
|
tzic: tz-interrupt-controller@0fffc000 {
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
fsl,pins = <
|
fsl,pins = <
|
||||||
144 0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
|
144 0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
|
||||||
121 0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
|
121 0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
|
||||||
|
953 0x80000000 /* MX6Q_PAD_GPIO_0__CCM_CLKO */
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
serial2 = &uart3;
|
serial2 = &uart3;
|
||||||
serial3 = &uart4;
|
serial3 = &uart4;
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
||||||
|
gpio0 = &gpio1;
|
||||||
|
gpio1 = &gpio2;
|
||||||
|
gpio2 = &gpio3;
|
||||||
|
gpio3 = &gpio4;
|
||||||
|
gpio4 = &gpio5;
|
||||||
|
gpio5 = &gpio6;
|
||||||
|
gpio6 = &gpio7;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
/include/ "kirkwood.dtsi"
|
/include/ "kirkwood-dnskw.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "D-Link DNS-320 NAS (Rev A1)";
|
model = "D-Link DNS-320 NAS (Rev A1)";
|
||||||
@ -15,6 +15,31 @@
|
|||||||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
blue-power {
|
||||||
|
label = "dns320:blue:power";
|
||||||
|
gpios = <&gpio0 26 1>; /* GPIO 26 Active Low */
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
blue-usb {
|
||||||
|
label = "dns320:blue:usb";
|
||||||
|
gpios = <&gpio1 11 1>; /* GPIO 43 Active Low */
|
||||||
|
};
|
||||||
|
orange-l_hdd {
|
||||||
|
label = "dns320:orange:l_hdd";
|
||||||
|
gpios = <&gpio0 28 1>; /* GPIO 28 Active Low */
|
||||||
|
};
|
||||||
|
orange-r_hdd {
|
||||||
|
label = "dns320:orange:r_hdd";
|
||||||
|
gpios = <&gpio0 27 1>; /* GPIO 27 Active Low */
|
||||||
|
};
|
||||||
|
orange-usb {
|
||||||
|
label = "dns320:orange:usb";
|
||||||
|
gpios = <&gpio1 3 1>; /* GPIO 35 Active Low */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
ocp@f1000000 {
|
ocp@f1000000 {
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <166666667>;
|
clock-frequency = <166666667>;
|
||||||
@ -25,40 +50,5 @@
|
|||||||
clock-frequency = <166666667>;
|
clock-frequency = <166666667>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
nand@3000000 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
partition@0 {
|
|
||||||
label = "u-boot";
|
|
||||||
reg = <0x0000000 0x100000>;
|
|
||||||
read-only;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@100000 {
|
|
||||||
label = "uImage";
|
|
||||||
reg = <0x0100000 0x500000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@600000 {
|
|
||||||
label = "ramdisk";
|
|
||||||
reg = <0x0600000 0x500000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@b00000 {
|
|
||||||
label = "image";
|
|
||||||
reg = <0x0b00000 0x6600000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@7100000 {
|
|
||||||
label = "mini firmware";
|
|
||||||
reg = <0x7100000 0xa00000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@7b00000 {
|
|
||||||
label = "config";
|
|
||||||
reg = <0x7b00000 0x500000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
/include/ "kirkwood.dtsi"
|
/include/ "kirkwood-dnskw.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "D-Link DNS-325 NAS (Rev A1)";
|
model = "D-Link DNS-325 NAS (Rev A1)";
|
||||||
@ -15,45 +15,43 @@
|
|||||||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
white-power {
|
||||||
|
label = "dns325:white:power";
|
||||||
|
gpios = <&gpio0 26 1>; /* GPIO 26 Active Low */
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
white-usb {
|
||||||
|
label = "dns325:white:usb";
|
||||||
|
gpios = <&gpio1 11 1>; /* GPIO 43 Active Low */
|
||||||
|
};
|
||||||
|
red-l_hdd {
|
||||||
|
label = "dns325:red:l_hdd";
|
||||||
|
gpios = <&gpio0 28 1>; /* GPIO 28 Active Low */
|
||||||
|
};
|
||||||
|
red-r_hdd {
|
||||||
|
label = "dns325:red:r_hdd";
|
||||||
|
gpios = <&gpio0 27 1>; /* GPIO 27 Active Low */
|
||||||
|
};
|
||||||
|
red-usb {
|
||||||
|
label = "dns325:red:usb";
|
||||||
|
gpios = <&gpio0 29 1>; /* GPIO 29 Active Low */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
ocp@f1000000 {
|
ocp@f1000000 {
|
||||||
|
i2c@11000 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
lm75: lm75@48 {
|
||||||
|
compatible = "national,lm75";
|
||||||
|
reg = <0x48>;
|
||||||
|
};
|
||||||
|
};
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <200000000>;
|
clock-frequency = <200000000>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
nand@3000000 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
partition@0 {
|
|
||||||
label = "u-boot";
|
|
||||||
reg = <0x0000000 0x100000>;
|
|
||||||
read-only;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@100000 {
|
|
||||||
label = "uImage";
|
|
||||||
reg = <0x0100000 0x500000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@600000 {
|
|
||||||
label = "ramdisk";
|
|
||||||
reg = <0x0600000 0x500000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@b00000 {
|
|
||||||
label = "image";
|
|
||||||
reg = <0x0b00000 0x6600000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@7100000 {
|
|
||||||
label = "mini firmware";
|
|
||||||
reg = <0x7100000 0xa00000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
partition@7b00000 {
|
|
||||||
label = "config";
|
|
||||||
reg = <0x7b00000 0x500000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
69
arch/arm/boot/dts/kirkwood-dnskw.dtsi
Normal file
69
arch/arm/boot/dts/kirkwood-dnskw.dtsi
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/include/ "kirkwood.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "D-Link DNS NASes (kirkwood-based)";
|
||||||
|
compatible = "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood";
|
||||||
|
|
||||||
|
gpio_keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
button@1 {
|
||||||
|
label = "Power button";
|
||||||
|
linux,code = <116>;
|
||||||
|
gpios = <&gpio1 2 1>;
|
||||||
|
};
|
||||||
|
button@2 {
|
||||||
|
label = "USB unmount button";
|
||||||
|
linux,code = <161>;
|
||||||
|
gpios = <&gpio1 15 1>;
|
||||||
|
};
|
||||||
|
button@3 {
|
||||||
|
label = "Reset button";
|
||||||
|
linux,code = <0x198>;
|
||||||
|
gpios = <&gpio1 16 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
nand@3000000 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
label = "u-boot";
|
||||||
|
reg = <0x0000000 0x100000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@100000 {
|
||||||
|
label = "uImage";
|
||||||
|
reg = <0x0100000 0x500000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@600000 {
|
||||||
|
label = "ramdisk";
|
||||||
|
reg = <0x0600000 0x500000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@b00000 {
|
||||||
|
label = "image";
|
||||||
|
reg = <0x0b00000 0x6600000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@7100000 {
|
||||||
|
label = "mini firmware";
|
||||||
|
reg = <0x7100000 0xa00000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@7b00000 {
|
||||||
|
label = "config";
|
||||||
|
reg = <0x7b00000 0x500000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -20,5 +20,55 @@
|
|||||||
clock-frequency = <200000000>;
|
clock-frequency = <200000000>;
|
||||||
status = "ok";
|
status = "ok";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
spi@10600 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
m25p40@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "mx25l1606e";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
mode = <0>;
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
reg = <0x0 0x80000>;
|
||||||
|
label = "u-boot";
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@100000 {
|
||||||
|
reg = <0x100000 0x10000>;
|
||||||
|
label = "u-boot env";
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@180000 {
|
||||||
|
reg = <0x180000 0x10000>;
|
||||||
|
label = "dtb";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
bluetooth {
|
||||||
|
label = "dreamplug:blue:bluetooth";
|
||||||
|
gpios = <&gpio1 15 1>;
|
||||||
|
};
|
||||||
|
wifi {
|
||||||
|
label = "dreamplug:green:wifi";
|
||||||
|
gpios = <&gpio1 16 1>;
|
||||||
|
};
|
||||||
|
wifi-ap {
|
||||||
|
label = "dreamplug:green:wifi_ap";
|
||||||
|
gpios = <&gpio1 17 1>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
99
arch/arm/boot/dts/kirkwood-goflexnet.dts
Normal file
99
arch/arm/boot/dts/kirkwood-goflexnet.dts
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "kirkwood.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Seagate GoFlex Net";
|
||||||
|
compatible = "seagate,goflexnet", "marvell,kirkwood-88f6281", "marvell,kirkwood";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x00000000 0x8000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
bootargs = "console=ttyS0,115200n8 earlyprintk root=/dev/sda1 rootdelay=10";
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
serial@12000 {
|
||||||
|
clock-frequency = <200000000>;
|
||||||
|
status = "ok";
|
||||||
|
};
|
||||||
|
|
||||||
|
nand@3000000 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
label = "u-boot";
|
||||||
|
reg = <0x0000000 0x100000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@100000 {
|
||||||
|
label = "uImage";
|
||||||
|
reg = <0x0100000 0x400000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@500000 {
|
||||||
|
label = "pogoplug";
|
||||||
|
reg = <0x0500000 0x2000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@2500000 {
|
||||||
|
label = "root";
|
||||||
|
reg = <0x02500000 0xd800000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
health {
|
||||||
|
label = "status:green:health";
|
||||||
|
gpios = <&gpio1 14 1>;
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
fault {
|
||||||
|
label = "status:orange:fault";
|
||||||
|
gpios = <&gpio1 15 1>;
|
||||||
|
};
|
||||||
|
left0 {
|
||||||
|
label = "status:white:left0";
|
||||||
|
gpios = <&gpio1 10 0>;
|
||||||
|
};
|
||||||
|
left1 {
|
||||||
|
label = "status:white:left1";
|
||||||
|
gpios = <&gpio1 11 0>;
|
||||||
|
};
|
||||||
|
left2 {
|
||||||
|
label = "status:white:left2";
|
||||||
|
gpios = <&gpio1 12 0>;
|
||||||
|
};
|
||||||
|
left3 {
|
||||||
|
label = "status:white:left3";
|
||||||
|
gpios = <&gpio1 13 0>;
|
||||||
|
};
|
||||||
|
right0 {
|
||||||
|
label = "status:white:right0";
|
||||||
|
gpios = <&gpio1 6 0>;
|
||||||
|
};
|
||||||
|
right1 {
|
||||||
|
label = "status:white:right1";
|
||||||
|
gpios = <&gpio1 7 0>;
|
||||||
|
};
|
||||||
|
right2 {
|
||||||
|
label = "status:white:right2";
|
||||||
|
gpios = <&gpio1 8 0>;
|
||||||
|
};
|
||||||
|
right3 {
|
||||||
|
label = "status:white:right3";
|
||||||
|
gpios = <&gpio1 9 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -21,6 +21,11 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
nand@3000000 {
|
nand@3000000 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
@ -41,4 +46,37 @@
|
|||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gpio_keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
button@1 {
|
||||||
|
label = "USB Copy";
|
||||||
|
linux,code = <133>;
|
||||||
|
gpios = <&gpio0 29 1>;
|
||||||
|
};
|
||||||
|
button@2 {
|
||||||
|
label = "Reset";
|
||||||
|
linux,code = <0x198>;
|
||||||
|
gpios = <&gpio0 28 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
green-os {
|
||||||
|
label = "ib62x0:green:os";
|
||||||
|
gpios = <&gpio0 25 0>;
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
red-os {
|
||||||
|
label = "ib62x0:red:os";
|
||||||
|
gpios = <&gpio0 22 0>;
|
||||||
|
};
|
||||||
|
usb-copy {
|
||||||
|
label = "ib62x0:red:usb_copy";
|
||||||
|
gpios = <&gpio0 27 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
@ -18,9 +18,51 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
ocp@f1000000 {
|
ocp@f1000000 {
|
||||||
|
i2c@11000 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
lm63: lm63@4c {
|
||||||
|
compatible = "national,lm63";
|
||||||
|
reg = <0x4c>;
|
||||||
|
};
|
||||||
|
};
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <200000000>;
|
clock-frequency = <200000000>;
|
||||||
status = "ok";
|
status = "ok";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
led-level {
|
||||||
|
label = "led_level";
|
||||||
|
gpios = <&gpio1 9 0>;
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
power-blue {
|
||||||
|
label = "power:blue";
|
||||||
|
gpios = <&gpio1 11 0>;
|
||||||
|
linux,default-trigger = "timer";
|
||||||
|
};
|
||||||
|
usb1 {
|
||||||
|
label = "usb1:blue";
|
||||||
|
gpios = <&gpio1 12 0>;
|
||||||
|
};
|
||||||
|
usb2 {
|
||||||
|
label = "usb2:blue";
|
||||||
|
gpios = <&gpio1 13 0>;
|
||||||
|
};
|
||||||
|
usb3 {
|
||||||
|
label = "usb3:blue";
|
||||||
|
gpios = <&gpio1 14 0>;
|
||||||
|
};
|
||||||
|
usb4 {
|
||||||
|
label = "usb4:blue";
|
||||||
|
gpios = <&gpio1 15 0>;
|
||||||
|
};
|
||||||
|
otb {
|
||||||
|
label = "otb:blue";
|
||||||
|
gpios = <&gpio1 16 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
20
arch/arm/boot/dts/kirkwood-lschlv2.dts
Normal file
20
arch/arm/boot/dts/kirkwood-lschlv2.dts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "kirkwood-lsxl.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Buffalo Linkstation LS-CHLv2";
|
||||||
|
compatible = "buffalo,lschlv2", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x00000000 0x4000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
serial@12000 {
|
||||||
|
clock-frequency = <166666667>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
20
arch/arm/boot/dts/kirkwood-lsxhl.dts
Normal file
20
arch/arm/boot/dts/kirkwood-lsxhl.dts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "kirkwood-lsxl.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Buffalo Linkstation LS-XHL";
|
||||||
|
compatible = "buffalo,lsxhl", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x00000000 0x10000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
serial@12000 {
|
||||||
|
clock-frequency = <200000000>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
95
arch/arm/boot/dts/kirkwood-lsxl.dtsi
Normal file
95
arch/arm/boot/dts/kirkwood-lsxl.dtsi
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/include/ "kirkwood.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
chosen {
|
||||||
|
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi@10600 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
m25p40@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "m25p40";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <25000000>;
|
||||||
|
mode = <0>;
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
reg = <0x0 0x60000>;
|
||||||
|
label = "uboot";
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@60000 {
|
||||||
|
reg = <0x60000 0x10000>;
|
||||||
|
label = "dtb";
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@70000 {
|
||||||
|
reg = <0x70000 0x10000>;
|
||||||
|
label = "uboot_env";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio_keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
button@1 {
|
||||||
|
label = "Function Button";
|
||||||
|
linux,code = <132>;
|
||||||
|
gpios = <&gpio1 9 1>;
|
||||||
|
};
|
||||||
|
button@2 {
|
||||||
|
label = "Power-on Switch";
|
||||||
|
linux,code = <116>;
|
||||||
|
gpios = <&gpio1 10 1>;
|
||||||
|
};
|
||||||
|
button@3 {
|
||||||
|
label = "Power-auto Switch";
|
||||||
|
linux,code = <142>;
|
||||||
|
gpios = <&gpio1 11 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio_leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
led@1 {
|
||||||
|
label = "lschlv2:blue:func";
|
||||||
|
gpios = <&gpio1 4 1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@2 {
|
||||||
|
label = "lschlv2:red:alarm";
|
||||||
|
gpios = <&gpio1 5 1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@3 {
|
||||||
|
label = "lschlv2:amber:info";
|
||||||
|
gpios = <&gpio1 6 1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@4 {
|
||||||
|
label = "lschlv2:blue:power";
|
||||||
|
gpios = <&gpio1 7 1>;
|
||||||
|
linux,default-trigger = "default-on";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@5 {
|
||||||
|
label = "lschlv2:red:func";
|
||||||
|
gpios = <&gpio1 16 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
21
arch/arm/boot/dts/kirkwood-ts219-6281.dts
Normal file
21
arch/arm/boot/dts/kirkwood-ts219-6281.dts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "kirkwood-ts219.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
gpio_keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
button@1 {
|
||||||
|
label = "USB Copy";
|
||||||
|
linux,code = <133>;
|
||||||
|
gpios = <&gpio0 15 1>;
|
||||||
|
};
|
||||||
|
button@2 {
|
||||||
|
label = "Reset";
|
||||||
|
linux,code = <0x198>;
|
||||||
|
gpios = <&gpio0 16 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
21
arch/arm/boot/dts/kirkwood-ts219-6282.dts
Normal file
21
arch/arm/boot/dts/kirkwood-ts219-6282.dts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "kirkwood-ts219.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
gpio_keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
button@1 {
|
||||||
|
label = "USB Copy";
|
||||||
|
linux,code = <133>;
|
||||||
|
gpios = <&gpio1 11 1>;
|
||||||
|
};
|
||||||
|
button@2 {
|
||||||
|
label = "Reset";
|
||||||
|
linux,code = <0x198>;
|
||||||
|
gpios = <&gpio1 5 1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
78
arch/arm/boot/dts/kirkwood-ts219.dtsi
Normal file
78
arch/arm/boot/dts/kirkwood-ts219.dtsi
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/include/ "kirkwood.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "QNAP TS219 family";
|
||||||
|
compatible = "qnap,ts219", "marvell,kirkwood";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x00000000 0x20000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
bootargs = "console=ttyS0,115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
ocp@f1000000 {
|
||||||
|
i2c@11000 {
|
||||||
|
status = "okay";
|
||||||
|
clock-frequency = <400000>;
|
||||||
|
|
||||||
|
s35390a: s35390a@30 {
|
||||||
|
compatible = "s35390a";
|
||||||
|
reg = <0x30>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
serial@12000 {
|
||||||
|
clock-frequency = <200000000>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
serial@12100 {
|
||||||
|
clock-frequency = <200000000>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
spi@10600 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
m25p128@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "m25p128";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <20000000>;
|
||||||
|
mode = <0>;
|
||||||
|
|
||||||
|
partition@0000000 {
|
||||||
|
reg = <0x00000000 0x00080000>;
|
||||||
|
label = "U-Boot";
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@00200000 {
|
||||||
|
reg = <0x00200000 0x00200000>;
|
||||||
|
label = "Kernel";
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@00400000 {
|
||||||
|
reg = <0x00400000 0x00900000>;
|
||||||
|
label = "RootFS1";
|
||||||
|
};
|
||||||
|
partition@00d00000 {
|
||||||
|
reg = <0x00d00000 0x00300000>;
|
||||||
|
label = "RootFS2";
|
||||||
|
};
|
||||||
|
partition@00040000 {
|
||||||
|
reg = <0x00080000 0x00040000>;
|
||||||
|
label = "U-Boot Config";
|
||||||
|
};
|
||||||
|
partition@000c0000 {
|
||||||
|
reg = <0x000c0000 0x00140000>;
|
||||||
|
label = "NAS Config";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sata@80000 {
|
||||||
|
status = "okay";
|
||||||
|
nr-ports = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
/ {
|
/ {
|
||||||
compatible = "marvell,kirkwood";
|
compatible = "marvell,kirkwood";
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
intc: interrupt-controller {
|
||||||
|
compatible = "marvell,orion-intc", "marvell,intc";
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
reg = <0xf1020204 0x04>,
|
||||||
|
<0xf1020214 0x04>;
|
||||||
|
};
|
||||||
|
|
||||||
ocp@f1000000 {
|
ocp@f1000000 {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
@ -9,6 +18,24 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
gpio0: gpio@10100 {
|
||||||
|
compatible = "marvell,orion-gpio";
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
gpio-controller;
|
||||||
|
reg = <0x10100 0x40>;
|
||||||
|
ngpio = <32>;
|
||||||
|
interrupts = <35>, <36>, <37>, <38>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio1: gpio@10140 {
|
||||||
|
compatible = "marvell,orion-gpio";
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
gpio-controller;
|
||||||
|
reg = <0x10140 0x40>;
|
||||||
|
ngpio = <18>;
|
||||||
|
interrupts = <39>, <40>, <41>;
|
||||||
|
};
|
||||||
|
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
compatible = "ns16550a";
|
compatible = "ns16550a";
|
||||||
reg = <0x12000 0x100>;
|
reg = <0x12000 0x100>;
|
||||||
@ -33,6 +60,29 @@
|
|||||||
interrupts = <53>;
|
interrupts = <53>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
spi@10600 {
|
||||||
|
compatible = "marvell,orion-spi";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
cell-index = <0>;
|
||||||
|
interrupts = <23>;
|
||||||
|
reg = <0x10600 0x28>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
wdt@20300 {
|
||||||
|
compatible = "marvell,orion-wdt";
|
||||||
|
reg = <0x20300 0x28>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
sata@80000 {
|
||||||
|
compatible = "marvell,orion-sata";
|
||||||
|
reg = <0x80000 0x5000>;
|
||||||
|
interrupts = <21>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
nand@3000000 {
|
nand@3000000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
@ -45,5 +95,15 @@
|
|||||||
/* set partition map and/or chip-delay in board dts */
|
/* set partition map and/or chip-delay in board dts */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
i2c@11000 {
|
||||||
|
compatible = "marvell,mv64xxx-i2c";
|
||||||
|
reg = <0x11000 0x20>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
interrupts = <29>;
|
||||||
|
clock-frequency = <100000>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -192,6 +192,7 @@ CONFIG_RTC_DRV_MC13XXX=y
|
|||||||
CONFIG_RTC_DRV_MXC=y
|
CONFIG_RTC_DRV_MXC=y
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
CONFIG_IMX_SDMA=y
|
CONFIG_IMX_SDMA=y
|
||||||
|
CONFIG_MXS_DMA=y
|
||||||
CONFIG_COMMON_CLK_DEBUG=y
|
CONFIG_COMMON_CLK_DEBUG=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
|
@ -34,7 +34,6 @@ CONFIG_NO_HZ=y
|
|||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_PREEMPT_VOLUNTARY=y
|
CONFIG_PREEMPT_VOLUNTARY=y
|
||||||
CONFIG_AEABI=y
|
CONFIG_AEABI=y
|
||||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
|
|
||||||
CONFIG_AUTO_ZRELADDR=y
|
CONFIG_AUTO_ZRELADDR=y
|
||||||
CONFIG_FPE_NWFPE=y
|
CONFIG_FPE_NWFPE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
@ -7,7 +7,7 @@ CONFIG_SYSFS_DEPRECATED_V2=y
|
|||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
# CONFIG_KALLSYMS is not set
|
# CONFIG_KALLSYMS is not set
|
||||||
# CONFIG_BUG is not set
|
# CONFIG_BUGVERBOSE is not set
|
||||||
# CONFIG_ELF_CORE is not set
|
# CONFIG_ELF_CORE is not set
|
||||||
# CONFIG_SHMEM is not set
|
# CONFIG_SHMEM is not set
|
||||||
CONFIG_SLOB=y
|
CONFIG_SLOB=y
|
||||||
|
@ -195,25 +195,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)
|
|||||||
|
|
||||||
#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0)
|
#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0)
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ < 6
|
|
||||||
static inline void __sync_icache_dcache(pte_t pteval)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
extern void __sync_icache_dcache(pte_t pteval);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
||||||
pte_t *ptep, pte_t pteval)
|
|
||||||
{
|
|
||||||
if (addr >= TASK_SIZE)
|
|
||||||
set_pte_ext(ptep, pteval, 0);
|
|
||||||
else {
|
|
||||||
__sync_icache_dcache(pteval);
|
|
||||||
set_pte_ext(ptep, pteval, PTE_EXT_NG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define pte_none(pte) (!pte_val(pte))
|
#define pte_none(pte) (!pte_val(pte))
|
||||||
#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
|
#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
|
||||||
#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY))
|
#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY))
|
||||||
@ -226,6 +207,27 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|||||||
((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \
|
((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \
|
||||||
(L_PTE_PRESENT | L_PTE_USER))
|
(L_PTE_PRESENT | L_PTE_USER))
|
||||||
|
|
||||||
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
|
static inline void __sync_icache_dcache(pte_t pteval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
extern void __sync_icache_dcache(pte_t pteval);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||||
|
pte_t *ptep, pte_t pteval)
|
||||||
|
{
|
||||||
|
unsigned long ext = 0;
|
||||||
|
|
||||||
|
if (addr < TASK_SIZE && pte_present_user(pteval)) {
|
||||||
|
__sync_icache_dcache(pteval);
|
||||||
|
ext |= PTE_EXT_NG;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_pte_ext(ptep, pteval, ext);
|
||||||
|
}
|
||||||
|
|
||||||
#define PTE_BIT_FUNC(fn,op) \
|
#define PTE_BIT_FUNC(fn,op) \
|
||||||
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
||||||
|
|
||||||
@ -251,13 +253,13 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|||||||
*
|
*
|
||||||
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||||
* <--------------- offset --------------------> <- type --> 0 0 0
|
* <--------------- offset ----------------------> < type -> 0 0 0
|
||||||
*
|
*
|
||||||
* This gives us up to 63 swap files and 32GB per swap file. Note that
|
* This gives us up to 31 swap files and 64GB per swap file. Note that
|
||||||
* the offset field is always non-zero.
|
* the offset field is always non-zero.
|
||||||
*/
|
*/
|
||||||
#define __SWP_TYPE_SHIFT 3
|
#define __SWP_TYPE_SHIFT 3
|
||||||
#define __SWP_TYPE_BITS 6
|
#define __SWP_TYPE_BITS 5
|
||||||
#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1)
|
#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1)
|
||||||
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
||||||
|
|
||||||
|
@ -10,5 +10,7 @@
|
|||||||
|
|
||||||
extern void sched_clock_postinit(void);
|
extern void sched_clock_postinit(void);
|
||||||
extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate);
|
extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate);
|
||||||
|
extern void setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
|
||||||
|
unsigned long rate);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,6 +21,8 @@ struct clock_data {
|
|||||||
u32 epoch_cyc_copy;
|
u32 epoch_cyc_copy;
|
||||||
u32 mult;
|
u32 mult;
|
||||||
u32 shift;
|
u32 shift;
|
||||||
|
bool suspended;
|
||||||
|
bool needs_suspend;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sched_clock_poll(unsigned long wrap_ticks);
|
static void sched_clock_poll(unsigned long wrap_ticks);
|
||||||
@ -49,6 +51,9 @@ static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask)
|
|||||||
u64 epoch_ns;
|
u64 epoch_ns;
|
||||||
u32 epoch_cyc;
|
u32 epoch_cyc;
|
||||||
|
|
||||||
|
if (cd.suspended)
|
||||||
|
return cd.epoch_ns;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load the epoch_cyc and epoch_ns atomically. We do this by
|
* Load the epoch_cyc and epoch_ns atomically. We do this by
|
||||||
* ensuring that we always write epoch_cyc, epoch_ns and
|
* ensuring that we always write epoch_cyc, epoch_ns and
|
||||||
@ -98,6 +103,13 @@ static void sched_clock_poll(unsigned long wrap_ticks)
|
|||||||
update_sched_clock();
|
update_sched_clock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
|
||||||
|
unsigned long rate)
|
||||||
|
{
|
||||||
|
setup_sched_clock(read, bits, rate);
|
||||||
|
cd.needs_suspend = true;
|
||||||
|
}
|
||||||
|
|
||||||
void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)
|
void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)
|
||||||
{
|
{
|
||||||
unsigned long r, w;
|
unsigned long r, w;
|
||||||
@ -169,11 +181,23 @@ void __init sched_clock_postinit(void)
|
|||||||
static int sched_clock_suspend(void)
|
static int sched_clock_suspend(void)
|
||||||
{
|
{
|
||||||
sched_clock_poll(sched_clock_timer.data);
|
sched_clock_poll(sched_clock_timer.data);
|
||||||
|
if (cd.needs_suspend)
|
||||||
|
cd.suspended = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sched_clock_resume(void)
|
||||||
|
{
|
||||||
|
if (cd.needs_suspend) {
|
||||||
|
cd.epoch_cyc = read_sched_clock();
|
||||||
|
cd.epoch_cyc_copy = cd.epoch_cyc;
|
||||||
|
cd.suspended = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct syscore_ops sched_clock_ops = {
|
static struct syscore_ops sched_clock_ops = {
|
||||||
.suspend = sched_clock_suspend,
|
.suspend = sched_clock_suspend,
|
||||||
|
.resume = sched_clock_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init sched_clock_syscore_init(void)
|
static int __init sched_clock_syscore_init(void)
|
||||||
|
@ -321,7 +321,7 @@ void store_cpu_topology(unsigned int cpuid)
|
|||||||
* init_cpu_topology is called at boot when only one cpu is running
|
* init_cpu_topology is called at boot when only one cpu is running
|
||||||
* which prevent simultaneous write access to cpu_topology array
|
* which prevent simultaneous write access to cpu_topology array
|
||||||
*/
|
*/
|
||||||
void init_cpu_topology(void)
|
void __init init_cpu_topology(void)
|
||||||
{
|
{
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
|
@ -16,13 +16,30 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
|
|||||||
call_with_stack.o
|
call_with_stack.o
|
||||||
|
|
||||||
mmu-y := clear_user.o copy_page.o getuser.o putuser.o
|
mmu-y := clear_user.o copy_page.o getuser.o putuser.o
|
||||||
mmu-y += copy_from_user.o copy_to_user.o
|
|
||||||
|
# the code in uaccess.S is not preemption safe and
|
||||||
|
# probably faster on ARMv3 only
|
||||||
|
ifeq ($(CONFIG_PREEMPT),y)
|
||||||
|
mmu-y += copy_from_user.o copy_to_user.o
|
||||||
|
else
|
||||||
|
ifneq ($(CONFIG_CPU_32v3),y)
|
||||||
|
mmu-y += copy_from_user.o copy_to_user.o
|
||||||
|
else
|
||||||
|
mmu-y += uaccess.o
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# using lib_ here won't override already available weak symbols
|
# using lib_ here won't override already available weak symbols
|
||||||
obj-$(CONFIG_UACCESS_WITH_MEMCPY) += uaccess_with_memcpy.o
|
obj-$(CONFIG_UACCESS_WITH_MEMCPY) += uaccess_with_memcpy.o
|
||||||
|
|
||||||
lib-$(CONFIG_MMU) += $(mmu-y)
|
lib-$(CONFIG_MMU) += $(mmu-y)
|
||||||
lib-y += io-readsw-armv4.o io-writesw-armv4.o
|
|
||||||
|
ifeq ($(CONFIG_CPU_32v3),y)
|
||||||
|
lib-y += io-readsw-armv3.o io-writesw-armv3.o
|
||||||
|
else
|
||||||
|
lib-y += io-readsw-armv4.o io-writesw-armv4.o
|
||||||
|
endif
|
||||||
|
|
||||||
lib-$(CONFIG_ARCH_RPC) += ecard.o io-acorn.o floppydma.o
|
lib-$(CONFIG_ARCH_RPC) += ecard.o io-acorn.o floppydma.o
|
||||||
lib-$(CONFIG_ARCH_SHARK) += io-shark.o
|
lib-$(CONFIG_ARCH_SHARK) += io-shark.o
|
||||||
|
|
||||||
|
106
arch/arm/lib/io-readsw-armv3.S
Normal file
106
arch/arm/lib/io-readsw-armv3.S
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* linux/arch/arm/lib/io-readsw-armv3.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-2000 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.
|
||||||
|
*/
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
.Linsw_bad_alignment:
|
||||||
|
adr r0, .Linsw_bad_align_msg
|
||||||
|
mov r2, lr
|
||||||
|
b panic
|
||||||
|
.Linsw_bad_align_msg:
|
||||||
|
.asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||||
|
.align
|
||||||
|
|
||||||
|
.Linsw_align: tst r1, #1
|
||||||
|
bne .Linsw_bad_alignment
|
||||||
|
|
||||||
|
ldr r3, [r0]
|
||||||
|
strb r3, [r1], #1
|
||||||
|
mov r3, r3, lsr #8
|
||||||
|
strb r3, [r1], #1
|
||||||
|
|
||||||
|
subs r2, r2, #1
|
||||||
|
moveq pc, lr
|
||||||
|
|
||||||
|
ENTRY(__raw_readsw)
|
||||||
|
teq r2, #0 @ do we have to check for the zero len?
|
||||||
|
moveq pc, lr
|
||||||
|
tst r1, #3
|
||||||
|
bne .Linsw_align
|
||||||
|
|
||||||
|
.Linsw_aligned: mov ip, #0xff
|
||||||
|
orr ip, ip, ip, lsl #8
|
||||||
|
stmfd sp!, {r4, r5, r6, lr}
|
||||||
|
|
||||||
|
subs r2, r2, #8
|
||||||
|
bmi .Lno_insw_8
|
||||||
|
|
||||||
|
.Linsw_8_lp: ldr r3, [r0]
|
||||||
|
and r3, r3, ip
|
||||||
|
ldr r4, [r0]
|
||||||
|
orr r3, r3, r4, lsl #16
|
||||||
|
|
||||||
|
ldr r4, [r0]
|
||||||
|
and r4, r4, ip
|
||||||
|
ldr r5, [r0]
|
||||||
|
orr r4, r4, r5, lsl #16
|
||||||
|
|
||||||
|
ldr r5, [r0]
|
||||||
|
and r5, r5, ip
|
||||||
|
ldr r6, [r0]
|
||||||
|
orr r5, r5, r6, lsl #16
|
||||||
|
|
||||||
|
ldr r6, [r0]
|
||||||
|
and r6, r6, ip
|
||||||
|
ldr lr, [r0]
|
||||||
|
orr r6, r6, lr, lsl #16
|
||||||
|
|
||||||
|
stmia r1!, {r3 - r6}
|
||||||
|
|
||||||
|
subs r2, r2, #8
|
||||||
|
bpl .Linsw_8_lp
|
||||||
|
|
||||||
|
tst r2, #7
|
||||||
|
ldmeqfd sp!, {r4, r5, r6, pc}
|
||||||
|
|
||||||
|
.Lno_insw_8: tst r2, #4
|
||||||
|
beq .Lno_insw_4
|
||||||
|
|
||||||
|
ldr r3, [r0]
|
||||||
|
and r3, r3, ip
|
||||||
|
ldr r4, [r0]
|
||||||
|
orr r3, r3, r4, lsl #16
|
||||||
|
|
||||||
|
ldr r4, [r0]
|
||||||
|
and r4, r4, ip
|
||||||
|
ldr r5, [r0]
|
||||||
|
orr r4, r4, r5, lsl #16
|
||||||
|
|
||||||
|
stmia r1!, {r3, r4}
|
||||||
|
|
||||||
|
.Lno_insw_4: tst r2, #2
|
||||||
|
beq .Lno_insw_2
|
||||||
|
|
||||||
|
ldr r3, [r0]
|
||||||
|
and r3, r3, ip
|
||||||
|
ldr r4, [r0]
|
||||||
|
orr r3, r3, r4, lsl #16
|
||||||
|
|
||||||
|
str r3, [r1], #4
|
||||||
|
|
||||||
|
.Lno_insw_2: tst r2, #1
|
||||||
|
ldrne r3, [r0]
|
||||||
|
strneb r3, [r1], #1
|
||||||
|
movne r3, r3, lsr #8
|
||||||
|
strneb r3, [r1]
|
||||||
|
|
||||||
|
ldmfd sp!, {r4, r5, r6, pc}
|
||||||
|
|
||||||
|
|
126
arch/arm/lib/io-writesw-armv3.S
Normal file
126
arch/arm/lib/io-writesw-armv3.S
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* linux/arch/arm/lib/io-writesw-armv3.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-2000 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.
|
||||||
|
*/
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
.Loutsw_bad_alignment:
|
||||||
|
adr r0, .Loutsw_bad_align_msg
|
||||||
|
mov r2, lr
|
||||||
|
b panic
|
||||||
|
.Loutsw_bad_align_msg:
|
||||||
|
.asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||||
|
.align
|
||||||
|
|
||||||
|
.Loutsw_align: tst r1, #1
|
||||||
|
bne .Loutsw_bad_alignment
|
||||||
|
|
||||||
|
add r1, r1, #2
|
||||||
|
|
||||||
|
ldr r3, [r1, #-4]
|
||||||
|
mov r3, r3, lsr #16
|
||||||
|
orr r3, r3, r3, lsl #16
|
||||||
|
str r3, [r0]
|
||||||
|
subs r2, r2, #1
|
||||||
|
moveq pc, lr
|
||||||
|
|
||||||
|
ENTRY(__raw_writesw)
|
||||||
|
teq r2, #0 @ do we have to check for the zero len?
|
||||||
|
moveq pc, lr
|
||||||
|
tst r1, #3
|
||||||
|
bne .Loutsw_align
|
||||||
|
|
||||||
|
stmfd sp!, {r4, r5, r6, lr}
|
||||||
|
|
||||||
|
subs r2, r2, #8
|
||||||
|
bmi .Lno_outsw_8
|
||||||
|
|
||||||
|
.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
|
||||||
|
|
||||||
|
mov ip, r3, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r3, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r4, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r4, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r5, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r5, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r6, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r6, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
subs r2, r2, #8
|
||||||
|
bpl .Loutsw_8_lp
|
||||||
|
|
||||||
|
tst r2, #7
|
||||||
|
ldmeqfd sp!, {r4, r5, r6, pc}
|
||||||
|
|
||||||
|
.Lno_outsw_8: tst r2, #4
|
||||||
|
beq .Lno_outsw_4
|
||||||
|
|
||||||
|
ldmia r1!, {r3, r4}
|
||||||
|
|
||||||
|
mov ip, r3, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r3, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r4, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r4, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
.Lno_outsw_4: tst r2, #2
|
||||||
|
beq .Lno_outsw_2
|
||||||
|
|
||||||
|
ldr r3, [r1], #4
|
||||||
|
|
||||||
|
mov ip, r3, lsl #16
|
||||||
|
orr ip, ip, ip, lsr #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
mov ip, r3, lsr #16
|
||||||
|
orr ip, ip, ip, lsl #16
|
||||||
|
str ip, [r0]
|
||||||
|
|
||||||
|
.Lno_outsw_2: tst r2, #1
|
||||||
|
|
||||||
|
ldrne r3, [r1]
|
||||||
|
|
||||||
|
movne ip, r3, lsl #16
|
||||||
|
orrne ip, ip, ip, lsr #16
|
||||||
|
strne ip, [r0]
|
||||||
|
|
||||||
|
ldmfd sp!, {r4, r5, r6, pc}
|
564
arch/arm/lib/uaccess.S
Normal file
564
arch/arm/lib/uaccess.S
Normal file
@ -0,0 +1,564 @@
|
|||||||
|
/*
|
||||||
|
* linux/arch/arm/lib/uaccess.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995, 1996,1997,1998 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.
|
||||||
|
*
|
||||||
|
* Routines to block copy data to/from user memory
|
||||||
|
* These are highly optimised both for the 4k page size
|
||||||
|
* and for various alignments.
|
||||||
|
*/
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/assembler.h>
|
||||||
|
#include <asm/errno.h>
|
||||||
|
#include <asm/domain.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
#define PAGE_SHIFT 12
|
||||||
|
|
||||||
|
/* Prototype: int __copy_to_user(void *to, const char *from, size_t n)
|
||||||
|
* Purpose : copy a block to user memory from kernel memory
|
||||||
|
* Params : to - user memory
|
||||||
|
* : from - kernel memory
|
||||||
|
* : n - number of bytes to copy
|
||||||
|
* Returns : Number of bytes NOT copied.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.Lc2u_dest_not_aligned:
|
||||||
|
rsb ip, ip, #4
|
||||||
|
cmp ip, #2
|
||||||
|
ldrb r3, [r1], #1
|
||||||
|
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgeb r3, [r1], #1
|
||||||
|
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgtb r3, [r1], #1
|
||||||
|
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||||
|
sub r2, r2, ip
|
||||||
|
b .Lc2u_dest_aligned
|
||||||
|
|
||||||
|
ENTRY(__copy_to_user)
|
||||||
|
stmfd sp!, {r2, r4 - r7, lr}
|
||||||
|
cmp r2, #4
|
||||||
|
blt .Lc2u_not_enough
|
||||||
|
ands ip, r0, #3
|
||||||
|
bne .Lc2u_dest_not_aligned
|
||||||
|
.Lc2u_dest_aligned:
|
||||||
|
|
||||||
|
ands ip, r1, #3
|
||||||
|
bne .Lc2u_src_not_aligned
|
||||||
|
/*
|
||||||
|
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||||
|
* copy one word, and force a user-mode page fault...
|
||||||
|
*/
|
||||||
|
|
||||||
|
.Lc2u_0fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lc2u_0nowords
|
||||||
|
ldr r3, [r1], #4
|
||||||
|
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||||
|
mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lc2u_0fupi
|
||||||
|
/*
|
||||||
|
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||||
|
*/
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #32
|
||||||
|
blt .Lc2u_0rem8lp
|
||||||
|
|
||||||
|
.Lc2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||||
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
ldmia r1!, {r3 - r6}
|
||||||
|
subs ip, ip, #32
|
||||||
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
bpl .Lc2u_0cpy8lp
|
||||||
|
|
||||||
|
.Lc2u_0rem8lp: cmn ip, #16
|
||||||
|
ldmgeia r1!, {r3 - r6}
|
||||||
|
stmgeia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
tst ip, #8
|
||||||
|
ldmneia r1!, {r3 - r4}
|
||||||
|
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||||
|
tst ip, #4
|
||||||
|
ldrne r3, [r1], #4
|
||||||
|
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lc2u_0fupi
|
||||||
|
.Lc2u_0nowords: teq ip, #0
|
||||||
|
beq .Lc2u_finished
|
||||||
|
.Lc2u_nowords: cmp ip, #2
|
||||||
|
ldrb r3, [r1], #1
|
||||||
|
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgeb r3, [r1], #1
|
||||||
|
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgtb r3, [r1], #1
|
||||||
|
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||||
|
b .Lc2u_finished
|
||||||
|
|
||||||
|
.Lc2u_not_enough:
|
||||||
|
movs ip, r2
|
||||||
|
bne .Lc2u_nowords
|
||||||
|
.Lc2u_finished: mov r0, #0
|
||||||
|
ldmfd sp!, {r2, r4 - r7, pc}
|
||||||
|
|
||||||
|
.Lc2u_src_not_aligned:
|
||||||
|
bic r1, r1, #3
|
||||||
|
ldr r7, [r1], #4
|
||||||
|
cmp ip, #2
|
||||||
|
bgt .Lc2u_3fupi
|
||||||
|
beq .Lc2u_2fupi
|
||||||
|
.Lc2u_1fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lc2u_1nowords
|
||||||
|
mov r3, r7, pull #8
|
||||||
|
ldr r7, [r1], #4
|
||||||
|
orr r3, r3, r7, push #24
|
||||||
|
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||||
|
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lc2u_1fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lc2u_1rem8lp
|
||||||
|
|
||||||
|
.Lc2u_1cpy8lp: mov r3, r7, pull #8
|
||||||
|
ldmia r1!, {r4 - r7}
|
||||||
|
subs ip, ip, #16
|
||||||
|
orr r3, r3, r4, push #24
|
||||||
|
mov r4, r4, pull #8
|
||||||
|
orr r4, r4, r5, push #24
|
||||||
|
mov r5, r5, pull #8
|
||||||
|
orr r5, r5, r6, push #24
|
||||||
|
mov r6, r6, pull #8
|
||||||
|
orr r6, r6, r7, push #24
|
||||||
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
bpl .Lc2u_1cpy8lp
|
||||||
|
|
||||||
|
.Lc2u_1rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #8
|
||||||
|
ldmneia r1!, {r4, r7}
|
||||||
|
orrne r3, r3, r4, push #24
|
||||||
|
movne r4, r4, pull #8
|
||||||
|
orrne r4, r4, r7, push #24
|
||||||
|
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #8
|
||||||
|
ldrne r7, [r1], #4
|
||||||
|
orrne r3, r3, r7, push #24
|
||||||
|
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lc2u_1fupi
|
||||||
|
.Lc2u_1nowords: mov r3, r7, get_byte_1
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lc2u_finished
|
||||||
|
cmp ip, #2
|
||||||
|
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||||
|
movge r3, r7, get_byte_2
|
||||||
|
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||||
|
movgt r3, r7, get_byte_3
|
||||||
|
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||||
|
b .Lc2u_finished
|
||||||
|
|
||||||
|
.Lc2u_2fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lc2u_2nowords
|
||||||
|
mov r3, r7, pull #16
|
||||||
|
ldr r7, [r1], #4
|
||||||
|
orr r3, r3, r7, push #16
|
||||||
|
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||||
|
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lc2u_2fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lc2u_2rem8lp
|
||||||
|
|
||||||
|
.Lc2u_2cpy8lp: mov r3, r7, pull #16
|
||||||
|
ldmia r1!, {r4 - r7}
|
||||||
|
subs ip, ip, #16
|
||||||
|
orr r3, r3, r4, push #16
|
||||||
|
mov r4, r4, pull #16
|
||||||
|
orr r4, r4, r5, push #16
|
||||||
|
mov r5, r5, pull #16
|
||||||
|
orr r5, r5, r6, push #16
|
||||||
|
mov r6, r6, pull #16
|
||||||
|
orr r6, r6, r7, push #16
|
||||||
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
bpl .Lc2u_2cpy8lp
|
||||||
|
|
||||||
|
.Lc2u_2rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #16
|
||||||
|
ldmneia r1!, {r4, r7}
|
||||||
|
orrne r3, r3, r4, push #16
|
||||||
|
movne r4, r4, pull #16
|
||||||
|
orrne r4, r4, r7, push #16
|
||||||
|
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #16
|
||||||
|
ldrne r7, [r1], #4
|
||||||
|
orrne r3, r3, r7, push #16
|
||||||
|
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lc2u_2fupi
|
||||||
|
.Lc2u_2nowords: mov r3, r7, get_byte_2
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lc2u_finished
|
||||||
|
cmp ip, #2
|
||||||
|
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||||
|
movge r3, r7, get_byte_3
|
||||||
|
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgtb r3, [r1], #0
|
||||||
|
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||||
|
b .Lc2u_finished
|
||||||
|
|
||||||
|
.Lc2u_3fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lc2u_3nowords
|
||||||
|
mov r3, r7, pull #24
|
||||||
|
ldr r7, [r1], #4
|
||||||
|
orr r3, r3, r7, push #8
|
||||||
|
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||||
|
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lc2u_3fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lc2u_3rem8lp
|
||||||
|
|
||||||
|
.Lc2u_3cpy8lp: mov r3, r7, pull #24
|
||||||
|
ldmia r1!, {r4 - r7}
|
||||||
|
subs ip, ip, #16
|
||||||
|
orr r3, r3, r4, push #8
|
||||||
|
mov r4, r4, pull #24
|
||||||
|
orr r4, r4, r5, push #8
|
||||||
|
mov r5, r5, pull #24
|
||||||
|
orr r5, r5, r6, push #8
|
||||||
|
mov r6, r6, pull #24
|
||||||
|
orr r6, r6, r7, push #8
|
||||||
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
|
bpl .Lc2u_3cpy8lp
|
||||||
|
|
||||||
|
.Lc2u_3rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #24
|
||||||
|
ldmneia r1!, {r4, r7}
|
||||||
|
orrne r3, r3, r4, push #8
|
||||||
|
movne r4, r4, pull #24
|
||||||
|
orrne r4, r4, r7, push #8
|
||||||
|
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #24
|
||||||
|
ldrne r7, [r1], #4
|
||||||
|
orrne r3, r3, r7, push #8
|
||||||
|
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lc2u_3fupi
|
||||||
|
.Lc2u_3nowords: mov r3, r7, get_byte_3
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lc2u_finished
|
||||||
|
cmp ip, #2
|
||||||
|
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgeb r3, [r1], #1
|
||||||
|
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||||
|
ldrgtb r3, [r1], #0
|
||||||
|
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||||
|
b .Lc2u_finished
|
||||||
|
ENDPROC(__copy_to_user)
|
||||||
|
|
||||||
|
.pushsection .fixup,"ax"
|
||||||
|
.align 0
|
||||||
|
9001: ldmfd sp!, {r0, r4 - r7, pc}
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n);
|
||||||
|
* Purpose : copy a block from user memory to kernel memory
|
||||||
|
* Params : to - kernel memory
|
||||||
|
* : from - user memory
|
||||||
|
* : n - number of bytes to copy
|
||||||
|
* Returns : Number of bytes NOT copied.
|
||||||
|
*/
|
||||||
|
.Lcfu_dest_not_aligned:
|
||||||
|
rsb ip, ip, #4
|
||||||
|
cmp ip, #2
|
||||||
|
USER( TUSER( ldrb) r3, [r1], #1) @ May fault
|
||||||
|
strb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||||
|
strgeb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||||
|
strgtb r3, [r0], #1
|
||||||
|
sub r2, r2, ip
|
||||||
|
b .Lcfu_dest_aligned
|
||||||
|
|
||||||
|
ENTRY(__copy_from_user)
|
||||||
|
stmfd sp!, {r0, r2, r4 - r7, lr}
|
||||||
|
cmp r2, #4
|
||||||
|
blt .Lcfu_not_enough
|
||||||
|
ands ip, r0, #3
|
||||||
|
bne .Lcfu_dest_not_aligned
|
||||||
|
.Lcfu_dest_aligned:
|
||||||
|
ands ip, r1, #3
|
||||||
|
bne .Lcfu_src_not_aligned
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||||
|
* copy one word, and force a user-mode page fault...
|
||||||
|
*/
|
||||||
|
|
||||||
|
.Lcfu_0fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lcfu_0nowords
|
||||||
|
USER( TUSER( ldr) r3, [r1], #4)
|
||||||
|
str r3, [r0], #4
|
||||||
|
mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lcfu_0fupi
|
||||||
|
/*
|
||||||
|
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||||
|
*/
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #32
|
||||||
|
blt .Lcfu_0rem8lp
|
||||||
|
|
||||||
|
.Lcfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
|
stmia r0!, {r3 - r6}
|
||||||
|
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
|
subs ip, ip, #32
|
||||||
|
stmia r0!, {r3 - r6}
|
||||||
|
bpl .Lcfu_0cpy8lp
|
||||||
|
|
||||||
|
.Lcfu_0rem8lp: cmn ip, #16
|
||||||
|
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
|
stmgeia r0!, {r3 - r6}
|
||||||
|
tst ip, #8
|
||||||
|
ldmneia r1!, {r3 - r4} @ Shouldnt fault
|
||||||
|
stmneia r0!, {r3 - r4}
|
||||||
|
tst ip, #4
|
||||||
|
TUSER( ldrne) r3, [r1], #4 @ Shouldnt fault
|
||||||
|
strne r3, [r0], #4
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lcfu_0fupi
|
||||||
|
.Lcfu_0nowords: teq ip, #0
|
||||||
|
beq .Lcfu_finished
|
||||||
|
.Lcfu_nowords: cmp ip, #2
|
||||||
|
USER( TUSER( ldrb) r3, [r1], #1) @ May fault
|
||||||
|
strb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||||
|
strgeb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||||
|
strgtb r3, [r0], #1
|
||||||
|
b .Lcfu_finished
|
||||||
|
|
||||||
|
.Lcfu_not_enough:
|
||||||
|
movs ip, r2
|
||||||
|
bne .Lcfu_nowords
|
||||||
|
.Lcfu_finished: mov r0, #0
|
||||||
|
add sp, sp, #8
|
||||||
|
ldmfd sp!, {r4 - r7, pc}
|
||||||
|
|
||||||
|
.Lcfu_src_not_aligned:
|
||||||
|
bic r1, r1, #3
|
||||||
|
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||||
|
cmp ip, #2
|
||||||
|
bgt .Lcfu_3fupi
|
||||||
|
beq .Lcfu_2fupi
|
||||||
|
.Lcfu_1fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lcfu_1nowords
|
||||||
|
mov r3, r7, pull #8
|
||||||
|
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||||
|
orr r3, r3, r7, push #24
|
||||||
|
str r3, [r0], #4
|
||||||
|
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lcfu_1fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lcfu_1rem8lp
|
||||||
|
|
||||||
|
.Lcfu_1cpy8lp: mov r3, r7, pull #8
|
||||||
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
|
subs ip, ip, #16
|
||||||
|
orr r3, r3, r4, push #24
|
||||||
|
mov r4, r4, pull #8
|
||||||
|
orr r4, r4, r5, push #24
|
||||||
|
mov r5, r5, pull #8
|
||||||
|
orr r5, r5, r6, push #24
|
||||||
|
mov r6, r6, pull #8
|
||||||
|
orr r6, r6, r7, push #24
|
||||||
|
stmia r0!, {r3 - r6}
|
||||||
|
bpl .Lcfu_1cpy8lp
|
||||||
|
|
||||||
|
.Lcfu_1rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #8
|
||||||
|
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||||
|
orrne r3, r3, r4, push #24
|
||||||
|
movne r4, r4, pull #8
|
||||||
|
orrne r4, r4, r7, push #24
|
||||||
|
stmneia r0!, {r3 - r4}
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #8
|
||||||
|
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||||
|
orrne r3, r3, r7, push #24
|
||||||
|
strne r3, [r0], #4
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lcfu_1fupi
|
||||||
|
.Lcfu_1nowords: mov r3, r7, get_byte_1
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lcfu_finished
|
||||||
|
cmp ip, #2
|
||||||
|
strb r3, [r0], #1
|
||||||
|
movge r3, r7, get_byte_2
|
||||||
|
strgeb r3, [r0], #1
|
||||||
|
movgt r3, r7, get_byte_3
|
||||||
|
strgtb r3, [r0], #1
|
||||||
|
b .Lcfu_finished
|
||||||
|
|
||||||
|
.Lcfu_2fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lcfu_2nowords
|
||||||
|
mov r3, r7, pull #16
|
||||||
|
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||||
|
orr r3, r3, r7, push #16
|
||||||
|
str r3, [r0], #4
|
||||||
|
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lcfu_2fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lcfu_2rem8lp
|
||||||
|
|
||||||
|
|
||||||
|
.Lcfu_2cpy8lp: mov r3, r7, pull #16
|
||||||
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
|
subs ip, ip, #16
|
||||||
|
orr r3, r3, r4, push #16
|
||||||
|
mov r4, r4, pull #16
|
||||||
|
orr r4, r4, r5, push #16
|
||||||
|
mov r5, r5, pull #16
|
||||||
|
orr r5, r5, r6, push #16
|
||||||
|
mov r6, r6, pull #16
|
||||||
|
orr r6, r6, r7, push #16
|
||||||
|
stmia r0!, {r3 - r6}
|
||||||
|
bpl .Lcfu_2cpy8lp
|
||||||
|
|
||||||
|
.Lcfu_2rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #16
|
||||||
|
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||||
|
orrne r3, r3, r4, push #16
|
||||||
|
movne r4, r4, pull #16
|
||||||
|
orrne r4, r4, r7, push #16
|
||||||
|
stmneia r0!, {r3 - r4}
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #16
|
||||||
|
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||||
|
orrne r3, r3, r7, push #16
|
||||||
|
strne r3, [r0], #4
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lcfu_2fupi
|
||||||
|
.Lcfu_2nowords: mov r3, r7, get_byte_2
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lcfu_finished
|
||||||
|
cmp ip, #2
|
||||||
|
strb r3, [r0], #1
|
||||||
|
movge r3, r7, get_byte_3
|
||||||
|
strgeb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgtb) r3, [r1], #0) @ May fault
|
||||||
|
strgtb r3, [r0], #1
|
||||||
|
b .Lcfu_finished
|
||||||
|
|
||||||
|
.Lcfu_3fupi: subs r2, r2, #4
|
||||||
|
addmi ip, r2, #4
|
||||||
|
bmi .Lcfu_3nowords
|
||||||
|
mov r3, r7, pull #24
|
||||||
|
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||||
|
orr r3, r3, r7, push #8
|
||||||
|
str r3, [r0], #4
|
||||||
|
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||||
|
rsb ip, ip, #0
|
||||||
|
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||||
|
beq .Lcfu_3fupi
|
||||||
|
cmp r2, ip
|
||||||
|
movlt ip, r2
|
||||||
|
sub r2, r2, ip
|
||||||
|
subs ip, ip, #16
|
||||||
|
blt .Lcfu_3rem8lp
|
||||||
|
|
||||||
|
.Lcfu_3cpy8lp: mov r3, r7, pull #24
|
||||||
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
|
orr r3, r3, r4, push #8
|
||||||
|
mov r4, r4, pull #24
|
||||||
|
orr r4, r4, r5, push #8
|
||||||
|
mov r5, r5, pull #24
|
||||||
|
orr r5, r5, r6, push #8
|
||||||
|
mov r6, r6, pull #24
|
||||||
|
orr r6, r6, r7, push #8
|
||||||
|
stmia r0!, {r3 - r6}
|
||||||
|
subs ip, ip, #16
|
||||||
|
bpl .Lcfu_3cpy8lp
|
||||||
|
|
||||||
|
.Lcfu_3rem8lp: tst ip, #8
|
||||||
|
movne r3, r7, pull #24
|
||||||
|
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||||
|
orrne r3, r3, r4, push #8
|
||||||
|
movne r4, r4, pull #24
|
||||||
|
orrne r4, r4, r7, push #8
|
||||||
|
stmneia r0!, {r3 - r4}
|
||||||
|
tst ip, #4
|
||||||
|
movne r3, r7, pull #24
|
||||||
|
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||||
|
orrne r3, r3, r7, push #8
|
||||||
|
strne r3, [r0], #4
|
||||||
|
ands ip, ip, #3
|
||||||
|
beq .Lcfu_3fupi
|
||||||
|
.Lcfu_3nowords: mov r3, r7, get_byte_3
|
||||||
|
teq ip, #0
|
||||||
|
beq .Lcfu_finished
|
||||||
|
cmp ip, #2
|
||||||
|
strb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||||
|
strgeb r3, [r0], #1
|
||||||
|
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||||
|
strgtb r3, [r0], #1
|
||||||
|
b .Lcfu_finished
|
||||||
|
ENDPROC(__copy_from_user)
|
||||||
|
|
||||||
|
.pushsection .fixup,"ax"
|
||||||
|
.align 0
|
||||||
|
/*
|
||||||
|
* We took an exception. r0 contains a pointer to
|
||||||
|
* the byte not copied.
|
||||||
|
*/
|
||||||
|
9001: ldr r2, [sp], #4 @ void *to
|
||||||
|
sub r2, r0, r2 @ bytes copied
|
||||||
|
ldr r1, [sp], #4 @ unsigned long count
|
||||||
|
subs r4, r1, r2 @ bytes left to copy
|
||||||
|
movne r1, r4
|
||||||
|
blne __memzero
|
||||||
|
mov r0, r4
|
||||||
|
ldmfd sp!, {r4 - r7, pc}
|
||||||
|
.popsection
|
||||||
|
|
@ -162,38 +162,6 @@ static void __init davinci_ntosd2_map_io(void)
|
|||||||
dm644x_init();
|
dm644x_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
I2C initialization
|
|
||||||
*/
|
|
||||||
static struct davinci_i2c_platform_data ntosd2_i2c_pdata = {
|
|
||||||
.bus_freq = 20 /* kHz */,
|
|
||||||
.bus_delay = 100 /* usec */,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct i2c_board_info __initdata ntosd2_i2c_info[] = {
|
|
||||||
};
|
|
||||||
|
|
||||||
static int ntosd2_init_i2c(void)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
davinci_init_i2c(&ntosd2_i2c_pdata);
|
|
||||||
status = gpio_request(NTOSD2_MSP430_IRQ, ntosd2_i2c_info[0].type);
|
|
||||||
if (status == 0) {
|
|
||||||
status = gpio_direction_input(NTOSD2_MSP430_IRQ);
|
|
||||||
if (status == 0) {
|
|
||||||
status = gpio_to_irq(NTOSD2_MSP430_IRQ);
|
|
||||||
if (status > 0) {
|
|
||||||
ntosd2_i2c_info[0].irq = status;
|
|
||||||
i2c_register_board_info(1,
|
|
||||||
ntosd2_i2c_info,
|
|
||||||
ARRAY_SIZE(ntosd2_i2c_info));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct davinci_mmc_config davinci_ntosd2_mmc_config = {
|
static struct davinci_mmc_config davinci_ntosd2_mmc_config = {
|
||||||
.wires = 4,
|
.wires = 4,
|
||||||
.version = MMC_CTLR_VERSION_1
|
.version = MMC_CTLR_VERSION_1
|
||||||
@ -218,7 +186,6 @@ static __init void davinci_ntosd2_init(void)
|
|||||||
{
|
{
|
||||||
struct clk *aemif_clk;
|
struct clk *aemif_clk;
|
||||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||||
int status;
|
|
||||||
|
|
||||||
aemif_clk = clk_get(NULL, "aemif");
|
aemif_clk = clk_get(NULL, "aemif");
|
||||||
clk_enable(aemif_clk);
|
clk_enable(aemif_clk);
|
||||||
@ -242,12 +209,6 @@ static __init void davinci_ntosd2_init(void)
|
|||||||
platform_add_devices(davinci_ntosd2_devices,
|
platform_add_devices(davinci_ntosd2_devices,
|
||||||
ARRAY_SIZE(davinci_ntosd2_devices));
|
ARRAY_SIZE(davinci_ntosd2_devices));
|
||||||
|
|
||||||
/* Initialize I2C interface specific for this board */
|
|
||||||
status = ntosd2_init_i2c();
|
|
||||||
if (status < 0)
|
|
||||||
pr_warning("davinci_ntosd2_init: msp430 irq setup failed:"
|
|
||||||
" %d\n", status);
|
|
||||||
|
|
||||||
davinci_serial_init(&uart_config);
|
davinci_serial_init(&uart_config);
|
||||||
dm644x_init_asp(&dm644x_ntosd2_snd_data);
|
dm644x_init_asp(&dm644x_ntosd2_snd_data);
|
||||||
|
|
||||||
|
@ -20,22 +20,6 @@
|
|||||||
#include <mach/bridge-regs.h>
|
#include <mach/bridge-regs.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|
||||||
{
|
|
||||||
int irqoff;
|
|
||||||
BUG_ON(irq < IRQ_DOVE_GPIO_0_7 || irq > IRQ_DOVE_HIGH_GPIO);
|
|
||||||
|
|
||||||
irqoff = irq <= IRQ_DOVE_GPIO_16_23 ? irq - IRQ_DOVE_GPIO_0_7 :
|
|
||||||
3 + irq - IRQ_DOVE_GPIO_24_31;
|
|
||||||
|
|
||||||
orion_gpio_irq_handler(irqoff << 3);
|
|
||||||
if (irq == IRQ_DOVE_HIGH_GPIO) {
|
|
||||||
orion_gpio_irq_handler(40);
|
|
||||||
orion_gpio_irq_handler(48);
|
|
||||||
orion_gpio_irq_handler(56);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pmu_irq_mask(struct irq_data *d)
|
static void pmu_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
int pin = irq_to_pmu(d->irq);
|
int pin = irq_to_pmu(d->irq);
|
||||||
@ -90,6 +74,27 @@ static void pmu_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __initdata gpio0_irqs[4] = {
|
||||||
|
IRQ_DOVE_GPIO_0_7,
|
||||||
|
IRQ_DOVE_GPIO_8_15,
|
||||||
|
IRQ_DOVE_GPIO_16_23,
|
||||||
|
IRQ_DOVE_GPIO_24_31,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __initdata gpio1_irqs[4] = {
|
||||||
|
IRQ_DOVE_HIGH_GPIO,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __initdata gpio2_irqs[4] = {
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
void __init dove_init_irq(void)
|
void __init dove_init_irq(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -100,19 +105,14 @@ void __init dove_init_irq(void)
|
|||||||
/*
|
/*
|
||||||
* Initialize gpiolib for GPIOs 0-71.
|
* Initialize gpiolib for GPIOs 0-71.
|
||||||
*/
|
*/
|
||||||
orion_gpio_init(0, 32, DOVE_GPIO_LO_VIRT_BASE, 0,
|
orion_gpio_init(NULL, 0, 32, (void __iomem *)DOVE_GPIO_LO_VIRT_BASE, 0,
|
||||||
IRQ_DOVE_GPIO_START);
|
IRQ_DOVE_GPIO_START, gpio0_irqs);
|
||||||
irq_set_chained_handler(IRQ_DOVE_GPIO_0_7, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_DOVE_GPIO_8_15, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_DOVE_GPIO_16_23, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_DOVE_GPIO_24_31, gpio_irq_handler);
|
|
||||||
|
|
||||||
orion_gpio_init(32, 32, DOVE_GPIO_HI_VIRT_BASE, 0,
|
orion_gpio_init(NULL, 32, 32, (void __iomem *)DOVE_GPIO_HI_VIRT_BASE, 0,
|
||||||
IRQ_DOVE_GPIO_START + 32);
|
IRQ_DOVE_GPIO_START + 32, gpio1_irqs);
|
||||||
irq_set_chained_handler(IRQ_DOVE_HIGH_GPIO, gpio_irq_handler);
|
|
||||||
|
|
||||||
orion_gpio_init(64, 8, DOVE_GPIO2_VIRT_BASE, 0,
|
orion_gpio_init(NULL, 64, 8, (void __iomem *)DOVE_GPIO2_VIRT_BASE, 0,
|
||||||
IRQ_DOVE_GPIO_START + 64);
|
IRQ_DOVE_GPIO_START + 64, gpio2_irqs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mask and clear PMU interrupts
|
* Mask and clear PMU interrupts
|
||||||
|
@ -115,7 +115,7 @@ static __init int exynos_pm_dt_parse_domains(void)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_OF */
|
#endif /* CONFIG_OF */
|
||||||
|
|
||||||
static __init void exynos_pm_add_dev_to_genpd(struct platform_device *pdev,
|
static __init __maybe_unused void exynos_pm_add_dev_to_genpd(struct platform_device *pdev,
|
||||||
struct exynos_pm_domain *pd)
|
struct exynos_pm_domain *pd)
|
||||||
{
|
{
|
||||||
if (pdev->dev.bus) {
|
if (pdev->dev.bus) {
|
||||||
|
@ -223,7 +223,7 @@ int __init mx27_clocks_init(unsigned long fref)
|
|||||||
clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0");
|
clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0");
|
||||||
clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0");
|
clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0");
|
||||||
clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0");
|
clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0");
|
||||||
clk_register_clkdev(clk[csi_ahb_gate], NULL, "mx2-camera.0");
|
clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0");
|
||||||
clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc");
|
clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc");
|
||||||
clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc");
|
clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc");
|
||||||
clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc");
|
clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc");
|
||||||
@ -250,8 +250,10 @@ int __init mx27_clocks_init(unsigned long fref)
|
|||||||
clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx-i2c.1");
|
clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx-i2c.1");
|
||||||
clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0");
|
clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0");
|
||||||
clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad");
|
clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad");
|
||||||
clk_register_clkdev(clk[emma_ahb_gate], "ahb", "imx-emma");
|
clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0");
|
||||||
clk_register_clkdev(clk[emma_ipg_gate], "ipg", "imx-emma");
|
clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0");
|
||||||
|
clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0");
|
||||||
|
clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0");
|
||||||
clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL);
|
clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL);
|
||||||
clk_register_clkdev(clk[gpio_ipg_gate], "gpio", NULL);
|
clk_register_clkdev(clk[gpio_ipg_gate], "gpio", NULL);
|
||||||
clk_register_clkdev(clk[brom_ahb_gate], "brom", NULL);
|
clk_register_clkdev(clk[brom_ahb_gate], "brom", NULL);
|
||||||
|
@ -130,7 +130,7 @@ int __init mx31_clocks_init(unsigned long fref)
|
|||||||
clk_register_clkdev(clk[nfc], NULL, "mxc_nand.0");
|
clk_register_clkdev(clk[nfc], NULL, "mxc_nand.0");
|
||||||
clk_register_clkdev(clk[ipu_gate], NULL, "ipu-core");
|
clk_register_clkdev(clk[ipu_gate], NULL, "ipu-core");
|
||||||
clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb");
|
clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb");
|
||||||
clk_register_clkdev(clk[kpp_gate], "kpp", NULL);
|
clk_register_clkdev(clk[kpp_gate], NULL, "imx-keypad");
|
||||||
clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.0");
|
clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.0");
|
||||||
clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.0");
|
clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.0");
|
||||||
clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0");
|
clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0");
|
||||||
|
@ -303,6 +303,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
|
|||||||
clk_prepare_enable(clk[aips_tz2]); /* fec */
|
clk_prepare_enable(clk[aips_tz2]); /* fec */
|
||||||
clk_prepare_enable(clk[spba]);
|
clk_prepare_enable(clk[spba]);
|
||||||
clk_prepare_enable(clk[emi_fast_gate]); /* fec */
|
clk_prepare_enable(clk[emi_fast_gate]); /* fec */
|
||||||
|
clk_prepare_enable(clk[emi_slow_gate]); /* eim */
|
||||||
clk_prepare_enable(clk[tmax1]);
|
clk_prepare_enable(clk[tmax1]);
|
||||||
clk_prepare_enable(clk[tmax2]); /* esdhc2, fec */
|
clk_prepare_enable(clk[tmax2]); /* esdhc2, fec */
|
||||||
clk_prepare_enable(clk[tmax3]); /* esdhc1, esdhc4 */
|
clk_prepare_enable(clk[tmax3]); /* esdhc1, esdhc4 */
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/export.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
@ -456,7 +456,7 @@ static void __init ap_init_timer(void)
|
|||||||
|
|
||||||
clk = clk_get_sys("ap_timer", NULL);
|
clk = clk_get_sys("ap_timer", NULL);
|
||||||
BUG_ON(IS_ERR(clk));
|
BUG_ON(IS_ERR(clk));
|
||||||
clk_enable(clk);
|
clk_prepare_enable(clk);
|
||||||
rate = clk_get_rate(clk);
|
rate = clk_get_rate(clk);
|
||||||
|
|
||||||
writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
||||||
|
@ -80,6 +80,35 @@ config MACH_IB62X0_DT
|
|||||||
RaidSonic IB-NAS6210 & IB-NAS6220 devices, using
|
RaidSonic IB-NAS6210 & IB-NAS6220 devices, using
|
||||||
Flattened Device Tree.
|
Flattened Device Tree.
|
||||||
|
|
||||||
|
config MACH_TS219_DT
|
||||||
|
bool "Device Tree for QNAP TS-11X, TS-21X NAS"
|
||||||
|
select ARCH_KIRKWOOD_DT
|
||||||
|
select ARM_APPENDED_DTB
|
||||||
|
select ARM_ATAG_DTB_COMPAT
|
||||||
|
help
|
||||||
|
Say 'Y' here if you want your kernel to support the QNAP
|
||||||
|
TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and
|
||||||
|
TS-219P+ Turbo NAS devices using Fattened Device Tree.
|
||||||
|
There are two different Device Tree descriptions, depending
|
||||||
|
on if the device is based on an if the board uses the MV6281
|
||||||
|
or MV6282. If you have the wrong one, the buttons will not
|
||||||
|
work.
|
||||||
|
|
||||||
|
config MACH_GOFLEXNET_DT
|
||||||
|
bool "Seagate GoFlex Net (Flattened Device Tree)"
|
||||||
|
select ARCH_KIRKWOOD_DT
|
||||||
|
help
|
||||||
|
Say 'Y' here if you want your kernel to support the
|
||||||
|
Seagate GoFlex Net (Flattened Device Tree).
|
||||||
|
|
||||||
|
config MACH_LSXL_DT
|
||||||
|
bool "Buffalo Linkstation LS-XHL, LS-CHLv2 (Flattened Device Tree)"
|
||||||
|
select ARCH_KIRKWOOD_DT
|
||||||
|
help
|
||||||
|
Say 'Y' here if you want your kernel to support the
|
||||||
|
Buffalo Linkstation LS-XHL & LS-CHLv2 devices, using
|
||||||
|
Flattened Device Tree.
|
||||||
|
|
||||||
config MACH_TS219
|
config MACH_TS219
|
||||||
bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
|
bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
|
||||||
help
|
help
|
||||||
|
@ -25,3 +25,6 @@ obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
|
|||||||
obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o
|
obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o
|
||||||
obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += board-dnskw.o
|
obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += board-dnskw.o
|
||||||
obj-$(CONFIG_MACH_IB62X0_DT) += board-ib62x0.o
|
obj-$(CONFIG_MACH_IB62X0_DT) += board-ib62x0.o
|
||||||
|
obj-$(CONFIG_MACH_TS219_DT) += board-ts219.o tsx1x-common.o
|
||||||
|
obj-$(CONFIG_MACH_GOFLEXNET_DT) += board-goflexnet.o
|
||||||
|
obj-$(CONFIG_MACH_LSXL_DT) += board-lsxl.o
|
||||||
|
@ -7,3 +7,7 @@ dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns320.dtb
|
|||||||
dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb
|
dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb
|
||||||
dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb
|
dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb
|
||||||
dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb
|
dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb
|
||||||
|
dtb-$(CONFIG_MACH_TS219_DT) += kirkwood-qnap-ts219.dtb
|
||||||
|
dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb
|
||||||
|
dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb
|
||||||
|
dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb
|
||||||
|
@ -14,13 +14,11 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/i2c.h>
|
|
||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/gpio_keys.h>
|
|
||||||
#include <linux/gpio-fan.h>
|
#include <linux/gpio-fan.h>
|
||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
@ -35,10 +33,6 @@ static struct mv643xx_eth_platform_data dnskw_ge00_data = {
|
|||||||
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct mv_sata_platform_data dnskw_sata_data = {
|
|
||||||
.n_ports = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned int dnskw_mpp_config[] __initdata = {
|
static unsigned int dnskw_mpp_config[] __initdata = {
|
||||||
MPP13_UART1_TXD, /* Custom ... */
|
MPP13_UART1_TXD, /* Custom ... */
|
||||||
MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */
|
MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */
|
||||||
@ -73,132 +67,6 @@ static unsigned int dnskw_mpp_config[] __initdata = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_led dns325_led_pins[] = {
|
|
||||||
{
|
|
||||||
.name = "dns325:white:power",
|
|
||||||
.gpio = 26,
|
|
||||||
.active_low = 1,
|
|
||||||
.default_trigger = "default-on",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns325:white:usb",
|
|
||||||
.gpio = 43,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns325:red:l_hdd",
|
|
||||||
.gpio = 28,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns325:red:r_hdd",
|
|
||||||
.gpio = 27,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns325:red:usb",
|
|
||||||
.gpio = 29,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led_platform_data dns325_led_data = {
|
|
||||||
.num_leds = ARRAY_SIZE(dns325_led_pins),
|
|
||||||
.leds = dns325_led_pins,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device dns325_led_device = {
|
|
||||||
.name = "leds-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &dns325_led_data,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led dns320_led_pins[] = {
|
|
||||||
{
|
|
||||||
.name = "dns320:blue:power",
|
|
||||||
.gpio = 26,
|
|
||||||
.active_low = 1,
|
|
||||||
.default_trigger = "default-on",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns320:blue:usb",
|
|
||||||
.gpio = 43,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns320:orange:l_hdd",
|
|
||||||
.gpio = 28,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns320:orange:r_hdd",
|
|
||||||
.gpio = 27,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dns320:orange:usb",
|
|
||||||
.gpio = 35,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led_platform_data dns320_led_data = {
|
|
||||||
.num_leds = ARRAY_SIZE(dns320_led_pins),
|
|
||||||
.leds = dns320_led_pins,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device dns320_led_device = {
|
|
||||||
.name = "leds-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &dns320_led_data,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct i2c_board_info dns325_i2c_board_info[] __initdata = {
|
|
||||||
{
|
|
||||||
I2C_BOARD_INFO("lm75", 0x48),
|
|
||||||
},
|
|
||||||
/* Something at 0x0c also */
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_keys_button dnskw_button_pins[] = {
|
|
||||||
{
|
|
||||||
.code = KEY_POWER,
|
|
||||||
.gpio = 34,
|
|
||||||
.desc = "Power button",
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = KEY_EJECTCD,
|
|
||||||
.gpio = 47,
|
|
||||||
.desc = "USB unmount button",
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = KEY_RESTART,
|
|
||||||
.gpio = 48,
|
|
||||||
.desc = "Reset button",
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_keys_platform_data dnskw_button_data = {
|
|
||||||
.buttons = dnskw_button_pins,
|
|
||||||
.nbuttons = ARRAY_SIZE(dnskw_button_pins),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device dnskw_button_device = {
|
|
||||||
.name = "gpio-keys",
|
|
||||||
.id = -1,
|
|
||||||
.num_resources = 0,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &dnskw_button_data,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
|
/* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */
|
||||||
static struct gpio_fan_speed dnskw_fan_speed[] = {
|
static struct gpio_fan_speed dnskw_fan_speed[] = {
|
||||||
{ 0, 0 },
|
{ 0, 0 },
|
||||||
@ -245,20 +113,9 @@ void __init dnskw_init(void)
|
|||||||
|
|
||||||
kirkwood_ehci_init();
|
kirkwood_ehci_init();
|
||||||
kirkwood_ge00_init(&dnskw_ge00_data);
|
kirkwood_ge00_init(&dnskw_ge00_data);
|
||||||
kirkwood_sata_init(&dnskw_sata_data);
|
|
||||||
kirkwood_i2c_init();
|
|
||||||
|
|
||||||
platform_device_register(&dnskw_button_device);
|
|
||||||
platform_device_register(&dnskw_fan_device);
|
platform_device_register(&dnskw_fan_device);
|
||||||
|
|
||||||
if (of_machine_is_compatible("dlink,dns-325")) {
|
|
||||||
i2c_register_board_info(0, dns325_i2c_board_info,
|
|
||||||
ARRAY_SIZE(dns325_i2c_board_info));
|
|
||||||
platform_device_register(&dns325_led_device);
|
|
||||||
|
|
||||||
} else if (of_machine_is_compatible("dlink,dns-320"))
|
|
||||||
platform_device_register(&dns320_led_device);
|
|
||||||
|
|
||||||
/* Register power-off GPIO. */
|
/* Register power-off GPIO. */
|
||||||
if (gpio_request(36, "dnskw:power:off") == 0
|
if (gpio_request(36, "dnskw:power:off") == 0
|
||||||
&& gpio_direction_output(36, 0) == 0)
|
&& gpio_direction_output(36, 0) == 0)
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mtd/partitions.h>
|
|
||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
@ -23,7 +22,6 @@
|
|||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/leds.h>
|
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/spi/flash.h>
|
#include <linux/spi/flash.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
@ -36,42 +34,6 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "mpp.h"
|
#include "mpp.h"
|
||||||
|
|
||||||
struct mtd_partition dreamplug_partitions[] = {
|
|
||||||
{
|
|
||||||
.name = "u-boot",
|
|
||||||
.size = SZ_512K,
|
|
||||||
.offset = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "u-boot env",
|
|
||||||
.size = SZ_64K,
|
|
||||||
.offset = SZ_512K + SZ_512K,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dtb",
|
|
||||||
.size = SZ_64K,
|
|
||||||
.offset = SZ_512K + SZ_512K + SZ_512K,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct flash_platform_data dreamplug_spi_slave_data = {
|
|
||||||
.type = "mx25l1606e",
|
|
||||||
.name = "spi_flash",
|
|
||||||
.parts = dreamplug_partitions,
|
|
||||||
.nr_parts = ARRAY_SIZE(dreamplug_partitions),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct spi_board_info __initdata dreamplug_spi_slave_info[] = {
|
|
||||||
{
|
|
||||||
.modalias = "m25p80",
|
|
||||||
.platform_data = &dreamplug_spi_slave_data,
|
|
||||||
.irq = -1,
|
|
||||||
.max_speed_hz = 50000000,
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
|
static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
|
||||||
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||||
};
|
};
|
||||||
@ -80,45 +42,10 @@ static struct mv643xx_eth_platform_data dreamplug_ge01_data = {
|
|||||||
.phy_addr = MV643XX_ETH_PHY_ADDR(1),
|
.phy_addr = MV643XX_ETH_PHY_ADDR(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct mv_sata_platform_data dreamplug_sata_data = {
|
|
||||||
.n_ports = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mvsdio_platform_data dreamplug_mvsdio_data = {
|
static struct mvsdio_platform_data dreamplug_mvsdio_data = {
|
||||||
/* unfortunately the CD signal has not been connected */
|
/* unfortunately the CD signal has not been connected */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_led dreamplug_led_pins[] = {
|
|
||||||
{
|
|
||||||
.name = "dreamplug:blue:bluetooth",
|
|
||||||
.gpio = 47,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dreamplug:green:wifi",
|
|
||||||
.gpio = 48,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "dreamplug:green:wifi_ap",
|
|
||||||
.gpio = 49,
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led_platform_data dreamplug_led_data = {
|
|
||||||
.leds = dreamplug_led_pins,
|
|
||||||
.num_leds = ARRAY_SIZE(dreamplug_led_pins),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device dreamplug_leds = {
|
|
||||||
.name = "leds-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &dreamplug_led_data,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned int dreamplug_mpp_config[] __initdata = {
|
static unsigned int dreamplug_mpp_config[] __initdata = {
|
||||||
MPP0_SPI_SCn,
|
MPP0_SPI_SCn,
|
||||||
MPP1_SPI_MOSI,
|
MPP1_SPI_MOSI,
|
||||||
@ -137,15 +64,8 @@ void __init dreamplug_init(void)
|
|||||||
*/
|
*/
|
||||||
kirkwood_mpp_conf(dreamplug_mpp_config);
|
kirkwood_mpp_conf(dreamplug_mpp_config);
|
||||||
|
|
||||||
spi_register_board_info(dreamplug_spi_slave_info,
|
|
||||||
ARRAY_SIZE(dreamplug_spi_slave_info));
|
|
||||||
kirkwood_spi_init();
|
|
||||||
|
|
||||||
kirkwood_ehci_init();
|
kirkwood_ehci_init();
|
||||||
kirkwood_ge00_init(&dreamplug_ge00_data);
|
kirkwood_ge00_init(&dreamplug_ge00_data);
|
||||||
kirkwood_ge01_init(&dreamplug_ge01_data);
|
kirkwood_ge01_init(&dreamplug_ge01_data);
|
||||||
kirkwood_sata_init(&dreamplug_sata_data);
|
|
||||||
kirkwood_sdio_init(&dreamplug_mvsdio_data);
|
kirkwood_sdio_init(&dreamplug_mvsdio_data);
|
||||||
|
|
||||||
platform_device_register(&dreamplug_leds);
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <mach/bridge-regs.h>
|
#include <mach/bridge-regs.h>
|
||||||
|
#include <plat/irq.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static struct of_device_id kirkwood_dt_match_table[] __initdata = {
|
static struct of_device_id kirkwood_dt_match_table[] __initdata = {
|
||||||
@ -25,6 +26,16 @@ static struct of_device_id kirkwood_dt_match_table[] __initdata = {
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct of_dev_auxdata kirkwood_auxdata_lookup[] __initdata = {
|
||||||
|
OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL),
|
||||||
|
OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0",
|
||||||
|
NULL),
|
||||||
|
OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL),
|
||||||
|
OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL),
|
||||||
|
OF_DEV_AUXDATA("marvell,orion-nand", 0xf4000000, "orion_nand", NULL),
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
|
||||||
static void __init kirkwood_dt_init(void)
|
static void __init kirkwood_dt_init(void)
|
||||||
{
|
{
|
||||||
pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk);
|
pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk);
|
||||||
@ -47,7 +58,6 @@ static void __init kirkwood_dt_init(void)
|
|||||||
kirkwood_clk_init();
|
kirkwood_clk_init();
|
||||||
|
|
||||||
/* internal devices that every board has */
|
/* internal devices that every board has */
|
||||||
kirkwood_wdt_init();
|
|
||||||
kirkwood_xor0_init();
|
kirkwood_xor0_init();
|
||||||
kirkwood_xor1_init();
|
kirkwood_xor1_init();
|
||||||
kirkwood_crypto_init();
|
kirkwood_crypto_init();
|
||||||
@ -68,7 +78,17 @@ static void __init kirkwood_dt_init(void)
|
|||||||
if (of_machine_is_compatible("raidsonic,ib-nas62x0"))
|
if (of_machine_is_compatible("raidsonic,ib-nas62x0"))
|
||||||
ib62x0_init();
|
ib62x0_init();
|
||||||
|
|
||||||
of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL);
|
if (of_machine_is_compatible("qnap,ts219"))
|
||||||
|
qnap_dt_ts219_init();
|
||||||
|
|
||||||
|
if (of_machine_is_compatible("seagate,goflexnet"))
|
||||||
|
goflexnet_init();
|
||||||
|
|
||||||
|
if (of_machine_is_compatible("buffalo,lsxl"))
|
||||||
|
lsxl_init();
|
||||||
|
|
||||||
|
of_platform_populate(NULL, kirkwood_dt_match_table,
|
||||||
|
kirkwood_auxdata_lookup, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *kirkwood_dt_board_compat[] = {
|
static const char *kirkwood_dt_board_compat[] = {
|
||||||
@ -77,6 +97,9 @@ static const char *kirkwood_dt_board_compat[] = {
|
|||||||
"dlink,dns-325",
|
"dlink,dns-325",
|
||||||
"iom,iconnect",
|
"iom,iconnect",
|
||||||
"raidsonic,ib-nas62x0",
|
"raidsonic,ib-nas62x0",
|
||||||
|
"qnap,ts219",
|
||||||
|
"seagate,goflexnet",
|
||||||
|
"buffalo,lsxl",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -84,7 +107,7 @@ DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)")
|
|||||||
/* Maintainer: Jason Cooper <jason@lakedaemon.net> */
|
/* Maintainer: Jason Cooper <jason@lakedaemon.net> */
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_early = kirkwood_init_early,
|
.init_early = kirkwood_init_early,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = orion_dt_init_irq,
|
||||||
.timer = &kirkwood_timer,
|
.timer = &kirkwood_timer,
|
||||||
.init_machine = kirkwood_dt_init,
|
.init_machine = kirkwood_dt_init,
|
||||||
.restart = kirkwood_restart,
|
.restart = kirkwood_restart,
|
||||||
|
71
arch/arm/mach-kirkwood/board-goflexnet.c
Normal file
71
arch/arm/mach-kirkwood/board-goflexnet.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
|
||||||
|
*
|
||||||
|
* arch/arm/mach-kirkwood/board-goflexnet.c
|
||||||
|
*
|
||||||
|
* Seagate GoFlext Net Board Init for drivers not converted to
|
||||||
|
* flattened device tree yet.
|
||||||
|
*
|
||||||
|
* This file is licensed under the terms of the GNU General Public
|
||||||
|
* License version 2. This program is licensed "as is" without any
|
||||||
|
* warranty of any kind, whether express or implied.
|
||||||
|
*
|
||||||
|
* Copied and modified for Seagate GoFlex Net support by
|
||||||
|
* Joshua Coombs <josh.coombs@gmail.com> based on ArchLinux ARM's
|
||||||
|
* GoFlex kernel patches.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/ata_platform.h>
|
||||||
|
#include <linux/mv643xx_eth.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_fdt.h>
|
||||||
|
#include <linux/of_irq.h>
|
||||||
|
#include <linux/of_platform.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
#include <mach/kirkwood.h>
|
||||||
|
#include <mach/bridge-regs.h>
|
||||||
|
#include <plat/mvsdio.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "mpp.h"
|
||||||
|
|
||||||
|
static struct mv643xx_eth_platform_data goflexnet_ge00_data = {
|
||||||
|
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int goflexnet_mpp_config[] __initdata = {
|
||||||
|
MPP29_GPIO, /* USB Power Enable */
|
||||||
|
MPP47_GPIO, /* LED Orange */
|
||||||
|
MPP46_GPIO, /* LED Green */
|
||||||
|
MPP45_GPIO, /* LED Left Capacity 3 */
|
||||||
|
MPP44_GPIO, /* LED Left Capacity 2 */
|
||||||
|
MPP43_GPIO, /* LED Left Capacity 1 */
|
||||||
|
MPP42_GPIO, /* LED Left Capacity 0 */
|
||||||
|
MPP41_GPIO, /* LED Right Capacity 3 */
|
||||||
|
MPP40_GPIO, /* LED Right Capacity 2 */
|
||||||
|
MPP39_GPIO, /* LED Right Capacity 1 */
|
||||||
|
MPP38_GPIO, /* LED Right Capacity 0 */
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init goflexnet_init(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Basic setup. Needs to be called early.
|
||||||
|
*/
|
||||||
|
kirkwood_mpp_conf(goflexnet_mpp_config);
|
||||||
|
|
||||||
|
if (gpio_request(29, "USB Power Enable") != 0 ||
|
||||||
|
gpio_direction_output(29, 1) != 0)
|
||||||
|
pr_err("can't setup GPIO 29 (USB Power Enable)\n");
|
||||||
|
kirkwood_ehci_init();
|
||||||
|
|
||||||
|
kirkwood_ge00_init(&goflexnet_ge00_data);
|
||||||
|
}
|
@ -18,9 +18,7 @@
|
|||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/gpio_keys.h>
|
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/leds.h>
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <mach/kirkwood.h>
|
#include <mach/kirkwood.h>
|
||||||
@ -33,10 +31,6 @@ static struct mv643xx_eth_platform_data ib62x0_ge00_data = {
|
|||||||
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct mv_sata_platform_data ib62x0_sata_data = {
|
|
||||||
.n_ports = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned int ib62x0_mpp_config[] __initdata = {
|
static unsigned int ib62x0_mpp_config[] __initdata = {
|
||||||
MPP0_NF_IO2,
|
MPP0_NF_IO2,
|
||||||
MPP1_NF_IO3,
|
MPP1_NF_IO3,
|
||||||
@ -55,69 +49,6 @@ static unsigned int ib62x0_mpp_config[] __initdata = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_led ib62x0_led_pins[] = {
|
|
||||||
{
|
|
||||||
.name = "ib62x0:green:os",
|
|
||||||
.default_trigger = "default-on",
|
|
||||||
.gpio = 25,
|
|
||||||
.active_low = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "ib62x0:red:os",
|
|
||||||
.default_trigger = "none",
|
|
||||||
.gpio = 22,
|
|
||||||
.active_low = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "ib62x0:red:usb_copy",
|
|
||||||
.default_trigger = "none",
|
|
||||||
.gpio = 27,
|
|
||||||
.active_low = 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led_platform_data ib62x0_led_data = {
|
|
||||||
.leds = ib62x0_led_pins,
|
|
||||||
.num_leds = ARRAY_SIZE(ib62x0_led_pins),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device ib62x0_led_device = {
|
|
||||||
.name = "leds-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &ib62x0_led_data,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_keys_button ib62x0_button_pins[] = {
|
|
||||||
{
|
|
||||||
.code = KEY_COPY,
|
|
||||||
.gpio = 29,
|
|
||||||
.desc = "USB Copy",
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = KEY_RESTART,
|
|
||||||
.gpio = 28,
|
|
||||||
.desc = "Reset",
|
|
||||||
.active_low = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_keys_platform_data ib62x0_button_data = {
|
|
||||||
.buttons = ib62x0_button_pins,
|
|
||||||
.nbuttons = ARRAY_SIZE(ib62x0_button_pins),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device ib62x0_button_device = {
|
|
||||||
.name = "gpio-keys",
|
|
||||||
.id = -1,
|
|
||||||
.num_resources = 0,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &ib62x0_button_data,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ib62x0_power_off(void)
|
static void ib62x0_power_off(void)
|
||||||
{
|
{
|
||||||
gpio_set_value(IB62X0_GPIO_POWER_OFF, 1);
|
gpio_set_value(IB62X0_GPIO_POWER_OFF, 1);
|
||||||
@ -132,9 +63,6 @@ void __init ib62x0_init(void)
|
|||||||
|
|
||||||
kirkwood_ehci_init();
|
kirkwood_ehci_init();
|
||||||
kirkwood_ge00_init(&ib62x0_ge00_data);
|
kirkwood_ge00_init(&ib62x0_ge00_data);
|
||||||
kirkwood_sata_init(&ib62x0_sata_data);
|
|
||||||
platform_device_register(&ib62x0_led_device);
|
|
||||||
platform_device_register(&ib62x0_button_device);
|
|
||||||
if (gpio_request(IB62X0_GPIO_POWER_OFF, "ib62x0:power:off") == 0 &&
|
if (gpio_request(IB62X0_GPIO_POWER_OFF, "ib62x0:power:off") == 0 &&
|
||||||
gpio_direction_output(IB62X0_GPIO_POWER_OFF, 0) == 0)
|
gpio_direction_output(IB62X0_GPIO_POWER_OFF, 0) == 0)
|
||||||
pm_power_off = ib62x0_power_off;
|
pm_power_off = ib62x0_power_off;
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/leds.h>
|
|
||||||
#include <linux/i2c.h>
|
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
@ -32,50 +30,6 @@ static struct mv643xx_eth_platform_data iconnect_ge00_data = {
|
|||||||
.phy_addr = MV643XX_ETH_PHY_ADDR(11),
|
.phy_addr = MV643XX_ETH_PHY_ADDR(11),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_led iconnect_led_pins[] = {
|
|
||||||
{
|
|
||||||
.name = "led_level",
|
|
||||||
.gpio = 41,
|
|
||||||
.default_trigger = "default-on",
|
|
||||||
}, {
|
|
||||||
.name = "power:blue",
|
|
||||||
.gpio = 42,
|
|
||||||
.default_trigger = "timer",
|
|
||||||
}, {
|
|
||||||
.name = "power:red",
|
|
||||||
.gpio = 43,
|
|
||||||
}, {
|
|
||||||
.name = "usb1:blue",
|
|
||||||
.gpio = 44,
|
|
||||||
}, {
|
|
||||||
.name = "usb2:blue",
|
|
||||||
.gpio = 45,
|
|
||||||
}, {
|
|
||||||
.name = "usb3:blue",
|
|
||||||
.gpio = 46,
|
|
||||||
}, {
|
|
||||||
.name = "usb4:blue",
|
|
||||||
.gpio = 47,
|
|
||||||
}, {
|
|
||||||
.name = "otb:blue",
|
|
||||||
.gpio = 48,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct gpio_led_platform_data iconnect_led_data = {
|
|
||||||
.leds = iconnect_led_pins,
|
|
||||||
.num_leds = ARRAY_SIZE(iconnect_led_pins),
|
|
||||||
.gpio_blink_set = orion_gpio_led_blink_set,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device iconnect_leds = {
|
|
||||||
.name = "leds-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &iconnect_led_data,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned int iconnect_mpp_config[] __initdata = {
|
static unsigned int iconnect_mpp_config[] __initdata = {
|
||||||
MPP12_GPIO,
|
MPP12_GPIO,
|
||||||
MPP35_GPIO,
|
MPP35_GPIO,
|
||||||
@ -90,12 +44,6 @@ static unsigned int iconnect_mpp_config[] __initdata = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_board_info __initdata iconnect_board_info[] = {
|
|
||||||
{
|
|
||||||
I2C_BOARD_INFO("lm63", 0x4c),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mtd_partition iconnect_nand_parts[] = {
|
static struct mtd_partition iconnect_nand_parts[] = {
|
||||||
{
|
{
|
||||||
.name = "flash",
|
.name = "flash",
|
||||||
@ -142,15 +90,11 @@ void __init iconnect_init(void)
|
|||||||
{
|
{
|
||||||
kirkwood_mpp_conf(iconnect_mpp_config);
|
kirkwood_mpp_conf(iconnect_mpp_config);
|
||||||
kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25);
|
kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25);
|
||||||
kirkwood_i2c_init();
|
|
||||||
i2c_register_board_info(0, iconnect_board_info,
|
|
||||||
ARRAY_SIZE(iconnect_board_info));
|
|
||||||
|
|
||||||
kirkwood_ehci_init();
|
kirkwood_ehci_init();
|
||||||
kirkwood_ge00_init(&iconnect_ge00_data);
|
kirkwood_ge00_init(&iconnect_ge00_data);
|
||||||
|
|
||||||
platform_device_register(&iconnect_button_device);
|
platform_device_register(&iconnect_button_device);
|
||||||
platform_device_register(&iconnect_leds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init iconnect_pci_init(void)
|
static int __init iconnect_pci_init(void)
|
||||||
|
135
arch/arm/mach-kirkwood/board-lsxl.c
Normal file
135
arch/arm/mach-kirkwood/board-lsxl.c
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 (C), Michael Walle <michael@walle.cc>
|
||||||
|
*
|
||||||
|
* arch/arm/mach-kirkwood/board-lsxl.c
|
||||||
|
*
|
||||||
|
* Buffalo Linkstation LS-XHL and LS-CHLv2 init for drivers not
|
||||||
|
* converted to flattened device tree yet.
|
||||||
|
*
|
||||||
|
* This file is licensed under the terms of the GNU General Public
|
||||||
|
* License version 2. This program is licensed "as is" without any
|
||||||
|
* warranty of any kind, whether express or implied.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
#include <linux/ata_platform.h>
|
||||||
|
#include <linux/spi/flash.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
#include <linux/mv643xx_eth.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/gpio-fan.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <mach/kirkwood.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "mpp.h"
|
||||||
|
|
||||||
|
static struct mv643xx_eth_platform_data lsxl_ge00_data = {
|
||||||
|
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mv643xx_eth_platform_data lsxl_ge01_data = {
|
||||||
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int lsxl_mpp_config[] __initdata = {
|
||||||
|
MPP10_GPO, /* HDD Power Enable */
|
||||||
|
MPP11_GPIO, /* USB Vbus Enable */
|
||||||
|
MPP18_GPO, /* FAN High Enable# */
|
||||||
|
MPP19_GPO, /* FAN Low Enable# */
|
||||||
|
MPP36_GPIO, /* Function Blue LED */
|
||||||
|
MPP37_GPIO, /* Alarm LED */
|
||||||
|
MPP38_GPIO, /* Info LED */
|
||||||
|
MPP39_GPIO, /* Power LED */
|
||||||
|
MPP40_GPIO, /* Fan Lock */
|
||||||
|
MPP41_GPIO, /* Function Button */
|
||||||
|
MPP42_GPIO, /* Power Switch */
|
||||||
|
MPP43_GPIO, /* Power Auto Switch */
|
||||||
|
MPP48_GPIO, /* Function Red LED */
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LSXL_GPIO_FAN_HIGH 18
|
||||||
|
#define LSXL_GPIO_FAN_LOW 19
|
||||||
|
#define LSXL_GPIO_FAN_LOCK 40
|
||||||
|
|
||||||
|
static struct gpio_fan_alarm lsxl_alarm = {
|
||||||
|
.gpio = LSXL_GPIO_FAN_LOCK,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_fan_speed lsxl_speeds[] = {
|
||||||
|
{
|
||||||
|
.rpm = 0,
|
||||||
|
.ctrl_val = 3,
|
||||||
|
}, {
|
||||||
|
.rpm = 1500,
|
||||||
|
.ctrl_val = 1,
|
||||||
|
}, {
|
||||||
|
.rpm = 3250,
|
||||||
|
.ctrl_val = 2,
|
||||||
|
}, {
|
||||||
|
.rpm = 5000,
|
||||||
|
.ctrl_val = 0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int lsxl_gpio_list[] = {
|
||||||
|
LSXL_GPIO_FAN_HIGH, LSXL_GPIO_FAN_LOW,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_fan_platform_data lsxl_fan_data = {
|
||||||
|
.num_ctrl = ARRAY_SIZE(lsxl_gpio_list),
|
||||||
|
.ctrl = lsxl_gpio_list,
|
||||||
|
.alarm = &lsxl_alarm,
|
||||||
|
.num_speed = ARRAY_SIZE(lsxl_speeds),
|
||||||
|
.speed = lsxl_speeds,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device lsxl_fan_device = {
|
||||||
|
.name = "gpio-fan",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &lsxl_fan_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On the LS-XHL/LS-CHLv2, the shutdown process is following:
|
||||||
|
* - Userland monitors key events until the power switch goes to off position
|
||||||
|
* - The board reboots
|
||||||
|
* - U-boot starts and goes into an idle mode waiting for the user
|
||||||
|
* to move the switch to ON position
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void lsxl_power_off(void)
|
||||||
|
{
|
||||||
|
kirkwood_restart('h', NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LSXL_GPIO_HDD_POWER 10
|
||||||
|
#define LSXL_GPIO_USB_POWER 11
|
||||||
|
|
||||||
|
void __init lsxl_init(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Basic setup. Needs to be called early.
|
||||||
|
*/
|
||||||
|
kirkwood_mpp_conf(lsxl_mpp_config);
|
||||||
|
|
||||||
|
/* usb and sata power on */
|
||||||
|
gpio_set_value(LSXL_GPIO_USB_POWER, 1);
|
||||||
|
gpio_set_value(LSXL_GPIO_HDD_POWER, 1);
|
||||||
|
|
||||||
|
kirkwood_ehci_init();
|
||||||
|
kirkwood_ge00_init(&lsxl_ge00_data);
|
||||||
|
kirkwood_ge01_init(&lsxl_ge01_data);
|
||||||
|
platform_device_register(&lsxl_fan_device);
|
||||||
|
|
||||||
|
/* register power-off method */
|
||||||
|
pm_power_off = lsxl_power_off;
|
||||||
|
}
|
82
arch/arm/mach-kirkwood/board-ts219.c
Normal file
82
arch/arm/mach-kirkwood/board-ts219.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* QNAP TS-11x/TS-21x Turbo NAS Board Setup via DT
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Andrew Lunn <andrew@lunn.ch>
|
||||||
|
*
|
||||||
|
* Based on the board file ts219-setup.c:
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Martin Michlmayr <tbm@cyrius.com>
|
||||||
|
* Copyright (C) 2008 Byron Bradley <byron.bbradley@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the License, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/mv643xx_eth.h>
|
||||||
|
#include <linux/ata_platform.h>
|
||||||
|
#include <linux/gpio_keys.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <mach/kirkwood.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "mpp.h"
|
||||||
|
#include "tsx1x-common.h"
|
||||||
|
|
||||||
|
static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = {
|
||||||
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int qnap_ts219_mpp_config[] __initdata = {
|
||||||
|
MPP0_SPI_SCn,
|
||||||
|
MPP1_SPI_MOSI,
|
||||||
|
MPP2_SPI_SCK,
|
||||||
|
MPP3_SPI_MISO,
|
||||||
|
MPP4_SATA1_ACTn,
|
||||||
|
MPP5_SATA0_ACTn,
|
||||||
|
MPP8_TW0_SDA,
|
||||||
|
MPP9_TW0_SCK,
|
||||||
|
MPP10_UART0_TXD,
|
||||||
|
MPP11_UART0_RXD,
|
||||||
|
MPP13_UART1_TXD, /* PIC controller */
|
||||||
|
MPP14_UART1_RXD, /* PIC controller */
|
||||||
|
MPP15_GPIO, /* USB Copy button (on devices with 88F6281) */
|
||||||
|
MPP16_GPIO, /* Reset button (on devices with 88F6281) */
|
||||||
|
MPP36_GPIO, /* RAM: 0: 256 MB, 1: 512 MB */
|
||||||
|
MPP37_GPIO, /* Reset button (on devices with 88F6282) */
|
||||||
|
MPP43_GPIO, /* USB Copy button (on devices with 88F6282) */
|
||||||
|
MPP44_GPIO, /* Board ID: 0: TS-11x, 1: TS-21x */
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init qnap_dt_ts219_init(void)
|
||||||
|
{
|
||||||
|
u32 dev, rev;
|
||||||
|
|
||||||
|
kirkwood_mpp_conf(qnap_ts219_mpp_config);
|
||||||
|
|
||||||
|
kirkwood_pcie_id(&dev, &rev);
|
||||||
|
if (dev == MV88F6282_DEV_ID)
|
||||||
|
qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
|
||||||
|
|
||||||
|
kirkwood_ge00_init(&qnap_ts219_ge00_data);
|
||||||
|
kirkwood_ehci_init();
|
||||||
|
|
||||||
|
pm_power_off = qnap_tsx1x_power_off;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */
|
||||||
|
static int __init ts219_pci_init(void)
|
||||||
|
{
|
||||||
|
if (machine_is_ts219())
|
||||||
|
kirkwood_pcie_init(KW_PCIE0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
subsys_initcall(ts219_pci_init);
|
@ -17,6 +17,7 @@
|
|||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/mv643xx_i2c.h>
|
||||||
#include <net/dsa.h>
|
#include <net/dsa.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/timex.h>
|
#include <asm/timex.h>
|
||||||
@ -276,6 +277,7 @@ void __init kirkwood_clk_init(void)
|
|||||||
orion_clkdev_add("0", "pcie", pex0);
|
orion_clkdev_add("0", "pcie", pex0);
|
||||||
orion_clkdev_add("1", "pcie", pex1);
|
orion_clkdev_add("1", "pcie", pex1);
|
||||||
orion_clkdev_add(NULL, "kirkwood-i2s", audio);
|
orion_clkdev_add(NULL, "kirkwood-i2s", audio);
|
||||||
|
orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit);
|
||||||
|
|
||||||
/* Marvell says runit is used by SPI, UART, NAND, TWSI, ...,
|
/* Marvell says runit is used by SPI, UART, NAND, TWSI, ...,
|
||||||
* so should never be gated.
|
* so should never be gated.
|
||||||
|
@ -58,6 +58,11 @@ void dreamplug_init(void);
|
|||||||
#else
|
#else
|
||||||
static inline void dreamplug_init(void) {};
|
static inline void dreamplug_init(void) {};
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_MACH_TS219_DT
|
||||||
|
void qnap_dt_ts219_init(void);
|
||||||
|
#else
|
||||||
|
static inline void qnap_dt_ts219_init(void) {};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_DLINK_KIRKWOOD_DT
|
#ifdef CONFIG_MACH_DLINK_KIRKWOOD_DT
|
||||||
void dnskw_init(void);
|
void dnskw_init(void);
|
||||||
@ -77,6 +82,18 @@ void ib62x0_init(void);
|
|||||||
static inline void ib62x0_init(void) {};
|
static inline void ib62x0_init(void) {};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MACH_GOFLEXNET_DT
|
||||||
|
void goflexnet_init(void);
|
||||||
|
#else
|
||||||
|
static inline void goflexnet_init(void) {};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MACH_LSXL_DT
|
||||||
|
void lsxl_init(void);
|
||||||
|
#else
|
||||||
|
static inline void lsxl_init(void) {};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* early init functions not converted to fdt yet */
|
/* early init functions not converted to fdt yet */
|
||||||
char *kirkwood_id(void);
|
char *kirkwood_id(void);
|
||||||
void kirkwood_l2_init(void);
|
void kirkwood_l2_init(void);
|
||||||
|
@ -9,20 +9,23 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
|
||||||
#include <mach/bridge-regs.h>
|
#include <mach/bridge-regs.h>
|
||||||
#include <plat/irq.h>
|
#include <plat/irq.h>
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static int __initdata gpio0_irqs[4] = {
|
||||||
{
|
IRQ_KIRKWOOD_GPIO_LOW_0_7,
|
||||||
BUG_ON(irq < IRQ_KIRKWOOD_GPIO_LOW_0_7);
|
IRQ_KIRKWOOD_GPIO_LOW_8_15,
|
||||||
BUG_ON(irq > IRQ_KIRKWOOD_GPIO_HIGH_16_23);
|
IRQ_KIRKWOOD_GPIO_LOW_16_23,
|
||||||
|
IRQ_KIRKWOOD_GPIO_LOW_24_31,
|
||||||
|
};
|
||||||
|
|
||||||
orion_gpio_irq_handler((irq - IRQ_KIRKWOOD_GPIO_LOW_0_7) << 3);
|
static int __initdata gpio1_irqs[4] = {
|
||||||
}
|
IRQ_KIRKWOOD_GPIO_HIGH_0_7,
|
||||||
|
IRQ_KIRKWOOD_GPIO_HIGH_8_15,
|
||||||
|
IRQ_KIRKWOOD_GPIO_HIGH_16_23,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
void __init kirkwood_init_irq(void)
|
void __init kirkwood_init_irq(void)
|
||||||
{
|
{
|
||||||
@ -32,17 +35,8 @@ void __init kirkwood_init_irq(void)
|
|||||||
/*
|
/*
|
||||||
* Initialize gpiolib for GPIOs 0-49.
|
* Initialize gpiolib for GPIOs 0-49.
|
||||||
*/
|
*/
|
||||||
orion_gpio_init(0, 32, GPIO_LOW_VIRT_BASE, 0,
|
orion_gpio_init(NULL, 0, 32, (void __iomem *)GPIO_LOW_VIRT_BASE, 0,
|
||||||
IRQ_KIRKWOOD_GPIO_START);
|
IRQ_KIRKWOOD_GPIO_START, gpio0_irqs);
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_0_7, gpio_irq_handler);
|
orion_gpio_init(NULL, 32, 18, (void __iomem *)GPIO_HIGH_VIRT_BASE, 0,
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_8_15, gpio_irq_handler);
|
IRQ_KIRKWOOD_GPIO_START + 32, gpio1_irqs);
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_16_23, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_24_31, gpio_irq_handler);
|
|
||||||
|
|
||||||
orion_gpio_init(32, 18, GPIO_HIGH_VIRT_BASE, 0,
|
|
||||||
IRQ_KIRKWOOD_GPIO_START + 32);
|
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_0_7, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_8_15, gpio_irq_handler);
|
|
||||||
irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_16_23,
|
|
||||||
gpio_irq_handler);
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user