Merge branch 'linux-2.6'
This commit is contained in:
Коммит
9156ad4833
|
@ -527,29 +527,30 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
Format: <area>[,<node>]
|
Format: <area>[,<node>]
|
||||||
See also Documentation/networking/decnet.txt.
|
See also Documentation/networking/decnet.txt.
|
||||||
|
|
||||||
default_blu= [VT]
|
vt.default_blu= [VT]
|
||||||
Format: <blue0>,<blue1>,<blue2>,...,<blue15>
|
Format: <blue0>,<blue1>,<blue2>,...,<blue15>
|
||||||
Change the default blue palette of the console.
|
Change the default blue palette of the console.
|
||||||
This is a 16-member array composed of values
|
This is a 16-member array composed of values
|
||||||
ranging from 0-255.
|
ranging from 0-255.
|
||||||
|
|
||||||
default_grn= [VT]
|
vt.default_grn= [VT]
|
||||||
Format: <green0>,<green1>,<green2>,...,<green15>
|
Format: <green0>,<green1>,<green2>,...,<green15>
|
||||||
Change the default green palette of the console.
|
Change the default green palette of the console.
|
||||||
This is a 16-member array composed of values
|
This is a 16-member array composed of values
|
||||||
ranging from 0-255.
|
ranging from 0-255.
|
||||||
|
|
||||||
default_red= [VT]
|
vt.default_red= [VT]
|
||||||
Format: <red0>,<red1>,<red2>,...,<red15>
|
Format: <red0>,<red1>,<red2>,...,<red15>
|
||||||
Change the default red palette of the console.
|
Change the default red palette of the console.
|
||||||
This is a 16-member array composed of values
|
This is a 16-member array composed of values
|
||||||
ranging from 0-255.
|
ranging from 0-255.
|
||||||
|
|
||||||
default_utf8= [VT]
|
vt.default_utf8=
|
||||||
|
[VT]
|
||||||
Format=<0|1>
|
Format=<0|1>
|
||||||
Set system-wide default UTF-8 mode for all tty's.
|
Set system-wide default UTF-8 mode for all tty's.
|
||||||
Default is 0 and by setting to 1, it enables UTF-8
|
Default is 1, i.e. UTF-8 mode is enabled for all
|
||||||
mode for all newly opened or allocated terminals.
|
newly opened terminals.
|
||||||
|
|
||||||
dhash_entries= [KNL]
|
dhash_entries= [KNL]
|
||||||
Set number of hash buckets for dentry cache.
|
Set number of hash buckets for dentry cache.
|
||||||
|
@ -883,6 +884,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
|
lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
|
||||||
C2 power state.
|
C2 power state.
|
||||||
|
|
||||||
|
libata.dma= [LIBATA] DMA control
|
||||||
|
libata.dma=0 Disable all PATA and SATA DMA
|
||||||
|
libata.dma=1 PATA and SATA Disk DMA only
|
||||||
|
libata.dma=2 ATAPI (CDROM) DMA only
|
||||||
|
libata.dma=4 Compact Flash DMA only
|
||||||
|
Combinations also work, so libata.dma=3 enables DMA
|
||||||
|
for disks and CDROMs, but not CFs.
|
||||||
|
|
||||||
libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
|
libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
|
||||||
when set.
|
when set.
|
||||||
Format: <int>
|
Format: <int>
|
||||||
|
|
|
@ -45,29 +45,6 @@ long fails. The definition looks like :
|
||||||
typedef struct { atomic_long_t a; } local_t;
|
typedef struct { atomic_long_t a; } local_t;
|
||||||
|
|
||||||
|
|
||||||
* Rules to follow when using local atomic operations
|
|
||||||
|
|
||||||
- Variables touched by local ops must be per cpu variables.
|
|
||||||
- _Only_ the CPU owner of these variables must write to them.
|
|
||||||
- This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
|
|
||||||
to update its local_t variables.
|
|
||||||
- Preemption (or interrupts) must be disabled when using local ops in
|
|
||||||
process context to make sure the process won't be migrated to a
|
|
||||||
different CPU between getting the per-cpu variable and doing the
|
|
||||||
actual local op.
|
|
||||||
- When using local ops in interrupt context, no special care must be
|
|
||||||
taken on a mainline kernel, since they will run on the local CPU with
|
|
||||||
preemption already disabled. I suggest, however, to explicitly
|
|
||||||
disable preemption anyway to make sure it will still work correctly on
|
|
||||||
-rt kernels.
|
|
||||||
- Reading the local cpu variable will provide the current copy of the
|
|
||||||
variable.
|
|
||||||
- Reads of these variables can be done from any CPU, because updates to
|
|
||||||
"long", aligned, variables are always atomic. Since no memory
|
|
||||||
synchronization is done by the writer CPU, an outdated copy of the
|
|
||||||
variable can be read when reading some _other_ cpu's variables.
|
|
||||||
|
|
||||||
|
|
||||||
* Rules to follow when using local atomic operations
|
* Rules to follow when using local atomic operations
|
||||||
|
|
||||||
- Variables touched by local ops must be per cpu variables.
|
- Variables touched by local ops must be per cpu variables.
|
||||||
|
|
|
@ -61,7 +61,10 @@ Transmit path guidelines:
|
||||||
2) Do not forget to update netdev->trans_start to jiffies after
|
2) Do not forget to update netdev->trans_start to jiffies after
|
||||||
each new tx packet is given to the hardware.
|
each new tx packet is given to the hardware.
|
||||||
|
|
||||||
3) Do not forget that once you return 0 from your hard_start_xmit
|
3) A hard_start_xmit method must not modify the shared parts of a
|
||||||
|
cloned SKB.
|
||||||
|
|
||||||
|
4) Do not forget that once you return 0 from your hard_start_xmit
|
||||||
method, it is your driver's responsibility to free up the SKB
|
method, it is your driver's responsibility to free up the SKB
|
||||||
and in some finite amount of time.
|
and in some finite amount of time.
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,8 @@ and many Linux driver to support it.
|
||||||
"wavelan" driver (old ISA Wavelan)
|
"wavelan" driver (old ISA Wavelan)
|
||||||
----------------
|
----------------
|
||||||
o Config : Network device -> Wireless LAN -> AT&T WaveLAN
|
o Config : Network device -> Wireless LAN -> AT&T WaveLAN
|
||||||
o Location : .../drivers/net/wavelan*
|
o Location : .../drivers/net/wireless/wavelan*
|
||||||
o in-line doc : .../drivers/net/wavelan.p.h
|
o in-line doc : .../drivers/net/wireless/wavelan.p.h
|
||||||
o on-line doc :
|
o on-line doc :
|
||||||
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
|
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
|
||||||
|
|
||||||
|
|
|
@ -97,10 +97,6 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
|
||||||
autoconfiguration will take place. The most common way to use this
|
autoconfiguration will take place. The most common way to use this
|
||||||
is "ip=dhcp".
|
is "ip=dhcp".
|
||||||
|
|
||||||
Note that "ip=off" is not the same thing as "ip=::::::off", because in
|
|
||||||
the latter autoconfiguration will take place if any of DHCP, BOOTP or RARP
|
|
||||||
are compiled in the kernel.
|
|
||||||
|
|
||||||
<client-ip> IP address of the client.
|
<client-ip> IP address of the client.
|
||||||
|
|
||||||
Default: Determined using autoconfiguration.
|
Default: Determined using autoconfiguration.
|
||||||
|
@ -149,7 +145,9 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
|
||||||
this option.
|
this option.
|
||||||
|
|
||||||
off or none: don't use autoconfiguration
|
off or none: don't use autoconfiguration
|
||||||
|
(do static IP assignment instead)
|
||||||
on or any: use any protocol available in the kernel
|
on or any: use any protocol available in the kernel
|
||||||
|
(default)
|
||||||
dhcp: use DHCP
|
dhcp: use DHCP
|
||||||
bootp: use BOOTP
|
bootp: use BOOTP
|
||||||
rarp: use RARP
|
rarp: use RARP
|
||||||
|
|
|
@ -42,23 +42,27 @@ like this source file: see Documentation/watchdog/src/watchdog-simple.c
|
||||||
A more advanced driver could for example check that a HTTP server is
|
A more advanced driver could for example check that a HTTP server is
|
||||||
still responding before doing the write call to ping the watchdog.
|
still responding before doing the write call to ping the watchdog.
|
||||||
|
|
||||||
When the device is closed, the watchdog is disabled. This is not
|
When the device is closed, the watchdog is disabled, unless the "Magic
|
||||||
always such a good idea, since if there is a bug in the watchdog
|
Close" feature is supported (see below). This is not always such a
|
||||||
daemon and it crashes the system will not reboot. Because of this,
|
good idea, since if there is a bug in the watchdog daemon and it
|
||||||
some of the drivers support the configuration option "Disable watchdog
|
crashes the system will not reboot. Because of this, some of the
|
||||||
shutdown on close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when
|
drivers support the configuration option "Disable watchdog shutdown on
|
||||||
compiling the kernel, there is no way of disabling the watchdog once
|
close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when compiling
|
||||||
it has been started. So, if the watchdog daemon crashes, the system
|
the kernel, there is no way of disabling the watchdog once it has been
|
||||||
will reboot after the timeout has passed. Watchdog devices also usually
|
started. So, if the watchdog daemon crashes, the system will reboot
|
||||||
support the nowayout module parameter so that this option can be controlled
|
after the timeout has passed. Watchdog devices also usually support
|
||||||
at runtime.
|
the nowayout module parameter so that this option can be controlled at
|
||||||
|
runtime.
|
||||||
|
|
||||||
Drivers will not disable the watchdog, unless a specific magic character 'V'
|
Magic Close feature:
|
||||||
has been sent /dev/watchdog just before closing the file. If the userspace
|
|
||||||
daemon closes the file without sending this special character, the driver
|
If a driver supports "Magic Close", the driver will not disable the
|
||||||
will assume that the daemon (and userspace in general) died, and will stop
|
watchdog unless a specific magic character 'V' has been sent to
|
||||||
pinging the watchdog without disabling it first. This will then cause a
|
/dev/watchdog just before closing the file. If the userspace daemon
|
||||||
reboot if the watchdog is not re-opened in sufficient time.
|
closes the file without sending this special character, the driver
|
||||||
|
will assume that the daemon (and userspace in general) died, and will
|
||||||
|
stop pinging the watchdog without disabling it first. This will then
|
||||||
|
cause a reboot if the watchdog is not re-opened in sufficient time.
|
||||||
|
|
||||||
The ioctl API:
|
The ioctl API:
|
||||||
|
|
||||||
|
|
56
MAINTAINERS
56
MAINTAINERS
|
@ -665,12 +665,18 @@ S: Maintained
|
||||||
|
|
||||||
ATMEL AT91 MCI DRIVER
|
ATMEL AT91 MCI DRIVER
|
||||||
P: Nicolas Ferre
|
P: Nicolas Ferre
|
||||||
M: nicolas.ferre@rfo.atmel.com
|
M: nicolas.ferre@atmel.com
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
W: http://www.atmel.com/products/AT91/
|
W: http://www.atmel.com/products/AT91/
|
||||||
W: http://www.at91.com/
|
W: http://www.at91.com/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ATMEL LCDFB DRIVER
|
||||||
|
P: Nicolas Ferre
|
||||||
|
M: nicolas.ferre@atmel.com
|
||||||
|
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ATMEL MACB ETHERNET DRIVER
|
ATMEL MACB ETHERNET DRIVER
|
||||||
P: Haavard Skinnemoen
|
P: Haavard Skinnemoen
|
||||||
M: hskinnemoen@atmel.com
|
M: hskinnemoen@atmel.com
|
||||||
|
@ -1870,8 +1876,10 @@ T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
IDE/ATAPI CDROM DRIVER
|
IDE/ATAPI CDROM DRIVER
|
||||||
|
P: Borislav Petkov
|
||||||
|
M: bbpetkov@yahoo.de
|
||||||
L: linux-ide@vger.kernel.org
|
L: linux-ide@vger.kernel.org
|
||||||
S: Unmaintained
|
S: Maintained
|
||||||
|
|
||||||
IDE/ATAPI FLOPPY DRIVERS
|
IDE/ATAPI FLOPPY DRIVERS
|
||||||
P: Paul Bristow
|
P: Paul Bristow
|
||||||
|
@ -1917,7 +1925,7 @@ INFINIBAND SUBSYSTEM
|
||||||
P: Roland Dreier
|
P: Roland Dreier
|
||||||
M: rolandd@cisco.com
|
M: rolandd@cisco.com
|
||||||
P: Sean Hefty
|
P: Sean Hefty
|
||||||
M: mshefty@ichips.intel.com
|
M: sean.hefty@intel.com
|
||||||
P: Hal Rosenstock
|
P: Hal Rosenstock
|
||||||
M: hal.rosenstock@gmail.com
|
M: hal.rosenstock@gmail.com
|
||||||
L: general@lists.openfabrics.org
|
L: general@lists.openfabrics.org
|
||||||
|
@ -1982,29 +1990,27 @@ L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
INTEL PRO/100 ETHERNET SUPPORT
|
INTEL PRO/100 ETHERNET SUPPORT
|
||||||
P: John Ronciak
|
P: Auke Kok
|
||||||
M: john.ronciak@intel.com
|
M: auke-jan.h.kok@intel.com
|
||||||
P: Jesse Brandeburg
|
P: Jesse Brandeburg
|
||||||
M: jesse.brandeburg@intel.com
|
M: jesse.brandeburg@intel.com
|
||||||
P: Jeff Kirsher
|
P: Jeff Kirsher
|
||||||
M: jeffrey.t.kirsher@intel.com
|
M: jeffrey.t.kirsher@intel.com
|
||||||
P: Auke Kok
|
P: John Ronciak
|
||||||
M: auke-jan.h.kok@intel.com
|
M: john.ronciak@intel.com
|
||||||
L: e1000-devel@lists.sourceforge.net
|
L: e1000-devel@lists.sourceforge.net
|
||||||
W: http://sourceforge.net/projects/e1000/
|
W: http://sourceforge.net/projects/e1000/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
|
INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
|
||||||
P: Jeb Cramer
|
P: Auke Kok
|
||||||
M: cramerj@intel.com
|
M: auke-jan.h.kok@intel.com
|
||||||
P: John Ronciak
|
|
||||||
M: john.ronciak@intel.com
|
|
||||||
P: Jesse Brandeburg
|
P: Jesse Brandeburg
|
||||||
M: jesse.brandeburg@intel.com
|
M: jesse.brandeburg@intel.com
|
||||||
P: Jeff Kirsher
|
P: Jeff Kirsher
|
||||||
M: jeffrey.t.kirsher@intel.com
|
M: jeffrey.t.kirsher@intel.com
|
||||||
P: Auke Kok
|
P: John Ronciak
|
||||||
M: auke-jan.h.kok@intel.com
|
M: john.ronciak@intel.com
|
||||||
L: e1000-devel@lists.sourceforge.net
|
L: e1000-devel@lists.sourceforge.net
|
||||||
W: http://sourceforge.net/projects/e1000/
|
W: http://sourceforge.net/projects/e1000/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -2029,7 +2035,7 @@ P: James Ketrenos
|
||||||
M: jketreno@linux.intel.com
|
M: jketreno@linux.intel.com
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: ipw2100-devel@lists.sourceforge.net
|
L: ipw2100-devel@lists.sourceforge.net
|
||||||
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||||
W: http://ipw2100.sourceforge.net
|
W: http://ipw2100.sourceforge.net
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -2040,7 +2046,7 @@ P: James Ketrenos
|
||||||
M: jketreno@linux.intel.com
|
M: jketreno@linux.intel.com
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: ipw2100-devel@lists.sourceforge.net
|
L: ipw2100-devel@lists.sourceforge.net
|
||||||
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||||
W: http://ipw2200.sourceforge.net
|
W: http://ipw2200.sourceforge.net
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -2597,7 +2603,7 @@ S: Maintained
|
||||||
MSI LAPTOP SUPPORT
|
MSI LAPTOP SUPPORT
|
||||||
P: Lennart Poettering
|
P: Lennart Poettering
|
||||||
M: mzxreary@0pointer.de
|
M: mzxreary@0pointer.de
|
||||||
L: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
||||||
W: http://0pointer.de/lennart/tchibo.html
|
W: http://0pointer.de/lennart/tchibo.html
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2739,8 +2745,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
NETXEN (1/10) GbE SUPPORT
|
NETXEN (1/10) GbE SUPPORT
|
||||||
P: Amit S. Kale
|
P: Dhananjay Phadke
|
||||||
M: amitkale@netxen.com
|
M: dhananjay@netxen.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.netxen.com
|
W: http://www.netxen.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -3611,8 +3617,10 @@ L: linux-kernel@vger.kernel.org ?
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
SPIDERNET NETWORK DRIVER for CELL
|
SPIDERNET NETWORK DRIVER for CELL
|
||||||
P: Linas Vepstas
|
P: Ishizaki Kou
|
||||||
M: linas@austin.ibm.com
|
M: kou.ishizaki@toshiba.co.jp
|
||||||
|
P: Jens Osterkamp
|
||||||
|
M: jens@de.ibm.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -4054,6 +4062,14 @@ L: user-mode-linux-user@lists.sourceforge.net
|
||||||
W: http://user-mode-linux.sourceforge.net
|
W: http://user-mode-linux.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
USERSPACE I/O (UIO)
|
||||||
|
P: Hans J. Koch
|
||||||
|
M: hjk@linutronix.de
|
||||||
|
P: Greg Kroah-Hartman
|
||||||
|
M: gregkh@suse.de
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
FAT/VFAT/MSDOS FILESYSTEM:
|
FAT/VFAT/MSDOS FILESYSTEM:
|
||||||
P: OGAWA Hirofumi
|
P: OGAWA Hirofumi
|
||||||
M: hirofumi@mail.parknet.co.jp
|
M: hirofumi@mail.parknet.co.jp
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 24
|
SUBLEVEL = 24
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc8
|
||||||
NAME = Arr Matey! A Hairy Bilge Rat!
|
NAME = Arr Matey! A Hairy Bilge Rat!
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -12,7 +12,7 @@ NAME = Arr Matey! A Hairy Bilge Rat!
|
||||||
|
|
||||||
# Do not:
|
# Do not:
|
||||||
# o use make's built-in rules and variables
|
# o use make's built-in rules and variables
|
||||||
# (this increases performance and avoid hard-to-debug behavour);
|
# (this increases performance and avoids hard-to-debug behaviour);
|
||||||
# o print "Entering directory ...";
|
# o print "Entering directory ...";
|
||||||
MAKEFLAGS += -rR --no-print-directory
|
MAKEFLAGS += -rR --no-print-directory
|
||||||
|
|
||||||
|
@ -1329,7 +1329,7 @@ else
|
||||||
ALLINCLUDE_ARCHS := $(SRCARCH)
|
ALLINCLUDE_ARCHS := $(SRCARCH)
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour.
|
#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
|
||||||
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
|
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
i386
|
||||||
|
x86_64
|
|
@ -225,7 +225,7 @@ alpha_fp_emul (unsigned long pc)
|
||||||
FP_UNPACK_SP(SB, &vb);
|
FP_UNPACK_SP(SB, &vb);
|
||||||
DR_c = DB_c;
|
DR_c = DB_c;
|
||||||
DR_s = DB_s;
|
DR_s = DB_s;
|
||||||
DR_e = DB_e;
|
DR_e = DB_e + (1024 - 128);
|
||||||
DR_f = SB_f << (52 - 23);
|
DR_f = SB_f << (52 - 23);
|
||||||
goto pack_d;
|
goto pack_d;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1072,11 +1072,13 @@ source "drivers/rtc/Kconfig"
|
||||||
|
|
||||||
source "drivers/dma/Kconfig"
|
source "drivers/dma/Kconfig"
|
||||||
|
|
||||||
|
source "drivers/dca/Kconfig"
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "fs/Kconfig"
|
source "fs/Kconfig"
|
||||||
|
|
||||||
source "kernel/Kconfig.instrumentation"
|
source "arch/arm/Kconfig.instrumentation"
|
||||||
|
|
||||||
source "arch/arm/Kconfig.debug"
|
source "arch/arm/Kconfig.debug"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
menuconfig INSTRUMENTATION
|
||||||
|
bool "Instrumentation Support"
|
||||||
|
default y
|
||||||
|
---help---
|
||||||
|
Say Y here to get to see options related to performance measurement,
|
||||||
|
system-wide debugging, and testing. This option alone does not add any
|
||||||
|
kernel code.
|
||||||
|
|
||||||
|
If you say N, all options in this submenu will be skipped and
|
||||||
|
disabled. If you're trying to debug the kernel itself, go see the
|
||||||
|
Kernel Hacking menu.
|
||||||
|
|
||||||
|
if INSTRUMENTATION
|
||||||
|
|
||||||
|
config PROFILING
|
||||||
|
bool "Profiling support (EXPERIMENTAL)"
|
||||||
|
help
|
||||||
|
Say Y here to enable the extended profiling support mechanisms used
|
||||||
|
by profilers such as OProfile.
|
||||||
|
|
||||||
|
config OPROFILE
|
||||||
|
tristate "OProfile system profiling (EXPERIMENTAL)"
|
||||||
|
depends on PROFILING && !UML
|
||||||
|
help
|
||||||
|
OProfile is a profiling system capable of profiling the
|
||||||
|
whole system, include the kernel, kernel modules, libraries,
|
||||||
|
and applications.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
|
config OPROFILE_ARMV6
|
||||||
|
bool
|
||||||
|
depends on OPROFILE && CPU_V6 && !SMP
|
||||||
|
default y
|
||||||
|
select OPROFILE_ARM11_CORE
|
||||||
|
|
||||||
|
config OPROFILE_MPCORE
|
||||||
|
bool
|
||||||
|
depends on OPROFILE && CPU_V6 && SMP
|
||||||
|
default y
|
||||||
|
select OPROFILE_ARM11_CORE
|
||||||
|
|
||||||
|
config OPROFILE_ARM11_CORE
|
||||||
|
bool
|
||||||
|
|
||||||
|
config MARKERS
|
||||||
|
bool "Activate markers"
|
||||||
|
help
|
||||||
|
Place an empty function call at each marker site. Can be
|
||||||
|
dynamically changed for a probe function.
|
||||||
|
|
||||||
|
endif # INSTRUMENTATION
|
|
@ -109,6 +109,15 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("ics1523", 0x26),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("dac3550", 0x4d),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#define EK_FLASH_BASE AT91_CHIPSELECT_0
|
#define EK_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define EK_FLASH_SIZE 0x200000
|
#define EK_FLASH_SIZE 0x200000
|
||||||
|
|
||||||
|
|
|
@ -40,31 +40,29 @@ static int fsample_keymap[] = {
|
||||||
KEY(0,1,KEY_RIGHT),
|
KEY(0,1,KEY_RIGHT),
|
||||||
KEY(0,2,KEY_LEFT),
|
KEY(0,2,KEY_LEFT),
|
||||||
KEY(0,3,KEY_DOWN),
|
KEY(0,3,KEY_DOWN),
|
||||||
KEY(0,4,KEY_CENTER),
|
KEY(0,4,KEY_ENTER),
|
||||||
KEY(0,5,KEY_0_5),
|
KEY(1,0,KEY_F10),
|
||||||
KEY(1,0,KEY_SOFT2),
|
|
||||||
KEY(1,1,KEY_SEND),
|
KEY(1,1,KEY_SEND),
|
||||||
KEY(1,2,KEY_END),
|
KEY(1,2,KEY_END),
|
||||||
KEY(1,3,KEY_VOLUMEDOWN),
|
KEY(1,3,KEY_VOLUMEDOWN),
|
||||||
KEY(1,4,KEY_VOLUMEUP),
|
KEY(1,4,KEY_VOLUMEUP),
|
||||||
KEY(1,5,KEY_RECORD),
|
KEY(1,5,KEY_RECORD),
|
||||||
KEY(2,0,KEY_SOFT1),
|
KEY(2,0,KEY_F9),
|
||||||
KEY(2,1,KEY_3),
|
KEY(2,1,KEY_3),
|
||||||
KEY(2,2,KEY_6),
|
KEY(2,2,KEY_6),
|
||||||
KEY(2,3,KEY_9),
|
KEY(2,3,KEY_9),
|
||||||
KEY(2,4,KEY_SHARP),
|
KEY(2,4,KEY_KPDOT),
|
||||||
KEY(2,5,KEY_2_5),
|
|
||||||
KEY(3,0,KEY_BACK),
|
KEY(3,0,KEY_BACK),
|
||||||
KEY(3,1,KEY_2),
|
KEY(3,1,KEY_2),
|
||||||
KEY(3,2,KEY_5),
|
KEY(3,2,KEY_5),
|
||||||
KEY(3,3,KEY_8),
|
KEY(3,3,KEY_8),
|
||||||
KEY(3,4,KEY_0),
|
KEY(3,4,KEY_0),
|
||||||
KEY(3,5,KEY_HEADSETHOOK),
|
KEY(3,5,KEY_KPSLASH),
|
||||||
KEY(4,0,KEY_HOME),
|
KEY(4,0,KEY_HOME),
|
||||||
KEY(4,1,KEY_1),
|
KEY(4,1,KEY_1),
|
||||||
KEY(4,2,KEY_4),
|
KEY(4,2,KEY_4),
|
||||||
KEY(4,3,KEY_7),
|
KEY(4,3,KEY_7),
|
||||||
KEY(4,4,KEY_STAR),
|
KEY(4,4,KEY_KPASTERISK),
|
||||||
KEY(4,5,KEY_POWER),
|
KEY(4,5,KEY_POWER),
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
|
@ -36,8 +36,6 @@
|
||||||
#include <asm/arch/omapfb.h>
|
#include <asm/arch/omapfb.h>
|
||||||
#include <asm/arch/lcd_mipid.h>
|
#include <asm/arch/lcd_mipid.h>
|
||||||
|
|
||||||
#include "../plat-omap/dsp/dsp_common.h"
|
|
||||||
|
|
||||||
#define ADS7846_PENDOWN_GPIO 15
|
#define ADS7846_PENDOWN_GPIO 15
|
||||||
|
|
||||||
static void __init omap_nokia770_init_irq(void)
|
static void __init omap_nokia770_init_irq(void)
|
||||||
|
@ -318,6 +316,8 @@ static __init int omap_dsp_init(void)
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define omap_dsp_init() do {} while (0)
|
||||||
#endif /* CONFIG_OMAP_DSP */
|
#endif /* CONFIG_OMAP_DSP */
|
||||||
|
|
||||||
static void __init omap_nokia770_init(void)
|
static void __init omap_nokia770_init(void)
|
||||||
|
|
|
@ -39,31 +39,29 @@ static int p2_keymap[] = {
|
||||||
KEY(0,1,KEY_RIGHT),
|
KEY(0,1,KEY_RIGHT),
|
||||||
KEY(0,2,KEY_LEFT),
|
KEY(0,2,KEY_LEFT),
|
||||||
KEY(0,3,KEY_DOWN),
|
KEY(0,3,KEY_DOWN),
|
||||||
KEY(0,4,KEY_CENTER),
|
KEY(0,4,KEY_ENTER),
|
||||||
KEY(0,5,KEY_0_5),
|
KEY(1,0,KEY_F10),
|
||||||
KEY(1,0,KEY_SOFT2),
|
|
||||||
KEY(1,1,KEY_SEND),
|
KEY(1,1,KEY_SEND),
|
||||||
KEY(1,2,KEY_END),
|
KEY(1,2,KEY_END),
|
||||||
KEY(1,3,KEY_VOLUMEDOWN),
|
KEY(1,3,KEY_VOLUMEDOWN),
|
||||||
KEY(1,4,KEY_VOLUMEUP),
|
KEY(1,4,KEY_VOLUMEUP),
|
||||||
KEY(1,5,KEY_RECORD),
|
KEY(1,5,KEY_RECORD),
|
||||||
KEY(2,0,KEY_SOFT1),
|
KEY(2,0,KEY_F9),
|
||||||
KEY(2,1,KEY_3),
|
KEY(2,1,KEY_3),
|
||||||
KEY(2,2,KEY_6),
|
KEY(2,2,KEY_6),
|
||||||
KEY(2,3,KEY_9),
|
KEY(2,3,KEY_9),
|
||||||
KEY(2,4,KEY_SHARP),
|
KEY(2,4,KEY_KPDOT),
|
||||||
KEY(2,5,KEY_2_5),
|
|
||||||
KEY(3,0,KEY_BACK),
|
KEY(3,0,KEY_BACK),
|
||||||
KEY(3,1,KEY_2),
|
KEY(3,1,KEY_2),
|
||||||
KEY(3,2,KEY_5),
|
KEY(3,2,KEY_5),
|
||||||
KEY(3,3,KEY_8),
|
KEY(3,3,KEY_8),
|
||||||
KEY(3,4,KEY_0),
|
KEY(3,4,KEY_0),
|
||||||
KEY(3,5,KEY_HEADSETHOOK),
|
KEY(3,5,KEY_KPSLASH),
|
||||||
KEY(4,0,KEY_HOME),
|
KEY(4,0,KEY_HOME),
|
||||||
KEY(4,1,KEY_1),
|
KEY(4,1,KEY_1),
|
||||||
KEY(4,2,KEY_4),
|
KEY(4,2,KEY_4),
|
||||||
KEY(4,3,KEY_7),
|
KEY(4,3,KEY_7),
|
||||||
KEY(4,4,KEY_STAR),
|
KEY(4,4,KEY_KPASTERISK),
|
||||||
KEY(4,5,KEY_POWER),
|
KEY(4,5,KEY_POWER),
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
|
@ -178,13 +178,19 @@ static void pxa25x_cpu_pm_save(unsigned long *sleep_save)
|
||||||
SAVE(GAFR1_L); SAVE(GAFR1_U);
|
SAVE(GAFR1_L); SAVE(GAFR1_U);
|
||||||
SAVE(GAFR2_L); SAVE(GAFR2_U);
|
SAVE(GAFR2_L); SAVE(GAFR2_U);
|
||||||
|
|
||||||
SAVE(ICMR);
|
SAVE(ICMR); ICMR = 0;
|
||||||
SAVE(CKEN);
|
SAVE(CKEN);
|
||||||
SAVE(PSTR);
|
SAVE(PSTR);
|
||||||
|
|
||||||
|
/* Clear GPIO transition detect bits */
|
||||||
|
GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
|
static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
|
||||||
{
|
{
|
||||||
|
/* ensure not to come back here if it wasn't intended */
|
||||||
|
PSPR = 0;
|
||||||
|
|
||||||
/* restore registers */
|
/* restore registers */
|
||||||
RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
|
RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
|
||||||
RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
|
RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
|
||||||
|
@ -195,7 +201,12 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
|
||||||
RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
|
RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
|
||||||
RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
|
RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
|
||||||
|
|
||||||
|
PSSR = PSSR_RDH | PSSR_PH;
|
||||||
|
|
||||||
RESTORE(CKEN);
|
RESTORE(CKEN);
|
||||||
|
|
||||||
|
ICLR = 0;
|
||||||
|
ICCR = 1;
|
||||||
RESTORE(ICMR);
|
RESTORE(ICMR);
|
||||||
RESTORE(PSTR);
|
RESTORE(PSTR);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,11 +43,11 @@ pxa_cpu_save_cp:
|
||||||
pxa_cpu_save_sp:
|
pxa_cpu_save_sp:
|
||||||
@ preserve phys address of stack
|
@ preserve phys address of stack
|
||||||
mov r0, sp
|
mov r0, sp
|
||||||
mov r2, lr
|
str lr, [sp, #-4]!
|
||||||
bl sleep_phys_sp
|
bl sleep_phys_sp
|
||||||
ldr r1, =sleep_save_sp
|
ldr r1, =sleep_save_sp
|
||||||
str r0, [r1]
|
str r0, [r1]
|
||||||
mov pc, r2
|
ldr pc, [sp], #4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pxa27x_cpu_suspend()
|
* pxa27x_cpu_suspend()
|
||||||
|
@ -270,5 +270,3 @@ resume_after_mmu:
|
||||||
mar acc0, r2, r3
|
mar acc0, r2, r3
|
||||||
#endif
|
#endif
|
||||||
ldmfd sp!, {r4 - r12, pc} @ return to caller
|
ldmfd sp!, {r4 - r12, pc} @ return to caller
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -361,10 +361,12 @@ u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand);
|
||||||
* OP_SCALAR - this operation always operates in scalar mode
|
* OP_SCALAR - this operation always operates in scalar mode
|
||||||
* OP_SD - the instruction exceptionally writes to a single precision result.
|
* OP_SD - the instruction exceptionally writes to a single precision result.
|
||||||
* OP_DD - the instruction exceptionally writes to a double precision result.
|
* OP_DD - the instruction exceptionally writes to a double precision result.
|
||||||
|
* OP_SM - the instruction exceptionally reads from a single precision operand.
|
||||||
*/
|
*/
|
||||||
#define OP_SCALAR (1 << 0)
|
#define OP_SCALAR (1 << 0)
|
||||||
#define OP_SD (1 << 1)
|
#define OP_SD (1 << 1)
|
||||||
#define OP_DD (1 << 1)
|
#define OP_DD (1 << 1)
|
||||||
|
#define OP_SM (1 << 2)
|
||||||
|
|
||||||
struct op {
|
struct op {
|
||||||
u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);
|
u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);
|
||||||
|
|
|
@ -668,8 +668,8 @@ static struct op fops_ext[32] = {
|
||||||
[FEXT_TO_IDX(FEXT_FCMPZ)] = { vfp_double_fcmpz, OP_SCALAR },
|
[FEXT_TO_IDX(FEXT_FCMPZ)] = { vfp_double_fcmpz, OP_SCALAR },
|
||||||
[FEXT_TO_IDX(FEXT_FCMPEZ)] = { vfp_double_fcmpez, OP_SCALAR },
|
[FEXT_TO_IDX(FEXT_FCMPEZ)] = { vfp_double_fcmpez, OP_SCALAR },
|
||||||
[FEXT_TO_IDX(FEXT_FCVT)] = { vfp_double_fcvts, OP_SCALAR|OP_SD },
|
[FEXT_TO_IDX(FEXT_FCVT)] = { vfp_double_fcvts, OP_SCALAR|OP_SD },
|
||||||
[FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR },
|
[FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR|OP_SM },
|
||||||
[FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR },
|
[FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR|OP_SM },
|
||||||
[FEXT_TO_IDX(FEXT_FTOUI)] = { vfp_double_ftoui, OP_SCALAR|OP_SD },
|
[FEXT_TO_IDX(FEXT_FTOUI)] = { vfp_double_ftoui, OP_SCALAR|OP_SD },
|
||||||
[FEXT_TO_IDX(FEXT_FTOUIZ)] = { vfp_double_ftouiz, OP_SCALAR|OP_SD },
|
[FEXT_TO_IDX(FEXT_FTOUIZ)] = { vfp_double_ftouiz, OP_SCALAR|OP_SD },
|
||||||
[FEXT_TO_IDX(FEXT_FTOSI)] = { vfp_double_ftosi, OP_SCALAR|OP_SD },
|
[FEXT_TO_IDX(FEXT_FTOSI)] = { vfp_double_ftosi, OP_SCALAR|OP_SD },
|
||||||
|
@ -1128,7 +1128,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
|
||||||
u32 exceptions = 0;
|
u32 exceptions = 0;
|
||||||
unsigned int dest;
|
unsigned int dest;
|
||||||
unsigned int dn = vfp_get_dn(inst);
|
unsigned int dn = vfp_get_dn(inst);
|
||||||
unsigned int dm = vfp_get_dm(inst);
|
unsigned int dm;
|
||||||
unsigned int vecitr, veclen, vecstride;
|
unsigned int vecitr, veclen, vecstride;
|
||||||
struct op *fop;
|
struct op *fop;
|
||||||
|
|
||||||
|
@ -1145,6 +1145,14 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
|
||||||
else
|
else
|
||||||
dest = vfp_get_dd(inst);
|
dest = vfp_get_dd(inst);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* f[us]ito takes a sN operand, not a dN operand.
|
||||||
|
*/
|
||||||
|
if (fop->flags & OP_SM)
|
||||||
|
dm = vfp_get_sm(inst);
|
||||||
|
else
|
||||||
|
dm = vfp_get_dm(inst);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If destination bank is zero, vector length is always '1'.
|
* If destination bank is zero, vector length is always '1'.
|
||||||
* ARM DDI0100F C5.1.3, C5.3.2.
|
* ARM DDI0100F C5.1.3, C5.3.2.
|
||||||
|
|
|
@ -65,6 +65,10 @@ config GENERIC_CALIBRATE_DELAY
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config HARDWARE_PM
|
||||||
|
def_bool y
|
||||||
|
depends on OPROFILE
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
source "kernel/Kconfig.preempt"
|
source "kernel/Kconfig.preempt"
|
||||||
|
|
||||||
|
|
|
@ -6,136 +6,9 @@
|
||||||
*!
|
*!
|
||||||
*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init
|
*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init
|
||||||
*!
|
*!
|
||||||
*! $Log: ds1302.c,v $
|
|
||||||
*! Revision 1.18 2005/01/24 09:11:26 mikaelam
|
|
||||||
*! Minor changes to get DS1302 RTC chip driver to work
|
|
||||||
*!
|
|
||||||
*! Revision 1.17 2005/01/05 06:11:22 starvik
|
|
||||||
*! No need to do local_irq_disable after local_irq_save.
|
|
||||||
*!
|
|
||||||
*! Revision 1.16 2004/12/13 12:21:52 starvik
|
|
||||||
*! Added I/O and DMA allocators from Linux 2.4
|
|
||||||
*!
|
|
||||||
*! Revision 1.14 2004/08/24 06:48:43 starvik
|
|
||||||
*! Whitespace cleanup
|
|
||||||
*!
|
|
||||||
*! Revision 1.13 2004/05/28 09:26:59 starvik
|
|
||||||
*! Modified I2C initialization to work in 2.6.
|
|
||||||
*!
|
|
||||||
*! Revision 1.12 2004/05/14 07:58:03 starvik
|
|
||||||
*! Merge of changes from 2.4
|
|
||||||
*!
|
|
||||||
*! Revision 1.10 2004/02/04 09:25:12 starvik
|
|
||||||
*! Merge of Linux 2.6.2
|
|
||||||
*!
|
|
||||||
*! Revision 1.9 2003/07/04 08:27:37 starvik
|
|
||||||
*! Merge of Linux 2.5.74
|
|
||||||
*!
|
|
||||||
*! Revision 1.8 2003/04/09 05:20:47 starvik
|
|
||||||
*! Merge of Linux 2.5.67
|
|
||||||
*!
|
|
||||||
*! Revision 1.6 2003/01/09 14:42:51 starvik
|
|
||||||
*! Merge of Linux 2.5.55
|
|
||||||
*!
|
|
||||||
*! Revision 1.4 2002/12/11 13:13:57 starvik
|
|
||||||
*! Added arch/ to v10 specific includes
|
|
||||||
*! Added fix from Linux 2.4 in serial.c (flush_to_flip_buffer)
|
|
||||||
*!
|
|
||||||
*! Revision 1.3 2002/11/20 11:56:10 starvik
|
|
||||||
*! Merge of Linux 2.5.48
|
|
||||||
*!
|
|
||||||
*! Revision 1.2 2002/11/18 13:16:06 starvik
|
|
||||||
*! Linux 2.5 port of latest 2.4 drivers
|
|
||||||
*!
|
|
||||||
*! Revision 1.15 2002/10/11 16:14:33 johana
|
|
||||||
*! Added CONFIG_ETRAX_DS1302_TRICKLE_CHARGE and initial setting of the
|
|
||||||
*! trcklecharge register.
|
|
||||||
*!
|
|
||||||
*! Revision 1.14 2002/10/10 12:15:38 magnusmn
|
|
||||||
*! Added support for having the RST signal on bit g0
|
|
||||||
*!
|
|
||||||
*! Revision 1.13 2002/05/29 15:16:08 johana
|
|
||||||
*! Removed unused variables.
|
|
||||||
*!
|
|
||||||
*! Revision 1.12 2002/04/10 15:35:25 johana
|
|
||||||
*! Moved probe function closer to init function and marked it __init.
|
|
||||||
*!
|
|
||||||
*! Revision 1.11 2001/06/14 12:35:52 jonashg
|
|
||||||
*! The ATA hack is back. It is unfortunately the only way to set g27 to output.
|
|
||||||
*!
|
|
||||||
*! Revision 1.9 2001/06/14 10:00:14 jonashg
|
|
||||||
*! No need for tempudelay to be inline anymore (had to adjust the usec to
|
|
||||||
*! loops conversion because of this to make it slow enough to be a udelay).
|
|
||||||
*!
|
|
||||||
*! Revision 1.8 2001/06/14 08:06:32 jonashg
|
|
||||||
*! Made tempudelay delay usecs (well, just a tad more).
|
|
||||||
*!
|
|
||||||
*! Revision 1.7 2001/06/13 14:18:11 jonashg
|
|
||||||
*! Only allow processes with SYS_TIME capability to set time and charge.
|
|
||||||
*!
|
|
||||||
*! Revision 1.6 2001/06/12 15:22:07 jonashg
|
|
||||||
*! * Made init function __init.
|
|
||||||
*! * Parameter to out_byte() is unsigned char.
|
|
||||||
*! * The magic number 42 has got a name.
|
|
||||||
*! * Removed comment about /proc (nothing is exported there).
|
|
||||||
*!
|
|
||||||
*! Revision 1.5 2001/06/12 14:35:13 jonashg
|
|
||||||
*! Gave the module a name and added it to printk's.
|
|
||||||
*!
|
|
||||||
*! Revision 1.4 2001/05/31 14:53:40 jonashg
|
|
||||||
*! Made tempudelay() inline so that the watchdog doesn't reset (see
|
|
||||||
*! function comment).
|
|
||||||
*!
|
|
||||||
*! Revision 1.3 2001/03/26 16:03:06 bjornw
|
|
||||||
*! Needs linux/config.h
|
|
||||||
*!
|
|
||||||
*! Revision 1.2 2001/03/20 19:42:00 bjornw
|
|
||||||
*! Use the ETRAX prefix on the DS1302 options
|
|
||||||
*!
|
|
||||||
*! Revision 1.1 2001/03/20 09:13:50 magnusmn
|
|
||||||
*! Linux 2.4 port
|
|
||||||
*!
|
|
||||||
*! Revision 1.10 2000/07/05 15:38:23 bjornw
|
|
||||||
*! Dont update kernel time when a RTC_SET_TIME is done
|
|
||||||
*!
|
|
||||||
*! Revision 1.9 2000/03/02 15:42:59 macce
|
|
||||||
*! * Hack to make RTC work on all 2100/2400
|
|
||||||
*!
|
|
||||||
*! Revision 1.8 2000/02/23 16:59:18 torbjore
|
|
||||||
*! added setup of R_GEN_CONFIG when RTC is connected to the generic port.
|
|
||||||
*!
|
|
||||||
*! Revision 1.7 2000/01/17 15:51:43 johana
|
|
||||||
*! Added RTC_SET_CHARGE ioctl to enable trickle charger.
|
|
||||||
*!
|
|
||||||
*! Revision 1.6 1999/10/27 13:19:47 bjornw
|
|
||||||
*! Added update_xtime_from_cmos which reads back the updated RTC into the kernel.
|
|
||||||
*! /dev/rtc calls it now.
|
|
||||||
*!
|
|
||||||
*! Revision 1.5 1999/10/27 12:39:37 bjornw
|
|
||||||
*! Disabled superuser check. Anyone can now set the time.
|
|
||||||
*!
|
|
||||||
*! Revision 1.4 1999/09/02 13:27:46 pkj
|
|
||||||
*! Added shadow for R_PORT_PB_CONFIG.
|
|
||||||
*! Renamed port_g_shadow to port_g_data_shadow.
|
|
||||||
*!
|
|
||||||
*! Revision 1.3 1999/09/02 08:28:06 pkj
|
|
||||||
*! Made it possible to select either port PB or the generic port for the RST
|
|
||||||
*! signal line to the DS1302 RTC.
|
|
||||||
*! Also make sure the RST bit is configured as output on Port PB (if used).
|
|
||||||
*!
|
|
||||||
*! Revision 1.2 1999/09/01 14:47:20 bjornw
|
|
||||||
*! Added support for /dev/rtc operations with ioctl RD_TIME and SET_TIME to read
|
|
||||||
*! and set the date. Register as major 121.
|
|
||||||
*!
|
|
||||||
*! Revision 1.1 1999/09/01 09:45:29 bjornw
|
|
||||||
*! Implemented a DS1302 RTC driver.
|
|
||||||
*!
|
|
||||||
*!
|
|
||||||
*! ---------------------------------------------------------------------------
|
*! ---------------------------------------------------------------------------
|
||||||
*!
|
*!
|
||||||
*! (C) Copyright 1999, 2000, 2001, 2002, 2003, 2004 Axis Communications AB, LUND, SWEDEN
|
*! (C) Copyright 1999-2007 Axis Communications AB, LUND, SWEDEN
|
||||||
*!
|
|
||||||
*! $Id: ds1302.c,v 1.18 2005/01/24 09:11:26 mikaelam Exp $
|
|
||||||
*!
|
*!
|
||||||
*!***************************************************************************/
|
*!***************************************************************************/
|
||||||
|
|
||||||
|
@ -156,6 +29,8 @@
|
||||||
#include <asm/rtc.h>
|
#include <asm/rtc.h>
|
||||||
#include <asm/arch/io_interface_mux.h>
|
#include <asm/arch/io_interface_mux.h>
|
||||||
|
|
||||||
|
#include "i2c.h"
|
||||||
|
|
||||||
#define RTC_MAJOR_NR 121 /* local major, change later */
|
#define RTC_MAJOR_NR 121 /* local major, change later */
|
||||||
|
|
||||||
static const char ds1302_name[] = "ds1302";
|
static const char ds1302_name[] = "ds1302";
|
||||||
|
|
|
@ -392,6 +392,7 @@ int cris_request_io_interface(enum cris_io_interface ioif, const char *device_id
|
||||||
if (((interfaces[ioif].gpio_g_in & gpio_in_pins) != interfaces[ioif].gpio_g_in) ||
|
if (((interfaces[ioif].gpio_g_in & gpio_in_pins) != interfaces[ioif].gpio_g_in) ||
|
||||||
((interfaces[ioif].gpio_g_out & gpio_out_pins) != interfaces[ioif].gpio_g_out) ||
|
((interfaces[ioif].gpio_g_out & gpio_out_pins) != interfaces[ioif].gpio_g_out) ||
|
||||||
((interfaces[ioif].gpio_b & gpio_pb_pins) != interfaces[ioif].gpio_b)) {
|
((interfaces[ioif].gpio_b & gpio_pb_pins) != interfaces[ioif].gpio_b)) {
|
||||||
|
local_irq_restore(flags);
|
||||||
printk(KERN_CRIT "cris_request_io_interface: Could not get required pins for interface %u\n",
|
printk(KERN_CRIT "cris_request_io_interface: Could not get required pins for interface %u\n",
|
||||||
ioif);
|
ioif);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* Ideas also taken from arch/arm.
|
* Ideas also taken from arch/arm.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000, 2001 Axis Communications AB
|
* Copyright (C) 2000-2007 Axis Communications AB
|
||||||
*
|
*
|
||||||
* Authors: Bjorn Wesen (bjornw@axis.com)
|
* Authors: Bjorn Wesen (bjornw@axis.com)
|
||||||
*
|
*
|
||||||
|
@ -40,84 +40,30 @@
|
||||||
*/
|
*/
|
||||||
#define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
|
#define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
|
||||||
|
|
||||||
int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs);
|
void do_signal(int canrestart, struct pt_regs *regs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomically swap in the new signal mask, and wait for a signal. Define
|
* Atomically swap in the new signal mask, and wait for a signal. Define
|
||||||
* dummy arguments to be able to reach the regs argument. (Note that this
|
* dummy arguments to be able to reach the regs argument. (Note that this
|
||||||
* arrangement relies on old_sigset_t occupying one register.)
|
* arrangement relies on old_sigset_t occupying one register.)
|
||||||
*/
|
*/
|
||||||
int
|
int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
|
||||||
sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
|
long srp, struct pt_regs *regs)
|
||||||
long srp, struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
sigset_t saveset;
|
|
||||||
|
|
||||||
mask &= _BLOCKABLE;
|
mask &= _BLOCKABLE;
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
saveset = current->blocked;
|
current->saved_sigmask = current->blocked;
|
||||||
siginitset(¤t->blocked, mask);
|
siginitset(¤t->blocked, mask);
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
regs->r10 = -EINTR;
|
schedule();
|
||||||
while (1) {
|
set_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
return -ERESTARTNOHAND;
|
||||||
schedule();
|
|
||||||
if (do_signal(0, &saveset, regs))
|
|
||||||
/* We will get here twice: once to call the signal
|
|
||||||
handler, then again to return from the
|
|
||||||
sigsuspend system call. When calling the
|
|
||||||
signal handler, R10 holds the signal number as
|
|
||||||
set through do_signal. The sigsuspend call
|
|
||||||
will return with the restored value set above;
|
|
||||||
always -EINTR. */
|
|
||||||
return regs->r10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Define dummy arguments to be able to reach the regs argument. (Note that
|
int sys_sigaction(int sig, const struct old_sigaction __user *act,
|
||||||
* this arrangement relies on size_t occupying one register.)
|
struct old_sigaction *oact)
|
||||||
*/
|
|
||||||
int
|
|
||||||
sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13,
|
|
||||||
long mof, long srp, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
sigset_t saveset, newset;
|
|
||||||
|
|
||||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
|
||||||
if (sigsetsize != sizeof(sigset_t))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (copy_from_user(&newset, unewset, sizeof(newset)))
|
|
||||||
return -EFAULT;
|
|
||||||
sigdelsetmask(&newset, ~_BLOCKABLE);
|
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
saveset = current->blocked;
|
|
||||||
current->blocked = newset;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
regs->r10 = -EINTR;
|
|
||||||
while (1) {
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
schedule();
|
|
||||||
if (do_signal(0, &saveset, regs))
|
|
||||||
/* We will get here twice: once to call the signal
|
|
||||||
handler, then again to return from the
|
|
||||||
sigsuspend system call. When calling the
|
|
||||||
signal handler, R10 holds the signal number as
|
|
||||||
set through do_signal. The sigsuspend call
|
|
||||||
will return with the restored value set above;
|
|
||||||
always -EINTR. */
|
|
||||||
return regs->r10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
sys_sigaction(int sig, const struct old_sigaction __user *act,
|
|
||||||
struct old_sigaction *oact)
|
|
||||||
{
|
{
|
||||||
struct k_sigaction new_ka, old_ka;
|
struct k_sigaction new_ka, old_ka;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -147,8 +93,7 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
|
||||||
sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
|
|
||||||
{
|
{
|
||||||
return do_sigaltstack(uss, uoss, rdusp());
|
return do_sigaltstack(uss, uoss, rdusp());
|
||||||
}
|
}
|
||||||
|
@ -205,7 +150,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||||
|
|
||||||
/* TODO: the other ports use regs->orig_XX to disable syscall checks
|
/* TODO: the other ports use regs->orig_XX to disable syscall checks
|
||||||
* after this completes, but we don't use that mechanism. maybe we can
|
* after this completes, but we don't use that mechanism. maybe we can
|
||||||
* use it now ?
|
* use it now ?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -216,7 +161,7 @@ badframe:
|
||||||
|
|
||||||
/* Define dummy arguments to be able to reach the regs argument. */
|
/* Define dummy arguments to be able to reach the regs argument. */
|
||||||
|
|
||||||
asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
|
asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
|
||||||
long srp, struct pt_regs *regs)
|
long srp, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct sigframe __user *frame = (struct sigframe *)rdusp();
|
struct sigframe __user *frame = (struct sigframe *)rdusp();
|
||||||
|
@ -243,7 +188,7 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
|
||||||
current->blocked = set;
|
current->blocked = set;
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->sc))
|
if (restore_sigcontext(regs, &frame->sc))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
|
@ -254,11 +199,11 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
|
||||||
badframe:
|
badframe:
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Define dummy arguments to be able to reach the regs argument. */
|
/* Define dummy arguments to be able to reach the regs argument. */
|
||||||
|
|
||||||
asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
|
asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
|
||||||
long mof, long srp, struct pt_regs *regs)
|
long mof, long srp, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
|
struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
|
||||||
|
@ -282,7 +227,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
|
||||||
current->blocked = set;
|
current->blocked = set;
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
|
@ -294,14 +239,14 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
|
||||||
badframe:
|
badframe:
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up a signal frame.
|
* Set up a signal frame.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int setup_sigcontext(struct sigcontext __user *sc,
|
||||||
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask)
|
struct pt_regs *regs, unsigned long mask)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
unsigned long usp = rdusp();
|
unsigned long usp = rdusp();
|
||||||
|
@ -324,10 +269,11 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned lo
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* figure out where we want to put the new signal frame - usually on the stack */
|
/* Figure out where we want to put the new signal frame
|
||||||
|
* - usually on the stack. */
|
||||||
|
|
||||||
static inline void __user *
|
static inline void __user *
|
||||||
get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
|
||||||
{
|
{
|
||||||
unsigned long sp = rdusp();
|
unsigned long sp = rdusp();
|
||||||
|
|
||||||
|
@ -345,15 +291,15 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* grab and setup a signal frame.
|
/* grab and setup a signal frame.
|
||||||
*
|
*
|
||||||
* basically we stack a lot of state info, and arrange for the
|
* basically we stack a lot of state info, and arrange for the
|
||||||
* user-mode program to return to the kernel using either a
|
* user-mode program to return to the kernel using either a
|
||||||
* trampoline which performs the syscall sigreturn, or a provided
|
* trampoline which performs the syscall sigreturn, or a provided
|
||||||
* user-mode trampoline.
|
* user-mode trampoline.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void setup_frame(int sig, struct k_sigaction *ka,
|
static int setup_frame(int sig, struct k_sigaction *ka,
|
||||||
sigset_t *set, struct pt_regs * regs)
|
sigset_t *set, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct sigframe __user *frame;
|
struct sigframe __user *frame;
|
||||||
unsigned long return_ip;
|
unsigned long return_ip;
|
||||||
|
@ -401,14 +347,15 @@ static void setup_frame(int sig, struct k_sigaction *ka,
|
||||||
|
|
||||||
wrusp((unsigned long)frame);
|
wrusp((unsigned long)frame);
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(sig, current);
|
force_sigsegv(sig, current);
|
||||||
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
sigset_t *set, struct pt_regs * regs)
|
sigset_t *set, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame;
|
struct rt_sigframe __user *frame;
|
||||||
unsigned long return_ip;
|
unsigned long return_ip;
|
||||||
|
@ -443,9 +390,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
/* trampoline - the desired return ip is the retcode itself */
|
/* trampoline - the desired return ip is the retcode itself */
|
||||||
return_ip = (unsigned long)&frame->retcode;
|
return_ip = (unsigned long)&frame->retcode;
|
||||||
/* This is movu.w __NR_rt_sigreturn, r9; break 13; */
|
/* This is movu.w __NR_rt_sigreturn, r9; break 13; */
|
||||||
err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0));
|
err |= __put_user(0x9c5f, (short __user *)(frame->retcode+0));
|
||||||
err |= __put_user(__NR_rt_sigreturn, (short __user*)(frame->retcode+2));
|
err |= __put_user(__NR_rt_sigreturn,
|
||||||
err |= __put_user(0xe93d, (short __user*)(frame->retcode+4));
|
(short __user *)(frame->retcode+2));
|
||||||
|
err |= __put_user(0xe93d, (short __user *)(frame->retcode+4));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -455,73 +403,81 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
|
|
||||||
/* Set up registers for signal handler */
|
/* Set up registers for signal handler */
|
||||||
|
|
||||||
regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */
|
/* What we enter NOW */
|
||||||
regs->srp = return_ip; /* what we enter LATER */
|
regs->irp = (unsigned long) ka->sa.sa_handler;
|
||||||
regs->r10 = sig; /* first argument is signo */
|
/* What we enter LATER */
|
||||||
regs->r11 = (unsigned long) &frame->info; /* second argument is (siginfo_t *) */
|
regs->srp = return_ip;
|
||||||
regs->r12 = 0; /* third argument is unused */
|
/* First argument is signo */
|
||||||
|
regs->r10 = sig;
|
||||||
/* actually move the usp to reflect the stacked frame */
|
/* Second argument is (siginfo_t *) */
|
||||||
|
regs->r11 = (unsigned long)&frame->info;
|
||||||
|
/* Third argument is unused */
|
||||||
|
regs->r12 = 0;
|
||||||
|
|
||||||
|
/* Actually move the usp to reflect the stacked frame */
|
||||||
wrusp((unsigned long)frame);
|
wrusp((unsigned long)frame);
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(sig, current);
|
force_sigsegv(sig, current);
|
||||||
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OK, we're invoking a handler
|
* OK, we're invoking a handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline void
|
static inline int handle_signal(int canrestart, unsigned long sig,
|
||||||
handle_signal(int canrestart, unsigned long sig,
|
siginfo_t *info, struct k_sigaction *ka,
|
||||||
siginfo_t *info, struct k_sigaction *ka,
|
sigset_t *oldset, struct pt_regs *regs)
|
||||||
sigset_t *oldset, struct pt_regs * regs)
|
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Are we from a system call? */
|
/* Are we from a system call? */
|
||||||
if (canrestart) {
|
if (canrestart) {
|
||||||
/* If so, check system call restarting.. */
|
/* If so, check system call restarting.. */
|
||||||
switch (regs->r10) {
|
switch (regs->r10) {
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
case -ERESTARTNOHAND:
|
case -ERESTARTNOHAND:
|
||||||
/* ERESTARTNOHAND means that the syscall should only be
|
/* ERESTARTNOHAND means that the syscall should
|
||||||
restarted if there was no handler for the signal, and since
|
* only be restarted if there was no handler for
|
||||||
we only get here if there is a handler, we don't restart */
|
* the signal, and since we only get here if there
|
||||||
|
* is a handler, we don't restart */
|
||||||
|
regs->r10 = -EINTR;
|
||||||
|
break;
|
||||||
|
case -ERESTARTSYS:
|
||||||
|
/* ERESTARTSYS means to restart the syscall if
|
||||||
|
* there is no handler or the handler was
|
||||||
|
* registered with SA_RESTART */
|
||||||
|
if (!(ka->sa.sa_flags & SA_RESTART)) {
|
||||||
regs->r10 = -EINTR;
|
regs->r10 = -EINTR;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case -ERESTARTSYS:
|
/* fallthrough */
|
||||||
/* ERESTARTSYS means to restart the syscall if there is no
|
case -ERESTARTNOINTR:
|
||||||
handler or the handler was registered with SA_RESTART */
|
/* ERESTARTNOINTR means that the syscall should
|
||||||
if (!(ka->sa.sa_flags & SA_RESTART)) {
|
* be called again after the signal handler returns. */
|
||||||
regs->r10 = -EINTR;
|
RESTART_CRIS_SYS(regs);
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* fallthrough */
|
|
||||||
case -ERESTARTNOINTR:
|
|
||||||
/* ERESTARTNOINTR means that the syscall should be called again
|
|
||||||
after the signal handler returns. */
|
|
||||||
RESTART_CRIS_SYS(regs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
if (ka->sa.sa_flags & SA_SIGINFO)
|
if (ka->sa.sa_flags & SA_SIGINFO)
|
||||||
setup_rt_frame(sig, ka, info, oldset, regs);
|
ret = setup_rt_frame(sig, ka, info, oldset, regs);
|
||||||
else
|
else
|
||||||
setup_frame(sig, ka, oldset, regs);
|
ret = setup_frame(sig, ka, oldset, regs);
|
||||||
|
|
||||||
if (ka->sa.sa_flags & SA_ONESHOT)
|
if (ret == 0) {
|
||||||
ka->sa.sa_handler = SIG_DFL;
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
|
sigorsets(¤t->blocked, ¤t->blocked,
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
&ka->sa.sa_mask);
|
||||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
sigaddset(¤t->blocked, sig);
|
||||||
sigaddset(¤t->blocked,sig);
|
recalc_sigpending();
|
||||||
recalc_sigpending();
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -536,11 +492,12 @@ handle_signal(int canrestart, unsigned long sig,
|
||||||
* mode below.
|
* mode below.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
|
void do_signal(int canrestart, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
struct k_sigaction ka;
|
struct k_sigaction ka;
|
||||||
|
sigset_t *oldset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want the common case to go fast, which
|
* We want the common case to go fast, which
|
||||||
|
@ -549,16 +506,26 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
|
||||||
* if so.
|
* if so.
|
||||||
*/
|
*/
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
return 1;
|
return;
|
||||||
|
|
||||||
if (!oldset)
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
|
oldset = ¤t->saved_sigmask;
|
||||||
|
else
|
||||||
oldset = ¤t->blocked;
|
oldset = ¤t->blocked;
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
if (signr > 0) {
|
if (signr > 0) {
|
||||||
/* Whee! Actually deliver the signal. */
|
/* Whee! Actually deliver the signal. */
|
||||||
handle_signal(canrestart, signr, &info, &ka, oldset, regs);
|
if (handle_signal(canrestart, signr, &info, &ka,
|
||||||
return 1;
|
oldset, regs)) {
|
||||||
|
/* a signal was successfully delivered; the saved
|
||||||
|
* sigmask will have been stored in the signal frame,
|
||||||
|
* and will be restored by sigreturn, so we can simply
|
||||||
|
* clear the TIF_RESTORE_SIGMASK flag */
|
||||||
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Did we come from a system call? */
|
/* Did we come from a system call? */
|
||||||
|
@ -569,10 +536,16 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
|
||||||
regs->r10 == -ERESTARTNOINTR) {
|
regs->r10 == -ERESTARTNOINTR) {
|
||||||
RESTART_CRIS_SYS(regs);
|
RESTART_CRIS_SYS(regs);
|
||||||
}
|
}
|
||||||
if (regs->r10 == -ERESTART_RESTARTBLOCK){
|
if (regs->r10 == -ERESTART_RESTARTBLOCK) {
|
||||||
regs->r10 = __NR_restart_syscall;
|
regs->r10 = __NR_restart_syscall;
|
||||||
regs->irp -= 2;
|
regs->irp -= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
/* if there's no signal to deliver, we just put the saved sigmask
|
||||||
|
* back */
|
||||||
|
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
||||||
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/swap.h>
|
#include <linux/swap.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/vmstat.h>
|
||||||
#include <asm/arch/svinto.h>
|
#include <asm/arch/svinto.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/signal.h>
|
#include <asm/signal.h>
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
|
||||||
jiffies = jiffies_64;
|
jiffies = jiffies_64;
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
|
@ -23,7 +24,7 @@ SECTIONS
|
||||||
_stext = .;
|
_stext = .;
|
||||||
__stext = .;
|
__stext = .;
|
||||||
.text : {
|
.text : {
|
||||||
*(.text)
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
*(.fixup)
|
*(.fixup)
|
||||||
|
@ -49,10 +50,10 @@ SECTIONS
|
||||||
__edata = . ; /* End of data section */
|
__edata = . ; /* End of data section */
|
||||||
_edata = . ;
|
_edata = . ;
|
||||||
|
|
||||||
. = ALIGN(8192); /* init_task and stack, must be aligned */
|
. = ALIGN(PAGE_SIZE); /* init_task and stack, must be aligned */
|
||||||
.data.init_task : { *(.data.init_task) }
|
.data.init_task : { *(.data.init_task) }
|
||||||
|
|
||||||
. = ALIGN(8192); /* Init code and data */
|
. = ALIGN(PAGE_SIZE); /* Init code and data */
|
||||||
__init_begin = .;
|
__init_begin = .;
|
||||||
.init.text : {
|
.init.text : {
|
||||||
_sinittext = .;
|
_sinittext = .;
|
||||||
|
@ -66,13 +67,7 @@ SECTIONS
|
||||||
__setup_end = .;
|
__setup_end = .;
|
||||||
.initcall.init : {
|
.initcall.init : {
|
||||||
__initcall_start = .;
|
__initcall_start = .;
|
||||||
*(.initcall1.init);
|
INITCALLS
|
||||||
*(.initcall2.init);
|
|
||||||
*(.initcall3.init);
|
|
||||||
*(.initcall4.init);
|
|
||||||
*(.initcall5.init);
|
|
||||||
*(.initcall6.init);
|
|
||||||
*(.initcall7.init);
|
|
||||||
__initcall_end = .;
|
__initcall_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,16 +83,18 @@ SECTIONS
|
||||||
__initramfs_start = .;
|
__initramfs_start = .;
|
||||||
*(.init.ramfs)
|
*(.init.ramfs)
|
||||||
__initramfs_end = .;
|
__initramfs_end = .;
|
||||||
/* We fill to the next page, so we can discard all init
|
|
||||||
pages without needing to consider what payload might be
|
|
||||||
appended to the kernel image. */
|
|
||||||
FILL (0);
|
|
||||||
. = ALIGN (8192);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__vmlinux_end = .; /* last address of the physical file */
|
__vmlinux_end = .; /* last address of the physical file */
|
||||||
__init_end = .;
|
|
||||||
|
/*
|
||||||
|
* We fill to the next page, so we can discard all init
|
||||||
|
* pages without needing to consider what payload might be
|
||||||
|
* appended to the kernel image.
|
||||||
|
*/
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
|
||||||
|
__init_end = .;
|
||||||
|
|
||||||
__data_end = . ; /* Move to _edata ? */
|
__data_end = . ; /* Move to _edata ? */
|
||||||
__bss_start = .; /* BSS */
|
__bss_start = .; /* BSS */
|
||||||
|
|
|
@ -1488,16 +1488,19 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
|
||||||
case LDFA_OP:
|
case LDFA_OP:
|
||||||
case LDFCCLR_OP:
|
case LDFCCLR_OP:
|
||||||
case LDFCNC_OP:
|
case LDFCNC_OP:
|
||||||
case LDF_IMM_OP:
|
|
||||||
case LDFA_IMM_OP:
|
|
||||||
case LDFCCLR_IMM_OP:
|
|
||||||
case LDFCNC_IMM_OP:
|
|
||||||
if (u.insn.x)
|
if (u.insn.x)
|
||||||
ret = emulate_load_floatpair(ifa, u.insn, regs);
|
ret = emulate_load_floatpair(ifa, u.insn, regs);
|
||||||
else
|
else
|
||||||
ret = emulate_load_float(ifa, u.insn, regs);
|
ret = emulate_load_float(ifa, u.insn, regs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case LDF_IMM_OP:
|
||||||
|
case LDFA_IMM_OP:
|
||||||
|
case LDFCCLR_IMM_OP:
|
||||||
|
case LDFCNC_IMM_OP:
|
||||||
|
ret = emulate_load_float(ifa, u.insn, regs);
|
||||||
|
break;
|
||||||
|
|
||||||
case STF_OP:
|
case STF_OP:
|
||||||
case STF_IMM_OP:
|
case STF_IMM_OP:
|
||||||
ret = emulate_store_float(ifa, u.insn, regs);
|
ret = emulate_store_float(ifa, u.insn, regs);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004-2005 Silicon Graphics, Inc. All Rights Reserved.
|
* Copyright (c) 2004-2007 Silicon Graphics, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,11 @@
|
||||||
* PIO read fails, the MCA handler will force the error to look
|
* PIO read fails, the MCA handler will force the error to look
|
||||||
* corrected and vector to the xp_error_PIOR which will return an error.
|
* corrected and vector to the xp_error_PIOR which will return an error.
|
||||||
*
|
*
|
||||||
|
* The definition of "consumption" and the time it takes for an MCA
|
||||||
|
* to surface is processor implementation specific. This code
|
||||||
|
* is sufficient on Itanium through the Montvale processor family.
|
||||||
|
* It may need to be adjusted for future processor implementations.
|
||||||
|
*
|
||||||
* extern int xp_nofault_PIOR(void *remote_register);
|
* extern int xp_nofault_PIOR(void *remote_register);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -22,11 +27,10 @@ xp_nofault_PIOR:
|
||||||
mov r8=r0 // Stage a success return value
|
mov r8=r0 // Stage a success return value
|
||||||
ld8.acq r9=[r32];; // PIO Read the specified register
|
ld8.acq r9=[r32];; // PIO Read the specified register
|
||||||
adds r9=1,r9;; // Add to force consumption
|
adds r9=1,r9;; // Add to force consumption
|
||||||
or r9=r9,r9;; // Or to force consumption
|
srlz.i;; // Allow time for MCA to surface
|
||||||
br.ret.sptk.many b0;; // Return success
|
br.ret.sptk.many b0;; // Return success
|
||||||
|
|
||||||
.global xp_error_PIOR
|
.global xp_error_PIOR
|
||||||
xp_error_PIOR:
|
xp_error_PIOR:
|
||||||
mov r8=1 // Return value of 1
|
mov r8=1 // Return value of 1
|
||||||
br.ret.sptk.many b0;; // Return failure
|
br.ret.sptk.many b0;; // Return failure
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,8 @@ config BCM47XX
|
||||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||||
select SSB
|
select SSB
|
||||||
select SSB_DRIVER_MIPS
|
select SSB_DRIVER_MIPS
|
||||||
|
select SSB_DRIVER_EXTIF
|
||||||
|
select SSB_PCICORE_HOSTMODE if PCI
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select SYS_HAS_EARLY_PRINTK
|
select SYS_HAS_EARLY_PRINTK
|
||||||
select CFE
|
select CFE
|
||||||
|
@ -992,8 +994,6 @@ config BOOT_ELF64
|
||||||
|
|
||||||
menu "CPU selection"
|
menu "CPU selection"
|
||||||
|
|
||||||
source "kernel/time/Kconfig"
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "CPU type"
|
prompt "CPU type"
|
||||||
default CPU_R4X00
|
default CPU_R4X00
|
||||||
|
@ -1768,6 +1768,8 @@ config NR_CPUS
|
||||||
performance should round up your number of processors to the next
|
performance should round up your number of processors to the next
|
||||||
power of two.
|
power of two.
|
||||||
|
|
||||||
|
source "kernel/time/Kconfig"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Timer Interrupt Frequency Configuration
|
# Timer Interrupt Frequency Configuration
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* BRIEF MODULE DESCRIPTION
|
* BRIEF MODULE DESCRIPTION
|
||||||
* Alchemy/AMD Au1x00 pci support.
|
* Alchemy/AMD Au1x00 PCI support.
|
||||||
*
|
*
|
||||||
* Copyright 2001,2002,2003 MontaVista Software Inc.
|
* Copyright 2001-2003, 2007 MontaVista Software Inc.
|
||||||
* Author: MontaVista Software, Inc.
|
* Author: MontaVista Software, Inc.
|
||||||
* ppopov@mvista.com or source@mvista.com
|
* ppopov@mvista.com or source@mvista.com
|
||||||
*
|
*
|
||||||
|
@ -66,6 +66,8 @@ static unsigned long virt_io_addr;
|
||||||
|
|
||||||
static int __init au1x_pci_setup(void)
|
static int __init au1x_pci_setup(void)
|
||||||
{
|
{
|
||||||
|
extern void au1x_pci_cfg_init(void);
|
||||||
|
|
||||||
#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
|
#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
|
||||||
virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
|
virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
|
||||||
Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
|
Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
|
||||||
|
@ -94,6 +96,8 @@ static int __init au1x_pci_setup(void)
|
||||||
set_io_port_base(virt_io_addr);
|
set_io_port_base(virt_io_addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
au1x_pci_cfg_init();
|
||||||
|
|
||||||
register_pci_controller(&au1x_controller);
|
register_pci_controller(&au1x_controller);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,15 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/serial_reg.h>
|
#include <linux/serial_reg.h>
|
||||||
|
|
||||||
|
#include <cobalt.h>
|
||||||
|
|
||||||
#define UART_BASE ((void __iomem *)CKSEG1ADDR(0x1c800000))
|
#define UART_BASE ((void __iomem *)CKSEG1ADDR(0x1c800000))
|
||||||
|
|
||||||
void prom_putchar(char c)
|
void prom_putchar(char c)
|
||||||
{
|
{
|
||||||
|
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
|
||||||
|
return;
|
||||||
|
|
||||||
while (!(readb(UART_BASE + UART_LSR) & UART_LSR_THRE))
|
while (!(readb(UART_BASE + UART_LSR) & UART_LSR_THRE))
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,8 @@ EXPORT(_stext)
|
||||||
* kernel load address. This is needed because this platform does
|
* kernel load address. This is needed because this platform does
|
||||||
* not have a ELF loader yet.
|
* not have a ELF loader yet.
|
||||||
*/
|
*/
|
||||||
__INIT
|
FEXPORT(__kernel_entry)
|
||||||
|
j kernel_entry
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__INIT_REFOK
|
__INIT_REFOK
|
||||||
|
|
|
@ -269,7 +269,7 @@ static void __init bootmem_init(void)
|
||||||
|
|
||||||
static void __init bootmem_init(void)
|
static void __init bootmem_init(void)
|
||||||
{
|
{
|
||||||
unsigned long init_begin, reserved_end;
|
unsigned long reserved_end;
|
||||||
unsigned long mapstart = ~0UL;
|
unsigned long mapstart = ~0UL;
|
||||||
unsigned long bootmap_size;
|
unsigned long bootmap_size;
|
||||||
int i;
|
int i;
|
||||||
|
@ -344,7 +344,6 @@ static void __init bootmem_init(void)
|
||||||
min_low_pfn, max_low_pfn);
|
min_low_pfn, max_low_pfn);
|
||||||
|
|
||||||
|
|
||||||
init_begin = PFN_UP(__pa_symbol(&__init_begin));
|
|
||||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||||
unsigned long start, end;
|
unsigned long start, end;
|
||||||
|
|
||||||
|
@ -352,8 +351,8 @@ static void __init bootmem_init(void)
|
||||||
end = PFN_DOWN(boot_mem_map.map[i].addr
|
end = PFN_DOWN(boot_mem_map.map[i].addr
|
||||||
+ boot_mem_map.map[i].size);
|
+ boot_mem_map.map[i].size);
|
||||||
|
|
||||||
if (start <= init_begin)
|
if (start <= min_low_pfn)
|
||||||
start = init_begin;
|
start = min_low_pfn;
|
||||||
if (start >= end)
|
if (start >= end)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -147,9 +147,9 @@ static __init int cpu_has_mfc0_count_bug(void)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* I don't have erratas for newer R4400 so be paranoid.
|
* we assume newer revisions are ok
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -12,11 +12,11 @@ endif
|
||||||
|
|
||||||
MKLASATIMG = mklasatimg
|
MKLASATIMG = mklasatimg
|
||||||
MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200
|
MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200
|
||||||
KERNEL_IMAGE = $(TOPDIR)/vmlinux
|
KERNEL_IMAGE = vmlinux
|
||||||
KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ )
|
KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ )
|
||||||
KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ )
|
KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ )
|
||||||
|
|
||||||
LDSCRIPT= -L$(obj) -Tromscript.normal
|
LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal
|
||||||
|
|
||||||
HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
|
HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
|
||||||
-D_kernel_entry=0x$(KERNEL_ENTRY) \
|
-D_kernel_entry=0x$(KERNEL_ENTRY) \
|
||||||
|
@ -24,7 +24,7 @@ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
|
||||||
-D TIMESTAMP=$(shell date +%s)
|
-D TIMESTAMP=$(shell date +%s)
|
||||||
|
|
||||||
$(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE)
|
$(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE)
|
||||||
$(CC) -fno-pic $(HEAD_DEFINES) -I$(TOPDIR)/include -c -o $@ $<
|
$(CC) -fno-pic $(HEAD_DEFINES) $(LINUXINCLUDE) -c -o $@ $<
|
||||||
|
|
||||||
OBJECTS = head.o kImage.o
|
OBJECTS = head.o kImage.o
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,6 @@ void __init prom_meminit(void)
|
||||||
|
|
||||||
void __init prom_free_prom_memory(void)
|
void __init prom_free_prom_memory(void)
|
||||||
{
|
{
|
||||||
#if 0 /* for now ... */
|
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -181,5 +180,4 @@ void __init prom_free_prom_memory(void)
|
||||||
free_init_pages("prom memory",
|
free_init_pages("prom memory",
|
||||||
addr, addr + boot_mem_map.map[i].size);
|
addr, addr + boot_mem_map.map[i].size);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,16 +39,18 @@ static void atlas_machine_power_off(void);
|
||||||
|
|
||||||
static void mips_machine_restart(char *command)
|
static void mips_machine_restart(char *command)
|
||||||
{
|
{
|
||||||
unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int));
|
unsigned int __iomem *softres_reg =
|
||||||
|
ioremap(SOFTRES_REG, sizeof(unsigned int));
|
||||||
|
|
||||||
writew(GORESET, softres_reg);
|
__raw_writel(GORESET, softres_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mips_machine_halt(void)
|
static void mips_machine_halt(void)
|
||||||
{
|
{
|
||||||
unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int));
|
unsigned int __iomem *softres_reg =
|
||||||
|
ioremap(SOFTRES_REG, sizeof(unsigned int));
|
||||||
|
|
||||||
writew(GORESET, softres_reg);
|
__raw_writel(GORESET, softres_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_MIPS_ATLAS)
|
#if defined(CONFIG_MIPS_ATLAS)
|
||||||
|
|
|
@ -149,7 +149,7 @@ void __init plat_mem_setup(void)
|
||||||
/* Check PCI clock */
|
/* Check PCI clock */
|
||||||
{
|
{
|
||||||
unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
|
unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
|
||||||
int jmpr = (readw(jmpr_p) >> 2) & 0x07;
|
int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
|
||||||
static const int pciclocks[] __initdata = {
|
static const int pciclocks[] __initdata = {
|
||||||
33, 20, 25, 30, 12, 16, 37, 10
|
33, 20, 25, 30, 12, 16, 37, 10
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,7 +45,7 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
||||||
/* ignore region specifiers */
|
/* ignore region specifiers */
|
||||||
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
||||||
|
|
||||||
#ifdef CONFIG_ZONE_DMA32
|
#ifdef CONFIG_ZONE_DMA
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
gfp |= __GFP_DMA;
|
gfp |= __GFP_DMA;
|
||||||
else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))
|
else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))
|
||||||
|
|
|
@ -177,7 +177,7 @@ static char irq_tab_raq2[] __initdata = {
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
if (cobalt_board_id < COBALT_BRD_ID_QUBE2)
|
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
|
||||||
return irq_tab_qube1[slot];
|
return irq_tab_qube1[slot];
|
||||||
|
|
||||||
if (cobalt_board_id == COBALT_BRD_ID_RAQ2)
|
if (cobalt_board_id == COBALT_BRD_ID_RAQ2)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* BRIEF MODULE DESCRIPTION
|
* BRIEF MODULE DESCRIPTION
|
||||||
* Alchemy/AMD Au1x00 pci support.
|
* Alchemy/AMD Au1x00 PCI support.
|
||||||
*
|
*
|
||||||
* Copyright 2001,2002,2003 MontaVista Software Inc.
|
* Copyright 2001-2003, 2007 MontaVista Software Inc.
|
||||||
* Author: MontaVista Software, Inc.
|
* Author: MontaVista Software, Inc.
|
||||||
* ppopov@mvista.com or source@mvista.com
|
* ppopov@mvista.com or source@mvista.com
|
||||||
*
|
*
|
||||||
|
@ -69,10 +69,27 @@ void mod_wired_entry(int entry, unsigned long entrylo0,
|
||||||
write_c0_pagemask(old_pagemask);
|
write_c0_pagemask(old_pagemask);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct vm_struct *pci_cfg_vm;
|
static struct vm_struct *pci_cfg_vm;
|
||||||
static int pci_cfg_wired_entry;
|
static int pci_cfg_wired_entry;
|
||||||
static int first_cfg = 1;
|
static unsigned long last_entryLo0, last_entryLo1;
|
||||||
unsigned long last_entryLo0, last_entryLo1;
|
|
||||||
|
/*
|
||||||
|
* We can't ioremap the entire pci config space because it's too large.
|
||||||
|
* Nor can we call ioremap dynamically because some device drivers use
|
||||||
|
* the PCI config routines from within interrupt handlers and that
|
||||||
|
* becomes a problem in get_vm_area(). We use one wired TLB to handle
|
||||||
|
* all config accesses for all busses.
|
||||||
|
*/
|
||||||
|
void __init au1x_pci_cfg_init(void)
|
||||||
|
{
|
||||||
|
/* Reserve a wired entry for PCI config accesses */
|
||||||
|
pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
|
||||||
|
if (!pci_cfg_vm)
|
||||||
|
panic(KERN_ERR "PCI unable to get vm area\n");
|
||||||
|
pci_cfg_wired_entry = read_c0_wired();
|
||||||
|
add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
|
||||||
|
last_entryLo0 = last_entryLo1 = 0xffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
static int config_access(unsigned char access_type, struct pci_bus *bus,
|
static int config_access(unsigned char access_type, struct pci_bus *bus,
|
||||||
unsigned int dev_fn, unsigned char where,
|
unsigned int dev_fn, unsigned char where,
|
||||||
|
@ -97,27 +114,6 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
|
||||||
Au1500_PCI_STATCMD);
|
Au1500_PCI_STATCMD);
|
||||||
au_sync_udelay(1);
|
au_sync_udelay(1);
|
||||||
|
|
||||||
/*
|
|
||||||
* We can't ioremap the entire pci config space because it's
|
|
||||||
* too large. Nor can we call ioremap dynamically because some
|
|
||||||
* device drivers use the pci config routines from within
|
|
||||||
* interrupt handlers and that becomes a problem in get_vm_area().
|
|
||||||
* We use one wired tlb to handle all config accesses for all
|
|
||||||
* busses. To improve performance, if the current device
|
|
||||||
* is the same as the last device accessed, we don't touch the
|
|
||||||
* tlb.
|
|
||||||
*/
|
|
||||||
if (first_cfg) {
|
|
||||||
/* reserve a wired entry for pci config accesses */
|
|
||||||
first_cfg = 0;
|
|
||||||
pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
|
|
||||||
if (!pci_cfg_vm)
|
|
||||||
panic(KERN_ERR "PCI unable to get vm area\n");
|
|
||||||
pci_cfg_wired_entry = read_c0_wired();
|
|
||||||
add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
|
|
||||||
last_entryLo0 = last_entryLo1 = 0xffffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allow board vendors to implement their own off-chip idsel.
|
/* Allow board vendors to implement their own off-chip idsel.
|
||||||
* If it doesn't succeed, may as well bail out at this point.
|
* If it doesn't succeed, may as well bail out at this point.
|
||||||
*/
|
*/
|
||||||
|
@ -144,9 +140,12 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
|
||||||
/* page boundary */
|
/* page boundary */
|
||||||
cfg_base = cfg_base & PAGE_MASK;
|
cfg_base = cfg_base & PAGE_MASK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To improve performance, if the current device is the same as
|
||||||
|
* the last device accessed, we don't touch the TLB.
|
||||||
|
*/
|
||||||
entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7;
|
entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7;
|
||||||
entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7;
|
entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7;
|
||||||
|
|
||||||
if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) {
|
if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) {
|
||||||
mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1,
|
mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1,
|
||||||
(unsigned long)pci_cfg_vm->addr, PM_4K);
|
(unsigned long)pci_cfg_vm->addr, PM_4K);
|
||||||
|
|
|
@ -42,6 +42,10 @@ static int
|
||||||
mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
|
mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
|
||||||
int reg, int size, u32 *val)
|
int reg, int size, u32 *val)
|
||||||
{
|
{
|
||||||
|
u32 control = mace->pci.control;
|
||||||
|
|
||||||
|
/* disable master aborts interrupts during config read */
|
||||||
|
mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT;
|
||||||
mace->pci.config_addr = mkaddr(bus, devfn, reg);
|
mace->pci.config_addr = mkaddr(bus, devfn, reg);
|
||||||
switch (size) {
|
switch (size) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
|
||||||
*val = mace->pci.config_data.l;
|
*val = mace->pci.config_data.l;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* ack possible master abort */
|
||||||
|
mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT;
|
||||||
|
mace->pci.control = control;
|
||||||
|
|
||||||
DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val);
|
DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val);
|
||||||
|
|
||||||
|
|
|
@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = {
|
||||||
.iommu = 0,
|
.iommu = 0,
|
||||||
.mem_offset = MACE_PCI_MEM_OFFSET,
|
.mem_offset = MACE_PCI_MEM_OFFSET,
|
||||||
.io_offset = 0,
|
.io_offset = 0,
|
||||||
|
.io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO),
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init mace_init(void)
|
static int __init mace_init(void)
|
||||||
|
@ -135,7 +136,8 @@ static int __init mace_init(void)
|
||||||
BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0,
|
BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0,
|
||||||
"MACE PCI error", NULL));
|
"MACE PCI error", NULL));
|
||||||
|
|
||||||
iomem_resource = mace_pci_mem_resource;
|
/* extend memory resources */
|
||||||
|
iomem_resource.end = mace_pci_mem_resource.end;
|
||||||
ioport_resource = mace_pci_io_resource;
|
ioport_resource = mace_pci_io_resource;
|
||||||
|
|
||||||
register_pci_controller(&mace_pci_controller);
|
register_pci_controller(&mace_pci_controller);
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/module.h>
|
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
|
@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
|
||||||
return read_c0_count2();
|
return read_c0_count2();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clocksource pnx_clocksource = {
|
||||||
|
.name = "pnx8xxx",
|
||||||
|
.rating = 200,
|
||||||
|
.read = hpt_read,
|
||||||
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
|
};
|
||||||
|
|
||||||
static void timer_ack(void)
|
static void timer_ack(void)
|
||||||
{
|
{
|
||||||
write_c0_compare(cpj);
|
write_c0_compare(cpj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id)
|
||||||
|
{
|
||||||
|
struct clock_event_device *c = dev_id;
|
||||||
|
|
||||||
|
/* clear MATCH, signal the event */
|
||||||
|
c->event_handler(c);
|
||||||
|
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction pnx8xxx_timer_irq = {
|
||||||
|
.handler = pnx8xxx_timer_interrupt,
|
||||||
|
.flags = IRQF_DISABLED | IRQF_PERCPU,
|
||||||
|
.name = "pnx8xxx_timer",
|
||||||
|
};
|
||||||
|
|
||||||
|
static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
|
||||||
|
{
|
||||||
|
/* Timer 2 clear interrupt */
|
||||||
|
write_c0_compare2(-1);
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction monotonic_irqaction = {
|
||||||
|
.handler = monotonic_interrupt,
|
||||||
|
.flags = IRQF_DISABLED,
|
||||||
|
.name = "Monotonic timer",
|
||||||
|
};
|
||||||
|
|
||||||
|
static int pnx8xxx_set_next_event(unsigned long delta,
|
||||||
|
struct clock_event_device *evt)
|
||||||
|
{
|
||||||
|
write_c0_compare(delta);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct clock_event_device pnx8xxx_clockevent = {
|
||||||
|
.name = "pnx8xxx_clockevent",
|
||||||
|
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||||
|
.set_next_event = pnx8xxx_set_next_event,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* plat_time_init() - it does the following things:
|
* plat_time_init() - it does the following things:
|
||||||
*
|
*
|
||||||
|
@ -58,11 +106,34 @@ static void timer_ack(void)
|
||||||
|
|
||||||
__init void plat_time_init(void)
|
__init void plat_time_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned int configPR;
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
unsigned int m;
|
unsigned int m;
|
||||||
unsigned int p;
|
unsigned int p;
|
||||||
unsigned int pow2p;
|
unsigned int pow2p;
|
||||||
|
|
||||||
|
clockevents_register_device(&pnx8xxx_clockevent);
|
||||||
|
clocksource_register(&pnx_clocksource);
|
||||||
|
|
||||||
|
setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
|
||||||
|
setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
|
||||||
|
|
||||||
|
/* Timer 1 start */
|
||||||
|
configPR = read_c0_config7();
|
||||||
|
configPR &= ~0x00000008;
|
||||||
|
write_c0_config7(configPR);
|
||||||
|
|
||||||
|
/* Timer 2 start */
|
||||||
|
configPR = read_c0_config7();
|
||||||
|
configPR &= ~0x00000010;
|
||||||
|
write_c0_config7(configPR);
|
||||||
|
|
||||||
|
/* Timer 3 stop */
|
||||||
|
configPR = read_c0_config7();
|
||||||
|
configPR |= 0x00000020;
|
||||||
|
write_c0_config7(configPR);
|
||||||
|
|
||||||
|
|
||||||
/* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */
|
/* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */
|
||||||
/* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */
|
/* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */
|
||||||
|
|
||||||
|
@ -87,42 +158,6 @@ __init void plat_time_init(void)
|
||||||
write_c0_count2(0);
|
write_c0_count2(0);
|
||||||
write_c0_compare2(0xffffffff);
|
write_c0_compare2(0xffffffff);
|
||||||
|
|
||||||
clocksource_mips.read = hpt_read;
|
|
||||||
mips_timer_ack = timer_ack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
|
|
||||||
{
|
|
||||||
/* Timer 2 clear interrupt */
|
|
||||||
write_c0_compare2(-1);
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct irqaction monotonic_irqaction = {
|
|
||||||
.handler = monotonic_interrupt,
|
|
||||||
.flags = IRQF_DISABLED,
|
|
||||||
.name = "Monotonic timer",
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init plat_timer_setup(struct irqaction *irq)
|
|
||||||
{
|
|
||||||
int configPR;
|
|
||||||
|
|
||||||
setup_irq(PNX8550_INT_TIMER1, irq);
|
|
||||||
setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
|
|
||||||
|
|
||||||
/* Timer 1 start */
|
|
||||||
configPR = read_c0_config7();
|
|
||||||
configPR &= ~0x00000008;
|
|
||||||
write_c0_config7(configPR);
|
|
||||||
|
|
||||||
/* Timer 2 start */
|
|
||||||
configPR = read_c0_config7();
|
|
||||||
configPR &= ~0x00000010;
|
|
||||||
write_c0_config7(configPR);
|
|
||||||
|
|
||||||
/* Timer 3 stop */
|
|
||||||
configPR = read_c0_config7();
|
|
||||||
configPR |= 0x00000020;
|
|
||||||
write_c0_config7(configPR);
|
|
||||||
}
|
|
||||||
|
|
|
@ -426,7 +426,6 @@ static void ip32_irq0(void)
|
||||||
|
|
||||||
crime_int = crime->istat & crime_mask;
|
crime_int = crime->istat & crime_mask;
|
||||||
irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
|
irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
|
||||||
crime_int = 1 << irq;
|
|
||||||
|
|
||||||
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
||||||
unsigned long mace_int = mace->perif.ctrl.istat;
|
unsigned long mace_int = mace->perif.ctrl.istat;
|
||||||
|
|
|
@ -13,21 +13,22 @@
|
||||||
#include <asm/ip32/mace.h>
|
#include <asm/ip32/mace.h>
|
||||||
#include <asm/ip32/ip32_ints.h>
|
#include <asm/ip32/ip32_ints.h>
|
||||||
|
|
||||||
/*
|
#define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1)
|
||||||
* .iobase isn't a constant (in the sense of C) so we fill it in at runtime.
|
#define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2)
|
||||||
*/
|
|
||||||
#define MACE_PORT(int) \
|
#define MACE_PORT(offset,_irq) \
|
||||||
{ \
|
{ \
|
||||||
.irq = int, \
|
.mapbase = MACE_BASE + offset, \
|
||||||
|
.irq = _irq, \
|
||||||
.uartclk = 1843200, \
|
.uartclk = 1843200, \
|
||||||
.iotype = UPIO_MEM, \
|
.iotype = UPIO_MEM, \
|
||||||
.flags = UPF_SKIP_TEST, \
|
.flags = UPF_SKIP_TEST|UPF_IOREMAP, \
|
||||||
.regshift = 8, \
|
.regshift = 8, \
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct plat_serial8250_port uart8250_data[] = {
|
static struct plat_serial8250_port uart8250_data[] = {
|
||||||
MACE_PORT(MACEISA_SERIAL1_IRQ),
|
MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ),
|
||||||
MACE_PORT(MACEISA_SERIAL2_IRQ),
|
MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ),
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,9 +42,6 @@ static struct platform_device uart8250_device = {
|
||||||
|
|
||||||
static int __init uart8250_init(void)
|
static int __init uart8250_init(void)
|
||||||
{
|
{
|
||||||
uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1;
|
|
||||||
uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2;
|
|
||||||
|
|
||||||
return platform_device_register(&uart8250_device);
|
return platform_device_register(&uart8250_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -598,8 +598,8 @@ static int __init rbtx4938_ethaddr_init(void)
|
||||||
printk(KERN_WARNING "seeprom: bad checksum.\n");
|
printk(KERN_WARNING "seeprom: bad checksum.\n");
|
||||||
}
|
}
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
unsigned int slot = TX4938_PCIC_IDSEL_AD_TO_SLOT(31 - i);
|
unsigned int id =
|
||||||
unsigned int id = (1 << 8) | PCI_DEVFN(slot, 0); /* bus 1 */
|
TXX9_IRQ_BASE + (i ? TX4938_IR_ETH1 : TX4938_IR_ETH0);
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
if (!(tx4938_ccfgptr->pcfg &
|
if (!(tx4938_ccfgptr->pcfg &
|
||||||
(i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL)))
|
(i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL)))
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This file adds the header file glue so that the shared files
|
* This file adds the header file glue so that the shared files
|
||||||
* flatdevicetree.[ch] can compile and work in the powerpc bootwrapper.
|
* flatdevicetree.[ch] can compile and work in the powerpc bootwrapper.
|
||||||
*
|
*
|
||||||
* strncmp & strchr copied from <file:lib/strings.c>
|
* strncmp & strchr copied from <file:lib/string.c>
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||||
*
|
*
|
||||||
* Maintained by: Mark A. Greer <mgreer@mvista.com>
|
* Maintained by: Mark A. Greer <mgreer@mvista.com>
|
||||||
|
|
|
@ -278,6 +278,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct scatterlist *s, *outs, *segstart;
|
struct scatterlist *s, *outs, *segstart;
|
||||||
int outcount, incount, i;
|
int outcount, incount, i;
|
||||||
|
unsigned int align;
|
||||||
unsigned long handle;
|
unsigned long handle;
|
||||||
|
|
||||||
BUG_ON(direction == DMA_NONE);
|
BUG_ON(direction == DMA_NONE);
|
||||||
|
@ -309,7 +310,12 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
|
||||||
/* Allocate iommu entries for that segment */
|
/* Allocate iommu entries for that segment */
|
||||||
vaddr = (unsigned long) sg_virt(s);
|
vaddr = (unsigned long) sg_virt(s);
|
||||||
npages = iommu_num_pages(vaddr, slen);
|
npages = iommu_num_pages(vaddr, slen);
|
||||||
entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0);
|
align = 0;
|
||||||
|
if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE &&
|
||||||
|
(vaddr & ~PAGE_MASK) == 0)
|
||||||
|
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
|
||||||
|
entry = iommu_range_alloc(tbl, npages, &handle,
|
||||||
|
mask >> IOMMU_PAGE_SHIFT, align);
|
||||||
|
|
||||||
DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen);
|
DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen);
|
||||||
|
|
||||||
|
@ -570,7 +576,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
|
||||||
{
|
{
|
||||||
dma_addr_t dma_handle = DMA_ERROR_CODE;
|
dma_addr_t dma_handle = DMA_ERROR_CODE;
|
||||||
unsigned long uaddr;
|
unsigned long uaddr;
|
||||||
unsigned int npages;
|
unsigned int npages, align;
|
||||||
|
|
||||||
BUG_ON(direction == DMA_NONE);
|
BUG_ON(direction == DMA_NONE);
|
||||||
|
|
||||||
|
@ -578,8 +584,13 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
|
||||||
npages = iommu_num_pages(uaddr, size);
|
npages = iommu_num_pages(uaddr, size);
|
||||||
|
|
||||||
if (tbl) {
|
if (tbl) {
|
||||||
|
align = 0;
|
||||||
|
if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && size >= PAGE_SIZE &&
|
||||||
|
((unsigned long)vaddr & ~PAGE_MASK) == 0)
|
||||||
|
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
|
||||||
|
|
||||||
dma_handle = iommu_alloc(tbl, vaddr, npages, direction,
|
dma_handle = iommu_alloc(tbl, vaddr, npages, direction,
|
||||||
mask >> IOMMU_PAGE_SHIFT, 0);
|
mask >> IOMMU_PAGE_SHIFT, align);
|
||||||
if (dma_handle == DMA_ERROR_CODE) {
|
if (dma_handle == DMA_ERROR_CODE) {
|
||||||
if (printk_ratelimit()) {
|
if (printk_ratelimit()) {
|
||||||
printk(KERN_INFO "iommu_alloc failed, "
|
printk(KERN_INFO "iommu_alloc failed, "
|
||||||
|
|
|
@ -2216,6 +2216,45 @@ static void __init fixup_device_tree_efika(void)
|
||||||
prom_printf("fixup_device_tree_efika: ",
|
prom_printf("fixup_device_tree_efika: ",
|
||||||
"skipped entry %x - setprop error\n", i);
|
"skipped entry %x - setprop error\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure ethernet mdio bus node exists */
|
||||||
|
node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
|
||||||
|
if (!PHANDLE_VALID(node)) {
|
||||||
|
prom_printf("Adding Ethernet MDIO node\n");
|
||||||
|
call_prom("interpret", 1, 1,
|
||||||
|
" s\" /builtin\" find-device"
|
||||||
|
" new-device"
|
||||||
|
" 1 encode-int s\" #address-cells\" property"
|
||||||
|
" 0 encode-int s\" #size-cells\" property"
|
||||||
|
" s\" mdio\" 2dup device-name device-type"
|
||||||
|
" s\" mpc5200b-fec-phy\" encode-string"
|
||||||
|
" s\" compatible\" property"
|
||||||
|
" 0xf0003000 0x400 reg"
|
||||||
|
" 0x2 encode-int"
|
||||||
|
" 0x5 encode-int encode+"
|
||||||
|
" 0x3 encode-int encode+"
|
||||||
|
" s\" interrupts\" property"
|
||||||
|
" finish-device");
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Make sure ethernet phy device node exist */
|
||||||
|
node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio/ethernet-phy"));
|
||||||
|
if (!PHANDLE_VALID(node)) {
|
||||||
|
prom_printf("Adding Ethernet PHY node\n");
|
||||||
|
call_prom("interpret", 1, 1,
|
||||||
|
" s\" /builtin/mdio\" find-device"
|
||||||
|
" new-device"
|
||||||
|
" s\" ethernet-phy\" device-name"
|
||||||
|
" 0x10 encode-int s\" reg\" property"
|
||||||
|
" my-self"
|
||||||
|
" ihandle>phandle"
|
||||||
|
" finish-device"
|
||||||
|
" s\" /builtin/ethernet\" find-device"
|
||||||
|
" encode-int"
|
||||||
|
" s\" phy-handle\" property"
|
||||||
|
" device-end");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define fixup_device_tree_efika()
|
#define fixup_device_tree_efika()
|
||||||
|
|
|
@ -295,6 +295,8 @@ void slb_initialize(void)
|
||||||
|
|
||||||
create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
|
create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
|
||||||
|
|
||||||
|
slb_shadow_clear(2);
|
||||||
|
|
||||||
/* We don't bolt the stack for the time being - we're in boot,
|
/* We don't bolt the stack for the time being - we're in boot,
|
||||||
* so the stack is in the bolted segment. By the time it goes
|
* so the stack is in the bolted segment. By the time it goes
|
||||||
* elsewhere, we'll call _switch() which will bolt in the new
|
* elsewhere, we'll call _switch() which will bolt in the new
|
||||||
|
|
|
@ -88,3 +88,8 @@ config CBE_CPUFREQ_PMI
|
||||||
but also at lower core voltage.
|
but also at lower core voltage.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
config OPROFILE_CELL
|
||||||
|
def_bool y
|
||||||
|
depends on PPC_CELL_NATIVE && (OPROFILE = m || OPROFILE = y)
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ spu-manage-$(CONFIG_PPC_CELLEB) += spu_manage.o
|
||||||
spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o
|
spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o
|
||||||
|
|
||||||
obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
|
obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
|
||||||
|
spu_notify.o \
|
||||||
spu_syscalls.o spu_fault.o \
|
spu_syscalls.o spu_fault.o \
|
||||||
$(spu-priv1-y) \
|
$(spu-priv1-y) \
|
||||||
$(spu-manage-y) \
|
$(spu-manage-y) \
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Move OProfile dependencies from spufs module to the kernel so it
|
||||||
|
* can run on non-cell PPC.
|
||||||
|
*
|
||||||
|
* Copyright (C) IBM 2005
|
||||||
|
*
|
||||||
|
* 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, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <asm/spu.h>
|
||||||
|
#include "spufs/spufs.h"
|
||||||
|
|
||||||
|
static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier);
|
||||||
|
|
||||||
|
void spu_switch_notify(struct spu *spu, struct spu_context *ctx)
|
||||||
|
{
|
||||||
|
blocking_notifier_call_chain(&spu_switch_notifier,
|
||||||
|
ctx ? ctx->object_id : 0, spu);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(spu_switch_notify);
|
||||||
|
|
||||||
|
int spu_switch_event_register(struct notifier_block *n)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ret = blocking_notifier_chain_register(&spu_switch_notifier, n);
|
||||||
|
if (!ret)
|
||||||
|
notify_spus_active();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(spu_switch_event_register);
|
||||||
|
|
||||||
|
int spu_switch_event_unregister(struct notifier_block *n)
|
||||||
|
{
|
||||||
|
return blocking_notifier_chain_unregister(&spu_switch_notifier, n);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(spu_switch_event_unregister);
|
||||||
|
|
||||||
|
void spu_set_profile_private_kref(struct spu_context *ctx,
|
||||||
|
struct kref *prof_info_kref,
|
||||||
|
void (* prof_info_release) (struct kref *kref))
|
||||||
|
{
|
||||||
|
ctx->prof_priv_kref = prof_info_kref;
|
||||||
|
ctx->prof_priv_release = prof_info_release;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(spu_set_profile_private_kref);
|
||||||
|
|
||||||
|
void *spu_get_profile_private_kref(struct spu_context *ctx)
|
||||||
|
{
|
||||||
|
return ctx->prof_priv_kref;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(spu_get_profile_private_kref);
|
||||||
|
|
|
@ -145,6 +145,20 @@ int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void notify_spus_active(void)
|
||||||
|
{
|
||||||
|
struct spufs_calls *calls;
|
||||||
|
|
||||||
|
calls = spufs_calls_get();
|
||||||
|
if (!calls)
|
||||||
|
return;
|
||||||
|
|
||||||
|
calls->notify_spus_active();
|
||||||
|
spufs_calls_put(calls);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int register_spu_syscalls(struct spufs_calls *calls)
|
int register_spu_syscalls(struct spufs_calls *calls)
|
||||||
{
|
{
|
||||||
if (spufs_calls)
|
if (spufs_calls)
|
||||||
|
|
|
@ -177,19 +177,3 @@ void spu_release_saved(struct spu_context *ctx)
|
||||||
spu_release(ctx);
|
spu_release(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spu_set_profile_private_kref(struct spu_context *ctx,
|
|
||||||
struct kref *prof_info_kref,
|
|
||||||
void ( * prof_info_release) (struct kref *kref))
|
|
||||||
{
|
|
||||||
ctx->prof_priv_kref = prof_info_kref;
|
|
||||||
ctx->prof_priv_release = prof_info_release;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(spu_set_profile_private_kref);
|
|
||||||
|
|
||||||
void *spu_get_profile_private_kref(struct spu_context *ctx)
|
|
||||||
{
|
|
||||||
return ctx->prof_priv_kref;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(spu_get_profile_private_kref);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,15 +182,7 @@ static int node_allowed(struct spu_context *ctx, int node)
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier);
|
void do_notify_spus_active(void)
|
||||||
|
|
||||||
void spu_switch_notify(struct spu *spu, struct spu_context *ctx)
|
|
||||||
{
|
|
||||||
blocking_notifier_call_chain(&spu_switch_notifier,
|
|
||||||
ctx ? ctx->object_id : 0, spu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void notify_spus_active(void)
|
|
||||||
{
|
{
|
||||||
int node;
|
int node;
|
||||||
|
|
||||||
|
@ -217,22 +209,6 @@ static void notify_spus_active(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int spu_switch_event_register(struct notifier_block * n)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
ret = blocking_notifier_chain_register(&spu_switch_notifier, n);
|
|
||||||
if (!ret)
|
|
||||||
notify_spus_active();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(spu_switch_event_register);
|
|
||||||
|
|
||||||
int spu_switch_event_unregister(struct notifier_block * n)
|
|
||||||
{
|
|
||||||
return blocking_notifier_chain_unregister(&spu_switch_notifier, n);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(spu_switch_event_unregister);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spu_bind_context - bind spu context to physical spu
|
* spu_bind_context - bind spu context to physical spu
|
||||||
* @spu: physical spu to bind to
|
* @spu: physical spu to bind to
|
||||||
|
|
|
@ -86,5 +86,6 @@ struct spufs_calls spufs_calls = {
|
||||||
.spu_run = do_spu_run,
|
.spu_run = do_spu_run,
|
||||||
.coredump_extra_notes_size = spufs_coredump_extra_notes_size,
|
.coredump_extra_notes_size = spufs_coredump_extra_notes_size,
|
||||||
.coredump_extra_notes_write = spufs_coredump_extra_notes_write,
|
.coredump_extra_notes_write = spufs_coredump_extra_notes_write,
|
||||||
|
.notify_spus_active = do_notify_spus_active,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
#include <asm/lmb.h>
|
#include <asm/lmb.h>
|
||||||
|
|
||||||
|
@ -37,6 +38,8 @@ enum os_area_ldr_format {
|
||||||
HEADER_LDR_FORMAT_GZIP = 1,
|
HEADER_LDR_FORMAT_GZIP = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define OS_AREA_HEADER_MAGIC_NUM "cell_ext_os_area"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct os_area_header - os area header segment.
|
* struct os_area_header - os area header segment.
|
||||||
* @magic_num: Always 'cell_ext_os_area'.
|
* @magic_num: Always 'cell_ext_os_area'.
|
||||||
|
@ -114,13 +117,11 @@ struct os_area_params {
|
||||||
u8 _reserved_5[8];
|
u8 _reserved_5[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
#define OS_AREA_DB_MAGIC_NUM "-db-"
|
||||||
OS_AREA_DB_MAGIC_NUM = 0x2d64622dU,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct os_area_db - Shared flash memory database.
|
* struct os_area_db - Shared flash memory database.
|
||||||
* @magic_num: Always '-db-' = 0x2d64622d.
|
* @magic_num: Always '-db-'.
|
||||||
* @version: os_area_db format version number.
|
* @version: os_area_db format version number.
|
||||||
* @index_64: byte offset of the database id index for 64 bit variables.
|
* @index_64: byte offset of the database id index for 64 bit variables.
|
||||||
* @count_64: number of usable 64 bit index entries
|
* @count_64: number of usable 64 bit index entries
|
||||||
|
@ -135,7 +136,7 @@ enum {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct os_area_db {
|
struct os_area_db {
|
||||||
u32 magic_num;
|
u8 magic_num[4];
|
||||||
u16 version;
|
u16 version;
|
||||||
u16 _reserved_1;
|
u16 _reserved_1;
|
||||||
u16 index_64;
|
u16 index_64;
|
||||||
|
@ -265,12 +266,26 @@ static void __init os_area_get_property(struct device_node *node,
|
||||||
prop->name);
|
prop->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_field(char *s, const u8 *field, int size_of_field)
|
||||||
|
{
|
||||||
|
#if defined(DEBUG)
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size_of_field; i++)
|
||||||
|
s[i] = isprint(field[i]) ? field[i] : '.';
|
||||||
|
s[i] = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#define dump_header(_a) _dump_header(_a, __func__, __LINE__)
|
#define dump_header(_a) _dump_header(_a, __func__, __LINE__)
|
||||||
static void _dump_header(const struct os_area_header *h, const char *func,
|
static void _dump_header(const struct os_area_header *h, const char *func,
|
||||||
int line)
|
int line)
|
||||||
{
|
{
|
||||||
|
char str[sizeof(h->magic_num) + 1];
|
||||||
|
|
||||||
|
dump_field(str, h->magic_num, sizeof(h->magic_num));
|
||||||
pr_debug("%s:%d: h.magic_num: '%s'\n", func, line,
|
pr_debug("%s:%d: h.magic_num: '%s'\n", func, line,
|
||||||
h->magic_num);
|
str);
|
||||||
pr_debug("%s:%d: h.hdr_version: %u\n", func, line,
|
pr_debug("%s:%d: h.hdr_version: %u\n", func, line,
|
||||||
h->hdr_version);
|
h->hdr_version);
|
||||||
pr_debug("%s:%d: h.db_area_offset: %u\n", func, line,
|
pr_debug("%s:%d: h.db_area_offset: %u\n", func, line,
|
||||||
|
@ -311,7 +326,8 @@ static void _dump_params(const struct os_area_params *p, const char *func,
|
||||||
|
|
||||||
static int verify_header(const struct os_area_header *header)
|
static int verify_header(const struct os_area_header *header)
|
||||||
{
|
{
|
||||||
if (memcmp(header->magic_num, "cell_ext_os_area", 16)) {
|
if (memcmp(header->magic_num, OS_AREA_HEADER_MAGIC_NUM,
|
||||||
|
sizeof(header->magic_num))) {
|
||||||
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
|
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -331,7 +347,8 @@ static int verify_header(const struct os_area_header *header)
|
||||||
|
|
||||||
static int db_verify(const struct os_area_db *db)
|
static int db_verify(const struct os_area_db *db)
|
||||||
{
|
{
|
||||||
if (db->magic_num != OS_AREA_DB_MAGIC_NUM) {
|
if (memcmp(db->magic_num, OS_AREA_DB_MAGIC_NUM,
|
||||||
|
sizeof(db->magic_num))) {
|
||||||
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
|
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -484,8 +501,11 @@ static int db_get_rtc_diff(const struct os_area_db *db, int64_t *rtc_diff)
|
||||||
static void _dump_db(const struct os_area_db *db, const char *func,
|
static void _dump_db(const struct os_area_db *db, const char *func,
|
||||||
int line)
|
int line)
|
||||||
{
|
{
|
||||||
|
char str[sizeof(db->magic_num) + 1];
|
||||||
|
|
||||||
|
dump_field(str, db->magic_num, sizeof(db->magic_num));
|
||||||
pr_debug("%s:%d: db.magic_num: '%s'\n", func, line,
|
pr_debug("%s:%d: db.magic_num: '%s'\n", func, line,
|
||||||
(const char*)&db->magic_num);
|
str);
|
||||||
pr_debug("%s:%d: db.version: %u\n", func, line,
|
pr_debug("%s:%d: db.version: %u\n", func, line,
|
||||||
db->version);
|
db->version);
|
||||||
pr_debug("%s:%d: db.index_64: %u\n", func, line,
|
pr_debug("%s:%d: db.index_64: %u\n", func, line,
|
||||||
|
@ -516,7 +536,7 @@ static void os_area_db_init(struct os_area_db *db)
|
||||||
|
|
||||||
memset(db, 0, sizeof(struct os_area_db));
|
memset(db, 0, sizeof(struct os_area_db));
|
||||||
|
|
||||||
db->magic_num = OS_AREA_DB_MAGIC_NUM;
|
memcpy(db->magic_num, OS_AREA_DB_MAGIC_NUM, sizeof(db->magic_num));
|
||||||
db->version = 1;
|
db->version = 1;
|
||||||
db->index_64 = HEADER_SIZE;
|
db->index_64 = HEADER_SIZE;
|
||||||
db->count_64 = VALUES_64_COUNT;
|
db->count_64 = VALUES_64_COUNT;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <asm/vdso_datapage.h>
|
#include <asm/vdso_datapage.h>
|
||||||
#include <asm/pSeries_reconfig.h>
|
#include <asm/pSeries_reconfig.h>
|
||||||
#include "xics.h"
|
#include "xics.h"
|
||||||
|
#include "plpar_wrappers.h"
|
||||||
|
|
||||||
/* This version can't take the spinlock, because it never returns */
|
/* This version can't take the spinlock, because it never returns */
|
||||||
static struct rtas_args rtas_stop_self_args = {
|
static struct rtas_args rtas_stop_self_args = {
|
||||||
|
@ -58,6 +59,7 @@ static void pseries_mach_cpu_die(void)
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
idle_task_exit();
|
idle_task_exit();
|
||||||
xics_teardown_cpu(0);
|
xics_teardown_cpu(0);
|
||||||
|
unregister_slb_shadow(hard_smp_processor_id(), __pa(get_slb_shadow()));
|
||||||
rtas_stop_self();
|
rtas_stop_self();
|
||||||
/* Should never get here... */
|
/* Should never get here... */
|
||||||
BUG();
|
BUG();
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Based upon code written by Ross Biro, Linus Torvalds, Bob Manson,
|
* Based upon code written by Ross Biro, Linus Torvalds, Bob Manson,
|
||||||
* and David Mosberger.
|
* and David Mosberger.
|
||||||
*
|
*
|
||||||
* Added Linux support -miguel (weird, eh?, the orignal code was meant
|
* Added Linux support -miguel (weird, eh?, the original code was meant
|
||||||
* to emulate SunOS).
|
* to emulate SunOS).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -436,7 +436,14 @@ void __init time_init(void)
|
||||||
|
|
||||||
static inline unsigned long do_gettimeoffset(void)
|
static inline unsigned long do_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
return (*master_l10_counter >> 10) & 0x1fffff;
|
unsigned long val = *master_l10_counter;
|
||||||
|
unsigned long usec = (val >> 10) & 0x1fffff;
|
||||||
|
|
||||||
|
/* Limit hit? */
|
||||||
|
if (val & 0x80000000)
|
||||||
|
usec += 1000000 / HZ;
|
||||||
|
|
||||||
|
return usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ok, my cute asm atomicity trick doesn't work anymore.
|
/* Ok, my cute asm atomicity trick doesn't work anymore.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling.
|
/* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1995, 1997, 2005 David S. Miller <davem@davemloft.net>
|
* Copyright (C) 1995, 1997, 2005, 2008 David S. Miller <davem@davemloft.net>
|
||||||
* Copyright (C) 1996 Eddie C. Dost (ecd@brainaid.de)
|
* Copyright (C) 1996 Eddie C. Dost (ecd@brainaid.de)
|
||||||
* Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
|
* Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
|
||||||
* Copyright (C) 1996,98,99 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
|
* Copyright (C) 1996,98,99 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
|
||||||
|
@ -226,6 +226,7 @@ kvmap_dtlb_load:
|
||||||
ba,pt %xcc, sun4v_dtlb_load
|
ba,pt %xcc, sun4v_dtlb_load
|
||||||
mov %g5, %g3
|
mov %g5, %g3
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
kvmap_vmemmap:
|
kvmap_vmemmap:
|
||||||
sub %g4, %g5, %g5
|
sub %g4, %g5, %g5
|
||||||
srlx %g5, 22, %g5
|
srlx %g5, 22, %g5
|
||||||
|
@ -234,6 +235,7 @@ kvmap_vmemmap:
|
||||||
or %g1, %lo(vmemmap_table), %g1
|
or %g1, %lo(vmemmap_table), %g1
|
||||||
ba,pt %xcc, kvmap_dtlb_load
|
ba,pt %xcc, kvmap_dtlb_load
|
||||||
ldx [%g1 + %g5], %g5
|
ldx [%g1 + %g5], %g5
|
||||||
|
#endif
|
||||||
|
|
||||||
kvmap_dtlb_nonlinear:
|
kvmap_dtlb_nonlinear:
|
||||||
/* Catch kernel NULL pointer derefs. */
|
/* Catch kernel NULL pointer derefs. */
|
||||||
|
@ -242,12 +244,14 @@ kvmap_dtlb_nonlinear:
|
||||||
bleu,pn %xcc, kvmap_dtlb_longpath
|
bleu,pn %xcc, kvmap_dtlb_longpath
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
/* Do not use the TSB for vmemmap. */
|
/* Do not use the TSB for vmemmap. */
|
||||||
mov (VMEMMAP_BASE >> 24), %g5
|
mov (VMEMMAP_BASE >> 24), %g5
|
||||||
sllx %g5, 24, %g5
|
sllx %g5, 24, %g5
|
||||||
cmp %g4,%g5
|
cmp %g4,%g5
|
||||||
bgeu,pn %xcc, kvmap_vmemmap
|
bgeu,pn %xcc, kvmap_vmemmap
|
||||||
nop
|
nop
|
||||||
|
#endif
|
||||||
|
|
||||||
KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
|
KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
|
||||||
|
|
||||||
|
|
|
@ -1275,4 +1275,20 @@ int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
|
||||||
return (device_mask & dma_addr_mask) == dma_addr_mask;
|
return (device_mask & dma_addr_mask) == dma_addr_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pci_resource_to_user(const struct pci_dev *pdev, int bar,
|
||||||
|
const struct resource *rp, resource_size_t *start,
|
||||||
|
resource_size_t *end)
|
||||||
|
{
|
||||||
|
struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
|
||||||
|
unsigned long offset;
|
||||||
|
|
||||||
|
if (rp->flags & IORESOURCE_IO)
|
||||||
|
offset = pbm->io_space.start;
|
||||||
|
else
|
||||||
|
offset = pbm->mem_space.start;
|
||||||
|
|
||||||
|
*start = rp->start - offset;
|
||||||
|
*end = rp->end - offset;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !(CONFIG_PCI) */
|
#endif /* !(CONFIG_PCI) */
|
||||||
|
|
|
@ -850,7 +850,7 @@ static int pbm_routes_this_ino(struct pci_pbm_info *pbm, u32 ino)
|
||||||
/* How the Tomatillo IRQs are routed around is pure guesswork here.
|
/* How the Tomatillo IRQs are routed around is pure guesswork here.
|
||||||
*
|
*
|
||||||
* All the Tomatillo devices I see in prtconf dumps seem to have only
|
* All the Tomatillo devices I see in prtconf dumps seem to have only
|
||||||
* a single PCI bus unit attached to it. It would seem they are seperate
|
* a single PCI bus unit attached to it. It would seem they are separate
|
||||||
* devices because their PortID (ie. JBUS ID) values are all different
|
* devices because their PortID (ie. JBUS ID) values are all different
|
||||||
* and thus the registers are mapped to totally different locations.
|
* and thus the registers are mapped to totally different locations.
|
||||||
*
|
*
|
||||||
|
|
|
@ -215,6 +215,7 @@ sun4v_itlb_error:
|
||||||
|
|
||||||
1: ba,pt %xcc, etrap
|
1: ba,pt %xcc, etrap
|
||||||
2: or %g7, %lo(2b), %g7
|
2: or %g7, %lo(2b), %g7
|
||||||
|
mov %l4, %o1
|
||||||
call sun4v_itlb_error_report
|
call sun4v_itlb_error_report
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
|
|
||||||
|
@ -241,6 +242,7 @@ sun4v_dtlb_error:
|
||||||
|
|
||||||
1: ba,pt %xcc, etrap
|
1: ba,pt %xcc, etrap
|
||||||
2: or %g7, %lo(2b), %g7
|
2: or %g7, %lo(2b), %g7
|
||||||
|
mov %l4, %o1
|
||||||
call sun4v_dtlb_error_report
|
call sun4v_dtlb_error_report
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
|
|
||||||
|
|
|
@ -1950,6 +1950,8 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl)
|
||||||
printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n",
|
printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n",
|
||||||
regs->tpc, tl);
|
regs->tpc, tl);
|
||||||
print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc);
|
print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc);
|
||||||
|
printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
|
||||||
|
print_symbol(KERN_EMERG "SUN4V-ITLB: O7<%s>\n", regs->u_regs[UREG_I7]);
|
||||||
printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] "
|
printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] "
|
||||||
"pte[%lx] error[%lx]\n",
|
"pte[%lx] error[%lx]\n",
|
||||||
sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
|
sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
|
||||||
|
@ -1971,6 +1973,8 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl)
|
||||||
printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n",
|
printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n",
|
||||||
regs->tpc, tl);
|
regs->tpc, tl);
|
||||||
print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc);
|
print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc);
|
||||||
|
printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
|
||||||
|
print_symbol(KERN_EMERG "SUN4V-DTLB: O7<%s>\n", regs->u_regs[UREG_I7]);
|
||||||
printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] "
|
printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] "
|
||||||
"pte[%lx] error[%lx]\n",
|
"pte[%lx] error[%lx]\n",
|
||||||
sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,
|
sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,
|
||||||
|
|
|
@ -79,14 +79,14 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
|
||||||
n = read(in_fds[0], &c, sizeof(c));
|
n = read(in_fds[0], &c, sizeof(c));
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
printk("harddog_open - EOF on watchdog pipe\n");
|
printk("harddog_open - EOF on watchdog pipe\n");
|
||||||
helper_wait(pid);
|
helper_wait(pid, 1, NULL);
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
goto out_close_out;
|
goto out_close_out;
|
||||||
}
|
}
|
||||||
else if (n < 0) {
|
else if (n < 0) {
|
||||||
printk("harddog_open - read of watchdog pipe failed, "
|
printk("harddog_open - read of watchdog pipe failed, "
|
||||||
"err = %d\n", errno);
|
"err = %d\n", errno);
|
||||||
helper_wait(pid);
|
helper_wait(pid, 1, NULL);
|
||||||
err = n;
|
err = n;
|
||||||
goto out_close_out;
|
goto out_close_out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2256,14 +2256,12 @@ static int __init apm_init(void)
|
||||||
apm_info.disabled = 1;
|
apm_info.disabled = 1;
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (PM_IS_ACTIVE()) {
|
if (pm_flags & PM_ACPI) {
|
||||||
printk(KERN_NOTICE "apm: overridden by ACPI.\n");
|
printk(KERN_NOTICE "apm: overridden by ACPI.\n");
|
||||||
apm_info.disabled = 1;
|
apm_info.disabled = 1;
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PM_LEGACY
|
pm_flags |= PM_APM;
|
||||||
pm_active = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up a segment that references the real mode segment 0x40
|
* Set up a segment that references the real mode segment 0x40
|
||||||
|
@ -2366,9 +2364,7 @@ static void __exit apm_exit(void)
|
||||||
kthread_stop(kapmd_task);
|
kthread_stop(kapmd_task);
|
||||||
kapmd_task = NULL;
|
kapmd_task = NULL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PM_LEGACY
|
pm_flags &= ~PM_APM;
|
||||||
pm_active = 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(apm_init);
|
module_init(apm_init);
|
||||||
|
|
|
@ -196,7 +196,7 @@ default_entry:
|
||||||
/* Do an early initialization of the fixmap area */
|
/* Do an early initialization of the fixmap area */
|
||||||
movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
|
movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
|
||||||
movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax
|
movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax
|
||||||
addl $0x007, %eax /* 0x007 = PRESENT+RW+USER */
|
addl $0x67, %eax /* 0x67 == _PAGE_TABLE */
|
||||||
movl %eax, 4092(%edx)
|
movl %eax, 4092(%edx)
|
||||||
|
|
||||||
xorl %ebx,%ebx /* This is the boot CPU (BSP) */
|
xorl %ebx,%ebx /* This is the boot CPU (BSP) */
|
||||||
|
|
|
@ -657,7 +657,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
|
||||||
hpet_pie_count = 0;
|
hpet_pie_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hpet_rtc_flags & RTC_PIE &&
|
if (hpet_rtc_flags & RTC_AIE &&
|
||||||
(curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
|
(curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
|
||||||
(curr_time.tm_min == hpet_alarm_time.tm_min) &&
|
(curr_time.tm_min == hpet_alarm_time.tm_min) &&
|
||||||
(curr_time.tm_hour == hpet_alarm_time.tm_hour))
|
(curr_time.tm_hour == hpet_alarm_time.tm_hour))
|
||||||
|
|
|
@ -2169,14 +2169,10 @@ static inline void __init check_timer(void)
|
||||||
{
|
{
|
||||||
int apic1, pin1, apic2, pin2;
|
int apic1, pin1, apic2, pin2;
|
||||||
int vector;
|
int vector;
|
||||||
unsigned int ver;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
|
||||||
ver = apic_read(APIC_LVR);
|
|
||||||
ver = GET_APIC_VERSION(ver);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get/set the timer IRQ vector:
|
* get/set the timer IRQ vector:
|
||||||
*/
|
*/
|
||||||
|
@ -2189,15 +2185,11 @@ static inline void __init check_timer(void)
|
||||||
* mode for the 8259A whenever interrupts are routed
|
* mode for the 8259A whenever interrupts are routed
|
||||||
* through I/O APICs. Also IRQ0 has to be enabled in
|
* through I/O APICs. Also IRQ0 has to be enabled in
|
||||||
* the 8259A which implies the virtual wire has to be
|
* the 8259A which implies the virtual wire has to be
|
||||||
* disabled in the local APIC. Finally timer interrupts
|
* disabled in the local APIC.
|
||||||
* need to be acknowledged manually in the 8259A for
|
|
||||||
* timer_interrupt() and for the i82489DX when using
|
|
||||||
* the NMI watchdog.
|
|
||||||
*/
|
*/
|
||||||
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
||||||
init_8259A(1);
|
init_8259A(1);
|
||||||
timer_ack = !cpu_has_tsc;
|
timer_ack = 1;
|
||||||
timer_ack |= (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
|
|
||||||
if (timer_over_8254 > 0)
|
if (timer_over_8254 > 0)
|
||||||
enable_8259A_irq(0);
|
enable_8259A_irq(0);
|
||||||
|
|
||||||
|
|
|
@ -278,12 +278,12 @@ static int mfgpt_next_event(unsigned long delta, struct clock_event_device *evt)
|
||||||
|
|
||||||
static irqreturn_t mfgpt_tick(int irq, void *dev_id)
|
static irqreturn_t mfgpt_tick(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
|
/* Turn off the clock (and clear the event) */
|
||||||
|
mfgpt_disable_timer(mfgpt_event_clock);
|
||||||
|
|
||||||
if (mfgpt_tick_mode == CLOCK_EVT_MODE_SHUTDOWN)
|
if (mfgpt_tick_mode == CLOCK_EVT_MODE_SHUTDOWN)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
|
||||||
/* Turn off the clock */
|
|
||||||
mfgpt_disable_timer(mfgpt_event_clock);
|
|
||||||
|
|
||||||
/* Clear the counter */
|
/* Clear the counter */
|
||||||
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_COUNTER, 0);
|
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_COUNTER, 0);
|
||||||
|
|
||||||
|
@ -319,10 +319,6 @@ static int __init mfgpt_timer_setup(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
mfgpt_event_clock = timer;
|
mfgpt_event_clock = timer;
|
||||||
/* Set the clock scale and enable the event mode for CMP2 */
|
|
||||||
val = MFGPT_SCALE | (3 << 8);
|
|
||||||
|
|
||||||
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_SETUP, val);
|
|
||||||
|
|
||||||
/* Set up the IRQ on the MFGPT side */
|
/* Set up the IRQ on the MFGPT side */
|
||||||
if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) {
|
if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) {
|
||||||
|
@ -339,6 +335,11 @@ static int __init mfgpt_timer_setup(void)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the clock scale and enable the event mode for CMP2 */
|
||||||
|
val = MFGPT_SCALE | (3 << 8);
|
||||||
|
|
||||||
|
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_SETUP, val);
|
||||||
|
|
||||||
/* Set up the clock event */
|
/* Set up the clock event */
|
||||||
mfgpt_clockevent.mult = div_sc(MFGPT_HZ, NSEC_PER_SEC, 32);
|
mfgpt_clockevent.mult = div_sc(MFGPT_HZ, NSEC_PER_SEC, 32);
|
||||||
mfgpt_clockevent.min_delta_ns = clockevent_delta2ns(0xF,
|
mfgpt_clockevent.min_delta_ns = clockevent_delta2ns(0xF,
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/nmi.h>
|
#include <asm/nmi.h>
|
||||||
#include <asm/timer.h>
|
|
||||||
|
|
||||||
#include "mach_traps.h"
|
#include "mach_traps.h"
|
||||||
|
|
||||||
|
@ -84,7 +83,7 @@ static int __init check_nmi_watchdog(void)
|
||||||
|
|
||||||
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
|
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
|
||||||
if (!prev_nmi_count)
|
if (!prev_nmi_count)
|
||||||
goto error;
|
return -1;
|
||||||
|
|
||||||
printk(KERN_INFO "Testing NMI watchdog ... ");
|
printk(KERN_INFO "Testing NMI watchdog ... ");
|
||||||
|
|
||||||
|
@ -119,7 +118,7 @@ static int __init check_nmi_watchdog(void)
|
||||||
if (!atomic_read(&nmi_active)) {
|
if (!atomic_read(&nmi_active)) {
|
||||||
kfree(prev_nmi_count);
|
kfree(prev_nmi_count);
|
||||||
atomic_set(&nmi_active, -1);
|
atomic_set(&nmi_active, -1);
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
printk("OK.\n");
|
printk("OK.\n");
|
||||||
|
|
||||||
|
@ -130,10 +129,6 @@ static int __init check_nmi_watchdog(void)
|
||||||
|
|
||||||
kfree(prev_nmi_count);
|
kfree(prev_nmi_count);
|
||||||
return 0;
|
return 0;
|
||||||
error:
|
|
||||||
timer_ack = !cpu_has_tsc;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
/* This needs to happen later in boot so counters are working */
|
/* This needs to happen later in boot so counters are working */
|
||||||
late_initcall(check_nmi_watchdog);
|
late_initcall(check_nmi_watchdog);
|
||||||
|
|
|
@ -204,6 +204,10 @@ void cpu_idle(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_nothing(void *unused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void cpu_idle_wait(void)
|
void cpu_idle_wait(void)
|
||||||
{
|
{
|
||||||
unsigned int cpu, this_cpu = get_cpu();
|
unsigned int cpu, this_cpu = get_cpu();
|
||||||
|
@ -228,6 +232,13 @@ void cpu_idle_wait(void)
|
||||||
cpu_clear(cpu, map);
|
cpu_clear(cpu, map);
|
||||||
}
|
}
|
||||||
cpus_and(map, map, cpu_online_map);
|
cpus_and(map, map, cpu_online_map);
|
||||||
|
/*
|
||||||
|
* We waited 1 sec, if a CPU still did not call idle
|
||||||
|
* it may be because it is in idle and not waking up
|
||||||
|
* because it has nothing to do.
|
||||||
|
* Give all the remaining CPUS a kick.
|
||||||
|
*/
|
||||||
|
smp_call_function_mask(map, do_nothing, 0, 0);
|
||||||
} while (!cpus_empty(map));
|
} while (!cpus_empty(map));
|
||||||
|
|
||||||
set_cpus_allowed(current, tmp);
|
set_cpus_allowed(current, tmp);
|
||||||
|
|
|
@ -135,6 +135,10 @@ static void poll_idle (void)
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_nothing(void *unused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void cpu_idle_wait(void)
|
void cpu_idle_wait(void)
|
||||||
{
|
{
|
||||||
unsigned int cpu, this_cpu = get_cpu();
|
unsigned int cpu, this_cpu = get_cpu();
|
||||||
|
@ -160,6 +164,13 @@ void cpu_idle_wait(void)
|
||||||
cpu_clear(cpu, map);
|
cpu_clear(cpu, map);
|
||||||
}
|
}
|
||||||
cpus_and(map, map, cpu_online_map);
|
cpus_and(map, map, cpu_online_map);
|
||||||
|
/*
|
||||||
|
* We waited 1 sec, if a CPU still did not call idle
|
||||||
|
* it may be because it is in idle and not waking up
|
||||||
|
* because it has nothing to do.
|
||||||
|
* Give all the remaining CPUS a kick.
|
||||||
|
*/
|
||||||
|
smp_call_function_mask(map, do_nothing, 0, 0);
|
||||||
} while (!cpus_empty(map));
|
} while (!cpus_empty(map));
|
||||||
|
|
||||||
set_cpus_allowed(current, tmp);
|
set_cpus_allowed(current, tmp);
|
||||||
|
|
|
@ -141,8 +141,8 @@ static void __cpuinit smp_store_cpu_info(int id)
|
||||||
struct cpuinfo_x86 *c = &cpu_data(id);
|
struct cpuinfo_x86 *c = &cpu_data(id);
|
||||||
|
|
||||||
*c = boot_cpu_data;
|
*c = boot_cpu_data;
|
||||||
identify_cpu(c);
|
|
||||||
c->cpu_index = id;
|
c->cpu_index = id;
|
||||||
|
identify_cpu(c);
|
||||||
print_cpu_info(c);
|
print_cpu_info(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,7 +526,7 @@ struct create_idle {
|
||||||
int cpu;
|
int cpu;
|
||||||
};
|
};
|
||||||
|
|
||||||
void do_fork_idle(struct work_struct *work)
|
static void __cpuinit do_fork_idle(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct create_idle *c_idle =
|
struct create_idle *c_idle =
|
||||||
container_of(work, struct create_idle, work);
|
container_of(work, struct create_idle, work);
|
||||||
|
|
|
@ -541,6 +541,7 @@ fastcall void do_##name(struct pt_regs * regs, long error_code) \
|
||||||
info.si_errno = 0; \
|
info.si_errno = 0; \
|
||||||
info.si_code = sicode; \
|
info.si_code = sicode; \
|
||||||
info.si_addr = (void __user *)siaddr; \
|
info.si_addr = (void __user *)siaddr; \
|
||||||
|
trace_hardirqs_fixup(); \
|
||||||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
||||||
== NOTIFY_STOP) \
|
== NOTIFY_STOP) \
|
||||||
return; \
|
return; \
|
||||||
|
|
|
@ -635,6 +635,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
|
||||||
info.si_errno = 0; \
|
info.si_errno = 0; \
|
||||||
info.si_code = sicode; \
|
info.si_code = sicode; \
|
||||||
info.si_addr = (void __user *)siaddr; \
|
info.si_addr = (void __user *)siaddr; \
|
||||||
|
trace_hardirqs_fixup(); \
|
||||||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
||||||
== NOTIFY_STOP) \
|
== NOTIFY_STOP) \
|
||||||
return; \
|
return; \
|
||||||
|
|
|
@ -321,8 +321,13 @@ extern void set_highmem_pages_init(int);
|
||||||
static void __init set_highmem_pages_init(int bad_ppro)
|
static void __init set_highmem_pages_init(int bad_ppro)
|
||||||
{
|
{
|
||||||
int pfn;
|
int pfn;
|
||||||
for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
|
for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) {
|
||||||
add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
|
/*
|
||||||
|
* Holes under sparsemem might not have no mem_map[]:
|
||||||
|
*/
|
||||||
|
if (pfn_valid(pfn))
|
||||||
|
add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
|
||||||
|
}
|
||||||
totalram_pages += totalhigh_pages;
|
totalram_pages += totalhigh_pages;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_FLATMEM */
|
#endif /* CONFIG_FLATMEM */
|
||||||
|
|
|
@ -380,7 +380,7 @@ static int __init ppro_init(char ** cpu_type)
|
||||||
|
|
||||||
if (cpu_model == 14)
|
if (cpu_model == 14)
|
||||||
*cpu_type = "i386/core";
|
*cpu_type = "i386/core";
|
||||||
else if (cpu_model == 15)
|
else if (cpu_model == 15 || cpu_model == 23)
|
||||||
*cpu_type = "i386/core_2";
|
*cpu_type = "i386/core_2";
|
||||||
else if (cpu_model > 0xd)
|
else if (cpu_model > 0xd)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
static DEFINE_PER_CPU(unsigned long long, blk_trace_cpu_offset) = { 0, };
|
|
||||||
static unsigned int blktrace_seq __read_mostly = 1;
|
static unsigned int blktrace_seq __read_mostly = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -41,7 +40,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
|
||||||
const int cpu = smp_processor_id();
|
const int cpu = smp_processor_id();
|
||||||
|
|
||||||
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
||||||
t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
|
t->time = ktime_to_ns(ktime_get());
|
||||||
t->device = bt->dev;
|
t->device = bt->dev;
|
||||||
t->action = action;
|
t->action = action;
|
||||||
t->pid = pid;
|
t->pid = pid;
|
||||||
|
@ -159,7 +158,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
||||||
|
|
||||||
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
||||||
t->sequence = ++(*sequence);
|
t->sequence = ++(*sequence);
|
||||||
t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
|
t->time = ktime_to_ns(ktime_get());
|
||||||
t->sector = sector;
|
t->sector = sector;
|
||||||
t->bytes = bytes;
|
t->bytes = bytes;
|
||||||
t->action = what;
|
t->action = what;
|
||||||
|
@ -179,7 +178,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
||||||
EXPORT_SYMBOL_GPL(__blk_add_trace);
|
EXPORT_SYMBOL_GPL(__blk_add_trace);
|
||||||
|
|
||||||
static struct dentry *blk_tree_root;
|
static struct dentry *blk_tree_root;
|
||||||
static struct mutex blk_tree_mutex;
|
static DEFINE_MUTEX(blk_tree_mutex);
|
||||||
static unsigned int root_users;
|
static unsigned int root_users;
|
||||||
|
|
||||||
static inline void blk_remove_root(void)
|
static inline void blk_remove_root(void)
|
||||||
|
@ -505,77 +504,3 @@ void blk_trace_shutdown(struct request_queue *q)
|
||||||
blk_trace_remove(q);
|
blk_trace_remove(q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Average offset over two calls to cpu_clock() with a gettimeofday()
|
|
||||||
* in the middle
|
|
||||||
*/
|
|
||||||
static void blk_check_time(unsigned long long *t, int this_cpu)
|
|
||||||
{
|
|
||||||
unsigned long long a, b;
|
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
a = cpu_clock(this_cpu);
|
|
||||||
do_gettimeofday(&tv);
|
|
||||||
b = cpu_clock(this_cpu);
|
|
||||||
|
|
||||||
*t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
|
|
||||||
*t -= (a + b) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* calibrate our inter-CPU timings
|
|
||||||
*/
|
|
||||||
static void blk_trace_check_cpu_time(void *data)
|
|
||||||
{
|
|
||||||
unsigned long long *t;
|
|
||||||
int this_cpu = get_cpu();
|
|
||||||
|
|
||||||
t = &per_cpu(blk_trace_cpu_offset, this_cpu);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Just call it twice, hopefully the second call will be cache hot
|
|
||||||
* and a little more precise
|
|
||||||
*/
|
|
||||||
blk_check_time(t, this_cpu);
|
|
||||||
blk_check_time(t, this_cpu);
|
|
||||||
|
|
||||||
put_cpu();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void blk_trace_set_ht_offsets(void)
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_SCHED_SMT)
|
|
||||||
int cpu, i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* now make sure HT siblings have the same time offset
|
|
||||||
*/
|
|
||||||
preempt_disable();
|
|
||||||
for_each_online_cpu(cpu) {
|
|
||||||
unsigned long long *cpu_off, *sibling_off;
|
|
||||||
|
|
||||||
for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) {
|
|
||||||
if (i == cpu)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
cpu_off = &per_cpu(blk_trace_cpu_offset, cpu);
|
|
||||||
sibling_off = &per_cpu(blk_trace_cpu_offset, i);
|
|
||||||
*sibling_off = *cpu_off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preempt_enable();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static __init int blk_trace_init(void)
|
|
||||||
{
|
|
||||||
mutex_init(&blk_tree_mutex);
|
|
||||||
on_each_cpu(blk_trace_check_cpu_time, NULL, 1, 1);
|
|
||||||
blk_trace_set_ht_offsets();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(blk_trace_init);
|
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,12 @@ config ACPI_PROCFS_POWER
|
||||||
and functions, which do not yet exist in /sys
|
and functions, which do not yet exist in /sys
|
||||||
|
|
||||||
Say N to delete power /proc/acpi/ folders that have moved to /sys/
|
Say N to delete power /proc/acpi/ folders that have moved to /sys/
|
||||||
|
config ACPI_SYSFS_POWER
|
||||||
|
bool "Future power /sys interface"
|
||||||
|
select POWER_SUPPLY
|
||||||
|
default y
|
||||||
|
---help---
|
||||||
|
Say N to disable power /sys interface
|
||||||
config ACPI_PROC_EVENT
|
config ACPI_PROC_EVENT
|
||||||
bool "Deprecated /proc/acpi/event support"
|
bool "Deprecated /proc/acpi/event support"
|
||||||
depends on PROC_FS
|
depends on PROC_FS
|
||||||
|
@ -103,7 +109,6 @@ config ACPI_PROC_EVENT
|
||||||
config ACPI_AC
|
config ACPI_AC
|
||||||
tristate "AC Adapter"
|
tristate "AC Adapter"
|
||||||
depends on X86
|
depends on X86
|
||||||
select POWER_SUPPLY
|
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
This driver adds support for the AC Adapter object, which indicates
|
This driver adds support for the AC Adapter object, which indicates
|
||||||
|
@ -113,7 +118,6 @@ config ACPI_AC
|
||||||
config ACPI_BATTERY
|
config ACPI_BATTERY
|
||||||
tristate "Battery"
|
tristate "Battery"
|
||||||
depends on X86
|
depends on X86
|
||||||
select POWER_SUPPLY
|
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
This driver adds support for battery information through
|
This driver adds support for battery information through
|
||||||
|
@ -368,7 +372,6 @@ config ACPI_HOTPLUG_MEMORY
|
||||||
config ACPI_SBS
|
config ACPI_SBS
|
||||||
tristate "Smart Battery System"
|
tristate "Smart Battery System"
|
||||||
depends on X86
|
depends on X86
|
||||||
select POWER_SUPPLY
|
|
||||||
help
|
help
|
||||||
This driver adds support for the Smart Battery System, another
|
This driver adds support for the Smart Battery System, another
|
||||||
type of access to battery information, found on some laptops.
|
type of access to battery information, found on some laptops.
|
||||||
|
|
|
@ -31,7 +31,9 @@
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
#include <linux/power_supply.h>
|
#include <linux/power_supply.h>
|
||||||
|
#endif
|
||||||
#include <acpi/acpi_bus.h>
|
#include <acpi/acpi_bus.h>
|
||||||
#include <acpi/acpi_drivers.h>
|
#include <acpi/acpi_drivers.h>
|
||||||
|
|
||||||
|
@ -79,7 +81,9 @@ static struct acpi_driver acpi_ac_driver = {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct acpi_ac {
|
struct acpi_ac {
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
struct power_supply charger;
|
struct power_supply charger;
|
||||||
|
#endif
|
||||||
struct acpi_device * device;
|
struct acpi_device * device;
|
||||||
unsigned long state;
|
unsigned long state;
|
||||||
};
|
};
|
||||||
|
@ -94,7 +98,7 @@ static const struct file_operations acpi_ac_fops = {
|
||||||
.release = single_release,
|
.release = single_release,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
static int get_ac_property(struct power_supply *psy,
|
static int get_ac_property(struct power_supply *psy,
|
||||||
enum power_supply_property psp,
|
enum power_supply_property psp,
|
||||||
union power_supply_propval *val)
|
union power_supply_propval *val)
|
||||||
|
@ -113,7 +117,7 @@ static int get_ac_property(struct power_supply *psy,
|
||||||
static enum power_supply_property ac_props[] = {
|
static enum power_supply_property ac_props[] = {
|
||||||
POWER_SUPPLY_PROP_ONLINE,
|
POWER_SUPPLY_PROP_ONLINE,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
AC Adapter Management
|
AC Adapter Management
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
@ -241,7 +245,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
|
||||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
device->dev.bus_id, event,
|
device->dev.bus_id, event,
|
||||||
(u32) ac->state);
|
(u32) ac->state);
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
@ -280,12 +286,14 @@ static int acpi_ac_add(struct acpi_device *device)
|
||||||
#endif
|
#endif
|
||||||
if (result)
|
if (result)
|
||||||
goto end;
|
goto end;
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
ac->charger.name = acpi_device_bid(device);
|
ac->charger.name = acpi_device_bid(device);
|
||||||
ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
||||||
ac->charger.properties = ac_props;
|
ac->charger.properties = ac_props;
|
||||||
ac->charger.num_properties = ARRAY_SIZE(ac_props);
|
ac->charger.num_properties = ARRAY_SIZE(ac_props);
|
||||||
ac->charger.get_property = get_ac_property;
|
ac->charger.get_property = get_ac_property;
|
||||||
power_supply_register(&ac->device->dev, &ac->charger);
|
power_supply_register(&ac->device->dev, &ac->charger);
|
||||||
|
#endif
|
||||||
status = acpi_install_notify_handler(device->handle,
|
status = acpi_install_notify_handler(device->handle,
|
||||||
ACPI_ALL_NOTIFY, acpi_ac_notify,
|
ACPI_ALL_NOTIFY, acpi_ac_notify,
|
||||||
ac);
|
ac);
|
||||||
|
@ -319,8 +327,10 @@ static int acpi_ac_resume(struct acpi_device *device)
|
||||||
old_state = ac->state;
|
old_state = ac->state;
|
||||||
if (acpi_ac_get_state(ac))
|
if (acpi_ac_get_state(ac))
|
||||||
return 0;
|
return 0;
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (old_state != ac->state)
|
if (old_state != ac->state)
|
||||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,8 +347,10 @@ static int acpi_ac_remove(struct acpi_device *device, int type)
|
||||||
|
|
||||||
status = acpi_remove_notify_handler(device->handle,
|
status = acpi_remove_notify_handler(device->handle,
|
||||||
ACPI_ALL_NOTIFY, acpi_ac_notify);
|
ACPI_ALL_NOTIFY, acpi_ac_notify);
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (ac->charger.dev)
|
if (ac->charger.dev)
|
||||||
power_supply_unregister(&ac->charger);
|
power_supply_unregister(&ac->charger);
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
acpi_ac_remove_fs(device);
|
acpi_ac_remove_fs(device);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -40,7 +40,9 @@
|
||||||
#include <acpi/acpi_bus.h>
|
#include <acpi/acpi_bus.h>
|
||||||
#include <acpi/acpi_drivers.h>
|
#include <acpi/acpi_drivers.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
#include <linux/power_supply.h>
|
#include <linux/power_supply.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
|
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
|
||||||
|
|
||||||
|
@ -86,7 +88,9 @@ MODULE_DEVICE_TABLE(acpi, battery_device_ids);
|
||||||
|
|
||||||
struct acpi_battery {
|
struct acpi_battery {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
struct power_supply bat;
|
struct power_supply bat;
|
||||||
|
#endif
|
||||||
struct acpi_device *device;
|
struct acpi_device *device;
|
||||||
unsigned long update_time;
|
unsigned long update_time;
|
||||||
int current_now;
|
int current_now;
|
||||||
|
@ -117,6 +121,7 @@ inline int acpi_battery_present(struct acpi_battery *battery)
|
||||||
return battery->device->status.battery_present;
|
return battery->device->status.battery_present;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
static int acpi_battery_technology(struct acpi_battery *battery)
|
static int acpi_battery_technology(struct acpi_battery *battery)
|
||||||
{
|
{
|
||||||
if (!strcasecmp("NiCd", battery->type))
|
if (!strcasecmp("NiCd", battery->type))
|
||||||
|
@ -222,6 +227,7 @@ static enum power_supply_property energy_battery_props[] = {
|
||||||
POWER_SUPPLY_PROP_MODEL_NAME,
|
POWER_SUPPLY_PROP_MODEL_NAME,
|
||||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
inline char *acpi_battery_units(struct acpi_battery *battery)
|
inline char *acpi_battery_units(struct acpi_battery *battery)
|
||||||
|
@ -398,6 +404,7 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
|
||||||
return acpi_battery_set_alarm(battery);
|
return acpi_battery_set_alarm(battery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
|
@ -429,11 +436,6 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
battery->update_time = 0;
|
|
||||||
result = acpi_battery_get_info(battery);
|
|
||||||
acpi_battery_init_alarm(battery);
|
|
||||||
if (result)
|
|
||||||
return result;
|
|
||||||
if (battery->power_unit) {
|
if (battery->power_unit) {
|
||||||
battery->bat.properties = charge_battery_props;
|
battery->bat.properties = charge_battery_props;
|
||||||
battery->bat.num_properties =
|
battery->bat.num_properties =
|
||||||
|
@ -462,18 +464,31 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
|
||||||
power_supply_unregister(&battery->bat);
|
power_supply_unregister(&battery->bat);
|
||||||
battery->bat.dev = NULL;
|
battery->bat.dev = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int acpi_battery_update(struct acpi_battery *battery)
|
static int acpi_battery_update(struct acpi_battery *battery)
|
||||||
{
|
{
|
||||||
int result = acpi_battery_get_status(battery);
|
int result;
|
||||||
|
result = acpi_battery_get_status(battery);
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (!acpi_battery_present(battery)) {
|
if (!acpi_battery_present(battery)) {
|
||||||
sysfs_remove_battery(battery);
|
sysfs_remove_battery(battery);
|
||||||
|
battery->update_time = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
if (!battery->update_time) {
|
||||||
|
result = acpi_battery_get_info(battery);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
acpi_battery_init_alarm(battery);
|
||||||
|
}
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (!battery->bat.dev)
|
if (!battery->bat.dev)
|
||||||
sysfs_add_battery(battery);
|
sysfs_add_battery(battery);
|
||||||
|
#endif
|
||||||
return acpi_battery_get_state(battery);
|
return acpi_battery_get_state(battery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,9 +782,11 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
|
||||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
device->dev.bus_id, event,
|
device->dev.bus_id, event,
|
||||||
acpi_battery_present(battery));
|
acpi_battery_present(battery));
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
/* acpi_batter_update could remove power_supply object */
|
/* acpi_batter_update could remove power_supply object */
|
||||||
if (battery->bat.dev)
|
if (battery->bat.dev)
|
||||||
kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE);
|
kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_battery_add(struct acpi_device *device)
|
static int acpi_battery_add(struct acpi_device *device)
|
||||||
|
@ -828,7 +845,9 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
acpi_battery_remove_fs(device);
|
acpi_battery_remove_fs(device);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
sysfs_remove_battery(battery);
|
sysfs_remove_battery(battery);
|
||||||
|
#endif
|
||||||
mutex_destroy(&battery->lock);
|
mutex_destroy(&battery->lock);
|
||||||
kfree(battery);
|
kfree(battery);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/pm_legacy.h>
|
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
|
@ -764,16 +763,14 @@ static int __init acpi_init(void)
|
||||||
result = acpi_bus_init();
|
result = acpi_bus_init();
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
#ifdef CONFIG_PM_LEGACY
|
if (!(pm_flags & PM_APM))
|
||||||
if (!PM_IS_ACTIVE())
|
pm_flags |= PM_ACPI;
|
||||||
pm_active = 1;
|
|
||||||
else {
|
else {
|
||||||
printk(KERN_INFO PREFIX
|
printk(KERN_INFO PREFIX
|
||||||
"APM is already active, exiting\n");
|
"APM is already active, exiting\n");
|
||||||
disable_acpi();
|
disable_acpi();
|
||||||
result = -ENODEV;
|
result = -ENODEV;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
} else
|
} else
|
||||||
disable_acpi();
|
disable_acpi();
|
||||||
|
|
||||||
|
|
|
@ -892,6 +892,17 @@ static int acpi_ec_stop(struct acpi_device *device, int type)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init acpi_boot_ec_enable(void)
|
||||||
|
{
|
||||||
|
if (!boot_ec || boot_ec->handlers_installed)
|
||||||
|
return 0;
|
||||||
|
if (!ec_install_handlers(boot_ec)) {
|
||||||
|
first_ec = boot_ec;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
int __init acpi_ec_ecdt_probe(void)
|
int __init acpi_ec_ecdt_probe(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -924,9 +935,10 @@ int __init acpi_ec_ecdt_probe(void)
|
||||||
goto error;
|
goto error;
|
||||||
/* We really need to limit this workaround, the only ASUS,
|
/* We really need to limit this workaround, the only ASUS,
|
||||||
* which needs it, has fake EC._INI method, so use it as flag.
|
* which needs it, has fake EC._INI method, so use it as flag.
|
||||||
|
* Keep boot_ec struct as it will be needed soon.
|
||||||
*/
|
*/
|
||||||
if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
|
if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
|
||||||
goto error;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ec_install_handlers(boot_ec);
|
ret = ec_install_handlers(boot_ec);
|
||||||
|
|
|
@ -344,7 +344,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||||
* setup will potentially execute control methods
|
* setup will potentially execute control methods
|
||||||
* (e.g., _REG method for this region)
|
* (e.g., _REG method for this region)
|
||||||
*/
|
*/
|
||||||
acpi_ex_relinquish_interpreter();
|
acpi_ex_exit_interpreter();
|
||||||
|
|
||||||
status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
|
status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
|
||||||
handler_desc->address_space.context,
|
handler_desc->address_space.context,
|
||||||
|
@ -352,7 +352,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||||
|
|
||||||
/* Re-enter the interpreter */
|
/* Re-enter the interpreter */
|
||||||
|
|
||||||
acpi_ex_reacquire_interpreter();
|
acpi_ex_enter_interpreter();
|
||||||
|
|
||||||
/* Check for failure of the Region Setup */
|
/* Check for failure of the Region Setup */
|
||||||
|
|
||||||
|
@ -405,7 +405,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||||
* exit the interpreter because the handler *might* block -- we don't
|
* exit the interpreter because the handler *might* block -- we don't
|
||||||
* know what it will do, so we can't hold the lock on the intepreter.
|
* know what it will do, so we can't hold the lock on the intepreter.
|
||||||
*/
|
*/
|
||||||
acpi_ex_relinquish_interpreter();
|
acpi_ex_exit_interpreter();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call the handler */
|
/* Call the handler */
|
||||||
|
@ -426,7 +426,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||||
* We just returned from a non-default handler, we must re-enter the
|
* We just returned from a non-default handler, we must re-enter the
|
||||||
* interpreter
|
* interpreter
|
||||||
*/
|
*/
|
||||||
acpi_ex_reacquire_interpreter();
|
acpi_ex_enter_interpreter();
|
||||||
}
|
}
|
||||||
|
|
||||||
return_ACPI_STATUS(status);
|
return_ACPI_STATUS(status);
|
||||||
|
|
|
@ -429,6 +429,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
|
||||||
&polarity, &link,
|
&polarity, &link,
|
||||||
acpi_pci_allocate_irq);
|
acpi_pci_allocate_irq);
|
||||||
|
|
||||||
|
if (irq < 0) {
|
||||||
|
/*
|
||||||
|
* IDE legacy mode controller IRQs are magic. Why do compat
|
||||||
|
* extensions always make such a nasty mess.
|
||||||
|
*/
|
||||||
|
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
|
||||||
|
(dev->class & 0x05) == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* No IRQ known to the ACPI subsystem - maybe the BIOS /
|
* No IRQ known to the ACPI subsystem - maybe the BIOS /
|
||||||
* driver reported one, then use it. Exit in any case.
|
* driver reported one, then use it. Exit in any case.
|
||||||
|
|
|
@ -76,7 +76,11 @@ static void (*pm_idle_save) (void) __read_mostly;
|
||||||
#define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
|
#define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
|
||||||
|
|
||||||
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
|
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
|
||||||
|
#ifdef CONFIG_CPU_IDLE
|
||||||
module_param(max_cstate, uint, 0000);
|
module_param(max_cstate, uint, 0000);
|
||||||
|
#else
|
||||||
|
module_param(max_cstate, uint, 0644);
|
||||||
|
#endif
|
||||||
static unsigned int nocst __read_mostly;
|
static unsigned int nocst __read_mostly;
|
||||||
module_param(nocst, uint, 0000);
|
module_param(nocst, uint, 0000);
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,9 @@
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
#include <linux/power_supply.h>
|
#include <linux/power_supply.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sbshc.h"
|
#include "sbshc.h"
|
||||||
|
|
||||||
|
@ -80,7 +82,9 @@ static const struct acpi_device_id sbs_device_ids[] = {
|
||||||
MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
|
MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
|
||||||
|
|
||||||
struct acpi_battery {
|
struct acpi_battery {
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
struct power_supply bat;
|
struct power_supply bat;
|
||||||
|
#endif
|
||||||
struct acpi_sbs *sbs;
|
struct acpi_sbs *sbs;
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
struct proc_dir_entry *proc_entry;
|
struct proc_dir_entry *proc_entry;
|
||||||
|
@ -113,7 +117,9 @@ struct acpi_battery {
|
||||||
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
||||||
|
|
||||||
struct acpi_sbs {
|
struct acpi_sbs {
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
struct power_supply charger;
|
struct power_supply charger;
|
||||||
|
#endif
|
||||||
struct acpi_device *device;
|
struct acpi_device *device;
|
||||||
struct acpi_smb_hc *hc;
|
struct acpi_smb_hc *hc;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
|
@ -157,6 +163,7 @@ static inline int acpi_battery_scale(struct acpi_battery *battery)
|
||||||
acpi_battery_ipscale(battery);
|
acpi_battery_ipscale(battery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
static int sbs_get_ac_property(struct power_supply *psy,
|
static int sbs_get_ac_property(struct power_supply *psy,
|
||||||
enum power_supply_property psp,
|
enum power_supply_property psp,
|
||||||
union power_supply_propval *val)
|
union power_supply_propval *val)
|
||||||
|
@ -294,6 +301,7 @@ static enum power_supply_property sbs_energy_battery_props[] = {
|
||||||
POWER_SUPPLY_PROP_MODEL_NAME,
|
POWER_SUPPLY_PROP_MODEL_NAME,
|
||||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
Smart Battery System Management
|
Smart Battery System Management
|
||||||
|
@ -429,6 +437,7 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
|
@ -458,6 +467,7 @@ static struct device_attribute alarm_attr = {
|
||||||
.show = acpi_battery_alarm_show,
|
.show = acpi_battery_alarm_show,
|
||||||
.store = acpi_battery_alarm_store,
|
.store = acpi_battery_alarm_store,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
FS Interface (/proc/acpi)
|
FS Interface (/proc/acpi)
|
||||||
|
@ -793,6 +803,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||||
&acpi_battery_state_fops, &acpi_battery_alarm_fops,
|
&acpi_battery_state_fops, &acpi_battery_alarm_fops,
|
||||||
battery);
|
battery);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
battery->bat.name = battery->name;
|
battery->bat.name = battery->name;
|
||||||
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
|
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
|
||||||
if (!acpi_battery_mode(battery)) {
|
if (!acpi_battery_mode(battery)) {
|
||||||
|
@ -813,6 +824,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||||
goto end;
|
goto end;
|
||||||
battery->have_sysfs_alarm = 1;
|
battery->have_sysfs_alarm = 1;
|
||||||
end:
|
end:
|
||||||
|
#endif
|
||||||
printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
|
printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
|
||||||
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
||||||
battery->name, sbs->battery->present ? "present" : "absent");
|
battery->name, sbs->battery->present ? "present" : "absent");
|
||||||
|
@ -822,12 +834,13 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||||
static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
|
static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
|
||||||
{
|
{
|
||||||
struct acpi_battery *battery = &sbs->battery[id];
|
struct acpi_battery *battery = &sbs->battery[id];
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (battery->bat.dev) {
|
if (battery->bat.dev) {
|
||||||
if (battery->have_sysfs_alarm)
|
if (battery->have_sysfs_alarm)
|
||||||
device_remove_file(battery->bat.dev, &alarm_attr);
|
device_remove_file(battery->bat.dev, &alarm_attr);
|
||||||
power_supply_unregister(&battery->bat);
|
power_supply_unregister(&battery->bat);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
if (battery->proc_entry)
|
if (battery->proc_entry)
|
||||||
acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
|
acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
|
||||||
|
@ -848,12 +861,14 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||||
if (result)
|
if (result)
|
||||||
goto end;
|
goto end;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
sbs->charger.name = "sbs-charger";
|
sbs->charger.name = "sbs-charger";
|
||||||
sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
||||||
sbs->charger.properties = sbs_ac_props;
|
sbs->charger.properties = sbs_ac_props;
|
||||||
sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
|
sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
|
||||||
sbs->charger.get_property = sbs_get_ac_property;
|
sbs->charger.get_property = sbs_get_ac_property;
|
||||||
power_supply_register(&sbs->device->dev, &sbs->charger);
|
power_supply_register(&sbs->device->dev, &sbs->charger);
|
||||||
|
#endif
|
||||||
printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
|
printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
|
||||||
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
||||||
ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
|
ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
|
||||||
|
@ -863,8 +878,10 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||||
|
|
||||||
static void acpi_charger_remove(struct acpi_sbs *sbs)
|
static void acpi_charger_remove(struct acpi_sbs *sbs)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
if (sbs->charger.dev)
|
if (sbs->charger.dev)
|
||||||
power_supply_unregister(&sbs->charger);
|
power_supply_unregister(&sbs->charger);
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
if (sbs->charger_entry)
|
if (sbs->charger_entry)
|
||||||
acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
|
acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
|
||||||
|
@ -885,7 +902,9 @@ void acpi_sbs_callback(void *context)
|
||||||
ACPI_SBS_NOTIFY_STATUS,
|
ACPI_SBS_NOTIFY_STATUS,
|
||||||
sbs->charger_present);
|
sbs->charger_present);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
|
kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (sbs->manager_present) {
|
if (sbs->manager_present) {
|
||||||
for (id = 0; id < MAX_SBS_BAT; ++id) {
|
for (id = 0; id < MAX_SBS_BAT; ++id) {
|
||||||
|
@ -902,7 +921,9 @@ void acpi_sbs_callback(void *context)
|
||||||
ACPI_SBS_NOTIFY_STATUS,
|
ACPI_SBS_NOTIFY_STATUS,
|
||||||
bat->present);
|
bat->present);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||||
kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
|
kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1449,6 +1449,8 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init acpi_boot_ec_enable(void);
|
||||||
|
|
||||||
static int __init acpi_scan_init(void)
|
static int __init acpi_scan_init(void)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
@ -1480,6 +1482,10 @@ static int __init acpi_scan_init(void)
|
||||||
* Enumerate devices in the ACPI namespace.
|
* Enumerate devices in the ACPI namespace.
|
||||||
*/
|
*/
|
||||||
result = acpi_bus_scan_fixed(acpi_root);
|
result = acpi_bus_scan_fixed(acpi_root);
|
||||||
|
|
||||||
|
/* EC region might be needed at bus_scan, so enable it now */
|
||||||
|
acpi_boot_ec_enable();
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
result = acpi_bus_scan(acpi_root, &ops);
|
result = acpi_bus_scan(acpi_root, &ops);
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,7 @@ enum {
|
||||||
ich8_2port_sata,
|
ich8_2port_sata,
|
||||||
ich8m_apple_sata_ahci, /* locks up on second port enable */
|
ich8m_apple_sata_ahci, /* locks up on second port enable */
|
||||||
tolapai_sata_ahci,
|
tolapai_sata_ahci,
|
||||||
|
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
|
||||||
|
|
||||||
/* constants for mapping table */
|
/* constants for mapping table */
|
||||||
P0 = 0, /* port 0 */
|
P0 = 0, /* port 0 */
|
||||||
|
@ -165,6 +166,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev);
|
||||||
static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev);
|
static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev);
|
||||||
static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev);
|
static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev);
|
||||||
static int ich_pata_cable_detect(struct ata_port *ap);
|
static int ich_pata_cable_detect(struct ata_port *ap);
|
||||||
|
static u8 piix_vmw_bmdma_status(struct ata_port *ap);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
|
static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
|
||||||
static int piix_pci_device_resume(struct pci_dev *pdev);
|
static int piix_pci_device_resume(struct pci_dev *pdev);
|
||||||
|
@ -175,6 +177,8 @@ static unsigned int in_module_init = 1;
|
||||||
static const struct pci_device_id piix_pci_tbl[] = {
|
static const struct pci_device_id piix_pci_tbl[] = {
|
||||||
/* Intel PIIX3 for the 430HX etc */
|
/* Intel PIIX3 for the 430HX etc */
|
||||||
{ 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
|
{ 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
|
||||||
|
/* VMware ICH4 */
|
||||||
|
{ 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw },
|
||||||
/* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
|
/* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
|
||||||
/* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
|
/* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
|
||||||
{ 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
|
{ 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
|
||||||
|
@ -383,6 +387,38 @@ static const struct ata_port_operations piix_sata_ops = {
|
||||||
.port_start = ata_port_start,
|
.port_start = ata_port_start,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct ata_port_operations piix_vmw_ops = {
|
||||||
|
.set_piomode = piix_set_piomode,
|
||||||
|
.set_dmamode = piix_set_dmamode,
|
||||||
|
.mode_filter = ata_pci_default_filter,
|
||||||
|
|
||||||
|
.tf_load = ata_tf_load,
|
||||||
|
.tf_read = ata_tf_read,
|
||||||
|
.check_status = ata_check_status,
|
||||||
|
.exec_command = ata_exec_command,
|
||||||
|
.dev_select = ata_std_dev_select,
|
||||||
|
|
||||||
|
.bmdma_setup = ata_bmdma_setup,
|
||||||
|
.bmdma_start = ata_bmdma_start,
|
||||||
|
.bmdma_stop = ata_bmdma_stop,
|
||||||
|
.bmdma_status = piix_vmw_bmdma_status,
|
||||||
|
.qc_prep = ata_qc_prep,
|
||||||
|
.qc_issue = ata_qc_issue_prot,
|
||||||
|
.data_xfer = ata_data_xfer,
|
||||||
|
|
||||||
|
.freeze = ata_bmdma_freeze,
|
||||||
|
.thaw = ata_bmdma_thaw,
|
||||||
|
.error_handler = piix_pata_error_handler,
|
||||||
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||||
|
.cable_detect = ata_cable_40wire,
|
||||||
|
|
||||||
|
.irq_handler = ata_interrupt,
|
||||||
|
.irq_clear = ata_bmdma_irq_clear,
|
||||||
|
.irq_on = ata_irq_on,
|
||||||
|
|
||||||
|
.port_start = ata_port_start,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct piix_map_db ich5_map_db = {
|
static const struct piix_map_db ich5_map_db = {
|
||||||
.mask = 0x7,
|
.mask = 0x7,
|
||||||
.port_enable = 0x3,
|
.port_enable = 0x3,
|
||||||
|
@ -623,6 +659,16 @@ static struct ata_port_info piix_port_info[] = {
|
||||||
.port_ops = &piix_sata_ops,
|
.port_ops = &piix_sata_ops,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[piix_pata_vmw] =
|
||||||
|
{
|
||||||
|
.sht = &piix_sht,
|
||||||
|
.flags = PIIX_PATA_FLAGS,
|
||||||
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
|
.mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
|
||||||
|
.udma_mask = ATA_UDMA_MASK_40C,
|
||||||
|
.port_ops = &piix_vmw_ops,
|
||||||
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_bits piix_enable_bits[] = {
|
static struct pci_bits piix_enable_bits[] = {
|
||||||
|
@ -1135,6 +1181,11 @@ static int piix_pci_device_resume(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static u8 piix_vmw_bmdma_status(struct ata_port *ap)
|
||||||
|
{
|
||||||
|
return ata_bmdma_status(ap) & ~ATA_DMA_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
#define AHCI_PCI_BAR 5
|
#define AHCI_PCI_BAR 5
|
||||||
#define AHCI_GLOBAL_CTL 0x04
|
#define AHCI_GLOBAL_CTL 0x04
|
||||||
#define AHCI_ENABLE (1 << 31)
|
#define AHCI_ENABLE (1 << 31)
|
||||||
|
|
|
@ -6998,7 +6998,9 @@ int ata_host_start(struct ata_host *host)
|
||||||
rc = ap->ops->port_start(ap);
|
rc = ap->ops->port_start(ap);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (rc != -ENODEV)
|
if (rc != -ENODEV)
|
||||||
dev_printk(KERN_ERR, host->dev, "failed to start port %d (errno=%d)\n", i, rc);
|
dev_printk(KERN_ERR, host->dev,
|
||||||
|
"failed to start port %d "
|
||||||
|
"(errno=%d)\n", i, rc);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1733,11 +1733,15 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
||||||
ehc->i.action &= ~ATA_EH_PERDEV_MASK;
|
ehc->i.action &= ~ATA_EH_PERDEV_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* consider speeding down */
|
/* propagate timeout to host link */
|
||||||
|
if ((all_err_mask & AC_ERR_TIMEOUT) && !ata_is_host_link(link))
|
||||||
|
ap->link.eh_context.i.err_mask |= AC_ERR_TIMEOUT;
|
||||||
|
|
||||||
|
/* record error and consider speeding down */
|
||||||
dev = ehc->i.dev;
|
dev = ehc->i.dev;
|
||||||
if (!dev && ata_link_max_devices(link) == 1 &&
|
if (!dev && ((ata_link_max_devices(link) == 1 &&
|
||||||
ata_dev_enabled(link->device))
|
ata_dev_enabled(link->device))))
|
||||||
dev = link->device;
|
dev = link->device;
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask);
|
ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask);
|
||||||
|
@ -1759,8 +1763,14 @@ void ata_eh_autopsy(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
struct ata_link *link;
|
struct ata_link *link;
|
||||||
|
|
||||||
__ata_port_for_each_link(link, ap)
|
ata_port_for_each_link(link, ap)
|
||||||
ata_eh_link_autopsy(link);
|
ata_eh_link_autopsy(link);
|
||||||
|
|
||||||
|
/* Autopsy of fanout ports can affect host link autopsy.
|
||||||
|
* Perform host link autopsy last.
|
||||||
|
*/
|
||||||
|
if (ap->nr_pmp_links)
|
||||||
|
ata_eh_link_autopsy(&ap->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2157,13 +2167,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||||
if (ata_link_offline(link))
|
if (ata_link_offline(link))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* apply class override and convert UNKNOWN to NONE */
|
/* apply class override */
|
||||||
if (lflags & ATA_LFLAG_ASSUME_ATA)
|
if (lflags & ATA_LFLAG_ASSUME_ATA)
|
||||||
classes[dev->devno] = ATA_DEV_ATA;
|
classes[dev->devno] = ATA_DEV_ATA;
|
||||||
else if (lflags & ATA_LFLAG_ASSUME_SEMB)
|
else if (lflags & ATA_LFLAG_ASSUME_SEMB)
|
||||||
classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */
|
classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */
|
||||||
else if (classes[dev->devno] == ATA_DEV_UNKNOWN)
|
|
||||||
classes[dev->devno] = ATA_DEV_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* record current link speed */
|
/* record current link speed */
|
||||||
|
|
|
@ -495,14 +495,12 @@ static void sata_pmp_quirks(struct ata_port *ap)
|
||||||
/* SError.N need a kick in the ass to get working */
|
/* SError.N need a kick in the ass to get working */
|
||||||
link->flags |= ATA_LFLAG_HRST_TO_RESUME;
|
link->flags |= ATA_LFLAG_HRST_TO_RESUME;
|
||||||
|
|
||||||
/* class code report is unreliable */
|
/* Class code report is unreliable and SRST
|
||||||
if (link->pmp < 5)
|
* times out under certain configurations.
|
||||||
link->flags |= ATA_LFLAG_ASSUME_ATA;
|
* Config device can be at port 0 or 5 and
|
||||||
|
* locks up on SRST.
|
||||||
/* The config device, which can be either at
|
|
||||||
* port 0 or 5, locks up on SRST.
|
|
||||||
*/
|
*/
|
||||||
if (link->pmp == 0 || link->pmp == 5)
|
if (link->pmp <= 5)
|
||||||
link->flags |= ATA_LFLAG_NO_SRST |
|
link->flags |= ATA_LFLAG_NO_SRST |
|
||||||
ATA_LFLAG_ASSUME_ATA;
|
ATA_LFLAG_ASSUME_ATA;
|
||||||
|
|
||||||
|
|
|
@ -841,6 +841,9 @@ static void ata_scsi_dev_config(struct scsi_device *sdev,
|
||||||
blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
|
blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->class == ATA_DEV_ATA)
|
||||||
|
sdev->manage_start_stop = 1;
|
||||||
|
|
||||||
if (dev->flags & ATA_DFLAG_AN)
|
if (dev->flags & ATA_DFLAG_AN)
|
||||||
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
|
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
|
||||||
|
|
||||||
|
@ -872,8 +875,6 @@ int ata_scsi_slave_config(struct scsi_device *sdev)
|
||||||
|
|
||||||
ata_scsi_sdev_config(sdev);
|
ata_scsi_sdev_config(sdev);
|
||||||
|
|
||||||
sdev->manage_start_stop = 1;
|
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
ata_scsi_dev_config(sdev, dev);
|
ata_scsi_dev_config(sdev, dev);
|
||||||
|
|
||||||
|
|
|
@ -806,7 +806,10 @@ int ata_pci_init_one(struct pci_dev *pdev,
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
if (!legacy_mode) {
|
if (!legacy_mode && pdev->irq) {
|
||||||
|
/* We may have no IRQ assigned in which case we can poll. This
|
||||||
|
shouldn't happen on a sane system but robustness is cheap
|
||||||
|
in this case */
|
||||||
rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler,
|
rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler,
|
||||||
IRQF_SHARED, DRV_NAME, host);
|
IRQF_SHARED, DRV_NAME, host);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -814,7 +817,7 @@ int ata_pci_init_one(struct pci_dev *pdev,
|
||||||
|
|
||||||
ata_port_desc(host->ports[0], "irq %d", pdev->irq);
|
ata_port_desc(host->ports[0], "irq %d", pdev->irq);
|
||||||
ata_port_desc(host->ports[1], "irq %d", pdev->irq);
|
ata_port_desc(host->ports[1], "irq %d", pdev->irq);
|
||||||
} else {
|
} else if (legacy_mode) {
|
||||||
if (!ata_port_is_dummy(host->ports[0])) {
|
if (!ata_port_is_dummy(host->ports[0])) {
|
||||||
rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev),
|
rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev),
|
||||||
pi->port_ops->irq_handler,
|
pi->port_ops->irq_handler,
|
||||||
|
|
|
@ -1509,7 +1509,8 @@ static int __devinit bfin_atapi_probe(struct platform_device *pdev)
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
while (bfin_port_info[board_idx].udma_mask>0 && udma_fsclk[udma_mode] > fsclk) {
|
while (bfin_port_info[board_idx].udma_mask > 0 &&
|
||||||
|
udma_fsclk[udma_mode] > fsclk) {
|
||||||
udma_mode--;
|
udma_mode--;
|
||||||
bfin_port_info[board_idx].udma_mask >>= 1;
|
bfin_port_info[board_idx].udma_mask >>= 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,10 +130,11 @@ static struct ata_port_operations ixp4xx_port_ops = {
|
||||||
.port_start = ata_port_start,
|
.port_start = ata_port_start,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ixp4xx_setup_port(struct ata_ioports *ioaddr,
|
static void ixp4xx_setup_port(struct ata_port *ap,
|
||||||
struct ixp4xx_pata_data *data,
|
struct ixp4xx_pata_data *data,
|
||||||
unsigned long raw_cs0, unsigned long raw_cs1)
|
unsigned long raw_cs0, unsigned long raw_cs1)
|
||||||
{
|
{
|
||||||
|
struct ata_ioports *ioaddr = &ap->ioaddr;
|
||||||
unsigned long raw_cmd = raw_cs0;
|
unsigned long raw_cmd = raw_cs0;
|
||||||
unsigned long raw_ctl = raw_cs1 + 0x06;
|
unsigned long raw_ctl = raw_cs1 + 0x06;
|
||||||
|
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче