1022 lines
35 KiB
Diff
1022 lines
35 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 6d13598..4ebd3f1 100644
|
|
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
|
|
index e8dfdbd..cadbed6 100644
|
|
--- a/arch/powerpc/kernel/pci-common.c
|
|
+++ b/arch/powerpc/kernel/pci-common.c
|
|
@@ -1107,6 +1107,12 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
|
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
|
struct dev_archdata *sd = &dev->dev.archdata;
|
|
|
|
+ /* Cardbus can call us to add new devices to a bus, so ignore
|
|
+ * those who are already fully discovered
|
|
+ */
|
|
+ if (dev->is_added)
|
|
+ continue;
|
|
+
|
|
/* Setup OF node pointer in archdata */
|
|
sd->of_node = pci_device_to_OF_node(dev);
|
|
|
|
@@ -1147,6 +1153,13 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
|
}
|
|
EXPORT_SYMBOL(pcibios_fixup_bus);
|
|
|
|
+void __devinit pci_fixup_cardbus(struct pci_bus *bus)
|
|
+{
|
|
+ /* Now fixup devices on that bus */
|
|
+ pcibios_setup_bus_devices(bus);
|
|
+}
|
|
+
|
|
+
|
|
static int skip_isa_ioresource_align(struct pci_dev *dev)
|
|
{
|
|
if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
|
|
diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c
|
|
index b129611..4771274 100644
|
|
--- a/arch/sparc/kernel/nmi.c
|
|
+++ b/arch/sparc/kernel/nmi.c
|
|
@@ -96,7 +96,6 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
|
|
int cpu = smp_processor_id();
|
|
|
|
clear_softint(1 << irq);
|
|
- pcr_ops->write(PCR_PIC_PRIV);
|
|
|
|
local_cpu_data().__nmi_count++;
|
|
|
|
@@ -105,6 +104,8 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
|
|
if (notify_die(DIE_NMI, "nmi", regs, 0,
|
|
pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
|
|
touched = 1;
|
|
+ else
|
|
+ pcr_ops->write(PCR_PIC_PRIV);
|
|
|
|
sum = kstat_irqs_cpu(0, cpu);
|
|
if (__get_cpu_var(nmi_touch)) {
|
|
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c
|
|
index fa5936e..198fb4e 100644
|
|
--- a/arch/sparc/kernel/perf_event.c
|
|
+++ b/arch/sparc/kernel/perf_event.c
|
|
@@ -986,6 +986,17 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
|
|
data.addr = 0;
|
|
|
|
cpuc = &__get_cpu_var(cpu_hw_events);
|
|
+
|
|
+ /* If the PMU has the TOE IRQ enable bits, we need to do a
|
|
+ * dummy write to the %pcr to clear the overflow bits and thus
|
|
+ * the interrupt.
|
|
+ *
|
|
+ * Do this before we peek at the counters to determine
|
|
+ * overflow so we don't lose any events.
|
|
+ */
|
|
+ if (sparc_pmu->irq_bit)
|
|
+ pcr_ops->write(cpuc->pcr);
|
|
+
|
|
for (idx = 0; idx < MAX_HWEVENTS; idx++) {
|
|
struct perf_event *event = cpuc->events[idx];
|
|
struct hw_perf_event *hwc;
|
|
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
|
|
index d0c99ab..873f81f 100644
|
|
--- a/arch/x86/kernel/apic/apic_flat_64.c
|
|
+++ b/arch/x86/kernel/apic/apic_flat_64.c
|
|
@@ -240,6 +240,11 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
|
printk(KERN_DEBUG "system APIC only can use physical flat");
|
|
return 1;
|
|
}
|
|
+
|
|
+ if (!strncmp(oem_id, "IBM", 3) && !strncmp(oem_table_id, "EXA", 3)) {
|
|
+ printk(KERN_DEBUG "IBM Summit detected, will use apic physical");
|
|
+ return 1;
|
|
+ }
|
|
#endif
|
|
|
|
return 0;
|
|
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
|
|
index 2ab3535..9ee87cf 100644
|
|
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
|
|
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
|
|
@@ -364,13 +364,13 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
|
|
|
|
enum map_type {map_wb, map_uc};
|
|
|
|
-static __init void map_high(char *id, unsigned long base, int shift,
|
|
- int max_pnode, enum map_type map_type)
|
|
+static __init void map_high(char *id, unsigned long base, int pshift,
|
|
+ int bshift, int max_pnode, enum map_type map_type)
|
|
{
|
|
unsigned long bytes, paddr;
|
|
|
|
- paddr = base << shift;
|
|
- bytes = (1UL << shift) * (max_pnode + 1);
|
|
+ paddr = base << pshift;
|
|
+ bytes = (1UL << bshift) * (max_pnode + 1);
|
|
printk(KERN_INFO "UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr,
|
|
paddr + bytes);
|
|
if (map_type == map_uc)
|
|
@@ -386,7 +386,7 @@ static __init void map_gru_high(int max_pnode)
|
|
|
|
gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR);
|
|
if (gru.s.enable)
|
|
- map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
|
|
+ map_high("GRU", gru.s.base, shift, shift, max_pnode, map_wb);
|
|
}
|
|
|
|
static __init void map_mmr_high(int max_pnode)
|
|
@@ -396,7 +396,7 @@ static __init void map_mmr_high(int max_pnode)
|
|
|
|
mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR);
|
|
if (mmr.s.enable)
|
|
- map_high("MMR", mmr.s.base, shift, max_pnode, map_uc);
|
|
+ map_high("MMR", mmr.s.base, shift, shift, max_pnode, map_uc);
|
|
}
|
|
|
|
static __init void map_mmioh_high(int max_pnode)
|
|
@@ -406,7 +406,8 @@ static __init void map_mmioh_high(int max_pnode)
|
|
|
|
mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR);
|
|
if (mmioh.s.enable)
|
|
- map_high("MMIOH", mmioh.s.base, shift, max_pnode, map_uc);
|
|
+ map_high("MMIOH", mmioh.s.base, shift, mmioh.s.m_io,
|
|
+ max_pnode, map_uc);
|
|
}
|
|
|
|
static __init void uv_rtc_init(void)
|
|
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
|
index 4fef985..687638e 100644
|
|
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
|
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
|
@@ -274,8 +274,9 @@ void intel_init_thermal(struct cpuinfo_x86 *c)
|
|
int tm2 = 0;
|
|
u32 l, h;
|
|
|
|
- /* Thermal monitoring depends on ACPI and clock modulation*/
|
|
- if (!cpu_has(c, X86_FEATURE_ACPI) || !cpu_has(c, X86_FEATURE_ACC))
|
|
+ /* Thermal monitoring depends on APIC, ACPI and clock modulation */
|
|
+ if (!cpu_has_apic || !cpu_has(c, X86_FEATURE_ACPI) ||
|
|
+ !cpu_has(c, X86_FEATURE_ACC))
|
|
return;
|
|
|
|
/*
|
|
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c
|
|
index 77a9579..adc10a2 100644
|
|
--- a/drivers/edac/i5000_edac.c
|
|
+++ b/drivers/edac/i5000_edac.c
|
|
@@ -577,7 +577,13 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,
|
|
debugf0("\tUncorrected bits= 0x%x\n", ue_errors);
|
|
|
|
branch = EXTRACT_FBDCHAN_INDX(info->ferr_nf_fbd);
|
|
- channel = branch;
|
|
+
|
|
+ /*
|
|
+ * According with i5000 datasheet, bit 28 has no significance
|
|
+ * for errors M4Err-M12Err and M17Err-M21Err, on FERR_NF_FBD
|
|
+ */
|
|
+ channel = branch & 2;
|
|
+
|
|
bank = NREC_BANK(info->nrecmema);
|
|
rank = NREC_RANK(info->nrecmema);
|
|
rdwr = NREC_RDWR(info->nrecmema);
|
|
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
|
index aa7fd82..7d1357e 100644
|
|
--- a/drivers/gpu/drm/i915/i915_irq.c
|
|
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
|
@@ -255,7 +255,6 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
|
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
|
int ret = IRQ_NONE;
|
|
u32 de_iir, gt_iir, de_ier;
|
|
- u32 new_de_iir, new_gt_iir;
|
|
struct drm_i915_master_private *master_priv;
|
|
|
|
/* disable master interrupt before clearing iir */
|
|
@@ -266,35 +265,29 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
|
|
de_iir = I915_READ(DEIIR);
|
|
gt_iir = I915_READ(GTIIR);
|
|
|
|
- for (;;) {
|
|
- if (de_iir == 0 && gt_iir == 0)
|
|
- break;
|
|
-
|
|
- ret = IRQ_HANDLED;
|
|
-
|
|
- I915_WRITE(DEIIR, de_iir);
|
|
- new_de_iir = I915_READ(DEIIR);
|
|
- I915_WRITE(GTIIR, gt_iir);
|
|
- new_gt_iir = I915_READ(GTIIR);
|
|
+ if (de_iir == 0 && gt_iir == 0)
|
|
+ goto done;
|
|
|
|
- if (dev->primary->master) {
|
|
- master_priv = dev->primary->master->driver_priv;
|
|
- if (master_priv->sarea_priv)
|
|
- master_priv->sarea_priv->last_dispatch =
|
|
- READ_BREADCRUMB(dev_priv);
|
|
- }
|
|
+ ret = IRQ_HANDLED;
|
|
|
|
- if (gt_iir & GT_USER_INTERRUPT) {
|
|
- u32 seqno = i915_get_gem_seqno(dev);
|
|
- dev_priv->mm.irq_gem_seqno = seqno;
|
|
- trace_i915_gem_request_complete(dev, seqno);
|
|
- DRM_WAKEUP(&dev_priv->irq_queue);
|
|
- }
|
|
+ if (dev->primary->master) {
|
|
+ master_priv = dev->primary->master->driver_priv;
|
|
+ if (master_priv->sarea_priv)
|
|
+ master_priv->sarea_priv->last_dispatch =
|
|
+ READ_BREADCRUMB(dev_priv);
|
|
+ }
|
|
|
|
- de_iir = new_de_iir;
|
|
- gt_iir = new_gt_iir;
|
|
+ if (gt_iir & GT_USER_INTERRUPT) {
|
|
+ u32 seqno = i915_get_gem_seqno(dev);
|
|
+ dev_priv->mm.irq_gem_seqno = seqno;
|
|
+ trace_i915_gem_request_complete(dev, seqno);
|
|
+ DRM_WAKEUP(&dev_priv->irq_queue);
|
|
}
|
|
|
|
+ I915_WRITE(GTIIR, gt_iir);
|
|
+ I915_WRITE(DEIIR, de_iir);
|
|
+
|
|
+done:
|
|
I915_WRITE(DEIER, de_ier);
|
|
(void)I915_READ(DEIER);
|
|
|
|
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
|
index 4b96e7a..5b4d66d 100644
|
|
--- a/drivers/hid/hid-apple.c
|
|
+++ b/drivers/hid/hid-apple.c
|
|
@@ -431,6 +431,13 @@ static const struct hid_device_id apple_devices[] = {
|
|
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
|
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
|
|
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
|
|
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
|
|
+ APPLE_ISO_KEYBOARD },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS),
|
|
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
|
|
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
|
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
index 7d05c4b..9678354 100644
|
|
--- a/drivers/hid/hid-core.c
|
|
+++ b/drivers/hid/hid-core.c
|
|
@@ -1287,6 +1287,9 @@ static const struct hid_device_id hid_blacklist[] = {
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
|
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
|
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
index adbef5d..e380e7b 100644
|
|
--- a/drivers/hid/hid-ids.h
|
|
+++ b/drivers/hid/hid-ids.h
|
|
@@ -88,6 +88,9 @@
|
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
|
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
|
|
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
|
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
|
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
|
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
|
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
|
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c
|
|
index 0ed68e2..f7346a9 100644
|
|
--- a/drivers/i2c/busses/i2c-pca-isa.c
|
|
+++ b/drivers/i2c/busses/i2c-pca-isa.c
|
|
@@ -75,7 +75,7 @@ static int pca_isa_waitforcompletion(void *pd)
|
|
unsigned long timeout;
|
|
|
|
if (irq > -1) {
|
|
- ret = wait_event_interruptible_timeout(pca_wait,
|
|
+ ret = wait_event_timeout(pca_wait,
|
|
pca_isa_readbyte(pd, I2C_PCA_CON)
|
|
& I2C_PCA_CON_SI, pca_isa_ops.timeout);
|
|
} else {
|
|
@@ -96,7 +96,7 @@ static void pca_isa_resetchip(void *pd)
|
|
}
|
|
|
|
static irqreturn_t pca_handler(int this_irq, void *dev_id) {
|
|
- wake_up_interruptible(&pca_wait);
|
|
+ wake_up(&pca_wait);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c
|
|
index c4df9d4..5b2213d 100644
|
|
--- a/drivers/i2c/busses/i2c-pca-platform.c
|
|
+++ b/drivers/i2c/busses/i2c-pca-platform.c
|
|
@@ -84,7 +84,7 @@ static int i2c_pca_pf_waitforcompletion(void *pd)
|
|
unsigned long timeout;
|
|
|
|
if (i2c->irq) {
|
|
- ret = wait_event_interruptible_timeout(i2c->wait,
|
|
+ ret = wait_event_timeout(i2c->wait,
|
|
i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
|
|
& I2C_PCA_CON_SI, i2c->adap.timeout);
|
|
} else {
|
|
@@ -122,7 +122,7 @@ static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id)
|
|
if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
|
|
return IRQ_NONE;
|
|
|
|
- wake_up_interruptible(&i2c->wait);
|
|
+ wake_up(&i2c->wait);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
|
|
index 2965043..3bf7b0a 100644
|
|
--- a/drivers/i2c/i2c-core.c
|
|
+++ b/drivers/i2c/i2c-core.c
|
|
@@ -801,6 +801,9 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
|
adap->dev.parent);
|
|
#endif
|
|
|
|
+ /* device name is gone after device_unregister */
|
|
+ dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
|
|
+
|
|
/* clean up the sysfs representation */
|
|
init_completion(&adap->dev_released);
|
|
device_unregister(&adap->dev);
|
|
@@ -813,8 +816,6 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
|
idr_remove(&i2c_adapter_idr, adap->nr);
|
|
mutex_unlock(&core_lock);
|
|
|
|
- dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
|
|
-
|
|
/* Clear the device structure in case this adapter is ever going to be
|
|
added again */
|
|
memset(&adap->dev, 0, sizeof(adap->dev));
|
|
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
|
|
index 07c5379..0876d82 100644
|
|
--- a/drivers/input/mouse/psmouse-base.c
|
|
+++ b/drivers/input/mouse/psmouse-base.c
|
|
@@ -667,19 +667,6 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
|
max_proto = PSMOUSE_IMEX;
|
|
}
|
|
|
|
-/*
|
|
- * Try Finger Sensing Pad
|
|
- */
|
|
- if (max_proto > PSMOUSE_IMEX) {
|
|
- if (fsp_detect(psmouse, set_properties) == 0) {
|
|
- if (!set_properties || fsp_init(psmouse) == 0)
|
|
- return PSMOUSE_FSP;
|
|
-/*
|
|
- * Init failed, try basic relative protocols
|
|
- */
|
|
- max_proto = PSMOUSE_IMEX;
|
|
- }
|
|
- }
|
|
|
|
if (max_proto > PSMOUSE_IMEX) {
|
|
if (genius_detect(psmouse, set_properties) == 0)
|
|
@@ -696,6 +683,21 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
|
}
|
|
|
|
/*
|
|
+ * Try Finger Sensing Pad. We do it here because its probe upsets
|
|
+ * Trackpoint devices (causing TP_READ_ID command to time out).
|
|
+ */
|
|
+ if (max_proto > PSMOUSE_IMEX) {
|
|
+ if (fsp_detect(psmouse, set_properties) == 0) {
|
|
+ if (!set_properties || fsp_init(psmouse) == 0)
|
|
+ return PSMOUSE_FSP;
|
|
+/*
|
|
+ * Init failed, try basic relative protocols
|
|
+ */
|
|
+ max_proto = PSMOUSE_IMEX;
|
|
+ }
|
|
+ }
|
|
+
|
|
+/*
|
|
* Reset to defaults in case the device got confused by extended
|
|
* protocol probes. Note that we follow up with full reset because
|
|
* some mice put themselves to sleep when they see PSMOUSE_RESET_DIS.
|
|
diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c
|
|
index cdad3db..e0a3b75 100644
|
|
--- a/drivers/media/video/gspca/sn9c20x.c
|
|
+++ b/drivers/media/video/gspca/sn9c20x.c
|
|
@@ -2319,7 +2319,7 @@ static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum)
|
|
}
|
|
}
|
|
if (avg_lum > MAX_AVG_LUM) {
|
|
- if (sd->gain - 1 >= 0) {
|
|
+ if (sd->gain >= 1) {
|
|
sd->gain--;
|
|
set_gain(gspca_dev);
|
|
}
|
|
diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
|
|
index ba27c9d..ca6b098 100644
|
|
--- a/drivers/mfd/wm8350-core.c
|
|
+++ b/drivers/mfd/wm8350-core.c
|
|
@@ -134,8 +134,7 @@ static inline int is_reg_locked(struct wm8350 *wm8350, u8 reg)
|
|
wm8350->reg_cache[WM8350_SECURITY] == WM8350_UNLOCK_KEY)
|
|
return 0;
|
|
|
|
- if ((reg == WM8350_GPIO_CONFIGURATION_I_O) ||
|
|
- (reg >= WM8350_GPIO_FUNCTION_SELECT_1 &&
|
|
+ if ((reg >= WM8350_GPIO_FUNCTION_SELECT_1 &&
|
|
reg <= WM8350_GPIO_FUNCTION_SELECT_4) ||
|
|
(reg >= WM8350_BATTERY_CHARGER_CONTROL_1 &&
|
|
reg <= WM8350_BATTERY_CHARGER_CONTROL_3))
|
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
|
index 4e4c295..6477722 100644
|
|
--- a/drivers/pci/pci.c
|
|
+++ b/drivers/pci/pci.c
|
|
@@ -2723,6 +2723,11 @@ int __attribute__ ((weak)) pci_ext_cfg_avail(struct pci_dev *dev)
|
|
return 1;
|
|
}
|
|
|
|
+void __weak pci_fixup_cardbus(struct pci_bus *bus)
|
|
+{
|
|
+}
|
|
+EXPORT_SYMBOL(pci_fixup_cardbus);
|
|
+
|
|
static int __init pci_setup(char *str)
|
|
{
|
|
while (str) {
|
|
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c
|
|
index db77e1f..5c26793 100644
|
|
--- a/drivers/pcmcia/cardbus.c
|
|
+++ b/drivers/pcmcia/cardbus.c
|
|
@@ -214,7 +214,7 @@ int __ref cb_alloc(struct pcmcia_socket * s)
|
|
unsigned int max, pass;
|
|
|
|
s->functions = pci_scan_slot(bus, PCI_DEVFN(0, 0));
|
|
-// pcibios_fixup_bus(bus);
|
|
+ pci_fixup_cardbus(bus);
|
|
|
|
max = bus->secondary;
|
|
for (pass = 0; pass < 2; pass++)
|
|
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c
|
|
index 849359a..767cb61 100644
|
|
--- a/drivers/platform/x86/asus-laptop.c
|
|
+++ b/drivers/platform/x86/asus-laptop.c
|
|
@@ -221,6 +221,7 @@ static struct asus_hotk *hotk;
|
|
*/
|
|
static const struct acpi_device_id asus_device_ids[] = {
|
|
{"ATK0100", 0},
|
|
+ {"ATK0101", 0},
|
|
{"", 0},
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, asus_device_ids);
|
|
@@ -293,6 +294,11 @@ struct key_entry {
|
|
enum { KE_KEY, KE_END };
|
|
|
|
static struct key_entry asus_keymap[] = {
|
|
+ {KE_KEY, 0x02, KEY_SCREENLOCK},
|
|
+ {KE_KEY, 0x05, KEY_WLAN},
|
|
+ {KE_KEY, 0x08, BTN_TOUCH},
|
|
+ {KE_KEY, 0x17, KEY_ZOOM},
|
|
+ {KE_KEY, 0x1f, KEY_BATTERY},
|
|
{KE_KEY, 0x30, KEY_VOLUMEUP},
|
|
{KE_KEY, 0x31, KEY_VOLUMEDOWN},
|
|
{KE_KEY, 0x32, KEY_MUTE},
|
|
@@ -312,6 +318,8 @@ static struct key_entry asus_keymap[] = {
|
|
{KE_KEY, 0x5F, KEY_WLAN},
|
|
{KE_KEY, 0x60, KEY_SWITCHVIDEOMODE},
|
|
{KE_KEY, 0x61, KEY_SWITCHVIDEOMODE},
|
|
+ {KE_KEY, 0x62, KEY_SWITCHVIDEOMODE},
|
|
+ {KE_KEY, 0x63, KEY_SWITCHVIDEOMODE},
|
|
{KE_KEY, 0x6B, BTN_TOUCH}, /* Lock Mouse */
|
|
{KE_KEY, 0x82, KEY_CAMERA},
|
|
{KE_KEY, 0x8A, KEY_PROG1},
|
|
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c
|
|
index 507ccc6..518712c 100644
|
|
--- a/drivers/scsi/megaraid/megaraid_sas.c
|
|
+++ b/drivers/scsi/megaraid/megaraid_sas.c
|
|
@@ -3451,7 +3451,7 @@ out:
|
|
return retval;
|
|
}
|
|
|
|
-static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUGO,
|
|
+static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR,
|
|
megasas_sysfs_show_poll_mode_io,
|
|
megasas_sysfs_set_poll_mode_io);
|
|
|
|
diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c
|
|
index d71dfe3..0cce8a4 100644
|
|
--- a/drivers/serial/8250_pnp.c
|
|
+++ b/drivers/serial/8250_pnp.c
|
|
@@ -354,6 +354,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
|
|
{ "FUJ02E5", 0 },
|
|
/* Fujitsu P-series tablet PC device */
|
|
{ "FUJ02E6", 0 },
|
|
+ /* Fujitsu Wacom 2FGT Tablet PC device */
|
|
+ { "FUJ02E7", 0 },
|
|
/*
|
|
* LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
|
|
* disguise)
|
|
diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c
|
|
index adf9632..53cb722 100644
|
|
--- a/drivers/video/s3c-fb.c
|
|
+++ b/drivers/video/s3c-fb.c
|
|
@@ -211,21 +211,23 @@ static int s3c_fb_check_var(struct fb_var_screeninfo *var,
|
|
|
|
/**
|
|
* s3c_fb_calc_pixclk() - calculate the divider to create the pixel clock.
|
|
- * @id: window id.
|
|
* @sfb: The hardware state.
|
|
* @pixclock: The pixel clock wanted, in picoseconds.
|
|
*
|
|
* Given the specified pixel clock, work out the necessary divider to get
|
|
* close to the output frequency.
|
|
*/
|
|
-static int s3c_fb_calc_pixclk(unsigned char id, struct s3c_fb *sfb, unsigned int pixclk)
|
|
+static int s3c_fb_calc_pixclk(struct s3c_fb *sfb, unsigned int pixclk)
|
|
{
|
|
- struct s3c_fb_pd_win *win = sfb->pdata->win[id];
|
|
unsigned long clk = clk_get_rate(sfb->bus_clk);
|
|
+ unsigned long long tmp;
|
|
unsigned int result;
|
|
|
|
- pixclk *= win->win_mode.refresh;
|
|
- result = clk / pixclk;
|
|
+ tmp = (unsigned long long)clk;
|
|
+ tmp *= pixclk;
|
|
+
|
|
+ do_div(tmp, 1000000000UL);
|
|
+ result = (unsigned int)tmp / 1000;
|
|
|
|
dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n",
|
|
pixclk, clk, result, clk / result);
|
|
@@ -301,7 +303,7 @@ static int s3c_fb_set_par(struct fb_info *info)
|
|
/* use window 0 as the basis for the lcd output timings */
|
|
|
|
if (win_no == 0) {
|
|
- clkdiv = s3c_fb_calc_pixclk(win_no, sfb, var->pixclock);
|
|
+ clkdiv = s3c_fb_calc_pixclk(sfb, var->pixclock);
|
|
|
|
data = sfb->pdata->vidcon0;
|
|
data &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR);
|
|
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c
|
|
index c9ee67b..1afb0a1 100644
|
|
--- a/fs/notify/inotify/inotify_fsnotify.c
|
|
+++ b/fs/notify/inotify/inotify_fsnotify.c
|
|
@@ -121,7 +121,7 @@ static int idr_callback(int id, void *p, void *data)
|
|
if (warned)
|
|
return 0;
|
|
|
|
- warned = false;
|
|
+ warned = true;
|
|
entry = p;
|
|
ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry);
|
|
|
|
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
|
|
index dcd2040..ca44337 100644
|
|
--- a/fs/notify/inotify/inotify_user.c
|
|
+++ b/fs/notify/inotify/inotify_user.c
|
|
@@ -558,7 +558,7 @@ retry:
|
|
|
|
spin_lock(&group->inotify_data.idr_lock);
|
|
ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry,
|
|
- group->inotify_data.last_wd,
|
|
+ group->inotify_data.last_wd+1,
|
|
&tmp_ientry->wd);
|
|
spin_unlock(&group->inotify_data.idr_lock);
|
|
if (ret) {
|
|
@@ -638,7 +638,7 @@ static struct fsnotify_group *inotify_new_group(struct user_struct *user, unsign
|
|
|
|
spin_lock_init(&group->inotify_data.idr_lock);
|
|
idr_init(&group->inotify_data.idr);
|
|
- group->inotify_data.last_wd = 1;
|
|
+ group->inotify_data.last_wd = 0;
|
|
group->inotify_data.user = user;
|
|
group->inotify_data.fa = NULL;
|
|
|
|
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
|
|
index a14d6cd..d240c15 100644
|
|
--- a/fs/reiserfs/inode.c
|
|
+++ b/fs/reiserfs/inode.c
|
|
@@ -2531,6 +2531,12 @@ static int reiserfs_writepage(struct page *page, struct writeback_control *wbc)
|
|
return reiserfs_write_full_page(page, wbc);
|
|
}
|
|
|
|
+static void reiserfs_truncate_failed_write(struct inode *inode)
|
|
+{
|
|
+ truncate_inode_pages(inode->i_mapping, inode->i_size);
|
|
+ reiserfs_truncate_file(inode, 0);
|
|
+}
|
|
+
|
|
static int reiserfs_write_begin(struct file *file,
|
|
struct address_space *mapping,
|
|
loff_t pos, unsigned len, unsigned flags,
|
|
@@ -2597,6 +2603,8 @@ static int reiserfs_write_begin(struct file *file,
|
|
if (ret) {
|
|
unlock_page(page);
|
|
page_cache_release(page);
|
|
+ /* Truncate allocated blocks */
|
|
+ reiserfs_truncate_failed_write(inode);
|
|
}
|
|
return ret;
|
|
}
|
|
@@ -2689,8 +2697,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
|
|
** transaction tracking stuff when the size changes. So, we have
|
|
** to do the i_size updates here.
|
|
*/
|
|
- pos += copied;
|
|
- if (pos > inode->i_size) {
|
|
+ if (pos + copied > inode->i_size) {
|
|
struct reiserfs_transaction_handle myth;
|
|
reiserfs_write_lock(inode->i_sb);
|
|
/* If the file have grown beyond the border where it
|
|
@@ -2708,7 +2715,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
|
|
goto journal_error;
|
|
}
|
|
reiserfs_update_inode_transaction(inode);
|
|
- inode->i_size = pos;
|
|
+ inode->i_size = pos + copied;
|
|
/*
|
|
* this will just nest into our transaction. It's important
|
|
* to use mark_inode_dirty so the inode gets pushed around on the
|
|
@@ -2735,6 +2742,10 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
|
|
out:
|
|
unlock_page(page);
|
|
page_cache_release(page);
|
|
+
|
|
+ if (pos + len > inode->i_size)
|
|
+ reiserfs_truncate_failed_write(inode);
|
|
+
|
|
return ret == 0 ? copied : ret;
|
|
|
|
journal_error:
|
|
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
|
|
index 221cecd..adf99c6 100644
|
|
--- a/include/linux/blkdev.h
|
|
+++ b/include/linux/blkdev.h
|
|
@@ -1114,11 +1114,18 @@ static inline int queue_alignment_offset(struct request_queue *q)
|
|
return q->limits.alignment_offset;
|
|
}
|
|
|
|
+static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset)
|
|
+{
|
|
+ unsigned int granularity = max(lim->physical_block_size, lim->io_min);
|
|
+
|
|
+ offset &= granularity - 1;
|
|
+ return (granularity + lim->alignment_offset - offset) & (granularity - 1);
|
|
+}
|
|
+
|
|
static inline int queue_sector_alignment_offset(struct request_queue *q,
|
|
sector_t sector)
|
|
{
|
|
- return ((sector << 9) - q->limits.alignment_offset)
|
|
- & (q->limits.io_min - 1);
|
|
+ return queue_limit_alignment_offset(&q->limits, sector << 9);
|
|
}
|
|
|
|
static inline int bdev_alignment_offset(struct block_device *bdev)
|
|
diff --git a/include/linux/mfd/wm8350/pmic.h b/include/linux/mfd/wm8350/pmic.h
|
|
index be3264e..e786fe9 100644
|
|
--- a/include/linux/mfd/wm8350/pmic.h
|
|
+++ b/include/linux/mfd/wm8350/pmic.h
|
|
@@ -666,20 +666,20 @@
|
|
#define WM8350_ISINK_FLASH_DUR_64MS (1 << 8)
|
|
#define WM8350_ISINK_FLASH_DUR_96MS (2 << 8)
|
|
#define WM8350_ISINK_FLASH_DUR_1024MS (3 << 8)
|
|
-#define WM8350_ISINK_FLASH_ON_INSTANT (0 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_0_25S (1 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_0_50S (2 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_1_00S (3 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_1_95S (1 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_3_91S (2 << 4)
|
|
-#define WM8350_ISINK_FLASH_ON_7_80S (3 << 4)
|
|
-#define WM8350_ISINK_FLASH_OFF_INSTANT (0 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_0_25S (1 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_0_50S (2 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_1_00S (3 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_1_95S (1 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_3_91S (2 << 0)
|
|
-#define WM8350_ISINK_FLASH_OFF_7_80S (3 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_INSTANT (0 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_0_25S (1 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_0_50S (2 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_1_00S (3 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_1_95S (1 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_3_91S (2 << 0)
|
|
+#define WM8350_ISINK_FLASH_ON_7_80S (3 << 0)
|
|
+#define WM8350_ISINK_FLASH_OFF_INSTANT (0 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_0_25S (1 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_0_50S (2 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_1_00S (3 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_1_95S (1 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_3_91S (2 << 4)
|
|
+#define WM8350_ISINK_FLASH_OFF_7_80S (3 << 4)
|
|
|
|
/*
|
|
* Regulator Interrupts.
|
|
diff --git a/include/linux/pci.h b/include/linux/pci.h
|
|
index f5c7cd3..2547515 100644
|
|
--- a/include/linux/pci.h
|
|
+++ b/include/linux/pci.h
|
|
@@ -564,6 +564,9 @@ void pcibios_align_resource(void *, struct resource *, resource_size_t,
|
|
resource_size_t);
|
|
void pcibios_update_irq(struct pci_dev *, int irq);
|
|
|
|
+/* Weak but can be overriden by arch */
|
|
+void pci_fixup_cardbus(struct pci_bus *);
|
|
+
|
|
/* Generic PCI functions used internally */
|
|
|
|
extern struct pci_bus *pci_find_bus(int domain, int busnr);
|
|
diff --git a/kernel/futex.c b/kernel/futex.c
|
|
index d73ef1f..3b74909 100644
|
|
--- a/kernel/futex.c
|
|
+++ b/kernel/futex.c
|
|
@@ -203,8 +203,6 @@ static void drop_futex_key_refs(union futex_key *key)
|
|
* @uaddr: virtual address of the futex
|
|
* @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED
|
|
* @key: address where result is stored.
|
|
- * @rw: mapping needs to be read/write (values: VERIFY_READ,
|
|
- * VERIFY_WRITE)
|
|
*
|
|
* Returns a negative error code or 0
|
|
* The key words are stored in *key on success.
|
|
@@ -216,7 +214,7 @@ static void drop_futex_key_refs(union futex_key *key)
|
|
* lock_page() might sleep, the caller should not hold a spinlock.
|
|
*/
|
|
static int
|
|
-get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
|
|
+get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key)
|
|
{
|
|
unsigned long address = (unsigned long)uaddr;
|
|
struct mm_struct *mm = current->mm;
|
|
@@ -239,7 +237,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
|
|
* but access_ok() should be faster than find_vma()
|
|
*/
|
|
if (!fshared) {
|
|
- if (unlikely(!access_ok(rw, uaddr, sizeof(u32))))
|
|
+ if (unlikely(!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))))
|
|
return -EFAULT;
|
|
key->private.mm = mm;
|
|
key->private.address = address;
|
|
@@ -248,7 +246,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
|
|
}
|
|
|
|
again:
|
|
- err = get_user_pages_fast(address, 1, rw == VERIFY_WRITE, &page);
|
|
+ err = get_user_pages_fast(address, 1, 1, &page);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
@@ -867,7 +865,7 @@ static int futex_wake(u32 __user *uaddr, int fshared, int nr_wake, u32 bitset)
|
|
if (!bitset)
|
|
return -EINVAL;
|
|
|
|
- ret = get_futex_key(uaddr, fshared, &key, VERIFY_READ);
|
|
+ ret = get_futex_key(uaddr, fshared, &key);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
|
|
@@ -913,10 +911,10 @@ futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
|
|
int ret, op_ret;
|
|
|
|
retry:
|
|
- ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ);
|
|
+ ret = get_futex_key(uaddr1, fshared, &key1);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
- ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
|
|
+ ret = get_futex_key(uaddr2, fshared, &key2);
|
|
if (unlikely(ret != 0))
|
|
goto out_put_key1;
|
|
|
|
@@ -1175,11 +1173,10 @@ retry:
|
|
pi_state = NULL;
|
|
}
|
|
|
|
- ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ);
|
|
+ ret = get_futex_key(uaddr1, fshared, &key1);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
- ret = get_futex_key(uaddr2, fshared, &key2,
|
|
- requeue_pi ? VERIFY_WRITE : VERIFY_READ);
|
|
+ ret = get_futex_key(uaddr2, fshared, &key2);
|
|
if (unlikely(ret != 0))
|
|
goto out_put_key1;
|
|
|
|
@@ -1738,7 +1735,7 @@ static int futex_wait_setup(u32 __user *uaddr, u32 val, int fshared,
|
|
*/
|
|
retry:
|
|
q->key = FUTEX_KEY_INIT;
|
|
- ret = get_futex_key(uaddr, fshared, &q->key, VERIFY_READ);
|
|
+ ret = get_futex_key(uaddr, fshared, &q->key);
|
|
if (unlikely(ret != 0))
|
|
return ret;
|
|
|
|
@@ -1904,7 +1901,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared,
|
|
q.requeue_pi_key = NULL;
|
|
retry:
|
|
q.key = FUTEX_KEY_INIT;
|
|
- ret = get_futex_key(uaddr, fshared, &q.key, VERIFY_WRITE);
|
|
+ ret = get_futex_key(uaddr, fshared, &q.key);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
|
|
@@ -2023,7 +2020,7 @@ retry:
|
|
if ((uval & FUTEX_TID_MASK) != task_pid_vnr(current))
|
|
return -EPERM;
|
|
|
|
- ret = get_futex_key(uaddr, fshared, &key, VERIFY_WRITE);
|
|
+ ret = get_futex_key(uaddr, fshared, &key);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
|
|
@@ -2215,7 +2212,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared,
|
|
rt_waiter.task = NULL;
|
|
|
|
key2 = FUTEX_KEY_INIT;
|
|
- ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
|
|
+ ret = get_futex_key(uaddr2, fshared, &key2);
|
|
if (unlikely(ret != 0))
|
|
goto out;
|
|
|
|
diff --git a/kernel/sched.c b/kernel/sched.c
|
|
index dd0dccd..bf841d8 100644
|
|
--- a/kernel/sched.c
|
|
+++ b/kernel/sched.c
|
|
@@ -3177,10 +3177,6 @@ static void pull_task(struct rq *src_rq, struct task_struct *p,
|
|
deactivate_task(src_rq, p, 0);
|
|
set_task_cpu(p, this_cpu);
|
|
activate_task(this_rq, p, 0);
|
|
- /*
|
|
- * Note that idle threads have a prio of MAX_PRIO, for this test
|
|
- * to be always true for them.
|
|
- */
|
|
check_preempt_curr(this_rq, p, 0);
|
|
}
|
|
|
|
@@ -6982,7 +6978,6 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu)
|
|
__sched_fork(idle);
|
|
idle->se.exec_start = sched_clock();
|
|
|
|
- idle->prio = idle->normal_prio = MAX_PRIO;
|
|
cpumask_copy(&idle->cpus_allowed, cpumask_of(cpu));
|
|
__set_task_cpu(idle, cpu);
|
|
|
|
@@ -7686,7 +7681,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|
spin_lock_irq(&rq->lock);
|
|
update_rq_clock(rq);
|
|
deactivate_task(rq, rq->idle, 0);
|
|
- rq->idle->static_prio = MAX_PRIO;
|
|
__setscheduler(rq, rq->idle, SCHED_NORMAL, 0);
|
|
rq->idle->sched_class = &idle_sched_class;
|
|
migrate_dead_tasks(cpu);
|
|
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
|
|
index 479ce56..5b49613 100644
|
|
--- a/kernel/sched_clock.c
|
|
+++ b/kernel/sched_clock.c
|
|
@@ -236,6 +236,18 @@ void sched_clock_idle_wakeup_event(u64 delta_ns)
|
|
}
|
|
EXPORT_SYMBOL_GPL(sched_clock_idle_wakeup_event);
|
|
|
|
+unsigned long long cpu_clock(int cpu)
|
|
+{
|
|
+ unsigned long long clock;
|
|
+ unsigned long flags;
|
|
+
|
|
+ local_irq_save(flags);
|
|
+ clock = sched_clock_cpu(cpu);
|
|
+ local_irq_restore(flags);
|
|
+
|
|
+ return clock;
|
|
+}
|
|
+
|
|
#else /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */
|
|
|
|
void sched_clock_init(void)
|
|
@@ -251,17 +263,12 @@ u64 sched_clock_cpu(int cpu)
|
|
return sched_clock();
|
|
}
|
|
|
|
-#endif /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */
|
|
|
|
unsigned long long cpu_clock(int cpu)
|
|
{
|
|
- unsigned long long clock;
|
|
- unsigned long flags;
|
|
+ return sched_clock_cpu(cpu);
|
|
+}
|
|
|
|
- local_irq_save(flags);
|
|
- clock = sched_clock_cpu(cpu);
|
|
- local_irq_restore(flags);
|
|
+#endif /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */
|
|
|
|
- return clock;
|
|
-}
|
|
EXPORT_SYMBOL_GPL(cpu_clock);
|
|
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
|
|
index 5dc1037..66035bf 100644
|
|
--- a/mm/memcontrol.c
|
|
+++ b/mm/memcontrol.c
|
|
@@ -2381,7 +2381,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *mem, bool free_all)
|
|
if (free_all)
|
|
goto try_to_free;
|
|
move_account:
|
|
- while (mem->res.usage > 0) {
|
|
+ do {
|
|
ret = -EBUSY;
|
|
if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children))
|
|
goto out;
|
|
@@ -2408,8 +2408,8 @@ move_account:
|
|
if (ret == -ENOMEM)
|
|
goto try_to_free;
|
|
cond_resched();
|
|
- }
|
|
- ret = 0;
|
|
+ /* "ret" should also be checked to ensure all lists are empty. */
|
|
+ } while (mem->res.usage > 0 || ret);
|
|
out:
|
|
css_put(&mem->css);
|
|
return ret;
|
|
@@ -2442,10 +2442,7 @@ try_to_free:
|
|
}
|
|
lru_add_drain();
|
|
/* try move_account...there may be some *locked* pages. */
|
|
- if (mem->res.usage)
|
|
- goto move_account;
|
|
- ret = 0;
|
|
- goto out;
|
|
+ goto move_account;
|
|
}
|
|
|
|
int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event)
|
|
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
|
index 2bc2ac6..3a78e2e 100644
|
|
--- a/mm/page_alloc.c
|
|
+++ b/mm/page_alloc.c
|
|
@@ -1225,10 +1225,10 @@ again:
|
|
}
|
|
spin_lock_irqsave(&zone->lock, flags);
|
|
page = __rmqueue(zone, order, migratetype);
|
|
- __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
|
|
spin_unlock(&zone->lock);
|
|
if (!page)
|
|
goto failed;
|
|
+ __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
|
|
}
|
|
|
|
__count_zone_vm_events(PGALLOC, zone, 1 << order);
|
|
diff --git a/mm/truncate.c b/mm/truncate.c
|
|
index 450cebd..258bda7 100644
|
|
--- a/mm/truncate.c
|
|
+++ b/mm/truncate.c
|
|
@@ -516,22 +516,20 @@ EXPORT_SYMBOL_GPL(invalidate_inode_pages2);
|
|
*/
|
|
void truncate_pagecache(struct inode *inode, loff_t old, loff_t new)
|
|
{
|
|
- if (new < old) {
|
|
- struct address_space *mapping = inode->i_mapping;
|
|
-
|
|
- /*
|
|
- * unmap_mapping_range is called twice, first simply for
|
|
- * efficiency so that truncate_inode_pages does fewer
|
|
- * single-page unmaps. However after this first call, and
|
|
- * before truncate_inode_pages finishes, it is possible for
|
|
- * private pages to be COWed, which remain after
|
|
- * truncate_inode_pages finishes, hence the second
|
|
- * unmap_mapping_range call must be made for correctness.
|
|
- */
|
|
- unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
|
|
- truncate_inode_pages(mapping, new);
|
|
- unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
|
|
- }
|
|
+ struct address_space *mapping = inode->i_mapping;
|
|
+
|
|
+ /*
|
|
+ * unmap_mapping_range is called twice, first simply for
|
|
+ * efficiency so that truncate_inode_pages does fewer
|
|
+ * single-page unmaps. However after this first call, and
|
|
+ * before truncate_inode_pages finishes, it is possible for
|
|
+ * private pages to be COWed, which remain after
|
|
+ * truncate_inode_pages finishes, hence the second
|
|
+ * unmap_mapping_range call must be made for correctness.
|
|
+ */
|
|
+ unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
|
|
+ truncate_inode_pages(mapping, new);
|
|
+ unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
|
|
}
|
|
EXPORT_SYMBOL(truncate_pagecache);
|
|
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index a4cb183..075c3a6 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -14685,6 +14685,8 @@ static int patch_alc861(struct hda_codec *codec)
|
|
spec->stream_digital_playback = &alc861_pcm_digital_playback;
|
|
spec->stream_digital_capture = &alc861_pcm_digital_capture;
|
|
|
|
+ if (!spec->cap_mixer)
|
|
+ set_capture_mixer(codec);
|
|
set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
|
|
|
|
spec->vmaster_nid = 0x03;
|