Merge commit 'v3.2-rc6' into x86/platform

This commit is contained in:
Ingo Molnar 2011-12-18 10:35:16 +01:00
commit 6e5ed27637
365 changed files with 4021 additions and 2945 deletions

View File

@ -688,10 +688,13 @@ S: Oxfordshire, UK.
N: Kees Cook N: Kees Cook
E: kees@outflux.net E: kees@outflux.net
W: http://outflux.net/ E: kees@ubuntu.com
P: 1024D/17063E6D 9FA3 C49C 23C9 D1BC 2E30 1975 1FFF 4BA9 1706 3E6D E: keescook@chromium.org
D: Minor updates to SCSI types, added /proc/pid/maps protection W: http://outflux.net/blog/
P: 4096R/DC6DC026 A5C3 F68F 229D D60F 723E 6E13 8972 F4DF DC6D C026
D: Various security things, bug fixes, and documentation.
S: (ask for current address) S: (ask for current address)
S: Portland, Oregon
S: USA S: USA
N: Robin Cornelius N: Robin Cornelius

View File

@ -57,13 +57,6 @@ create_snap
$ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create
rollback_snap
Rolls back data to the specified snapshot. This goes over the entire
list of rados blocks and sends a rollback command to each.
$ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_rollback
snap_* snap_*
A directory per each snapshot A directory per each snapshot

View File

@ -315,12 +315,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
CPU-intensive style benchmark, and it can vary highly in CPU-intensive style benchmark, and it can vary highly in
a microbenchmark depending on workload and compiler. a microbenchmark depending on workload and compiler.
1: only for 32-bit processes 32: only for 32-bit processes
2: only for 64-bit processes 64: only for 64-bit processes
on: enable for both 32- and 64-bit processes on: enable for both 32- and 64-bit processes
off: disable for both 32- and 64-bit processes off: disable for both 32- and 64-bit processes
amd_iommu= [HW,X86-84] amd_iommu= [HW,X86-64]
Pass parameters to the AMD IOMMU driver in the system. Pass parameters to the AMD IOMMU driver in the system.
Possible values are: Possible values are:
fullflush - enable flushing of IO/TLB entries when fullflush - enable flushing of IO/TLB entries when

View File

@ -282,11 +282,11 @@ tcp_max_ssthresh - INTEGER
Default: 0 (off) Default: 0 (off)
tcp_max_syn_backlog - INTEGER tcp_max_syn_backlog - INTEGER
Maximal number of remembered connection requests, which are Maximal number of remembered connection requests, which have not
still did not receive an acknowledgment from connecting client. received an acknowledgment from connecting client.
Default value is 1024 for systems with more than 128Mb of memory, The minimal value is 128 for low memory machines, and it will
and 128 for low memory machines. If server suffers of overload, increase in proportion to the memory of machine.
try to increase this number. If server suffers from overload, try increasing this number.
tcp_max_tw_buckets - INTEGER tcp_max_tw_buckets - INTEGER
Maximal number of timewait sockets held by system simultaneously. Maximal number of timewait sockets held by system simultaneously.

View File

@ -50,8 +50,7 @@ Machine DAI Configuration
The machine DAI configuration glues all the codec and CPU DAIs together. It can The machine DAI configuration glues all the codec and CPU DAIs together. It can
also be used to set up the DAI system clock and for any machine related DAI also be used to set up the DAI system clock and for any machine related DAI
initialisation e.g. the machine audio map can be connected to the codec audio initialisation e.g. the machine audio map can be connected to the codec audio
map, unconnected codec pins can be set as such. Please see corgi.c, spitz.c map, unconnected codec pins can be set as such.
for examples.
struct snd_soc_dai_link is used to set up each DAI in your machine. e.g. struct snd_soc_dai_link is used to set up each DAI in your machine. e.g.
@ -83,8 +82,7 @@ Machine Power Map
The machine driver can optionally extend the codec power map and to become an The machine driver can optionally extend the codec power map and to become an
audio power map of the audio subsystem. This allows for automatic power up/down audio power map of the audio subsystem. This allows for automatic power up/down
of speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack of speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack
sockets in the machine init function. See soc/pxa/spitz.c and dapm.txt for sockets in the machine init function.
details.
Machine Controls Machine Controls

View File

@ -511,8 +511,8 @@ M: Joerg Roedel <joerg.roedel@amd.com>
L: iommu@lists.linux-foundation.org L: iommu@lists.linux-foundation.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git
S: Supported S: Supported
F: arch/x86/kernel/amd_iommu*.c F: drivers/iommu/amd_iommu*.[ch]
F: arch/x86/include/asm/amd_iommu*.h F: include/linux/amd-iommu.h
AMD MICROCODE UPDATE SUPPORT AMD MICROCODE UPDATE SUPPORT
M: Andreas Herrmann <andreas.herrmann3@amd.com> M: Andreas Herrmann <andreas.herrmann3@amd.com>
@ -1054,35 +1054,18 @@ ARM/SAMSUNG ARM ARCHITECTURES
M: Ben Dooks <ben-linux@fluff.org> M: Ben Dooks <ben-linux@fluff.org>
M: Kukjin Kim <kgene.kim@samsung.com> M: Kukjin Kim <kgene.kim@samsung.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
W: http://www.fluff.org/ben/linux/ W: http://www.fluff.org/ben/linux/
S: Maintained S: Maintained
F: arch/arm/plat-samsung/ F: arch/arm/plat-samsung/
F: arch/arm/plat-s3c24xx/ F: arch/arm/plat-s3c24xx/
F: arch/arm/plat-s5p/ F: arch/arm/plat-s5p/
F: arch/arm/mach-s3c24*/
F: arch/arm/mach-s3c64xx/
F: drivers/*/*s3c2410* F: drivers/*/*s3c2410*
F: drivers/*/*/*s3c2410* F: drivers/*/*/*s3c2410*
F: drivers/spi/spi-s3c*
ARM/S3C2410 ARM ARCHITECTURE F: sound/soc/samsung/*
M: Ben Dooks <ben-linux@fluff.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
W: http://www.fluff.org/ben/linux/
S: Maintained
F: arch/arm/mach-s3c2410/
ARM/S3C244x ARM ARCHITECTURE
M: Ben Dooks <ben-linux@fluff.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
W: http://www.fluff.org/ben/linux/
S: Maintained
F: arch/arm/mach-s3c2440/
F: arch/arm/mach-s3c2443/
ARM/S3C64xx ARM ARCHITECTURE
M: Ben Dooks <ben-linux@fluff.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
W: http://www.fluff.org/ben/linux/
S: Maintained
F: arch/arm/mach-s3c64xx/
ARM/S5P EXYNOS ARM ARCHITECTURES ARM/S5P EXYNOS ARM ARCHITECTURES
M: Kukjin Kim <kgene.kim@samsung.com> M: Kukjin Kim <kgene.kim@samsung.com>
@ -4319,8 +4302,9 @@ F: include/linux/mm.h
F: mm/ F: mm/
MEMORY RESOURCE CONTROLLER MEMORY RESOURCE CONTROLLER
M: Johannes Weiner <hannes@cmpxchg.org>
M: Michal Hocko <mhocko@suse.cz>
M: Balbir Singh <bsingharora@gmail.com> M: Balbir Singh <bsingharora@gmail.com>
M: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
L: cgroups@vger.kernel.org L: cgroups@vger.kernel.org
L: linux-mm@kvack.org L: linux-mm@kvack.org

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 2 PATCHLEVEL = 2
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc4 EXTRAVERSION = -rc6
NAME = Saber-toothed Squirrel NAME = Saber-toothed Squirrel
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -220,8 +220,9 @@ config NEED_MACH_MEMORY_H
be avoided when possible. be avoided when possible.
config PHYS_OFFSET config PHYS_OFFSET
hex "Physical address of main memory" hex "Physical address of main memory" if MMU
depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H
default DRAM_BASE if !MMU
help help
Please provide the physical address corresponding to the Please provide the physical address corresponding to the
location of main memory in your system. location of main memory in your system.

View File

@ -48,12 +48,7 @@ CONFIG_MACH_SX1=y
CONFIG_MACH_NOKIA770=y CONFIG_MACH_NOKIA770=y
CONFIG_MACH_AMS_DELTA=y CONFIG_MACH_AMS_DELTA=y
CONFIG_MACH_OMAP_GENERIC=y CONFIG_MACH_OMAP_GENERIC=y
CONFIG_OMAP_ARM_216MHZ=y
CONFIG_OMAP_ARM_195MHZ=y
CONFIG_OMAP_ARM_192MHZ=y
CONFIG_OMAP_ARM_182MHZ=y CONFIG_OMAP_ARM_182MHZ=y
CONFIG_OMAP_ARM_168MHZ=y
# CONFIG_OMAP_ARM_60MHZ is not set
# CONFIG_ARM_THUMB is not set # CONFIG_ARM_THUMB is not set
CONFIG_PCCARD=y CONFIG_PCCARD=y
CONFIG_OMAP_CF=y CONFIG_OMAP_CF=y

View File

@ -30,14 +30,15 @@ enum unwind_reason_code {
}; };
struct unwind_idx { struct unwind_idx {
unsigned long addr; unsigned long addr_offset;
unsigned long insn; unsigned long insn;
}; };
struct unwind_table { struct unwind_table {
struct list_head list; struct list_head list;
struct unwind_idx *start; const struct unwind_idx *start;
struct unwind_idx *stop; const struct unwind_idx *origin;
const struct unwind_idx *stop;
unsigned long begin_addr; unsigned long begin_addr;
unsigned long end_addr; unsigned long end_addr;
}; };
@ -49,15 +50,6 @@ extern struct unwind_table *unwind_table_add(unsigned long start,
extern void unwind_table_del(struct unwind_table *tab); extern void unwind_table_del(struct unwind_table *tab);
extern void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk); extern void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk);
#ifdef CONFIG_ARM_UNWIND
extern int __init unwind_init(void);
#else
static inline int __init unwind_init(void)
{
return 0;
}
#endif
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#ifdef CONFIG_ARM_UNWIND #ifdef CONFIG_ARM_UNWIND

View File

@ -353,15 +353,15 @@ validate_group(struct perf_event *event)
fake_pmu.used_mask = fake_used_mask; fake_pmu.used_mask = fake_used_mask;
if (!validate_event(&fake_pmu, leader)) if (!validate_event(&fake_pmu, leader))
return -ENOSPC; return -EINVAL;
list_for_each_entry(sibling, &leader->sibling_list, group_entry) { list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
if (!validate_event(&fake_pmu, sibling)) if (!validate_event(&fake_pmu, sibling))
return -ENOSPC; return -EINVAL;
} }
if (!validate_event(&fake_pmu, event)) if (!validate_event(&fake_pmu, event))
return -ENOSPC; return -EINVAL;
return 0; return 0;
} }
@ -640,6 +640,9 @@ static struct platform_device_id armpmu_plat_device_ids[] = {
static int __devinit armpmu_device_probe(struct platform_device *pdev) static int __devinit armpmu_device_probe(struct platform_device *pdev)
{ {
if (!cpu_pmu)
return -ENODEV;
cpu_pmu->plat_device = pdev; cpu_pmu->plat_device = pdev;
return 0; return 0;
} }

View File

@ -895,8 +895,6 @@ void __init setup_arch(char **cmdline_p)
{ {
struct machine_desc *mdesc; struct machine_desc *mdesc;
unwind_init();
setup_processor(); setup_processor();
mdesc = setup_machine_fdt(__atags_pointer); mdesc = setup_machine_fdt(__atags_pointer);
if (!mdesc) if (!mdesc)
@ -904,6 +902,12 @@ void __init setup_arch(char **cmdline_p)
machine_desc = mdesc; machine_desc = mdesc;
machine_name = mdesc->name; machine_name = mdesc->name;
#ifdef CONFIG_ZONE_DMA
if (mdesc->dma_zone_size) {
extern unsigned long arm_dma_zone_size;
arm_dma_zone_size = mdesc->dma_zone_size;
}
#endif
if (mdesc->soft_reboot) if (mdesc->soft_reboot)
reboot_setup("s"); reboot_setup("s");
@ -934,12 +938,6 @@ void __init setup_arch(char **cmdline_p)
tcm_init(); tcm_init();
#ifdef CONFIG_ZONE_DMA
if (mdesc->dma_zone_size) {
extern unsigned long arm_dma_zone_size;
arm_dma_zone_size = mdesc->dma_zone_size;
}
#endif
#ifdef CONFIG_MULTI_IRQ_HANDLER #ifdef CONFIG_MULTI_IRQ_HANDLER
handle_arch_irq = mdesc->handle_irq; handle_arch_irq = mdesc->handle_irq;
#endif #endif

View File

@ -67,7 +67,7 @@ EXPORT_SYMBOL(__aeabi_unwind_cpp_pr2);
struct unwind_ctrl_block { struct unwind_ctrl_block {
unsigned long vrs[16]; /* virtual register set */ unsigned long vrs[16]; /* virtual register set */
unsigned long *insn; /* pointer to the current instructions word */ const unsigned long *insn; /* pointer to the current instructions word */
int entries; /* number of entries left to interpret */ int entries; /* number of entries left to interpret */
int byte; /* current byte number in the instructions word */ int byte; /* current byte number in the instructions word */
}; };
@ -83,8 +83,9 @@ enum regs {
PC = 15 PC = 15
}; };
extern struct unwind_idx __start_unwind_idx[]; extern const struct unwind_idx __start_unwind_idx[];
extern struct unwind_idx __stop_unwind_idx[]; static const struct unwind_idx *__origin_unwind_idx;
extern const struct unwind_idx __stop_unwind_idx[];
static DEFINE_SPINLOCK(unwind_lock); static DEFINE_SPINLOCK(unwind_lock);
static LIST_HEAD(unwind_tables); static LIST_HEAD(unwind_tables);
@ -98,45 +99,99 @@ static LIST_HEAD(unwind_tables);
}) })
/* /*
* Binary search in the unwind index. The entries entries are * Binary search in the unwind index. The entries are
* guaranteed to be sorted in ascending order by the linker. * guaranteed to be sorted in ascending order by the linker.
*
* start = first entry
* origin = first entry with positive offset (or stop if there is no such entry)
* stop - 1 = last entry
*/ */
static struct unwind_idx *search_index(unsigned long addr, static const struct unwind_idx *search_index(unsigned long addr,
struct unwind_idx *first, const struct unwind_idx *start,
struct unwind_idx *last) const struct unwind_idx *origin,
const struct unwind_idx *stop)
{ {
pr_debug("%s(%08lx, %p, %p)\n", __func__, addr, first, last); unsigned long addr_prel31;
if (addr < first->addr) { pr_debug("%s(%08lx, %p, %p, %p)\n",
pr_warning("unwind: Unknown symbol address %08lx\n", addr); __func__, addr, start, origin, stop);
return NULL;
} else if (addr >= last->addr)
return last;
while (first < last - 1) { /*
struct unwind_idx *mid = first + ((last - first + 1) >> 1); * only search in the section with the matching sign. This way the
* prel31 numbers can be compared as unsigned longs.
*/
if (addr < (unsigned long)start)
/* negative offsets: [start; origin) */
stop = origin;
else
/* positive offsets: [origin; stop) */
start = origin;
if (addr < mid->addr) /* prel31 for address relavive to start */
last = mid; addr_prel31 = (addr - (unsigned long)start) & 0x7fffffff;
else
first = mid; while (start < stop - 1) {
const struct unwind_idx *mid = start + ((stop - start) >> 1);
/*
* As addr_prel31 is relative to start an offset is needed to
* make it relative to mid.
*/
if (addr_prel31 - ((unsigned long)mid - (unsigned long)start) <
mid->addr_offset)
stop = mid;
else {
/* keep addr_prel31 relative to start */
addr_prel31 -= ((unsigned long)mid -
(unsigned long)start);
start = mid;
}
} }
return first; if (likely(start->addr_offset <= addr_prel31))
return start;
else {
pr_warning("unwind: Unknown symbol address %08lx\n", addr);
return NULL;
}
} }
static struct unwind_idx *unwind_find_idx(unsigned long addr) static const struct unwind_idx *unwind_find_origin(
const struct unwind_idx *start, const struct unwind_idx *stop)
{ {
struct unwind_idx *idx = NULL; pr_debug("%s(%p, %p)\n", __func__, start, stop);
while (start < stop) {
const struct unwind_idx *mid = start + ((stop - start) >> 1);
if (mid->addr_offset >= 0x40000000)
/* negative offset */
start = mid + 1;
else
/* positive offset */
stop = mid;
}
pr_debug("%s -> %p\n", __func__, stop);
return stop;
}
static const struct unwind_idx *unwind_find_idx(unsigned long addr)
{
const struct unwind_idx *idx = NULL;
unsigned long flags; unsigned long flags;
pr_debug("%s(%08lx)\n", __func__, addr); pr_debug("%s(%08lx)\n", __func__, addr);
if (core_kernel_text(addr)) if (core_kernel_text(addr)) {
if (unlikely(!__origin_unwind_idx))
__origin_unwind_idx =
unwind_find_origin(__start_unwind_idx,
__stop_unwind_idx);
/* main unwind table */ /* main unwind table */
idx = search_index(addr, __start_unwind_idx, idx = search_index(addr, __start_unwind_idx,
__stop_unwind_idx - 1); __origin_unwind_idx,
else { __stop_unwind_idx);
} else {
/* module unwind tables */ /* module unwind tables */
struct unwind_table *table; struct unwind_table *table;
@ -145,7 +200,8 @@ static struct unwind_idx *unwind_find_idx(unsigned long addr)
if (addr >= table->begin_addr && if (addr >= table->begin_addr &&
addr < table->end_addr) { addr < table->end_addr) {
idx = search_index(addr, table->start, idx = search_index(addr, table->start,
table->stop - 1); table->origin,
table->stop);
/* Move-to-front to exploit common traces */ /* Move-to-front to exploit common traces */
list_move(&table->list, &unwind_tables); list_move(&table->list, &unwind_tables);
break; break;
@ -274,7 +330,7 @@ static int unwind_exec_insn(struct unwind_ctrl_block *ctrl)
int unwind_frame(struct stackframe *frame) int unwind_frame(struct stackframe *frame)
{ {
unsigned long high, low; unsigned long high, low;
struct unwind_idx *idx; const struct unwind_idx *idx;
struct unwind_ctrl_block ctrl; struct unwind_ctrl_block ctrl;
/* only go to a higher address on the stack */ /* only go to a higher address on the stack */
@ -399,7 +455,6 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
unsigned long text_size) unsigned long text_size)
{ {
unsigned long flags; unsigned long flags;
struct unwind_idx *idx;
struct unwind_table *tab = kmalloc(sizeof(*tab), GFP_KERNEL); struct unwind_table *tab = kmalloc(sizeof(*tab), GFP_KERNEL);
pr_debug("%s(%08lx, %08lx, %08lx, %08lx)\n", __func__, start, size, pr_debug("%s(%08lx, %08lx, %08lx, %08lx)\n", __func__, start, size,
@ -408,15 +463,12 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
if (!tab) if (!tab)
return tab; return tab;
tab->start = (struct unwind_idx *)start; tab->start = (const struct unwind_idx *)start;
tab->stop = (struct unwind_idx *)(start + size); tab->stop = (const struct unwind_idx *)(start + size);
tab->origin = unwind_find_origin(tab->start, tab->stop);
tab->begin_addr = text_addr; tab->begin_addr = text_addr;
tab->end_addr = text_addr + text_size; tab->end_addr = text_addr + text_size;
/* Convert the symbol addresses to absolute values */
for (idx = tab->start; idx < tab->stop; idx++)
idx->addr = prel31_to_addr(&idx->addr);
spin_lock_irqsave(&unwind_lock, flags); spin_lock_irqsave(&unwind_lock, flags);
list_add_tail(&tab->list, &unwind_tables); list_add_tail(&tab->list, &unwind_tables);
spin_unlock_irqrestore(&unwind_lock, flags); spin_unlock_irqrestore(&unwind_lock, flags);
@ -437,16 +489,3 @@ void unwind_table_del(struct unwind_table *tab)
kfree(tab); kfree(tab);
} }
int __init unwind_init(void)
{
struct unwind_idx *idx;
/* Convert the symbol addresses to absolute values */
for (idx = __start_unwind_idx; idx < __stop_unwind_idx; idx++)
idx->addr = prel31_to_addr(&idx->addr);
pr_debug("unwind: ARM stack unwinding initialised\n");
return 0;
}

View File

@ -83,7 +83,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
* USB Device (Gadget) * USB Device (Gadget)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#ifdef CONFIG_USB_GADGET_AT91 #ifdef CONFIG_USB_AT91
static struct at91_udc_data udc_data; static struct at91_udc_data udc_data;
static struct resource udc_resources[] = { static struct resource udc_resources[] = {

View File

@ -195,9 +195,9 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
CLKDEV_CON_DEV_ID("t3_clk", "atmel_tcb.1", &tc3_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk), CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk), CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk),
/* more usart lookup table for DT entries */ /* more usart lookup table for DT entries */
CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck),

View File

@ -84,7 +84,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
* USB Device (Gadget) * USB Device (Gadget)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#ifdef CONFIG_USB_GADGET_AT91 #ifdef CONFIG_USB_AT91
static struct at91_udc_data udc_data; static struct at91_udc_data udc_data;
static struct resource udc_resources[] = { static struct resource udc_resources[] = {

View File

@ -87,7 +87,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
* USB Device (Gadget) * USB Device (Gadget)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#ifdef CONFIG_USB_GADGET_AT91 #ifdef CONFIG_USB_AT91
static struct at91_udc_data udc_data; static struct at91_udc_data udc_data;
static struct resource udc_resources[] = { static struct resource udc_resources[] = {

View File

@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
* USB Device (Gadget) * USB Device (Gadget)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#ifdef CONFIG_USB_GADGET_AT91 #ifdef CONFIG_USB_AT91
static struct at91_udc_data udc_data; static struct at91_udc_data udc_data;
static struct resource udc_resources[] = { static struct resource udc_resources[] = {

View File

@ -19,7 +19,7 @@
#define BOARD_HAVE_NAND_16BIT (1 << 31) #define BOARD_HAVE_NAND_16BIT (1 << 31)
static inline int board_have_nand_16bit(void) static inline int board_have_nand_16bit(void)
{ {
return system_rev & BOARD_HAVE_NAND_16BIT; return (system_rev & BOARD_HAVE_NAND_16BIT) ? 1 : 0;
} }
#endif /* __ARCH_SYSTEM_REV_H__ */ #endif /* __ARCH_SYSTEM_REV_H__ */

View File

@ -753,7 +753,7 @@ static struct snd_platform_data da850_evm_snd_data = {
.num_serializer = ARRAY_SIZE(da850_iis_serializer_direction), .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
.tdm_slots = 2, .tdm_slots = 2,
.serial_dir = da850_iis_serializer_direction, .serial_dir = da850_iis_serializer_direction,
.asp_chan_q = EVENTQ_1, .asp_chan_q = EVENTQ_0,
.version = MCASP_VERSION_2, .version = MCASP_VERSION_2,
.txnumevt = 1, .txnumevt = 1,
.rxnumevt = 1, .rxnumevt = 1,

View File

@ -107,7 +107,7 @@ static struct mtd_partition davinci_nand_partitions[] = {
/* UBL (a few copies) plus U-Boot */ /* UBL (a few copies) plus U-Boot */
.name = "bootloader", .name = "bootloader",
.offset = 0, .offset = 0,
.size = 28 * NAND_BLOCK_SIZE, .size = 30 * NAND_BLOCK_SIZE,
.mask_flags = MTD_WRITEABLE, /* force read-only */ .mask_flags = MTD_WRITEABLE, /* force read-only */
}, { }, {
/* U-Boot environment */ /* U-Boot environment */

View File

@ -564,7 +564,7 @@ static int setup_vpif_input_channel_mode(int mux_mode)
int val; int val;
u32 value; u32 value;
if (!vpif_vsclkdis_reg || !cpld_client) if (!vpif_vidclkctl_reg || !cpld_client)
return -ENXIO; return -ENXIO;
val = i2c_smbus_read_byte(cpld_client); val = i2c_smbus_read_byte(cpld_client);
@ -572,7 +572,7 @@ static int setup_vpif_input_channel_mode(int mux_mode)
return val; return val;
spin_lock_irqsave(&vpif_reg_lock, flags); spin_lock_irqsave(&vpif_reg_lock, flags);
value = __raw_readl(vpif_vsclkdis_reg); value = __raw_readl(vpif_vidclkctl_reg);
if (mux_mode) { if (mux_mode) {
val &= VPIF_INPUT_TWO_CHANNEL; val &= VPIF_INPUT_TWO_CHANNEL;
value |= VIDCH1CLK; value |= VIDCH1CLK;
@ -580,7 +580,7 @@ static int setup_vpif_input_channel_mode(int mux_mode)
val |= VPIF_INPUT_ONE_CHANNEL; val |= VPIF_INPUT_ONE_CHANNEL;
value &= ~VIDCH1CLK; value &= ~VIDCH1CLK;
} }
__raw_writel(value, vpif_vsclkdis_reg); __raw_writel(value, vpif_vidclkctl_reg);
spin_unlock_irqrestore(&vpif_reg_lock, flags); spin_unlock_irqrestore(&vpif_reg_lock, flags);
err = i2c_smbus_write_byte(cpld_client, val); err = i2c_smbus_write_byte(cpld_client, val);

View File

@ -161,7 +161,6 @@ static struct clk dsp_clk = {
.name = "dsp", .name = "dsp",
.parent = &pll1_sysclk1, .parent = &pll1_sysclk1,
.lpsc = DM646X_LPSC_C64X_CPU, .lpsc = DM646X_LPSC_C64X_CPU,
.flags = PSC_DSP,
.usecount = 1, /* REVISIT how to disable? */ .usecount = 1, /* REVISIT how to disable? */
}; };

View File

@ -233,7 +233,7 @@
#define PTCMD 0x120 #define PTCMD 0x120
#define PTSTAT 0x128 #define PTSTAT 0x128
#define PDSTAT 0x200 #define PDSTAT 0x200
#define PDCTL1 0x304 #define PDCTL 0x300
#define MDSTAT 0x800 #define MDSTAT 0x800
#define MDCTL 0xA00 #define MDCTL 0xA00
@ -244,7 +244,10 @@
#define PSC_STATE_ENABLE 3 #define PSC_STATE_ENABLE 3
#define MDSTAT_STATE_MASK 0x3f #define MDSTAT_STATE_MASK 0x3f
#define PDSTAT_STATE_MASK 0x1f
#define MDCTL_FORCE BIT(31) #define MDCTL_FORCE BIT(31)
#define PDCTL_NEXT BIT(1)
#define PDCTL_EPCGOOD BIT(8)
#ifndef __ASSEMBLER__ #ifndef __ASSEMBLER__

View File

@ -52,7 +52,7 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
void davinci_psc_config(unsigned int domain, unsigned int ctlr, void davinci_psc_config(unsigned int domain, unsigned int ctlr,
unsigned int id, bool enable, u32 flags) unsigned int id, bool enable, u32 flags)
{ {
u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl; u32 epcpr, ptcmd, ptstat, pdstat, pdctl, mdstat, mdctl;
void __iomem *psc_base; void __iomem *psc_base;
struct davinci_soc_info *soc_info = &davinci_soc_info; struct davinci_soc_info *soc_info = &davinci_soc_info;
u32 next_state = PSC_STATE_ENABLE; u32 next_state = PSC_STATE_ENABLE;
@ -79,11 +79,11 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
mdctl |= MDCTL_FORCE; mdctl |= MDCTL_FORCE;
__raw_writel(mdctl, psc_base + MDCTL + 4 * id); __raw_writel(mdctl, psc_base + MDCTL + 4 * id);
pdstat = __raw_readl(psc_base + PDSTAT); pdstat = __raw_readl(psc_base + PDSTAT + 4 * domain);
if ((pdstat & 0x00000001) == 0) { if ((pdstat & PDSTAT_STATE_MASK) == 0) {
pdctl1 = __raw_readl(psc_base + PDCTL1); pdctl = __raw_readl(psc_base + PDCTL + 4 * domain);
pdctl1 |= 0x1; pdctl |= PDCTL_NEXT;
__raw_writel(pdctl1, psc_base + PDCTL1); __raw_writel(pdctl, psc_base + PDCTL + 4 * domain);
ptcmd = 1 << domain; ptcmd = 1 << domain;
__raw_writel(ptcmd, psc_base + PTCMD); __raw_writel(ptcmd, psc_base + PTCMD);
@ -92,9 +92,9 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
epcpr = __raw_readl(psc_base + EPCPR); epcpr = __raw_readl(psc_base + EPCPR);
} while ((((epcpr >> domain) & 1) == 0)); } while ((((epcpr >> domain) & 1) == 0));
pdctl1 = __raw_readl(psc_base + PDCTL1); pdctl = __raw_readl(psc_base + PDCTL + 4 * domain);
pdctl1 |= 0x100; pdctl |= PDCTL_EPCGOOD;
__raw_writel(pdctl1, psc_base + PDCTL1); __raw_writel(pdctl, psc_base + PDCTL + 4 * domain);
} else { } else {
ptcmd = 1 << domain; ptcmd = 1 << domain;
__raw_writel(ptcmd, psc_base + PTCMD); __raw_writel(ptcmd, psc_base + PTCMD);

View File

@ -44,8 +44,6 @@ struct mct_clock_event_device {
char name[10]; char name[10];
}; };
static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
static void exynos4_mct_write(unsigned int value, void *addr) static void exynos4_mct_write(unsigned int value, void *addr)
{ {
void __iomem *stat_addr; void __iomem *stat_addr;
@ -264,6 +262,9 @@ static void exynos4_clockevent_init(void)
} }
#ifdef CONFIG_LOCAL_TIMERS #ifdef CONFIG_LOCAL_TIMERS
static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
/* Clock event handling */ /* Clock event handling */
static void exynos4_mct_tick_stop(struct mct_clock_event_device *mevt) static void exynos4_mct_tick_stop(struct mct_clock_event_device *mevt)
{ {
@ -428,9 +429,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)
void local_timer_stop(struct clock_event_device *evt) void local_timer_stop(struct clock_event_device *evt)
{ {
unsigned int cpu = smp_processor_id();
evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
if (mct_int_type == MCT_INT_SPI) if (mct_int_type == MCT_INT_SPI)
disable_irq(evt->irq); if (cpu == 0)
remove_irq(evt->irq, &mct_tick0_event_irq);
else
remove_irq(evt->irq, &mct_tick1_event_irq);
else else
disable_percpu_irq(IRQ_MCT_LOCALTIMER); disable_percpu_irq(IRQ_MCT_LOCALTIMER);
} }
@ -443,6 +448,7 @@ static void __init exynos4_timer_resources(void)
clk_rate = clk_get_rate(mct_clk); clk_rate = clk_get_rate(mct_clk);
#ifdef CONFIG_LOCAL_TIMERS
if (mct_int_type == MCT_INT_PPI) { if (mct_int_type == MCT_INT_PPI) {
int err; int err;
@ -452,6 +458,7 @@ static void __init exynos4_timer_resources(void)
WARN(err, "MCT: can't request IRQ %d (%d)\n", WARN(err, "MCT: can't request IRQ %d (%d)\n",
IRQ_MCT_LOCALTIMER, err); IRQ_MCT_LOCALTIMER, err);
} }
#endif /* CONFIG_LOCAL_TIMERS */
} }
static void __init exynos4_timer_init(void) static void __init exynos4_timer_init(void)

View File

@ -37,14 +37,15 @@ static void __init imx6q_map_io(void)
imx6q_clock_map_io(); imx6q_clock_map_io();
} }
static void __init imx6q_gpio_add_irq_domain(struct device_node *np, static int __init imx6q_gpio_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS - static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
32 * 7; /* imx6q gets 7 gpio ports */
gpio_irq_base -= 32;
irq_domain_add_simple(np, gpio_irq_base); irq_domain_add_simple(np, gpio_irq_base);
gpio_irq_base += 32;
return 0;
} }
static const struct of_device_id imx6q_irq_match[] __initconst = { static const struct of_device_id imx6q_irq_match[] __initconst = {

View File

@ -18,6 +18,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <linux/module.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/iommu.h> #include <mach/iommu.h>

View File

@ -362,7 +362,7 @@ static void __init mx51_babbage_init(void)
{ {
iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP; iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP;
iomux_v3_cfg_t power_key = NEW_PAD_CTRL(MX51_PAD_EIM_A27__GPIO2_21, iomux_v3_cfg_t power_key = NEW_PAD_CTRL(MX51_PAD_EIM_A27__GPIO2_21,
PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP); PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH);
imx51_soc_init(); imx51_soc_init();

View File

@ -106,7 +106,7 @@ static inline void mx53_evk_fec_reset(void)
gpio_set_value(MX53_EVK_FEC_PHY_RST, 1); gpio_set_value(MX53_EVK_FEC_PHY_RST, 1);
} }
static struct fec_platform_data mx53_evk_fec_pdata = { static const struct fec_platform_data mx53_evk_fec_pdata __initconst = {
.phy = PHY_INTERFACE_MODE_RMII, .phy = PHY_INTERFACE_MODE_RMII,
}; };

View File

@ -242,7 +242,7 @@ static inline void mx53_loco_fec_reset(void)
gpio_set_value(LOCO_FEC_PHY_RST, 1); gpio_set_value(LOCO_FEC_PHY_RST, 1);
} }
static struct fec_platform_data mx53_loco_fec_data = { static const struct fec_platform_data mx53_loco_fec_data __initconst = {
.phy = PHY_INTERFACE_MODE_RMII, .phy = PHY_INTERFACE_MODE_RMII,
}; };

View File

@ -104,7 +104,7 @@ static inline void mx53_smd_fec_reset(void)
gpio_set_value(SMD_FEC_PHY_RST, 1); gpio_set_value(SMD_FEC_PHY_RST, 1);
} }
static struct fec_platform_data mx53_smd_fec_data = { static const struct fec_platform_data mx53_smd_fec_data __initconst = {
.phy = PHY_INTERFACE_MODE_RMII, .phy = PHY_INTERFACE_MODE_RMII,
}; };

View File

@ -44,20 +44,22 @@ static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = {
{ /* sentinel */ } { /* sentinel */ }
}; };
static void __init imx51_tzic_add_irq_domain(struct device_node *np, static int __init imx51_tzic_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
irq_domain_add_simple(np, 0); irq_domain_add_simple(np, 0);
return 0;
} }
static void __init imx51_gpio_add_irq_domain(struct device_node *np, static int __init imx51_gpio_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS - static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
32 * 4; /* imx51 gets 4 gpio ports */
gpio_irq_base -= 32;
irq_domain_add_simple(np, gpio_irq_base); irq_domain_add_simple(np, gpio_irq_base);
gpio_irq_base += 32;
return 0;
} }
static const struct of_device_id imx51_irq_match[] __initconst = { static const struct of_device_id imx51_irq_match[] __initconst = {

View File

@ -48,20 +48,22 @@ static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = {
{ /* sentinel */ } { /* sentinel */ }
}; };
static void __init imx53_tzic_add_irq_domain(struct device_node *np, static int __init imx53_tzic_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
irq_domain_add_simple(np, 0); irq_domain_add_simple(np, 0);
return 0;
} }
static void __init imx53_gpio_add_irq_domain(struct device_node *np, static int __init imx53_gpio_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS - static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
32 * 7; /* imx53 gets 7 gpio ports */
gpio_irq_base -= 32;
irq_domain_add_simple(np, gpio_irq_base); irq_domain_add_simple(np, gpio_irq_base);
gpio_irq_base += 32;
return 0;
} }
static const struct of_device_id imx53_irq_match[] __initconst = { static const struct of_device_id imx53_irq_match[] __initconst = {

View File

@ -104,8 +104,8 @@
#define MX28_INT_CAN1 9 #define MX28_INT_CAN1 9
#define MX28_INT_LRADC_TOUCH 10 #define MX28_INT_LRADC_TOUCH 10
#define MX28_INT_HSADC 13 #define MX28_INT_HSADC 13
#define MX28_INT_IRADC_THRESH0 14 #define MX28_INT_LRADC_THRESH0 14
#define MX28_INT_IRADC_THRESH1 15 #define MX28_INT_LRADC_THRESH1 15
#define MX28_INT_LRADC_CH0 16 #define MX28_INT_LRADC_CH0 16
#define MX28_INT_LRADC_CH1 17 #define MX28_INT_LRADC_CH1 17
#define MX28_INT_LRADC_CH2 18 #define MX28_INT_LRADC_CH2 18

View File

@ -30,6 +30,7 @@
*/ */
#define cpu_is_mx23() ( \ #define cpu_is_mx23() ( \
machine_is_mx23evk() || \ machine_is_mx23evk() || \
machine_is_stmp378x() || \
0) 0)
#define cpu_is_mx28() ( \ #define cpu_is_mx28() ( \
machine_is_mx28evk() || \ machine_is_mx28evk() || \

View File

@ -361,6 +361,6 @@ static struct sys_timer m28evk_timer = {
MACHINE_START(M28EVK, "DENX M28 EVK") MACHINE_START(M28EVK, "DENX M28 EVK")
.map_io = mx28_map_io, .map_io = mx28_map_io,
.init_irq = mx28_init_irq, .init_irq = mx28_init_irq,
.init_machine = m28evk_init,
.timer = &m28evk_timer, .timer = &m28evk_timer,
.init_machine = m28evk_init,
MACHINE_END MACHINE_END

View File

@ -115,6 +115,6 @@ static struct sys_timer stmp378x_dvb_timer = {
MACHINE_START(STMP378X, "STMP378X") MACHINE_START(STMP378X, "STMP378X")
.map_io = mx23_map_io, .map_io = mx23_map_io,
.init_irq = mx23_init_irq, .init_irq = mx23_init_irq,
.init_machine = stmp378x_dvb_init,
.timer = &stmp378x_dvb_timer, .timer = &stmp378x_dvb_timer,
.init_machine = stmp378x_dvb_init,
MACHINE_END MACHINE_END

View File

@ -66,11 +66,11 @@ static const iomux_cfg_t tx28_fec1_pads[] __initconst = {
MX28_PAD_ENET0_CRS__ENET1_RX_EN, MX28_PAD_ENET0_CRS__ENET1_RX_EN,
}; };
static struct fec_platform_data tx28_fec0_data = { static const struct fec_platform_data tx28_fec0_data __initconst = {
.phy = PHY_INTERFACE_MODE_RMII, .phy = PHY_INTERFACE_MODE_RMII,
}; };
static struct fec_platform_data tx28_fec1_data = { static const struct fec_platform_data tx28_fec1_data __initconst = {
.phy = PHY_INTERFACE_MODE_RMII, .phy = PHY_INTERFACE_MODE_RMII,
}; };

View File

@ -16,6 +16,8 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/io.h> #include <linux/io.h>
#include <asm/mach-types.h> /* for machine_is_* */ #include <asm/mach-types.h> /* for machine_is_* */
@ -927,16 +929,22 @@ int __init omap1_clk_init(void)
void __init omap1_clk_late_init(void) void __init omap1_clk_late_init(void)
{ {
if (ck_dpll1.rate >= OMAP1_DPLL1_SANE_VALUE) unsigned long rate = ck_dpll1.rate;
if (rate >= OMAP1_DPLL1_SANE_VALUE)
return; return;
/* System booting at unusable rate, force reprogramming of DPLL1 */
ck_dpll1_p->rate = 0;
/* Find the highest supported frequency and enable it */ /* Find the highest supported frequency and enable it */
if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) { if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
pr_err("System frequencies not set, using default. Check your config.\n"); pr_err("System frequencies not set, using default. Check your config.\n");
omap_writew(0x2290, DPLL_CTL); omap_writew(0x2290, DPLL_CTL);
omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL); omap_writew(cpu_is_omap7xx() ? 0x2005 : 0x0005, ARM_CKCTL);
ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE; ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE;
} }
propagate_rate(&ck_dpll1); propagate_rate(&ck_dpll1);
omap1_show_rates(); omap1_show_rates();
loops_per_jiffy = cpufreq_scale(loops_per_jiffy, rate, ck_dpll1.rate);
} }

View File

@ -193,7 +193,7 @@ static struct platform_device rx51_charger_device = {
static void __init rx51_charger_init(void) static void __init rx51_charger_init(void)
{ {
WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO, WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO,
GPIOF_OUT_INIT_LOW, "isp1704_reset")); GPIOF_OUT_INIT_HIGH, "isp1704_reset"));
platform_device_register(&rx51_charger_device); platform_device_register(&rx51_charger_device);
} }

View File

@ -145,6 +145,9 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
pdata->reg_size = 4; pdata->reg_size = 4;
pdata->has_ccr = true; pdata->has_ccr = true;
} }
pdata->set_clk_src = omap2_mcbsp_set_clk_src;
if (id == 1)
pdata->mux_signal = omap2_mcbsp1_mux_rx_clk;
if (oh->class->rev == MCBSP_CONFIG_TYPE3) { if (oh->class->rev == MCBSP_CONFIG_TYPE3) {
if (id == 2) if (id == 2)
@ -174,9 +177,6 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
name, oh->name); name, oh->name);
return PTR_ERR(pdev); return PTR_ERR(pdev);
} }
pdata->set_clk_src = omap2_mcbsp_set_clk_src;
if (id == 1)
pdata->mux_signal = omap2_mcbsp1_mux_rx_clk;
omap_mcbsp_count++; omap_mcbsp_count++;
return 0; return 0;
} }

View File

@ -9,6 +9,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_device.h> #include <linux/of_device.h>

View File

@ -8,6 +8,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/sizes.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <linux/of.h> #include <linux/of.h>

View File

@ -10,6 +10,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/export.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h> #include <linux/gpio.h>

View File

@ -70,7 +70,7 @@ void __init s3c6400_init_irq(void)
s3c64xx_init_irq(~0 & ~(0xf << 5), ~0); s3c64xx_init_irq(~0 & ~(0xf << 5), ~0);
} }
struct sysdev_class s3c6400_sysclass = { static struct sysdev_class s3c6400_sysclass = {
.name = "s3c6400-core", .name = "s3c6400-core",
}; };

View File

@ -20,7 +20,7 @@
#include <plat/fb.h> #include <plat/fb.h>
#include <plat/gpio-cfg.h> #include <plat/gpio-cfg.h>
extern void s3c64xx_fb_gpio_setup_24bpp(void) void s3c64xx_fb_gpio_setup_24bpp(void)
{ {
s3c_gpio_cfgrange_nopull(S3C64XX_GPI(0), 16, S3C_GPIO_SFN(2)); s3c_gpio_cfgrange_nopull(S3C64XX_GPI(0), 16, S3C_GPIO_SFN(2));
s3c_gpio_cfgrange_nopull(S3C64XX_GPJ(0), 12, S3C_GPIO_SFN(2)); s3c_gpio_cfgrange_nopull(S3C64XX_GPJ(0), 12, S3C_GPIO_SFN(2));

View File

@ -273,6 +273,7 @@ static struct samsung_bl_gpio_info smdkv210_bl_gpio_info = {
static struct platform_pwm_backlight_data smdkv210_bl_data = { static struct platform_pwm_backlight_data smdkv210_bl_data = {
.pwm_id = 3, .pwm_id = 3,
.pwm_period_ns = 1000,
}; };
static void __init smdkv210_map_io(void) static void __init smdkv210_map_io(void)

View File

@ -1,5 +1,5 @@
ifeq ($(CONFIG_ARCH_SA1100),y) ifeq ($(CONFIG_SA1111),y)
zreladdr-$(CONFIG_SA1111) += 0xc0208000 zreladdr-y += 0xc0208000
else else
zreladdr-y += 0xc0008000 zreladdr-y += 0xc0008000
endif endif

View File

@ -17,6 +17,7 @@
* the CPU clock speed on the fly. * the CPU clock speed on the fly.
*/ */
#include <linux/module.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>

View File

@ -32,6 +32,9 @@
#define MX3_PWMSAR 0x0C /* PWM Sample Register */ #define MX3_PWMSAR 0x0C /* PWM Sample Register */
#define MX3_PWMPR 0x10 /* PWM Period Register */ #define MX3_PWMPR 0x10 /* PWM Period Register */
#define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4) #define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4)
#define MX3_PWMCR_DOZEEN (1 << 24)
#define MX3_PWMCR_WAITEN (1 << 23)
#define MX3_PWMCR_DBGEN (1 << 22)
#define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16)
#define MX3_PWMCR_CLKSRC_IPG (1 << 16) #define MX3_PWMCR_CLKSRC_IPG (1 << 16)
#define MX3_PWMCR_EN (1 << 0) #define MX3_PWMCR_EN (1 << 0)
@ -77,7 +80,9 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR);
writel(period_cycles, pwm->mmio_base + MX3_PWMPR); writel(period_cycles, pwm->mmio_base + MX3_PWMPR);
cr = MX3_PWMCR_PRESCALER(prescale) | MX3_PWMCR_EN; cr = MX3_PWMCR_PRESCALER(prescale) |
MX3_PWMCR_DOZEEN | MX3_PWMCR_WAITEN |
MX3_PWMCR_DBGEN | MX3_PWMCR_EN;
if (cpu_is_mx25()) if (cpu_is_mx25())
cr |= MX3_PWMCR_CLKSRC_IPG; cr |= MX3_PWMCR_CLKSRC_IPG;

View File

@ -15,7 +15,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/slab.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/gpio-cfg.h> #include <plat/gpio-cfg.h>

View File

@ -350,10 +350,12 @@
#define __NR_clock_adjtime 342 #define __NR_clock_adjtime 342
#define __NR_syncfs 343 #define __NR_syncfs 343
#define __NR_setns 344 #define __NR_setns 344
#define __NR_process_vm_readv 345
#define __NR_process_vm_writev 346
#ifdef __KERNEL__ #ifdef __KERNEL__
#define NR_syscalls 345 #define NR_syscalls 347
#define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_IPC_PARSE_VERSION
#define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_READDIR

View File

@ -365,4 +365,6 @@ ENTRY(sys_call_table)
.long sys_clock_adjtime .long sys_clock_adjtime
.long sys_syncfs .long sys_syncfs
.long sys_setns .long sys_setns
.long sys_process_vm_readv /* 345 */
.long sys_process_vm_writev

View File

@ -623,7 +623,7 @@ static int mipspmu_event_init(struct perf_event *event)
if (!atomic_inc_not_zero(&active_events)) { if (!atomic_inc_not_zero(&active_events)) {
if (atomic_read(&active_events) > MIPS_MAX_HWEVENTS) { if (atomic_read(&active_events) > MIPS_MAX_HWEVENTS) {
atomic_dec(&active_events); atomic_dec(&active_events);
return -ENOSPC; return -EINVAL;
} }
mutex_lock(&pmu_reserve_mutex); mutex_lock(&pmu_reserve_mutex);
@ -732,15 +732,15 @@ static int validate_group(struct perf_event *event)
memset(&fake_cpuc, 0, sizeof(fake_cpuc)); memset(&fake_cpuc, 0, sizeof(fake_cpuc));
if (!validate_event(&fake_cpuc, leader)) if (!validate_event(&fake_cpuc, leader))
return -ENOSPC; return -EINVAL;
list_for_each_entry(sibling, &leader->sibling_list, group_entry) { list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
if (!validate_event(&fake_cpuc, sibling)) if (!validate_event(&fake_cpuc, sibling))
return -ENOSPC; return -EINVAL;
} }
if (!validate_event(&fake_cpuc, event)) if (!validate_event(&fake_cpuc, event))
return -ENOSPC; return -EINVAL;
return 0; return 0;
} }

View File

@ -599,10 +599,10 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
skey = page_get_storage_key(address); skey = page_get_storage_key(address);
bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
/* Clear page changed & referenced bit in the storage key */ /* Clear page changed & referenced bit in the storage key */
if (bits) { if (bits & _PAGE_CHANGED)
skey ^= bits; page_set_storage_key(address, skey ^ bits, 1);
page_set_storage_key(address, skey, 1); else if (bits)
} page_reset_referenced(address);
/* Transfer page changed & referenced bit to guest bits in pgste */ /* Transfer page changed & referenced bit to guest bits in pgste */
pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */ pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */
/* Get host changed & referenced bits from pgste */ /* Get host changed & referenced bits from pgste */

View File

@ -296,13 +296,6 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)))) ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA))))
/* Invalid psw mask. */ /* Invalid psw mask. */
return -EINVAL; return -EINVAL;
if (addr == (addr_t) &dummy->regs.psw.addr)
/*
* The debugger changed the instruction address,
* reset system call restart, see signal.c:do_signal
*/
task_thread_info(child)->system_call = 0;
*(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
} else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) { } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) {
@ -614,11 +607,6 @@ static int __poke_user_compat(struct task_struct *child,
/* Transfer 31 bit amode bit to psw mask. */ /* Transfer 31 bit amode bit to psw mask. */
regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) |
(__u64)(tmp & PSW32_ADDR_AMODE); (__u64)(tmp & PSW32_ADDR_AMODE);
/*
* The debugger changed the instruction address,
* reset system call restart, see signal.c:do_signal
*/
task_thread_info(child)->system_call = 0;
} else { } else {
/* gpr 0-15 */ /* gpr 0-15 */
*(__u32*)((addr_t) &regs->psw + addr*2 + 4) = tmp; *(__u32*)((addr_t) &regs->psw + addr*2 + 4) = tmp;
@ -905,6 +893,14 @@ static int s390_last_break_get(struct task_struct *target,
return 0; return 0;
} }
static int s390_last_break_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
return 0;
}
#endif #endif
static int s390_system_call_get(struct task_struct *target, static int s390_system_call_get(struct task_struct *target,
@ -951,6 +947,7 @@ static const struct user_regset s390_regsets[] = {
.size = sizeof(long), .size = sizeof(long),
.align = sizeof(long), .align = sizeof(long),
.get = s390_last_break_get, .get = s390_last_break_get,
.set = s390_last_break_set,
}, },
#endif #endif
[REGSET_SYSTEM_CALL] = { [REGSET_SYSTEM_CALL] = {
@ -1116,6 +1113,14 @@ static int s390_compat_last_break_get(struct task_struct *target,
return 0; return 0;
} }
static int s390_compat_last_break_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
return 0;
}
static const struct user_regset s390_compat_regsets[] = { static const struct user_regset s390_compat_regsets[] = {
[REGSET_GENERAL] = { [REGSET_GENERAL] = {
.core_note_type = NT_PRSTATUS, .core_note_type = NT_PRSTATUS,
@ -1139,6 +1144,7 @@ static const struct user_regset s390_compat_regsets[] = {
.size = sizeof(long), .size = sizeof(long),
.align = sizeof(long), .align = sizeof(long),
.get = s390_compat_last_break_get, .get = s390_compat_last_break_get,
.set = s390_compat_last_break_set,
}, },
[REGSET_SYSTEM_CALL] = { [REGSET_SYSTEM_CALL] = {
.core_note_type = NT_S390_SYSTEM_CALL, .core_note_type = NT_S390_SYSTEM_CALL,

View File

@ -579,7 +579,7 @@ static unsigned long __init find_crash_base(unsigned long crash_size,
*msg = "first memory chunk must be at least crashkernel size"; *msg = "first memory chunk must be at least crashkernel size";
return 0; return 0;
} }
if (is_kdump_kernel() && (crash_size == OLDMEM_SIZE)) if (OLDMEM_BASE && crash_size == OLDMEM_SIZE)
return OLDMEM_BASE; return OLDMEM_BASE;
for (i = MEMORY_CHUNKS - 1; i >= 0; i--) { for (i = MEMORY_CHUNKS - 1; i >= 0; i--) {

View File

@ -460,9 +460,9 @@ void do_signal(struct pt_regs *regs)
regs->svc_code >> 16); regs->svc_code >> 16);
break; break;
} }
/* No longer in a system call */
clear_thread_flag(TIF_SYSCALL);
} }
/* No longer in a system call */
clear_thread_flag(TIF_SYSCALL);
if ((is_compat_task() ? if ((is_compat_task() ?
handle_signal32(signr, &ka, &info, oldset, regs) : handle_signal32(signr, &ka, &info, oldset, regs) :
@ -486,6 +486,7 @@ void do_signal(struct pt_regs *regs)
} }
/* No handlers present - check for system call restart */ /* No handlers present - check for system call restart */
clear_thread_flag(TIF_SYSCALL);
if (current_thread_info()->system_call) { if (current_thread_info()->system_call) {
regs->svc_code = current_thread_info()->system_call; regs->svc_code = current_thread_info()->system_call;
switch (regs->gprs[2]) { switch (regs->gprs[2]) {
@ -500,9 +501,6 @@ void do_signal(struct pt_regs *regs)
regs->gprs[2] = regs->orig_gpr2; regs->gprs[2] = regs->orig_gpr2;
set_thread_flag(TIF_SYSCALL); set_thread_flag(TIF_SYSCALL);
break; break;
default:
clear_thread_flag(TIF_SYSCALL);
break;
} }
} }

View File

@ -1181,13 +1181,11 @@ static int __devinit ds_probe(struct vio_dev *vdev,
dp->rcv_buf_len = 4096; dp->rcv_buf_len = 4096;
dp->ds_states = kzalloc(sizeof(ds_states_template), dp->ds_states = kmemdup(ds_states_template,
GFP_KERNEL); sizeof(ds_states_template), GFP_KERNEL);
if (!dp->ds_states) if (!dp->ds_states)
goto out_free_rcv_buf; goto out_free_rcv_buf;
memcpy(dp->ds_states, ds_states_template,
sizeof(ds_states_template));
dp->num_ds_states = ARRAY_SIZE(ds_states_template); dp->num_ds_states = ARRAY_SIZE(ds_states_template);
for (i = 0; i < dp->num_ds_states; i++) for (i = 0; i < dp->num_ds_states; i++)

View File

@ -58,12 +58,10 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len
void *new_val; void *new_val;
int err; int err;
new_val = kmalloc(len, GFP_KERNEL); new_val = kmemdup(val, len, GFP_KERNEL);
if (!new_val) if (!new_val)
return -ENOMEM; return -ENOMEM;
memcpy(new_val, val, len);
err = -ENODEV; err = -ENODEV;
mutex_lock(&of_set_property_mutex); mutex_lock(&of_set_property_mutex);

View File

@ -302,8 +302,7 @@ void __init btfixup(void)
case 'i': /* INT */ case 'i': /* INT */
if ((insn & 0xc1c00000) == 0x01000000) /* %HI */ if ((insn & 0xc1c00000) == 0x01000000) /* %HI */
set_addr(addr, q[1], fmangled, (insn & 0xffc00000) | (p[1] >> 10)); set_addr(addr, q[1], fmangled, (insn & 0xffc00000) | (p[1] >> 10));
else if ((insn & 0x80002000) == 0x80002000 && else if ((insn & 0x80002000) == 0x80002000) /* %LO */
(insn & 0x01800000) != 0x01800000) /* %LO */
set_addr(addr, q[1], fmangled, (insn & 0xffffe000) | (p[1] & 0x3ff)); set_addr(addr, q[1], fmangled, (insn & 0xffffe000) | (p[1] & 0x3ff));
else { else {
prom_printf(insn_i, p, addr, insn); prom_printf(insn_i, p, addr, insn);

View File

@ -74,16 +74,6 @@ enum {
*/ */
void tile_irq_activate(unsigned int irq, int tile_irq_type); void tile_irq_activate(unsigned int irq, int tile_irq_type);
/*
* For onboard, non-PCI (e.g. TILE_IRQ_PERCPU) devices, drivers know
* how to use enable/disable_percpu_irq() to manage interrupts on each
* core. We can't use the generic enable/disable_irq() because they
* use a single reference count per irq, rather than per cpu per irq.
*/
void enable_percpu_irq(unsigned int irq);
void disable_percpu_irq(unsigned int irq);
void setup_irq_regs(void); void setup_irq_regs(void);
#endif /* _ASM_TILE_IRQ_H */ #endif /* _ASM_TILE_IRQ_H */

View File

@ -152,14 +152,13 @@ void tile_dev_intr(struct pt_regs *regs, int intnum)
* Remove an irq from the disabled mask. If we're in an interrupt * Remove an irq from the disabled mask. If we're in an interrupt
* context, defer enabling the HW interrupt until we leave. * context, defer enabling the HW interrupt until we leave.
*/ */
void enable_percpu_irq(unsigned int irq) static void tile_irq_chip_enable(struct irq_data *d)
{ {
get_cpu_var(irq_disable_mask) &= ~(1UL << irq); get_cpu_var(irq_disable_mask) &= ~(1UL << d->irq);
if (__get_cpu_var(irq_depth) == 0) if (__get_cpu_var(irq_depth) == 0)
unmask_irqs(1UL << irq); unmask_irqs(1UL << d->irq);
put_cpu_var(irq_disable_mask); put_cpu_var(irq_disable_mask);
} }
EXPORT_SYMBOL(enable_percpu_irq);
/* /*
* Add an irq to the disabled mask. We disable the HW interrupt * Add an irq to the disabled mask. We disable the HW interrupt
@ -167,13 +166,12 @@ EXPORT_SYMBOL(enable_percpu_irq);
* in an interrupt context, the return path is careful to avoid * in an interrupt context, the return path is careful to avoid
* unmasking a newly disabled interrupt. * unmasking a newly disabled interrupt.
*/ */
void disable_percpu_irq(unsigned int irq) static void tile_irq_chip_disable(struct irq_data *d)
{ {
get_cpu_var(irq_disable_mask) |= (1UL << irq); get_cpu_var(irq_disable_mask) |= (1UL << d->irq);
mask_irqs(1UL << irq); mask_irqs(1UL << d->irq);
put_cpu_var(irq_disable_mask); put_cpu_var(irq_disable_mask);
} }
EXPORT_SYMBOL(disable_percpu_irq);
/* Mask an interrupt. */ /* Mask an interrupt. */
static void tile_irq_chip_mask(struct irq_data *d) static void tile_irq_chip_mask(struct irq_data *d)
@ -209,6 +207,8 @@ static void tile_irq_chip_eoi(struct irq_data *d)
static struct irq_chip tile_irq_chip = { static struct irq_chip tile_irq_chip = {
.name = "tile_irq_chip", .name = "tile_irq_chip",
.irq_enable = tile_irq_chip_enable,
.irq_disable = tile_irq_chip_disable,
.irq_ack = tile_irq_chip_ack, .irq_ack = tile_irq_chip_ack,
.irq_eoi = tile_irq_chip_eoi, .irq_eoi = tile_irq_chip_eoi,
.irq_mask = tile_irq_chip_mask, .irq_mask = tile_irq_chip_mask,

View File

@ -15,6 +15,7 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/export.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/homecache.h> #include <asm/homecache.h>

View File

@ -24,6 +24,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/export.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/sections.h> #include <asm/sections.h>

View File

@ -18,6 +18,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/stat.h>
#include <hv/hypervisor.h> #include <hv/hypervisor.h>
/* Return a string queried from the hypervisor, truncated to page size. */ /* Return a string queried from the hypervisor, truncated to page size. */

View File

@ -39,6 +39,9 @@ EXPORT_SYMBOL(finv_user_asm);
EXPORT_SYMBOL(current_text_addr); EXPORT_SYMBOL(current_text_addr);
EXPORT_SYMBOL(dump_stack); EXPORT_SYMBOL(dump_stack);
/* arch/tile/kernel/head.S */
EXPORT_SYMBOL(empty_zero_page);
/* arch/tile/lib/, various memcpy files */ /* arch/tile/lib/, various memcpy files */
EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memcpy);
EXPORT_SYMBOL(__copy_to_user_inatomic); EXPORT_SYMBOL(__copy_to_user_inatomic);

View File

@ -449,9 +449,12 @@ void homecache_free_pages(unsigned long addr, unsigned int order)
VM_BUG_ON(!virt_addr_valid((void *)addr)); VM_BUG_ON(!virt_addr_valid((void *)addr));
page = virt_to_page((void *)addr); page = virt_to_page((void *)addr);
if (put_page_testzero(page)) { if (put_page_testzero(page)) {
int pages = (1 << order);
homecache_change_page_home(page, order, initial_page_home()); homecache_change_page_home(page, order, initial_page_home());
while (pages--) if (order == 0) {
__free_page(page++); free_hot_cold_page(page, 0);
} else {
init_page_count(page);
__free_pages(page, order);
}
} }
} }

View File

@ -390,7 +390,7 @@ config X86_INTEL_CE
This option compiles in support for the CE4100 SOC for settop This option compiles in support for the CE4100 SOC for settop
boxes and media devices. boxes and media devices.
config X86_INTEL_MID config X86_WANT_INTEL_MID
bool "Intel MID platform support" bool "Intel MID platform support"
depends on X86_32 depends on X86_32
depends on X86_EXTENDED_PLATFORM depends on X86_EXTENDED_PLATFORM
@ -399,7 +399,10 @@ config X86_INTEL_MID
systems which do not have the PCI legacy interfaces (Moorestown, systems which do not have the PCI legacy interfaces (Moorestown,
Medfield). If you are building for a PC class system say N here. Medfield). If you are building for a PC class system say N here.
if X86_INTEL_MID if X86_WANT_INTEL_MID
config X86_INTEL_MID
bool
config X86_MRST config X86_MRST
bool "Moorestown MID platform" bool "Moorestown MID platform"
@ -411,6 +414,7 @@ config X86_MRST
select SPI select SPI
select INTEL_SCU_IPC select INTEL_SCU_IPC
select X86_PLATFORM_DEVICES select X86_PLATFORM_DEVICES
select X86_INTEL_MID
---help--- ---help---
Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin
Internet Device(MID) platform. Moorestown consists of two chips: Internet Device(MID) platform. Moorestown consists of two chips:

View File

@ -3,11 +3,15 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#define IPCMSG_VRTC 0xFA /* Set vRTC device */ #define IPCMSG_WARM_RESET 0xF0
#define IPCMSG_COLD_RESET 0xF1
#define IPCMSG_SOFT_RESET 0xF2
#define IPCMSG_COLD_BOOT 0xF3
/* Command id associated with message IPCMSG_VRTC */ #define IPCMSG_VRTC 0xFA /* Set vRTC device */
#define IPC_CMD_VRTC_SETTIME 1 /* Set time */ /* Command id associated with message IPCMSG_VRTC */
#define IPC_CMD_VRTC_SETALARM 2 /* Set alarm */ #define IPC_CMD_VRTC_SETTIME 1 /* Set time */
#define IPC_CMD_VRTC_SETALARM 2 /* Set alarm */
/* Read single register */ /* Read single register */
int intel_scu_ipc_ioread8(u16 addr, u8 *data); int intel_scu_ipc_ioread8(u16 addr, u8 *data);

View File

@ -31,11 +31,20 @@ enum mrst_cpu_type {
}; };
extern enum mrst_cpu_type __mrst_cpu_chip; extern enum mrst_cpu_type __mrst_cpu_chip;
#ifdef CONFIG_X86_INTEL_MID
static inline enum mrst_cpu_type mrst_identify_cpu(void) static inline enum mrst_cpu_type mrst_identify_cpu(void)
{ {
return __mrst_cpu_chip; return __mrst_cpu_chip;
} }
#else /* !CONFIG_X86_INTEL_MID */
#define mrst_identify_cpu() (0)
#endif /* !CONFIG_X86_INTEL_MID */
enum mrst_timer_options { enum mrst_timer_options {
MRST_TIMER_DEFAULT, MRST_TIMER_DEFAULT,
MRST_TIMER_APBT_ONLY, MRST_TIMER_APBT_ONLY,

View File

@ -169,7 +169,14 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
return native_write_msr_safe(msr, low, high); return native_write_msr_safe(msr, low, high);
} }
/* rdmsr with exception handling */ /*
* rdmsr with exception handling.
*
* Please note that the exception handling works only after we've
* switched to the "smart" #GP handler in trap_init() which knows about
* exception tables - using this macro earlier than that causes machine
* hangs on boxes which do not implement the @msr in the first argument.
*/
#define rdmsr_safe(msr, p1, p2) \ #define rdmsr_safe(msr, p1, p2) \
({ \ ({ \
int __err; \ int __err; \

View File

@ -32,6 +32,22 @@ extern int no_timer_check;
* (mathieu.desnoyers@polymtl.ca) * (mathieu.desnoyers@polymtl.ca)
* *
* -johnstul@us.ibm.com "math is hard, lets go shopping!" * -johnstul@us.ibm.com "math is hard, lets go shopping!"
*
* In:
*
* ns = cycles * cyc2ns_scale / SC
*
* Although we may still have enough bits to store the value of ns,
* in some cases, we may not have enough bits to store cycles * cyc2ns_scale,
* leading to an incorrect result.
*
* To avoid this, we can decompose 'cycles' into quotient and remainder
* of division by SC. Then,
*
* ns = (quot * SC + rem) * cyc2ns_scale / SC
* = quot * cyc2ns_scale + (rem * cyc2ns_scale) / SC
*
* - sqazi@google.com
*/ */
DECLARE_PER_CPU(unsigned long, cyc2ns); DECLARE_PER_CPU(unsigned long, cyc2ns);
@ -41,9 +57,14 @@ DECLARE_PER_CPU(unsigned long long, cyc2ns_offset);
static inline unsigned long long __cycles_2_ns(unsigned long long cyc) static inline unsigned long long __cycles_2_ns(unsigned long long cyc)
{ {
unsigned long long quot;
unsigned long long rem;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
unsigned long long ns = per_cpu(cyc2ns_offset, cpu); unsigned long long ns = per_cpu(cyc2ns_offset, cpu);
ns += cyc * per_cpu(cyc2ns, cpu) >> CYC2NS_SCALE_FACTOR; quot = (cyc >> CYC2NS_SCALE_FACTOR);
rem = cyc & ((1ULL << CYC2NS_SCALE_FACTOR) - 1);
ns += quot * per_cpu(cyc2ns, cpu) +
((rem * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR);
return ns; return ns;
} }

View File

@ -57,6 +57,7 @@
#define UV1_HUB_PART_NUMBER 0x88a5 #define UV1_HUB_PART_NUMBER 0x88a5
#define UV2_HUB_PART_NUMBER 0x8eb8 #define UV2_HUB_PART_NUMBER 0x8eb8
#define UV2_HUB_PART_NUMBER_X 0x1111
/* Compat: if this #define is present, UV headers support UV2 */ /* Compat: if this #define is present, UV headers support UV2 */
#define UV2_HUB_IS_SUPPORTED 1 #define UV2_HUB_IS_SUPPORTED 1

View File

@ -93,6 +93,8 @@ static int __init early_get_pnodeid(void)
if (node_id.s.part_number == UV2_HUB_PART_NUMBER) if (node_id.s.part_number == UV2_HUB_PART_NUMBER)
uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1;
if (node_id.s.part_number == UV2_HUB_PART_NUMBER_X)
uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1;
uv_hub_info->hub_revision = uv_min_hub_revision_id; uv_hub_info->hub_revision = uv_min_hub_revision_id;
pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1);

View File

@ -547,6 +547,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
if (tmp != mask_lo) { if (tmp != mask_lo) {
printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n"); printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n");
add_taint(TAINT_FIRMWARE_WORKAROUND);
mask_lo = tmp; mask_lo = tmp;
} }
} }
@ -693,6 +694,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock)
/* Disable MTRRs, and set the default type to uncached */ /* Disable MTRRs, and set the default type to uncached */
mtrr_wrmsr(MSR_MTRRdefType, deftype_lo & ~0xcff, deftype_hi); mtrr_wrmsr(MSR_MTRRdefType, deftype_lo & ~0xcff, deftype_hi);
wbinvd();
} }
static void post_set(void) __releases(set_atomicity_lock) static void post_set(void) __releases(set_atomicity_lock)

View File

@ -312,12 +312,8 @@ int x86_setup_perfctr(struct perf_event *event)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
/*
* Do not allow config1 (extended registers) to propagate,
* there's no sane user-space generalization yet:
*/
if (attr->type == PERF_TYPE_RAW) if (attr->type == PERF_TYPE_RAW)
return 0; return x86_pmu_extra_regs(event->attr.config, event);
if (attr->type == PERF_TYPE_HW_CACHE) if (attr->type == PERF_TYPE_HW_CACHE)
return set_ext_hw_attr(hwc, event); return set_ext_hw_attr(hwc, event);
@ -588,7 +584,7 @@ done:
x86_pmu.put_event_constraints(cpuc, cpuc->event_list[i]); x86_pmu.put_event_constraints(cpuc, cpuc->event_list[i]);
} }
} }
return num ? -ENOSPC : 0; return num ? -EINVAL : 0;
} }
/* /*
@ -607,7 +603,7 @@ static int collect_events(struct cpu_hw_events *cpuc, struct perf_event *leader,
if (is_x86_event(leader)) { if (is_x86_event(leader)) {
if (n >= max_count) if (n >= max_count)
return -ENOSPC; return -EINVAL;
cpuc->event_list[n] = leader; cpuc->event_list[n] = leader;
n++; n++;
} }
@ -620,7 +616,7 @@ static int collect_events(struct cpu_hw_events *cpuc, struct perf_event *leader,
continue; continue;
if (n >= max_count) if (n >= max_count)
return -ENOSPC; return -EINVAL;
cpuc->event_list[n] = event; cpuc->event_list[n] = event;
n++; n++;
@ -1316,7 +1312,7 @@ static int validate_event(struct perf_event *event)
c = x86_pmu.get_event_constraints(fake_cpuc, event); c = x86_pmu.get_event_constraints(fake_cpuc, event);
if (!c || !c->weight) if (!c || !c->weight)
ret = -ENOSPC; ret = -EINVAL;
if (x86_pmu.put_event_constraints) if (x86_pmu.put_event_constraints)
x86_pmu.put_event_constraints(fake_cpuc, event); x86_pmu.put_event_constraints(fake_cpuc, event);
@ -1341,7 +1337,7 @@ static int validate_group(struct perf_event *event)
{ {
struct perf_event *leader = event->group_leader; struct perf_event *leader = event->group_leader;
struct cpu_hw_events *fake_cpuc; struct cpu_hw_events *fake_cpuc;
int ret = -ENOSPC, n; int ret = -EINVAL, n;
fake_cpuc = allocate_fake_cpuc(); fake_cpuc = allocate_fake_cpuc();
if (IS_ERR(fake_cpuc)) if (IS_ERR(fake_cpuc))

View File

@ -199,8 +199,7 @@ static int force_ibs_eilvt_setup(void)
goto out; goto out;
} }
pr_err(FW_BUG "using offset %d for IBS interrupts\n", offset); pr_info("IBS: LVT offset %d assigned\n", offset);
pr_err(FW_BUG "workaround enabled for IBS LVT offset\n");
return 0; return 0;
out: out:
@ -265,19 +264,23 @@ perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *h
static __init int amd_ibs_init(void) static __init int amd_ibs_init(void)
{ {
u32 caps; u32 caps;
int ret; int ret = -EINVAL;
caps = __get_ibs_caps(); caps = __get_ibs_caps();
if (!caps) if (!caps)
return -ENODEV; /* ibs not supported by the cpu */ return -ENODEV; /* ibs not supported by the cpu */
if (!ibs_eilvt_valid()) { /*
ret = force_ibs_eilvt_setup(); * Force LVT offset assignment for family 10h: The offsets are
if (ret) { * not assigned by the BIOS for this family, so the OS is
pr_err("Failed to setup IBS, %d\n", ret); * responsible for doing it. If the OS assignment fails, fall
return ret; * back to BIOS settings and try to setup this.
} */
} if (boot_cpu_data.x86 == 0x10)
force_ibs_eilvt_setup();
if (!ibs_eilvt_valid())
goto out;
get_online_cpus(); get_online_cpus();
ibs_caps = caps; ibs_caps = caps;
@ -287,7 +290,11 @@ static __init int amd_ibs_init(void)
smp_call_function(setup_APIC_ibs, NULL, 1); smp_call_function(setup_APIC_ibs, NULL, 1);
put_online_cpus(); put_online_cpus();
return perf_event_ibs_init(); ret = perf_event_ibs_init();
out:
if (ret)
pr_err("Failed to setup IBS, %d\n", ret);
return ret;
} }
/* Since we need the pci subsystem to init ibs we can't do this earlier: */ /* Since we need the pci subsystem to init ibs we can't do this earlier: */

View File

@ -1545,6 +1545,13 @@ static void intel_clovertown_quirks(void)
x86_pmu.pebs_constraints = NULL; x86_pmu.pebs_constraints = NULL;
} }
static void intel_sandybridge_quirks(void)
{
printk(KERN_WARNING "PEBS disabled due to CPU errata.\n");
x86_pmu.pebs = 0;
x86_pmu.pebs_constraints = NULL;
}
__init int intel_pmu_init(void) __init int intel_pmu_init(void)
{ {
union cpuid10_edx edx; union cpuid10_edx edx;
@ -1694,6 +1701,7 @@ __init int intel_pmu_init(void)
break; break;
case 42: /* SandyBridge */ case 42: /* SandyBridge */
x86_pmu.quirks = intel_sandybridge_quirks;
case 45: /* SandyBridge, "Romely-EP" */ case 45: /* SandyBridge, "Romely-EP" */
memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, memcpy(hw_cache_event_ids, snb_hw_cache_event_ids,
sizeof(hw_cache_event_ids)); sizeof(hw_cache_event_ids));

View File

@ -493,6 +493,7 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
unsigned long from = cpuc->lbr_entries[0].from; unsigned long from = cpuc->lbr_entries[0].from;
unsigned long old_to, to = cpuc->lbr_entries[0].to; unsigned long old_to, to = cpuc->lbr_entries[0].to;
unsigned long ip = regs->ip; unsigned long ip = regs->ip;
int is_64bit = 0;
/* /*
* We don't need to fixup if the PEBS assist is fault like * We don't need to fixup if the PEBS assist is fault like
@ -544,7 +545,10 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
} else } else
kaddr = (void *)to; kaddr = (void *)to;
kernel_insn_init(&insn, kaddr); #ifdef CONFIG_X86_64
is_64bit = kernel_ip(to) || !test_thread_flag(TIF_IA32);
#endif
insn_init(&insn, kaddr, is_64bit);
insn_get_length(&insn); insn_get_length(&insn);
to += insn.length; to += insn.length;
} while (to < ip); } while (to < ip);

View File

@ -1268,7 +1268,7 @@ reserve:
} }
done: done:
return num ? -ENOSPC : 0; return num ? -EINVAL : 0;
} }
static __initconst const struct x86_pmu p4_pmu = { static __initconst const struct x86_pmu p4_pmu = {

View File

@ -1049,6 +1049,14 @@ int hpet_rtc_timer_init(void)
} }
EXPORT_SYMBOL_GPL(hpet_rtc_timer_init); EXPORT_SYMBOL_GPL(hpet_rtc_timer_init);
static void hpet_disable_rtc_channel(void)
{
unsigned long cfg;
cfg = hpet_readl(HPET_T1_CFG);
cfg &= ~HPET_TN_ENABLE;
hpet_writel(cfg, HPET_T1_CFG);
}
/* /*
* The functions below are called from rtc driver. * The functions below are called from rtc driver.
* Return 0 if HPET is not being used. * Return 0 if HPET is not being used.
@ -1060,6 +1068,9 @@ int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
return 0; return 0;
hpet_rtc_flags &= ~bit_mask; hpet_rtc_flags &= ~bit_mask;
if (unlikely(!hpet_rtc_flags))
hpet_disable_rtc_channel();
return 1; return 1;
} }
EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit); EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit);
@ -1125,15 +1136,11 @@ EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq);
static void hpet_rtc_timer_reinit(void) static void hpet_rtc_timer_reinit(void)
{ {
unsigned int cfg, delta; unsigned int delta;
int lost_ints = -1; int lost_ints = -1;
if (unlikely(!hpet_rtc_flags)) { if (unlikely(!hpet_rtc_flags))
cfg = hpet_readl(HPET_T1_CFG); hpet_disable_rtc_channel();
cfg &= ~HPET_TN_ENABLE;
hpet_writel(cfg, HPET_T1_CFG);
return;
}
if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit) if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
delta = hpet_default_delta; delta = hpet_default_delta;

View File

@ -38,6 +38,9 @@ static inline void stack_overflow_check(struct pt_regs *regs)
#ifdef CONFIG_DEBUG_STACKOVERFLOW #ifdef CONFIG_DEBUG_STACKOVERFLOW
u64 curbase = (u64)task_stack_page(current); u64 curbase = (u64)task_stack_page(current);
if (user_mode_vm(regs))
return;
WARN_ONCE(regs->sp >= curbase && WARN_ONCE(regs->sp >= curbase &&
regs->sp <= curbase + THREAD_SIZE && regs->sp <= curbase + THREAD_SIZE &&
regs->sp < curbase + sizeof(struct thread_info) + regs->sp < curbase + sizeof(struct thread_info) +

View File

@ -256,7 +256,7 @@ static int __init microcode_dev_init(void)
return 0; return 0;
} }
static void microcode_dev_exit(void) static void __exit microcode_dev_exit(void)
{ {
misc_deregister(&microcode_dev); misc_deregister(&microcode_dev);
} }
@ -519,10 +519,8 @@ static int __init microcode_init(void)
microcode_pdev = platform_device_register_simple("microcode", -1, microcode_pdev = platform_device_register_simple("microcode", -1,
NULL, 0); NULL, 0);
if (IS_ERR(microcode_pdev)) { if (IS_ERR(microcode_pdev))
microcode_dev_exit();
return PTR_ERR(microcode_pdev); return PTR_ERR(microcode_pdev);
}
get_online_cpus(); get_online_cpus();
mutex_lock(&microcode_mutex); mutex_lock(&microcode_mutex);
@ -532,14 +530,12 @@ static int __init microcode_init(void)
mutex_unlock(&microcode_mutex); mutex_unlock(&microcode_mutex);
put_online_cpus(); put_online_cpus();
if (error) { if (error)
platform_device_unregister(microcode_pdev); goto out_pdev;
return error;
}
error = microcode_dev_init(); error = microcode_dev_init();
if (error) if (error)
return error; goto out_sysdev_driver;
register_syscore_ops(&mc_syscore_ops); register_syscore_ops(&mc_syscore_ops);
register_hotcpu_notifier(&mc_cpu_notifier); register_hotcpu_notifier(&mc_cpu_notifier);
@ -548,6 +544,20 @@ static int __init microcode_init(void)
" <tigran@aivazian.fsnet.co.uk>, Peter Oruba\n"); " <tigran@aivazian.fsnet.co.uk>, Peter Oruba\n");
return 0; return 0;
out_sysdev_driver:
get_online_cpus();
mutex_lock(&microcode_mutex);
sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver);
mutex_unlock(&microcode_mutex);
put_online_cpus();
out_pdev:
platform_device_unregister(microcode_pdev);
return error;
} }
module_init(microcode_init); module_init(microcode_init);

View File

@ -95,8 +95,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
} }
#endif #endif
set_bit(m->busid, mp_bus_not_pci);
if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) { if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) {
set_bit(m->busid, mp_bus_not_pci);
#if defined(CONFIG_EISA) || defined(CONFIG_MCA) #if defined(CONFIG_EISA) || defined(CONFIG_MCA)
mp_bus_id_to_type[m->busid] = MP_BUS_ISA; mp_bus_id_to_type[m->busid] = MP_BUS_ISA;
#endif #endif

View File

@ -553,4 +553,17 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC,
quirk_amd_nb_node); quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_LINK, DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_LINK,
quirk_amd_nb_node); quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F0,
quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F1,
quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F2,
quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3,
quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4,
quirk_amd_nb_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F5,
quirk_amd_nb_node);
#endif #endif

View File

@ -124,7 +124,7 @@ __setup("reboot=", reboot_setup);
*/ */
/* /*
* Some machines require the "reboot=b" commandline option, * Some machines require the "reboot=b" or "reboot=k" commandline options,
* this quirk makes that automatic. * this quirk makes that automatic.
*/ */
static int __init set_bios_reboot(const struct dmi_system_id *d) static int __init set_bios_reboot(const struct dmi_system_id *d)
@ -136,6 +136,15 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
return 0; return 0;
} }
static int __init set_kbd_reboot(const struct dmi_system_id *d)
{
if (reboot_type != BOOT_KBD) {
reboot_type = BOOT_KBD;
printk(KERN_INFO "%s series board detected. Selecting KBD-method for reboot.\n", d->ident);
}
return 0;
}
static struct dmi_system_id __initdata reboot_dmi_table[] = { static struct dmi_system_id __initdata reboot_dmi_table[] = {
{ /* Handle problems with rebooting on Dell E520's */ { /* Handle problems with rebooting on Dell E520's */
.callback = set_bios_reboot, .callback = set_bios_reboot,
@ -295,7 +304,7 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
}, },
}, },
{ /* Handle reboot issue on Acer Aspire one */ { /* Handle reboot issue on Acer Aspire one */
.callback = set_bios_reboot, .callback = set_kbd_reboot,
.ident = "Acer Aspire One A110", .ident = "Acer Aspire One A110",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Acer"), DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
@ -443,6 +452,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6420"), DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6420"),
}, },
}, },
{ /* Handle problems with rebooting on the OptiPlex 990. */
.callback = set_pci_reboot,
.ident = "Dell OptiPlex 990",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
},
},
{ } { }
}; };

View File

@ -12,6 +12,7 @@
#include <asm/vsyscall.h> #include <asm/vsyscall.h>
#include <asm/x86_init.h> #include <asm/x86_init.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/mrst.h>
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/* /*
@ -242,6 +243,10 @@ static __init int add_rtc_cmos(void)
if (of_have_populated_dt()) if (of_have_populated_dt())
return 0; return 0;
/* Intel MID platforms don't have ioport rtc */
if (mrst_identify_cpu())
return -ENODEV;
platform_device_register(&rtc_device); platform_device_register(&rtc_device);
dev_info(&rtc_device.dev, dev_info(&rtc_device.dev,
"registered platform RTC device (no PNP device found)\n"); "registered platform RTC device (no PNP device found)\n");

View File

@ -201,6 +201,8 @@ static noinline int gup_huge_pud(pud_t pud, unsigned long addr,
do { do {
VM_BUG_ON(compound_head(page) != head); VM_BUG_ON(compound_head(page) != head);
pages[*nr] = page; pages[*nr] = page;
if (PageTail(page))
get_huge_page_tail(page);
(*nr)++; (*nr)++;
page++; page++;
refs++; refs++;

View File

@ -45,6 +45,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
BUG_ON(!pte_none(*(kmap_pte-idx))); BUG_ON(!pte_none(*(kmap_pte-idx)));
set_pte(kmap_pte-idx, mk_pte(page, prot)); set_pte(kmap_pte-idx, mk_pte(page, prot));
arch_flush_lazy_mmu_mode();
return (void *)vaddr; return (void *)vaddr;
} }
@ -88,6 +89,7 @@ void __kunmap_atomic(void *kvaddr)
*/ */
kpte_clear_flush(kmap_pte-idx, vaddr); kpte_clear_flush(kmap_pte-idx, vaddr);
kmap_atomic_idx_pop(); kmap_atomic_idx_pop();
arch_flush_lazy_mmu_mode();
} }
#ifdef CONFIG_DEBUG_HIGHMEM #ifdef CONFIG_DEBUG_HIGHMEM
else { else {

View File

@ -21,6 +21,7 @@ extern int op_nmi_timer_init(struct oprofile_operations *ops);
extern void op_nmi_exit(void); extern void op_nmi_exit(void);
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth); extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);
static int nmi_timer;
int __init oprofile_arch_init(struct oprofile_operations *ops) int __init oprofile_arch_init(struct oprofile_operations *ops)
{ {
@ -31,8 +32,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
ret = op_nmi_init(ops); ret = op_nmi_init(ops);
#endif #endif
nmi_timer = (ret != 0);
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
if (ret < 0) if (nmi_timer)
ret = op_nmi_timer_init(ops); ret = op_nmi_timer_init(ops);
#endif #endif
ops->backtrace = x86_backtrace; ops->backtrace = x86_backtrace;
@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
void oprofile_arch_exit(void) void oprofile_arch_exit(void)
{ {
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
op_nmi_exit(); if (!nmi_timer)
op_nmi_exit();
#endif #endif
} }

View File

@ -39,43 +39,14 @@
*/ */
static unsigned long efi_rt_eflags; static unsigned long efi_rt_eflags;
static pgd_t efi_bak_pg_dir_pointer[2];
void efi_call_phys_prelog(void) void efi_call_phys_prelog(void)
{ {
unsigned long cr4;
unsigned long temp;
struct desc_ptr gdt_descr; struct desc_ptr gdt_descr;
local_irq_save(efi_rt_eflags); local_irq_save(efi_rt_eflags);
/* load_cr3(initial_page_table);
* If I don't have PAE, I should just duplicate two entries in page
* directory. If I have PAE, I just need to duplicate one entry in
* page directory.
*/
cr4 = read_cr4_safe();
if (cr4 & X86_CR4_PAE) {
efi_bak_pg_dir_pointer[0].pgd =
swapper_pg_dir[pgd_index(0)].pgd;
swapper_pg_dir[0].pgd =
swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
} else {
efi_bak_pg_dir_pointer[0].pgd =
swapper_pg_dir[pgd_index(0)].pgd;
efi_bak_pg_dir_pointer[1].pgd =
swapper_pg_dir[pgd_index(0x400000)].pgd;
swapper_pg_dir[pgd_index(0)].pgd =
swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
temp = PAGE_OFFSET + 0x400000;
swapper_pg_dir[pgd_index(0x400000)].pgd =
swapper_pg_dir[pgd_index(temp)].pgd;
}
/*
* After the lock is released, the original page table is restored.
*/
__flush_tlb_all(); __flush_tlb_all();
gdt_descr.address = __pa(get_cpu_gdt_table(0)); gdt_descr.address = __pa(get_cpu_gdt_table(0));
@ -85,28 +56,13 @@ void efi_call_phys_prelog(void)
void efi_call_phys_epilog(void) void efi_call_phys_epilog(void)
{ {
unsigned long cr4;
struct desc_ptr gdt_descr; struct desc_ptr gdt_descr;
gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); gdt_descr.address = (unsigned long)get_cpu_gdt_table(0);
gdt_descr.size = GDT_SIZE - 1; gdt_descr.size = GDT_SIZE - 1;
load_gdt(&gdt_descr); load_gdt(&gdt_descr);
cr4 = read_cr4_safe(); load_cr3(swapper_pg_dir);
if (cr4 & X86_CR4_PAE) {
swapper_pg_dir[pgd_index(0)].pgd =
efi_bak_pg_dir_pointer[0].pgd;
} else {
swapper_pg_dir[pgd_index(0)].pgd =
efi_bak_pg_dir_pointer[0].pgd;
swapper_pg_dir[pgd_index(0x400000)].pgd =
efi_bak_pg_dir_pointer[1].pgd;
}
/*
* After the lock is released, the original page table is restored.
*/
__flush_tlb_all(); __flush_tlb_all();
local_irq_restore(efi_rt_eflags); local_irq_restore(efi_rt_eflags);

View File

@ -76,6 +76,20 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
EXPORT_SYMBOL_GPL(sfi_mrtc_array); EXPORT_SYMBOL_GPL(sfi_mrtc_array);
int sfi_mrtc_num; int sfi_mrtc_num;
static void mrst_power_off(void)
{
if (__mrst_cpu_chip == MRST_CPU_CHIP_LINCROFT)
intel_scu_ipc_simple_command(IPCMSG_COLD_RESET, 1);
}
static void mrst_reboot(void)
{
if (__mrst_cpu_chip == MRST_CPU_CHIP_LINCROFT)
intel_scu_ipc_simple_command(IPCMSG_COLD_RESET, 0);
else
intel_scu_ipc_simple_command(IPCMSG_COLD_BOOT, 0);
}
/* parse all the mtimer info to a static mtimer array */ /* parse all the mtimer info to a static mtimer array */
static int __init sfi_parse_mtmr(struct sfi_table_header *table) static int __init sfi_parse_mtmr(struct sfi_table_header *table)
{ {
@ -265,17 +279,6 @@ static int mrst_i8042_detect(void)
return 0; return 0;
} }
/* Reboot and power off are handled by the SCU on a MID device */
static void mrst_power_off(void)
{
intel_scu_ipc_simple_command(0xf1, 1);
}
static void mrst_reboot(void)
{
intel_scu_ipc_simple_command(0xf1, 0);
}
/* /*
* Moorestown does not have external NMI source nor port 0x61 to report * Moorestown does not have external NMI source nor port 0x61 to report
* NMI status. The possible NMI sources are from pmu as a result of NMI * NMI status. The possible NMI sources are from pmu as a result of NMI
@ -484,6 +487,46 @@ static void __init *max7315_platform_data(void *info)
return max7315; return max7315;
} }
static void *tca6416_platform_data(void *info)
{
static struct pca953x_platform_data tca6416;
struct i2c_board_info *i2c_info = info;
int gpio_base, intr;
char base_pin_name[SFI_NAME_LEN + 1];
char intr_pin_name[SFI_NAME_LEN + 1];
strcpy(i2c_info->type, "tca6416");
strcpy(base_pin_name, "tca6416_base");
strcpy(intr_pin_name, "tca6416_int");
gpio_base = get_gpio_by_name(base_pin_name);
intr = get_gpio_by_name(intr_pin_name);
if (gpio_base == -1)
return NULL;
tca6416.gpio_base = gpio_base;
if (intr != -1) {
i2c_info->irq = intr + MRST_IRQ_OFFSET;
tca6416.irq_base = gpio_base + MRST_IRQ_OFFSET;
} else {
i2c_info->irq = -1;
tca6416.irq_base = -1;
}
return &tca6416;
}
static void *mpu3050_platform_data(void *info)
{
struct i2c_board_info *i2c_info = info;
int intr = get_gpio_by_name("mpu3050_int");
if (intr == -1)
return NULL;
i2c_info->irq = intr + MRST_IRQ_OFFSET;
return NULL;
}
static void __init *emc1403_platform_data(void *info) static void __init *emc1403_platform_data(void *info)
{ {
static short intr2nd_pdata; static short intr2nd_pdata;
@ -646,12 +689,15 @@ static void *msic_ocd_platform_data(void *info)
static const struct devs_id __initconst device_ids[] = { static const struct devs_id __initconst device_ids[] = {
{"bma023", SFI_DEV_TYPE_I2C, 1, &no_platform_data}, {"bma023", SFI_DEV_TYPE_I2C, 1, &no_platform_data},
{"pmic_gpio", SFI_DEV_TYPE_SPI, 1, &pmic_gpio_platform_data}, {"pmic_gpio", SFI_DEV_TYPE_SPI, 1, &pmic_gpio_platform_data},
{"pmic_gpio", SFI_DEV_TYPE_IPC, 1, &pmic_gpio_platform_data},
{"spi_max3111", SFI_DEV_TYPE_SPI, 0, &max3111_platform_data}, {"spi_max3111", SFI_DEV_TYPE_SPI, 0, &max3111_platform_data},
{"i2c_max7315", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data}, {"i2c_max7315", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data},
{"i2c_max7315_2", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data}, {"i2c_max7315_2", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data},
{"tca6416", SFI_DEV_TYPE_I2C, 1, &tca6416_platform_data},
{"emc1403", SFI_DEV_TYPE_I2C, 1, &emc1403_platform_data}, {"emc1403", SFI_DEV_TYPE_I2C, 1, &emc1403_platform_data},
{"i2c_accel", SFI_DEV_TYPE_I2C, 0, &lis331dl_platform_data}, {"i2c_accel", SFI_DEV_TYPE_I2C, 0, &lis331dl_platform_data},
{"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data}, {"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data},
{"mpu3050", SFI_DEV_TYPE_I2C, 1, &mpu3050_platform_data},
/* MSIC subdevices */ /* MSIC subdevices */
{"msic_battery", SFI_DEV_TYPE_IPC, 1, &msic_battery_platform_data}, {"msic_battery", SFI_DEV_TYPE_IPC, 1, &msic_battery_platform_data},

View File

@ -173,9 +173,21 @@ static unsigned long __init xen_get_max_pages(void)
domid_t domid = DOMID_SELF; domid_t domid = DOMID_SELF;
int ret; int ret;
ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); /*
if (ret > 0) * For the initial domain we use the maximum reservation as
max_pages = ret; * the maximum page.
*
* For guest domains the current maximum reservation reflects
* the current maximum rather than the static maximum. In this
* case the e820 map provided to us will cover the static
* maximum region.
*/
if (xen_initial_domain()) {
ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid);
if (ret > 0)
max_pages = ret;
}
return min(max_pages, MAX_DOMAIN_PAGES); return min(max_pages, MAX_DOMAIN_PAGES);
} }

View File

@ -366,7 +366,14 @@ void blk_drain_queue(struct request_queue *q, bool drain_all)
if (drain_all) if (drain_all)
blk_throtl_drain(q); blk_throtl_drain(q);
__blk_run_queue(q); /*
* This function might be called on a queue which failed
* driver init after queue creation. Some drivers
* (e.g. fd) get unhappy in such cases. Kick queue iff
* dispatch queue has something on it.
*/
if (!list_empty(&q->queue_head))
__blk_run_queue(q);
if (drain_all) if (drain_all)
nr_rqs = q->rq.count[0] + q->rq.count[1]; nr_rqs = q->rq.count[0] + q->rq.count[1];
@ -467,6 +474,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
q->backing_dev_info.state = 0; q->backing_dev_info.state = 0;
q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY; q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY;
q->backing_dev_info.name = "block"; q->backing_dev_info.name = "block";
q->node = node_id;
err = bdi_init(&q->backing_dev_info); err = bdi_init(&q->backing_dev_info);
if (err) { if (err) {
@ -551,7 +559,7 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)
if (!uninit_q) if (!uninit_q)
return NULL; return NULL;
q = blk_init_allocated_queue_node(uninit_q, rfn, lock, node_id); q = blk_init_allocated_queue(uninit_q, rfn, lock);
if (!q) if (!q)
blk_cleanup_queue(uninit_q); blk_cleanup_queue(uninit_q);
@ -562,19 +570,10 @@ EXPORT_SYMBOL(blk_init_queue_node);
struct request_queue * struct request_queue *
blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn,
spinlock_t *lock) spinlock_t *lock)
{
return blk_init_allocated_queue_node(q, rfn, lock, -1);
}
EXPORT_SYMBOL(blk_init_allocated_queue);
struct request_queue *
blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn,
spinlock_t *lock, int node_id)
{ {
if (!q) if (!q)
return NULL; return NULL;
q->node = node_id;
if (blk_init_free_list(q)) if (blk_init_free_list(q))
return NULL; return NULL;
@ -604,7 +603,7 @@ blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn,
return NULL; return NULL;
} }
EXPORT_SYMBOL(blk_init_allocated_queue_node); EXPORT_SYMBOL(blk_init_allocated_queue);
int blk_get_queue(struct request_queue *q) int blk_get_queue(struct request_queue *q)
{ {

View File

@ -3184,7 +3184,7 @@ static int cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc,
} }
} }
if (ret) if (ret && ret != -EEXIST)
printk(KERN_ERR "cfq: cic link failed!\n"); printk(KERN_ERR "cfq: cic link failed!\n");
return ret; return ret;
@ -3200,6 +3200,7 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask)
{ {
struct io_context *ioc = NULL; struct io_context *ioc = NULL;
struct cfq_io_context *cic; struct cfq_io_context *cic;
int ret;
might_sleep_if(gfp_mask & __GFP_WAIT); might_sleep_if(gfp_mask & __GFP_WAIT);
@ -3207,6 +3208,7 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask)
if (!ioc) if (!ioc)
return NULL; return NULL;
retry:
cic = cfq_cic_lookup(cfqd, ioc); cic = cfq_cic_lookup(cfqd, ioc);
if (cic) if (cic)
goto out; goto out;
@ -3215,7 +3217,12 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask)
if (cic == NULL) if (cic == NULL)
goto err; goto err;
if (cfq_cic_link(cfqd, ioc, cic, gfp_mask)) ret = cfq_cic_link(cfqd, ioc, cic, gfp_mask);
if (ret == -EEXIST) {
/* someone has linked cic to ioc already */
cfq_cic_free(cic);
goto retry;
} else if (ret)
goto err_free; goto err_free;
out: out:
@ -4036,6 +4043,11 @@ static void *cfq_init_queue(struct request_queue *q)
if (blkio_alloc_blkg_stats(&cfqg->blkg)) { if (blkio_alloc_blkg_stats(&cfqg->blkg)) {
kfree(cfqg); kfree(cfqg);
spin_lock(&cic_index_lock);
ida_remove(&cic_index_ida, cfqd->cic_index);
spin_unlock(&cic_index_lock);
kfree(cfqd); kfree(cfqd);
return NULL; return NULL;
} }

View File

@ -1743,8 +1743,10 @@ void device_shutdown(void)
*/ */
list_del_init(&dev->kobj.entry); list_del_init(&dev->kobj.entry);
spin_unlock(&devices_kset->list_lock); spin_unlock(&devices_kset->list_lock);
/* Disable all device's runtime power management */
pm_runtime_disable(dev); /* Don't allow any more runtime suspends */
pm_runtime_get_noresume(dev);
pm_runtime_barrier(dev);
if (dev->bus && dev->bus->shutdown) { if (dev->bus && dev->bus->shutdown) {
dev_dbg(dev, "shutdown\n"); dev_dbg(dev, "shutdown\n");

View File

@ -2601,6 +2601,8 @@ static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff,
c->Request.Timeout = 0; c->Request.Timeout = 0;
c->Request.CDB[0] = BMIC_WRITE; c->Request.CDB[0] = BMIC_WRITE;
c->Request.CDB[6] = BMIC_CACHE_FLUSH; c->Request.CDB[6] = BMIC_CACHE_FLUSH;
c->Request.CDB[7] = (size >> 8) & 0xFF;
c->Request.CDB[8] = size & 0xFF;
break; break;
case TEST_UNIT_READY: case TEST_UNIT_READY:
c->Request.CDBLen = 6; c->Request.CDBLen = 6;
@ -4880,7 +4882,7 @@ static int cciss_request_irq(ctlr_info_t *h,
{ {
if (h->msix_vector || h->msi_vector) { if (h->msix_vector || h->msi_vector) {
if (!request_irq(h->intr[h->intr_mode], msixhandler, if (!request_irq(h->intr[h->intr_mode], msixhandler,
IRQF_DISABLED, h->devname, h)) 0, h->devname, h))
return 0; return 0;
dev_err(&h->pdev->dev, "Unable to get msi irq %d" dev_err(&h->pdev->dev, "Unable to get msi irq %d"
" for %s\n", h->intr[h->intr_mode], " for %s\n", h->intr[h->intr_mode],
@ -4889,7 +4891,7 @@ static int cciss_request_irq(ctlr_info_t *h,
} }
if (!request_irq(h->intr[h->intr_mode], intxhandler, if (!request_irq(h->intr[h->intr_mode], intxhandler,
IRQF_DISABLED, h->devname, h)) IRQF_SHARED, h->devname, h))
return 0; return 0;
dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n",
h->intr[h->intr_mode], h->devname); h->intr[h->intr_mode], h->devname);

View File

@ -422,7 +422,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
/* /*
* We use punch hole to reclaim the free space used by the * We use punch hole to reclaim the free space used by the
* image a.k.a. discard. However we do support discard if * image a.k.a. discard. However we do not support discard if
* encryption is enabled, because it may give an attacker * encryption is enabled, because it may give an attacker
* useful information. * useful information.
*/ */
@ -797,7 +797,7 @@ static void loop_config_discard(struct loop_device *lo)
} }
q->limits.discard_granularity = inode->i_sb->s_blocksize; q->limits.discard_granularity = inode->i_sb->s_blocksize;
q->limits.discard_alignment = inode->i_sb->s_blocksize; q->limits.discard_alignment = 0;
q->limits.max_discard_sectors = UINT_MAX >> 9; q->limits.max_discard_sectors = UINT_MAX >> 9;
q->limits.discard_zeroes_data = 1; q->limits.discard_zeroes_data = 1;
queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);

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