Merge branch 'master'

This commit is contained in:
Jeff Garzik 2005-11-15 04:51:40 -05:00
commit f055408957
460 changed files with 13697 additions and 18396 deletions

View File

@ -1097,7 +1097,7 @@ S: 80050-430 - Curitiba - Paran
S: Brazil S: Brazil
N: Kumar Gala N: Kumar Gala
E: kumar.gala@freescale.com E: galak@kernel.crashing.org
D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support
S: Austin, Texas 78729 S: Austin, Texas 78729
S: USA S: USA

View File

@ -20,6 +20,12 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
# +--> DIR=file (htmldocs) # +--> DIR=file (htmldocs)
# +--> man/ (mandocs) # +--> man/ (mandocs)
# for PDF and PS output you can choose between xmlto and docbook-utils tools
PDF_METHOD = $(prefer-db2x)
PS_METHOD = $(prefer-db2x)
### ###
# The targets that may be used. # The targets that may be used.
.PHONY: xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs .PHONY: xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs
@ -93,27 +99,39 @@ C-procfs-example = procfs_example.xml
C-procfs-example2 = $(addprefix $(obj)/,$(C-procfs-example)) C-procfs-example2 = $(addprefix $(obj)/,$(C-procfs-example))
$(obj)/procfs-guide.xml: $(C-procfs-example2) $(obj)/procfs-guide.xml: $(C-procfs-example2)
### notfoundtemplate = echo "*** You have to install docbook-utils or xmlto ***"; \
# Rules to generate postscript, PDF and HTML exit 1
# db2html creates a directory. Generate a html file used for timestamp db2xtemplate = db2TYPE -o $(dir $@) $<
xmltotemplate = xmlto TYPE $(XMLTOFLAGS) -o $(dir $@) $<
quiet_cmd_db2ps = XMLTO $@ # determine which methods are available
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $< ifeq ($(shell which db2ps >/dev/null 2>&1 && echo found),found)
use-db2x = db2x
prefer-db2x = db2x
else
use-db2x = notfound
prefer-db2x = $(use-xmlto)
endif
ifeq ($(shell which xmlto >/dev/null 2>&1 && echo found),found)
use-xmlto = xmlto
prefer-xmlto = xmlto
else
use-xmlto = notfound
prefer-xmlto = $(use-db2x)
endif
# the commands, generated from the chosen template
quiet_cmd_db2ps = PS $@
cmd_db2ps = $(subst TYPE,ps, $($(PS_METHOD)template))
%.ps : %.xml %.ps : %.xml
@(which xmlto > /dev/null 2>&1) || \
(echo "*** You need to install xmlto ***"; \
exit 1)
$(call cmd,db2ps) $(call cmd,db2ps)
quiet_cmd_db2pdf = XMLTO $@ quiet_cmd_db2pdf = PDF $@
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $< cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
%.pdf : %.xml %.pdf : %.xml
@(which xmlto > /dev/null 2>&1) || \
(echo "*** You need to install xmlto ***"; \
exit 1)
$(call cmd,db2pdf) $(call cmd,db2pdf)
quiet_cmd_db2html = XMLTO $@ quiet_cmd_db2html = HTML $@
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \ cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \ echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@ Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
@ -127,7 +145,7 @@ quiet_cmd_db2html = XMLTO $@
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \ @if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
quiet_cmd_db2man = XMLTO $@ quiet_cmd_db2man = MAN $@
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
%.9 : %.xml %.9 : %.xml
@(which xmlto > /dev/null 2>&1) || \ @(which xmlto > /dev/null 2>&1) || \

View File

@ -68,9 +68,7 @@ X!Iinclude/linux/kobject.h
<sect1><title>Kernel utility functions</title> <sect1><title>Kernel utility functions</title>
!Iinclude/linux/kernel.h !Iinclude/linux/kernel.h
<!-- This needs to clean up to make kernel-doc happy !Ekernel/printk.c
X!Ekernel/printk.c
-->
!Ekernel/panic.c !Ekernel/panic.c
!Ekernel/sys.c !Ekernel/sys.c
!Ekernel/rcupdate.c !Ekernel/rcupdate.c

View File

@ -3,4 +3,5 @@
<param name="chunk.quietly">1</param> <param name="chunk.quietly">1</param>
<param name="funcsynopsis.style">ansi</param> <param name="funcsynopsis.style">ansi</param>
<param name="funcsynopsis.tabular.threshold">80</param> <param name="funcsynopsis.tabular.threshold">80</param>
<!-- <param name="paper.type">A4</param> -->
</stylesheet> </stylesheet>

View File

@ -115,6 +115,33 @@ boolean is return which indicates whether the resulting counter value
is negative. It requires explicit memory barrier semantics around the is negative. It requires explicit memory barrier semantics around the
operation. operation.
Then:
int atomic_cmpxchg(atomic_t *v, int old, int new);
This performs an atomic compare exchange operation on the atomic value v,
with the given old and new values. Like all atomic_xxx operations,
atomic_cmpxchg will only satisfy its atomicity semantics as long as all
other accesses of *v are performed through atomic_xxx operations.
atomic_cmpxchg requires explicit memory barriers around the operation.
The semantics for atomic_cmpxchg are the same as those defined for 'cas'
below.
Finally:
int atomic_add_unless(atomic_t *v, int a, int u);
If the atomic value v is not equal to u, this function adds a to v, and
returns non zero. If v is equal to u then it returns zero. This is done as
an atomic operation.
atomic_add_unless requires explicit memory barriers around the operation.
atomic_inc_not_zero, equivalent to atomic_add_unless(v, 1, 0)
If a caller requires memory barrier semantics around an atomic_t If a caller requires memory barrier semantics around an atomic_t
operation which does not return a value, a set of interfaces are operation which does not return a value, a set of interfaces are
defined which accomplish this: defined which accomplish this:

View File

@ -30,7 +30,9 @@ the disk is not available then you have three options :-
(1) Hand copy the text from the screen and type it in after the machine (1) Hand copy the text from the screen and type it in after the machine
has restarted. Messy but it is the only option if you have not has restarted. Messy but it is the only option if you have not
planned for a crash. planned for a crash. Alternatively, you can take a picture of
the screen with a digital camera - not nice, but better than
nothing.
(2) Boot with a serial console (see Documentation/serial-console.txt), (2) Boot with a serial console (see Documentation/serial-console.txt),
run a null modem to a second machine and capture the output there run a null modem to a second machine and capture the output there

View File

@ -140,3 +140,4 @@
139 -> Prolink PixelView PlayTV MPEG2 PV-M4900 139 -> Prolink PixelView PlayTV MPEG2 PV-M4900
140 -> Osprey 440 [0070:ff07] 140 -> Osprey 440 [0070:ff07]
141 -> Asound Skyeye PCTV 141 -> Asound Skyeye PCTV
142 -> Sabrent TV-FM (bttv version)

View File

@ -80,3 +80,5 @@
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B) 79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
80 -> ASUS Digimatrix TV [1043:0210] 80 -> ASUS Digimatrix TV [1043:0210]
81 -> Philips Tiger reference design [1131:2018] 81 -> Philips Tiger reference design [1131:2018]
82 -> MSI TV@Anywhere plus [1462:6231]

View File

@ -67,3 +67,4 @@ tuner=65 - Ymec TVF66T5-B/DFF
tuner=66 - LG NTSC (TALN mini series) tuner=66 - LG NTSC (TALN mini series)
tuner=67 - Philips TD1316 Hybrid Tuner tuner=67 - Philips TD1316 Hybrid Tuner
tuner=68 - Philips TUV1236D ATSC/NTSC dual in tuner=68 - Philips TUV1236D ATSC/NTSC dual in
tuner=69 - Tena TNF 5335 MF

View File

@ -7,10 +7,12 @@ Machine check
mce=off disable machine check mce=off disable machine check
mce=bootlog Enable logging of machine checks left over from booting. mce=bootlog Enable logging of machine checks left over from booting.
Disabled by default because some BIOS leave bogus ones. Disabled by default on AMD because some BIOS leave bogus ones.
If your BIOS doesn't do that it's a good idea to enable though If your BIOS doesn't do that it's a good idea to enable though
to make sure you log even machine check events that result to make sure you log even machine check events that result
in a reboot. in a reboot. On Intel systems it is enabled by default.
mce=nobootlog
Disable boot machine check logging.
mce=tolerancelevel (number) mce=tolerancelevel (number)
0: always panic, 1: panic if deadlock possible, 0: always panic, 1: panic if deadlock possible,
2: try to avoid panic, 3: never panic or exit (for testing) 2: try to avoid panic, 3: never panic or exit (for testing)
@ -122,6 +124,9 @@ SMP
cpumask=MASK only use cpus with bits set in mask cpumask=MASK only use cpus with bits set in mask
additional_cpus=NUM Allow NUM more CPUs for hotplug
(defaults are specified by the BIOS or half the available CPUs)
NUMA NUMA
numa=off Only set up a single NUMA node spanning all memory. numa=off Only set up a single NUMA node spanning all memory.
@ -188,6 +193,9 @@ Debugging
kstack=N Print that many words from the kernel stack in oops dumps. kstack=N Print that many words from the kernel stack in oops dumps.
pagefaulttrace Dump all page faults. Only useful for extreme debugging
and will create a lot of output.
Misc Misc
noreplacement Don't replace instructions with more appropiate ones noreplacement Don't replace instructions with more appropiate ones

View File

@ -6,7 +6,7 @@ Virtual memory map with 4 level page tables:
0000000000000000 - 00007fffffffffff (=47bits) user space, different per mm 0000000000000000 - 00007fffffffffff (=47bits) user space, different per mm
hole caused by [48:63] sign extension hole caused by [48:63] sign extension
ffff800000000000 - ffff80ffffffffff (=40bits) guard hole ffff800000000000 - ffff80ffffffffff (=40bits) guard hole
ffff810000000000 - ffffc0ffffffffff (=46bits) direct mapping of phys. memory ffff810000000000 - ffffc0ffffffffff (=46bits) direct mapping of all phys. memory
ffffc10000000000 - ffffc1ffffffffff (=40bits) hole ffffc10000000000 - ffffc1ffffffffff (=40bits) hole
ffffc20000000000 - ffffe1ffffffffff (=45bits) vmalloc/ioremap space ffffc20000000000 - ffffe1ffffffffff (=45bits) vmalloc/ioremap space
... unused hole ... ... unused hole ...
@ -14,6 +14,10 @@ ffffffff80000000 - ffffffff82800000 (=40MB) kernel text mapping, from phys 0
... unused hole ... ... unused hole ...
ffffffff88000000 - fffffffffff00000 (=1919MB) module mapping space ffffffff88000000 - fffffffffff00000 (=1919MB) module mapping space
The direct mapping covers all memory in the system upto the highest
memory address (this means in some cases it can also include PCI memory
holes)
vmalloc space is lazily synchronized into the different PML4 pages of vmalloc space is lazily synchronized into the different PML4 pages of
the processes using the page fault handler, with init_level4_pgt as the processes using the page fault handler, with init_level4_pgt as
reference. reference.

View File

@ -1565,7 +1565,7 @@ S: Maintained
LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
P: Kumar Gala P: Kumar Gala
M: kumar.gala@freescale.com M: galak@kernel.crashing.org
W: http://www.penguinppc.org/ W: http://www.penguinppc.org/
L: linuxppc-embedded@ozlabs.org L: linuxppc-embedded@ozlabs.org
S: Maintained S: Maintained
@ -1873,6 +1873,16 @@ L: linux-tr@linuxtr.net
W: http://www.linuxtr.net W: http://www.linuxtr.net
S: Maintained S: Maintained
OMNIKEY CARDMAN 4000 DRIVER
P: Harald Welte
M: laforge@gnumonks.org
S: Maintained
OMNIKEY CARDMAN 4040 DRIVER
P: Harald Welte
M: laforge@gnumonks.org
S: Maintained
ONSTREAM SCSI TAPE DRIVER ONSTREAM SCSI TAPE DRIVER
P: Willem Riede P: Willem Riede
M: osst@riede.org M: osst@riede.org

View File

@ -1193,6 +1193,17 @@ else
__srctree = $(srctree)/ __srctree = $(srctree)/
endif endif
ifeq ($(ALLSOURCE_ARCHS),)
ifeq ($(ARCH),um)
ALLINCLUDE_ARCHS := $(ARCH) $(SUBARCH)
else
ALLINCLUDE_ARCHS := $(ARCH)
endif
else
#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
endif
ALLSOURCE_ARCHS := $(ARCH) ALLSOURCE_ARCHS := $(ARCH)
define all-sources define all-sources
@ -1208,7 +1219,7 @@ define all-sources
find $(__srctree)include $(RCS_FIND_IGNORE) \ find $(__srctree)include $(RCS_FIND_IGNORE) \
\( -name config -o -name 'asm-*' \) -prune \ \( -name config -o -name 'asm-*' \) -prune \
-o -name '*.[chS]' -print; \ -o -name '*.[chS]' -print; \
for ARCH in $(ALLSOURCE_ARCHS) ; do \ for ARCH in $(ALLINCLUDE_ARCHS) ; do \
find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \ find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
-name '*.[chS]' -print; \ -name '*.[chS]' -print; \
done ; \ done ; \

5
README
View File

@ -81,6 +81,11 @@ INSTALLING the kernel:
failed patches (xxx# or xxx.rej). If there are, either you or me has failed patches (xxx# or xxx.rej). If there are, either you or me has
made a mistake. made a mistake.
Unlike patches for the 2.6.x kernels, patches for the 2.6.x.y kernels
(also known as the -stable kernels) are not incremental but instead apply
directly to the base 2.6.x kernel. Please read
Documentation/applying-patches.txt for more information.
Alternatively, the script patch-kernel can be used to automate this Alternatively, the script patch-kernel can be used to automate this
process. It determines the current kernel version and applies any process. It determines the current kernel version and applies any
patches found. patches found.

View File

@ -702,6 +702,8 @@ menu "Device Drivers"
source "drivers/base/Kconfig" source "drivers/base/Kconfig"
source "drivers/connector/Kconfig"
if ALIGNMENT_TRAP if ALIGNMENT_TRAP
source "drivers/mtd/Kconfig" source "drivers/mtd/Kconfig"
endif endif

View File

@ -623,8 +623,6 @@ static int locomo_resume(struct platform_device *dev)
locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD); locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
spin_unlock_irqrestore(&lchip->lock, flags); spin_unlock_irqrestore(&lchip->lock, flags);
dev->power.saved_state = NULL;
kfree(save); kfree(save);
return 0; return 0;
@ -775,7 +773,7 @@ static int locomo_probe(struct platform_device *dev)
static int locomo_remove(struct platform_device *dev) static int locomo_remove(struct platform_device *dev)
{ {
struct locomo *lchip = platform__get_drvdata(dev); struct locomo *lchip = platform_get_drvdata(dev);
if (lchip) { if (lchip) {
__locomo_remove(lchip); __locomo_remove(lchip);

View File

@ -153,7 +153,7 @@ int __init scoop_probe(struct platform_device *pdev)
printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base); printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base);
SCOOP_REG(devptr->base, SCOOP_MCR) = 0x0140; SCOOP_REG(devptr->base, SCOOP_MCR) = 0x0140;
reset_scoop(dev); reset_scoop(&pdev->dev);
SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff; SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff; SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;

View File

@ -20,6 +20,7 @@
#include <linux/apm_bios.h> #include <linux/apm_bios.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/kernel.h> #include <linux/kernel.h>
#include <linux/list.h> #include <linux/list.h>

View File

@ -256,9 +256,7 @@ void __cpuexit cpu_die(void)
asmlinkage void __cpuinit secondary_start_kernel(void) asmlinkage void __cpuinit secondary_start_kernel(void)
{ {
struct mm_struct *mm = &init_mm; struct mm_struct *mm = &init_mm;
unsigned int cpu; unsigned int cpu = smp_processor_id();
cpu = smp_processor_id();
printk("CPU%u: Booted secondary processor\n", cpu); printk("CPU%u: Booted secondary processor\n", cpu);

View File

@ -132,14 +132,14 @@ void __init footbridge_init_irq(void)
static struct map_desc fb_common_io_desc[] __initdata = { static struct map_desc fb_common_io_desc[] __initdata = {
{ {
.virtual = ARMCSR_BASE, .virtual = ARMCSR_BASE,
.pfn = DC21285_ARMCSR_BASE, .pfn = __phys_to_pfn(DC21285_ARMCSR_BASE),
.length = ARMCSR_SIZE, .length = ARMCSR_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = XBUS_BASE, .virtual = XBUS_BASE,
.pfn = __phys_to_pfn(0x40000000), .pfn = __phys_to_pfn(0x40000000),
.length = XBUS_SIZE, .length = XBUS_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
} }
}; };
@ -153,28 +153,28 @@ static struct map_desc ebsa285_host_io_desc[] __initdata = {
.virtual = PCIMEM_BASE, .virtual = PCIMEM_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_MEM), .pfn = __phys_to_pfn(DC21285_PCI_MEM),
.length = PCIMEM_SIZE, .length = PCIMEM_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = PCICFG0_BASE, .virtual = PCICFG0_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG), .pfn = __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG),
.length = PCICFG0_SIZE, .length = PCICFG0_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = PCICFG1_BASE, .virtual = PCICFG1_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG), .pfn = __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG),
.length = PCICFG1_SIZE, .length = PCICFG1_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = PCIIACK_BASE, .virtual = PCIIACK_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_IACK), .pfn = __phys_to_pfn(DC21285_PCI_IACK),
.length = PCIIACK_SIZE, .length = PCIIACK_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = PCIO_BASE, .virtual = PCIO_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_IO), .pfn = __phys_to_pfn(DC21285_PCI_IO),
.length = PCIO_SIZE, .length = PCIO_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
} },
#endif #endif
}; };
@ -187,13 +187,13 @@ static struct map_desc co285_io_desc[] __initdata = {
.virtual = PCIO_BASE, .virtual = PCIO_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_IO), .pfn = __phys_to_pfn(DC21285_PCI_IO),
.length = PCIO_SIZE, .length = PCIO_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
}, { }, {
.virtual = PCIMEM_BASE, .virtual = PCIMEM_BASE,
.pfn = __phys_to_pfn(DC21285_PCI_MEM), .pfn = __phys_to_pfn(DC21285_PCI_MEM),
.length = PCIMEM_SIZE, .length = PCIMEM_SIZE,
.type = MT_DEVICE .type = MT_DEVICE,
} },
#endif #endif
}; };

View File

@ -72,6 +72,12 @@ config MACH_HUSKY
depends PXA_SHARPSL_25x depends PXA_SHARPSL_25x
select PXA_SHARP_C7xx select PXA_SHARP_C7xx
config MACH_AKITA
bool "Enable Sharp SL-1000 (Akita) Support"
depends PXA_SHARPSL_27x
select PXA_SHARP_Cxx00
select MACH_SPITZ
config MACH_SPITZ config MACH_SPITZ
bool "Enable Sharp Zaurus SL-3000 (Spitz) Support" bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
depends PXA_SHARPSL_27x depends PXA_SHARPSL_27x

View File

@ -11,8 +11,9 @@ obj-$(CONFIG_PXA27x) += pxa27x.o
obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o
obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o
obj-$(CONFIG_ARCH_PXA_IDP) += idp.o obj-$(CONFIG_ARCH_PXA_IDP) += idp.o
obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o corgi_ssp.o corgi_lcd.o obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o corgi_pm.o
obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o
obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o
obj-$(CONFIG_MACH_POODLE) += poodle.o obj-$(CONFIG_MACH_POODLE) += poodle.o
obj-$(CONFIG_MACH_TOSA) += tosa.o obj-$(CONFIG_MACH_TOSA) += tosa.o

View File

@ -0,0 +1,223 @@
/*
* Support for the Extra GPIOs on the Sharp SL-C1000 (Akita)
* (uses a Maxim MAX7310 8 Port IO Expander)
*
* Copyright 2005 Openedhand Ltd.
*
* Author: Richard Purdie <richard@openedhand.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
#include <asm/arch/akita.h>
/* MAX7310 Regiser Map */
#define MAX7310_INPUT 0x00
#define MAX7310_OUTPUT 0x01
#define MAX7310_POLINV 0x02
#define MAX7310_IODIR 0x03 /* 1 = Input, 0 = Output */
#define MAX7310_TIMEOUT 0x04
/* Addresses to scan */
static unsigned short normal_i2c[] = { 0x18, I2C_CLIENT_END };
/* I2C Magic */
I2C_CLIENT_INSMOD;
static int max7310_write(struct i2c_client *client, int address, int data);
static struct i2c_client max7310_template;
static void akita_ioexp_work(void *private_);
static struct device *akita_ioexp_device;
static unsigned char ioexp_output_value = AKITA_IOEXP_IO_OUT;
DECLARE_WORK(akita_ioexp, akita_ioexp_work, NULL);
/*
* MAX7310 Access
*/
static int max7310_config(struct device *dev, int iomode, int polarity)
{
int ret;
struct i2c_client *client = to_i2c_client(dev);
ret = max7310_write(client, MAX7310_POLINV, polarity);
if (ret < 0)
return ret;
ret = max7310_write(client, MAX7310_IODIR, iomode);
return ret;
}
static int max7310_set_ouputs(struct device *dev, int outputs)
{
struct i2c_client *client = to_i2c_client(dev);
return max7310_write(client, MAX7310_OUTPUT, outputs);
}
/*
* I2C Functions
*/
static int max7310_write(struct i2c_client *client, int address, int value)
{
u8 data[2];
data[0] = address & 0xff;
data[1] = value & 0xff;
if (i2c_master_send(client, data, 2) == 2)
return 0;
return -1;
}
static int max7310_detect(struct i2c_adapter *adapter, int address, int kind)
{
struct i2c_client *new_client;
int err;
if (!(new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)))
return -ENOMEM;
max7310_template.adapter = adapter;
max7310_template.addr = address;
memcpy(new_client, &max7310_template, sizeof(struct i2c_client));
if ((err = i2c_attach_client(new_client))) {
kfree(new_client);
return err;
}
max7310_config(&new_client->dev, AKITA_IOEXP_IO_DIR, 0);
akita_ioexp_device = &new_client->dev;
schedule_work(&akita_ioexp);
return 0;
}
static int max7310_attach_adapter(struct i2c_adapter *adapter)
{
return i2c_probe(adapter, &addr_data, max7310_detect);
}
static int max7310_detach_client(struct i2c_client *client)
{
int err;
akita_ioexp_device = NULL;
if ((err = i2c_detach_client(client)))
return err;
kfree(client);
return 0;
}
static struct i2c_driver max7310_i2c_driver = {
.owner = THIS_MODULE,
.name = "akita-max7310",
.id = I2C_DRIVERID_AKITAIOEXP,
.flags = I2C_DF_NOTIFY,
.attach_adapter = max7310_attach_adapter,
.detach_client = max7310_detach_client,
};
static struct i2c_client max7310_template = {
name: "akita-max7310",
flags: I2C_CLIENT_ALLOW_USE,
driver: &max7310_i2c_driver,
};
void akita_set_ioexp(struct device *dev, unsigned char bit)
{
ioexp_output_value |= bit;
if (akita_ioexp_device)
schedule_work(&akita_ioexp);
return;
}
void akita_reset_ioexp(struct device *dev, unsigned char bit)
{
ioexp_output_value &= ~bit;
if (akita_ioexp_device)
schedule_work(&akita_ioexp);
return;
}
EXPORT_SYMBOL(akita_set_ioexp);
EXPORT_SYMBOL(akita_reset_ioexp);
static void akita_ioexp_work(void *private_)
{
if (akita_ioexp_device)
max7310_set_ouputs(akita_ioexp_device, ioexp_output_value);
}
#ifdef CONFIG_PM
static int akita_ioexp_suspend(struct platform_device *pdev, pm_message_t state)
{
flush_scheduled_work();
return 0;
}
static int akita_ioexp_resume(struct platform_device *pdev)
{
schedule_work(&akita_ioexp);
return 0;
}
#else
#define akita_ioexp_suspend NULL
#define akita_ioexp_resume NULL
#endif
static int __init akita_ioexp_probe(struct platform_device *pdev)
{
return i2c_add_driver(&max7310_i2c_driver);
}
static int akita_ioexp_remove(struct platform_device *pdev)
{
i2c_del_driver(&max7310_i2c_driver);
return 0;
}
static struct platform_driver akita_ioexp_driver = {
.probe = akita_ioexp_probe,
.remove = akita_ioexp_remove,
.suspend = akita_ioexp_suspend,
.resume = akita_ioexp_resume,
.driver = {
.name = "akita-ioexp",
},
};
static int __init akita_ioexp_init(void)
{
return platform_driver_register(&akita_ioexp_driver);
}
static void __exit akita_ioexp_exit(void)
{
platform_driver_unregister(&akita_ioexp_driver);
}
MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>");
MODULE_DESCRIPTION("Akita IO-Expander driver");
MODULE_LICENSE("GPL");
fs_initcall(akita_ioexp_init);
module_exit(akita_ioexp_exit);

View File

@ -0,0 +1,228 @@
/*
* Battery and Power Management code for the Sharp SL-C7xx
*
* Copyright (c) 2005 Richard Purdie
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/module.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/apm.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/hardware.h>
#include <asm/hardware/scoop.h>
#include <asm/arch/sharpsl.h>
#include <asm/arch/corgi.h>
#include <asm/arch/pxa-regs.h>
#include "sharpsl.h"
static void corgi_charger_init(void)
{
pxa_gpio_mode(CORGI_GPIO_ADC_TEMP_ON | GPIO_OUT);
pxa_gpio_mode(CORGI_GPIO_CHRG_ON | GPIO_OUT);
pxa_gpio_mode(CORGI_GPIO_CHRG_UKN | GPIO_OUT);
pxa_gpio_mode(CORGI_GPIO_KEY_INT | GPIO_IN);
}
static void corgi_charge_led(int val)
{
if (val == SHARPSL_LED_ERROR) {
dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
} else if (val == SHARPSL_LED_ON) {
dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
GPSR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
} else {
dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
GPCR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
}
}
static void corgi_measure_temp(int on)
{
if (on)
GPSR(CORGI_GPIO_ADC_TEMP_ON) = GPIO_bit(CORGI_GPIO_ADC_TEMP_ON);
else
GPCR(CORGI_GPIO_ADC_TEMP_ON) = GPIO_bit(CORGI_GPIO_ADC_TEMP_ON);
}
static void corgi_charge(int on)
{
if (on) {
if (machine_is_corgi() && (sharpsl_pm.flags & SHARPSL_SUSPENDED)) {
GPCR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
GPSR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
} else {
GPSR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
GPCR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
}
} else {
GPCR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
GPCR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
}
}
static void corgi_discharge(int on)
{
if (on)
GPSR(CORGI_GPIO_DISCHARGE_ON) = GPIO_bit(CORGI_GPIO_DISCHARGE_ON);
else
GPCR(CORGI_GPIO_DISCHARGE_ON) = GPIO_bit(CORGI_GPIO_DISCHARGE_ON);
}
static void corgi_presuspend(void)
{
int i;
unsigned long wakeup_mask;
/* charging , so CHARGE_ON bit is HIGH during OFF. */
if (READ_GPIO_BIT(CORGI_GPIO_CHRG_ON))
PGSR1 |= GPIO_bit(CORGI_GPIO_CHRG_ON);
else
PGSR1 &= ~GPIO_bit(CORGI_GPIO_CHRG_ON);
if (READ_GPIO_BIT(CORGI_GPIO_LED_ORANGE))
PGSR0 |= GPIO_bit(CORGI_GPIO_LED_ORANGE);
else
PGSR0 &= ~GPIO_bit(CORGI_GPIO_LED_ORANGE);
if (READ_GPIO_BIT(CORGI_GPIO_CHRG_UKN))
PGSR1 |= GPIO_bit(CORGI_GPIO_CHRG_UKN);
else
PGSR1 &= ~GPIO_bit(CORGI_GPIO_CHRG_UKN);
/* Resume on keyboard power key */
PGSR2 = (PGSR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(0);
wakeup_mask = GPIO_bit(CORGI_GPIO_KEY_INT) | GPIO_bit(CORGI_GPIO_WAKEUP) | GPIO_bit(CORGI_GPIO_AC_IN) | GPIO_bit(CORGI_GPIO_CHRG_FULL);
if (!machine_is_corgi())
wakeup_mask |= GPIO_bit(CORGI_GPIO_MAIN_BAT_LOW);
PWER = wakeup_mask | PWER_RTC;
PRER = wakeup_mask;
PFER = wakeup_mask;
for (i = 0; i <=15; i++) {
if (PRER & PFER & GPIO_bit(i)) {
if (GPLR0 & GPIO_bit(i) )
PRER &= ~GPIO_bit(i);
else
PFER &= ~GPIO_bit(i);
}
}
}
static void corgi_postsuspend(void)
{
}
/*
* Check what brought us out of the suspend.
* Return: 0 to sleep, otherwise wake
*/
static int corgi_should_wakeup(unsigned int resume_on_alarm)
{
int is_resume = 0;
dev_dbg(sharpsl_pm.dev, "GPLR0 = %x,%x\n", GPLR0, PEDR);
if ((PEDR & GPIO_bit(CORGI_GPIO_AC_IN))) {
if (STATUS_AC_IN()) {
/* charge on */
dev_dbg(sharpsl_pm.dev, "ac insert\n");
sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
} else {
/* charge off */
dev_dbg(sharpsl_pm.dev, "ac remove\n");
CHARGE_LED_OFF();
CHARGE_OFF();
sharpsl_pm.charge_mode = CHRG_OFF;
}
}
if ((PEDR & GPIO_bit(CORGI_GPIO_CHRG_FULL)))
dev_dbg(sharpsl_pm.dev, "Charge full interrupt\n");
if (PEDR & GPIO_bit(CORGI_GPIO_KEY_INT))
is_resume |= GPIO_bit(CORGI_GPIO_KEY_INT);
if (PEDR & GPIO_bit(CORGI_GPIO_WAKEUP))
is_resume |= GPIO_bit(CORGI_GPIO_WAKEUP);
if (resume_on_alarm && (PEDR & PWER_RTC))
is_resume |= PWER_RTC;
dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
return is_resume;
}
static unsigned long corgi_charger_wakeup(void)
{
return ~GPLR0 & ( GPIO_bit(CORGI_GPIO_AC_IN) | GPIO_bit(CORGI_GPIO_KEY_INT) | GPIO_bit(CORGI_GPIO_WAKEUP) );
}
static int corgi_acin_status(void)
{
return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
}
static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
.init = corgi_charger_init,
.gpio_batlock = CORGI_GPIO_BAT_COVER,
.gpio_acin = CORGI_GPIO_AC_IN,
.gpio_batfull = CORGI_GPIO_CHRG_FULL,
.status_acin = corgi_acin_status,
.discharge = corgi_discharge,
.charge = corgi_charge,
.chargeled = corgi_charge_led,
.measure_temp = corgi_measure_temp,
.presuspend = corgi_presuspend,
.postsuspend = corgi_postsuspend,
.charger_wakeup = corgi_charger_wakeup,
.should_wakeup = corgi_should_wakeup,
.bat_levels = 40,
.bat_levels_noac = spitz_battery_levels_noac,
.bat_levels_acin = spitz_battery_levels_acin,
.status_high_acin = 188,
.status_low_acin = 178,
.status_high_noac = 185,
.status_low_noac = 175,
};
static struct platform_device *corgipm_device;
static int __devinit corgipm_init(void)
{
int ret;
corgipm_device = platform_device_alloc("sharpsl-pm", -1);
if (!corgipm_device)
return -ENOMEM;
corgipm_device->dev.platform_data = &corgi_pm_machinfo;
ret = platform_device_add(corgipm_device);
if (ret)
platform_device_put(corgipm_device);
return ret;
}
static void corgipm_exit(void)
{
platform_device_unregister(corgipm_device);
}
module_init(corgipm_init);
module_exit(corgipm_exit);

View File

@ -115,7 +115,7 @@ extern struct battery_thresh spitz_battery_levels_noac[];
#define CHARGE_LED_ERR() sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ERROR) #define CHARGE_LED_ERR() sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ERROR)
#define DISCHARGE_ON() sharpsl_pm.machinfo->discharge(1) #define DISCHARGE_ON() sharpsl_pm.machinfo->discharge(1)
#define DISCHARGE_OFF() sharpsl_pm.machinfo->discharge(0) #define DISCHARGE_OFF() sharpsl_pm.machinfo->discharge(0)
#define STATUS_AC_IN sharpsl_pm.machinfo->status_acin() #define STATUS_AC_IN() sharpsl_pm.machinfo->status_acin()
#define STATUS_BATT_LOCKED READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock) #define STATUS_BATT_LOCKED() READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock)
#define STATUS_CHRG_FULL READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull) #define STATUS_CHRG_FULL() READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull)
#define STATUS_FATAL READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal) #define STATUS_FATAL() READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)

View File

@ -21,7 +21,7 @@
#include <linux/apm_bios.h> #include <linux/apm_bios.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/device.h> #include <linux/platform_device.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/hardware/scoop.h> #include <asm/hardware/scoop.h>
@ -45,15 +45,15 @@
#define SHARPSL_WAIT_DISCHARGE_ON 100 /* 100 msec */ #define SHARPSL_WAIT_DISCHARGE_ON 100 /* 100 msec */
#define SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP 10 /* 10 msec */ #define SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP 10 /* 10 msec */
#define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT 10 /* 10 msec */ #define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT 10 /* 10 msec */
#define SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD 10 /* 10 msec */ #define SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN 10 /* 10 msec */
#define SHARPSL_CHARGE_WAIT_TIME 15 /* 15 msec */ #define SHARPSL_CHARGE_WAIT_TIME 15 /* 15 msec */
#define SHARPSL_CHARGE_CO_CHECK_TIME 5 /* 5 msec */ #define SHARPSL_CHARGE_CO_CHECK_TIME 5 /* 5 msec */
#define SHARPSL_CHARGE_RETRY_CNT 1 /* eqv. 10 min */ #define SHARPSL_CHARGE_RETRY_CNT 1 /* eqv. 10 min */
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */ #define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
#define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */ #define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */
#define SHARPSL_CHARGE_ON_JKVAD_HIGH 0x9b /* 6V */ #define SHARPSL_CHARGE_ON_ACIN_HIGH 0x9b /* 6V */
#define SHARPSL_CHARGE_ON_JKVAD_LOW 0x34 /* 2V */ #define SHARPSL_CHARGE_ON_ACIN_LOW 0x34 /* 2V */
#define SHARPSL_FATAL_ACIN_VOLT 182 /* 3.45V */ #define SHARPSL_FATAL_ACIN_VOLT 182 /* 3.45V */
#define SHARPSL_FATAL_NOACIN_VOLT 170 /* 3.40V */ #define SHARPSL_FATAL_NOACIN_VOLT 170 /* 3.40V */
@ -160,9 +160,10 @@ struct battery_thresh spitz_battery_levels_noac[] = {
/* /*
* Prototypes * Prototypes
*/ */
static int sharpsl_read_MainBattery(void); static int sharpsl_read_main_battery(void);
static int sharpsl_off_charge_battery(void); static int sharpsl_off_charge_battery(void);
static int sharpsl_check_battery(int mode); static int sharpsl_check_battery_temp(void);
static int sharpsl_check_battery_voltage(void);
static int sharpsl_ac_check(void); static int sharpsl_ac_check(void);
static int sharpsl_fatal_check(void); static int sharpsl_fatal_check(void);
static int sharpsl_average_value(int ad); static int sharpsl_average_value(int ad);
@ -228,7 +229,7 @@ static void sharpsl_battery_thread(void *private_)
if (!sharpsl_pm.machinfo) if (!sharpsl_pm.machinfo)
return; return;
sharpsl_pm.battstat.ac_status = (!(STATUS_AC_IN) ? APM_AC_OFFLINE : APM_AC_ONLINE); sharpsl_pm.battstat.ac_status = (STATUS_AC_IN() ? APM_AC_ONLINE : APM_AC_OFFLINE);
/* Corgi cannot confirm when battery fully charged so periodically kick! */ /* Corgi cannot confirm when battery fully charged so periodically kick! */
if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON) if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON)
@ -236,7 +237,7 @@ static void sharpsl_battery_thread(void *private_)
schedule_work(&toggle_charger); schedule_work(&toggle_charger);
while(1) { while(1) {
voltage = sharpsl_read_MainBattery(); voltage = sharpsl_read_main_battery();
if (voltage > 0) break; if (voltage > 0) break;
if (i++ > 5) { if (i++ > 5) {
voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage; voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
@ -317,10 +318,10 @@ static void sharpsl_charge_toggle(void *private_)
{ {
dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies); dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
if (STATUS_AC_IN == 0) { if (STATUS_AC_IN() == 0) {
sharpsl_charge_off(); sharpsl_charge_off();
return; return;
} else if ((sharpsl_check_battery(1) < 0) || (sharpsl_ac_check() < 0)) { } else if ((sharpsl_check_battery_temp() < 0) || (sharpsl_ac_check() < 0)) {
sharpsl_charge_error(); sharpsl_charge_error();
return; return;
} }
@ -335,7 +336,7 @@ static void sharpsl_charge_toggle(void *private_)
static void sharpsl_ac_timer(unsigned long data) static void sharpsl_ac_timer(unsigned long data)
{ {
int acin = STATUS_AC_IN; int acin = STATUS_AC_IN();
dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin); dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin);
@ -364,7 +365,7 @@ static void sharpsl_chrg_full_timer(unsigned long data)
sharpsl_pm.full_count++; sharpsl_pm.full_count++;
if (STATUS_AC_IN == 0) { if (STATUS_AC_IN() == 0) {
dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n"); dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n");
if (sharpsl_pm.charge_mode == CHRG_ON) if (sharpsl_pm.charge_mode == CHRG_ON)
sharpsl_charge_off(); sharpsl_charge_off();
@ -399,12 +400,12 @@ static irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id, struct pt_regs *fp)
{ {
int is_fatal = 0; int is_fatal = 0;
if (STATUS_BATT_LOCKED == 0) { if (STATUS_BATT_LOCKED() == 0) {
dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n"); dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n");
is_fatal = 1; is_fatal = 1;
} }
if (sharpsl_pm.machinfo->gpio_fatal && (STATUS_FATAL == 0)) { if (sharpsl_pm.machinfo->gpio_fatal && (STATUS_FATAL() == 0)) {
dev_err(sharpsl_pm.dev, "Fatal Batt Error! Suspending.\n"); dev_err(sharpsl_pm.dev, "Fatal Batt Error! Suspending.\n");
is_fatal = 1; is_fatal = 1;
} }
@ -461,12 +462,12 @@ static int read_max1111(int channel)
| MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR); | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
} }
static int sharpsl_read_MainBattery(void) static int sharpsl_read_main_battery(void)
{ {
return read_max1111(BATT_AD); return read_max1111(BATT_AD);
} }
static int sharpsl_read_Temp(void) static int sharpsl_read_temp(void)
{ {
int temp; int temp;
@ -480,7 +481,7 @@ static int sharpsl_read_Temp(void)
return temp; return temp;
} }
static int sharpsl_read_jkvad(void) static int sharpsl_read_acin(void)
{ {
return read_max1111(JK_VAD); return read_max1111(JK_VAD);
} }
@ -522,16 +523,14 @@ static int get_select_val(int *val)
return (sum/3); return (sum/3);
} }
/* mode 0 - Check temperature and voltage static int sharpsl_check_battery_temp(void)
* 1 - Check temperature only */
static int sharpsl_check_battery(int mode)
{ {
int val, i, buff[5]; int val, i, buff[5];
/* Check battery temperature */ /* Check battery temperature */
for (i=0; i<5; i++) { for (i=0; i<5; i++) {
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP); mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
buff[i] = sharpsl_read_Temp(); buff[i] = sharpsl_read_temp();
} }
val = get_select_val(buff); val = get_select_val(buff);
@ -539,8 +538,13 @@ static int sharpsl_check_battery(int mode)
dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val); dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val);
if (val > SHARPSL_CHARGE_ON_TEMP) if (val > SHARPSL_CHARGE_ON_TEMP)
return -1; return -1;
if (mode == 1)
return 0; return 0;
}
static int sharpsl_check_battery_voltage(void)
{
int val, i, buff[5];
/* disable charge, enable discharge */ /* disable charge, enable discharge */
CHARGE_OFF(); CHARGE_OFF();
@ -552,7 +556,7 @@ static int sharpsl_check_battery(int mode)
/* Check battery voltage */ /* Check battery voltage */
for (i=0; i<5; i++) { for (i=0; i<5; i++) {
buff[i] = sharpsl_read_MainBattery(); buff[i] = sharpsl_read_main_battery();
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT); mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
} }
@ -575,14 +579,14 @@ static int sharpsl_ac_check(void)
int temp, i, buff[5]; int temp, i, buff[5];
for (i=0; i<5; i++) { for (i=0; i<5; i++) {
buff[i] = sharpsl_read_jkvad(); buff[i] = sharpsl_read_acin();
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD); mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
} }
temp = get_select_val(buff); temp = get_select_val(buff);
dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp); dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp);
if ((temp > SHARPSL_CHARGE_ON_JKVAD_HIGH) || (temp < SHARPSL_CHARGE_ON_JKVAD_LOW)) { if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) {
dev_err(sharpsl_pm.dev, "Error: AC check failed.\n"); dev_err(sharpsl_pm.dev, "Error: AC check failed.\n");
return -1; return -1;
} }
@ -591,7 +595,7 @@ static int sharpsl_ac_check(void)
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int sharpsl_pm_suspend(struct device *dev, pm_message_t state) static int sharpsl_pm_suspend(struct platform_device *pdev, pm_message_t state)
{ {
sharpsl_pm.flags |= SHARPSL_SUSPENDED; sharpsl_pm.flags |= SHARPSL_SUSPENDED;
flush_scheduled_work(); flush_scheduled_work();
@ -604,7 +608,7 @@ static int sharpsl_pm_suspend(struct device *dev, pm_message_t state)
return 0; return 0;
} }
static int sharpsl_pm_resume(struct device *dev) static int sharpsl_pm_resume(struct platform_device *pdev)
{ {
/* Clear the reset source indicators as they break the bootloader upon reboot */ /* Clear the reset source indicators as they break the bootloader upon reboot */
RCSR = 0x0f; RCSR = 0x0f;
@ -622,7 +626,7 @@ static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable
dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG); dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG);
/* not charging and AC-IN! */ /* not charging and AC-IN! */
if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (STATUS_AC_IN != 0)) { if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (STATUS_AC_IN() != 0)) {
dev_dbg(sharpsl_pm.dev, "Activating Offline Charger...\n"); dev_dbg(sharpsl_pm.dev, "Activating Offline Charger...\n");
sharpsl_pm.charge_mode = CHRG_OFF; sharpsl_pm.charge_mode = CHRG_OFF;
sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG; sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
@ -671,7 +675,7 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab
dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n"); dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
} }
if ((STATUS_BATT_LOCKED == 0) || (sharpsl_fatal_check() < 0) ) if ((STATUS_BATT_LOCKED() == 0) || (sharpsl_fatal_check() < 0) )
{ {
dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n"); dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
corgi_goto_sleep(alarm_time, alarm_enable, state); corgi_goto_sleep(alarm_time, alarm_enable, state);
@ -711,7 +715,7 @@ static int sharpsl_fatal_check(void)
dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check entered\n"); dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check entered\n");
/* Check AC-Adapter */ /* Check AC-Adapter */
acin = STATUS_AC_IN; acin = STATUS_AC_IN();
if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) { if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
CHARGE_OFF(); CHARGE_OFF();
@ -725,7 +729,7 @@ static int sharpsl_fatal_check(void)
/* Check battery : check inserting battery ? */ /* Check battery : check inserting battery ? */
for (i=0; i<5; i++) { for (i=0; i<5; i++) {
buff[i] = sharpsl_read_MainBattery(); buff[i] = sharpsl_read_main_battery();
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT); mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
} }
@ -739,7 +743,7 @@ static int sharpsl_fatal_check(void)
} }
temp = get_select_val(buff); temp = get_select_val(buff);
dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_read_MainBattery()); dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_read_main_battery());
if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) || if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) ||
(!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT))) (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT)))
@ -771,7 +775,7 @@ static int sharpsl_off_charge_battery(void)
dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 1\n"); dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 1\n");
/* AC Check */ /* AC Check */
if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery(1) < 0)) if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery_temp() < 0))
return sharpsl_off_charge_error(); return sharpsl_off_charge_error();
/* Start Charging */ /* Start Charging */
@ -793,7 +797,7 @@ static int sharpsl_off_charge_battery(void)
dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 2\n"); dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 2\n");
if (sharpsl_check_battery(0) < 0) if ((sharpsl_check_battery_temp() < 0) || (sharpsl_check_battery_voltage() < 0))
return sharpsl_off_charge_error(); return sharpsl_off_charge_error();
CHARGE_OFF(); CHARGE_OFF();
@ -811,7 +815,7 @@ static int sharpsl_off_charge_battery(void)
/* Check for timeout */ /* Check for timeout */
if ((RCNR - time) > SHARPSL_WAIT_CO_TIME) if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
return 1; return 1;
if (STATUS_CHRG_FULL) { if (STATUS_CHRG_FULL()) {
dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n"); dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n");
sharpsl_pm.full_count++; sharpsl_pm.full_count++;
CHARGE_OFF(); CHARGE_OFF();
@ -840,7 +844,7 @@ static int sharpsl_off_charge_battery(void)
sharpsl_pm.full_count++; sharpsl_pm.full_count++;
return 1; return 1;
} }
if (STATUS_CHRG_FULL) { if (STATUS_CHRG_FULL()) {
dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n"); dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n");
CHARGE_LED_OFF(); CHARGE_LED_OFF();
CHARGE_OFF(); CHARGE_OFF();
@ -886,13 +890,13 @@ static struct pm_ops sharpsl_pm_ops = {
.finish = pxa_pm_finish, .finish = pxa_pm_finish,
}; };
static int __init sharpsl_pm_probe(struct device *dev) static int __init sharpsl_pm_probe(struct platform_device *pdev)
{ {
if (!dev->platform_data) if (!pdev->dev.platform_data)
return -EINVAL; return -EINVAL;
sharpsl_pm.dev = dev; sharpsl_pm.dev = &pdev->dev;
sharpsl_pm.machinfo = dev->platform_data; sharpsl_pm.machinfo = pdev->dev.platform_data;
sharpsl_pm.charge_mode = CHRG_OFF; sharpsl_pm.charge_mode = CHRG_OFF;
sharpsl_pm.flags = 0; sharpsl_pm.flags = 0;
@ -935,8 +939,8 @@ static int __init sharpsl_pm_probe(struct device *dev)
else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING); else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING);
} }
device_create_file(dev, &dev_attr_battery_percentage); device_create_file(&pdev->dev, &dev_attr_battery_percentage);
device_create_file(dev, &dev_attr_battery_voltage); device_create_file(&pdev->dev, &dev_attr_battery_voltage);
apm_get_power_status = sharpsl_apm_get_power_status; apm_get_power_status = sharpsl_apm_get_power_status;
@ -947,12 +951,12 @@ static int __init sharpsl_pm_probe(struct device *dev)
return 0; return 0;
} }
static int sharpsl_pm_remove(struct device *dev) static int sharpsl_pm_remove(struct platform_device *pdev)
{ {
pm_set_ops(NULL); pm_set_ops(NULL);
device_remove_file(dev, &dev_attr_battery_percentage); device_remove_file(&pdev->dev, &dev_attr_battery_percentage);
device_remove_file(dev, &dev_attr_battery_voltage); device_remove_file(&pdev->dev, &dev_attr_battery_voltage);
free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr); free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr);
free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr); free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr);
@ -969,23 +973,24 @@ static int sharpsl_pm_remove(struct device *dev)
return 0; return 0;
} }
static struct device_driver sharpsl_pm_driver = { static struct platform_driver sharpsl_pm_driver = {
.name = "sharpsl-pm",
.bus = &platform_bus_type,
.probe = sharpsl_pm_probe, .probe = sharpsl_pm_probe,
.remove = sharpsl_pm_remove, .remove = sharpsl_pm_remove,
.suspend = sharpsl_pm_suspend, .suspend = sharpsl_pm_suspend,
.resume = sharpsl_pm_resume, .resume = sharpsl_pm_resume,
.driver = {
.name = "sharpsl-pm",
},
}; };
static int __devinit sharpsl_pm_init(void) static int __devinit sharpsl_pm_init(void)
{ {
return driver_register(&sharpsl_pm_driver); return platform_driver_register(&sharpsl_pm_driver);
} }
static void sharpsl_pm_exit(void) static void sharpsl_pm_exit(void)
{ {
driver_unregister(&sharpsl_pm_driver); platform_driver_unregister(&sharpsl_pm_driver);
} }
late_initcall(sharpsl_pm_init); late_initcall(sharpsl_pm_init);

View File

@ -345,6 +345,16 @@ static void spitz_irda_transceiver_mode(struct device *dev, int mode)
reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON); reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON);
} }
#ifdef CONFIG_MACH_AKITA
static void akita_irda_transceiver_mode(struct device *dev, int mode)
{
if (mode & IR_OFF)
akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
else
akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
}
#endif
static struct pxaficp_platform_data spitz_ficp_platform_data = { static struct pxaficp_platform_data spitz_ficp_platform_data = {
.transceiver_cap = IR_SIRMODE | IR_OFF, .transceiver_cap = IR_SIRMODE | IR_OFF,
.transceiver_mode = spitz_irda_transceiver_mode, .transceiver_mode = spitz_irda_transceiver_mode,
@ -417,6 +427,32 @@ static void __init spitz_init(void)
platform_device_register(&spitzscoop2_device); platform_device_register(&spitzscoop2_device);
} }
#ifdef CONFIG_MACH_AKITA
/*
* Akita IO Expander
*/
struct platform_device akitaioexp_device = {
.name = "akita-ioexp",
.id = -1,
};
static void __init akita_init(void)
{
spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode;
/* We just pretend the second element of the array doesn't exist */
spitz_pcmcia_config.num_devs = 1;
platform_scoop_config = &spitz_pcmcia_config;
spitz_bl_machinfo.set_bl_intensity = akita_bl_set_intensity;
platform_device_register(&akitaioexp_device);
spitzscoop_device.dev.parent = &akitaioexp_device.dev;
common_init();
}
#endif
static void __init fixup_spitz(struct machine_desc *desc, static void __init fixup_spitz(struct machine_desc *desc,
struct tag *tags, char **cmdline, struct meminfo *mi) struct tag *tags, char **cmdline, struct meminfo *mi)
{ {
@ -452,3 +488,16 @@ MACHINE_START(BORZOI, "SHARP Borzoi")
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_AKITA
MACHINE_START(AKITA, "SHARP Akita")
.phys_ram = 0xa0000000,
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.fixup = fixup_spitz,
.map_io = pxa_map_io,
.init_irq = pxa_init_irq,
.init_machine = akita_init,
.timer = &pxa_timer,
MACHINE_END
#endif

View File

@ -0,0 +1,233 @@
/*
* Battery and Power Management code for the Sharp SL-Cxx00
*
* Copyright (c) 2005 Richard Purdie
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/module.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/apm.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/hardware.h>
#include <asm/hardware/scoop.h>
#include <asm/arch/sharpsl.h>
#include <asm/arch/spitz.h>
#include <asm/arch/pxa-regs.h>
#include "sharpsl.h"
static int spitz_last_ac_status;
static void spitz_charger_init(void)
{
pxa_gpio_mode(SPITZ_GPIO_KEY_INT | GPIO_IN);
pxa_gpio_mode(SPITZ_GPIO_SYNC | GPIO_IN);
}
static void spitz_charge_led(int val)
{
if (val == SHARPSL_LED_ERROR) {
dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
} else if (val == SHARPSL_LED_ON) {
dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
} else {
dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
}
}
static void spitz_measure_temp(int on)
{
if (on)
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_ADC_TEMP_ON);
else
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_ADC_TEMP_ON);
}
static void spitz_charge(int on)
{
if (on) {
if (sharpsl_pm.flags & SHARPSL_SUSPENDED) {
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
} else {
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
}
} else {
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
}
}
static void spitz_discharge(int on)
{
if (on)
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_A);
else
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_A);
}
/* HACK - For unknown reasons, accurate voltage readings are only made with a load
on the power bus which the green led on spitz provides */
static void spitz_discharge1(int on)
{
if (on)
set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_GREEN);
else
reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_GREEN);
}
static void spitz_presuspend(void)
{
spitz_last_ac_status = STATUS_AC_IN();
/* GPIO Sleep Register */
PGSR0 = 0x00144018;
PGSR1 = 0x00EF0000;
if (machine_is_akita()) {
PGSR2 = 0x2121C000;
PGSR3 = 0x00600400;
} else {
PGSR2 = 0x0121C000;
PGSR3 = 0x00600000;
}
PGSR0 &= ~SPITZ_GPIO_G0_STROBE_BIT;
PGSR1 &= ~SPITZ_GPIO_G1_STROBE_BIT;
PGSR2 &= ~SPITZ_GPIO_G2_STROBE_BIT;
PGSR3 &= ~SPITZ_GPIO_G3_STROBE_BIT;
PGSR2 |= GPIO_bit(SPITZ_GPIO_KEY_STROBE0);
pxa_gpio_mode(GPIO18_RDY|GPIO_OUT | GPIO_DFLT_HIGH);
PRER = GPIO_bit(SPITZ_GPIO_KEY_INT);
PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET) | PWER_RTC;
PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
PKSR = 0xffffffff; // clear
/* nRESET_OUT Disable */
PSLR |= PSLR_SL_ROD;
/* Clear reset status */
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
PCFR = PCFR_GPR_EN | PCFR_OPDE;
}
static void spitz_postsuspend(void)
{
pxa_gpio_mode(GPIO18_RDY_MD);
pxa_gpio_mode(10 | GPIO_IN);
}
static int spitz_should_wakeup(unsigned int resume_on_alarm)
{
int is_resume = 0;
int acin = STATUS_AC_IN();
if (spitz_last_ac_status != acin) {
if (acin) {
/* charge on */
sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
dev_dbg(sharpsl_pm.dev, "AC Inserted\n");
} else {
/* charge off */
dev_dbg(sharpsl_pm.dev, "AC Removed\n");
CHARGE_LED_OFF();
CHARGE_OFF();
sharpsl_pm.charge_mode = CHRG_OFF;
}
spitz_last_ac_status = acin;
/* Return to suspend as this must be what we were woken for */
return 0;
}
if (PEDR & GPIO_bit(SPITZ_GPIO_KEY_INT))
is_resume |= GPIO_bit(SPITZ_GPIO_KEY_INT);
if (PKSR & GPIO_bit(SPITZ_GPIO_SYNC))
is_resume |= GPIO_bit(SPITZ_GPIO_SYNC);
if (resume_on_alarm && (PEDR & PWER_RTC))
is_resume |= PWER_RTC;
dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
return is_resume;
}
static unsigned long spitz_charger_wakeup(void)
{
return (~GPLR0 & GPIO_bit(SPITZ_GPIO_KEY_INT)) | (GPLR0 & GPIO_bit(SPITZ_GPIO_SYNC));
}
static int spitz_acin_status(void)
{
return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
}
struct sharpsl_charger_machinfo spitz_pm_machinfo = {
.init = spitz_charger_init,
.gpio_batlock = SPITZ_GPIO_BAT_COVER,
.gpio_acin = SPITZ_GPIO_AC_IN,
.gpio_batfull = SPITZ_GPIO_CHRG_FULL,
.gpio_fatal = SPITZ_GPIO_FATAL_BAT,
.status_acin = spitz_acin_status,
.discharge = spitz_discharge,
.discharge1 = spitz_discharge1,
.charge = spitz_charge,
.chargeled = spitz_charge_led,
.measure_temp = spitz_measure_temp,
.presuspend = spitz_presuspend,
.postsuspend = spitz_postsuspend,
.charger_wakeup = spitz_charger_wakeup,
.should_wakeup = spitz_should_wakeup,
.bat_levels = 40,
.bat_levels_noac = spitz_battery_levels_noac,
.bat_levels_acin = spitz_battery_levels_acin,
.status_high_acin = 188,
.status_low_acin = 178,
.status_high_noac = 185,
.status_low_noac = 175,
};
static struct platform_device *spitzpm_device;
static int __devinit spitzpm_init(void)
{
int ret;
spitzpm_device = platform_device_alloc("sharpsl-pm", -1);
if (!spitzpm_device)
return -ENOMEM;
spitzpm_device->dev.platform_data = &spitz_pm_machinfo;
ret = platform_device_add(spitzpm_device);
if (ret)
platform_device_put(spitzpm_device);
return ret;
}
static void spitzpm_exit(void)
{
platform_device_unregister(spitzpm_device);
}
module_init(spitzpm_init);
module_exit(spitzpm_exit);

View File

@ -14,6 +14,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_legacy.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>

View File

@ -699,7 +699,7 @@ depends on PM && !X86_VISWS
config APM config APM
tristate "APM (Advanced Power Management) BIOS support" tristate "APM (Advanced Power Management) BIOS support"
depends on PM depends on PM && PM_LEGACY
---help--- ---help---
APM is a BIOS specification for saving power using several different APM is a BIOS specification for saving power using several different
techniques. This is mostly useful for battery powered laptops with techniques. This is mostly useful for battery powered laptops with

View File

@ -39,17 +39,14 @@
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
{
}
extern void __init clustered_apic_check(void); extern void __init clustered_apic_check(void);
static inline int ioapic_setup_disabled(void)
{
return 0;
}
extern int gsi_irq_sharing(int gsi);
#include <asm/proto.h> #include <asm/proto.h>
static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
#else /* X86 */ #else /* X86 */
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
@ -57,6 +54,8 @@ static inline int ioapic_setup_disabled(void)
#include <mach_mpparse.h> #include <mach_mpparse.h>
#endif /* CONFIG_X86_LOCAL_APIC */ #endif /* CONFIG_X86_LOCAL_APIC */
static inline int gsi_irq_sharing(int gsi) { return gsi; }
#endif /* X86 */ #endif /* X86 */
#define BAD_MADT_ENTRY(entry, end) ( \ #define BAD_MADT_ENTRY(entry, end) ( \
@ -459,7 +458,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
*irq = IO_APIC_VECTOR(gsi); *irq = IO_APIC_VECTOR(gsi);
else else
#endif #endif
*irq = gsi; *irq = gsi_irq_sharing(gsi);
return 0; return 0;
} }
@ -543,7 +542,7 @@ acpi_scan_rsdp(unsigned long start, unsigned long length)
* RSDP signature. * RSDP signature.
*/ */
for (offset = 0; offset < length; offset += 16) { for (offset = 0; offset < length; offset += 16) {
if (strncmp((char *)(start + offset), "RSD PTR ", sig_len)) if (strncmp((char *)(phys_to_virt(start) + offset), "RSD PTR ", sig_len))
continue; continue;
return (start + offset); return (start + offset);
} }

View File

@ -218,6 +218,7 @@
#include <linux/time.h> #include <linux/time.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/kernel.h> #include <linux/kernel.h>
#include <linux/smp.h> #include <linux/smp.h>

View File

@ -206,9 +206,9 @@ static void __init init_amd(struct cpuinfo_x86 *c)
display_cacheinfo(c); display_cacheinfo(c);
if (cpuid_eax(0x80000000) >= 0x80000008) { if (cpuid_eax(0x80000000) >= 0x80000008) {
c->x86_num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
if (c->x86_num_cores & (c->x86_num_cores - 1)) if (c->x86_max_cores & (c->x86_max_cores - 1))
c->x86_num_cores = 1; c->x86_max_cores = 1;
} }
#ifdef CONFIG_X86_HT #ifdef CONFIG_X86_HT
@ -217,15 +217,15 @@ static void __init init_amd(struct cpuinfo_x86 *c)
* distingush the cores. Assumes number of cores is a power * distingush the cores. Assumes number of cores is a power
* of two. * of two.
*/ */
if (c->x86_num_cores > 1) { if (c->x86_max_cores > 1) {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
unsigned bits = 0; unsigned bits = 0;
while ((1 << bits) < c->x86_num_cores) while ((1 << bits) < c->x86_max_cores)
bits++; bits++;
cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1); cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
phys_proc_id[cpu] >>= bits; phys_proc_id[cpu] >>= bits;
printk(KERN_INFO "CPU %d(%d) -> Core %d\n", printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
cpu, c->x86_num_cores, cpu_core_id[cpu]); cpu, c->x86_max_cores, cpu_core_id[cpu]);
} }
#endif #endif
} }

View File

@ -231,10 +231,10 @@ static void __init early_cpu_detect(void)
cpuid(0x00000001, &tfms, &misc, &junk, &cap0); cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
c->x86 = (tfms >> 8) & 15; c->x86 = (tfms >> 8) & 15;
c->x86_model = (tfms >> 4) & 15; c->x86_model = (tfms >> 4) & 15;
if (c->x86 == 0xf) { if (c->x86 == 0xf)
c->x86 += (tfms >> 20) & 0xff; c->x86 += (tfms >> 20) & 0xff;
if (c->x86 >= 0x6)
c->x86_model += ((tfms >> 16) & 0xF) << 4; c->x86_model += ((tfms >> 16) & 0xF) << 4;
}
c->x86_mask = tfms & 15; c->x86_mask = tfms & 15;
if (cap0 & (1<<19)) if (cap0 & (1<<19))
c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8; c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
@ -333,7 +333,7 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
c->x86_model = c->x86_mask = 0; /* So far unknown... */ c->x86_model = c->x86_mask = 0; /* So far unknown... */
c->x86_vendor_id[0] = '\0'; /* Unset */ c->x86_vendor_id[0] = '\0'; /* Unset */
c->x86_model_id[0] = '\0'; /* Unset */ c->x86_model_id[0] = '\0'; /* Unset */
c->x86_num_cores = 1; c->x86_max_cores = 1;
memset(&c->x86_capability, 0, sizeof c->x86_capability); memset(&c->x86_capability, 0, sizeof c->x86_capability);
if (!have_cpuid_p()) { if (!have_cpuid_p()) {
@ -443,52 +443,44 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
void __devinit detect_ht(struct cpuinfo_x86 *c) void __devinit detect_ht(struct cpuinfo_x86 *c)
{ {
u32 eax, ebx, ecx, edx; u32 eax, ebx, ecx, edx;
int index_msb, tmp; int index_msb, core_bits;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
cpuid(1, &eax, &ebx, &ecx, &edx);
c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
return; return;
cpuid(1, &eax, &ebx, &ecx, &edx);
smp_num_siblings = (ebx & 0xff0000) >> 16; smp_num_siblings = (ebx & 0xff0000) >> 16;
if (smp_num_siblings == 1) { if (smp_num_siblings == 1) {
printk(KERN_INFO "CPU: Hyper-Threading is disabled\n"); printk(KERN_INFO "CPU: Hyper-Threading is disabled\n");
} else if (smp_num_siblings > 1 ) { } else if (smp_num_siblings > 1 ) {
index_msb = 31;
if (smp_num_siblings > NR_CPUS) { if (smp_num_siblings > NR_CPUS) {
printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings); printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
smp_num_siblings = 1; smp_num_siblings = 1;
return; return;
} }
tmp = smp_num_siblings;
while ((tmp & 0x80000000 ) == 0) { index_msb = get_count_order(smp_num_siblings);
tmp <<=1 ;
index_msb--;
}
if (smp_num_siblings & (smp_num_siblings - 1))
index_msb++;
phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
printk(KERN_INFO "CPU: Physical Processor ID: %d\n", printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
phys_proc_id[cpu]); phys_proc_id[cpu]);
smp_num_siblings = smp_num_siblings / c->x86_num_cores; smp_num_siblings = smp_num_siblings / c->x86_max_cores;
tmp = smp_num_siblings; index_msb = get_count_order(smp_num_siblings) ;
index_msb = 31;
while ((tmp & 0x80000000) == 0) {
tmp <<=1 ;
index_msb--;
}
if (smp_num_siblings & (smp_num_siblings - 1)) core_bits = get_count_order(c->x86_max_cores);
index_msb++;
cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
((1 << core_bits) - 1);
if (c->x86_num_cores > 1) if (c->x86_max_cores > 1)
printk(KERN_INFO "CPU: Processor Core ID: %d\n", printk(KERN_INFO "CPU: Processor Core ID: %d\n",
cpu_core_id[cpu]); cpu_core_id[cpu]);
} }

View File

@ -6,6 +6,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/thread_info.h> #include <linux/thread_info.h>
#include <linux/module.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/msr.h> #include <asm/msr.h>
@ -157,7 +158,7 @@ static void __devinit init_intel(struct cpuinfo_x86 *c)
if ( p ) if ( p )
strcpy(c->x86_model_id, p); strcpy(c->x86_model_id, p);
c->x86_num_cores = num_cpu_cores(c); c->x86_max_cores = num_cpu_cores(c);
detect_ht(c); detect_ht(c);
@ -264,5 +265,52 @@ __init int intel_cpu_init(void)
return 0; return 0;
} }
#ifndef CONFIG_X86_CMPXCHG
unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new)
{
u8 prev;
unsigned long flags;
/* Poor man's cmpxchg for 386. Unsuitable for SMP */
local_irq_save(flags);
prev = *(u8 *)ptr;
if (prev == old)
*(u8 *)ptr = new;
local_irq_restore(flags);
return prev;
}
EXPORT_SYMBOL(cmpxchg_386_u8);
unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new)
{
u16 prev;
unsigned long flags;
/* Poor man's cmpxchg for 386. Unsuitable for SMP */
local_irq_save(flags);
prev = *(u16 *)ptr;
if (prev == old)
*(u16 *)ptr = new;
local_irq_restore(flags);
return prev;
}
EXPORT_SYMBOL(cmpxchg_386_u16);
unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new)
{
u32 prev;
unsigned long flags;
/* Poor man's cmpxchg for 386. Unsuitable for SMP */
local_irq_save(flags);
prev = *(u32 *)ptr;
if (prev == old)
*(u32 *)ptr = new;
local_irq_restore(flags);
return prev;
}
EXPORT_SYMBOL(cmpxchg_386_u32);
#endif
// arch_initcall(intel_cpu_init); // arch_initcall(intel_cpu_init);

View File

@ -293,29 +293,45 @@ static struct _cpuid4_info *cpuid4_info[NR_CPUS];
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
{ {
struct _cpuid4_info *this_leaf; struct _cpuid4_info *this_leaf, *sibling_leaf;
unsigned long num_threads_sharing; unsigned long num_threads_sharing;
#ifdef CONFIG_X86_HT int index_msb, i;
struct cpuinfo_x86 *c = cpu_data + cpu; struct cpuinfo_x86 *c = cpu_data;
#endif
this_leaf = CPUID4_INFO_IDX(cpu, index); this_leaf = CPUID4_INFO_IDX(cpu, index);
num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing; num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
if (num_threads_sharing == 1) if (num_threads_sharing == 1)
cpu_set(cpu, this_leaf->shared_cpu_map); cpu_set(cpu, this_leaf->shared_cpu_map);
#ifdef CONFIG_X86_HT else {
else if (num_threads_sharing == smp_num_siblings) index_msb = get_count_order(num_threads_sharing);
this_leaf->shared_cpu_map = cpu_sibling_map[cpu];
else if (num_threads_sharing == (c->x86_num_cores * smp_num_siblings)) for_each_online_cpu(i) {
this_leaf->shared_cpu_map = cpu_core_map[cpu]; if (c[i].apicid >> index_msb ==
else c[cpu].apicid >> index_msb) {
printk(KERN_DEBUG "Number of CPUs sharing cache didn't match " cpu_set(i, this_leaf->shared_cpu_map);
"any known set of CPUs\n"); if (i != cpu && cpuid4_info[i]) {
#endif sibling_leaf = CPUID4_INFO_IDX(i, index);
cpu_set(cpu, sibling_leaf->shared_cpu_map);
}
}
}
}
}
static void __devinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
{
struct _cpuid4_info *this_leaf, *sibling_leaf;
int sibling;
this_leaf = CPUID4_INFO_IDX(cpu, index);
for_each_cpu_mask(sibling, this_leaf->shared_cpu_map) {
sibling_leaf = CPUID4_INFO_IDX(sibling, index);
cpu_clear(cpu, sibling_leaf->shared_cpu_map);
}
} }
#else #else
static void __init cache_shared_cpu_map_setup(unsigned int cpu, int index) {} static void __init cache_shared_cpu_map_setup(unsigned int cpu, int index) {}
static void __init cache_remove_shared_cpu_map(unsigned int cpu, int index) {}
#endif #endif
static void free_cache_attributes(unsigned int cpu) static void free_cache_attributes(unsigned int cpu)
@ -574,8 +590,10 @@ static void __cpuexit cache_remove_dev(struct sys_device * sys_dev)
unsigned int cpu = sys_dev->id; unsigned int cpu = sys_dev->id;
unsigned long i; unsigned long i;
for (i = 0; i < num_cache_leaves; i++) for (i = 0; i < num_cache_leaves; i++) {
cache_remove_shared_cpu_map(cpu, i);
kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj));
}
kobject_unregister(cache_kobject[cpu]); kobject_unregister(cache_kobject[cpu]);
cpuid4_cache_sysfs_exit(cpu); cpuid4_cache_sysfs_exit(cpu);
return; return;

View File

@ -626,6 +626,14 @@ void __init mtrr_bp_init(void)
if (cpuid_eax(0x80000000) >= 0x80000008) { if (cpuid_eax(0x80000000) >= 0x80000008) {
u32 phys_addr; u32 phys_addr;
phys_addr = cpuid_eax(0x80000008) & 0xff; phys_addr = cpuid_eax(0x80000008) & 0xff;
/* CPUID workaround for Intel 0F33/0F34 CPU */
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
boot_cpu_data.x86 == 0xF &&
boot_cpu_data.x86_model == 0x3 &&
(boot_cpu_data.x86_mask == 0x3 ||
boot_cpu_data.x86_mask == 0x4))
phys_addr = 36;
size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1); size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
size_and_mask = ~size_or_mask & 0xfff00000; size_and_mask = ~size_or_mask & 0xfff00000;
} else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR && } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&

View File

@ -94,12 +94,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
if (c->x86_cache_size >= 0) if (c->x86_cache_size >= 0)
seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size); seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
#ifdef CONFIG_X86_HT #ifdef CONFIG_X86_HT
if (c->x86_num_cores * smp_num_siblings > 1) { if (c->x86_max_cores * smp_num_siblings > 1) {
seq_printf(m, "physical id\t: %d\n", phys_proc_id[n]); seq_printf(m, "physical id\t: %d\n", phys_proc_id[n]);
seq_printf(m, "siblings\t: %d\n", seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[n]));
c->x86_num_cores * smp_num_siblings);
seq_printf(m, "core id\t\t: %d\n", cpu_core_id[n]); seq_printf(m, "core id\t\t: %d\n", cpu_core_id[n]);
seq_printf(m, "cpu cores\t: %d\n", c->x86_num_cores); seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
} }
#endif #endif

View File

@ -560,11 +560,10 @@ nmi_stack_fixup:
nmi_debug_stack_check: nmi_debug_stack_check:
cmpw $__KERNEL_CS,16(%esp) cmpw $__KERNEL_CS,16(%esp)
jne nmi_stack_correct jne nmi_stack_correct
cmpl $debug - 1,(%esp) cmpl $debug,(%esp)
jle nmi_stack_correct jb nmi_stack_correct
cmpl $debug_esp_fix_insn,(%esp) cmpl $debug_esp_fix_insn,(%esp)
jle nmi_debug_stack_fixup ja nmi_stack_correct
nmi_debug_stack_fixup:
FIX_STACK(24,nmi_stack_correct, 1) FIX_STACK(24,nmi_stack_correct, 1)
jmp nmi_stack_correct jmp nmi_stack_correct

View File

@ -72,9 +72,11 @@ int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
/* Core ID of each logical CPU */ /* Core ID of each logical CPU */
int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
/* representing HT siblings of each logical CPU */
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
EXPORT_SYMBOL(cpu_sibling_map); EXPORT_SYMBOL(cpu_sibling_map);
/* representing HT and core siblings of each logical CPU */
cpumask_t cpu_core_map[NR_CPUS] __read_mostly; cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
EXPORT_SYMBOL(cpu_core_map); EXPORT_SYMBOL(cpu_core_map);
@ -442,35 +444,60 @@ static void __devinit smp_callin(void)
static int cpucount; static int cpucount;
/* representing cpus for which sibling maps can be computed */
static cpumask_t cpu_sibling_setup_map;
static inline void static inline void
set_cpu_sibling_map(int cpu) set_cpu_sibling_map(int cpu)
{ {
int i; int i;
struct cpuinfo_x86 *c = cpu_data;
cpu_set(cpu, cpu_sibling_setup_map);
if (smp_num_siblings > 1) { if (smp_num_siblings > 1) {
for (i = 0; i < NR_CPUS; i++) { for_each_cpu_mask(i, cpu_sibling_setup_map) {
if (!cpu_isset(i, cpu_callout_map)) if (phys_proc_id[cpu] == phys_proc_id[i] &&
continue; cpu_core_id[cpu] == cpu_core_id[i]) {
if (cpu_core_id[cpu] == cpu_core_id[i]) {
cpu_set(i, cpu_sibling_map[cpu]); cpu_set(i, cpu_sibling_map[cpu]);
cpu_set(cpu, cpu_sibling_map[i]); cpu_set(cpu, cpu_sibling_map[i]);
cpu_set(i, cpu_core_map[cpu]);
cpu_set(cpu, cpu_core_map[i]);
} }
} }
} else { } else {
cpu_set(cpu, cpu_sibling_map[cpu]); cpu_set(cpu, cpu_sibling_map[cpu]);
} }
if (current_cpu_data.x86_num_cores > 1) { if (current_cpu_data.x86_max_cores == 1) {
for (i = 0; i < NR_CPUS; i++) {
if (!cpu_isset(i, cpu_callout_map))
continue;
if (phys_proc_id[cpu] == phys_proc_id[i]) {
cpu_set(i, cpu_core_map[cpu]);
cpu_set(cpu, cpu_core_map[i]);
}
}
} else {
cpu_core_map[cpu] = cpu_sibling_map[cpu]; cpu_core_map[cpu] = cpu_sibling_map[cpu];
c[cpu].booted_cores = 1;
return;
}
for_each_cpu_mask(i, cpu_sibling_setup_map) {
if (phys_proc_id[cpu] == phys_proc_id[i]) {
cpu_set(i, cpu_core_map[cpu]);
cpu_set(cpu, cpu_core_map[i]);
/*
* Does this new cpu bringup a new core?
*/
if (cpus_weight(cpu_sibling_map[cpu]) == 1) {
/*
* for each core in package, increment
* the booted_cores for this new cpu
*/
if (first_cpu(cpu_sibling_map[i]) == i)
c[cpu].booted_cores++;
/*
* increment the core count for all
* the other cpus in this package
*/
if (i != cpu)
c[i].booted_cores++;
} else if (i != cpu && !c[cpu].booted_cores)
c[cpu].booted_cores = c[i].booted_cores;
}
} }
} }
@ -1095,11 +1122,8 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
current_thread_info()->cpu = 0; current_thread_info()->cpu = 0;
smp_tune_scheduling(); smp_tune_scheduling();
cpus_clear(cpu_sibling_map[0]);
cpu_set(0, cpu_sibling_map[0]);
cpus_clear(cpu_core_map[0]); set_cpu_sibling_map(0);
cpu_set(0, cpu_core_map[0]);
/* /*
* If we couldn't find an SMP configuration at boot time, * If we couldn't find an SMP configuration at boot time,
@ -1278,15 +1302,24 @@ static void
remove_siblinginfo(int cpu) remove_siblinginfo(int cpu)
{ {
int sibling; int sibling;
struct cpuinfo_x86 *c = cpu_data;
for_each_cpu_mask(sibling, cpu_core_map[cpu]) {
cpu_clear(cpu, cpu_core_map[sibling]);
/*
* last thread sibling in this cpu core going down
*/
if (cpus_weight(cpu_sibling_map[cpu]) == 1)
c[sibling].booted_cores--;
}
for_each_cpu_mask(sibling, cpu_sibling_map[cpu]) for_each_cpu_mask(sibling, cpu_sibling_map[cpu])
cpu_clear(cpu, cpu_sibling_map[sibling]); cpu_clear(cpu, cpu_sibling_map[sibling]);
for_each_cpu_mask(sibling, cpu_core_map[cpu])
cpu_clear(cpu, cpu_core_map[sibling]);
cpus_clear(cpu_sibling_map[cpu]); cpus_clear(cpu_sibling_map[cpu]);
cpus_clear(cpu_core_map[cpu]); cpus_clear(cpu_core_map[cpu]);
phys_proc_id[cpu] = BAD_APICID; phys_proc_id[cpu] = BAD_APICID;
cpu_core_id[cpu] = BAD_APICID; cpu_core_id[cpu] = BAD_APICID;
cpu_clear(cpu, cpu_sibling_setup_map);
} }
int __cpu_disable(void) int __cpu_disable(void)

View File

@ -137,8 +137,8 @@ static void __init parse_memory_affinity_structure (char *sratp)
"enabled and removable" : "enabled" ) ); "enabled and removable" : "enabled" ) );
} }
#if MAX_NR_ZONES != 3 #if MAX_NR_ZONES != 4
#error "MAX_NR_ZONES != 3, chunk_to_zone requires review" #error "MAX_NR_ZONES != 4, chunk_to_zone requires review"
#endif #endif
/* Take a chunk of pages from page frame cstart to cend and count the number /* Take a chunk of pages from page frame cstart to cend and count the number
* of pages in each zone, returned via zones[]. * of pages in each zone, returned via zones[].

View File

@ -25,8 +25,9 @@ static int __init init_pit(char* override)
{ {
/* check clock override */ /* check clock override */
if (override[0] && strncmp(override,"pit",3)) if (override[0] && strncmp(override,"pit",3))
printk(KERN_ERR "Warning: clock= override failed. Defaulting to PIT\n"); printk(KERN_ERR "Warning: clock= override failed. Defaulting "
"to PIT\n");
init_cpu_khz();
count_p = LATCH; count_p = LATCH;
return 0; return 0;
} }

View File

@ -28,6 +28,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/memory_hotplug.h> #include <linux/memory_hotplug.h>
#include <linux/initrd.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/system.h> #include <asm/system.h>
@ -267,7 +268,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)
pkmap_page_table = pte; pkmap_page_table = pte;
} }
void __devinit free_new_highpage(struct page *page) static void __devinit free_new_highpage(struct page *page)
{ {
set_page_count(page, 1); set_page_count(page, 1);
__free_page(page); __free_page(page);

View File

@ -58,6 +58,10 @@ config IA64_UNCACHED_ALLOCATOR
bool bool
select GENERIC_ALLOCATOR select GENERIC_ALLOCATOR
config ZONE_DMA_IS_DMA32
bool
default y
choice choice
prompt "System type" prompt "System type"
default IA64_GENERIC default IA64_GENERIC

View File

@ -381,10 +381,8 @@ fpsp_done:
.Lnotkern: .Lnotkern:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
tstb %curptr@(TASK_NEEDRESCHED) | deliver signals, reschedule etc..
jne ret_from_exception | deliver signals, jra ret_from_exception
| reschedule etc..
RESTORE_ALL
| |
| mem_write --- write to user or supervisor address space | mem_write --- write to user or supervisor address space

View File

@ -75,10 +75,8 @@ _060_isp_done:
.Lnotkern: .Lnotkern:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
tstb %curptr@(TASK_NEEDRESCHED) | deliver signals, reschedule etc..
jne ret_from_exception | deliver signals, jra ret_from_exception
| reschedule etc..
RESTORE_ALL
| |
| _060_real_chk(): | _060_real_chk():

View File

@ -25,12 +25,8 @@ int main(void)
DEFINE(TASK_STATE, offsetof(struct task_struct, state)); DEFINE(TASK_STATE, offsetof(struct task_struct, state));
DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags)); DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace)); DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
DEFINE(TASK_WORK, offsetof(struct task_struct, thread.work));
DEFINE(TASK_NEEDRESCHED, offsetof(struct task_struct, thread.work.need_resched));
DEFINE(TASK_SYSCALL_TRACE, offsetof(struct task_struct, thread.work.syscall_trace));
DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending));
DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume));
DEFINE(TASK_THREAD, offsetof(struct task_struct, thread)); DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
DEFINE(TASK_INFO, offsetof(struct task_struct, thread.info));
DEFINE(TASK_MM, offsetof(struct task_struct, mm)); DEFINE(TASK_MM, offsetof(struct task_struct, mm));
DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
@ -45,6 +41,10 @@ int main(void)
DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl)); DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl));
DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate)); DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate));
/* offsets into the thread_info struct */
DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count));
DEFINE(TINFO_FLAGS, offsetof(struct thread_info, flags));
/* offsets into the pt_regs */ /* offsets into the pt_regs */
DEFINE(PT_D0, offsetof(struct pt_regs, d0)); DEFINE(PT_D0, offsetof(struct pt_regs, d0));
DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0)); DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0));

View File

@ -44,9 +44,7 @@
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
.globl system_call, buserr, trap .globl system_call, buserr, trap, resume
.globl resume, ret_from_exception
.globl ret_from_signal
.globl inthandler, sys_call_table .globl inthandler, sys_call_table
.globl sys_fork, sys_clone, sys_vfork .globl sys_fork, sys_clone, sys_vfork
.globl ret_from_interrupt, bad_interrupt .globl ret_from_interrupt, bad_interrupt
@ -58,7 +56,7 @@ ENTRY(buserr)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl buserr_c bsrl buserr_c
addql #4,%sp addql #4,%sp
jra ret_from_exception jra .Lret_from_exception
ENTRY(trap) ENTRY(trap)
SAVE_ALL_INT SAVE_ALL_INT
@ -66,7 +64,7 @@ ENTRY(trap)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
jra ret_from_exception jra .Lret_from_exception
| After a fork we jump here directly from resume, | After a fork we jump here directly from resume,
| so that %d1 contains the previous task | so that %d1 contains the previous task
@ -75,30 +73,31 @@ ENTRY(ret_from_fork)
movel %d1,%sp@- movel %d1,%sp@-
jsr schedule_tail jsr schedule_tail
addql #4,%sp addql #4,%sp
jra ret_from_exception jra .Lret_from_exception
badsys: do_trace_entry:
movel #-ENOSYS,%sp@(PT_D0)
jra ret_from_exception
do_trace:
movel #-ENOSYS,%sp@(PT_D0) | needed for strace movel #-ENOSYS,%sp@(PT_D0) | needed for strace
subql #4,%sp subql #4,%sp
SAVE_SWITCH_STACK SAVE_SWITCH_STACK
jbsr syscall_trace jbsr syscall_trace
RESTORE_SWITCH_STACK RESTORE_SWITCH_STACK
addql #4,%sp addql #4,%sp
movel %sp@(PT_ORIG_D0),%d1 movel %sp@(PT_ORIG_D0),%d0
movel #-ENOSYS,%d0 cmpl #NR_syscalls,%d0
cmpl #NR_syscalls,%d1 jcs syscall
jcc 1f badsys:
jbsr @(sys_call_table,%d1:l:4)@(0) movel #-ENOSYS,%sp@(PT_D0)
1: movel %d0,%sp@(PT_D0) | save the return value jra ret_from_syscall
subql #4,%sp | dummy return address
do_trace_exit:
subql #4,%sp
SAVE_SWITCH_STACK SAVE_SWITCH_STACK
jbsr syscall_trace jbsr syscall_trace
RESTORE_SWITCH_STACK
addql #4,%sp
jra .Lret_from_exception
ret_from_signal: ENTRY(ret_from_signal)
RESTORE_SWITCH_STACK RESTORE_SWITCH_STACK
addql #4,%sp addql #4,%sp
/* on 68040 complete pending writebacks if any */ /* on 68040 complete pending writebacks if any */
@ -111,7 +110,7 @@ ret_from_signal:
addql #4,%sp addql #4,%sp
1: 1:
#endif #endif
jra ret_from_exception jra .Lret_from_exception
ENTRY(system_call) ENTRY(system_call)
SAVE_ALL_SYS SAVE_ALL_SYS
@ -120,30 +119,34 @@ ENTRY(system_call)
| save top of frame | save top of frame
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
tstb %curptr@(TASK_SYSCALL_TRACE) | syscall trace?
jne do_trace tstb %curptr@(TASK_INFO+TINFO_FLAGS+2)
jmi do_trace_entry
cmpl #NR_syscalls,%d0 cmpl #NR_syscalls,%d0
jcc badsys jcc badsys
syscall:
jbsr @(sys_call_table,%d0:l:4)@(0) jbsr @(sys_call_table,%d0:l:4)@(0)
movel %d0,%sp@(PT_D0) | save the return value movel %d0,%sp@(PT_D0) | save the return value
ret_from_syscall:
|oriw #0x0700,%sr |oriw #0x0700,%sr
movel %curptr@(TASK_WORK),%d0 movew %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
jne syscall_exit_work jne syscall_exit_work
1: RESTORE_ALL 1: RESTORE_ALL
syscall_exit_work: syscall_exit_work:
btst #5,%sp@(PT_SR) | check if returning to kernel btst #5,%sp@(PT_SR) | check if returning to kernel
bnes 1b | if so, skip resched, signals bnes 1b | if so, skip resched, signals
tstw %d0 lslw #1,%d0
jeq do_signal_return jcs do_trace_exit
tstb %d0 jmi do_delayed_trace
jne do_delayed_trace lslw #8,%d0
jmi do_signal_return
pea resume_userspace pea resume_userspace
jmp schedule jra schedule
ret_from_exception:
ENTRY(ret_from_exception)
.Lret_from_exception:
btst #5,%sp@(PT_SR) | check if returning to kernel btst #5,%sp@(PT_SR) | check if returning to kernel
bnes 1f | if so, skip resched, signals bnes 1f | if so, skip resched, signals
| only allow interrupts when we are really the last one on the | only allow interrupts when we are really the last one on the
@ -152,19 +155,18 @@ ret_from_exception:
andw #ALLOWINT,%sr andw #ALLOWINT,%sr
resume_userspace: resume_userspace:
movel %curptr@(TASK_WORK),%d0 moveb %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
lsrl #8,%d0
jne exit_work jne exit_work
1: RESTORE_ALL 1: RESTORE_ALL
exit_work: exit_work:
| save top of frame | save top of frame
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
tstb %d0 lslb #1,%d0
jeq do_signal_return jmi do_signal_return
pea resume_userspace pea resume_userspace
jmp schedule jra schedule
do_signal_return: do_signal_return:
|andw #ALLOWINT,%sr |andw #ALLOWINT,%sr
@ -254,7 +256,7 @@ ret_from_interrupt:
/* check if we need to do software interrupts */ /* check if we need to do software interrupts */
tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING
jeq ret_from_exception jeq .Lret_from_exception
pea ret_from_exception pea ret_from_exception
jra do_softirq jra do_softirq

View File

@ -109,7 +109,7 @@ static inline void singlestep_disable(struct task_struct *child)
{ {
unsigned long tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16); unsigned long tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16);
put_reg(child, PT_SR, tmp); put_reg(child, PT_SR, tmp);
child->thread.work.delayed_trace = 0; clear_tsk_thread_flag(child, TIF_DELAYED_TRACE);
} }
/* /*
@ -118,7 +118,7 @@ static inline void singlestep_disable(struct task_struct *child)
void ptrace_disable(struct task_struct *child) void ptrace_disable(struct task_struct *child)
{ {
singlestep_disable(child); singlestep_disable(child);
child->thread.work.syscall_trace = 0; clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
} }
long arch_ptrace(struct task_struct *child, long request, long addr, long data) long arch_ptrace(struct task_struct *child, long request, long addr, long data)
@ -198,9 +198,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
goto out_eio; goto out_eio;
if (request == PTRACE_SYSCALL) if (request == PTRACE_SYSCALL)
child->thread.work.syscall_trace = ~0; set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
else else
child->thread.work.syscall_trace = 0; clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
child->exit_code = data; child->exit_code = data;
singlestep_disable(child); singlestep_disable(child);
wake_up_process(child); wake_up_process(child);
@ -223,10 +223,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
if (!valid_signal(data)) if (!valid_signal(data))
goto out_eio; goto out_eio;
child->thread.work.syscall_trace = 0; clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16); tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
put_reg(child, PT_SR, tmp); put_reg(child, PT_SR, tmp);
child->thread.work.delayed_trace = 1; set_tsk_thread_flag(child, TIF_DELAYED_TRACE);
child->exit_code = data; child->exit_code = data;
/* give it a chance to run. */ /* give it a chance to run. */
@ -288,9 +288,6 @@ out_eio:
asmlinkage void syscall_trace(void) asmlinkage void syscall_trace(void)
{ {
if (!current->thread.work.delayed_trace &&
!current->thread.work.syscall_trace)
return;
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
? 0x80 : 0)); ? 0x80 : 0));
/* /*

View File

@ -32,6 +32,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_legacy.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>

View File

@ -348,7 +348,7 @@ endpoint_stall(endpoint_t * ep)
{ {
u32 cs; u32 cs;
warn(__FUNCTION__); warn("%s", __FUNCTION__);
cs = au_readl(ep->reg->ctrl_stat) | USBDEV_CS_STALL; cs = au_readl(ep->reg->ctrl_stat) | USBDEV_CS_STALL;
au_writel(cs, ep->reg->ctrl_stat); au_writel(cs, ep->reg->ctrl_stat);
@ -360,7 +360,7 @@ endpoint_unstall(endpoint_t * ep)
{ {
u32 cs; u32 cs;
warn(__FUNCTION__); warn("%s", __FUNCTION__);
cs = au_readl(ep->reg->ctrl_stat) & ~USBDEV_CS_STALL; cs = au_readl(ep->reg->ctrl_stat) & ~USBDEV_CS_STALL;
au_writel(cs, ep->reg->ctrl_stat); au_writel(cs, ep->reg->ctrl_stat);

View File

@ -261,7 +261,7 @@ config PPC_ISERIES
config EMBEDDED6xx config EMBEDDED6xx
bool "Embedded 6xx/7xx/7xxx-based board" bool "Embedded 6xx/7xx/7xxx-based board"
depends on PPC32 depends on PPC32 && BROKEN
config APUS config APUS
bool "Amiga-APUS" bool "Amiga-APUS"
@ -305,7 +305,7 @@ config PPC_PMAC64
config PPC_PREP config PPC_PREP
bool " PowerPC Reference Platform (PReP) based machines" bool " PowerPC Reference Platform (PReP) based machines"
depends on PPC_MULTIPLATFORM && PPC32 depends on PPC_MULTIPLATFORM && PPC32 && BROKEN
select PPC_I8259 select PPC_I8259
select PPC_INDIRECT_PCI select PPC_INDIRECT_PCI
default y default y
@ -932,6 +932,7 @@ source "arch/powerpc/oprofile/Kconfig"
config KPROBES config KPROBES
bool "Kprobes (EXPERIMENTAL)" bool "Kprobes (EXPERIMENTAL)"
depends on PPC64
help help
Kprobes allows you to trap at almost any kernel address and Kprobes allows you to trap at almost any kernel address and
execute a callback function. register_kprobe() establishes execute a callback function. register_kprobe() establishes

View File

@ -187,7 +187,7 @@ archprepare: checkbin
# Temporary hack until we have migrated to asm-powerpc # Temporary hack until we have migrated to asm-powerpc
include/asm: arch/$(ARCH)/include/asm include/asm: arch/$(ARCH)/include/asm
arch/$(ARCH)/include/asm: arch/$(ARCH)/include/asm: FORCE
$(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
$(Q)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm $(Q)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm

View File

@ -1,18 +1,33 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.14-rc4 # Linux kernel version: 2.6.15-rc1
# Thu Oct 20 08:32:17 2005 # Mon Nov 14 15:27:00 2005
# #
CONFIG_PPC64=y
CONFIG_64BIT=y CONFIG_64BIT=y
CONFIG_PPC_MERGE=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_ISA_DMA=y CONFIG_PPC=y
CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK=y
CONFIG_COMPAT=y CONFIG_COMPAT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_FORCE_MAX_ZONEORDER=13
#
# Processor support
#
# CONFIG_POWER4_ONLY is not set
CONFIG_POWER3=y
CONFIG_POWER4=y
CONFIG_PPC_FPU=y
CONFIG_ALTIVEC=y
CONFIG_PPC_STD_MMU=y
CONFIG_SMP=y
CONFIG_NR_CPUS=128
# #
# Code maturity level options # Code maturity level options
@ -68,75 +83,103 @@ CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_KMOD=y CONFIG_KMOD=y
CONFIG_STOP_MACHINE=y CONFIG_STOP_MACHINE=y
CONFIG_SYSVIPC_COMPAT=y
#
# Block layer
#
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_DEFAULT_AS=y
# CONFIG_DEFAULT_DEADLINE is not set
# CONFIG_DEFAULT_CFQ is not set
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="anticipatory"
# #
# Platform support # Platform support
# #
# CONFIG_PPC_ISERIES is not set
CONFIG_PPC_MULTIPLATFORM=y CONFIG_PPC_MULTIPLATFORM=y
# CONFIG_PPC_ISERIES is not set
# CONFIG_EMBEDDED6xx is not set
# CONFIG_APUS is not set
CONFIG_PPC_PSERIES=y CONFIG_PPC_PSERIES=y
# CONFIG_PPC_BPA is not set
# CONFIG_PPC_PMAC is not set # CONFIG_PPC_PMAC is not set
# CONFIG_PPC_MAPLE is not set # CONFIG_PPC_MAPLE is not set
CONFIG_PPC=y # CONFIG_PPC_CELL is not set
CONFIG_PPC64=y
CONFIG_PPC_OF=y CONFIG_PPC_OF=y
CONFIG_XICS=y CONFIG_XICS=y
CONFIG_MPIC=y
CONFIG_ALTIVEC=y
CONFIG_PPC_SPLPAR=y
CONFIG_KEXEC=y
CONFIG_IBMVIO=y
# CONFIG_U3_DART is not set # CONFIG_U3_DART is not set
# CONFIG_BOOTX_TEXT is not set CONFIG_MPIC=y
# CONFIG_POWER4_ONLY is not set CONFIG_PPC_RTAS=y
CONFIG_IOMMU_VMERGE=y CONFIG_RTAS_ERROR_LOGGING=y
CONFIG_SMP=y CONFIG_RTAS_PROC=y
CONFIG_NR_CPUS=128 CONFIG_RTAS_FLASH=m
CONFIG_ARCH_SELECT_MEMORY_MODEL=y # CONFIG_MMIO_NVRAM is not set
CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_IBMVIO=y
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y # CONFIG_PPC_MPC106 is not set
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y # CONFIG_GENERIC_TBSYNC is not set
CONFIG_ARCH_SPARSEMEM_ENABLE=y # CONFIG_CPU_FREQ is not set
CONFIG_SELECT_MEMORY_MODEL=y # CONFIG_WANT_EARLY_SERIAL is not set
# CONFIG_FLATMEM_MANUAL is not set
CONFIG_DISCONTIGMEM_MANUAL=y #
# CONFIG_SPARSEMEM_MANUAL is not set # Kernel options
CONFIG_DISCONTIGMEM=y #
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_NEED_MULTIPLE_NODES=y
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
CONFIG_NODES_SPAN_OTHER_NODES=y
CONFIG_NUMA=y
CONFIG_SCHED_SMT=y
CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set
# CONFIG_PREEMPT_BKL is not set
# CONFIG_HZ_100 is not set # CONFIG_HZ_100 is not set
CONFIG_HZ_250=y CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set # CONFIG_HZ_1000 is not set
CONFIG_HZ=250 CONFIG_HZ=250
CONFIG_EEH=y CONFIG_PREEMPT_NONE=y
CONFIG_GENERIC_HARDIRQS=y # CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PPC_RTAS=y # CONFIG_PREEMPT is not set
CONFIG_RTAS_PROC=y # CONFIG_PREEMPT_BKL is not set
CONFIG_RTAS_FLASH=m
CONFIG_SCANLOG=m
CONFIG_LPARCFG=y
CONFIG_SECCOMP=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set # CONFIG_BINFMT_MISC is not set
CONFIG_FORCE_MAX_ZONEORDER=13
CONFIG_IOMMU_VMERGE=y
CONFIG_HOTPLUG_CPU=y CONFIG_HOTPLUG_CPU=y
CONFIG_KEXEC=y
# CONFIG_IRQ_ALL_CPUS is not set
CONFIG_PPC_SPLPAR=y
CONFIG_EEH=y
CONFIG_SCANLOG=m
CONFIG_LPARCFG=y
CONFIG_NUMA=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPARSEMEM_EXTREME=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4096
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
CONFIG_NODES_SPAN_OTHER_NODES=y
# CONFIG_PPC_64K_PAGES is not set
CONFIG_SCHED_SMT=y
CONFIG_PROC_DEVICETREE=y CONFIG_PROC_DEVICETREE=y
# CONFIG_CMDLINE_BOOL is not set # CONFIG_CMDLINE_BOOL is not set
# CONFIG_PM is not set
CONFIG_SECCOMP=y
CONFIG_ISA_DMA_API=y CONFIG_ISA_DMA_API=y
# #
# Bus Options # Bus options
# #
CONFIG_GENERIC_ISA_DMA=y
CONFIG_PPC_I8259=y
# CONFIG_PPC_INDIRECT_PCI is not set
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS=y
CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_LEGACY_PROC=y
@ -156,6 +199,7 @@ CONFIG_HOTPLUG_PCI=m
# CONFIG_HOTPLUG_PCI_SHPC is not set # CONFIG_HOTPLUG_PCI_SHPC is not set
CONFIG_HOTPLUG_PCI_RPA=m CONFIG_HOTPLUG_PCI_RPA=m
CONFIG_HOTPLUG_PCI_RPA_DLPAR=m CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
CONFIG_KERNEL_START=0xc000000000000000
# #
# Networking # Networking
@ -197,6 +241,10 @@ CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
CONFIG_NETFILTER=y CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set # CONFIG_NETFILTER_DEBUG is not set
#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NETFILTER_NETLINK_LOG=m
@ -299,6 +347,10 @@ CONFIG_LLC=y
# CONFIG_NET_DIVERT is not set # CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set # CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set # CONFIG_WAN_ROUTER is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_ROUTE=y
@ -368,14 +420,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_BLK_DEV_RAM_SIZE=65536
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
# CONFIG_CDROM_PKTCDVD is not set # CONFIG_CDROM_PKTCDVD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_ATA_OVER_ETH is not set # CONFIG_ATA_OVER_ETH is not set
# #
@ -473,6 +517,7 @@ CONFIG_SCSI_ISCSI_ATTRS=m
# #
# SCSI low-level drivers # SCSI low-level drivers
# #
# CONFIG_ISCSI_TCP is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_ACARD is not set
@ -559,6 +604,7 @@ CONFIG_DM_MULTIPATH_EMC=m
# #
# Macintosh device drivers # Macintosh device drivers
# #
# CONFIG_WINDFARM is not set
# #
# Network device support # Network device support
@ -645,7 +691,6 @@ CONFIG_IXGB=m
# CONFIG_IXGB_NAPI is not set # CONFIG_IXGB_NAPI is not set
CONFIG_S2IO=m CONFIG_S2IO=m
# CONFIG_S2IO_NAPI is not set # CONFIG_S2IO_NAPI is not set
# CONFIG_2BUFF_MODE is not set
# #
# Token Ring devices # Token Ring devices
@ -674,6 +719,7 @@ CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m CONFIG_PPP_BSDCOMP=m
# CONFIG_PPP_MPPE is not set
CONFIG_PPPOE=m CONFIG_PPPOE=m
# CONFIG_SLIP is not set # CONFIG_SLIP is not set
# CONFIG_NET_FC is not set # CONFIG_NET_FC is not set
@ -784,6 +830,8 @@ CONFIG_HVCS=m
# #
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
# CONFIG_RTC is not set # CONFIG_RTC is not set
CONFIG_GEN_RTC=y
# CONFIG_GEN_RTC_X is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
@ -801,6 +849,7 @@ CONFIG_MAX_RAW_DEVS=1024
# TPM devices # TPM devices
# #
# CONFIG_TCG_TPM is not set # CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
# #
# I2C support # I2C support
@ -852,6 +901,7 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set # CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set # CONFIG_SENSORS_MAX6875 is not set
# CONFIG_RTC_X1205_I2C is not set
# CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_BUS is not set
@ -893,7 +943,6 @@ CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
CONFIG_FB_MACMODES=y CONFIG_FB_MACMODES=y
CONFIG_FB_MODE_HELPERS=y CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y CONFIG_FB_TILEBLITTING=y
@ -905,6 +954,7 @@ CONFIG_FB_OF=y
# CONFIG_FB_ASILIANT is not set # CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set # CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set # CONFIG_FB_VGA16 is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set # CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set # CONFIG_FB_RIVA is not set
CONFIG_FB_MATROX=y CONFIG_FB_MATROX=y
@ -927,7 +977,6 @@ CONFIG_FB_RADEON_I2C=y
# CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_CYBLA is not set # CONFIG_FB_CYBLA is not set
# CONFIG_FB_TRIDENT is not set # CONFIG_FB_TRIDENT is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set # CONFIG_FB_VIRTUAL is not set
# #
@ -936,6 +985,7 @@ CONFIG_FB_RADEON_I2C=y
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set # CONFIG_FONTS is not set
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y CONFIG_FONT_8x16=y
@ -990,12 +1040,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
# #
# USB Device Class drivers # USB Device Class drivers
# #
# CONFIG_USB_BLUETOOTH_TTY is not set
# CONFIG_USB_ACM is not set # CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set # CONFIG_USB_PRINTER is not set
# #
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#
#
# may also be needed; see USB_STORAGE Help for more information
# #
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_DEBUG is not set
@ -1106,6 +1159,7 @@ CONFIG_INFINIBAND_MTHCA=m
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set # CONFIG_INFINIBAND_MTHCA_DEBUG is not set
CONFIG_INFINIBAND_IPOIB=m CONFIG_INFINIBAND_IPOIB=m
# CONFIG_INFINIBAND_IPOIB_DEBUG is not set # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
# CONFIG_INFINIBAND_SRP is not set
# #
# SN Devices # SN Devices
@ -1288,10 +1342,25 @@ CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_UTF8 is not set # CONFIG_NLS_UTF8 is not set
# #
# Profiling support # Library routines
#
CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
#
# Instrumentation Support
# #
CONFIG_PROFILING=y CONFIG_PROFILING=y
CONFIG_OPROFILE=y CONFIG_OPROFILE=y
# CONFIG_KPROBES is not set
# #
# Kernel hacking # Kernel hacking
@ -1308,14 +1377,15 @@ CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_VM is not set
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_STACKOVERFLOW=y CONFIG_DEBUG_STACKOVERFLOW=y
# CONFIG_KPROBES is not set
CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUGGER=y CONFIG_DEBUGGER=y
CONFIG_XMON=y CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y CONFIG_XMON_DEFAULT=y
# CONFIG_PPCDBG is not set
CONFIG_IRQSTACKS=y CONFIG_IRQSTACKS=y
# CONFIG_BOOTX_TEXT is not set
# #
# Security options # Security options
@ -1355,17 +1425,3 @@ CONFIG_CRYPTO_TEST=m
# #
# Hardware crypto devices # Hardware crypto devices
# #
#
# Library routines
#
CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m

View File

@ -25,7 +25,7 @@ obj-$(CONFIG_PPC_OF) += of_device.o
procfs-$(CONFIG_PPC64) := proc_ppc64.o procfs-$(CONFIG_PPC64) := proc_ppc64.o
obj-$(CONFIG_PROC_FS) += $(procfs-y) obj-$(CONFIG_PROC_FS) += $(procfs-y)
rtaspci-$(CONFIG_PPC64) := rtas_pci.o rtaspci-$(CONFIG_PPC64) := rtas_pci.o
obj-$(CONFIG_PPC_RTAS) += rtas.o $(rtaspci-y) obj-$(CONFIG_PPC_RTAS) += rtas.o rtas-rtc.o $(rtaspci-y)
obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o
obj-$(CONFIG_RTAS_PROC) += rtas-proc.o obj-$(CONFIG_RTAS_PROC) += rtas-proc.o
obj-$(CONFIG_LPARCFG) += lparcfg.o obj-$(CONFIG_LPARCFG) += lparcfg.o
@ -49,12 +49,23 @@ extra-y += vmlinux.lds
obj-y += process.o init_task.o time.o \ obj-y += process.o init_task.o time.o \
prom.o traps.o setup-common.o prom.o traps.o setup-common.o
obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o systbl.o obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o systbl.o
obj-$(CONFIG_PPC64) += misc_64.o obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o
obj-$(CONFIG_PPC_OF) += prom_init.o obj-$(CONFIG_PPC_OF) += prom_init.o
obj-$(CONFIG_MODULES) += ppc_ksyms.o obj-$(CONFIG_MODULES) += ppc_ksyms.o
obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_BOOTX_TEXT) += btext.o
obj-$(CONFIG_6xx) += idle_6xx.o obj-$(CONFIG_6xx) += idle_6xx.o
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_KPROBES) += kprobes.o
module-$(CONFIG_PPC64) += module_64.o
obj-$(CONFIG_MODULES) += $(module-y)
pci64-$(CONFIG_PPC64) += pci_64.o pci_dn.o pci_iommu.o \
pci_direct_iommu.o iomap.o
obj-$(CONFIG_PCI) += $(pci64-y)
kexec64-$(CONFIG_PPC64) += machine_kexec_64.o
obj-$(CONFIG_KEXEC) += $(kexec64-y)
ifeq ($(CONFIG_PPC_ISERIES),y) ifeq ($(CONFIG_PPC_ISERIES),y)
$(obj)/head_64.o: $(obj)/lparmap.s $(obj)/head_64.o: $(obj)/lparmap.s
@ -62,11 +73,8 @@ AFLAGS_head_64.o += -I$(obj)
endif endif
else else
# stuff used from here for ARCH=ppc or ARCH=ppc64 # stuff used from here for ARCH=ppc
smpobj-$(CONFIG_SMP) += smp.o smpobj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_PPC64) += traps.o process.o init_task.o time.o \
setup-common.o $(smpobj-y)
endif endif

View File

@ -270,13 +270,15 @@ int main(void)
DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec)); DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec)); DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec)); DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec));
DEFINE(TSPC64_TV_SEC, offsetof(struct timespec, tv_sec));
DEFINE(TSPC64_TV_NSEC, offsetof(struct timespec, tv_nsec));
DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec)); DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec));
DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec));
#else #else
DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec)); DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec)); DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec)); DEFINE(TSPC32_TV_SEC, offsetof(struct timespec, tv_sec));
DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec)); DEFINE(TSPC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
#endif #endif
/* timeval/timezone offsets for use by vdso */ /* timeval/timezone offsets for use by vdso */
DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));

View File

@ -24,7 +24,7 @@
* Copyright 2002-2004 MontaVista Software, Inc. * Copyright 2002-2004 MontaVista Software, Inc.
* PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org> * PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
* Copyright 2004 Freescale Semiconductor, Inc * Copyright 2004 Freescale Semiconductor, Inc
* PowerPC e500 modifications, Kumar Gala <kumar.gala@freescale.com> * PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the

View File

@ -40,10 +40,6 @@ IOCTL_TABLE_START
#define DECLARES #define DECLARES
#include "compat_ioctl.c" #include "compat_ioctl.c"
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
IOCTL_TABLE_END IOCTL_TABLE_END
int ioctl_table_size = ARRAY_SIZE(ioctl_start); int ioctl_table_size = ARRAY_SIZE(ioctl_start);

View File

@ -71,6 +71,11 @@
#include <asm/paca.h> #include <asm/paca.h>
#endif #endif
int __irq_offset_value;
#ifdef CONFIG_PPC32
EXPORT_SYMBOL(__irq_offset_value);
#endif
static int ppc_spurious_interrupts; static int ppc_spurious_interrupts;
#if defined(CONFIG_PPC_ISERIES) && defined(CONFIG_SMP) #if defined(CONFIG_PPC_ISERIES) && defined(CONFIG_SMP)
@ -98,7 +103,6 @@ extern atomic_t ipi_sent;
EXPORT_SYMBOL(irq_desc); EXPORT_SYMBOL(irq_desc);
int distribute_irqs = 1; int distribute_irqs = 1;
int __irq_offset_value;
u64 ppc64_interrupt_controller; u64 ppc64_interrupt_controller;
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
@ -311,7 +315,6 @@ void __init init_IRQ(void)
} }
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#ifndef CONFIG_PPC_ISERIES
/* /*
* Virtual IRQ mapping code, used on systems with XICS interrupt controllers. * Virtual IRQ mapping code, used on systems with XICS interrupt controllers.
*/ */
@ -420,8 +423,6 @@ unsigned int real_irq_to_virt_slowpath(unsigned int real_irq)
} }
#endif /* CONFIG_PPC_ISERIES */
#ifdef CONFIG_IRQSTACKS #ifdef CONFIG_IRQSTACKS
struct thread_info *softirq_ctx[NR_CPUS]; struct thread_info *softirq_ctx[NR_CPUS];
struct thread_info *hardirq_ctx[NR_CPUS]; struct thread_info *hardirq_ctx[NR_CPUS];

View File

@ -42,32 +42,6 @@
/* #define LPARCFG_DEBUG */ /* #define LPARCFG_DEBUG */
/* find a better place for this function... */
static void log_plpar_hcall_return(unsigned long rc, char *tag)
{
if (rc == 0) /* success, return */
return;
/* check for null tag ? */
if (rc == H_Hardware)
printk(KERN_INFO
"plpar-hcall (%s) failed with hardware fault\n", tag);
else if (rc == H_Function)
printk(KERN_INFO
"plpar-hcall (%s) failed; function not allowed\n", tag);
else if (rc == H_Authority)
printk(KERN_INFO
"plpar-hcall (%s) failed; not authorized to this function\n",
tag);
else if (rc == H_Parameter)
printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n",
tag);
else
printk(KERN_INFO
"plpar-hcall (%s) failed with unexpected rc(0x%lx)\n",
tag, rc);
}
static struct proc_dir_entry *proc_ppc64_lparcfg; static struct proc_dir_entry *proc_ppc64_lparcfg;
#define LPARCFG_BUFF_SIZE 4096 #define LPARCFG_BUFF_SIZE 4096
@ -172,6 +146,31 @@ static int lparcfg_data(struct seq_file *m, void *v)
/* /*
* Methods used to fetch LPAR data when running on a pSeries platform. * Methods used to fetch LPAR data when running on a pSeries platform.
*/ */
/* find a better place for this function... */
static void log_plpar_hcall_return(unsigned long rc, char *tag)
{
if (rc == 0) /* success, return */
return;
/* check for null tag ? */
if (rc == H_Hardware)
printk(KERN_INFO
"plpar-hcall (%s) failed with hardware fault\n", tag);
else if (rc == H_Function)
printk(KERN_INFO
"plpar-hcall (%s) failed; function not allowed\n", tag);
else if (rc == H_Authority)
printk(KERN_INFO
"plpar-hcall (%s) failed; not authorized to this function\n",
tag);
else if (rc == H_Parameter)
printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n",
tag);
else
printk(KERN_INFO
"plpar-hcall (%s) failed with unexpected rc(0x%lx)\n",
tag, rc);
}
/* /*
* H_GET_PPP hcall returns info in 4 parms. * H_GET_PPP hcall returns info in 4 parms.

View File

@ -185,8 +185,8 @@ void kexec_copy_flush(struct kimage *image)
*/ */
void kexec_smp_down(void *arg) void kexec_smp_down(void *arg)
{ {
if (ppc_md.cpu_irq_down) if (ppc_md.kexec_cpu_down)
ppc_md.cpu_irq_down(1); ppc_md.kexec_cpu_down(0, 1);
local_irq_disable(); local_irq_disable();
kexec_smp_wait(); kexec_smp_wait();
@ -233,8 +233,8 @@ static void kexec_prepare_cpus(void)
} }
/* after we tell the others to go down */ /* after we tell the others to go down */
if (ppc_md.cpu_irq_down) if (ppc_md.kexec_cpu_down)
ppc_md.cpu_irq_down(0); ppc_md.kexec_cpu_down(0, 0);
put_cpu(); put_cpu();
@ -255,8 +255,8 @@ static void kexec_prepare_cpus(void)
* UP to an SMP kernel. * UP to an SMP kernel.
*/ */
smp_release_cpus(); smp_release_cpus();
if (ppc_md.cpu_irq_down) if (ppc_md.kexec_cpu_down)
ppc_md.cpu_irq_down(0); ppc_md.kexec_cpu_down(0, 0);
local_irq_disable(); local_irq_disable();
} }
@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image)
ppc_md.hpte_clear_all); ppc_md.hpte_clear_all);
/* NOTREACHED */ /* NOTREACHED */
} }
/* Values we need to export to the second kernel via the device tree. */
static unsigned long htab_base, htab_size, kernel_end;
static struct property htab_base_prop = {
.name = "linux,htab-base",
.length = sizeof(unsigned long),
.value = (unsigned char *)&htab_base,
};
static struct property htab_size_prop = {
.name = "linux,htab-size",
.length = sizeof(unsigned long),
.value = (unsigned char *)&htab_size,
};
static struct property kernel_end_prop = {
.name = "linux,kernel-end",
.length = sizeof(unsigned long),
.value = (unsigned char *)&kernel_end,
};
static void __init export_htab_values(void)
{
struct device_node *node;
node = of_find_node_by_path("/chosen");
if (!node)
return;
kernel_end = __pa(_end);
prom_add_property(node, &kernel_end_prop);
/* On machines with no htab htab_address is NULL */
if (NULL == htab_address)
goto out;
htab_base = __pa(htab_address);
prom_add_property(node, &htab_base_prop);
htab_size = 1UL << ppc64_pft_size;
prom_add_property(node, &htab_size_prop);
out:
of_node_put(node);
}
void __init kexec_setup(void)
{
export_htab_values();
}

View File

@ -1368,6 +1368,7 @@ prom_n_addr_cells(struct device_node* np)
/* No #address-cells property for the root node, default to 1 */ /* No #address-cells property for the root node, default to 1 */
return 1; return 1;
} }
EXPORT_SYMBOL(prom_n_addr_cells);
int int
prom_n_size_cells(struct device_node* np) prom_n_size_cells(struct device_node* np)
@ -1383,6 +1384,7 @@ prom_n_size_cells(struct device_node* np)
/* No #size-cells property for the root node, default to 1 */ /* No #size-cells property for the root node, default to 1 */
return 1; return 1;
} }
EXPORT_SYMBOL(prom_n_size_cells);
/** /**
* Work out the sense (active-low level / active-high edge) * Work out the sense (active-low level / active-high edge)

View File

@ -0,0 +1,105 @@
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/rtc.h>
#include <linux/delay.h>
#include <asm/prom.h>
#include <asm/rtas.h>
#include <asm/time.h>
#define MAX_RTC_WAIT 5000 /* 5 sec */
#define RTAS_CLOCK_BUSY (-2)
unsigned long __init rtas_get_boot_time(void)
{
int ret[8];
int error, wait_time;
unsigned long max_wait_tb;
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
do {
error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
wait_time = rtas_extended_busy_delay_time(error);
/* This is boot time so we spin. */
udelay(wait_time*1000);
error = RTAS_CLOCK_BUSY;
}
} while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
if (error != 0 && printk_ratelimit()) {
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
error);
return 0;
}
return mktime(ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]);
}
/* NOTE: get_rtc_time will get an error if executed in interrupt context
* and if a delay is needed to read the clock. In this case we just
* silently return without updating rtc_tm.
*/
void rtas_get_rtc_time(struct rtc_time *rtc_tm)
{
int ret[8];
int error, wait_time;
unsigned long max_wait_tb;
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
do {
error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
if (in_interrupt() && printk_ratelimit()) {
memset(&rtc_tm, 0, sizeof(struct rtc_time));
printk(KERN_WARNING "error: reading clock"
" would delay interrupt\n");
return; /* delay not allowed */
}
wait_time = rtas_extended_busy_delay_time(error);
msleep(wait_time);
error = RTAS_CLOCK_BUSY;
}
} while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
if (error != 0 && printk_ratelimit()) {
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
error);
return;
}
rtc_tm->tm_sec = ret[5];
rtc_tm->tm_min = ret[4];
rtc_tm->tm_hour = ret[3];
rtc_tm->tm_mday = ret[2];
rtc_tm->tm_mon = ret[1] - 1;
rtc_tm->tm_year = ret[0] - 1900;
}
int rtas_set_rtc_time(struct rtc_time *tm)
{
int error, wait_time;
unsigned long max_wait_tb;
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
do {
error = rtas_call(rtas_token("set-time-of-day"), 7, 1, NULL,
tm->tm_year + 1900, tm->tm_mon + 1,
tm->tm_mday, tm->tm_hour, tm->tm_min,
tm->tm_sec, 0);
if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
if (in_interrupt())
return 1; /* probably decrementer */
wait_time = rtas_extended_busy_delay_time(error);
msleep(wait_time);
error = RTAS_CLOCK_BUSY;
}
} while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
if (error != 0 && printk_ratelimit())
printk(KERN_WARNING "error: setting the clock failed (%d)\n",
error);
return 0;
}

View File

@ -57,10 +57,6 @@ extern void power4_idle(void);
boot_infos_t *boot_infos; boot_infos_t *boot_infos;
struct ide_machdep_calls ppc_ide_md; struct ide_machdep_calls ppc_ide_md;
/* XXX should go elsewhere */
int __irq_offset_value;
EXPORT_SYMBOL(__irq_offset_value);
int boot_cpuid; int boot_cpuid;
EXPORT_SYMBOL_GPL(boot_cpuid); EXPORT_SYMBOL_GPL(boot_cpuid);
int boot_cpuid_phys; int boot_cpuid_phys;

View File

@ -59,6 +59,7 @@
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/xmon.h> #include <asm/xmon.h>
#include <asm/udbg.h> #include <asm/udbg.h>
#include <asm/kexec.h>
#include "setup.h" #include "setup.h"
@ -415,6 +416,10 @@ void __init setup_system(void)
*/ */
unflatten_device_tree(); unflatten_device_tree();
#ifdef CONFIG_KEXEC
kexec_setup(); /* requires unflattened device tree. */
#endif
/* /*
* Fill the ppc64_caches & systemcfg structures with informations * Fill the ppc64_caches & systemcfg structures with informations
* retreived from the device-tree. Need to be called before * retreived from the device-tree. Need to be called before

View File

@ -403,8 +403,6 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
ELF_NFPREG * sizeof(double))) ELF_NFPREG * sizeof(double)))
return 1; return 1;
current->thread.fpscr.val = 0; /* turn off all fp exceptions */
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
/* save altivec registers */ /* save altivec registers */
if (current->thread.used_vr) { if (current->thread.used_vr) {
@ -818,6 +816,9 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
goto badframe; goto badframe;
regs->link = (unsigned long) frame->tramp; regs->link = (unsigned long) frame->tramp;
} }
current->thread.fpscr.val = 0; /* turn off all fp exceptions */
if (put_user(regs->gpr[1], (u32 __user *)newsp)) if (put_user(regs->gpr[1], (u32 __user *)newsp))
goto badframe; goto badframe;
regs->gpr[1] = newsp; regs->gpr[1] = newsp;
@ -1097,6 +1098,8 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
regs->link = (unsigned long) frame->mctx.tramp; regs->link = (unsigned long) frame->mctx.tramp;
} }
current->thread.fpscr.val = 0; /* turn off all fp exceptions */
if (put_user(regs->gpr[1], (u32 __user *)newsp)) if (put_user(regs->gpr[1], (u32 __user *)newsp))
goto badframe; goto badframe;
regs->gpr[1] = newsp; regs->gpr[1] = newsp;

View File

@ -131,9 +131,6 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
flush_fp_to_thread(current); flush_fp_to_thread(current);
/* Make sure signal doesn't get spurrious FP exceptions */
current->thread.fpscr.val = 0;
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
err |= __put_user(v_regs, &sc->v_regs); err |= __put_user(v_regs, &sc->v_regs);
@ -423,6 +420,9 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
if (err) if (err)
goto badframe; goto badframe;
/* Make sure signal handler doesn't get spurious FP exceptions */
current->thread.fpscr.val = 0;
/* Set up to return from userspace. */ /* Set up to return from userspace. */
if (vdso64_rt_sigtramp && current->thread.vdso_base) { if (vdso64_rt_sigtramp && current->thread.vdso_base) {
regs->link = current->thread.vdso_base + vdso64_rt_sigtramp; regs->link = current->thread.vdso_base + vdso64_rt_sigtramp;

View File

@ -77,8 +77,9 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
mflr r12 mflr r12
.cfi_register lr,r12 .cfi_register lr,r12
bl __get_datapage@local bl __get_datapage@local
lwz r3,CFG_TB_TICKS_PER_SEC(r3)
lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3) lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
lwz r3,CFG_TB_TICKS_PER_SEC(r3)
mtlr r12 mtlr r12
blr
.cfi_endproc .cfi_endproc
V_FUNCTION_END(__kernel_get_tbfreq) V_FUNCTION_END(__kernel_get_tbfreq)

View File

@ -83,7 +83,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
/* Check for supported clock IDs */ /* Check for supported clock IDs */
cmpli cr0,r3,CLOCK_REALTIME cmpli cr0,r3,CLOCK_REALTIME
cmpli cr1,r3,CLOCK_MONOTONIC cmpli cr1,r3,CLOCK_MONOTONIC
cror cr0,cr0,cr1 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
bne cr0,99f bne cr0,99f
mflr r12 /* r12 saves lr */ mflr r12 /* r12 saves lr */
@ -91,7 +91,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
mr r10,r3 /* r10 saves id */ mr r10,r3 /* r10 saves id */
mr r11,r4 /* r11 saves tp */ mr r11,r4 /* r11 saves tp */
bl __get_datapage@local /* get data page */ bl __get_datapage@local /* get data page */
mr r9, r3 /* datapage ptr in r9 */ mr r9,r3 /* datapage ptr in r9 */
beq cr1,50f /* if monotonic -> jump there */ beq cr1,50f /* if monotonic -> jump there */
/* /*
@ -173,10 +173,14 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
add r4,r4,r7 add r4,r4,r7
lis r5,NSEC_PER_SEC@h lis r5,NSEC_PER_SEC@h
ori r5,r5,NSEC_PER_SEC@l ori r5,r5,NSEC_PER_SEC@l
cmpli cr0,r4,r5 cmpl cr0,r4,r5
cmpli cr1,r4,0
blt 1f blt 1f
subf r4,r5,r4 subf r4,r5,r4
addi r3,r3,1 addi r3,r3,1
1: bge cr1,1f
addi r3,r3,-1
add r4,r4,r5
1: stw r3,TSPC32_TV_SEC(r11) 1: stw r3,TSPC32_TV_SEC(r11)
stw r4,TSPC32_TV_NSEC(r11) stw r4,TSPC32_TV_NSEC(r11)
@ -210,7 +214,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
/* Check for supported clock IDs */ /* Check for supported clock IDs */
cmpwi cr0,r3,CLOCK_REALTIME cmpwi cr0,r3,CLOCK_REALTIME
cmpwi cr1,r3,CLOCK_MONOTONIC cmpwi cr1,r3,CLOCK_MONOTONIC
cror cr0,cr0,cr1 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
bne cr0,99f bne cr0,99f
li r3,0 li r3,0

View File

@ -80,5 +80,6 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
bl V_LOCAL_FUNC(__get_datapage) bl V_LOCAL_FUNC(__get_datapage)
ld r3,CFG_TB_TICKS_PER_SEC(r3) ld r3,CFG_TB_TICKS_PER_SEC(r3)
mtlr r12 mtlr r12
blr
.cfi_endproc .cfi_endproc
V_FUNCTION_END(__kernel_get_tbfreq) V_FUNCTION_END(__kernel_get_tbfreq)

View File

@ -1,4 +1,5 @@
/*
/*
* Userland implementation of gettimeofday() for 64 bits processes in a * Userland implementation of gettimeofday() for 64 bits processes in a
* ppc64 kernel for use in the vDSO * ppc64 kernel for use in the vDSO
* *
@ -68,7 +69,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
/* Check for supported clock IDs */ /* Check for supported clock IDs */
cmpwi cr0,r3,CLOCK_REALTIME cmpwi cr0,r3,CLOCK_REALTIME
cmpwi cr1,r3,CLOCK_MONOTONIC cmpwi cr1,r3,CLOCK_MONOTONIC
cror cr0,cr0,cr1 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
bne cr0,99f bne cr0,99f
mflr r12 /* r12 saves lr */ mflr r12 /* r12 saves lr */
@ -84,16 +85,17 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */ bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */ lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
ori r7,r7,0xca00 ori r7,r7,16960
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */ rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */ rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
std r5,TSPC64_TV_SEC(r11) /* store sec in tv */ std r5,TSPC64_TV_SEC(r11) /* store sec in tv */
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */ subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
mulld r0,r0,r7 /* nsec = (xsec * NSEC_PER_SEC) / mulld r0,r0,r7 /* usec = (xsec * USEC_PER_SEC) /
* XSEC_PER_SEC * XSEC_PER_SEC
*/ */
rldicl r0,r0,44,20 rldicl r0,r0,44,20
mulli r0,r0,1000 /* nsec = usec * 1000 */
std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */ std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */
mtlr r12 mtlr r12
@ -106,15 +108,16 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
50: bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */ 50: bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */ lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
ori r7,r7,0xca00 ori r7,r7,16960
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */ rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */ rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */ subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
mulld r0,r0,r7 /* nsec = (xsec * NSEC_PER_SEC) / mulld r0,r0,r7 /* usec = (xsec * USEC_PER_SEC) /
* XSEC_PER_SEC * XSEC_PER_SEC
*/ */
rldicl r6,r0,44,20 rldicl r6,r0,44,20
mulli r6,r6,1000 /* nsec = usec * 1000 */
/* now we must fixup using wall to monotonic. We need to snapshot /* now we must fixup using wall to monotonic. We need to snapshot
* that value and do the counter trick again. Fortunately, we still * that value and do the counter trick again. Fortunately, we still
@ -123,8 +126,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
* can be used * can be used
*/ */
lwz r4,WTOM_CLOCK_SEC(r9) lwa r4,WTOM_CLOCK_SEC(r3)
lwz r7,WTOM_CLOCK_NSEC(r9) lwa r7,WTOM_CLOCK_NSEC(r3)
/* We now have our result in r4,r7. We create a fake dependency /* We now have our result in r4,r7. We create a fake dependency
* on that result and re-check the counter * on that result and re-check the counter
@ -144,10 +147,14 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
add r7,r7,r6 add r7,r7,r6
lis r9,NSEC_PER_SEC@h lis r9,NSEC_PER_SEC@h
ori r9,r9,NSEC_PER_SEC@l ori r9,r9,NSEC_PER_SEC@l
cmpli cr0,r7,r9 cmpl cr0,r7,r9
cmpli cr1,r7,0
blt 1f blt 1f
subf r7,r9,r7 subf r7,r9,r7
addi r4,r4,1 addi r4,r4,1
1: bge cr1,1f
addi r4,r4,-1
add r7,r7,r9
1: std r4,TSPC64_TV_SEC(r11) 1: std r4,TSPC64_TV_SEC(r11)
std r7,TSPC64_TV_NSEC(r11) std r7,TSPC64_TV_NSEC(r11)
@ -181,7 +188,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
/* Check for supported clock IDs */ /* Check for supported clock IDs */
cmpwi cr0,r3,CLOCK_REALTIME cmpwi cr0,r3,CLOCK_REALTIME
cmpwi cr1,r3,CLOCK_MONOTONIC cmpwi cr1,r3,CLOCK_MONOTONIC
cror cr0,cr0,cr1 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
bne cr0,99f bne cr0,99f
li r3,0 li r3,0

View File

@ -1,5 +1,5 @@
/* /*
* Modifications by Kumar Gala (kumar.gala@freescale.com) to support * Modifications by Kumar Gala (galak@kernel.crashing.org) to support
* E500 Book E processors. * E500 Book E processors.
* *
* Copyright 2004 Freescale Semiconductor, Inc * Copyright 2004 Freescale Semiconductor, Inc

View File

@ -7,7 +7,7 @@
* Copyright (c) 2004 Freescale Semiconductor, Inc * Copyright (c) 2004 Freescale Semiconductor, Inc
* *
* Author: Andy Fleming * Author: Andy Fleming
* Maintainer: Kumar Gala <Kumar.Gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License

View File

@ -42,13 +42,6 @@
#include "irq.h" #include "irq.h"
#include "call_pci.h" #include "call_pci.h"
/* This maps virtual irq numbers to real irqs */
unsigned int virt_irq_to_real_map[NR_IRQS];
/* The next available virtual irq number */
/* Note: the pcnet32 driver assumes irq numbers < 2 aren't valid. :( */
static int next_virtual_irq = 2;
static long Pci_Interrupt_Count; static long Pci_Interrupt_Count;
static long Pci_Event_Count; static long Pci_Event_Count;
@ -350,26 +343,14 @@ static hw_irq_controller iSeries_IRQ_handler = {
int __init iSeries_allocate_IRQ(HvBusNumber busNumber, int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
HvSubBusNumber subBusNumber, HvAgentId deviceId) HvSubBusNumber subBusNumber, HvAgentId deviceId)
{ {
unsigned int realirq, virtirq; int virtirq;
unsigned int realirq;
u8 idsel = (deviceId >> 4); u8 idsel = (deviceId >> 4);
u8 function = deviceId & 7; u8 function = deviceId & 7;
virtirq = next_virtual_irq++;
realirq = ((busNumber - 1) << 6) + ((idsel - 1) << 3) + function; realirq = ((busNumber - 1) << 6) + ((idsel - 1) << 3) + function;
virt_irq_to_real_map[virtirq] = realirq; virtirq = virt_irq_create_mapping(realirq);
irq_desc[virtirq].handler = &iSeries_IRQ_handler; irq_desc[virtirq].handler = &iSeries_IRQ_handler;
return virtirq; return virtirq;
} }
int virt_irq_create_mapping(unsigned int real_irq)
{
BUG(); /* Don't call this on iSeries, yet */
return 0;
}
void virt_irq_init(void)
{
return;
}

View File

@ -39,7 +39,6 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/systemcfg.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/paca.h> #include <asm/paca.h>
@ -548,8 +547,6 @@ static unsigned long __init build_iSeries_Memory_Map(void)
*/ */
static void __init iSeries_setup_arch(void) static void __init iSeries_setup_arch(void)
{ {
unsigned procIx = get_paca()->lppaca.dyn_hv_phys_proc_index;
if (get_paca()->lppaca.shared_proc) { if (get_paca()->lppaca.shared_proc) {
ppc_md.idle_loop = iseries_shared_idle; ppc_md.idle_loop = iseries_shared_idle;
printk(KERN_INFO "Using shared processor idle loop\n"); printk(KERN_INFO "Using shared processor idle loop\n");
@ -565,9 +562,6 @@ static void __init iSeries_setup_arch(void)
itVpdAreas.xSlicMaxLogicalProcs); itVpdAreas.xSlicMaxLogicalProcs);
printk("Max physical processors = %d\n", printk("Max physical processors = %d\n",
itVpdAreas.xSlicMaxPhysicalProcs); itVpdAreas.xSlicMaxPhysicalProcs);
_systemcfg->processor = xIoHriProcessorVpd[procIx].xPVR;
printk("Processor version = %x\n", _systemcfg->processor);
} }
static void iSeries_show_cpuinfo(struct seq_file *m) static void iSeries_show_cpuinfo(struct seq_file *m)

View File

@ -102,7 +102,7 @@ static unsigned long from_rtc_time(struct rtc_time *tm)
static unsigned long cuda_get_time(void) static unsigned long cuda_get_time(void)
{ {
struct adb_request req; struct adb_request req;
unsigned long now; unsigned int now;
if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_GET_TIME) < 0) if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_GET_TIME) < 0)
return 0; return 0;
@ -113,7 +113,7 @@ static unsigned long cuda_get_time(void)
req.reply_len); req.reply_len);
now = (req.reply[3] << 24) + (req.reply[4] << 16) now = (req.reply[3] << 24) + (req.reply[4] << 16)
+ (req.reply[5] << 8) + req.reply[6]; + (req.reply[5] << 8) + req.reply[6];
return now - RTC_OFFSET; return ((unsigned long)now) - RTC_OFFSET;
} }
#define cuda_get_rtc_time(tm) to_rtc_time(cuda_get_time(), (tm)) #define cuda_get_rtc_time(tm) to_rtc_time(cuda_get_time(), (tm))
@ -146,7 +146,7 @@ static int cuda_set_rtc_time(struct rtc_time *tm)
static unsigned long pmu_get_time(void) static unsigned long pmu_get_time(void)
{ {
struct adb_request req; struct adb_request req;
unsigned long now; unsigned int now;
if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0) if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0)
return 0; return 0;
@ -156,7 +156,7 @@ static unsigned long pmu_get_time(void)
req.reply_len); req.reply_len);
now = (req.reply[0] << 24) + (req.reply[1] << 16) now = (req.reply[0] << 24) + (req.reply[1] << 16)
+ (req.reply[2] << 8) + req.reply[3]; + (req.reply[2] << 8) + req.reply[3];
return now - RTC_OFFSET; return ((unsigned long)now) - RTC_OFFSET;
} }
#define pmu_get_rtc_time(tm) to_rtc_time(pmu_get_time(), (tm)) #define pmu_get_rtc_time(tm) to_rtc_time(pmu_get_time(), (tm))
@ -199,6 +199,7 @@ static unsigned long smu_get_time(void)
#define smu_set_rtc_time(tm, spin) 0 #define smu_set_rtc_time(tm, spin) 0
#endif #endif
/* Can't be __init, it's called when suspending and resuming */
unsigned long pmac_get_boot_time(void) unsigned long pmac_get_boot_time(void)
{ {
/* Get the time from the RTC, used only at boot time */ /* Get the time from the RTC, used only at boot time */

View File

@ -4,4 +4,7 @@ obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_IBMVIO) += vio.o obj-$(CONFIG_IBMVIO) += vio.o
obj-$(CONFIG_XICS) += xics.o obj-$(CONFIG_XICS) += xics.o
obj-$(CONFIG_SCANLOG) += scanlog.o obj-$(CONFIG_SCANLOG) += scanlog.o
obj-$(CONFIG_EEH) += eeh.o eeh_event.o obj-$(CONFIG_EEH) += eeh.o eeh_event.o
obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o
obj-$(CONFIG_HVCS) += hvcserver.o

View File

@ -200,14 +200,12 @@ static void __init pSeries_setup_arch(void)
if (ppc64_interrupt_controller == IC_OPEN_PIC) { if (ppc64_interrupt_controller == IC_OPEN_PIC) {
ppc_md.init_IRQ = pSeries_init_mpic; ppc_md.init_IRQ = pSeries_init_mpic;
ppc_md.get_irq = mpic_get_irq; ppc_md.get_irq = mpic_get_irq;
ppc_md.cpu_irq_down = mpic_teardown_this_cpu;
/* Allocate the mpic now, so that find_and_init_phbs() can /* Allocate the mpic now, so that find_and_init_phbs() can
* fill the ISUs */ * fill the ISUs */
pSeries_setup_mpic(); pSeries_setup_mpic();
} else { } else {
ppc_md.init_IRQ = xics_init_IRQ; ppc_md.init_IRQ = xics_init_IRQ;
ppc_md.get_irq = xics_get_irq; ppc_md.get_irq = xics_get_irq;
ppc_md.cpu_irq_down = xics_teardown_cpu;
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
@ -595,6 +593,27 @@ static int pSeries_pci_probe_mode(struct pci_bus *bus)
return PCI_PROBE_NORMAL; return PCI_PROBE_NORMAL;
} }
#ifdef CONFIG_KEXEC
static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
{
/* Don't risk a hypervisor call if we're crashing */
if (!crash_shutdown) {
unsigned long vpa = __pa(&get_paca()->lppaca);
if (unregister_vpa(hard_smp_processor_id(), vpa)) {
printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
"failed\n", smp_processor_id(),
hard_smp_processor_id());
}
}
if (ppc64_interrupt_controller == IC_OPEN_PIC)
mpic_teardown_this_cpu(secondary);
else
xics_teardown_cpu(secondary);
}
#endif
struct machdep_calls __initdata pSeries_md = { struct machdep_calls __initdata pSeries_md = {
.probe = pSeries_probe, .probe = pSeries_probe,
.setup_arch = pSeries_setup_arch, .setup_arch = pSeries_setup_arch,
@ -617,4 +636,7 @@ struct machdep_calls __initdata pSeries_md = {
.check_legacy_ioport = pSeries_check_legacy_ioport, .check_legacy_ioport = pSeries_check_legacy_ioport,
.system_reset_exception = pSeries_system_reset_exception, .system_reset_exception = pSeries_system_reset_exception,
.machine_check_exception = pSeries_machine_check_exception, .machine_check_exception = pSeries_machine_check_exception,
#ifdef CONFIG_KEXEC
.kexec_cpu_down = pseries_kexec_cpu_down,
#endif
}; };

View File

@ -19,6 +19,7 @@
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sysrq.h> #include <linux/sysrq.h>
#include <linux/interrupt.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/string.h> #include <asm/string.h>

View File

@ -24,7 +24,7 @@
* Copyright 2002-2004 MontaVista Software, Inc. * Copyright 2002-2004 MontaVista Software, Inc.
* PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org> * PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
* Copyright 2004 Freescale Semiconductor, Inc * Copyright 2004 Freescale Semiconductor, Inc
* PowerPC e500 modifications, Kumar Gala <kumar.gala@freescale.com> * PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the

View File

@ -1,5 +1,5 @@
/* /*
* Modifications by Kumar Gala (kumar.gala@freescale.com) to support * Modifications by Kumar Gala (galak@kernel.crashing.org) to support
* E500 Book E processors. * E500 Book E processors.
* *
* Copyright 2004 Freescale Semiconductor, Inc * Copyright 2004 Freescale Semiconductor, Inc

View File

@ -3,7 +3,7 @@
* *
* MPC834x SYS board specific routines * MPC834x SYS board specific routines
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2005 Freescale Semiconductor Inc. * Copyright 2005 Freescale Semiconductor Inc.
* *
@ -73,12 +73,19 @@ mpc83xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
* A B C D * A B C D
*/ */
{ {
{PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x11 */ {PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x11 */
{PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x12 */ {PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x12 */
{PIRQD, PIRQA, PIRQB, PIRQC} /* idsel 0x13 */ {PIRQD, PIRQA, PIRQB, PIRQC}, /* idsel 0x13 */
{0, 0, 0, 0},
{PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x15 */
{PIRQD, PIRQA, PIRQB, PIRQC}, /* idsel 0x16 */
{PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x17 */
{PIRQB, PIRQC, PIRQD, PIRQA}, /* idsel 0x18 */
{0, 0, 0, 0}, /* idsel 0x19 */
{0, 0, 0, 0}, /* idsel 0x20 */
}; };
const long min_idsel = 0x11, max_idsel = 0x13, irqs_per_slot = 4; const long min_idsel = 0x11, max_idsel = 0x20, irqs_per_slot = 4;
return PCI_IRQ_TABLE_LOOKUP; return PCI_IRQ_TABLE_LOOKUP;
} }

View File

@ -3,7 +3,7 @@
* *
* MPC834X SYS common board definitions * MPC834X SYS common board definitions
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2005 Freescale Semiconductor, Inc. * Copyright 2005 Freescale Semiconductor, Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC8540ADS board specific routines * MPC8540ADS board specific routines
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC8540ADS board definitions * MPC8540ADS board definitions
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC8555CDS board definitions * MPC8555CDS board definitions
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC8560ADS board specific routines * MPC8560ADS board specific routines
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC8540ADS board definitions * MPC8540ADS board definitions
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

View File

@ -3,7 +3,7 @@
* *
* MPC85xx ADS board common routines * MPC85xx ADS board common routines
* *
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <galak@kernel.crashing.org>
* *
* Copyright 2004 Freescale Semiconductor Inc. * Copyright 2004 Freescale Semiconductor Inc.
* *

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