Merge branch 'x86/apic' into x86/irq

Reason: Update to latest genirq code conflicts with pending apic
	changes

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Thomas Gleixner 2011-03-12 13:22:22 +01:00
Родитель 58bff947e2 abb0052289
Коммит cfe08bba1e
135 изменённых файлов: 1637 добавлений и 1255 удалений

Просмотреть файл

@ -82,6 +82,11 @@
</sect1> </sect1>
</chapter> </chapter>
<chapter id="fs_events">
<title>Events based on file descriptors</title>
!Efs/eventfd.c
</chapter>
<chapter id="sysfs"> <chapter id="sysfs">
<title>The Filesystem for Exporting Kernel Objects</title> <title>The Filesystem for Exporting Kernel Objects</title>
!Efs/sysfs/file.c !Efs/sysfs/file.c

Просмотреть файл

@ -51,7 +51,8 @@ Supported chips:
* JEDEC JC 42.4 compliant temperature sensor chips * JEDEC JC 42.4 compliant temperature sensor chips
Prefix: 'jc42' Prefix: 'jc42'
Addresses scanned: I2C 0x18 - 0x1f Addresses scanned: I2C 0x18 - 0x1f
Datasheet: - Datasheet:
http://www.jedec.org/sites/default/files/docs/4_01_04R19.pdf
Author: Author:
Guenter Roeck <guenter.roeck@ericsson.com> Guenter Roeck <guenter.roeck@ericsson.com>
@ -60,7 +61,11 @@ Author:
Description Description
----------- -----------
This driver implements support for JEDEC JC 42.4 compliant temperature sensors. This driver implements support for JEDEC JC 42.4 compliant temperature sensors,
which are used on many DDR3 memory modules for mobile devices and servers. Some
systems use the sensor to prevent memory overheating by automatically throttling
the memory controller.
The driver auto-detects the chips listed above, but can be manually instantiated The driver auto-detects the chips listed above, but can be manually instantiated
to support other JC 42.4 compliant chips. to support other JC 42.4 compliant chips.
@ -81,15 +86,19 @@ limits. The chip supports only a single register to configure the hysteresis,
which applies to all limits. This register can be written by writing into which applies to all limits. This register can be written by writing into
temp1_crit_hyst. Other hysteresis attributes are read-only. temp1_crit_hyst. Other hysteresis attributes are read-only.
If the BIOS has configured the sensor for automatic temperature management, it
is likely that it has locked the registers, i.e., that the temperature limits
cannot be changed.
Sysfs entries Sysfs entries
------------- -------------
temp1_input Temperature (RO) temp1_input Temperature (RO)
temp1_min Minimum temperature (RW) temp1_min Minimum temperature (RO or RW)
temp1_max Maximum temperature (RW) temp1_max Maximum temperature (RO or RW)
temp1_crit Critical high temperature (RW) temp1_crit Critical high temperature (RO or RW)
temp1_crit_hyst Critical hysteresis temperature (RW) temp1_crit_hyst Critical hysteresis temperature (RO or RW)
temp1_max_hyst Maximum hysteresis temperature (RO) temp1_max_hyst Maximum hysteresis temperature (RO)
temp1_min_alarm Temperature low alarm temp1_min_alarm Temperature low alarm

Просмотреть файл

@ -9,6 +9,8 @@ Supported chips:
Socket S1G3: Athlon II, Sempron, Turion II Socket S1G3: Athlon II, Sempron, Turion II
* AMD Family 11h processors: * AMD Family 11h processors:
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra) Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
* AMD Family 12h processors: "Llano"
* AMD Family 14h processors: "Brazos" (C/E/G-Series)
Prefix: 'k10temp' Prefix: 'k10temp'
Addresses scanned: PCI space Addresses scanned: PCI space
@ -17,10 +19,14 @@ Supported chips:
http://support.amd.com/us/Processor_TechDocs/31116.pdf http://support.amd.com/us/Processor_TechDocs/31116.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors: BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41256.pdf http://support.amd.com/us/Processor_TechDocs/41256.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/43170.pdf
Revision Guide for AMD Family 10h Processors: Revision Guide for AMD Family 10h Processors:
http://support.amd.com/us/Processor_TechDocs/41322.pdf http://support.amd.com/us/Processor_TechDocs/41322.pdf
Revision Guide for AMD Family 11h Processors: Revision Guide for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41788.pdf http://support.amd.com/us/Processor_TechDocs/41788.pdf
Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/47534.pdf
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks: AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
http://support.amd.com/us/Processor_TechDocs/43373.pdf http://support.amd.com/us/Processor_TechDocs/43373.pdf
AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet: AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet:
@ -34,7 +40,7 @@ Description
----------- -----------
This driver permits reading of the internal temperature sensor of AMD This driver permits reading of the internal temperature sensor of AMD
Family 10h and 11h processors. Family 10h/11h/12h/14h processors.
All these processors have a sensor, but on those for Socket F or AM2+, All these processors have a sensor, but on those for Socket F or AM2+,
the sensor may return inconsistent values (erratum 319). The driver the sensor may return inconsistent values (erratum 319). The driver

Просмотреть файл

@ -144,6 +144,11 @@ a fixed number of characters. This limit depends on the architecture
and is between 256 and 4096 characters. It is defined in the file and is between 256 and 4096 characters. It is defined in the file
./include/asm/setup.h as COMMAND_LINE_SIZE. ./include/asm/setup.h as COMMAND_LINE_SIZE.
Finally, the [KMG] suffix is commonly described after a number of kernel
parameter values. These 'K', 'M', and 'G' letters represent the _binary_
multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30
bytes respectively. Such letter suffixes can also be entirely omitted.
acpi= [HW,ACPI,X86] acpi= [HW,ACPI,X86]
Advanced Configuration and Power Interface Advanced Configuration and Power Interface
@ -545,16 +550,20 @@ and is between 256 and 4096 characters. It is defined in the file
Format: Format:
<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>] <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
crashkernel=nn[KMG]@ss[KMG] crashkernel=size[KMG][@offset[KMG]]
[KNL] Reserve a chunk of physical memory to [KNL] Using kexec, Linux can switch to a 'crash kernel'
hold a kernel to switch to with kexec on panic. upon panic. This parameter reserves the physical
memory region [offset, offset + size] for that kernel
image. If '@offset' is omitted, then a suitable offset
is selected automatically. Check
Documentation/kdump/kdump.txt for further details.
crashkernel=range1:size1[,range2:size2,...][@offset] crashkernel=range1:size1[,range2:size2,...][@offset]
[KNL] Same as above, but depends on the memory [KNL] Same as above, but depends on the memory
in the running system. The syntax of range is in the running system. The syntax of range is
start-[end] where start and end are both start-[end] where start and end are both
a memory unit (amount[KMG]). See also a memory unit (amount[KMG]). See also
Documentation/kdump/kdump.txt for a example. Documentation/kdump/kdump.txt for an example.
cs89x0_dma= [HW,NET] cs89x0_dma= [HW,NET]
Format: <dma> Format: <dma>
@ -1262,10 +1271,9 @@ and is between 256 and 4096 characters. It is defined in the file
6 (KERN_INFO) informational 6 (KERN_INFO) informational
7 (KERN_DEBUG) debug-level messages 7 (KERN_DEBUG) debug-level messages
log_buf_len=n Sets the size of the printk ring buffer, in bytes. log_buf_len=n[KMG] Sets the size of the printk ring buffer,
Format: { n | nk | nM } in bytes. n must be a power of two. The default
n must be a power of two. The default size size is set in the kernel config file.
is set in the kernel config file.
logo.nologo [FB] Disables display of the built-in Linux logo. logo.nologo [FB] Disables display of the built-in Linux logo.
This may be used to provide more screen space for This may be used to provide more screen space for

Просмотреть файл

@ -4,6 +4,8 @@ obj- := dummy.o
# List of programs to build # List of programs to build
hostprogs-y := ifenslave hostprogs-y := ifenslave
HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include
# Tell kbuild to always build the programs # Tell kbuild to always build the programs
always := $(hostprogs-y) always := $(hostprogs-y)

Просмотреть файл

@ -190,9 +190,9 @@ resources, scheduled and executed.
* Long running CPU intensive workloads which can be better * Long running CPU intensive workloads which can be better
managed by the system scheduler. managed by the system scheduler.
WQ_FREEZEABLE WQ_FREEZABLE
A freezeable wq participates in the freeze phase of the system A freezable wq participates in the freeze phase of the system
suspend operations. Work items on the wq are drained and no suspend operations. Work items on the wq are drained and no
new work item starts execution until thawed. new work item starts execution until thawed.

Просмотреть файл

@ -885,7 +885,7 @@ S: Supported
ARM/QUALCOMM MSM MACHINE SUPPORT ARM/QUALCOMM MSM MACHINE SUPPORT
M: David Brown <davidb@codeaurora.org> M: David Brown <davidb@codeaurora.org>
M: Daniel Walker <dwalker@codeaurora.org> M: Daniel Walker <dwalker@fifo99.com>
M: Bryan Huntsman <bryanh@codeaurora.org> M: Bryan Huntsman <bryanh@codeaurora.org>
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
F: arch/arm/mach-msm/ F: arch/arm/mach-msm/
@ -2873,7 +2873,6 @@ M: Guenter Roeck <guenter.roeck@ericsson.com>
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
W: http://www.lm-sensors.org/ W: http://www.lm-sensors.org/
T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
T: quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained S: Maintained
F: Documentation/hwmon/ F: Documentation/hwmon/

Просмотреть файл

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 38 SUBLEVEL = 38
EXTRAVERSION = -rc5 EXTRAVERSION = -rc6
NAME = Flesh-Eating Bats with Fangs NAME = Flesh-Eating Bats with Fangs
# *DOCUMENTATION* # *DOCUMENTATION*

Просмотреть файл

@ -1177,6 +1177,31 @@ config ARM_ERRATA_743622
visible impact on the overall performance or power consumption of the visible impact on the overall performance or power consumption of the
processor. processor.
config ARM_ERRATA_751472
bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
depends on CPU_V7 && SMP
help
This option enables the workaround for the 751472 Cortex-A9 (prior
to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
completion of a following broadcasted operation if the second
operation is received by a CPU before the ICIALLUIS has completed,
potentially leading to corrupted entries in the cache or TLB.
config ARM_ERRATA_753970
bool "ARM errata: cache sync operation may be faulty"
depends on CACHE_PL310
help
This option enables the workaround for the 753970 PL310 (r3p0) erratum.
Under some condition the effect of cache sync operation on
the store buffer still remains when the operation completes.
This means that the store buffer is always asked to drain and
this prevents it from merging any further writes. The workaround
is to replace the normal offset of cache sync operation (0x730)
by another offset targeting an unmapped PL310 register 0x740.
This has the same effect as the cache sync operation: store buffer
drain and waiting for all buffers empty.
endmenu endmenu
source "arch/arm/common/Kconfig" source "arch/arm/common/Kconfig"

Просмотреть файл

@ -15,7 +15,7 @@ ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux += --be8 LDFLAGS_vmlinux += --be8
endif endif
OBJCOPYFLAGS :=-O binary -R .note -R .note.gnu.build-id -R .comment -S OBJCOPYFLAGS :=-O binary -R .comment -S
GZFLAGS :=-9 GZFLAGS :=-9
#KBUILD_CFLAGS +=-pipe #KBUILD_CFLAGS +=-pipe
# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb: # Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb:

6
arch/arm/boot/compressed/.gitignore поставляемый
Просмотреть файл

@ -1,3 +1,7 @@
font.c font.c
piggy.gz lib1funcs.S
piggy.gzip
piggy.lzo
piggy.lzma
vmlinux
vmlinux.lds vmlinux.lds

Просмотреть файл

@ -36,6 +36,7 @@
#define L2X0_RAW_INTR_STAT 0x21C #define L2X0_RAW_INTR_STAT 0x21C
#define L2X0_INTR_CLEAR 0x220 #define L2X0_INTR_CLEAR 0x220
#define L2X0_CACHE_SYNC 0x730 #define L2X0_CACHE_SYNC 0x730
#define L2X0_DUMMY_REG 0x740
#define L2X0_INV_LINE_PA 0x770 #define L2X0_INV_LINE_PA 0x770
#define L2X0_INV_WAY 0x77C #define L2X0_INV_WAY 0x77C
#define L2X0_CLEAN_LINE_PA 0x7B0 #define L2X0_CLEAN_LINE_PA 0x7B0

Просмотреть файл

@ -58,6 +58,9 @@
static inline void sysctl_soft_reset(void __iomem *base) static inline void sysctl_soft_reset(void __iomem *base)
{ {
/* switch to slow mode */
writel(0x2, base + SCCTRL);
/* writing any value to SCSYSSTAT reg will reset system */ /* writing any value to SCSYSSTAT reg will reset system */
writel(0, base + SCSYSSTAT); writel(0, base + SCSYSSTAT);
} }

Просмотреть файл

@ -18,16 +18,34 @@
#define __ASMARM_TLB_H #define __ASMARM_TLB_H
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/tlbflush.h>
#ifndef CONFIG_MMU #ifndef CONFIG_MMU
#include <linux/pagemap.h> #include <linux/pagemap.h>
#define tlb_flush(tlb) ((void) tlb)
#include <asm-generic/tlb.h> #include <asm-generic/tlb.h>
#else /* !CONFIG_MMU */ #else /* !CONFIG_MMU */
#include <linux/swap.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/tlbflush.h>
/*
* We need to delay page freeing for SMP as other CPUs can access pages
* which have been removed but not yet had their TLB entries invalidated.
* Also, as ARMv7 speculative prefetch can drag new entries into the TLB,
* we need to apply this same delaying tactic to ensure correct operation.
*/
#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7)
#define tlb_fast_mode(tlb) 0
#define FREE_PTE_NR 500
#else
#define tlb_fast_mode(tlb) 1
#define FREE_PTE_NR 0
#endif
/* /*
* TLB handling. This allows us to remove pages from the page * TLB handling. This allows us to remove pages from the page
@ -36,12 +54,58 @@
struct mmu_gather { struct mmu_gather {
struct mm_struct *mm; struct mm_struct *mm;
unsigned int fullmm; unsigned int fullmm;
struct vm_area_struct *vma;
unsigned long range_start; unsigned long range_start;
unsigned long range_end; unsigned long range_end;
unsigned int nr;
struct page *pages[FREE_PTE_NR];
}; };
DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
/*
* This is unnecessarily complex. There's three ways the TLB shootdown
* code is used:
* 1. Unmapping a range of vmas. See zap_page_range(), unmap_region().
* tlb->fullmm = 0, and tlb_start_vma/tlb_end_vma will be called.
* tlb->vma will be non-NULL.
* 2. Unmapping all vmas. See exit_mmap().
* tlb->fullmm = 1, and tlb_start_vma/tlb_end_vma will be called.
* tlb->vma will be non-NULL. Additionally, page tables will be freed.
* 3. Unmapping argument pages. See shift_arg_pages().
* tlb->fullmm = 0, but tlb_start_vma/tlb_end_vma will not be called.
* tlb->vma will be NULL.
*/
static inline void tlb_flush(struct mmu_gather *tlb)
{
if (tlb->fullmm || !tlb->vma)
flush_tlb_mm(tlb->mm);
else if (tlb->range_end > 0) {
flush_tlb_range(tlb->vma, tlb->range_start, tlb->range_end);
tlb->range_start = TASK_SIZE;
tlb->range_end = 0;
}
}
static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr)
{
if (!tlb->fullmm) {
if (addr < tlb->range_start)
tlb->range_start = addr;
if (addr + PAGE_SIZE > tlb->range_end)
tlb->range_end = addr + PAGE_SIZE;
}
}
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
{
tlb_flush(tlb);
if (!tlb_fast_mode(tlb)) {
free_pages_and_swap_cache(tlb->pages, tlb->nr);
tlb->nr = 0;
}
}
static inline struct mmu_gather * static inline struct mmu_gather *
tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
{ {
@ -49,6 +113,8 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
tlb->mm = mm; tlb->mm = mm;
tlb->fullmm = full_mm_flush; tlb->fullmm = full_mm_flush;
tlb->vma = NULL;
tlb->nr = 0;
return tlb; return tlb;
} }
@ -56,8 +122,7 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
static inline void static inline void
tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
{ {
if (tlb->fullmm) tlb_flush_mmu(tlb);
flush_tlb_mm(tlb->mm);
/* keep the page table cache within bounds */ /* keep the page table cache within bounds */
check_pgt_cache(); check_pgt_cache();
@ -71,12 +136,7 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
static inline void static inline void
tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr) tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr)
{ {
if (!tlb->fullmm) { tlb_add_flush(tlb, addr);
if (addr < tlb->range_start)
tlb->range_start = addr;
if (addr + PAGE_SIZE > tlb->range_end)
tlb->range_end = addr + PAGE_SIZE;
}
} }
/* /*
@ -89,6 +149,7 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
{ {
if (!tlb->fullmm) { if (!tlb->fullmm) {
flush_cache_range(vma, vma->vm_start, vma->vm_end); flush_cache_range(vma, vma->vm_start, vma->vm_end);
tlb->vma = vma;
tlb->range_start = TASK_SIZE; tlb->range_start = TASK_SIZE;
tlb->range_end = 0; tlb->range_end = 0;
} }
@ -97,12 +158,30 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
static inline void static inline void
tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
{ {
if (!tlb->fullmm && tlb->range_end > 0) if (!tlb->fullmm)
flush_tlb_range(vma, tlb->range_start, tlb->range_end); tlb_flush(tlb);
} }
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page) static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep) {
if (tlb_fast_mode(tlb)) {
free_page_and_swap_cache(page);
} else {
tlb->pages[tlb->nr++] = page;
if (tlb->nr >= FREE_PTE_NR)
tlb_flush_mmu(tlb);
}
}
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
unsigned long addr)
{
pgtable_page_dtor(pte);
tlb_add_flush(tlb, addr);
tlb_remove_page(tlb, pte);
}
#define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr)
#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp)
#define tlb_migrate_finish(mm) do { } while (0) #define tlb_migrate_finish(mm) do { } while (0)

Просмотреть файл

@ -10,12 +10,7 @@
#ifndef _ASMARM_TLBFLUSH_H #ifndef _ASMARM_TLBFLUSH_H
#define _ASMARM_TLBFLUSH_H #define _ASMARM_TLBFLUSH_H
#ifdef CONFIG_MMU
#ifndef CONFIG_MMU
#define tlb_flush(tlb) ((void) tlb)
#else /* CONFIG_MMU */
#include <asm/glue.h> #include <asm/glue.h>

Просмотреть файл

@ -1437,7 +1437,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
return space_cccc_1100_010x(insn, asi); return space_cccc_1100_010x(insn, asi);
} else if ((insn & 0x0e000000) == 0x0c400000) { } else if ((insn & 0x0e000000) == 0x0c000000) {
return space_cccc_110x(insn, asi); return space_cccc_110x(insn, asi);

Просмотреть файл

@ -97,28 +97,34 @@ set_irq_affinity(int irq,
irq, cpu); irq, cpu);
return err; return err;
#else #else
return 0; return -EINVAL;
#endif #endif
} }
static int static int
init_cpu_pmu(void) init_cpu_pmu(void)
{ {
int i, err = 0; int i, irqs, err = 0;
struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU]; struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU];
if (!pdev) { if (!pdev)
err = -ENODEV; return -ENODEV;
goto out;
}
for (i = 0; i < pdev->num_resources; ++i) { irqs = pdev->num_resources;
/*
* If we have a single PMU interrupt that we can't shift, assume that
* we're running on a uniprocessor machine and continue.
*/
if (irqs == 1 && !irq_can_set_affinity(platform_get_irq(pdev, 0)))
return 0;
for (i = 0; i < irqs; ++i) {
err = set_irq_affinity(platform_get_irq(pdev, i), i); err = set_irq_affinity(platform_get_irq(pdev, i), i);
if (err) if (err)
break; break;
} }
out:
return err; return err;
} }

Просмотреть файл

@ -226,8 +226,8 @@ int cpu_architecture(void)
* Register 0 and check for VMSAv7 or PMSAv7 */ * Register 0 and check for VMSAv7 or PMSAv7 */
asm("mrc p15, 0, %0, c0, c1, 4" asm("mrc p15, 0, %0, c0, c1, 4"
: "=r" (mmfr0)); : "=r" (mmfr0));
if ((mmfr0 & 0x0000000f) == 0x00000003 || if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
(mmfr0 & 0x000000f0) == 0x00000030) (mmfr0 & 0x000000f0) >= 0x00000030)
cpu_arch = CPU_ARCH_ARMv7; cpu_arch = CPU_ARCH_ARMv7;
else if ((mmfr0 & 0x0000000f) == 0x00000002 || else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
(mmfr0 & 0x000000f0) == 0x00000020) (mmfr0 & 0x000000f0) == 0x00000020)

Просмотреть файл

@ -474,7 +474,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
unsigned long handler = (unsigned long)ka->sa.sa_handler; unsigned long handler = (unsigned long)ka->sa.sa_handler;
unsigned long retcode; unsigned long retcode;
int thumb = 0; int thumb = 0;
unsigned long cpsr = regs->ARM_cpsr & ~PSR_f; unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
cpsr |= PSR_ENDSTATE;
/* /*
* Maybe we need to deliver a 32-bit signal to a 26-bit task. * Maybe we need to deliver a 32-bit signal to a 26-bit task.

Просмотреть файл

@ -21,6 +21,12 @@
#define ARM_CPU_KEEP(x) #define ARM_CPU_KEEP(x)
#endif #endif
#if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)
#define ARM_EXIT_KEEP(x) x
#else
#define ARM_EXIT_KEEP(x)
#endif
OUTPUT_ARCH(arm) OUTPUT_ARCH(arm)
ENTRY(stext) ENTRY(stext)
@ -43,6 +49,7 @@ SECTIONS
_sinittext = .; _sinittext = .;
HEAD_TEXT HEAD_TEXT
INIT_TEXT INIT_TEXT
ARM_EXIT_KEEP(EXIT_TEXT)
_einittext = .; _einittext = .;
ARM_CPU_DISCARD(PROC_INFO) ARM_CPU_DISCARD(PROC_INFO)
__arch_info_begin = .; __arch_info_begin = .;
@ -67,6 +74,7 @@ SECTIONS
#ifndef CONFIG_XIP_KERNEL #ifndef CONFIG_XIP_KERNEL
__init_begin = _stext; __init_begin = _stext;
INIT_DATA INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
#endif #endif
} }
@ -162,6 +170,7 @@ SECTIONS
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
__init_begin = .; __init_begin = .;
INIT_DATA INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
__init_end = .; __init_end = .;
#endif #endif
@ -247,6 +256,8 @@ SECTIONS
} }
#endif #endif
NOTES
BSS_SECTION(0, 0, 0) BSS_SECTION(0, 0, 0)
_end = .; _end = .;

Просмотреть файл

@ -1,6 +1,6 @@
/* linux/arch/arm/mach-s5p6442/include/mach/map.h /* linux/arch/arm/mach-s5p6442/include/mach/map.h
* *
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
* S5P6442 - Memory map definitions * S5P6442 - Memory map definitions
@ -16,56 +16,61 @@
#include <plat/map-base.h> #include <plat/map-base.h>
#include <plat/map-s5p.h> #include <plat/map-s5p.h>
#define S5P6442_PA_CHIPID (0xE0000000) #define S5P6442_PA_SDRAM 0x20000000
#define S5P_PA_CHIPID S5P6442_PA_CHIPID
#define S5P6442_PA_SYSCON (0xE0100000) #define S5P6442_PA_I2S0 0xC0B00000
#define S5P_PA_SYSCON S5P6442_PA_SYSCON #define S5P6442_PA_I2S1 0xF2200000
#define S5P6442_PA_GPIO (0xE0200000) #define S5P6442_PA_CHIPID 0xE0000000
#define S5P6442_PA_VIC0 (0xE4000000) #define S5P6442_PA_SYSCON 0xE0100000
#define S5P6442_PA_VIC1 (0xE4100000)
#define S5P6442_PA_VIC2 (0xE4200000)
#define S5P6442_PA_SROMC (0xE7000000) #define S5P6442_PA_GPIO 0xE0200000
#define S5P_PA_SROMC S5P6442_PA_SROMC
#define S5P6442_PA_VIC0 0xE4000000
#define S5P6442_PA_VIC1 0xE4100000
#define S5P6442_PA_VIC2 0xE4200000
#define S5P6442_PA_SROMC 0xE7000000
#define S5P6442_PA_MDMA 0xE8000000 #define S5P6442_PA_MDMA 0xE8000000
#define S5P6442_PA_PDMA 0xE9000000 #define S5P6442_PA_PDMA 0xE9000000
#define S5P6442_PA_TIMER (0xEA000000) #define S5P6442_PA_TIMER 0xEA000000
#define S5P_PA_TIMER S5P6442_PA_TIMER
#define S5P6442_PA_SYSTIMER (0xEA100000) #define S5P6442_PA_SYSTIMER 0xEA100000
#define S5P6442_PA_WATCHDOG (0xEA200000) #define S5P6442_PA_WATCHDOG 0xEA200000
#define S5P6442_PA_UART (0xEC000000) #define S5P6442_PA_UART 0xEC000000
#define S5P_PA_UART0 (S5P6442_PA_UART + 0x0) #define S5P6442_PA_IIC0 0xEC100000
#define S5P_PA_UART1 (S5P6442_PA_UART + 0x400)
#define S5P_PA_UART2 (S5P6442_PA_UART + 0x800)
#define S5P_SZ_UART SZ_256
#define S5P6442_PA_IIC0 (0xEC100000)
#define S5P6442_PA_SDRAM (0x20000000)
#define S5P_PA_SDRAM S5P6442_PA_SDRAM
#define S5P6442_PA_SPI 0xEC300000 #define S5P6442_PA_SPI 0xEC300000
/* I2S */
#define S5P6442_PA_I2S0 0xC0B00000
#define S5P6442_PA_I2S1 0xF2200000
/* PCM */
#define S5P6442_PA_PCM0 0xF2400000 #define S5P6442_PA_PCM0 0xF2400000
#define S5P6442_PA_PCM1 0xF2500000 #define S5P6442_PA_PCM1 0xF2500000
/* compatibiltiy defines. */ /* Compatibiltiy Defines */
#define S3C_PA_WDT S5P6442_PA_WATCHDOG
#define S3C_PA_UART S5P6442_PA_UART
#define S3C_PA_IIC S5P6442_PA_IIC0 #define S3C_PA_IIC S5P6442_PA_IIC0
#define S3C_PA_WDT S5P6442_PA_WATCHDOG
#define S5P_PA_CHIPID S5P6442_PA_CHIPID
#define S5P_PA_SDRAM S5P6442_PA_SDRAM
#define S5P_PA_SROMC S5P6442_PA_SROMC
#define S5P_PA_SYSCON S5P6442_PA_SYSCON
#define S5P_PA_TIMER S5P6442_PA_TIMER
/* UART */
#define S3C_PA_UART S5P6442_PA_UART
#define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
#define S5P_PA_UART0 S5P_PA_UART(0)
#define S5P_PA_UART1 S5P_PA_UART(1)
#define S5P_PA_UART2 S5P_PA_UART(2)
#define S5P_SZ_UART SZ_256
#endif /* __ASM_ARCH_MAP_H */ #endif /* __ASM_ARCH_MAP_H */

Просмотреть файл

@ -1,6 +1,6 @@
/* linux/arch/arm/mach-s5p64x0/include/mach/map.h /* linux/arch/arm/mach-s5p64x0/include/mach/map.h
* *
* Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
* S5P64X0 - Memory map definitions * S5P64X0 - Memory map definitions
@ -16,30 +16,63 @@
#include <plat/map-base.h> #include <plat/map-base.h>
#include <plat/map-s5p.h> #include <plat/map-s5p.h>
#define S5P64X0_PA_SDRAM (0x20000000) #define S5P64X0_PA_SDRAM 0x20000000
#define S5P64X0_PA_CHIPID 0xE0000000
#define S5P64X0_PA_SYSCON 0xE0100000
#define S5P64X0_PA_GPIO 0xE0308000
#define S5P64X0_PA_VIC0 0xE4000000
#define S5P64X0_PA_VIC1 0xE4100000
#define S5P64X0_PA_SROMC 0xE7000000
#define S5P64X0_PA_PDMA 0xE9000000
#define S5P64X0_PA_TIMER 0xEA000000
#define S5P64X0_PA_RTC 0xEA100000
#define S5P64X0_PA_WDT 0xEA200000
#define S5P6440_PA_IIC0 0xEC104000
#define S5P6440_PA_IIC1 0xEC20F000
#define S5P6450_PA_IIC0 0xEC100000
#define S5P6450_PA_IIC1 0xEC200000
#define S5P64X0_PA_SPI0 0xEC400000
#define S5P64X0_PA_SPI1 0xEC500000
#define S5P64X0_PA_HSOTG 0xED100000
#define S5P64X0_PA_HSMMC(x) (0xED800000 + ((x) * 0x100000))
#define S5P64X0_PA_I2S 0xF2000000
#define S5P6450_PA_I2S1 0xF2800000
#define S5P6450_PA_I2S2 0xF2900000
#define S5P64X0_PA_PCM 0xF2100000
#define S5P64X0_PA_ADC 0xF3000000
/* Compatibiltiy Defines */
#define S3C_PA_HSMMC0 S5P64X0_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5P64X0_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5P64X0_PA_HSMMC(2)
#define S3C_PA_IIC S5P6440_PA_IIC0
#define S3C_PA_IIC1 S5P6440_PA_IIC1
#define S3C_PA_RTC S5P64X0_PA_RTC
#define S3C_PA_WDT S5P64X0_PA_WDT
#define S5P64X0_PA_CHIPID (0xE0000000)
#define S5P_PA_CHIPID S5P64X0_PA_CHIPID #define S5P_PA_CHIPID S5P64X0_PA_CHIPID
#define S5P64X0_PA_SYSCON (0xE0100000)
#define S5P_PA_SYSCON S5P64X0_PA_SYSCON
#define S5P64X0_PA_GPIO (0xE0308000)
#define S5P64X0_PA_VIC0 (0xE4000000)
#define S5P64X0_PA_VIC1 (0xE4100000)
#define S5P64X0_PA_SROMC (0xE7000000)
#define S5P_PA_SROMC S5P64X0_PA_SROMC #define S5P_PA_SROMC S5P64X0_PA_SROMC
#define S5P_PA_SYSCON S5P64X0_PA_SYSCON
#define S5P64X0_PA_PDMA (0xE9000000)
#define S5P64X0_PA_TIMER (0xEA000000)
#define S5P_PA_TIMER S5P64X0_PA_TIMER #define S5P_PA_TIMER S5P64X0_PA_TIMER
#define S5P64X0_PA_RTC (0xEA100000) #define SAMSUNG_PA_ADC S5P64X0_PA_ADC
#define S5P64X0_PA_WDT (0xEA200000) /* UART */
#define S5P6440_PA_UART(x) (0xEC000000 + ((x) * S3C_UART_OFFSET)) #define S5P6440_PA_UART(x) (0xEC000000 + ((x) * S3C_UART_OFFSET))
#define S5P6450_PA_UART(x) ((x < 5) ? (0xEC800000 + ((x) * S3C_UART_OFFSET)) : (0xEC000000)) #define S5P6450_PA_UART(x) ((x < 5) ? (0xEC800000 + ((x) * S3C_UART_OFFSET)) : (0xEC000000))
@ -53,36 +86,4 @@
#define S5P_SZ_UART SZ_256 #define S5P_SZ_UART SZ_256
#define S5P6440_PA_IIC0 (0xEC104000)
#define S5P6440_PA_IIC1 (0xEC20F000)
#define S5P6450_PA_IIC0 (0xEC100000)
#define S5P6450_PA_IIC1 (0xEC200000)
#define S5P64X0_PA_SPI0 (0xEC400000)
#define S5P64X0_PA_SPI1 (0xEC500000)
#define S5P64X0_PA_HSOTG (0xED100000)
#define S5P64X0_PA_HSMMC(x) (0xED800000 + ((x) * 0x100000))
#define S5P64X0_PA_I2S (0xF2000000)
#define S5P6450_PA_I2S1 0xF2800000
#define S5P6450_PA_I2S2 0xF2900000
#define S5P64X0_PA_PCM (0xF2100000)
#define S5P64X0_PA_ADC (0xF3000000)
/* compatibiltiy defines. */
#define S3C_PA_HSMMC0 S5P64X0_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5P64X0_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5P64X0_PA_HSMMC(2)
#define S3C_PA_IIC S5P6440_PA_IIC0
#define S3C_PA_IIC1 S5P6440_PA_IIC1
#define S3C_PA_RTC S5P64X0_PA_RTC
#define S3C_PA_WDT S5P64X0_PA_WDT
#define SAMSUNG_PA_ADC S5P64X0_PA_ADC
#endif /* __ASM_ARCH_MAP_H */ #endif /* __ASM_ARCH_MAP_H */

Просмотреть файл

@ -1,4 +1,7 @@
/* linux/arch/arm/mach-s5pc100/include/mach/map.h /* linux/arch/arm/mach-s5pc100/include/mach/map.h
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
* *
* Copyright 2009 Samsung Electronics Co. * Copyright 2009 Samsung Electronics Co.
* Byungho Min <bhmin@samsung.com> * Byungho Min <bhmin@samsung.com>
@ -16,145 +19,115 @@
#include <plat/map-base.h> #include <plat/map-base.h>
#include <plat/map-s5p.h> #include <plat/map-s5p.h>
/* #define S5PC100_PA_SDRAM 0x20000000
* map-base.h has already defined virtual memory address
* S3C_VA_IRQ S3C_ADDR(0x00000000) irq controller(s)
* S3C_VA_SYS S3C_ADDR(0x00100000) system control
* S3C_VA_MEM S3C_ADDR(0x00200000) system control (not used)
* S3C_VA_TIMER S3C_ADDR(0x00300000) timer block
* S3C_VA_WATCHDOG S3C_ADDR(0x00400000) watchdog
* S3C_VA_UART S3C_ADDR(0x01000000) UART
*
* S5PC100 specific virtual memory address can be defined here
* S5PC1XX_VA_GPIO S3C_ADDR(0x00500000) GPIO
*
*/
#define S5PC100_PA_ONENAND_BUF (0xB0000000) #define S5PC100_PA_ONENAND 0xE7100000
#define S5PC100_SZ_ONENAND_BUF (SZ_256M - SZ_32M) #define S5PC100_PA_ONENAND_BUF 0xB0000000
/* Chip ID */ #define S5PC100_PA_CHIPID 0xE0000000
#define S5PC100_PA_CHIPID (0xE0000000) #define S5PC100_PA_SYSCON 0xE0100000
#define S5P_PA_CHIPID S5PC100_PA_CHIPID
#define S5PC100_PA_SYSCON (0xE0100000) #define S5PC100_PA_OTHERS 0xE0200000
#define S5P_PA_SYSCON S5PC100_PA_SYSCON
#define S5PC100_PA_OTHERS (0xE0200000) #define S5PC100_PA_GPIO 0xE0300000
#define S5PC100_VA_OTHERS (S3C_VA_SYS + 0x10000)
#define S5PC100_PA_GPIO (0xE0300000) #define S5PC100_PA_VIC0 0xE4000000
#define S5PC1XX_VA_GPIO S3C_ADDR(0x00500000) #define S5PC100_PA_VIC1 0xE4100000
#define S5PC100_PA_VIC2 0xE4200000
/* Interrupt */ #define S5PC100_PA_SROMC 0xE7000000
#define S5PC100_PA_VIC0 (0xE4000000)
#define S5PC100_PA_VIC1 (0xE4100000)
#define S5PC100_PA_VIC2 (0xE4200000)
#define S5PC100_VA_VIC S3C_VA_IRQ
#define S5PC100_VA_VIC_OFFSET 0x10000
#define S5PC1XX_VA_VIC(x) (S5PC100_VA_VIC + ((x) * S5PC100_VA_VIC_OFFSET))
#define S5PC100_PA_SROMC (0xE7000000) #define S5PC100_PA_CFCON 0xE7800000
#define S5P_PA_SROMC S5PC100_PA_SROMC
#define S5PC100_PA_ONENAND (0xE7100000) #define S5PC100_PA_MDMA 0xE8100000
#define S5PC100_PA_PDMA0 0xE9000000
#define S5PC100_PA_PDMA1 0xE9200000
#define S5PC100_PA_CFCON (0xE7800000) #define S5PC100_PA_TIMER 0xEA000000
#define S5PC100_PA_SYSTIMER 0xEA100000
#define S5PC100_PA_WATCHDOG 0xEA200000
#define S5PC100_PA_RTC 0xEA300000
/* DMA */ #define S5PC100_PA_UART 0xEC000000
#define S5PC100_PA_MDMA (0xE8100000)
#define S5PC100_PA_PDMA0 (0xE9000000)
#define S5PC100_PA_PDMA1 (0xE9200000)
/* Timer */ #define S5PC100_PA_IIC0 0xEC100000
#define S5PC100_PA_TIMER (0xEA000000) #define S5PC100_PA_IIC1 0xEC200000
#define S5P_PA_TIMER S5PC100_PA_TIMER
#define S5PC100_PA_SYSTIMER (0xEA100000) #define S5PC100_PA_SPI0 0xEC300000
#define S5PC100_PA_SPI1 0xEC400000
#define S5PC100_PA_SPI2 0xEC500000
#define S5PC100_PA_WATCHDOG (0xEA200000) #define S5PC100_PA_USB_HSOTG 0xED200000
#define S5PC100_PA_RTC (0xEA300000) #define S5PC100_PA_USB_HSPHY 0xED300000
#define S5PC100_PA_UART (0xEC000000) #define S5PC100_PA_HSMMC(x) (0xED800000 + ((x) * 0x100000))
#define S5P_PA_UART0 (S5PC100_PA_UART + 0x0) #define S5PC100_PA_FB 0xEE000000
#define S5P_PA_UART1 (S5PC100_PA_UART + 0x400)
#define S5P_PA_UART2 (S5PC100_PA_UART + 0x800)
#define S5P_PA_UART3 (S5PC100_PA_UART + 0xC00)
#define S5P_SZ_UART SZ_256
#define S5PC100_PA_IIC0 (0xEC100000) #define S5PC100_PA_FIMC0 0xEE200000
#define S5PC100_PA_IIC1 (0xEC200000) #define S5PC100_PA_FIMC1 0xEE300000
#define S5PC100_PA_FIMC2 0xEE400000
/* SPI */ #define S5PC100_PA_I2S0 0xF2000000
#define S5PC100_PA_SPI0 0xEC300000 #define S5PC100_PA_I2S1 0xF2100000
#define S5PC100_PA_SPI1 0xEC400000 #define S5PC100_PA_I2S2 0xF2200000
#define S5PC100_PA_SPI2 0xEC500000
/* USB HS OTG */ #define S5PC100_PA_AC97 0xF2300000
#define S5PC100_PA_USB_HSOTG (0xED200000)
#define S5PC100_PA_USB_HSPHY (0xED300000)
#define S5PC100_PA_FB (0xEE000000) #define S5PC100_PA_PCM0 0xF2400000
#define S5PC100_PA_PCM1 0xF2500000
#define S5PC100_PA_FIMC0 (0xEE200000) #define S5PC100_PA_SPDIF 0xF2600000
#define S5PC100_PA_FIMC1 (0xEE300000)
#define S5PC100_PA_FIMC2 (0xEE400000)
#define S5PC100_PA_I2S0 (0xF2000000) #define S5PC100_PA_TSADC 0xF3000000
#define S5PC100_PA_I2S1 (0xF2100000)
#define S5PC100_PA_I2S2 (0xF2200000)
#define S5PC100_PA_AC97 0xF2300000 #define S5PC100_PA_KEYPAD 0xF3100000
/* PCM */ /* Compatibiltiy Defines */
#define S5PC100_PA_PCM0 0xF2400000
#define S5PC100_PA_PCM1 0xF2500000
#define S5PC100_PA_SPDIF 0xF2600000 #define S3C_PA_FB S5PC100_PA_FB
#define S3C_PA_HSMMC0 S5PC100_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5PC100_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5PC100_PA_HSMMC(2)
#define S3C_PA_IIC S5PC100_PA_IIC0
#define S3C_PA_IIC1 S5PC100_PA_IIC1
#define S3C_PA_KEYPAD S5PC100_PA_KEYPAD
#define S3C_PA_ONENAND S5PC100_PA_ONENAND
#define S3C_PA_ONENAND_BUF S5PC100_PA_ONENAND_BUF
#define S3C_PA_RTC S5PC100_PA_RTC
#define S3C_PA_TSADC S5PC100_PA_TSADC
#define S3C_PA_USB_HSOTG S5PC100_PA_USB_HSOTG
#define S3C_PA_USB_HSPHY S5PC100_PA_USB_HSPHY
#define S3C_PA_WDT S5PC100_PA_WATCHDOG
#define S5PC100_PA_TSADC (0xF3000000) #define S5P_PA_CHIPID S5PC100_PA_CHIPID
#define S5P_PA_FIMC0 S5PC100_PA_FIMC0
#define S5P_PA_FIMC1 S5PC100_PA_FIMC1
#define S5P_PA_FIMC2 S5PC100_PA_FIMC2
#define S5P_PA_SDRAM S5PC100_PA_SDRAM
#define S5P_PA_SROMC S5PC100_PA_SROMC
#define S5P_PA_SYSCON S5PC100_PA_SYSCON
#define S5P_PA_TIMER S5PC100_PA_TIMER
/* KEYPAD */ #define SAMSUNG_PA_ADC S5PC100_PA_TSADC
#define S5PC100_PA_KEYPAD (0xF3100000) #define SAMSUNG_PA_CFCON S5PC100_PA_CFCON
#define SAMSUNG_PA_KEYPAD S5PC100_PA_KEYPAD
#define S5PC100_PA_HSMMC(x) (0xED800000 + ((x) * 0x100000)) #define S5PC100_VA_OTHERS (S3C_VA_SYS + 0x10000)
#define S5PC100_PA_SDRAM (0x20000000) #define S3C_SZ_ONENAND_BUF (SZ_256M - SZ_32M)
#define S5P_PA_SDRAM S5PC100_PA_SDRAM
/* compatibiltiy defines. */ /* UART */
#define S3C_PA_UART S5PC100_PA_UART
#define S3C_PA_IIC S5PC100_PA_IIC0
#define S3C_PA_IIC1 S5PC100_PA_IIC1
#define S3C_PA_FB S5PC100_PA_FB
#define S3C_PA_G2D S5PC100_PA_G2D
#define S3C_PA_G3D S5PC100_PA_G3D
#define S3C_PA_JPEG S5PC100_PA_JPEG
#define S3C_PA_ROTATOR S5PC100_PA_ROTATOR
#define S5P_VA_VIC0 S5PC1XX_VA_VIC(0)
#define S5P_VA_VIC1 S5PC1XX_VA_VIC(1)
#define S5P_VA_VIC2 S5PC1XX_VA_VIC(2)
#define S3C_PA_USB_HSOTG S5PC100_PA_USB_HSOTG
#define S3C_PA_USB_HSPHY S5PC100_PA_USB_HSPHY
#define S3C_PA_HSMMC0 S5PC100_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5PC100_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5PC100_PA_HSMMC(2)
#define S3C_PA_KEYPAD S5PC100_PA_KEYPAD
#define S3C_PA_WDT S5PC100_PA_WATCHDOG
#define S3C_PA_TSADC S5PC100_PA_TSADC
#define S3C_PA_ONENAND S5PC100_PA_ONENAND
#define S3C_PA_ONENAND_BUF S5PC100_PA_ONENAND_BUF
#define S3C_SZ_ONENAND_BUF S5PC100_SZ_ONENAND_BUF
#define S3C_PA_RTC S5PC100_PA_RTC
#define SAMSUNG_PA_ADC S5PC100_PA_TSADC #define S3C_PA_UART S5PC100_PA_UART
#define SAMSUNG_PA_CFCON S5PC100_PA_CFCON
#define SAMSUNG_PA_KEYPAD S5PC100_PA_KEYPAD
#define S5P_PA_FIMC0 S5PC100_PA_FIMC0 #define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
#define S5P_PA_FIMC1 S5PC100_PA_FIMC1 #define S5P_PA_UART0 S5P_PA_UART(0)
#define S5P_PA_FIMC2 S5PC100_PA_FIMC2 #define S5P_PA_UART1 S5P_PA_UART(1)
#define S5P_PA_UART2 S5P_PA_UART(2)
#define S5P_PA_UART3 S5P_PA_UART(3)
#endif /* __ASM_ARCH_C100_MAP_H */ #define S5P_SZ_UART SZ_256
#endif /* __ASM_ARCH_MAP_H */

Просмотреть файл

@ -1,6 +1,6 @@
/* linux/arch/arm/mach-s5pv210/include/mach/map.h /* linux/arch/arm/mach-s5pv210/include/mach/map.h
* *
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
* S5PV210 - Memory map definitions * S5PV210 - Memory map definitions
@ -16,122 +16,120 @@
#include <plat/map-base.h> #include <plat/map-base.h>
#include <plat/map-s5p.h> #include <plat/map-s5p.h>
#define S5PV210_PA_SROM_BANK5 (0xA8000000) #define S5PV210_PA_SDRAM 0x20000000
#define S5PC110_PA_ONENAND (0xB0000000) #define S5PV210_PA_SROM_BANK5 0xA8000000
#define S5P_PA_ONENAND S5PC110_PA_ONENAND
#define S5PC110_PA_ONENAND_DMA (0xB0600000) #define S5PC110_PA_ONENAND 0xB0000000
#define S5P_PA_ONENAND_DMA S5PC110_PA_ONENAND_DMA #define S5PC110_PA_ONENAND_DMA 0xB0600000
#define S5PV210_PA_CHIPID (0xE0000000) #define S5PV210_PA_CHIPID 0xE0000000
#define S5P_PA_CHIPID S5PV210_PA_CHIPID
#define S5PV210_PA_SYSCON (0xE0100000) #define S5PV210_PA_SYSCON 0xE0100000
#define S5P_PA_SYSCON S5PV210_PA_SYSCON
#define S5PV210_PA_GPIO (0xE0200000) #define S5PV210_PA_GPIO 0xE0200000
/* SPI */ #define S5PV210_PA_SPDIF 0xE1100000
#define S5PV210_PA_SPI0 0xE1300000
#define S5PV210_PA_SPI1 0xE1400000
#define S5PV210_PA_KEYPAD (0xE1600000) #define S5PV210_PA_SPI0 0xE1300000
#define S5PV210_PA_SPI1 0xE1400000
#define S5PV210_PA_IIC0 (0xE1800000) #define S5PV210_PA_KEYPAD 0xE1600000
#define S5PV210_PA_IIC1 (0xFAB00000)
#define S5PV210_PA_IIC2 (0xE1A00000)
#define S5PV210_PA_TIMER (0xE2500000) #define S5PV210_PA_ADC 0xE1700000
#define S5P_PA_TIMER S5PV210_PA_TIMER
#define S5PV210_PA_SYSTIMER (0xE2600000) #define S5PV210_PA_IIC0 0xE1800000
#define S5PV210_PA_IIC1 0xFAB00000
#define S5PV210_PA_IIC2 0xE1A00000
#define S5PV210_PA_WATCHDOG (0xE2700000) #define S5PV210_PA_AC97 0xE2200000
#define S5PV210_PA_RTC (0xE2800000) #define S5PV210_PA_PCM0 0xE2300000
#define S5PV210_PA_UART (0xE2900000) #define S5PV210_PA_PCM1 0xE1200000
#define S5PV210_PA_PCM2 0xE2B00000
#define S5P_PA_UART0 (S5PV210_PA_UART + 0x0) #define S5PV210_PA_TIMER 0xE2500000
#define S5P_PA_UART1 (S5PV210_PA_UART + 0x400) #define S5PV210_PA_SYSTIMER 0xE2600000
#define S5P_PA_UART2 (S5PV210_PA_UART + 0x800) #define S5PV210_PA_WATCHDOG 0xE2700000
#define S5P_PA_UART3 (S5PV210_PA_UART + 0xC00) #define S5PV210_PA_RTC 0xE2800000
#define S5P_SZ_UART SZ_256 #define S5PV210_PA_UART 0xE2900000
#define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) #define S5PV210_PA_SROMC 0xE8000000
#define S5PV210_PA_SROMC (0xE8000000) #define S5PV210_PA_CFCON 0xE8200000
#define S5P_PA_SROMC S5PV210_PA_SROMC
#define S5PV210_PA_CFCON (0xE8200000) #define S5PV210_PA_HSMMC(x) (0xEB000000 + ((x) * 0x100000))
#define S5PV210_PA_MDMA 0xFA200000 #define S5PV210_PA_HSOTG 0xEC000000
#define S5PV210_PA_PDMA0 0xE0900000 #define S5PV210_PA_HSPHY 0xEC100000
#define S5PV210_PA_PDMA1 0xE0A00000
#define S5PV210_PA_FB (0xF8000000) #define S5PV210_PA_IIS0 0xEEE30000
#define S5PV210_PA_IIS1 0xE2100000
#define S5PV210_PA_IIS2 0xE2A00000
#define S5PV210_PA_FIMC0 (0xFB200000) #define S5PV210_PA_DMC0 0xF0000000
#define S5PV210_PA_FIMC1 (0xFB300000) #define S5PV210_PA_DMC1 0xF1400000
#define S5PV210_PA_FIMC2 (0xFB400000)
#define S5PV210_PA_HSMMC(x) (0xEB000000 + ((x) * 0x100000)) #define S5PV210_PA_VIC0 0xF2000000
#define S5PV210_PA_VIC1 0xF2100000
#define S5PV210_PA_VIC2 0xF2200000
#define S5PV210_PA_VIC3 0xF2300000
#define S5PV210_PA_HSOTG (0xEC000000) #define S5PV210_PA_FB 0xF8000000
#define S5PV210_PA_HSPHY (0xEC100000)
#define S5PV210_PA_VIC0 (0xF2000000) #define S5PV210_PA_MDMA 0xFA200000
#define S5PV210_PA_VIC1 (0xF2100000) #define S5PV210_PA_PDMA0 0xE0900000
#define S5PV210_PA_VIC2 (0xF2200000) #define S5PV210_PA_PDMA1 0xE0A00000
#define S5PV210_PA_VIC3 (0xF2300000)
#define S5PV210_PA_SDRAM (0x20000000) #define S5PV210_PA_MIPI_CSIS 0xFA600000
#define S5P_PA_SDRAM S5PV210_PA_SDRAM
/* S/PDIF */ #define S5PV210_PA_FIMC0 0xFB200000
#define S5PV210_PA_SPDIF 0xE1100000 #define S5PV210_PA_FIMC1 0xFB300000
#define S5PV210_PA_FIMC2 0xFB400000
/* I2S */ /* Compatibiltiy Defines */
#define S5PV210_PA_IIS0 0xEEE30000
#define S5PV210_PA_IIS1 0xE2100000
#define S5PV210_PA_IIS2 0xE2A00000
/* PCM */ #define S3C_PA_FB S5PV210_PA_FB
#define S5PV210_PA_PCM0 0xE2300000 #define S3C_PA_HSMMC0 S5PV210_PA_HSMMC(0)
#define S5PV210_PA_PCM1 0xE1200000 #define S3C_PA_HSMMC1 S5PV210_PA_HSMMC(1)
#define S5PV210_PA_PCM2 0xE2B00000 #define S3C_PA_HSMMC2 S5PV210_PA_HSMMC(2)
#define S3C_PA_HSMMC3 S5PV210_PA_HSMMC(3)
#define S3C_PA_IIC S5PV210_PA_IIC0
#define S3C_PA_IIC1 S5PV210_PA_IIC1
#define S3C_PA_IIC2 S5PV210_PA_IIC2
#define S3C_PA_RTC S5PV210_PA_RTC
#define S3C_PA_USB_HSOTG S5PV210_PA_HSOTG
#define S3C_PA_WDT S5PV210_PA_WATCHDOG
/* AC97 */ #define S5P_PA_CHIPID S5PV210_PA_CHIPID
#define S5PV210_PA_AC97 0xE2200000 #define S5P_PA_FIMC0 S5PV210_PA_FIMC0
#define S5P_PA_FIMC1 S5PV210_PA_FIMC1
#define S5P_PA_FIMC2 S5PV210_PA_FIMC2
#define S5P_PA_MIPI_CSIS0 S5PV210_PA_MIPI_CSIS
#define S5P_PA_ONENAND S5PC110_PA_ONENAND
#define S5P_PA_ONENAND_DMA S5PC110_PA_ONENAND_DMA
#define S5P_PA_SDRAM S5PV210_PA_SDRAM
#define S5P_PA_SROMC S5PV210_PA_SROMC
#define S5P_PA_SYSCON S5PV210_PA_SYSCON
#define S5P_PA_TIMER S5PV210_PA_TIMER
#define S5PV210_PA_ADC (0xE1700000) #define SAMSUNG_PA_ADC S5PV210_PA_ADC
#define SAMSUNG_PA_CFCON S5PV210_PA_CFCON
#define SAMSUNG_PA_KEYPAD S5PV210_PA_KEYPAD
#define S5PV210_PA_DMC0 (0xF0000000) /* UART */
#define S5PV210_PA_DMC1 (0xF1400000)
#define S5PV210_PA_MIPI_CSIS 0xFA600000 #define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
/* compatibiltiy defines. */ #define S3C_PA_UART S5PV210_PA_UART
#define S3C_PA_UART S5PV210_PA_UART
#define S3C_PA_HSMMC0 S5PV210_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5PV210_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5PV210_PA_HSMMC(2)
#define S3C_PA_HSMMC3 S5PV210_PA_HSMMC(3)
#define S3C_PA_IIC S5PV210_PA_IIC0
#define S3C_PA_IIC1 S5PV210_PA_IIC1
#define S3C_PA_IIC2 S5PV210_PA_IIC2
#define S3C_PA_FB S5PV210_PA_FB
#define S3C_PA_RTC S5PV210_PA_RTC
#define S3C_PA_WDT S5PV210_PA_WATCHDOG
#define S3C_PA_USB_HSOTG S5PV210_PA_HSOTG
#define S5P_PA_FIMC0 S5PV210_PA_FIMC0
#define S5P_PA_FIMC1 S5PV210_PA_FIMC1
#define S5P_PA_FIMC2 S5PV210_PA_FIMC2
#define S5P_PA_MIPI_CSIS0 S5PV210_PA_MIPI_CSIS
#define SAMSUNG_PA_ADC S5PV210_PA_ADC #define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
#define SAMSUNG_PA_CFCON S5PV210_PA_CFCON #define S5P_PA_UART0 S5P_PA_UART(0)
#define SAMSUNG_PA_KEYPAD S5PV210_PA_KEYPAD #define S5P_PA_UART1 S5P_PA_UART(1)
#define S5P_PA_UART2 S5P_PA_UART(2)
#define S5P_PA_UART3 S5P_PA_UART(3)
#define S5P_SZ_UART SZ_256
#endif /* __ASM_ARCH_MAP_H */ #endif /* __ASM_ARCH_MAP_H */

Просмотреть файл

@ -149,7 +149,7 @@ static struct regulator_init_data aquila_ldo2_data = {
static struct regulator_init_data aquila_ldo3_data = { static struct regulator_init_data aquila_ldo3_data = {
.constraints = { .constraints = {
.name = "VUSB/MIPI_1.1V", .name = "VUSB+MIPI_1.1V",
.min_uV = 1100000, .min_uV = 1100000,
.max_uV = 1100000, .max_uV = 1100000,
.apply_uV = 1, .apply_uV = 1,
@ -197,7 +197,7 @@ static struct regulator_init_data aquila_ldo7_data = {
static struct regulator_init_data aquila_ldo8_data = { static struct regulator_init_data aquila_ldo8_data = {
.constraints = { .constraints = {
.name = "VUSB/VADC_3.3V", .name = "VUSB+VADC_3.3V",
.min_uV = 3300000, .min_uV = 3300000,
.max_uV = 3300000, .max_uV = 3300000,
.apply_uV = 1, .apply_uV = 1,
@ -207,7 +207,7 @@ static struct regulator_init_data aquila_ldo8_data = {
static struct regulator_init_data aquila_ldo9_data = { static struct regulator_init_data aquila_ldo9_data = {
.constraints = { .constraints = {
.name = "VCC/VCAM_2.8V", .name = "VCC+VCAM_2.8V",
.min_uV = 2800000, .min_uV = 2800000,
.max_uV = 2800000, .max_uV = 2800000,
.apply_uV = 1, .apply_uV = 1,
@ -381,9 +381,12 @@ static struct max8998_platform_data aquila_max8998_pdata = {
.buck1_set1 = S5PV210_GPH0(3), .buck1_set1 = S5PV210_GPH0(3),
.buck1_set2 = S5PV210_GPH0(4), .buck1_set2 = S5PV210_GPH0(4),
.buck2_set3 = S5PV210_GPH0(5), .buck2_set3 = S5PV210_GPH0(5),
.buck1_max_voltage1 = 1200000, .buck1_voltage1 = 1200000,
.buck1_max_voltage2 = 1200000, .buck1_voltage2 = 1200000,
.buck2_max_voltage = 1200000, .buck1_voltage3 = 1200000,
.buck1_voltage4 = 1200000,
.buck2_voltage1 = 1200000,
.buck2_voltage2 = 1200000,
}; };
#endif #endif

Просмотреть файл

@ -288,7 +288,7 @@ static struct regulator_init_data goni_ldo2_data = {
static struct regulator_init_data goni_ldo3_data = { static struct regulator_init_data goni_ldo3_data = {
.constraints = { .constraints = {
.name = "VUSB/MIPI_1.1V", .name = "VUSB+MIPI_1.1V",
.min_uV = 1100000, .min_uV = 1100000,
.max_uV = 1100000, .max_uV = 1100000,
.apply_uV = 1, .apply_uV = 1,
@ -337,7 +337,7 @@ static struct regulator_init_data goni_ldo7_data = {
static struct regulator_init_data goni_ldo8_data = { static struct regulator_init_data goni_ldo8_data = {
.constraints = { .constraints = {
.name = "VUSB/VADC_3.3V", .name = "VUSB+VADC_3.3V",
.min_uV = 3300000, .min_uV = 3300000,
.max_uV = 3300000, .max_uV = 3300000,
.apply_uV = 1, .apply_uV = 1,
@ -347,7 +347,7 @@ static struct regulator_init_data goni_ldo8_data = {
static struct regulator_init_data goni_ldo9_data = { static struct regulator_init_data goni_ldo9_data = {
.constraints = { .constraints = {
.name = "VCC/VCAM_2.8V", .name = "VCC+VCAM_2.8V",
.min_uV = 2800000, .min_uV = 2800000,
.max_uV = 2800000, .max_uV = 2800000,
.apply_uV = 1, .apply_uV = 1,
@ -521,9 +521,12 @@ static struct max8998_platform_data goni_max8998_pdata = {
.buck1_set1 = S5PV210_GPH0(3), .buck1_set1 = S5PV210_GPH0(3),
.buck1_set2 = S5PV210_GPH0(4), .buck1_set2 = S5PV210_GPH0(4),
.buck2_set3 = S5PV210_GPH0(5), .buck2_set3 = S5PV210_GPH0(5),
.buck1_max_voltage1 = 1200000, .buck1_voltage1 = 1200000,
.buck1_max_voltage2 = 1200000, .buck1_voltage2 = 1200000,
.buck2_max_voltage = 1200000, .buck1_voltage3 = 1200000,
.buck1_voltage4 = 1200000,
.buck2_voltage1 = 1200000,
.buck2_voltage2 = 1200000,
}; };
#endif #endif

Просмотреть файл

@ -1,6 +1,6 @@
/* linux/arch/arm/mach-s5pv310/include/mach/map.h /* linux/arch/arm/mach-s5pv310/include/mach/map.h
* *
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
* S5PV310 - Memory map definitions * S5PV310 - Memory map definitions
@ -23,90 +23,43 @@
#include <plat/map-s5p.h> #include <plat/map-s5p.h>
#define S5PV310_PA_SYSRAM (0x02025000) #define S5PV310_PA_SYSRAM 0x02025000
#define S5PV310_PA_I2S0 0x03830000
#define S5PV310_PA_I2S1 0xE3100000
#define S5PV310_PA_I2S2 0xE2A00000
#define S5PV310_PA_PCM0 0x03840000
#define S5PV310_PA_PCM1 0x13980000
#define S5PV310_PA_PCM2 0x13990000
#define S5PV310_PA_SROM_BANK(x) (0x04000000 + ((x) * 0x01000000)) #define S5PV310_PA_SROM_BANK(x) (0x04000000 + ((x) * 0x01000000))
#define S5PC210_PA_ONENAND (0x0C000000) #define S5PC210_PA_ONENAND 0x0C000000
#define S5P_PA_ONENAND S5PC210_PA_ONENAND #define S5PC210_PA_ONENAND_DMA 0x0C600000
#define S5PC210_PA_ONENAND_DMA (0x0C600000) #define S5PV310_PA_CHIPID 0x10000000
#define S5P_PA_ONENAND_DMA S5PC210_PA_ONENAND_DMA
#define S5PV310_PA_CHIPID (0x10000000) #define S5PV310_PA_SYSCON 0x10010000
#define S5P_PA_CHIPID S5PV310_PA_CHIPID #define S5PV310_PA_PMU 0x10020000
#define S5PV310_PA_CMU 0x10030000
#define S5PV310_PA_SYSCON (0x10010000) #define S5PV310_PA_WATCHDOG 0x10060000
#define S5P_PA_SYSCON S5PV310_PA_SYSCON #define S5PV310_PA_RTC 0x10070000
#define S5PV310_PA_PMU (0x10020000) #define S5PV310_PA_DMC0 0x10400000
#define S5PV310_PA_CMU (0x10030000) #define S5PV310_PA_COMBINER 0x10448000
#define S5PV310_PA_WATCHDOG (0x10060000) #define S5PV310_PA_COREPERI 0x10500000
#define S5PV310_PA_RTC (0x10070000) #define S5PV310_PA_GIC_CPU 0x10500100
#define S5PV310_PA_TWD 0x10500600
#define S5PV310_PA_GIC_DIST 0x10501000
#define S5PV310_PA_L2CC 0x10502000
#define S5PV310_PA_DMC0 (0x10400000) #define S5PV310_PA_MDMA 0x10810000
#define S5PV310_PA_PDMA0 0x12680000
#define S5PV310_PA_COMBINER (0x10448000) #define S5PV310_PA_PDMA1 0x12690000
#define S5PV310_PA_COREPERI (0x10500000)
#define S5PV310_PA_GIC_CPU (0x10500100)
#define S5PV310_PA_TWD (0x10500600)
#define S5PV310_PA_GIC_DIST (0x10501000)
#define S5PV310_PA_L2CC (0x10502000)
/* DMA */
#define S5PV310_PA_MDMA 0x10810000
#define S5PV310_PA_PDMA0 0x12680000
#define S5PV310_PA_PDMA1 0x12690000
#define S5PV310_PA_GPIO1 (0x11400000)
#define S5PV310_PA_GPIO2 (0x11000000)
#define S5PV310_PA_GPIO3 (0x03860000)
#define S5PV310_PA_MIPI_CSIS0 0x11880000
#define S5PV310_PA_MIPI_CSIS1 0x11890000
#define S5PV310_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000))
#define S5PV310_PA_SROMC (0x12570000)
#define S5P_PA_SROMC S5PV310_PA_SROMC
/* S/PDIF */
#define S5PV310_PA_SPDIF 0xE1100000
/* I2S */
#define S5PV310_PA_I2S0 0x03830000
#define S5PV310_PA_I2S1 0xE3100000
#define S5PV310_PA_I2S2 0xE2A00000
/* PCM */
#define S5PV310_PA_PCM0 0x03840000
#define S5PV310_PA_PCM1 0x13980000
#define S5PV310_PA_PCM2 0x13990000
/* AC97 */
#define S5PV310_PA_AC97 0x139A0000
#define S5PV310_PA_UART (0x13800000)
#define S5P_PA_UART(x) (S5PV310_PA_UART + ((x) * S3C_UART_OFFSET))
#define S5P_PA_UART0 S5P_PA_UART(0)
#define S5P_PA_UART1 S5P_PA_UART(1)
#define S5P_PA_UART2 S5P_PA_UART(2)
#define S5P_PA_UART3 S5P_PA_UART(3)
#define S5P_PA_UART4 S5P_PA_UART(4)
#define S5P_SZ_UART SZ_256
#define S5PV310_PA_IIC(x) (0x13860000 + ((x) * 0x10000))
#define S5PV310_PA_TIMER (0x139D0000)
#define S5P_PA_TIMER S5PV310_PA_TIMER
#define S5PV310_PA_SDRAM (0x40000000)
#define S5P_PA_SDRAM S5PV310_PA_SDRAM
#define S5PV310_PA_SYSMMU_MDMA 0x10A40000 #define S5PV310_PA_SYSMMU_MDMA 0x10A40000
#define S5PV310_PA_SYSMMU_SSS 0x10A50000 #define S5PV310_PA_SYSMMU_SSS 0x10A50000
@ -125,8 +78,31 @@
#define S5PV310_PA_SYSMMU_MFC_L 0x13620000 #define S5PV310_PA_SYSMMU_MFC_L 0x13620000
#define S5PV310_PA_SYSMMU_MFC_R 0x13630000 #define S5PV310_PA_SYSMMU_MFC_R 0x13630000
/* compatibiltiy defines. */ #define S5PV310_PA_GPIO1 0x11400000
#define S3C_PA_UART S5PV310_PA_UART #define S5PV310_PA_GPIO2 0x11000000
#define S5PV310_PA_GPIO3 0x03860000
#define S5PV310_PA_MIPI_CSIS0 0x11880000
#define S5PV310_PA_MIPI_CSIS1 0x11890000
#define S5PV310_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000))
#define S5PV310_PA_SROMC 0x12570000
#define S5PV310_PA_UART 0x13800000
#define S5PV310_PA_IIC(x) (0x13860000 + ((x) * 0x10000))
#define S5PV310_PA_AC97 0x139A0000
#define S5PV310_PA_TIMER 0x139D0000
#define S5PV310_PA_SDRAM 0x40000000
#define S5PV310_PA_SPDIF 0xE1100000
/* Compatibiltiy Defines */
#define S3C_PA_HSMMC0 S5PV310_PA_HSMMC(0) #define S3C_PA_HSMMC0 S5PV310_PA_HSMMC(0)
#define S3C_PA_HSMMC1 S5PV310_PA_HSMMC(1) #define S3C_PA_HSMMC1 S5PV310_PA_HSMMC(1)
#define S3C_PA_HSMMC2 S5PV310_PA_HSMMC(2) #define S3C_PA_HSMMC2 S5PV310_PA_HSMMC(2)
@ -141,7 +117,28 @@
#define S3C_PA_IIC7 S5PV310_PA_IIC(7) #define S3C_PA_IIC7 S5PV310_PA_IIC(7)
#define S3C_PA_RTC S5PV310_PA_RTC #define S3C_PA_RTC S5PV310_PA_RTC
#define S3C_PA_WDT S5PV310_PA_WATCHDOG #define S3C_PA_WDT S5PV310_PA_WATCHDOG
#define S5P_PA_CHIPID S5PV310_PA_CHIPID
#define S5P_PA_MIPI_CSIS0 S5PV310_PA_MIPI_CSIS0 #define S5P_PA_MIPI_CSIS0 S5PV310_PA_MIPI_CSIS0
#define S5P_PA_MIPI_CSIS1 S5PV310_PA_MIPI_CSIS1 #define S5P_PA_MIPI_CSIS1 S5PV310_PA_MIPI_CSIS1
#define S5P_PA_ONENAND S5PC210_PA_ONENAND
#define S5P_PA_ONENAND_DMA S5PC210_PA_ONENAND_DMA
#define S5P_PA_SDRAM S5PV310_PA_SDRAM
#define S5P_PA_SROMC S5PV310_PA_SROMC
#define S5P_PA_SYSCON S5PV310_PA_SYSCON
#define S5P_PA_TIMER S5PV310_PA_TIMER
/* UART */
#define S3C_PA_UART S5PV310_PA_UART
#define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
#define S5P_PA_UART0 S5P_PA_UART(0)
#define S5P_PA_UART1 S5P_PA_UART(1)
#define S5P_PA_UART2 S5P_PA_UART(2)
#define S5P_PA_UART3 S5P_PA_UART(3)
#define S5P_PA_UART4 S5P_PA_UART(4)
#define S5P_SZ_UART SZ_256
#endif /* __ASM_ARCH_MAP_H */ #endif /* __ASM_ARCH_MAP_H */

Просмотреть файл

@ -62,7 +62,7 @@
#define SPEAR320_SMII1_BASE 0xAB000000 #define SPEAR320_SMII1_BASE 0xAB000000
#define SPEAR320_SMII1_SIZE 0x01000000 #define SPEAR320_SMII1_SIZE 0x01000000
#define SPEAR320_SOC_CONFIG_BASE 0xB4000000 #define SPEAR320_SOC_CONFIG_BASE 0xB3000000
#define SPEAR320_SOC_CONFIG_SIZE 0x00000070 #define SPEAR320_SOC_CONFIG_SIZE 0x00000070
/* Interrupt registers offsets and masks */ /* Interrupt registers offsets and masks */
#define INT_STS_MASK_REG 0x04 #define INT_STS_MASK_REG 0x04

Просмотреть файл

@ -49,7 +49,13 @@ static inline void cache_wait(void __iomem *reg, unsigned long mask)
static inline void cache_sync(void) static inline void cache_sync(void)
{ {
void __iomem *base = l2x0_base; void __iomem *base = l2x0_base;
#ifdef CONFIG_ARM_ERRATA_753970
/* write to an unmmapped register */
writel_relaxed(0, base + L2X0_DUMMY_REG);
#else
writel_relaxed(0, base + L2X0_CACHE_SYNC); writel_relaxed(0, base + L2X0_CACHE_SYNC);
#endif
cache_wait(base + L2X0_CACHE_SYNC, 1); cache_wait(base + L2X0_CACHE_SYNC, 1);
} }

Просмотреть файл

@ -264,6 +264,12 @@ __v7_setup:
orreq r10, r10, #1 << 6 @ set bit #6 orreq r10, r10, #1 << 6 @ set bit #6
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
#endif #endif
#ifdef CONFIG_ARM_ERRATA_751472
cmp r6, #0x30 @ present prior to r3p0
mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register
orrlt r10, r10, #1 << 11 @ set bit #11
mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register
#endif
3: mov r10, #0 3: mov r10, #0
#ifdef HARVARD_CACHE #ifdef HARVARD_CACHE

Просмотреть файл

@ -28,7 +28,7 @@
static struct resource s5p_uart0_resource[] = { static struct resource s5p_uart0_resource[] = {
[0] = { [0] = {
.start = S5P_PA_UART0, .start = S5P_PA_UART0,
.end = S5P_PA_UART0 + S5P_SZ_UART, .end = S5P_PA_UART0 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -51,7 +51,7 @@ static struct resource s5p_uart0_resource[] = {
static struct resource s5p_uart1_resource[] = { static struct resource s5p_uart1_resource[] = {
[0] = { [0] = {
.start = S5P_PA_UART1, .start = S5P_PA_UART1,
.end = S5P_PA_UART1 + S5P_SZ_UART, .end = S5P_PA_UART1 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -74,7 +74,7 @@ static struct resource s5p_uart1_resource[] = {
static struct resource s5p_uart2_resource[] = { static struct resource s5p_uart2_resource[] = {
[0] = { [0] = {
.start = S5P_PA_UART2, .start = S5P_PA_UART2,
.end = S5P_PA_UART2 + S5P_SZ_UART, .end = S5P_PA_UART2 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -98,7 +98,7 @@ static struct resource s5p_uart3_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 3 #if CONFIG_SERIAL_SAMSUNG_UARTS > 3
[0] = { [0] = {
.start = S5P_PA_UART3, .start = S5P_PA_UART3,
.end = S5P_PA_UART3 + S5P_SZ_UART, .end = S5P_PA_UART3 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -123,7 +123,7 @@ static struct resource s5p_uart4_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 4 #if CONFIG_SERIAL_SAMSUNG_UARTS > 4
[0] = { [0] = {
.start = S5P_PA_UART4, .start = S5P_PA_UART4,
.end = S5P_PA_UART4 + S5P_SZ_UART, .end = S5P_PA_UART4 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -148,7 +148,7 @@ static struct resource s5p_uart5_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 5 #if CONFIG_SERIAL_SAMSUNG_UARTS > 5
[0] = { [0] = {
.start = S5P_PA_UART5, .start = S5P_PA_UART5,
.end = S5P_PA_UART5 + S5P_SZ_UART, .end = S5P_PA_UART5 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {

Просмотреть файл

@ -58,4 +58,3 @@ void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
s3c_device_ts.dev.platform_data = npd; s3c_device_ts.dev.platform_data = npd;
} }
EXPORT_SYMBOL(s3c24xx_ts_set_platdata);

Просмотреть файл

@ -24,10 +24,10 @@ static inline void putc(int c)
{ {
void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE; void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE;
while (readl(base + UART01x_FR) & UART01x_FR_TXFF) while (readl_relaxed(base + UART01x_FR) & UART01x_FR_TXFF)
barrier(); barrier();
writel(c, base + UART01x_DR); writel_relaxed(c, base + UART01x_DR);
} }
static inline void flush(void) static inline void flush(void)

Просмотреть файл

@ -14,6 +14,6 @@
#ifndef __PLAT_VMALLOC_H #ifndef __PLAT_VMALLOC_H
#define __PLAT_VMALLOC_H #define __PLAT_VMALLOC_H
#define VMALLOC_END 0xF0000000 #define VMALLOC_END 0xF0000000UL
#endif /* __PLAT_VMALLOC_H */ #endif /* __PLAT_VMALLOC_H */

Просмотреть файл

@ -133,11 +133,12 @@ unsigned long decompress_kernel(void)
unsigned long output_addr; unsigned long output_addr;
unsigned char *output; unsigned char *output;
check_ipl_parmblock((void *) 0, (unsigned long) output + SZ__bss_start); output_addr = ((unsigned long) &_end + HEAP_SIZE + 4095UL) & -4096UL;
check_ipl_parmblock((void *) 0, output_addr + SZ__bss_start);
memset(&_bss, 0, &_ebss - &_bss); memset(&_bss, 0, &_ebss - &_bss);
free_mem_ptr = (unsigned long)&_end; free_mem_ptr = (unsigned long)&_end;
free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
output = (unsigned char *) ((free_mem_end_ptr + 4095UL) & -4096UL); output = (unsigned char *) output_addr;
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
/* /*

Просмотреть файл

@ -36,14 +36,19 @@
static inline int atomic_read(const atomic_t *v) static inline int atomic_read(const atomic_t *v)
{ {
barrier(); int c;
return v->counter;
asm volatile(
" l %0,%1\n"
: "=d" (c) : "Q" (v->counter));
return c;
} }
static inline void atomic_set(atomic_t *v, int i) static inline void atomic_set(atomic_t *v, int i)
{ {
v->counter = i; asm volatile(
barrier(); " st %1,%0\n"
: "=Q" (v->counter) : "d" (i));
} }
static inline int atomic_add_return(int i, atomic_t *v) static inline int atomic_add_return(int i, atomic_t *v)
@ -128,14 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
static inline long long atomic64_read(const atomic64_t *v) static inline long long atomic64_read(const atomic64_t *v)
{ {
barrier(); long long c;
return v->counter;
asm volatile(
" lg %0,%1\n"
: "=d" (c) : "Q" (v->counter));
return c;
} }
static inline void atomic64_set(atomic64_t *v, long long i) static inline void atomic64_set(atomic64_t *v, long long i)
{ {
v->counter = i; asm volatile(
barrier(); " stg %1,%0\n"
: "=Q" (v->counter) : "d" (i));
} }
static inline long long atomic64_add_return(long long i, atomic64_t *v) static inline long long atomic64_add_return(long long i, atomic64_t *v)

Просмотреть файл

@ -13,6 +13,7 @@
#define L1_CACHE_BYTES 256 #define L1_CACHE_BYTES 256
#define L1_CACHE_SHIFT 8 #define L1_CACHE_SHIFT 8
#define NET_SKB_PAD 32
#define __read_mostly __attribute__((__section__(".data..read_mostly"))) #define __read_mostly __attribute__((__section__(".data..read_mostly")))

Просмотреть файл

@ -811,7 +811,7 @@ config X86_LOCAL_APIC
config X86_IO_APIC config X86_IO_APIC
def_bool y def_bool y
depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_IOAPIC
config X86_VISWS_APIC config X86_VISWS_APIC
def_bool y def_bool y

Просмотреть файл

@ -426,4 +426,16 @@ struct local_apic {
#else #else
#define BAD_APICID 0xFFFFu #define BAD_APICID 0xFFFFu
#endif #endif
enum ioapic_irq_destination_types {
dest_Fixed = 0,
dest_LowestPrio = 1,
dest_SMI = 2,
dest__reserved_1 = 3,
dest_NMI = 4,
dest_INIT = 5,
dest__reserved_2 = 6,
dest_ExtINT = 7
};
#endif /* _ASM_X86_APICDEF_H */ #endif /* _ASM_X86_APICDEF_H */

Просмотреть файл

@ -63,17 +63,6 @@ union IO_APIC_reg_03 {
} __attribute__ ((packed)) bits; } __attribute__ ((packed)) bits;
}; };
enum ioapic_irq_destination_types {
dest_Fixed = 0,
dest_LowestPrio = 1,
dest_SMI = 2,
dest__reserved_1 = 3,
dest_NMI = 4,
dest_INIT = 5,
dest__reserved_2 = 6,
dest_ExtINT = 7
};
struct IO_APIC_route_entry { struct IO_APIC_route_entry {
__u32 vector : 8, __u32 vector : 8,
delivery_mode : 3, /* 000: FIXED delivery_mode : 3, /* 000: FIXED
@ -106,6 +95,10 @@ struct IR_IO_APIC_route_entry {
index : 15; index : 15;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define IOAPIC_AUTO -1
#define IOAPIC_EDGE 0
#define IOAPIC_LEVEL 1
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
/* /*
@ -150,11 +143,6 @@ extern int timer_through_8259;
#define io_apic_assign_pci_irqs \ #define io_apic_assign_pci_irqs \
(mp_irq_entries && !skip_ioapic_setup && io_apic_irqs) (mp_irq_entries && !skip_ioapic_setup && io_apic_irqs)
extern u8 io_apic_unique_id(u8 id);
extern int io_apic_get_unique_id(int ioapic, int apic_id);
extern int io_apic_get_version(int ioapic);
extern int io_apic_get_redir_entries(int ioapic);
struct io_apic_irq_attr; struct io_apic_irq_attr;
extern int io_apic_set_pci_routing(struct device *dev, int irq, extern int io_apic_set_pci_routing(struct device *dev, int irq,
struct io_apic_irq_attr *irq_attr); struct io_apic_irq_attr *irq_attr);
@ -162,6 +150,8 @@ void setup_IO_APIC_irq_extra(u32 gsi);
extern void ioapic_and_gsi_init(void); extern void ioapic_and_gsi_init(void);
extern void ioapic_insert_resources(void); extern void ioapic_insert_resources(void);
int io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr);
extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); extern struct IO_APIC_route_entry **alloc_ioapic_entries(void);
extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries); extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries);
extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
@ -186,6 +176,8 @@ extern void __init pre_init_apic_IRQ0(void);
extern void mp_save_irq(struct mpc_intsrc *m); extern void mp_save_irq(struct mpc_intsrc *m);
extern void disable_ioapic_support(void);
#else /* !CONFIG_X86_IO_APIC */ #else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0 #define io_apic_assign_pci_irqs 0
@ -199,6 +191,26 @@ static inline int mp_find_ioapic(u32 gsi) { return 0; }
struct io_apic_irq_attr; struct io_apic_irq_attr;
static inline int io_apic_set_pci_routing(struct device *dev, int irq, static inline int io_apic_set_pci_routing(struct device *dev, int irq,
struct io_apic_irq_attr *irq_attr) { return 0; } struct io_apic_irq_attr *irq_attr) { return 0; }
static inline struct IO_APIC_route_entry **alloc_ioapic_entries(void)
{
return NULL;
}
static inline void free_ioapic_entries(struct IO_APIC_route_entry **ent) { }
static inline int save_IO_APIC_setup(struct IO_APIC_route_entry **ent)
{
return -ENOMEM;
}
static inline void mask_IO_APIC_setup(struct IO_APIC_route_entry **ent) { }
static inline int restore_IO_APIC_setup(struct IO_APIC_route_entry **ent)
{
return -ENOMEM;
}
static inline void mp_save_irq(struct mpc_intsrc *m) { };
static inline void disable_ioapic_support(void) { }
#endif #endif
#endif /* _ASM_X86_IO_APIC_H */ #endif /* _ASM_X86_IO_APIC_H */

Просмотреть файл

@ -43,6 +43,7 @@
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/io_apic.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/hpet.h> #include <asm/hpet.h>
#include <asm/idle.h> #include <asm/idle.h>
@ -1209,7 +1210,7 @@ void __cpuinit setup_local_APIC(void)
rdtscll(tsc); rdtscll(tsc);
if (disable_apic) { if (disable_apic) {
arch_disable_smp_support(); disable_ioapic_support();
return; return;
} }
@ -1448,7 +1449,7 @@ int __init enable_IR(void)
void __init enable_IR_x2apic(void) void __init enable_IR_x2apic(void)
{ {
unsigned long flags; unsigned long flags;
struct IO_APIC_route_entry **ioapic_entries = NULL; struct IO_APIC_route_entry **ioapic_entries;
int ret, x2apic_enabled = 0; int ret, x2apic_enabled = 0;
int dmar_table_init_ret; int dmar_table_init_ret;

Просмотреть файл

@ -108,7 +108,10 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
int skip_ioapic_setup; int skip_ioapic_setup;
void arch_disable_smp_support(void) /**
* disable_ioapic_support() - disables ioapic support at runtime
*/
void disable_ioapic_support(void)
{ {
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
noioapicquirk = 1; noioapicquirk = 1;
@ -120,11 +123,14 @@ void arch_disable_smp_support(void)
static int __init parse_noapic(char *str) static int __init parse_noapic(char *str)
{ {
/* disable IO-APIC */ /* disable IO-APIC */
arch_disable_smp_support(); disable_ioapic_support();
return 0; return 0;
} }
early_param("noapic", parse_noapic); early_param("noapic", parse_noapic);
static int io_apic_setup_irq_pin_once(unsigned int irq, int node,
struct io_apic_irq_attr *attr);
/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
void mp_save_irq(struct mpc_intsrc *m) void mp_save_irq(struct mpc_intsrc *m)
{ {
@ -818,7 +824,7 @@ static int EISA_ELCR(unsigned int irq)
#define default_MCA_trigger(idx) (1) #define default_MCA_trigger(idx) (1)
#define default_MCA_polarity(idx) default_ISA_polarity(idx) #define default_MCA_polarity(idx) default_ISA_polarity(idx)
static int MPBIOS_polarity(int idx) static int irq_polarity(int idx)
{ {
int bus = mp_irqs[idx].srcbus; int bus = mp_irqs[idx].srcbus;
int polarity; int polarity;
@ -860,7 +866,7 @@ static int MPBIOS_polarity(int idx)
return polarity; return polarity;
} }
static int MPBIOS_trigger(int idx) static int irq_trigger(int idx)
{ {
int bus = mp_irqs[idx].srcbus; int bus = mp_irqs[idx].srcbus;
int trigger; int trigger;
@ -932,16 +938,6 @@ static int MPBIOS_trigger(int idx)
return trigger; return trigger;
} }
static inline int irq_polarity(int idx)
{
return MPBIOS_polarity(idx);
}
static inline int irq_trigger(int idx)
{
return MPBIOS_trigger(idx);
}
static int pin_2_irq(int idx, int apic, int pin) static int pin_2_irq(int idx, int apic, int pin)
{ {
int irq; int irq;
@ -1220,10 +1216,6 @@ void __setup_vector_irq(int cpu)
static struct irq_chip ioapic_chip; static struct irq_chip ioapic_chip;
static struct irq_chip ir_ioapic_chip; static struct irq_chip ir_ioapic_chip;
#define IOAPIC_AUTO -1
#define IOAPIC_EDGE 0
#define IOAPIC_LEVEL 1
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
static inline int IO_APIC_irq_trigger(int irq) static inline int IO_APIC_irq_trigger(int irq)
{ {
@ -1385,33 +1377,26 @@ static struct {
DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
} mp_ioapic_routing[MAX_IO_APICS]; } mp_ioapic_routing[MAX_IO_APICS];
static void __init setup_IO_APIC_irqs(void) static bool __init io_apic_pin_not_connected(int idx, int apic_id, int pin)
{ {
int apic_id, pin, idx, irq, notcon = 0; if (idx != -1)
int node = cpu_to_node(0); return false;
struct irq_cfg *cfg;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); apic_printk(APIC_VERBOSE, KERN_DEBUG " apic %d pin %d not connected\n",
mp_ioapics[apic_id].apicid, pin);
return true;
}
static void __init __io_apic_setup_irqs(unsigned int apic_id)
{
int idx, node = cpu_to_node(0);
struct io_apic_irq_attr attr;
unsigned int pin, irq;
for (apic_id = 0; apic_id < nr_ioapics; apic_id++)
for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) { for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) {
idx = find_irq_entry(apic_id, pin, mp_INT); idx = find_irq_entry(apic_id, pin, mp_INT);
if (idx == -1) { if (io_apic_pin_not_connected(idx, apic_id, pin))
if (!notcon) {
notcon = 1;
apic_printk(APIC_VERBOSE,
KERN_DEBUG " %d-%d",
mp_ioapics[apic_id].apicid, pin);
} else
apic_printk(APIC_VERBOSE, " %d-%d",
mp_ioapics[apic_id].apicid, pin);
continue; continue;
}
if (notcon) {
apic_printk(APIC_VERBOSE,
" (apicid-pin) not connected\n");
notcon = 0;
}
irq = pin_2_irq(idx, apic_id, pin); irq = pin_2_irq(idx, apic_id, pin);
@ -1423,25 +1408,24 @@ static void __init setup_IO_APIC_irqs(void)
* installed and if it returns 1: * installed and if it returns 1:
*/ */
if (apic->multi_timer_check && if (apic->multi_timer_check &&
apic->multi_timer_check(apic_id, irq)) apic->multi_timer_check(apic_id, irq))
continue; continue;
cfg = alloc_irq_and_cfg_at(irq, node); set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx),
if (!cfg) irq_polarity(idx));
continue;
add_pin_to_irq_node(cfg, node, apic_id, pin); io_apic_setup_irq_pin(irq, node, &attr);
/*
* don't mark it in pin_programmed, so later acpi could
* set it correctly when irq < 16
*/
setup_ioapic_irq(apic_id, pin, irq, cfg, irq_trigger(idx),
irq_polarity(idx));
} }
}
if (notcon) static void __init setup_IO_APIC_irqs(void)
apic_printk(APIC_VERBOSE, {
" (apicid-pin) not connected\n"); unsigned int apic_id;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
for (apic_id = 0; apic_id < nr_ioapics; apic_id++)
__io_apic_setup_irqs(apic_id);
} }
/* /*
@ -1452,7 +1436,7 @@ static void __init setup_IO_APIC_irqs(void)
void setup_IO_APIC_irq_extra(u32 gsi) void setup_IO_APIC_irq_extra(u32 gsi)
{ {
int apic_id = 0, pin, idx, irq, node = cpu_to_node(0); int apic_id = 0, pin, idx, irq, node = cpu_to_node(0);
struct irq_cfg *cfg; struct io_apic_irq_attr attr;
/* /*
* Convert 'gsi' to 'ioapic.pin'. * Convert 'gsi' to 'ioapic.pin'.
@ -1472,21 +1456,10 @@ void setup_IO_APIC_irq_extra(u32 gsi)
if (apic_id == 0 || irq < NR_IRQS_LEGACY) if (apic_id == 0 || irq < NR_IRQS_LEGACY)
return; return;
cfg = alloc_irq_and_cfg_at(irq, node); set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx),
if (!cfg) irq_polarity(idx));
return;
add_pin_to_irq_node(cfg, node, apic_id, pin); io_apic_setup_irq_pin_once(irq, node, &attr);
if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) {
pr_debug("Pin %d-%d already programmed\n",
mp_ioapics[apic_id].apicid, pin);
return;
}
set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed);
setup_ioapic_irq(apic_id, pin, irq, cfg,
irq_trigger(idx), irq_polarity(idx));
} }
/* /*
@ -3605,7 +3578,40 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
} }
#endif /* CONFIG_HT_IRQ */ #endif /* CONFIG_HT_IRQ */
int __init io_apic_get_redir_entries (int ioapic) int
io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr)
{
struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node);
int ret;
if (!cfg)
return -EINVAL;
ret = __add_pin_to_irq_node(cfg, node, attr->ioapic, attr->ioapic_pin);
if (!ret)
setup_ioapic_irq(attr->ioapic, attr->ioapic_pin, irq, cfg,
attr->trigger, attr->polarity);
return ret;
}
static int io_apic_setup_irq_pin_once(unsigned int irq, int node,
struct io_apic_irq_attr *attr)
{
unsigned int id = attr->ioapic, pin = attr->ioapic_pin;
int ret;
/* Avoid redundant programming */
if (test_bit(pin, mp_ioapic_routing[id].pin_programmed)) {
pr_debug("Pin %d-%d already programmed\n",
mp_ioapics[id].apicid, pin);
return 0;
}
ret = io_apic_setup_irq_pin(irq, node, attr);
if (!ret)
set_bit(pin, mp_ioapic_routing[id].pin_programmed);
return ret;
}
static int __init io_apic_get_redir_entries(int ioapic)
{ {
union IO_APIC_reg_01 reg_01; union IO_APIC_reg_01 reg_01;
unsigned long flags; unsigned long flags;
@ -3659,96 +3665,24 @@ int __init arch_probe_nr_irqs(void)
} }
#endif #endif
static int __io_apic_set_pci_routing(struct device *dev, int irq, int io_apic_set_pci_routing(struct device *dev, int irq,
struct io_apic_irq_attr *irq_attr) struct io_apic_irq_attr *irq_attr)
{ {
struct irq_cfg *cfg;
int node; int node;
int ioapic, pin;
int trigger, polarity;
ioapic = irq_attr->ioapic;
if (!IO_APIC_IRQ(irq)) { if (!IO_APIC_IRQ(irq)) {
apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic); irq_attr->ioapic);
return -EINVAL; return -EINVAL;
} }
if (dev) node = dev ? dev_to_node(dev) : cpu_to_node(0);
node = dev_to_node(dev);
else
node = cpu_to_node(0);
cfg = alloc_irq_and_cfg_at(irq, node); return io_apic_setup_irq_pin_once(irq, node, irq_attr);
if (!cfg)
return 0;
pin = irq_attr->ioapic_pin;
trigger = irq_attr->trigger;
polarity = irq_attr->polarity;
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
if (irq >= legacy_pic->nr_legacy_irqs) {
if (__add_pin_to_irq_node(cfg, node, ioapic, pin)) {
printk(KERN_INFO "can not add pin %d for irq %d\n",
pin, irq);
return 0;
}
}
setup_ioapic_irq(ioapic, pin, irq, cfg, trigger, polarity);
return 0;
}
int io_apic_set_pci_routing(struct device *dev, int irq,
struct io_apic_irq_attr *irq_attr)
{
int ioapic, pin;
/*
* Avoid pin reprogramming. PRTs typically include entries
* with redundant pin->gsi mappings (but unique PCI devices);
* we only program the IOAPIC on the first.
*/
ioapic = irq_attr->ioapic;
pin = irq_attr->ioapic_pin;
if (test_bit(pin, mp_ioapic_routing[ioapic].pin_programmed)) {
pr_debug("Pin %d-%d already programmed\n",
mp_ioapics[ioapic].apicid, pin);
return 0;
}
set_bit(pin, mp_ioapic_routing[ioapic].pin_programmed);
return __io_apic_set_pci_routing(dev, irq, irq_attr);
}
u8 __init io_apic_unique_id(u8 id)
{
#ifdef CONFIG_X86_32
if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
!APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
return io_apic_get_unique_id(nr_ioapics, id);
else
return id;
#else
int i;
DECLARE_BITMAP(used, 256);
bitmap_zero(used, 256);
for (i = 0; i < nr_ioapics; i++) {
struct mpc_ioapic *ia = &mp_ioapics[i];
__set_bit(ia->apicid, used);
}
if (!test_bit(id, used))
return id;
return find_first_zero_bit(used, 256);
#endif
} }
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
int __init io_apic_get_unique_id(int ioapic, int apic_id) static int __init io_apic_get_unique_id(int ioapic, int apic_id)
{ {
union IO_APIC_reg_00 reg_00; union IO_APIC_reg_00 reg_00;
static physid_mask_t apic_id_map = PHYSID_MASK_NONE; static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
@ -3821,9 +3755,33 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id)
return apic_id; return apic_id;
} }
static u8 __init io_apic_unique_id(u8 id)
{
if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
!APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
return io_apic_get_unique_id(nr_ioapics, id);
else
return id;
}
#else
static u8 __init io_apic_unique_id(u8 id)
{
int i;
DECLARE_BITMAP(used, 256);
bitmap_zero(used, 256);
for (i = 0; i < nr_ioapics; i++) {
struct mpc_ioapic *ia = &mp_ioapics[i];
__set_bit(ia->apicid, used);
}
if (!test_bit(id, used))
return id;
return find_first_zero_bit(used, 256);
}
#endif #endif
int __init io_apic_get_version(int ioapic) static int __init io_apic_get_version(int ioapic)
{ {
union IO_APIC_reg_01 reg_01; union IO_APIC_reg_01 reg_01;
unsigned long flags; unsigned long flags;
@ -4026,7 +3984,7 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi)
return gsi - mp_gsi_routing[ioapic].gsi_base; return gsi - mp_gsi_routing[ioapic].gsi_base;
} }
static int bad_ioapic(unsigned long address) static __init int bad_ioapic(unsigned long address)
{ {
if (nr_ioapics >= MAX_IO_APICS) { if (nr_ioapics >= MAX_IO_APICS) {
printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded " printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded "
@ -4086,20 +4044,15 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
/* Enable IOAPIC early just for system timer */ /* Enable IOAPIC early just for system timer */
void __init pre_init_apic_IRQ0(void) void __init pre_init_apic_IRQ0(void)
{ {
struct irq_cfg *cfg; struct io_apic_irq_attr attr = { 0, 0, 0, 0 };
printk(KERN_INFO "Early APIC setup for system timer0\n"); printk(KERN_INFO "Early APIC setup for system timer0\n");
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
physid_set_mask_of_physid(boot_cpu_physical_apicid, physid_set_mask_of_physid(boot_cpu_physical_apicid,
&phys_cpu_present_map); &phys_cpu_present_map);
#endif #endif
/* Make sure the irq descriptor is set up */
cfg = alloc_irq_and_cfg_at(0, 0);
setup_local_APIC(); setup_local_APIC();
add_pin_to_irq_node(cfg, 0, 0, 0); io_apic_setup_irq_pin(0, 0, &attr);
set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge"); set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
setup_ioapic_irq(0, 0, 0, cfg, 0, 0);
} }

Просмотреть файл

@ -64,6 +64,7 @@
#include <asm/mtrr.h> #include <asm/mtrr.h>
#include <asm/mwait.h> #include <asm/mwait.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/io_apic.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/uv/uv.h> #include <asm/uv/uv.h>
#include <linux/mc146818rtc.h> #include <linux/mc146818rtc.h>
@ -945,6 +946,14 @@ int __cpuinit native_cpu_up(unsigned int cpu)
return 0; return 0;
} }
/**
* arch_disable_smp_support() - disables SMP support for x86 at runtime
*/
void arch_disable_smp_support(void)
{
disable_ioapic_support();
}
/* /*
* Fall back to non SMP mode after errors. * Fall back to non SMP mode after errors.
* *
@ -1045,7 +1054,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
"(tell your hw vendor)\n"); "(tell your hw vendor)\n");
} }
smpboot_clear_io_apic(); smpboot_clear_io_apic();
arch_disable_smp_support(); disable_ioapic_support();
return -1; return -1;
} }

Просмотреть файл

@ -866,8 +866,9 @@ static int popen(struct atm_vcc *vcc)
} }
skb = alloc_skb(sizeof(*header), GFP_ATOMIC); skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
if (!skb && net_ratelimit()) { if (!skb) {
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n"); if (net_ratelimit())
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
return -ENOMEM; return -ENOMEM;
} }
header = (void *)skb_put(skb, sizeof(*header)); header = (void *)skb_put(skb, sizeof(*header));

Просмотреть файл

@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[] = {
/* Atheros AR3011 with sflash firmware*/ /* Atheros AR3011 with sflash firmware*/
{ USB_DEVICE(0x0CF3, 0x3002) }, { USB_DEVICE(0x0CF3, 0x3002) },
/* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03F0, 0x311D) },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };

Просмотреть файл

@ -102,6 +102,9 @@ static struct usb_device_id blacklist_table[] = {
/* Atheros 3011 with sflash firmware */ /* Atheros 3011 with sflash firmware */
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
/* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
/* Broadcom BCM2035 */ /* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },

Просмотреть файл

@ -577,11 +577,9 @@ duration:
if (rc) if (rc)
return; return;
if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || if (be32_to_cpu(tpm_cmd.header.out.return_code)
be32_to_cpu(tpm_cmd.header.out.length) != 3 * sizeof(u32))
!= sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
return; return;
duration_cap = &tpm_cmd.params.getcap_out.cap.duration; duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
chip->vendor.duration[TPM_SHORT] = chip->vendor.duration[TPM_SHORT] =
usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short)); usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
@ -941,18 +939,6 @@ ssize_t tpm_show_caps_1_2(struct device * dev,
} }
EXPORT_SYMBOL_GPL(tpm_show_caps_1_2); EXPORT_SYMBOL_GPL(tpm_show_caps_1_2);
ssize_t tpm_show_timeouts(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct tpm_chip *chip = dev_get_drvdata(dev);
return sprintf(buf, "%d %d %d\n",
jiffies_to_usecs(chip->vendor.duration[TPM_SHORT]),
jiffies_to_usecs(chip->vendor.duration[TPM_MEDIUM]),
jiffies_to_usecs(chip->vendor.duration[TPM_LONG]));
}
EXPORT_SYMBOL_GPL(tpm_show_timeouts);
ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr, ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {

Просмотреть файл

@ -56,8 +56,6 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
char *); char *);
extern ssize_t tpm_show_temp_deactivated(struct device *, extern ssize_t tpm_show_temp_deactivated(struct device *,
struct device_attribute *attr, char *); struct device_attribute *attr, char *);
extern ssize_t tpm_show_timeouts(struct device *,
struct device_attribute *attr, char *);
struct tpm_chip; struct tpm_chip;

Просмотреть файл

@ -376,7 +376,6 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
NULL); NULL);
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL); static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);
static struct attribute *tis_attrs[] = { static struct attribute *tis_attrs[] = {
&dev_attr_pubek.attr, &dev_attr_pubek.attr,
@ -386,8 +385,7 @@ static struct attribute *tis_attrs[] = {
&dev_attr_owned.attr, &dev_attr_owned.attr,
&dev_attr_temp_deactivated.attr, &dev_attr_temp_deactivated.attr,
&dev_attr_caps.attr, &dev_attr_caps.attr,
&dev_attr_cancel.attr, &dev_attr_cancel.attr, NULL,
&dev_attr_timeouts.attr, NULL,
}; };
static struct attribute_group tis_attr_grp = { static struct attribute_group tis_attr_grp = {

Просмотреть файл

@ -1553,17 +1553,7 @@
/* Backlight control */ /* Backlight control */
#define BLC_PWM_CTL 0x61254 #define BLC_PWM_CTL 0x61254
#define BACKLIGHT_MODULATION_FREQ_SHIFT (17)
#define BLC_PWM_CTL2 0x61250 /* 965+ only */ #define BLC_PWM_CTL2 0x61250 /* 965+ only */
#define BLM_COMBINATION_MODE (1 << 30)
/*
* This is the most significant 15 bits of the number of backlight cycles in a
* complete cycle of the modulated backlight control.
*
* The actual value is this field multiplied by two.
*/
#define BACKLIGHT_MODULATION_FREQ_MASK (0x7fff << 17)
#define BLM_LEGACY_MODE (1 << 16)
/* /*
* This is the number of cycles out of the backlight modulation cycle for which * This is the number of cycles out of the backlight modulation cycle for which
* the backlight is on. * the backlight is on.

Просмотреть файл

@ -30,8 +30,6 @@
#include "intel_drv.h" #include "intel_drv.h"
#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
void void
intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
struct drm_display_mode *adjusted_mode) struct drm_display_mode *adjusted_mode)
@ -112,19 +110,6 @@ done:
dev_priv->pch_pf_size = (width << 16) | height; dev_priv->pch_pf_size = (width << 16) | height;
} }
static int is_backlight_combination_mode(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
if (INTEL_INFO(dev)->gen >= 4)
return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE;
if (IS_GEN2(dev))
return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE;
return 0;
}
static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
{ {
u32 val; u32 val;
@ -181,9 +166,6 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
if (INTEL_INFO(dev)->gen < 4) if (INTEL_INFO(dev)->gen < 4)
max &= ~1; max &= ~1;
} }
if (is_backlight_combination_mode(dev))
max *= 0xff;
} }
DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
@ -201,15 +183,6 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
if (IS_PINEVIEW(dev)) if (IS_PINEVIEW(dev))
val >>= 1; val >>= 1;
if (is_backlight_combination_mode(dev)){
u8 lbpc;
val &= ~1;
pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc);
val *= lbpc;
val >>= 1;
}
} }
DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
@ -232,16 +205,6 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
if (HAS_PCH_SPLIT(dev)) if (HAS_PCH_SPLIT(dev))
return intel_pch_panel_set_backlight(dev, level); return intel_pch_panel_set_backlight(dev, level);
if (is_backlight_combination_mode(dev)){
u32 max = intel_panel_get_max_backlight(dev);
u8 lpbc;
lpbc = level * 0xfe / max + 1;
level /= lpbc;
pci_write_config_byte(dev->pdev, PCI_LBPC, lpbc);
}
tmp = I915_READ(BLC_PWM_CTL); tmp = I915_READ(BLC_PWM_CTL);
if (IS_PINEVIEW(dev)) { if (IS_PINEVIEW(dev)) {
tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1);

Просмотреть файл

@ -238,13 +238,13 @@ config SENSORS_K8TEMP
will be called k8temp. will be called k8temp.
config SENSORS_K10TEMP config SENSORS_K10TEMP
tristate "AMD Phenom/Sempron/Turion/Opteron temperature sensor" tristate "AMD Family 10h/11h/12h/14h temperature sensor"
depends on X86 && PCI depends on X86 && PCI
help help
If you say yes here you get support for the temperature If you say yes here you get support for the temperature
sensor(s) inside your CPU. Supported are later revisions of sensor(s) inside your CPU. Supported are later revisions of
the AMD Family 10h and all revisions of the AMD Family 11h the AMD Family 10h and all revisions of the AMD Family 11h,
microarchitectures. 12h (Llano), and 14h (Brazos) microarchitectures.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called k10temp. will be called k10temp.
@ -455,13 +455,14 @@ config SENSORS_JZ4740
called jz4740-hwmon. called jz4740-hwmon.
config SENSORS_JC42 config SENSORS_JC42
tristate "JEDEC JC42.4 compliant temperature sensors" tristate "JEDEC JC42.4 compliant memory module temperature sensors"
depends on I2C depends on I2C
help help
If you say yes here you get support for Jedec JC42.4 compliant If you say yes here, you get support for JEDEC JC42.4 compliant
temperature sensors. Support will include, but not be limited to, temperature sensors, which are used on many DDR3 memory modules for
ADT7408, CAT34TS02,, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243, mobile devices and servers. Support will include, but not be limited
MCP9843, SE97, SE98, STTS424, TSE2002B3, and TS3000B3. to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243,
MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called jc42. will be called jc42.
@ -574,7 +575,7 @@ config SENSORS_LM85
help help
If you say yes here you get support for National Semiconductor LM85 If you say yes here you get support for National Semiconductor LM85
sensor chips and clones: ADM1027, ADT7463, ADT7468, EMC6D100, sensor chips and clones: ADM1027, ADT7463, ADT7468, EMC6D100,
EMC6D101 and EMC6D102. EMC6D101, EMC6D102, and EMC6D103.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called lm85. will be called lm85.

Просмотреть файл

@ -53,6 +53,8 @@ static const unsigned short normal_i2c[] = {
/* Configuration register defines */ /* Configuration register defines */
#define JC42_CFG_CRIT_ONLY (1 << 2) #define JC42_CFG_CRIT_ONLY (1 << 2)
#define JC42_CFG_TCRIT_LOCK (1 << 6)
#define JC42_CFG_EVENT_LOCK (1 << 7)
#define JC42_CFG_SHUTDOWN (1 << 8) #define JC42_CFG_SHUTDOWN (1 << 8)
#define JC42_CFG_HYST_SHIFT 9 #define JC42_CFG_HYST_SHIFT 9
#define JC42_CFG_HYST_MASK 0x03 #define JC42_CFG_HYST_MASK 0x03
@ -332,7 +334,7 @@ static ssize_t set_temp_crit_hyst(struct device *dev,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct jc42_data *data = i2c_get_clientdata(client); struct jc42_data *data = i2c_get_clientdata(client);
long val; unsigned long val;
int diff, hyst; int diff, hyst;
int err; int err;
int ret = count; int ret = count;
@ -380,14 +382,14 @@ static ssize_t show_alarm(struct device *dev,
static DEVICE_ATTR(temp1_input, S_IRUGO, static DEVICE_ATTR(temp1_input, S_IRUGO,
show_temp_input, NULL); show_temp_input, NULL);
static DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, static DEVICE_ATTR(temp1_crit, S_IRUGO,
show_temp_crit, set_temp_crit); show_temp_crit, set_temp_crit);
static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, static DEVICE_ATTR(temp1_min, S_IRUGO,
show_temp_min, set_temp_min); show_temp_min, set_temp_min);
static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, static DEVICE_ATTR(temp1_max, S_IRUGO,
show_temp_max, set_temp_max); show_temp_max, set_temp_max);
static DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, static DEVICE_ATTR(temp1_crit_hyst, S_IRUGO,
show_temp_crit_hyst, set_temp_crit_hyst); show_temp_crit_hyst, set_temp_crit_hyst);
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO, static DEVICE_ATTR(temp1_max_hyst, S_IRUGO,
show_temp_max_hyst, NULL); show_temp_max_hyst, NULL);
@ -412,8 +414,31 @@ static struct attribute *jc42_attributes[] = {
NULL NULL
}; };
static mode_t jc42_attribute_mode(struct kobject *kobj,
struct attribute *attr, int index)
{
struct device *dev = container_of(kobj, struct device, kobj);
struct i2c_client *client = to_i2c_client(dev);
struct jc42_data *data = i2c_get_clientdata(client);
unsigned int config = data->config;
bool readonly;
if (attr == &dev_attr_temp1_crit.attr)
readonly = config & JC42_CFG_TCRIT_LOCK;
else if (attr == &dev_attr_temp1_min.attr ||
attr == &dev_attr_temp1_max.attr)
readonly = config & JC42_CFG_EVENT_LOCK;
else if (attr == &dev_attr_temp1_crit_hyst.attr)
readonly = config & (JC42_CFG_EVENT_LOCK | JC42_CFG_TCRIT_LOCK);
else
readonly = true;
return S_IRUGO | (readonly ? 0 : S_IWUSR);
}
static const struct attribute_group jc42_group = { static const struct attribute_group jc42_group = {
.attrs = jc42_attributes, .attrs = jc42_attributes,
.is_visible = jc42_attribute_mode,
}; };
/* Return 0 if detection is successful, -ENODEV otherwise */ /* Return 0 if detection is successful, -ENODEV otherwise */

Просмотреть файл

@ -1,5 +1,5 @@
/* /*
* k10temp.c - AMD Family 10h/11h processor hardware monitoring * k10temp.c - AMD Family 10h/11h/12h/14h processor hardware monitoring
* *
* Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de> * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de>
* *
@ -25,7 +25,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <asm/processor.h> #include <asm/processor.h>
MODULE_DESCRIPTION("AMD Family 10h/11h CPU core temperature monitor"); MODULE_DESCRIPTION("AMD Family 10h/11h/12h/14h CPU core temperature monitor");
MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
@ -208,6 +208,7 @@ static void __devexit k10temp_remove(struct pci_dev *pdev)
static const struct pci_device_id k10temp_id_table[] = { static const struct pci_device_id k10temp_id_table[] = {
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) },
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) },
{} {}
}; };
MODULE_DEVICE_TABLE(pci, k10temp_id_table); MODULE_DEVICE_TABLE(pci, k10temp_id_table);

Просмотреть файл

@ -41,7 +41,7 @@ static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
enum chips { enum chips {
any_chip, lm85b, lm85c, any_chip, lm85b, lm85c,
adm1027, adt7463, adt7468, adm1027, adt7463, adt7468,
emc6d100, emc6d102 emc6d100, emc6d102, emc6d103
}; };
/* The LM85 registers */ /* The LM85 registers */
@ -90,6 +90,9 @@ enum chips {
#define LM85_VERSTEP_EMC6D100_A0 0x60 #define LM85_VERSTEP_EMC6D100_A0 0x60
#define LM85_VERSTEP_EMC6D100_A1 0x61 #define LM85_VERSTEP_EMC6D100_A1 0x61
#define LM85_VERSTEP_EMC6D102 0x65 #define LM85_VERSTEP_EMC6D102 0x65
#define LM85_VERSTEP_EMC6D103_A0 0x68
#define LM85_VERSTEP_EMC6D103_A1 0x69
#define LM85_VERSTEP_EMC6D103S 0x6A /* Also known as EMC6D103:A2 */
#define LM85_REG_CONFIG 0x40 #define LM85_REG_CONFIG 0x40
@ -348,6 +351,7 @@ static const struct i2c_device_id lm85_id[] = {
{ "emc6d100", emc6d100 }, { "emc6d100", emc6d100 },
{ "emc6d101", emc6d100 }, { "emc6d101", emc6d100 },
{ "emc6d102", emc6d102 }, { "emc6d102", emc6d102 },
{ "emc6d103", emc6d103 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, lm85_id); MODULE_DEVICE_TABLE(i2c, lm85_id);
@ -1250,6 +1254,20 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info)
case LM85_VERSTEP_EMC6D102: case LM85_VERSTEP_EMC6D102:
type_name = "emc6d102"; type_name = "emc6d102";
break; break;
case LM85_VERSTEP_EMC6D103_A0:
case LM85_VERSTEP_EMC6D103_A1:
type_name = "emc6d103";
break;
/*
* Registers apparently missing in EMC6D103S/EMC6D103:A2
* compared to EMC6D103:A0, EMC6D103:A1, and EMC6D102
* (according to the data sheets), but used unconditionally
* in the driver: 62[5:7], 6D[0:7], and 6E[0:7].
* So skip EMC6D103S for now.
case LM85_VERSTEP_EMC6D103S:
type_name = "emc6d103s";
break;
*/
} }
} else { } else {
dev_dbg(&adapter->dev, dev_dbg(&adapter->dev,
@ -1283,6 +1301,7 @@ static int lm85_probe(struct i2c_client *client,
case adt7468: case adt7468:
case emc6d100: case emc6d100:
case emc6d102: case emc6d102:
case emc6d103:
data->freq_map = adm1027_freq_map; data->freq_map = adm1027_freq_map;
break; break;
default: default:
@ -1468,7 +1487,7 @@ static struct lm85_data *lm85_update_device(struct device *dev)
/* More alarm bits */ /* More alarm bits */
data->alarms |= lm85_read_value(client, data->alarms |= lm85_read_value(client,
EMC6D100_REG_ALARM3) << 16; EMC6D100_REG_ALARM3) << 16;
} else if (data->type == emc6d102) { } else if (data->type == emc6d102 || data->type == emc6d103) {
/* Have to read LSB bits after the MSB ones because /* Have to read LSB bits after the MSB ones because
the reading of the MSB bits has frozen the the reading of the MSB bits has frozen the
LSBs (backward from the ADM1027). LSBs (backward from the ADM1027).

Просмотреть файл

@ -1247,10 +1247,10 @@ static void
l2_pull_iqueue(struct FsmInst *fi, int event, void *arg) l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
{ {
struct PStack *st = fi->userdata; struct PStack *st = fi->userdata;
struct sk_buff *skb, *oskb; struct sk_buff *skb;
struct Layer2 *l2 = &st->l2; struct Layer2 *l2 = &st->l2;
u_char header[MAX_HEADER_LEN]; u_char header[MAX_HEADER_LEN];
int i; int i, hdr_space_needed;
int unsigned p1; int unsigned p1;
u_long flags; u_long flags;
@ -1261,6 +1261,16 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
if (!skb) if (!skb)
return; return;
hdr_space_needed = l2headersize(l2, 0);
if (hdr_space_needed > skb_headroom(skb)) {
struct sk_buff *orig_skb = skb;
skb = skb_realloc_headroom(skb, hdr_space_needed);
if (!skb) {
dev_kfree_skb(orig_skb);
return;
}
}
spin_lock_irqsave(&l2->lock, flags); spin_lock_irqsave(&l2->lock, flags);
if(test_bit(FLG_MOD128, &l2->flag)) if(test_bit(FLG_MOD128, &l2->flag))
p1 = (l2->vs - l2->va) % 128; p1 = (l2->vs - l2->va) % 128;
@ -1285,19 +1295,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
l2->vs = (l2->vs + 1) % 8; l2->vs = (l2->vs + 1) % 8;
} }
spin_unlock_irqrestore(&l2->lock, flags); spin_unlock_irqrestore(&l2->lock, flags);
p1 = skb->data - skb->head; memcpy(skb_push(skb, i), header, i);
if (p1 >= i)
memcpy(skb_push(skb, i), header, i);
else {
printk(KERN_WARNING
"isdl2 pull_iqueue skb header(%d/%d) too short\n", i, p1);
oskb = skb;
skb = alloc_skb(oskb->len + i, GFP_ATOMIC);
memcpy(skb_put(skb, i), header, i);
skb_copy_from_linear_data(oskb,
skb_put(skb, oskb->len), oskb->len);
dev_kfree_skb(oskb);
}
st->l2.l2l1(st, PH_PULL | INDICATION, skb); st->l2.l2l1(st, PH_PULL | INDICATION, skb);
test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag); test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) { if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {

Просмотреть файл

@ -621,7 +621,7 @@ static int __init memstick_init(void)
{ {
int rc; int rc;
workqueue = create_freezeable_workqueue("kmemstick"); workqueue = create_freezable_workqueue("kmemstick");
if (!workqueue) if (!workqueue)
return -ENOMEM; return -ENOMEM;

Просмотреть файл

@ -329,7 +329,7 @@ static int __init tifm_init(void)
{ {
int rc; int rc;
workqueue = create_freezeable_workqueue("tifm"); workqueue = create_freezable_workqueue("tifm");
if (!workqueue) if (!workqueue)
return -ENOMEM; return -ENOMEM;

Просмотреть файл

@ -785,7 +785,7 @@ static int __init vmballoon_init(void)
if (x86_hyper != &x86_hyper_vmware) if (x86_hyper != &x86_hyper_vmware)
return -ENODEV; return -ENODEV;
vmballoon_wq = create_freezeable_workqueue("vmmemctl"); vmballoon_wq = create_freezable_workqueue("vmmemctl");
if (!vmballoon_wq) { if (!vmballoon_wq) {
pr_err("failed to create workqueue\n"); pr_err("failed to create workqueue\n");
return -ENOMEM; return -ENOMEM;

Просмотреть файл

@ -930,7 +930,7 @@ int r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
init_completion(&dev->dma_done); init_completion(&dev->dma_done);
dev->card_workqueue = create_freezeable_workqueue(DRV_NAME); dev->card_workqueue = create_freezable_workqueue(DRV_NAME);
if (!dev->card_workqueue) if (!dev->card_workqueue)
goto error9; goto error9;

Просмотреть файл

@ -1258,7 +1258,7 @@ static struct mtd_blktrans_ops sm_ftl_ops = {
static __init int sm_module_init(void) static __init int sm_module_init(void)
{ {
int error = 0; int error = 0;
cache_flush_workqueue = create_freezeable_workqueue("smflush"); cache_flush_workqueue = create_freezable_workqueue("smflush");
if (IS_ERR(cache_flush_workqueue)) if (IS_ERR(cache_flush_workqueue))
return PTR_ERR(cache_flush_workqueue); return PTR_ERR(cache_flush_workqueue);

Просмотреть файл

@ -940,7 +940,7 @@ static int mcp251x_open(struct net_device *net)
goto open_unlock; goto open_unlock;
} }
priv->wq = create_freezeable_workqueue("mcp251x_wq"); priv->wq = create_freezable_workqueue("mcp251x_wq");
INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler); INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler); INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);

Просмотреть файл

@ -18,7 +18,7 @@ config CAN_SOFTING
config CAN_SOFTING_CS config CAN_SOFTING_CS
tristate "Softing Gmbh CAN pcmcia cards" tristate "Softing Gmbh CAN pcmcia cards"
depends on PCMCIA depends on PCMCIA
select CAN_SOFTING depends on CAN_SOFTING
---help--- ---help---
Support for PCMCIA cards from Softing Gmbh & some cards Support for PCMCIA cards from Softing Gmbh & some cards
from Vector Gmbh. from Vector Gmbh.

Просмотреть файл

@ -2040,7 +2040,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
{ {
int i; int i;
BUG_ON(adapter->debugfs_root == NULL); BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
/* /*
* Debugfs support is best effort. * Debugfs support is best effort.
@ -2061,7 +2061,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
*/ */
static void cleanup_debugfs(struct adapter *adapter) static void cleanup_debugfs(struct adapter *adapter)
{ {
BUG_ON(adapter->debugfs_root == NULL); BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
/* /*
* Unlike our sister routine cleanup_proc(), we don't need to remove * Unlike our sister routine cleanup_proc(), we don't need to remove
@ -2488,17 +2488,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
struct port_info *pi; struct port_info *pi;
struct net_device *netdev; struct net_device *netdev;
/*
* Vet our module parameters.
*/
if (msi != MSI_MSIX && msi != MSI_MSI) {
dev_err(&pdev->dev, "bad module parameter msi=%d; must be %d"
" (MSI-X or MSI) or %d (MSI)\n", msi, MSI_MSIX,
MSI_MSI);
err = -EINVAL;
goto err_out;
}
/* /*
* Print our driver banner the first time we're called to initialize a * Print our driver banner the first time we're called to initialize a
* device. * device.
@ -2711,11 +2700,11 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
/* /*
* Set up our debugfs entries. * Set up our debugfs entries.
*/ */
if (cxgb4vf_debugfs_root) { if (!IS_ERR_OR_NULL(cxgb4vf_debugfs_root)) {
adapter->debugfs_root = adapter->debugfs_root =
debugfs_create_dir(pci_name(pdev), debugfs_create_dir(pci_name(pdev),
cxgb4vf_debugfs_root); cxgb4vf_debugfs_root);
if (adapter->debugfs_root == NULL) if (IS_ERR_OR_NULL(adapter->debugfs_root))
dev_warn(&pdev->dev, "could not create debugfs" dev_warn(&pdev->dev, "could not create debugfs"
" directory"); " directory");
else else
@ -2770,7 +2759,7 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
*/ */
err_free_debugfs: err_free_debugfs:
if (adapter->debugfs_root) { if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
cleanup_debugfs(adapter); cleanup_debugfs(adapter);
debugfs_remove_recursive(adapter->debugfs_root); debugfs_remove_recursive(adapter->debugfs_root);
} }
@ -2802,7 +2791,6 @@ err_release_regions:
err_disable_device: err_disable_device:
pci_disable_device(pdev); pci_disable_device(pdev);
err_out:
return err; return err;
} }
@ -2840,7 +2828,7 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
/* /*
* Tear down our debugfs entries. * Tear down our debugfs entries.
*/ */
if (adapter->debugfs_root) { if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
cleanup_debugfs(adapter); cleanup_debugfs(adapter);
debugfs_remove_recursive(adapter->debugfs_root); debugfs_remove_recursive(adapter->debugfs_root);
} }
@ -2873,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
pci_release_regions(pdev); pci_release_regions(pdev);
} }
/*
* "Shutdown" quiesce the device, stopping Ingress Packet and Interrupt
* delivery.
*/
static void __devexit cxgb4vf_pci_shutdown(struct pci_dev *pdev)
{
struct adapter *adapter;
int pidx;
adapter = pci_get_drvdata(pdev);
if (!adapter)
return;
/*
* Disable all Virtual Interfaces. This will shut down the
* delivery of all ingress packets into the chip for these
* Virtual Interfaces.
*/
for_each_port(adapter, pidx) {
struct net_device *netdev;
struct port_info *pi;
if (!test_bit(pidx, &adapter->registered_device_map))
continue;
netdev = adapter->port[pidx];
if (!netdev)
continue;
pi = netdev_priv(netdev);
t4vf_enable_vi(adapter, pi->viid, false, false);
}
/*
* Free up all Queues which will prevent further DMA and
* Interrupts allowing various internal pathways to drain.
*/
t4vf_free_sge_resources(adapter);
}
/* /*
* PCI Device registration data structures. * PCI Device registration data structures.
*/ */
@ -2906,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = {
.id_table = cxgb4vf_pci_tbl, .id_table = cxgb4vf_pci_tbl,
.probe = cxgb4vf_pci_probe, .probe = cxgb4vf_pci_probe,
.remove = __devexit_p(cxgb4vf_pci_remove), .remove = __devexit_p(cxgb4vf_pci_remove),
.shutdown = __devexit_p(cxgb4vf_pci_shutdown),
}; };
/* /*
@ -2915,14 +2944,25 @@ static int __init cxgb4vf_module_init(void)
{ {
int ret; int ret;
/*
* Vet our module parameters.
*/
if (msi != MSI_MSIX && msi != MSI_MSI) {
printk(KERN_WARNING KBUILD_MODNAME
": bad module parameter msi=%d; must be %d"
" (MSI-X or MSI) or %d (MSI)\n",
msi, MSI_MSIX, MSI_MSI);
return -EINVAL;
}
/* Debugfs support is optional, just warn if this fails */ /* Debugfs support is optional, just warn if this fails */
cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL); cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
if (!cxgb4vf_debugfs_root) if (IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
printk(KERN_WARNING KBUILD_MODNAME ": could not create" printk(KERN_WARNING KBUILD_MODNAME ": could not create"
" debugfs entry, continuing\n"); " debugfs entry, continuing\n");
ret = pci_register_driver(&cxgb4vf_driver); ret = pci_register_driver(&cxgb4vf_driver);
if (ret < 0) if (ret < 0 && !IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
debugfs_remove(cxgb4vf_debugfs_root); debugfs_remove(cxgb4vf_debugfs_root);
return ret; return ret;
} }

Просмотреть файл

@ -171,7 +171,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size,
delay_idx = 0; delay_idx = 0;
ms = delay[0]; ms = delay[0];
for (i = 0; i < 500; i += ms) { for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
if (sleep_ok) { if (sleep_ok) {
ms = delay[delay_idx]; ms = delay[delay_idx];
if (delay_idx < ARRAY_SIZE(delay) - 1) if (delay_idx < ARRAY_SIZE(delay) - 1)

Просмотреть файл

@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work)
u16 phy_status, phy_1000t_status, phy_ext_status; u16 phy_status, phy_1000t_status, phy_ext_status;
u16 pci_status; u16 pci_status;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1e_rphy(hw, PHY_STATUS, &phy_status); e1e_rphy(hw, PHY_STATUS, &phy_status);
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status); e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status); e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work)
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, downshift_task); struct e1000_adapter, downshift_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
} }
@ -3338,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter)
return 0; return 0;
} }
static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
{
struct e1000_hw *hw = &adapter->hw;
if (!(adapter->flags2 & FLAG2_DMA_BURST))
return;
/* flush pending descriptor writebacks to memory */
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
/* execute the writes immediately */
e1e_flush();
}
void e1000e_down(struct e1000_adapter *adapter) void e1000e_down(struct e1000_adapter *adapter)
{ {
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
@ -3377,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter)
if (!pci_channel_offline(adapter->pdev)) if (!pci_channel_offline(adapter->pdev))
e1000e_reset(adapter); e1000e_reset(adapter);
e1000e_flush_descriptors(adapter);
e1000_clean_tx_ring(adapter); e1000_clean_tx_ring(adapter);
e1000_clean_rx_ring(adapter); e1000_clean_rx_ring(adapter);
@ -3765,6 +3789,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
{ {
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, update_phy_task); struct e1000_adapter, update_phy_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000_get_phy_info(&adapter->hw); e1000_get_phy_info(&adapter->hw);
} }
@ -3775,6 +3803,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
static void e1000_update_phy_info(unsigned long data) static void e1000_update_phy_info(unsigned long data)
{ {
struct e1000_adapter *adapter = (struct e1000_adapter *) data; struct e1000_adapter *adapter = (struct e1000_adapter *) data;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
schedule_work(&adapter->update_phy_task); schedule_work(&adapter->update_phy_task);
} }
@ -4149,6 +4181,9 @@ static void e1000_watchdog_task(struct work_struct *work)
u32 link, tctl; u32 link, tctl;
int tx_pending = 0; int tx_pending = 0;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
link = e1000e_has_link(adapter); link = e1000e_has_link(adapter);
if ((netif_carrier_ok(netdev)) && link) { if ((netif_carrier_ok(netdev)) && link) {
/* Cancel scheduled suspend requests. */ /* Cancel scheduled suspend requests. */
@ -4337,19 +4372,12 @@ link_up:
else else
ew32(ICS, E1000_ICS_RXDMT0); ew32(ICS, E1000_ICS_RXDMT0);
/* flush pending descriptors to memory before detecting Tx hang */
e1000e_flush_descriptors(adapter);
/* Force detection of hung controller every watchdog period */ /* Force detection of hung controller every watchdog period */
adapter->detect_tx_hung = 1; adapter->detect_tx_hung = 1;
/* flush partial descriptors to memory before detecting Tx hang */
if (adapter->flags2 & FLAG2_DMA_BURST) {
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
/*
* no need to flush the writes because the timeout code does
* an er32 first thing
*/
}
/* /*
* With 82571 controllers, LAA may be overwritten due to controller * With 82571 controllers, LAA may be overwritten due to controller
* reset from the other port. Set the appropriate LAA in RAR[0] * reset from the other port. Set the appropriate LAA in RAR[0]
@ -4887,6 +4915,10 @@ static void e1000_reset_task(struct work_struct *work)
struct e1000_adapter *adapter; struct e1000_adapter *adapter;
adapter = container_of(work, struct e1000_adapter, reset_task); adapter = container_of(work, struct e1000_adapter, reset_task);
/* don't run the task if already down */
if (test_bit(__E1000_DOWN, &adapter->state))
return;
if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) && if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
(adapter->flags & FLAG_RX_RESTART_NOW))) { (adapter->flags & FLAG_RX_RESTART_NOW))) {
e1000e_dump(adapter); e1000e_dump(adapter);

Просмотреть файл

@ -5645,6 +5645,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
goto out_error; goto out_error;
} }
netif_carrier_off(dev);
dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n", dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n",
dev->name, np->phy_oui, np->phyaddr, dev->dev_addr); dev->name, np->phy_oui, np->phyaddr, dev->dev_addr);

Просмотреть файл

@ -159,7 +159,7 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
struct scatterlist *sg; struct scatterlist *sg;
unsigned int i, j, dmacount; unsigned int i, j, dmacount;
unsigned int len; unsigned int len;
static const unsigned int bufflen = 4096; static const unsigned int bufflen = IXGBE_FCBUFF_MIN;
unsigned int firstoff = 0; unsigned int firstoff = 0;
unsigned int lastsize; unsigned int lastsize;
unsigned int thisoff = 0; unsigned int thisoff = 0;
@ -254,6 +254,24 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
/* only the last buffer may have non-full bufflen */ /* only the last buffer may have non-full bufflen */
lastsize = thisoff + thislen; lastsize = thisoff + thislen;
/*
* lastsize can not be buffer len.
* If it is then adding another buffer with lastsize = 1.
*/
if (lastsize == bufflen) {
if (j >= IXGBE_BUFFCNT_MAX) {
e_err(drv, "xid=%x:%d,%d,%d:addr=%llx "
"not enough user buffers. We need an extra "
"buffer because lastsize is bufflen.\n",
xid, i, j, dmacount, (u64)addr);
goto out_noddp_free;
}
ddp->udl[j] = (u64)(fcoe->extra_ddp_buffer_dma);
j++;
lastsize = 1;
}
fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT); fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT); fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT); fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
@ -532,6 +550,24 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
e_err(drv, "failed to allocated FCoE DDP pool\n"); e_err(drv, "failed to allocated FCoE DDP pool\n");
spin_lock_init(&fcoe->lock); spin_lock_init(&fcoe->lock);
/* Extra buffer to be shared by all DDPs for HW work around */
fcoe->extra_ddp_buffer = kmalloc(IXGBE_FCBUFF_MIN, GFP_ATOMIC);
if (fcoe->extra_ddp_buffer == NULL) {
e_err(drv, "failed to allocated extra DDP buffer\n");
goto out_extra_ddp_buffer_alloc;
}
fcoe->extra_ddp_buffer_dma =
dma_map_single(&adapter->pdev->dev,
fcoe->extra_ddp_buffer,
IXGBE_FCBUFF_MIN,
DMA_FROM_DEVICE);
if (dma_mapping_error(&adapter->pdev->dev,
fcoe->extra_ddp_buffer_dma)) {
e_err(drv, "failed to map extra DDP buffer\n");
goto out_extra_ddp_buffer_dma;
}
} }
/* Enable L2 eth type filter for FCoE */ /* Enable L2 eth type filter for FCoE */
@ -581,6 +617,14 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
} }
} }
#endif #endif
return;
out_extra_ddp_buffer_dma:
kfree(fcoe->extra_ddp_buffer);
out_extra_ddp_buffer_alloc:
pci_pool_destroy(fcoe->pool);
fcoe->pool = NULL;
} }
/** /**
@ -600,6 +644,11 @@ void ixgbe_cleanup_fcoe(struct ixgbe_adapter *adapter)
if (fcoe->pool) { if (fcoe->pool) {
for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++) for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
ixgbe_fcoe_ddp_put(adapter->netdev, i); ixgbe_fcoe_ddp_put(adapter->netdev, i);
dma_unmap_single(&adapter->pdev->dev,
fcoe->extra_ddp_buffer_dma,
IXGBE_FCBUFF_MIN,
DMA_FROM_DEVICE);
kfree(fcoe->extra_ddp_buffer);
pci_pool_destroy(fcoe->pool); pci_pool_destroy(fcoe->pool);
fcoe->pool = NULL; fcoe->pool = NULL;
} }

Просмотреть файл

@ -70,6 +70,8 @@ struct ixgbe_fcoe {
spinlock_t lock; spinlock_t lock;
struct pci_pool *pool; struct pci_pool *pool;
struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX]; struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX];
unsigned char *extra_ddp_buffer;
dma_addr_t extra_ddp_buffer_dma;
}; };
#endif /* _IXGBE_FCOE_H */ #endif /* _IXGBE_FCOE_H */

Просмотреть файл

@ -3728,7 +3728,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
* We need to try and force an autonegotiation * We need to try and force an autonegotiation
* session, then bring up link. * session, then bring up link.
*/ */
hw->mac.ops.setup_sfp(hw); if (hw->mac.ops.setup_sfp)
hw->mac.ops.setup_sfp(hw);
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
schedule_work(&adapter->multispeed_fiber_task); schedule_work(&adapter->multispeed_fiber_task);
} else { } else {
@ -5968,7 +5969,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
unregister_netdev(adapter->netdev); unregister_netdev(adapter->netdev);
return; return;
} }
hw->mac.ops.setup_sfp(hw); if (hw->mac.ops.setup_sfp)
hw->mac.ops.setup_sfp(hw);
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
/* This will also work for DA Twinax connections */ /* This will also work for DA Twinax connections */

Просмотреть файл

@ -73,7 +73,7 @@ struct pch_gbe_regs {
struct pch_gbe_regs_mac_adr mac_adr[16]; struct pch_gbe_regs_mac_adr mac_adr[16];
u32 ADDR_MASK; u32 ADDR_MASK;
u32 MIIM; u32 MIIM;
u32 reserve2; u32 MAC_ADDR_LOAD;
u32 RGMII_ST; u32 RGMII_ST;
u32 RGMII_CTRL; u32 RGMII_CTRL;
u32 reserve3[3]; u32 reserve3[3];

Просмотреть файл

@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
#define PCH_GBE_SHORT_PKT 64 #define PCH_GBE_SHORT_PKT 64
#define DSC_INIT16 0xC000 #define DSC_INIT16 0xC000
#define PCH_GBE_DMA_ALIGN 0 #define PCH_GBE_DMA_ALIGN 0
#define PCH_GBE_DMA_PADDING 2
#define PCH_GBE_WATCHDOG_PERIOD (1 * HZ) /* watchdog time */ #define PCH_GBE_WATCHDOG_PERIOD (1 * HZ) /* watchdog time */
#define PCH_GBE_COPYBREAK_DEFAULT 256 #define PCH_GBE_COPYBREAK_DEFAULT 256
#define PCH_GBE_PCI_BAR 1 #define PCH_GBE_PCI_BAR 1
@ -88,6 +89,12 @@ static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT;
static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg); static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg, static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
int data); int data);
inline void pch_gbe_mac_load_mac_addr(struct pch_gbe_hw *hw)
{
iowrite32(0x01, &hw->reg->MAC_ADDR_LOAD);
}
/** /**
* pch_gbe_mac_read_mac_addr - Read MAC address * pch_gbe_mac_read_mac_addr - Read MAC address
* @hw: Pointer to the HW structure * @hw: Pointer to the HW structure
@ -1365,16 +1372,13 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
struct pch_gbe_buffer *buffer_info; struct pch_gbe_buffer *buffer_info;
struct pch_gbe_rx_desc *rx_desc; struct pch_gbe_rx_desc *rx_desc;
u32 length; u32 length;
unsigned char tmp_packet[ETH_HLEN];
unsigned int i; unsigned int i;
unsigned int cleaned_count = 0; unsigned int cleaned_count = 0;
bool cleaned = false; bool cleaned = false;
struct sk_buff *skb; struct sk_buff *skb, *new_skb;
u8 dma_status; u8 dma_status;
u16 gbec_status; u16 gbec_status;
u32 tcp_ip_status; u32 tcp_ip_status;
u8 skb_copy_flag = 0;
u8 skb_padding_flag = 0;
i = rx_ring->next_to_clean; i = rx_ring->next_to_clean;
@ -1418,55 +1422,70 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
pr_err("Receive CRC Error\n"); pr_err("Receive CRC Error\n");
} else { } else {
/* get receive length */ /* get receive length */
/* length convert[-3], padding[-2] */ /* length convert[-3] */
length = (rx_desc->rx_words_eob) - 3 - 2; length = (rx_desc->rx_words_eob) - 3;
/* Decide the data conversion method */ /* Decide the data conversion method */
if (!adapter->rx_csum) { if (!adapter->rx_csum) {
/* [Header:14][payload] */ /* [Header:14][payload] */
skb_padding_flag = 0; if (NET_IP_ALIGN) {
skb_copy_flag = 1; /* Because alignment differs,
} else { * the new_skb is newly allocated,
/* [Header:14][padding:2][payload] */ * and data is copied to new_skb.*/
skb_padding_flag = 1; new_skb = netdev_alloc_skb(netdev,
if (length < copybreak) length + NET_IP_ALIGN);
skb_copy_flag = 1; if (!new_skb) {
else /* dorrop error */
skb_copy_flag = 0; pr_err("New skb allocation "
} "Error\n");
goto dorrop;
/* Data conversion */
if (skb_copy_flag) { /* recycle skb */
struct sk_buff *new_skb;
new_skb =
netdev_alloc_skb(netdev,
length + NET_IP_ALIGN);
if (new_skb) {
if (!skb_padding_flag) {
skb_reserve(new_skb,
NET_IP_ALIGN);
} }
skb_reserve(new_skb, NET_IP_ALIGN);
memcpy(new_skb->data, skb->data, memcpy(new_skb->data, skb->data,
length); length);
/* save the skb
* in buffer_info as good */
skb = new_skb; skb = new_skb;
} else if (!skb_padding_flag) { } else {
/* dorrop error */ /* DMA buffer is used as SKB as it is.*/
pr_err("New skb allocation Error\n"); buffer_info->skb = NULL;
goto dorrop;
} }
} else { } else {
buffer_info->skb = NULL; /* [Header:14][padding:2][payload] */
/* The length includes padding length */
length = length - PCH_GBE_DMA_PADDING;
if ((length < copybreak) ||
(NET_IP_ALIGN != PCH_GBE_DMA_PADDING)) {
/* Because alignment differs,
* the new_skb is newly allocated,
* and data is copied to new_skb.
* Padding data is deleted
* at the time of a copy.*/
new_skb = netdev_alloc_skb(netdev,
length + NET_IP_ALIGN);
if (!new_skb) {
/* dorrop error */
pr_err("New skb allocation "
"Error\n");
goto dorrop;
}
skb_reserve(new_skb, NET_IP_ALIGN);
memcpy(new_skb->data, skb->data,
ETH_HLEN);
memcpy(&new_skb->data[ETH_HLEN],
&skb->data[ETH_HLEN +
PCH_GBE_DMA_PADDING],
length - ETH_HLEN);
skb = new_skb;
} else {
/* Padding data is deleted
* by moving header data.*/
memmove(&skb->data[PCH_GBE_DMA_PADDING],
&skb->data[0], ETH_HLEN);
skb_reserve(skb, NET_IP_ALIGN);
buffer_info->skb = NULL;
}
} }
if (skb_padding_flag) { /* The length includes FCS length */
memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN); length = length - ETH_FCS_LEN;
memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
ETH_HLEN);
skb_reserve(skb, NET_IP_ALIGN);
}
/* update status of driver */ /* update status of driver */
adapter->stats.rx_bytes += length; adapter->stats.rx_bytes += length;
adapter->stats.rx_packets++; adapter->stats.rx_packets++;
@ -2318,6 +2337,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO; netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
pch_gbe_set_ethtool_ops(netdev); pch_gbe_set_ethtool_ops(netdev);
pch_gbe_mac_load_mac_addr(&adapter->hw);
pch_gbe_mac_reset_hw(&adapter->hw); pch_gbe_mac_reset_hw(&adapter->hw);
/* setup the private structure */ /* setup the private structure */

Просмотреть файл

@ -3190,6 +3190,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (pci_dev_run_wake(pdev)) if (pci_dev_run_wake(pdev))
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
netif_carrier_off(dev);
out: out:
return rc; return rc;

Просмотреть файл

@ -1560,8 +1560,10 @@ static int stmmac_mac_device_setup(struct net_device *dev)
priv->hw = device; priv->hw = device;
if (device_can_wakeup(priv->device)) if (device_can_wakeup(priv->device)) {
priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
enable_irq_wake(dev->irq);
}
return 0; return 0;
} }

Просмотреть файл

@ -11158,7 +11158,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
break; /* We have no PHY */ break; /* We have no PHY */
if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
!netif_running(dev)))
return -EAGAIN; return -EAGAIN;
spin_lock_bh(&tp->lock); spin_lock_bh(&tp->lock);
@ -11174,7 +11176,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
break; /* We have no PHY */ break; /* We have no PHY */
if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
!netif_running(dev)))
return -EAGAIN; return -EAGAIN;
spin_lock_bh(&tp->lock); spin_lock_bh(&tp->lock);

Просмотреть файл

@ -2628,15 +2628,15 @@ exit:
static void hso_free_tiomget(struct hso_serial *serial) static void hso_free_tiomget(struct hso_serial *serial)
{ {
struct hso_tiocmget *tiocmget = serial->tiocmget; struct hso_tiocmget *tiocmget;
if (!serial)
return;
tiocmget = serial->tiocmget;
if (tiocmget) { if (tiocmget) {
if (tiocmget->urb) { usb_free_urb(tiocmget->urb);
usb_free_urb(tiocmget->urb); tiocmget->urb = NULL;
tiocmget->urb = NULL;
}
serial->tiocmget = NULL; serial->tiocmget = NULL;
kfree(tiocmget); kfree(tiocmget);
} }
} }

Просмотреть файл

@ -931,8 +931,10 @@ fail_halt:
if (urb != NULL) { if (urb != NULL) {
clear_bit (EVENT_RX_MEMORY, &dev->flags); clear_bit (EVENT_RX_MEMORY, &dev->flags);
status = usb_autopm_get_interface(dev->intf); status = usb_autopm_get_interface(dev->intf);
if (status < 0) if (status < 0) {
usb_free_urb(urb);
goto fail_lowmem; goto fail_lowmem;
}
if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK) if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
resched = 0; resched = 0;
usb_autopm_put_interface(dev->intf); usb_autopm_put_interface(dev->intf);

Просмотреть файл

@ -402,72 +402,6 @@ static void iwl3945_accumulative_statistics(struct iwl_priv *priv,
} }
#endif #endif
/**
* iwl3945_good_plcp_health - checks for plcp error.
*
* When the plcp error is exceeding the thresholds, reset the radio
* to improve the throughput.
*/
static bool iwl3945_good_plcp_health(struct iwl_priv *priv,
struct iwl_rx_packet *pkt)
{
bool rc = true;
struct iwl3945_notif_statistics current_stat;
int combined_plcp_delta;
unsigned int plcp_msec;
unsigned long plcp_received_jiffies;
if (priv->cfg->base_params->plcp_delta_threshold ==
IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE) {
IWL_DEBUG_RADIO(priv, "plcp_err check disabled\n");
return rc;
}
memcpy(&current_stat, pkt->u.raw, sizeof(struct
iwl3945_notif_statistics));
/*
* check for plcp_err and trigger radio reset if it exceeds
* the plcp error threshold plcp_delta.
*/
plcp_received_jiffies = jiffies;
plcp_msec = jiffies_to_msecs((long) plcp_received_jiffies -
(long) priv->plcp_jiffies);
priv->plcp_jiffies = plcp_received_jiffies;
/*
* check to make sure plcp_msec is not 0 to prevent division
* by zero.
*/
if (plcp_msec) {
combined_plcp_delta =
(le32_to_cpu(current_stat.rx.ofdm.plcp_err) -
le32_to_cpu(priv->_3945.statistics.rx.ofdm.plcp_err));
if ((combined_plcp_delta > 0) &&
((combined_plcp_delta * 100) / plcp_msec) >
priv->cfg->base_params->plcp_delta_threshold) {
/*
* if plcp_err exceed the threshold, the following
* data is printed in csv format:
* Text: plcp_err exceeded %d,
* Received ofdm.plcp_err,
* Current ofdm.plcp_err,
* combined_plcp_delta,
* plcp_msec
*/
IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
"%u, %d, %u mSecs\n",
priv->cfg->base_params->plcp_delta_threshold,
le32_to_cpu(current_stat.rx.ofdm.plcp_err),
combined_plcp_delta, plcp_msec);
/*
* Reset the RF radio due to the high plcp
* error rate
*/
rc = false;
}
}
return rc;
}
void iwl3945_hw_rx_statistics(struct iwl_priv *priv, void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb) struct iwl_rx_mem_buffer *rxb)
{ {
@ -2734,7 +2668,6 @@ static struct iwl_lib_ops iwl3945_lib = {
.isr_ops = { .isr_ops = {
.isr = iwl_isr_legacy, .isr = iwl_isr_legacy,
}, },
.check_plcp_health = iwl3945_good_plcp_health,
.debugfs_ops = { .debugfs_ops = {
.rx_stats_read = iwl3945_ucode_rx_stats_read, .rx_stats_read = iwl3945_ucode_rx_stats_read,

Просмотреть файл

@ -227,7 +227,7 @@ config SONYPI_COMPAT
config IDEAPAD_LAPTOP config IDEAPAD_LAPTOP
tristate "Lenovo IdeaPad Laptop Extras" tristate "Lenovo IdeaPad Laptop Extras"
depends on ACPI depends on ACPI
depends on RFKILL depends on RFKILL && INPUT
select INPUT_SPARSEKMAP select INPUT_SPARSEKMAP
help help
This is a driver for the rfkill switches on Lenovo IdeaPad netbooks. This is a driver for the rfkill switches on Lenovo IdeaPad netbooks.

Просмотреть файл

@ -84,7 +84,7 @@ MODULE_LICENSE("GPL");
*/ */
#define AMW0_GUID1 "67C3371D-95A3-4C37-BB61-DD47B491DAAB" #define AMW0_GUID1 "67C3371D-95A3-4C37-BB61-DD47B491DAAB"
#define AMW0_GUID2 "431F16ED-0C2B-444C-B267-27DEB140CF9C" #define AMW0_GUID2 "431F16ED-0C2B-444C-B267-27DEB140CF9C"
#define WMID_GUID1 "6AF4F258-B401-42fd-BE91-3D4AC2D7C0D3" #define WMID_GUID1 "6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3"
#define WMID_GUID2 "95764E09-FB56-4e83-B31A-37761F60994A" #define WMID_GUID2 "95764E09-FB56-4e83-B31A-37761F60994A"
#define WMID_GUID3 "61EF69EA-865C-4BC3-A502-A0DEBA0CB531" #define WMID_GUID3 "61EF69EA-865C-4BC3-A502-A0DEBA0CB531"
@ -1280,7 +1280,7 @@ static ssize_t set_bool_threeg(struct device *dev,
return -EINVAL; return -EINVAL;
return count; return count;
} }
static DEVICE_ATTR(threeg, S_IWUGO | S_IRUGO | S_IWUSR, show_bool_threeg, static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg,
set_bool_threeg); set_bool_threeg);
static ssize_t show_interface(struct device *dev, struct device_attribute *attr, static ssize_t show_interface(struct device *dev, struct device_attribute *attr,

Просмотреть файл

@ -1081,14 +1081,8 @@ static int asus_hotk_add_fs(struct acpi_device *device)
struct proc_dir_entry *proc; struct proc_dir_entry *proc;
mode_t mode; mode_t mode;
/*
* If parameter uid or gid is not changed, keep the default setting for
* our proc entries (-rw-rw-rw-) else, it means we care about security,
* and then set to -rw-rw----
*/
if ((asus_uid == 0) && (asus_gid == 0)) { if ((asus_uid == 0) && (asus_gid == 0)) {
mode = S_IFREG | S_IRUGO | S_IWUGO; mode = S_IFREG | S_IRUGO | S_IWUSR | S_IWGRP;
} else { } else {
mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
printk(KERN_WARNING " asus_uid and asus_gid parameters are " printk(KERN_WARNING " asus_uid and asus_gid parameters are "

Просмотреть файл

@ -290,9 +290,12 @@ static int dell_rfkill_set(void *data, bool blocked)
dell_send_request(buffer, 17, 11); dell_send_request(buffer, 17, 11);
/* If the hardware switch controls this radio, and the hardware /* If the hardware switch controls this radio, and the hardware
switch is disabled, don't allow changing the software state */ switch is disabled, don't allow changing the software state.
If the hardware switch is reported as not supported, always
fire the SMI to toggle the killswitch. */
if ((hwswitch_state & BIT(hwswitch_bit)) && if ((hwswitch_state & BIT(hwswitch_bit)) &&
!(buffer->output[1] & BIT(16))) { !(buffer->output[1] & BIT(16)) &&
(buffer->output[1] & BIT(0))) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@ -398,6 +401,23 @@ static const struct file_operations dell_debugfs_fops = {
static void dell_update_rfkill(struct work_struct *ignored) static void dell_update_rfkill(struct work_struct *ignored)
{ {
int status;
get_buffer();
dell_send_request(buffer, 17, 11);
status = buffer->output[1];
release_buffer();
/* if hardware rfkill is not supported, set it explicitly */
if (!(status & BIT(0))) {
if (wifi_rfkill)
dell_rfkill_set((void *)1, !((status & BIT(17)) >> 17));
if (bluetooth_rfkill)
dell_rfkill_set((void *)2, !((status & BIT(18)) >> 18));
if (wwan_rfkill)
dell_rfkill_set((void *)3, !((status & BIT(19)) >> 19));
}
if (wifi_rfkill) if (wifi_rfkill)
dell_rfkill_query(wifi_rfkill, (void *)1); dell_rfkill_query(wifi_rfkill, (void *)1);
if (bluetooth_rfkill) if (bluetooth_rfkill)

Просмотреть файл

@ -60,69 +60,20 @@ enum pmic_gpio_register {
#define GPOSW_DOU 0x08 #define GPOSW_DOU 0x08
#define GPOSW_RDRV 0x30 #define GPOSW_RDRV 0x30
#define GPIO_UPDATE_TYPE 0x80000000
#define NUM_GPIO 24 #define NUM_GPIO 24
struct pmic_gpio_irq {
spinlock_t lock;
u32 trigger[NUM_GPIO];
u32 dirty;
struct work_struct work;
};
struct pmic_gpio { struct pmic_gpio {
struct mutex buslock;
struct gpio_chip chip; struct gpio_chip chip;
struct pmic_gpio_irq irqtypes;
void *gpiointr; void *gpiointr;
int irq; int irq;
unsigned irq_base; unsigned irq_base;
unsigned int update_type;
u32 trigger_type;
}; };
static void pmic_program_irqtype(int gpio, int type)
{
if (type & IRQ_TYPE_EDGE_RISING)
intel_scu_ipc_update_register(GPIO0 + gpio, 0x20, 0x20);
else
intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x20);
if (type & IRQ_TYPE_EDGE_FALLING)
intel_scu_ipc_update_register(GPIO0 + gpio, 0x10, 0x10);
else
intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x10);
};
static void pmic_irqtype_work(struct work_struct *work)
{
struct pmic_gpio_irq *t =
container_of(work, struct pmic_gpio_irq, work);
unsigned long flags;
int i;
u16 type;
spin_lock_irqsave(&t->lock, flags);
/* As we drop the lock, we may need multiple scans if we race the
pmic_irq_type function */
while (t->dirty) {
/*
* For each pin that has the dirty bit set send an IPC
* message to configure the hardware via the PMIC
*/
for (i = 0; i < NUM_GPIO; i++) {
if (!(t->dirty & (1 << i)))
continue;
t->dirty &= ~(1 << i);
/* We can't trust the array entry or dirty
once the lock is dropped */
type = t->trigger[i];
spin_unlock_irqrestore(&t->lock, flags);
pmic_program_irqtype(i, type);
spin_lock_irqsave(&t->lock, flags);
}
}
spin_unlock_irqrestore(&t->lock, flags);
}
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned offset) static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{ {
if (offset > 8) { if (offset > 8) {
@ -190,25 +141,24 @@ static void pmic_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
1 << (offset - 16)); 1 << (offset - 16));
} }
static int pmic_irq_type(unsigned irq, unsigned type) /*
* This is called from genirq with pg->buslock locked and
* irq_desc->lock held. We can not access the scu bus here, so we
* store the change and update in the bus_sync_unlock() function below
*/
static int pmic_irq_type(struct irq_data *data, unsigned type)
{ {
struct pmic_gpio *pg = get_irq_chip_data(irq); struct pmic_gpio *pg = irq_data_get_irq_chip_data(data);
u32 gpio = irq - pg->irq_base; u32 gpio = data->irq - pg->irq_base;
unsigned long flags;
if (gpio >= pg->chip.ngpio) if (gpio >= pg->chip.ngpio)
return -EINVAL; return -EINVAL;
spin_lock_irqsave(&pg->irqtypes.lock, flags); pg->trigger_type = type;
pg->irqtypes.trigger[gpio] = type; pg->update_type = gpio | GPIO_UPDATE_TYPE;
pg->irqtypes.dirty |= (1 << gpio);
spin_unlock_irqrestore(&pg->irqtypes.lock, flags);
schedule_work(&pg->irqtypes.work);
return 0; return 0;
} }
static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset) static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
{ {
struct pmic_gpio *pg = container_of(chip, struct pmic_gpio, chip); struct pmic_gpio *pg = container_of(chip, struct pmic_gpio, chip);
@ -217,38 +167,32 @@ static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
} }
/* the gpiointr register is read-clear, so just do nothing. */ /* the gpiointr register is read-clear, so just do nothing. */
static void pmic_irq_unmask(unsigned irq) static void pmic_irq_unmask(struct irq_data *data) { }
{
};
static void pmic_irq_mask(unsigned irq) static void pmic_irq_mask(struct irq_data *data) { }
{
};
static struct irq_chip pmic_irqchip = { static struct irq_chip pmic_irqchip = {
.name = "PMIC-GPIO", .name = "PMIC-GPIO",
.mask = pmic_irq_mask, .irq_mask = pmic_irq_mask,
.unmask = pmic_irq_unmask, .irq_unmask = pmic_irq_unmask,
.set_type = pmic_irq_type, .irq_set_type = pmic_irq_type,
}; };
static void pmic_irq_handler(unsigned irq, struct irq_desc *desc) static irqreturn_t pmic_irq_handler(int irq, void *data)
{ {
struct pmic_gpio *pg = (struct pmic_gpio *)get_irq_data(irq); struct pmic_gpio *pg = data;
u8 intsts = *((u8 *)pg->gpiointr + 4); u8 intsts = *((u8 *)pg->gpiointr + 4);
int gpio; int gpio;
irqreturn_t ret = IRQ_NONE;
for (gpio = 0; gpio < 8; gpio++) { for (gpio = 0; gpio < 8; gpio++) {
if (intsts & (1 << gpio)) { if (intsts & (1 << gpio)) {
pr_debug("pmic pin %d triggered\n", gpio); pr_debug("pmic pin %d triggered\n", gpio);
generic_handle_irq(pg->irq_base + gpio); generic_handle_irq(pg->irq_base + gpio);
ret = IRQ_HANDLED;
} }
} }
return ret;
if (desc->chip->irq_eoi)
desc->chip->irq_eoi(irq_get_irq_data(irq));
else
dev_warn(pg->chip.dev, "missing EOI handler for irq %d\n", irq);
} }
static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev) static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
@ -297,8 +241,7 @@ static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
pg->chip.can_sleep = 1; pg->chip.can_sleep = 1;
pg->chip.dev = dev; pg->chip.dev = dev;
INIT_WORK(&pg->irqtypes.work, pmic_irqtype_work); mutex_init(&pg->buslock);
spin_lock_init(&pg->irqtypes.lock);
pg->chip.dev = dev; pg->chip.dev = dev;
retval = gpiochip_add(&pg->chip); retval = gpiochip_add(&pg->chip);
@ -306,8 +249,13 @@ static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
printk(KERN_ERR "%s: Can not add pmic gpio chip.\n", __func__); printk(KERN_ERR "%s: Can not add pmic gpio chip.\n", __func__);
goto err; goto err;
} }
set_irq_data(pg->irq, pg);
set_irq_chained_handler(pg->irq, pmic_irq_handler); retval = request_irq(pg->irq, pmic_irq_handler, 0, "pmic", pg);
if (retval) {
printk(KERN_WARNING "pmic: Interrupt request failed\n");
goto err;
}
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
set_irq_chip_and_handler_name(i + pg->irq_base, &pmic_irqchip, set_irq_chip_and_handler_name(i + pg->irq_base, &pmic_irqchip,
handle_simple_irq, "demux"); handle_simple_irq, "demux");

Просмотреть файл

@ -162,7 +162,7 @@ set_bool_##value(struct device *dev, struct device_attribute *attr, \
return -EINVAL; \ return -EINVAL; \
return count; \ return count; \
} \ } \
static DEVICE_ATTR(value, S_IWUGO | S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, \
show_bool_##value, set_bool_##value); show_bool_##value, set_bool_##value);
show_set_bool(wireless, TC1100_INSTANCE_WIRELESS); show_set_bool(wireless, TC1100_INSTANCE_WIRELESS);

Просмотреть файл

@ -2275,16 +2275,12 @@ static void tpacpi_input_send_key(const unsigned int scancode)
if (keycode != KEY_RESERVED) { if (keycode != KEY_RESERVED) {
mutex_lock(&tpacpi_inputdev_send_mutex); mutex_lock(&tpacpi_inputdev_send_mutex);
input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
input_report_key(tpacpi_inputdev, keycode, 1); input_report_key(tpacpi_inputdev, keycode, 1);
if (keycode == KEY_UNKNOWN)
input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN,
scancode);
input_sync(tpacpi_inputdev); input_sync(tpacpi_inputdev);
input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
input_report_key(tpacpi_inputdev, keycode, 0); input_report_key(tpacpi_inputdev, keycode, 0);
if (keycode == KEY_UNKNOWN)
input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN,
scancode);
input_sync(tpacpi_inputdev); input_sync(tpacpi_inputdev);
mutex_unlock(&tpacpi_inputdev_send_mutex); mutex_unlock(&tpacpi_inputdev_send_mutex);

Просмотреть файл

@ -97,6 +97,18 @@ config RTC_INTF_DEV
If unsure, say Y. If unsure, say Y.
config RTC_INTF_DEV_UIE_EMUL
bool "RTC UIE emulation on dev interface"
depends on RTC_INTF_DEV
help
Provides an emulation for RTC_UIE if the underlying rtc chip
driver does not expose RTC_UIE ioctls. Those requests generate
once-per-second update interrupts, used for synchronization.
The emulation code will read the time from the hardware
clock several times per second, please enable this option
only if you know that you really need it.
config RTC_DRV_TEST config RTC_DRV_TEST
tristate "Test driver/device" tristate "Test driver/device"
help help

Просмотреть файл

@ -209,9 +209,8 @@ int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
} }
if (err) if (err)
return err; /* nothing */;
else if (!rtc->ops)
if (!rtc->ops)
err = -ENODEV; err = -ENODEV;
else if (!rtc->ops->alarm_irq_enable) else if (!rtc->ops->alarm_irq_enable)
err = -EINVAL; err = -EINVAL;
@ -229,6 +228,12 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
if (err) if (err)
return err; return err;
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
if (enabled == 0 && rtc->uie_irq_active) {
mutex_unlock(&rtc->ops_lock);
return rtc_dev_update_irq_enable_emul(rtc, 0);
}
#endif
/* make sure we're changing state */ /* make sure we're changing state */
if (rtc->uie_rtctimer.enabled == enabled) if (rtc->uie_rtctimer.enabled == enabled)
goto out; goto out;
@ -248,6 +253,16 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
out: out:
mutex_unlock(&rtc->ops_lock); mutex_unlock(&rtc->ops_lock);
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
/*
* Enable emulation if the driver did not provide
* the update_irq_enable function pointer or if returned
* -EINVAL to signal that it has been configured without
* interrupts or that are not available at the moment.
*/
if (err == -EINVAL)
err = rtc_dev_update_irq_enable_emul(rtc, enabled);
#endif
return err; return err;
} }
@ -263,7 +278,7 @@ EXPORT_SYMBOL_GPL(rtc_update_irq_enable);
* *
* Triggers the registered irq_task function callback. * Triggers the registered irq_task function callback.
*/ */
static void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode) void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
{ {
unsigned long flags; unsigned long flags;

Просмотреть файл

@ -46,6 +46,105 @@ static int rtc_dev_open(struct inode *inode, struct file *file)
return err; return err;
} }
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
/*
* Routine to poll RTC seconds field for change as often as possible,
* after first RTC_UIE use timer to reduce polling
*/
static void rtc_uie_task(struct work_struct *work)
{
struct rtc_device *rtc =
container_of(work, struct rtc_device, uie_task);
struct rtc_time tm;
int num = 0;
int err;
err = rtc_read_time(rtc, &tm);
spin_lock_irq(&rtc->irq_lock);
if (rtc->stop_uie_polling || err) {
rtc->uie_task_active = 0;
} else if (rtc->oldsecs != tm.tm_sec) {
num = (tm.tm_sec + 60 - rtc->oldsecs) % 60;
rtc->oldsecs = tm.tm_sec;
rtc->uie_timer.expires = jiffies + HZ - (HZ/10);
rtc->uie_timer_active = 1;
rtc->uie_task_active = 0;
add_timer(&rtc->uie_timer);
} else if (schedule_work(&rtc->uie_task) == 0) {
rtc->uie_task_active = 0;
}
spin_unlock_irq(&rtc->irq_lock);
if (num)
rtc_handle_legacy_irq(rtc, num, RTC_UF);
}
static void rtc_uie_timer(unsigned long data)
{
struct rtc_device *rtc = (struct rtc_device *)data;
unsigned long flags;
spin_lock_irqsave(&rtc->irq_lock, flags);
rtc->uie_timer_active = 0;
rtc->uie_task_active = 1;
if ((schedule_work(&rtc->uie_task) == 0))
rtc->uie_task_active = 0;
spin_unlock_irqrestore(&rtc->irq_lock, flags);
}
static int clear_uie(struct rtc_device *rtc)
{
spin_lock_irq(&rtc->irq_lock);
if (rtc->uie_irq_active) {
rtc->stop_uie_polling = 1;
if (rtc->uie_timer_active) {
spin_unlock_irq(&rtc->irq_lock);
del_timer_sync(&rtc->uie_timer);
spin_lock_irq(&rtc->irq_lock);
rtc->uie_timer_active = 0;
}
if (rtc->uie_task_active) {
spin_unlock_irq(&rtc->irq_lock);
flush_scheduled_work();
spin_lock_irq(&rtc->irq_lock);
}
rtc->uie_irq_active = 0;
}
spin_unlock_irq(&rtc->irq_lock);
return 0;
}
static int set_uie(struct rtc_device *rtc)
{
struct rtc_time tm;
int err;
err = rtc_read_time(rtc, &tm);
if (err)
return err;
spin_lock_irq(&rtc->irq_lock);
if (!rtc->uie_irq_active) {
rtc->uie_irq_active = 1;
rtc->stop_uie_polling = 0;
rtc->oldsecs = tm.tm_sec;
rtc->uie_task_active = 1;
if (schedule_work(&rtc->uie_task) == 0)
rtc->uie_task_active = 0;
}
rtc->irq_data = 0;
spin_unlock_irq(&rtc->irq_lock);
return 0;
}
int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, unsigned int enabled)
{
if (enabled)
return set_uie(rtc);
else
return clear_uie(rtc);
}
EXPORT_SYMBOL(rtc_dev_update_irq_enable_emul);
#endif /* CONFIG_RTC_INTF_DEV_UIE_EMUL */
static ssize_t static ssize_t
rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
@ -387,6 +486,11 @@ void rtc_dev_prepare(struct rtc_device *rtc)
rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id); rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id);
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
INIT_WORK(&rtc->uie_task, rtc_uie_task);
setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc);
#endif
cdev_init(&rtc->char_dev, &rtc_dev_fops); cdev_init(&rtc->char_dev, &rtc_dev_fops);
rtc->char_dev.owner = rtc->owner; rtc->char_dev.owner = rtc->owner;
} }

Просмотреть файл

@ -72,7 +72,7 @@ static struct dasd_discipline dasd_eckd_discipline;
static struct ccw_device_id dasd_eckd_ids[] = { static struct ccw_device_id dasd_eckd_ids[] = {
{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1}, { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1},
{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2}, { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2},
{ CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), .driver_info = 0x3}, { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3380, 0), .driver_info = 0x3},
{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4}, { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4},
{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5}, { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5},
{ CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6}, { CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6},

Просмотреть файл

@ -601,7 +601,7 @@ static int max3100_startup(struct uart_port *port)
s->rts = 0; s->rts = 0;
sprintf(b, "max3100-%d", s->minor); sprintf(b, "max3100-%d", s->minor);
s->workqueue = create_freezeable_workqueue(b); s->workqueue = create_freezable_workqueue(b);
if (!s->workqueue) { if (!s->workqueue) {
dev_warn(&s->spi->dev, "cannot create workqueue\n"); dev_warn(&s->spi->dev, "cannot create workqueue\n");
return -EBUSY; return -EBUSY;

Просмотреть файл

@ -833,7 +833,7 @@ static int max3107_startup(struct uart_port *port)
struct max3107_port *s = container_of(port, struct max3107_port, port); struct max3107_port *s = container_of(port, struct max3107_port, port);
/* Initialize work queue */ /* Initialize work queue */
s->workqueue = create_freezeable_workqueue("max3107"); s->workqueue = create_freezable_workqueue("max3107");
if (!s->workqueue) { if (!s->workqueue) {
dev_err(&s->spi->dev, "Workqueue creation failed\n"); dev_err(&s->spi->dev, "Workqueue creation failed\n");
return -EBUSY; return -EBUSY;

Просмотреть файл

@ -37,11 +37,19 @@ static enum shutdown_state shutting_down = SHUTDOWN_INVALID;
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int xen_hvm_suspend(void *data) static int xen_hvm_suspend(void *data)
{ {
int err;
struct sched_shutdown r = { .reason = SHUTDOWN_suspend }; struct sched_shutdown r = { .reason = SHUTDOWN_suspend };
int *cancelled = data; int *cancelled = data;
BUG_ON(!irqs_disabled()); BUG_ON(!irqs_disabled());
err = sysdev_suspend(PMSG_SUSPEND);
if (err) {
printk(KERN_ERR "xen_hvm_suspend: sysdev_suspend failed: %d\n",
err);
return err;
}
*cancelled = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r); *cancelled = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
xen_hvm_post_suspend(*cancelled); xen_hvm_post_suspend(*cancelled);
@ -53,6 +61,8 @@ static int xen_hvm_suspend(void *data)
xen_timer_resume(); xen_timer_resume();
} }
sysdev_resume();
return 0; return 0;
} }

Просмотреть файл

@ -60,6 +60,7 @@ int ceph_init_dentry(struct dentry *dentry)
} }
di->dentry = dentry; di->dentry = dentry;
di->lease_session = NULL; di->lease_session = NULL;
di->parent_inode = igrab(dentry->d_parent->d_inode);
dentry->d_fsdata = di; dentry->d_fsdata = di;
dentry->d_time = jiffies; dentry->d_time = jiffies;
ceph_dentry_lru_add(dentry); ceph_dentry_lru_add(dentry);
@ -1033,7 +1034,7 @@ static void ceph_dentry_release(struct dentry *dentry)
u64 snapid = CEPH_NOSNAP; u64 snapid = CEPH_NOSNAP;
if (!IS_ROOT(dentry)) { if (!IS_ROOT(dentry)) {
parent_inode = dentry->d_parent->d_inode; parent_inode = di->parent_inode;
if (parent_inode) if (parent_inode)
snapid = ceph_snap(parent_inode); snapid = ceph_snap(parent_inode);
} }
@ -1058,6 +1059,8 @@ static void ceph_dentry_release(struct dentry *dentry)
kmem_cache_free(ceph_dentry_cachep, di); kmem_cache_free(ceph_dentry_cachep, di);
dentry->d_fsdata = NULL; dentry->d_fsdata = NULL;
} }
if (parent_inode)
iput(parent_inode);
} }
static int ceph_snapdir_d_revalidate(struct dentry *dentry, static int ceph_snapdir_d_revalidate(struct dentry *dentry,

Просмотреть файл

@ -584,10 +584,14 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
if (lastinode) if (lastinode)
iput(lastinode); iput(lastinode);
dout("queue_realm_cap_snaps %p %llx children\n", realm, realm->ino); list_for_each_entry(child, &realm->children, child_item) {
list_for_each_entry(child, &realm->children, child_item) dout("queue_realm_cap_snaps %p %llx queue child %p %llx\n",
queue_realm_cap_snaps(child); realm, realm->ino, child, child->ino);
list_del_init(&child->dirty_item);
list_add(&child->dirty_item, &realm->dirty_item);
}
list_del_init(&realm->dirty_item);
dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino);
} }
@ -683,7 +687,9 @@ more:
* queue cap snaps _after_ we've built the new snap contexts, * queue cap snaps _after_ we've built the new snap contexts,
* so that i_head_snapc can be set appropriately. * so that i_head_snapc can be set appropriately.
*/ */
list_for_each_entry(realm, &dirty_realms, dirty_item) { while (!list_empty(&dirty_realms)) {
realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
dirty_item);
queue_realm_cap_snaps(realm); queue_realm_cap_snaps(realm);
} }

Просмотреть файл

@ -207,6 +207,7 @@ struct ceph_dentry_info {
struct dentry *dentry; struct dentry *dentry;
u64 time; u64 time;
u64 offset; u64 offset;
struct inode *parent_inode;
}; };
struct ceph_inode_xattrs_info { struct ceph_inode_xattrs_info {

Просмотреть файл

@ -127,5 +127,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
extern const struct export_operations cifs_export_ops; extern const struct export_operations cifs_export_ops;
#endif /* EXPERIMENTAL */ #endif /* EXPERIMENTAL */
#define CIFS_VERSION "1.70" #define CIFS_VERSION "1.71"
#endif /* _CIFSFS_H */ #endif /* _CIFSFS_H */

Просмотреть файл

@ -170,7 +170,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len)
{ {
int rc, alen, slen; int rc, alen, slen;
const char *pct; const char *pct;
char *endp, scope_id[13]; char scope_id[13];
struct sockaddr_in *s4 = (struct sockaddr_in *) dst; struct sockaddr_in *s4 = (struct sockaddr_in *) dst;
struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) dst; struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) dst;
@ -197,9 +197,9 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len)
memcpy(scope_id, pct + 1, slen); memcpy(scope_id, pct + 1, slen);
scope_id[slen] = '\0'; scope_id[slen] = '\0';
s6->sin6_scope_id = (u32) simple_strtoul(pct, &endp, 0); rc = strict_strtoul(scope_id, 0,
if (endp != scope_id + slen) (unsigned long *)&s6->sin6_scope_id);
return 0; rc = (rc == 0) ? 1 : 0;
} }
return rc; return rc;

Просмотреть файл

@ -656,13 +656,13 @@ ssetup_ntlmssp_authenticate:
if (type == LANMAN) { if (type == LANMAN) {
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
char lnm_session_key[CIFS_SESS_KEY_SIZE]; char lnm_session_key[CIFS_AUTH_RESP_SIZE];
pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE; pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
/* no capabilities flags in old lanman negotiation */ /* no capabilities flags in old lanman negotiation */
pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE); pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
/* Calculate hash with password and copy into bcc_ptr. /* Calculate hash with password and copy into bcc_ptr.
* Encryption Key (stored as in cryptkey) gets used if the * Encryption Key (stored as in cryptkey) gets used if the
@ -675,8 +675,8 @@ ssetup_ntlmssp_authenticate:
true : false, lnm_session_key); true : false, lnm_session_key);
ses->flags |= CIFS_SES_LANMAN; ses->flags |= CIFS_SES_LANMAN;
memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE); memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
bcc_ptr += CIFS_SESS_KEY_SIZE; bcc_ptr += CIFS_AUTH_RESP_SIZE;
/* can not sign if LANMAN negotiated so no need /* can not sign if LANMAN negotiated so no need
to calculate signing key? but what if server to calculate signing key? but what if server

Просмотреть файл

@ -46,24 +46,28 @@ static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd)
{ {
struct dentry *lower_dentry; struct dentry *lower_dentry;
struct vfsmount *lower_mnt; struct vfsmount *lower_mnt;
struct dentry *dentry_save; struct dentry *dentry_save = NULL;
struct vfsmount *vfsmount_save; struct vfsmount *vfsmount_save = NULL;
int rc = 1; int rc = 1;
if (nd->flags & LOOKUP_RCU) if (nd && nd->flags & LOOKUP_RCU)
return -ECHILD; return -ECHILD;
lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dentry = ecryptfs_dentry_to_lower(dentry);
lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry); lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate) if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)
goto out; goto out;
dentry_save = nd->path.dentry; if (nd) {
vfsmount_save = nd->path.mnt; dentry_save = nd->path.dentry;
nd->path.dentry = lower_dentry; vfsmount_save = nd->path.mnt;
nd->path.mnt = lower_mnt; nd->path.dentry = lower_dentry;
nd->path.mnt = lower_mnt;
}
rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd);
nd->path.dentry = dentry_save; if (nd) {
nd->path.mnt = vfsmount_save; nd->path.dentry = dentry_save;
nd->path.mnt = vfsmount_save;
}
if (dentry->d_inode) { if (dentry->d_inode) {
struct inode *lower_inode = struct inode *lower_inode =
ecryptfs_inode_to_lower(dentry->d_inode); ecryptfs_inode_to_lower(dentry->d_inode);

Просмотреть файл

@ -632,8 +632,7 @@ int ecryptfs_interpose(struct dentry *hidden_dentry,
u32 flags); u32 flags);
int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
struct dentry *lower_dentry, struct dentry *lower_dentry,
struct inode *ecryptfs_dir_inode, struct inode *ecryptfs_dir_inode);
struct nameidata *ecryptfs_nd);
int ecryptfs_decode_and_decrypt_filename(char **decrypted_name, int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
size_t *decrypted_name_size, size_t *decrypted_name_size,
struct dentry *ecryptfs_dentry, struct dentry *ecryptfs_dentry,

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше