Merge master.kernel.org:/home/rmk/linux-2.6-arm
This commit is contained in:
commit
8b789b7d7e
|
@ -32,6 +32,7 @@
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
extern const char *processor_modes[];
|
extern const char *processor_modes[];
|
||||||
extern void setup_mm_for_reboot(char mode);
|
extern void setup_mm_for_reboot(char mode);
|
||||||
|
@ -85,8 +86,10 @@ EXPORT_SYMBOL(pm_power_off);
|
||||||
void default_idle(void)
|
void default_idle(void)
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
if (!need_resched() && !hlt_counter)
|
if (!need_resched() && !hlt_counter) {
|
||||||
|
timer_dyn_reprogram();
|
||||||
arch_idle();
|
arch_idle();
|
||||||
|
}
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -424,15 +424,19 @@ static int timer_dyn_tick_disable(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reprogram the system timer for at least the calculated time interval.
|
||||||
|
* This function should be called from the idle thread with IRQs disabled,
|
||||||
|
* immediately before sleeping.
|
||||||
|
*/
|
||||||
void timer_dyn_reprogram(void)
|
void timer_dyn_reprogram(void)
|
||||||
{
|
{
|
||||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
write_seqlock_irqsave(&xtime_lock, flags);
|
write_seqlock(&xtime_lock);
|
||||||
if (dyn_tick->state & DYN_TICK_ENABLED)
|
if (dyn_tick->state & DYN_TICK_ENABLED)
|
||||||
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
||||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
write_sequnlock(&xtime_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
zreladdr-y := 0xf0008000
|
|
@ -522,6 +522,69 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s)
|
||||||
printk(KERN_INFO "Freeing %s memory: %dK\n", s, size);
|
printk(KERN_INFO "Freeing %s memory: %dK\n", s, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
free_memmap(int node, unsigned long start_pfn, unsigned long end_pfn)
|
||||||
|
{
|
||||||
|
struct page *start_pg, *end_pg;
|
||||||
|
unsigned long pg, pgend;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert start_pfn/end_pfn to a struct page pointer.
|
||||||
|
*/
|
||||||
|
start_pg = pfn_to_page(start_pfn);
|
||||||
|
end_pg = pfn_to_page(end_pfn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert to physical addresses, and
|
||||||
|
* round start upwards and end downwards.
|
||||||
|
*/
|
||||||
|
pg = PAGE_ALIGN(__pa(start_pg));
|
||||||
|
pgend = __pa(end_pg) & PAGE_MASK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there are free pages between these,
|
||||||
|
* free the section of the memmap array.
|
||||||
|
*/
|
||||||
|
if (pg < pgend)
|
||||||
|
free_bootmem_node(NODE_DATA(node), pg, pgend - pg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The mem_map array can get very big. Free the unused area of the memory map.
|
||||||
|
*/
|
||||||
|
static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
||||||
|
{
|
||||||
|
unsigned long bank_start, prev_bank_end = 0;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [FIXME] This relies on each bank being in address order. This
|
||||||
|
* may not be the case, especially if the user has provided the
|
||||||
|
* information on the command line.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < mi->nr_banks; i++) {
|
||||||
|
if (mi->bank[i].size == 0 || mi->bank[i].node != node)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bank_start = mi->bank[i].start >> PAGE_SHIFT;
|
||||||
|
if (bank_start < prev_bank_end) {
|
||||||
|
printk(KERN_ERR "MEM: unordered memory banks. "
|
||||||
|
"Not freeing memmap.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we had a previous bank, and there is a space
|
||||||
|
* between the current bank and the previous, free it.
|
||||||
|
*/
|
||||||
|
if (prev_bank_end && prev_bank_end != bank_start)
|
||||||
|
free_memmap(node, prev_bank_end, bank_start);
|
||||||
|
|
||||||
|
prev_bank_end = (mi->bank[i].start +
|
||||||
|
mi->bank[i].size) >> PAGE_SHIFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mem_init() marks the free areas in the mem_map and tells us how much
|
* mem_init() marks the free areas in the mem_map and tells us how much
|
||||||
* memory is free. This is done after various parts of the system have
|
* memory is free. This is done after various parts of the system have
|
||||||
|
@ -540,16 +603,12 @@ void __init mem_init(void)
|
||||||
max_mapnr = virt_to_page(high_memory) - mem_map;
|
max_mapnr = virt_to_page(high_memory) - mem_map;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* We may have non-contiguous memory.
|
|
||||||
*/
|
|
||||||
if (meminfo.nr_banks != 1)
|
|
||||||
create_memmap_holes(&meminfo);
|
|
||||||
|
|
||||||
/* this will put all unused low memory onto the freelists */
|
/* this will put all unused low memory onto the freelists */
|
||||||
for_each_online_node(node) {
|
for_each_online_node(node) {
|
||||||
pg_data_t *pgdat = NODE_DATA(node);
|
pg_data_t *pgdat = NODE_DATA(node);
|
||||||
|
|
||||||
|
free_unused_memmap_node(node, &meminfo);
|
||||||
|
|
||||||
if (pgdat->node_spanned_pages != 0)
|
if (pgdat->node_spanned_pages != 0)
|
||||||
totalram_pages += free_all_bootmem_node(pgdat);
|
totalram_pages += free_all_bootmem_node(pgdat);
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,14 @@ pgd_t *get_pgd_slow(struct mm_struct *mm)
|
||||||
|
|
||||||
memzero(new_pgd, FIRST_KERNEL_PGD_NR * sizeof(pgd_t));
|
memzero(new_pgd, FIRST_KERNEL_PGD_NR * sizeof(pgd_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy over the kernel and IO PGD entries
|
||||||
|
*/
|
||||||
init_pgd = pgd_offset_k(0);
|
init_pgd = pgd_offset_k(0);
|
||||||
|
memcpy(new_pgd + FIRST_KERNEL_PGD_NR, init_pgd + FIRST_KERNEL_PGD_NR,
|
||||||
|
(PTRS_PER_PGD - FIRST_KERNEL_PGD_NR) * sizeof(pgd_t));
|
||||||
|
|
||||||
|
clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t));
|
||||||
|
|
||||||
if (!vectors_high()) {
|
if (!vectors_high()) {
|
||||||
/*
|
/*
|
||||||
|
@ -198,14 +205,6 @@ pgd_t *get_pgd_slow(struct mm_struct *mm)
|
||||||
spin_unlock(&mm->page_table_lock);
|
spin_unlock(&mm->page_table_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy over the kernel and IO PGD entries
|
|
||||||
*/
|
|
||||||
memcpy(new_pgd + FIRST_KERNEL_PGD_NR, init_pgd + FIRST_KERNEL_PGD_NR,
|
|
||||||
(PTRS_PER_PGD - FIRST_KERNEL_PGD_NR) * sizeof(pgd_t));
|
|
||||||
|
|
||||||
clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t));
|
|
||||||
|
|
||||||
return new_pgd;
|
return new_pgd;
|
||||||
|
|
||||||
no_pte:
|
no_pte:
|
||||||
|
@ -698,75 +697,3 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
|
||||||
for (i = 0; i < nr; i++)
|
for (i = 0; i < nr; i++)
|
||||||
create_mapping(io_desc + i);
|
create_mapping(io_desc + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
free_memmap(int node, unsigned long start_pfn, unsigned long end_pfn)
|
|
||||||
{
|
|
||||||
struct page *start_pg, *end_pg;
|
|
||||||
unsigned long pg, pgend;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert start_pfn/end_pfn to a struct page pointer.
|
|
||||||
*/
|
|
||||||
start_pg = pfn_to_page(start_pfn);
|
|
||||||
end_pg = pfn_to_page(end_pfn);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert to physical addresses, and
|
|
||||||
* round start upwards and end downwards.
|
|
||||||
*/
|
|
||||||
pg = PAGE_ALIGN(__pa(start_pg));
|
|
||||||
pgend = __pa(end_pg) & PAGE_MASK;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If there are free pages between these,
|
|
||||||
* free the section of the memmap array.
|
|
||||||
*/
|
|
||||||
if (pg < pgend)
|
|
||||||
free_bootmem_node(NODE_DATA(node), pg, pgend - pg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void free_unused_memmap_node(int node, struct meminfo *mi)
|
|
||||||
{
|
|
||||||
unsigned long bank_start, prev_bank_end = 0;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [FIXME] This relies on each bank being in address order. This
|
|
||||||
* may not be the case, especially if the user has provided the
|
|
||||||
* information on the command line.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < mi->nr_banks; i++) {
|
|
||||||
if (mi->bank[i].size == 0 || mi->bank[i].node != node)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bank_start = mi->bank[i].start >> PAGE_SHIFT;
|
|
||||||
if (bank_start < prev_bank_end) {
|
|
||||||
printk(KERN_ERR "MEM: unordered memory banks. "
|
|
||||||
"Not freeing memmap.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we had a previous bank, and there is a space
|
|
||||||
* between the current bank and the previous, free it.
|
|
||||||
*/
|
|
||||||
if (prev_bank_end && prev_bank_end != bank_start)
|
|
||||||
free_memmap(node, prev_bank_end, bank_start);
|
|
||||||
|
|
||||||
prev_bank_end = PAGE_ALIGN(mi->bank[i].start +
|
|
||||||
mi->bank[i].size) >> PAGE_SHIFT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The mem_map array can get very big. Free
|
|
||||||
* the unused area of the memory map.
|
|
||||||
*/
|
|
||||||
void __init create_memmap_holes(struct meminfo *mi)
|
|
||||||
{
|
|
||||||
int node;
|
|
||||||
|
|
||||||
for_each_online_node(node)
|
|
||||||
free_unused_memmap_node(node, mi);
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# To add an entry into this database, please see Documentation/arm/README,
|
# To add an entry into this database, please see Documentation/arm/README,
|
||||||
# or contact rmk@arm.linux.org.uk
|
# or contact rmk@arm.linux.org.uk
|
||||||
#
|
#
|
||||||
# Last update: Thu Mar 24 14:34:50 2005
|
# Last update: Thu Jun 23 20:19:33 2005
|
||||||
#
|
#
|
||||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||||
#
|
#
|
||||||
|
@ -243,7 +243,7 @@ yoho ARCH_YOHO YOHO 231
|
||||||
jasper ARCH_JASPER JASPER 232
|
jasper ARCH_JASPER JASPER 232
|
||||||
dsc25 ARCH_DSC25 DSC25 233
|
dsc25 ARCH_DSC25 DSC25 233
|
||||||
omap_innovator MACH_OMAP_INNOVATOR OMAP_INNOVATOR 234
|
omap_innovator MACH_OMAP_INNOVATOR OMAP_INNOVATOR 234
|
||||||
ramses ARCH_RAMSES RAMSES 235
|
mnci ARCH_RAMSES RAMSES 235
|
||||||
s28x ARCH_S28X S28X 236
|
s28x ARCH_S28X S28X 236
|
||||||
mport3 ARCH_MPORT3 MPORT3 237
|
mport3 ARCH_MPORT3 MPORT3 237
|
||||||
pxa_eagle250 ARCH_PXA_EAGLE250 PXA_EAGLE250 238
|
pxa_eagle250 ARCH_PXA_EAGLE250 PXA_EAGLE250 238
|
||||||
|
@ -323,7 +323,7 @@ nimbra29x ARCH_NIMBRA29X NIMBRA29X 311
|
||||||
nimbra210 ARCH_NIMBRA210 NIMBRA210 312
|
nimbra210 ARCH_NIMBRA210 NIMBRA210 312
|
||||||
hhp_d95xx ARCH_HHP_D95XX HHP_D95XX 313
|
hhp_d95xx ARCH_HHP_D95XX HHP_D95XX 313
|
||||||
labarm ARCH_LABARM LABARM 314
|
labarm ARCH_LABARM LABARM 314
|
||||||
m825xx ARCH_M825XX M825XX 315
|
comcerto ARCH_M825XX M825XX 315
|
||||||
m7100 SA1100_M7100 M7100 316
|
m7100 SA1100_M7100 M7100 316
|
||||||
nipc2 ARCH_NIPC2 NIPC2 317
|
nipc2 ARCH_NIPC2 NIPC2 317
|
||||||
fu7202 ARCH_FU7202 FU7202 318
|
fu7202 ARCH_FU7202 FU7202 318
|
||||||
|
@ -724,3 +724,66 @@ lpc22xx MACH_LPC22XX LPC22XX 715
|
||||||
omap_comet3 MACH_COMET3 COMET3 716
|
omap_comet3 MACH_COMET3 COMET3 716
|
||||||
omap_comet4 MACH_COMET4 COMET4 717
|
omap_comet4 MACH_COMET4 COMET4 717
|
||||||
csb625 MACH_CSB625 CSB625 718
|
csb625 MACH_CSB625 CSB625 718
|
||||||
|
fortunet2 MACH_FORTUNET2 FORTUNET2 719
|
||||||
|
s5h2200 MACH_S5H2200 S5H2200 720
|
||||||
|
optorm920 MACH_OPTORM920 OPTORM920 721
|
||||||
|
adsbitsyxb MACH_ADSBITSYXB ADSBITSYXB 722
|
||||||
|
adssphere MACH_ADSSPHERE ADSSPHERE 723
|
||||||
|
adsportal MACH_ADSPORTAL ADSPORTAL 724
|
||||||
|
ln2410sbc MACH_LN2410SBC LN2410SBC 725
|
||||||
|
cb3rufc MACH_CB3RUFC CB3RUFC 726
|
||||||
|
mp2usb MACH_MP2USB MP2USB 727
|
||||||
|
ntnp425c MACH_NTNP425C NTNP425C 728
|
||||||
|
colibri MACH_COLIBRI COLIBRI 729
|
||||||
|
pcm7220 MACH_PCM7220 PCM7220 730
|
||||||
|
gateway7001 MACH_GATEWAY7001 GATEWAY7001 731
|
||||||
|
pcm027 MACH_PCM027 PCM027 732
|
||||||
|
cmpxa MACH_CMPXA CMPXA 733
|
||||||
|
anubis MACH_ANUBIS ANUBIS 734
|
||||||
|
ite8152 MACH_ITE8152 ITE8152 735
|
||||||
|
lpc3xxx MACH_LPC3XXX LPC3XXX 736
|
||||||
|
puppeteer MACH_PUPPETEER PUPPETEER 737
|
||||||
|
vt001 MACH_MACH_VADATECH MACH_VADATECH 738
|
||||||
|
e570 MACH_E570 E570 739
|
||||||
|
x50 MACH_X50 X50 740
|
||||||
|
recon MACH_RECON RECON 741
|
||||||
|
xboardgp8 MACH_XBOARDGP8 XBOARDGP8 742
|
||||||
|
fpic2 MACH_FPIC2 FPIC2 743
|
||||||
|
akita MACH_AKITA AKITA 744
|
||||||
|
a81 MACH_A81 A81 745
|
||||||
|
svm_sc25x MACH_SVM_SC25X SVM_SC25X 746
|
||||||
|
vt020 MACH_VADATECH020 VADATECH020 747
|
||||||
|
tli MACH_TLI TLI 748
|
||||||
|
edb9315lc MACH_EDB9315LC EDB9315LC 749
|
||||||
|
passec MACH_PASSEC PASSEC 750
|
||||||
|
ds_tiger MACH_DS_TIGER DS_TIGER 751
|
||||||
|
e310 MACH_E310 E310 752
|
||||||
|
e330 MACH_E330 E330 753
|
||||||
|
rt3000 MACH_RT3000 RT3000 754
|
||||||
|
nokia770 MACH_NOKIA770 NOKIA770 755
|
||||||
|
pnx0106 MACH_PNX0106 PNX0106 756
|
||||||
|
hx21xx MACH_HX21XX HX21XX 757
|
||||||
|
faraday MACH_FARADAY FARADAY 758
|
||||||
|
sbc9312 MACH_SBC9312 SBC9312 759
|
||||||
|
batman MACH_BATMAN BATMAN 760
|
||||||
|
jpd201 MACH_JPD201 JPD201 761
|
||||||
|
mipsa MACH_MIPSA MIPSA 762
|
||||||
|
kacom MACH_KACOM KACOM 763
|
||||||
|
swarcocpu MACH_SWARCOCPU SWARCOCPU 764
|
||||||
|
swarcodsl MACH_SWARCODSL SWARCODSL 765
|
||||||
|
blueangel MACH_BLUEANGEL BLUEANGEL 766
|
||||||
|
hairygrama MACH_HAIRYGRAMA HAIRYGRAMA 767
|
||||||
|
banff MACH_BANFF BANFF 768
|
||||||
|
carmeva MACH_CARMEVA CARMEVA 769
|
||||||
|
sam255 MACH_SAM255 SAM255 770
|
||||||
|
ppm10 MACH_PPM10 PPM10 771
|
||||||
|
edb9315a MACH_EDB9315A EDB9315A 772
|
||||||
|
sunset MACH_SUNSET SUNSET 773
|
||||||
|
stargate2 MACH_STARGATE2 STARGATE2 774
|
||||||
|
intelmote2 MACH_INTELMOTE2 INTELMOTE2 775
|
||||||
|
trizeps4 MACH_TRIZEPS4 TRIZEPS4 776
|
||||||
|
mainstone2 MACH_MAINSTONE2 MAINSTONE2 777
|
||||||
|
ez_ixp42x MACH_EZ_IXP42X EZ_IXP42X 778
|
||||||
|
tapwave_zodiac MACH_TAPWAVE_ZODIAC TAPWAVE_ZODIAC 779
|
||||||
|
universalmeter MACH_UNIVERSALMETER UNIVERSALMETER 780
|
||||||
|
hicoarm9 MACH_HICOARM9 HICOARM9 781
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
mrc p15, 0, \rx, c1, c0
|
mrc p15, 0, \rx, c1, c0
|
||||||
tst \rx, #1 @ MMU enabled?
|
tst \rx, #1 @ MMU enabled?
|
||||||
moveq \rx, #0xc8000000
|
moveq \rx, #0xc8000000
|
||||||
orrne \rx, \rx, #0x00b00000
|
|
||||||
movne \rx, #0xff000000
|
movne \rx, #0xff000000
|
||||||
|
orrne \rx, \rx, #0x00b00000
|
||||||
add \rx,\rx,#3 @ Uart regs are at off set of 3 if
|
add \rx,\rx,#3 @ Uart regs are at off set of 3 if
|
||||||
@ byte writes used - Big Endian.
|
@ byte writes used - Big Endian.
|
||||||
.endm
|
.endm
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file contains the i386 architecture specific IDE code.
|
* This file contains the ARM architecture specific IDE code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ASMARM_IDE_H
|
#ifndef __ASMARM_IDE_H
|
||||||
|
|
|
@ -82,7 +82,7 @@ extern void __readwrite_bug(const char *fn);
|
||||||
* only. Their primary purpose is to access PCI and ISA peripherals.
|
* only. Their primary purpose is to access PCI and ISA peripherals.
|
||||||
*
|
*
|
||||||
* Note that for a big endian machine, this implies that the following
|
* Note that for a big endian machine, this implies that the following
|
||||||
* big endian mode connectivity is in place, as described by numerious
|
* big endian mode connectivity is in place, as described by numerous
|
||||||
* ARM documents:
|
* ARM documents:
|
||||||
*
|
*
|
||||||
* PCI: D0-D7 D8-D15 D16-D23 D24-D31
|
* PCI: D0-D7 D8-D15 D16-D23 D24-D31
|
||||||
|
|
|
@ -60,6 +60,8 @@ struct dyn_tick_timer {
|
||||||
};
|
};
|
||||||
|
|
||||||
void timer_dyn_reprogram(void);
|
void timer_dyn_reprogram(void);
|
||||||
|
#else
|
||||||
|
#define timer_dyn_reprogram() do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern struct sys_timer *system_timer;
|
extern struct sys_timer *system_timer;
|
||||||
|
|
Loading…
Reference in New Issue