forked from luck/tmp_suning_uos_patched
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
b2d3298e09
|
@ -7,9 +7,9 @@ Each LED is represented as a sub-node of the gpio-leds device. Each
|
|||
node's name represents the name of the corresponding LED.
|
||||
|
||||
LED sub-node properties:
|
||||
- gpios : Should specify the LED's GPIO, see "Specifying GPIO information
|
||||
for devices" in Documentation/devicetree/booting-without-of.txt. Active
|
||||
low LEDs should be indicated using flags in the GPIO specifier.
|
||||
- gpios : Should specify the LED's GPIO, see "gpios property" in
|
||||
Documentation/devicetree/gpio.txt. Active low LEDs should be
|
||||
indicated using flags in the GPIO specifier.
|
||||
- label : (optional) The label for this LED. If omitted, the label is
|
||||
taken from the node name (excluding the unit address).
|
||||
- linux,default-trigger : (optional) This parameter, if present, is a
|
||||
|
|
|
@ -30,6 +30,7 @@ national National Semiconductor
|
|||
nintendo Nintendo
|
||||
nvidia NVIDIA
|
||||
nxp NXP Semiconductors
|
||||
picochip Picochip Ltd
|
||||
powervr Imagination Technologies
|
||||
qcom Qualcomm, Inc.
|
||||
ramtron Ramtron International
|
||||
|
|
|
@ -7,21 +7,29 @@ Supported chips:
|
|||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
||||
* IDT TSE2002B3, TS3000B3
|
||||
Prefix: 'tse2002b3', 'ts3000b3'
|
||||
* Atmel AT30TS00
|
||||
Prefix: 'at30ts00'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.idt.com/products/getdoc.cfm?docid=18715691
|
||||
http://www.idt.com/products/getdoc.cfm?docid=18715692
|
||||
http://www.atmel.com/Images/doc8585.pdf
|
||||
* IDT TSE2002B3, TSE2002GB2, TS3000B3, TS3000GB2
|
||||
Prefix: 'tse2002', 'ts3000'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TSE2002B3C_DST_20100512_120303152056.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TSE2002GB2A1_DST_20111107_120303145914.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TS3000B3A_DST_20101129_120303152013.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TS3000GB2A1_DST_20111104_120303151012.pdf
|
||||
* Maxim MAX6604
|
||||
Prefix: 'max6604'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf
|
||||
* Microchip MCP9805, MCP98242, MCP98243, MCP9843
|
||||
Prefixes: 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
||||
* Microchip MCP9804, MCP9805, MCP98242, MCP98243, MCP9843
|
||||
Prefixes: 'mcp9804', 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
||||
|
@ -48,6 +56,12 @@ Supported chips:
|
|||
Datasheets:
|
||||
http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf
|
||||
http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf
|
||||
* ST Microelectronics STTS2002, STTS3000
|
||||
Prefix: 'stts2002', 'stts3000'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00225278.pdf
|
||||
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00270920.pdf
|
||||
* JEDEC JC 42.4 compliant temperature sensor chips
|
||||
Prefix: 'jc42'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
|
|
|
@ -13,7 +13,8 @@ Detection
|
|||
|
||||
All ALPS touchpads should respond to the "E6 report" command sequence:
|
||||
E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or
|
||||
00-00-64.
|
||||
00-00-64 if no buttons are pressed. The bits 0-2 of the first byte will be 1s
|
||||
if some buttons are pressed.
|
||||
|
||||
If the E6 report is successful, the touchpad model is identified using the "E7
|
||||
report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is
|
||||
|
|
|
@ -962,7 +962,7 @@ F: drivers/tty/serial/msm_serial.c
|
|||
F: drivers/platform/msm/
|
||||
F: drivers/*/pm8???-*
|
||||
F: include/linux/mfd/pm8xxx/
|
||||
T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git
|
||||
S: Maintained
|
||||
|
||||
ARM/TOSA MACHINE SUPPORT
|
||||
|
|
|
@ -1280,7 +1280,7 @@ config ARM_ERRATA_743622
|
|||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 743622 Cortex-A9
|
||||
(r2p0..r2p2) erratum. Under very rare conditions, a faulty
|
||||
(r2p*) erratum. Under very rare conditions, a faulty
|
||||
optimisation in the Cortex-A9 Store Buffer may lead to data
|
||||
corruption. This workaround sets a specific bit in the diagnostic
|
||||
register of the Cortex-A9 which disables the Store Buffer
|
||||
|
|
1
arch/arm/boot/.gitignore
vendored
1
arch/arm/boot/.gitignore
vendored
|
@ -3,3 +3,4 @@ zImage
|
|||
xipImage
|
||||
bootpImage
|
||||
uImage
|
||||
*.dtb
|
||||
|
|
|
@ -134,7 +134,7 @@ int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type);
|
|||
|
||||
u64 armpmu_event_update(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
int idx, int overflow);
|
||||
int idx);
|
||||
|
||||
int armpmu_event_set_period(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
|
|
|
@ -242,6 +242,7 @@ static void ecard_init_pgtables(struct mm_struct *mm)
|
|||
|
||||
memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE));
|
||||
|
||||
vma.vm_flags = VM_EXEC;
|
||||
vma.vm_mm = mm;
|
||||
|
||||
flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE);
|
||||
|
|
|
@ -180,7 +180,7 @@ armpmu_event_set_period(struct perf_event *event,
|
|||
u64
|
||||
armpmu_event_update(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
int idx, int overflow)
|
||||
int idx)
|
||||
{
|
||||
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
||||
u64 delta, prev_raw_count, new_raw_count;
|
||||
|
@ -193,13 +193,7 @@ armpmu_event_update(struct perf_event *event,
|
|||
new_raw_count) != prev_raw_count)
|
||||
goto again;
|
||||
|
||||
new_raw_count &= armpmu->max_period;
|
||||
prev_raw_count &= armpmu->max_period;
|
||||
|
||||
if (overflow)
|
||||
delta = armpmu->max_period - prev_raw_count + new_raw_count + 1;
|
||||
else
|
||||
delta = new_raw_count - prev_raw_count;
|
||||
delta = (new_raw_count - prev_raw_count) & armpmu->max_period;
|
||||
|
||||
local64_add(delta, &event->count);
|
||||
local64_sub(delta, &hwc->period_left);
|
||||
|
@ -216,7 +210,7 @@ armpmu_read(struct perf_event *event)
|
|||
if (hwc->idx < 0)
|
||||
return;
|
||||
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -232,7 +226,7 @@ armpmu_stop(struct perf_event *event, int flags)
|
|||
if (!(hwc->state & PERF_HES_STOPPED)) {
|
||||
armpmu->disable(hwc, hwc->idx);
|
||||
barrier(); /* why? */
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
||||
}
|
||||
}
|
||||
|
@ -518,7 +512,13 @@ __hw_perf_event_init(struct perf_event *event)
|
|||
hwc->config_base |= (unsigned long)mapping;
|
||||
|
||||
if (!hwc->sample_period) {
|
||||
hwc->sample_period = armpmu->max_period;
|
||||
/*
|
||||
* For non-sampling runs, limit the sample_period to half
|
||||
* of the counter width. That way, the new counter value
|
||||
* is far less likely to overtake the previous one unless
|
||||
* you have some serious IRQ latency issues.
|
||||
*/
|
||||
hwc->sample_period = armpmu->max_period >> 1;
|
||||
hwc->last_period = hwc->sample_period;
|
||||
local64_set(&hwc->period_left, hwc->sample_period);
|
||||
}
|
||||
|
@ -679,6 +679,28 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu)
|
|||
armpmu->type = ARM_PMU_DEVICE_CPU;
|
||||
}
|
||||
|
||||
/*
|
||||
* PMU hardware loses all context when a CPU goes offline.
|
||||
* When a CPU is hotplugged back in, since some hardware registers are
|
||||
* UNKNOWN at reset, the PMU must be explicitly reset to avoid reading
|
||||
* junk values out of them.
|
||||
*/
|
||||
static int __cpuinit pmu_cpu_notify(struct notifier_block *b,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (cpu_pmu && cpu_pmu->reset)
|
||||
cpu_pmu->reset(NULL);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata pmu_cpu_notifier = {
|
||||
.notifier_call = pmu_cpu_notify,
|
||||
};
|
||||
|
||||
/*
|
||||
* CPU PMU identification and registration.
|
||||
*/
|
||||
|
@ -730,6 +752,7 @@ init_hw_perf_events(void)
|
|||
pr_info("enabled with %s PMU driver, %d counters available\n",
|
||||
cpu_pmu->name, cpu_pmu->num_events);
|
||||
cpu_pmu_init(cpu_pmu);
|
||||
register_cpu_notifier(&pmu_cpu_notifier);
|
||||
armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW);
|
||||
} else {
|
||||
pr_info("no hardware support available\n");
|
||||
|
|
|
@ -467,23 +467,6 @@ armv6pmu_enable_event(struct hw_perf_event *hwc,
|
|||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||
}
|
||||
|
||||
static int counter_is_active(unsigned long pmcr, int idx)
|
||||
{
|
||||
unsigned long mask = 0;
|
||||
if (idx == ARMV6_CYCLE_COUNTER)
|
||||
mask = ARMV6_PMCR_CCOUNT_IEN;
|
||||
else if (idx == ARMV6_COUNTER0)
|
||||
mask = ARMV6_PMCR_COUNT0_IEN;
|
||||
else if (idx == ARMV6_COUNTER1)
|
||||
mask = ARMV6_PMCR_COUNT1_IEN;
|
||||
|
||||
if (mask)
|
||||
return pmcr & mask;
|
||||
|
||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
armv6pmu_handle_irq(int irq_num,
|
||||
void *dev)
|
||||
|
@ -513,7 +496,8 @@ armv6pmu_handle_irq(int irq_num,
|
|||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!counter_is_active(pmcr, idx))
|
||||
/* Ignore if we don't have an event. */
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
/*
|
||||
|
@ -524,7 +508,7 @@ armv6pmu_handle_irq(int irq_num,
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
|
|
@ -809,6 +809,11 @@ static inline int armv7_pmnc_disable_intens(int idx)
|
|||
|
||||
counter = ARMV7_IDX_TO_COUNTER(idx);
|
||||
asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));
|
||||
isb();
|
||||
/* Clear the overflow flag in case an interrupt is pending. */
|
||||
asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter)));
|
||||
isb();
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
|
@ -955,6 +960,10 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
|||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
/* Ignore if we don't have an event. */
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* We have a single interrupt for all counters. Check that
|
||||
* each counter has overflowed before we process it.
|
||||
|
@ -963,7 +972,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
|
|
@ -255,11 +255,14 @@ xscale1pmu_handle_irq(int irq_num, void *dev)
|
|||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
@ -592,11 +595,14 @@ xscale2pmu_handle_irq(int irq_num, void *dev)
|
|||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx))
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
if (!xscale2_pmnc_counter_has_overflowed(of_flags, idx))
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
@ -663,7 +669,7 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)
|
|||
static void
|
||||
xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||
{
|
||||
unsigned long flags, ien, evtsel;
|
||||
unsigned long flags, ien, evtsel, of_flags;
|
||||
struct pmu_hw_events *events = cpu_pmu->get_hw_events();
|
||||
|
||||
ien = xscale2pmu_read_int_enable();
|
||||
|
@ -672,26 +678,31 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
|||
switch (idx) {
|
||||
case XSCALE_CYCLE_COUNTER:
|
||||
ien &= ~XSCALE2_CCOUNT_INT_EN;
|
||||
of_flags = XSCALE2_CCOUNT_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER0:
|
||||
ien &= ~XSCALE2_COUNT0_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT0_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER1:
|
||||
ien &= ~XSCALE2_COUNT1_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT1_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER2:
|
||||
ien &= ~XSCALE2_COUNT2_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT2_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER3:
|
||||
ien &= ~XSCALE2_COUNT3_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT3_OVERFLOW;
|
||||
break;
|
||||
default:
|
||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
||||
|
@ -701,6 +712,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
|||
raw_spin_lock_irqsave(&events->pmu_lock, flags);
|
||||
xscale2pmu_write_event_select(evtsel);
|
||||
xscale2pmu_write_int_enable(ien);
|
||||
xscale2pmu_write_overflow_flags(of_flags);
|
||||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -38,10 +38,6 @@
|
|||
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
||||
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct at_dma_platform_data atdma_pdata = {
|
||||
.nr_channels = 8,
|
||||
};
|
||||
|
||||
static struct resource hdmac_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9G45_BASE_DMA,
|
||||
|
@ -56,12 +52,11 @@ static struct resource hdmac_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device at_hdmac_device = {
|
||||
.name = "at_hdmac",
|
||||
.name = "at91sam9g45_dma",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &hdmac_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &atdma_pdata,
|
||||
},
|
||||
.resource = hdmac_resources,
|
||||
.num_resources = ARRAY_SIZE(hdmac_resources),
|
||||
|
@ -69,9 +64,15 @@ static struct platform_device at_hdmac_device = {
|
|||
|
||||
void __init at91_add_device_hdmac(void)
|
||||
{
|
||||
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
|
||||
dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask);
|
||||
platform_device_register(&at_hdmac_device);
|
||||
#if defined(CONFIG_OF)
|
||||
struct device_node *of_node =
|
||||
of_find_node_by_name(NULL, "dma-controller");
|
||||
|
||||
if (of_node)
|
||||
of_node_put(of_node);
|
||||
else
|
||||
#endif
|
||||
platform_device_register(&at_hdmac_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_hdmac(void) {}
|
||||
|
|
|
@ -33,10 +33,6 @@
|
|||
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
||||
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct at_dma_platform_data atdma_pdata = {
|
||||
.nr_channels = 2,
|
||||
};
|
||||
|
||||
static struct resource hdmac_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9RL_BASE_DMA,
|
||||
|
@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device at_hdmac_device = {
|
||||
.name = "at_hdmac",
|
||||
.name = "at91sam9rl_dma",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &hdmac_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &atdma_pdata,
|
||||
},
|
||||
.resource = hdmac_resources,
|
||||
.num_resources = ARRAY_SIZE(hdmac_resources),
|
||||
|
@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {
|
|||
|
||||
void __init at91_add_device_hdmac(void)
|
||||
{
|
||||
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
|
||||
platform_device_register(&at_hdmac_device);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <mach/ep93xx_spi.h>
|
||||
#include <mach/gpio-ep93xx.h>
|
||||
|
||||
#include <asm/hardware/vic.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -361,6 +362,7 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = vision_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.handle_irq = vic_handle_irq,
|
||||
.timer = &ep93xx_timer,
|
||||
.init_machine = vision_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/mfd/max8998.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -595,6 +596,7 @@ static struct mxt_platform_data qt602240_platform_data = {
|
|||
.threshold = 0x28,
|
||||
.voltage = 2800000, /* 2.8V */
|
||||
.orient = MXT_DIAGONAL,
|
||||
.irqflags = IRQF_TRIGGER_FALLING,
|
||||
};
|
||||
|
||||
static struct i2c_board_info i2c3_devs[] __initdata = {
|
||||
|
|
|
@ -343,6 +343,7 @@ static void __init omap3_check_revision(const char **cpu_rev)
|
|||
case 0xb944:
|
||||
omap_revision = AM335X_REV_ES1_0;
|
||||
*cpu_rev = "1.0";
|
||||
break;
|
||||
case 0xb8f2:
|
||||
switch (rev) {
|
||||
case 0:
|
||||
|
|
|
@ -420,8 +420,7 @@ static void __exit omap2_mbox_exit(void)
|
|||
platform_driver_unregister(&omap2_mbox_driver);
|
||||
}
|
||||
|
||||
/* must be ready before omap3isp is probed */
|
||||
subsys_initcall(omap2_mbox_init);
|
||||
module_init(omap2_mbox_init);
|
||||
module_exit(omap2_mbox_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -150,7 +150,8 @@ static int __init omap_iommu_init(void)
|
|||
platform_device_put(omap_iommu_pdev[i]);
|
||||
return err;
|
||||
}
|
||||
module_init(omap_iommu_init);
|
||||
/* must be ready before omap3isp is probed */
|
||||
subsys_initcall(omap_iommu_init);
|
||||
|
||||
static void __exit omap_iommu_exit(void)
|
||||
{
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "omap4-sar-layout.h"
|
||||
#include <linux/export.h>
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
static void __iomem *l2cache_base;
|
||||
|
@ -55,6 +56,7 @@ void omap_bus_sync(void)
|
|||
isb();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(omap_bus_sync);
|
||||
|
||||
/* Steal one page physical memory for barrier implementation */
|
||||
int __init omap_barrier_reserve_memblock(void)
|
||||
|
|
|
@ -270,7 +270,6 @@ static struct regulator_init_data omap4_vusb_idata = {
|
|||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
|
|
|
@ -49,7 +49,6 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);
|
|||
#endif
|
||||
|
||||
extern struct syscore_ops pxa_irq_syscore_ops;
|
||||
extern struct syscore_ops pxa_gpio_syscore_ops;
|
||||
extern struct syscore_ops pxa2xx_mfp_syscore_ops;
|
||||
extern struct syscore_ops pxa3xx_mfp_syscore_ops;
|
||||
|
||||
|
|
|
@ -226,6 +226,12 @@ static void __init pxa25x_mfp_init(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
/* running before pxa_gpio_probe() */
|
||||
#ifdef CONFIG_CPU_PXA26x
|
||||
pxa_last_gpio = 89;
|
||||
#else
|
||||
pxa_last_gpio = 84;
|
||||
#endif
|
||||
for (i = 0; i <= pxa_last_gpio; i++)
|
||||
gpio_desc[i].valid = 1;
|
||||
|
||||
|
@ -295,6 +301,7 @@ static void __init pxa27x_mfp_init(void)
|
|||
{
|
||||
int i, gpio;
|
||||
|
||||
pxa_last_gpio = 120; /* running before pxa_gpio_probe() */
|
||||
for (i = 0; i <= pxa_last_gpio; i++) {
|
||||
/* skip GPIO2, 5, 6, 7, 8, they are not
|
||||
* valid pins allow configuration
|
||||
|
|
|
@ -208,6 +208,7 @@ static struct clk_lookup pxa25x_clkregs[] = {
|
|||
INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"),
|
||||
INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"),
|
||||
INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL),
|
||||
INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL),
|
||||
};
|
||||
|
||||
static struct clk_lookup pxa25x_hwuart_clkreg =
|
||||
|
@ -367,7 +368,6 @@ static int __init pxa25x_init(void)
|
|||
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(pxa25x_devices,
|
||||
|
|
|
@ -229,6 +229,7 @@ static struct clk_lookup pxa27x_clkregs[] = {
|
|||
INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"),
|
||||
INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"),
|
||||
INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL),
|
||||
INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -455,7 +456,6 @@ static int __init pxa27x_init(void)
|
|||
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
|
|
@ -462,7 +462,6 @@ static int __init pxa3xx_init(void)
|
|||
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
|
|
@ -283,7 +283,6 @@ static int __init pxa95x_init(void)
|
|||
return ret;
|
||||
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
|
|
@ -12,6 +12,6 @@
|
|||
#ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H
|
||||
#define __ARCH_ARM_MACH_S3C2440_COMMON_H
|
||||
|
||||
void s3c2440_restart(char mode, const char *cmd);
|
||||
void s3c244x_restart(char mode, const char *cmd);
|
||||
|
||||
#endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */
|
||||
|
|
|
@ -487,5 +487,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")
|
|||
.init_machine = anubis_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -222,5 +222,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB")
|
|||
.init_machine = at2440evb_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -601,5 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02")
|
|||
.init_irq = s3c24xx_init_irq,
|
||||
.init_machine = gta02_machine_init,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -701,5 +701,5 @@ MACHINE_START(MINI2440, "MINI2440")
|
|||
.init_machine = mini2440_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -158,5 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")
|
|||
.init_machine = nexcoder_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -436,5 +436,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")
|
|||
.init_irq = s3c24xx_init_irq,
|
||||
.init_machine = osiris_init,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -822,5 +822,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950")
|
|||
.init_irq = s3c24xx_init_irq,
|
||||
.init_machine = rx1950_init_machine,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -213,5 +213,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715")
|
|||
.init_irq = rx3715_init_irq,
|
||||
.init_machine = rx3715_init_machine,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -183,5 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440")
|
|||
.map_io = smdk2440_map_io,
|
||||
.init_machine = smdk2440_machine_init,
|
||||
.timer = &s3c24xx_timer,
|
||||
.restart = s3c2440_restart,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <plat/cpu.h>
|
||||
#include <plat/s3c244x.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/watchdog-reset.h>
|
||||
|
||||
#include <plat/gpio-core.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
|
@ -74,15 +73,3 @@ void __init s3c2440_map_io(void)
|
|||
s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;
|
||||
s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;
|
||||
}
|
||||
|
||||
void s3c2440_restart(char mode, const char *cmd)
|
||||
{
|
||||
if (mode == 's') {
|
||||
soft_restart(0);
|
||||
}
|
||||
|
||||
arch_wdt_reset();
|
||||
|
||||
/* we'll take a jump through zero as a poor second */
|
||||
soft_restart(0);
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#include <plat/pm.h>
|
||||
#include <plat/pll.h>
|
||||
#include <plat/nand-core.h>
|
||||
#include <plat/watchdog-reset.h>
|
||||
|
||||
static struct map_desc s3c244x_iodesc[] __initdata = {
|
||||
IODESC_ENT(CLKPWR),
|
||||
|
@ -196,3 +197,14 @@ struct syscore_ops s3c244x_pm_syscore_ops = {
|
|||
.suspend = s3c244x_suspend,
|
||||
.resume = s3c244x_resume,
|
||||
};
|
||||
|
||||
void s3c244x_restart(char mode, const char *cmd)
|
||||
{
|
||||
if (mode == 's')
|
||||
soft_restart(0);
|
||||
|
||||
arch_wdt_reset();
|
||||
|
||||
/* we'll take a jump through zero as a poor second */
|
||||
soft_restart(0);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ config UX500_SOC_COMMON
|
|||
default y
|
||||
select ARM_GIC
|
||||
select HAS_MTU
|
||||
select ARM_ERRATA_753970
|
||||
select PL310_ERRATA_753970
|
||||
select ARM_ERRATA_754322
|
||||
select ARM_ERRATA_764369
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ config ARCH_VEXPRESS_CA9X4
|
|||
select ARM_GIC
|
||||
select ARM_ERRATA_720789
|
||||
select ARM_ERRATA_751472
|
||||
select ARM_ERRATA_753970
|
||||
select PL310_ERRATA_753970
|
||||
select HAVE_SMP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
|
||||
|
|
|
@ -230,9 +230,7 @@ __v7_setup:
|
|||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
#endif
|
||||
#ifdef CONFIG_ARM_ERRATA_743622
|
||||
teq r6, #0x20 @ present in r2p0
|
||||
teqne r6, #0x21 @ present in r2p1
|
||||
teqne r6, #0x22 @ present in r2p2
|
||||
teq r5, #0x00200000 @ only present in r2p*
|
||||
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||
orreq r10, r10, #1 << 6 @ set bit #6
|
||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
|
|
|
@ -428,8 +428,16 @@
|
|||
#define OMAP_GPMC_NR_IRQS 8
|
||||
#define OMAP_GPMC_IRQ_END (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS)
|
||||
|
||||
/* PRCM IRQ handler */
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
#define OMAP_PRCM_IRQ_BASE (OMAP_GPMC_IRQ_END)
|
||||
#define OMAP_PRCM_NR_IRQS 64
|
||||
#define OMAP_PRCM_IRQ_END (OMAP_PRCM_IRQ_BASE + OMAP_PRCM_NR_IRQS)
|
||||
#else
|
||||
#define OMAP_PRCM_IRQ_END OMAP_GPMC_IRQ_END
|
||||
#endif
|
||||
|
||||
#define NR_IRQS OMAP_GPMC_IRQ_END
|
||||
#define NR_IRQS OMAP_PRCM_IRQ_END
|
||||
|
||||
#define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32))
|
||||
|
||||
|
|
|
@ -1249,7 +1249,7 @@ static void s3c2410_dma_resume(void)
|
|||
struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
|
||||
int channel;
|
||||
|
||||
for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
|
||||
for (channel = dma_channels - 1; channel >= 0; cp--, channel--)
|
||||
s3c2410_dma_resume_chan(cp);
|
||||
}
|
||||
|
||||
|
|
|
@ -1409,7 +1409,7 @@ void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd)
|
|||
|
||||
#ifdef CONFIG_S3C_DEV_USB_HSOTG
|
||||
static struct resource s3c_usb_hsotg_resources[] = {
|
||||
[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_16K),
|
||||
[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),
|
||||
[1] = DEFINE_RES_IRQ(IRQ_OTG),
|
||||
};
|
||||
|
||||
|
|
|
@ -145,11 +145,13 @@ static void clockevent_set_mode(enum clock_event_mode mode,
|
|||
static int clockevent_next_event(unsigned long cycles,
|
||||
struct clock_event_device *clk_event_dev)
|
||||
{
|
||||
u16 val;
|
||||
u16 val = readw(gpt_base + CR(CLKEVT));
|
||||
|
||||
if (val & CTRL_ENABLE)
|
||||
writew(val & ~CTRL_ENABLE, gpt_base + CR(CLKEVT));
|
||||
|
||||
writew(cycles, gpt_base + LOAD(CLKEVT));
|
||||
|
||||
val = readw(gpt_base + CR(CLKEVT));
|
||||
val |= CTRL_ENABLE | CTRL_INT_ENABLE;
|
||||
writew(val, gpt_base + CR(CLKEVT));
|
||||
|
||||
|
|
|
@ -122,8 +122,8 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
|||
|
||||
extern unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
#define KSTK_EIP(tsk) (task_pt_regs(task)->pc)
|
||||
#define KSTK_ESP(tsk) (task_pt_regs(task)->sp)
|
||||
#define KSTK_EIP(task) (task_pt_regs(task)->pc)
|
||||
#define KSTK_ESP(task) (task_pt_regs(task)->sp)
|
||||
|
||||
#define cpu_relax() do { } while (0)
|
||||
|
||||
|
|
|
@ -48,9 +48,9 @@ static void delay_loop(unsigned long loops)
|
|||
}
|
||||
|
||||
/* TSC based delay: */
|
||||
static void delay_tsc(unsigned long loops)
|
||||
static void delay_tsc(unsigned long __loops)
|
||||
{
|
||||
unsigned long bclock, now;
|
||||
u32 bclock, now, loops = __loops;
|
||||
int cpu;
|
||||
|
||||
preempt_disable();
|
||||
|
|
|
@ -333,13 +333,15 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
|
|||
* Lookup failure means no vma is above this address,
|
||||
* i.e. return with success:
|
||||
*/
|
||||
if (!(vma = find_vma_prev(mm, addr, &prev_vma)))
|
||||
vma = find_vma(mm, addr);
|
||||
if (!vma)
|
||||
return addr;
|
||||
|
||||
/*
|
||||
* new region fits between prev_vma->vm_end and
|
||||
* vma->vm_start, use it:
|
||||
*/
|
||||
prev_vma = vma->vm_prev;
|
||||
if (addr + len <= vma->vm_start &&
|
||||
(!prev_vma || (addr >= prev_vma->vm_end))) {
|
||||
/* remember the address as a hint for next time */
|
||||
|
|
|
@ -2362,6 +2362,9 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev,
|
|||
uint64_t addr = semaphore->gpu_addr;
|
||||
unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
|
||||
|
||||
if (rdev->family < CHIP_CAYMAN)
|
||||
sel |= PACKET3_SEM_WAIT_ON_SIGNAL;
|
||||
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
|
||||
radeon_ring_write(ring, addr & 0xffffffff);
|
||||
radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel);
|
||||
|
|
|
@ -313,6 +313,10 @@ const u32 r6xx_default_state[] =
|
|||
0x00000000, /* VGT_REUSE_OFF */
|
||||
0x00000000, /* VGT_VTX_CNT_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000000d4,
|
||||
0x00000000, /* SX_MISC */
|
||||
|
||||
0xc0016900,
|
||||
0x000002c8,
|
||||
0x00000000, /* VGT_STRMOUT_BUFFER_EN */
|
||||
|
@ -625,6 +629,10 @@ const u32 r7xx_default_state[] =
|
|||
0x00000000, /* VGT_REUSE_OFF */
|
||||
0x00000000, /* VGT_VTX_CNT_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000000d4,
|
||||
0x00000000, /* SX_MISC */
|
||||
|
||||
0xc0016900,
|
||||
0x000002c8,
|
||||
0x00000000, /* VGT_STRMOUT_BUFFER_EN */
|
||||
|
|
|
@ -831,6 +831,7 @@
|
|||
#define PACKET3_STRMOUT_BUFFER_UPDATE 0x34
|
||||
#define PACKET3_INDIRECT_BUFFER_MP 0x38
|
||||
#define PACKET3_MEM_SEMAPHORE 0x39
|
||||
# define PACKET3_SEM_WAIT_ON_SIGNAL (0x1 << 12)
|
||||
# define PACKET3_SEM_SEL_SIGNAL (0x6 << 29)
|
||||
# define PACKET3_SEM_SEL_WAIT (0x7 << 29)
|
||||
#define PACKET3_MPEG_INDEX 0x3A
|
||||
|
|
|
@ -1057,7 +1057,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
|
|||
(radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
|
||||
return MODE_OK;
|
||||
else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
|
||||
if (ASIC_IS_DCE3(rdev)) {
|
||||
if (0) {
|
||||
/* HDMI 1.3+ supports max clock of 340 Mhz */
|
||||
if (mode->clock > 340000)
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
|
|
@ -1078,15 +1078,21 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
|
|||
.create_handle = radeon_user_framebuffer_create_handle,
|
||||
};
|
||||
|
||||
void
|
||||
int
|
||||
radeon_framebuffer_init(struct drm_device *dev,
|
||||
struct radeon_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
rfb->obj = obj;
|
||||
drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
|
||||
ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
|
||||
if (ret) {
|
||||
rfb->obj = NULL;
|
||||
return ret;
|
||||
}
|
||||
drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct drm_framebuffer *
|
||||
|
@ -1096,6 +1102,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
|||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct radeon_framebuffer *radeon_fb;
|
||||
int ret;
|
||||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
|
||||
if (obj == NULL) {
|
||||
|
@ -1108,7 +1115,12 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
|||
if (radeon_fb == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj);
|
||||
ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj);
|
||||
if (ret) {
|
||||
kfree(radeon_fb);
|
||||
drm_gem_object_unreference_unlocked(obj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &radeon_fb->base;
|
||||
}
|
||||
|
|
|
@ -307,8 +307,6 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder,
|
|||
bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
||||
u32 pixel_clock)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
struct radeon_connector *radeon_connector;
|
||||
struct radeon_connector_atom_dig *dig_connector;
|
||||
|
@ -326,7 +324,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
|||
case DRM_MODE_CONNECTOR_HDMIB:
|
||||
if (radeon_connector->use_digital) {
|
||||
/* HDMI 1.3 supports up to 340 Mhz over single link */
|
||||
if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (pixel_clock > 340000)
|
||||
return true;
|
||||
else
|
||||
|
@ -348,7 +346,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
|||
return false;
|
||||
else {
|
||||
/* HDMI 1.3 supports up to 340 Mhz over single link */
|
||||
if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (pixel_clock > 340000)
|
||||
return true;
|
||||
else
|
||||
|
|
|
@ -209,6 +209,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
|
|||
sizes->surface_depth);
|
||||
|
||||
ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to create fbcon object %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
rbo = gem_to_radeon_bo(gobj);
|
||||
|
||||
/* okay we have an object now allocate the framebuffer */
|
||||
|
@ -220,7 +225,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
|
|||
|
||||
info->par = rfbdev;
|
||||
|
||||
radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj);
|
||||
ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to initalise framebuffer %d\n", ret);
|
||||
goto out_unref;
|
||||
}
|
||||
|
||||
fb = &rfbdev->rfb.base;
|
||||
|
||||
|
|
|
@ -649,7 +649,7 @@ extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
|||
u16 blue, int regno);
|
||||
extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno);
|
||||
void radeon_framebuffer_init(struct drm_device *dev,
|
||||
int radeon_framebuffer_init(struct drm_device *dev,
|
||||
struct radeon_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
|
|
@ -497,8 +497,9 @@ config SENSORS_JC42
|
|||
If you say yes here, you get support for JEDEC JC42.4 compliant
|
||||
temperature sensors, which are used on many DDR3 memory modules for
|
||||
mobile devices and servers. Support will include, but not be limited
|
||||
to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243,
|
||||
MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3.
|
||||
to, ADT7408, AT30TS00, CAT34TS02, CAT6095, MAX6604, MCP9804, MCP9805,
|
||||
MCP98242, MCP98243, MCP9843, SE97, SE98, STTS424(E), STTS2002,
|
||||
STTS3000, TSE2002B3, TSE2002GB2, TS3000B3, and TS3000GB2.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called jc42.
|
||||
|
|
|
@ -64,6 +64,7 @@ static const unsigned short normal_i2c[] = {
|
|||
|
||||
/* Manufacturer IDs */
|
||||
#define ADT_MANID 0x11d4 /* Analog Devices */
|
||||
#define ATMEL_MANID 0x001f /* Atmel */
|
||||
#define MAX_MANID 0x004d /* Maxim */
|
||||
#define IDT_MANID 0x00b3 /* IDT */
|
||||
#define MCP_MANID 0x0054 /* Microchip */
|
||||
|
@ -77,15 +78,25 @@ static const unsigned short normal_i2c[] = {
|
|||
#define ADT7408_DEVID 0x0801
|
||||
#define ADT7408_DEVID_MASK 0xffff
|
||||
|
||||
/* Atmel */
|
||||
#define AT30TS00_DEVID 0x8201
|
||||
#define AT30TS00_DEVID_MASK 0xffff
|
||||
|
||||
/* IDT */
|
||||
#define TS3000B3_DEVID 0x2903 /* Also matches TSE2002B3 */
|
||||
#define TS3000B3_DEVID_MASK 0xffff
|
||||
|
||||
#define TS3000GB2_DEVID 0x2912 /* Also matches TSE2002GB2 */
|
||||
#define TS3000GB2_DEVID_MASK 0xffff
|
||||
|
||||
/* Maxim */
|
||||
#define MAX6604_DEVID 0x3e00
|
||||
#define MAX6604_DEVID_MASK 0xffff
|
||||
|
||||
/* Microchip */
|
||||
#define MCP9804_DEVID 0x0200
|
||||
#define MCP9804_DEVID_MASK 0xfffc
|
||||
|
||||
#define MCP98242_DEVID 0x2000
|
||||
#define MCP98242_DEVID_MASK 0xfffc
|
||||
|
||||
|
@ -113,6 +124,12 @@ static const unsigned short normal_i2c[] = {
|
|||
#define STTS424E_DEVID 0x0000
|
||||
#define STTS424E_DEVID_MASK 0xfffe
|
||||
|
||||
#define STTS2002_DEVID 0x0300
|
||||
#define STTS2002_DEVID_MASK 0xffff
|
||||
|
||||
#define STTS3000_DEVID 0x0200
|
||||
#define STTS3000_DEVID_MASK 0xffff
|
||||
|
||||
static u16 jc42_hysteresis[] = { 0, 1500, 3000, 6000 };
|
||||
|
||||
struct jc42_chips {
|
||||
|
@ -123,8 +140,11 @@ struct jc42_chips {
|
|||
|
||||
static struct jc42_chips jc42_chips[] = {
|
||||
{ ADT_MANID, ADT7408_DEVID, ADT7408_DEVID_MASK },
|
||||
{ ATMEL_MANID, AT30TS00_DEVID, AT30TS00_DEVID_MASK },
|
||||
{ IDT_MANID, TS3000B3_DEVID, TS3000B3_DEVID_MASK },
|
||||
{ IDT_MANID, TS3000GB2_DEVID, TS3000GB2_DEVID_MASK },
|
||||
{ MAX_MANID, MAX6604_DEVID, MAX6604_DEVID_MASK },
|
||||
{ MCP_MANID, MCP9804_DEVID, MCP9804_DEVID_MASK },
|
||||
{ MCP_MANID, MCP98242_DEVID, MCP98242_DEVID_MASK },
|
||||
{ MCP_MANID, MCP98243_DEVID, MCP98243_DEVID_MASK },
|
||||
{ MCP_MANID, MCP9843_DEVID, MCP9843_DEVID_MASK },
|
||||
|
@ -133,6 +153,8 @@ static struct jc42_chips jc42_chips[] = {
|
|||
{ NXP_MANID, SE98_DEVID, SE98_DEVID_MASK },
|
||||
{ STM_MANID, STTS424_DEVID, STTS424_DEVID_MASK },
|
||||
{ STM_MANID, STTS424E_DEVID, STTS424E_DEVID_MASK },
|
||||
{ STM_MANID, STTS2002_DEVID, STTS2002_DEVID_MASK },
|
||||
{ STM_MANID, STTS3000_DEVID, STTS3000_DEVID_MASK },
|
||||
};
|
||||
|
||||
/* Each client has this additional data */
|
||||
|
@ -159,10 +181,12 @@ static struct jc42_data *jc42_update_device(struct device *dev);
|
|||
|
||||
static const struct i2c_device_id jc42_id[] = {
|
||||
{ "adt7408", 0 },
|
||||
{ "at30ts00", 0 },
|
||||
{ "cat94ts02", 0 },
|
||||
{ "cat6095", 0 },
|
||||
{ "jc42", 0 },
|
||||
{ "max6604", 0 },
|
||||
{ "mcp9804", 0 },
|
||||
{ "mcp9805", 0 },
|
||||
{ "mcp98242", 0 },
|
||||
{ "mcp98243", 0 },
|
||||
|
@ -171,8 +195,10 @@ static const struct i2c_device_id jc42_id[] = {
|
|||
{ "se97b", 0 },
|
||||
{ "se98", 0 },
|
||||
{ "stts424", 0 },
|
||||
{ "tse2002b3", 0 },
|
||||
{ "ts3000b3", 0 },
|
||||
{ "stts2002", 0 },
|
||||
{ "stts3000", 0 },
|
||||
{ "tse2002", 0 },
|
||||
{ "ts3000", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, jc42_id);
|
||||
|
|
|
@ -54,7 +54,8 @@
|
|||
lcrit_alarm, crit_alarm */
|
||||
#define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm,
|
||||
crit_alarm */
|
||||
#define PMBUS_POUT_BOOLEANS_PER_PAGE 2 /* alarm, crit_alarm */
|
||||
#define PMBUS_POUT_BOOLEANS_PER_PAGE 3 /* cap_alarm, alarm, crit_alarm
|
||||
*/
|
||||
#define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */
|
||||
#define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm,
|
||||
lcrit_alarm, crit_alarm */
|
||||
|
|
|
@ -33,6 +33,7 @@ enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105 };
|
|||
struct zl6100_data {
|
||||
int id;
|
||||
ktime_t access; /* chip access time */
|
||||
int delay; /* Delay between chip accesses in uS */
|
||||
struct pmbus_driver_info info;
|
||||
};
|
||||
|
||||
|
@ -52,10 +53,10 @@ MODULE_PARM_DESC(delay, "Delay between chip accesses in uS");
|
|||
/* Some chips need a delay between accesses */
|
||||
static inline void zl6100_wait(const struct zl6100_data *data)
|
||||
{
|
||||
if (delay) {
|
||||
if (data->delay) {
|
||||
s64 delta = ktime_us_delta(ktime_get(), data->access);
|
||||
if (delta < delay)
|
||||
udelay(delay - delta);
|
||||
if (delta < data->delay)
|
||||
udelay(data->delay - delta);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,8 +208,9 @@ static int zl6100_probe(struct i2c_client *client,
|
|||
* can be cleared later for additional chips if tests show that it
|
||||
* is not needed (in other words, better be safe than sorry).
|
||||
*/
|
||||
data->delay = delay;
|
||||
if (data->id == zl2004 || data->id == zl6105)
|
||||
delay = 0;
|
||||
data->delay = 0;
|
||||
|
||||
/*
|
||||
* Since there was a direct I2C device access above, wait before
|
||||
|
|
|
@ -332,7 +332,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,
|
|||
struct evdev_client *client = file->private_data;
|
||||
struct evdev *evdev = client->evdev;
|
||||
struct input_event event;
|
||||
int retval;
|
||||
int retval = 0;
|
||||
|
||||
if (count < input_event_size())
|
||||
return -EINVAL;
|
||||
|
|
|
@ -172,7 +172,7 @@ static void twl4030_vibra_close(struct input_dev *input)
|
|||
}
|
||||
|
||||
/*** Module ***/
|
||||
#if CONFIG_PM
|
||||
#if CONFIG_PM_SLEEP
|
||||
static int twl4030_vibra_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
@ -189,10 +189,10 @@ static int twl4030_vibra_resume(struct device *dev)
|
|||
vibra_disable_leds();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops,
|
||||
twl4030_vibra_suspend, twl4030_vibra_resume);
|
||||
#endif
|
||||
|
||||
static int __devinit twl4030_vibra_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -273,9 +273,7 @@ static struct platform_driver twl4030_vibra_driver = {
|
|||
.driver = {
|
||||
.name = "twl4030-vibra",
|
||||
.owner = THIS_MODULE,
|
||||
#ifdef CONFIG_PM
|
||||
.pm = &twl4030_vibra_pm_ops,
|
||||
#endif
|
||||
},
|
||||
};
|
||||
module_platform_driver(twl4030_vibra_driver);
|
||||
|
|
|
@ -952,7 +952,9 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
|
|||
|
||||
/*
|
||||
* First try "E6 report".
|
||||
* ALPS should return 0,0,10 or 0,0,100
|
||||
* ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
|
||||
* The bits 0-2 of the first byte will be 1s if some buttons are
|
||||
* pressed.
|
||||
*/
|
||||
param[0] = 0;
|
||||
if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
|
||||
|
@ -968,7 +970,8 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
|
|||
psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
|
||||
param[0], param[1], param[2]);
|
||||
|
||||
if (param[0] != 0 || param[1] != 0 || (param[2] != 10 && param[2] != 100))
|
||||
if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
|
||||
(param[2] != 10 && param[2] != 100))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
|
|
|
@ -77,6 +77,8 @@ config TABLET_USB_WACOM
|
|||
tristate "Wacom Intuos/Graphire tablet support (USB)"
|
||||
depends on USB_ARCH_HAS_HCD
|
||||
select USB
|
||||
select NEW_LEDS
|
||||
select LEDS_CLASS
|
||||
help
|
||||
Say Y here if you want to use the USB version of the Wacom Intuos
|
||||
or Graphire tablet. Make sure to say Y to "Mouse support"
|
||||
|
|
|
@ -926,7 +926,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
|
|||
{
|
||||
struct input_dev *input = wacom->input;
|
||||
unsigned char *data = wacom->data;
|
||||
int count = data[1] & 0x03;
|
||||
int count = data[1] & 0x07;
|
||||
int i;
|
||||
|
||||
if (data[0] != 0x02)
|
||||
|
|
|
@ -275,7 +275,7 @@ static void iommu_set_exclusion_range(struct amd_iommu *iommu)
|
|||
}
|
||||
|
||||
/* Programs the physical address of the device table into the IOMMU hardware */
|
||||
static void __init iommu_set_device_table(struct amd_iommu *iommu)
|
||||
static void iommu_set_device_table(struct amd_iommu *iommu)
|
||||
{
|
||||
u64 entry;
|
||||
|
||||
|
|
|
@ -323,7 +323,7 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio,
|
|||
* Corrupt successful READs while in down state.
|
||||
* If flags were specified, only corrupt those that match.
|
||||
*/
|
||||
if (!error && bio_submitted_while_down &&
|
||||
if (fc->corrupt_bio_byte && !error && bio_submitted_while_down &&
|
||||
(bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) &&
|
||||
all_corrupt_bio_flags_match(bio, fc))
|
||||
corrupt_bio_data(bio, fc);
|
||||
|
|
|
@ -296,6 +296,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
|||
unsigned offset;
|
||||
unsigned num_bvecs;
|
||||
sector_t remaining = where->count;
|
||||
struct request_queue *q = bdev_get_queue(where->bdev);
|
||||
sector_t discard_sectors;
|
||||
|
||||
/*
|
||||
* where->count may be zero if rw holds a flush and we need to
|
||||
|
@ -305,9 +307,12 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
|||
/*
|
||||
* Allocate a suitably sized-bio.
|
||||
*/
|
||||
num_bvecs = dm_sector_div_up(remaining,
|
||||
(PAGE_SIZE >> SECTOR_SHIFT));
|
||||
num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), num_bvecs);
|
||||
if (rw & REQ_DISCARD)
|
||||
num_bvecs = 1;
|
||||
else
|
||||
num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev),
|
||||
dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT)));
|
||||
|
||||
bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);
|
||||
bio->bi_sector = where->sector + (where->count - remaining);
|
||||
bio->bi_bdev = where->bdev;
|
||||
|
@ -315,10 +320,14 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
|||
bio->bi_destructor = dm_bio_destructor;
|
||||
store_io_and_region_in_bio(bio, io, region);
|
||||
|
||||
/*
|
||||
* Try and add as many pages as possible.
|
||||
*/
|
||||
while (remaining) {
|
||||
if (rw & REQ_DISCARD) {
|
||||
discard_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining);
|
||||
bio->bi_size = discard_sectors << SECTOR_SHIFT;
|
||||
remaining -= discard_sectors;
|
||||
} else while (remaining) {
|
||||
/*
|
||||
* Try and add as many pages as possible.
|
||||
*/
|
||||
dp->get_page(dp, &page, &len, &offset);
|
||||
len = min(len, to_bytes(remaining));
|
||||
if (!bio_add_page(bio, page, len, offset))
|
||||
|
|
|
@ -1437,7 +1437,7 @@ static int target_message(struct dm_ioctl *param, size_t param_size)
|
|||
|
||||
if (!argc) {
|
||||
DMWARN("Empty message received.");
|
||||
goto out;
|
||||
goto out_argv;
|
||||
}
|
||||
|
||||
table = dm_get_live_table(md);
|
||||
|
|
|
@ -668,7 +668,14 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev)
|
|||
return ret;
|
||||
|
||||
sb = page_address(rdev->sb_page);
|
||||
if (sb->magic != cpu_to_le32(DM_RAID_MAGIC)) {
|
||||
|
||||
/*
|
||||
* Two cases that we want to write new superblocks and rebuild:
|
||||
* 1) New device (no matching magic number)
|
||||
* 2) Device specified for rebuild (!In_sync w/ offset == 0)
|
||||
*/
|
||||
if ((sb->magic != cpu_to_le32(DM_RAID_MAGIC)) ||
|
||||
(!test_bit(In_sync, &rdev->flags) && !rdev->recovery_offset)) {
|
||||
super_sync(rdev->mddev, rdev);
|
||||
|
||||
set_bit(FirstUse, &rdev->flags);
|
||||
|
@ -745,11 +752,8 @@ static int super_init_validation(struct mddev *mddev, struct md_rdev *rdev)
|
|||
*/
|
||||
rdev_for_each(r, t, mddev) {
|
||||
if (!test_bit(In_sync, &r->flags)) {
|
||||
if (!test_bit(FirstUse, &r->flags))
|
||||
DMERR("Superblock area of "
|
||||
"rebuild device %d should have been "
|
||||
"cleared.", r->raid_disk);
|
||||
set_bit(FirstUse, &r->flags);
|
||||
DMINFO("Device %d specified for rebuild: "
|
||||
"Clearing superblock", r->raid_disk);
|
||||
rebuilds++;
|
||||
} else if (test_bit(FirstUse, &r->flags))
|
||||
new_devs++;
|
||||
|
@ -971,6 +975,7 @@ static int raid_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|||
|
||||
INIT_WORK(&rs->md.event_work, do_table_event);
|
||||
ti->private = rs;
|
||||
ti->num_flush_requests = 1;
|
||||
|
||||
mutex_lock(&rs->md.reconfig_mutex);
|
||||
ret = md_run(&rs->md);
|
||||
|
|
|
@ -385,6 +385,7 @@ static int init_pmd(struct dm_pool_metadata *pmd,
|
|||
data_sm = dm_sm_disk_create(tm, nr_blocks);
|
||||
if (IS_ERR(data_sm)) {
|
||||
DMERR("sm_disk_create failed");
|
||||
dm_tm_unlock(tm, sblock);
|
||||
r = PTR_ERR(data_sm);
|
||||
goto bad;
|
||||
}
|
||||
|
@ -789,6 +790,11 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* __open_device: Returns @td corresponding to device with id @dev,
|
||||
* creating it if @create is set and incrementing @td->open_count.
|
||||
* On failure, @td is undefined.
|
||||
*/
|
||||
static int __open_device(struct dm_pool_metadata *pmd,
|
||||
dm_thin_id dev, int create,
|
||||
struct dm_thin_device **td)
|
||||
|
@ -799,10 +805,16 @@ static int __open_device(struct dm_pool_metadata *pmd,
|
|||
struct disk_device_details details_le;
|
||||
|
||||
/*
|
||||
* Check the device isn't already open.
|
||||
* If the device is already open, return it.
|
||||
*/
|
||||
list_for_each_entry(td2, &pmd->thin_devices, list)
|
||||
if (td2->id == dev) {
|
||||
/*
|
||||
* May not create an already-open device.
|
||||
*/
|
||||
if (create)
|
||||
return -EEXIST;
|
||||
|
||||
td2->open_count++;
|
||||
*td = td2;
|
||||
return 0;
|
||||
|
@ -817,6 +829,9 @@ static int __open_device(struct dm_pool_metadata *pmd,
|
|||
if (r != -ENODATA || !create)
|
||||
return r;
|
||||
|
||||
/*
|
||||
* Create new device.
|
||||
*/
|
||||
changed = 1;
|
||||
details_le.mapped_blocks = 0;
|
||||
details_le.transaction_id = cpu_to_le64(pmd->trans_id);
|
||||
|
@ -882,12 +897,10 @@ static int __create_thin(struct dm_pool_metadata *pmd,
|
|||
|
||||
r = __open_device(pmd, dev, 1, &td);
|
||||
if (r) {
|
||||
__close_device(td);
|
||||
dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root);
|
||||
dm_btree_del(&pmd->bl_info, dev_root);
|
||||
return r;
|
||||
}
|
||||
td->changed = 1;
|
||||
__close_device(td);
|
||||
|
||||
return r;
|
||||
|
@ -967,14 +980,14 @@ static int __create_snap(struct dm_pool_metadata *pmd,
|
|||
goto bad;
|
||||
|
||||
r = __set_snapshot_details(pmd, td, origin, pmd->time);
|
||||
__close_device(td);
|
||||
|
||||
if (r)
|
||||
goto bad;
|
||||
|
||||
__close_device(td);
|
||||
return 0;
|
||||
|
||||
bad:
|
||||
__close_device(td);
|
||||
dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root);
|
||||
dm_btree_remove(&pmd->details_info, pmd->details_root,
|
||||
&key, &pmd->details_root);
|
||||
|
@ -1211,6 +1224,8 @@ static int __remove(struct dm_thin_device *td, dm_block_t block)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
td->mapped_blocks--;
|
||||
td->changed = 1;
|
||||
pmd->need_commit = 1;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1031,7 +1031,7 @@ static void cfhsi_setup(struct net_device *dev)
|
|||
dev->netdev_ops = &cfhsi_ops;
|
||||
dev->type = ARPHRD_CAIF;
|
||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
|
||||
dev->mtu = CFHSI_MAX_PAYLOAD_SZ;
|
||||
dev->mtu = CFHSI_MAX_CAIF_FRAME_SZ;
|
||||
dev->tx_queue_len = 0;
|
||||
dev->destructor = free_netdev;
|
||||
skb_queue_head_init(&cfhsi->qhead);
|
||||
|
|
|
@ -1711,7 +1711,7 @@ static irqreturn_t atl1c_intr(int irq, void *data)
|
|||
"atl1c hardware error (status = 0x%x)\n",
|
||||
status & ISR_ERROR);
|
||||
/* reset MAC */
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_RESET;
|
||||
set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event);
|
||||
schedule_work(&adapter->common_task);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -5595,7 +5595,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
|
|||
}
|
||||
}
|
||||
|
||||
netdev_completed_queue(tp->dev, pkts_compl, bytes_compl);
|
||||
netdev_tx_completed_queue(txq, pkts_compl, bytes_compl);
|
||||
|
||||
tnapi->tx_cons = sw_idx;
|
||||
|
||||
|
@ -6971,7 +6971,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
netdev_sent_queue(tp->dev, skb->len);
|
||||
netdev_tx_sent_queue(txq, skb->len);
|
||||
|
||||
/* Sync BD data before updating mailbox */
|
||||
wmb();
|
||||
|
@ -7396,8 +7396,8 @@ static void tg3_free_rings(struct tg3 *tp)
|
|||
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j));
|
||||
}
|
||||
netdev_reset_queue(tp->dev);
|
||||
}
|
||||
|
||||
/* Initialize tx/rx rings for packet processing.
|
||||
|
|
|
@ -196,6 +196,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
|
|||
CH_DEVICE(0x4408, 4),
|
||||
CH_DEVICE(0x4409, 4),
|
||||
CH_DEVICE(0x440a, 4),
|
||||
CH_DEVICE(0x440d, 4),
|
||||
CH_DEVICE(0x440e, 4),
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
@ -2890,6 +2890,8 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = {
|
|||
CH_DEVICE(0x4808, 0), /* T420-cx */
|
||||
CH_DEVICE(0x4809, 0), /* T420-bt */
|
||||
CH_DEVICE(0x480a, 0), /* T404-bt */
|
||||
CH_DEVICE(0x480d, 0), /* T480-cr */
|
||||
CH_DEVICE(0x480e, 0), /* T440-lp-cr */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
@ -336,7 +336,9 @@ static struct rtnl_link_stats64 *ehea_get_stats64(struct net_device *dev,
|
|||
stats->tx_bytes = tx_bytes;
|
||||
stats->rx_packets = rx_packets;
|
||||
|
||||
return &port->stats;
|
||||
stats->multicast = port->stats.multicast;
|
||||
stats->rx_errors = port->stats.rx_errors;
|
||||
return stats;
|
||||
}
|
||||
|
||||
static void ehea_update_stats(struct work_struct *work)
|
||||
|
|
|
@ -151,11 +151,6 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
|
|||
context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
port = ((context->pri_path.sched_queue >> 6) & 1) + 1;
|
||||
if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
|
||||
context->pri_path.sched_queue = (context->pri_path.sched_queue &
|
||||
0xc3);
|
||||
|
||||
*(__be32 *) mailbox->buf = cpu_to_be32(optpar);
|
||||
memcpy(mailbox->buf + 8, context, sizeof *context);
|
||||
|
||||
|
|
|
@ -2255,8 +2255,7 @@ int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
|
|||
|
||||
if (vhcr->op_modifier == 0) {
|
||||
err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq);
|
||||
if (err)
|
||||
goto ex_put;
|
||||
goto ex_put;
|
||||
}
|
||||
|
||||
err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
|
||||
|
|
|
@ -6292,6 +6292,9 @@ static void rtl_shutdown(struct pci_dev *pdev)
|
|||
{
|
||||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
struct device *d = &pdev->dev;
|
||||
|
||||
pm_runtime_get_sync(d);
|
||||
|
||||
rtl8169_net_suspend(dev);
|
||||
|
||||
|
@ -6309,6 +6312,8 @@ static void rtl_shutdown(struct pci_dev *pdev)
|
|||
pci_wake_from_d3(pdev, true);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
}
|
||||
|
||||
pm_runtime_put_noidle(d);
|
||||
}
|
||||
|
||||
static struct pci_driver rtl8169_pci_driver = {
|
||||
|
|
|
@ -310,7 +310,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
|
|||
static void netvsc_get_drvinfo(struct net_device *net,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strcpy(info->driver, "hv_netvsc");
|
||||
strcpy(info->driver, KBUILD_MODNAME);
|
||||
strcpy(info->version, HV_DRV_VERSION);
|
||||
strcpy(info->fw_version, "N/A");
|
||||
}
|
||||
|
@ -482,7 +482,7 @@ MODULE_DEVICE_TABLE(vmbus, id_table);
|
|||
|
||||
/* The one and only one */
|
||||
static struct hv_driver netvsc_drv = {
|
||||
.name = "netvsc",
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = id_table,
|
||||
.probe = netvsc_probe,
|
||||
.remove = netvsc_remove,
|
||||
|
|
|
@ -589,6 +589,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)
|
|||
entry = (struct skb_data *) skb->cb;
|
||||
urb = entry->urb;
|
||||
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
// during some PM-driven resume scenarios,
|
||||
// these (async) unlinks complete immediately
|
||||
retval = usb_unlink_urb (urb);
|
||||
|
@ -596,6 +597,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)
|
|||
netdev_dbg(dev->net, "unlink urb err, %d\n", retval);
|
||||
else
|
||||
count++;
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore (&q->lock, flags);
|
||||
return count;
|
||||
|
|
|
@ -1237,7 +1237,7 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
|
|||
.flags = CMD_SYNC,
|
||||
.data[0] = key_data.rsc_tsc,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.len[0] = sizeof(key_data.rsc_tsc),
|
||||
.len[0] = sizeof(*key_data.rsc_tsc),
|
||||
};
|
||||
|
||||
ret = iwl_dvm_send_cmd(priv, &rsc_tsc_cmd);
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <asm/machdep.h>
|
||||
#endif /* CONFIG_PPC */
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
char *of_fdt_get_string(struct boot_param_header *blob, u32 offset)
|
||||
|
|
|
@ -182,7 +182,7 @@ struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
|
|||
if (!phy_id || sz < sizeof(*phy_id))
|
||||
return NULL;
|
||||
|
||||
sprintf(bus_id, PHY_ID_FMT, "0", be32_to_cpu(phy_id[0]));
|
||||
sprintf(bus_id, PHY_ID_FMT, "fixed-0", be32_to_cpu(phy_id[0]));
|
||||
|
||||
phy = phy_connect(dev, bus_id, hndlr, 0, iface);
|
||||
return IS_ERR(phy) ? NULL : phy;
|
||||
|
|
|
@ -260,8 +260,8 @@ static int da9052_set_ldo5_6_voltage(struct regulator_dev *rdev,
|
|||
* the LDO activate bit to implment the changes on the
|
||||
* LDO output.
|
||||
*/
|
||||
return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0,
|
||||
info->activate_bit);
|
||||
return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG,
|
||||
info->activate_bit, info->activate_bit);
|
||||
}
|
||||
|
||||
static int da9052_set_dcdc_voltage(struct regulator_dev *rdev,
|
||||
|
@ -280,8 +280,8 @@ static int da9052_set_dcdc_voltage(struct regulator_dev *rdev,
|
|||
* the DCDC activate bit to implment the changes on the
|
||||
* DCDC output.
|
||||
*/
|
||||
return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0,
|
||||
info->activate_bit);
|
||||
return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG,
|
||||
info->activate_bit, info->activate_bit);
|
||||
}
|
||||
|
||||
static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev)
|
||||
|
|
|
@ -662,7 +662,7 @@ static int tps65910_set_voltage_dcdc(struct regulator_dev *dev,
|
|||
tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel);
|
||||
break;
|
||||
case TPS65911_REG_VDDCTRL:
|
||||
vsel = selector;
|
||||
vsel = selector + 3;
|
||||
tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel);
|
||||
}
|
||||
|
||||
|
|
|
@ -167,7 +167,7 @@ static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state,
|
|||
DBF_ERROR("%4x EQBS ERROR", SCH_NO(q));
|
||||
DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
|
||||
q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
|
||||
0, -1, -1, q->irq_ptr->int_parm);
|
||||
q->nr, q->first_to_kick, count, q->irq_ptr->int_parm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -215,7 +215,7 @@ static int qdio_do_sqbs(struct qdio_q *q, unsigned char state, int start,
|
|||
DBF_ERROR("%4x SQBS ERROR", SCH_NO(q));
|
||||
DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
|
||||
q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
|
||||
0, -1, -1, q->irq_ptr->int_parm);
|
||||
q->nr, q->first_to_kick, count, q->irq_ptr->int_parm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1083,7 +1083,7 @@ static int configure_dma(struct pl022 *pl022)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int __init pl022_dma_probe(struct pl022 *pl022)
|
||||
static int __devinit pl022_dma_probe(struct pl022 *pl022)
|
||||
{
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
|
|
|
@ -584,10 +584,26 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
|||
* If either that or op not supported returned, follow
|
||||
* the normal lookup.
|
||||
*/
|
||||
if ((rc == 0) || (rc == -ENOENT))
|
||||
switch (rc) {
|
||||
case 0:
|
||||
/*
|
||||
* The server may allow us to open things like
|
||||
* FIFOs, but the client isn't set up to deal
|
||||
* with that. If it's not a regular file, just
|
||||
* close it and proceed as if it were a normal
|
||||
* lookup.
|
||||
*/
|
||||
if (newInode && !S_ISREG(newInode->i_mode)) {
|
||||
CIFSSMBClose(xid, pTcon, fileHandle);
|
||||
break;
|
||||
}
|
||||
case -ENOENT:
|
||||
posix_open = true;
|
||||
else if ((rc == -EINVAL) || (rc != -EOPNOTSUPP))
|
||||
case -EOPNOTSUPP:
|
||||
break;
|
||||
default:
|
||||
pTcon->broken_posix_open = true;
|
||||
}
|
||||
}
|
||||
if (!posix_open)
|
||||
rc = cifs_get_inode_info_unix(&newInode, full_path,
|
||||
|
|
|
@ -534,6 +534,11 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
|
|||
if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
|
||||
fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
|
||||
fattr->cf_dtype = DT_DIR;
|
||||
/*
|
||||
* Server can return wrong NumberOfLinks value for directories
|
||||
* when Unix extensions are disabled - fake it.
|
||||
*/
|
||||
fattr->cf_nlink = 2;
|
||||
} else {
|
||||
fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
|
||||
fattr->cf_dtype = DT_REG;
|
||||
|
@ -541,9 +546,9 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
|
|||
/* clear write bits if ATTR_READONLY is set */
|
||||
if (fattr->cf_cifsattrs & ATTR_READONLY)
|
||||
fattr->cf_mode &= ~(S_IWUGO);
|
||||
}
|
||||
|
||||
fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
|
||||
fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
|
||||
}
|
||||
|
||||
fattr->cf_uid = cifs_sb->mnt_uid;
|
||||
fattr->cf_gid = cifs_sb->mnt_gid;
|
||||
|
@ -1322,7 +1327,6 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
|
|||
}
|
||||
/*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need
|
||||
to set uid/gid */
|
||||
inc_nlink(inode);
|
||||
|
||||
cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb);
|
||||
cifs_fill_uniqueid(inode->i_sb, &fattr);
|
||||
|
@ -1355,7 +1359,6 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
|
|||
d_drop(direntry);
|
||||
} else {
|
||||
mkdir_get_info:
|
||||
inc_nlink(inode);
|
||||
if (pTcon->unix_ext)
|
||||
rc = cifs_get_inode_info_unix(&newinode, full_path,
|
||||
inode->i_sb, xid);
|
||||
|
@ -1436,6 +1439,11 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
|
|||
}
|
||||
}
|
||||
mkdir_out:
|
||||
/*
|
||||
* Force revalidate to get parent dir info when needed since cached
|
||||
* attributes are invalid now.
|
||||
*/
|
||||
CIFS_I(inode)->time = 0;
|
||||
kfree(full_path);
|
||||
FreeXid(xid);
|
||||
cifs_put_tlink(tlink);
|
||||
|
@ -1475,7 +1483,6 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
|
|||
cifs_put_tlink(tlink);
|
||||
|
||||
if (!rc) {
|
||||
drop_nlink(inode);
|
||||
spin_lock(&direntry->d_inode->i_lock);
|
||||
i_size_write(direntry->d_inode, 0);
|
||||
clear_nlink(direntry->d_inode);
|
||||
|
@ -1483,12 +1490,15 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
|
|||
}
|
||||
|
||||
cifsInode = CIFS_I(direntry->d_inode);
|
||||
cifsInode->time = 0; /* force revalidate to go get info when
|
||||
needed */
|
||||
/* force revalidate to go get info when needed */
|
||||
cifsInode->time = 0;
|
||||
|
||||
cifsInode = CIFS_I(inode);
|
||||
cifsInode->time = 0; /* force revalidate to get parent dir info
|
||||
since cached search results now invalid */
|
||||
/*
|
||||
* Force revalidate to get parent dir info when needed since cached
|
||||
* attributes are invalid now.
|
||||
*/
|
||||
cifsInode->time = 0;
|
||||
|
||||
direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
|
||||
current_fs_time(inode->i_sb);
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#ifndef ASM_ARM_HARDWARE_SERIAL_AMBA_H
|
||||
#define ASM_ARM_HARDWARE_SERIAL_AMBA_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* From AMBA UART (PL010) Block Specification
|
||||
* -------------------------------------------------------------------------------
|
||||
|
|
|
@ -281,6 +281,14 @@ static inline struct property *of_find_property(const struct device_node *np,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct device_node *of_find_compatible_node(
|
||||
struct device_node *from,
|
||||
const char *type,
|
||||
const char *compat)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u32_array(const struct device_node *np,
|
||||
const char *propname,
|
||||
u32 *out_values, size_t sz)
|
||||
|
|
|
@ -35,12 +35,12 @@ struct inet_peer {
|
|||
|
||||
u32 metrics[RTAX_MAX];
|
||||
u32 rate_tokens; /* rate limiting for ICMP */
|
||||
int redirect_genid;
|
||||
unsigned long rate_last;
|
||||
unsigned long pmtu_expires;
|
||||
u32 pmtu_orig;
|
||||
u32 pmtu_learned;
|
||||
struct inetpeer_addr_base redirect_learned;
|
||||
struct list_head gc_list;
|
||||
/*
|
||||
* Once inet_peer is queued for deletion (refcnt == -1), following fields
|
||||
* are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp
|
||||
|
@ -96,6 +96,8 @@ static inline struct inet_peer *inet_getpeer_v6(const struct in6_addr *v6daddr,
|
|||
extern void inet_putpeer(struct inet_peer *p);
|
||||
extern bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout);
|
||||
|
||||
extern void inetpeer_invalidate_tree(int family);
|
||||
|
||||
/*
|
||||
* temporary check to make sure we dont access rid, ip_id_count, tcp_ts,
|
||||
* tcp_ts_stamp if no refcount is taken on inet_peer
|
||||
|
|
|
@ -985,6 +985,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|||
|
||||
/* add new interrupt at end of irq queue */
|
||||
do {
|
||||
/*
|
||||
* Or all existing action->thread_mask bits,
|
||||
* so we can find the next zero bit for this
|
||||
* new action.
|
||||
*/
|
||||
thread_mask |= old->thread_mask;
|
||||
old_ptr = &old->next;
|
||||
old = *old_ptr;
|
||||
|
@ -993,14 +998,41 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|||
}
|
||||
|
||||
/*
|
||||
* Setup the thread mask for this irqaction. Unlikely to have
|
||||
* 32 resp 64 irqs sharing one line, but who knows.
|
||||
* Setup the thread mask for this irqaction for ONESHOT. For
|
||||
* !ONESHOT irqs the thread mask is 0 so we can avoid a
|
||||
* conditional in irq_wake_thread().
|
||||
*/
|
||||
if (new->flags & IRQF_ONESHOT && thread_mask == ~0UL) {
|
||||
ret = -EBUSY;
|
||||
goto out_mask;
|
||||
if (new->flags & IRQF_ONESHOT) {
|
||||
/*
|
||||
* Unlikely to have 32 resp 64 irqs sharing one line,
|
||||
* but who knows.
|
||||
*/
|
||||
if (thread_mask == ~0UL) {
|
||||
ret = -EBUSY;
|
||||
goto out_mask;
|
||||
}
|
||||
/*
|
||||
* The thread_mask for the action is or'ed to
|
||||
* desc->thread_active to indicate that the
|
||||
* IRQF_ONESHOT thread handler has been woken, but not
|
||||
* yet finished. The bit is cleared when a thread
|
||||
* completes. When all threads of a shared interrupt
|
||||
* line have completed desc->threads_active becomes
|
||||
* zero and the interrupt line is unmasked. See
|
||||
* handle.c:irq_wake_thread() for further information.
|
||||
*
|
||||
* If no thread is woken by primary (hard irq context)
|
||||
* interrupt handlers, then desc->threads_active is
|
||||
* also checked for zero to unmask the irq line in the
|
||||
* affected hard irq flow handlers
|
||||
* (handle_[fasteoi|level]_irq).
|
||||
*
|
||||
* The new action gets the first zero bit of
|
||||
* thread_mask assigned. See the loop above which or's
|
||||
* all existing action->thread_mask bits.
|
||||
*/
|
||||
new->thread_mask = 1 << ffz(thread_mask);
|
||||
}
|
||||
new->thread_mask = 1 << ffz(thread_mask);
|
||||
|
||||
if (!shared) {
|
||||
init_waitqueue_head(&desc->wait_for_threads);
|
||||
|
|
|
@ -6728,7 +6728,7 @@ int __init sched_create_sysfs_power_savings_entries(struct device *dev)
|
|||
static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action,
|
||||
void *hcpu)
|
||||
{
|
||||
switch (action) {
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_ONLINE:
|
||||
case CPU_DOWN_FAILED:
|
||||
cpuset_update_active_cpus();
|
||||
|
@ -6741,7 +6741,7 @@ static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action,
|
|||
static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action,
|
||||
void *hcpu)
|
||||
{
|
||||
switch (action) {
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_DOWN_PREPARE:
|
||||
cpuset_update_active_cpus();
|
||||
return NOTIFY_OK;
|
||||
|
|
|
@ -891,9 +891,15 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
|||
case 'U':
|
||||
return uuid_string(buf, end, ptr, spec, fmt);
|
||||
case 'V':
|
||||
return buf + vsnprintf(buf, end > buf ? end - buf : 0,
|
||||
((struct va_format *)ptr)->fmt,
|
||||
*(((struct va_format *)ptr)->va));
|
||||
{
|
||||
va_list va;
|
||||
|
||||
va_copy(va, *((struct va_format *)ptr)->va);
|
||||
buf += vsnprintf(buf, end > buf ? end - buf : 0,
|
||||
((struct va_format *)ptr)->fmt, va);
|
||||
va_end(va);
|
||||
return buf;
|
||||
}
|
||||
case 'K':
|
||||
/*
|
||||
* %pK cannot be used in IRQ context because its test
|
||||
|
|
|
@ -640,10 +640,11 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
|
|||
unsigned long vmstart;
|
||||
unsigned long vmend;
|
||||
|
||||
vma = find_vma_prev(mm, start, &prev);
|
||||
vma = find_vma(mm, start);
|
||||
if (!vma || vma->vm_start > start)
|
||||
return -EFAULT;
|
||||
|
||||
prev = vma->vm_prev;
|
||||
if (start > vma->vm_start)
|
||||
prev = vma;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user