mirror of
https://github.com/torvalds/linux.git
synced 2024-12-18 09:02:17 +00:00
Merge branch 'upstream-fixes'
This commit is contained in:
commit
3be4bb06b5
2
CREDITS
2
CREDITS
@ -1097,7 +1097,7 @@ S: 80050-430 - Curitiba - Paran
|
||||
S: Brazil
|
||||
|
||||
N: Kumar Gala
|
||||
E: kumar.gala@freescale.com
|
||||
E: galak@kernel.crashing.org
|
||||
D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support
|
||||
S: Austin, Texas 78729
|
||||
S: USA
|
||||
|
@ -20,6 +20,12 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||
# +--> DIR=file (htmldocs)
|
||||
# +--> 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.
|
||||
.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))
|
||||
$(obj)/procfs-guide.xml: $(C-procfs-example2)
|
||||
|
||||
###
|
||||
# Rules to generate postscript, PDF and HTML
|
||||
# db2html creates a directory. Generate a html file used for timestamp
|
||||
notfoundtemplate = echo "*** You have to install docbook-utils or xmlto ***"; \
|
||||
exit 1
|
||||
db2xtemplate = db2TYPE -o $(dir $@) $<
|
||||
xmltotemplate = xmlto TYPE $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
|
||||
quiet_cmd_db2ps = XMLTO $@
|
||||
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
# determine which methods are available
|
||||
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
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2ps)
|
||||
|
||||
quiet_cmd_db2pdf = XMLTO $@
|
||||
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
quiet_cmd_db2pdf = PDF $@
|
||||
cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
|
||||
%.pdf : %.xml
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2pdf)
|
||||
|
||||
quiet_cmd_db2html = XMLTO $@
|
||||
quiet_cmd_db2html = HTML $@
|
||||
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||
@ -127,7 +145,7 @@ quiet_cmd_db2html = XMLTO $@
|
||||
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
||||
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
|
||||
%.9 : %.xml
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
|
@ -68,9 +68,7 @@ X!Iinclude/linux/kobject.h
|
||||
|
||||
<sect1><title>Kernel utility functions</title>
|
||||
!Iinclude/linux/kernel.h
|
||||
<!-- This needs to clean up to make kernel-doc happy
|
||||
X!Ekernel/printk.c
|
||||
-->
|
||||
!Ekernel/printk.c
|
||||
!Ekernel/panic.c
|
||||
!Ekernel/sys.c
|
||||
!Ekernel/rcupdate.c
|
||||
@ -388,7 +386,7 @@ X!Edrivers/pnp/system.c
|
||||
|
||||
<chapter id="blkdev">
|
||||
<title>Block Devices</title>
|
||||
!Edrivers/block/ll_rw_blk.c
|
||||
!Eblock/ll_rw_blk.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="miscdev">
|
||||
|
@ -3,4 +3,5 @@
|
||||
<param name="chunk.quietly">1</param>
|
||||
<param name="funcsynopsis.style">ansi</param>
|
||||
<param name="funcsynopsis.tabular.threshold">80</param>
|
||||
<!-- <param name="paper.type">A4</param> -->
|
||||
</stylesheet>
|
||||
|
@ -115,6 +115,33 @@ boolean is return which indicates whether the resulting counter value
|
||||
is negative. It requires explicit memory barrier semantics around the
|
||||
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
|
||||
operation which does not return a value, a set of interfaces are
|
||||
defined which accomplish this:
|
||||
|
@ -1063,8 +1063,8 @@ Aside:
|
||||
4.4 I/O contexts
|
||||
I/O contexts provide a dynamically allocated per process data area. They may
|
||||
be used in I/O schedulers, and in the block layer (could be used for IO statis,
|
||||
priorities for example). See *io_context in drivers/block/ll_rw_blk.c, and
|
||||
as-iosched.c for an example of usage in an i/o scheduler.
|
||||
priorities for example). See *io_context in block/ll_rw_blk.c, and as-iosched.c
|
||||
for an example of usage in an i/o scheduler.
|
||||
|
||||
|
||||
5. Scalability related changes
|
||||
|
@ -140,3 +140,12 @@ What: EXPORT_SYMBOL(lookup_hash)
|
||||
When: January 2006
|
||||
Why: Too low-level interface. Use lookup_one_len or lookup_create instead.
|
||||
Who: Christoph Hellwig <hch@lst.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: START_ARRAY ioctl for md
|
||||
When: July 2006
|
||||
Files: drivers/md/md.c
|
||||
Why: Not reliable by design - can fail when most needed.
|
||||
Alternatives exist
|
||||
Who: NeilBrown <neilb@suse.de>
|
||||
|
@ -30,7 +30,12 @@ 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
|
||||
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. If the messages scroll off the top of the console, you
|
||||
may find that booting with a higher resolution (eg, vga=791)
|
||||
will allow you to read more of the text. (Caveat: This needs vesafb,
|
||||
so won't help for 'early' oopses)
|
||||
|
||||
(2) Boot with a serial console (see Documentation/serial-console.txt),
|
||||
run a null modem to a second machine and capture the output there
|
||||
|
@ -140,3 +140,4 @@
|
||||
139 -> Prolink PixelView PlayTV MPEG2 PV-M4900
|
||||
140 -> Osprey 440 [0070:ff07]
|
||||
141 -> Asound Skyeye PCTV
|
||||
142 -> Sabrent TV-FM (bttv version)
|
||||
|
@ -80,3 +80,5 @@
|
||||
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
|
||||
80 -> ASUS Digimatrix TV [1043:0210]
|
||||
81 -> Philips Tiger reference design [1131:2018]
|
||||
82 -> MSI TV@Anywhere plus [1462:6231]
|
||||
|
||||
|
@ -67,3 +67,4 @@ tuner=65 - Ymec TVF66T5-B/DFF
|
||||
tuner=66 - LG NTSC (TALN mini series)
|
||||
tuner=67 - Philips TD1316 Hybrid Tuner
|
||||
tuner=68 - Philips TUV1236D ATSC/NTSC dual in
|
||||
tuner=69 - Tena TNF 5335 MF
|
||||
|
@ -7,10 +7,12 @@ Machine check
|
||||
|
||||
mce=off disable machine check
|
||||
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
|
||||
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)
|
||||
0: always panic, 1: panic if deadlock possible,
|
||||
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
|
||||
|
||||
additional_cpus=NUM Allow NUM more CPUs for hotplug
|
||||
(defaults are specified by the BIOS or half the available CPUs)
|
||||
|
||||
NUMA
|
||||
|
||||
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.
|
||||
|
||||
pagefaulttrace Dump all page faults. Only useful for extreme debugging
|
||||
and will create a lot of output.
|
||||
|
||||
Misc
|
||||
|
||||
noreplacement Don't replace instructions with more appropiate ones
|
||||
|
@ -6,7 +6,7 @@ Virtual memory map with 4 level page tables:
|
||||
0000000000000000 - 00007fffffffffff (=47bits) user space, different per mm
|
||||
hole caused by [48:63] sign extension
|
||||
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
|
||||
ffffc20000000000 - ffffe1ffffffffff (=45bits) vmalloc/ioremap space
|
||||
... unused hole ...
|
||||
@ -14,6 +14,10 @@ ffffffff80000000 - ffffffff82800000 (=40MB) kernel text mapping, from phys 0
|
||||
... unused hole ...
|
||||
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
|
||||
the processes using the page fault handler, with init_level4_pgt as
|
||||
reference.
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -1565,7 +1565,7 @@ S: Maintained
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
|
||||
P: Kumar Gala
|
||||
M: kumar.gala@freescale.com
|
||||
M: galak@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-embedded@ozlabs.org
|
||||
S: Maintained
|
||||
@ -1873,6 +1873,16 @@ L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
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
|
||||
P: Willem Riede
|
||||
M: osst@riede.org
|
||||
|
13
Makefile
13
Makefile
@ -1193,6 +1193,17 @@ else
|
||||
__srctree = $(srctree)/
|
||||
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)
|
||||
|
||||
define all-sources
|
||||
@ -1208,7 +1219,7 @@ define all-sources
|
||||
find $(__srctree)include $(RCS_FIND_IGNORE) \
|
||||
\( -name config -o -name 'asm-*' \) -prune \
|
||||
-o -name '*.[chS]' -print; \
|
||||
for ARCH in $(ALLSOURCE_ARCHS) ; do \
|
||||
for ARCH in $(ALLINCLUDE_ARCHS) ; do \
|
||||
find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
|
||||
-name '*.[chS]' -print; \
|
||||
done ; \
|
||||
|
5
README
5
README
@ -81,6 +81,11 @@ INSTALLING the kernel:
|
||||
failed patches (xxx# or xxx.rej). If there are, either you or me has
|
||||
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
|
||||
process. It determines the current kernel version and applies any
|
||||
patches found.
|
||||
|
@ -652,25 +652,11 @@ endmenu
|
||||
|
||||
menu "Power management options"
|
||||
|
||||
config PM
|
||||
bool "Power Management support"
|
||||
---help---
|
||||
"Power Management" means that parts of your computer are shut
|
||||
off or put into a power conserving "sleep" mode if they are not
|
||||
being used. There are two competing standards for doing this: APM
|
||||
and ACPI. If you want to use either one, say Y here and then also
|
||||
to the requisite support below.
|
||||
|
||||
Power Management is most important for battery powered laptop
|
||||
computers; if you have a laptop, check out the Linux Laptop home
|
||||
page on the WWW at <http://www.linux-on-laptops.com/> or
|
||||
Tuxmobil - Linux on Mobile Computers at <http://www.tuxmobil.org/>
|
||||
and the Battery Powered Linux mini-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
source "kernel/power/Kconfig"
|
||||
|
||||
config APM
|
||||
tristate "Advanced Power Management Emulation"
|
||||
depends on PM
|
||||
depends on PM_LEGACY
|
||||
---help---
|
||||
APM is a BIOS specification for saving power using several different
|
||||
techniques. This is mostly useful for battery powered laptops with
|
||||
@ -702,6 +688,8 @@ menu "Device Drivers"
|
||||
|
||||
source "drivers/base/Kconfig"
|
||||
|
||||
source "drivers/connector/Kconfig"
|
||||
|
||||
if ALIGNMENT_TRAP
|
||||
source "drivers/mtd/Kconfig"
|
||||
endif
|
||||
|
@ -623,8 +623,6 @@ static int locomo_resume(struct platform_device *dev)
|
||||
locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
|
||||
|
||||
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||
|
||||
dev->power.saved_state = NULL;
|
||||
kfree(save);
|
||||
|
||||
return 0;
|
||||
@ -775,7 +773,7 @@ static int locomo_probe(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) {
|
||||
__locomo_remove(lchip);
|
||||
|
@ -1266,7 +1266,7 @@ static void __exit sa1111_exit(void)
|
||||
bus_unregister(&sa1111_bus_type);
|
||||
}
|
||||
|
||||
module_init(sa1111_init);
|
||||
subsys_initcall(sa1111_init);
|
||||
module_exit(sa1111_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Intel Corporation SA1111 core driver");
|
||||
|
@ -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);
|
||||
|
||||
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_GPWR) = inf->io_out & 0xffff;
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/apm_bios.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_legacy.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
|
@ -256,9 +256,7 @@ void __cpuexit cpu_die(void)
|
||||
asmlinkage void __cpuinit secondary_start_kernel(void)
|
||||
{
|
||||
struct mm_struct *mm = &init_mm;
|
||||
unsigned int cpu;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
printk("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
|
@ -132,14 +132,14 @@ void __init footbridge_init_irq(void)
|
||||
static struct map_desc fb_common_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = ARMCSR_BASE,
|
||||
.pfn = DC21285_ARMCSR_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_ARMCSR_BASE),
|
||||
.length = ARMCSR_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = XBUS_BASE,
|
||||
.pfn = __phys_to_pfn(0x40000000),
|
||||
.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,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_MEM),
|
||||
.length = PCIMEM_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = PCICFG0_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG),
|
||||
.length = PCICFG0_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = PCICFG1_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG),
|
||||
.length = PCICFG1_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = PCIIACK_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_IACK),
|
||||
.length = PCIIACK_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = PCIO_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_IO),
|
||||
.length = PCIO_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -187,13 +187,13 @@ static struct map_desc co285_io_desc[] __initdata = {
|
||||
.virtual = PCIO_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_IO),
|
||||
.length = PCIO_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = PCIMEM_BASE,
|
||||
.pfn = __phys_to_pfn(DC21285_PCI_MEM),
|
||||
.length = PCIMEM_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -72,6 +72,12 @@ config MACH_HUSKY
|
||||
depends PXA_SHARPSL_25x
|
||||
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
|
||||
bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
|
||||
depends PXA_SHARPSL_27x
|
||||
|
@ -11,8 +11,9 @@ obj-$(CONFIG_PXA27x) += pxa27x.o
|
||||
obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o
|
||||
obj-$(CONFIG_MACH_MAINSTONE) += mainstone.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_Cxx00) += spitz.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 sharpsl_pm.o spitz_pm.o
|
||||
obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o
|
||||
obj-$(CONFIG_MACH_POODLE) += poodle.o
|
||||
obj-$(CONFIG_MACH_TOSA) += tosa.o
|
||||
|
||||
|
223
arch/arm/mach-pxa/akita-ioexp.c
Normal file
223
arch/arm/mach-pxa/akita-ioexp.c
Normal 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);
|
||||
|
228
arch/arm/mach-pxa/corgi_pm.c
Normal file
228
arch/arm/mach-pxa/corgi_pm.c
Normal 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);
|
@ -115,7 +115,7 @@ extern struct battery_thresh spitz_battery_levels_noac[];
|
||||
#define CHARGE_LED_ERR() sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ERROR)
|
||||
#define DISCHARGE_ON() sharpsl_pm.machinfo->discharge(1)
|
||||
#define DISCHARGE_OFF() sharpsl_pm.machinfo->discharge(0)
|
||||
#define STATUS_AC_IN sharpsl_pm.machinfo->status_acin()
|
||||
#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_FATAL READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)
|
||||
#define STATUS_AC_IN() sharpsl_pm.machinfo->status_acin()
|
||||
#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_FATAL() READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <linux/apm_bios.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/hardware/scoop.h>
|
||||
@ -45,15 +45,15 @@
|
||||
#define SHARPSL_WAIT_DISCHARGE_ON 100 /* 100 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_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_CO_CHECK_TIME 5 /* 5 msec */
|
||||
#define SHARPSL_CHARGE_RETRY_CNT 1 /* eqv. 10 min */
|
||||
|
||||
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
|
||||
#define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */
|
||||
#define SHARPSL_CHARGE_ON_JKVAD_HIGH 0x9b /* 6V */
|
||||
#define SHARPSL_CHARGE_ON_JKVAD_LOW 0x34 /* 2V */
|
||||
#define SHARPSL_CHARGE_ON_ACIN_HIGH 0x9b /* 6V */
|
||||
#define SHARPSL_CHARGE_ON_ACIN_LOW 0x34 /* 2V */
|
||||
#define SHARPSL_FATAL_ACIN_VOLT 182 /* 3.45V */
|
||||
#define SHARPSL_FATAL_NOACIN_VOLT 170 /* 3.40V */
|
||||
|
||||
@ -160,9 +160,10 @@ struct battery_thresh spitz_battery_levels_noac[] = {
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
static int sharpsl_read_MainBattery(void);
|
||||
static int sharpsl_read_main_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_fatal_check(void);
|
||||
static int sharpsl_average_value(int ad);
|
||||
@ -228,7 +229,7 @@ static void sharpsl_battery_thread(void *private_)
|
||||
if (!sharpsl_pm.machinfo)
|
||||
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! */
|
||||
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);
|
||||
|
||||
while(1) {
|
||||
voltage = sharpsl_read_MainBattery();
|
||||
voltage = sharpsl_read_main_battery();
|
||||
if (voltage > 0) break;
|
||||
if (i++ > 5) {
|
||||
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);
|
||||
|
||||
if (STATUS_AC_IN == 0) {
|
||||
if (STATUS_AC_IN() == 0) {
|
||||
sharpsl_charge_off();
|
||||
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();
|
||||
return;
|
||||
}
|
||||
@ -335,7 +336,7 @@ static void sharpsl_charge_toggle(void *private_)
|
||||
|
||||
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);
|
||||
|
||||
@ -364,7 +365,7 @@ static void sharpsl_chrg_full_timer(unsigned long data)
|
||||
|
||||
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");
|
||||
if (sharpsl_pm.charge_mode == CHRG_ON)
|
||||
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;
|
||||
|
||||
if (STATUS_BATT_LOCKED == 0) {
|
||||
if (STATUS_BATT_LOCKED() == 0) {
|
||||
dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n");
|
||||
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");
|
||||
is_fatal = 1;
|
||||
}
|
||||
@ -461,12 +462,12 @@ static int read_max1111(int channel)
|
||||
| MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
|
||||
}
|
||||
|
||||
static int sharpsl_read_MainBattery(void)
|
||||
static int sharpsl_read_main_battery(void)
|
||||
{
|
||||
return read_max1111(BATT_AD);
|
||||
}
|
||||
|
||||
static int sharpsl_read_Temp(void)
|
||||
static int sharpsl_read_temp(void)
|
||||
{
|
||||
int temp;
|
||||
|
||||
@ -480,7 +481,7 @@ static int sharpsl_read_Temp(void)
|
||||
return temp;
|
||||
}
|
||||
|
||||
static int sharpsl_read_jkvad(void)
|
||||
static int sharpsl_read_acin(void)
|
||||
{
|
||||
return read_max1111(JK_VAD);
|
||||
}
|
||||
@ -522,16 +523,14 @@ static int get_select_val(int *val)
|
||||
return (sum/3);
|
||||
}
|
||||
|
||||
/* mode 0 - Check temperature and voltage
|
||||
* 1 - Check temperature only */
|
||||
static int sharpsl_check_battery(int mode)
|
||||
static int sharpsl_check_battery_temp(void)
|
||||
{
|
||||
int val, i, buff[5];
|
||||
|
||||
/* Check battery temperature */
|
||||
for (i=0; i<5; i++) {
|
||||
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
|
||||
buff[i] = sharpsl_read_Temp();
|
||||
buff[i] = sharpsl_read_temp();
|
||||
}
|
||||
|
||||
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);
|
||||
if (val > SHARPSL_CHARGE_ON_TEMP)
|
||||
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 */
|
||||
CHARGE_OFF();
|
||||
@ -552,7 +556,7 @@ static int sharpsl_check_battery(int mode)
|
||||
|
||||
/* Check battery voltage */
|
||||
for (i=0; i<5; i++) {
|
||||
buff[i] = sharpsl_read_MainBattery();
|
||||
buff[i] = sharpsl_read_main_battery();
|
||||
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
|
||||
}
|
||||
|
||||
@ -575,14 +579,14 @@ static int sharpsl_ac_check(void)
|
||||
int temp, i, buff[5];
|
||||
|
||||
for (i=0; i<5; i++) {
|
||||
buff[i] = sharpsl_read_jkvad();
|
||||
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD);
|
||||
buff[i] = sharpsl_read_acin();
|
||||
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
|
||||
}
|
||||
|
||||
temp = get_select_val(buff);
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
@ -591,7 +595,7 @@ static int sharpsl_ac_check(void)
|
||||
}
|
||||
|
||||
#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;
|
||||
flush_scheduled_work();
|
||||
@ -604,7 +608,7 @@ static int sharpsl_pm_suspend(struct device *dev, pm_message_t state)
|
||||
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 */
|
||||
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);
|
||||
/* 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");
|
||||
sharpsl_pm.charge_mode = CHRG_OFF;
|
||||
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");
|
||||
}
|
||||
|
||||
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");
|
||||
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");
|
||||
|
||||
/* Check AC-Adapter */
|
||||
acin = STATUS_AC_IN;
|
||||
acin = STATUS_AC_IN();
|
||||
|
||||
if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
|
||||
CHARGE_OFF();
|
||||
@ -725,7 +729,7 @@ static int sharpsl_fatal_check(void)
|
||||
|
||||
/* Check battery : check inserting battery ? */
|
||||
for (i=0; i<5; i++) {
|
||||
buff[i] = sharpsl_read_MainBattery();
|
||||
buff[i] = sharpsl_read_main_battery();
|
||||
mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
|
||||
}
|
||||
|
||||
@ -739,7 +743,7 @@ static int sharpsl_fatal_check(void)
|
||||
}
|
||||
|
||||
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)) ||
|
||||
(!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");
|
||||
|
||||
/* 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();
|
||||
|
||||
/* Start Charging */
|
||||
@ -793,7 +797,7 @@ static int sharpsl_off_charge_battery(void)
|
||||
|
||||
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();
|
||||
|
||||
CHARGE_OFF();
|
||||
@ -811,7 +815,7 @@ static int sharpsl_off_charge_battery(void)
|
||||
/* Check for timeout */
|
||||
if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
|
||||
return 1;
|
||||
if (STATUS_CHRG_FULL) {
|
||||
if (STATUS_CHRG_FULL()) {
|
||||
dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n");
|
||||
sharpsl_pm.full_count++;
|
||||
CHARGE_OFF();
|
||||
@ -840,7 +844,7 @@ static int sharpsl_off_charge_battery(void)
|
||||
sharpsl_pm.full_count++;
|
||||
return 1;
|
||||
}
|
||||
if (STATUS_CHRG_FULL) {
|
||||
if (STATUS_CHRG_FULL()) {
|
||||
dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n");
|
||||
CHARGE_LED_OFF();
|
||||
CHARGE_OFF();
|
||||
@ -886,13 +890,13 @@ static struct pm_ops sharpsl_pm_ops = {
|
||||
.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;
|
||||
|
||||
sharpsl_pm.dev = dev;
|
||||
sharpsl_pm.machinfo = dev->platform_data;
|
||||
sharpsl_pm.dev = &pdev->dev;
|
||||
sharpsl_pm.machinfo = pdev->dev.platform_data;
|
||||
sharpsl_pm.charge_mode = CHRG_OFF;
|
||||
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);
|
||||
}
|
||||
|
||||
device_create_file(dev, &dev_attr_battery_percentage);
|
||||
device_create_file(dev, &dev_attr_battery_voltage);
|
||||
device_create_file(&pdev->dev, &dev_attr_battery_percentage);
|
||||
device_create_file(&pdev->dev, &dev_attr_battery_voltage);
|
||||
|
||||
apm_get_power_status = sharpsl_apm_get_power_status;
|
||||
|
||||
@ -947,12 +951,12 @@ static int __init sharpsl_pm_probe(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sharpsl_pm_remove(struct device *dev)
|
||||
static int sharpsl_pm_remove(struct platform_device *pdev)
|
||||
{
|
||||
pm_set_ops(NULL);
|
||||
|
||||
device_remove_file(dev, &dev_attr_battery_percentage);
|
||||
device_remove_file(dev, &dev_attr_battery_voltage);
|
||||
device_remove_file(&pdev->dev, &dev_attr_battery_percentage);
|
||||
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_batlock), sharpsl_fatal_isr);
|
||||
@ -969,23 +973,24 @@ static int sharpsl_pm_remove(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver sharpsl_pm_driver = {
|
||||
.name = "sharpsl-pm",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver sharpsl_pm_driver = {
|
||||
.probe = sharpsl_pm_probe,
|
||||
.remove = sharpsl_pm_remove,
|
||||
.suspend = sharpsl_pm_suspend,
|
||||
.resume = sharpsl_pm_resume,
|
||||
.driver = {
|
||||
.name = "sharpsl-pm",
|
||||
},
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
driver_unregister(&sharpsl_pm_driver);
|
||||
platform_driver_unregister(&sharpsl_pm_driver);
|
||||
}
|
||||
|
||||
late_initcall(sharpsl_pm_init);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
#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 = {
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
.transceiver_mode = spitz_irda_transceiver_mode,
|
||||
@ -417,6 +427,32 @@ static void __init spitz_init(void)
|
||||
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,
|
||||
struct tag *tags, char **cmdline, struct meminfo *mi)
|
||||
{
|
||||
@ -452,3 +488,16 @@ MACHINE_START(BORZOI, "SHARP Borzoi")
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#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
|
||||
|
233
arch/arm/mach-pxa/spitz_pm.c
Normal file
233
arch/arm/mach-pxa/spitz_pm.c
Normal 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);
|
@ -14,6 +14,7 @@
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_legacy.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sysctl.h>
|
||||
|
@ -699,7 +699,7 @@ depends on PM && !X86_VISWS
|
||||
|
||||
config APM
|
||||
tristate "APM (Advanced Power Management) BIOS support"
|
||||
depends on PM
|
||||
depends on PM && PM_LEGACY
|
||||
---help---
|
||||
APM is a BIOS specification for saving power using several different
|
||||
techniques. This is mostly useful for battery powered laptops with
|
||||
|
@ -39,17 +39,14 @@
|
||||
|
||||
#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);
|
||||
static inline int ioapic_setup_disabled(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int gsi_irq_sharing(int gsi);
|
||||
#include <asm/proto.h>
|
||||
|
||||
static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
|
||||
|
||||
|
||||
#else /* X86 */
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
@ -57,6 +54,8 @@ static inline int ioapic_setup_disabled(void)
|
||||
#include <mach_mpparse.h>
|
||||
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||
|
||||
static inline int gsi_irq_sharing(int gsi) { return gsi; }
|
||||
|
||||
#endif /* X86 */
|
||||
|
||||
#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);
|
||||
else
|
||||
#endif
|
||||
*irq = gsi;
|
||||
*irq = gsi_irq_sharing(gsi);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -543,7 +542,7 @@ acpi_scan_rsdp(unsigned long start, unsigned long length)
|
||||
* RSDP signature.
|
||||
*/
|
||||
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;
|
||||
return (start + offset);
|
||||
}
|
||||
|
@ -218,6 +218,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_legacy.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/smp.h>
|
||||
|
@ -206,9 +206,9 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
||||
display_cacheinfo(c);
|
||||
|
||||
if (cpuid_eax(0x80000000) >= 0x80000008) {
|
||||
c->x86_num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
|
||||
if (c->x86_num_cores & (c->x86_num_cores - 1))
|
||||
c->x86_num_cores = 1;
|
||||
c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
|
||||
if (c->x86_max_cores & (c->x86_max_cores - 1))
|
||||
c->x86_max_cores = 1;
|
||||
}
|
||||
|
||||
#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
|
||||
* of two.
|
||||
*/
|
||||
if (c->x86_num_cores > 1) {
|
||||
if (c->x86_max_cores > 1) {
|
||||
int cpu = smp_processor_id();
|
||||
unsigned bits = 0;
|
||||
while ((1 << bits) < c->x86_num_cores)
|
||||
while ((1 << bits) < c->x86_max_cores)
|
||||
bits++;
|
||||
cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
|
||||
phys_proc_id[cpu] >>= bits;
|
||||
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
|
||||
}
|
||||
|
@ -231,10 +231,10 @@ static void __init early_cpu_detect(void)
|
||||
cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
|
||||
c->x86 = (tfms >> 8) & 15;
|
||||
c->x86_model = (tfms >> 4) & 15;
|
||||
if (c->x86 == 0xf) {
|
||||
if (c->x86 == 0xf)
|
||||
c->x86 += (tfms >> 20) & 0xff;
|
||||
if (c->x86 >= 0x6)
|
||||
c->x86_model += ((tfms >> 16) & 0xF) << 4;
|
||||
}
|
||||
c->x86_mask = tfms & 15;
|
||||
if (cap0 & (1<<19))
|
||||
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_vendor_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);
|
||||
|
||||
if (!have_cpuid_p()) {
|
||||
@ -443,52 +443,44 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
void __devinit detect_ht(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 eax, ebx, ecx, edx;
|
||||
int index_msb, tmp;
|
||||
int index_msb, core_bits;
|
||||
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))
|
||||
return;
|
||||
|
||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||
smp_num_siblings = (ebx & 0xff0000) >> 16;
|
||||
|
||||
if (smp_num_siblings == 1) {
|
||||
printk(KERN_INFO "CPU: Hyper-Threading is disabled\n");
|
||||
} else if (smp_num_siblings > 1 ) {
|
||||
index_msb = 31;
|
||||
|
||||
if (smp_num_siblings > NR_CPUS) {
|
||||
printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
|
||||
smp_num_siblings = 1;
|
||||
return;
|
||||
}
|
||||
tmp = smp_num_siblings;
|
||||
while ((tmp & 0x80000000 ) == 0) {
|
||||
tmp <<=1 ;
|
||||
index_msb--;
|
||||
}
|
||||
if (smp_num_siblings & (smp_num_siblings - 1))
|
||||
index_msb++;
|
||||
|
||||
index_msb = get_count_order(smp_num_siblings);
|
||||
phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
|
||||
|
||||
printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
|
||||
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 = 31;
|
||||
while ((tmp & 0x80000000) == 0) {
|
||||
tmp <<=1 ;
|
||||
index_msb--;
|
||||
}
|
||||
index_msb = get_count_order(smp_num_siblings) ;
|
||||
|
||||
if (smp_num_siblings & (smp_num_siblings - 1))
|
||||
index_msb++;
|
||||
core_bits = get_count_order(c->x86_max_cores);
|
||||
|
||||
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",
|
||||
cpu_core_id[cpu]);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/msr.h>
|
||||
@ -157,7 +158,7 @@ static void __devinit init_intel(struct cpuinfo_x86 *c)
|
||||
if ( 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);
|
||||
|
||||
@ -264,5 +265,52 @@ __init int intel_cpu_init(void)
|
||||
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);
|
||||
|
||||
|
@ -293,29 +293,45 @@ static struct _cpuid4_info *cpuid4_info[NR_CPUS];
|
||||
#ifdef CONFIG_SMP
|
||||
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;
|
||||
#ifdef CONFIG_X86_HT
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
#endif
|
||||
int index_msb, i;
|
||||
struct cpuinfo_x86 *c = cpu_data;
|
||||
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, index);
|
||||
num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
|
||||
|
||||
if (num_threads_sharing == 1)
|
||||
cpu_set(cpu, this_leaf->shared_cpu_map);
|
||||
#ifdef CONFIG_X86_HT
|
||||
else if (num_threads_sharing == smp_num_siblings)
|
||||
this_leaf->shared_cpu_map = cpu_sibling_map[cpu];
|
||||
else if (num_threads_sharing == (c->x86_num_cores * smp_num_siblings))
|
||||
this_leaf->shared_cpu_map = cpu_core_map[cpu];
|
||||
else
|
||||
printk(KERN_DEBUG "Number of CPUs sharing cache didn't match "
|
||||
"any known set of CPUs\n");
|
||||
#endif
|
||||
else {
|
||||
index_msb = get_count_order(num_threads_sharing);
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
if (c[i].apicid >> index_msb ==
|
||||
c[cpu].apicid >> index_msb) {
|
||||
cpu_set(i, this_leaf->shared_cpu_map);
|
||||
if (i != cpu && cpuid4_info[i]) {
|
||||
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
|
||||
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
|
||||
|
||||
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 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(cache_kobject[cpu]);
|
||||
cpuid4_cache_sysfs_exit(cpu);
|
||||
return;
|
||||
|
@ -626,6 +626,14 @@ void __init mtrr_bp_init(void)
|
||||
if (cpuid_eax(0x80000000) >= 0x80000008) {
|
||||
u32 phys_addr;
|
||||
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_and_mask = ~size_or_mask & 0xfff00000;
|
||||
} else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
|
||||
|
@ -94,12 +94,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
if (c->x86_cache_size >= 0)
|
||||
seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
|
||||
#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, "siblings\t: %d\n",
|
||||
c->x86_num_cores * smp_num_siblings);
|
||||
seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[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
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <asm/hardirq.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/apic.h>
|
||||
#include <mach_ipi.h>
|
||||
|
||||
|
||||
@ -147,6 +148,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu)
|
||||
regs = &fixed_regs;
|
||||
}
|
||||
crash_save_this_cpu(regs, cpu);
|
||||
disable_local_APIC();
|
||||
atomic_dec(&waiting_for_crash_ipi);
|
||||
/* Assume hlt works */
|
||||
halt();
|
||||
@ -186,6 +188,7 @@ static void nmi_shootdown_cpus(void)
|
||||
}
|
||||
|
||||
/* Leave the nmi callback set */
|
||||
disable_local_APIC();
|
||||
}
|
||||
#else
|
||||
static void nmi_shootdown_cpus(void)
|
||||
@ -210,5 +213,9 @@ void machine_crash_shutdown(struct pt_regs *regs)
|
||||
/* Make a note of crashing cpu. Will be used in NMI callback.*/
|
||||
crashing_cpu = smp_processor_id();
|
||||
nmi_shootdown_cpus();
|
||||
lapic_shutdown();
|
||||
#if defined(CONFIG_X86_IO_APIC)
|
||||
disable_IO_APIC();
|
||||
#endif
|
||||
crash_save_self(regs);
|
||||
}
|
||||
|
@ -560,11 +560,10 @@ nmi_stack_fixup:
|
||||
nmi_debug_stack_check:
|
||||
cmpw $__KERNEL_CS,16(%esp)
|
||||
jne nmi_stack_correct
|
||||
cmpl $debug - 1,(%esp)
|
||||
jle nmi_stack_correct
|
||||
cmpl $debug,(%esp)
|
||||
jb nmi_stack_correct
|
||||
cmpl $debug_esp_fix_insn,(%esp)
|
||||
jle nmi_debug_stack_fixup
|
||||
nmi_debug_stack_fixup:
|
||||
ja nmi_stack_correct
|
||||
FIX_STACK(24,nmi_stack_correct, 1)
|
||||
jmp nmi_stack_correct
|
||||
|
||||
|
@ -72,9 +72,11 @@ int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
/* Core ID of each logical CPU */
|
||||
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;
|
||||
EXPORT_SYMBOL(cpu_sibling_map);
|
||||
|
||||
/* representing HT and core siblings of each logical CPU */
|
||||
cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(cpu_core_map);
|
||||
|
||||
@ -442,35 +444,60 @@ static void __devinit smp_callin(void)
|
||||
|
||||
static int cpucount;
|
||||
|
||||
/* representing cpus for which sibling maps can be computed */
|
||||
static cpumask_t cpu_sibling_setup_map;
|
||||
|
||||
static inline void
|
||||
set_cpu_sibling_map(int cpu)
|
||||
{
|
||||
int i;
|
||||
struct cpuinfo_x86 *c = cpu_data;
|
||||
|
||||
cpu_set(cpu, cpu_sibling_setup_map);
|
||||
|
||||
if (smp_num_siblings > 1) {
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
if (cpu_core_id[cpu] == cpu_core_id[i]) {
|
||||
for_each_cpu_mask(i, cpu_sibling_setup_map) {
|
||||
if (phys_proc_id[cpu] == phys_proc_id[i] &&
|
||||
cpu_core_id[cpu] == cpu_core_id[i]) {
|
||||
cpu_set(i, cpu_sibling_map[cpu]);
|
||||
cpu_set(cpu, cpu_sibling_map[i]);
|
||||
cpu_set(i, cpu_core_map[cpu]);
|
||||
cpu_set(cpu, cpu_core_map[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
if (current_cpu_data.x86_num_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 {
|
||||
if (current_cpu_data.x86_max_cores == 1) {
|
||||
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;
|
||||
smp_tune_scheduling();
|
||||
cpus_clear(cpu_sibling_map[0]);
|
||||
cpu_set(0, cpu_sibling_map[0]);
|
||||
|
||||
cpus_clear(cpu_core_map[0]);
|
||||
cpu_set(0, cpu_core_map[0]);
|
||||
set_cpu_sibling_map(0);
|
||||
|
||||
/*
|
||||
* If we couldn't find an SMP configuration at boot time,
|
||||
@ -1278,15 +1302,24 @@ static void
|
||||
remove_siblinginfo(int cpu)
|
||||
{
|
||||
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])
|
||||
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_core_map[cpu]);
|
||||
phys_proc_id[cpu] = BAD_APICID;
|
||||
cpu_core_id[cpu] = BAD_APICID;
|
||||
cpu_clear(cpu, cpu_sibling_setup_map);
|
||||
}
|
||||
|
||||
int __cpu_disable(void)
|
||||
|
@ -137,8 +137,8 @@ static void __init parse_memory_affinity_structure (char *sratp)
|
||||
"enabled and removable" : "enabled" ) );
|
||||
}
|
||||
|
||||
#if MAX_NR_ZONES != 3
|
||||
#error "MAX_NR_ZONES != 3, chunk_to_zone requires review"
|
||||
#if MAX_NR_ZONES != 4
|
||||
#error "MAX_NR_ZONES != 4, chunk_to_zone requires review"
|
||||
#endif
|
||||
/* Take a chunk of pages from page frame cstart to cend and count the number
|
||||
* of pages in each zone, returned via zones[].
|
||||
|
@ -25,8 +25,9 @@ static int __init init_pit(char* override)
|
||||
{
|
||||
/* check clock override */
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
#include <linux/initrd.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/system.h>
|
||||
@ -267,7 +268,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)
|
||||
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);
|
||||
__free_page(page);
|
||||
|
@ -58,6 +58,10 @@ config IA64_UNCACHED_ALLOCATOR
|
||||
bool
|
||||
select GENERIC_ALLOCATOR
|
||||
|
||||
config ZONE_DMA_IS_DMA32
|
||||
bool
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "System type"
|
||||
default IA64_GENERIC
|
||||
|
@ -202,12 +202,9 @@ default_idle (void)
|
||||
{
|
||||
local_irq_enable();
|
||||
while (!need_resched()) {
|
||||
if (can_do_pal_halt) {
|
||||
local_irq_disable();
|
||||
if (!need_resched())
|
||||
safe_halt();
|
||||
local_irq_enable();
|
||||
} else
|
||||
if (can_do_pal_halt)
|
||||
safe_halt();
|
||||
else
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
@ -272,10 +269,14 @@ cpu_idle (void)
|
||||
{
|
||||
void (*mark_idle)(int) = ia64_mark_idle;
|
||||
int cpu = smp_processor_id();
|
||||
set_thread_flag(TIF_POLLING_NRFLAG);
|
||||
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
if (can_do_pal_halt)
|
||||
clear_thread_flag(TIF_POLLING_NRFLAG);
|
||||
else
|
||||
set_thread_flag(TIF_POLLING_NRFLAG);
|
||||
|
||||
if (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -381,10 +381,8 @@ fpsp_done:
|
||||
.Lnotkern:
|
||||
SAVE_ALL_INT
|
||||
GET_CURRENT(%d0)
|
||||
tstb %curptr@(TASK_NEEDRESCHED)
|
||||
jne ret_from_exception | deliver signals,
|
||||
| reschedule etc..
|
||||
RESTORE_ALL
|
||||
| deliver signals, reschedule etc..
|
||||
jra ret_from_exception
|
||||
|
||||
|
|
||||
| mem_write --- write to user or supervisor address space
|
||||
|
@ -75,10 +75,8 @@ _060_isp_done:
|
||||
.Lnotkern:
|
||||
SAVE_ALL_INT
|
||||
GET_CURRENT(%d0)
|
||||
tstb %curptr@(TASK_NEEDRESCHED)
|
||||
jne ret_from_exception | deliver signals,
|
||||
| reschedule etc..
|
||||
RESTORE_ALL
|
||||
| deliver signals, reschedule etc..
|
||||
jra ret_from_exception
|
||||
|
||||
|
|
||||
| _060_real_chk():
|
||||
|
@ -25,12 +25,8 @@ int main(void)
|
||||
DEFINE(TASK_STATE, offsetof(struct task_struct, state));
|
||||
DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
|
||||
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_INFO, offsetof(struct task_struct, thread.info));
|
||||
DEFINE(TASK_MM, offsetof(struct task_struct, 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_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 */
|
||||
DEFINE(PT_D0, offsetof(struct pt_regs, d0));
|
||||
DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0));
|
||||
|
@ -44,9 +44,7 @@
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
.globl system_call, buserr, trap
|
||||
.globl resume, ret_from_exception
|
||||
.globl ret_from_signal
|
||||
.globl system_call, buserr, trap, resume
|
||||
.globl inthandler, sys_call_table
|
||||
.globl sys_fork, sys_clone, sys_vfork
|
||||
.globl ret_from_interrupt, bad_interrupt
|
||||
@ -58,7 +56,7 @@ ENTRY(buserr)
|
||||
movel %sp,%sp@- | stack frame pointer argument
|
||||
bsrl buserr_c
|
||||
addql #4,%sp
|
||||
jra ret_from_exception
|
||||
jra .Lret_from_exception
|
||||
|
||||
ENTRY(trap)
|
||||
SAVE_ALL_INT
|
||||
@ -66,7 +64,7 @@ ENTRY(trap)
|
||||
movel %sp,%sp@- | stack frame pointer argument
|
||||
bsrl trap_c
|
||||
addql #4,%sp
|
||||
jra ret_from_exception
|
||||
jra .Lret_from_exception
|
||||
|
||||
| After a fork we jump here directly from resume,
|
||||
| so that %d1 contains the previous task
|
||||
@ -75,30 +73,31 @@ ENTRY(ret_from_fork)
|
||||
movel %d1,%sp@-
|
||||
jsr schedule_tail
|
||||
addql #4,%sp
|
||||
jra ret_from_exception
|
||||
jra .Lret_from_exception
|
||||
|
||||
badsys:
|
||||
movel #-ENOSYS,%sp@(PT_D0)
|
||||
jra ret_from_exception
|
||||
|
||||
do_trace:
|
||||
do_trace_entry:
|
||||
movel #-ENOSYS,%sp@(PT_D0) | needed for strace
|
||||
subql #4,%sp
|
||||
SAVE_SWITCH_STACK
|
||||
jbsr syscall_trace
|
||||
RESTORE_SWITCH_STACK
|
||||
addql #4,%sp
|
||||
movel %sp@(PT_ORIG_D0),%d1
|
||||
movel #-ENOSYS,%d0
|
||||
cmpl #NR_syscalls,%d1
|
||||
jcc 1f
|
||||
jbsr @(sys_call_table,%d1:l:4)@(0)
|
||||
1: movel %d0,%sp@(PT_D0) | save the return value
|
||||
subql #4,%sp | dummy return address
|
||||
movel %sp@(PT_ORIG_D0),%d0
|
||||
cmpl #NR_syscalls,%d0
|
||||
jcs syscall
|
||||
badsys:
|
||||
movel #-ENOSYS,%sp@(PT_D0)
|
||||
jra ret_from_syscall
|
||||
|
||||
do_trace_exit:
|
||||
subql #4,%sp
|
||||
SAVE_SWITCH_STACK
|
||||
jbsr syscall_trace
|
||||
RESTORE_SWITCH_STACK
|
||||
addql #4,%sp
|
||||
jra .Lret_from_exception
|
||||
|
||||
ret_from_signal:
|
||||
ENTRY(ret_from_signal)
|
||||
RESTORE_SWITCH_STACK
|
||||
addql #4,%sp
|
||||
/* on 68040 complete pending writebacks if any */
|
||||
@ -111,7 +110,7 @@ ret_from_signal:
|
||||
addql #4,%sp
|
||||
1:
|
||||
#endif
|
||||
jra ret_from_exception
|
||||
jra .Lret_from_exception
|
||||
|
||||
ENTRY(system_call)
|
||||
SAVE_ALL_SYS
|
||||
@ -120,30 +119,34 @@ ENTRY(system_call)
|
||||
| save top of frame
|
||||
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
|
||||
|
||||
tstb %curptr@(TASK_SYSCALL_TRACE)
|
||||
jne do_trace
|
||||
| syscall trace?
|
||||
tstb %curptr@(TASK_INFO+TINFO_FLAGS+2)
|
||||
jmi do_trace_entry
|
||||
cmpl #NR_syscalls,%d0
|
||||
jcc badsys
|
||||
syscall:
|
||||
jbsr @(sys_call_table,%d0:l:4)@(0)
|
||||
movel %d0,%sp@(PT_D0) | save the return value
|
||||
|
||||
ret_from_syscall:
|
||||
|oriw #0x0700,%sr
|
||||
movel %curptr@(TASK_WORK),%d0
|
||||
movew %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
|
||||
jne syscall_exit_work
|
||||
1: RESTORE_ALL
|
||||
|
||||
syscall_exit_work:
|
||||
btst #5,%sp@(PT_SR) | check if returning to kernel
|
||||
bnes 1b | if so, skip resched, signals
|
||||
tstw %d0
|
||||
jeq do_signal_return
|
||||
tstb %d0
|
||||
jne do_delayed_trace
|
||||
|
||||
lslw #1,%d0
|
||||
jcs do_trace_exit
|
||||
jmi do_delayed_trace
|
||||
lslw #8,%d0
|
||||
jmi do_signal_return
|
||||
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
|
||||
bnes 1f | if so, skip resched, signals
|
||||
| only allow interrupts when we are really the last one on the
|
||||
@ -152,19 +155,18 @@ ret_from_exception:
|
||||
andw #ALLOWINT,%sr
|
||||
|
||||
resume_userspace:
|
||||
movel %curptr@(TASK_WORK),%d0
|
||||
lsrl #8,%d0
|
||||
moveb %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
|
||||
jne exit_work
|
||||
1: RESTORE_ALL
|
||||
|
||||
exit_work:
|
||||
| save top of frame
|
||||
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
|
||||
tstb %d0
|
||||
jeq do_signal_return
|
||||
|
||||
lslb #1,%d0
|
||||
jmi do_signal_return
|
||||
pea resume_userspace
|
||||
jmp schedule
|
||||
jra schedule
|
||||
|
||||
|
||||
do_signal_return:
|
||||
|andw #ALLOWINT,%sr
|
||||
@ -254,7 +256,7 @@ ret_from_interrupt:
|
||||
|
||||
/* check if we need to do software interrupts */
|
||||
tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING
|
||||
jeq ret_from_exception
|
||||
jeq .Lret_from_exception
|
||||
pea ret_from_exception
|
||||
jra do_softirq
|
||||
|
||||
|
@ -109,7 +109,7 @@ static inline void singlestep_disable(struct task_struct *child)
|
||||
{
|
||||
unsigned long tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16);
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -198,9 +198,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
goto out_eio;
|
||||
|
||||
if (request == PTRACE_SYSCALL)
|
||||
child->thread.work.syscall_trace = ~0;
|
||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
else
|
||||
child->thread.work.syscall_trace = 0;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
child->exit_code = data;
|
||||
singlestep_disable(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))
|
||||
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);
|
||||
put_reg(child, PT_SR, tmp);
|
||||
child->thread.work.delayed_trace = 1;
|
||||
set_tsk_thread_flag(child, TIF_DELAYED_TRACE);
|
||||
|
||||
child->exit_code = data;
|
||||
/* give it a chance to run. */
|
||||
@ -288,9 +288,6 @@ out_eio:
|
||||
|
||||
asmlinkage void syscall_trace(void)
|
||||
{
|
||||
if (!current->thread.work.delayed_trace &&
|
||||
!current->thread.work.syscall_trace)
|
||||
return;
|
||||
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
|
||||
? 0x80 : 0));
|
||||
/*
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_legacy.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
@ -348,7 +348,7 @@ endpoint_stall(endpoint_t * ep)
|
||||
{
|
||||
u32 cs;
|
||||
|
||||
warn(__FUNCTION__);
|
||||
warn("%s", __FUNCTION__);
|
||||
|
||||
cs = au_readl(ep->reg->ctrl_stat) | USBDEV_CS_STALL;
|
||||
au_writel(cs, ep->reg->ctrl_stat);
|
||||
@ -360,7 +360,7 @@ endpoint_unstall(endpoint_t * ep)
|
||||
{
|
||||
u32 cs;
|
||||
|
||||
warn(__FUNCTION__);
|
||||
warn("%s", __FUNCTION__);
|
||||
|
||||
cs = au_readl(ep->reg->ctrl_stat) & ~USBDEV_CS_STALL;
|
||||
au_writel(cs, ep->reg->ctrl_stat);
|
||||
|
@ -261,7 +261,7 @@ config PPC_ISERIES
|
||||
|
||||
config EMBEDDED6xx
|
||||
bool "Embedded 6xx/7xx/7xxx-based board"
|
||||
depends on PPC32
|
||||
depends on PPC32 && BROKEN
|
||||
|
||||
config APUS
|
||||
bool "Amiga-APUS"
|
||||
@ -305,7 +305,7 @@ config PPC_PMAC64
|
||||
|
||||
config PPC_PREP
|
||||
bool " PowerPC Reference Platform (PReP) based machines"
|
||||
depends on PPC_MULTIPLATFORM && PPC32
|
||||
depends on PPC_MULTIPLATFORM && PPC32 && BROKEN
|
||||
select PPC_I8259
|
||||
select PPC_INDIRECT_PCI
|
||||
default y
|
||||
@ -932,6 +932,7 @@ source "arch/powerpc/oprofile/Kconfig"
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes (EXPERIMENTAL)"
|
||||
depends on PPC64
|
||||
help
|
||||
Kprobes allows you to trap at almost any kernel address and
|
||||
execute a callback function. register_kprobe() establishes
|
||||
|
@ -187,7 +187,7 @@ archprepare: checkbin
|
||||
|
||||
# Temporary hack until we have migrated to asm-powerpc
|
||||
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)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm
|
||||
|
||||
|
@ -1,18 +1,33 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc4
|
||||
# Thu Oct 20 08:32:17 2005
|
||||
# Linux kernel version: 2.6.15-rc1
|
||||
# Mon Nov 14 15:27:00 2005
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=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
|
||||
@ -68,75 +83,103 @@ CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=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
|
||||
#
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
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_BPA is not set
|
||||
# CONFIG_PPC_PMAC is not set
|
||||
# CONFIG_PPC_MAPLE is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
# CONFIG_PPC_CELL is not set
|
||||
CONFIG_PPC_OF=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_BOOTX_TEXT is not set
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_IOMMU_VMERGE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=128
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
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_MPIC=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_ERROR_LOGGING=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=m
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
CONFIG_IBMVIO=y
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
# CONFIG_GENERIC_TBSYNC is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
# CONFIG_WANT_EARLY_SERIAL is not set
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
#
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_EEH=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=m
|
||||
CONFIG_SCANLOG=m
|
||||
CONFIG_LPARCFG=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
CONFIG_IOMMU_VMERGE=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_CMDLINE_BOOL is not set
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SECCOMP=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_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
@ -156,6 +199,7 @@ CONFIG_HOTPLUG_PCI=m
|
||||
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||
CONFIG_HOTPLUG_PCI_RPA=m
|
||||
CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
|
||||
CONFIG_KERNEL_START=0xc000000000000000
|
||||
|
||||
#
|
||||
# Networking
|
||||
@ -197,6 +241,10 @@ CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# Core Netfilter Configuration
|
||||
#
|
||||
CONFIG_NETFILTER_NETLINK=y
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=m
|
||||
CONFIG_NETFILTER_NETLINK_LOG=m
|
||||
@ -299,6 +347,10 @@ CONFIG_LLC=y
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
|
||||
@ -368,14 +420,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# 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
|
||||
|
||||
#
|
||||
@ -473,6 +517,7 @@ CONFIG_SCSI_ISCSI_ATTRS=m
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
@ -559,6 +604,7 @@ CONFIG_DM_MULTIPATH_EMC=m
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
# CONFIG_WINDFARM is not set
|
||||
|
||||
#
|
||||
# Network device support
|
||||
@ -645,7 +691,6 @@ CONFIG_IXGB=m
|
||||
# CONFIG_IXGB_NAPI is not set
|
||||
CONFIG_S2IO=m
|
||||
# CONFIG_S2IO_NAPI is not set
|
||||
# CONFIG_2BUFF_MODE is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
@ -674,6 +719,7 @@ CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
# CONFIG_PPP_MPPE is not set
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
@ -784,6 +830,8 @@ CONFIG_HVCS=m
|
||||
#
|
||||
# CONFIG_WATCHDOG 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_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
@ -801,6 +849,7 @@ CONFIG_MAX_RAW_DEVS=1024
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
@ -852,6 +901,7 @@ CONFIG_I2C_ALGOBIT=y
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 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_ALGO 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_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
CONFIG_FB_MACMODES=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
@ -905,6 +954,7 @@ CONFIG_FB_OF=y
|
||||
# CONFIG_FB_ASILIANT is not set
|
||||
# CONFIG_FB_IMSTT is not set
|
||||
# CONFIG_FB_VGA16 is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_NVIDIA is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
CONFIG_FB_MATROX=y
|
||||
@ -927,7 +977,6 @@ CONFIG_FB_RADEON_I2C=y
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_CYBLA is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_S1D13XXX 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_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
@ -990,12 +1040,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
#
|
||||
# USB Device Class drivers
|
||||
#
|
||||
# CONFIG_USB_BLUETOOTH_TTY is not set
|
||||
# CONFIG_USB_ACM 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_DEBUG is not set
|
||||
@ -1106,6 +1159,7 @@ CONFIG_INFINIBAND_MTHCA=m
|
||||
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
|
||||
CONFIG_INFINIBAND_IPOIB=m
|
||||
# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
|
||||
# CONFIG_INFINIBAND_SRP is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
@ -1288,10 +1342,25 @@ CONFIG_NLS_ISO8859_1=y
|
||||
# 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_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
@ -1308,14 +1377,15 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
CONFIG_DEBUGGER=y
|
||||
CONFIG_XMON=y
|
||||
CONFIG_XMON_DEFAULT=y
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
@ -1355,17 +1425,3 @@ CONFIG_CRYPTO_TEST=m
|
||||
#
|
||||
# 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
|
||||
|
@ -25,7 +25,7 @@ obj-$(CONFIG_PPC_OF) += of_device.o
|
||||
procfs-$(CONFIG_PPC64) := proc_ppc64.o
|
||||
obj-$(CONFIG_PROC_FS) += $(procfs-y)
|
||||
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_PROC) += rtas-proc.o
|
||||
obj-$(CONFIG_LPARCFG) += lparcfg.o
|
||||
@ -49,12 +49,23 @@ extra-y += vmlinux.lds
|
||||
obj-y += process.o init_task.o time.o \
|
||||
prom.o traps.o setup-common.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_MODULES) += ppc_ksyms.o
|
||||
obj-$(CONFIG_BOOTX_TEXT) += btext.o
|
||||
obj-$(CONFIG_6xx) += idle_6xx.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)
|
||||
$(obj)/head_64.o: $(obj)/lparmap.s
|
||||
@ -62,11 +73,8 @@ AFLAGS_head_64.o += -I$(obj)
|
||||
endif
|
||||
|
||||
else
|
||||
# stuff used from here for ARCH=ppc or ARCH=ppc64
|
||||
# stuff used from here for ARCH=ppc
|
||||
smpobj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_PPC64) += traps.o process.o init_task.o time.o \
|
||||
setup-common.o $(smpobj-y)
|
||||
|
||||
|
||||
endif
|
||||
|
||||
|
@ -270,13 +270,15 @@ int main(void)
|
||||
DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
|
||||
DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
|
||||
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_NSEC, offsetof(struct compat_timespec, tv_nsec));
|
||||
#else
|
||||
DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
|
||||
DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
|
||||
DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
|
||||
DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
|
||||
DEFINE(TSPC32_TV_SEC, offsetof(struct timespec, tv_sec));
|
||||
DEFINE(TSPC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
|
||||
#endif
|
||||
/* timeval/timezone offsets for use by vdso */
|
||||
DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
|
||||
|
@ -24,7 +24,7 @@
|
||||
* Copyright 2002-2004 MontaVista Software, Inc.
|
||||
* PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -71,6 +71,11 @@
|
||||
#include <asm/paca.h>
|
||||
#endif
|
||||
|
||||
int __irq_offset_value;
|
||||
#ifdef CONFIG_PPC32
|
||||
EXPORT_SYMBOL(__irq_offset_value);
|
||||
#endif
|
||||
|
||||
static int ppc_spurious_interrupts;
|
||||
|
||||
#if defined(CONFIG_PPC_ISERIES) && defined(CONFIG_SMP)
|
||||
@ -98,7 +103,6 @@ extern atomic_t ipi_sent;
|
||||
EXPORT_SYMBOL(irq_desc);
|
||||
|
||||
int distribute_irqs = 1;
|
||||
int __irq_offset_value;
|
||||
u64 ppc64_interrupt_controller;
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
@ -311,7 +315,6 @@ void __init init_IRQ(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifndef CONFIG_PPC_ISERIES
|
||||
/*
|
||||
* 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
|
||||
struct thread_info *softirq_ctx[NR_CPUS];
|
||||
struct thread_info *hardirq_ctx[NR_CPUS];
|
||||
|
@ -42,32 +42,6 @@
|
||||
|
||||
/* #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;
|
||||
#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.
|
||||
*/
|
||||
/* 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.
|
||||
|
@ -185,8 +185,8 @@ void kexec_copy_flush(struct kimage *image)
|
||||
*/
|
||||
void kexec_smp_down(void *arg)
|
||||
{
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down(1);
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 1);
|
||||
|
||||
local_irq_disable();
|
||||
kexec_smp_wait();
|
||||
@ -233,8 +233,8 @@ static void kexec_prepare_cpus(void)
|
||||
}
|
||||
|
||||
/* after we tell the others to go down */
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down(0);
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 0);
|
||||
|
||||
put_cpu();
|
||||
|
||||
@ -255,8 +255,8 @@ static void kexec_prepare_cpus(void)
|
||||
* UP to an SMP kernel.
|
||||
*/
|
||||
smp_release_cpus();
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down(0);
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 0);
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image)
|
||||
ppc_md.hpte_clear_all);
|
||||
/* 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();
|
||||
}
|
@ -105,6 +105,13 @@ EXPORT_SYMBOL(__clear_user);
|
||||
EXPORT_SYMBOL(__strncpy_from_user);
|
||||
EXPORT_SYMBOL(__strnlen_user);
|
||||
|
||||
#ifndef __powerpc64__
|
||||
EXPORT_SYMBOL(__ide_mm_insl);
|
||||
EXPORT_SYMBOL(__ide_mm_outsw);
|
||||
EXPORT_SYMBOL(__ide_mm_insw);
|
||||
EXPORT_SYMBOL(__ide_mm_outsl);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(_insb);
|
||||
EXPORT_SYMBOL(_outsb);
|
||||
EXPORT_SYMBOL(_insw);
|
||||
|
@ -1368,6 +1368,7 @@ prom_n_addr_cells(struct device_node* np)
|
||||
/* No #address-cells property for the root node, default to 1 */
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(prom_n_addr_cells);
|
||||
|
||||
int
|
||||
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 */
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(prom_n_size_cells);
|
||||
|
||||
/**
|
||||
* Work out the sense (active-low level / active-high edge)
|
||||
|
105
arch/powerpc/kernel/rtas-rtc.c
Normal file
105
arch/powerpc/kernel/rtas-rtc.c
Normal 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;
|
||||
}
|
@ -57,10 +57,6 @@ extern void power4_idle(void);
|
||||
boot_infos_t *boot_infos;
|
||||
struct ide_machdep_calls ppc_ide_md;
|
||||
|
||||
/* XXX should go elsewhere */
|
||||
int __irq_offset_value;
|
||||
EXPORT_SYMBOL(__irq_offset_value);
|
||||
|
||||
int boot_cpuid;
|
||||
EXPORT_SYMBOL_GPL(boot_cpuid);
|
||||
int boot_cpuid_phys;
|
||||
|
@ -59,6 +59,7 @@
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/xmon.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
@ -415,6 +416,10 @@ void __init setup_system(void)
|
||||
*/
|
||||
unflatten_device_tree();
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
kexec_setup(); /* requires unflattened device tree. */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Fill the ppc64_caches & systemcfg structures with informations
|
||||
* retreived from the device-tree. Need to be called before
|
||||
|
@ -403,8 +403,6 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
|
||||
ELF_NFPREG * sizeof(double)))
|
||||
return 1;
|
||||
|
||||
current->thread.fpscr.val = 0; /* turn off all fp exceptions */
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* save altivec registers */
|
||||
if (current->thread.used_vr) {
|
||||
@ -818,6 +816,9 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
|
||||
goto badframe;
|
||||
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))
|
||||
goto badframe;
|
||||
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;
|
||||
}
|
||||
|
||||
current->thread.fpscr.val = 0; /* turn off all fp exceptions */
|
||||
|
||||
if (put_user(regs->gpr[1], (u32 __user *)newsp))
|
||||
goto badframe;
|
||||
regs->gpr[1] = newsp;
|
||||
|
@ -131,9 +131,6 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||
|
||||
flush_fp_to_thread(current);
|
||||
|
||||
/* Make sure signal doesn't get spurrious FP exceptions */
|
||||
current->thread.fpscr.val = 0;
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
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)
|
||||
goto badframe;
|
||||
|
||||
/* Make sure signal handler doesn't get spurious FP exceptions */
|
||||
current->thread.fpscr.val = 0;
|
||||
|
||||
/* Set up to return from userspace. */
|
||||
if (vdso64_rt_sigtramp && current->thread.vdso_base) {
|
||||
regs->link = current->thread.vdso_base + vdso64_rt_sigtramp;
|
||||
|
@ -77,8 +77,9 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
bl __get_datapage@local
|
||||
lwz r3,CFG_TB_TICKS_PER_SEC(r3)
|
||||
lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
|
||||
lwz r3,CFG_TB_TICKS_PER_SEC(r3)
|
||||
mtlr r12
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_tbfreq)
|
||||
|
@ -83,7 +83,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
/* Check for supported clock IDs */
|
||||
cmpli cr0,r3,CLOCK_REALTIME
|
||||
cmpli cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
cror cr0*4+eq,cr0*4+eq,cr1*4+eq
|
||||
bne cr0,99f
|
||||
|
||||
mflr r12 /* r12 saves lr */
|
||||
@ -91,7 +91,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
mr r10,r3 /* r10 saves id */
|
||||
mr r11,r4 /* r11 saves tp */
|
||||
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 */
|
||||
|
||||
/*
|
||||
@ -173,10 +173,14 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
add r4,r4,r7
|
||||
lis r5,NSEC_PER_SEC@h
|
||||
ori r5,r5,NSEC_PER_SEC@l
|
||||
cmpli cr0,r4,r5
|
||||
cmpl cr0,r4,r5
|
||||
cmpli cr1,r4,0
|
||||
blt 1f
|
||||
subf r4,r5,r4
|
||||
addi r3,r3,1
|
||||
1: bge cr1,1f
|
||||
addi r3,r3,-1
|
||||
add r4,r4,r5
|
||||
1: stw r3,TSPC32_TV_SEC(r11)
|
||||
stw r4,TSPC32_TV_NSEC(r11)
|
||||
|
||||
@ -210,7 +214,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
cror cr0*4+eq,cr0*4+eq,cr1*4+eq
|
||||
bne cr0,99f
|
||||
|
||||
li r3,0
|
||||
|
@ -80,5 +80,6 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
|
||||
bl V_LOCAL_FUNC(__get_datapage)
|
||||
ld r3,CFG_TB_TICKS_PER_SEC(r3)
|
||||
mtlr r12
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_tbfreq)
|
||||
|
@ -1,4 +1,5 @@
|
||||
/*
|
||||
|
||||
/*
|
||||
* Userland implementation of gettimeofday() for 64 bits processes in a
|
||||
* ppc64 kernel for use in the vDSO
|
||||
*
|
||||
@ -68,7 +69,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
cror cr0*4+eq,cr0*4+eq,cr1*4+eq
|
||||
bne cr0,99f
|
||||
|
||||
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 */
|
||||
|
||||
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */
|
||||
ori r7,r7,0xca00
|
||||
lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
|
||||
ori r7,r7,16960
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
std r5,TSPC64_TV_SEC(r11) /* store sec in tv */
|
||||
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
|
||||
*/
|
||||
rldicl r0,r0,44,20
|
||||
mulli r0,r0,1000 /* nsec = usec * 1000 */
|
||||
std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */
|
||||
|
||||
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 */
|
||||
|
||||
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */
|
||||
ori r7,r7,0xca00
|
||||
lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
|
||||
ori r7,r7,16960
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
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
|
||||
*/
|
||||
rldicl r6,r0,44,20
|
||||
mulli r6,r6,1000 /* nsec = usec * 1000 */
|
||||
|
||||
/* now we must fixup using wall to monotonic. We need to snapshot
|
||||
* that value and do the counter trick again. Fortunately, we still
|
||||
@ -123,8 +126,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
* can be used
|
||||
*/
|
||||
|
||||
lwz r4,WTOM_CLOCK_SEC(r9)
|
||||
lwz r7,WTOM_CLOCK_NSEC(r9)
|
||||
lwa r4,WTOM_CLOCK_SEC(r3)
|
||||
lwa r7,WTOM_CLOCK_NSEC(r3)
|
||||
|
||||
/* We now have our result in r4,r7. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
@ -144,10 +147,14 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
add r7,r7,r6
|
||||
lis r9,NSEC_PER_SEC@h
|
||||
ori r9,r9,NSEC_PER_SEC@l
|
||||
cmpli cr0,r7,r9
|
||||
cmpl cr0,r7,r9
|
||||
cmpli cr1,r7,0
|
||||
blt 1f
|
||||
subf r7,r9,r7
|
||||
addi r4,r4,1
|
||||
1: bge cr1,1f
|
||||
addi r4,r4,-1
|
||||
add r7,r7,r9
|
||||
1: std r4,TSPC64_TV_SEC(r11)
|
||||
std r7,TSPC64_TV_NSEC(r11)
|
||||
|
||||
@ -181,7 +188,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
cror cr0*4+eq,cr0*4+eq,cr1*4+eq
|
||||
bne cr0,99f
|
||||
|
||||
li r3,0
|
||||
|
@ -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.
|
||||
*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc
|
||||
|
@ -200,6 +200,8 @@ void show_mem(void)
|
||||
unsigned long flags;
|
||||
pgdat_resize_lock(pgdat, &flags);
|
||||
for (i = 0; i < pgdat->node_spanned_pages; i++) {
|
||||
if (!pfn_valid(pgdat->node_start_pfn + i))
|
||||
continue;
|
||||
page = pgdat_page_nr(pgdat, i);
|
||||
total++;
|
||||
if (PageHighMem(page))
|
||||
@ -336,7 +338,7 @@ void __init mem_init(void)
|
||||
struct page *page;
|
||||
unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
|
||||
|
||||
num_physpages = max_pfn; /* RAM is assumed contiguous */
|
||||
num_physpages = lmb.memory.size >> PAGE_SHIFT;
|
||||
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
|
||||
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
@ -348,11 +350,13 @@ void __init mem_init(void)
|
||||
}
|
||||
}
|
||||
#else
|
||||
max_mapnr = num_physpages;
|
||||
max_mapnr = max_pfn;
|
||||
totalram_pages += free_all_bootmem();
|
||||
#endif
|
||||
for_each_pgdat(pgdat) {
|
||||
for (i = 0; i < pgdat->node_spanned_pages; i++) {
|
||||
if (!pfn_valid(pgdat->node_start_pfn + i))
|
||||
continue;
|
||||
page = pgdat_page_nr(pgdat, i);
|
||||
if (PageReserved(page))
|
||||
reservedpages++;
|
||||
|
@ -483,6 +483,7 @@ static void __init setup_nonnuma(void)
|
||||
{
|
||||
unsigned long top_of_ram = lmb_end_of_DRAM();
|
||||
unsigned long total_ram = lmb_phys_mem_size();
|
||||
unsigned int i;
|
||||
|
||||
printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
|
||||
top_of_ram, total_ram);
|
||||
@ -490,7 +491,9 @@ static void __init setup_nonnuma(void)
|
||||
(top_of_ram - total_ram) >> 20);
|
||||
|
||||
map_cpu_to_node(boot_cpuid, 0);
|
||||
add_region(0, 0, lmb_end_of_DRAM() >> PAGE_SHIFT);
|
||||
for (i = 0; i < lmb.memory.cnt; ++i)
|
||||
add_region(0, lmb.memory.region[i].base >> PAGE_SHIFT,
|
||||
lmb_size_pages(&lmb.memory, i));
|
||||
node_set_online(0);
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Copyright (c) 2004 Freescale Semiconductor, Inc
|
||||
*
|
||||
* 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
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -42,13 +42,6 @@
|
||||
#include "irq.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_Event_Count;
|
||||
|
||||
@ -350,26 +343,14 @@ static hw_irq_controller iSeries_IRQ_handler = {
|
||||
int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
|
||||
HvSubBusNumber subBusNumber, HvAgentId deviceId)
|
||||
{
|
||||
unsigned int realirq, virtirq;
|
||||
int virtirq;
|
||||
unsigned int realirq;
|
||||
u8 idsel = (deviceId >> 4);
|
||||
u8 function = deviceId & 7;
|
||||
|
||||
virtirq = next_virtual_irq++;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include <asm/sections.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/time.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)
|
||||
{
|
||||
unsigned procIx = get_paca()->lppaca.dyn_hv_phys_proc_index;
|
||||
|
||||
if (get_paca()->lppaca.shared_proc) {
|
||||
ppc_md.idle_loop = iseries_shared_idle;
|
||||
printk(KERN_INFO "Using shared processor idle loop\n");
|
||||
@ -565,9 +562,6 @@ static void __init iSeries_setup_arch(void)
|
||||
itVpdAreas.xSlicMaxLogicalProcs);
|
||||
printk("Max physical processors = %d\n",
|
||||
itVpdAreas.xSlicMaxPhysicalProcs);
|
||||
|
||||
_systemcfg->processor = xIoHriProcessorVpd[procIx].xPVR;
|
||||
printk("Processor version = %x\n", _systemcfg->processor);
|
||||
}
|
||||
|
||||
static void iSeries_show_cpuinfo(struct seq_file *m)
|
||||
|
@ -102,7 +102,7 @@ static unsigned long from_rtc_time(struct rtc_time *tm)
|
||||
static unsigned long cuda_get_time(void)
|
||||
{
|
||||
struct adb_request req;
|
||||
unsigned long now;
|
||||
unsigned int now;
|
||||
|
||||
if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_GET_TIME) < 0)
|
||||
return 0;
|
||||
@ -113,7 +113,7 @@ static unsigned long cuda_get_time(void)
|
||||
req.reply_len);
|
||||
now = (req.reply[3] << 24) + (req.reply[4] << 16)
|
||||
+ (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))
|
||||
@ -146,7 +146,7 @@ static int cuda_set_rtc_time(struct rtc_time *tm)
|
||||
static unsigned long pmu_get_time(void)
|
||||
{
|
||||
struct adb_request req;
|
||||
unsigned long now;
|
||||
unsigned int now;
|
||||
|
||||
if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0)
|
||||
return 0;
|
||||
@ -156,7 +156,7 @@ static unsigned long pmu_get_time(void)
|
||||
req.reply_len);
|
||||
now = (req.reply[0] << 24) + (req.reply[1] << 16)
|
||||
+ (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))
|
||||
@ -199,6 +199,7 @@ static unsigned long smu_get_time(void)
|
||||
#define smu_set_rtc_time(tm, spin) 0
|
||||
#endif
|
||||
|
||||
/* Can't be __init, it's called when suspending and resuming */
|
||||
unsigned long pmac_get_boot_time(void)
|
||||
{
|
||||
/* Get the time from the RTC, used only at boot time */
|
||||
|
@ -4,4 +4,7 @@ obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_IBMVIO) += vio.o
|
||||
obj-$(CONFIG_XICS) += xics.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
|
||||
|
@ -200,14 +200,12 @@ static void __init pSeries_setup_arch(void)
|
||||
if (ppc64_interrupt_controller == IC_OPEN_PIC) {
|
||||
ppc_md.init_IRQ = pSeries_init_mpic;
|
||||
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
|
||||
* fill the ISUs */
|
||||
pSeries_setup_mpic();
|
||||
} else {
|
||||
ppc_md.init_IRQ = xics_init_IRQ;
|
||||
ppc_md.get_irq = xics_get_irq;
|
||||
ppc_md.cpu_irq_down = xics_teardown_cpu;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@ -595,6 +593,27 @@ static int pSeries_pci_probe_mode(struct pci_bus *bus)
|
||||
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 = {
|
||||
.probe = pSeries_probe,
|
||||
.setup_arch = pSeries_setup_arch,
|
||||
@ -617,4 +636,7 @@ struct machdep_calls __initdata pSeries_md = {
|
||||
.check_legacy_ioport = pSeries_check_legacy_ioport,
|
||||
.system_reset_exception = pSeries_system_reset_exception,
|
||||
.machine_check_exception = pSeries_machine_check_exception,
|
||||
#ifdef CONFIG_KEXEC
|
||||
.kexec_cpu_down = pseries_kexec_cpu_down,
|
||||
#endif
|
||||
};
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/string.h>
|
||||
|
@ -24,7 +24,7 @@
|
||||
* Copyright 2002-2004 MontaVista Software, Inc.
|
||||
* PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -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.
|
||||
*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* MPC834x SYS board specific routines
|
||||
*
|
||||
* Maintainer: Kumar Gala <kumar.gala@freescale.com>
|
||||
* Maintainer: Kumar Gala <galak@kernel.crashing.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
{
|
||||
{PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x11 */
|
||||
{PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x12 */
|
||||
{PIRQD, PIRQA, PIRQB, PIRQC} /* idsel 0x13 */
|
||||
{PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x11 */
|
||||
{PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x12 */
|
||||
{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;
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user